index.tsx 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. import ColHeader from '@/components/col-header'
  2. import ColSearch from '@/components/col-search'
  3. import { Sticky, Image, List, Popup, Icon, Area, Field, Form, CellGroup, Button, Toast, Picker, DatetimePicker,Overlay,Dialog } from 'vant'
  4. import { defineComponent, onMounted, reactive } from 'vue'
  5. import styles from './index.module.less'
  6. import bg from './images/bg.png'
  7. import rejectLogo from './images/rejectLogo.png'
  8. import rejectSchool from './images/rejest-school.png'
  9. import subTitle from './images/subTitle.png'
  10. import centerLogo from './images/center.png'
  11. import studentText from './images/studentText.png'
  12. import { useRoute } from 'vue-router'
  13. import icon_arrow from './images/icon_arrow.png'
  14. import rejectBtn from './images/rejectBtn.png'
  15. import studentSuccess from './images/studentSuccess.png'
  16. import request from '@/helpers/request'
  17. import dayjs from 'dayjs'
  18. export default defineComponent({
  19. name: 'tenantStudentRejest',
  20. setup() {
  21. const route = useRoute();
  22. const forms = reactive({
  23. gender: '',
  24. name: '',
  25. phone: '',
  26. subjectId: '',
  27. subjectName:'',
  28. birthdate: '',
  29. code: '',
  30. genderName:'',
  31. tenantId:route.query.tenantId,
  32. });
  33. const data = reactive({
  34. schoolName: route.query.name || '',
  35. id:route.query.tenantId,
  36. cityName: '', // 所属城市
  37. showArea: false,
  38. checked: true,
  39. success: false,
  40. areaList: {} as any,
  41. sendMsg: '获取验证码',
  42. imgCodeStatus: false,
  43. subjectList: [],
  44. searchStatus: false,
  45. openStatus: false,
  46. dateState: false,
  47. genderState:false,
  48. genderList:[{text:'男',value:'1'},{text:'女',value:'0'}],
  49. showSuccess:false,
  50. secondConfirm:false,
  51. minDate: new Date(1980, 1, 1),
  52. maxDate: new Date(),
  53. });
  54. const handleSubmit = async() => {
  55. console.log(forms, 'forms')
  56. if (!forms.name) {
  57. Toast('请输入姓名')
  58. }
  59. if (!forms.gender) {
  60. Toast('请选择性别')
  61. }
  62. if (!forms.phone) {
  63. Toast('请输入手机号')
  64. }
  65. if (!forms.birthdate) {
  66. Toast('请选择出生年月')
  67. }
  68. if (!forms.code) {
  69. Toast('请输入验证码')
  70. }
  71. if (!forms.subjectId) {
  72. Toast('请选择声部')
  73. }
  74. const res = await request.post('/api-tenant/open/student/save',{ data: { ... forms},hideLoading:true})
  75. console.log(res)
  76. if(res.code == 200){
  77. data.showSuccess = true
  78. }
  79. if(res.code == 5004){
  80. data.secondConfirm = true
  81. }
  82. }
  83. const getSubjectList = async () => {
  84. try {
  85. const res = await request.get('/api-tenant/open/subject/queryPage',{ data: { page: 1, rows: 9999 }})
  86. data.subjectList = res.data.rows.map((item:any)=>{
  87. return {
  88. text:item.name,
  89. value:item.id
  90. }
  91. }) || []
  92. } catch (e) {
  93. console.log(e)
  94. }
  95. }
  96. const confirmSubject = (val: any) => {
  97. forms.subjectName = val.text;
  98. forms.subjectId = val.value;
  99. data.searchStatus = false
  100. console.log(val, 'confirmSubject')
  101. }
  102. const confirmDate = (val:any)=>{
  103. forms.birthdate = dayjs(val).format('YYYY-MM-DD')
  104. data.dateState = false
  105. }
  106. onMounted(() => {
  107. getSubjectList()
  108. })
  109. const confirmGender = (val:any)=>{
  110. if(val.value){
  111. forms.gender = val.value;
  112. forms.genderName = val.text
  113. }else{
  114. forms.gender = '';
  115. forms.genderName = ''
  116. }
  117. data.genderState = false
  118. }
  119. /** 发送验证码 */
  120. const onSendSms = async () => {
  121. if (!forms.phone) {
  122. Toast('请输入手机号码');
  123. return;
  124. }
  125. if (!/^1[3456789]\d{9}$/.test(forms.phone)) {
  126. Toast('手机号码格式不正确');
  127. return;
  128. }
  129. await request.post('/api-student/code/sendSmsCode', {
  130. requestType: 'form',
  131. data: {
  132. mobile: forms.phone,
  133. type: 'LOGIN'
  134. }
  135. })
  136. onCountDown()
  137. setTimeout(() => {
  138. Toast('验证码已发送')
  139. }, 100)
  140. };
  141. const onCountDown = ()=>{
  142. data.sendMsg='60s'
  143. let count = 60;
  144. const timer = setInterval(() => {
  145. count--;
  146. data.sendMsg= `${count}s`
  147. if (count <= 0) {
  148. data.sendMsg='获取验证码'
  149. clearInterval(timer);
  150. }
  151. }, 1000);
  152. }
  153. const downApp = ()=>{
  154. window.open(location.origin + '/student/#/download')
  155. data.showSuccess = false
  156. }
  157. const submitSecond = async()=>{
  158. try{
  159. const res = await request.post('/api-tenant/open/student/save',{ data: { ... forms,updateTenant:true},hideLoading:true})
  160. data.showSuccess=true
  161. data.secondConfirm=false
  162. }catch(e){
  163. console.log(e)
  164. }
  165. }
  166. return () =>
  167. <>< div class={styles.videoClass} >
  168. {/* <ColHeader
  169. class={styles.classHeader}
  170. border={false}
  171. isFixed={false}
  172. background="#fff"
  173. /> */}
  174. <div class={styles.resjetStudentWrap}>
  175. <img src={rejectLogo} class={styles.rejectLogo} alt="" />
  176. <img src={studentText} class={styles.studentText} alt="" />
  177. <img src={bg} class={styles.bgWrap} alt="" />
  178. <div class={styles.schoolNameWrap}>
  179. <img src={rejectSchool} class={styles.rejectSchool} alt="" />
  180. <p>{data.schoolName}</p>
  181. </div>
  182. <img class={styles.centerLogo} src={centerLogo} alt="" />
  183. <div class={styles.infoWrap}>
  184. <div class={styles.infoWrapCore}>
  185. <img src={subTitle} class={styles.subTitle} alt="" />
  186. <Form onSubmit={() => handleSubmit()}>
  187. <CellGroup class={styles.group} border={false}>
  188. <Field
  189. class={styles.noArrow}
  190. inputAlign="right"
  191. label="姓名"
  192. placeholder="请输入姓名"
  193. maxlength={20}
  194. v-model={forms.name}
  195. // onUpdate: modelValue={(val: string) => {
  196. // forms.nickname = val.trim();
  197. // }}
  198. />
  199. <Field
  200. readonly
  201. inputAlign="right"
  202. label="性别"
  203. placeholder="请选择性别"
  204. v-model={forms.genderName}
  205. onClick={()=>{
  206. data.genderState = true
  207. }}
  208. // onUpdate: modelValue={(val: string) => {
  209. // forms.nickname = val.trim();
  210. // }}
  211. >
  212. {{
  213. button: () => (
  214. <img
  215. style={{
  216. display: 'block',
  217. width: '12px',
  218. height: '12px',
  219. }}
  220. src={icon_arrow}
  221. />
  222. )
  223. }}
  224. </Field>
  225. <Field
  226. readonly
  227. inputAlign="right"
  228. label="出生日期"
  229. placeholder="请选择出生日期"
  230. maxlength={20}
  231. v-model={forms.birthdate}
  232. onClick={()=>{data.dateState = true}}
  233. // onUpdate: modelValue={(val: string) => {
  234. // forms.nickname = val.trim();
  235. // }}
  236. >
  237. {{
  238. button: () => (
  239. <img
  240. style={{
  241. display: 'block',
  242. width: '12px',
  243. height: '12px',
  244. }}
  245. src={icon_arrow}
  246. />
  247. )
  248. }}
  249. </Field>
  250. <Field
  251. inputAlign="right"
  252. label="手机号"
  253. class={styles.noArrow}
  254. maxlength={11}
  255. placeholder="请输入手机号码"
  256. v-model={forms.phone}
  257. />
  258. <div class={styles.tips}>
  259. 手机号码为酷乐秀机构版登录账号
  260. </div>
  261. <Field
  262. class={styles.inputCode}
  263. inputAlign="left"
  264. label="请输入验证码"
  265. labelWidth={0}
  266. v-model={forms.code}
  267. maxlength={6}>
  268. {{
  269. button: () => (
  270. <Button
  271. disabled={data.sendMsg.includes('s')}
  272. class={styles.sendBtn}
  273. onClick={() => onSendSms()}>
  274. {data.sendMsg}
  275. </Button>
  276. )
  277. }}
  278. </Field>
  279. <Field
  280. border={false}
  281. inputAlign="right"
  282. label="声部"
  283. placeholder="请选择声部"
  284. readonly
  285. v-model={forms.subjectName}
  286. onClick={() => (data.searchStatus = true)}>
  287. {{
  288. button: () => (
  289. <img
  290. style={{
  291. display: 'block',
  292. width: '12px',
  293. height: '12px',
  294. }}
  295. src={icon_arrow}
  296. />
  297. )
  298. }}
  299. </Field>
  300. </CellGroup>
  301. </Form>
  302. </div>
  303. <img src={rejectBtn} onClick={() => { handleSubmit() }} class={styles.rejectBtn} alt="" />
  304. </div>
  305. </div>
  306. <Popup
  307. show={data.searchStatus}
  308. position="bottom"
  309. round
  310. columns-field-names={{ text: '' }}
  311. safe-area-inset-bottom
  312. onClose={() => (data.searchStatus = false)}
  313. onClosed={() => (data.openStatus = false)}
  314. >
  315. <Picker columns={data.subjectList} onCancel={() => { data.searchStatus = false }} onConfirm={confirmSubject}></Picker>
  316. </Popup>
  317. <Popup
  318. show={data.dateState}
  319. position="bottom"
  320. round
  321. columns-field-names={{ text: '' }}
  322. safe-area-inset-bottom
  323. onClose={() => (data.dateState = false)}
  324. onClosed={() => (data.dateState = false)}
  325. >
  326. <DatetimePicker
  327. min-date={data.minDate}
  328. max-date={data.maxDate} type="date" v-model:value={forms.birthdate} onCancel={() => { data.dateState = false }} onConfirm={confirmDate}></DatetimePicker>
  329. </Popup>
  330. <Popup
  331. show={data.genderState}
  332. position="bottom"
  333. round
  334. columns-field-names={{ text: '' }}
  335. safe-area-inset-bottom
  336. onClose={() => (data.genderState = false)}
  337. onClosed={() => (data.genderState = false)}
  338. >
  339. <Picker columns={data.genderList} onCancel={() => { data.genderState = false }} onConfirm={confirmGender}></Picker>
  340. </Popup>
  341. <Overlay show={data.showSuccess} z-index={1000}>
  342. <div class={styles.showWrap}>
  343. <img class={styles.showWrapTop} src={studentSuccess} alt="" />
  344. <h2>恭喜您已成功登记为</h2>
  345. <h4>{data.schoolName} <span>【学员】</span> </h4>
  346. <p>请下载酷乐秀机构版APP进行学习</p>
  347. <div class={styles.downApp} onClick={downApp}>立即下载</div>
  348. </div>
  349. </Overlay>
  350. <Popup
  351. show={data.secondConfirm}
  352. position="center"
  353. round
  354. onClose={() => (data.secondConfirm = false)}
  355. onClosed={() => (data.secondConfirm = false)}
  356. >
  357. <div class={styles.secondWrap}>
  358. <h2>提示</h2>
  359. <p>当前账号已存在 <span>【机构名称】</span> ,是否</p>
  360. <p>确认更换到 <span>{data.schoolName}</span>吗? </p>
  361. <div class={styles.buttonWrap}>
  362. <div class={styles.closeBtn} onClick={()=>{data.secondConfirm = false}}> 取消</div>
  363. <div class={styles.submitBtn} onClick={submitSecond}>确定</div>
  364. </div>
  365. </div>
  366. </Popup>
  367. </div ></>
  368. }
  369. })