releaseInfo.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674
  1. <!-- 商家-发布/编辑招聘信息-完工即结 -->
  2. <template>
  3. <!-- sub_data.settle_catalog==1为发布单次招聘,默认只有发布单次招聘 -->
  4. <view>
  5. <view class="contain">
  6. <!-- 招聘模式选择 -->
  7. <view v-if="trader_level=='1'" style="margin-top: 15upx;float: right;font-weight: bold;color: #01bcc3;"
  8. @click="chenge_settle_catalog(sub_data.settle_catalog==0?1:0)">
  9. {{sub_data.settle_catalog==1?'当前批量招聘 切换单次招聘':'当前单次招聘 切换批量招聘'}}
  10. </view>
  11. <view style="clear: both;"></view>
  12. <!-- 标题等基本信息录入 -->
  13. <view :key="index"
  14. v-for="(item,index) in (sub_data.settle_catalog==1?releaseInfo.sub_arr0.concat(...releaseInfo.sub_arr1_s): releaseInfo.sub_arr0.concat(...releaseInfo.sub_arr1))">
  15. <view class="item">
  16. <view class="item_left">{{item.name}}</view>
  17. <input :type="item.type" @input="ipt" :data-key="item.key" :value="sub_data[item.key]"
  18. :placeholder="'请输入'+item.name" class="item_right" />
  19. </view>
  20. <view class="instr" v-if="item.mention">
  21. <view>{{item.mention}}</view>
  22. </view>
  23. </view>
  24. <!-- 总金额/人 -->
  25. <view v-if="sub_data.settle_catalog==1">
  26. <view class="item">
  27. <view class="item_left">总金额/人</view>
  28. <input type="number" @input="ipt" :data-key="'feetotal'" :value="sub_data['feetotal']"
  29. :placeholder="'请输入总金额/人'" class="item_right" />
  30. </view>
  31. </view>
  32. <view v-else>
  33. <view class="item">
  34. <view class="item_left">日金额/人</view>
  35. <input type="number" @input="ipt" :data-key="'eve_feetotal'" :value="sub_data['eve_feetotal']"
  36. :placeholder="'请输入单日金额'" class="item_right" />
  37. </view>
  38. </view>
  39. <!-- 开始和截至日期 -->
  40. <view style="justify-content: space-between;" class="item">
  41. <view class="item_date_picker">
  42. <uni-datetime-picker placeholder="起始日期" clear-icon=false type='date'
  43. :value="sub_data.begin_datetime" :start="begin_start" end="2050-12-31" @change="date_change1" />
  44. </view>
  45. <view v-if="sub_data.settle_catalog==0" class="item_date_picker">
  46. <uni-datetime-picker placeholder="结束日期" clear-icon=false type='date'
  47. :value="sub_data.finish_datetime" :start="end_start" end="2050-12-31" @change="date_change2" />
  48. </view>
  49. <view v-if="sub_data.settle_catalog==0" class="bold_tit">
  50. 共{{calc_date(sub_data.begin_datetime,sub_data.finish_datetime)}}天</view>
  51. </view>
  52. <!-- 开始和结束时间 -->
  53. <view class="item">
  54. <view class="item_left">工作时间</view>
  55. <picker mode="time" :value="sub_data.begin_hour" start="00:00" end="23:59" data-key="begin_hour"
  56. @change="bindTimeChange">
  57. <view style="margin-right: 10upx;" class="uni-input choose_add choose_add4">{{sub_data.begin_hour}}
  58. </view>
  59. </picker>
  60. ~
  61. <picker mode="time" :value="sub_data.finish_hour" start="00:00" end="23:59" data-key="finish_hour"
  62. @change="bindTimeChange">
  63. <view style="margin-left: 10upx;" class="uni-input choose_add choose_add4">{{sub_data.finish_hour}}
  64. </view>
  65. </picker>
  66. <view style="margin-left: 15upx;">共{{calc_hours(sub_data.begin_hour, sub_data.finish_hour)}}小时</view>
  67. </view>
  68. <view style="clear: both;height: 10upx;"></view>
  69. <!-- 单次招聘显示每天费用 -->
  70. <view v-if="sub_data.settle_catalog==0">
  71. <view class="item">
  72. <view class="item_left">总金额/人</view>
  73. <view class="item_right">{{total_sal}}元</view>
  74. </view>
  75. <view class="instr">
  76. <view style="text-indent: 20upx;">平台会因供需情况收取相应的服务费再支付给应聘者</view>
  77. </view>
  78. </view>
  79. <view style="margin-top: 30upx;" class="bold_tit">要求</view>
  80. <!-- 性别&年龄&管饭 -->
  81. <view class="item">
  82. <view class="item_left">性别</view>
  83. <view class="item_right">
  84. <radio-group @change="radio_change" data-key="gender_mode">
  85. <label>
  86. <radio color="#2bcfb4" value="0" :checked="sub_data.gender_mode==0" />
  87. <text>不限</text>
  88. </label>
  89. <label style="margin-left: 30upx;">
  90. <radio color="#2bcfb4" value="1" :checked="sub_data.gender_mode==1" />
  91. <text>仅男</text>
  92. </label>
  93. <label style="margin-left: 30upx;">
  94. <radio color="#2bcfb4" value="2" :checked="sub_data.gender_mode==2" />
  95. <text>仅女</text>
  96. </label>
  97. </radio-group>
  98. </view>
  99. </view>
  100. <view class="item">
  101. <view class="item_left">年龄</view>
  102. <view class="item_right">
  103. <radio-group @change="radio_change" data-key="age_mode">
  104. <label>
  105. <radio color="#2bcfb4" value="0" :checked="sub_data.age_mode==0" />
  106. <text>不限</text>
  107. </label>
  108. <label style="margin-left: 30upx;">
  109. <radio color="#2bcfb4" value="1" :checked="sub_data.age_mode==1" />
  110. <text>选择年龄</text>
  111. </label>
  112. </radio-group>
  113. </view>
  114. </view>
  115. <view v-if="sub_data.age_mode==1" class="item">
  116. <view class="item_left">年龄范围</view>
  117. <view class="item_right age_range">
  118. <input style="text-align: center;" type="number" @input="ipt" data-key="age_min"
  119. :value="sub_data.age_min" placeholder="最小年龄(>16)" />
  120. <view>—</view>
  121. <input style="text-align: center;" type="number" @input="ipt" data-key="age_max"
  122. :value="sub_data.age_max" placeholder="最大年龄(<65)" />
  123. </view>
  124. </view>
  125. <view class="item">
  126. <view class="item_left">管饭</view>
  127. <view class="item_right">
  128. <radio-group @change="radio_change" data-key="meals_providing">
  129. <label>
  130. <radio color="#2bcfb4" value="0" :checked="sub_data.meals_providing==0" />
  131. <text>不管饭</text>
  132. </label>
  133. <label style="margin-left: 30upx;">
  134. <radio color="#2bcfb4" value="1" :checked="sub_data.meals_providing==1" />
  135. <text>管饭</text>
  136. </label>
  137. </radio-group>
  138. </view>
  139. </view>
  140. <!-- 选择工作地点 -->
  141. <view class="item">
  142. <view class="item_left">工作地点</view>
  143. <view @click="openAddress" style="display: flex;align-items: center;justify-content: flex-end;"
  144. class="item_right">
  145. <view style="max-width: 450upx;" class="nowrap">
  146. {{sub_data.work_addr?sub_data.work_addr :'选择工作地点'}}
  147. </view>
  148. <image style="width: 16upx;height: 32upx;margin-left: 12upx;margin-right: 20upx;"
  149. src="../../static/arrow_grey2.png">
  150. </image>
  151. </view>
  152. </view>
  153. <!-- 岗位详情&工作要求 -->
  154. <view class="item">
  155. <view style="width: 100%;">
  156. <view
  157. style="padding-bottom: 15upx;display: flex;align-items: center;justify-content: space-between;">
  158. <view class="item_left bold_tit">岗位详情</view>
  159. <image @click="upload_img" style="width: 40upx;height: 40upx;margin-right: 15upx;"
  160. src="../../static/add_img.png">
  161. </image>
  162. </view>
  163. <textarea style="width: 100%;margin-top: 15upx;" @input="ipt" :data-key="'work_desc'"
  164. :value="sub_data['work_desc']" placeholder='请输入岗位详情' class="item_right" />
  165. <image @click="delete_img" v-if="sub_data.profile_photo" style="width: 100%;margin-top: 15upx;"
  166. mode="widthFix" :src="sub_data.profile_photo"></image>
  167. </view>
  168. </view>
  169. <view class="item">
  170. <view style="width: 100%;">
  171. <view class="item_left bold_tit">工作要求</view>
  172. <textarea style="width: 100%;margin-top: 15upx;" @input="ipt" :data-key="'requirements'"
  173. :value="sub_data['requirements']" placeholder='请输入工作要求' class="item_right" />
  174. </view>
  175. </view>
  176. </view>
  177. <view @click="sub()" style="margin-top: 60upx;" class="main_btn_m main_width">提交</view>
  178. <view style="height: 60upx;"></view>
  179. <uni-popup ref="popup" :mask-click="false">
  180. <view class="modal_box">
  181. <view style="color: #313131;text-align: center;font-size: 38upx;line-height: 90upx;">注意事项</view>
  182. <view class="mention">
  183. <view>1、商家在平台对应聘者的报名需及时处理,长时间不处理会被其他商家录用。</view>
  184. <view>2、免费发布招聘,录取应聘者需将工资垫付在平台,完工后请及时在平台内确认。</view>
  185. <view>3、每个报名者已把报名押金预付到平台,未到协定岗位者报名押金将全部补偿给商家。</view>
  186. <view>4、录取应聘者后因自身原因违约,取消工作,则扣除相应工资补偿给应聘者。</view>
  187. </view>
  188. <view class="modal_btn">
  189. <view @click="close_modal()" class="modal_btn_cancel">取消</view>
  190. <view @click="sub_data_req()" class="modal_btn_confirm">发布</view>
  191. </view>
  192. </view>
  193. </uni-popup>
  194. </view>
  195. </template>
  196. <script>
  197. import commonData from '../../commonData.js'
  198. import commonFun from '../../commonFun.js'
  199. export default {
  200. data() {
  201. return {
  202. id: null,
  203. url: '&WsAjaxBiz=Trader&WsAjaxAction=entityDataHandle',
  204. releaseInfo: commonData.releaseInfo,
  205. calc_hours: commonFun.calc_hours,
  206. calc_date: commonFun.calc_date,
  207. sub_data: { //提交的数据
  208. settle_catalog: 0, //是否批量招聘
  209. age_mode: 0, //年龄, 0-不限;1-限制
  210. gender_mode: 0, //性别, 0-不限;1-限男;2-限女;
  211. meals_providing: 0, //是否管饭 0-不管;1-管饭;
  212. enroll_audit: 1, //是否需要审核
  213. settle_mode: 0, //核销模式
  214. begin_hour: '08:00',
  215. finish_hour: '17:00',
  216. work_addr1: '',
  217. work_addr: '', //工作地点
  218. work_addr_lng: '', //经度117.333
  219. work_addr_lat: '', //纬度39.33
  220. linker_name: '联系人',
  221. },
  222. begin_start: '', //开始日期的可选开始日期
  223. end_start: '', //截止日期的可选开始日期
  224. total_sal: '', //计算页面总金额
  225. trader_level: 0, //是否vip
  226. }
  227. },
  228. onLoad(e) {
  229. this.begin_start = commonFun.formatDate2(new Date())
  230. this.end_start = commonFun.formatDate2(new Date())
  231. this.trader_level = e.trader_level || 0 //是否vip
  232. // e.id = 399
  233. if (e.id) {
  234. this.get_data(e.id)
  235. } else {
  236. let sub_data = {
  237. ...this.sub_data,
  238. }
  239. this.sub_data = sub_data
  240. let DRAFT = uni.getStorageSync('DRAFT0')
  241. if (DRAFT && DRAFT.title) {
  242. uni.showModal({
  243. title: '是否使用草稿内容?',
  244. content: '草稿标题:' + DRAFT.title,
  245. success: (res) => {
  246. if (res.confirm) {
  247. DRAFT.id = ''
  248. this.sub_data = {
  249. ...DRAFT,
  250. }
  251. setTimeout(() => {
  252. this.cal_every_salary()
  253. }, 1000)
  254. } else {
  255. // 不使用草稿,则清空草稿
  256. uni.setStorageSync('DRAFT0', '')
  257. }
  258. }
  259. })
  260. }
  261. }
  262. },
  263. methods: {
  264. // 获取数据
  265. get_data(bizId) {
  266. commonFun.requestUrl(this.url, {
  267. bizCatalog: 'RecruitEntity',
  268. handleMode: 'fetch',
  269. bizId
  270. }, res => {
  271. if (res.status) {
  272. let sub_data = res.data.Result
  273. if (sub_data.settle_catalog == 0) {
  274. sub_data.eve_feetotal = sub_data.feetotal
  275. }
  276. this.sub_data = sub_data
  277. setTimeout(() => {
  278. this.cal_every_salary()
  279. }, 1500)
  280. console.log('编辑页面获取发布详情')
  281. console.log(this.sub_data)
  282. }
  283. })
  284. },
  285. // 提交数据
  286. sub_data_req() {
  287. this.close_modal()
  288. uni.showLoading({
  289. title: '加载中...',
  290. mask: true
  291. })
  292. let sub_data = this.sub_data
  293. if (sub_data.settle_catalog == 0) {
  294. sub_data.feetotal = this.total_sal
  295. }
  296. sub_data.id = ''
  297. sub_data.urgent_level = 0
  298. let params = {
  299. bizCatalog: 'RecruitEntity',
  300. handleMode: 'upsertLaunchAudit',
  301. bizData: sub_data
  302. }
  303. console.log('发布请求数据')
  304. console.log(params.bizData)
  305. // return
  306. commonFun.requestUrl(this.url, params, res => {
  307. console.log('发布返回数据')
  308. console.log(res)
  309. uni.hideLoading()
  310. if (res.status) {
  311. uni.showModal({
  312. content: '发布成功',
  313. showCancel: false,
  314. success: () => {
  315. uni.navigateBack({
  316. delta: 1
  317. });
  318. }
  319. })
  320. } else {
  321. if (res.data && res.data.ErrCode && res.data.ErrCode == 'NoEnoughCount') {
  322. uni.showModal({
  323. title: '剩余发布人数不足',
  324. content: '发布扣除' + this.sub_data.need_total + '人,当前剩余' + (res.data
  325. .ErrMsg.useFreeCount + res.data.ErrMsg
  326. .balance) + '人',
  327. confirmText: '去充值',
  328. success: (res2) => {
  329. if (res2.confirm) {
  330. uni.navigateTo({
  331. url: '/pages/personal/wallet?dvalue=' + res.data
  332. .ErrMsg.dvalue
  333. })
  334. }
  335. }
  336. })
  337. }
  338. }
  339. })
  340. },
  341. // 点击提交数据
  342. sub() {
  343. let sub_data = {
  344. ...this.sub_data,
  345. }
  346. console.log(this.sub_data)
  347. // 检测输入是否为空
  348. let form_collect = sub_data.settle_catalog == 1 ? commonData.releaseInfo.sub_arr0
  349. .concat(...
  350. commonData
  351. .releaseInfo.sub_arr1_s) :
  352. commonData.releaseInfo.sub_arr0.concat(...commonData.releaseInfo.sub_arr1)
  353. for (let i in form_collect) {
  354. let item = form_collect[i]
  355. if (!sub_data[item['key']]) {
  356. uni.showModal({
  357. title: '输入错误',
  358. content: item['name'] + '不允许为空',
  359. showCancel: false,
  360. success: function(res) {}
  361. });
  362. return
  363. }
  364. }
  365. if (!sub_data.begin_datetime) {
  366. uni.showModal({
  367. content: '请选择起始日期',
  368. showCancel: false,
  369. });
  370. return
  371. }
  372. // 非批量招聘需要结束日期
  373. if (sub_data.settle_catalog != 1 && !sub_data.finish_datetime) {
  374. uni.showModal({
  375. content: '请选择截至日期',
  376. showCancel: false,
  377. });
  378. return
  379. }
  380. if (sub_data.begin_datetime == commonFun.formatDate2(new Date())) {
  381. uni.showModal({
  382. content: '当日工作请到【今日零工】发布',
  383. showCancel: false,
  384. });
  385. return
  386. }
  387. if (sub_data.settle_catalog != 1 && (sub_data.begin_datetime > sub_data.finish_datetime)) {
  388. uni.showModal({
  389. content: '起始日期不能大于截止日期',
  390. showCancel: false,
  391. });
  392. return
  393. }
  394. if (sub_data.work_addr == '') {
  395. uni.showModal({
  396. content: '请选择工作地点',
  397. showCancel: false,
  398. });
  399. return
  400. }
  401. if (!sub_data.work_desc) {
  402. uni.showModal({
  403. content: '岗位详情不允许为空',
  404. showCancel: false,
  405. });
  406. return
  407. }
  408. if (sub_data.age_mode == 1) {
  409. let age_min = Number(sub_data.age_min)
  410. let age_max = Number(sub_data.age_max)
  411. if (isNaN(age_min) || isNaN(age_max) || age_min < 1 || age_max < 1 || age_min >= age_max) {
  412. uni.showModal({
  413. content: '请输入正确的年龄范围!',
  414. showCancel: false,
  415. });
  416. return
  417. }
  418. }
  419. this.sub_data = sub_data
  420. this.open_modal()
  421. },
  422. // 计算每天工资
  423. cal_every_salary() {
  424. //起始/截至跨越天数
  425. let total_date = this.calc_date(this.sub_data.begin_datetime, this.sub_data.finish_datetime)
  426. let eve_feetotal = Number(this.sub_data.eve_feetotal)
  427. if (total_date != '--' && !isNaN(eve_feetotal)) {
  428. this.total_sal = (total_date * eve_feetotal).toFixed(2)
  429. } else {
  430. this.total_sal = ''
  431. }
  432. },
  433. // 选择单次/批量招聘按钮事件
  434. chenge_settle_catalog(settle_catalog) {
  435. let sub_data = {
  436. ...this.sub_data,
  437. }
  438. sub_data['settle_catalog'] = settle_catalog
  439. this.sub_data = sub_data
  440. uni.setStorageSync('DRAFT0', sub_data)
  441. },
  442. // 单选事件
  443. radio_change(e) {
  444. let key = e.currentTarget.dataset.key
  445. let sub_data = {
  446. ...this.sub_data,
  447. }
  448. sub_data[key] = e.target.value
  449. this.sub_data = sub_data
  450. uni.setStorageSync('DRAFT0', sub_data)
  451. },
  452. // 开始日期改变事件
  453. date_change1(e) {
  454. let sub_data = {
  455. ...this.sub_data
  456. }
  457. sub_data.begin_datetime = e
  458. this.sub_data = sub_data
  459. this.end_start = e
  460. uni.setStorageSync('DRAFT0', sub_data)
  461. this.cal_every_salary()
  462. },
  463. // 截至日期改变事件
  464. date_change2(e) {
  465. let sub_data = {
  466. ...this.sub_data
  467. }
  468. sub_data.finish_datetime = e
  469. this.sub_data = sub_data
  470. uni.setStorageSync('DRAFT0', sub_data)
  471. this.cal_every_salary()
  472. },
  473. // input和textarea的输入框输入事件
  474. ipt(e) {
  475. let key = e.currentTarget.dataset.key
  476. let sub_data = {
  477. ...this.sub_data
  478. }
  479. sub_data[key] = e.target.value
  480. this.sub_data = sub_data
  481. this.cal_every_salary()
  482. uni.setStorageSync('DRAFT0', sub_data)
  483. },
  484. // 删除招聘图片
  485. delete_img() {
  486. uni.showModal({
  487. content: '确认删除头图?',
  488. success: (res) => {
  489. if (res.confirm) {
  490. let sub_data = {
  491. ...this.sub_data
  492. }
  493. sub_data.profile_photo = ''
  494. this.sub_data = sub_data
  495. uni.setStorageSync('DRAFT0', sub_data)
  496. }
  497. }
  498. })
  499. },
  500. // 上传招聘图片
  501. upload_img(e) {
  502. commonFun.uploadFileApiOSS(res => {
  503. if (res.status) {
  504. let sub_data = {
  505. ...this.sub_data
  506. }
  507. sub_data.profile_photo = res.data
  508. this.sub_data = sub_data
  509. uni.setStorageSync('DRAFT0', sub_data)
  510. }
  511. })
  512. },
  513. // 时间选择
  514. bindTimeChange(e) {
  515. const key = e.currentTarget.dataset.key
  516. const value = e.target.value
  517. let sub_data = {
  518. ...this.sub_data
  519. }
  520. sub_data[key] = value
  521. this.sub_data = sub_data
  522. uni.setStorageSync('DRAFT0', sub_data)
  523. },
  524. // 打开窗口
  525. open_modal() {
  526. this.$refs.popup.open('top')
  527. },
  528. // 关闭窗口
  529. close_modal() {
  530. this.$refs.popup.close('top')
  531. },
  532. // 打开地图
  533. openAddress() {
  534. uni.chooseLocation({
  535. success: (res) => {
  536. let sub_data = {
  537. ...this.sub_data,
  538. }
  539. sub_data['work_addr1'] = res.name
  540. sub_data['work_addr'] = res.address
  541. sub_data['work_addr_lng'] = res.longitude
  542. sub_data['work_addr_lat'] = res.latitude
  543. this.sub_data = sub_data
  544. uni.setStorageSync('DRAFT0', sub_data)
  545. },
  546. fail: (res) => {
  547. if (res.errMsg.indexOf('cancel') == -1) {
  548. uni.showModal({
  549. title: '打开地图失败',
  550. content: JSON.stringify(res)
  551. })
  552. }
  553. }
  554. });
  555. },
  556. }
  557. }
  558. </script>
  559. <style>
  560. .bold_tit {
  561. font-size: 30upx;
  562. color: #666666;
  563. font-weight: bold;
  564. }
  565. .item_date_picker {
  566. width: 280upx;
  567. }
  568. .choose_add4 {
  569. background-color: #ffffff;
  570. color: #2bcfb4;
  571. border: 4upx solid #2bcfb4;
  572. }
  573. .choose_add3 {
  574. width: 180upx !important;
  575. }
  576. .choose_add2 {
  577. background-color: #22a58f;
  578. }
  579. .instr {
  580. background-color: #fffaf6;
  581. padding: 20upx 0;
  582. }
  583. .instr view {
  584. color: #FE7632;
  585. font-size: 26upx;
  586. }
  587. .age_range {
  588. display: flex;
  589. align-items: center;
  590. }
  591. .item {
  592. border-bottom: 2upx solid #ececec;
  593. display: flex;
  594. align-items: center;
  595. width: 100%;
  596. padding: 30upx 0;
  597. }
  598. .item input.item_right {
  599. height: 70upx;
  600. font-size: 30upx !important;
  601. color: #000000;
  602. }
  603. .item textarea {
  604. font-size: 30upx;
  605. /* text-indent: 20upx; */
  606. height: 240upx;
  607. background-color: #fafafa;
  608. color: #000000;
  609. }
  610. .item_right {
  611. width: 70%;
  612. font-size: 28upx;
  613. }
  614. .item_left {
  615. width: 30%;
  616. color: #585858;
  617. font-size: 28upx !important;
  618. white-space: nowrap;
  619. overflow: hidden;
  620. text-overflow: ellipsis;
  621. }
  622. .contain {
  623. background-color: #ffffff;
  624. width: 94%;
  625. padding: 0 3% 3%;
  626. border-radius: 15upx;
  627. }
  628. page {
  629. background-color: #f3f5f4;
  630. }
  631. </style>