personInfo.tsx 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. import { defineComponent, onMounted, reactive, ref } 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 UploadFile from '/src/components/upload-file';
  26. import ForgotPassword from '../modal/forgotPassword';
  27. import { api_sysAreaQueryAllProvince } from '../api';
  28. export default defineComponent({
  29. name: 'setting-personInfo',
  30. setup() {
  31. const message = useMessage();
  32. const userStore = useUserStore();
  33. const formOptions = reactive({
  34. sexs: [
  35. { label: '男', value: 1, class: 'option' },
  36. { label: '女', value: 0, class: 'option' }
  37. ] as SelectOption[],
  38. areaList: [] as any[]
  39. });
  40. const formRef = ref();
  41. const teacherForm = reactive({
  42. provinceCode: 0, // 省份编码
  43. cityCode: 0, // 城市编码
  44. regionCode: 0, // 区域编码
  45. nickname: userStore.info.nickname,
  46. phone: userStore.info.phone,
  47. gender: userStore.info.gender,
  48. schoolId: userStore.info.schoolInfos?.[0]?.id,
  49. tenantId: userStore.info.schoolInfos?.[0]?.tenantId,
  50. id: userStore.info.id,
  51. avatar: userStore.info.avatar
  52. });
  53. const data = reactive({
  54. disabled: true,
  55. openChangePwd: false,
  56. uploadShow: true
  57. });
  58. const getAreaList = async () => {
  59. const res = await api_sysAreaQueryAllProvince();
  60. if (res?.code === 200) {
  61. formOptions.areaList = res.data;
  62. }
  63. };
  64. onMounted(() => {
  65. getAreaList();
  66. });
  67. const handleSave = () => {
  68. formRef.value.validate(async (err: any) => {
  69. if (err) {
  70. return;
  71. }
  72. if (!teacherForm.provinceCode || !teacherForm.cityCode) {
  73. message.error('请选择城区');
  74. return;
  75. }
  76. await api_teacherUpdate(teacherForm);
  77. console.log(teacherForm);
  78. userStore.getInfo();
  79. data.disabled = true;
  80. message.success('修改成功');
  81. });
  82. };
  83. return () => (
  84. <div class={styles.infoWrap}>
  85. <div class={styles.teacherInfoWrap}>
  86. <div class={styles.teacherHeadWrap}>
  87. <NImage
  88. previewDisabled
  89. class={styles.headerD}
  90. src={headerD}></NImage>
  91. <NImage
  92. previewDisabled
  93. class={styles.defultHeade}
  94. src={teacherForm.avatar || defultHeade}></NImage>
  95. <div
  96. style={{ display: data.disabled ? 'none' : '' }}
  97. class={[styles.defultHeade, styles.changeHead]}>
  98. 修改头像
  99. {data.uploadShow && (
  100. <UploadFile
  101. class={[styles.uploadFile]}
  102. cropper
  103. onUpdate:fileList={val => {
  104. teacherForm.avatar = val;
  105. data.uploadShow = false;
  106. setTimeout(() => {
  107. data.uploadShow = true;
  108. }, 100);
  109. }}
  110. />
  111. )}
  112. </div>
  113. </div>
  114. <div class={styles.headerInfo}>
  115. <p class={styles.headerTitle}>
  116. {userStore.info.nickname}
  117. <NImage
  118. previewDisabled
  119. class={styles.sexIcon}
  120. src={userStore.info.gender ? maleIcon : femaleIcon}></NImage>
  121. </p>
  122. <p class={styles.headerSubTitle}>
  123. {userStore.info.schoolInfos?.[0]?.name} | 音乐老师
  124. </p>
  125. </div>
  126. </div>
  127. <div class={styles.setInfo}>
  128. <NForm ref={formRef} model={teacherForm} disabled={data.disabled}>
  129. <NGrid cols={3} x-gap="100">
  130. <NGi>
  131. <NFormItem
  132. label="姓名"
  133. path="nickname"
  134. rule={[
  135. {
  136. required: true,
  137. message: '请输入老师姓名',
  138. trigger: 'blur'
  139. },
  140. {
  141. pattern: /^(?:[\u4e00-\u9fa5·]{2,16})$/,
  142. message: '请输入中文姓名,不要包含空格,及特殊符号',
  143. trigger: 'blur'
  144. }
  145. ]}>
  146. <NInput
  147. maxlength={14}
  148. bordered={!data.disabled}
  149. placeholder="请填写老师姓名"
  150. v-model:value={teacherForm.nickname}></NInput>
  151. </NFormItem>
  152. </NGi>
  153. <NGi>
  154. <NFormItem
  155. label="手机号"
  156. path="phone"
  157. rule={[
  158. {
  159. required: true,
  160. message: '请填写老师手机号',
  161. trigger: 'blur'
  162. },
  163. {
  164. pattern: /^1[3456789]\d{9}$/,
  165. message: '手机号格式不正确',
  166. trigger: 'blur'
  167. }
  168. ]}>
  169. <NInput
  170. bordered={!data.disabled}
  171. placeholder="请填写老师手机号"
  172. v-model:value={teacherForm.phone}></NInput>
  173. </NFormItem>
  174. </NGi>
  175. <NGi>
  176. <NFormItem label="性别" path="sex">
  177. <NSelect
  178. bordered={!data.disabled}
  179. class={styles.select}
  180. showArrow={!data.disabled}
  181. placeholder="请选择性别"
  182. options={formOptions.sexs}
  183. v-model:value={teacherForm.gender}
  184. />
  185. </NFormItem>
  186. </NGi>
  187. </NGrid>
  188. <NFormItem
  189. label="城区"
  190. style={{ maxWidth: '30%' }}>
  191. <NCascader
  192. bordered={!data.disabled}
  193. options={formOptions.areaList}
  194. labelField="name"
  195. valueField="code"
  196. childrenField="areas"
  197. checkStrategy="child"
  198. expandTrigger="hover"
  199. defaultValue={
  200. userStore.info.regionCode ||
  201. userStore.info.cityCode ||
  202. userStore.info.provinceCode
  203. }
  204. onUpdate:value={(val: any, option: any, pathValues: any) => {
  205. teacherForm.provinceCode = pathValues[0]?.code;
  206. teacherForm.cityCode = pathValues[1]?.code;
  207. teacherForm.regionCode = pathValues[2]?.code;
  208. }}
  209. />
  210. </NFormItem>
  211. </NForm>
  212. </div>
  213. {data.disabled ? (
  214. <NSpace class={styles.btnList} align="center" justify="end">
  215. <NButton
  216. class={styles.btn}
  217. color="#198cfe"
  218. onClick={() => (data.openChangePwd = true)}>
  219. 修改密码
  220. </NButton>
  221. <NButton
  222. class={styles.btn}
  223. color="#f24433"
  224. onClick={() => (data.disabled = false)}>
  225. 修改信息
  226. </NButton>
  227. </NSpace>
  228. ) : (
  229. <NSpace class={styles.btnList} align="center" justify="end">
  230. <NButton
  231. class={styles.btn}
  232. onClick={() => {
  233. data.disabled = true;
  234. formRef.value?.restoreValidation();
  235. }}>
  236. 取消
  237. </NButton>
  238. <NButton
  239. class={styles.btn}
  240. type="primary"
  241. onClick={() => handleSave()}>
  242. 完成
  243. </NButton>
  244. </NSpace>
  245. )}
  246. <NModal
  247. class={styles.changePwdModal}
  248. v-model:show={data.openChangePwd}
  249. preset="dialog"
  250. showIcon={false}
  251. title="修改密码">
  252. <ForgotPassword
  253. phone={userStore.info.phone}
  254. onClose={() => {
  255. data.openChangePwd = false;
  256. }}
  257. />
  258. </NModal>
  259. </div>
  260. );
  261. }
  262. });