hwq 2 lat temu
rodzic
commit
05c0eb139e

+ 35 - 16
api/coupon.js

@@ -1,38 +1,57 @@
 import request from '@/utils/request'
 
-//获取优惠券列表
-export function getCouponsList(data,types) {
-	//优惠券状态 0全部 1未使用 2已使用
+
+// 店铺列表
+export function store_list(data) {
 	return request({
-		url: '/api/coupons/user/'+types,
+		url: '/api/store_list',
 		method: 'get',
 		data
 	});
 }
 
-//领取优惠券
-export function setCoupons(data) {
+// 店铺详情
+export function store_details(data, id) {
 	return request({
-		url: '/api/coupon/receive',
-		method: 'post',
+		url: '/api/store_details/' + id,
+		method: 'get',
 		data
 	});
 }
 
-//获取可使用优惠券
-export function couponsOrder(data,price) {
+// 获取门店组
+export function groups(data, id) {
 	return request({
-		url: '/api/coupons/order/'+price,
+		url: '/api/groups/' + id,
 		method: 'get',
 		data
 	});
 }
 
-//优惠券列表
-export function couponslist(data) {
+
+// 设置管理员
+export function setAdmin(data, id) {
 	return request({
-		url: '/api/coupons',
-		method: 'get',
+		url: '/api/setAdmin',
+		method: 'post',
 		data
 	});
-}
+}
+
+// 设置店长
+export function setLeader(data, id) {
+	return request({
+		url: '/api/setLeader/' + id,
+		method: 'post',
+		data
+	});
+}
+
+// 店员绑定
+export function setWaiter(data, id) {
+	return request({
+		url: '/api/setWaiter/' + id,
+		method: 'post',
+		data
+	});
+}

+ 64 - 0
api/info.js

@@ -1,5 +1,23 @@
 import request from '@/utils/request'
 
+// 获取首页数据
+export function loadIndexs(data) {
+	return request({
+		url: '/api/big_screen',
+		method: 'get',
+		params: data
+	});
+}
+
+// 播报订单信息
+export function play(data, id) {
+	return request({
+		url: '/api/store/order/play/' + id,
+		method: 'post',
+		params: data
+	});
+}
+
 // 过万大神
 export function over10000(data) {
 	return request({
@@ -70,3 +88,49 @@ export function set_waiter(data) {
 		data
 	});
 }
+
+//小组列表
+export function groupList(data) {
+	return request({
+		url: '/api/group/list',
+		method: 'get',
+		data
+	});
+}
+
+// 个人裂变排行榜
+export function user_explode_rank(data) {
+	return request({
+		url: '/api/user_explode_rank',
+		method: 'get',
+		params: data
+	});
+}
+
+// 门店裂变排行
+export function store_explode_rank(data) {
+	return request({
+		url: '/api/store_explode_rank',
+		method: 'get',
+		params: data
+	});
+}
+
+// 超级客户
+export function super_user(data) {
+	return request({
+		url: '/api/super_user',
+		method: 'get',
+		params: data
+	});
+}
+
+
+// 小组裂变金额排行
+export function group_explode_rank(data) {
+	return request({
+		url: '/api/group_explode_rank',
+		method: 'get',
+		params: data
+	});
+}

+ 9 - 0
api/user.js

@@ -157,3 +157,12 @@ export function transfer(data, id) {
 		data
 	})
 }
+
+// H5授权
+export function h5Auth(data, id) {
+	return request({
+		url: '/api/h5Auth/' + id,
+		method: 'post',
+		data
+	})
+}

+ 8 - 2
manifest.json

@@ -76,10 +76,15 @@
             "postcss" : true,
             "es6" : false
         },
-        "permission" : {}
+        "permission" : {
+            "scope.userLocation" : {
+                "desc" : "需要根据你的定位来给你推送最近的门店"
+            }
+        },
+        "requiredPrivateInfos" : [ "getLocation" ]
     },
     "h5" : {
-        "title" : "智播商城",
+        "title" : "城攻闪拓",
         "domain" : "",
         "router" : {
             "base" : "/index/",
@@ -94,6 +99,7 @@
             "proxy" : {
                 "/api" : {
                     "target" : "https://cgst.liuniu946.com/api",
+                    // "target" : "http://cgst.frp.liuniu946.com/api",
                     // "changeOrigin": true,
                     "pathRewrite" : {
                         "/api" : "" // rewrite path

+ 101 - 0
node_modules/js-md5/CHANGELOG.md

@@ -0,0 +1,101 @@
+# Change Log
+
+## v0.7.3 / 2017-12-18
+### Fixed
+- incorrect result when first bit is 1 of bytes. #18
+
+## v0.7.2 / 2017-10-31
+### Improved
+- performance of hBytes increment.
+
+## v0.7.1 / 2017-10-29
+### Fixed
+- incorrect result when file size >= 4G.
+
+## v0.7.0 / 2017-10-29
+### Fixed
+- incorrect result when file size >= 512M.
+
+## v0.6.1 / 2017-10-07
+### Fixed
+- ArrayBuffer.isView issue in IE10.
+
+### Improved
+- performance of input check.
+
+## v0.6.0 / 2017-07-28
+### Added
+- support base64 string output.
+
+## v0.5.0 / 2017-07-14
+### Added
+- support for web worker. #11
+
+### Changed
+- throw error if input type is incorrect.
+- prevent webpack to require dependencies.
+
+## v0.4.2 / 2017-01-18
+### Fixed
+- `root` is undefined in some special environment. #7
+
+## v0.4.1 / 2016-03-31
+### Removed
+- length detection in node.js.
+### Deprecated
+- `buffer` and replace by `arrayBuffer`.
+
+## v0.4.0 / 2015-12-28
+### Added
+- support for update hash.
+- support for bytes array output.
+- support for ArrayBuffer output.
+- support for AMD.
+
+## v0.3.0 / 2015-03-07
+### Added
+- support byte Array, Uint8Array and ArrayBuffer input.
+
+## v0.2.2 / 2015-02-01
+### Fixed
+- bug when special length.
+### Improve
+- performance for node.js.
+
+## v0.2.1 / 2015-01-13
+### Improve
+- performance.
+
+## v0.2.0 / 2015-01-12
+### Removed
+- ascii parameter.
+### Improve
+- performance.
+
+## v0.1.4 / 2015-01-11
+### Improve
+- performance.
+### Added
+- test cases.
+
+## v0.1.3 / 2015-01-05
+### Added
+- bower package.
+- travis.
+- coveralls.
+### Improved
+- performance.
+### Fixed
+- JSHint warnings.
+
+## v0.1.2 / 2014-07-27
+### Fixed
+- accents bug
+
+## v0.1.1 / 2014-01-05
+### Changed
+- license
+
+## v0.1.0 / 2014-01-04
+### Added
+- initial release

+ 20 - 0
node_modules/js-md5/LICENSE.txt

@@ -0,0 +1,20 @@
+Copyright 2014-2017 Chen, Yi-Cyuan
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 76 - 0
node_modules/js-md5/README.md

@@ -0,0 +1,76 @@
+# js-md5
+[![Build Status](https://travis-ci.org/emn178/js-md5.svg?branch=master)](https://travis-ci.org/emn178/js-md5)
+[![Coverage Status](https://coveralls.io/repos/emn178/js-md5/badge.svg?branch=master)](https://coveralls.io/r/emn178/js-md5?branch=master)  
+[![NPM](https://nodei.co/npm/js-md5.png?stars&downloads)](https://nodei.co/npm/js-md5/)
+
+A simple MD5 hash function for JavaScript supports UTF-8 encoding.
+
+## Demo
+[MD5 Online](http://emn178.github.io/online-tools/md5.html)  
+[MD5 File Checksum Online](http://emn178.github.io/online-tools/md5_checksum.html)
+
+## Download
+[Compress](https://raw.github.com/emn178/js-md5/master/build/md5.min.js)  
+[Uncompress](https://raw.github.com/emn178/js-md5/master/src/md5.js)
+
+## Installation
+You can also install js-md5 by using Bower.
+
+    bower install md5
+
+For node.js, you can use this command to install:
+
+    npm install js-md5
+
+## Notice
+`buffer` method is deprecated. This maybe confuse with Buffer in node.js. Please use `arrayBuffer` instead.
+
+## Usage
+You could use like this:
+```JavaScript
+md5('Message to hash');
+var hash = md5.create();
+hash.update('Message to hash');
+hash.hex();
+```
+If you use node.js, you should require the module first:
+```JavaScript
+md5 = require('js-md5');
+```
+It supports AMD:
+```JavaScript
+require(['your/path/md5.js'], function(md5) {
+// ...
+});
+```
+[See document](https://emn178.github.com/js-md5/doc/)
+
+## Example
+```JavaScript
+md5(''); // d41d8cd98f00b204e9800998ecf8427e
+md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6
+md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0
+
+// It also supports UTF-8 encoding
+md5('中文'); // a7bac2239fcdcb3a067903d8077c4a07
+
+// It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`
+md5([]); // d41d8cd98f00b204e9800998ecf8427e
+md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e
+
+// Different output
+md5(''); // d41d8cd98f00b204e9800998ecf8427e
+md5.hex(''); // d41d8cd98f00b204e9800998ecf8427e
+md5.array(''); // [212, 29, 140, 217, 143, 0, 178, 4, 233, 128, 9, 152, 236, 248, 66, 126]
+md5.digest(''); // [212, 29, 140, 217, 143, 0, 178, 4, 233, 128, 9, 152, 236, 248, 66, 126]
+md5.arrayBuffer(''); // ArrayBuffer
+md5.buffer(''); // ArrayBuffer, deprecated, This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
+md5.base64(''); // 1B2M2Y8AsgTpgAmY7PhCfg==
+```
+
+## License
+The project is released under the [MIT license](http://www.opensource.org/licenses/MIT).
+
+## Contact
+The project's website is located at https://github.com/emn178/js-md5  
+Author: Chen, Yi-Cyuan (emn178@gmail.com)

Plik diff jest za duży
+ 9 - 0
node_modules/js-md5/build/md5.min.js


+ 74 - 0
node_modules/js-md5/package.json

@@ -0,0 +1,74 @@
+{
+  "_from": "js-md5",
+  "_id": "js-md5@0.7.3",
+  "_inBundle": false,
+  "_integrity": "sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ==",
+  "_location": "/js-md5",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "tag",
+    "registry": true,
+    "raw": "js-md5",
+    "name": "js-md5",
+    "escapedName": "js-md5",
+    "rawSpec": "",
+    "saveSpec": null,
+    "fetchSpec": "latest"
+  },
+  "_requiredBy": [
+    "#DEV:/",
+    "#USER"
+  ],
+  "_resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.7.3.tgz",
+  "_shasum": "b4f2fbb0b327455f598d6727e38ec272cd09c3f2",
+  "_spec": "js-md5",
+  "_where": "D:\\工作\\项目2\\nft拼团\\NFT",
+  "author": {
+    "name": "Chen, Yi-Cyuan",
+    "email": "emn178@gmail.com"
+  },
+  "bugs": {
+    "url": "https://github.com/emn178/js-md5/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "A simple MD5 hash function for JavaScript supports UTF-8 encoding.",
+  "devDependencies": {
+    "expect.js": "~0.3.1",
+    "jsdoc": "^3.4.0",
+    "mocha": "~2.3.4",
+    "nyc": "^11.3.0",
+    "requirejs": "^2.1.22",
+    "uglify-js": "^3.1.9",
+    "webworker-threads": "^0.7.11"
+  },
+  "homepage": "https://github.com/emn178/js-md5",
+  "keywords": [
+    "md5",
+    "hash",
+    "encryption",
+    "cryptography",
+    "HMAC"
+  ],
+  "license": "MIT",
+  "main": "src/md5.js",
+  "name": "js-md5",
+  "nyc": {
+    "exclude": [
+      "tests"
+    ]
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/emn178/js-md5.git"
+  },
+  "scripts": {
+    "build": "npm run-script compress;npm run-script doc",
+    "compress": "uglifyjs src/md5.js -c -m eval --comments --output build/md5.min.js",
+    "coveralls": "nyc report --reporter=text-lcov | coveralls",
+    "doc": "rm -rf doc;jsdoc src README.md -d doc",
+    "report": "nyc --reporter=html --reporter=text mocha tests/node-test.js",
+    "test": "nyc mocha tests/node-test.js"
+  },
+  "version": "0.7.3"
+}

+ 683 - 0
node_modules/js-md5/src/md5.js

@@ -0,0 +1,683 @@
+/**
+ * [js-md5]{@link https://github.com/emn178/js-md5}
+ *
+ * @namespace md5
+ * @version 0.7.3
+ * @author Chen, Yi-Cyuan [emn178@gmail.com]
+ * @copyright Chen, Yi-Cyuan 2014-2017
+ * @license MIT
+ */
+(function () {
+  'use strict';
+
+  var ERROR = 'input is invalid type';
+  var WINDOW = typeof window === 'object';
+  var root = WINDOW ? window : {};
+  if (root.JS_MD5_NO_WINDOW) {
+    WINDOW = false;
+  }
+  var WEB_WORKER = !WINDOW && typeof self === 'object';
+  var NODE_JS = !root.JS_MD5_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;
+  if (NODE_JS) {
+    root = global;
+  } else if (WEB_WORKER) {
+    root = self;
+  }
+  var COMMON_JS = !root.JS_MD5_NO_COMMON_JS && typeof module === 'object' && module.exports;
+  var AMD = typeof define === 'function' && define.amd;
+  var ARRAY_BUFFER = !root.JS_MD5_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined';
+  var HEX_CHARS = '0123456789abcdef'.split('');
+  var EXTRA = [128, 32768, 8388608, -2147483648];
+  var SHIFT = [0, 8, 16, 24];
+  var OUTPUT_TYPES = ['hex', 'array', 'digest', 'buffer', 'arrayBuffer', 'base64'];
+  var BASE64_ENCODE_CHAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
+
+  var blocks = [], buffer8;
+  if (ARRAY_BUFFER) {
+    var buffer = new ArrayBuffer(68);
+    buffer8 = new Uint8Array(buffer);
+    blocks = new Uint32Array(buffer);
+  }
+
+  if (root.JS_MD5_NO_NODE_JS || !Array.isArray) {
+    Array.isArray = function (obj) {
+      return Object.prototype.toString.call(obj) === '[object Array]';
+    };
+  }
+
+  if (ARRAY_BUFFER && (root.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) {
+    ArrayBuffer.isView = function (obj) {
+      return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;
+    };
+  }
+
+  /**
+   * @method hex
+   * @memberof md5
+   * @description Output hash as hex string
+   * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
+   * @returns {String} Hex string
+   * @example
+   * md5.hex('The quick brown fox jumps over the lazy dog');
+   * // equal to
+   * md5('The quick brown fox jumps over the lazy dog');
+   */
+  /**
+   * @method digest
+   * @memberof md5
+   * @description Output hash as bytes array
+   * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
+   * @returns {Array} Bytes array
+   * @example
+   * md5.digest('The quick brown fox jumps over the lazy dog');
+   */
+  /**
+   * @method array
+   * @memberof md5
+   * @description Output hash as bytes array
+   * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
+   * @returns {Array} Bytes array
+   * @example
+   * md5.array('The quick brown fox jumps over the lazy dog');
+   */
+  /**
+   * @method arrayBuffer
+   * @memberof md5
+   * @description Output hash as ArrayBuffer
+   * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
+   * @returns {ArrayBuffer} ArrayBuffer
+   * @example
+   * md5.arrayBuffer('The quick brown fox jumps over the lazy dog');
+   */
+  /**
+   * @method buffer
+   * @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
+   * @memberof md5
+   * @description Output hash as ArrayBuffer
+   * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
+   * @returns {ArrayBuffer} ArrayBuffer
+   * @example
+   * md5.buffer('The quick brown fox jumps over the lazy dog');
+   */
+  /**
+   * @method base64
+   * @memberof md5
+   * @description Output hash as base64 string
+   * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
+   * @returns {String} base64 string
+   * @example
+   * md5.base64('The quick brown fox jumps over the lazy dog');
+   */
+  var createOutputMethod = function (outputType) {
+    return function (message) {
+      return new Md5(true).update(message)[outputType]();
+    };
+  };
+
+  /**
+   * @method create
+   * @memberof md5
+   * @description Create Md5 object
+   * @returns {Md5} Md5 object.
+   * @example
+   * var hash = md5.create();
+   */
+  /**
+   * @method update
+   * @memberof md5
+   * @description Create and update Md5 object
+   * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
+   * @returns {Md5} Md5 object.
+   * @example
+   * var hash = md5.update('The quick brown fox jumps over the lazy dog');
+   * // equal to
+   * var hash = md5.create();
+   * hash.update('The quick brown fox jumps over the lazy dog');
+   */
+  var createMethod = function () {
+    var method = createOutputMethod('hex');
+    if (NODE_JS) {
+      method = nodeWrap(method);
+    }
+    method.create = function () {
+      return new Md5();
+    };
+    method.update = function (message) {
+      return method.create().update(message);
+    };
+    for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
+      var type = OUTPUT_TYPES[i];
+      method[type] = createOutputMethod(type);
+    }
+    return method;
+  };
+
+  var nodeWrap = function (method) {
+    var crypto = eval("require('crypto')");
+    var Buffer = eval("require('buffer').Buffer");
+    var nodeMethod = function (message) {
+      if (typeof message === 'string') {
+        return crypto.createHash('md5').update(message, 'utf8').digest('hex');
+      } else {
+        if (message === null || message === undefined) {
+          throw ERROR;
+        } else if (message.constructor === ArrayBuffer) {
+          message = new Uint8Array(message);
+        }
+      }
+      if (Array.isArray(message) || ArrayBuffer.isView(message) ||
+        message.constructor === Buffer) {
+        return crypto.createHash('md5').update(new Buffer(message)).digest('hex');
+      } else {
+        return method(message);
+      }
+    };
+    return nodeMethod;
+  };
+
+  /**
+   * Md5 class
+   * @class Md5
+   * @description This is internal class.
+   * @see {@link md5.create}
+   */
+  function Md5(sharedMemory) {
+    if (sharedMemory) {
+      blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] =
+      blocks[4] = blocks[5] = blocks[6] = blocks[7] =
+      blocks[8] = blocks[9] = blocks[10] = blocks[11] =
+      blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
+      this.blocks = blocks;
+      this.buffer8 = buffer8;
+    } else {
+      if (ARRAY_BUFFER) {
+        var buffer = new ArrayBuffer(68);
+        this.buffer8 = new Uint8Array(buffer);
+        this.blocks = new Uint32Array(buffer);
+      } else {
+        this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
+      }
+    }
+    this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = this.hBytes = 0;
+    this.finalized = this.hashed = false;
+    this.first = true;
+  }
+
+  /**
+   * @method update
+   * @memberof Md5
+   * @instance
+   * @description Update hash
+   * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
+   * @returns {Md5} Md5 object.
+   * @see {@link md5.update}
+   */
+  Md5.prototype.update = function (message) {
+    if (this.finalized) {
+      return;
+    }
+
+    var notString, type = typeof message;
+    if (type !== 'string') {
+      if (type === 'object') {
+        if (message === null) {
+          throw ERROR;
+        } else if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {
+          message = new Uint8Array(message);
+        } else if (!Array.isArray(message)) {
+          if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) {
+            throw ERROR;
+          }
+        }
+      } else {
+        throw ERROR;
+      }
+      notString = true;
+    }
+    var code, index = 0, i, length = message.length, blocks = this.blocks;
+    var buffer8 = this.buffer8;
+
+    while (index < length) {
+      if (this.hashed) {
+        this.hashed = false;
+        blocks[0] = blocks[16];
+        blocks[16] = blocks[1] = blocks[2] = blocks[3] =
+        blocks[4] = blocks[5] = blocks[6] = blocks[7] =
+        blocks[8] = blocks[9] = blocks[10] = blocks[11] =
+        blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
+      }
+
+      if (notString) {
+        if (ARRAY_BUFFER) {
+          for (i = this.start; index < length && i < 64; ++index) {
+            buffer8[i++] = message[index];
+          }
+        } else {
+          for (i = this.start; index < length && i < 64; ++index) {
+            blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];
+          }
+        }
+      } else {
+        if (ARRAY_BUFFER) {
+          for (i = this.start; index < length && i < 64; ++index) {
+            code = message.charCodeAt(index);
+            if (code < 0x80) {
+              buffer8[i++] = code;
+            } else if (code < 0x800) {
+              buffer8[i++] = 0xc0 | (code >> 6);
+              buffer8[i++] = 0x80 | (code & 0x3f);
+            } else if (code < 0xd800 || code >= 0xe000) {
+              buffer8[i++] = 0xe0 | (code >> 12);
+              buffer8[i++] = 0x80 | ((code >> 6) & 0x3f);
+              buffer8[i++] = 0x80 | (code & 0x3f);
+            } else {
+              code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
+              buffer8[i++] = 0xf0 | (code >> 18);
+              buffer8[i++] = 0x80 | ((code >> 12) & 0x3f);
+              buffer8[i++] = 0x80 | ((code >> 6) & 0x3f);
+              buffer8[i++] = 0x80 | (code & 0x3f);
+            }
+          }
+        } else {
+          for (i = this.start; index < length && i < 64; ++index) {
+            code = message.charCodeAt(index);
+            if (code < 0x80) {
+              blocks[i >> 2] |= code << SHIFT[i++ & 3];
+            } else if (code < 0x800) {
+              blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];
+              blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
+            } else if (code < 0xd800 || code >= 0xe000) {
+              blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];
+              blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
+              blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
+            } else {
+              code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
+              blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];
+              blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];
+              blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
+              blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
+            }
+          }
+        }
+      }
+      this.lastByteIndex = i;
+      this.bytes += i - this.start;
+      if (i >= 64) {
+        this.start = i - 64;
+        this.hash();
+        this.hashed = true;
+      } else {
+        this.start = i;
+      }
+    }
+    if (this.bytes > 4294967295) {
+      this.hBytes += this.bytes / 4294967296 << 0;
+      this.bytes = this.bytes % 4294967296;
+    }
+    return this;
+  };
+
+  Md5.prototype.finalize = function () {
+    if (this.finalized) {
+      return;
+    }
+    this.finalized = true;
+    var blocks = this.blocks, i = this.lastByteIndex;
+    blocks[i >> 2] |= EXTRA[i & 3];
+    if (i >= 56) {
+      if (!this.hashed) {
+        this.hash();
+      }
+      blocks[0] = blocks[16];
+      blocks[16] = blocks[1] = blocks[2] = blocks[3] =
+      blocks[4] = blocks[5] = blocks[6] = blocks[7] =
+      blocks[8] = blocks[9] = blocks[10] = blocks[11] =
+      blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
+    }
+    blocks[14] = this.bytes << 3;
+    blocks[15] = this.hBytes << 3 | this.bytes >>> 29;
+    this.hash();
+  };
+
+  Md5.prototype.hash = function () {
+    var a, b, c, d, bc, da, blocks = this.blocks;
+
+    if (this.first) {
+      a = blocks[0] - 680876937;
+      a = (a << 7 | a >>> 25) - 271733879 << 0;
+      d = (-1732584194 ^ a & 2004318071) + blocks[1] - 117830708;
+      d = (d << 12 | d >>> 20) + a << 0;
+      c = (-271733879 ^ (d & (a ^ -271733879))) + blocks[2] - 1126478375;
+      c = (c << 17 | c >>> 15) + d << 0;
+      b = (a ^ (c & (d ^ a))) + blocks[3] - 1316259209;
+      b = (b << 22 | b >>> 10) + c << 0;
+    } else {
+      a = this.h0;
+      b = this.h1;
+      c = this.h2;
+      d = this.h3;
+      a += (d ^ (b & (c ^ d))) + blocks[0] - 680876936;
+      a = (a << 7 | a >>> 25) + b << 0;
+      d += (c ^ (a & (b ^ c))) + blocks[1] - 389564586;
+      d = (d << 12 | d >>> 20) + a << 0;
+      c += (b ^ (d & (a ^ b))) + blocks[2] + 606105819;
+      c = (c << 17 | c >>> 15) + d << 0;
+      b += (a ^ (c & (d ^ a))) + blocks[3] - 1044525330;
+      b = (b << 22 | b >>> 10) + c << 0;
+    }
+
+    a += (d ^ (b & (c ^ d))) + blocks[4] - 176418897;
+    a = (a << 7 | a >>> 25) + b << 0;
+    d += (c ^ (a & (b ^ c))) + blocks[5] + 1200080426;
+    d = (d << 12 | d >>> 20) + a << 0;
+    c += (b ^ (d & (a ^ b))) + blocks[6] - 1473231341;
+    c = (c << 17 | c >>> 15) + d << 0;
+    b += (a ^ (c & (d ^ a))) + blocks[7] - 45705983;
+    b = (b << 22 | b >>> 10) + c << 0;
+    a += (d ^ (b & (c ^ d))) + blocks[8] + 1770035416;
+    a = (a << 7 | a >>> 25) + b << 0;
+    d += (c ^ (a & (b ^ c))) + blocks[9] - 1958414417;
+    d = (d << 12 | d >>> 20) + a << 0;
+    c += (b ^ (d & (a ^ b))) + blocks[10] - 42063;
+    c = (c << 17 | c >>> 15) + d << 0;
+    b += (a ^ (c & (d ^ a))) + blocks[11] - 1990404162;
+    b = (b << 22 | b >>> 10) + c << 0;
+    a += (d ^ (b & (c ^ d))) + blocks[12] + 1804603682;
+    a = (a << 7 | a >>> 25) + b << 0;
+    d += (c ^ (a & (b ^ c))) + blocks[13] - 40341101;
+    d = (d << 12 | d >>> 20) + a << 0;
+    c += (b ^ (d & (a ^ b))) + blocks[14] - 1502002290;
+    c = (c << 17 | c >>> 15) + d << 0;
+    b += (a ^ (c & (d ^ a))) + blocks[15] + 1236535329;
+    b = (b << 22 | b >>> 10) + c << 0;
+    a += (c ^ (d & (b ^ c))) + blocks[1] - 165796510;
+    a = (a << 5 | a >>> 27) + b << 0;
+    d += (b ^ (c & (a ^ b))) + blocks[6] - 1069501632;
+    d = (d << 9 | d >>> 23) + a << 0;
+    c += (a ^ (b & (d ^ a))) + blocks[11] + 643717713;
+    c = (c << 14 | c >>> 18) + d << 0;
+    b += (d ^ (a & (c ^ d))) + blocks[0] - 373897302;
+    b = (b << 20 | b >>> 12) + c << 0;
+    a += (c ^ (d & (b ^ c))) + blocks[5] - 701558691;
+    a = (a << 5 | a >>> 27) + b << 0;
+    d += (b ^ (c & (a ^ b))) + blocks[10] + 38016083;
+    d = (d << 9 | d >>> 23) + a << 0;
+    c += (a ^ (b & (d ^ a))) + blocks[15] - 660478335;
+    c = (c << 14 | c >>> 18) + d << 0;
+    b += (d ^ (a & (c ^ d))) + blocks[4] - 405537848;
+    b = (b << 20 | b >>> 12) + c << 0;
+    a += (c ^ (d & (b ^ c))) + blocks[9] + 568446438;
+    a = (a << 5 | a >>> 27) + b << 0;
+    d += (b ^ (c & (a ^ b))) + blocks[14] - 1019803690;
+    d = (d << 9 | d >>> 23) + a << 0;
+    c += (a ^ (b & (d ^ a))) + blocks[3] - 187363961;
+    c = (c << 14 | c >>> 18) + d << 0;
+    b += (d ^ (a & (c ^ d))) + blocks[8] + 1163531501;
+    b = (b << 20 | b >>> 12) + c << 0;
+    a += (c ^ (d & (b ^ c))) + blocks[13] - 1444681467;
+    a = (a << 5 | a >>> 27) + b << 0;
+    d += (b ^ (c & (a ^ b))) + blocks[2] - 51403784;
+    d = (d << 9 | d >>> 23) + a << 0;
+    c += (a ^ (b & (d ^ a))) + blocks[7] + 1735328473;
+    c = (c << 14 | c >>> 18) + d << 0;
+    b += (d ^ (a & (c ^ d))) + blocks[12] - 1926607734;
+    b = (b << 20 | b >>> 12) + c << 0;
+    bc = b ^ c;
+    a += (bc ^ d) + blocks[5] - 378558;
+    a = (a << 4 | a >>> 28) + b << 0;
+    d += (bc ^ a) + blocks[8] - 2022574463;
+    d = (d << 11 | d >>> 21) + a << 0;
+    da = d ^ a;
+    c += (da ^ b) + blocks[11] + 1839030562;
+    c = (c << 16 | c >>> 16) + d << 0;
+    b += (da ^ c) + blocks[14] - 35309556;
+    b = (b << 23 | b >>> 9) + c << 0;
+    bc = b ^ c;
+    a += (bc ^ d) + blocks[1] - 1530992060;
+    a = (a << 4 | a >>> 28) + b << 0;
+    d += (bc ^ a) + blocks[4] + 1272893353;
+    d = (d << 11 | d >>> 21) + a << 0;
+    da = d ^ a;
+    c += (da ^ b) + blocks[7] - 155497632;
+    c = (c << 16 | c >>> 16) + d << 0;
+    b += (da ^ c) + blocks[10] - 1094730640;
+    b = (b << 23 | b >>> 9) + c << 0;
+    bc = b ^ c;
+    a += (bc ^ d) + blocks[13] + 681279174;
+    a = (a << 4 | a >>> 28) + b << 0;
+    d += (bc ^ a) + blocks[0] - 358537222;
+    d = (d << 11 | d >>> 21) + a << 0;
+    da = d ^ a;
+    c += (da ^ b) + blocks[3] - 722521979;
+    c = (c << 16 | c >>> 16) + d << 0;
+    b += (da ^ c) + blocks[6] + 76029189;
+    b = (b << 23 | b >>> 9) + c << 0;
+    bc = b ^ c;
+    a += (bc ^ d) + blocks[9] - 640364487;
+    a = (a << 4 | a >>> 28) + b << 0;
+    d += (bc ^ a) + blocks[12] - 421815835;
+    d = (d << 11 | d >>> 21) + a << 0;
+    da = d ^ a;
+    c += (da ^ b) + blocks[15] + 530742520;
+    c = (c << 16 | c >>> 16) + d << 0;
+    b += (da ^ c) + blocks[2] - 995338651;
+    b = (b << 23 | b >>> 9) + c << 0;
+    a += (c ^ (b | ~d)) + blocks[0] - 198630844;
+    a = (a << 6 | a >>> 26) + b << 0;
+    d += (b ^ (a | ~c)) + blocks[7] + 1126891415;
+    d = (d << 10 | d >>> 22) + a << 0;
+    c += (a ^ (d | ~b)) + blocks[14] - 1416354905;
+    c = (c << 15 | c >>> 17) + d << 0;
+    b += (d ^ (c | ~a)) + blocks[5] - 57434055;
+    b = (b << 21 | b >>> 11) + c << 0;
+    a += (c ^ (b | ~d)) + blocks[12] + 1700485571;
+    a = (a << 6 | a >>> 26) + b << 0;
+    d += (b ^ (a | ~c)) + blocks[3] - 1894986606;
+    d = (d << 10 | d >>> 22) + a << 0;
+    c += (a ^ (d | ~b)) + blocks[10] - 1051523;
+    c = (c << 15 | c >>> 17) + d << 0;
+    b += (d ^ (c | ~a)) + blocks[1] - 2054922799;
+    b = (b << 21 | b >>> 11) + c << 0;
+    a += (c ^ (b | ~d)) + blocks[8] + 1873313359;
+    a = (a << 6 | a >>> 26) + b << 0;
+    d += (b ^ (a | ~c)) + blocks[15] - 30611744;
+    d = (d << 10 | d >>> 22) + a << 0;
+    c += (a ^ (d | ~b)) + blocks[6] - 1560198380;
+    c = (c << 15 | c >>> 17) + d << 0;
+    b += (d ^ (c | ~a)) + blocks[13] + 1309151649;
+    b = (b << 21 | b >>> 11) + c << 0;
+    a += (c ^ (b | ~d)) + blocks[4] - 145523070;
+    a = (a << 6 | a >>> 26) + b << 0;
+    d += (b ^ (a | ~c)) + blocks[11] - 1120210379;
+    d = (d << 10 | d >>> 22) + a << 0;
+    c += (a ^ (d | ~b)) + blocks[2] + 718787259;
+    c = (c << 15 | c >>> 17) + d << 0;
+    b += (d ^ (c | ~a)) + blocks[9] - 343485551;
+    b = (b << 21 | b >>> 11) + c << 0;
+
+    if (this.first) {
+      this.h0 = a + 1732584193 << 0;
+      this.h1 = b - 271733879 << 0;
+      this.h2 = c - 1732584194 << 0;
+      this.h3 = d + 271733878 << 0;
+      this.first = false;
+    } else {
+      this.h0 = this.h0 + a << 0;
+      this.h1 = this.h1 + b << 0;
+      this.h2 = this.h2 + c << 0;
+      this.h3 = this.h3 + d << 0;
+    }
+  };
+
+  /**
+   * @method hex
+   * @memberof Md5
+   * @instance
+   * @description Output hash as hex string
+   * @returns {String} Hex string
+   * @see {@link md5.hex}
+   * @example
+   * hash.hex();
+   */
+  Md5.prototype.hex = function () {
+    this.finalize();
+
+    var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
+
+    return HEX_CHARS[(h0 >> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
+      HEX_CHARS[(h0 >> 12) & 0x0F] + HEX_CHARS[(h0 >> 8) & 0x0F] +
+      HEX_CHARS[(h0 >> 20) & 0x0F] + HEX_CHARS[(h0 >> 16) & 0x0F] +
+      HEX_CHARS[(h0 >> 28) & 0x0F] + HEX_CHARS[(h0 >> 24) & 0x0F] +
+      HEX_CHARS[(h1 >> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
+      HEX_CHARS[(h1 >> 12) & 0x0F] + HEX_CHARS[(h1 >> 8) & 0x0F] +
+      HEX_CHARS[(h1 >> 20) & 0x0F] + HEX_CHARS[(h1 >> 16) & 0x0F] +
+      HEX_CHARS[(h1 >> 28) & 0x0F] + HEX_CHARS[(h1 >> 24) & 0x0F] +
+      HEX_CHARS[(h2 >> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
+      HEX_CHARS[(h2 >> 12) & 0x0F] + HEX_CHARS[(h2 >> 8) & 0x0F] +
+      HEX_CHARS[(h2 >> 20) & 0x0F] + HEX_CHARS[(h2 >> 16) & 0x0F] +
+      HEX_CHARS[(h2 >> 28) & 0x0F] + HEX_CHARS[(h2 >> 24) & 0x0F] +
+      HEX_CHARS[(h3 >> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
+      HEX_CHARS[(h3 >> 12) & 0x0F] + HEX_CHARS[(h3 >> 8) & 0x0F] +
+      HEX_CHARS[(h3 >> 20) & 0x0F] + HEX_CHARS[(h3 >> 16) & 0x0F] +
+      HEX_CHARS[(h3 >> 28) & 0x0F] + HEX_CHARS[(h3 >> 24) & 0x0F];
+  };
+
+  /**
+   * @method toString
+   * @memberof Md5
+   * @instance
+   * @description Output hash as hex string
+   * @returns {String} Hex string
+   * @see {@link md5.hex}
+   * @example
+   * hash.toString();
+   */
+  Md5.prototype.toString = Md5.prototype.hex;
+
+  /**
+   * @method digest
+   * @memberof Md5
+   * @instance
+   * @description Output hash as bytes array
+   * @returns {Array} Bytes array
+   * @see {@link md5.digest}
+   * @example
+   * hash.digest();
+   */
+  Md5.prototype.digest = function () {
+    this.finalize();
+
+    var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
+    return [
+      h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 24) & 0xFF,
+      h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 24) & 0xFF,
+      h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 24) & 0xFF,
+      h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 24) & 0xFF
+    ];
+  };
+
+  /**
+   * @method array
+   * @memberof Md5
+   * @instance
+   * @description Output hash as bytes array
+   * @returns {Array} Bytes array
+   * @see {@link md5.array}
+   * @example
+   * hash.array();
+   */
+  Md5.prototype.array = Md5.prototype.digest;
+
+  /**
+   * @method arrayBuffer
+   * @memberof Md5
+   * @instance
+   * @description Output hash as ArrayBuffer
+   * @returns {ArrayBuffer} ArrayBuffer
+   * @see {@link md5.arrayBuffer}
+   * @example
+   * hash.arrayBuffer();
+   */
+  Md5.prototype.arrayBuffer = function () {
+    this.finalize();
+
+    var buffer = new ArrayBuffer(16);
+    var blocks = new Uint32Array(buffer);
+    blocks[0] = this.h0;
+    blocks[1] = this.h1;
+    blocks[2] = this.h2;
+    blocks[3] = this.h3;
+    return buffer;
+  };
+
+  /**
+   * @method buffer
+   * @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
+   * @memberof Md5
+   * @instance
+   * @description Output hash as ArrayBuffer
+   * @returns {ArrayBuffer} ArrayBuffer
+   * @see {@link md5.buffer}
+   * @example
+   * hash.buffer();
+   */
+  Md5.prototype.buffer = Md5.prototype.arrayBuffer;
+
+  /**
+   * @method base64
+   * @memberof Md5
+   * @instance
+   * @description Output hash as base64 string
+   * @returns {String} base64 string
+   * @see {@link md5.base64}
+   * @example
+   * hash.base64();
+   */
+  Md5.prototype.base64 = function () {
+    var v1, v2, v3, base64Str = '', bytes = this.array();
+    for (var i = 0; i < 15;) {
+      v1 = bytes[i++];
+      v2 = bytes[i++];
+      v3 = bytes[i++];
+      base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
+        BASE64_ENCODE_CHAR[(v1 << 4 | v2 >>> 4) & 63] +
+        BASE64_ENCODE_CHAR[(v2 << 2 | v3 >>> 6) & 63] +
+        BASE64_ENCODE_CHAR[v3 & 63];
+    }
+    v1 = bytes[i];
+    base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
+      BASE64_ENCODE_CHAR[(v1 << 4) & 63] +
+      '==';
+    return base64Str;
+  };
+
+  var exports = createMethod();
+
+  if (COMMON_JS) {
+    module.exports = exports;
+  } else {
+    /**
+     * @method md5
+     * @description Md5 hash function, export to global in browsers.
+     * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
+     * @returns {String} md5 hashes
+     * @example
+     * md5(''); // d41d8cd98f00b204e9800998ecf8427e
+     * md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6
+     * md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0
+     *
+     * // It also supports UTF-8 encoding
+     * md5('中文'); // a7bac2239fcdcb3a067903d8077c4a07
+     *
+     * // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`
+     * md5([]); // d41d8cd98f00b204e9800998ecf8427e
+     * md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e
+     */
+    root.md5 = exports;
+    if (AMD) {
+      define(function () {
+        return exports;
+      });
+    }
+  }
+})();

+ 61 - 1
pages.json

@@ -5,7 +5,7 @@
 	"pages": [{
 			"path": "pages/index/index",
 			"style": {
-				"navigationBarTitleText": "城闪拓",
+				"navigationBarTitleText": "城闪拓",
 				"navigationBarBackgroundColor": "#ff5454",
 				"navigationBarTextStyle": "white",
 				// #ifdef H5
@@ -16,6 +16,12 @@
 				}
 			}
 		},
+		{
+			"path": "pages/index/shoplist",
+			"style": {
+				"navigationBarTitleText": "门店列表"
+			}
+		},
 		{
 			"path": "pages/user/favorites",
 			"style": {
@@ -268,6 +274,15 @@
 				}
 			}
 		},
+		{
+			"path": "pages/shop/group",
+			"style": {
+				"navigationBarTitleText": "小组排名",
+				"app-plus": {
+					"titleNView": false
+				}
+			}
+		},
 		{
 			"path": "pages/shop/fission",
 			"style": {
@@ -354,6 +369,51 @@
 					"titleNView": false
 				}
 			}
+		},
+		{
+			"path": "pages/dp/infoOne",
+			"style": {
+				"navigationBarTitleText": "大屏数据",
+				"app-plus": {
+					"titleNView": false
+				}
+			}
+		},
+		{
+			"path": "pages/dp/infoTwo",
+			"style": {
+				"navigationBarTitleText": "大屏数据",
+				"app-plus": {
+					"titleNView": false
+				}
+			}
+		},
+		{
+			"path": "pages/dp/shop",
+			"style": {
+				"navigationBarTitleText": "城攻闪拓",
+				"app-plus": {
+					"titleNView": false
+				}
+			}
+		},
+		{
+			"path": "pages/dp/boss",
+			"style": {
+				"navigationBarTitleText": "城攻闪拓",
+				"app-plus": {
+					"titleNView": false
+				}
+			}
+		},
+		{
+			"path": "pages/dp/leader",
+			"style": {
+				"navigationBarTitleText": "城攻闪拓",
+				"app-plus": {
+					"titleNView": false
+				}
+			}
 		}
 
 	],

+ 82 - 0
pages/dp/boss.vue

@@ -0,0 +1,82 @@
+<template>
+	<view class="center">
+		<view class="info">
+			<view class="avatar"></view>
+			<view class="name">城攻闪拓</view>
+		</view>
+		<view class="bottom" @click="bd()">成为老板</view>
+	</view>
+</template>
+
+<script>
+import { mapState, mapMutations } from 'vuex';
+import { interceptor } from '@/utils/loginUtils';
+import { setAdmin } from '@/api/coupon.js';
+export default {
+	data() {
+		return {
+			id: ''
+		};
+	},
+	computed: {
+		...mapState(['userInfo', 'orderInfo', 'hasLogin'])
+	},
+	onLoad(option) {
+		if (!this.hasLogin) {
+			interceptor();
+		} else {
+			this.id = option.scene;
+			this.loadData();
+		}
+	},
+	methods: {
+		bd() {
+			setAdmin({
+				fuck: this.userInfo.uid,
+				fuck_name: 'setAdmin'
+			}).then(e => {
+				this.$api.msg('加入成功');
+				setTimeout(function() {
+					uni.switchTab({
+						url: '/pages/index/index'
+					});
+				}, 1000);
+			});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.avatar {
+	margin: 20rpx auto 0;
+	width: 120rpx;
+	height: 120rpx;
+	border-radius: 50%;
+	image {
+		width: 100%;
+		height: 100%;
+		border-radius: 50%;
+	}
+}
+.name {
+	margin-top: 10rpx;
+	text-align: center;
+	font-size: 30rpx;
+	font-family: PingFang SC;
+	font-weight: 500;
+}
+.bottom {
+	position: absolute;
+	left: 0;
+	right: 0;
+	bottom: 100rpx;
+	margin: 0 auto;
+	width: 560rpx;
+	background: linear-gradient(90deg, #fe6f61 0%, #ff4343 100%);
+	color: #ffffff;
+	text-align: center;
+	padding: 26rpx 0rpx;
+	border-radius: 50rpx;
+}
+</style>

+ 312 - 0
pages/dp/infoOne.vue

@@ -0,0 +1,312 @@
+<template>
+	<view class="center">
+		<view class="dz"><image src="../../static/dp/dz.png" mode=""></image></view>
+		<view class="top"><image src="../../static/dp/top.png" mode=""></image></view>
+		<view class="logo"><image src="../../static/dp/logo.png" mode=""></image></view>
+		<view class="title">可视化数据大屏</view>
+		<view class="xl-wrap flex">
+			<view class="xl-item" v-for="(xlitem, xlindex) in xl.split('')" :key="xlindex">
+				<view class="xl-item-bg"><image src="../../static/dp/num.png" class="" /></view>
+				<view class="xl-val">{{ xlitem }}</view>
+			</view>
+		</view>
+		<view class="time-box flex">
+			<view class="nowdate">{{ newTime }}</view>
+			<view class="djs">活动倒计时{{ end }}</view>
+		</view>
+		<view class="tongzi flex">
+			<view class="tongzi-title">系统通知</view>
+			<view class="tongzi-main" v-if="orderlist">
+				恭喜{{ orderlist[0].store_for_big_screen ? orderlist[0].store_for_big_screen.name : '总店' }}[{{ orderlist[0].waiter.user.nickname }}][¥{{
+					orderlist[0]._info[0].cart_info.productInfo.price
+				}}]成交一笔“{{ orderlist[0]._info[0].cart_info.productInfo.store_name }}”订单(订单编号:{{ orderlist[0].order_id }}) {{ orderlist[0].add_time }} 购买用户:
+				<text>{{ orderlist[0].user_for_big_screen.nickname }}</text>
+			</view>
+		</view>
+		<view class="glx-box flex">
+			<view class="glx-item">
+				<view class="glx-item-num">{{ project }}</view>
+				<view class="glx-item-font">热卖项目数</view>
+			</view>
+			<view class="glx-item">
+				<view class="glx-item-num">{{ explode_num }}</view>
+				<view class="glx-item-font">已裂变新客</view>
+			</view>
+			<!-- <view class="glx-item">
+				<view class="glx-item-num">80</view>
+				<view class="glx-item-font">待裂变新客</view>
+			</view> -->
+			<view class="glx-item">
+				<view class="glx-item-num">{{ user }}</view>
+				<view class="glx-item-font">会员数</view>
+			</view>
+			<view class="glx-item">
+				<view class="glx-item-num">{{ order }}</view>
+				<view class="glx-item-font">订单数</view>
+			</view>
+			<view class="glx-item">
+				<view class="glx-item-num">{{ visit }}</view>
+				<view class="glx-item-font">曝光量</view>
+			</view>
+		</view>
+		<view class="bottom"><image src="../../static/dp/bottom.png" mode=""></image></view>
+	</view>
+</template>
+
+<script>
+import { getnewTime, timeComputed } from '@/utils/rocessor.js';
+import { loadIndexs, play, order } from '@/api/info.js';
+import Voice from '@/utils/QS-baiduyy.js';
+export default {
+	data() {
+		return {
+			newTime: '2022.08.22',
+			end: '',
+			xl: '000000',
+			explode_num: '',
+			order: '',
+			project: '',
+			user: '',
+			visit: '',
+			list: '',
+			orderlist: '',
+			active_end_time: '',
+			time: ''
+		};
+	},
+	onHide() {
+		clearTimeout(this.time);
+	},
+	// 监听页面卸载
+	onUnload() {
+		// 关闭倒计时
+		clearTimeout(this.time);
+	},
+	// 监听页面后退
+	onBackPress() {
+		// 关闭倒计时
+		clearTimeout(this.time);
+	},
+	onShow() {
+		console.log(this.xl.split());
+		this.open();
+	},
+	methods: {
+		open() {
+			const obj = this;
+			uni.showModal({
+				title: '您好',
+				content: '欢迎来到城攻闪拓',
+				success: function(res) {
+					if (res.confirm) {
+						obj.loadData();
+					} else if (res.cancel) {
+						obj.loadData();
+					}
+				}
+			});
+		},
+		loadData() {
+			const obj = this;
+			loadIndexs().then(({ data }) => {
+				this.active_end_time = data.active_end_time;
+				this.newTime = getnewTime();
+				this.xl = data.activity_order_pay;
+				this.explode_num = data.explode_num;
+				this.order = data.order;
+				this.project = data.project;
+				this.user = data.user;
+				this.visit = data.visit;
+				this.list = data.store_order[0];
+				if (this.list) {
+					Voice({
+						voiceSet: {
+							tex: '恭喜拼团成功' + +this.list._info[0].cart_info.productInfo.price + '元'
+						},
+						audioSet: {
+							volume: 1
+						},
+						lineUp: true // 加入语音队列
+					});
+					play({}, this.list.id).then(e => {});
+				}
+				this.djs();
+				this.time = setTimeout(this.loadData, 1000);
+			});
+		},
+		djs() {
+			console.log('1111');
+			let date = new Date(this.active_end_time);
+			let time1 = date.getTime();
+			let info = timeComputed(time1);
+			if (info.day != 0) {
+				this.end = info.day + '天 ' + info.hours + ':' + info.minutes + ':' + info.seconds;
+			} else {
+				this.end = info.hours + ':' + info.minutes + ':' + info.seconds;
+			}
+			order({ page: 1, limit: 1, store_id: 0, status: 3 }).then(({ data }) => {
+				this.orderlist = data;
+			});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+page,
+.center {
+	position: relative;
+	height: auto;
+	min-height: 100%;
+	background: linear-gradient(180deg, #0b1c9d 0%, #02004d 18%, #02004d 100%);
+}
+.top {
+	height: 62rpx;
+	width: 750rpx;
+	image {
+		width: 100%;
+		height: 100%;
+	}
+}
+.dz {
+	position: absolute;
+	top: 209rpx;
+	left: 0;
+	right: 0;
+	width: 640rpx;
+	height: 480rpx;
+	margin: 0 auto;
+	image {
+		width: 100%;
+		height: 100%;
+	}
+}
+.logo {
+	width: 166rpx;
+	height: 210rpx;
+	margin: 44rpx auto 0;
+	image {
+		width: 100%;
+		height: 100%;
+	}
+}
+.title {
+	margin-top: 22rpx;
+	text-align: center;
+	font-size: 38rpx;
+	font-family: PingFang SC;
+	font-weight: bold;
+	color: #ffffff;
+}
+.xl-wrap {
+	margin-top: 60rpx;
+	justify-content: space-around;
+	.xl-item {
+		position: relative;
+		width: 106rpx;
+		height: 140rpx;
+		text-align: center;
+		.xl-item-bg {
+			position: absolute;
+			top: 0;
+			left: 0;
+			right: 0;
+			width: 106rpx;
+			height: 140rpx;
+			image {
+				width: 100%;
+				height: 100%;
+			}
+		}
+		.xl-val {
+			position: relative;
+			z-index: 2;
+			font-size: 86rpx;
+			font-family: SourceHanSansSC;
+			font-weight: bold;
+			color: #66ffff;
+			line-height: 140rpx;
+		}
+	}
+}
+.time-box {
+	margin: 32rpx 22rpx 0;
+	font-size: 26rpx;
+	font-family: PingFang SC;
+	font-weight: bold;
+	color: #ffffff;
+}
+.tongzi {
+	justify-content: start;
+	margin: 36rpx auto 0;
+	width: 700rpx;
+	border: 5px solid #060c76;
+	padding: 12rpx;
+	.tongzi-title {
+		flex-shrink: 0;
+		width: 74rpx;
+		font-size: 25rpx;
+		font-family: PingFang SC;
+		font-weight: bold;
+		color: #66ffff;
+		padding-right: 20rpx;
+		border-right: 1px solid #396bb5;
+	}
+	.tongzi-main {
+		margin-left: 10rpx;
+		font-size: 20rpx;
+		font-family: PingFang SC;
+		font-weight: bold;
+		color: #ffffff;
+		text {
+			color: #66ffff;
+		}
+	}
+}
+.glx-box {
+	position: relative;
+	z-index: 2;
+	flex-wrap: wrap;
+	margin-top: 32rpx;
+	padding: 0 22rpx 160rpx;
+	.glx-item {
+		position: relative;
+		z-index: 2;
+		line-height: 1;
+		margin-top: 20rpx;
+		width: 342rpx;
+		height: 203rpx;
+		background: rgba(102, 255, 255, 0.2);
+		border: 2px solid #66ffff;
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		.glx-item-num {
+			font-size: 71rpx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #fdae3f;
+		}
+		.glx-item-font {
+			margin-top: 28rpx;
+			font-size: 34rpx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #ffffff;
+		}
+	}
+}
+.bottom {
+	position: absolute;
+	bottom: 0;
+	left: 0;
+	right: 0;
+	width: 750rpx;
+	height: 820rpx;
+	image {
+		width: 100%;
+		height: 100%;
+	}
+}
+</style>

+ 478 - 0
pages/dp/infoTwo.vue

@@ -0,0 +1,478 @@
+<template>
+	<view class="center">
+		<view class="dz"><image src="../../static/dp/dz.png" mode=""></image></view>
+		<view class="top"><image src="../../static/dp/top.png" mode=""></image></view>
+		<view class="title flex">
+			<view class="logo"><image src="../../static/dp/log.png" mode=""></image></view>
+			<view class="time">{{ newTime }}</view>
+		</view>
+		<view class="info-box">
+			<view class="info-item">
+				<view class="info-item-bg"><image src="../../static/dp/money.png" mode=""></image></view>
+				<view class="info-name">进账余额</view>
+				<view class="info-price">¥{{ price }}</view>
+			</view>
+			<view class="info-item">
+				<view class="info-item-bg"><image src="../../static/dp/order.png" mode=""></image></view>
+				<view class="info-name">订单数</view>
+				<view class="info-price">{{ order }}</view>
+			</view>
+			<view class="info-item">
+				<view class="info-item-bg"><image src="../../static/dp/people.png" mode=""></image></view>
+				<view class="info-name">会员数</view>
+				<view class="info-price">{{ user }}</view>
+			</view>
+			<view class="info-item">
+				<view class="info-item-bg"><image src="../../static/dp/ylb.png" mode=""></image></view>
+				<view class="info-name">已裂变新客</view>
+				<view class="info-price">{{ explode_num }}</view>
+			</view>
+			<!-- <view class="info-item">
+				<view class="info-item-bg"><image src="../../static/dp/dlb.png" mode=""></image></view>
+				<view class="info-name">待裂变新客</view>
+				<view class="info-price">23</view>
+			</view> -->
+			<view class="info-item">
+				<view class="info-item-bg"><image src="../../static/dp/pgl.png" mode=""></image></view>
+				<view class="info-name">曝光量</view>
+				<view class="info-price">{{ visit }}</view>
+			</view>
+		</view>
+		<view class="ranking-right">
+			<view class="ranking-right-item">
+				<view class="ranking-right-item-bg"><image src="../../static/dp/bg.png" mode=""></image></view>
+				<view class="ranking-item-title">个人成交金额排行</view>
+				<view class="ranking-item-bottom">
+					<view class="ranking-item-bottom-title">
+						<view class="ranking-item-bottom-font" style="width: 12%;">序号</view>
+						<view class="ranking-item-bottom-font" style="width: 12%;">姓名</view>
+						<view class="ranking-item-bottom-font" style="width: 36%;">所属门店</view>
+						<view class="ranking-item-bottom-font">成交金额</view>
+						<view class="ranking-item-bottom-font">订单数量</view>
+					</view>
+					<view class="ranking-item-bottom-main" :class="{ current: index % 2 != 0 }" v-for="(item, index) in yglist">
+						<view class="ranking-item-bottom-font" style="width: 12%;">{{ index + 1 }}</view>
+						<view class="ranking-item-bottom-font" style="width: 12%;">{{ item.nickname }}</view>
+						<view class="ranking-item-bottom-font" style="width: 36%;">{{ item.store.name }}</view>
+						<view class="ranking-item-bottom-font">¥{{ item.sum_pay_price }}00</view>
+						<view class="ranking-item-bottom-font">{{ item.order_count }}</view>
+					</view>
+				</view>
+			</view>
+			<view class="ranking-right-item">
+				<view class="ranking-right-item-bg"><image src="../../static/dp/bg.png" mode=""></image></view>
+				<view class="ranking-item-title">个人裂变新客排行</view>
+				<view class="ranking-item-bottom">
+					<view class="ranking-item-bottom-title">
+						<view class="ranking-item-bottom-font" style="width: 12%;">序号</view>
+						<view class="ranking-item-bottom-font" style="width: 22%;">姓名</view>
+						<view class="ranking-item-bottom-font" style="width: 46%;">所属门店</view>
+						<view class="ranking-item-bottom-font">已裂变</view>
+						<!-- <view class="ranking-item-bottom-font">待裂变</view> -->
+					</view>
+					<view class="ranking-item-bottom-main" :class="{ current: index % 2 != 0 }" v-for="(item, index) in grlblist">
+						<view class="ranking-item-bottom-font" style="width: 12%;">{{ index + 1 }}</view>
+						<view class="ranking-item-bottom-font" style="width: 22%;">{{ item.nickname }}</view>
+						<view class="ranking-item-bottom-font" style="width: 46%;">{{ item.belong_store.name }}</view>
+						<view class="ranking-item-bottom-font">{{ item.explode_count }}</view>
+						<!-- <view class="ranking-item-bottom-font">12</view> -->
+					</view>
+				</view>
+			</view>
+			<view class="ranking-right-item">
+				<view class="ranking-right-item-bg"><image src="../../static/dp/bg.png" mode=""></image></view>
+				<view class="ranking-item-title">破万大神</view>
+				<view class="ranking-item-bottom">
+					<view class="ranking-item-bottom-title">
+						<view class="ranking-item-bottom-font" style="width: 12%;">序号</view>
+						<view class="ranking-item-bottom-font" style="width: 12%;">姓名</view>
+						<view class="ranking-item-bottom-font" style="width: 36%;">所属门店</view>
+						<view class="ranking-item-bottom-font">成交金额</view>
+						<view class="ranking-item-bottom-font">订单数量</view>
+					</view>
+					<view class="ranking-item-bottom-main" :class="{ current: index % 2 != 0 }" v-for="(item, index) in pwlist">
+						<view class="ranking-item-bottom-font" style="width: 12%;">{{ index + 1 }}</view>
+						<view class="ranking-item-bottom-font" style="width: 12%;">{{ item.waiter.user.nickname }}</view>
+						<view class="ranking-item-bottom-font" style="width: 36%;">{{ item.store.name }}</view>
+						<view class="ranking-item-bottom-font">¥{{ item.sum_pay_price }}00</view>
+						<view class="ranking-item-bottom-font">{{ item.order_count }}</view>
+					</view>
+				</view>
+			</view>
+			<view class="ranking-right-item">
+				<view class="ranking-right-item-bg"><image src="../../static/dp/bg.png" mode=""></image></view>
+				<view class="ranking-item-title">门店成交金额排行</view>
+				<view class="ranking-item-bottom">
+					<view class="ranking-item-bottom-title">
+						<view class="ranking-item-bottom-font" style="width: 30%;">序号</view>
+						<view class="ranking-item-bottom-font" style="width: 40%;">所属门店</view>
+						<view class="ranking-item-bottom-font" style="width: 30%;">成交金额</view>
+					</view>
+					<view class="ranking-item-bottom-main" :class="{ current: index % 2 != 0 }" v-for="(item, index) in mdcjlist">
+						<view class="ranking-item-bottom-font" style="width: 30%;">{{ index + 1 }}</view>
+						<view class="ranking-item-bottom-font" style="width: 40%;">{{ item.name }}</view>
+						<view class="ranking-item-bottom-font" style="width: 30%;">{{ item.sum_pay_price }}</view>
+					</view>
+				</view>
+			</view>
+			<view class="ranking-right-item">
+				<view class="ranking-right-item-bg"><image src="../../static/dp/bg.png" mode=""></image></view>
+				<view class="ranking-item-title">门店裂变新客排行</view>
+				<view class="ranking-item-bottom">
+					<view class="ranking-item-bottom-title">
+						<view class="ranking-item-bottom-font" style="width: 30%;">序号</view>
+						<view class="ranking-item-bottom-font" style="width: 40%;">所属门店</view>
+						<view class="ranking-item-bottom-font" style="width: 30%;">已裂变</view>
+					</view>
+					<view class="ranking-item-bottom-main" :class="{ current: index % 2 != 0 }" v-for="(item, index) in mdlblist">
+						<view class="ranking-item-bottom-font" style="width: 30%;">{{ index + 1 }}</view>
+						<view class="ranking-item-bottom-font" style="width: 40%;">{{ item.name }}</view>
+						<view class="ranking-item-bottom-font" style="width: 30%;">{{ item.explode_count }}</view>
+					</view>
+				</view>
+			</view>
+			<view class="ranking-right-item">
+				<view class="ranking-right-item-bg"><image src="../../static/dp/bg.png" mode=""></image></view>
+				<view class="ranking-item-title">超级客户</view>
+				<view class="ranking-item-bottom">
+					<view class="ranking-item-bottom-title">
+						<view class="ranking-item-bottom-font" style="width: 25%;">序号</view>
+						<view class="ranking-item-bottom-font" style="width: 25%;">姓名</view>
+						<view class="ranking-item-bottom-font" style="width: 25%;">成交金额</view>
+						<view class="ranking-item-bottom-font" style="width: 25%;">订单数</view>
+					</view>
+					<view class="ranking-item-bottom-main" :class="{ current: index % 2 != 0 }" v-for="(item, index) in cjkhlist">
+						<view class="ranking-item-bottom-font" style="width: 25%;">{{ index + 1 }}</view>
+						<view class="ranking-item-bottom-font" style="width: 25%;">{{ item.nickname }}</view>
+						<view class="ranking-item-bottom-font" style="width: 25%;">¥{{ item.sum_pay_price }}</view>
+						<view class="ranking-item-bottom-font" style="width: 25%;">{{ item.order_count }}</view>
+					</view>
+				</view>
+			</view>
+			<view class="ranking-right-item">
+				<view class="ranking-right-item-bg"><image src="../../static/dp/bg.png" mode=""></image></view>
+				<view class="ranking-item-title">热卖项目排行</view>
+				<view class="ranking-item-bottom">
+					<view class="ranking-item-bottom-title">
+						<view class="ranking-item-bottom-font" style="width: 15%;">序号</view>
+						<view class="ranking-item-bottom-font" style="width: 35%;">项目名称</view>
+						<view class="ranking-item-bottom-font" style="width: 25%;">销售数量</view>
+						<view class="ranking-item-bottom-font" style="width: 25%;">销售金额</view>
+					</view>
+					<view class="ranking-item-bottom-main" :class="{ current: index % 2 != 0 }" v-for="(item, index) in rmxmlist">
+						<view class="ranking-item-bottom-font" style="width: 15%;">{{ index + 1 }}</view>
+						<view class="ranking-item-bottom-font" style="width: 35%;">{{ item.store_name }}</view>
+						<view class="ranking-item-bottom-font" style="width: 25%;">{{ item.sales }}</view>
+						<view class="ranking-item-bottom-font" style="width: 25%;">{{ item.sales * 1 * item.price * 1 }}</view>
+					</view>
+				</view>
+			</view>
+			<view class="ranking-right-item">
+				<view class="ranking-right-item-bg"><image src="../../static/dp/bg.png" mode=""></image></view>
+				<view class="ranking-item-title">小组成交金额排行</view>
+				<view class="ranking-item-bottom">
+					<view class="ranking-item-bottom-title">
+						<view class="ranking-item-bottom-font" style="width: 12%;">序号</view>
+						<view class="ranking-item-bottom-font" style="width: 12%;">组名</view>
+						<view class="ranking-item-bottom-font" style="width: 36%;">所属门店</view>
+						<view class="ranking-item-bottom-font">成交金额</view>
+						<view class="ranking-item-bottom-font">订单数量</view>
+					</view>
+					<view class="ranking-item-bottom-main" :class="{ current: index % 2 != 0 }" v-for="(item, index) in xccjlist">
+						<view class="ranking-item-bottom-font" style="width: 12%;">{{ index + 1 }}</view>
+						<view class="ranking-item-bottom-font" style="width: 12%;">{{ item.group_name }}</view>
+						<view class="ranking-item-bottom-font" style="width: 36%;">{{ item.store.name }}</view>
+						<view class="ranking-item-bottom-font">¥{{ item.sum_pay_price }}</view>
+						<view class="ranking-item-bottom-font">{{ item.order_count }}</view>
+					</view>
+				</view>
+			</view>
+			<view class="ranking-right-item">
+				<view class="ranking-right-item-bg"><image src="../../static/dp/bg.png" mode=""></image></view>
+				<view class="ranking-item-title">小组裂变新客排行</view>
+				<view class="ranking-item-bottom">
+					<view class="ranking-item-bottom-title">
+						<view class="ranking-item-bottom-font" style="width: 12%;">序号</view>
+						<view class="ranking-item-bottom-font" style="width: 12%;">组名</view>
+						<view class="ranking-item-bottom-font" style="width: 56%;">所属门店</view>
+						<view class="ranking-item-bottom-font">已裂变</view>
+						<!-- <view class="ranking-item-bottom-font">待裂变</view> -->
+					</view>
+					<view class="ranking-item-bottom-main" :class="{ current: index % 2 != 0 }" v-for="(item, index) in xzlblist">
+						<view class="ranking-item-bottom-font" style="width: 12%;">{{ index + 1 }}</view>
+						<view class="ranking-item-bottom-font" style="width: 12%;">{{ item.group_name }}</view>
+						<view class="ranking-item-bottom-font" style="width: 56%;">{{ item.store.name }}</view>
+						<view class="ranking-item-bottom-font">{{ item.group_explode_count }}</view>
+						<!-- <view class="ranking-item-bottom-font">12</view> -->
+					</view>
+				</view>
+			</view>
+		</view>
+		<!-- <view class="bottom"><image src="../../static/dp/bottom.png" mode=""></image></view> -->
+	</view>
+</template>
+
+<script>
+import { getnewTime, timeComputed } from '@/utils/rocessor.js';
+import { loadIndexs, waiter_rank, user_explode_rank, over10000, store_list, store_explode_rank, super_user, product, groupList, group_explode_rank } from '@/api/info.js';
+export default {
+	data() {
+		return {
+			newTime: '2022.08.22',
+			explode_num: '',
+			order: '',
+			price: '',
+			user: '',
+			visit: '',
+			time: '',
+			yglist: [], //员工排行榜
+			grlblist: [], //个人裂变新客排行
+			pwlist: [], //破万大神
+			mdcjlist: [], //门店成交金额排行
+			mdlblist: [], //门店裂变排行
+			cjkhlist: [], //超级客户
+			rmxmlist: [], //热卖项目排行
+			xccjlist: [], //小组成交金额排行
+			xzlblist: [] //小组裂变新客排行榜
+		};
+	},
+	onHide() {
+		clearTimeout(this.time);
+	},
+	// 监听页面卸载
+	onUnload() {
+		// 关闭倒计时
+		clearTimeout(this.time);
+	},
+	// 监听页面后退
+	onBackPress() {
+		// 关闭倒计时
+		clearTimeout(this.time);
+	},
+	onShow() {
+		this.loadData();
+	},
+	methods: {
+		navTo(url) {
+			this.$router.push(url);
+		},
+		loadData() {
+			const obj = this;
+			loadIndexs().then(({ data }) => {
+				this.newTime = getnewTime();
+				this.explode_num = data.explode_num;
+				this.order = data.order;
+				this.user = data.user;
+				this.visit = data.visit;
+				this.price = data.order_pay;
+			});
+			waiter_rank({ page: 1, limit: 21, store_id: 0 }).then(({ data }) => {
+				this.yglist = data.list;
+			});
+			user_explode_rank({ page: 1, limit: 8, store_id: 0 }).then(({ data }) => {
+				this.grlblist = data.list;
+			});
+			over10000({ page: 1, limit: 8, store_id: 0 }).then(({ data }) => {
+				this.pwlist = data.list;
+			});
+			store_list({ page: 1, limit: 8, store_id: 0 }).then(({ data }) => {
+				this.mdcjlist = data.list;
+			});
+			store_explode_rank({ page: 1, limit: 8, store_id: 0 }).then(({ data }) => {
+				this.mdlblist = data.list;
+			});
+			super_user({ page: 1, limit: 8, store_id: 0 }).then(({ data }) => {
+				this.cjkhlist = data.list;
+			});
+			product({ page: 1, limit: 8, store_id: 0 }).then(({ data }) => {
+				this.rmxmlist = data.list;
+			});
+			groupList({ page: 1, limit: 8, store_id: 0 }).then(({ data }) => {
+				this.xccjlist = data.list;
+			});
+			group_explode_rank({ page: 1, limit: 8, store_id: 0 }).then(({ data }) => {
+				this.xzlblist = data.list;
+			});
+			this.time = setTimeout(this.loadData, 1000);
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+page,
+.center {
+	position: relative;
+	height: auto;
+	min-height: 100%;
+	background: linear-gradient(180deg, #0b1c9d 0%, #02004d 18%, #02004d 100%);
+}
+.top {
+	height: 62rpx;
+	width: 750rpx;
+	image {
+		width: 100%;
+		height: 100%;
+	}
+}
+.dz {
+	position: absolute;
+	top: 209rpx;
+	left: 0;
+	right: 0;
+	width: 640rpx;
+	height: 480rpx;
+	margin: 0 auto;
+	image {
+		width: 100%;
+		height: 100%;
+	}
+}
+
+.title {
+	margin-top: 12rpx;
+	padding: 0 20rpx;
+	align-items: flex-end;
+	.logo {
+		width: 186rpx;
+		height: 58rpx;
+		image {
+			width: 100%;
+			height: 100%;
+		}
+	}
+	.time {
+		font-size: 26rpx;
+		font-family: PingFang SC;
+		font-weight: bold;
+		color: #ffffff;
+	}
+}
+
+.bottom {
+	position: absolute;
+	bottom: 0;
+	left: 0;
+	right: 0;
+	width: 750rpx;
+	height: 820rpx;
+	image {
+		width: 100%;
+		height: 100%;
+	}
+}
+.info-box {
+	margin: 47rpx 10rpx 0;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	flex-wrap: wrap;
+	.info-item {
+		position: relative;
+		width: 242rpx;
+		height: 152rpx;
+		padding: 22rpx 0 0 32rpx;
+		line-height: 1;
+		.info-item-bg {
+			position: absolute;
+			top: 0;
+			left: 0;
+			right: 0;
+			width: 242rpx;
+			height: 152rpx;
+			image {
+				width: 242rpx;
+				height: 152rpx;
+			}
+		}
+		.info-name {
+			position: relative;
+			z-index: 2;
+			font-size: 25rpx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #ffffff;
+		}
+		.info-price {
+			position: relative;
+			z-index: 2;
+			margin-top: 26rpx;
+			font-size: 42rpx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #ffffff;
+		}
+	}
+}
+.ranking-right {
+	margin: 20rpx 14rpx 0;
+	display: flex;
+	align-items: center;
+	flex-wrap: wrap;
+	.ranking-right-item {
+		margin-top: 10rpx;
+		width: 360rpx;
+		height: 344rpx;
+		position: relative;
+		padding: 32rpx 16rpx 0;
+		.ranking-right-item-bg {
+			position: absolute;
+			top: 0;
+			left: 0;
+			right: 0;
+			width: 360rpx;
+			height: 344rpx;
+			image {
+				width: 360rpx;
+				height: 344rpx;
+			}
+		}
+		.ranking-item-title {
+			position: relative;
+			z-index: 2;
+			text-align: center;
+			font-size: 25rpx;
+			font-family: SimSun;
+			font-weight: 400;
+			color: #66ffff;
+		}
+		.ranking-item-bottom {
+			position: relative;
+			z-index: 2;
+			margin-top: 20rpx;
+			.ranking-item-bottom-title {
+				display: flex;
+				.ranking-item-bottom-font {
+					width: 20%;
+					font-size: 14rpx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #ffffff;
+					text-align: center;
+				}
+			}
+			.ranking-item-bottom-main {
+				position: relative;
+				z-index: 2;
+				display: flex;
+				.ranking-item-bottom-font {
+					width: 20%;
+					font-size: 13rpx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #ffffff;
+					text-align: center;
+					line-height: 26rpx;
+					word-break: keep-all;
+					white-space: nowrap;
+					overflow: hidden;
+					text-overflow: ellipsis;
+				}
+			}
+			.current {
+				background: #06a4da;
+			}
+		}
+	}
+}
+</style>

+ 85 - 0
pages/dp/leader.vue

@@ -0,0 +1,85 @@
+<template>
+	<view class="center">
+		<view class="info">
+			<view class="avatar"></view>
+			<view class="name">城攻闪拓</view>
+		</view>
+		<view class="bottom" @click="bd()">绑定店铺</view>
+	</view>
+</template>
+
+<script>
+import { mapState, mapMutations } from 'vuex';
+import { interceptor } from '@/utils/loginUtils';
+import { setLeader } from '@/api/coupon.js';
+export default {
+	data() {
+		return {
+			id: ''
+		};
+	},
+	computed: {
+		...mapState(['userInfo', 'orderInfo', 'hasLogin'])
+	},
+	onLoad(option) {
+		if (!this.hasLogin) {
+			interceptor();
+		} else {
+			this.id = option.scene;
+			this.loadData();
+		}
+	},
+	methods: {
+		bd() {
+			setLeader(
+				{
+					fuck: this.userInfo.uid,
+					fuck_name: 'setLeader'
+				},
+				this.id
+			).then(e => {
+				this.$api.msg('加入成功');
+				setTimeout(function() {
+					uni.switchTab({
+						url: '/pages/index/index'
+					});
+				}, 1000);
+			});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.avatar {
+	margin: 20rpx auto 0;
+	width: 120rpx;
+	height: 120rpx;
+	border-radius: 50%;
+	image {
+		width: 100%;
+		height: 100%;
+		border-radius: 50%;
+	}
+}
+.name {
+	margin-top: 10rpx;
+	text-align: center;
+	font-size: 30rpx;
+	font-family: PingFang SC;
+	font-weight: 500;
+}
+.bottom {
+	position: absolute;
+	left: 0;
+	right: 0;
+	bottom: 100rpx;
+	margin: 0 auto;
+	width: 560rpx;
+	background: linear-gradient(90deg, #fe6f61 0%, #ff4343 100%);
+	color: #ffffff;
+	text-align: center;
+	padding: 26rpx 0rpx;
+	border-radius: 50rpx;
+}
+</style>

+ 138 - 0
pages/dp/shop.vue

@@ -0,0 +1,138 @@
+<template>
+	<view class="center">
+		<view class="info">
+			<view class="name">城攻闪拓</view>
+			<view class="avatar">邀请你加入</view>
+		</view>
+		<view class="input-box"><input class="input" v-model="name" type="text" placeholder="请输入您的真实姓名" /></view>
+		<view class="input-box"><input class="input" v-model="phone" type="text" placeholder="请输入您的电话号码" /></view>
+		<view class="input-box"><input class="input" v-model="code" type="text" placeholder="请输入您的工号" /></view>
+		<view class="input-box">
+			<picker @change="bindPickerEdu" :value="zuId" :range="chooseEdu" range-key="group_name" class="box-right">
+				<text>{{ education }}</text>
+			</picker>
+		</view>
+		<view class="bottom" @click="bd()">马上加入</view>
+	</view>
+</template>
+
+<script>
+import { mapState, mapMutations } from 'vuex';
+import { interceptor, saveUrl } from '@/utils/loginUtils';
+import { groups, setWaiter } from '@/api/coupon.js';
+export default {
+	data() {
+		return {
+			id: '',
+			name: '',
+			phone: '',
+			code: '',
+			zuName: '',
+			zuId: '',
+			education: '请选择你的小组',
+			chooseEdu: []
+		};
+	},
+	computed: {
+		...mapState(['userInfo', 'orderInfo', 'hasLogin'])
+	},
+	onLoad(option) {
+		if (!this.hasLogin) {
+			saveUrl();
+			interceptor();
+		} else {
+			this.id = option.scene;
+			this.loadData();
+		}
+	},
+	methods: {
+		loadData() {
+			groups({}, this.id).then(e => {
+				// groups({}, 1).then(e => {
+				this.chooseEdu = e.data.list;
+				console.log(this.chooseEdu);
+				console.log(e);
+			});
+		},
+		bd() {
+			if (this.name == '') {
+				return this.$api.msg('请输入真实姓名');
+			}
+			if (this.phone == '') {
+				return this.$api.msg('请输入电话号码');
+			}
+			if (this.code == '') {
+				return this.$api.msg('请输入工号');
+			}
+			if (this.zuId == '') {
+				return this.$api.msg('请选择要加入的小组');
+			}
+			setWaiter(
+				{
+					name: this.name,
+					phone: this.phone,
+					code: this.code,
+					groups_id: this.zuId,
+					fuck: this.userInfo.uid,
+					fuck_name: 'setWaiter'
+				},
+				this.id
+			).then(e => {
+				this.$api.msg('加入成功');
+				setTimeout(function() {
+					uni.switchTab({
+						url: '/pages/index/index'
+					});
+				}, 1000);
+			});
+		},
+		bindPickerEdu: function(e) {
+			console.log(e, 'hhh');
+			this.education = this.chooseEdu[e.detail.value].group_name;
+			this.zuName = this.chooseEdu[e.detail.value].group_name;
+			this.zuId = this.chooseEdu[e.detail.value].id;
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.info {
+	margin: 50rpx 0 100rpx;
+}
+.name {
+	text-align: center;
+	font-size: 30rpx;
+	font-family: PingFang SC;
+	font-weight: 500;
+}
+.avatar {
+	margin-top: 20rpx;
+	font-size: 24rpx;
+	font-family: PingFang SC;
+	font-weight: 500;
+	color: #999999;
+	text-align: center;
+}
+.input-box {
+	padding: 10rpx 20rpx;
+	margin: 20rpx auto 0;
+	border: 1px solid #999999;
+	width: 560rpx;
+	text-align: center;
+	font-size: 24rpx;
+	.input {
+		text-align: center;
+		font-size: 24rpx;
+	}
+}
+.bottom {
+	margin: 100rpx auto 0;
+	width: 560rpx;
+	background: linear-gradient(90deg, #fe6f61 0%, #ff4343 100%);
+	color: #ffffff;
+	text-align: center;
+	padding: 26rpx 0rpx;
+	border-radius: 50rpx;
+}
+</style>

+ 5 - 5
pages/index/index.vue

@@ -15,7 +15,7 @@
 			<swiper-item v-for="(item, index) in carouselList" :key="index" class="carousel-item"><image :src="item.pic" /></swiper-item>
 		</swiper>
 		<!-- 轮播图 end -->
-		<view class="swiper-btm flex">
+		<!-- <view class="swiper-btm flex">
 			<view class="btm-item flex">
 				<image src="../../static/icon/index-gou.png" mode=""></image>
 				<view class="">自用购物返利</view>
@@ -28,12 +28,12 @@
 				<image src="../../static/icon/index-gou.png" mode=""></image>
 				<view class="">超值正品优惠</view>
 			</view>
-		</view>
+		</view> -->
 		<!-- 预约 start-->
 		<view class="yuyue-wrap">
 			<view class="yuyue-top flex"><image src="../../static/img/yuyue-top.png" mode="heightFix"></image></view>
-			<view class="yuyue-item" v-for="item in list">
-				<view class="share" @click="share(item)">
+			<view class="yuyue-item" v-for="item in list" @click="navToDetailPage(item)">
+				<view class="share" @click.stop="share(item)">
 					<image class="share-img" src="../../static/img/share.png" mode=""></image>
 					<view class="share-font">分享</view>
 				</view>
@@ -49,7 +49,7 @@
 					<view class="yuyue-item-title clamp2">{{ item.store_name }}</view>
 					<view class="yuyue-item-bottom-box">
 						<view class="yuyue-item-price">¥{{ item.price }}</view>
-						<view class="yuyue-item-btn" @click="navToDetailPage(item)">立即拼团</view>
+						<view class="yuyue-item-btn">立即拼团</view>
 					</view>
 				</view>
 			</view>

+ 219 - 0
pages/index/shoplist.vue

@@ -0,0 +1,219 @@
+<template>
+	<view class="center">
+		<view class="djq-wrap flex f-ai-s" v-for="storeitem in storeList">
+			<image :src="storeitem.image" mode="" class="djq-img"></image>
+			<view class="djq-right pl20">
+				<view class="djq-tit flex f-j-sb f-ai-s">
+					<view class="djq-name clamp">{{ storeitem.name }}</view>
+					<!-- <view class="djq-dis">
+						<image src="../../static/icon/index10.png" mode=""></image>
+						距离{{ storeitem.range * 1 }}KM
+					</view> -->
+				</view>
+				<view class="flex f-d-c f-j-sb f-ai-s fg1" style="height: 110rpx;">
+					<view class="djq-dz clamp">{{ storeitem.detailed_address }}</view>
+					<view class="djq-hd flex f-j-sb">
+						<view class="buy-info"><!-- {{storeitem.count}}人已购买 --></view>
+						<view class="hd-btn">
+							<image src="../../static/icon/call.png" mode="" style="margin-right: 15rpx;" @click.stop="makeCall(storeitem.phone)"></image>
+							<!-- #ifdef H5 -->
+							<image src="../../static/icon/dh.png" mode="" @click.stop="toGaodeMap(storeitem.latitude, storeitem.longitude, storeitem.name)"></image>
+							<!-- #endif -->
+							<!-- #ifdef MP -->
+							<image src="../../static/icon/dh.png" mode="" @click.stop="dh(storeitem)"></image>
+							<!-- #endif -->
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<uni-load-more :status="loadingType"></uni-load-more>
+	</view>
+</template>
+
+<script>
+import { store_list } from '@/api/coupon.js';
+export default {
+	data() {
+		return {
+			page: 1,
+			limitt: 20,
+			loadingType: 'more',
+			district: '定位中',
+			storeList: [],
+			latitude: '',
+			longitude: ''
+		};
+	},
+	onReachBottom() {
+		this.getStoreList();
+	},
+	onLoad: function(option) {
+		this.getaddress();
+	},
+	onShow: function() {
+		this.getStoreList();
+	},
+	methods: {
+		getaddress() {
+			console.log('dizhi+++++++++++');
+			let obj = this;
+			uni.getLocation({
+				type: 'gcj02',
+				success: res => {
+					obj.latitude = res.latitude;
+					obj.longitude = res.longitude;
+				},
+				fail: err => {
+					console.log(err, 'shi+++++++++++++++');
+					openMap().then(e => {
+						this.getaddress();
+					});
+				}
+			});
+		},
+		getStoreList() {
+			let obj = this;
+			if (obj.loadingType == 'loading' || obj.loadingType == 'noMore') {
+				return;
+			}
+			obj.loadingType = 'loading';
+			store_list({
+				page: obj.page,
+				latitude: obj.latitude,
+				longitude: obj.longitude,
+				limit: obj.limitt
+			}).then(res => {
+				if (res.data.list.length > 0) {
+					res.data.list.forEach(e => {
+						e.range = this.getFlatternDistance(this.latitude, this.longitude, e.latitude, e.longitude);
+					});
+					obj.storeList = obj.storeList.concat(res.data.list);
+					obj.page++;
+					console.log('数据加载完毕');
+				}
+
+				if (obj.limitt == res.data.list.length) {
+					//说明数据已经加载完毕了
+					obj.loadingType = 'more';
+					console.log('加载完毕1111111');
+				} else {
+					console.log('加载完毕1222222222211');
+					obj.loadingType = 'noMore';
+				}
+				//说明还有数据
+				this.$set(obj.storeList, 'loaded', true);
+			});
+		},
+		// 导航
+		dh(item) {
+			wx.openLocation({
+				latitude: item.latitude * 1,
+				longitude: item.longitude * 1,
+				name: item.name,
+				address: item.detailed_address
+			});
+		},
+		//根据经纬度计算距离
+		getFlatternDistance(lat1, lng1, lat2, lng2) {
+			let radLat1 = (lat1 * Math.PI) / 180.0;
+			let radLat2 = (lat2 * Math.PI) / 180.0;
+			let a = radLat1 - radLat2;
+			let b = (lng1 * Math.PI) / 180.0 - (lng2 * Math.PI) / 180.0;
+			let s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
+			s = s * 6378.137;
+			s = Math.round(s * 10000) / 10000;
+			return s;
+		},
+		// 拨打电话
+		makeCall(phone) {
+			uni.makePhoneCall({
+				phoneNumber: phone //仅为示例
+			});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.djq-wrap {
+	width: 701rpx;
+	// height: 255rpx;
+	background: #ffffff;
+	box-shadow: 0px 0px 27rpx 0px rgba(50, 50, 52, 0.06);
+	border-radius: 20rpx;
+	margin: 0 auto 20rpx;
+	padding: 23rpx 22rpx;
+
+	&:last-of-type {
+		margin-bottom: 0;
+	}
+
+	.djq-img {
+		flex-shrink: 0;
+		width: 150rpx;
+		height: 150rpx;
+		border-radius: 10rpx;
+	}
+
+	.djq-right {
+		flex-grow: 1;
+
+		.djq-tit {
+			font-size: 34rpx;
+			font-weight: bold;
+			color: #333333;
+			line-height: 52rpx;
+
+			.djq-name {
+				max-width: 300rpx;
+			}
+
+			.djq-dis {
+				flex-shrink: 0;
+
+				image {
+					width: 20rpx;
+					height: 28rpx;
+					margin-right: 10rpx;
+				}
+
+				font-size: 22rpx;
+				font-weight: 500;
+				color: #666666;
+			}
+		}
+
+		.djq-dz {
+			width: 100%;
+			font-size: 24rpx;
+			font-weight: 500;
+			color: #666666;
+		}
+
+		.djq-hd {
+			width: 100%;
+			// border-bottom: 1rpx solid #EAECED;
+
+			.buy-info {
+				display: inline-block;
+				height: 32rpx;
+				border-radius: 16rpx 16rpx 16rpx 0px;
+				line-height: 32rpx;
+				font-size: 20rpx;
+				font-weight: 500;
+				color: #ff440d;
+				padding: 0 15rpx;
+				background-color: #fff;
+			}
+
+			.hd-btn {
+				image {
+					width: 46rpx;
+					height: 46rpx;
+				}
+			}
+		}
+	}
+}
+</style>

+ 2 - 2
pages/order/order.vue

@@ -15,7 +15,7 @@
 						<view v-if="item._status._title != '未支付'">
 							<view class="i-top b-b">
 								<text class="time">订单编号:{{ item.order_id }}</text>
-								<text class="state" style="color: #999999;;">拼团成功</text>
+								<text class="state" style="color: #999999;;">{{ item._status._title != '未发货' ? '拼团成功' : '正在拼团' }}</text>
 								<!-- <text v-if="item.status === 3" class="del-btn iconfont icondelete" @click="deleteOrder(index)"></text> -->
 							</view>
 							<view class="flex_item assemble_box">
@@ -34,7 +34,7 @@
 									<view class="assemble_text">共4人参与了拼团,拼团人数齐了</view>
 								</view>
 							</view>
-							<view class="action-box b-t">
+							<view class="action-box b-t" v-if="item._status._title != '未发货'">
 								<view class="action-box-left">
 									<view class="itemText recom" :class="{ chayidian: item.is_refund == 1 }"><template></template></view>
 								</view>

+ 97 - 43
pages/product/product.vue

@@ -14,12 +14,10 @@
 					<view class="price_box">
 						<view class="price_yuan">{{ goodsObjact.price | parseFloatNum }}</view>
 						<view class="ot_price">¥{{ goodsObjact.ot_price | parseFloatNum }}</view>
-						<view class="pink_tuan">4人团{{ list.product ? list.product.pink_pay_person : '1' }}人中</view>
+						<view class="pink_tuan">4人团拼团价¥{{ goodsObjact.price }}</view>
 					</view>
 					<!-- <view class="tuiguang_num">
-						拼中可得{{ list.product ? list.product.success_wdc : '0' | parseFloatNum }}酒币,未拼中可得{{
-							list.product ? list.product.fail_wdc : '0' | parseFloatNums
-						}}酒币
+						4人团拼团价¥{{ goodsObjact.price }}
 					</view> -->
 				</view>
 				<!-- #ifdef H5 -->
@@ -43,6 +41,29 @@
 			<text class="title" v-else>{{ goodsObjact.store_name }}</text>
 		</view>
 
+		<view class="shop" v-if="storelist.length != 0" @click="navTo('/pages/index/shoplist')">
+			<view class="shop-top flex">
+				<view class="shop-top-left">适用门店(共{{ storelist.length }}家)</view>
+				<view class="shop-top-right">
+					<view class="shop-top-right-font">查看更多门店</view>
+					<image src="../../static/img/shop2.png" mode=""></image>
+				</view>
+			</view>
+			<view class="shop-bottom flex">
+				<view class="shop-bottom-left">
+					<image class="shop-bottom-left-icon" :src="storelist[0].image" mode=""></image>
+					<view class="shop-bottom-left-info">
+						<view class="shop-bottom-left-name">{{ storelist[0].name }}</view>
+						<view class="shop-bottom-left-address">{{ storelist[0].detailed_address }}</view>
+					</view>
+				</view>
+				<view class="shop-bottom-right">
+					<image class="shop-bottom-right-item" style="margin-right: 14rpx;" src="../../static/icon/call.png" mode=""></image>
+					<image class="shop-bottom-right-item" src="../../static/icon/dh.png" mode=""></image>
+				</view>
+			</view>
+		</view>
+
 		<view class="pink_xuzhi_box">
 			<view class="pink_xuzhi_tit">购买须知</view>
 			<view class="pink_xuzhi_text">购买后拥有{{ goodsObjact.use_times }}张券,有效时间{{ goodsObjact.valid_day }}天</view>
@@ -145,7 +166,7 @@ import { uniFav } from '@/components/uni-fav/uni-fav.vue';
 import { getProducts, goodsDetail, cartAdd, collectAdd, collectDel, productDetail, poster } from '@/api/product.js';
 import { saveUrl } from '@/utils/loginUtils.js';
 // import { saveUrl, interceptor } from '@/utils/loginUtils.js';
-import { couponslist, setCoupons } from '@/api/coupon.js';
+import { store_list } from '@/api/coupon.js';
 import uniNoticeBar from '@/components/uni-notice-bar/uni-notice-bar.vue';
 import uniPopup from '@/components/uni-popup/uni-popup.vue';
 // #ifdef H5
@@ -275,7 +296,7 @@ export default {
 			PinkShow: {}, // 显示拼团
 			AutopinkList: [], // 谁购买了商品
 			AutoList: '',
-			quanlist: [], //优惠券列表
+			storelist: [], //店铺列表
 			tuanzhangPrice: '', // 团长立省
 			many: 1, //1是单规格  2是多规格
 			hotList: [] //热销推荐产品
@@ -470,43 +491,8 @@ export default {
 		// 数据根据分类保存保存
 		loadCoupon() {
 			let obj = this;
-			couponslist({
-				page: 1,
-				limit: 100
-			}).then(({ data }) => {
-				obj.quanlist = data;
-				obj.quanlist.map(e => {
-					e.coupon_price = parseInt(e.coupon_price);
-					e.use_min_price = parseInt(e.use_min_price);
-					e.show = false;
-				});
-				couponslist({
-					page: 1,
-					limit: 100,
-					product_id: obj.goodsid,
-					type: 1
-				}).then(({ data }) => {
-					let shopList = data;
-					shopList.map(e => {
-						e.coupon_price = parseInt(e.coupon_price);
-						e.use_min_price = parseInt(e.use_min_price);
-						e.show = false;
-					});
-					obj.quanlist = obj.quanlist.concat(shopList);
-				});
-			});
-		},
-		lingqu(item) {
-			setCoupons({
-				couponId: item.id
-			}).then(data => {
-				console.log(data);
-				if (data.status == 200) {
-					this.$api.msg('领取成功');
-					item.show = true;
-					this.$refs.popup1.close();
-					this.loadCoupon();
-				}
+			store_list({ page: 1, limit: 1000 }).then(({ data }) => {
+				obj.storelist = data.list;
 			});
 		},
 		// 长按保存图片
@@ -2481,4 +2467,72 @@ page {
 		height: 1000rpx;
 	}
 }
+.shop {
+	background: #fff;
+	margin-top: 20rpx;
+	.shop-top {
+		padding: 22rpx 30rpx;
+		border-bottom: 1px solid #eaeced;
+		.shop-top-left {
+			font-size: 30rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #333333;
+		}
+		.shop-top-right {
+			display: flex;
+			justify-content: flex-end;
+			align-items: center;
+			.shop-top-right-font {
+				margin-right: 10rpx;
+				font-size: 22rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #999999;
+			}
+			image {
+				width: 12rpx;
+				height: 20rpx;
+			}
+		}
+	}
+	.shop-bottom {
+		padding: 20rpx 30rpx;
+		.shop-bottom-left {
+			display: flex;
+			align-items: center;
+			.shop-bottom-left-icon {
+				width: 90rpx;
+				height: 90rpx;
+				border-radius: 50%;
+			}
+			.shop-bottom-left-info {
+				margin-left: 16rpx;
+				line-height: 1;
+				.shop-bottom-left-name {
+					font-size: 30rpx;
+					font-family: PingFang SC;
+					font-weight: bold;
+					color: #333333;
+				}
+				.shop-bottom-left-address {
+					margin-top: 14rpx;
+					font-size: 20rpx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #999999;
+				}
+			}
+		}
+		.shop-bottom-right {
+			display: flex;
+			justify-content: flex-end;
+			.shop-bottom-right-item {
+				width: 46rpx;
+				height: 46rpx;
+				border-radius: 50%;
+			}
+		}
+	}
+}
 </style>

+ 1 - 3
pages/set/userinfo.vue

@@ -28,9 +28,7 @@
 import uniList from '@/components/uni-list/uni-list.vue';
 import uniListItem from '@/components/uni-list-item/uni-list-item.vue';
 import { mapState, mapMutations } from 'vuex';
-import { logout } from '@/api/set.js';
-
-import { edit } from '@/api/user.js';
+import { logout, userEdit } from '@/api/set.js';
 import { upload } from '@/api/order.js';
 export default {
 	components: {

+ 375 - 0
pages/shop/group.vue

@@ -0,0 +1,375 @@
+<template>
+	<view class="center">
+		<view class="content-money">
+			<view class="money-box" v-if="list.length != 0">
+				<view class="body-title">
+					<view class="goback-box" @click="toBack"><image class="goback" src="../../static/icon/fanhui.png" mode=""></image></view>
+					<view class="header">小组销售排行榜</view>
+				</view>
+				<view class="ranking-box flex">
+					<view class="ranking-bg"><image src="../../static/img/turnover1.png" mode=""></image></view>
+					<view class="other-item ">
+						<view v-if="list.length >= 2">
+							<view class="other-avatar two">
+								<view class="huangg"><image src="../../static/img/turnover3.png" mode=""></image></view>
+								<image :src="list[1].image" mode=""></image>
+							</view>
+							<view class="other-name clamp">{{ list[1].group_name }}{{ list[1].store.name }}</view>
+							<view class="other-price">
+								<text>¥</text>
+								{{ list[1].sum_pay_price || 0 }}
+							</view>
+						</view>
+					</view>
+					<view class="first-item">
+						<view class="first-avatar">
+							<view class="huangg"><image src="../../static/img/turnover2.png" mode=""></image></view>
+							<image :src="list[0].image" mode=""></image>
+						</view>
+						<view class="first-name clamp">{{ list[0].group_name }}({{ list[0].store.name }})</view>
+						<view class="first-price">
+							<text>¥</text>
+							{{ list[0].sum_pay_price || 0 }}
+						</view>
+					</view>
+					<view class="other-item ">
+						<view v-if="list.length >= 3">
+							<view class="other-avatar three">
+								<view class="huangg"><image src="../../static/img/turnover4.png" mode=""></image></view>
+								<image :src="list[2].image" mode=""></image>
+							</view>
+							<view class="other-name clamp">{{ list[2].group_name }}({{ list[2].store.name }})</view>
+							<view class="other-price">
+								<text>¥</text>
+								{{ list[2].sum_pay_price || 0 }}
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="list">
+			<view class="list-title flex">
+				<view class="list-title-item left">排名</view>
+				<view class="list-title-item zj">组名</view>
+				<view class="list-title-item right">销售金额</view>
+			</view>
+			<scroll-view scroll-y="true" class="list-main" :style="{ height: maxheight + 'px' }" @scrolltolower="loadData()">
+				<view class="list-main-item flex" v-for="(item, index) in list" :key="index">
+					<view class="list-main-num left">{{ index + 1 }}</view>
+					<view class="list-main-name zj">
+						<!-- <image :src="item.image" mode=""></image> -->
+						<view class="list-main-name-font clamp">{{ item.group_name }}({{ item.store.name }})</view>
+					</view>
+					<view class="list-main-price right">{{ item.sum_pay_price || 0 }}</view>
+				</view>
+			</scroll-view>
+		</view>
+	</view>
+</template>
+
+<script>
+import { groupList } from '@/api/info.js';
+export default {
+	data() {
+		return {
+			maxheight: '',
+			list: [],
+			pages: 1,
+			limit: 1000
+		};
+	},
+	onReady(res) {
+		var _this = this;
+		uni.getSystemInfo({
+			success: resu => {
+				const query = uni.createSelectorQuery();
+				query.select('.list-main').boundingClientRect();
+				query.exec(function(res) {
+					_this.maxheight = resu.windowHeight - res[0].top;
+					console.log('打印页面的剩余高度', _this.maxheight);
+				});
+			},
+			fail: res => {}
+		});
+	},
+	onLoad() {
+		this.loadData();
+	},
+	methods: {
+		toBack() {
+			uni.navigateBack({});
+		},
+		loadData() {
+			const obj = this;
+			if (obj.loadType == 'nomore' || obj.loadType == 'loading') {
+				return;
+			}
+			obj.loadType = 'loading';
+			groupList({
+				pages: obj.pages,
+				limit: obj.limit
+			}).then(({ data }) => {
+				console.log(data);
+				this.list = this.list.concat(data.list);
+				if (data.list.length == obj.limit) {
+					obj.loadType = 'more';
+				} else {
+					obj.loadType = 'nomore';
+				}
+			});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.center,
+page {
+	min-height: 100%;
+	// height: auto;
+	background: #f6f6f6;
+}
+.content-money {
+	padding-bottom: 30rpx;
+	background: linear-gradient(0deg, #fe6f61 0%, #ff4343 100%);
+}
+.money-box {
+	padding-top: var(--status-bar-height);
+	height: 468rpx;
+	color: #ffffff;
+	text-align: center;
+	justify-content: center;
+	position: relative;
+	.body-title {
+		height: 80rpx;
+		text-align: center;
+		font-size: 35rpx;
+		position: relative;
+		.header {
+			position: absolute;
+			left: 0;
+			top: 0;
+			width: 100%;
+			font-size: 36rpx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #fffeff;
+			height: 80rpx;
+			font-size: 32rpx;
+			font-weight: 700;
+			z-index: 9;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+		}
+		.goback-box {
+			position: absolute;
+			z-index: 10;
+			left: 24rpx;
+			top: 0;
+			height: 80rpx;
+			display: flex;
+			align-items: center;
+		}
+		.goback {
+			width: 30rpx;
+			height: 36rpx;
+		}
+	}
+	.ranking-box {
+		margin: 64rpx auto 0;
+		width: 720rpx;
+		height: 286rpx;
+		position: relative;
+		align-items: flex-end;
+		padding-bottom: 30rpx;
+		.ranking-bg {
+			position: absolute;
+			top: 0;
+			left: 0;
+			right: 0;
+			width: 720rpx;
+			height: 286rpx;
+			image {
+				width: 100%;
+				height: 100%;
+			}
+		}
+		.other-item {
+			width: 216rpx;
+			display: flex;
+			flex-direction: column;
+			justify-content: flex-end;
+			align-items: center;
+			line-height: 1;
+			.two {
+				border: #c8d2de 3px solid;
+			}
+			.three {
+				border: #f2aa70 3px solid;
+			}
+			.other-avatar {
+				position: relative;
+				width: 84rpx;
+				height: 84rpx;
+				border-radius: 50%;
+				image {
+					width: 100%;
+					height: 100%;
+				}
+				.huangg {
+					position: absolute;
+					width: 40rpx;
+					height: 40rpx;
+					top: -26rpx;
+					left: -26rpx;
+					image {
+						width: 100%;
+						height: 100%;
+					}
+				}
+			}
+			.other-name {
+				position: relative;
+				z-index: 2;
+				margin-top: 15rpx;
+				font-size: 22rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #000000;
+			}
+			.other-price {
+				margin-top: 14rpx;
+				text-align: center;
+				position: relative;
+				z-index: 2;
+				font-size: 36rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #ef041f;
+				text {
+					font-size: 24rpx;
+				}
+			}
+		}
+		.first-item {
+			width: 290rpx;
+			display: flex;
+			flex-direction: column;
+			justify-content: flex-end;
+			align-items: center;
+			line-height: 1;
+			.first-avatar {
+				position: relative;
+				width: 126rpx;
+				height: 126rpx;
+				border-radius: 50%;
+				border: #ffd010 3px solid;
+				image {
+					width: 100%;
+					height: 100%;
+				}
+				.huangg {
+					position: absolute;
+					z-index: 2;
+					width: 52rpx;
+					height: 52rpx;
+					top: -28rpx;
+					left: -28rpx;
+					image {
+						width: 100%;
+						height: 100%;
+					}
+				}
+			}
+			.first-name {
+				position: relative;
+				z-index: 2;
+				margin-top: 14rpx;
+				font-size: 29rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #000000;
+			}
+			.first-price {
+				margin-top: 14rpx;
+				text-align: center;
+				position: relative;
+				z-index: 2;
+				font-size: 36rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #ef041f;
+				text {
+					font-size: 24rpx;
+				}
+			}
+		}
+	}
+}
+.list {
+	width: 690rpx;
+	background: #ffffff;
+	border-radius: 10rpx;
+	margin: 20rpx auto 0;
+	padding: 20rpx 42rpx 0;
+	.list-title {
+		background: linear-gradient(90deg, #fe6f61 0%, #ff4343 100%);
+		border-radius: 42rpx;
+		padding: 16rpx 0;
+		.list-title-item {
+			font-size: 24rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #ffffff;
+			text-align: center;
+		}
+	}
+	.list-main {
+		margin-top: 20rpx;
+	}
+	.list-main-item {
+		border-bottom: 1px solid #e8e8e8;
+		padding: 30rpx 0;
+		.list-main-num {
+			text-align: center;
+			font-size: 30rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #333333;
+		}
+		.list-main-name {
+			display: flex;
+			justify-content: center;
+			image {
+				width: 44rpx;
+				height: 44rpx;
+			}
+			.list-main-name-font {
+				margin-left: 12rpx;
+				font-size: 28rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #333333;
+			}
+		}
+		.list-main-price {
+			text-align: center;
+			font-size: 30rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #ef041f;
+		}
+	}
+}
+.left {
+	width: 120rpx;
+}
+.zj {
+	width: 316rpx;
+}
+.right {
+	width: 184rpx;
+}
+</style>

+ 16 - 7
pages/shop/order.vue

@@ -7,9 +7,9 @@
 					<view class="header">订单数据</view>
 				</view>
 			</view>
-			<picker mode="date" :value="now_date" @change="bindDateChange" :fields="'month'" :end="date">
+			<!-- <picker mode="date" :value="now_date" @change="bindDateChange" :fields="'month'" :end="date">
 				<view class="uni-input choose-time">{{ now_date }} ></view>
-			</picker>
+			</picker> -->
 			<!-- <view class="uni-input choose-time" @click="show = true">{{ now_date }}</view> -->
 			<view class="month">
 				<image src="../../static/icon/sdata.png" mode=""></image>
@@ -45,6 +45,7 @@
 						</view>
 					</view>
 					<view class="item-btm">共{{ item.total_num }}件商品 合计:¥{{ item.total_price }}</view>
+					<view class="buy_info">下单人:{{ item.user_for_big_screen.nickname }}</view>
 				</view>
 				<uni-load-more :status="loadingType"></uni-load-more>
 			</scroll-view>
@@ -84,11 +85,12 @@ export default {
 			num: 0, //订单总数
 			loadingType: 'more',
 			page: 1,
-			limit: 10,
+			limit: 1000,
 			now_date: year + '-' + month,
 			date: year + '-' + month, //选择的日期不能超过今天
 			real_name: '',
-			store_id: ''
+			store_id: '',
+			waiter_id: ''
 		};
 	},
 	components: {
@@ -119,6 +121,9 @@ export default {
 		} else {
 			this.store_id = this.userInfo.store_id;
 		}
+		if (option.waiter_id) {
+			this.waiter_id = option.waiter_id;
+		}
 		this.loadData();
 	},
 	methods: {
@@ -149,9 +154,9 @@ export default {
 			}
 			obj.loadingType = 'loading';
 			console.log(obj.now_date);
-			order({ page: obj.page, limit: obj.limit, data: obj.now_date, store_id: obj.store_id, real_name: obj.real_name }).then(({ data }) => {
+			order({ page: obj.page, limit: obj.limit, data: obj.now_date, store_id: obj.store_id, real_name: obj.real_name, waiter_id: obj.waiter_id }).then(({ data }) => {
 				console.log(data);
-				obj.num = data.count;
+				obj.num = data.length;
 				obj.dataList = obj.dataList.concat(data);
 				obj.page++;
 				if (data.length == obj.limit) {
@@ -320,7 +325,6 @@ page {
 		// background-color: #bfa;
 		.item {
 			width: 702rpx;
-			height: 304rpx;
 			padding: 0 28rpx;
 			background: #ffffff;
 			box-shadow: 0px 0px 20rpx 0px rgba(50, 50, 52, 0.06);
@@ -429,6 +433,11 @@ page {
 				font-family: PingFang SC;
 				font-weight: 500;
 				color: #333333;
+				padding-bottom: 10rpx;
+				border-bottom: 2px solid #f8f8f8;
+			}
+			.buy_info {
+				padding: 20rpx 10rpx;
 			}
 		}
 	}

+ 30 - 15
pages/shop/shop.vue

@@ -20,7 +20,7 @@
 			<view class="saoma" @click="sao()">
 				<view class="saoma-left">
 					<image class="saoma-icon" src="../../static/img/shop1.png" mode=""></image>
-					<view class="saoma-font">扫码核销</view>
+					<view class="saoma-font">扫码登录</view>
 				</view>
 				<view class="saoma-jt"><image src="../../static/img/shop2.png" mode=""></image></view>
 			</view>
@@ -72,6 +72,21 @@
 					<view class="num">{{ shopNum }}</view>
 					<view class="font">分店数据</view>
 				</view>
+				<view class="userInfoList-bottom" @click="navTo('/pages/shop/group')">
+					<view class="bottom"><image class="bottom-icon8" src="../../static/img/shop10.png" mode=""></image></view>
+					<view class="num"></view>
+					<view class="font">分组数据</view>
+				</view>
+				<view class="userInfoList-bottom" @click="navTo('/pages/dp/infoOne')" v-if="userInfo.user_rule == 'admin'">
+					<view class="bottom"><image class="bottom-icon10" src="../../static/img/shop12.png" mode=""></image></view>
+					<view class="num"></view>
+					<view class="font">大屏数据1</view>
+				</view>
+				<view class="userInfoList-bottom" @click="navTo('/pages/dp/infoTwo')" v-if="userInfo.user_rule == 'admin'">
+					<view class="bottom"><image class="bottom-icon10" src="../../static/img/shop12.png" mode=""></image></view>
+					<view class="num"></view>
+					<view class="font">大屏数据2</view>
+				</view>
 			</view>
 		</view>
 		<uni-popup ref="popuphx" class="agree-wrapper">
@@ -100,7 +115,7 @@
 import { mapState, mapMutations } from 'vuex';
 import { tabbar, tabbar1 } from '@/utils/tabbar.js';
 import { getStoreGoods } from '@/api/product.js';
-import { userinfo, check } from '@/api/user.js';
+import { userinfo, h5Auth } from '@/api/user.js';
 import { store, over10000, store_list, product } from '@/api/info.js';
 // #ifdef H5
 import { weixindata } from '@/utils/wxAuthorized';
@@ -182,9 +197,6 @@ export default {
 				this.productNum = e.data.count;
 				console.log(this.productNum, 111);
 			});
-			// getStoreGoods({ page: 1, limit: 10, store_id: this.store_id }).then(({ data }) => {
-			// 	this.list = data;
-			// });
 		},
 
 		//调取扫描二维码
@@ -195,8 +207,9 @@ export default {
 			uni.scanCode({
 				success(e) {
 					obj.code = e.result;
-					obj.$refs.popuphx.open();
-					console.log(obj.$refs.popuphx);
+					obj.qhx();
+					// obj.$refs.popuphx.open();
+					// console.log(obj.$refs.popuphx);
 				}
 			});
 			// #endif
@@ -213,12 +226,10 @@ export default {
 			// #endif
 		},
 		qhx() {
-			check({
-				verify_code: this.code,
-				is_confirm: 1 //1是核销,0是查看
-			})
+			console.log('进入');
+			h5Auth({}, this.code)
 				.then(e => {
-					this.$api.msg('核销成功');
+					this.$api.msg('登录成功');
 					this.close();
 				})
 				.catch(e => {
@@ -305,7 +316,7 @@ page {
 			.hx-placeholder {
 				font-size: 26rpx;
 				font-weight: 500;
-				color: #52c696;
+				color: #ff4c4c;
 			}
 		}
 
@@ -313,7 +324,7 @@ page {
 			margin: 44rpx auto 0;
 			width: 353rpx;
 			height: 71rpx;
-			background: #52c696;
+			background: #ff4c4c;
 			border-radius: 34rpx;
 			font-size: 36rpx;
 			font-weight: 500;
@@ -431,7 +442,7 @@ page {
 			text-align: center;
 			width: 500rpx;
 			height: 60rpx;
-			background: #52c696;
+			background: #ff4c4c;
 			border-radius: 30rpx;
 			font-size: 28rpx;
 			font-family: PingFang SC;
@@ -494,6 +505,10 @@ page {
 				width: 74rpx;
 				height: 68rpx;
 			}
+			.bottom-icon10 {
+				width: 74rpx;
+				height: 74rpx;
+			}
 		}
 		.num {
 			margin-top: 16rpx;

+ 133 - 12
pages/user/user.vue

@@ -8,12 +8,13 @@
 			<image class="avatar" src="../../static/error/missing-face.png" mode="" v-else></image>
 			<!-- <view class="user-name">{{ userInfo.phone | phone }}</view> -->
 			<view class="user-name">{{ userInfo.nickname }}</view>
+			<view class="user-shop" v-if="userInfo.user_rule == 'user'"><view class="user-shopname">会员</view></view>
 			<view class="user-shop" v-if="userInfo.user_rule != 'user'">
 				<image class="user-shop-icon" src="../../static/icon/user1.png" mode=""></image>
-				<view class="user-shopname">{{ store_name }}</view>
+				<view class="user-shopname">{{ store_name }}{{ userInfo.user_rule == 'waiter' ? '店员' : userInfo.user_rule == 'leader' ? '店长' : '' }}</view>
 			</view>
 			<view class="user-money flex" v-if="userInfo.user_rule != 'user'">
-				<view class="user-money-item" @click="navTo('/pages/shop/order')">
+				<view class="user-money-item" @click="navTo('/pages/shop/order?waiter_id=' + userInfo.uid)">
 					<view class="user-money-num">{{ achievement }}</view>
 					<view class="user-money-font">本店业绩</view>
 				</view>
@@ -52,7 +53,9 @@
 			<uni-list-item title="客服中心" @click="openKf()" thumb="../../static/icon/user7.png"></uni-list-item>
 			<uni-list-item title="设置" @click="navTo('/pages/set/userinfo')" thumb="../../static/icon/user8.png"></uni-list-item>
 			<uni-list-item title="我的邀请码" @click="navTo('/pages/user/share')" thumb="../../static/icon/user9.png"></uni-list-item>
-			<uni-list-item title="绑定店员" @click="open()" thumb="../../static/icon/user10.png"></uni-list-item>
+			<!-- <uni-list-item title="绑定店员" @click="open()" thumb="../../static/icon/user10.png"></uni-list-item> -->
+			<uni-list-item title="我的券码" @click="navTo('/pages/user/myyhq')" thumb="../../static/icon/user11.png"></uni-list-item>
+			<uni-list-item v-if="userInfo.user_rule != 'user' && userInfo.user_rule != 'admin'" title="扫码核销" @click="sao()" thumb="../../static/img/shop1.png"></uni-list-item>
 			<!-- <uni-list-item title="关于我们" @click="navTo('/pages/user/about')" thumb="/static/icon/img09.png"></uni-list-item> -->
 		</uni-list>
 		<uni-popup ref="popupkf" type="center">
@@ -81,6 +84,17 @@
 				</view>
 			</view>
 		</uni-popup>
+		<uni-popup ref="popuphx" class="agree-wrapper">
+			<view class="hx-wrapper">
+				<view class="hx-img"><image src="../../static/img/hxbg.png" mode=""></image></view>
+				<view class="hx-body">
+					<view class="hx-title">输入核销码核销</view>
+					<input type="text" v-model="code" placeholder="请输入核销码" placeholder-class="hx-placeholder" />
+					<view class="hx-btn" @click="qhx">立即核销</view>
+				</view>
+				<view class="hx-close" @click="close"><image src="../../static/icon/close.png" mode=""></image></view>
+			</view>
+		</uni-popup>
 		<u-tabbar
 			v-if="userInfo.user_rule == 'leader' || userInfo.user_rule == 'admin'"
 			v-model="current"
@@ -97,7 +111,7 @@ import { mapState, mapMutations } from 'vuex';
 import uniList from '@/components/uni-list/uni-list.vue';
 import uniListItem from '@/components/uni-list-item/uni-list-item.vue';
 import { store } from '@/api/info.js';
-import { orderData, getUserInfo } from '@/api/user.js';
+import { orderData, getUserInfo, check } from '@/api/user.js';
 import { saveUrl, interceptor } from '@/utils/loginUtils.js';
 import { set_waiter } from '@/api/info.js';
 let startY = 0,
@@ -116,6 +130,7 @@ export default {
 			id: '', //是否已签到
 			store_name: '',
 			achievement: '',
+			code: '',
 			text: '15606861277' //客服微信
 		};
 	},
@@ -171,6 +186,43 @@ export default {
 				});
 			}
 		},
+		qhx() {
+			check({
+				verify_code: this.code,
+				is_confirm: 1 //1是核销,0是查看
+			})
+				.then(e => {
+					this.$api.msg('核销成功');
+					this.close();
+				})
+				.catch(e => {
+					console.log(e);
+				});
+		},
+		sao() {
+			let obj = this;
+
+			// #ifndef H5
+			uni.scanCode({
+				success(e) {
+					obj.code = e.result;
+					obj.$refs.popuphx.open();
+					console.log(obj.$refs.popuphx);
+				}
+			});
+			// #endif
+			// #ifdef H5
+			let wx = require('jweixin-module');
+			wx.scanQRCode({
+				needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
+				scanType: ['qrCode', 'barCode'], // 可以指定扫二维码还是一维码,默认二者都有
+				success: function(res) {
+					obj.code = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
+					obj.$refs.popuphx.open();
+				}
+			});
+			// #endif
+		},
 		comfirm(text) {
 			console.log(text);
 			const result = this.uniCopy(text);
@@ -247,14 +299,9 @@ export default {
 				});
 			}
 		},
-		// 签到弹窗
-		goQd() {
-			this.$refs.popupqd.open();
-			this.qded = true;
-		},
-		// 关闭签到弹窗
-		closeQd() {
-			this.$refs.popupqd.close();
+		close() {
+			this.$refs.popuphx.close();
+			this.code = '';
 		},
 		// 打开客服
 		openKf() {
@@ -645,4 +692,78 @@ page {
 		color: #ff4c4c;
 	}
 }
+.hx-wrapper {
+	width: 536rpx;
+	height: 630rpx;
+	position: relative;
+
+	// background-color: #fff;
+	.hx-img {
+		width: 536rpx;
+		height: 281rpx;
+
+		image {
+			width: 536rpx;
+			height: 281rpx;
+		}
+	}
+
+	.hx-close {
+		position: absolute;
+		left: 243rpx;
+		bottom: -80rpx;
+		width: 52rpx;
+		height: 52rpx;
+
+		image {
+			width: 52rpx;
+			height: 52rpx;
+		}
+	}
+
+	.hx-body {
+		width: 536rpx;
+		height: 349rpx;
+		background-color: #fff;
+		border-radius: 0 0 10rpx 10rpx;
+
+		.hx-title {
+			width: 536rpx;
+			font-size: 36rpx;
+			font-weight: 500;
+			color: #333333;
+			line-height: 1;
+			padding-top: 42rpx;
+			text-align: center;
+		}
+
+		input {
+			width: 439rpx;
+			height: 68rpx;
+			background: #dbf3e9;
+			border-radius: 10rpx;
+			margin: 39rpx auto 0;
+			padding-left: 26rpx;
+
+			.hx-placeholder {
+				font-size: 26rpx;
+				font-weight: 500;
+				color: #ff4c4c;
+			}
+		}
+
+		.hx-btn {
+			margin: 44rpx auto 0;
+			width: 353rpx;
+			height: 71rpx;
+			background: #ff4c4c;
+			border-radius: 34rpx;
+			font-size: 36rpx;
+			font-weight: 500;
+			color: #f8f9f9;
+			line-height: 71rpx;
+			text-align: center;
+		}
+	}
+}
 </style>

BIN
static/dp/bg.png


BIN
static/dp/bottom.png


BIN
static/dp/dlb.png


BIN
static/dp/dz.png


BIN
static/dp/log.png


BIN
static/dp/logo.png


BIN
static/dp/money.png


BIN
static/dp/num.png


BIN
static/dp/order.png


BIN
static/dp/people.png


BIN
static/dp/pgl.png


BIN
static/dp/top.png


BIN
static/dp/ylb.png


BIN
static/icon/call.png


BIN
static/icon/dh.png


BIN
static/icon/index10.png


BIN
static/icon/user11.png


BIN
static/img/shop12.png


+ 1 - 1
store/index.js

@@ -6,7 +6,7 @@ Vue.use(Vuex)
 const store = new Vuex.Store({
 	state: {
 		baseURL: 'https://cgst.liuniu946.com', //请求地址配置
-		// baseURL: 'http://yrh.liuniu946.com', //请求地址配置
+		// baseURL: 'http://cgst.frp.liuniu946.com', //请求地址配置
 		urlFile: '/index', //项目部署所在文件夹
 		hasLogin: false, //是否登录
 		userInfo: {}, //登录信息

+ 27 - 56
utils/loginUtils.js

@@ -20,71 +20,42 @@ export function interceptor() {
 	// #endif
 	if (pageUrl != url) {
 		uni.navigateTo({
-			url
+			url,
+			fail: (e) => {
+				console.log(e);
+			}
 		})
 	}
 }
 
 // 保存页面
 export function saveUrl() {
-	// 获取当前页面
+	let path = getPageUrl(true)
+	uni.setStorageSync('present', path);
+}
+
+export function getPageUrl(showSpeard = false) {
 	let page = getActionPage();
-	// 获取跳转前路由地址
 	let path = '/' + page.route;
-	// 判断是否在商品页
-	if (path == '/pages/product/product') {
-		if (page.spread) {
-			if (page.type) {
-				path = path + '?id=' + page.id +'&type='+page.goodsType+'&spread='+page.spread;
-			}else{
-				path = path + '?id=' + page.id+'&spread='+page.spread;
+	let url = '';
+	// 获取对象可枚举键值列表
+	let objKeys = Object.keys(page.options);
+	// 判断有无传值
+	if (objKeys.length > 0) {
+		// 循环赋值对象数据
+		for (let a in page.options) {
+			// 判断有无邀请人
+			if (a != 'speard') {
+				url += a + "=" + page.options[a] + "&"
+			} else {
+				// 判断是否需要存储邀请人
+				if (showSpeard) {
+					url += a + "=" + page.options[a] + "&"
+				}
 			}
-		}else{
-			if (page.type) {
-				path = path + '?id=' + page.id +'&type=' + page.goodsType;
-			}else{
-				path = path + '?id=' + page.id;
-			}
-		}
-	}
-	//订单支付页面
-	if (path == '/pages/order/createOrder') {
-		// 判断是否为参团订单
-		if (page.option.type == "pink") {
-			const data = page.option;
-			path = path + '?pinkid=' + data.pinkid + '&type=pink' + '&pid=' + data.pid + '&gid=' + data.gid;
 		}
+		path += '?' + url.substr(0, url.length - 1);
 	}
-	//邀请好友拼团页面
-	if (path == '/pages/product/details') {
-		if (page.spread) {
-			path = path + '?pink_id=' + page.gp_id + '&spread=' + page.spread +'&teamid='+page.teamid;
-		}else{
-			path = path + '?pink_id=' + page.gp_id +'&teamid='+ page.teamid;
-		}
-	}
-	//我的订单页面
-	if (path == '/pages/order/order') {
-		if (page.state) {
-			path = path + '?state='+page.state;
-		}
-	}
-	//我的订单页面
-	if (path == '/pages/index/index') {
-		if (page.bingding) {
-			path = path + '?bingding='+page.bingding;
-		}
-			console.log(path)
-	}
-	//文章详情页面
-	if (path == '/pages/moments/details') {
-		if (page.spread) {
-			path = path +'?id=' + page.id + '&spread='+ page.spread;
-		}else{
-			path = path +'?id=' + page.id;
-		}
-	}
-	// 判断是否在登录页
-	// 保存当前过去页面
-	uni.setStorageSync('present', path);
+	// 返回处理邀请人后的邀请地址
+	return path
 }

+ 54 - 17
utils/request.js

@@ -1,5 +1,6 @@
 import service from './newRequest.js'
 import store from '../store';
+import md5 from 'js-md5'
 import {
 	saveUrl,
 	interceptor
@@ -8,7 +9,7 @@ import {
 service.interceptors.response(
 	response => {
 		try {
-			let res = response.data||{};
+			let res = response.data || {};
 			// 解析字符串为数字
 			if (res.status !== 200) {
 				if (res.status == 410000) {
@@ -28,17 +29,17 @@ service.interceptors.response(
 						}
 					})
 				} else {
-					if (res.msg.indexOf('人数过多')  == -1) {
-						if(res.msg!='系统出现异常' && res.msg != '0' && res.msg != 'ok' && res.msg != '找不到订单' ){
+					if (res.msg.indexOf('人数过多') == -1) {
+						if (res.msg != '系统出现异常' && res.msg != '0' && res.msg != 'ok' && res.msg != '找不到订单') {
 							uni.showToast({
 								title: res.msg,
 								duration: 1500,
 								mask: true,
 								icon: 'none',
 							})
-						} 
+						}
 					}
-					
+
 				}
 				// return res
 				return Promise.reject(new Error(res.msg || 'Error'))
@@ -63,20 +64,55 @@ service.interceptors.response(
 // 请求前拦截器
 service.interceptors.request(
 	config => {
-		// config.data.token = getToken();
-		// console.log(config);
 		let token = uni.getStorageSync('token');
-		// console.log(token);
-		if (!config.header) {
-			config.header = {
-				"Authori-zation": 'Bearer ' + token,
-				// "Authori-zation": 'Bearer ' + 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0bXAwMS5ra3R2Ni5jb20iLCJhdWQiOiJ0bXAwMS5ra3R2Ni5jb20iLCJpYXQiOjE2MTQ3Mzg1ODMsIm5iZiI6MTYxNDczODU4MywiZXhwIjoxNjE1MzQzMzgzLCJqdGkiOnsiaWQiOjIsInR5cGUiOiJyb3V0aW5lIn19.AgLlkg3V8--Rkp-uG-YAY123N6aYVHV4zhjYOPbg1ew',
+		if (config.data) {
+			if (config.data.fuck) {
+				let uid = config.data.fuck + ''
+				let timestamp = new Date().getTime();
+				timestamp = parseInt(timestamp / 1000)
+				let secret =
+					'0a989ebc4a77b56a6e2bb7b19d995d185ce44090c13e2984b7ecc6d446d4b61ea9991b76a4c2f04b1b4d244841449454';
+				let action = config.data.fuck_name
+				let key = 'fuckrml'
+				let str1 = uid + timestamp + secret + action + secret + key + timestamp + uid + secret
+				console.log(str1, '1234567899874351');
+				str1 = md5(str1) + secret
+				str1 = md5(str1)
+				if (!config.header) {
+					config.header = {
+						"Authori-zation": 'Bearer ' + token,
+						"key": key,
+						'time': timestamp,
+						'sign': str1
+					}
+				} else {
+					// 添加key请求头
+					config.header["Authori-zation"] = 'Bearer ' + token;
+					config.header["key"] = key;
+					config.header['time'] = timestamp;
+					config.header['sign'] = str1;
+				}
+			} else {
+				if (!config.header) {
+					config.header = {
+						"Authori-zation": 'Bearer ' + token,
+					}
+				} else {
+					// 添加key请求头
+					config.header["Authori-zation"] = 'Bearer ' + token;
+				}
 			}
 		} else {
-			// 添加key请求头
-			config.header["Authori-zation"] = 'Bearer ' + token;
-	 // config.header["Authori-zation"] = 'Bearer ' +'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0bXAwMS5ra3R2Ni5jb20iLCJhdWQiOiJ0bXAwMS5ra3R2Ni5jb20iLCJpYXQiOjE2MTQ3Mzg1ODMsIm5iZiI6MTYxNDczODU4MywiZXhwIjoxNjE1MzQzMzgzLCJqdGkiOnsiaWQiOjIsInR5cGUiOiJyb3V0aW5lIn19.AgLlkg3V8--Rkp-uG-YAY123N6aYVHV4zhjYOPbg1ew'
+			if (!config.header) {
+				config.header = {
+					"Authori-zation": 'Bearer ' + token,
+				}
+			} else {
+				// 添加key请求头
+				config.header["Authori-zation"] = 'Bearer ' + token;
+			}
 		}
+
 		return config
 	},
 	error => {
@@ -86,8 +122,9 @@ service.interceptors.request(
 	}
 )
 let upFilse = service.upFilse;
-let upFilse1= service.upFilse1;
+let upFilse1 = service.upFilse1;
 export {
-	upFilse,upFilse1
+	upFilse,
+	upFilse1
 };
 export default service.open;

+ 41 - 26
utils/rocessor.js

@@ -5,30 +5,30 @@ export function isCardNo(card) {
 	if (reg.test(card) === false) {
 		console.log(card);
 		return false;
-		
+
 	}
 	return true
 }
 
 // 名字中间用*
 export function formatName(name) {
-		let newStr;
-		if (name.length === 2) {
+	let newStr;
+	if (name.length === 2) {
 		newStr = name.substr(0, 1) + '*';
-		} else if (name.length > 2) {
-			let charr = '';
-			for (let i = 0, len = name.length - 7; i < len; i++) {
-				charr += '*';
-			}
-			newStr = name.substr(0, 3) + charr + name.substr(-3, 3);
-		} else {
-			newStr = name;
+	} else if (name.length > 2) {
+		let charr = '';
+		for (let i = 0, len = name.length - 7; i < len; i++) {
+			charr += '*';
 		}
-		
-		return newStr;
+		newStr = name.substr(0, 3) + charr + name.substr(-3, 3);
+	} else {
+		newStr = name;
+	}
+
+	return newStr;
 }
 
-export function getMoneyStyle(value=0) {
+export function getMoneyStyle(value = 0) {
 	if (typeof value == 'string') {
 		value = (+value).toFixed(2)
 	}
@@ -56,20 +56,35 @@ export function timeComputed(time) {
 	// 获取当前时间
 	let actTime = (new Date()).getTime();
 	// 获取到期时间
-	let stopTime = time-actTime;
-	let daytime = Math.floor(stopTime/24/3600/1000)
+	let stopTime = time - actTime;
+	let daytime = Math.floor(stopTime / 24 / 3600 / 1000)
 	// 判断是否小于0
-	if(stopTime <0){
-		stopTime  = stopTime*-1
+	if (stopTime < 0) {
+		stopTime = stopTime * -1
 	}
-	let day = daytime;//获取剩余小时数
-	let hours = Math.floor((stopTime/1000/60/60)%24);//获取剩余小时数
-	let minutes =  Math.floor((stopTime/1000/60)%60);//获取分钟
-	let seconds = Math.floor((stopTime/1000)%60);//获取秒数
+	let day = daytime; //获取剩余小时数
+	let hours = Math.floor((stopTime / 1000 / 60 / 60) % 24); //获取剩余小时数
+	let minutes = Math.floor((stopTime / 1000 / 60) % 60); //获取分钟
+	let seconds = Math.floor((stopTime / 1000) % 60); //获取秒数
 	return {
-		day,//倒计时天数
-		hours,//倒计时小时数
-		minutes,//倒计时分钟数
-		seconds//倒计时秒数
+		day, //倒计时天数
+		hours, //倒计时小时数
+		minutes, //倒计时分钟数
+		seconds //倒计时秒数
+	}
+}
+
+export function getnewTime() {
+	let date = new Date();
+	let year = date.getFullYear(); // 年
+	let month = date.getMonth() + 1; // 月
+	let day = date.getDate(); // 日
+	if (month < 10) {
+		month = '0' + month
+	}
+	if (day < 10) {
+		day = '0' + day
 	}
+	let str = year + '.' + month + '.' + day
+	return str;
 }

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików