Register.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. <template>
  2. <div class="register">
  3. <header>报名</header>
  4. <div class="banner">
  5. <img src="../../assets/images/register_banner.png" alt="">
  6. </div>
  7. <div class="reg-title">
  8. <i class="icon card_icon"></i> 请填写学生信息 <span>(必填)</span>
  9. </div>
  10. <van-cell-group>
  11. <van-field required label="姓名" input-align="right" placeholder="请输入姓名"
  12. v-model="stu.name"></van-field>
  13. <van-field required label="性别" disabled v-model="stu.gender" input-align="right"
  14. placeholder="请选择" @click="onChange('gender')" is-link></van-field>
  15. <van-field required type="number" label="身份证号" input-align="right"
  16. v-model="stu.idCardNo" placeholder="请输入身份证号"></van-field>
  17. <van-field required disabled label="乐团" input-align="right"
  18. placeholder="请输入乐团" v-model="stu.band"></van-field>
  19. <van-field required label="年级" disabled input-align="right" v-model="stu.currentGrade"
  20. placeholder="请选择" @click="classStatus = true" is-link></van-field>
  21. <van-field required label="班级" input-align="right" placeholder="请输入班级"
  22. v-model="stu.currentClass"></van-field>
  23. </van-cell-group>
  24. <div class="reg-title">
  25. <i class="icon card_icon"></i> 请填写专业信息 <span>(必填)</span>
  26. </div>
  27. <van-cell-group>
  28. <van-field required label="声部" v-model="stu.major" @click="onChange('major')"
  29. disabled is-link input-align="right" placeholder="请选择"></van-field>
  30. <van-field required label="乐器购买方式" v-model="stu.kitPurchaseMethod" @click="onChange('kitPurchaseMethod')"
  31. disabled is-link input-align="right" placeholder="请选择"></van-field>
  32. <van-field required label="是否服从调配" v-model="stu.isAllowAdjust" disabled
  33. placeholder="请选择" @click="onChange('isAllowAdjust')" is-link input-align="right"></van-field>
  34. </van-cell-group>
  35. <div class="reg-title">
  36. <i class="icon card_icon"></i> 请填写家长信息 <span>(必填,至少1名联系人)</span>
  37. </div>
  38. <van-cell-group>
  39. <van-field required label="家长" input-align="right" placeholder="请输入家长姓名" v-model="stu.parentsName"></van-field>
  40. <van-field required label="手机" input-align="right" placeholder="请输入手机号" v-model="stu.parentsPhone"></van-field>
  41. <van-field label="单位" input-align="right" placeholder="请输入单位名称" v-model="stu.parentsCompany"></van-field>
  42. <van-field input-align="right"
  43. v-model="stu.remark" label="备注" type="textarea"
  44. placeholder="请输入备注" rows="2" autosize />
  45. </van-cell-group>
  46. <div class="btn-group">
  47. <van-button class="btn-submit" @click="onSubmit" size="large">提交</van-button>
  48. </div>
  49. <van-action-sheet
  50. v-model="sheetStatus"
  51. :actions="sheetActions"
  52. cancel-text="取消"
  53. @select="onSelect"
  54. @cancel="sheetStatus = false"/>
  55. <van-popup v-model="classStatus" position="bottom">
  56. <van-picker :columns="dataList.currentGrade"
  57. show-toolbar
  58. @cancel="classStatus = false"
  59. @confirm="onClassConfirm" />
  60. </van-popup>
  61. </div>
  62. </template>
  63. <script>
  64. import { getMusicGroupRegInfo, registerAdd } from '@/api/student'
  65. export default {
  66. name: 'register',
  67. data() {
  68. return {
  69. sheetStatus: false, // 选项卡状态
  70. classStatus: false, // 年级弹窗状态
  71. stu: {
  72. name: null, // 姓名
  73. gender: null, // 性别
  74. idCardNo: null, // 身份证号
  75. band: '',// 乐团
  76. currentGrade: '', // 年级
  77. currentClass: null, // 班级
  78. major: '', // 专业
  79. kitPurchaseMethod: '团购',
  80. isAllowAdjust: '是', // 是否服从调配
  81. parentsName: null, // 家长
  82. parentsPhone: null, // 电话
  83. parentsCompany: null, // 单位
  84. remark: null, // 备注
  85. },
  86. stuIndex: {
  87. genderNo: null, // 性别编号
  88. majorNo: null, // 专业编号
  89. subNo: null, // 科目编号
  90. kitPurchaseMethod: 'GROUP',
  91. isAllowAdjustNo: 'YES', // 是否服从调配编号
  92. },
  93. selectName: '', // 选择是哪个字段
  94. sheetActions: [], // 上拉列表数据展示
  95. dataList: { // 上拉列表数据列表
  96. gender: [{ name: '男', index: 1 }, {name: '女', index: 0}],
  97. currentGrade: ['一年级','二年级','三年级','四年级','五年级','六年级','初一/七年级','初二/八年级','初三/九年级','高一','高二','高三'],
  98. isAllowAdjust: [{ name: '是', index: 'YES' }, {name: '否', index: 'NO'}],
  99. major: [],
  100. kitPurchaseMethod: [{ name: '团购', index: 'GROUP' }, {name: '自备', index: 'OWNED'}]
  101. }
  102. }
  103. },
  104. mounted() {
  105. let params = this.$route.query
  106. // 获取声部列表
  107. getMusicGroupRegInfo({ musicGroupId: params.musicGroupId }).then(res => {
  108. let result = res.data
  109. if(result.code == 200 && result.data) {
  110. this.stu.band = result.data.musicGroupName
  111. result.data.subjectList.forEach(item => {
  112. let tempSubName = item.name.split('.').reverse()[0]
  113. this.dataList.major.push({
  114. name: tempSubName,
  115. index: item.id,
  116. subNo: item.subId
  117. })
  118. })
  119. }
  120. })
  121. },
  122. methods: {
  123. onSelect(item) { // 选中子选项时赋值
  124. this.stu[this.selectName] = item.name
  125. this.sheetStatus = false
  126. // 根据不同的类型取到对应的编号
  127. if(this.selectName == 'gender') {
  128. this.stuIndex.genderNo = item.index
  129. } else if(this.selectName == 'isAllowAdjust') {
  130. this.stuIndex.isAllowAdjustNo = item.index
  131. } else if(this.selectName == 'major') {
  132. this.stuIndex.majorNo = item.index
  133. this.stuIndex.subNo = item.subNo
  134. } else if(this.selectName == 'kitPurchaseMethod') {
  135. this.stuIndex.kitPurchaseMethod = item.index
  136. }
  137. },
  138. onChange(name) { // 选择上拉弹窗时
  139. this.sheetStatus = true
  140. this.sheetActions = this.dataList[name]
  141. this.selectName = name
  142. },
  143. onClassConfirm(val) { // 年级赋值
  144. this.stu.currentGrade = val
  145. this.classStatus = false
  146. },
  147. onSubmit() {
  148. // 确定注册
  149. let checkResult = this.onCheckForm()
  150. if(checkResult) {
  151. this.$toast(checkResult)
  152. return false
  153. }
  154. let s = this.stu
  155. let params = {
  156. currentClass: s.currentClass,
  157. currentGrade: s.currentGrade,
  158. gender: this.stuIndex.genderNo,
  159. idCardNo: s.idCardNo,
  160. isAllowAdjust: this.stuIndex.isAllowAdjustNo,
  161. kitPurchaseMethod: this.stuIndex.kitPurchaseMethod,
  162. musicGroupId: this.$route.query.musicGroupId,
  163. name: s.name,
  164. parentsName: s.parentsName,
  165. parentsPhone: s.parentsPhone,
  166. subjectId: this.stuIndex.majorNo,
  167. parentsCompany: s.parentsCompany,
  168. remark: s.remark
  169. }
  170. registerAdd(params).then(res => {
  171. console.log(res)
  172. let result = res.data
  173. if(result.code == 200) {
  174. this.$dialog.alert({
  175. title: '提示',
  176. message: '恭喜你,报名成功'
  177. })
  178. } else {
  179. this.$dialog.alert({
  180. title: '提示',
  181. message: result.msg
  182. })
  183. }
  184. })
  185. },
  186. onCheckForm() {
  187. let student = this.stu
  188. let errorTextArr = {
  189. name: '请输入姓名',
  190. gender: '请选择性别', // 性别
  191. idCardNo: '请输入身份证号', // 学校
  192. currentGrade: '请选择年级', // 年级
  193. currentClass: '请输入班级', // 班级
  194. major: '请选择声部', // 专业
  195. kitPurchaseMethod: '请选择乐器购买方式',
  196. isAllowAdjust: '请选择是否服从调配', // 是否服从调配
  197. parentsName: '请输入家长姓名', // 家长
  198. parentsPhone: '请输入手机号', // 电话
  199. // parentsCompany: '请输入单位名称'
  200. }
  201. let idCardReg = /(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$)|(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)/
  202. for(let key in student) {
  203. if(!student[key] || student[key] == '') {
  204. return errorTextArr[key]
  205. } else if(key == 'parentsPhone' && !(/^1(3|4|5|6|7|8|9)\d{9}$/.test(student.parentsPhone))) {
  206. return '电话输入有误'
  207. } else if(key == 'idCardNo' && !idCardReg.test(student.idCardNo)) {
  208. return '身份证号输入有误'
  209. }
  210. }
  211. return ''
  212. }
  213. }
  214. }
  215. </script>
  216. <style lang="less" scoped>
  217. .register {
  218. margin-bottom: .3rem;
  219. }
  220. header {
  221. height: .40rem;
  222. line-height: .40rem;
  223. color: #000;
  224. font-size: .17rem;
  225. background: #fff;
  226. box-shadow: 0px 1px 8px 0px rgba(0,0,0,0.07);
  227. text-align: center;
  228. margin-bottom: .06rem;
  229. }
  230. .banner {
  231. font-size: 0;
  232. img{
  233. width: 100%;
  234. }
  235. }
  236. .reg-title {
  237. padding: 0 .12rem;
  238. position: relative;
  239. height: .4rem;
  240. display: flex;
  241. align-items: center;
  242. color: #666;
  243. font-size: .14rem;
  244. span {
  245. color: #9B9B9B;
  246. }
  247. .card_icon {
  248. display: inline-block;
  249. width: .23rem;
  250. height: .2rem;
  251. margin-right: .1rem;
  252. background: url('../../assets/images/Shape.png') no-repeat center;
  253. background-size: contain;
  254. }
  255. }
  256. .btn-group {
  257. margin: .3rem .3rem 0;
  258. .btn-submit {
  259. background: #14928A;
  260. border-radius: 1rem;
  261. color: #fff;
  262. font-size: .18rem;
  263. }
  264. }
  265. /deep/.van-cell {
  266. font-size: .16rem;
  267. padding: .13rem .11rem;
  268. .van-field__control:disabled {
  269. color: #323233 !important;
  270. }
  271. }
  272. /deep/.van-field--disabled .van-field__control {
  273. color: #444 !important;
  274. }
  275. /deep/.van-field__label, /deep/.van-cell__title {
  276. padding-left: .08rem;
  277. flex: 1 auto;
  278. }
  279. // .van-field--disabled {
  280. .van-field__controll {
  281. color: #323233;
  282. }
  283. // }
  284. </style>