index.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  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="useVW(90)">
  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 } 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, ROLE_OPTION } from '@/constants/dicts'
  25. import type { ExtractApiParams } from '@/api/api'
  26. import type { EpFormItem, EpFormRules } from 'global-type'
  27. const props = defineProps<{ id?: string | number }>()
  28. const isEdit = !!props.id
  29. const { back } = useRouter()
  30. const mainStore = useMainStore()
  31. const initModel: ExtractApiParams<'saveUserInfo'> = {
  32. subjectCode: '',
  33. mainNumber: void 0,
  34. markingGroupNumber: void 0,
  35. role: 'MARKER',
  36. loginName: '',
  37. password: '',
  38. enable: true,
  39. }
  40. const model = reactive<ExtractApiParams<'saveUserInfo'>>(initModel)
  41. const { formRef, elFormRef } = useForm()
  42. const rules = computed<EpFormRules>(() => {
  43. return {
  44. subjectCode: [{ required: true, message: '请选择科目' }],
  45. mainNumber: [{ required: true, message: '请选择大题' }],
  46. markingGroupNumber: model.role !== 'CHIEF' ? [{ required: true, message: '请选择小组' }] : [],
  47. role: [{ required: true, message: '请选择用户角色' }],
  48. loginName: [{ required: true, message: '请填写账号代码' }],
  49. password: [{ required: true, message: '请填写用户密码' }],
  50. enable: [{ required: true, message: '请选择用户状态' }],
  51. }
  52. })
  53. const { subjectList, mainQuestionList, groupList, dataModel, changeModelValue } = useOptions([
  54. 'subject',
  55. 'question',
  56. 'group',
  57. ])
  58. watch(dataModel, () => {
  59. model.subjectCode = dataModel.subject || ''
  60. model.mainNumber = dataModel.question
  61. model.markingGroupNumber = dataModel.group
  62. })
  63. const items = computed<EpFormItem[]>(() => {
  64. return [
  65. {
  66. label: '考试批次',
  67. slotType: 'input',
  68. slot: {
  69. disabled: true,
  70. value: mainStore.myUserInfo?.examName,
  71. },
  72. },
  73. {
  74. label: '科目',
  75. slotType: 'select',
  76. prop: 'subjectCode',
  77. slot: {
  78. placeholder: '请选择科目',
  79. onChange: changeModelValue('subject'),
  80. options: subjectList.value,
  81. disabled: isEdit,
  82. },
  83. },
  84. {
  85. label: '大题',
  86. slotType: 'select',
  87. prop: 'mainNumber',
  88. slot: {
  89. placeholder: '大题号-大题名称',
  90. onChange: changeModelValue('question'),
  91. options: mainQuestionList.value,
  92. disabled: isEdit,
  93. },
  94. },
  95. {
  96. label: '用户角色',
  97. slotType: 'select',
  98. prop: 'role',
  99. slot: {
  100. options: ROLE_OPTION,
  101. placeholder: '设置用户角色',
  102. disabled: isEdit,
  103. },
  104. },
  105. model.role !== 'CHIEF'
  106. ? {
  107. label: '小组',
  108. slotType: 'select',
  109. prop: 'markingGroupNumber',
  110. slot: {
  111. placeholder: '用户所在小组',
  112. options: groupList.value,
  113. onChange: changeModelValue('group'),
  114. disabled: isEdit,
  115. },
  116. }
  117. : null,
  118. {
  119. label: '账号代码',
  120. slotType: 'input',
  121. prop: 'loginName',
  122. slot: {
  123. placeholder: '账号代码',
  124. disabled: isEdit,
  125. },
  126. },
  127. !isEdit && {
  128. label: '用户密码',
  129. slotType: 'input',
  130. prop: 'password',
  131. slot: {
  132. showPassword: true,
  133. placeholder: '设置用户密码',
  134. disabled: isEdit,
  135. },
  136. },
  137. {
  138. label: '姓名',
  139. slotType: 'input',
  140. prop: 'name',
  141. slot: {
  142. placeholder: '设置用户姓名',
  143. },
  144. },
  145. {
  146. label: '状态',
  147. slotType: 'select',
  148. prop: 'enable',
  149. slot: {
  150. options: StatusMap,
  151. placeholder: '用户状态',
  152. },
  153. },
  154. ].filter(Boolean) as EpFormItem[]
  155. })
  156. /** 编辑模式 */
  157. const { fetch: getUserInfo } = useFetch('getUserInfo')
  158. if (isEdit) {
  159. getUserInfo({ id: +props.id }).then((result) => {
  160. const { subjectCode, markingGroupNumber, mainNumber, role, loginName, enable, id } = result
  161. changeModelValue('subject')(subjectCode)
  162. nextTick(() => {
  163. changeModelValue('question')(mainNumber)
  164. }).then(() => {
  165. changeModelValue('group')(markingGroupNumber)
  166. })
  167. Object.assign(model, { subjectCode, markingGroupNumber, mainNumber, role, loginName, enable, id })
  168. })
  169. }
  170. const { fetch, loading } = useFetch('saveUserInfo')
  171. /** 确定提交 */
  172. async function onSubmit() {
  173. try {
  174. await unref(elFormRef)?.validate()
  175. await fetch(model)
  176. unref(elFormRef)?.resetFields()
  177. ElMessage.success({
  178. message: `${isEdit ? '修改' : '创建'}用户成功`,
  179. duration: 1000,
  180. // onClose() {
  181. // if (isEdit) {
  182. // back()
  183. // } else {
  184. // Object.assign(model, initModel)
  185. // }
  186. // },
  187. })
  188. back()
  189. } catch (error) {
  190. console.error(error)
  191. }
  192. }
  193. /** 取消 */
  194. function cancel() {
  195. back()
  196. }
  197. </script>
  198. <style scoped lang="scss">
  199. .edit-user-view {
  200. .form-card {
  201. padding-right: 1000px;
  202. }
  203. }
  204. </style>