index.blade.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. @extends('layouts.base')
  2. @section('title', "活动列表")
  3. @section('content')
  4. <style>
  5. .rightlist #app .rightlist-head{line-height:50px;padding:15px 0;}
  6. .rightlist #app{margin-left:30px;}
  7. .el-form-item__label{padding-right:30px;}
  8. .tip{font-size:12px;color:#999;}
  9. .rightlist-head-con{padding-right:20px;font-size:16px;color:#888;}
  10. /* .rightlist-head-con{float:left;padding-right:20px;font-size:16px;color:#888;} */
  11. .el-tag{font-weight:700;font-size:15px;margin-bottom:30px;}
  12. .el-icon-edit{font-size:16px;padding:0 15px;color:#409EFF;cursor: pointer;}
  13. /* 滑块选择小白点 */
  14. .el-switch.is-checked .el-switch__core::after {left: 100%;margin-left: -17px;}
  15. .el-switch__core::after {content: "";position: absolute;top: 1px;left: 1px;border-radius: 100%;transition: all .3s;width: 16px;height: 16px;background-color: #fff;}
  16. [v-cloak]{
  17. display:none;
  18. }
  19. /* css */
  20. .list-title{display:flex;width:100%;background:#f9f9f9;padding:15px 10px;font-weight:900;border:1px solid #e9e9e9;}
  21. .list-title .list-title-1{display:flex;align-items:center;justify-content: center;}
  22. .list-info{display:flex;border-left:1px solid #e9e9e9;border-right:1px solid #e9e9e9;padding:15px 10px;justify-content: space-between;background:#f9f9f9;}
  23. .list-con{display:flex;width:100%;border:1px solid #e9e9e9;font-size:12px;font-weight:500}
  24. .con-img{padding:10px;border-right:1px solid #e9e9e9;float:left;height:100%}
  25. .con-img-title{float:left;margin-left:5px;font-size:12px;font-weight:800;width:220px}
  26. .list-num{flex:3;display:flex;align-items:center;border-right:1px solid #e9e9e9;justify-content: center;}
  27. .list-gen{display:flex;align-items:center;justify-content: center;line-height:28px;}
  28. .list-gen-txt{flex:1;border-right:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9;align-item:center;justify-content: center;display:flex;}
  29. .list-opt{flex:1;display:flex;align-items:center;border-left:1px solid #e9e9e9;justify-content: center;}
  30. /* 弹出框 */
  31. .dialog-title{display:flex;font-weight:800;line-height:50px}
  32. .dialog-con{flex:1;display:flex;justify-content: center;border:1px #ccc solid;align-items:center;}
  33. </style>
  34. <div id="qrcode" ref="qrcode" style="display:none;"></div>
  35. <div class="rightlist">
  36. <div id="app" v-loading="all_loading" v-cloak>
  37. <el-form :inline="true" :model="search_form" ref="search_form" style="padding:20px 0 0 0;">
  38. <el-row>
  39. <el-col :xs="12" :md="12" :lg="7">
  40. <el-form-item label="活动编号" prop="">
  41. <el-input v-model="search_form.id" placeholder="活动编号"></el-input>
  42. </el-form-item>
  43. </el-col>
  44. <el-col :xs="12" :md="12" :lg="7">
  45. <el-form-item label="商品名称" prop="">
  46. <el-input v-model="search_form.goods_name" placeholder="商品名称"></el-input>
  47. </el-form-item>
  48. </el-col>
  49. <el-col :xs="12" :md="12" :lg="7">
  50. <el-form-item label="活动名称" prop="">
  51. <el-input v-model="search_form.title" placeholder="活动名称"></el-input>
  52. </el-form-item>
  53. </el-col>
  54. <el-col :xs="12" :md="12" :lg="7">
  55. <el-form-item label="商家名称" prop="">
  56. <el-input v-model="search_form.store_name" placeholder="商家名称"></el-input>
  57. </el-form-item>
  58. </el-col>
  59. <a href="#">
  60. <el-button type="success" icon="el-icon-search" @click="search()">搜索</el-button>
  61. </a>
  62. </el-col>
  63. </el-row>
  64. </el-form>
  65. <div style="padding:15px 0;">
  66. <a href="{{ yzWebFullUrl('plugin.fight-groups.admin.controllers.fight-groups.edit') }}">
  67. <el-button type="primary" icon="el-icon-plus" size="small">新增活动</el-button>
  68. </a>
  69. <el-popover class="item" placement="bottom" effect="light">
  70. <div style="text-align:center;">
  71. <div style="padding:5px 0;text-align:left;">手机扫码访问:</div>
  72. <img :src="img" alt="" style="width:100px;height:100px;">
  73. <el-input v-model="url" ref="home" style="position:absolute;opacity:0;"></el-input>
  74. <div style="padding-top:5px;">
  75. <a href="#" @click="copy()"><span>复制链接</span></a>&nbsp;&nbsp;
  76. <a href="#"><span>电脑上查看</span></a>
  77. </div>
  78. </div>
  79. <el-button icon="el-icon-mobile-phone" size="small" slot="reference" @click="homeCode()">拼团首页</el-button>
  80. </el-popover>
  81. </div>
  82. <div>
  83. <el-radio-group v-model="status" style="margin-bottom: 30px;">
  84. <el-radio-button label="0">全部</el-radio-button>
  85. <el-radio-button label="1">未开始</el-radio-button>
  86. <el-radio-button label="2">活动中</el-radio-button>
  87. <el-radio-button label="3">已结束</el-radio-button>
  88. </el-radio-group>
  89. </div>
  90. <!-- 活动列表start -->
  91. <div class="list-title" style="">
  92. <div style="flex:0 0 320px;">活动商品</div>
  93. <div class="list-title-1" style="flex:3;">库存</div>
  94. <div class="list-title-1" style="flex:6;">活动概况</div>
  95. <div class="list-title-1" style="flex:1;">管理</div>
  96. </div>
  97. <div v-for="(item,index) in list">
  98. <div class="list-info">
  99. <div >
  100. <strong>编号:</strong>[[item.id]]&nbsp;&nbsp;&nbsp;
  101. <strong>活动名称:</strong>[[item.title]]
  102. <strong v-if="item.store_id > 0">
  103. <span style="
  104. display: inline-block;
  105. padding: 2px 5px;
  106. background-color: #29ba9c;
  107. color: #fff;
  108. border-radius: 2px;
  109. ">[[item.has_one_store_cashier&&item.has_one_store_cashier!=null?item.has_one_store_cashier.store_name:'']]</span>
  110. </strong>
  111. <strong v-if="item.store_id == 0">
  112. <span style="
  113. display: inline-block;
  114. padding: 2px 5px;
  115. background-color: #FF9b19;
  116. color: #fff;
  117. border-radius: 2px;
  118. font-size: 12px ;
  119. ">平台自营</span>
  120. </strong>
  121. </div>
  122. <div ><span style="align-self:flex-end"><strong>开始时间:</strong>[[item.start_time]]</span></div>
  123. </div>
  124. <div class="list-con">
  125. <div style="flex:0 0 320px;">
  126. <div class="con-img">
  127. <div style="width:60px;height:60px;float:left">
  128. <img :src="item.has_one_goods&&item.has_one_goods!=null?item.has_one_goods.thumb:''" style="width:60px;height:60px;" alt="">
  129. </div>
  130. <div class="con-img-title">[[item.has_one_goods&&item.has_one_goods!=null?item.has_one_goods.title:'']]</div>
  131. <div style="float:left;width:100%">原价:¥[[item.has_one_goods&&item.has_one_goods!=null?item.has_one_goods.price:'']]</div>
  132. </div>
  133. </div>
  134. <div class="list-num">
  135. 剩余库存 : [[item.last_stock]]&nbsp;&nbsp;<el-button size="mini" @click="stock(item.id,item.has_one_goods.has_option)">库存明细</el-button>
  136. </div>
  137. <div style="flex:6;">
  138. <div v-for="(item1,index1) in item.has_many_level" class="list-gen">
  139. <div class="list-gen-txt">
  140. [[item1.member_num]]人团
  141. </div>
  142. <div class="list-gen-txt">
  143. [[item1.expire_in]]小时
  144. </div>
  145. <div class="list-gen-txt">
  146. 已成团:[[item1.has_many_success_team_count]]
  147. </div>
  148. <div class="list-gen-txt">
  149. 已开团:[[item1.has_many_opened_team_count]]
  150. </div>
  151. <div class="list-gen-txt">
  152. <!-- 已结束(手动) -->
  153. <span v-if="item1.status==0">未开始&nbsp;&nbsp;<a @click="manualEnd(item1.id)">手动结束</a></span>
  154. <span v-if="item1.status==1">已开始&nbsp;&nbsp;<a @click="manualEnd(item1.id)">手动结束</a></span>
  155. <span v-if="item1.status==2">已结束</span>
  156. </div>
  157. </div>
  158. </div>
  159. <div class="list-opt">
  160. <div>
  161. <el-popover class="item" placement="left" effect="light">
  162. <div style="text-align:center;">
  163. <div style="padding:5px 0;text-align:left;">活动推广二维码:</div>
  164. <img :src="img" alt="" style="width:100px;height:100px;">
  165. <div style="padding-top:5px;">
  166. <el-button @click="copyList(index)" type="mini">复制活动链接</el-button>
  167. <input v-model="item.url" :ref="'list'+index" style="position:absolute;opacity:0;height:1px;" />
  168. </div>
  169. </div>
  170. <a slot="reference" @click="listCode(index)">活动推广</a>
  171. </el-popover>
  172. <a v-if="is_show_arr[index]" :href="'{{ yzWebFullUrl('plugin.fight-groups.admin.controllers.fight-groups.edit', array('id' => '')) }}'+[[item.id]]"><div>编辑活动</div></a>
  173. <a :href="'{{ yzWebFullUrl('plugin.fight-groups.admin.controllers.team.index', array('id' => '')) }}'+[[item.id]]"><div>开团列表</div></a>
  174. <a @click="count(item.id)"><div>数据统计</div></a>
  175. <!-- <a :href="'{{ yzWebFullUrl('plugin.fight-groups.admin.controllers.order.index', array('fight_groups_id' => '')) }}'+[[item.id]]"><div>订单列表</div></a> -->
  176. </div>
  177. </div>
  178. </div>
  179. </div>
  180. <!-- 活动列表end -->
  181. <!-- 分页 -->
  182. <el-row>
  183. <el-col :span="24" align="right" style="padding:15px 5% 15px 0">
  184. <el-pagination layout="prev, pager, next" @current-change="currentChange" :current-page="current_page" :total="total" :page-size="per_size" background v-loading="loading"></el-pagination>
  185. </el-col>
  186. </el-row>
  187. <!-- 库存弹出框 -->
  188. <el-dialog title="库存" :visible.sync="stock_url" width="60%" v-loading="table_loading">
  189. <div class="dialog-title">
  190. <div class="dialog-con">规格</div>
  191. <div class="dialog-con">剩余库存</div>
  192. <div class="dialog-con">成团销量</div>
  193. </div>
  194. <div style="display:flex;font-weight:800;line-height:50px" v-for="(item,index) in stock_list" :key="index">
  195. <div class="dialog-con">[[item.option_title]]</div>
  196. <div class="dialog-con">[[item.last_stock]]</div>
  197. <div class="dialog-con">[[item.num]]</div>
  198. <!-- <div class="dialog-con">[[stock_list.data[0].option_title]]</div>
  199. <div class="dialog-con">[[stock_list.last_stock]]</div>
  200. <div class="dialog-con">[[stock_list.data[0].num]]</div> -->
  201. </div>
  202. <span slot="footer" class="dialog-footer">
  203. <el-button @click="stock_url = false">关 闭</el-button>
  204. <!-- <el-button type="primary" @click="img_text_url = false">确 定</el-button> -->
  205. </span>
  206. </el-dialog>
  207. <!-- 统计弹出框 -->
  208. <el-dialog title="数据统计" :visible.sync="count_url" width="60%" v-loading="table_loading">
  209. <div class="dialog-title">
  210. <div class="dialog-con">规格名称</div>
  211. <div class="dialog-con">成团销量</div>
  212. <div class="dialog-con">销量明细</div>
  213. </div>
  214. <div class="dialog-title" v-for="(item,index) in count_list">
  215. <div class="dialog-con">[[item.option_title]]</div>
  216. <div class="dialog-con">[[item.stock - item.last_stock]]</div>
  217. <div class="dialog-con" style="flex-wrap: wrap;">
  218. <div v-for="(item1,index1) in item.level" >
  219. [[item1.member_num]]人团 系统成团:[[item1.purchase_quantity_system]] 虚拟成团:[[item1.purchase_quantity_virtual]]
  220. </div>
  221. </div>
  222. </div>
  223. <span slot="footer" class="dialog-footer">
  224. <el-button @click="count_url = false">关 闭</el-button>
  225. <!-- <el-button type="primary" @click="img_text_url = false">确 定</el-button> -->
  226. </span>
  227. </el-dialog>
  228. </div>
  229. <script src="{{resource_get('plugins/fight-groups/views/admin/qrcode.min.js')}}"></script>
  230. <script>
  231. var app = new Vue({
  232. el:"#app",
  233. delimiters: ['[[', ']]'],
  234. data() {
  235. let data = {!! $data?:'{}' !!};
  236. console.log(data);
  237. return{
  238. tab:"all",
  239. stock_url:false,//库存弹出框
  240. count_url:false,//统计弹出框
  241. status:0,
  242. url:"",//首页链接
  243. search_form:{
  244. goods_name:"",
  245. id:"",
  246. title:"",
  247. store_name:"",
  248. },
  249. search_goods:{},
  250. img:"",
  251. list:[],
  252. is_show_arr:[],//是否显示'编辑'按钮
  253. stock_list:{
  254. data:[{option_title:""}],
  255. },//库存信息
  256. count_list:{},
  257. loading:false,
  258. dialog_loading:false,
  259. all_loading:false,
  260. table_loading:false,
  261. //商品分页
  262. total:0,
  263. per_size:0,
  264. current_page:0,
  265. store_id:0,
  266. rules:{},
  267. }
  268. },
  269. watch: {
  270. status() {
  271. var that = this;
  272. let json = {id:that.search_form.id,goods_name:that.search_form.goods_name,status:that.status,title:that.search_form.title,store_name:that.search_form.store_name,};
  273. console.log(json)
  274. that.getData(json);
  275. }
  276. },
  277. created() {
  278. this.getData('{}');
  279. },
  280. methods: {
  281. getData(json) {
  282. var that = this;
  283. that.all_loading = true;
  284. console.log(json)
  285. that.$http.post("{!! yzWebFullUrl('plugin.fight-groups.admin.controllers.fight-groups.search') !!}",json).then(response => {
  286. console.log(response);
  287. if(response.data.result==1){
  288. that.list = response.data.data.data;
  289. let arr = [];
  290. // 列表时间处理及'编辑'按钮控制开关
  291. that.list.forEach((item,index) => {
  292. if(!item.has_one_goods){
  293. this.$set(item,'has_one_goods',{})
  294. let title = this.escapeHTML(item.has_one_goods ? item.has_one_goods.title : '')
  295. this.$set(item.has_one_goods,'title',title)
  296. console.log(item.has_one_goods.title,1)
  297. }else{
  298. console.log(item.has_one_goods,2)
  299. item.has_one_goods.title = this.escapeHTML(item.has_one_goods.title)
  300. }
  301. item.start_time = that.timeStyle(item.start_time)
  302. for(let i=0;i<item.has_many_level.length;i++) {
  303. if(item.has_many_level[i].status==0 || item.has_many_level[i].status==1) {
  304. arr.push(1);
  305. break;
  306. }
  307. }
  308. if(arr.length-1<index){
  309. arr.push(0);
  310. }
  311. });
  312. this.is_show_arr = arr;
  313. that.total = response.data.data.total;
  314. that.per_size = response.data.data.per_page;
  315. that.current_page = response.data.data.current_page;
  316. that.url = response.data.data.url;
  317. }
  318. else{
  319. that.$message.error(response.data);
  320. }
  321. console.log(this.list)
  322. that.all_loading = false;
  323. }),function(res){
  324. console.log(res);
  325. that.all_loading = false;
  326. };
  327. },
  328. // 查看库存
  329. stock(id,option) {
  330. console.log(id)
  331. console.log(option)
  332. let data = {
  333. id:id,
  334. option:option
  335. }
  336. var that = this;
  337. that.table_loading = true;
  338. that.stock_url = true;
  339. that.$http.post("{!! yzWebFullUrl('plugin.fight-groups.admin.controllers.fight-groups.stock-detail') !!}",{data:data}).then(response => {
  340. if(response.data.result==1){
  341. that.stock_list = response.data.data;
  342. console.log(that.stock_list)
  343. }
  344. else{
  345. that.$message.error(response.data.msg);
  346. }
  347. that.table_loading = false;
  348. }),function(res){
  349. console.log(res);
  350. that.table_loading = false;
  351. };
  352. },
  353. // 统计
  354. count(id) {
  355. console.log(id)
  356. var that = this;
  357. that.table_loading = true;
  358. that.count_url = true;
  359. that.$http.post("{!! yzWebFullUrl('plugin.fight-groups.admin.controllers.fight-groups.data-statistics') !!}",{id:id}).then(response => {
  360. if(response.data.result==1){
  361. that.count_list = response.data.data;
  362. console.log(that.count_list)
  363. }
  364. else{
  365. that.$message.error(response.data.msg);
  366. }
  367. that.table_loading = false;
  368. }),function(res){
  369. console.log(res);
  370. that.table_loading = false;
  371. };
  372. },
  373. // 手动结束
  374. manualEnd(id) {
  375. console.log("12312313")
  376. var that = this;
  377. that.table_loading = true;
  378. that.$http.post("{!! yzWebFullUrl('plugin.fight-groups.admin.controllers.fight-groups.close-level') !!}",{id:id}).then(response => {
  379. if(response.data.result==1){
  380. that.$message.success(response.data.msg);
  381. this.getData('{}');
  382. }
  383. else{
  384. that.$message.error(response.data.msg);
  385. }
  386. that.table_loading = false;
  387. }),function(res){
  388. console.log(res);
  389. that.table_loading = false;
  390. };
  391. },
  392. // 搜索
  393. search() {
  394. var that = this;
  395. let json = {id:that.search_form.id,goods_name:that.search_form.goods_name,status:that.status,title:that.search_form.title,store_name:that.search_form.store_name}
  396. that.getData(json);
  397. },
  398. // 分页
  399. currentChange(page) {
  400. var that = this;
  401. let json = {id:that.search_form.id,goods_name:that.search_form.goods_name,status:that.status,title:that.search_form.title,store_name:that.search_form.store_name,page:page}
  402. that.getData(json);
  403. },
  404. qrcodeScan (url) {//生成二维码
  405. let qrcode = new QRCode('qrcode', {
  406. width: 100, // 二维码宽度
  407. height: 100, // 二维码高度
  408. render: 'image',
  409. text: url
  410. });
  411. console.log($("canvas"))
  412. var data = $("canvas")[$("canvas").length-1].toDataURL().replace("image/png", "image/octet-stream;");
  413. console.log(url)
  414. // this.$set(this.img,data);
  415. this.img = data;
  416. console.log(this.img)
  417. },
  418. // 首页二维码
  419. homeCode() {
  420. this.qrcodeScan(this.url);
  421. console.log("asdasd")
  422. },
  423. // 复制首页链接
  424. copy() {
  425. that = this;
  426. let Url = that.$refs['home'];
  427. Url.select(); // 选择对象
  428. document.execCommand("Copy",false);
  429. that.$message({message:"复制成功!",type:"success"});
  430. },
  431. // 活动二维码
  432. listCode(index) {
  433. console.log(index)
  434. this.qrcodeScan(this.list[index].url);
  435. },
  436. // 复制活动链接
  437. copyList(index) {
  438. that = this;
  439. let Url = that.$refs['list'+index];
  440. Url[0].select(); // 选择对象
  441. document.execCommand("Copy",false);
  442. that.$message({message:"复制成功!",type:"success"});
  443. },
  444. submit(){
  445. var that = this;
  446. console.log(this.data);
  447. that.$http.post("{!! yzWebFullUrl('plugin.wechat.admin.reply.controller.default-reply.add') !!}",{keywords_id:that.data.id}).then(response => {
  448. console.log(response);
  449. if(response.data.result==1){
  450. that.keyword_list = response.data.data;
  451. that.$message.success("保存成功!");
  452. window.location.href='{!! yzWebFullUrl('plugin.wechat.admin.reply.controller.default-reply.index') !!}';
  453. }
  454. else{
  455. that.$message.error(response.data);
  456. }
  457. }),function(res){
  458. console.log(res);
  459. };
  460. },
  461. escapeHTML(a) {
  462. a = "" + a;
  463. return a.replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, "\"").replace(/&apos;/g, "'");;
  464. },
  465. add0(m) {
  466. return m<10?'0'+m:m
  467. },
  468. timeStyle(time) {
  469. let time1 = new Date(time*1000);
  470. let y = time1.getFullYear();
  471. let m = time1.getMonth()+1;
  472. let d = time1.getDate();
  473. let h = time1.getHours();
  474. let mm = time1.getMinutes();
  475. let s = time1.getSeconds();
  476. return y+'-'+this.add0(m)+'-'+this.add0(d)+' '+this.add0(h)+':'+this.add0(mm)+':'+this.add0(s);
  477. },
  478. },
  479. })
  480. </script>
  481. @endsection