add.blade.php 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  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.Store.controllers.card.edit') !!}"
  262. }
  263. else {
  264. this.submit_url = "{!! yzWebFullUrl('plugin.customer-development.Backend.Store.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. this.form[name][this.chooseIndex]['img_url'] = image;
  322. this.form[name][this.chooseIndex]['full_img_url'] = img_url;
  323. // if(this.type==1) {
  324. // console.log('1');
  325. // this.form[name][this.chooseIndex]['img_url'] = image;
  326. // this.form[name][this.chooseIndex]['full_img_url'] = img_url;
  327. // }
  328. // else {
  329. // console.log('0');
  330. // this.form[name] = image;
  331. // this.form[name+'_url'] = img_url;
  332. // }
  333. },
  334. clearImg(str,index,type) {
  335. if(!type) {
  336. this.form[str] = "";
  337. this.form['full_'+str] = "";
  338. }
  339. else if(type==1){
  340. this.form[str][index].full_img_url = '';
  341. this.form[str][index].img_url = '';
  342. }
  343. this.$forceUpdate();
  344. },
  345. submitForm(formName) {
  346. let that = this;
  347. let is_true = false
  348. this.form.once_goods.some((item,index) => {
  349. for(let i in item) {
  350. if(!item[i]) {
  351. is_true = true
  352. let name = ''
  353. switch (i) {
  354. case 'name':
  355. name='名称'
  356. break;
  357. case 'img_url':
  358. name='图片'
  359. break;
  360. case 'quantity':
  361. name='数量'
  362. break;
  363. case 'price':
  364. name='单价'
  365. break;
  366. default:
  367. break;
  368. }
  369. console.log(name)
  370. this.$message.error('一次性消费套餐 第'+(index+1)+ '行 '+name+ ' 不能为空')
  371. break;
  372. }
  373. //
  374. }
  375. if(is_true) {
  376. return true;
  377. }
  378. })
  379. this.form.many_goods.some((item,index) => {
  380. for(let i in item) {
  381. if(!item[i]) {
  382. is_true = true
  383. let name = ''
  384. switch (i) {
  385. case 'name':
  386. name='名称'
  387. break;
  388. case 'img_url':
  389. name='图片'
  390. break;
  391. case 'quantity':
  392. name='数量'
  393. break;
  394. case 'price':
  395. name='单价'
  396. break;
  397. case 'single_consumption':
  398. name='单次消费数量'
  399. break;
  400. default:
  401. break;
  402. }
  403. console.log(name)
  404. this.$message.error('多次消费套餐 第'+(index+1)+ '行 '+name+ ' 不能为空')
  405. break;
  406. }
  407. //
  408. }
  409. if(is_true) {
  410. return true;
  411. }
  412. })
  413. if(is_true) {
  414. return false
  415. }
  416. console.log(this.form)
  417. let json = {
  418. goods_id:this.form.goods_id,
  419. effective_time:this.form.effective_time,
  420. time_interval:this.form.time_interval,
  421. effective_day:this.form.effective_day || 0,
  422. once_goods:[],
  423. many_goods:[]
  424. };
  425. this.form.once_goods.forEach((item,index) => {
  426. json.once_goods.push(
  427. {img_url:item.img_url,name:item.name,quantity:item.quantity,price:item.price}
  428. )
  429. })
  430. this.form.many_goods.forEach((item,index) => {
  431. json.many_goods.push(
  432. {img_url:item.img_url,name:item.name,quantity:item.quantity,single_consumption:item.single_consumption,price:item.price}
  433. )
  434. })
  435. let json1 = {
  436. data:json
  437. };
  438. if(this.id) {
  439. json1.id = this.id
  440. }
  441. this.$refs[formName].validate((valid) => {
  442. if (valid) {
  443. let loading = this.$loading({target:document.querySelector(".content"),background: 'rgba(0, 0, 0, 0)'});
  444. this.$http.post(this.submit_url,json1).then(response => {
  445. if (response.data.result) {
  446. this.$message({type: 'success',message: '操作成功!'});
  447. this.goBack();
  448. } else {
  449. this.$message({message: response.data.msg,type: 'error'});
  450. }
  451. loading.close();
  452. },response => {
  453. loading.close();
  454. });
  455. }
  456. else {
  457. console.log('error submit!!');
  458. return false;
  459. }
  460. });
  461. },
  462. openGoods() {
  463. if(this.id) {
  464. this.$message.error('不支持修改商品')
  465. return;
  466. }
  467. this.goods_show = true;
  468. this.choosed_goods_id = this.form.goods_id;
  469. },
  470. changeGoods(val,val1) {
  471. console.log(val,val1)
  472. },
  473. searchGoods() {
  474. let loading = this.$loading({target:document.querySelector("#goods-list"),background: 'rgba(0, 0, 0, 0)'});
  475. this.$http.post("{!! yzWebFullUrl('plugin.customer-development.Backend.Store.controllers.card.get-goods') !!}",{keyword:this.search_goods.goods_name}).then(response => {
  476. if(response.data.result == 1) {
  477. if (response.data.result) {
  478. this.goods_list = response.data.data;
  479. // this.goods_total = response.data.data.goods.total;
  480. // this.goods_current_page = response.data.data.goods.current_page;
  481. // this.goods_per_page = response.data.data.goods.per_page;
  482. this.goods_list.forEach((item,index) => {
  483. if(item.title) {
  484. item.title = this.escapeHTML(item.title);
  485. }
  486. });
  487. } else {
  488. this.$message({message: response.data.msg,type: 'error'});
  489. }
  490. }
  491. else {
  492. this.$message.error(response.data.msg)
  493. }
  494. loading.close();
  495. }, response => {
  496. console.log(response);
  497. loading.close();
  498. });
  499. },
  500. sureGoods() {
  501. this.form.goods_id = this.choosed_goods_id;
  502. this.choosed_goods = {};
  503. let obj = this.goods_list.find((item,index) => {
  504. return item.id == this.choosed_goods_id;
  505. })
  506. this.choosed_goods = obj;
  507. console.log(this.choosed_goods);
  508. this.goods_show = false;
  509. },
  510. clearGoods() {
  511. if(this.id) {
  512. this.$message.error('不支持修改商品')
  513. return;
  514. }
  515. this.choosed_goods = {}
  516. this.form.goods_id = '';
  517. },
  518. isNumber(index,type,key) {
  519. console.log(this.form[key][index][type])
  520. if(type=='quantity'){
  521. this.form[key][index][type] = this.form[key][index][type].replace(/[^\d]/g,'')
  522. }
  523. else if(type=='single_consumption'){
  524. this.form[key][index][type] = this.form[key][index][type].replace(/[^\d]/g,'')
  525. }
  526. else if(type=='price') {
  527. this.form[key][index][type] = this.form[key][index][type].replace(/[^\d.]/g,'')
  528. this.form[key][index][type] = this.form[key][index][type].replace(/\.{2,}/g, ".");
  529. this.form[key][index][type] = this.form[key][index][type].replace(".", "$#$").replace(/\./g, "").replace("$#$", ".");
  530. }
  531. },
  532. // 字符转义
  533. escapeHTML(a) {
  534. a = "" + a;
  535. return a.replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, "\"").replace(/&apos;/g, "'");;
  536. },
  537. goBack() {
  538. history.go(-1)
  539. },
  540. },
  541. })
  542. </script>
  543. <script>
  544. // 屏蔽回车事件
  545. window.onload = function (){
  546. document.body.onkeydown=function(event){
  547. if(event.keyCode==13){
  548. event.keyCod=0; return false;
  549. }
  550. }
  551. };
  552. </script>
  553. @endsection