baseInfo.tsx 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. import { defineComponent, onMounted, reactive, ref, watch } from 'vue';
  2. import styles from '../index.module.less';
  3. import {
  4. NImage,
  5. NForm,
  6. NFormItem,
  7. NInput,
  8. NGrid,
  9. NGi,
  10. NButton,
  11. NSelect,
  12. NSpace,
  13. SelectOption,
  14. useMessage,
  15. NModal,
  16. NCalendar,
  17. NCascader
  18. } from 'naive-ui';
  19. import headerD from '../images/headerD.png';
  20. import defultHeade from '@/components/layout/images/teacherIcon.png';
  21. import maleIcon from '../images/maleIcon.png';
  22. import femaleIcon from '../images/femaleIcon.png';
  23. import { useUserStore } from '/src/store/modules/users';
  24. import { api_teacherUpdate } from '/src/api/user';
  25. import { resetStudentInfo } from '../api';
  26. import UploadFile from '/src/components/upload-file';
  27. import { getgradeNumList, classArray } from '@/views/classList/contants';
  28. export default defineComponent({
  29. name: 'setting-personInfo',
  30. props: {
  31. studentInfo: {
  32. type: Object,
  33. default: () => ({
  34. nickname: '',
  35. currentGradeNum: '',
  36. gender: null,
  37. phone: '',
  38. id: '',
  39. currentClass: ''
  40. })
  41. }
  42. },
  43. setup(props) {
  44. const message = useMessage();
  45. const userStore = useUserStore();
  46. const loading = ref()
  47. const formOptions = reactive({
  48. sexs: [
  49. { label: '男', value: 1, class: 'option' },
  50. { label: '女', value: 0, class: 'option' }
  51. ] as SelectOption[],
  52. areaList: [] as any[]
  53. });
  54. const formRef = ref();
  55. const studentForm = reactive({
  56. nickname: props.studentInfo.nickname as any,
  57. phone: props.studentInfo.phone,
  58. gender: props.studentInfo.gender,
  59. id: props.studentInfo.id,
  60. currentGradeNum: props.studentInfo.currentGradeNum,
  61. currentClass: props.studentInfo.currentClass
  62. });
  63. const gradeNumList = ref(getgradeNumList());
  64. const classArrayRef = ref([...classArray] as any);
  65. const data = reactive({
  66. disabled: true,
  67. openChangePwd: false,
  68. uploadShow: true
  69. });
  70. watch(
  71. () => props.studentInfo,
  72. val => {
  73. studentForm.nickname = val.nickname as any;
  74. studentForm.phone = val.phone;
  75. studentForm.gender = val.gender;
  76. studentForm.id = val.id;
  77. studentForm.currentGradeNum = val.currentGradeNum;
  78. studentForm.currentClass = val.currentClass;
  79. }
  80. );
  81. // onMounted(() => {});
  82. const handleSave = () => {
  83. loading.value = true
  84. formRef.value.validate(async (err: any) => {
  85. if (err) {
  86. return;
  87. }
  88. try{
  89. await resetStudentInfo({ ...props.studentInfo, ...studentForm });
  90. data.disabled = true;
  91. message.success('修改成功');
  92. loading.value = false
  93. }catch(e){
  94. loading.value = false
  95. }
  96. });
  97. };
  98. const cancel = () => {
  99. studentForm.nickname = props.studentInfo.nickname;
  100. studentForm.phone = props.studentInfo.phone;
  101. studentForm.gender = props.studentInfo.gender;
  102. studentForm.currentGradeNum = props.studentInfo.currentGradeNum;
  103. studentForm.currentClass = props.studentInfo.currentClass;
  104. data.disabled = true;
  105. };
  106. return () => (
  107. <div class={styles.infoWrap}>
  108. <div class={styles.setInfo}>
  109. <NForm ref={formRef} model={studentForm} disabled={data.disabled}>
  110. <NGrid cols={4} x-gap="100">
  111. <NGi>
  112. <NFormItem
  113. label="姓名"
  114. path="nickname"
  115. rule={{
  116. required: true,
  117. message: '请填写老师姓名',
  118. trigger: 'blur'
  119. }}>
  120. <NInput
  121. bordered={!data.disabled}
  122. placeholder="请填写老师姓名"
  123. v-model:value={studentForm.nickname}></NInput>
  124. </NFormItem>
  125. </NGi>
  126. <NGi>
  127. <NFormItem
  128. label="手机号"
  129. path="phone"
  130. rule={[
  131. {
  132. required: true,
  133. message: '请填写老师手机号',
  134. trigger: 'blur'
  135. },
  136. {
  137. pattern: /^1[3456789]\d{9}$/,
  138. message: '手机号格式不正确',
  139. trigger: 'blur'
  140. }
  141. ]}>
  142. <NInput
  143. bordered={!data.disabled}
  144. placeholder="请填写老师手机号"
  145. v-model:value={studentForm.phone}></NInput>
  146. </NFormItem>
  147. </NGi>
  148. <NGi>
  149. <NFormItem label="性别" path="sex">
  150. <NSelect
  151. bordered={!data.disabled}
  152. class={styles.select}
  153. showArrow={!data.disabled}
  154. placeholder="请选择性别"
  155. options={formOptions.sexs}
  156. v-model:value={studentForm.gender}
  157. />
  158. </NFormItem>
  159. </NGi>
  160. <NGi>
  161. <NFormItem label="年级" path="">
  162. <NSelect
  163. bordered={!data.disabled}
  164. class={styles.select}
  165. showArrow={!data.disabled}
  166. placeholder="请选择年级"
  167. options={gradeNumList.value as any}
  168. v-model:value={studentForm.currentGradeNum}
  169. />
  170. </NFormItem>
  171. </NGi>
  172. <NGi>
  173. <NFormItem label="班级" path="">
  174. <NSelect
  175. bordered={!data.disabled}
  176. class={styles.select}
  177. showArrow={!data.disabled}
  178. placeholder="请选择班级"
  179. options={classArrayRef.value}
  180. v-model:value={studentForm.currentClass}
  181. />
  182. </NFormItem>
  183. </NGi>
  184. </NGrid>
  185. </NForm>
  186. </div>
  187. {data.disabled ? (
  188. <NSpace class={styles.btnList} align="center" justify="end">
  189. <NButton
  190. class={styles.btn}
  191. strong
  192. color="#f24433"
  193. onClick={() => (data.disabled = false)}>
  194. 修改信息
  195. </NButton>
  196. </NSpace>
  197. ) : (
  198. <NSpace class={styles.btnList} align="center" justify="end">
  199. <NButton class={styles.btn} onClick={() => cancel()}>
  200. 取消
  201. </NButton>
  202. <NButton
  203. loading={loading.value}
  204. class={styles.btn}
  205. type="primary"
  206. onClick={() => handleSave()}>
  207. 完成
  208. </NButton>
  209. </NSpace>
  210. )}
  211. </div>
  212. );
  213. }
  214. });