index.vue 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. <template>
  2. <div class="p-base edit-user-view">
  3. <el-card shadow="never" class="form-card">
  4. <base-form ref="formRef" :model="model" :items="items" :rules="rules" :label-width="'90px'">
  5. <el-form-item class="m-t-base form-footer">
  6. <confirm-button :loading="loading" @confirm="onSubmit" @cancel="cancel"></confirm-button>
  7. </el-form-item>
  8. </base-form>
  9. </el-card>
  10. </div>
  11. </template>
  12. <script setup lang="ts" name="EditUser">
  13. /** 新增/编辑用户 */
  14. import { reactive, watch, nextTick, unref, computed, ref } from 'vue'
  15. import { useRouter } from 'vue-router'
  16. import { ElCard, ElFormItem, ElMessage } from 'element-plus'
  17. import BaseForm from '@/components/element/BaseForm.vue'
  18. import ConfirmButton from '@/components/common/ConfirmButton.vue'
  19. import useFetch from '@/hooks/useFetch'
  20. import useForm from '@/hooks/useForm'
  21. import useVW from '@/hooks/useVW'
  22. import useOptions from '@/hooks/useOptions'
  23. import useMainStore from '@/store/main'
  24. import { StatusMap } from '@/constants/dicts'
  25. import bus from '@/utils/bus'
  26. import type { ExtractApiParams } from '@/api/api'
  27. import type { EpFormItem, EpFormRules } from 'global-type'
  28. const ROLE_OPTION = ref<any[]>([])
  29. useFetch('getRoleList')
  30. .fetch()
  31. .then((res: any) => {
  32. ROLE_OPTION.value = res.map((item: any) => {
  33. return {
  34. value: item.code,
  35. label: item.roleName,
  36. }
  37. })
  38. })
  39. const props = defineProps<{ id?: string | number }>()
  40. const isEdit = !!props.id
  41. const { back } = useRouter()
  42. const mainStore = useMainStore()
  43. const initModel: ExtractApiParams<'saveUserInfo'> = {
  44. subjectCode: '',
  45. mainNumber: void 0,
  46. markingGroupNumber: void 0,
  47. role: 'MARKER',
  48. loginName: '',
  49. name: '',
  50. password: '',
  51. enable: true,
  52. }
  53. const model = reactive<any>(initModel)
  54. const { formRef, elFormRef } = useForm()
  55. const rules = computed<EpFormRules>(() => {
  56. return {
  57. subjectCode: [{ required: true, message: '请选择科目' }],
  58. mainNumber: [{ required: true, message: '请选择大题' }],
  59. markingGroupNumber: model.role !== 'CHIEF' ? [{ required: true, message: '请选择小组' }] : [],
  60. role: [{ required: true, message: '请选择用户角色' }],
  61. loginName: [
  62. { required: true, message: '请填写账号代码' },
  63. { pattern: /[0-9a-zA-Z]/, message: '账号代码限制"数字、字母"' },
  64. ],
  65. password: [
  66. { required: true, message: '请填写用户密码' },
  67. { pattern: /[0-9a-zA-Z~!@#¥%&\*]/, message: '密码限制"数字、字母、~!@#¥%&\*"' },
  68. ],
  69. enable: [{ required: true, message: '请选择用户状态' }],
  70. name: [{ type: 'string', max: 50, message: '用户名称限制50字以内' }],
  71. }
  72. })
  73. const { subjectList, mainQuestionList, groupList, dataModel, changeModelValue } = useOptions([
  74. 'subject',
  75. 'question',
  76. 'group',
  77. ])
  78. // watch(dataModel, () => {
  79. // if (model.role !== 'EXPERT' && model.role !== 'SECTION_LEADER') {
  80. // model.subjectCode = dataModel.subject || ''
  81. // model.mainNumber = dataModel.question
  82. // model.markingGroupNumber = dataModel.group
  83. // }
  84. // if (model.role === 'SECTION_LEADER') {
  85. // model.subjectCode = dataModel.subject || '全部'
  86. // }
  87. // })
  88. watch(
  89. () => model.role,
  90. () => {
  91. if (model.role === 'EXPERT') {
  92. model.subjectCode = '全部'
  93. model.mainNumber = '全部'
  94. model.markingGroupNumber = '全部'
  95. } else if (model.role === 'SECTION_LEADER') {
  96. model.subjectCode = ''
  97. model.mainNumber = '全部'
  98. model.markingGroupNumber = '全部'
  99. } else {
  100. model.subjectCode = ''
  101. model.mainNumber = void 0
  102. model.markingGroupNumber = void 0
  103. }
  104. }
  105. )
  106. const items = computed<EpFormItem[]>(() => {
  107. return [
  108. {
  109. label: '考试批次',
  110. slotType: 'input',
  111. slot: {
  112. disabled: true,
  113. value: mainStore.myUserInfo?.examName,
  114. },
  115. },
  116. {
  117. label: '用户角色',
  118. slotType: 'select',
  119. prop: 'role',
  120. slot: {
  121. options: ROLE_OPTION.value,
  122. placeholder: '设置用户角色',
  123. disabled: isEdit,
  124. },
  125. },
  126. {
  127. label: '科目',
  128. slotType: 'select',
  129. prop: 'subjectCode',
  130. slot: {
  131. placeholder: '请选择科目',
  132. onChange: changeModelValue('subject'),
  133. options: model.role === 'EXPERT' ? [{ value: '全部', label: '全部' }, ...subjectList.value] : subjectList.value,
  134. disabled: isEdit || model.role === 'EXPERT',
  135. },
  136. },
  137. {
  138. label: '大题',
  139. slotType: 'select',
  140. prop: 'mainNumber',
  141. slot: {
  142. placeholder: '大题号-大题名称',
  143. onChange: changeModelValue('question'),
  144. options:
  145. model.role === 'EXPERT' || model.role === 'SECTION_LEADER'
  146. ? [{ label: '全部', value: '全部' }, ...mainQuestionList.value]
  147. : mainQuestionList.value,
  148. disabled: isEdit || model.role === 'EXPERT' || model.role === 'SECTION_LEADER',
  149. },
  150. },
  151. model.role !== 'CHIEF'
  152. ? {
  153. label: '小组',
  154. slotType: 'select',
  155. prop: 'markingGroupNumber',
  156. slot: {
  157. placeholder: '用户所在小组',
  158. options:
  159. model.role === 'EXPERT' || model.role === 'SECTION_LEADER'
  160. ? [{ label: '全部', value: '全部' }, ...groupList.value]
  161. : groupList.value,
  162. onChange: changeModelValue('group'),
  163. disabled: isEdit || model.role === 'EXPERT' || model.role === 'SECTION_LEADER',
  164. },
  165. }
  166. : null,
  167. {
  168. label: '账号代码',
  169. slotType: 'input',
  170. prop: 'loginName',
  171. slot: {
  172. placeholder: '账号代码',
  173. disabled: isEdit,
  174. },
  175. },
  176. !isEdit && {
  177. label: '用户密码',
  178. slotType: 'input',
  179. prop: 'password',
  180. slot: {
  181. showPassword: true,
  182. placeholder: '设置用户密码',
  183. disabled: isEdit,
  184. },
  185. },
  186. {
  187. label: '姓名',
  188. slotType: 'input',
  189. prop: 'name',
  190. slot: {
  191. placeholder: '设置用户姓名',
  192. },
  193. },
  194. {
  195. label: '状态',
  196. slotType: 'select',
  197. prop: 'enable',
  198. slot: {
  199. options: StatusMap,
  200. placeholder: '用户状态',
  201. },
  202. },
  203. ].filter(Boolean) as EpFormItem[]
  204. })
  205. /** 编辑模式 */
  206. const { fetch: getUserInfo } = useFetch('getUserInfo')
  207. if (isEdit) {
  208. getUserInfo({ id: +props.id }).then((result) => {
  209. const { subjectCode, markingGroupNumber, mainNumber, role, loginName, name, enable, id } = result
  210. changeModelValue('subject')(subjectCode)
  211. nextTick(() => {
  212. changeModelValue('question')(mainNumber)
  213. }).then(() => {
  214. changeModelValue('group')(markingGroupNumber)
  215. })
  216. Object.assign(model, { subjectCode, markingGroupNumber, mainNumber, role, loginName, name, enable, id })
  217. })
  218. }
  219. const { fetch, loading } = useFetch('saveUserInfo')
  220. /** 确定提交 */
  221. async function onSubmit() {
  222. try {
  223. await unref(elFormRef)?.validate()
  224. let data: any = {}
  225. for (let k in model) {
  226. if (model[k] !== '全部') {
  227. data[k] = model[k]
  228. }
  229. }
  230. await fetch(data)
  231. // unref(elFormRef)?.resetFields() //移到下面去了
  232. ElMessage.success({
  233. message: `${isEdit ? '修改' : '创建'}用户成功`,
  234. duration: 1000,
  235. })
  236. back()
  237. bus.emit('updateUser')
  238. // unref(elFormRef)?.resetFields()
  239. } catch (error) {
  240. console.error(error)
  241. }
  242. }
  243. /** 取消 */
  244. function cancel() {
  245. back()
  246. }
  247. </script>
  248. <style scoped lang="scss">
  249. .edit-user-view {
  250. .form-card {
  251. padding-right: calc(100% - 420px);
  252. }
  253. }
  254. </style>