index.vue 11 KB

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