index.tsx 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. import {
  2. NForm,
  3. NFormItem,
  4. NInput,
  5. NSpace,
  6. NButton,
  7. useMessage,
  8. NAlert,
  9. NCascader
  10. } from 'naive-ui';
  11. import { Prop, PropType, defineComponent, reactive, ref } from 'vue';
  12. import { api_teacherAdd } from '../../api';
  13. import { useUserStore } from '/src/store/modules/users';
  14. export default defineComponent({
  15. name: 'teacher-operation',
  16. emits: ['close'],
  17. props: {
  18. areaList: {
  19. type: Array as PropType<any[]>,
  20. default: () => []
  21. }
  22. },
  23. setup(props, { emit }) {
  24. const user = useUserStore();
  25. const forms = reactive({
  26. provinceCode: '',
  27. cityCode: '',
  28. regionCode: '',
  29. tenantId: user.info.schoolInfos?.[0]?.tenantId,
  30. phone: null,
  31. schoolId: user.info.schoolInfos?.[0]?.id,
  32. nickname: null,
  33. gender: 1
  34. });
  35. const btnLoading = ref(false);
  36. const formsRef = ref();
  37. const message = useMessage();
  38. // 提交记录
  39. const onSubmit = async () => {
  40. formsRef.value.validate(async (error: any) => {
  41. if (error) return;
  42. try {
  43. btnLoading.value = true;
  44. await api_teacherAdd({ ...forms });
  45. message.success('添加成功');
  46. } catch (e) {
  47. console.log(e);
  48. }
  49. setTimeout(() => {
  50. btnLoading.value = false;
  51. emit('close');
  52. }, 100);
  53. });
  54. };
  55. // const formatParentAreaId = (id: any, list: any, ids = [] as any) => {
  56. // for (const item of list) {
  57. // if (item.code === id) {
  58. // return [...ids, id];
  59. // }
  60. // if (item.areas && item.areas.length > 0) {
  61. // const cIds: any = formatParentAreaId(id, item.areas, [
  62. // ...ids,
  63. // item.code
  64. // ]);
  65. // if (cIds.includes(id)) {
  66. // return cIds;
  67. // }
  68. // }
  69. // }
  70. // return ids;
  71. // };
  72. return () => (
  73. <div>
  74. <NForm
  75. model={forms}
  76. ref={formsRef}
  77. showRequireMark={false}
  78. label-placement="left"
  79. label-width="126">
  80. <NFormItem
  81. label="老师姓名"
  82. path="nickname"
  83. rule={[
  84. {
  85. required: true,
  86. message: '请输入老师姓名'
  87. }
  88. ]}>
  89. <NInput
  90. v-model:value={forms.nickname}
  91. placeholder="请输入老师姓名"
  92. clearable
  93. maxlength={14}
  94. />
  95. </NFormItem>
  96. <NFormItem
  97. label="老师性别"
  98. path="gender"
  99. rule={[
  100. {
  101. required: true,
  102. message: '请选择老师性别'
  103. }
  104. ]}>
  105. <NSpace>
  106. <n-button
  107. class="genderBtn"
  108. type={forms.gender ? 'info' : undefined}
  109. tertiary={forms.gender ? false : true}
  110. onClick={() => {
  111. forms.gender = 1;
  112. }}>
  113. </n-button>
  114. <n-button
  115. class="genderBtn"
  116. type={!forms.gender ? 'info' : undefined}
  117. tertiary={!forms.gender ? false : true}
  118. onClick={() => {
  119. forms.gender = 0;
  120. }}>
  121. </n-button>
  122. </NSpace>
  123. </NFormItem>
  124. <NFormItem label="城区">
  125. <NCascader
  126. to="body"
  127. placeholder="请选择城区"
  128. options={props.areaList}
  129. labelField="name"
  130. valueField="code"
  131. childrenField="areas"
  132. checkStrategy="child"
  133. expandTrigger="hover"
  134. onUpdate:value={(val: any, option: any, pathValues: any) => {
  135. forms.provinceCode = pathValues[0]?.code;
  136. forms.cityCode = pathValues[1]?.code;
  137. forms.regionCode = pathValues[2]?.code;
  138. }}
  139. />
  140. </NFormItem>
  141. <NFormItem
  142. label="手机号"
  143. path="phone"
  144. rule={[
  145. {
  146. required: true,
  147. message: '手机号码',
  148. trigger: 'blur'
  149. },
  150. {
  151. pattern:
  152. /^((13[0-9])|(14(0|[5-7]|9))|(15([0-3]|[5-9]))|(16(2|[5-7]))|(17[0-8])|(18[0-9])|(19([0-3]|[5-9])))\d{8}$/,
  153. message: '请输入正确的手机号',
  154. trigger: 'blur'
  155. }
  156. ]}>
  157. <NInput
  158. maxlength={11}
  159. v-model:value={forms.phone}
  160. placeholder="请输入手机号"
  161. clearable
  162. />
  163. </NFormItem>
  164. <div class="nalert">
  165. <NAlert type="error" showIcon={false} bordered={false}>
  166. 默认密码为ktyq+手机号后四位
  167. </NAlert>
  168. </div>
  169. </NForm>
  170. <NSpace style={{ padding: '20px 0 32px 0' }} justify="center">
  171. <NButton
  172. class="actionBtn"
  173. round
  174. type="default"
  175. onClick={() => emit('close')}>
  176. 取消
  177. </NButton>
  178. <NButton
  179. class="actionBtn"
  180. round
  181. type="primary"
  182. onClick={() => onSubmit()}
  183. loading={btnLoading.value}>
  184. 确定
  185. </NButton>
  186. </NSpace>
  187. </div>
  188. );
  189. }
  190. });