index.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  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']&& model1.userInfo.usrType === USR_TYPE['1'].value"
  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'] && false"
  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.themeFlag"
  166. borderBottom
  167. v-if="rules['userInfo.themeFlag']"
  168. :class="{
  169. 'require': rules['userInfo.themeFlag'].required
  170. }"
  171. >
  172. <u-radio-group
  173. v-model="model1.userInfo.themeFlag"
  174. placement="row"
  175. >
  176. <u-radio
  177. :style="{
  178. marginRight: '20rpx'
  179. }"
  180. label="是"
  181. name="0"
  182. >
  183. </u-radio>
  184. <u-radio
  185. :style="{
  186. marginRight: '20rpx'
  187. }"
  188. label="否"
  189. name="1"
  190. >
  191. </u-radio>
  192. </u-radio-group>
  193. </u-form-item>
  194. <u-form-item
  195. label="研讨主题"
  196. prop="userInfo.themeId"
  197. borderBottom
  198. :class="{
  199. 'require': rules['userInfo.themeId'].required
  200. }"
  201. v-if="rules['userInfo.themeId'] && model1.userInfo.themeFlag === '0' && model1.userInfo.usrType === USR_TYPE['2'].value"
  202. >
  203. <SingleDropList
  204. :style="{
  205. marginLeft: '20rpx'
  206. }"
  207. :defaultValue="model1.userInfo.themeId"
  208. :src="themes"
  209. placeholder="请选择主题"
  210. @onChange="themesSelect"
  211. >
  212. </SingleDropList>
  213. </u-form-item>
  214. <u-form-item
  215. label="来程交通方式"
  216. prop="userInfo.wayComing"
  217. borderBottom
  218. v-if="rules['userInfo.wayComing']"
  219. :class="{
  220. 'require': rules['userInfo.wayComing'].required
  221. }"
  222. >
  223. <u-radio-group
  224. v-model="model1.userInfo.wayComing"
  225. placement="row"
  226. @change="waycomChange"
  227. >
  228. <u-radio
  229. v-for="way in tfcDic"
  230. :key="way.value"
  231. :style="{
  232. marginRight: '20rpx'
  233. }"
  234. :label="way.name"
  235. :name="way.value"
  236. >
  237. </u-radio>
  238. </u-radio-group>
  239. </u-form-item>
  240. <u-form-item
  241. :label="comLabel"
  242. prop="userInfo.comInfo"
  243. borderBottom
  244. v-if="rules['userInfo.comInfo']&& model1.userInfo.wayComing!=TFC_TYPE['3'].value"
  245. :class="{
  246. 'require': rules['userInfo.comInfo'].required
  247. }"
  248. >
  249. <u--input
  250. :placeholder="`输入${comLabel}`"
  251. border="none"
  252. v-model="model1.userInfo.comInfo"
  253. ></u--input>
  254. </u-form-item>
  255. <u-form-item
  256. label="去程交通方式"
  257. prop="userInfo.wayBack"
  258. borderBottom
  259. v-if="rules['userInfo.wayBack']"
  260. :class="{
  261. 'require': rules['userInfo.wayBack'].required
  262. }"
  263. >
  264. <u-radio-group
  265. v-model="model1.userInfo.wayBack"
  266. placement="row"
  267. @change="wayBackChange"
  268. >
  269. <u-radio
  270. v-for="way in tfcDic"
  271. :key="way.value"
  272. :style="{
  273. marginRight: '20rpx'
  274. }"
  275. :label="way.name"
  276. :name="way.value"
  277. >
  278. </u-radio>
  279. </u-radio-group>
  280. </u-form-item>
  281. <u-form-item
  282. :label="backLabel"
  283. prop="userInfo.backInfo"
  284. borderBottom
  285. v-if="rules['userInfo.backInfo'] && model1.userInfo.wayBack!=TFC_TYPE['3'].value"
  286. :class="{
  287. 'require': rules['userInfo.backInfo'].required
  288. }"
  289. >
  290. <u--input
  291. :placeholder="`输入${backLabel}`"
  292. border="none"
  293. v-model="model1.userInfo.backInfo"
  294. ></u--input>
  295. </u-form-item>
  296. <u-form-item
  297. label="备注"
  298. prop="userInfo.remark"
  299. borderBottom
  300. ref="item3"
  301. >
  302. <u--textarea
  303. placeholder="请输入备注"
  304. v-model="model1.userInfo.remark"
  305. ></u--textarea>
  306. </u-form-item>
  307. <u-form-item
  308. label="随行人员名单"
  309. >
  310. <u-icon name="plus-circle-fill" color="#2979ff" size="28" @click="addFollower" style="margin-left: auto">新增
  311. </u-icon>
  312. </u-form-item>
  313. <view
  314. v-for="(item, index) in model1.userInfo.follows"
  315. :key="index"
  316. class="follower-item"
  317. >
  318. <view style="display: flex;align-items: center;justify-content: flex-start;">
  319. {{ `随行人员${index + 1}` }}
  320. <u-icon name="minus-circle-fill" color="red" size="28" @click="()=>minusFollower(index)"
  321. style="margin-left: auto">
  322. </u-icon>
  323. </view>
  324. <u-form-item
  325. label="姓名"
  326. prop="item.usrName"
  327. >
  328. <u--input
  329. placeholder="输入姓名"
  330. v-model="item.usrName"
  331. border="none"
  332. ></u--input>
  333. </u-form-item>
  334. <u-form-item
  335. label="联系电话"
  336. prop="item.tel"
  337. borderBottom
  338. >
  339. <u--input
  340. placeholder="输入联系电话"
  341. border="none"
  342. type="number"
  343. maxlength="11"
  344. v-model="item.tel"
  345. ></u--input>
  346. </u-form-item>
  347. </view>
  348. </u--form>
  349. <slot name="footer"></slot>
  350. <u-button
  351. type="primary"
  352. text="提交"
  353. style="margin-top: 20px;"
  354. :disabled="loading"
  355. :loading="loading"
  356. loadingText="正在提交..."
  357. @click="onSubmit"
  358. >
  359. </u-button>
  360. </view>
  361. </template>
  362. <script>
  363. import { fetchContentInfo, getDicts } from '@/common/api';
  364. import { CONTENT_TYPE, TFC_INFO, TFC_TYPE, USR_TYPE, USR_TYPE_LIST } from '@/common/EnumConst';
  365. import SingleDropList from '@/components/SingleDropList/index.vue';
  366. import { getImageUrl, getUserInfo } from '@/util';
  367. export default {
  368. computed: {
  369. USR_TYPE() {
  370. return USR_TYPE;
  371. },
  372. TFC_TYPE() {
  373. return TFC_TYPE;
  374. },
  375. },
  376. components: {
  377. SingleDropList,
  378. },
  379. props: {
  380. rules: {},
  381. onSubmitHandle: {
  382. type: Function,
  383. default: function () {},
  384. },
  385. registInfo: {
  386. type: Object,
  387. default: function () {
  388. return {};
  389. },
  390. },
  391. },
  392. watch: {
  393. registInfo: {
  394. handler(newVal) {
  395. if (newVal) {
  396. this.model1.userInfo = newVal;
  397. }
  398. },
  399. immediate: true,
  400. },
  401. },
  402. data() {
  403. return {
  404. USR_TYPE_LIST,
  405. loading: false,
  406. comLabel: '',
  407. tfcDic: [],
  408. backLabel: '',
  409. model1: {
  410. userInfo: {
  411. usrName: '',
  412. conferenceFlag: '0',
  413. usrType: '1',
  414. follows: [],
  415. },
  416. },
  417. conferenceHall: [],
  418. themes: [],
  419. };
  420. },
  421. created() {
  422. this.initUser();
  423. },
  424. onLoad() {
  425. },
  426. onReady() {
  427. this.setFormRules();
  428. },
  429. methods: {
  430. initUser() {
  431. const user = getUserInfo();
  432. if (user) {
  433. this.model1.userInfo.usrName = user.usrName;
  434. this.model1.userInfo.tel = user.tel;
  435. }
  436. this.init();
  437. },
  438. setFormRules() {
  439. //如果需要兼容微信小程序,并且校验规则中含有方法等,只能通过setRules方法设置规则。
  440. this.$refs.uForm.setRules(this.rules);
  441. },
  442. getImageUrl,
  443. addFollower() {
  444. this.model1.userInfo.follows.push({
  445. usrName: '',
  446. tel: '',
  447. });
  448. },
  449. minusFollower(index) {
  450. this.removeItemAtIndex(this.model1.userInfo.follows, index);
  451. },
  452. removeItemAtIndex(array, index) {
  453. array.splice(index, 1);
  454. },
  455. conferenceSelect(item) {
  456. this.model1.userInfo.contentId = item.value;
  457. this.$refs.uForm.clearValidate('userInfo.contentId');
  458. },
  459. themesSelect(item) {
  460. this.model1.userInfo.themeId = item.value;
  461. this.$refs.uForm.clearValidate('userInfo.themeId');
  462. },
  463. async init() {
  464. const {
  465. code: conferenceCode,
  466. rows: conferenceData,
  467. } = await fetchContentInfo({
  468. pageNum: 1,
  469. pageSize: 99,
  470. contentType: CONTENT_TYPE.conference,
  471. title: this.keyword,
  472. });
  473. this.conferenceHall = conferenceData.map(item => {
  474. return {
  475. name: item.title,
  476. value: item.id,
  477. };
  478. });
  479. const {
  480. code: themedCode,
  481. rows: themeData,
  482. } = await fetchContentInfo({
  483. pageNum: 1,
  484. pageSize: 99,
  485. contentType: CONTENT_TYPE.theme,
  486. });
  487. this.themes = themeData.map(item => {
  488. return {
  489. name: item.title,
  490. value: item.id,
  491. };
  492. });
  493. const {
  494. code,
  495. data,
  496. } = await getDicts('tfc_type');
  497. if (data) {
  498. this.tfcDic = data.map(item => {
  499. return {
  500. name: item.dictLabel,
  501. value: item.dictValue,
  502. };
  503. });
  504. this.model1.userInfo.wayComing = data[0].dictValue;
  505. this.model1.userInfo.wayBack = data[0].dictValue;
  506. this.waycomChange(data[0].dictValue);
  507. this.wayBackChange(data[0].dictValue);
  508. }
  509. },
  510. onSubmit() {
  511. this.loading = true;
  512. this.$refs.uForm.validate().then((res) => {
  513. this.$emit('onSubmitHandle', this.model1.userInfo);
  514. this.loading = false;
  515. }).catch(errors => {
  516. console.error(errors)
  517. this.loading = false;
  518. });
  519. },
  520. hideKeyboard() {
  521. uni.hideKeyboard();
  522. },
  523. waycomChange(e) {
  524. this.comLabel = TFC_INFO[e].name;
  525. },
  526. wayBackChange(e) {
  527. this.backLabel = TFC_INFO[e].name;
  528. },
  529. restForm() {
  530. this.model1 = {
  531. userInfo: {
  532. usrName: '',
  533. conferenceFlag: '0',
  534. usrType: "1",
  535. follows: [],
  536. },
  537. };
  538. const user = getUserInfo();
  539. if (user) {
  540. this.model1.userInfo.usrName = user.usrName;
  541. this.model1.userInfo.tel = user.tel;
  542. }
  543. },
  544. clearValidate() {
  545. this.$refs.uForm.clearValidate();
  546. },
  547. },
  548. };
  549. </script>