edit.php 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575
  1. <style>
  2. .form-body {
  3. padding: 20px;
  4. background-color: #fff;
  5. margin-bottom: 20px;
  6. padding-right: 20%;
  7. min-width: 900px;
  8. }
  9. .form-body .el-form-item {
  10. padding-right: 50%;
  11. min-width: 850px;
  12. }
  13. .form-button {
  14. margin: 0;
  15. }
  16. .form-button .el-form-item__content {
  17. margin-left: 0 !important;
  18. }
  19. .button-item {
  20. padding: 9px 25px;
  21. }
  22. /*批量上传图片*/
  23. .pic-url-remark {
  24. font-size: 13px;
  25. color: #c9c9c9;
  26. margin-bottom: 12px;
  27. }
  28. .add-image-btn {
  29. width: 100px;
  30. height: 100px;
  31. color: #419EFB;
  32. border: 1px solid #e2e2e2;
  33. cursor: pointer;
  34. }
  35. .del-btn-pro{
  36. position: absolute;
  37. top: 28%;
  38. left: 57px;
  39. }
  40. .del-btn{
  41. position: absolute;
  42. top: -4%;
  43. right: -4%;
  44. }
  45. .rule_input_width{
  46. width: 150px;
  47. }
  48. .increment{
  49. width: 903px;
  50. line-height: 40px;
  51. }
  52. </style>
  53. <?php
  54. use common\helpers\ComponentHelper;
  55. ComponentHelper::loadComponentView('com-dialog-select');
  56. ComponentHelper::loadComponentView('com-image');
  57. ComponentHelper::loadComponentView('com-rich-text');
  58. ?>
  59. <div id="app" v-cloak>
  60. <el-card v-loading="cardLoading" shadow="never" style="border:0;min-width: 1000px;" body-style="background-color: #f3f3f3;padding: 10px 0 0;">
  61. <div slot="header">
  62. <el-breadcrumb separator="/">
  63. <el-breadcrumb-item><span style="color: #409EFF;cursor: pointer" @click="$navigate({r:'score-expansion/default/index'})">活动列表</span>
  64. </el-breadcrumb-item>
  65. <el-breadcrumb-item>添加活动</el-breadcrumb-item>
  66. </el-breadcrumb>
  67. </div>
  68. <div class="form-body">
  69. <el-form :model="ruleForm" :rules="rules" size="small" ref="ruleForm" label-width="150px">
  70. <el-row>
  71. <el-col :span="24">
  72. <el-form-item label="活动名称:" prop="title" >
  73. <el-input v-model="ruleForm.title" prop="title" style=" width: 150px; float: left; " placeholder="请输入活动名称"></el-input>
  74. </el-form-item>
  75. <el-form-item label="活动描述:" prop="description">
  76. <el-input type="textarea" placeholder="请输入活动描述" style="width: 400px;" maxlength="200" v-model="ruleForm.description"></el-input>
  77. </el-form-item>
  78. <el-form-item label="活动封面:" prop="" >
  79. <div style="float: left;">
  80. <com-attachment v-model="ruleForm.cover" :multiple="false" :max="1">
  81. <el-tooltip class="item" effect="dark" content="建议尺寸:420 * 336" placement="top">
  82. <el-button size="mini">选择图片</el-button>
  83. </el-tooltip>
  84. </com-attachment>
  85. <div class="customize-share-title">
  86. <com-image mode="aspectFill" width='80px' height='80px' :src="ruleForm.cover ? ruleForm.cover : ''"></com-image>
  87. <!-- <el-button v-if="ruleForm.cover" class="del-btn-pro" size="mini" type="danger" icon="el-icon-close" @click="ruleForm.cover = ''"></el-button>-->
  88. </div>
  89. </div>
  90. </el-form-item>
  91. <el-form-item label="活动时间:" style="margin-bottom: 40px;" prop="time_type" required>
  92. <el-radio-group v-model="ruleForm.time_type">
  93. <el-radio :label="1">每日{{ integral_name }}</el-radio>
  94. <el-radio :label="2">时间段{{ integral_name }}</el-radio>
  95. </el-radio-group>
  96. <div style="width: 500px" v-if="ruleForm.time_type == 1">
  97. <!-- <div style="float: left">
  98. <el-time-picker
  99. v-model="ruleForm.time_type_start_time"
  100. value-format="yyyy-MM-dd HH:mm:ss"
  101. :picker-options="{
  102. selectableRange: '00:00:00 - 23:59:59'
  103. }"
  104. placeholder="开始时间">
  105. </el-time-picker>至
  106. </div>
  107. <div style="float: left">
  108. <el-time-picker
  109. v-model="ruleForm.time_type_end_time"
  110. value-format="yyyy-MM-dd HH:mm:ss"
  111. :picker-options="{
  112. selectableRange: '00:00:00 - 23:59:59'
  113. }"
  114. placeholder="结束时间">
  115. </el-time-picker>
  116. </div> -->
  117. <el-time-picker
  118. v-if="ruleForm.time_type == 1"
  119. @change="timeTypeChange"
  120. is-range
  121. value-format="HH:mm:ss"
  122. v-model="time_type_time"
  123. range-separator="至"
  124. start-placeholder="开始时间"
  125. end-placeholder="结束时间"
  126. placeholder="选择时间范围">
  127. </el-time-picker>
  128. </div>
  129. <el-date-picker
  130. v-if="ruleForm.time_type == 2"
  131. v-model="ruleForm.time_slot"
  132. type="datetimerange"
  133. value-format="yyyy-MM-dd HH:mm:ss"
  134. range-separator="至"
  135. start-placeholder="开始日期"
  136. end-placeholder="结束日期"
  137. @change="updateTime">
  138. </el-date-picker>
  139. </el-form-item>
  140. <el-form-item :label="integral_name+'类型:'" prop="integral_type" required>
  141. <el-radio-group style="width: 500px;" v-model="ruleForm.integral_type" >
  142. <el-radio :label="1">冻结到激活{{ integral_name }}
  143. <el-tooltip effect="dark" placement="top">
  144. <div slot="content">激活自己的冻结{{ integral_name }}到激活{{ integral_name }}中</div>
  145. <i class="el-icon-question"></i>
  146. </el-tooltip>
  147. </el-radio>
  148. <el-radio :label="2">增值冻结{{ integral_name }}
  149. <el-tooltip effect="dark" placement="top">
  150. <div slot="content">抢平台发放{{ integral_name }}</div>
  151. <i class="el-icon-question"></i>
  152. </el-tooltip>
  153. </el-radio>
  154. <el-radio :label="3">增值激活{{ integral_name }}
  155. <el-tooltip effect="dark" placement="top">
  156. <div slot="content">抢平台发放{{ integral_name }}</div>
  157. <i class="el-icon-question"></i>
  158. </el-tooltip>
  159. </el-radio>
  160. </el-radio-group>
  161. </el-form-item>
  162. <el-form-item :label="integral_name+'规则:'" prop="rule_data">
  163. <div class="red_pack_rule">
  164. <div class="increment">
  165. <div v-if="ruleForm.integral_type != 1">
  166. <span>{{ ruleForm.time_type == 1 ? '每日' : '' }}总积分</span>
  167. <el-input class="rule_input_width" onInput="value = toNumber(value, 2)" style="width: 150px;" v-model="ruleForm.award">
  168. <template slot="append">积分</template>
  169. </el-input>
  170. <template v-if="ruleForm.time_type == 1">
  171. <span>
  172. 虚拟积分
  173. </span>
  174. <el-input style="width: 150px;" onInput="value = toNumber(value, 2)" v-model="ruleForm.virtual_award">
  175. <template slot="append">积分</template>
  176. </el-input>
  177. </template>
  178. <!-- <template v-if="ruleForm.time_type == 1">-->
  179. <!-- <span>-->
  180. <!-- 总奖金重置值-->
  181. <!-- <el-tooltip class="" effect="dark" content="每日凌晨将会覆盖每日总奖金" placement="top">-->
  182. <!-- <i class="el-icon-question"></i>-->
  183. <!-- </el-tooltip>-->
  184. <!-- </span>-->
  185. <!-- <el-input style="width: 150px;" onInput="value = toNumber(value, 2)" v-model="ruleForm.day_award">-->
  186. <!-- <template slot="append">元</template>-->
  187. <!-- </el-input>-->
  188. <!-- </template>-->
  189. </div>
  190. <div>
  191. <span>第一次抢{{ integral_name }}数额在</span>
  192. <el-input style="width: 150px;" onInput="value = toNumber(value, 2)" v-model="ruleForm.rule_data.first_integral_start">
  193. <template slot="append">积分</template>
  194. </el-input>
  195. <span>和</span>
  196. <el-input style="width: 150px;" onInput="value = toNumber(value, 2)" v-model="ruleForm.rule_data.first_integral_end">
  197. <template slot="append">积分</template>
  198. </el-input>之间,<br>
  199. <span>每日邀请</span>
  200. <el-input style="width: 150px;" onInput="value = toNumber(value)" v-model="ruleForm.rule_data.everyday_invitation">
  201. <template slot="append">人</template>
  202. </el-input>,
  203. <span>可抢{{ integral_name }}一次,单次积分在</span>
  204. <el-input style="width: 150px;" onInput="value = toNumber(value, 2)" v-model="ruleForm.rule_data.everyday_invitation_start">
  205. <template slot="append">积分</template>
  206. </el-input>
  207. <span>和</span>
  208. <el-input style="width: 150px;" onInput="value = toNumber(value, 2)" v-model="ruleForm.rule_data.everyday_invitation_end">
  209. <template slot="append">积分</template>
  210. </el-input>之间,<br>
  211. <span>每日活动最多抢</span>
  212. <el-input style="width: 150px;" onInput="value = toNumber(value)" v-model="ruleForm.rule_data.times">
  213. <template slot="append">次</template>
  214. </el-input>
  215. </div>
  216. </div>
  217. </div>
  218. </el-form-item>
  219. <el-form-item style="width: 1600px;" label="参与权限:" prop="limit_user_level">
  220. <el-checkbox class="check-all" v-model="checkAll"
  221. @change="handleCheckAllChange">全选
  222. </el-checkbox>
  223. <el-checkbox-group class="checkbox-item" v-model="ruleForm.limit_user_level" @change="handleCheckedCitiesChange">
  224. <el-checkbox v-for="item in limit_user_level_list" :label="item.level" :key="item.id">
  225. {{item.name}}
  226. </el-checkbox>
  227. </el-checkbox-group>
  228. </el-form-item>
  229. <el-form-item label-width="150px" label="规则说明:">
  230. <el-col :span="12">
  231. <com-rich-text style="width: 800px;" :simple-attachment="true" v-model="ruleForm.rule"></com-rich-text>
  232. </el-col>
  233. </el-form-item>
  234. </el-col>
  235. </el-row>
  236. </el-form>
  237. </div>
  238. <el-button class="button-item" :loading="btnLoading" type="primary" @click="store('ruleForm')" size="small">保存
  239. </el-button>
  240. </el-card>
  241. </div>
  242. <script>
  243. const app = new Vue({
  244. el: '#app',
  245. data() {
  246. var validatePass = (rule, value, callback) => {
  247. var reg = /^[\u4e00-\u9fa5\w]+$/;
  248. if (reg.test(value)) {
  249. callback();
  250. }else{
  251. callback(new Error('不能含有特殊字符'));
  252. }
  253. };
  254. return {
  255. btnLoading: false,
  256. cardLoading: false,
  257. isIndeterminate:false,
  258. checkAll:false,
  259. time_type_time: ['09:00:00', '18:00:00'],
  260. // time_slot:[],
  261. // time_type_time: null,
  262. ruleForm: {
  263. id:'',
  264. title: '',
  265. description:'',
  266. cover: '',
  267. time_type: 1,
  268. time_type_time: new Date(),
  269. time_slot:[],
  270. time_type_start_time:'',
  271. time_type_end_time:'',
  272. start_time: '',
  273. end_time: '',
  274. integral_type: 1,
  275. award: 1,
  276. virtual_award: 0,
  277. day_award: '',
  278. rule_data:{
  279. first_integral_start: 0.3, //第一次抢红包金额最小值
  280. first_integral_end:0.6, //第一次抢红包金额最大值
  281. everyday_invitation: 3, //每日邀请人数
  282. everyday_invitation_start: 0.3, //每日邀请人数可抢红包一次,单次金额在最小值
  283. everyday_invitation_end: 0.6, //每日邀请人数可抢红包一次,单次金额在最大值
  284. times: 3, //每日活动最多抢次数
  285. },
  286. rule: '',
  287. limit_user_level:[],
  288. },
  289. limit_user_level_list:[],
  290. integral_name:'积分',
  291. rules: {
  292. time_type: [{
  293. required: true,
  294. message: '活动时间活动时间',
  295. trigger: 'change'
  296. }, ],
  297. title: [{
  298. required: true,
  299. message: '请填写活动名称',
  300. trigger: 'change'
  301. },
  302. {
  303. validator: (rule, value, callback) => {
  304. if(value.length>20||value.length<0){
  305. callback('最大长度在1-20个字内');
  306. }
  307. callback();
  308. }
  309. },
  310. {
  311. validator:validatePass,
  312. trigger: 'blur'
  313. },
  314. ],
  315. description:[
  316. { min: 0, max: 20, message: '长度在 0 到 20 个字内', trigger: 'blur' }
  317. ],
  318. integral_type: [{
  319. required: true,
  320. message: '类型是必选',
  321. trigger: 'change'
  322. }, ],
  323. rule_data: [{
  324. required: true,
  325. message: '规则必须选择',
  326. trigger: 'change'
  327. },],
  328. limit_user_level: [{
  329. required: true,
  330. message: '参与权限是必选',
  331. trigger: 'blur'
  332. },],
  333. },
  334. checkedCities:[],
  335. dialogAddgsVisible: false,
  336. // 对话框显示与否
  337. dialogVisible: false,
  338. dataloading: false,
  339. addGroupVisible: false,
  340. };
  341. },
  342. methods: {
  343. updateTime(val){
  344. if(val){
  345. this.ruleForm.start_at = parseInt(val[0].getTime() / 1000);
  346. this.ruleForm.end_at = parseInt(val[1].getTime() / 1000);
  347. } else {
  348. this.ruleForm.start_at = "";
  349. this.ruleForm.end_at = "";
  350. }
  351. },
  352. // 每日红包时间范围选择处理
  353. timeTypeChange(e) {
  354. console.log(e, 'e ======== ');
  355. if (e) {
  356. this.ruleForm.time_type_start_time = e[0];
  357. this.ruleForm.time_type_end_time = e[1];
  358. } else {
  359. this.ruleForm.time_type_start_time = '';
  360. this.ruleForm.time_type_end_time = '';
  361. }
  362. },
  363. // 全选事件
  364. handleCheckAllChange(val) {
  365. // console.log(val, 'handleCheckAllChange =============');
  366. let self = this;
  367. self.ruleForm.limit_user_level = [];
  368. if (val) {
  369. self.limit_user_level_list.forEach(function (item, index) {
  370. self.ruleForm.limit_user_level.push(item.level)
  371. });
  372. }
  373. this.checkAll = val;
  374. console.log(self.ruleForm.limit_user_level,77);
  375. self.isIndeterminate = false;
  376. },
  377. // 单选事件
  378. handleCheckedCitiesChange(value) {
  379. let checkedCount = value.length;
  380. this.checkAll = checkedCount === this.limit_user_level_list.length;
  381. this.isIndeterminate = checkedCount > 0 && checkedCount < this.limit_user_level_list.length;
  382. },
  383. error_msg(){
  384. if(!this.ruleForm.rule_data.first_integral_end){
  385. this.$message.error('第一次抢'+this.integral_name+'积分最大值不可以为空');
  386. return false;
  387. }
  388. if(parseFloat(this.ruleForm.rule_data.first_integral_start) > parseFloat(this.ruleForm.rule_data.first_integral_end)){
  389. this.$message.error('第一次抢'+this.integral_name+'积分最小值不能大于最大值');
  390. return false;
  391. }
  392. if(!this.ruleForm.rule_data.everyday_invitation_start){
  393. this.$message.error('每日邀请'+this.integral_name+'积分最小值不能为空');
  394. return false;
  395. }
  396. if(!this.ruleForm.rule_data.everyday_invitation_end){
  397. this.$message.error('每日邀请'+this.integral_name+'积分最大值不能为空');
  398. return false;
  399. }
  400. if(parseFloat(this.ruleForm.rule_data.everyday_invitation_start) > parseFloat(this.ruleForm.rule_data.everyday_invitation_end)){
  401. this.$message.error('每日邀请'+this.integral_name+'积分最小值不能大于最大值');
  402. return false;
  403. }
  404. if(this.ruleForm.time_type ==1){
  405. this.ruleForm.day_award = this.ruleForm.award
  406. }
  407. if(this.ruleForm.time_type ==1 && this.ruleForm.time_type_end_time && this.ruleForm.time_type_start_time){
  408. this.$set(this.ruleForm,'time_type_time',[this.ruleForm.time_type_start_time,this.ruleForm.time_type_end_time]);
  409. var start_time = new Date(this.ruleForm.time_type_start_time).getTime();
  410. var end_time = new Date(this.ruleForm.time_type_end_time).getTime();
  411. if(start_time > end_time){
  412. this.$message.error('活动时间开始时间不能小于结束时间');
  413. return false;
  414. }
  415. }
  416. if(this.ruleForm.time_type == 1 && this.time_type_time.length < 1){
  417. this.$message.error('活动时间开始时间和结束时间是必须选择');
  418. return false;
  419. }
  420. if(!this.ruleForm.time_type_time){
  421. this.$message.error('活动时间必须选择');
  422. return false;
  423. }
  424. if(this.ruleForm.integral_type !=1){
  425. if(!parseFloat(this.ruleForm.award)){
  426. this.$message.error('每日总积分必须填');
  427. return false;
  428. }
  429. }
  430. // if(this.ruleForm.integral_type !=1){
  431. // if(!parseFloat(this.ruleForm.day_award)){
  432. // this.$message.error('每日总积分必须填');
  433. // return false;
  434. // }
  435. //
  436. // }
  437. if(!this.ruleForm.rule_data.everyday_invitation){
  438. this.$message.error('每日邀请人数必须填');
  439. return false;
  440. }
  441. if(!this.ruleForm.rule_data.times){
  442. this.$message.error('每日活动最多抢次数必须填');
  443. return false;
  444. }
  445. if(this.ruleForm.rule_data.times < 1){
  446. this.$message.error('每日活动最多抢次数最小值为1');
  447. return false;
  448. }
  449. if(this.ruleForm.limit_user_level.length<1){
  450. this.$message.error('参与权限必须选择');
  451. return false;
  452. }
  453. return true;
  454. },
  455. store(formName) {
  456. this.ruleForm.time_type_time = this.time_type_time
  457. if(!this.error_msg()) return false;
  458. this.$refs[formName].validate((valid) => {
  459. let self = this;
  460. if (valid) {
  461. self.btnLoading = true;
  462. request({
  463. params: {
  464. r: 'score-expansion/default/edit',
  465. },
  466. method: 'post',
  467. data: self.ruleForm,
  468. }).then(e => {
  469. self.btnLoading = false;
  470. if (e.data.code == 0) {
  471. navigateTo({
  472. r: 'score-expansion/default/index',
  473. })
  474. } else {
  475. self.$message.error(e.data.msg);
  476. }
  477. }).catch(e => {
  478. self.$message.error(e.data.msg);
  479. self.btnLoading = false;
  480. });
  481. } else {
  482. console.log('error submit!!');
  483. return false;
  484. }
  485. });
  486. },
  487. getDetail() {
  488. let self = this;
  489. //self.cardLoading = true;
  490. request({
  491. params: {
  492. r: 'score-expansion/default/edit',
  493. id: getQuery('id'),
  494. type: getQuery('type')
  495. },
  496. method: 'get',
  497. }).then(e => {
  498. self.cardLoading = false;
  499. if (e.data.code == 0) {
  500. //this.ruleForm.limit_user_level_list = e.data.data.limit_user_level_list;
  501. // console.log(this.time_type_time, ' ====== 111111 ============');
  502. if(!isEmpty(e.data.data.detail)) this.ruleForm = e.data.data.detail;
  503. if(!isEmpty(e.data.data.limit_user_level_list)) this.limit_user_level_list = e.data.data.limit_user_level_list;
  504. if(this.ruleForm.start_time && this.ruleForm.end_time){
  505. this.$set(this.ruleForm,'time_type_time',[this.ruleForm.start_time,this.ruleForm.end_time]);
  506. if(this.ruleForm.time_type == 1){
  507. this.$set(this.ruleForm,'time_type_end_time',this.ruleForm.end_time);
  508. this.$set(this.ruleForm,'time_type_start_time',this.ruleForm.start_time);
  509. this.time_type_time = [];
  510. this.time_type_time.push(this.ruleForm.start_time);
  511. this.time_type_time.push(this.ruleForm.end_time);
  512. }
  513. if(this.ruleForm.time_type == 2){
  514. // this.time_slot = [];
  515. // this.time_slot.push(this.ruleForm.start_time);
  516. // this.time_slot.push(this.ruleForm.end_time);
  517. this.$set(this.ruleForm, 'time_slot', [this.ruleForm.start_time, this.ruleForm.end_time])
  518. console.log(this.time_slot)
  519. }
  520. }
  521. if(!e.data.data.detail || isEmpty(e.data.data.detail.limit_user_level)) {
  522. this.ruleForm.limit_user_level = [];
  523. }else{
  524. this.checkAll = this.ruleForm.limit_user_level.length === this.limit_user_level_list.length;
  525. this.ruleForm.limit_user_level = e.data.data.detail.limit_user_level
  526. }
  527. console.log(this.ruleForm, ' ====== 222222 ============');
  528. this.integral_name = e.data.data.integral_name
  529. if(isEmpty(e.data.data.detail)) this.handleCheckAllChange(true);
  530. } else {
  531. self.$message.error(e.data.msg);
  532. }
  533. }).catch(e => {
  534. console.log(e);
  535. });
  536. },
  537. /**
  538. *关闭或取消模态框,清空值
  539. * @param
  540. */
  541. closeDialogAddgsVisible() {
  542. this.$refs.addForm.resetFields(); //element封装的方法,清空模态框的值
  543. this.addFormTitle = "" //初始化title的值
  544. this.addForm = { //初始化addForm中的值
  545. name: "",
  546. }
  547. },
  548. },
  549. mounted: function() {
  550. this.getDetail();
  551. }
  552. });
  553. </script>