金诚优选前端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

522 lines
14 KiB

  1. <template>
  2. <view>
  3. <lf-nav title="新增活动" :showIcon="true" bgColor="#f8f8f8"></lf-nav>
  4. <view class="content">
  5. <view class="list">
  6. <view class="title">标题</view>
  7. <input class="input" placeholder="请输入标题" v-model="title" />
  8. </view>
  9. <view class="list">
  10. <view class="title">副标题</view>
  11. <input class="input" placeholder="请输入副标题" v-model="subtitle" />
  12. </view>
  13. <view class="list">
  14. <view class="title">活动开始时间</view>
  15. <view class="select" @click="show_activity_startdate = true">
  16. <text>{{ activity_startdate || '请选择' }}</text>
  17. <text class="lf-iconfont icon-xiangxia"></text>
  18. </view>
  19. <u-picker v-model="show_activity_startdate"
  20. mode="time" :params="params" :default-time="activity_startdate"
  21. @confirm="selectDate($event, 'activity_startdate')">
  22. </u-picker>
  23. </view>
  24. <view class="list">
  25. <view class="title">活动结束时间</view>
  26. <view class="select" @click="show_activity_enddate = true">
  27. <text>{{ activity_enddate || '请选择' }}</text>
  28. <text class="lf-iconfont icon-xiangxia"></text>
  29. </view>
  30. <u-picker v-model="show_activity_enddate"
  31. mode="time" :params="params"
  32. @confirm="selectDate($event, 'activity_enddate')">
  33. </u-picker>
  34. </view>
  35. <view class="list">
  36. <view class="title">报名开始时间</view>
  37. <view class="select" @click="show_sign_start = true">
  38. <text>{{ sign_startdate || '请选择' }}</text>
  39. <text class="lf-iconfont icon-xiangxia"></text>
  40. </view>
  41. <u-picker v-model="show_sign_start"
  42. mode="time" :params="params"
  43. @confirm="selectDate($event, 'sign_startdate')">
  44. </u-picker>
  45. </view>
  46. <view class="list">
  47. <view class="title">报名结束时间</view>
  48. <view class="select" @click="show_sign_end = true">
  49. <text>{{ sign_enddate || '请选择' }}</text>
  50. <text class="lf-iconfont icon-xiangxia"></text>
  51. </view>
  52. <u-picker v-model="show_sign_end"
  53. mode="time" :params="params"
  54. @confirm="selectDate($event, 'sign_enddate')">
  55. </u-picker>
  56. </view>
  57. <view class="list">
  58. <view class="title">谁可参与</view>
  59. <view class="select" @click="show_levels = true">
  60. <text>{{ (levels_list[levels_index] && levels_list[levels_index].name) || '请选择' }}</text>
  61. <text class="lf-iconfont icon-xiangxia"></text>
  62. </view>
  63. <u-picker v-model="show_levels"
  64. mode="selector"
  65. :range="levels_list"
  66. range-key="name"
  67. @confirm="levelsConfirm">
  68. </u-picker>
  69. </view>
  70. <view class="list">
  71. <view class="title">活动内容</view>
  72. <input class="input" placeholder="请输入活动内容" v-model="activity_content" />
  73. </view>
  74. <view class="list">
  75. <view class="title">活动人数</view>
  76. <input class="input" placeholder="请输入活动人数" v-model="activity_num" />
  77. </view>
  78. <view class="list">
  79. <view class="title">活动规则</view>
  80. <textarea class="textarea" placeholder="请输入活动规则内容" v-model="activity_rule"></textarea>
  81. </view>
  82. <!-- 上传图片 -->
  83. <view class="list">
  84. <view class="title">活动图片</view>
  85. <view class="my-images">
  86. <view class="my-image-item" @click="uploadImage" v-if="image_list.length < image_count">
  87. <text class="lf-iconfont icon-jia my-image-item-after"></text>
  88. </view>
  89. <view class="my-image-item" v-for="(item, index) in image_list" :key="index" @click="lookImage(index)">
  90. <image :src="item" mode="widthFix"></image>
  91. <view class="remove-image" @click.stop="removeInage(index)">
  92. <text class="lf-iconfont icon-shanchu"></text>
  93. </view>
  94. </view>
  95. </view>
  96. </view>
  97. <button class="buttom" hover-class="lf-opacity" @click="submit" v-if="id == 0">立即新增</button>
  98. <view class="btn-box" v-else>
  99. <view class="btn2" hover-class="lf-opacity" @click="submit">保持修改</view>
  100. <view class="btn2"
  101. style="background-color: #bd1a1a;"
  102. hover-class="lf-opacity"
  103. @click="deleteActivity">删除活动
  104. </view>
  105. </view>
  106. </view>
  107. </view>
  108. </template>
  109. <script>
  110. import { config } from '@/common/js/utils.js';
  111. export default {
  112. data(){
  113. return {
  114. title: '', // 标题
  115. subtitle: '', // 副标题
  116. show_activity_startdate: false, // 活动开始时间
  117. show_activity_enddate: false, // 活动开始时间
  118. activity_startdate: '',
  119. activity_enddate: '',
  120. show_sign_start: false, // 报名时间
  121. show_sign_end: false, // 报名时间
  122. sign_startdate: '',
  123. sign_enddate: '',
  124. activity_content: '', // 活动内容
  125. activity_num: '', // 活动人数
  126. activity_rule: '', // 活动规则
  127. image_list: [], // 刚上传的图片临时路径
  128. image_count: 1, // 可上传多少张图
  129. uploadImg: [], // 已经上传给后端的图片路径
  130. params: {
  131. year: true,
  132. month: true,
  133. day: true,
  134. hour: true,
  135. minute: true,
  136. second: true
  137. },
  138. token: '',
  139. levels_list: [], // 会员等级列表
  140. show_levels: false, // 参与会员
  141. levels_index: null,
  142. id: 0, // 0表示创建活动,大于0 修改活动
  143. user_level: null
  144. }
  145. },
  146. onLoad(options){
  147. this.token = this.$cookieStorage.get('store_token');
  148. console.log("config", config);
  149. this.getActivityLevels();
  150. if(options.id){
  151. this.id = Number(options.id);
  152. this.getActivityDetail();
  153. }
  154. },
  155. methods: {
  156. // 获取活动详情
  157. getActivityDetail(){
  158. uni.showLoading({
  159. title: '正在获取信息'
  160. })
  161. this.$http.get({
  162. api: 'api/supplier/activity/detail',
  163. data: {
  164. id: this.id
  165. },
  166. header: {
  167. token: this.token
  168. }
  169. }).then(res => {
  170. if(res.data.code == 200){
  171. let data = res.data.data;
  172. this.title = data.name;
  173. this.subtitle = data.username;
  174. this.activity_startdate = data.time_start;
  175. this.activity_enddate = data.time_end;
  176. this.sign_startdate = data.apply_start;
  177. this.sign_enddate = data.apply_end;
  178. this.activity_content = data.content;
  179. this.activity_num = data.member_count;
  180. this.activity_rule = data.rule;
  181. this.image_list = [data.image];
  182. this.uploadImg = [data.image];
  183. if(data.user_level != 0){
  184. this.user_level = data.user_level;
  185. }
  186. }else{
  187. uni.showModal({
  188. title: '',
  189. content: '活动信息获取失败了,请离开此页面稍后再试!'
  190. })
  191. }
  192. uni.hideLoading();
  193. }).catch(err => uni.hideLoading())
  194. },
  195. // 删除活动
  196. deleteActivity(){
  197. uni.showModal({
  198. title: '温馨提示',
  199. content: '您确定删除该活动吗?',
  200. success: result => {
  201. if(result.confirm){
  202. this.$http.post({
  203. api: 'api/supplier/activity/destroy',
  204. data: {
  205. id: this.id
  206. },
  207. header: {
  208. token: this.token
  209. }
  210. }).then(res => {
  211. if(res.data.code == 200){
  212. this.$msg(res.data.data || '活动已删除').then(() => {
  213. this.$toBack();
  214. })
  215. }else{
  216. this.$msg(res.data.data || rea.data.message || '删除失败');
  217. }
  218. })
  219. }
  220. }
  221. })
  222. },
  223. // 获取会员等级列表
  224. getActivityLevels(){
  225. this.$http.get({
  226. api: 'api/supplier/activity/levels',
  227. header: {
  228. token: this.token
  229. }
  230. }).then(res => {
  231. let levels_list = res.data.data || [];
  232. levels_list.unshift({
  233. id: 0,
  234. name: '不限会员等级'
  235. });
  236. this.levels_list = levels_list;
  237. if(this.user_level != null){
  238. levels_list.map((item, index) => {
  239. if(item.id == this.user_level){
  240. this.levels_index = index;
  241. }
  242. })
  243. }
  244. })
  245. },
  246. // 选择会员等级
  247. levelsConfirm(event){
  248. this.levels_index = event[0];
  249. },
  250. // 选择时间
  251. selectDate(e, key){
  252. this[key] = `${e.year}-${e.month}-${e.day} ${e.hour}:${e.minute}:${e.second}`;
  253. },
  254. // 上传图片
  255. uploadImage(){
  256. let current_count = this.image_count - this.image_list.length;
  257. if(current_count == 0) return;
  258. uni.chooseImage({
  259. count: current_count,
  260. complete: result => {
  261. if(result.errMsg == "chooseImage:fail cancel"){
  262. return; // 取消选择图片
  263. }
  264. let tempFiles = result.tempFiles;
  265. let image_list = [];
  266. let overstep = false;
  267. tempFiles.map(item => {
  268. // 上传的图片需小于10MB
  269. if(item.size < 10000000){
  270. image_list.push(item.path);
  271. }else{
  272. overstep = true;
  273. }
  274. })
  275. if(overstep){
  276. uni.showModal({
  277. title: '温馨提示',
  278. content: '您上传的图片含有超出10M大小的限制,请优化大小后再上传!',
  279. showCancel: false
  280. })
  281. }
  282. this.image_list.push(...image_list);
  283. }
  284. })
  285. },
  286. // 将图片临时路径上传到后端,得到线上图片地址
  287. uploadDiscover(img) {
  288. return new Promise((resolve, reject) => {
  289. uni.showLoading({
  290. title: '正在上传中'
  291. })
  292. uni.uploadFile({
  293. header: {
  294. token: this.token
  295. },
  296. url: `${config.GLOBAL.baseUrl}api/supplier/upload_image`,
  297. filePath: img,
  298. fileType: 'image',
  299. name: 'image',
  300. success: res => {
  301. var result = JSON.parse(res.data).data.url;
  302. // this.uploadImg.push(result)
  303. // console.log('上传后的图片路径',this.uploadImg)
  304. uni.hideLoading();
  305. resolve(result);
  306. },
  307. fail: err => {
  308. console.log(err)
  309. uni.hideLoading();
  310. reject(err);
  311. }
  312. })
  313. })
  314. },
  315. // 预览图片
  316. lookImage(current){
  317. if(this.image_list.length <= 0) return;
  318. this.$u.throttle(() => {
  319. uni.previewImage({
  320. urls: this.image_list,
  321. current: current
  322. });
  323. }, 500);
  324. },
  325. // 移除图片
  326. removeInage(current){
  327. this.image_list.splice(current, 1);
  328. if(this.uploadImg.length){
  329. this.uploadImg.splice(current, 1);
  330. }
  331. },
  332. // 提交
  333. submit(){
  334. if(!this.title) return this.$msg('请输入标题');
  335. if(!this.subtitle) return this.$msg('请输入副标题');
  336. if(!this.activity_startdate) return this.$msg('未选择活动开始时间');
  337. if(!this.activity_enddate) return this.$msg('未选择活动结束时间');
  338. if(!this.sign_startdate) return this.$msg('未选择报名开始时间');
  339. if(!this.sign_enddate) return this.$msg('未选择报名结束时间');
  340. if(!this.activity_content) return this.$msg('请填写活动内容');
  341. if(!this.activity_num) return this.$msg('请填写活动人数');
  342. if(!this.activity_rule) return this.$msg('请填写活动规则');
  343. if(!this.image_list.length) return this.$msg('请上传活动封面图');
  344. if(this.uploadImg.length){
  345. this.submitHttp();
  346. }else{
  347. this.uploadDiscover(this.image_list[0]).then(res => {
  348. console.log("submit", res);
  349. this.uploadImg = [res];
  350. this.submitHttp();
  351. })
  352. }
  353. },
  354. submitHttp(){
  355. uni.showLoading({
  356. title: '正在提交中'
  357. })
  358. let par = {
  359. id: this.id,
  360. name: this.title,
  361. username: this.subtitle,
  362. member_count: this.activity_num,
  363. image: this.uploadImg[0],
  364. time_start: this.activity_startdate,
  365. time_end: this.activity_enddate,
  366. apply_start: this.sign_startdate,
  367. apply_end: this.sign_enddate,
  368. content: this.activity_content,
  369. rule: this.activity_rule,
  370. user_level: 0
  371. }
  372. if(this.levels_index != null){
  373. par.user_level = this.levels_list[this.levels_index].id;
  374. }
  375. this.$http.post({
  376. api: 'api/supplier/activity/store',
  377. data: par,
  378. header: {
  379. token: this.token
  380. }
  381. }).then(res => {
  382. console.log("``````", res);
  383. if(res.data.code == 200){
  384. this.$msg('操作成功', {icon: 'success'}).then(() => {
  385. this.$toBack();
  386. })
  387. }else{
  388. uni.showModal({
  389. title: '',
  390. content: res.data.message || '新增活动失败!',
  391. showCancel: false
  392. })
  393. }
  394. uni.hideLoading()
  395. }).catch(err => uni.hideLoading())
  396. }
  397. }
  398. }
  399. </script>
  400. <style lang="scss" scoped>
  401. .content{
  402. padding: 30rpx 32rpx;
  403. width: 750rpx;
  404. height: max-content;
  405. .list{
  406. width: 100%;
  407. padding-bottom: 60rpx;
  408. .title{
  409. font-size: 28rpx;
  410. color: #222222;
  411. margin-bottom: 20rpx;
  412. }
  413. .input{
  414. width: 100%;
  415. height: 80rpx;
  416. background: rgba(14, 47, 158, 0.05);
  417. border-radius: 5rpx;
  418. padding: 20rpx 30rpx;
  419. box-sizing: border-box;
  420. }
  421. .select{
  422. width: 100%;
  423. height: 80rpx;
  424. padding: 20rpx 30rpx;
  425. box-sizing: border-box;
  426. display: flex;
  427. justify-content: space-between;
  428. align-items: center;
  429. background: rgba(14, 47, 158, 0.05);
  430. border-radius: 5rpx;
  431. border: 1rpx solid #0E2F9E;
  432. font-size: 28rpx;
  433. color: #0E2F9E;
  434. }
  435. .textarea{
  436. width: 686rpx;
  437. height: 283rpx;
  438. background: rgba(14, 47, 158, 0.05);
  439. border-radius: 5rpx;
  440. padding: 20rpx 30rpx;
  441. box-sizing: border-box;
  442. }
  443. }
  444. .my-images{
  445. display: flex;
  446. flex-wrap: wrap;
  447. margin-top: 30rpx;
  448. margin-bottom: 18rpx;
  449. .my-image-item{
  450. width: 220rpx;
  451. height: 220rpx;
  452. // background: #DDDDDD;
  453. background-color: rgba(14, 47, 158, 0.05);
  454. position: relative;
  455. margin-right: 12rpx;
  456. &:nth-child(3n){
  457. margin-right: 0rpx;
  458. }
  459. &:nth-child(n+4){
  460. margin-top: 12rpx;
  461. }
  462. image{
  463. width: 100%;
  464. height: 100%;
  465. }
  466. .remove-image{
  467. position: absolute;
  468. right: -4rpx;
  469. top: -18rpx;
  470. color: #e74c3c;
  471. font-size: 40rpx;
  472. padding: 8rpx;
  473. }
  474. }
  475. .my-image-item-after{
  476. position: absolute;
  477. width: 100%;
  478. height: 100%;
  479. display: flex;
  480. justify-content: center;
  481. align-items: center;
  482. font-size: 60rpx;
  483. color: #999999;
  484. }
  485. }
  486. .buttom{
  487. width: 550rpx;
  488. height: 100rpx;
  489. background: #0D2E9A;
  490. border-radius: 50rpx;
  491. margin: 0 auto;
  492. display: flex;
  493. justify-content: center;
  494. align-items: center;
  495. font-size: 32rpx;
  496. color: #FFFFFF;
  497. }
  498. .btn-box{
  499. width: 100%;
  500. height: 100rpx;
  501. display: flex;
  502. justify-content: space-between;
  503. .btn2{
  504. width: 48%;
  505. height: 100%;
  506. background-color: #0D2E9A;
  507. border-radius: 50rpx;
  508. font-size: 32rpx;
  509. color: #FFFFFF;
  510. display: flex;
  511. justify-content: center;
  512. align-items: center;
  513. }
  514. }
  515. }
  516. </style>