info.blade.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  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. <link rel="stylesheet" href="{{static_url('css/public-number.css')}}">
  6. <style>
  7. .dialog-cover{z-index:2001}
  8. .dialog-content{z-index:2002}
  9. .link1 .el-input__inner{padding:0}
  10. </style>
  11. <div class="all">
  12. <div id="app" v-cloak>
  13. <div class="vue-crumbs">
  14. <a @click="goParent">商品分类</a> > 商品分类详情
  15. </div>
  16. <div class="vue-main">
  17. <div class="vue-main-title">
  18. <div class="vue-main-title-left"></div>
  19. <div class="vue-main-title-content">商品分类详情</div>
  20. </div>
  21. <div class="vue-main-form">
  22. <el-form ref="form" :model="form" :rules="rules" label-width="15%">
  23. <el-form-item label="分类链接(点击复制)" v-if="id">
  24. <el-input v-model="link" ref="link" class="link1" style="width:70%;opacity: 0;width: 5px;" readonly></el-input>
  25. <a @click="copyLink('link')" style="color:#29BA9C;font-weight:400">[[link]]</a>
  26. </el-form-item>
  27. <el-form-item label="上级分类" v-if="parent&&parent.name">
  28. <el-input v-model="parent.name" style="width:70%;" placeholder="请输入排序" disabled></el-input>
  29. </el-form-item>
  30. <el-form-item label="排序" prop="display_order">
  31. <el-input v-model="form.display_order" style="width:70%;" placeholder="请输入排序"></el-input>
  32. </el-form-item>
  33. <el-form-item label="分类名称" prop="name">
  34. <el-input v-model="form.name" style="width:70%;" placeholder="请输入分类名称"></el-input>
  35. </el-form-item>
  36. <el-form-item label="分类图片" prop="thumb">
  37. <!-- 传1:表示图片类型 -->
  38. <div class="upload-box" @click="openUpload('thumb',1,'one')" v-if="!form.thumb_url">
  39. <i class="el-icon-plus" style="font-size:32px"></i>
  40. </div>
  41. <div @click="openUpload('thumb',1,'one')" class="upload-boxed" v-if="form.thumb_url">
  42. <img :src="form.thumb_url" alt="" style="width:150px;height:150px;border-radius: 5px;cursor: pointer;">
  43. <div class="upload-boxed-text">点击重新上传</div>
  44. <i class="el-icon-close" @click.stop="clearImg('thumb')" title="点击清除图片"></i>
  45. </div>
  46. <div class="tip">建议尺寸: 100*100,或正方型图片</div>
  47. </el-form-item>
  48. <!-- <el-form-item label="分类描述" prop="description">
  49. <el-input type="textarea" rows="5" v-model="form.description" style="width:70%;"></el-input>
  50. <div class="tip">如果不填写,默认为空</div>
  51. </el-form-item> -->
  52. <div v-if="level!=3 && edit_level!=3">
  53. <el-form-item label="移动端分类广告" prop="adv_img">
  54. <div class="upload-box" @click="openUpload('adv_img',1,'one')" v-if="!form.adv_img_url">
  55. <i class="el-icon-plus" style="font-size:32px"></i>
  56. </div>
  57. <div @click="openUpload('adv_img',1,'one')" class="upload-boxed" v-if="form.adv_img_url" style="height:75px">
  58. <img :src="form.adv_img_url" alt="" style="width:150px;height:75px;border-radius: 5px;cursor: pointer;">
  59. <div class="upload-boxed-text">点击重新上传</div>
  60. <i class="el-icon-close" @click.stop="clearImg('adv_img')" title="点击清除图片"></i>
  61. </div>
  62. <div class="tip">建议尺寸: 640*320</div>
  63. </el-form-item>
  64. <el-form-item label="分类广告链接" prop="adv_url">
  65. <el-input v-model="form.adv_url" style="width:70%;" placeholder=" 请填写指向的链接 (请以https://开头, 不填则不显示)"></el-input>
  66. <el-button @click="showLink('link','adv_url')">选择链接</el-button>
  67. </el-form-item>
  68. <el-form-item label="分类广告小程序链接" prop="small_adv_url">
  69. <el-input v-model="form.small_adv_url" style="width:70%;"></el-input>
  70. <el-button @click="showLink('mini','small_adv_url')">选择小程序链接</el-button>
  71. </el-form-item>
  72. </div>
  73. {{-- <el-form-item label="关联标签组" prop="banner">--}}
  74. {{-- <el-input v-model="form.filter" disabled style="width:70%;"></el-input>--}}
  75. {{-- <el-button @click="filterShow = true">选择标签组</el-button>--}}
  76. {{-- <!-- filter_ids -->--}}
  77. {{-- <div >--}}
  78. {{-- <el-tag v-for="(tag,index) in filter_names" :key="index" closable @close="closeFilter(index)">--}}
  79. {{-- [[tag]]--}}
  80. {{-- </el-tag>--}}
  81. {{-- </div>--}}
  82. {{-- </el-form-item>--}}
  83. <el-form-item label="是否推荐" prop="is_home">
  84. <el-switch v-model="form.is_home" :active-value="1" :inactive-value="0"></el-switch>
  85. </el-form-item>
  86. <el-form-item label="是否显示" prop="enabled">
  87. <el-switch v-model="form.enabled" :active-value="1" :inactive-value="0"></el-switch>
  88. </el-form-item>
  89. </el-form>
  90. </div>
  91. </div>
  92. <!-- 分页 -->
  93. <div class="vue-page">
  94. <div class="vue-center">
  95. <el-button type="primary" @click="submitForm('form')">提交</el-button>
  96. <el-button @click="goBack">返回</el-button>
  97. </div>
  98. </div>
  99. <el-dialog :visible.sync="filterShow" width="60%" center title="选择标签组">
  100. <div v-loading="loading">
  101. <div>
  102. <el-input v-model="keyword" style="width:70%"></el-input>
  103. <el-button type="primary" @click="searchFilter()">搜索</el-button>
  104. </div>
  105. <el-table :data="filter_list" style="width: 100%;height:500px;overflow:auto">
  106. <el-table-column label="ID" prop="id" align="center" width="100px"></el-table-column>
  107. <el-table-column label="标签组名称">
  108. <template slot-scope="scope">
  109. <div v-if="scope.row" style="display:flex;align-items: center">
  110. <div style="margin-left:10px">[[scope.row.name]]</div>
  111. </div>
  112. </template>
  113. </el-table-column>
  114. <el-table-column prop="refund_time" label="操作" align="center" width="320">
  115. <template slot-scope="scope">
  116. <el-button @click="sureFilter(scope.row)">
  117. 选择
  118. </el-button>
  119. </template>
  120. </el-table-column>
  121. </el-table>
  122. </div>
  123. <span slot="footer" class="dialog-footer">
  124. <el-button @click="filterShow = false">取 消</el-button>
  125. </span>
  126. </el-dialog>
  127. <upload-multimedia-img :upload-show="uploadShow" :type="type" :name="chooseImgName" :sel-Num="selNum" @replace="changeProp" @sure="sureImg"></upload-multimedia-img>
  128. <pop :show="show" @replace="changeLink" @add="parHref"></pop>
  129. <program :pro="pro" @replacepro="changeprogram" @addpro="parpro"></program>
  130. <!--end-->
  131. </div>
  132. </div>
  133. <script src="{{resource_get('static/yunshop/tinymce4.7.5/tinymce.min.js')}}"></script>
  134. @include('public.admin.uploadMultimediaImg')
  135. @include('public.admin.pop')
  136. @include('public.admin.program')
  137. <script>
  138. let id = {!! $id?:0 !!}
  139. let level = {!! $level?:0 !!}
  140. let parent_id = {!! $parent_id?:0 !!}
  141. console.log(level)
  142. console.log(parent_id)
  143. var app = new Vue({
  144. el:"#app",
  145. delimiters: ['[[', ']]'],
  146. name: 'test',
  147. data() {
  148. return{
  149. show:false,//是否开启公众号弹窗
  150. pro:false ,//是否开启小程序弹窗
  151. chooseLink:'',
  152. chooseMiniLink:'',
  153. id:id,
  154. level:level,
  155. parent_id:parent_id,
  156. edit_parent_id:0,
  157. edit_level:0,
  158. parent:{},
  159. form:{
  160. filter_ids:[],
  161. display_order:'0',
  162. name:'',
  163. thumb:'',
  164. description:'',
  165. adv_img:'',
  166. adv_url:'',
  167. small_adv_url:'',
  168. is_home:0,
  169. enabled:0,
  170. },
  171. filter_names:[],//选中的标签组名
  172. filter_list:[],
  173. filterShow:false,
  174. keyword:'',
  175. submit_url:'',
  176. link:"",
  177. uploadShow:false,
  178. chooseImgName:'',
  179. loading: false,
  180. uploadImg1:'',
  181. rules:{
  182. name:{ required: true, message: '请输入分类名称'}
  183. },
  184. type:'',
  185. selNum:'',
  186. // 保存页面状态
  187. page:1
  188. }
  189. },
  190. created() {
  191. if(this.id) {
  192. this.submit_url = '{!! yzWebFullUrl('goods.category.edit-category') !!}'
  193. }
  194. else {
  195. this.submit_url = '{!! yzWebFullUrl('goods.category.add-category') !!}'
  196. }
  197. this.getData();
  198. this.page = this.getParam('page')
  199. },
  200. mounted() {
  201. },
  202. methods: {
  203. getParam(name) {
  204. var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
  205. var r = window.location.search.substr(1).match(reg);
  206. if (r != null) return unescape(r[2]);
  207. return null;
  208. },
  209. clearImg(str,type,index) {
  210. if(!type) {
  211. this.form[str] = "";
  212. this.form[str+'_url'] = "";
  213. }
  214. else {
  215. this.form[str].splice(index,1);
  216. this.form[str+'_url'].splice(index,1);
  217. }
  218. this.$forceUpdate();
  219. },
  220. //弹窗显示与隐藏的控制
  221. changeLink(item){
  222. this.show=item;
  223. },
  224. //当前链接的增加
  225. parHref(child,confirm){
  226. this.show=confirm;
  227. // this.form.link=child;
  228. this.form[this.chooseLink] = child;
  229. },
  230. changeprogram(item){
  231. this.pro=item;
  232. },
  233. parpro(child,confirm){
  234. this.pro=confirm;
  235. // this.form.prolink=child;
  236. this.form[this.chooseMiniLink] = child;
  237. },
  238. showLink(type,name) {
  239. if(type=="link") {
  240. this.chooseLink = name;
  241. this.show = true;
  242. }
  243. else {
  244. this.chooseMiniLink = name;
  245. this.pro = true;
  246. }
  247. },
  248. getData() {
  249. let json = {};
  250. if(this.id) {
  251. json.id = this.id
  252. }
  253. else {
  254. json = {
  255. level:this.level,
  256. parent_id:this.parent_id
  257. }
  258. }
  259. console.log(json)
  260. let loading = this.$loading({target:document.querySelector(".content"),background: 'rgba(0, 0, 0, 0)'});
  261. this.$http.post(this.submit_url,json).then(function (response) {
  262. if (response.data.result){
  263. if(this.id) {
  264. let datas = response.data.data.item;
  265. this.form.display_order = datas.display_order;
  266. this.form.name = datas.name;
  267. this.form.thumb = datas.thumb;
  268. this.form.thumb_url = datas.thumb_url;
  269. this.form.description = datas.description;
  270. this.form.adv_img = datas.adv_img;
  271. this.form.adv_img_url = datas.adv_img_url;
  272. this.form.adv_url = datas.adv_url;
  273. this.form.small_adv_url = datas.small_adv_url;
  274. this.form.is_home = datas.is_home || 0;
  275. this.form.enabled = datas.enabled || 0;
  276. this.edit_level = datas.level || 0;
  277. this.edit_parent_id = datas.parent_id || 0;
  278. if(response.data.data.label_group && response.data.data.label_group.length) {
  279. response.data.data.label_group.forEach((item,index) => {
  280. this.form.filter_ids.push(item.id);
  281. this.filter_names.push(item.name);
  282. })
  283. }
  284. this.link = response.data.data.link || "";
  285. }
  286. this.parent = response.data.data.parent;
  287. }
  288. else {
  289. this.$message({message: response.data.msg,type: 'error'});
  290. }
  291. loading.close();
  292. },function (response) {
  293. this.$message({message: response.data.msg,type: 'error'});
  294. loading.close();
  295. }
  296. );
  297. },
  298. clearGoods() {
  299. },
  300. searchFilter() {
  301. let that = this;
  302. let loading = this.$loading({target:document.querySelector(".content"),background: 'rgba(0, 0, 0, 0)'});
  303. this.$http.post('{!! yzWebFullUrl('filtering.filtering.get-search-label-v2') !!}',{keyword:this.keyword}).then(response => {
  304. if (response.data.result) {
  305. this.filter_list = response.data.data;
  306. } else {
  307. this.$message({message: response.data.msg,type: 'error'});
  308. }
  309. loading.close();
  310. },response => {
  311. loading.close();
  312. });
  313. },
  314. sureFilter(item) {
  315. let is_exist = 0;
  316. this.form.filter_ids.some((item1,index) => {
  317. if(item1 == item.id) {
  318. is_exist = 1;
  319. this.$message.error("请勿重复选择");
  320. return true;
  321. }
  322. })
  323. if(is_exist == 1) {
  324. return;
  325. }
  326. this.form.filter_ids.push(item.id)
  327. this.filter_names.push(item.name)
  328. // this.filterShow = false;
  329. },
  330. closeFilter(index) {
  331. this.form.filter_ids.splice(index,1);
  332. this.filter_names.splice(index,1);
  333. },
  334. submitForm(formName) {
  335. let that = this;
  336. let json = {
  337. level:this.level,
  338. parent_id:this.parent_id,
  339. category:{
  340. display_order:this.form.display_order,
  341. name:this.form.name,
  342. thumb:this.form.thumb,
  343. description:this.form.description,
  344. adv_img:this.form.adv_img,
  345. adv_url:this.form.adv_url,
  346. small_adv_url:this.form.small_adv_url,
  347. is_home:this.form.is_home,
  348. enabled:this.form.enabled,
  349. filter_ids:this.form.filter_ids,
  350. level:this.level,
  351. parent_id:this.parent_id,
  352. }
  353. };
  354. if(this.id) {
  355. json.id = this.id;
  356. json.category.level = this.edit_level;
  357. json.category.parent_id = this.edit_parent_id;
  358. }
  359. this.$refs[formName].validate((valid) => {
  360. if (valid) {
  361. let loading = this.$loading({target:document.querySelector(".content"),background: 'rgba(0, 0, 0, 0)'});
  362. this.$http.post(this.submit_url,json).then(response => {
  363. if (response.data.result) {
  364. this.$message({type: 'success',message: '操作成功!'});
  365. let link = `{!! yzWebFullUrl('goods.category.index') !!}`+`&page=`+this.page;
  366. window.location.href = link;
  367. setTimeout(()=>{
  368. this.goBack();
  369. },500)
  370. } else {
  371. this.$message({message: response.data.msg,type: 'error'});
  372. }
  373. loading.close();
  374. },response => {
  375. loading.close();
  376. });
  377. }
  378. else {
  379. console.log('error submit!!');
  380. return false;
  381. }
  382. });
  383. },
  384. goBack() {
  385. history.go(-1)
  386. },
  387. goParent() {
  388. window.location.href = `{!! yzWebFullUrl('goods.category.index') !!}`;
  389. },
  390. openUpload(str,type,sel) {
  391. console.log(str, type,'uuuuuuuuuuu');
  392. this.chooseImgName = str;
  393. this.uploadShow = true;
  394. this.type = type
  395. this.selNum = sel
  396. },
  397. changeProp(val) {
  398. if(val == true) {
  399. this.uploadShow = false;
  400. }
  401. else {
  402. this.uploadShow = true;
  403. }
  404. },
  405. // 参数:fileList 上传文件的列表信息
  406. sureImg(name,uploadShow,fileList) {
  407. if(fileList.length <= 0) {
  408. return
  409. }
  410. console.log(name)
  411. console.log(fileList)
  412. this.form[name] =fileList[0].attachment;
  413. this.form[name+'_url'] = fileList[0].url;
  414. console.log(this.form[name],'aaaaa')
  415. console.log( this.form[name+'_url'],'bbbbb')
  416. },
  417. clearImg(str) {
  418. this.form[str] = "";
  419. this.form[str+'_url'] = "";
  420. this.$forceUpdate();
  421. },
  422. copyLink(type) {
  423. this.$refs[type].select();
  424. document.execCommand("Copy")
  425. this.$message.success("复制成功!");
  426. },
  427. // 字符转义
  428. escapeHTML(a) {
  429. a = "" + a;
  430. return a.replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, "\"").replace(/&apos;/g, "'");;
  431. },
  432. },
  433. })
  434. </script>
  435. @endsection