activityEdit.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. <template>
  2. <view>
  3. <view v-if="stepOne">
  4. <view class="form">
  5. <view class="form-title">基本信息</view>
  6. <view class="form-item-title">封面图</view>
  7. <view class="upload-pic ddflex" v-if="!pic" @click="uploadImage(1)">
  8. <image src="../static/images/pic.png"></image>
  9. <view style="margin-top: 30rpx;">上传封面图</view>
  10. </view>
  11. <image v-else class="upload-image" :src="pic" @click="uploadImage(1)"></image>
  12. <view class="form-limit">* 图片尺寸限制:680*350</view>
  13. <view class="form-item-title">活动详情轮播图</view>
  14. <view class="ddflex" style="margin-top: 30rpx;">
  15. <view class="upload-photo-image" v-for="item ,index in fileList" @click="uploadImage(2,index+1)">
  16. <image :src="item" mode="aspectFill"></image>
  17. <image class="upload-photo-close" src="/static/pages/images/close3.png" @click.stop="deleteImage(2,index+1)"></image>
  18. </view>
  19. <view class="upload-photo ddflex" @click="uploadImage(2)" v-if="fileList.length<9">
  20. <image src="../static/images/photo.png"></image>
  21. </view>
  22. </view>
  23. <view class="form-limit">* 图片尺寸限制:670*350</view>
  24. </view>
  25. <view class="form-border"></view>
  26. <view class="form">
  27. <view class="form-item-title">活动标题</view>
  28. <view class="form-input-box">
  29. <input v-model="title" placeholder-class="form-input-placeholder" placeholder="请输入活动标题"/>
  30. </view>
  31. <view class="form-item-title">活动说明</view>
  32. <view class="form-input-box">
  33. <input v-model="brief" placeholder-class="form-input-placeholder" placeholder="请填写活动简介说明"/>
  34. </view>
  35. <view class="form-item-title">
  36. 活动详情
  37. <view class="more ddflex" @click="jumpUrl('/match/editorContent/editorContent')">
  38. <text v-if="!text">编辑</text>
  39. <text v-else style="color: var(--main);">已完善</text>
  40. <image src="../../static/pages/images/more.png"></image>
  41. </view>
  42. </view>
  43. <view class="next-btn" @click="next">下一步</view>
  44. </view>
  45. </view>
  46. <!-- 第二步 -->
  47. <view v-if="stepTwo">
  48. <view class="form">
  49. <view class="form-title">报名设置</view>
  50. <view class="form-item-title">最大报名人数</view>
  51. <view class="form-number-select ddflex">
  52. <view>-</view>
  53. <input v-model="personLimit" type="number" placeholder="最大报名人数" placeholder-class="form-input-placeholder"/>
  54. <view>+</view>
  55. </view>
  56. <view class="form-item-title">报名时间</view>
  57. <view class="ddflex" style="margin-top: 20rpx;">
  58. <picker v-model="enlistStartTime" mode="date" class="flex" @change="enlistStartTimeChange">
  59. <view class="form-date-select" :style="enlistStartTime?'color:#333':''">
  60. {{enlistStartTime?enlistStartTime:'开始日期'}}
  61. </view>
  62. </picker>
  63. <text style="margin: 0 20rpx;">至</text>
  64. <picker v-model="enlistEndTime" mode="date" class="flex" @change="enlistEndTimeChange">
  65. <view class="form-date-select" :style="enlistEndTime?'color:#333':''">
  66. {{enlistEndTime?enlistEndTime:'结束日期'}}
  67. </view>
  68. </picker>
  69. </view>
  70. <view class="form-item-title">活动时间</view>
  71. <view class="ddflex" style="margin-top: 20rpx;">
  72. <picker v-model="startTime" mode="date" class="flex" @change="startTimeChange">
  73. <view class="form-date-select" :style="startTime?'color:#333':''">
  74. {{startTime?startTime:"开始日期"}}
  75. </view>
  76. </picker>
  77. <text style="margin: 0 20rpx;">至</text>
  78. <picker v-model="endTime" mode="date" class="flex" @change="endTimeChange">
  79. <view class="form-date-select" :style="endTime?'color:#333':''">
  80. {{endTime?endTime:"结束日期"}}
  81. </view>
  82. </picker>
  83. </view>
  84. </view>
  85. <view class="form-border"></view>
  86. <view class="form">
  87. <view class="form-title">活动地址</view>
  88. <view class="form-item-title">地址名称</view>
  89. <view class="form-input-box">
  90. <input v-model="house" placeholder-class="form-input-placeholder" placeholder="请输入活动地址简称"/>
  91. </view>
  92. <view class="form-item-title">选择城市</view>
  93. <view class="form-input-box">
  94. <picker class="form-input-placeholder" mode="region" @change="bindRegionChange" :value="region">
  95. <view class="picker" :style="region.length>0?'color: #333;':''">
  96. {{region.length > 0 ? region[0]+region[1]+region[2] : '请选择所在城市'}}
  97. </view>
  98. </picker>
  99. <!-- <image src="/card/static/images/area.png" class="loca" @click="chooseLocation()"></image> -->
  100. </view>
  101. <view class="form-item-title">
  102. 详细地址
  103. </view>
  104. <view class="form-input-box">
  105. <input v-model="address" placeholder-class="form-input-placeholder" placeholder="请输入详细地址"/>
  106. </view>
  107. <view class="next-btn" @click="submit()">提交</view>
  108. </view>
  109. </view>
  110. </view>
  111. </template>
  112. <script>
  113. import util from "../../utils/util.js";
  114. const app = getApp();
  115. const req = require("../../utils/request.js");
  116. export default {
  117. components: {},
  118. props: {},
  119. data() {
  120. return {
  121. stepOne:true,
  122. stepTwo:false,
  123. pic:'',//封面图
  124. fileList:[],//banner
  125. title:'',
  126. brief:'',
  127. text:'',
  128. personLimit:-1,
  129. enlistStartTime:'',
  130. enlistEndTime:'',
  131. startTime:'',
  132. endTime:'',
  133. house:'',
  134. region:[],
  135. address:'',
  136. regionCode:[],
  137. id:''
  138. }
  139. },
  140. onLoad(options) {
  141. this.id = options.id
  142. if(this.id){
  143. this.getActivityInfo()
  144. }
  145. },
  146. onShow() {
  147. },
  148. methods: {
  149. jumpUrl(url){
  150. uni.navigateTo({
  151. url:url
  152. })
  153. },
  154. getActivityInfo(){
  155. req.getRequest('/api/match/detail',{id:this.id},res=>{
  156. this.pic = res.pic
  157. this.fileList = res.imageList.map(item=>{return item.url})
  158. this.title = res.title
  159. this.brief = res.brief
  160. this.text = res.text
  161. this.personLimit = res.personLimit
  162. this.enlistStartTime = this.formatTime(res.enlistStartTime)
  163. this.enlistEndTime = this.formatTime(res.enlistEndTime)
  164. this.startTime = this.formatTime(res.startTime)
  165. this.endTime = this.formatTime(res.endTime)
  166. this.house = res.house
  167. this.regionCode = [res.province,res.city,res.country]
  168. this.region = res.areaAdd.split(',')
  169. this.address = res.address
  170. })
  171. },
  172. next(){
  173. if(!this.pic){
  174. return req.msg('请上传封面图')
  175. }
  176. if(this.fileList.length==0){
  177. return req.msg('请上传活动轮播图')
  178. }
  179. if(!this.title){
  180. return req.msg('请填写活动名称')
  181. }
  182. if(!this.brief){
  183. return req.msg('请填写活动简介')
  184. }
  185. if(!this.text){
  186. return req.msg('请填写活动详情')
  187. }
  188. this.stepOne = false
  189. this.stepTwo = true
  190. },
  191. uploadImage(type,index){
  192. let that = this;
  193. let count = 1
  194. if(type==1){
  195. count = 1
  196. }else if(type==2){
  197. if(index){
  198. count = 1
  199. }else{
  200. count = 9-that.fileList.length
  201. }
  202. }
  203. uni.chooseImage({
  204. count: count,
  205. sizeType: ['original', 'compressed'],
  206. sourceType: ['album', 'camera'],
  207. success: function({ tempFilePaths }) {
  208. var promise = Promise.all(
  209. tempFilePaths.map(tempFilePath => {
  210. return new Promise(function(resolve, reject) {
  211. req.uploadFile('/api/nocheck/upload', tempFilePath, res => {
  212. // type 1 封面图
  213. if(type==1){
  214. that.pic = res.src
  215. }else if(type==2){
  216. if(index){
  217. that.fileList[index] = res.src
  218. that.fileList = JSON.parse(JSON.stringify(that.fileList))
  219. }else{
  220. that.fileList = that.fileList.concat(res.src)
  221. }
  222. }
  223. });
  224. });
  225. })
  226. );
  227. promise
  228. .then(function(results) {
  229. console.log(results);
  230. })
  231. .catch(function(err) {
  232. console.log(err);
  233. });
  234. }
  235. });
  236. },
  237. deleteImage(type,index){
  238. if(type==2)
  239. this.fileList.splice(index,1)
  240. },
  241. enlistStartTimeChange(e){
  242. if(this.enlistEndTime){
  243. if(this.enlistEndTime<e.detail.value)
  244. return req.msg('报名开始时间不能大于结束时间')
  245. }
  246. this.enlistStartTime = e.detail.value
  247. },
  248. enlistEndTimeChange(e){
  249. if(this.enlistStartTime){
  250. if(this.enlistStartTime>e.detail.value)
  251. return req.msg('报名结束时间不能小于开始时间')
  252. }
  253. this.enlistEndTime = e.detail.value
  254. },
  255. startTimeChange(e){
  256. if(this.endTime){
  257. if(this.endTime<e.detail.value)
  258. return req.msg('活动开始时间不能大于结束时间')
  259. }
  260. this.startTime = e.detail.value
  261. },
  262. endTimeChange(e){
  263. if(this.startTime){
  264. if(this.startTime>e.detail.value)
  265. return req.msg('活动结束时间不能小于开始时间')
  266. }
  267. this.endTime = e.detail.value
  268. },
  269. chooseLocation() {
  270. var tha = this;
  271. uni.chooseLocation({
  272. success: function(res) {
  273. if (res.name) {
  274. tha.form.detailInfo = res.name;
  275. tha.reverseGeocoder(res);
  276. console.log('地址数据》》》:', res);
  277. }
  278. }
  279. });
  280. },
  281. reverseGeocoder(location) {
  282. QQMapWX.initMap();
  283. QQMapWX.reverseGeocoder(location, data => {
  284. this.region = [data.ad_info.province, data.ad_info.city, data.ad_info.district]
  285. console.log('解析后的地址地址数据:', data);
  286. });
  287. },
  288. bindRegionChange(event) {
  289. console.log(event)
  290. this.region = event.detail.value
  291. this.regionCode = event.detail.code
  292. },
  293. submit(){
  294. if(!this.pic){
  295. return req.msg('请上传封面图')
  296. }
  297. if(this.fileList.length==0){
  298. return req.msg('请上传活动轮播图')
  299. }
  300. if(!this.title){
  301. return req.msg('请填写活动名称')
  302. }
  303. if(!this.brief){
  304. return req.msg('请填写活动简介')
  305. }
  306. if(!this.text){
  307. return req.msg('请填写活动详情')
  308. }
  309. if(!this.enlistStartTime){
  310. return req.msg('请选择报名开始时间')
  311. }
  312. if(!this.enlistEndTime){
  313. return req.msg('请选择报名结束时间')
  314. }
  315. if(!this.startTime){
  316. return req.msg('请选择活动开始时间')
  317. }
  318. if(!this.endTime){
  319. return req.msg('请选择活动结束时间')
  320. }
  321. if(!this.house){
  322. return req.msg('请填写活动地址')
  323. }
  324. if(this.regionCode.length==0){
  325. return req.msg('请选择活动所在城市')
  326. }
  327. if(!this.address){
  328. return req.msg('请填写详细地址')
  329. }
  330. let dataP = {
  331. pic:this.pic,
  332. fileList:JSON.stringify(this.fileList.map(item=>{return {url:item}})),
  333. title:this.title,
  334. brief:this.brief,
  335. text:this.text,
  336. personLimit:this.personLimit,
  337. enlistStartTime:this.enlistStartTime,
  338. enlistEndTime:this.enlistEndTime,
  339. startTime:this.startTime,
  340. endTime:this.endTime,
  341. house:this.house,
  342. province:this.regionCode[0],
  343. city:this.regionCode[1],
  344. country:this.regionCode[2],
  345. areaAdd:this.region.join(','),
  346. address:this.address
  347. }
  348. let prices = [{
  349. title: "VIP",
  350. marketMoney: 0,
  351. money: 0,
  352. vipMoney: 0,
  353. vipModels: [],
  354. personCount: 1,
  355. isDefault: 0
  356. }]
  357. dataP.prices = prices
  358. let url = '/api/match/save'
  359. if(this.id) {
  360. dataP.id = this.id
  361. url = '/api/match/update'
  362. uni.showModal({
  363. title:'提示',
  364. content:'修改活动将重新审核,确定修改?',
  365. success: (res) => {
  366. if(res.confirm){
  367. req.postRequest(url,dataP,res=>{
  368. req.msg('创建成功')
  369. let pages = getCurrentPages();
  370. var prevPage = pages[pages.length - 2];
  371. if (prevPage) {
  372. prevPage.$vm.isLoad = true
  373. prevPage.$vm.form.page = 1
  374. prevPage.$vm.getPageList()
  375. }
  376. setTimeout(()=>{
  377. uni.navigateBack()
  378. },1000)
  379. })
  380. }
  381. }
  382. })
  383. }else{
  384. req.postRequest(url,dataP,res=>{
  385. req.msg('创建成功')
  386. let pages = getCurrentPages();
  387. var prevPage = pages[pages.length - 2];
  388. if (prevPage) {
  389. prevPage.$vm.isLoad = true
  390. prevPage.$vm.form.page = 1
  391. prevPage.$vm.getPageList()
  392. }
  393. setTimeout(()=>{
  394. uni.navigateBack()
  395. },1000)
  396. })
  397. }
  398. },
  399. formatTime(date){
  400. date = new Date(date.replace(/-/g, '/'))
  401. return util.formatTime(date).t3
  402. },
  403. },
  404. mounted() {
  405. }
  406. }
  407. </script>
  408. <style>
  409. @import "./activityEdit.css";
  410. </style>