activityEdit.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  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;':'color:#cccccc'" @click="chooseLocation()">
  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. longitude:null,
  139. latitude:null
  140. }
  141. },
  142. onLoad(options) {
  143. this.id = options.id
  144. if(this.id){
  145. this.getActivityInfo()
  146. }
  147. },
  148. onShow() {
  149. },
  150. methods: {
  151. jumpUrl(url){
  152. uni.navigateTo({
  153. url:url
  154. })
  155. },
  156. getActivityInfo(){
  157. req.getRequest('/api/match/detail',{id:this.id},res=>{
  158. this.pic = res.pic
  159. this.fileList = res.imageList.map(item=>{return item.url})
  160. this.title = res.title
  161. this.brief = res.brief
  162. this.text = res.text
  163. this.personLimit = res.personLimit
  164. this.enlistStartTime = this.formatTime(res.enlistStartTime)
  165. this.enlistEndTime = this.formatTime(res.enlistEndTime)
  166. this.startTime = this.formatTime(res.startTime)
  167. this.endTime = this.formatTime(res.endTime)
  168. this.house = res.house
  169. this.regionCode = [res.province,res.city,res.country]
  170. this.region = res.areaAdd.split(',')
  171. this.address = res.address
  172. this.longitude = res.lng?res.lng:null
  173. this.latitude = res.lat?res.lat:null
  174. })
  175. },
  176. next(){
  177. if(!this.pic){
  178. return req.msg('请上传封面图')
  179. }
  180. if(this.fileList.length==0){
  181. return req.msg('请上传活动轮播图')
  182. }
  183. if(!this.title){
  184. return req.msg('请填写活动名称')
  185. }
  186. if(!this.brief){
  187. return req.msg('请填写活动简介')
  188. }
  189. if(!this.text){
  190. return req.msg('请填写活动详情')
  191. }
  192. this.stepOne = false
  193. this.stepTwo = true
  194. },
  195. uploadImage(type,index){
  196. let that = this;
  197. let count = 1
  198. if(type==1){
  199. count = 1
  200. }else if(type==2){
  201. if(index){
  202. count = 1
  203. }else{
  204. count = 9-that.fileList.length
  205. }
  206. }
  207. uni.chooseImage({
  208. count: count,
  209. sizeType: ['original', 'compressed'],
  210. sourceType: ['album', 'camera'],
  211. success: function({ tempFilePaths }) {
  212. var promise = Promise.all(
  213. tempFilePaths.map(tempFilePath => {
  214. return new Promise(function(resolve, reject) {
  215. req.uploadFile('/api/nocheck/upload', tempFilePath, res => {
  216. // type 1 封面图
  217. if(type==1){
  218. that.pic = res.src
  219. }else if(type==2){
  220. if(index){
  221. that.fileList[index] = res.src
  222. that.fileList = JSON.parse(JSON.stringify(that.fileList))
  223. }else{
  224. that.fileList = that.fileList.concat(res.src)
  225. }
  226. }
  227. });
  228. });
  229. })
  230. );
  231. promise
  232. .then(function(results) {
  233. console.log(results);
  234. })
  235. .catch(function(err) {
  236. console.log(err);
  237. });
  238. }
  239. });
  240. },
  241. deleteImage(type,index){
  242. if(type==2)
  243. this.fileList.splice(index,1)
  244. },
  245. enlistStartTimeChange(e){
  246. if(this.enlistEndTime){
  247. if(this.enlistEndTime<e.detail.value)
  248. return req.msg('报名开始时间不能大于结束时间')
  249. }
  250. this.enlistStartTime = e.detail.value
  251. },
  252. enlistEndTimeChange(e){
  253. if(this.enlistStartTime){
  254. if(this.enlistStartTime>e.detail.value)
  255. return req.msg('报名结束时间不能小于开始时间')
  256. }
  257. this.enlistEndTime = e.detail.value
  258. },
  259. startTimeChange(e){
  260. if(this.endTime){
  261. if(this.endTime<e.detail.value)
  262. return req.msg('活动开始时间不能大于结束时间')
  263. }
  264. this.startTime = e.detail.value
  265. },
  266. endTimeChange(e){
  267. if(this.startTime){
  268. if(this.startTime>e.detail.value)
  269. return req.msg('活动结束时间不能小于开始时间')
  270. }
  271. this.endTime = e.detail.value
  272. },
  273. chooseLocation() {
  274. var tha = this;
  275. uni.chooseLocation({
  276. success: function(res) {
  277. if (res.name) {
  278. tha.address = res.name;
  279. tha.reverseGeocoder(res);
  280. console.log('地址数据》》》:', res);
  281. }
  282. }
  283. });
  284. },
  285. reverseGeocoder(location) {
  286. // #ifdef H5
  287. location = location.latitude + ',' + location.longitude
  288. let url = 'https://apis.map.qq.com/ws/geocoder/v1/?address=';
  289. this.$jsonp(url, {
  290. key: req.public.mapLBSKEY,
  291. location: location,
  292. output: 'jsonp'
  293. }).then(data => {
  294. console.log('解析后的地址地址数据:', data);
  295. data = data.result
  296. this.region = [data.ad_info.province,data.ad_info.city,data.ad_info.district]
  297. this.regionCode = [data.ad_info.adcode.substring(0,2)+'0000',data.ad_info.adcode.substring(0,4)+'00',data.ad_info.adcode]
  298. this.longitude = data.ad_info.location.lng
  299. this.latitude = data.ad_info.location.lat
  300. }).catch(err => {
  301. console.log(err);
  302. });
  303. // #endif
  304. // #ifndef H5
  305. QQMapWX.initMap();
  306. QQMapWX.reverseGeocoder(location, data => {
  307. console.log('解析后的地址地址数据:', data);
  308. this.region = [data.ad_info.province,data.ad_info.city,data.ad_info.district]
  309. this.regionCode = [data.ad_info.adcode.substring(0,2)+'0000',data.ad_info.adcode.substring(0,4)+'00',data.ad_info.adcode]
  310. this.longitude = data.ad_info.location.lng
  311. this.latitude = data.ad_info.location.lat
  312. });
  313. //#endif
  314. },
  315. bindRegionChange(event) {
  316. console.log(event)
  317. this.region = event.detail.value
  318. this.regionCode = event.detail.code
  319. },
  320. submit(){
  321. if(!this.pic){
  322. return req.msg('请上传封面图')
  323. }
  324. if(this.fileList.length==0){
  325. return req.msg('请上传活动轮播图')
  326. }
  327. if(!this.title){
  328. return req.msg('请填写活动名称')
  329. }
  330. if(!this.brief){
  331. return req.msg('请填写活动简介')
  332. }
  333. if(!this.text){
  334. return req.msg('请填写活动详情')
  335. }
  336. if(!this.enlistStartTime){
  337. return req.msg('请选择报名开始时间')
  338. }
  339. if(!this.enlistEndTime){
  340. return req.msg('请选择报名结束时间')
  341. }
  342. if(!this.startTime){
  343. return req.msg('请选择活动开始时间')
  344. }
  345. if(!this.endTime){
  346. return req.msg('请选择活动结束时间')
  347. }
  348. if(!this.house){
  349. return req.msg('请填写活动地址')
  350. }
  351. if(this.regionCode.length==0){
  352. return req.msg('请选择活动所在城市')
  353. }
  354. if(!this.address){
  355. return req.msg('请填写详细地址')
  356. }
  357. let dataP = {
  358. pic:this.pic,
  359. fileList:JSON.stringify(this.fileList.map(item=>{return {url:item}})),
  360. title:this.title,
  361. brief:this.brief,
  362. text:this.text,
  363. personLimit:this.personLimit,
  364. enlistStartTime:this.enlistStartTime,
  365. enlistEndTime:this.enlistEndTime,
  366. startTime:this.startTime,
  367. endTime:this.endTime,
  368. house:this.house,
  369. province:this.regionCode[0],
  370. city:this.regionCode[1],
  371. country:this.regionCode[2],
  372. areaAdd:this.region.join(','),
  373. address:this.address,
  374. lng:this.longitude,
  375. lat:this.latitude
  376. }
  377. let prices = [{
  378. title: "VIP",
  379. marketMoney: 0,
  380. money: 0,
  381. vipMoney: 0,
  382. vipModels: [],
  383. personCount: 1,
  384. isDefault: 0
  385. }]
  386. dataP.prices = prices
  387. let url = '/api/match/save'
  388. if(this.id) {
  389. dataP.id = this.id
  390. url = '/api/match/update'
  391. uni.showModal({
  392. title:'提示',
  393. content:'修改活动将重新审核,确定修改?',
  394. success: (res) => {
  395. if(res.confirm){
  396. req.postRequest(url,dataP,res=>{
  397. req.msg('创建成功')
  398. let pages = getCurrentPages();
  399. var prevPage = pages[pages.length - 2];
  400. if (prevPage) {
  401. prevPage.$vm.isLoad = true
  402. prevPage.$vm.form.page = 1
  403. prevPage.$vm.getPageList()
  404. }
  405. setTimeout(()=>{
  406. uni.navigateBack()
  407. },1000)
  408. })
  409. }
  410. }
  411. })
  412. }else{
  413. req.postRequest(url,dataP,res=>{
  414. req.msg('创建成功')
  415. let pages = getCurrentPages();
  416. var prevPage = pages[pages.length - 2];
  417. if (prevPage) {
  418. prevPage.$vm.isLoad = true
  419. prevPage.$vm.form.page = 1
  420. prevPage.$vm.getPageList()
  421. }
  422. setTimeout(()=>{
  423. uni.navigateBack()
  424. },1000)
  425. })
  426. }
  427. },
  428. formatTime(date){
  429. date = new Date(date.replace(/-/g, '/'))
  430. return util.formatTime(date).t3
  431. },
  432. },
  433. mounted() {
  434. }
  435. }
  436. </script>
  437. <style>
  438. @import "./activityEdit.css";
  439. </style>