add.blade.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561
  1. @extends('layouts.base')
  2. @section('title', '拓客卡设置')
  3. @section('content')
  4. <link rel="stylesheet" type="text/css" href="{{static_url('yunshop/goods/vue-goods1.css')}}"/>
  5. <style>
  6. .upload-boxed {
  7. width: 150px;
  8. height: 150px;
  9. position: relative;
  10. border-radius: 5px;
  11. display: inline-block;
  12. }
  13. .add-list {border: 1px dashed #dde2ee;margin:15px 30px;text-align: center;cursor: pointer;}
  14. .add-list:hover{color:#29BA9C;border-color:#29BA9C}
  15. .add-list1 {border: 1px dashed #dde2ee;margin:15px 0px;text-align: center;cursor: pointer;width:70%}
  16. .add-list1:hover{color:#29BA9C;border-color:#29BA9C}
  17. </style>
  18. <div class="all">
  19. <div id="app" v-cloak>
  20. <div class="vue-main">
  21. <div class="vue-">
  22. </div>
  23. <div class="vue-main-title">
  24. <div class="vue-main-title-left"></div>
  25. <div class="vue-main-title-content">拓客卡编辑</div>
  26. </div>
  27. <div class="vue-main-form">
  28. <el-form ref="form" :model="form" :rules="rules" label-width="15%">
  29. <el-form-item label="购买商品" prop="goods_id">
  30. <div class="upload-box" @click="openGoods('goods_id')" v-if="!form.goods_id">
  31. <div>
  32. <i class="el-icon-plus" style="font-size:32px"></i>
  33. </div>
  34. <div>选择商品</div>
  35. </div>
  36. <div @click="openGoods('goods_id')" class="upload-boxed" v-if="form.goods_id" style="height:150px">
  37. <el-image :src="choosed_goods.thumb" alt="" style="width:150px;height:150px;border-radius: 5px;cursor: pointer;"></el-image>
  38. <div class="upload-boxed-text">重新选择</div>
  39. <div style="position: absolute;top: -3px;right: -3px;background: #333;line-height: 15px;color: #fff;border-radius: 50%;width: 14px;">
  40. <i class="el-icon-close" @click.stop="clearGoods('goods_id')" title="点击清除商品"></i>
  41. </div>
  42. <div style="line-height: 18px;font-weight:500;color:#333;text-overflow: -o-ellipsis-lastline;overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 2;line-clamp: 2;-webkit-box-orient: vertical;">【id:[[choosed_goods.id]]】[[choosed_goods.title]]</div>
  43. </div>
  44. </el-form-item>
  45. <el-form-item label="核销日期" prop="effective_time">
  46. <el-input v-model="form.effective_time" placeholder="请输入核销日期" style="width:70%">
  47. <template slot="prepend">获取后</template>
  48. <template slot="append">天内有效(0为不限时间使用)</template>
  49. </el-input>
  50. </el-form-item>
  51. <el-form-item label="核销时间段" prop="is_recommend">
  52. <div v-for="(item,index) in form.time_interval" :key="index" style="margin-bottom:10px">
  53. <el-time-picker v-model="item.start" format="HH:mm" value-format="HH:mm" placeholder="请选择开始时间" style="width:35%"></el-time-picker>
  54. <el-time-picker v-model="item.end" format="HH:mm" value-format="HH:mm" placeholder="请选择结束时间" style="width:35%"></el-time-picker>
  55. <el-button type="primary" icon="el-icon-plus" circle size="mini" @click="addTime(index)"></el-button>
  56. <el-button type="primary" icon="el-icon-minus" circle size="mini" @click="delTime(index)"></el-button>
  57. </div>
  58. <div class="add-list1" @click="addTime(form.time_interval.length-1)">
  59. <i class="el-icon-plus" style="font-size:25px;line-height:42px"></i>
  60. </div>
  61. </el-form-item>
  62. <el-form-item label="" prop="effective_day">
  63. <el-checkbox-group v-model="form.effective_day">
  64. <el-checkbox :label="1">星期一</el-checkbox>
  65. <el-checkbox :label="2">星期二</el-checkbox>
  66. <el-checkbox :label="3">星期三</el-checkbox>
  67. <el-checkbox :label="4">星期四</el-checkbox>
  68. <el-checkbox :label="5">星期五</el-checkbox>
  69. <el-checkbox :label="6">星期六</el-checkbox>
  70. <el-checkbox :label="7">星期日</el-checkbox>
  71. </el-checkbox-group>
  72. </el-form-item>
  73. <el-form-item label="一次性消费套餐" prop="is_recommend">
  74. <div style="width:70%;border:1px solid #d8d8d8;border-radius:5px;padding:0 5px">
  75. <div class="head" style="background:#fafafa;line-height:32px;display:flex;text-align:center">
  76. <div style="width:8%">图片</div>
  77. <div style="width:32%">名称</div>
  78. <div style="width:18%">数量</div>
  79. <div style="width:18%">单价(元)</div>
  80. <div style="width:18%">总价(元)</div>
  81. <div style="width:6%">操作</div>
  82. </div>
  83. <div class="tr-li" v-for="(item,index) in form.once_goods" :key="index" style="display:flex;text-align:center;padding:15px 0">
  84. <div style="width:8%;margin:0 auto">
  85. <div class="upload-box" @click="openUpload('once_goods',index,1)" v-if="!item.full_img_url" style="width:40px;height:40px;display:inline-block">
  86. <i class="el-icon-plus" style="font-size:32px"></i>
  87. </div>
  88. <div @click="openUpload('once_goods',index)" class="upload-boxed" v-if="item.full_img_url" style="width:40px;height:40px">
  89. <img :src="item.full_img_url" alt="" style="width:40px;height:40px;border-radius: 5px;cursor: pointer;">
  90. <i class="el-icon-close" @click.stop="clearImg('once_goods',index,1)" title="点击清除图片"></i>
  91. </div>
  92. </div>
  93. <div style="width:32%">
  94. <el-input v-model="item.name" placeholder="请输入名称" style="width:90%"></el-input>
  95. </div>
  96. <div style="width:18%">
  97. <el-input v-model="item.quantity" placeholder="请输入数字" style="width:90%" @input="isNumber(index,'quantity','once_goods')"></el-input>
  98. </div>
  99. <div style="width:18%">
  100. <el-input v-model="item.price" placeholder="请输入数字" style="width:90%" @input="isNumber(index,'price','once_goods')"></el-input>
  101. </div>
  102. <div style="width:18%">[[Number(item.quantity)*Number(item.price)]]</div>
  103. <div style="width:6%">
  104. <el-button type="primary" icon="el-icon-minus" circle size="mini" @click="delList('once_goods',index)"></el-button>
  105. </div>
  106. </div>
  107. <div class="add-list" @click="addList('once_goods')">
  108. <i class="el-icon-plus" style="font-size:25px;line-height:42px"></i>
  109. </div>
  110. </div>
  111. </el-form-item>
  112. <el-form-item label="多次消费套餐" prop="is_recommend">
  113. <div style="width:70%;border:1px solid #d8d8d8;border-radius:5px;padding:0 5px">
  114. <div class="head" style="background:#fafafa;line-height:32px;display:flex;text-align:center">
  115. <div style="width:6%">图片</div>
  116. <div style="width:24%">名称</div>
  117. <div style="width:16%">数量</div>
  118. <div style="width:16%">单次消费数量</div>
  119. <div style="width:16%">单价(元)</div>
  120. <div style="width:16%">总价(元)</div>
  121. <div style="width:6%">操作</div>
  122. </div>
  123. <div class="tr-li" v-for="(item,index) in form.many_goods" :key="index" style="display: flex;text-align:center;padding:15px 0">
  124. <div style="width:6%;margin:0 auto">
  125. <div class="upload-box" @click="openUpload('many_goods',index,1)" v-if="!item.full_img_url" style="width:40px;height:40px;display:inline-block">
  126. <i class="el-icon-plus" style="font-size:32px"></i>
  127. </div>
  128. <div @click="openUpload('many_goods',index)" class="upload-boxed" v-if="item.full_img_url" style="width:40px;height:40px">
  129. <img :src="item.full_img_url" alt="" style="width:40px;height:40px;border-radius: 5px;cursor: pointer;">
  130. <i class="el-icon-close" @click.stop="clearImg('many_goods',index,1)" title="点击清除图片"></i>
  131. </div>
  132. </div>
  133. <div style="width:24%">
  134. <el-input v-model="item.name" placeholder="请输入名称" style="width:90%"></el-input>
  135. </div>
  136. <div style="width:16%">
  137. <el-input v-model="item.quantity" placeholder="请输入数字" style="width:90%" @input="isNumber(index,'quantity','many_goods')"></el-input>
  138. </div>
  139. <div style="width:16%">
  140. <el-input v-model="item.single_consumption" placeholder="请输入数字" style="width:90%" @input="isNumber(index,'single_consumption','many_goods')"></el-input>
  141. </div>
  142. <div style="width:16%">
  143. <el-input v-model="item.price" placeholder="请输入数字" style="width:90%" @input="isNumber(index,'price','many_goods')"></el-input>
  144. </div>
  145. <div style="width:16%">[[Number(item.quantity)*Number(item.price)]]</div>
  146. <div style="width:6%">
  147. <el-button type="primary" icon="el-icon-minus" circle size="mini" @click="delList('many_goods',index)"></el-button>
  148. </div>
  149. </div>
  150. <div class="add-list" @click="addList('many_goods')">
  151. <i class="el-icon-plus" style="font-size:25px;line-height:42px"></i>
  152. </div>
  153. </div>
  154. </el-form-item>
  155. </el-form>
  156. </div>
  157. </div>
  158. <!--弹框商品图片-->
  159. <el-dialog :visible.sync="goods_show" width="60%" center title="选择商品">
  160. <div>
  161. <div>
  162. <el-form :inline="true" :model="search_goods" class="demo-form-inline">
  163. <!-- <el-form-item label="">
  164. <el-input v-model="search_goods.goods_id" placeholder="商品ID"></el-input>
  165. </el-form-item> -->
  166. <el-form-item label="">
  167. <el-input v-model="search_goods.goods_name" placeholder="商品标题"></el-input>
  168. </el-form-item>
  169. <el-form-item label="">
  170. <el-button type="primary" @click="searchGoods(1)">搜索</el-button>
  171. </el-form-item>
  172. </el-form>
  173. </div>
  174. <el-table :data="goods_list" style="width: 100%;height:500px;overflow:auto" id="goods-list">
  175. <el-table-column label="ID" prop="id" align="center" width="150px">
  176. <template slot-scope="scope">
  177. <el-radio v-model="choosed_goods_id" :label="scope.row.id">&nbsp;</el-radio>
  178. </template>
  179. </el-table-column>
  180. <el-table-column label="商品ID" prop="id" align="center" width="150px"></el-table-column>
  181. <el-table-column label="商品">
  182. <template slot-scope="scope">
  183. <div style="display:flex;align-items: center">
  184. <div style="margin-right:10px">
  185. <el-image :src="scope.row.thumb" style="width:50px;height:50px"></el-image>
  186. </div>
  187. <div style="flex:1">
  188. <div style="color:#333;font-weight:500">[[scope.row.title]]</div>
  189. </div>
  190. </div>
  191. </template>
  192. </el-table-column>
  193. </el-table>
  194. </div>
  195. <span slot="footer" class="dialog-footer">
  196. <el-button @click="goods_show = false">取 消</el-button>
  197. <el-button type="primary" @click="sureGoods">确 定 </el-button>
  198. </span>
  199. </el-dialog>
  200. <!--end-->
  201. <!-- 分页 -->
  202. <div class="vue-page">
  203. <div class="vue-center">
  204. <el-button type="primary" @click="submitForm('form')">提交</el-button>
  205. <el-button @click="goBack">返回</el-button>
  206. </div>
  207. </div>
  208. <upload-img :upload-show="uploadShow" :name="chooseImgName" @replace="changeProp" @sure="sureImg"></upload-img>
  209. </div>
  210. </div>
  211. @include('public.admin.uploadImg')
  212. <script>
  213. let card = {!! $card?:'{}' !!}
  214. let once_arr = {!! $once_arr?:'{}' !!}
  215. let many_arr = {!! $many_arr?:'[]' !!}
  216. let id = card.goods_id || 0
  217. console.log(card)
  218. console.log(once_arr)
  219. console.log(many_arr)
  220. var app = new Vue({
  221. el:"#app",
  222. delimiters: ['[[', ']]'],
  223. name: 'test',
  224. data() {
  225. return{
  226. form:{
  227. effective_time:'',
  228. time_interval:[
  229. // {start:'',end:''}
  230. ],
  231. effective_day:[],
  232. once_goods:[
  233. // {img_url:'',name:'',quantity:'1',price:'1'}
  234. ],
  235. many_goods:[
  236. // {img_url:'',name:'',single_consumption:'1',quantity:'1',price:'1'}
  237. ],
  238. },
  239. id:id,
  240. submit_url:'',
  241. uploadShow:false,
  242. chooseImgName:'',
  243. chooseIndex:-1,
  244. type:0,
  245. goods_show:false,
  246. goods_list:[],
  247. search_goods:{},
  248. choosed_goods:{},
  249. choosed_goods_id:'',
  250. goods_total:1,
  251. goods_current_page:1,
  252. goods_per_page:1,
  253. rules:{
  254. name:{ required: true, message: '请输入品牌名称'}
  255. },
  256. }
  257. },
  258. created() {
  259. if(this.id) {
  260. this.setData();
  261. this.submit_url = "{!! yzWebFullUrl('plugin.customer-development.Backend.Admin.controllers.card.edit') !!}"
  262. }
  263. else {
  264. this.submit_url = "{!! yzWebFullUrl('plugin.customer-development.Backend.Admin.controllers.card.add') !!}"
  265. }
  266. },
  267. mounted() {
  268. },
  269. methods: {
  270. setData() {
  271. this.form.time_interval = card.time_interval || [];
  272. this.form.effective_day = card.effective_day || [];
  273. this.form.goods_id = card.goods_id;
  274. this.form.effective_time = card.effective_time;
  275. this.form.once_goods = [];
  276. this.form.many_goods = [];
  277. once_arr.forEach((item,index) => {
  278. this.form.once_goods.push(
  279. {full_img_url:item.full_img_url,img_url:item.img_url,name:item.name,quantity:item.quantity,price:item.price}
  280. )
  281. })
  282. many_arr.forEach((item,index) => {
  283. this.form.many_goods.push(
  284. {full_img_url:item.full_img_url,img_url:item.img_url,name:item.name,quantity:item.quantity,price:item.price,single_consumption:item.single_consumption}
  285. )
  286. })
  287. this.choosed_goods = card.goods
  288. },
  289. addTime(index) {
  290. this.form.time_interval.splice(index+1,0,{start:'',end:''})
  291. },
  292. delTime(index) {
  293. this.form.time_interval.splice(index,1)
  294. },
  295. addList(type) {
  296. if(type=='once_goods') {
  297. this.form[type].push({img_url:'',name:'',quantity:'1',price:'1'})
  298. }
  299. else if(type=='many_goods') {
  300. this.form[type].push({img_url:'',name:'',quantity:'1',single_consumption:'1',price:'1'})
  301. }
  302. },
  303. delList(type,index) {
  304. this.form[type].splice(index,1)
  305. },
  306. openUpload(str,index,type) {
  307. this.chooseImgName = str;
  308. this.uploadShow = true;
  309. this.chooseIndex = index;
  310. this.type = type;
  311. },
  312. changeProp(val) {
  313. if(val == true) {
  314. this.uploadShow = false;
  315. }
  316. else {
  317. this.uploadShow = true;
  318. }
  319. },
  320. sureImg(name,image,img_url) {
  321. if(this.type==1) {
  322. this.form[name][this.chooseIndex]['img_url'] = image;
  323. this.form[name][this.chooseIndex]['full_img_url'] = img_url;
  324. }
  325. else {
  326. this.form[name] = image;
  327. this.form[name+'_url'] = img_url;
  328. }
  329. },
  330. clearImg(str,index,type) {
  331. if(!type) {
  332. this.form[str] = "";
  333. this.form['full_'+str] = "";
  334. }
  335. else if(type==1){
  336. this.form[str][index].full_img_url = '';
  337. this.form[str][index].img_url = '';
  338. }
  339. this.$forceUpdate();
  340. },
  341. submitForm(formName) {
  342. console.log(this.form)
  343. let that = this;
  344. let is_true = false
  345. this.form.once_goods.some((item,index) => {
  346. for(let i in item) {
  347. if(!item[i]) {
  348. is_true = true
  349. let name = ''
  350. switch (i) {
  351. case 'name':
  352. name='名称'
  353. break;
  354. case 'img_url':
  355. name='图片'
  356. break;
  357. case 'quantity':
  358. name='数量'
  359. break;
  360. case 'price':
  361. name='单价'
  362. break;
  363. default:
  364. break;
  365. }
  366. console.log(name)
  367. this.$message.error('一次性消费套餐 第'+(index+1)+ '行 '+name+ ' 不能为空')
  368. break;
  369. }
  370. //
  371. }
  372. if(is_true) {
  373. return true;
  374. }
  375. })
  376. this.form.many_goods.some((item,index) => {
  377. for(let i in item) {
  378. if(!item[i]) {
  379. is_true = true
  380. let name = ''
  381. switch (i) {
  382. case 'name':
  383. name='名称'
  384. break;
  385. case 'img_url':
  386. name='图片'
  387. break;
  388. case 'quantity':
  389. name='数量'
  390. break;
  391. case 'price':
  392. name='单价'
  393. break;
  394. case 'single_consumption':
  395. name='单次消费数量'
  396. break;
  397. default:
  398. break;
  399. }
  400. console.log(name)
  401. this.$message.error('多次消费套餐 第'+(index+1)+ '行 '+name+ ' 不能为空')
  402. break;
  403. }
  404. //
  405. }
  406. if(is_true) {
  407. return true;
  408. }
  409. })
  410. if(is_true) {
  411. return
  412. }
  413. console.log(this.form)
  414. let json = {
  415. goods_id:this.form.goods_id,
  416. effective_time:this.form.effective_time,
  417. time_interval:this.form.time_interval,
  418. effective_day:this.form.effective_day || 0,
  419. once_goods:[],
  420. many_goods:[]
  421. };
  422. this.form.once_goods.forEach((item,index) => {
  423. json.once_goods.push(
  424. {img_url:item.img_url,name:item.name,quantity:item.quantity,price:item.price}
  425. )
  426. })
  427. this.form.many_goods.forEach((item,index) => {
  428. json.many_goods.push(
  429. {img_url:item.img_url,name:item.name,quantity:item.quantity,single_consumption:item.single_consumption,price:item.price}
  430. )
  431. })
  432. let json1 = {
  433. data:json
  434. };
  435. if(this.id) {
  436. json1.id = this.id
  437. }
  438. this.$refs[formName].validate((valid) => {
  439. if (valid) {
  440. let loading = this.$loading({target:document.querySelector(".content"),background: 'rgba(0, 0, 0, 0)'});
  441. this.$http.post(this.submit_url,json1).then(response => {
  442. if (response.data.result) {
  443. this.$message({type: 'success',message: '操作成功!'});
  444. this.goBack();
  445. } else {
  446. this.$message({message: response.data.msg,type: 'error'});
  447. }
  448. loading.close();
  449. },response => {
  450. loading.close();
  451. });
  452. }
  453. else {
  454. console.log('error submit!!');
  455. return false;
  456. }
  457. });
  458. },
  459. openGoods() {
  460. if(this.id) {
  461. this.$message.error('不支持修改商品')
  462. return;
  463. }
  464. this.goods_show = true;
  465. this.choosed_goods_id = this.form.goods_id;
  466. },
  467. changeGoods(val,val1) {
  468. console.log(val,val1)
  469. },
  470. searchGoods() {
  471. let loading = this.$loading({target:document.querySelector("#goods-list"),background: 'rgba(0, 0, 0, 0)'});
  472. this.$http.post("{!! yzWebFullUrl('plugin.customer-development.Backend.Admin.controllers.card.get-goods') !!}",{keyword:this.search_goods.goods_name}).then(response => {
  473. if(response.data.result == 1) {
  474. if (response.data.result) {
  475. this.goods_list = response.data.data;
  476. // this.goods_total = response.data.data.goods.total;
  477. // this.goods_current_page = response.data.data.goods.current_page;
  478. // this.goods_per_page = response.data.data.goods.per_page;
  479. this.goods_list.forEach((item,index) => {
  480. if(item.title) {
  481. item.title = this.escapeHTML(item.title);
  482. }
  483. });
  484. } else {
  485. this.$message({message: response.data.msg,type: 'error'});
  486. }
  487. }
  488. else {
  489. this.$message.error(response.data.msg)
  490. }
  491. loading.close();
  492. }, response => {
  493. console.log(response);
  494. loading.close();
  495. });
  496. },
  497. sureGoods() {
  498. this.form.goods_id = this.choosed_goods_id;
  499. this.choosed_goods = {};
  500. let obj = this.goods_list.find((item,index) => {
  501. return item.id == this.choosed_goods_id;
  502. })
  503. this.choosed_goods = obj;
  504. console.log(this.choosed_goods);
  505. this.goods_show = false;
  506. },
  507. clearGoods() {
  508. if(this.id) {
  509. this.$message.error('不支持修改商品')
  510. return;
  511. }
  512. this.choosed_goods = {}
  513. this.form.goods_id = '';
  514. },
  515. isNumber(index,type,key) {
  516. console.log(this.form[key][index][type])
  517. if(type=='quantity'){
  518. this.form[key][index][type] = this.form[key][index][type].replace(/[^\d]/g,'')
  519. }
  520. else if(type=='single_consumption'){
  521. this.form[key][index][type] = this.form[key][index][type].replace(/[^\d]/g,'')
  522. }
  523. else if(type=='price') {
  524. this.form[key][index][type] = this.form[key][index][type].replace(/[^\d.]/g,'')
  525. this.form[key][index][type] = this.form[key][index][type].replace(/\.{2,}/g, ".");
  526. this.form[key][index][type] = this.form[key][index][type].replace(".", "$#$").replace(/\./g, "").replace("$#$", ".");
  527. }
  528. },
  529. // 字符转义
  530. escapeHTML(a) {
  531. a = "" + a;
  532. return a.replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, "\"").replace(/&apos;/g, "'");;
  533. },
  534. goBack() {
  535. history.go(-1)
  536. },
  537. },
  538. })
  539. </script>
  540. @endsection