index.vue 5.2 KB

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