personInfo.tsx 11 KB

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