瀏覽代碼

日期组件

Xiao_123 7 月之前
父節點
當前提交
4202591d49

+ 2 - 0
components.d.ts

@@ -31,6 +31,8 @@ declare module 'vue' {
     Details: typeof import('./src/components/Enterprise/details.vue')['default']
     Echarts: typeof import('./src/components/Echarts/index.vue')['default']
     ElCascader: typeof import('element-plus/es')['ElCascader']
+    ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
+    ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
     Empty: typeof import('./src/components/Empty/index.vue')['default']
     File: typeof import('./src/components/Upload/file.vue')['default']
     HeadSearch: typeof import('./src/components/headSearch/index.vue')['default']

+ 3 - 0
src/App.vue

@@ -9,4 +9,7 @@ import { RouterView } from 'vue-router'
 </template>
 
 <style scoped>
+/* :deep(.el-date-editor.el-input, .el-date-editor.el-input__wrapper) {
+  width: 100%;
+} */
 </style>

+ 50 - 21
src/components/FormUI/datePicker/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div :style="{ width: item.width ? item.width + 'px' : '100%' }">
-    <div class="d-flex">
-      <VueDatePicker
+    <div class="d-flex align-center">
+      <!-- <VueDatePicker
         v-model="value"
         ref="datepicker"
         :options="item.options || {}"
@@ -59,16 +59,43 @@
             @blur="inputBlur"
           ></v-text-field>
         </template>
-      </VueDatePicker>
+      </VueDatePicker> -->
+      
+      <div class="form-label" :style="{'width': item.labelWidth + 'px'}">{{ item.label }}</div>
+      <el-config-provider :locale="zhCn">
+        <el-date-picker
+          style="flex: 1;"
+          v-model="value"
+          size="large"
+          :type="item.mode || 'date'"
+          :placeholder="item.placeholder || '请选择'"
+          :start-placeholder="item.startPlaceholder || '开始日期'"
+          :end-placeholder="item.endPlaceholder || '结束日期'"
+          :format="item.format"
+          :value-format="item.valueFormat || 'x'"
+          :disabled="item.disabled"
+          :disabled-date="disabledDates"
+          :date-format="item.dateFormat"
+          :time-format="item.timeFormat"
+          :default-value="item.defaultValue"
+          @change="modelValueUpDate"
+          @clear="handleClear"
+          @blur="handleOpen"
+        >
+        </el-date-picker>
+      </el-config-provider>
     </div>
   </div>
 </template>
+
 <script setup>
+defineOptions({ name:'FormUI-v-text-field'})
 import { timesTampChange } from '@/utils/date'
 import { computed, ref, watch } from 'vue'
-defineOptions({ name:'FormUI-v-text-field'})
+import zhCn from 'element-plus/es/locale/lang/zh-cn'
+// import { ElDatePicker } from 'element-plus'
 
-const props = defineProps({item: Object, modelValue: [String, Number, Boolean], changeFn: Function})
+const props = defineProps({item: Object, modelValue: [String, Number, Boolean, Array], changeFn: Function})
 const emit = defineEmits(['update:modelValue', 'change'])
 const item = props.item
 
@@ -85,11 +112,12 @@ watch(() => props.modelValue,
 // 过去的日期不可选
 const disabledDates = (date) => {
   const currentDate = new Date()
+  if (!props.item.disabledDate) return false
   currentDate.setDate(currentDate.getDate() - 1)
   return date.getTime() < currentDate.getTime()
 }
 
-const timestamp = 'timestamp' // 固定不能变
+// const timestamp = 'timestamp' // 固定不能变
 const formatText = ref('')
 
 const modelValueUpDate = (val) => {
@@ -121,22 +149,22 @@ watch(() => item.rules,
 const handleOpen = () => {
   rules.value = []
 }
-const handleClosed = () => {
-  rules.value = item.rules
-}
+// const handleClosed = () => {
+//   rules.value = item.rules
+// }
 
-const hideDetails = ref(item.hideDetails || false)
-const detailMargin = ref(false)
-const inputClick = () => {
-  if (item.hideDetails) return
-  hideDetails.value = true
-  detailMargin.value = true
-}
-const inputBlur = () => {
-  if (item.hideDetails) return
-  hideDetails.value = item.hideDetails || false
-  detailMargin.value = false
-}
+// const hideDetails = ref(item.hideDetails || false)
+// const detailMargin = ref(false)
+// const inputClick = () => {
+//   if (item.hideDetails) return
+//   hideDetails.value = true
+//   detailMargin.value = true
+// }
+// const inputBlur = () => {
+//   if (item.hideDetails) return
+//   hideDetails.value = item.hideDetails || false
+//   detailMargin.value = false
+// }
 
 // dateType: 默认 date, 即年月日
 const year = computed(() => {
@@ -153,6 +181,7 @@ if (!item.format) item.format = year.value ? 'Y' : month.value ? 'Y-M' : time.va
 if (item.value) value.value = item.value; getFormatText()
 
 </script>
+
 <style lang="scss" scoped>
 // .removeDetailHeight {}
 :deep(.dp--menu-wrapper) {

+ 3 - 0
src/main.js

@@ -8,6 +8,8 @@
 import { registerPlugins } from '@/plugins'
 import 'virtual:svg-icons-register'
 import '@/styles/index.scss'
+import ElementPlus from 'element-plus'
+import 'element-plus/dist/index.css'
 
 // import * as echarts from 'echarts'
 import App from './App.vue'
@@ -36,6 +38,7 @@ pinia.use(piniaPluginPersistedstate)
 
 const app = createApp(App)
 
+app.use(ElementPlus)
 app.use(pinia)
 app.use(router)
 app.use(Clipboard)

+ 10 - 0
src/styles/index.css

@@ -135,6 +135,11 @@
   cursor: pointer;
 }
 
+.defaultLink-i {
+  color: #008978 !important;
+  cursor: pointer !important;
+}
+
 .default-active {
   color: var(--v-primary-base) !important;
 }
@@ -239,3 +244,8 @@
   background-color: #fff;
   opacity: .7;
 }
+
+.form-label {
+  font-size: 14px;
+  opacity: .6;
+}

文件差異過大導致無法顯示
+ 0 - 0
src/styles/index.min.css


+ 5 - 0
src/styles/index.scss

@@ -182,4 +182,9 @@
   height: 100%;
   background-color: #fff;
   opacity: .7;
+}
+
+.form-label {
+  font-size: 14px;
+  opacity: .6;
 }

+ 3 - 2
src/views/recruit/enterprise/entInfoSetting/informationSettingsComponents/basicInfo.vue

@@ -133,13 +133,14 @@ const formItems = ref({
     {
       type: 'datePicker',
       key: 'openTime',
-      dateType: 'date', // 时间类型 year month date time
       value: null,
       default: '2000-01-01',
+      defaultValue: new Date(2000, 1, 1),
+      format: 'YYYY-MM-DD',
       label: '开业时间',
+      labelWidth: 120,
       col: 6,
       flexStyle: 'mr-3',
-      outlined: true,
     },
     {
       slotName: 'prepare',

+ 4 - 5
src/views/recruit/enterprise/entInfoSetting/informationSettingsComponents/businessInformation.vue

@@ -56,14 +56,12 @@ const formItems = ref({
     {
       type: 'datePicker',
       key: 'establishmentTime',
-      dateType: 'date', // 时间类型 year month date time
       value: null,
       label: '成立时间 *',
+      format: 'YYYY-MM-DD',
+      labelWidth: 120,
       col: 6,
-      flexStyle: 'mr-3',
-      outlined: true,
-      rules: [v => !!v || '请选择成立时间']
-      // options: {},
+      flexStyle: 'mr-3'
     },
     {
       type: 'text',
@@ -155,6 +153,7 @@ const handleSave = async () => {
     if (e.noParam) return
     query[e.key] = e.value
   })
+  if (!query.establishmentTime) return Snackbar.warning('请选择成立时间')
   await updateEnterpriseBusiness(query)
   Snackbar.success('编辑成功')
   getBaseInfo()

+ 5 - 0
src/views/recruit/enterprise/hirePosition/components/add.vue

@@ -70,6 +70,11 @@ const handleSave = async () => {
   const baseInfo = await baseInfoRef.value[0].getQuery()
   if (baseInfo === 'failed') return
   const requirement = await jobRequirementsRef.value[0].getQuery()
+  if (!baseInfo.expireTime) {
+    Snackbar.warning('请选择职位过期时间')
+    window.scrollTo({ top: 0, behavior: 'smooth' })
+    return
+  }
   if (!baseInfo || !requirement) return Snackbar.warning('请将信息填写完整')
   
   submitParams = Object.assign(baseInfo, requirement, { currency_type: 0 }) // currency_type: 写死0(人民币)

+ 4 - 5
src/views/recruit/enterprise/hirePosition/components/baseInfo.vue

@@ -97,12 +97,10 @@ const items = ref({
     {
       type: 'datePicker',
       key: 'expireTime',
-      dateType: 'date',
       value: null,
-      label: '到期时间 *',
-      outlined: true,
-      clearable: true,
-      rules: [v => !!v || '请选择职位到期时间']
+      format: 'YYYY-MM-DD',
+      labelWidth: 120,
+      label: '到期时间 *'
     },
     {
       slotName: 'positionId',
@@ -111,6 +109,7 @@ const items = ref({
       labelKey: 'positionName',
       label: '职位类型 *',
       noParam: true,
+      flexStyle: 'mt-5',
       readonly: true,
       rules: [v => !!v || '请选择职位类型']
     },

+ 7 - 8
src/views/recruit/enterprise/hirePosition/components/item.vue

@@ -60,7 +60,7 @@
   <Loading :visible="loading"></Loading>
 
   <CtDialog :visible="showExpire" :widthType="2" titleClass="text-h6" title="修改职位到期时间" @close="showExpire = false; expireTimeId = null" @submit="handleSubmit">
-    <CtForm v-if="showExpire" ref="CtFormRef" :items="formItem" style="height: 320px;"></CtForm>
+    <CtForm v-if="showExpire" ref="CtFormRef" :items="formItem" style="height: 100px;"></CtForm>
   </CtDialog>
 </template>
 
@@ -116,13 +116,11 @@ const formItem = ref({
     {
       type: 'datePicker',
       key: 'time',
-      dateType: 'date',
       value: null,
+      format: 'YYYY-MM-DD',
       label: '到期时间 *',
-      outlined: true,
-      disabledDates: true,
-      clearable: true,
-      rules: [v => !!v || '请选择职位到期时间']
+      labelWidth: 110,
+      disabledDates: true
     }
   ]
 })
@@ -156,9 +154,10 @@ const handleUpdateExpireTime = (item) => {
   showExpire.value = true
 }
 const handleSubmit = async () => {
-  const { valid } = await CtFormRef.value.formRef.validate()
-  if (!valid) return
+  // const { valid } = await CtFormRef.value.formRef.validate()
+  // if (!valid) return
   const time = formItem.value.options.find(e => e.key === 'time').value
+  if (!time) return Snackbar.warning('请选择职位到期时间')
   await updatePositionExpireTime({ id: expireTimeId.value, time })
   expireTimeId.value = ''
   showExpire.value = false

+ 5 - 0
src/views/recruit/enterprise/positionManagement/components/add.vue

@@ -70,6 +70,11 @@ const handleSave = async () => {
   const baseInfo = await baseInfoRef.value[0].getQuery()
   if (baseInfo === 'failed') return
   const requirement = await jobRequirementsRef.value[0].getQuery()
+  if (!baseInfo.expireTime) {
+    Snackbar.warning('请选择职位过期时间')
+    window.scrollTo({ top: 0, behavior: 'smooth' })
+    return
+  }
   if (!baseInfo || !requirement) return Snackbar.warning('请将信息填写完整')
   
   submitParams = Object.assign(baseInfo, requirement, { currency_type: 0 }) // currency_type: 写死0(人民币)

+ 3 - 4
src/views/recruit/enterprise/positionManagement/components/baseInfo.vue

@@ -55,17 +55,16 @@ const items = ref({
     {
       type: 'datePicker',
       key: 'expireTime',
-      dateType: 'date',
       value: null,
+      format: 'YYYY-MM-DD',
       label: '到期时间 *',
-      outlined: true,
-      clearable: true,
-      rules: [v => !!v || '请选择职位到期时间']
+      labelWidth: 120
     },
     {
       slotName: 'positionId',
       key: 'positionId',
       value: '',
+      flexStyle: 'mt-5',
       labelKey: 'positionName',
       label: '职位类型 *',
       noParam: true,

+ 6 - 7
src/views/recruit/enterprise/positionManagement/components/item.vue

@@ -68,7 +68,7 @@
   <Loading :visible="loading"></Loading>
 
   <CtDialog :visible="showExpire" :widthType="2" titleClass="text-h6" title="修改职位到期时间" @close="showExpire = false; expireTimeId = null" @submit="handleSubmit">
-    <CtForm v-if="showExpire" ref="CtFormRef" :items="formItem" style="height: 320px;"></CtForm>
+    <CtForm v-if="showExpire" ref="CtFormRef" :items="formItem" style="height: 100px;"></CtForm>
   </CtDialog>
 </template>
 
@@ -101,13 +101,11 @@ const formItem = ref({
     {
       type: 'datePicker',
       key: 'time',
-      dateType: 'date',
       value: null,
+      format: 'YYYY-MM-DD',
       label: '到期时间 *',
-      outlined: true,
+      labelWidth: 110,
       disabledDates: true,
-      clearable: true,
-      rules: [v => !!v || '请选择职位到期时间']
     }
   ]
 })
@@ -180,9 +178,10 @@ const handleUpdateExpireTime = (item) => {
   showExpire.value = true
 }
 const handleSubmit = async () => {
-  const { valid } = await CtFormRef.value.formRef.validate()
-  if (!valid) return
+  // const { valid } = await CtFormRef.value.formRef.validate()
+  // if (!valid) return
   const time = formItem.value.options.find(e => e.key === 'time').value
+  if (!time) return Snackbar.warning('请选择职位到期时间')
   await updatePositionExpireTime({ id: expireTimeId.value, time })
   expireTimeId.value = ''
   showExpire.value = false

+ 12 - 5
src/views/recruit/personal/PersonalCenter/resume/online/components/basicInfo.vue

@@ -116,7 +116,7 @@ import CtForm from '@/components/CtForm'
 import Snackbar from '@/plugins/snackbar'
 import { getDict } from '@/hooks/web/useDictionaries'
 import { cityToProvince } from '@/utils/areaDeal'
-import { getTimeStamp, timesTampChange } from '@/utils/date'
+import { timesTampChange } from '@/utils/date'
 import { updatePersonAvatar, saveResumeBasicInfo } from '@/api/recruit/personal/resume'
 import { useUserStore } from '@/store/user'
 import { uploadFile } from '@/api/common'
@@ -229,10 +229,14 @@ const items = ref({
     },
     {
       type: 'datePicker',
+      mode: 'date',
+      labelWidth: 110,
       key: 'birthday',
       value: '2000-01-01',
+      defaultValue: new Date(2000, 1, 1),
       label: '出生日期 *',
       col: 6,
+      format: 'YYYY/MM/DD',
       outlined: true,
       rules: [v => !!v || '请选择出生日期']
     },
@@ -387,9 +391,12 @@ const items = ref({
     },
     {
       type: 'datePicker',
-      dateType: 'month',
+      mode: 'month',
       key: 'firstWorkTime',
       value: '2000-01',
+      defaultValue: new Date(2000, 1),
+      format: 'YYYY/MM',
+      labelWidth: 130,
       label: '首次工作时间',
       col: 6,
       outlined: true
@@ -405,10 +412,11 @@ const handleSave = async () => {
   let clearRegProvinceId = false
   items.value.options.forEach(e => {
     if (e.key === 'regId' && !obj[e.key]) clearRegProvinceId = true
-    if (e.type === 'datepicker') obj[e.key] = getTimeStamp(e.value)
+    // if (e.type === 'datepicker') obj[e.key] = getTimeStamp(e.value)
     else obj[e.key] = e.value
   })
   if (!obj.sex) return Snackbar.warning('请先选择您的性别')
+  if (!obj.birthday) return Snackbar.warning('请选择您的出生日期')
   await saveResumeBasicInfo(obj)
   Snackbar.success(t('common.saveMsg'))
   isEdit.value = false
@@ -454,7 +462,7 @@ items.value.options.forEach((e, index) => {
   const infoExist = baseInfo.value && Object.keys(baseInfo.value).length
   if (infoExist && baseInfo.value[e.key]) e.value = baseInfo.value[e.key]
   // 日期相关
-  if (e.type === 'datepicker') e.value = timesTampChange(e.value, 'Y-M-D')
+  // if (e.type === 'datepicker') e.value = timesTampChange(e.value, 'Y-M-D')
   // 所在城市回显
   if (infoExist && e.key === 'areaId' && baseInfo.value[e.key]) {
     const id = baseInfo.value[e.key]
@@ -469,7 +477,6 @@ items.value.options.forEach((e, index) => {
 // 完成度展示
   
 const provinceChange = (value, val, obj) => {
-  console.log(obj, 'area')
   let cityKey
   if (val?.key === 'workAreaProvinceId') cityKey = 'areaId'
   if (val?.key === 'regProvinceId') cityKey = 'regId'

+ 12 - 11
src/views/recruit/personal/PersonalCenter/resume/online/components/educationExp.vue

@@ -168,26 +168,24 @@ const formItems = ref({
     {
       type: 'datePicker',
       key: 'startTime',
-      dateType: 'month', // 时间类型 year month date time
+      mode: 'month', // 时间类型 year month date time
       value: null,
-      label: '起始时间 *',
+      format: 'YYYY/MM',
+      labelWidth: 120,
+      label: '开始时间 *',
       col: 6,
-      outlined: true,
-      clearable: true,
       rules: [v => !!v || '请选择起始时间']
-      // options: {},
     },
     {
       type: 'datePicker',
       key: 'endTime',
-      dateType: 'month', // 时间类型 year month date time
+      mode: 'month', // 时间类型 year month date time
       value: null,
+      format: 'YYYY/MM',
+      labelWidth: 120,
       label: '结束时间 *',
       col: 6,
-      outlined: true,
-      clearable: true,
       rules: [v => !!v || '请选择结束时间']
-      // options: {},
     },
     {
       type: 'textarea',
@@ -195,6 +193,7 @@ const formItems = ref({
       value: null,
       default: null,
       rows: 5,
+      flexStyle: 'mt-5',
       resize: true,
       counter: 1600,
       label: '在校经历',
@@ -230,7 +229,6 @@ const handle = (item) => {
         // if (item[e.key] && item[e.itemTextName]) { e.search(item[e.itemTextName], '触发下拉框内容'); e.value = item[e.key] }
         // else { e.value = item[e.itemTextName]; e[e.itemTextName] = item[e.itemTextName] }
       }
-      else if (e.type === 'datepicker') e.value = timesTampChange(item[e.key], 'Y-M')
       else if (item[e.key]) e.value = item[e.key]
     })
   } else { // 新增
@@ -257,9 +255,9 @@ const handleSave = async () => {
       // if (e.value === e[e.itemTextName]) { obj[e.key] = ''; obj[e.itemTextName] = e[e.itemTextName] }
       // else { obj[e.key] = e.value; obj[e.itemTextName] = e[e.itemTextName] }
     }
-    else if (e.type === 'datepicker') obj[e.key] = getTimeStamp(e.value)
     else obj[e.key] = e.value
   })
+  if (!obj.startTime || !obj.endTime) return Snackbar.warning('请选择起始时间!')
   if (editId.value) obj.id = editId.value
   await saveResumeEduExp(obj)
   Snackbar.success('保存成功!')
@@ -313,4 +311,7 @@ getOptions()
   padding: 2px 10px 8px;
   background-color: var(--color-f8);
 }
+:deep(.el-input--large .el-input__wrapper) {
+  background-color: #f8f8f8;
+}
 </style>

+ 8 - 11
src/views/recruit/personal/PersonalCenter/resume/online/components/projectExperience.vue

@@ -64,28 +64,24 @@ const items = ref({
     {
       type: 'datePicker',
       key: 'startTime',
-      dateType: 'month', // 时间类型 year month date time
+      mode: 'month',
       value: null,
       label: '项目开始时间 *',
+      format: 'YYYY-MM',
+      labelWidth: 140,
       col: 6,
-      flexStyle: 'mr-3',
-      outlined: true,
-      clearable: true,
-      rules: [v => !!v || '请选择项目开始时间']
-      // options: {},
+      flexStyle: 'mr-3'
     },
     {
       type: 'datePicker',
       key: 'endTime',
-      dateType: 'month', // 时间类型 year month date time
+      format: 'YYYY-MM',
+      mode: 'month',
       value: null,
       label: '项目结束时间 *',
       col: 6,
       flexStyle: 'mr-3',
-      outlined: true,
-      clearable: true,
-      rules: [v => !!v || '请选择项目结束时间']
-      // options: {},
+      labelWidth: 140,
     },
     {
       type: 'textarea',
@@ -144,6 +140,7 @@ const handleSave = async () => {
   items.value.options.forEach(e => {
     obj[e.key] = e.value
   })
+  if (!obj.startTime || !obj.endTime) return Snackbar.warning('请选择项目起始时间')
   if (editId.value) obj.id = editId.value
   try {
     await saveResumeProjectExp(obj)

+ 12 - 10
src/views/recruit/personal/PersonalCenter/resume/online/components/trainingExperience.vue

@@ -79,27 +79,25 @@ const items = ref({
     {
       type: 'datePicker',
       key: 'startTime',
-      dateType: 'month', // 时间类型 year month date time
+      mode: 'month',
       value: null,
+      labelWidth: 140,
+      format: 'YYYY/MM',
       label: '培训开始时间 *',
       col: 6,
       flexStyle: 'mr-3',
-      outlined: true,
-      clearable: true,
       rules: [v => !!v || '请选择培训开始时间']
-      // options: {},
     },
     {
       type: 'datePicker',
       key: 'endTime',
-      dateType: 'month', // 时间类型 year month date time
+      mode: 'month',
       value: null,
+      format: 'YYYY/MM',
+      labelWidth: 140,
       label: '培训结束时间 *',
       col: 6,
-      outlined: true,
-      clearable: true,
       rules: [v => !!v || '请选择培训结束时间']
-      // options: {},
     },
     {
       type: 'textarea',
@@ -107,6 +105,7 @@ const items = ref({
       value: '',
       label: '培训描述',
       rows: 5,
+      flexStyle: 'mt-5',
       resize: true,
       counter: 2000,
       rules: [
@@ -124,8 +123,7 @@ const handleCancel = () => {
   type.value = ''
   editId.value = null
   items.value.options.forEach(e => {
-    if (e.type === 'datePicker') e.value = {}
-    else e.value = null
+    e.value = null
   })
 }
 
@@ -148,6 +146,7 @@ const handleSave = async () => {
   items.value.options.forEach(e => {
     obj[e.key] = e.value
   })
+  if (!obj.startTime || !obj.endTime) return Snackbar.warning('请选择培训起始时间!')
   if (editId.value) obj.id = editId.value
   try {
     await saveResumeTrainExp(obj)
@@ -195,4 +194,7 @@ const handleDelete = ({ id }) => {
   padding: 2px 10px 8px;
   border-radius: 6px;
 }
+:deep(.el-input--large .el-input__wrapper) {
+  background-color: #f8f8f8;
+}
 </style>

+ 17 - 17
src/views/recruit/personal/PersonalCenter/resume/online/components/workExperience.vue

@@ -68,7 +68,7 @@
 import CtForm from '@/components/CtForm'
 import Snackbar from '@/plugins/snackbar'
 import { getDict } from '@/hooks/web/useDictionaries'
-import { getTimeStamp, timesTampChange } from '@/utils/date'
+import { timesTampChange } from '@/utils/date'
 import { saveResumeWorkExp, getResumeWorkExp, deleteResumeWorkExp, enterpriseSearchByName } from '@/api/recruit/personal/resume'
 import Confirm from '@/plugins/confirm'
 import { dealCanBeInputtedSave, dealCanBeInputtedValueAndLabel } from '@/utils/getText'
@@ -105,8 +105,7 @@ const handleSoFarChange = (bool, item) => {
   const opObj = formItems.value.options.find(e => e.key === item.key)
   if (opObj) {
     opObj.value = null
-    opObj.soFar = true
-    opObj.rules = bool ? [] : [v => !!v || '请选择结束时间']
+    opObj.soFar = bool
     opObj.disabled = bool ? true : false
   }
 }
@@ -150,27 +149,25 @@ const formItems = ref({
     {
       type: 'datePicker',
       key: 'startTime',
-      dateType: 'month', // 时间类型 year month date time
+      mode: 'month', // 时间类型 year month date time
       value: null,
-      label: '起始时间 *',
+      label: '开始时间 *',
+      labelWidth: 120,
+      format: 'YYYY/MM',
       col: 6,
-      outlined: true,
-      clearable: true,
       rules: [v => !!v || '请选择起始时间']
-      // options: {},
     },
     {
       type: 'datePicker',
       key: 'endTime',
       slotName: 'endTime',
-      dateType: 'month', // 时间类型 year month date time
+      mode: 'month', // 时间类型 year month date time
       value: null,
+      format: 'YYYY/MM',
       label: '结束时间 *',
       col: 6,
-      outlined: true,
-      clearable: true,
+      labelWidth: 120,
       rules: [v => !!v || '请选择结束时间']
-      // options: {},
     },
     {
       type: 'textarea',
@@ -179,6 +176,7 @@ const formItems = ref({
       default: null,
       rows: 10,
       resize: true,
+      flexStyle: 'mt-5',
       counter: 2000,
       label: '工作内容 *',
       outlined: true,
@@ -206,7 +204,6 @@ const isEdit = ref(false)
 const titleStatus = ref(0)
 const handle = (item) => {
   titleStatus.value = item ? 1 : 0
-  // if (!positionData.value || !positionData.value.length) getPositionData ()
   if (item) { // 编辑
     editId.value = item.id
     formItems.value.options.forEach(e => { // 回显
@@ -215,12 +212,11 @@ const handle = (item) => {
       }
       else if (e.key === 'endTime') {
         if (item[e.key]) {
-          e.value = item[e.key]; e.soFar = false; e.disabled = false; e.rules = [v => !!v || '请选择结束时间']
+          e.value = item[e.key]; e.soFar = false; e.disabled = false;
         } else {
-          e.value = null; e.soFar = true; e.disabled = true; e.rules = []
+          e.value = null; e.soFar = true; e.disabled = true;
         }
       }
-      else if (e.type === 'datepicker') e.value = timesTampChange(item[e.key], 'Y-M')
       else if (item[e.key]) e.value = item[e.key]
     })
   } else { // 新增
@@ -247,9 +243,10 @@ const handleSave = async () => {
     if (e.canBeInputted) { // 特殊处理可输入下拉框
       dealCanBeInputtedSave(e, obj)
     }
-    else if (e.type === 'datepicker' && e.value) obj[e.key] = getTimeStamp(e.value)
     else obj[e.key] = e.value
   })
+  const endTimeSofar = formItems.value.options.find(e => e.key === 'endTime').soFar
+  if ((!endTimeSofar && (!obj.startTime || !obj.endTime)) || (endTimeSofar && !obj.startTime)) return Snackbar.warning(endTimeSofar && !obj.startTime ? '请选择开始时间' : '请选择起始时间!')
   if (editId.value) obj.id = editId.value
   await saveResumeWorkExp(obj)
   Snackbar.success('保存成功!')
@@ -302,4 +299,7 @@ getOptions()
   padding: 2px 10px 8px;
   background-color: var(--color-f8);
 }
+:deep(.el-input--large .el-input__wrapper) {
+  background-color: #f8f8f8;
+}
 </style>

部分文件因文件數量過多而無法顯示