Jelajahi Sumber

Merge branch 'master' of https://git.citupro.com/zhengnaiwen_citu/menduner-uniapp

lifanagju_citu 8 bulan lalu
induk
melakukan
7e5eea5e07
8 mengubah file dengan 252 tambahan dan 24 penghapusan
  1. 1 1
      api/file.js
  2. 28 0
      api/user.js
  3. 6 0
      pages.json
  4. 16 16
      pages/index/my.vue
  5. 188 0
      pagesA/info/index.vue
  6. 2 2
      pagesA/resume/index.vue
  7. 2 2
      pagesB/positionDetail/index.vue
  8. 9 3
      utils/position.js

+ 1 - 1
api/file.js

@@ -1,7 +1,7 @@
 import { baseUrl, tenantId, apiPath } from '@/utils/config'
 
 // 文件上传
-export const uploadFileTest = (file) => {
+export const uploadFile = (file) => {
   uni.showLoading({
     title: '上传中'
   })

+ 28 - 0
api/user.js

@@ -253,4 +253,32 @@ export const getEnterpriseAuthDetails = (enterpriseId) => {
       showLoading: false
     }
   })
+}
+
+// 保存基本信息
+export const saveBaseInfo = (data) => {
+  return request({
+    url: '/app-api/menduner/system/person/resume/info/save',
+    method: 'POST',
+    data,
+    custom: {
+      auth: true,
+      showLoading: false
+    }
+  })
+}
+
+// 修改头像
+export const updatePersonAvatar = (avatar) => {
+  return request({
+    url: '/app-api/menduner/system/person/resume/avatar/update',
+    method: 'POST',
+    params: {
+      avatar
+    },
+    custom: {
+      auth: true,
+      showLoading: false
+    }
+  })
 }

+ 6 - 0
pages.json

@@ -59,6 +59,12 @@
 					"style": {
 						"navigationBarTitleText": "谁看过我"
 					}
+				},
+				{
+					"path": "info/index",
+					"style": {
+						"navigationBarTitleText": "个人信息"
+					}
 				}
 			]
 		},

+ 16 - 16
pages/index/my.vue

@@ -1,31 +1,31 @@
 <template>
-	<layout-page>
+  <layout-page>
 		<view class="ss-p-b-30">
-			<view class="text-center">
+			<view class="text-center" @tap="handleTap">
 				<img :src="getUserAvatar(baseInfo?.avatar, baseInfo?.sex)" alt="" class="img-box">
-				<view v-if="!useUserStore.isLogin" class="font-weight-bold font-size-20" @tap="handleLogin">点击登录</view>
+				<view v-if="!useUserStore.isLogin" class="font-weight-bold font-size-20">点击登录</view>
 				<view v-else class="font-weight-bold font-size-20">{{ baseInfo?.name || userInfo?.phone }}</view>
 			</view>
 			<view class="d-flex" style="margin-top: 80rpx;">
-					<view v-for="(item, index) in itemList" :key="index" @tap="handleToLink(item)" class="parent">
-						<view class="d-flex justify-space-between">
-							<view>
-								<view class="colors">
-									<span>查看更多</span>
-									<uni-icons color="#c8c5c4" type="right" size="15" class="ml"/>
-								</view>
-								<view class="size-16">{{ item.title }}</view>
-							</view>
-							<view>
-								<uni-icons color="#00897B" :type="item.icon" size="45"/>
+				<view v-for="(item, index) in itemList" :key="index" @tap="handleToLink(item)" class="parent">
+					<view class="d-flex justify-space-between">
+						<view>
+							<view class="colors">
+								<span>查看更多</span>
+								<uni-icons color="#c8c5c4" type="right" size="15" class="ml"/>
 							</view>
+							<view class="size-16">{{ item.title }}</view>
+						</view>
+						<view>
+							<uni-icons color="#00897B" :type="item.icon" size="45"/>
 						</view>
 					</view>
 				</view>
+			</view>
 	
-				<view style="height: 10rpx; background-color: #f8f8fa;"></view>
+			<view style="height: 10rpx; background-color: #f8f8fa;"></view>
 	
-				<view class="card">
+			<view class="card">
 				<uni-list>
 					<uni-list-item v-for="item in list" :clickable="true" :key="item.title" :title="item.title" showArrow :rightText="item.rightTex || ''" @click="handleToLink(item)"></uni-list-item>
 				</uni-list>

+ 188 - 0
pagesA/info/index.vue

@@ -0,0 +1,188 @@
+<template>
+	<view class="f-straight wrapper">
+		<uni-forms ref="form" :modelValue="formData" :rules="rules" validateTrigger="bind" label-width="105px" label-align="right">
+			<uni-forms-item label="头像" name="avatar" class="f-straight">
+        <view style="display: flex;flex-wrap: wrap;">
+          <view class="upload-img" v-if="formData.avatar" @click="handlePreviewImage">
+            <uni-icons size="30" type="clear" color="#00897B" style="position: absolute;right: -11px; top: -11px; z-index: 9" @click="formData.avatar = ''"></uni-icons>
+            <image :src="formData.avatar" mode="contain" style="width: 200rpx;height: 200rpx;"></image>
+          </view>
+          <view v-else class="upload-file" @click="uploadPhotos">
+            <uni-icons type="plusempty" size="50" color="#f1f1f1"></uni-icons>
+          </view>
+        </view>
+			</uni-forms-item>
+			<uni-forms-item required label="中文名" name="name">
+        <uni-easyinput v-model="formData.name" placeholder="请输入中文名" />
+			</uni-forms-item>
+      <uni-forms-item label="性别" name="sex" required>
+				<uni-data-checkbox v-model="formData.sex" :localdata="sexData" />
+			</uni-forms-item>
+      <uni-forms-item label="电话号码" name="phone">
+        <uni-easyinput v-model="formData.phone" placeholder="请输入电话号码" />
+			</uni-forms-item>
+      <uni-forms-item required label="常用邮箱" name="email">
+        <uni-easyinput v-model="formData.email" placeholder="请输入常用邮箱" />
+			</uni-forms-item>
+      <uni-forms-item required label="出生日期" name="birthday">
+        <uni-datetime-picker type="date" return-type="timestamp" v-model="formData.birthday" />
+			</uni-forms-item>
+      <uni-forms-item required label="首次工作时间" name="firstWorkTime">
+        <uni-datetime-picker type="date" return-type="timestamp" v-model="formData.firstWorkTime" />
+			</uni-forms-item>
+			<uni-forms-item required label="工作年限" name="expType" >
+				<uni-data-picker v-model="formData.expType" :localdata="dictObj.exp" :clear-icon="false" popup-title="请选择工作年限" :clear="false" :map="map"></uni-data-picker>
+			</uni-forms-item>
+      <uni-forms-item required label="最高学历" name="eduType" >
+				<uni-data-picker v-model="formData.eduType" :localdata="dictObj.edu" :clear-icon="false" popup-title="请选择最高学历" :clear="false" :map="map"></uni-data-picker>
+			</uni-forms-item>
+			<uni-forms-item required label="求职类型" name="jobType" >
+				<uni-data-picker v-model="formData.jobType" :localdata="dictObj.jobType" :clear-icon="false" popup-title="请选择求职类型" :map="map"></uni-data-picker>
+			</uni-forms-item>
+      <uni-forms-item required label="求职状态" name="jobStatus" >
+				<uni-data-picker v-model="formData.jobStatus" :localdata="dictObj.jobStatus" :clear-icon="false" popup-title="请选择求职状态" :map="map"></uni-data-picker>
+			</uni-forms-item>
+      <uni-forms-item required label="婚姻状况" name="maritalStatus" >
+				<uni-data-picker v-model="formData.maritalStatus" :localdata="dictObj.marital" :clear-icon="false" popup-title="请选择婚姻状况" :map="map"></uni-data-picker>
+			</uni-forms-item>
+      <uni-forms-item required label="所在城市" name="areaId" >
+				<uni-data-picker v-model="formData.areaId" :localdata="dictObj.areaTreeData" :clear-icon="false" popup-title="请选择所在城市" :map="{ text: 'name', value: 'id'}"></uni-data-picker>
+			</uni-forms-item>
+      <uni-forms-item required label="户籍地" name="regId" >
+				<uni-data-picker v-model="formData.regId" :localdata="dictObj.areaTreeData" :clear-icon="false" popup-title="请选择户籍所在地" :map="{ text: 'name', value: 'id'}"></uni-data-picker>
+			</uni-forms-item>
+			<view class="f-horizon-center">
+				<button type="primary" size="default" class="send-button"  @click="submit">提 交</button>
+			</view>
+		</uni-forms>
+	</view>
+</template>
+
+<script setup>
+import { ref, unref } from 'vue'
+import { userStore } from '@/store/user'
+import { dictObj } from '@/utils/position.js'
+import { uploadFile } from '@/api/file'
+import { cloneDeep } from 'lodash-es'
+import { saveBaseInfo, updatePersonAvatar } from '@/api/user'
+
+const form = ref()
+const sexData = ref([])
+const map = { text: 'label', value: 'value' }
+const useUserStore = userStore()
+const formData = ref({})
+const getInfo = () => {
+  formData.value = cloneDeep(useUserStore?.baseInfo)
+}
+getInfo()
+
+if (dictObj && dictObj?.sex) {
+  sexData.value = dictObj.sex.map(e => {
+    return { text: e.label, value: e.value, ...e }
+  })
+}
+
+// 图片预览
+const handlePreviewImage = () => {
+  uni.previewImage({
+    current: 0,
+    urls: [formData.value.avatar]
+  })
+}
+
+// 选择头像
+const uploadPhotos = () => {
+  wx.chooseImage({
+    count: 1,
+    sizeType: ['original', 'compressed'],
+    sourceType: ['album', 'camera'],
+    success: function(res){
+      const path = res.tempFilePaths[0]
+      uploadFile(path).then(res => {
+        formData.value.avatar = res.data
+      }).catch(error => {
+        uni.showToast({
+          icon: 'error',
+          title: '图片上传失败!',
+          duration: 2000
+        })
+      })
+    }
+  })
+}
+
+const rules = {
+	name:{
+		rules: [{required: true, errorMessage: '请输入姓名' }]
+	},
+	sex : {
+		rules: [{required: true, errorMessage: '请选择您的性别' }]
+	},
+	email: {
+		rules: [{required: true, errorMessage: '请输入您的常用邮箱' }]
+	},
+	birthday: {
+		rules: [{required: true, errorMessage: '请选择您的出生日期' }]
+	},
+  firstWorkTime: {
+		rules: [{required: true, errorMessage: '请选择您的首次工作时间' }]
+	},
+  expType: {
+		rules: [{required: true, errorMessage: '请选择您的工作年限' }]
+	},
+  eduType: {
+		rules: [{required: true, errorMessage: '请选择您的最高学历' }]
+	},
+  jobType: {
+		rules: [{required: true, errorMessage: '请选择您的求职类型' }]
+	},
+  jobStatus: {
+		rules: [{required: true, errorMessage: '请选择您的求职状态' }]
+	},
+  maritalStatus: {
+		rules: [{required: true, errorMessage: '请选择您的婚姻状况' }]
+	},
+  areaId: {
+		rules: [{required: true, errorMessage: '请选择您的所在城市' }]
+	},
+  regId: {
+		rules: [{required: true, errorMessage: '请选择您的户籍所在地' }]
+	}
+}
+
+const submit = async () => {
+  const valid = await unref(form).validate()
+  if (!valid) return
+  console.log(formData.value.avatar, formData.value)
+
+  // await updatePersonAvatar(formData.value.avatar)
+  // await saveBaseInfo(formData.value)
+  // uni.showToast({ title: '编辑成功', icon: 'success' })
+  // useUserStore.getInfo()
+  // getInfo()
+}
+</script>
+
+<style lang="less" scoped>
+
+.wrapper{
+	padding: 15px;
+}
+.upload-img{
+  position: relative;
+  width: 200rpx;
+  height: 200rpx;
+  border: 1px solid #f1f1f1;
+  margin: 10rpx;
+}
+.upload-file{
+  width: 200rpx;
+  height: 200rpx;
+  border: 1px solid #f1f1f1;
+  margin: 10rpx;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  border-radius: 10rpx;
+}
+</style>

+ 2 - 2
pagesA/resume/index.vue

@@ -31,7 +31,7 @@
 <script setup>
 import { ref } from 'vue'
 import { getPersonResumeCv, saveResume, deleteResume } from '@/api/user'
-import { uploadFileTest } from '@/api/file'
+import { uploadFile } from '@/api/file'
 import { timesTampChange } from '@/utils/date'
 import { preview } from '@/utils/preview'
 
@@ -82,7 +82,7 @@ const handleUpload = () => {
       const path = res.tempFiles[0].path
       //效验是否为支持的文件格式
       if(/\.(pdf|docx|doc)$/.test(title)){
-        uploadFileTest(path).then(async (res) => {
+        uploadFile(path).then(async (res) => {
           if (!res.data) {
             uni.showToast({
               title: '上传失败',

+ 2 - 2
pagesB/positionDetail/index.vue

@@ -148,7 +148,7 @@
 import { commissionCalculation } from '@/utils/position'
 import { timesTampChange } from '@/utils/date'
 import { preview } from '@/utils/preview'
-import { uploadFileTest } from '@/api/file'
+import { uploadFile } from '@/api/file'
 import layoutPage from '@/layout'
 import { ref } from 'vue';
 import {
@@ -279,7 +279,7 @@ const handleUpload = () => {
       const path = res.tempFiles[0].path
       //效验是否为支持的文件格式
       if(/\.(pdf|docx|doc)$/.test(title)){
-        uploadFileTest(path).then(async (res) => {
+        uploadFile(path).then(async (res) => {
           if (!res.data) {
             uni.showToast({
               title: '上传失败',

+ 9 - 3
utils/position.js

@@ -2,7 +2,7 @@ import { reactive, ref } from 'vue'
 import { getDict } from '../hooks/useDictionaries'
 import { getPublicRatio } from '@/api/user'
 
-const dictObj = reactive({
+export const dictObj = reactive({
   payUnit: [], // 薪资单位
   scale: [], // 规模
   industry: [], // 行业
@@ -11,10 +11,15 @@ const dictObj = reactive({
   area: [], // 地区
   jobStatus: [], // 求职状态
   marital: [], // 婚姻状态
-  financing: [] // 融资阶段
+  financing: [], // 融资阶段
+  sex: [],
+  jobType: [],
+  areaTreeData: []
 })
 const dictList = ref([
   { type: 'menduner_pay_unit', value: 'payUnit', key: 'payUnit', label: 'payName' },
+  { type: 'menduner_sex', value: 'sex', key: 'sex', label: 'sexName' },
+  { type: 'menduner_job_type', value: 'jobType', key: 'jobType', label: 'jobTypeName' },
   { type: 'menduner_financing_status', value: 'financing', key: 'financingStatus', label: 'financingName' },
   { type: 'menduner_scale', value: 'scale', key: 'scale', label: 'scaleName' },
   { type: 'menduner_job_status', value: 'jobStatus', key: 'jobStatus', label: 'jobStatusName' },
@@ -23,7 +28,8 @@ const dictList = ref([
   { type: 'menduner_education_type', value: 'edu', key: 'eduType', label: 'eduName' },
   { type: 'menduner_exp_type', value: 'exp', key: 'expType', label: 'expName' },
   { type: 'menduner_area_type', value: 'area', key: 'areaId', label: 'areaName', params: {}, apiType: 'areaList', nameKey: 'name', valueKey: 'id' },
-  { type: 'positionData', value: 'position', key: 'positionId', label: 'positionName', params: {}, apiType: 'positionData', nameKey: 'nameCn', valueKey: 'id' }
+  { type: 'positionData', value: 'position', key: 'positionId', label: 'positionName', params: {}, apiType: 'positionData', nameKey: 'nameCn', valueKey: 'id' },
+  { type: 'areaTreeData', value: 'areaTreeData', key: 'areaId', label: 'areaName', params: {}, apiType: 'areaTreeData', nameKey: 'name', valueKey: 'id' }
 ])
 
 // 字典