add.vue 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799
  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: 440px;">
  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: 440px;">
  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: 205px;"></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: 205px;"></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: 205px;"></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: 205px;"></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.5%" @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.5%; 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.5%; margin: 0 1% 0 0" @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: 53.5%"></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: 440px;">
  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: 440px;">
  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], 'coverFile')"
  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], 'banner')"
  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="可获得义工时长" prop="volunteerHours" v-if="basicForm.typeId==='1977564860095348737'">
  176. <el-input v-model="moreForm.volunteerHours" style="width: 820px;" placeholder="请输入(h)"></el-input>
  177. </el-form-item>
  178. <el-form-item label="报名次数限制">
  179. <div class="adfac">
  180. <el-input min="1" type="number" v-model="moreForm.timesLimit" style="width: 391px;" placeholder="请输入"></el-input>
  181. <div class="f-tip">不填默认不限制</div>
  182. </div>
  183. </el-form-item>
  184. <el-form-item label="负责人" prop="contact">
  185. <el-input v-model="moreForm.contact" style="width: 820px;" placeholder="请输入"></el-input>
  186. </el-form-item>
  187. <el-form-item label="负责人电话" prop="contactPhone">
  188. <el-input v-model="moreForm.contactPhone" style="width: 820px;" placeholder="请输入"></el-input>
  189. </el-form-item>
  190. <el-form-item label="上架活动" prop="state">
  191. <el-switch v-model="moreForm.state" active-color="#13ce66" inactive-color="#a4a4a4"></el-switch>
  192. </el-form-item>
  193. </el-form>
  194. <div class="btns adfac">
  195. <el-button type="default" @click="handlePrevious">上一步</el-button>
  196. <el-button type="primary" @click="handleSave" style="margin-left: 16px;">发布</el-button>
  197. </div>
  198. </div>
  199. </div>
  200. <!-- 裁剪框 -->
  201. <cropper-dlg
  202. v-if="showCropper"
  203. :dialogVisible.sync="showCropper"
  204. :img-file="currentFile"
  205. ref="vueCropper"
  206. @upload="cropperUpload"
  207. ></cropper-dlg>
  208. <cropper-dlg2
  209. v-if="showCropper2"
  210. :dialogVisible.sync="showCropper2"
  211. :img-file="currentFile2"
  212. ref="vueCropper2"
  213. @upload="cropperUpload2"
  214. ></cropper-dlg2>
  215. </el-card>
  216. </template>
  217. <script>
  218. import moment from 'moment'
  219. import Cookies from 'js-cookie'
  220. import editorVue from '@/components/editor'
  221. import mixinRegionModule from '@/mixins/region-module.js'
  222. export default {
  223. components: { editorVue },
  224. mixins: [mixinRegionModule],
  225. data () {
  226. return {
  227. currentFile: '',
  228. cropperIndex: null,
  229. showCropper: false,
  230. isCropper: true,
  231. currentFile2: '',
  232. cropperIndex2: null,
  233. showCropper2: false,
  234. isCropper2: true,
  235. updType: 1,
  236. typeOptions: [],
  237. categoryOptions: [],
  238. channelOptions: [],
  239. organizerOptions: [],
  240. tidx: 1,
  241. basicForm: {
  242. id: '',
  243. typeId: '',
  244. categoryId: '',
  245. activityName: '',
  246. signupStartEnd: [],
  247. signupStartTime: '',
  248. signupEndTime: '',
  249. activityStartEnd: [],
  250. activityStartTime: '',
  251. activityEndTime: '',
  252. provinceId: '',
  253. cityId: '',
  254. districtId: '',
  255. address: '',
  256. channelId: '',
  257. organizerId: '',
  258. coverFile: '',
  259. imageFiles: '',
  260. activityDetails: ''
  261. },
  262. activityDetailsTemp: '',
  263. basicRules: {
  264. typeId: [
  265. { required: true, message: '请选择活动类型', trigger: 'change' }
  266. ],
  267. categoryId: [
  268. { required: true, message: '请选择活动分类', trigger: 'change' }
  269. ],
  270. activityName: [
  271. { required: true, message: '请输入活动名称', trigger: 'blur' }
  272. ],
  273. signupEndTime: [
  274. { required: true, message: '请选择报名时间', trigger: 'change' }
  275. ],
  276. activityEndTime: [
  277. { required: true, message: '请选择活动时间', trigger: 'change' }
  278. ],
  279. provinceId: [
  280. { required: true, message: '请选择省市区', trigger: 'change' }
  281. ],
  282. cityId: [
  283. { required: true, message: '请选择省市区', trigger: 'change' }
  284. ],
  285. districtId: [
  286. { required: true, message: '请选择省市区', trigger: 'change' }
  287. ],
  288. channelId: [
  289. { required: true, message: '请选择渠道方', trigger: 'change' }
  290. ],
  291. organizerId: [
  292. { required: true, message: '请选择举办方', trigger: 'change' }
  293. ]
  294. },
  295. url: `${window.SITE_CONFIG['apiURL']}/sys/oss/upload?token=${Cookies.get('token')}`,
  296. fileListCover: [],
  297. fileListBanner: [],
  298. moreForm: {
  299. joinMode: '',
  300. recruitmentFlag: 1,
  301. recruitmentMax: '',
  302. recruitmentMin: '',
  303. userLevelFlag: 1,
  304. userLevel: 1,
  305. userAgeFlag: 1,
  306. userAgeMin: '',
  307. userAgeMax: '',
  308. activityLimit: 1,
  309. valueLimit: '',
  310. loveValueContent: '',
  311. volunteerHours: 0,
  312. timesLimit: '',
  313. contact: '',
  314. contactPhone: '',
  315. state: false
  316. },
  317. moreForm2: {
  318. joinMode: ''
  319. },
  320. moreRules: {
  321. joinMode: [
  322. { required: true, message: '请选择参与方式', trigger: 'change' }
  323. ],
  324. volunteerHours: [
  325. { required: true, message: '请输入可获得的义工时长', trigger: 'blur' }
  326. ],
  327. contact: [
  328. { required: true, message: '请输入负责人', trigger: 'blur' }
  329. ],
  330. contactPhone: [
  331. { required: true, message: '请输入负责人电话', trigger: 'blur' },
  332. { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的电话号码', trigger: 'blur' }
  333. ]
  334. }
  335. }
  336. },
  337. created () {
  338. this.getTypeOptions()
  339. this.getCategoryOptions()
  340. },
  341. mounted () {
  342. this.provincAreaDetailInfoList()
  343. this.getSupplierOptions()
  344. this.$nextTick(() => {
  345. setTimeout(() => {
  346. this.$refs.infoIntroduceRef.init()
  347. }, 500)
  348. if (this.$route.query.id) {
  349. this.getDetail(this.$route.query.id)
  350. }
  351. })
  352. },
  353. methods: {
  354. recruitmentChange (e) {
  355. if (e === 1) {
  356. this.moreForm.recruitmentMax = 1
  357. this.moreForm.recruitmentMin = 1
  358. } else {
  359. this.moreForm.recruitmentMax = 0
  360. this.moreForm.recruitmentMin = 0
  361. }
  362. },
  363. userLevelChange (e) {
  364. if (e === 1) this.moreForm.userLevel = 1
  365. else this.moreForm.userLevel = 0
  366. },
  367. userAgeChange (e) {
  368. if (e === 1) {
  369. this.moreForm.userAgeMax = 1
  370. this.moreForm.userAgeMin = 1
  371. } else {
  372. this.moreForm.userAgeMax = 0
  373. this.moreForm.userAgeMin = 0
  374. }
  375. },
  376. regionChange (val, type) {
  377. if (type === 'province') {
  378. this.basicForm.cityId = ''
  379. this.basicForm.districtId = ''
  380. this.cityAreaDetailInfoList(val)
  381. } else if (type === 'city') {
  382. this.basicForm.districtId = ''
  383. this.countyAreaDetailInfoList(val)
  384. }
  385. },
  386. getDetail (id) {
  387. this.$http.get('/core/activity/' + id).then(({ data: res }) => {
  388. if (res.code !== 0) return this.$message.error(res.msg)
  389. // this.basicForm = { ...this.basicForm, ...res.data }
  390. this.updateObjectFromSource(this.basicForm, res.data)
  391. this.activityDetailsTemp = res.data.activityDetails
  392. this.basicForm.signupStartEnd = [this.basicForm.signupStartTime, this.basicForm.signupEndTime]
  393. this.basicForm.activityStartEnd = [this.basicForm.activityStartTime, this.basicForm.activityEndTime]
  394. this.basicForm.channelId = this.basicForm.channelId
  395. this.basicForm.organizerId = this.basicForm.organizerId
  396. this.fileListCover = [{ name: '', url: res.data.coverFile }]
  397. this.fileListBanner = res.data.imageFiles.split(',').map(item => ({ name: '', url: item }))
  398. if (this.basicForm.cityId) {
  399. this.cityAreaDetailInfoList(this.basicForm.provinceId)
  400. }
  401. if (this.basicForm.districtId) {
  402. this.countyAreaDetailInfoList(this.basicForm.cityId)
  403. }
  404. this.updateObjectFromSource(this.moreForm, res.data)
  405. this.moreForm.recruitmentFlag = +this.moreForm.recruitmentMax === 0 ? 2 : 1
  406. this.moreForm.userLevelFlag = +this.moreForm.userLevel === 0 ? 0 : 1
  407. this.moreForm.userAgeFlag = +this.moreForm.userAgeMax === 0 ? 2 : 1
  408. this.moreForm.state = !!res.data.state
  409. })
  410. },
  411. updateObjectFromSource (target, source) {
  412. for (const key of Object.keys(target)) {
  413. if (Object.prototype.hasOwnProperty.call(source, key)) {
  414. target[key] = source[key]
  415. }
  416. }
  417. },
  418. getEditor (val) {
  419. this.basicForm.activityDetails = val
  420. },
  421. getTypeOptions () {
  422. this.$http.get('/core/activity/type/page', { params: { page: 1, limit: -1 } }).then(res => {
  423. this.typeOptions = res.data.data.list.filter(l => l.enable === 1) || []
  424. })
  425. },
  426. getCategoryOptions () {
  427. this.$http.get('/core/activity/category/page', { params: { page: 1, limit: -1 } }).then(res => {
  428. this.categoryOptions = res.data.data.list.filter(l => l.enable === 1) || []
  429. })
  430. },
  431. getSupplierOptions () {
  432. this.$http.get('/core/channel/page', { params: { page: 1, limit: -1 } }).then(res => {
  433. this.channelOptions = res.data.data.list.filter(item => item.type === 1) || []
  434. this.organizerOptions = res.data.data.list.filter(item => item.type === 2) || []
  435. })
  436. },
  437. handleSignupDateChange (val, key) {
  438. this.basicForm[key] = moment(val).format('YYYY-MM-DD HH:mm')
  439. },
  440. handleActivityDateChange (val, key) {
  441. this.basicForm[key] = moment(val).format('YYYY-MM-DD HH:mm')
  442. },
  443. beforeUploadHandle (file, index, fixedNumber, name) {
  444. this.updType = index
  445. if (file.type !== 'image/jpg' && file.type !== 'image/jpeg' && file.type !== 'image/png') {
  446. this.$message.error(
  447. this.$t('upload.tip', { format: 'jpg、png、gif' })
  448. )
  449. return false
  450. }
  451. if (this.updType === 1) {
  452. if (this.isCropper) {
  453. this.currentFile = file
  454. this.cropperIndex = name
  455. this.showCropper = true
  456. this.$nextTick(() => {
  457. this.$refs.vueCropper.init()
  458. })
  459. return false
  460. }
  461. } else if (this.updType === 2) {
  462. if (this.isCropper2) {
  463. this.currentFile2 = file
  464. this.cropperIndex2 = name
  465. this.showCropper2 = true
  466. this.$nextTick(() => {
  467. this.$refs.vueCropper2.init()
  468. })
  469. return false
  470. }
  471. }
  472. },
  473. cropperUpload (data) {
  474. this.showCropper = false
  475. if (data !== 'close') {
  476. this.$http.post('/sys/oss/upload', data).then((res) => {
  477. if (res.data.code === 0) {
  478. this.successHandleCover(res.data)
  479. }
  480. })
  481. }
  482. },
  483. cropperUpload2 (data) {
  484. this.showCropper2 = false
  485. if (data !== 'close') {
  486. this.$http.post('/sys/oss/upload', data).then((res) => {
  487. if (res.data.code === 0) {
  488. this.successHandleBanner(res.data)
  489. }
  490. })
  491. }
  492. },
  493. handleRemoveCover (file, fileList) {
  494. this.fileListCover = fileList.map((item) => item) || []
  495. this.basicForm.coverFile = ''
  496. },
  497. successHandleCover (res, file, fileList) {
  498. if (res.code !== 0) {
  499. return this.$message.error(res.msg)
  500. }
  501. this.fileListCover.unshift({
  502. name: '',
  503. url: res.data
  504. })
  505. this.basicForm.coverFile = this.fileListCover[0].url
  506. },
  507. handleRemoveBanner (file, fileList) {
  508. this.fileListBanner = fileList.map((item) => item)
  509. this.basicForm.imageFiles = this.fileListBanner.map(item => item.url).join(',')
  510. },
  511. successHandleBanner (res, file, fileList) {
  512. if (res.code !== 0) {
  513. return this.$message.error(res.msg)
  514. }
  515. this.fileListBanner.unshift({
  516. name: '',
  517. url: res.data
  518. })
  519. this.basicForm.imageFiles = this.fileListBanner.map(item => item.url).join(',')
  520. },
  521. handleBack () {
  522. this.basicForm = {
  523. id: '',
  524. typeId: '',
  525. categoryId: '',
  526. activityName: '',
  527. signupStartEnd: [],
  528. signupStartTime: '',
  529. signupEndTime: '',
  530. activityStartEnd: [],
  531. activityStartTime: '',
  532. activityEndTime: '',
  533. provinceId: '',
  534. cityId: '',
  535. districtId: '',
  536. address: '',
  537. channelId: '',
  538. organizerId: '',
  539. coverFile: '',
  540. imageFiles: '',
  541. activityDetails: ''
  542. }
  543. if (this.$refs.basicRef) this.$refs.basicRef.resetFields()
  544. this.moreForm = {
  545. joinMode: '',
  546. recruitmentFlag: 1,
  547. recruitmentMax: '',
  548. recruitmentMin: '',
  549. userLevelFlag: 1,
  550. userLevel: 1,
  551. userAgeFlag: 1,
  552. userAgeMin: '',
  553. userAgeMax: '',
  554. activityLimit: 1,
  555. valueLimit: '',
  556. loveValueContent: '',
  557. timesLimit: '',
  558. contact: '',
  559. contactPhone: '',
  560. state: false
  561. }
  562. if (this.$refs.moreRef) this.$refs.moreRef.resetFields()
  563. this.tidx = 1
  564. this.$router.push('/activity-list')
  565. },
  566. changeTab (idx) {
  567. // this.tidx = idx
  568. },
  569. handleNext () {
  570. this.$refs.basicRef.validate(valid => {
  571. if (valid) {
  572. if (Date.parse(this.basicForm.signupStartTime) > Date.parse(this.basicForm.signupEndTime)) return this.$message.error('报名结束时间不能小于报名开始时间')
  573. if (Date.parse(this.basicForm.signupEndTime) < Date.parse(new Date())) return this.$message.error('报名结束时间不能小于当前时间')
  574. if (Date.parse(this.basicForm.signupEndTime) > Date.parse(this.basicForm.activityStartTime)) return this.$message.error('活动开始时间不能小于报名结束时间')
  575. if (Date.parse(this.basicForm.activityStartTime) > Date.parse(this.basicForm.activityEndTime)) return this.$message.error('活动结束时间不能小于活动开始时间')
  576. if (!this.basicForm.coverFile) return this.$message.error('请上传活动列表图片')
  577. if (!this.basicForm.imageFiles) return this.$message.error('请上传活动详情Banner')
  578. if (!this.basicForm.activityDetails) return this.$message.error('请输入活动详情')
  579. this.tidx = 2
  580. if (this.basicForm.typeId === '1977564813261750273') {
  581. this.moreForm.activityLimit = 2
  582. this.moreForm.valueLimit = 1
  583. }
  584. } else {
  585. return false
  586. }
  587. })
  588. },
  589. handlePrevious () {
  590. this.tidx = 1
  591. this.$nextTick(() => {
  592. setTimeout(() => {
  593. this.$refs.infoIntroduceRef.init()
  594. this.basicForm.activityDetails = this.activityDetails
  595. }, 500)
  596. })
  597. },
  598. handleSave () {
  599. this.$refs.moreRef.validate(valid => {
  600. if (valid) {
  601. if (this.moreForm.recruitmentFlag === 1) {
  602. if (!this.moreForm.recruitmentMax) return this.$message.error('请输入最多报名人数')
  603. if (!this.moreForm.recruitmentMin) return this.$message.error('请输入最少报名人数')
  604. if (+this.moreForm.recruitmentMin > +this.moreForm.recruitmentMax) return this.$message.error('最少报名人数不能大于最多报名人数')
  605. } else {
  606. this.moreForm.recruitmentMax = 0
  607. this.moreForm.recruitmentMin = 0
  608. }
  609. if (this.moreForm.userLevelFlag === 1) {
  610. if (!this.moreForm.userLevel) return this.$message.error('请输入会员最小限制等级')
  611. } else {
  612. this.moreForm.userLevel = 0
  613. }
  614. if (this.moreForm.userAgeFlag === 1) {
  615. if (!this.moreForm.userAgeMin) return this.$message.error('请输入最小参加年龄')
  616. if (!this.moreForm.userAgeMax) return this.$message.error('请输入最大参加年龄')
  617. if (+this.moreForm.userAgeMin > +this.moreForm.userAgeMax) return this.$message.error('最小参加年龄不能大于最大参加年龄')
  618. } else {
  619. this.moreForm.userAgeMin = 0
  620. this.moreForm.userAgeMax = 0
  621. }
  622. if (this.moreForm.activityLimit === 1) {
  623. if (!this.moreForm.valueLimit) return this.$message.error('请输入爱心值数量')
  624. } else if (this.moreForm.activityLimit === 2) {
  625. if (!this.moreForm.valueLimit) return this.$message.error('请输入专享券数量')
  626. }
  627. let { signupStartEnd, activityStartEnd, ...newBasic } = JSON.parse(JSON.stringify(this.basicForm))
  628. let { recruitmentFlag, userAgeFlag, userLevelFlag, ...newMore } = JSON.parse(JSON.stringify(this.moreForm))
  629. let dto = { ...newBasic, ...newMore }
  630. dto.state = dto.state ? 1 : 0
  631. this.$http[dto.id ? 'put' : 'post']('/core/activity', dto).then(res => {
  632. if (res.data.code !== 0) return this.$message.error(res.data.msg)
  633. this.$message.success('发布成功')
  634. this.$router.push('/activity-list')
  635. })
  636. } else {
  637. return false
  638. }
  639. })
  640. }
  641. }
  642. }
  643. </script>
  644. <style scoped lang="scss">
  645. .top {
  646. padding-bottom: 13px;
  647. box-shadow: inset 0px -1px 0px 0px #F0F1F7;
  648. .back {
  649. cursor: pointer;
  650. img {
  651. width: 22px;
  652. height: 22px;
  653. }
  654. span {
  655. font-family: PingFang-SC, PingFang-SC;
  656. font-weight: bold;
  657. font-size: 14px;
  658. color: #00AE57;
  659. line-height: 20px;
  660. margin-left: 6px;
  661. }
  662. }
  663. .line {
  664. width: 1px;
  665. height: 16px;
  666. background: #F0F1F7;
  667. margin-left: 14px;
  668. }
  669. .text {
  670. font-family: PingFangSC, PingFang SC;
  671. font-weight: 400;
  672. font-size: 14px;
  673. color: #657588;
  674. line-height: 20px;
  675. margin-left: 10px;
  676. }
  677. }
  678. .tab{
  679. height: 48px;
  680. box-shadow: inset 0px -1px 0px 0px #F0F1F7;
  681. &-pre{
  682. width: 120px;
  683. height: 48px;
  684. font-family: PingFangSC, PingFang SC;
  685. font-weight: 400;
  686. font-size: 14px;
  687. color: #393939;
  688. line-height: 20px;
  689. // cursor: pointer;
  690. position: relative;
  691. padding-left: 7px;
  692. box-sizing: border-box;
  693. display: flex;
  694. flex-direction: column;
  695. justify-content: center;
  696. &.active{
  697. font-weight: bold;
  698. &::after{
  699. content: '';
  700. position: absolute;
  701. left: 7px;
  702. bottom: 2px;
  703. width: 55px;
  704. height: 2px;
  705. background: #00AE57;
  706. }
  707. }
  708. }
  709. }
  710. .form{
  711. padding: 20px 0 1px;
  712. }
  713. .btns{
  714. border-top: 1px solid #F0F1F7;
  715. padding: 24px 0 0 126px;
  716. }
  717. .f-text{
  718. font-family: PingFangSC, PingFang SC;
  719. font-weight: 400;
  720. font-size: 14px;
  721. color: #393939;
  722. line-height: 20px;
  723. margin: 0 10px 0 56px;
  724. }
  725. .f-text2{
  726. font-family: PingFangSC, PingFang SC;
  727. font-weight: 400;
  728. font-size: 14px;
  729. color: #393939;
  730. line-height: 20px;
  731. margin-left: 6px;
  732. }
  733. .f-tip{
  734. font-family: PingFangSC, PingFang SC;
  735. font-weight: 400;
  736. font-size: 12px;
  737. color: #F4657A;
  738. line-height: 17px;
  739. margin-left: 20px;
  740. }
  741. ::v-deep .el-radio__label{
  742. line-height: 20px;
  743. }
  744. .avatar-uploader-icon {
  745. font-size: 28px;
  746. color: #8c939d;
  747. width: 84px;
  748. height: 84px;
  749. line-height: 84px;
  750. text-align: center;
  751. }
  752. ::v-deep .el-upload--picture-card{
  753. width: 84px !important;
  754. height: 84px !important;
  755. display: flex;
  756. align-items: center;
  757. justify-content: center;
  758. }
  759. .avatar {
  760. width: 84px;
  761. height: 84px;
  762. display: block;
  763. }
  764. .upload-demo{
  765. display: flex !important;
  766. flex-wrap: wrap;
  767. }
  768. ::v-deep .el-upload-list--picture-card .el-upload-list__item{
  769. width: 84px !important;
  770. height: 84px !important;
  771. }
  772. .upload_tip{
  773. font-family: PingFangSC, PingFang SC;
  774. font-weight: 400;
  775. font-size: 12px;
  776. color: #A4A4A4;
  777. line-height: 17px;
  778. margin-top: 2px;
  779. }
  780. ::v-deep .redLabel>.el-form-item__label{
  781. &::before{
  782. content: "*";
  783. color: #F56C6C;
  784. margin-right: 4px;
  785. }
  786. }
  787. </style>