RegistForm.vue 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. <template>
  2. <view>
  3. <u--form
  4. labelPosition="left"
  5. :model="model1"
  6. :rules="rules"
  7. ref="uForm"
  8. @submit="onSubmit"
  9. >
  10. <u-form-item
  11. label="姓名"
  12. prop="userInfo.usrName"
  13. borderBottom
  14. :class="{
  15. 'require': rules['userInfo.usrName'].required
  16. }"
  17. >
  18. <u--input
  19. placeholder="输入姓名"
  20. v-model="model1.userInfo.usrName"
  21. border="none"
  22. ></u--input>
  23. </u-form-item>
  24. <u-form-item
  25. label="单位名称"
  26. prop="userInfo.orgUnitName"
  27. borderBottom
  28. :class="{
  29. 'require': rules['userInfo.orgUnitName'].required
  30. }"
  31. >
  32. <u--input
  33. placeholder="输入单位名称"
  34. v-model="model1.userInfo.orgUnitName"
  35. border="none"
  36. ></u--input>
  37. </u-form-item>
  38. <u-form-item
  39. label="职务"
  40. prop="userInfo.uniLevel"
  41. borderBottom
  42. :class="{
  43. 'require': rules['userInfo.uniLevel'].required
  44. }"
  45. >
  46. <u--input
  47. placeholder="输入职务"
  48. v-model="model1.userInfo.uniLevel"
  49. border="none"
  50. ></u--input>
  51. </u-form-item>
  52. <u-form-item
  53. label="联系电话"
  54. prop="userInfo.tel"
  55. borderBottom
  56. :class="{
  57. 'require': rules['userInfo.tel'].required
  58. }"
  59. >
  60. <u--input
  61. placeholder="输入联系电话"
  62. border="none"
  63. type="number"
  64. maxlength="11"
  65. v-model="model1.userInfo.tel"
  66. ></u--input>
  67. </u-form-item>
  68. <u-form-item
  69. label="邮箱"
  70. prop="userInfo.email"
  71. borderBottom
  72. :class="{
  73. 'require': rules['userInfo.email'].required
  74. }"
  75. >
  76. <u--input
  77. placeholder="输入邮箱"
  78. border="none"
  79. v-model="model1.userInfo.email"
  80. ></u--input>
  81. </u-form-item>
  82. <u-form-item
  83. label="人员类型"
  84. prop="userInfo.usrType"
  85. borderBottom
  86. :class="{
  87. 'require': rules['userInfo.usrType'].required
  88. }"
  89. >
  90. <u-radio-group
  91. v-model="model1.userInfo.usrType"
  92. placement="row"
  93. >
  94. <u-radio
  95. :style="{
  96. marginRight: '20rpx'
  97. }"
  98. v-for="(item, index) in USR_TYPE_LIST"
  99. :key="index"
  100. :label="item.name"
  101. :name="item.value"
  102. >
  103. </u-radio>
  104. </u-radio-group>
  105. </u-form-item>
  106. <u-form-item
  107. label="是否参加现场调研"
  108. prop="userInfo.conferenceFlag"
  109. borderBottom
  110. :class="{
  111. 'require': rules['userInfo.conferenceFlag'].required
  112. }"
  113. >
  114. <u-radio-group
  115. v-model="model1.userInfo.conferenceFlag"
  116. placement="row"
  117. >
  118. <u-radio
  119. :style="{
  120. marginRight: '20rpx'
  121. }"
  122. label="是"
  123. name="0"
  124. >
  125. </u-radio>
  126. <u-radio
  127. :style="{
  128. marginRight: '20rpx'
  129. }"
  130. label="否"
  131. name="1"
  132. >
  133. </u-radio>
  134. </u-radio-group>
  135. </u-form-item>
  136. <u-form-item
  137. label="调研会场"
  138. prop="userInfo.contentId"
  139. borderBottom
  140. :class="{
  141. 'require': rules['userInfo.contentId'].required
  142. }"
  143. v-if="model1.userInfo.conferenceFlag === '0'"
  144. >
  145. <SingleDropList
  146. :style="{
  147. marginLeft: '20rpx'
  148. }"
  149. :defaultValue="model1.userInfo.contentId"
  150. :src="conferenceHall"
  151. placeholder="请选择会场"
  152. @onChange="conferenceSelect"
  153. >
  154. </SingleDropList>
  155. </u-form-item>
  156. <u-form-item
  157. label="来程交通方式"
  158. prop="userInfo.wayComing"
  159. borderBottom
  160. :class="{
  161. 'require': rules['userInfo.wayComing'].required
  162. }"
  163. >
  164. <u-radio-group
  165. v-model="model1.userInfo.wayComing"
  166. placement="row"
  167. @change="waycomChange"
  168. >
  169. <u-radio
  170. v-for="way in tfcDic"
  171. :style="{
  172. marginRight: '20rpx'
  173. }"
  174. :label="way.name"
  175. :name="way.value"
  176. >
  177. </u-radio>
  178. </u-radio-group>
  179. </u-form-item>
  180. <u-form-item
  181. :label="comLabel"
  182. prop="userInfo.comInfo"
  183. borderBottom
  184. :class="{
  185. 'require': rules['userInfo.comInfo'].required
  186. }"
  187. >
  188. <u--input
  189. :placeholder="`输入${comLabel}`"
  190. border="none"
  191. v-model="model1.userInfo.comInfo"
  192. ></u--input>
  193. </u-form-item>
  194. <u-form-item
  195. label="回程交通方式"
  196. prop="userInfo.wayBack"
  197. borderBottom
  198. :class="{
  199. 'require': rules['userInfo.wayBack'].required
  200. }"
  201. >
  202. <u-radio-group
  203. v-model="model1.userInfo.wayBack"
  204. placement="row"
  205. @change="wayBackChange"
  206. >
  207. <u-radio
  208. v-for="way in tfcDic"
  209. :style="{
  210. marginRight: '20rpx'
  211. }"
  212. :label="way.name"
  213. :name="way.value"
  214. >
  215. </u-radio>
  216. </u-radio-group>
  217. </u-form-item>
  218. <u-form-item
  219. :label="backLabel"
  220. prop="userInfo.backInfo"
  221. borderBottom
  222. :class="{
  223. 'require': rules['userInfo.backInfo'].required
  224. }"
  225. >
  226. <u--input
  227. :placeholder="`输入${backLabel}`"
  228. border="none"
  229. v-model="model1.userInfo.backInfo"
  230. ></u--input>
  231. </u-form-item>
  232. <u-form-item
  233. label="备注"
  234. prop="userInfo.remark"
  235. borderBottom
  236. ref="item3"
  237. >
  238. <u--textarea
  239. placeholder="不低于3个字"
  240. v-model="model1.userInfo.remark"
  241. ></u--textarea>
  242. </u-form-item>
  243. </u--form>
  244. <u-button
  245. type="primary"
  246. text="提交"
  247. :disabled="loading"
  248. :loading="loading"
  249. loadingText="正在提交..."
  250. @click="onSubmit"
  251. >
  252. </u-button>
  253. </view>
  254. </template>
  255. <script>
  256. import { fetchContentInfo, fetchUsrInfo, getDicts, putUsrRegist } from '@/common/api';
  257. import { CONTENT_TYPE, MEETING_TYPE, TFC_INFO, USR_TYPE_LIST } from '@/common/EnumConst';
  258. import SingleDropList from '@/components/SingleDropList/index.vue';
  259. import { getImageUrl, getUserInfo, setUserInfo } from '@/util';
  260. export default {
  261. components: {
  262. SingleDropList,
  263. },
  264. props: {
  265. rules: {},
  266. },
  267. data() {
  268. return {
  269. USR_TYPE_LIST,
  270. loading: false,
  271. comLabel: '',
  272. tfcDic: [],
  273. backLabel: '',
  274. model1: {
  275. userInfo: {
  276. usrName: '',
  277. conferenceFlag: '1',
  278. },
  279. },
  280. conferenceHall: [],
  281. };
  282. },
  283. created() {
  284. },
  285. onLoad() {
  286. },
  287. onReady() {
  288. this.setFormRules();
  289. },
  290. methods: {
  291. setFormRules() {
  292. const user = getUserInfo();
  293. if (user) {
  294. this.model1.userInfo.usrName = user.usrName;
  295. this.model1.userInfo.tel = user.tel;
  296. }
  297. this.init();
  298. //如果需要兼容微信小程序,并且校验规则中含有方法等,只能通过setRules方法设置规则。
  299. this.$refs.uForm.setRules(this.rules);
  300. },
  301. getImageUrl,
  302. conferenceSelect(item) {
  303. this.model1.userInfo.contentId = item.value;
  304. this.$refs.uForm.clearValidate('userInfo.contentId');
  305. },
  306. async init() {
  307. const {
  308. code: conferenceCode,
  309. rows: conferenceData,
  310. } = await fetchContentInfo({
  311. pageNum: 1,
  312. pageSize: 99,
  313. contentType: CONTENT_TYPE.conference,
  314. title: this.keyword,
  315. });
  316. this.conferenceHall = conferenceData.map(item => {
  317. return {
  318. name: item.title,
  319. value: item.id,
  320. };
  321. });
  322. const {
  323. code,
  324. data,
  325. } = await getDicts('tfc_type');
  326. if (data) {
  327. this.tfcDic = data.map(item => {
  328. return {
  329. name: item.dictLabel,
  330. value: item.dictValue,
  331. };
  332. });
  333. this.model1.userInfo.wayComing = data[0].dictValue;
  334. this.model1.userInfo.wayBack = data[0].dictValue;
  335. this.waycomChange(data[0].dictValue);
  336. this.wayBackChange(data[0].dictValue);
  337. }
  338. },
  339. onSubmit() {
  340. this.loading = true;
  341. this.$refs.uForm.validate().then(async (res) => {
  342. const { code } = await putUsrRegist(this.model1.userInfo, MEETING_TYPE.meeting.value);
  343. this.loading = false;
  344. if (code !== 200) {
  345. return;
  346. }
  347. uni.showToast({
  348. mask: true,
  349. title: '报名完成',
  350. icon: 'success',
  351. success: async () => {
  352. const user = getUserInfo();
  353. const newUsr = await fetchUsrInfo(user.id);
  354. if (newUsr.code === 200) {
  355. setUserInfo(newUsr.data);
  356. }
  357. uni.navigateBack({
  358. delta: 1,
  359. });
  360. },
  361. });
  362. }).catch(errors => {
  363. this.loading = false;
  364. });
  365. },
  366. hideKeyboard() {
  367. uni.hideKeyboard();
  368. },
  369. waycomChange(e) {
  370. this.comLabel = TFC_INFO[e].name;
  371. },
  372. wayBackChange(e) {
  373. this.backLabel = TFC_INFO[e].name;
  374. },
  375. },
  376. };
  377. </script>
  378. <style lang="scss" src="./index.scss" />;