index.tsx 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. import {
  2. NButton,
  3. NForm,
  4. NFormItem,
  5. NInput,
  6. NSelect,
  7. NSpace,
  8. NSpin,
  9. useMessage
  10. } from 'naive-ui';
  11. import { defineComponent, onMounted, reactive, ref } from 'vue';
  12. import styles from './index.module.less';
  13. import { gradeToCN } from '/src/utils/contants';
  14. import { classGroupList } from '/src/views/home/api';
  15. import { resetStudentInfo } from '../../api';
  16. import { classArray, getgradeNumList } from '/src/views/classList/contants';
  17. export default defineComponent({
  18. name: 'update-student',
  19. props: {
  20. row: {
  21. type: Object,
  22. default: () => ({})
  23. }
  24. },
  25. emits: ['close', 'confirm'],
  26. setup(props, { emit }) {
  27. const message = useMessage();
  28. const state = reactive({
  29. uploading: false,
  30. gradeList: [] as any,
  31. classList: [] as any
  32. });
  33. const forms = reactive({
  34. phone: null,
  35. nickname: null,
  36. gender: null,
  37. currentGradeNum: null,
  38. currentClass: null as any
  39. });
  40. const gradeNumList = ref(getgradeNumList());
  41. const classArrayRef = ref([...classArray] as any);
  42. const formsRef = ref();
  43. const onSubmit = async () => {
  44. formsRef.value?.validate(async (err: any) => {
  45. if (err) {
  46. return;
  47. }
  48. state.uploading = true;
  49. try {
  50. await resetStudentInfo({
  51. ...forms,
  52. id: props.row.id,
  53. schoolId: props.row.schoolId,
  54. tenantId: props.row.tenantId
  55. });
  56. message.success('修改成功');
  57. emit('confirm');
  58. emit('close');
  59. } catch {
  60. //
  61. }
  62. state.uploading = false;
  63. });
  64. };
  65. onMounted(async () => {
  66. const row = props.row;
  67. if (row.id) {
  68. forms.nickname = row.nickname;
  69. forms.phone = row.phone;
  70. forms.gender = row.gender;
  71. forms.currentGradeNum = row.currentGradeNum;
  72. forms.currentClass = row.currentClass;
  73. }
  74. if (forms.currentGradeNum) {
  75. const index = gradeNumList.value.findIndex(
  76. (item: any) => item.value === forms.currentGradeNum
  77. );
  78. if (index === -1) {
  79. forms.currentGradeNum = null;
  80. }
  81. }
  82. });
  83. const onlyAllowNumber = (value: string) => !value || /^\d+$/.test(value);
  84. return () => (
  85. <div class={styles.updateStudentContainer}>
  86. <NForm
  87. ref={formsRef}
  88. model={forms}
  89. labelAlign="right"
  90. labelWidth={'auto'}
  91. labelPlacement="left">
  92. <NFormItem
  93. label="姓名"
  94. path="nickname"
  95. rule={{
  96. required: true,
  97. message: '请填写学生姓名',
  98. trigger: 'blur'
  99. }}>
  100. <NInput
  101. maxlength={15}
  102. placeholder="请填写学生姓名"
  103. v-model:value={forms.nickname}></NInput>
  104. </NFormItem>
  105. <NFormItem
  106. label="手机号"
  107. path="phone"
  108. rule={[
  109. {
  110. required: true,
  111. message: '请填写学生手机号',
  112. trigger: 'blur'
  113. },
  114. {
  115. pattern: /^1[3456789]\d{9}$/,
  116. message: '手机号格式不正确',
  117. trigger: 'blur'
  118. }
  119. ]}>
  120. <NInput
  121. maxlength={11}
  122. allowInput={onlyAllowNumber}
  123. placeholder="请填写学生手机号"
  124. v-model:value={forms.phone}></NInput>
  125. </NFormItem>
  126. <NFormItem
  127. label="性别"
  128. path="gender"
  129. rule={[
  130. {
  131. required: true,
  132. message: '请选择性别',
  133. trigger: 'blur',
  134. type: 'number'
  135. }
  136. ]}>
  137. <NSelect
  138. class={styles.select}
  139. clearable
  140. filterable
  141. placeholder="请选择性别"
  142. options={[
  143. { label: '男', value: 1 },
  144. { label: '女', value: 0 }
  145. ]}
  146. v-model:value={forms.gender}
  147. />
  148. </NFormItem>
  149. <NFormItem
  150. label="年级"
  151. path="currentGradeNum"
  152. rule={[
  153. {
  154. required: true,
  155. message: '请选择年级',
  156. trigger: 'change',
  157. type: 'number'
  158. }
  159. ]}>
  160. <NSelect
  161. v-model:value={forms.currentGradeNum}
  162. placeholder="请选择年级"
  163. options={gradeNumList.value as any}
  164. clearable
  165. filterable
  166. />
  167. </NFormItem>
  168. <NFormItem
  169. label="班级"
  170. path="currentClass"
  171. rule={[
  172. {
  173. required: true,
  174. message: '请选择班级',
  175. trigger: 'change',
  176. type: 'number'
  177. }
  178. ]}>
  179. <NSelect
  180. filterable
  181. v-model:value={forms.currentClass}
  182. placeholder="请选择班级"
  183. clearable
  184. options={classArrayRef.value as any}
  185. />
  186. </NFormItem>
  187. <NSpace class={styles.updateBtnGroup}>
  188. <NButton strong type="default" round onClick={() => emit('close')}>
  189. 取消
  190. </NButton>
  191. <NButton
  192. strong
  193. type="primary"
  194. round
  195. disabled={state.uploading}
  196. loading={state.uploading}
  197. onClick={onSubmit}>
  198. 确认
  199. </NButton>
  200. </NSpace>
  201. </NForm>
  202. </div>
  203. );
  204. }
  205. });