index.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. <?php
  2. ?>
  3. <style>
  4. .table-body {
  5. padding: 20px;
  6. background-color: #fff;
  7. }
  8. .table-body .el-button {
  9. padding: 0 !important;
  10. border: 0;
  11. margin: 0 5px;
  12. }
  13. .input-item {
  14. width: 200px;
  15. margin: 0 0 20px;
  16. display: inline-block;
  17. }
  18. /*.input-item .el-input__inner {*/
  19. /* border-right: 0;*/
  20. /*}*/
  21. .input-item .el-input__inner:hover {
  22. border: 1px solid #dcdfe6;
  23. /*border-right: 0;*/
  24. outline: 0;
  25. }
  26. .input-item .el-input__inner:focus {
  27. border: 1px solid #dcdfe6;
  28. /*border-right: 0;*/
  29. outline: 0;
  30. }
  31. .input-item .el-input-group__append {
  32. background-color: #fff;
  33. border-left: 0;
  34. width: 10%;
  35. padding: 0;
  36. }
  37. .input-item .el-input-group__append .el-button {
  38. padding: 0;
  39. }
  40. .input-item .el-input-group__append .el-button {
  41. margin: 0;
  42. }
  43. .share-name {
  44. width: 90px;
  45. display: inline-block;
  46. margin-right: 18px;
  47. text-align: end;
  48. }
  49. .share-pop-model {
  50. margin-top: 20px;
  51. }
  52. </style>
  53. <div id="app" v-cloak>
  54. <el-card shadow="never" style="border:0;min-width: 1000px;" body-style="background-color: #f3f3f3;padding: 10px 0 0;">
  55. <div slot="header">
  56. <span>积分商品</span>
  57. <div style="float: right; margin: -5px 0">
  58. <el-button type="primary" size="small" @click="handle('add')">添加商品</el-button>
  59. </div>
  60. </div>
  61. <div class="table-body">
  62. <div id="qrcode-info" style="position: fixed;top: 10000000000px;">
  63. <!-- 二维码 -->
  64. <div id="qrcode" style="width:100px; height:100px; margin-top:15px;"></div>
  65. </div>
  66. <el-form :inline="true" :model="search" size="small" >
  67. <div class="input-item">
  68. <el-input size="small" placeholder="请输入商品名称" v-model="search.goods_name"></el-input>
  69. </div>
  70. <el-button type="primary" size="small" style="padding: 9px 15px !important;" @click="send('search')">搜索</el-button>
  71. <el-button type="danger" size="small" style="padding: 9px 15px !important;" @click="send('clearSearch')" v-if="search.goods_name != ''">清除条件</el-button>
  72. </el-form>
  73. <el-table :data="list" stripe v-loading="loading" size="small" style="margin-bottom: 15px;">
  74. <el-table-column label="商品ID" prop="goods_id" align="center"></el-table-column>
  75. <el-table-column align="left" label="商品" :show-overflow-tooltip="true">
  76. <template slot-scope="scope">
  77. <div class="table-info-img-text">
  78. <el-image class="table-info-img" :src="scope.row.cover_pic">
  79. <div slot="error" class="image-slot">
  80. <com-image src="/resources/img/mall/default_img.png"></com-image>
  81. </div>
  82. </el-image>
  83. <div class="table-info-text">
  84. <div style="max-width:20px">{{scope.row.goods_name}}</div>
  85. <div style="color: #ff2727">¥{{scope.row.price}}</div>
  86. </div>
  87. </div>
  88. </template>
  89. </el-table-column>
  90. <el-table-column label="兑换类型" prop="type_info" align="center"></el-table-column>
  91. <el-table-column label="兑换价" prop="money" align="center">
  92. <template slot-scope="scope">
  93. <div v-if="scope.row.type=='1'">{{scope.row.score}}积分</div>
  94. <div v-if="scope.row.type=='2'">{{scope.row.score}}积分+¥{{scope.row.money}}</div>
  95. <div v-if="scope.row.type=='3'">{{scope.row.price}}积分</div>
  96. </template>
  97. </el-table-column>
  98. <el-table-column label="兑换数量" prop="num" align="center"></el-table-column>
  99. <el-table-column label="创建时间" prop="created_at" align="center"></el-table-column>
  100. <el-table-column label="操作" width="300px" align="center">
  101. <template slot-scope="scope">
  102. <el-button v-if="domain!=''" type="text" @click="handle('getQrcode', scope.row)">推广码</el-button>
  103. <el-button type="text" @click="handle('edit', scope.row)">编辑</el-button>
  104. <el-button type="text" @click="handle('delete', scope.row, scope.$index)">删除</el-button>
  105. </template>
  106. </el-table-column>
  107. </el-table>
  108. <div flex="box:last cross:center">
  109. <div></div>
  110. <div>
  111. <el-pagination background @current-change="pagination"
  112. layout="prev, pager, next" :page-count="pageCount">
  113. </el-pagination>
  114. </div>
  115. </div>
  116. </div>
  117. <el-dialog v-loading="QRcodeLoading" element-loading-text="二维码生成中" title="分享" :visible.sync="sharePop" width="30%">
  118. <div class="share-pop-model">
  119. <div class="share-name">分享链接</div>
  120. <el-input style="width: 50%;" v-model="shareData.url" placeholder="暂无链接" disabled>
  121. <template slot="append">
  122. <el-button circle size="mini" type="text" @click="handle('copyLink', shareData.url)" class="copy_btn">复制</el-button>
  123. </template>
  124. </el-input>
  125. </div>
  126. <div class="share-pop-model" flex>
  127. <div class="share-name">二维码</div>
  128. <div style="width: 180px; height: 180px;background: #F2F2F2;margin-right: 12px;margin-left:5px" flex="main:center cross:center">
  129. <el-image style="width: 144px; height: 144px;" :src="shareData.img"></el-image>
  130. </div>
  131. <!-- downloadShareImg('poster') -->
  132. <!-- <el-button flex type="text" @click="getPoster">下载海报</el-button>-->
  133. <el-button flex type="text" @click="handle('downloadQrcode')">下载二维码</el-button>
  134. </div>
  135. </el-dialog>
  136. </el-card>
  137. </div>
  138. <!-- <script src="https://cdn.jsdelivr.net/clipboard.js/1.5.12/clipboard.min.js"></script> -->
  139. <script src="/resources/unpkg/clipboard@1.5.12/dist/clipboard.min.js"></script>
  140. <script>
  141. const app = new Vue({
  142. el: '#app',
  143. data: {
  144. search: {
  145. goods_name: ''
  146. },
  147. shareData: {
  148. url: "", //链接
  149. img: "", //二维码
  150. qrcode_filename: '', // 二维码文件名
  151. },
  152. loading: false,
  153. QRcodeLoading: false,
  154. sharePop: false,
  155. domain: '',
  156. page: 1,
  157. pageCount: 0,
  158. list: []
  159. },
  160. mounted() {
  161. this.send('getData');
  162. },
  163. methods: {
  164. send(type) {
  165. switch (type) {
  166. case 'getData':
  167. this.loading = true;
  168. request({
  169. params: {
  170. r : 'score-mall/default/index',
  171. page: this.page,
  172. goods_name: this.search.goods_name
  173. },
  174. method: 'get'
  175. }).then(e=>{
  176. this.loading = false;
  177. if (e.data.code == 0) {
  178. this.list = e.data.data.list;
  179. this.pageCount = e.data.data.page_count;
  180. this.domain = e.data.data.domain;
  181. } else {
  182. this.$message.error(e.data.msg);
  183. }
  184. }).catch(e => {
  185. this.loading = false;
  186. this.$message.error(e.data.msg);
  187. });
  188. break;
  189. case 'search':
  190. this.page = 1;
  191. this.send('getData');
  192. break;
  193. case 'clearSearch':
  194. this.page = 1;
  195. this.search.goods_name = '';
  196. this.send('getData');
  197. break;
  198. }
  199. },
  200. async handle(type, param1 = null, param2 = null) {
  201. switch (type) {
  202. case 'edit':
  203. let info = {r: 'score-mall/default/edit',goods_id:param1.goods_id};
  204. navigateTo(info);
  205. break;
  206. case 'delete':
  207. this.$confirm('删除该商品, 是否继续?', '提示', {
  208. confirmButtonText: '确定',
  209. cancelButtonText: '取消',
  210. type: 'warning'
  211. }).then(() => {
  212. this.loading = true;
  213. request({
  214. params: {
  215. r: 'score-mall/default/delete',
  216. },
  217. method: 'post',
  218. data: {
  219. goods_id: param1.goods_id,
  220. }
  221. }).then(e => {
  222. this.loading = false;
  223. if (e.data.code === 0) {
  224. this.$message.success(e.data.msg);
  225. this.list.splice(param2, 1);
  226. } else {
  227. this.$message.error(e.data.msg);
  228. }
  229. }).catch(e => {
  230. this.loading = false;
  231. this.$message.error(e.data.msg);
  232. });
  233. }).catch(() => {
  234. this.$message.info('已取消删除')
  235. });
  236. break;
  237. case 'add':
  238. let params = {r: 'score-mall/default/edit'}
  239. navigateTo(params);
  240. break;
  241. case 'getQrcode':
  242. this.QRcodeLoading = true;
  243. this.sharePop = true;
  244. let domain = this.domain.split('?');
  245. let url = domain[0] + 'plugins/pages/goods/detail?marketing_type=ScoreMall&proId=' + param1.goods_id + '&' + domain[1];
  246. this.shareData.img = await this.handle('createQrcode', url);
  247. this.shareData.url = url;
  248. this.shareData.qrcode_filename = param1.goods_name;
  249. this.QRcodeLoading = false;
  250. break;
  251. case 'createQrcode':
  252. let qrcodeInfo = document.getElementById("qrcode-info");
  253. document.getElementById("qrcode").remove(); //删除生成的二维码
  254. let addCodeDom = document.createElement("div")
  255. addCodeDom.setAttribute("id", "qrcode");
  256. addCodeDom.setAttribute("style", "width:300px; height:300px;");
  257. qrcodeInfo.appendChild(addCodeDom) //添加标签
  258. let qrCodeDom = document.getElementById("qrcode")
  259. var qrcode = new QRCode(qrCodeDom, {
  260. width: 300,
  261. height: 300
  262. });
  263. qrcode.makeCode(param1);
  264. // 获取二维码生成的图片信息
  265. return new Promise((req, rej) => {
  266. setTimeout(() => {
  267. src = qrCodeDom.getElementsByTagName("img")[0].src;
  268. req(src)
  269. }, 200);
  270. })
  271. break;
  272. case 'downloadQrcode':
  273. var img_url = this.shareData.img;
  274. var filename = this.shareData.qrcode_filename;
  275. fetch(img_url).then(res => res.blob().then(blob => {
  276. var a = document.createElement('a');
  277. var url = window.URL.createObjectURL(blob);
  278. a.href = url;
  279. a.download = filename;
  280. a.click();
  281. window.URL.revokeObjectURL(url);
  282. }))
  283. break;
  284. case 'copyLink':
  285. var clipboard = new Clipboard('.copy_btn', {
  286. text: function() {
  287. return param1;
  288. }
  289. });
  290. var self = this;
  291. clipboard.on('success', function(e) {
  292. // console.log("success")
  293. self.$message.success('复制成功');
  294. e.clearSelection();
  295. clipboard.destroy()
  296. });
  297. clipboard.on('error', function(e) {
  298. // console.log("error")
  299. self.$message.error('复制失败,请手动复制');
  300. });
  301. break;
  302. }
  303. },
  304. pagination(currentPage) {
  305. let self = this;
  306. self.page = currentPage;
  307. this.send('getData');
  308. }
  309. }
  310. })
  311. </script>