personInfo.tsx 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  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: userStore.info.provinceCode, // 省份编码
  43. cityCode: userStore.info.cityCode, // 城市编码
  44. regionCode: userStore.info.regionCode, // 区域编码
  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={[
  98. styles.defultHeade,
  99. styles.changeHead,
  100. data.disabled ? styles.disalbedNone : styles.hoverNone
  101. ]}>
  102. 修改头像
  103. {data.uploadShow && (
  104. <UploadFile
  105. class={[styles.uploadFile]}
  106. cropper
  107. onUpdate:fileList={val => {
  108. teacherForm.avatar = val;
  109. data.uploadShow = false;
  110. setTimeout(() => {
  111. data.uploadShow = true;
  112. }, 100);
  113. }}
  114. />
  115. )}
  116. </div>
  117. </div>
  118. <div class={styles.headerInfo}>
  119. <p class={styles.headerTitle}>
  120. {userStore.info.nickname}
  121. {userStore.info.gender !== null && (
  122. <NImage
  123. previewDisabled
  124. class={styles.sexIcon}
  125. src={userStore.info.gender ? maleIcon : femaleIcon}></NImage>
  126. )}
  127. </p>
  128. <p class={styles.headerSubTitle}>
  129. {userStore.info.schoolInfos?.[0]?.name}
  130. {/* | 音乐老师 */}
  131. </p>
  132. </div>
  133. </div>
  134. <div class={styles.setInfo}>
  135. <NForm ref={formRef} model={teacherForm} disabled={data.disabled}>
  136. <NGrid cols={3} x-gap="100">
  137. <NGi>
  138. <NFormItem
  139. label="姓名"
  140. path="nickname"
  141. rule={[
  142. {
  143. required: true,
  144. message: '请输入老师姓名',
  145. trigger: 'blur'
  146. },
  147. {
  148. pattern: /^(?:[\u4e00-\u9fa5·]{2,16})$/,
  149. message: '请输入中文姓名,不要包含空格,及特殊符号',
  150. trigger: 'blur'
  151. }
  152. ]}>
  153. <NInput
  154. maxlength={14}
  155. bordered={!data.disabled}
  156. placeholder="请填写老师姓名"
  157. v-model:value={teacherForm.nickname}></NInput>
  158. </NFormItem>
  159. </NGi>
  160. <NGi>
  161. <NFormItem
  162. label="手机号"
  163. path="phone"
  164. rule={[
  165. {
  166. required: true,
  167. message: '请填写老师手机号',
  168. trigger: 'blur'
  169. },
  170. {
  171. pattern: /^1[3456789]\d{9}$/,
  172. message: '手机号格式不正确',
  173. trigger: 'blur'
  174. }
  175. ]}>
  176. <NInput
  177. bordered={!data.disabled}
  178. placeholder="请填写老师手机号"
  179. v-model:value={teacherForm.phone}></NInput>
  180. </NFormItem>
  181. </NGi>
  182. <NGi>
  183. <NFormItem
  184. label="性别"
  185. path="gender"
  186. rule={[
  187. {
  188. required: true,
  189. type: 'number',
  190. message: '请选择性别',
  191. trigger: 'blur'
  192. }
  193. ]}>
  194. <NSelect
  195. bordered={!data.disabled}
  196. class={styles.select}
  197. showArrow={!data.disabled}
  198. placeholder="请选择性别"
  199. options={formOptions.sexs}
  200. v-model:value={teacherForm.gender}
  201. />
  202. </NFormItem>
  203. </NGi>
  204. <NGi>
  205. <NFormItem
  206. label="城区"
  207. path="provinceCode"
  208. rule={{
  209. required: true,
  210. type: 'number',
  211. message: '请选择城区',
  212. trigger: 'change'
  213. }}>
  214. <NCascader
  215. bordered={!data.disabled}
  216. options={formOptions.areaList}
  217. labelField="name"
  218. valueField="code"
  219. childrenField="areas"
  220. checkStrategy="child"
  221. expandTrigger="hover"
  222. defaultValue={
  223. userStore.info.regionCode ||
  224. userStore.info.cityCode ||
  225. userStore.info.provinceCode
  226. }
  227. onUpdate:value={(
  228. val: any,
  229. option: any,
  230. pathValues: any
  231. ) => {
  232. teacherForm.provinceCode = pathValues[0]?.code;
  233. teacherForm.cityCode = pathValues[1]?.code;
  234. teacherForm.regionCode = pathValues[2]?.code;
  235. }}
  236. />
  237. </NFormItem>
  238. </NGi>
  239. </NGrid>
  240. </NForm>
  241. </div>
  242. {data.disabled ? (
  243. <NSpace class={styles.btnList} align="center" justify="end">
  244. <NButton
  245. class={styles.btn}
  246. color="#198cfe"
  247. onClick={() => (data.openChangePwd = true)}>
  248. 修改密码
  249. </NButton>
  250. <NButton
  251. class={styles.btn}
  252. color="#f24433"
  253. onClick={() => (data.disabled = false)}>
  254. 修改信息
  255. </NButton>
  256. </NSpace>
  257. ) : (
  258. <NSpace class={styles.btnList} align="center" justify="end">
  259. <NButton
  260. class={styles.btn}
  261. onClick={() => {
  262. data.disabled = true;
  263. formRef.value?.restoreValidation();
  264. }}>
  265. 取消
  266. </NButton>
  267. <NButton
  268. class={styles.btn}
  269. type="primary"
  270. onClick={() => handleSave()}>
  271. 完成
  272. </NButton>
  273. </NSpace>
  274. )}
  275. <NModal
  276. class={styles.changePwdModal}
  277. v-model:show={data.openChangePwd}
  278. preset="dialog"
  279. showIcon={false}
  280. title="修改密码">
  281. <ForgotPassword
  282. phone={userStore.info.phone}
  283. onClose={() => {
  284. data.openChangePwd = false;
  285. }}
  286. />
  287. </NModal>
  288. </div>
  289. );
  290. }
  291. });