index.vue 7.3 KB

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