group-code.blade.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. @extends('layouts.base')
  2. @section('title', '群活码管理')
  3. @section('content')
  4. <link href="{{ static_url('yunshop/element-ui/2.10.1/css/index.css') }}" rel="stylesheet">
  5. <link rel="stylesheet" type="text/css" href="{{static_url('yunshop/goods/vue-goods1.css')}}" />
  6. <style>
  7. .el-button+.el-button {margin-left:0px;}
  8. .el-dialog__body{border-top:1px solid #dde2ee;border-bottom:1px solid #dde2ee;}
  9. </style>
  10. <div class="all">
  11. <div id="app" v-cloak>
  12. <div class="vue-head">
  13. <div class="vue-main-title" style="margin-bottom:20px">
  14. <div class="vue-main-title-left"></div>
  15. <div class="vue-main-title-content">群活码列表</div>
  16. <div class="vue-main-title-button">
  17. <el-button type="primary" plain icon="el-icon-plus" size="small" @click="addModal">创建群活码</el-button>
  18. </div>
  19. </div>
  20. <div class="vue-search">
  21. <el-form :inline="true" :model="search_form" class="demo-form-inline">
  22. <el-form-item label="">
  23. <el-input v-model="search_form.member_id" placeholder="创建会员ID,搜索后台创建输入0"></el-input>
  24. </el-form-item>
  25. <el-form-item label="">
  26. <el-input v-model="search_form.member" placeholder="创建会员昵称/姓名/手机"></el-input>
  27. </el-form-item>
  28. <el-form-item label="">
  29. <el-input v-model="search_form.code_name" placeholder="活码名称"></el-input>
  30. </el-form-item>
  31. <el-form-item label="">
  32. <el-select v-model="search_form.order_by" clearable placeholder="排序规则">
  33. <el-option label="ID" value="0"></el-option>
  34. <el-option label="今日扫码" value="1"></el-option>
  35. <el-option label="累计扫码" value="2"></el-option>
  36. </el-select>
  37. </el-form-item>
  38. <el-form-item label="">
  39. <el-select v-model="search_form.is_statistic" clearable placeholder="是否统计">
  40. <el-option label="统计" value="0"></el-option>
  41. <el-option label="不统计" value="1"></el-option>
  42. </el-select>
  43. </el-form-item>
  44. <el-form-item label="">
  45. <el-date-picker
  46. v-model="times"
  47. type="datetimerange"
  48. value-format="timestamp"
  49. range-separator="至"
  50. start-placeholder="开始日期"
  51. end-placeholder="结束日期"
  52. style="margin-left:5px;"
  53. align="right">
  54. </el-date-picker>
  55. </el-form-item>
  56. <el-form-item label="">
  57. <el-button type="primary" @click="search(1)">搜索</el-button>
  58. </el-form-item>
  59. </el-form>
  60. </div>
  61. </div>
  62. <div class="vue-main">
  63. <div class="vue-category-title">统计:群活码数[[statistic.code_total || 0]],总扫活码人数[[statistic.cumulative || 0]]人,总新会员人数[[statistic.cumulative_new || 0]]人</div>
  64. <div class="vue-main-form">
  65. <el-table :data="list" style="width: 100%">
  66. <el-table-column label="ID" align="center" prop="id" width="80"></el-table-column>
  67. <el-table-column label="创建会员" align="center" prop="code_name" width="110">
  68. <template slot-scope="scope">
  69. <div v-if="scope.row.member_id!=0">
  70. <img v-if="scope.row.has_one_member" :src="scope.row.has_one_member.avatar" alt="" style="width:50px;height:50px">
  71. <div v-if="scope.row.has_one_member">[[scope.row.has_one_member.nickname]]</div>
  72. </div>
  73. <div v-else>后台</div>
  74. </template>
  75. </el-table-column>
  76. <el-table-column label="群活码名称" align="center" prop="code_name"></el-table-column>
  77. <el-table-column label="创建时间" align="center" prop="created_at"></el-table-column>
  78. <el-table-column align="center">
  79. <template slot="header" slot-scope="scope">
  80. <div>今日扫码人数</div>
  81. <div>累计扫码人数</div>
  82. </template>
  83. <template slot-scope="scope">
  84. <div>
  85. <div>[[scope.row.log_today]]</div>
  86. <div>[[scope.row.cumulative]]</div>
  87. </div>
  88. </template>
  89. </el-table-column>
  90. <el-table-column align="center">
  91. <template slot="header" slot-scope="scope">
  92. <div>今日新会员人数</div>
  93. <div>累计新会员人数</div>
  94. </template>
  95. <template slot-scope="scope">
  96. <div>
  97. <div>[[scope.row.log_new_today]]</div>
  98. <div>[[scope.row.cumulative_new]]</div>
  99. </div>
  100. </template>
  101. </el-table-column>
  102. <el-table-column label="二维码情况" align="center">
  103. <template slot-scope="scope">
  104. <div>
  105. <div>总数量:[[scope.row.code_total]]</div>
  106. <div>即将过期:[[scope.row.code_soon_expire]]</div>
  107. <div>已过期:[[scope.row.code_expire]]</div>
  108. </div>
  109. </template>
  110. </el-table-column>
  111. <el-table-column label="状态" align="center" prop="id" width="80">
  112. <template slot-scope="scope">
  113. <div>
  114. <el-tooltip placement="top">
  115. <div slot="content">[[scope.row.status==1?'开启':'关闭']]</div>
  116. <el-switch v-model="scope.row.status" @change="changeStatus(scope.row.id,scope.$index,'status',scope.row.status)" :active-value="1" :inactive-value="0"></el-switch>
  117. </el-tooltip>
  118. </div>
  119. </template>
  120. </el-table-column>
  121. <el-table-column label="推荐" align="center" prop="id" width="80">
  122. <template slot-scope="scope">
  123. <div>
  124. <el-tooltip placement="top">
  125. <div slot="content">[[scope.row.recommend==1?'开启':'关闭']]</div>
  126. <el-switch v-model="scope.row.recommend" @change="changeStatus(scope.row.id,scope.$index,'recommend',scope.row.recommend)" :active-value="1" :inactive-value="0"></el-switch>
  127. </el-tooltip>
  128. </div>
  129. </template>
  130. </el-table-column>
  131. <el-table-column prop="refund_time" label="操作" align="center" width="260">
  132. <template slot-scope="scope">
  133. <el-button size="mini" @click="gotoData(scope.row.id)">数据</el-button>
  134. <el-button size="mini" @click="promotion(scope.row.id)">推广</el-button>
  135. <el-button size="mini" @click="gotoEdit(scope.row.id)">编辑</el-button>
  136. <el-button size="mini" @click="del(scope.row.id,scope.$index)">删除</el-button>
  137. </template>
  138. </el-table-column>
  139. </el-table>
  140. </div>
  141. </div>
  142. <!-- 分页 -->
  143. <div class="vue-page" v-if="total>0">
  144. <el-row>
  145. <el-col align="right">
  146. <el-pagination layout="prev, pager, next,jumper" @current-change="search" :total="total"
  147. :page-size="per_page" :current-page="current_page" background
  148. ></el-pagination>
  149. </el-col>
  150. </el-row>
  151. </div>
  152. <el-dialog :visible.sync="codeShow" width="600px" title="任务推广">
  153. <div style="padding:20px 0;text-align:center;">
  154. <div style="display:flex;margin: 20px 0;justify-content: center;">
  155. <div style="width:150px;margin:0 10px" v-if="down_src!=''">
  156. <img :src="down_src" alt="" style="width:150px;height:150px;">
  157. <el-link :underline="false" download :href="down_src" style="font-size:16px;font-weight:600;margin:30px 0">下载二维码图片</el-link>
  158. </div>
  159. <div style="width:150px;margin:0 10px" v-if="down_mini_src!=''">
  160. <img :src="down_mini_src" alt="" style="width:150px;height:150px;">
  161. <el-link download :href="down_mini_src" :underline="false" style="font-size:16px;font-weight:600;margin:30px 0">下载小程序码图片</el-link>
  162. </div>
  163. </div>
  164. <div>
  165. <div style="margin-bottom:30px" v-if="down_url!=''">
  166. <div style="width:100px;display:inline-block">H5页面链接</div>
  167. <el-input v-model="down_url" readonly style="width:50%" ref="down_url"></el-input>
  168. <el-button @click="copyLink('down_url')">复制</el-button>
  169. </div>
  170. <div v-if="down_mini_url!=''">
  171. <div style="width:100px;display:inline-block">小程序页面链接</div>
  172. <el-input v-model="down_mini_url" readonly style="width:50%" ref="down_mini_url"></el-input>
  173. <el-button @click="copyLink('down_mini_url')">复制</el-button>
  174. </div>
  175. </div>
  176. </div>
  177. <span slot="footer" class="dialog-footer">
  178. <el-button @click="codeShow = false">取 消</el-button>
  179. </span>
  180. </el-dialog>
  181. </div>
  182. </div>
  183. <script>
  184. var app = new Vue({
  185. el: "#app",
  186. delimiters: ['[[', ']]'],
  187. name: 'test',
  188. data() {
  189. return {
  190. codeShow:false,
  191. list:[],
  192. down_url:'',
  193. down_src:'',
  194. down_mini_url:'',
  195. down_mini_src:'',
  196. times:[],
  197. statistic:{},
  198. search_form:{
  199. },
  200. rules: {},
  201. current_page:1,
  202. total:1,
  203. per_page:1,
  204. }
  205. },
  206. created() {
  207. },
  208. mounted() {
  209. this.getData(1);
  210. },
  211. methods: {
  212. gotoEdit(id) {
  213. let link = `{!! yzWebFullUrl('plugin.group-code.admin.group-code.update') !!}`+`&id=`+id;
  214. console.log(link);
  215. window.location.href = link;
  216. },
  217. gotoData(id) {
  218. let link = `{!! yzWebFullUrl('plugin.group-code.admin.group-code-log.index') !!}`+`&group_id=`+id;
  219. console.log(link);
  220. window.location.href = link;
  221. },
  222. promotion(id) {
  223. let loading = this.$loading({target:document.querySelector(".content"),background: 'rgba(0, 0, 0, 0.2)'});
  224. this.$http.post('{!! yzWebFullUrl('plugin.group-code.admin.group-code.extension') !!}',{id:id}).then(function(response) {
  225. if (response.data.result) {
  226. this.down_url = response.data.data.down_url;
  227. this.down_src = response.data.data.down_src;
  228. this.down_mini_url = response.data.data.down_mini_url;
  229. this.down_mini_src = response.data.data.down_mini_src;
  230. this.codeShow = true;
  231. loading.close();
  232. } else {
  233. this.$message({
  234. message: response.data.msg,
  235. type: 'error'
  236. });
  237. }
  238. loading.close();
  239. }, function(response) {
  240. this.$message({
  241. message: response.data.msg,
  242. type: 'error'
  243. });
  244. loading.close();
  245. });
  246. },
  247. getData(page) {
  248. let json = {
  249. page:page,
  250. search:{
  251. member_id:this.search_form.member_id,
  252. member:this.search_form.member,
  253. code_name:this.search_form.code_name,
  254. order_by:this.search_form.order_by,
  255. is_statistic:this.search_form.is_statistic,
  256. }
  257. };
  258. if(this.times && this.times.length>0) {
  259. json.search.time = {};
  260. json.search.time = {start:this.times[0]/1000,end:this.times[1]/1000}
  261. }
  262. console.log(json)
  263. let loading = this.$loading({target:document.querySelector(".content"),background: 'rgba(0, 0, 0, 0.2)'});
  264. this.$http.post('{!! yzWebFullUrl('plugin.group-code.admin.group-code.get-group-code-list') !!}',json).then(function(response) {
  265. if (response.data.result) {
  266. this.list = response.data.data.list.data;
  267. this.current_page=response.data.data.list.current_page;
  268. this.total=response.data.data.list.total;
  269. this.per_page=response.data.data.list.per_page;
  270. if(response.data.data.statistic && response.data.data.statistic!=[]) {
  271. this.statistic = response.data.data.statistic;
  272. }
  273. loading.close();
  274. } else {
  275. this.$message({
  276. message: response.data.msg,
  277. type: 'error'
  278. });
  279. }
  280. loading.close();
  281. }, function(response) {
  282. this.$message({
  283. message: response.data.msg,
  284. type: 'error'
  285. });
  286. loading.close();
  287. });
  288. },
  289. copyLink(type) {
  290. this.$refs[type].select();
  291. document.execCommand("Copy")
  292. this.$message.success("复制成功!");
  293. },
  294. search(val) {
  295. this.getData(val);
  296. },
  297. // 添加群活码
  298. addModal() {
  299. let link = `{!! yzWebFullUrl('plugin.group-code.admin.group-code.add') !!}`;
  300. console.log(link);
  301. window.location.href = link;
  302. },
  303. del(id,index) {
  304. console.log(id,index)
  305. this.$confirm('确定删除吗', '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {
  306. let loading = this.$loading({target:document.querySelector(".content"),background: 'rgba(0, 0, 0, 0.2)'});
  307. this.$http.post('{!! yzWebFullUrl('plugin.group-code.admin.group-code.deleted-group-code') !!}',{id:id}).then(function (response) {
  308. if (response.data.result) {
  309. this.list.splice(index,1);
  310. this.$message({type: 'success',message: '删除成功!'});
  311. }
  312. else{
  313. this.$message({type: 'error',message: response.data.msg});
  314. }
  315. loading.close();
  316. this.search(this.current_page)
  317. },function (response) {
  318. this.$message({type: 'error',message: response.data.msg});
  319. loading.close();
  320. }
  321. );
  322. }).catch(() => {
  323. this.$message({type: 'info',message: '已取消删除'});
  324. });
  325. },
  326. // 快速修改
  327. changeStatus(id,index,type,value) {
  328. let that = this;
  329. let json = {id: id, status: value};
  330. if(type=="status") {
  331. json.type = 2;
  332. }
  333. else if(type=="recommend") {
  334. json.type = 1;
  335. }
  336. let loading = this.$loading({target:document.querySelector(".content"),background: 'rgba(0, 0, 0, 0.2)'});
  337. that.$http.post("{!! yzWebFullUrl('plugin.group-code.admin.group-code.update-status') !!}", json).then(response => {
  338. console.log(response);
  339. if (response.data.result == 1) {
  340. that.$message.success('操作成功!');
  341. } else {
  342. that.$message.error(response.data.msg);
  343. that.list[index][type] == 1 ? 0 : 1;
  344. }
  345. that.search(this.current_page);
  346. loading.close();
  347. }), function (res) {
  348. console.log(res);
  349. loading.close();
  350. };
  351. },
  352. },
  353. })
  354. </script>
  355. @endsection