index.tsx 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  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 { api_getCurrentGradeYear, 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. gradeYearList: [] as any
  33. });
  34. const forms = reactive({
  35. phone: null,
  36. nickname: null,
  37. gender: null,
  38. gradeYear: null,
  39. currentGradeNum: null,
  40. currentClass: null as any
  41. });
  42. const gradeNumList = ref(getgradeNumList());
  43. const classArrayRef = ref([...classArray] as any);
  44. const formsRef = ref();
  45. const onSubmit = async () => {
  46. formsRef.value?.validate(async (err: any) => {
  47. if (err) {
  48. return;
  49. }
  50. state.uploading = true;
  51. try {
  52. await resetStudentInfo({
  53. ...forms,
  54. id: props.row.id,
  55. schoolId: props.row.schoolId,
  56. tenantId: props.row.tenantId
  57. });
  58. message.success('修改成功');
  59. emit('confirm');
  60. emit('close');
  61. } catch {
  62. //
  63. }
  64. state.uploading = false;
  65. });
  66. };
  67. const getYearList = async () => {
  68. try {
  69. const { data } = await api_getCurrentGradeYear({});
  70. const temp = [
  71. {
  72. label: data + 1 + '学级',
  73. value: data + 1
  74. },
  75. {
  76. label: data + '学级',
  77. value: data
  78. }
  79. ];
  80. state.gradeYearList = temp;
  81. } catch {
  82. //
  83. }
  84. };
  85. onMounted(async () => {
  86. const row = props.row;
  87. getYearList();
  88. if (row.id) {
  89. forms.nickname = row.nickname;
  90. forms.phone = row.phone;
  91. forms.gender = row.gender;
  92. forms.currentGradeNum = row.currentGradeNum;
  93. forms.currentClass = row.currentClass;
  94. forms.gradeYear = row.gradeYear;
  95. }
  96. // 判断学年数组里面是否有存在,如果没有则追加数据
  97. const hasGradeYear = state.gradeYearList.findIndex(
  98. (i: any) => i.value === row.gradeYear
  99. );
  100. if (hasGradeYear === -1 && row.gradeYear) {
  101. state.gradeYearList.push({
  102. label: row.gradeYear,
  103. value: row.gradeYear
  104. });
  105. }
  106. if (forms.currentGradeNum) {
  107. const index = gradeNumList.value.findIndex(
  108. (item: any) => item.value === forms.currentGradeNum
  109. );
  110. if (index === -1) {
  111. forms.currentGradeNum = null;
  112. }
  113. }
  114. });
  115. const onlyAllowNumber = (value: string) => !value || /^\d+$/.test(value);
  116. return () => (
  117. <div class={styles.updateStudentContainer}>
  118. <NForm
  119. ref={formsRef}
  120. model={forms}
  121. labelAlign="right"
  122. labelWidth={'auto'}
  123. labelPlacement="left">
  124. <NFormItem
  125. label="姓名"
  126. path="nickname"
  127. rule={{
  128. required: true,
  129. message: '请填写学生姓名',
  130. trigger: 'blur'
  131. }}>
  132. <NInput
  133. maxlength={15}
  134. placeholder="请填写学生姓名"
  135. v-model:value={forms.nickname}></NInput>
  136. </NFormItem>
  137. <NFormItem
  138. label="手机号"
  139. path="phone"
  140. rule={[
  141. {
  142. required: true,
  143. message: '请填写学生手机号',
  144. trigger: 'blur'
  145. },
  146. {
  147. pattern: /^1[3456789]\d{9}$/,
  148. message: '手机号格式不正确',
  149. trigger: 'blur'
  150. }
  151. ]}>
  152. <NInput
  153. maxlength={11}
  154. allowInput={onlyAllowNumber}
  155. placeholder="请填写学生手机号"
  156. v-model:value={forms.phone}></NInput>
  157. </NFormItem>
  158. <NFormItem
  159. label="性别"
  160. path="gender"
  161. rule={[
  162. {
  163. required: true,
  164. message: '请选择性别',
  165. trigger: 'blur',
  166. type: 'number'
  167. }
  168. ]}>
  169. <NSelect
  170. class={styles.select}
  171. clearable
  172. filterable
  173. placeholder="请选择性别"
  174. options={[
  175. { label: '男', value: 1 },
  176. { label: '女', value: 0 }
  177. ]}
  178. v-model:value={forms.gender}
  179. />
  180. </NFormItem>
  181. <NFormItem
  182. label="学年"
  183. path="gradeYear"
  184. rule={[
  185. {
  186. required: true,
  187. message: '请选择学年',
  188. trigger: 'change',
  189. type: 'number'
  190. }
  191. ]}>
  192. <NSelect
  193. v-model:value={forms.gradeYear}
  194. placeholder="请选择学年"
  195. options={state.gradeYearList as any}
  196. clearable
  197. filterable
  198. />
  199. </NFormItem>
  200. <NFormItem
  201. label="年级"
  202. path="currentGradeNum"
  203. rule={[
  204. {
  205. required: true,
  206. message: '请选择年级',
  207. trigger: 'change',
  208. type: 'number'
  209. }
  210. ]}>
  211. <NSelect
  212. v-model:value={forms.currentGradeNum}
  213. placeholder="请选择年级"
  214. options={gradeNumList.value as any}
  215. clearable
  216. filterable
  217. />
  218. </NFormItem>
  219. <NFormItem
  220. label="班级"
  221. path="currentClass"
  222. rule={[
  223. {
  224. required: true,
  225. message: '请选择班级',
  226. trigger: 'change',
  227. type: 'number'
  228. }
  229. ]}>
  230. <NSelect
  231. filterable
  232. v-model:value={forms.currentClass}
  233. placeholder="请选择班级"
  234. clearable
  235. options={classArrayRef.value as any}
  236. />
  237. </NFormItem>
  238. <NSpace class={styles.updateBtnGroup}>
  239. <NButton strong type="default" round onClick={() => emit('close')}>
  240. 取消
  241. </NButton>
  242. <NButton
  243. strong
  244. type="primary"
  245. round
  246. disabled={state.uploading}
  247. loading={state.uploading}
  248. onClick={onSubmit}>
  249. 确认
  250. </NButton>
  251. </NSpace>
  252. </NForm>
  253. </div>
  254. );
  255. }
  256. });