add.vue 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729
  1. <template>
  2. <el-card shadow="never" class="aui-card--fill">
  3. <div class="mod-home">
  4. <div class="top adfac">
  5. <div class="back adfac" @click="handleBack">
  6. <img src="@/assets/img/back.png">
  7. <span>返回</span>
  8. </div>
  9. <div class="line"></div>
  10. <div class="text">{{ basicForm.id?'编辑':'新增' }}活动</div>
  11. </div>
  12. <div class="tab adfac">
  13. <div class="tab-pre" :class="{'active':tidx==1}" @click="changeTab(1)">基础资料</div>
  14. <div class="tab-pre" :class="{'active':tidx==2}" @click="changeTab(2)">活动参与</div>
  15. </div>
  16. <div class="form" v-if="tidx===1">
  17. <el-form ref="basicRef" :model="basicForm" :rules="basicRules" label-width="125px">
  18. <el-form-item label="活动类型" prop="typeId">
  19. <el-select v-model="basicForm.typeId" placeholder="请选择活动类型" class="select-box" style="width: 390px;">
  20. <el-option v-for="item in typeOptions" :key="item.id" :label="item.typeName" :value="item.id"></el-option>
  21. </el-select>
  22. </el-form-item>
  23. <el-form-item label="活动分类" prop="categoryId">
  24. <el-select v-model="basicForm.categoryId" placeholder="请选择活动分类" class="select-box" style="width: 390px;">
  25. <el-option v-for="item in categoryOptions" :key="item.id" :label="item.categoryName" :value="item.id"></el-option>
  26. </el-select>
  27. </el-form-item>
  28. <el-form-item label="活动名称" prop="activityName">
  29. <el-input v-model="basicForm.activityName" placeholder="请输入活动名称"></el-input>
  30. </el-form-item>
  31. <el-form-item label="报名时间" prop="signupEndTime">
  32. <div class="adfac">
  33. <el-date-picker v-model="basicForm.signupStartTime" @change="e=>handleSignupDateChange(e,'signupStartTime')" type="datetime" format="yyyy-MM-dd HH:mm" placeholder="年/月/日 - -:- -" style="width: 180px;"></el-date-picker>
  34. <span style="margin: 0 10px;">至</span>
  35. <el-date-picker v-model="basicForm.signupEndTime" @change="e=>handleSignupDateChange(e,'signupEndTime')" type="datetime" format="yyyy-MM-dd HH:mm" placeholder="年/月/日 - -:- -" style="width: 180px;"></el-date-picker>
  36. </div>
  37. </el-form-item>
  38. <el-form-item label="活动时间" prop="activityEndTime">
  39. <div class="adfac">
  40. <el-date-picker v-model="basicForm.activityStartTime" @change="e=>handleActivityDateChange(e,'activityStartTime')" type="datetime" format="yyyy-MM-dd HH:mm" placeholder="年/月/日 - -:- -" style="width: 180px;"></el-date-picker>
  41. <span style="margin: 0 10px;">至</span>
  42. <el-date-picker v-model="basicForm.activityEndTime" @change="e=>handleActivityDateChange(e,'activityEndTime')" type="datetime" format="yyyy-MM-dd HH:mm" placeholder="年/月/日 - -:- -" style="width: 180px;"></el-date-picker>
  43. </div>
  44. </el-form-item>
  45. <el-form-item label="活动地点" prop="districtId">
  46. <el-select v-model="basicForm.provinceId" placeholder="省" clearable style="width: 14%" @change="val=>regionChange(val, 'province')">
  47. <el-option v-for="item in provinceOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
  48. </el-select>
  49. <el-select v-model="basicForm.cityId" placeholder="市" clearable style="width: 14%; margin: 0 1%" @change="val=>regionChange(val, 'city')">
  50. <el-option v-for="item in cityOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
  51. </el-select>
  52. <el-select v-model="basicForm.districtId" placeholder="区" clearable style="width: 14%; margin: 0 1%" @change="val=>regionChange(val, 'area')">
  53. <el-option v-for="item in areaOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
  54. </el-select>
  55. <el-input v-model="basicForm.address" placeholder="详细地址" style="width: 40%"></el-input>
  56. </el-form-item>
  57. <el-form-item label="渠道方" prop="channelId">
  58. <el-select v-model="basicForm.channelId" placeholder="请选择渠道方" class="select-box" style="width: 390px;">
  59. <el-option v-for="item in channelOptions" :key="item.id" :label="item.channelName" :value="item.id"></el-option>
  60. </el-select>
  61. </el-form-item>
  62. <el-form-item label="举办方" prop="organizerId">
  63. <el-select v-model="basicForm.organizerId" placeholder="请选择举办方" class="select-box" style="width: 390px;">
  64. <el-option v-for="item in organizerOptions" :key="item.id" :label="item.channelName" :value="item.id"></el-option>
  65. </el-select>
  66. </el-form-item>
  67. <el-form-item label="活动列表图片" prop="coverFile" class="redLabel">
  68. <el-upload
  69. :action="url"
  70. :file-list="fileListCover"
  71. :limit="1"
  72. :before-upload="file => beforeUploadHandle(file, 1, [158, 214])"
  73. list-type="picture-card"
  74. :on-success="successHandleCover"
  75. :on-remove="handleRemoveCover"
  76. class="upload-demo"
  77. >
  78. <i class="el-icon-plus"></i>
  79. </el-upload>
  80. <div class="upload_tip">尺寸:158*214px,上传1张,支持图片格式:jpg、png、jpeg</div>
  81. </el-form-item>
  82. <el-form-item label="活动详情banner" prop="imageFiles" class="redLabel">
  83. <el-upload
  84. :action="url"
  85. :file-list="fileListBanner"
  86. :limit="6"
  87. :before-upload="file => beforeUploadHandle(file, 2, [702, 440])"
  88. list-type="picture-card"
  89. :on-success="successHandleBanner"
  90. :on-remove="handleRemoveBanner"
  91. class="upload-demo"
  92. >
  93. <i class="el-icon-plus"></i>
  94. </el-upload>
  95. <div class="upload_tip">尺寸:702*440px,最多上传6张,图片格式:jpg、png、jpeg</div>
  96. </el-form-item>
  97. <el-form-item label="活动详情" prop="activityDetails" class="redLabel">
  98. <editor-vue style="margin-top: -30px;" :content="basicForm.activityDetails" @EditorChange="getEditor" ref="infoIntroduceRef"></editor-vue>
  99. </el-form-item>
  100. </el-form>
  101. <div class="btns adfac">
  102. <el-button type="primary" @click="handleNext">下一步</el-button>
  103. <el-button type="default" @click="handleBack" style="margin-left: 16px;">返回</el-button>
  104. </div>
  105. </div>
  106. <div class="form" v-else-if="tidx===2">
  107. <el-form ref="moreRef" :model="moreForm" :rules="moreRules" label-width="125px">
  108. <el-form-item label="参与方式" prop="joinMode">
  109. <ren-select
  110. v-model="moreForm.joinMode"
  111. dict-type="join_mode"
  112. placeholder="请选择参与方式"
  113. style="width: 820px"
  114. ></ren-select>
  115. </el-form-item>
  116. <el-form-item label="报名人数" class="redLabel">
  117. <div class="adfac">
  118. <el-radio-group v-model="moreForm.recruitmentFlag" @change="recruitmentChange">
  119. <el-radio :label="1" :value="1">限制</el-radio>
  120. <el-radio :label="2" :value="2">不限</el-radio>
  121. </el-radio-group>
  122. <div class="f-text">最多报名人数</div>
  123. <el-input type="number" min="0" v-model="moreForm.recruitmentMax" style="width: 157px;" :disabled="moreForm.recruitmentFlag==2" placeholder="请输入"></el-input>
  124. <div class="f-text">最少报名人数</div>
  125. <el-input type="number" min="0" v-model="moreForm.recruitmentMin" style="width: 157px;" :disabled="moreForm.recruitmentFlag==2" placeholder="请输入"></el-input>
  126. <div class="f-tip">活动报名人数超出报名人数后,将不能继续报名。活动报名人数低于最少报名人数时,将会取消活动</div>
  127. </div>
  128. </el-form-item>
  129. <el-form-item label="会员等级" class="redLabel">
  130. <div class="adfac">
  131. <el-radio-group v-model="moreForm.userLevelFlag" @change="userLevelChange">
  132. <el-radio :label="1" :value="1">限制</el-radio>
  133. <el-radio :label="0" :value="0">不限</el-radio>
  134. </el-radio-group>
  135. <el-select v-model="moreForm.userLevel" style="width: 157px;margin-left: 30px;" :disabled="moreForm.userLevelFlag==0">
  136. <el-option v-for="item in 6" :key="item" :label="item" :value="item"></el-option>
  137. </el-select>
  138. <div class="f-text2">级</div>
  139. </div>
  140. </el-form-item>
  141. <el-form-item label="会员年龄" class="redLabel">
  142. <div class="adfac">
  143. <el-radio-group v-model="moreForm.userAgeFlag" @change="userAgeChange">
  144. <el-radio :label="1" :value="1">限制</el-radio>
  145. <el-radio :label="2" :value="2">不限</el-radio>
  146. </el-radio-group>
  147. <div class="f-text">最小参加年龄</div>
  148. <el-input min="0" type="number" v-model="moreForm.userAgeMin" style="width: 157px;" :disabled="moreForm.userAgeFlag==2" placeholder="请输入"></el-input>
  149. <div class="f-text">最大参加年龄</div>
  150. <el-input min="0" type="number" v-model="moreForm.userAgeMax" style="width: 157px;" :disabled="moreForm.userAgeFlag==2" placeholder="请输入"></el-input>
  151. </div>
  152. </el-form-item>
  153. <el-form-item label="公益支持" class="redLabel">
  154. <div class="adfac">
  155. <el-select v-model="moreForm.activityLimit" placeholder="请选择" style="width: 123px;" class="select-box">
  156. <el-option label="专享券" :value="2" v-if="basicForm.typeId=='1977564813261750273'"></el-option>
  157. <template v-else>
  158. <el-option label="需要爱心值" :value="1"></el-option>
  159. <el-option label="免费" :value="3"></el-option>
  160. </template>
  161. </el-select>
  162. <div v-if="moreForm.activityLimit==1" class="adfac">
  163. <el-input min="1" type="number" v-model="moreForm.valueLimit" style="width: 252px;margin-left: 17px;" placeholder="请输入"></el-input>
  164. <div class="f-text2">爱心值</div>
  165. </div>
  166. <!-- <div v-if="moreForm.activityLimit==2" class="adfac">
  167. <el-input type="number" v-model="moreForm.valueLimit" style="width: 252px;margin-left: 17px;" placeholder="请输入"></el-input>
  168. <div class="f-text2">专享券</div>
  169. </div> -->
  170. </div>
  171. </el-form-item>
  172. <el-form-item label="爱心值对应内容" v-if="moreForm.activityLimit==1">
  173. <el-input v-model="moreForm.loveValueContent" style="width: 820px;" placeholder="请输入"></el-input>
  174. </el-form-item>
  175. <el-form-item label="报名次数限制">
  176. <div class="adfac">
  177. <el-input min="1" type="number" v-model="moreForm.timesLimit" style="width: 391px;" placeholder="请输入"></el-input>
  178. <div class="f-tip">不填默认不限制</div>
  179. </div>
  180. </el-form-item>
  181. <el-form-item label="负责人" prop="contact">
  182. <el-input v-model="moreForm.contact" style="width: 820px;" placeholder="请输入"></el-input>
  183. </el-form-item>
  184. <el-form-item label="负责人电话" prop="contactPhone">
  185. <el-input v-model="moreForm.contactPhone" style="width: 820px;" placeholder="请输入"></el-input>
  186. </el-form-item>
  187. <el-form-item label="上架活动" prop="state">
  188. <el-switch v-model="moreForm.state" active-color="#13ce66" inactive-color="#a4a4a4"></el-switch>
  189. </el-form-item>
  190. </el-form>
  191. <div class="btns adfac">
  192. <el-button type="default" @click="handlePrevious">上一步</el-button>
  193. <el-button type="primary" @click="handleSave" style="margin-left: 16px;">发布</el-button>
  194. </div>
  195. </div>
  196. </div>
  197. </el-card>
  198. </template>
  199. <script>
  200. import moment from 'moment'
  201. import Cookies from 'js-cookie'
  202. import editorVue from '@/components/editor'
  203. import mixinRegionModule from '@/mixins/region-module.js'
  204. export default {
  205. components: { editorVue },
  206. mixins: [mixinRegionModule],
  207. data () {
  208. return {
  209. typeOptions: [],
  210. categoryOptions: [],
  211. channelOptions: [],
  212. organizerOptions: [],
  213. tidx: 1,
  214. basicForm: {
  215. id: '',
  216. typeId: '',
  217. categoryId: '',
  218. activityName: '',
  219. signupStartEnd: [],
  220. signupStartTime: '',
  221. signupEndTime: '',
  222. activityStartEnd: [],
  223. activityStartTime: '',
  224. activityEndTime: '',
  225. provinceId: '',
  226. cityId: '',
  227. districtId: '',
  228. address: '',
  229. channelId: '',
  230. organizerId: '',
  231. coverFile: '',
  232. imageFiles: '',
  233. activityDetails: ''
  234. },
  235. activityDetailsTemp: '',
  236. basicRules: {
  237. typeId: [
  238. { required: true, message: '请选择活动类型', trigger: 'change' }
  239. ],
  240. categoryId: [
  241. { required: true, message: '请选择活动分类', trigger: 'change' }
  242. ],
  243. activityName: [
  244. { required: true, message: '请输入活动名称', trigger: 'blur' }
  245. ],
  246. signupEndTime: [
  247. { required: true, message: '请选择报名时间', trigger: 'change' }
  248. ],
  249. activityEndTime: [
  250. { required: true, message: '请选择活动时间', trigger: 'change' }
  251. ],
  252. provinceId: [
  253. { required: true, message: '请选择省市区', trigger: 'change' }
  254. ],
  255. cityId: [
  256. { required: true, message: '请选择省市区', trigger: 'change' }
  257. ],
  258. districtId: [
  259. { required: true, message: '请选择省市区', trigger: 'change' }
  260. ],
  261. channelId: [
  262. { required: true, message: '请选择渠道方', trigger: 'change' }
  263. ],
  264. organizerId: [
  265. { required: true, message: '请选择举办方', trigger: 'change' }
  266. ]
  267. },
  268. url: `${window.SITE_CONFIG['apiURL']}/sys/oss/upload?token=${Cookies.get('token')}`,
  269. fileListCover: [],
  270. fileListBanner: [],
  271. moreForm: {
  272. joinMode: '',
  273. recruitmentFlag: 1,
  274. recruitmentMax: '',
  275. recruitmentMin: '',
  276. userLevelFlag: 1,
  277. userLevel: 1,
  278. userAgeFlag: 1,
  279. userAgeMin: '',
  280. userAgeMax: '',
  281. activityLimit: 1,
  282. valueLimit: '',
  283. loveValueContent: '',
  284. timesLimit: '',
  285. contact: '',
  286. contactPhone: '',
  287. state: false
  288. },
  289. moreForm2: {
  290. joinMode: ''
  291. },
  292. moreRules: {
  293. joinMode: [
  294. { required: true, message: '请选择参与方式', trigger: 'change' }
  295. ],
  296. contact: [
  297. { required: true, message: '请输入负责人', trigger: 'blur' }
  298. ],
  299. contactPhone: [
  300. { required: true, message: '请输入负责人电话', trigger: 'blur' },
  301. { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的电话号码', trigger: 'blur' }
  302. ],
  303. state: [
  304. { required: true, message: '请选择上架活动', trigger: 'change' }
  305. ]
  306. }
  307. }
  308. },
  309. created () {
  310. this.getTypeOptions()
  311. this.getCategoryOptions()
  312. },
  313. mounted () {
  314. this.provincAreaDetailInfoList()
  315. this.getSupplierOptions()
  316. this.$nextTick(() => {
  317. setTimeout(() => {
  318. this.$refs.infoIntroduceRef.init()
  319. }, 500)
  320. if (this.$route.query.id) {
  321. this.getDetail(this.$route.query.id)
  322. }
  323. })
  324. },
  325. methods: {
  326. recruitmentChange (e) {
  327. if (e === 1) {
  328. this.moreForm.recruitmentMax = 1
  329. this.moreForm.recruitmentMin = 1
  330. } else {
  331. this.moreForm.recruitmentMax = 0
  332. this.moreForm.recruitmentMin = 0
  333. }
  334. },
  335. userLevelChange (e) {
  336. if (e === 1) this.moreForm.userLevel = 1
  337. else this.moreForm.userLevel = 0
  338. },
  339. userAgeChange (e) {
  340. if (e === 1) {
  341. this.moreForm.userAgeMax = 1
  342. this.moreForm.userAgeMin = 1
  343. } else {
  344. this.moreForm.userAgeMax = 0
  345. this.moreForm.userAgeMin = 0
  346. }
  347. },
  348. regionChange (val, type) {
  349. if (type === 'province') {
  350. this.basicForm.cityId = ''
  351. this.basicForm.districtId = ''
  352. this.cityAreaDetailInfoList(val)
  353. } else if (type === 'city') {
  354. this.basicForm.districtId = ''
  355. this.countyAreaDetailInfoList(val)
  356. }
  357. },
  358. getDetail (id) {
  359. this.$http.get('/core/activity/' + id).then(({ data: res }) => {
  360. if (res.code !== 0) return this.$message.error(res.msg)
  361. // this.basicForm = { ...this.basicForm, ...res.data }
  362. this.updateObjectFromSource(this.basicForm, res.data)
  363. this.activityDetailsTemp = res.data.activityDetails
  364. this.basicForm.signupStartEnd = [this.basicForm.signupStartTime, this.basicForm.signupEndTime]
  365. this.basicForm.activityStartEnd = [this.basicForm.activityStartTime, this.basicForm.activityEndTime]
  366. this.basicForm.channelId = this.basicForm.channelId
  367. this.basicForm.organizerId = this.basicForm.organizerId
  368. this.fileListCover = [{ name: '', url: res.data.coverFile }]
  369. this.fileListBanner = res.data.imageFiles.split(',').map(item => ({ name: '', url: item }))
  370. if (this.basicForm.cityId) {
  371. this.cityAreaDetailInfoList(this.basicForm.provinceId)
  372. }
  373. if (this.basicForm.districtId) {
  374. this.countyAreaDetailInfoList(this.basicForm.cityId)
  375. }
  376. this.updateObjectFromSource(this.moreForm, res.data)
  377. this.moreForm.recruitmentFlag = +this.moreForm.recruitmentMax === 0 ? 2 : 1
  378. this.moreForm.userLevelFlag = +this.moreForm.userLevel === 0 ? 0 : 1
  379. this.moreForm.userAgeFlag = +this.moreForm.userAgeMax === 0 ? 2 : 1
  380. this.moreForm.state = !!res.data.state
  381. })
  382. },
  383. updateObjectFromSource (target, source) {
  384. for (const key of Object.keys(target)) {
  385. if (Object.prototype.hasOwnProperty.call(source, key)) {
  386. target[key] = source[key]
  387. }
  388. }
  389. },
  390. getEditor (val) {
  391. this.basicForm.activityDetails = val
  392. },
  393. getTypeOptions () {
  394. this.$http.get('/core/activity/type/page', { params: { page: 1, limit: -1 } }).then(res => {
  395. this.typeOptions = res.data.data.list.filter(l => l.enable === 1) || []
  396. })
  397. },
  398. getCategoryOptions () {
  399. this.$http.get('/core/activity/category/page', { params: { page: 1, limit: -1 } }).then(res => {
  400. this.categoryOptions = res.data.data.list.filter(l => l.enable === 1) || []
  401. })
  402. },
  403. getSupplierOptions () {
  404. this.$http.get('/core/channel/page', { params: { page: 1, limit: -1 } }).then(res => {
  405. this.channelOptions = res.data.data.list.filter(item => item.type === 1) || []
  406. this.organizerOptions = res.data.data.list.filter(item => item.type === 2) || []
  407. })
  408. },
  409. handleSignupDateChange (val, key) {
  410. this.basicForm[key] = moment(val).format('YYYY-MM-DD HH:mm')
  411. },
  412. handleActivityDateChange (val, key) {
  413. this.basicForm[key] = moment(val).format('YYYY-MM-DD HH:mm')
  414. },
  415. beforeUploadHandle (file, index, fixedNumber) {
  416. if (file.type !== 'image/jpg' && file.type !== 'image/jpeg' && file.type !== 'image/png') {
  417. this.$message.error(
  418. this.$t('upload.tip', { format: 'jpg、png、gif' })
  419. )
  420. return false
  421. }
  422. },
  423. handleRemoveCover (file, fileList) {
  424. this.fileListCover = fileList.map((item) => item) || []
  425. this.basicForm.coverFile = ''
  426. },
  427. successHandleCover (res, file, fileList) {
  428. if (res.code !== 0) {
  429. return this.$message.error(res.msg)
  430. }
  431. this.fileListCover.unshift({
  432. name: '',
  433. url: res.data
  434. })
  435. this.basicForm.coverFile = this.fileListCover[0].url
  436. },
  437. handleRemoveBanner (file, fileList) {
  438. this.fileListBanner = fileList.map((item) => item)
  439. this.basicForm.imageFiles = this.fileListBanner.map(item => item.url).join(',')
  440. },
  441. successHandleBanner (res, file, fileList) {
  442. if (res.code !== 0) {
  443. return this.$message.error(res.msg)
  444. }
  445. this.fileListBanner.unshift({
  446. name: '',
  447. url: res.data
  448. })
  449. this.basicForm.imageFiles = this.fileListBanner.map(item => item.url).join(',')
  450. },
  451. handleBack () {
  452. this.basicForm = {
  453. id: '',
  454. typeId: '',
  455. categoryId: '',
  456. activityName: '',
  457. signupStartEnd: [],
  458. signupStartTime: '',
  459. signupEndTime: '',
  460. activityStartEnd: [],
  461. activityStartTime: '',
  462. activityEndTime: '',
  463. provinceId: '',
  464. cityId: '',
  465. districtId: '',
  466. address: '',
  467. channelId: '',
  468. organizerId: '',
  469. coverFile: '',
  470. imageFiles: '',
  471. activityDetails: ''
  472. }
  473. if (this.$refs.basicRef) this.$refs.basicRef.resetFields()
  474. this.moreForm = {
  475. joinMode: '',
  476. recruitmentFlag: 1,
  477. recruitmentMax: '',
  478. recruitmentMin: '',
  479. userLevelFlag: 1,
  480. userLevel: 1,
  481. userAgeFlag: 1,
  482. userAgeMin: '',
  483. userAgeMax: '',
  484. activityLimit: 1,
  485. valueLimit: '',
  486. loveValueContent: '',
  487. timesLimit: '',
  488. contact: '',
  489. contactPhone: '',
  490. state: false
  491. }
  492. if (this.$refs.moreRef) this.$refs.moreRef.resetFields()
  493. this.tidx = 1
  494. this.$router.push('/activity-list')
  495. },
  496. changeTab (idx) {
  497. // this.tidx = idx
  498. },
  499. handleNext () {
  500. this.$refs.basicRef.validate(valid => {
  501. if (valid) {
  502. if (Date.parse(this.basicForm.signupStartTime) > Date.parse(this.basicForm.signupEndTime)) return this.$message.error('报名结束时间不能小于报名开始时间')
  503. if (Date.parse(this.basicForm.signupEndTime) < Date.parse(new Date())) return this.$message.error('报名结束时间不能小于当前时间')
  504. if (Date.parse(this.basicForm.signupEndTime) > Date.parse(this.basicForm.activityStartTime)) return this.$message.error('活动开始时间不能小于报名结束时间')
  505. if (Date.parse(this.basicForm.activityStartTime) > Date.parse(this.basicForm.activityEndTime)) return this.$message.error('活动结束时间不能小于活动开始时间')
  506. if (!this.basicForm.coverFile) return this.$message.error('请上传活动列表图片')
  507. if (!this.basicForm.imageFiles) return this.$message.error('请上传活动详情Banner')
  508. if (!this.basicForm.activityDetails) return this.$message.error('请输入活动详情')
  509. this.tidx = 2
  510. if (this.basicForm.typeId === '1977564813261750273') {
  511. this.moreForm.activityLimit = 2
  512. this.moreForm.valueLimit = 1
  513. }
  514. } else {
  515. return false
  516. }
  517. })
  518. },
  519. handlePrevious () {
  520. this.tidx = 1
  521. this.$nextTick(() => {
  522. setTimeout(() => {
  523. this.$refs.infoIntroduceRef.init()
  524. this.basicForm.activityDetails = this.activityDetails
  525. }, 500)
  526. })
  527. },
  528. handleSave () {
  529. this.$refs.moreRef.validate(valid => {
  530. if (valid) {
  531. if (this.moreForm.recruitmentFlag === 1) {
  532. if (!this.moreForm.recruitmentMax) return this.$message.error('请输入最多报名人数')
  533. if (!this.moreForm.recruitmentMin) return this.$message.error('请输入最少报名人数')
  534. if (+this.moreForm.recruitmentMin > +this.moreForm.recruitmentMax) return this.$message.error('最少报名人数不能大于最多报名人数')
  535. } else {
  536. this.moreForm.recruitmentMax = 0
  537. this.moreForm.recruitmentMin = 0
  538. }
  539. if (this.moreForm.userLevelFlag === 1) {
  540. if (!this.moreForm.userLevel) return this.$message.error('请输入会员最小限制等级')
  541. } else {
  542. this.moreForm.userLevel = 0
  543. }
  544. if (this.moreForm.userAgeFlag === 1) {
  545. if (!this.moreForm.userAgeMin) return this.$message.error('请输入最小参加年龄')
  546. if (!this.moreForm.userAgeMax) return this.$message.error('请输入最大参加年龄')
  547. if (+this.moreForm.userAgeMin > +this.moreForm.userAgeMax) return this.$message.error('最小参加年龄不能大于最大参加年龄')
  548. } else {
  549. this.moreForm.userAgeMin = 0
  550. this.moreForm.userAgeMax = 0
  551. }
  552. if (this.moreForm.activityLimit === 1) {
  553. if (!this.moreForm.valueLimit) return this.$message.error('请输入爱心值数量')
  554. } else if (this.moreForm.activityLimit === 2) {
  555. if (!this.moreForm.valueLimit) return this.$message.error('请输入专享券数量')
  556. }
  557. let { signupStartEnd, activityStartEnd, ...newBasic } = JSON.parse(JSON.stringify(this.basicForm))
  558. let { recruitmentFlag, userAgeFlag, userLevelFlag, ...newMore } = JSON.parse(JSON.stringify(this.moreForm))
  559. let dto = { ...newBasic, ...newMore }
  560. dto.state = dto.state ? 1 : 0
  561. this.$http[dto.id ? 'put' : 'post']('/core/activity', dto).then(res => {
  562. if (res.data.code !== 0) return this.$message.error(res.data.msg)
  563. this.$message.success('发布成功')
  564. this.$router.push('/activity-list')
  565. })
  566. } else {
  567. return false
  568. }
  569. })
  570. }
  571. }
  572. }
  573. </script>
  574. <style scoped lang="scss">
  575. .top {
  576. padding-bottom: 13px;
  577. box-shadow: inset 0px -1px 0px 0px #F0F1F7;
  578. .back {
  579. cursor: pointer;
  580. img {
  581. width: 22px;
  582. height: 22px;
  583. }
  584. span {
  585. font-family: PingFang-SC, PingFang-SC;
  586. font-weight: bold;
  587. font-size: 14px;
  588. color: #00AE57;
  589. line-height: 20px;
  590. margin-left: 6px;
  591. }
  592. }
  593. .line {
  594. width: 1px;
  595. height: 16px;
  596. background: #F0F1F7;
  597. margin-left: 14px;
  598. }
  599. .text {
  600. font-family: PingFangSC, PingFang SC;
  601. font-weight: 400;
  602. font-size: 14px;
  603. color: #657588;
  604. line-height: 20px;
  605. margin-left: 10px;
  606. }
  607. }
  608. .tab{
  609. height: 48px;
  610. box-shadow: inset 0px -1px 0px 0px #F0F1F7;
  611. &-pre{
  612. width: 120px;
  613. height: 48px;
  614. font-family: PingFangSC, PingFang SC;
  615. font-weight: 400;
  616. font-size: 14px;
  617. color: #393939;
  618. line-height: 20px;
  619. // cursor: pointer;
  620. position: relative;
  621. padding-left: 7px;
  622. box-sizing: border-box;
  623. display: flex;
  624. flex-direction: column;
  625. justify-content: center;
  626. &.active{
  627. font-weight: bold;
  628. &::after{
  629. content: '';
  630. position: absolute;
  631. left: 7px;
  632. bottom: 2px;
  633. width: 55px;
  634. height: 2px;
  635. background: #00AE57;
  636. }
  637. }
  638. }
  639. }
  640. .form{
  641. padding: 20px 0 1px;
  642. }
  643. .btns{
  644. border-top: 1px solid #F0F1F7;
  645. padding: 24px 0 0 126px;
  646. }
  647. .f-text{
  648. font-family: PingFangSC, PingFang SC;
  649. font-weight: 400;
  650. font-size: 14px;
  651. color: #393939;
  652. line-height: 20px;
  653. margin: 0 10px 0 56px;
  654. }
  655. .f-text2{
  656. font-family: PingFangSC, PingFang SC;
  657. font-weight: 400;
  658. font-size: 14px;
  659. color: #393939;
  660. line-height: 20px;
  661. margin-left: 6px;
  662. }
  663. .f-tip{
  664. font-family: PingFangSC, PingFang SC;
  665. font-weight: 400;
  666. font-size: 12px;
  667. color: #A4A4A4;
  668. line-height: 17px;
  669. margin-left: 20px;
  670. }
  671. ::v-deep .el-radio__label{
  672. line-height: 20px;
  673. }
  674. .avatar-uploader-icon {
  675. font-size: 28px;
  676. color: #8c939d;
  677. width: 84px;
  678. height: 84px;
  679. line-height: 84px;
  680. text-align: center;
  681. }
  682. ::v-deep .el-upload--picture-card{
  683. width: 84px !important;
  684. height: 84px !important;
  685. display: flex;
  686. align-items: center;
  687. justify-content: center;
  688. }
  689. .avatar {
  690. width: 84px;
  691. height: 84px;
  692. display: block;
  693. }
  694. .upload-demo{
  695. display: flex !important;
  696. flex-wrap: wrap;
  697. }
  698. ::v-deep .el-upload-list--picture-card .el-upload-list__item{
  699. width: 84px !important;
  700. height: 84px !important;
  701. }
  702. .upload_tip{
  703. font-family: PingFangSC, PingFang SC;
  704. font-weight: 400;
  705. font-size: 12px;
  706. color: #A4A4A4;
  707. line-height: 17px;
  708. margin-top: 2px;
  709. }
  710. ::v-deep .redLabel>.el-form-item__label{
  711. &::before{
  712. content: "*";
  713. color: #F56C6C;
  714. margin-right: 4px;
  715. }
  716. }
  717. </style>