index.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. <template>
  2. <view class="register-bg">
  3. <view class="bg-container">
  4. 参会报名
  5. </view>
  6. <auth-wrap class="register-container" ref="authWrap">
  7. <view class="form-content" slot="content">
  8. <u--form
  9. labelPosition="left"
  10. :model="model1"
  11. :rules="rules"
  12. ref="uForm"
  13. @submit="onSubmit"
  14. >
  15. <u-form-item
  16. label="姓名"
  17. prop="userInfo.usrName"
  18. borderBottom
  19. class="require"
  20. >
  21. <u--input
  22. placeholder="输入姓名"
  23. v-model="model1.userInfo.usrName"
  24. border="none"
  25. ></u--input>
  26. </u-form-item>
  27. <u-form-item
  28. label="单位名称"
  29. prop="userInfo.orgUnitName"
  30. borderBottom
  31. class="require"
  32. >
  33. <u--input
  34. placeholder="输入单位名称"
  35. v-model="model1.userInfo.orgUnitName"
  36. border="none"
  37. ></u--input>
  38. </u-form-item>
  39. <u-form-item
  40. label="职务"
  41. prop="userInfo.uniLevel"
  42. borderBottom
  43. class="require"
  44. >
  45. <u--input
  46. placeholder="输入职务"
  47. v-model="model1.userInfo.uniLevel"
  48. border="none"
  49. ></u--input>
  50. </u-form-item>
  51. <u-form-item
  52. label="联系电话"
  53. prop="userInfo.tel"
  54. borderBottom
  55. class="require"
  56. >
  57. <u--input
  58. placeholder="输入联系电话"
  59. border="none"
  60. type="number"
  61. maxlength="11"
  62. v-model="model1.userInfo.tel"
  63. ></u--input>
  64. </u-form-item>
  65. <u-form-item
  66. label="邮箱"
  67. prop="userInfo.email"
  68. borderBottom
  69. >
  70. <u--input
  71. placeholder="输入邮箱"
  72. border="none"
  73. v-model="model1.userInfo.email"
  74. ></u--input>
  75. </u-form-item>
  76. <u-form-item
  77. label="人员类型"
  78. prop="userInfo.usrType"
  79. borderBottom
  80. >
  81. <u-radio-group
  82. v-model="model1.userInfo.usrType"
  83. placement="row"
  84. >
  85. <u-radio
  86. :style="{
  87. marginRight: '20rpx'
  88. }"
  89. v-for="(item, index) in USR_TYPE_LIST"
  90. :key="index"
  91. :label="item.name"
  92. :name="item.value"
  93. >
  94. </u-radio>
  95. </u-radio-group>
  96. </u-form-item>
  97. <u-form-item
  98. label="是否参加现场调研"
  99. prop="userInfo.conferenceFlag"
  100. borderBottom
  101. >
  102. <u-radio-group
  103. v-model="model1.userInfo.conferenceFlag"
  104. placement="row"
  105. >
  106. <u-radio
  107. :style="{
  108. marginRight: '20rpx'
  109. }"
  110. label="是"
  111. name="0"
  112. >
  113. </u-radio>
  114. <u-radio
  115. :style="{
  116. marginRight: '20rpx'
  117. }"
  118. label="否"
  119. name="1"
  120. >
  121. </u-radio>
  122. </u-radio-group>
  123. </u-form-item>
  124. <u-form-item
  125. label="调研会场"
  126. prop="userInfo.contentId"
  127. borderBottom
  128. v-if="model1.userInfo.conferenceFlag === '0'"
  129. >
  130. <SingleDropList
  131. :style="{
  132. marginLeft: '20rpx'
  133. }"
  134. :defaultValue="model1.userInfo.contentId"
  135. :src="conferenceHall"
  136. placeholder="请选择会场"
  137. @onChange="conferenceSelect"
  138. >
  139. </SingleDropList>
  140. </u-form-item>
  141. </u--form>
  142. <u-button
  143. :style="{
  144. marginTop: '120rpx'
  145. }"
  146. type="primary"
  147. text="提交"
  148. :disabled="loading"
  149. :loading="loading"
  150. loadingText="正在提交..."
  151. @click="onSubmit"
  152. >
  153. </u-button>
  154. </view>
  155. </auth-wrap>
  156. </view>
  157. </template>
  158. <script>
  159. import { fetchContentInfo, fetchUsrInfo, formCfg, putUsrRegist } from '@/common/api';
  160. import { CONTENT_TYPE, ICON_CFG, MEETING_TYPE, USR_TYPE_LIST } from '@/common/EnumConst';
  161. import AuthWrap from '@/components/AuthComp/index.vue';
  162. import SingleDropList from '@/components/SingleDropList/index.vue';
  163. import { getImageUrl, getUserInfo, setUserInfo } from '@/util';
  164. const staticRules = {
  165. 'userInfo.email': {
  166. pattern: /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/,
  167. },
  168. };
  169. export default {
  170. name: 'login',
  171. components: {
  172. AuthWrap,
  173. SingleDropList,
  174. },
  175. props: {},
  176. data() {
  177. return {
  178. ICON_CFG,
  179. USR_TYPE_LIST,
  180. showEnterprise: false,
  181. loading: false,
  182. model1: {
  183. userInfo: {
  184. usrName: '',
  185. conferenceFlag: '1',
  186. },
  187. },
  188. conferenceHall: [],
  189. tripList: [],
  190. rules: {},
  191. };
  192. },
  193. created() {
  194. },
  195. onLoad() {
  196. formCfg('meet_form_cfg').then(res => {
  197. if (res.data.cfgJson) {
  198. const cfgJson = JSON.parse(res.data.cfgJson);
  199. Object.keys(staticRules).forEach(item => {
  200. Object.assign(cfgJson[item], staticRules[item]);
  201. });
  202. this.rules = cfgJson;
  203. this.$refs.uForm.setRules(this.rules);
  204. }
  205. });
  206. //如果需要兼容微信小程序,并且校验规则中含有方法等,只能通过setRules方法设置规则。
  207. this.$refs.authWrap.reloadPage();
  208. const user = getUserInfo();
  209. if (user) {
  210. this.model1.userInfo.usrName = user.usrName;
  211. this.model1.userInfo.tel = user.tel;
  212. }
  213. this.init();
  214. },
  215. onReady() {
  216. //如果需要兼容微信小程序,并且校验规则中含有方法等,只能通过setRules方法设置规则。
  217. this.$refs.uForm.setRules(this.rules);
  218. },
  219. methods: {
  220. getImageUrl,
  221. conferenceSelect(item) {
  222. this.model1.userInfo.contentId = item.value;
  223. this.$refs.uForm.clearValidate('userInfo.contentId');
  224. },
  225. async init() {
  226. const {
  227. code: conferenceCode,
  228. rows: conferenceData,
  229. } = await fetchContentInfo({
  230. pageNum: 1,
  231. pageSize: 99,
  232. contentType: CONTENT_TYPE.conference,
  233. title: this.keyword,
  234. });
  235. this.conferenceHall = conferenceData.map(item => {
  236. return {
  237. name: item.title,
  238. value: item.id,
  239. };
  240. });
  241. },
  242. onSubmit() {
  243. this.loading = true;
  244. this.$refs.uForm.validate().then(async (res) => {
  245. const { code } = await putUsrRegist(this.model1.userInfo, MEETING_TYPE.meeting.value);
  246. this.loading = false;
  247. if (code !== 200) {
  248. return;
  249. }
  250. uni.showToast({
  251. mask: true,
  252. title: '报名完成',
  253. icon: 'success',
  254. success: async () => {
  255. const user = getUserInfo();
  256. const newUsr = await fetchUsrInfo(user.id);
  257. if (newUsr.code === 200) {
  258. setUserInfo(newUsr.data);
  259. }
  260. uni.navigateBack({
  261. delta: 1,
  262. });
  263. },
  264. });
  265. }).catch(errors => {
  266. this.loading = false;
  267. });
  268. },
  269. hideKeyboard() {
  270. uni.hideKeyboard();
  271. },
  272. },
  273. };
  274. </script>
  275. <style lang="scss" src="./index.scss" />;