combination-add.blade.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. @extends('layouts.base')
  2. @section('title', '新增组合')
  3. @section('content')
  4. <link rel="stylesheet" href="{{resource_get('plugins/blind-box/views/admin/index.css')}}">
  5. <link rel="stylesheet" href="{{static_url('css/public-number.css')}}">
  6. <style>
  7. th {border-bottom: 1px solid #EBEEF5 !important;}
  8. .dialog-cover{z-index:2001}
  9. .dialog-content{z-index:2002}
  10. </style>
  11. <div class="all">
  12. <div id="app" v-cloak>
  13. <div class="vue-crumbs">
  14. <a @click="goParent(1)">盲盒</a>
  15. >
  16. <a @click="goParent(2)">组合管理</a>
  17. >
  18. <a @click="goParent(3)">组合商品</a> > 新增组合
  19. </div>
  20. <el-form ref="form" :model="form" :rules="rules" label-width="15%">
  21. <div class="vue-main">
  22. <div class="vue-main-title">
  23. <div class="vue-main-title-left"></div>
  24. <div class="vue-main-title-content">新增组合</div>
  25. </div>
  26. <div class="vue-main-form">
  27. <el-form-item label="组合名称" prop="combination_name">
  28. <el-input v-model="form.combination_name" style="width:70%;"></el-input>
  29. </el-form-item>
  30. <el-form-item label="组合图片" prop="combination_img">
  31. <div class="upload-box" @click="openUpload('combination_img')" v-if="!form.combination_img_src">
  32. <i class="el-icon-plus" style="font-size:32px"></i>
  33. </div>
  34. <div @click="openUpload('combination_img')" class="upload-boxed" v-if="form.combination_img_src" >
  35. <img :src="form.combination_img_src" alt="" style="width:150px;height:150px;border-radius: 5px;cursor: pointer;">
  36. <i class="el-icon-close" @click.stop="clearImg('combination_img')" title="点击清除图片"></i>
  37. <div class="upload-boxed-text">点击重新上传</div>
  38. </div>
  39. <div class="tip">
  40. 建议尺寸560*650
  41. </div>
  42. </el-form-item>
  43. <el-form-item label="零售价" prop="price">
  44. <el-input v-model="form.price" style="width:70%;"></el-input>
  45. </el-form-item>
  46. <el-form-item label="库存" prop="stock">
  47. <el-input v-model="form.stock" style="width:70%;"></el-input>
  48. <div class="tip">
  49. 库存必须小于任何一件单品的库存
  50. </div>
  51. </el-form-item>
  52. <el-form-item label="组合商品" prop="worth">
  53. <div>
  54. <el-button size="mini" type="primary" icon="el-icon-plus" @click="selectGoods">选择商品</el-button>
  55. <div class="tip">
  56. 只能选择商品配送方式同时启用了自提点和配送的商品
  57. </div>
  58. </div>
  59. <!-- 表格start -->
  60. <div style="padding:10px;background:#e9e9e9;width:70%;">
  61. <el-table :data="form.combination_goods" style="width: 100%" v-loading="table_loading">
  62. <el-table-column prop="goods.title" label="商品" min-width="100"></el-table-column>
  63. <el-table-column prop="goods.price" label="现价" min-width="180" align="center"></el-table-column>
  64. <el-table-column prop="goods.stock" label="库存" min-width="180" align="center"></el-table-column>
  65. <el-table-column prop="stock" label="规格" min-width="180" align="center">
  66. <template slot-scope="scope">
  67. <el-select v-model="scope.row.goods_option_id" clearable placeholder="选择规格" v-if="scope.row.goods.has_option" @change="changeOption2(scope.$index)">
  68. <el-option v-for="(item,index) in scope.row.goods.has_many_options" :key="index" :label="item.title" :value="item.id" ></el-option>
  69. </el-select>
  70. <div class="tip" v-if="!scope.row.goods.has_option">
  71. 单规格商品
  72. </div>
  73. </template>
  74. </el-table-column>
  75. <el-table-column label="操作" min-width="80" align="center">
  76. <template slot-scope="scope">
  77. <el-button type="danger" @click="delGoods(scope.$index)">删除</el-button>
  78. </template>
  79. </el-table-column>
  80. </el-table>
  81. </div>
  82. <!-- 表格end -->
  83. </el-form-item>
  84. </div>
  85. </div>
  86. </el-form>
  87. <el-dialog :visible.sync="goods_show" width="60%" center title="选择商品">
  88. <div>
  89. <div style="text-align: center">
  90. <el-input v-model="keyword_type" style="width:80%" placeholder="请输入商品ID搜索"></el-input>
  91. <el-button type="primary" @click="searchGoods()" style="margin-left:20px;">搜索</el-button>
  92. </div>
  93. <el-table :data="goods_list" style="width: 100%;height:600px;overflow-y:auto" >
  94. <el-table-column prop="id" label="ID" align="center"></el-table-column>
  95. <el-table-column prop="id" label="商品信息" align="center">
  96. <template slot-scope="scope">
  97. <div style="display:flex;align-items:center;justify-content:center;">
  98. <img :src="scope.row.thumb_src" alt="" style="width:80px;height: 50px;">
  99. <div style="margin-left:10px">[[scope.row.title]]</div>
  100. </div>
  101. </template>
  102. </el-table-column>
  103. <el-table-column prop="" label="操作" align="center" >
  104. <template slot-scope="scope">
  105. <el-button @click="addGoods(scope.$index)" v-if="!scope.row.has_option">
  106. 选择
  107. </el-button>
  108. <el-select v-model="select_option" clearable placeholder="选择规格" v-if="scope.row.has_option" @change="changeOption(scope.$index)">
  109. <el-option v-for="(item,index) in scope.row.has_many_options" :key="index" :label="item.title" :value="item.id"></el-option>
  110. </el-select>
  111. </template>
  112. </el-table-column>
  113. </el-table>
  114. </div>
  115. </el-dialog>
  116. <!-- 分页 -->
  117. <div class="vue-page">
  118. <div class="vue-center">
  119. <el-button type="primary" @click="submitForm('form')" :disabled="btnChangeEnable">提交</el-button>
  120. <el-button @click="goBack">返回</el-button>
  121. </div>
  122. </div>
  123. <upload-img :upload-show="uploadShow" :name="chooseImgName" @replace="changeProp" @sure="sureImg"></upload-img>
  124. </div>
  125. </div>
  126. @include('public.admin.uploadImg')
  127. <script>
  128. var app = new Vue({
  129. el:"#app",
  130. delimiters: ['[[', ']]'],
  131. name: 'test',
  132. data() {
  133. return{
  134. show:false,//是否开启公众号弹窗
  135. pro:false ,//是否开启小程序弹窗
  136. id:0,
  137. goods_show:false,//选择商品弹窗
  138. keyword_type:"",
  139. goods_list:[],
  140. select_option:"",
  141. form:{
  142. combination_name:"",
  143. combination_img:"",
  144. price:"",
  145. stock:"",
  146. combination_goods:[]
  147. },
  148. btnChangeEnable:false,
  149. uploadShow:false,
  150. chooseImgName:'',
  151. submit_url:'',
  152. showVisible:false,
  153. loading: false,
  154. uploadImg1:'',
  155. table_loading:false,
  156. rules:{
  157. combination_name:{ required: true, message: '请输入组合名称'},
  158. combination_img:{ required: true, message: '请选择组合图片'},
  159. price:{ required: true, message: '请输入零售价'},
  160. stock:{ required: true, message: '请输入库存'},
  161. combination_goods:{ required: true, message: '请选择商品'},
  162. // url:{ required: true, message: '请选择幻灯片链接'},
  163. },
  164. }
  165. },
  166. created() {
  167. },
  168. mounted() {
  169. },
  170. methods: {
  171. getParam(name) {
  172. var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
  173. var r = window.location.search.substr(1).match(reg);
  174. if (r != null) return unescape(r[2]);
  175. return null;
  176. },
  177. goParent(level) {
  178. if(level==1) {
  179. window.location.href = `{!! yzWebFullUrl('plugin.blind-box.admin.set.basic') !!}`;
  180. }
  181. else if(level==2) {
  182. window.location.href = `{!! yzWebFullUrl('plugin.blind-box.admin.combination.combination-list') !!}`;
  183. }
  184. else if(level==3) {
  185. window.location.href = `{!! yzWebFullUrl('plugin.blind-box.admin.combination.combination-list') !!}`;
  186. }
  187. },
  188. submitForm(formName) {
  189. this.btnChangeEnable = true;
  190. let that = this;
  191. let json = {
  192. goods:[],
  193. combination:{
  194. combination_name:this.form.combination_name,
  195. combination_img:this.form.combination_img,
  196. price:this.form.price,
  197. stock:this.form.stock,
  198. }
  199. };
  200. this.form.combination_goods.forEach((item,index) => {
  201. json.goods.push({
  202. goods_id:item.goods_id,
  203. goods_option_id:item.goods_option_id,
  204. });
  205. });
  206. if(this.id) {
  207. json.id = this.id
  208. }
  209. this.$refs[formName].validate((valid) => {
  210. if (valid) {
  211. let loading = this.$loading({target:document.querySelector(".content"),background: 'rgba(0, 0, 0, 0)'});
  212. this.$http.post('{!! yzWebFullUrl('plugin.blind-box.admin.combination.add') !!}',json).then(response => {
  213. if (response.data.result) {
  214. this.$message({type: 'success',message: '操作成功!'});
  215. // window.location.reload(1);
  216. this.goBack();
  217. } else {
  218. this.$message({message: response.data.msg,type: 'error'});
  219. }
  220. loading.close();
  221. },response => {
  222. loading.close();
  223. });
  224. }
  225. else {
  226. console.log('error submit!!');
  227. return false;
  228. }
  229. });
  230. this.btnChangeEnable = false;
  231. },
  232. selectGoods(){
  233. this.select_option = "";
  234. this.goods_show = true;
  235. },
  236. goBack() {
  237. history.go(-1)
  238. },
  239. openUpload(str) {
  240. this.chooseImgName = str;
  241. this.uploadShow = true;
  242. },
  243. changeProp(val) {
  244. if(val == true) {
  245. this.uploadShow = false;
  246. }
  247. else {
  248. this.uploadShow = true;
  249. }
  250. },
  251. sureImg(name,image,image_url) {
  252. this.form[name] = image;
  253. this.form[name+'_src'] = image_url;
  254. },
  255. clearImg(str) {
  256. this.form[str] = "";
  257. this.form[str+'_src'] = "";
  258. this.$forceUpdate();
  259. },
  260. searchGoods(){
  261. let json = {
  262. search:this.keyword_type,
  263. }
  264. let loading = this.$loading({target:document.querySelector(".content"),background: 'rgba(0, 0, 0, 0)'});
  265. this.$http.post('{!! yzWebFullUrl('plugin.blind-box.admin.combination.search-goods') !!}',{search:json}).then(function (response) {
  266. if (response.data.result){
  267. // this.$message.success("操作成功");
  268. // this.search(this.current_page);
  269. this.goods_list = response.data.data.list
  270. }
  271. else {
  272. this.$message.error( response.data.msg );
  273. }
  274. loading.close();
  275. },function (response) {
  276. this.$message.error(response.data.msg);
  277. loading.close();
  278. }
  279. );
  280. },
  281. changeOption(index){
  282. var stock = this.goods_list[index].stock;
  283. this.goods_list[index].has_many_options.forEach((item,index) => {
  284. if(item.id == this.select_option){
  285. stock = item.stock;
  286. }
  287. });
  288. this.goods_list[index].stock = stock;
  289. this.form.combination_goods.push({
  290. goods_id:this.goods_list[index].id,
  291. goods_option_id:this.select_option,
  292. goods: this.goods_list[index]
  293. })
  294. // console.log(this.form.combination_goods);
  295. // this.select_option = 0;
  296. this.goods_show = false;
  297. },
  298. changeOption2(index){
  299. var goods_option_id = this.form.combination_goods[index].goods_option_id;
  300. var stock = this.form.combination_goods[index].goods.stock;
  301. this.form.combination_goods[index].goods.has_many_options.forEach((item,index) => {
  302. if(item.id == goods_option_id){
  303. stock = item.stock;
  304. }
  305. });
  306. this.form.combination_goods[index].goods.stock = stock;
  307. },
  308. addGoods(index){
  309. this.form.combination_goods.push({
  310. goods_id:this.goods_list[index].id,
  311. goods_option_id:0,
  312. goods: this.goods_list[index]
  313. })
  314. // console.log(this.form.combination_goods);
  315. // this.select_option = 0;
  316. this.goods_show = false;
  317. },
  318. delGoods(index){
  319. this.form.combination_goods.splice(index,1);
  320. },
  321. },
  322. })
  323. </script>
  324. @endsection