Browse Source

第一次提交

yingzi 2 years ago
commit
19d3e0eda5
100 changed files with 22601 additions and 0 deletions
  1. 12 0
      .gitignore
  2. 45 0
      App.vue
  3. 0 0
      access/amap-wx.js
  4. 39 0
      access/base64.js
  5. 110 0
      access/common.js
  6. 342 0
      access/utils.js
  7. 272 0
      access/wa-permission/permission.js
  8. 522 0
      common/http.api.js
  9. 93 0
      common/http.interceptor.js
  10. 1133 0
      components/AddCardModel.vue
  11. 440 0
      components/GoodsItem.vue
  12. 217 0
      components/J-skeleton.vue
  13. 303 0
      components/Login.vue
  14. 80 0
      components/NoLoginTip.vue
  15. 260 0
      components/PageDesign/PageDesign.vue
  16. 255 0
      components/PageDesign/components/AdvGroup.vue
  17. 55 0
      components/PageDesign/components/Banner.vue
  18. 24 0
      components/PageDesign/components/Blank.vue
  19. 155 0
      components/PageDesign/components/CouponGroup.vue
  20. 851 0
      components/PageDesign/components/GoodsGroup.vue
  21. 341 0
      components/PageDesign/components/LimitedSeckill.vue
  22. 32 0
      components/PageDesign/components/Line.vue
  23. 216 0
      components/PageDesign/components/MagicImg.vue
  24. 95 0
      components/PageDesign/components/NavBar.vue
  25. 107 0
      components/PageDesign/components/NavigationBar.vue
  26. 152 0
      components/PageDesign/components/Notice.vue
  27. 82 0
      components/PageDesign/components/Search.vue
  28. 72 0
      components/PageDesign/components/shopInfo.vue
  29. 449 0
      components/SelSkuPop.vue
  30. 60 0
      components/Tabbar/index.vue
  31. 52 0
      components/empty/index.vue
  32. 310 0
      components/its-calendar/its-calendar.vue
  33. 220 0
      components/setMealMore.vue
  34. 108 0
      components/struggler-uniapp-add-tip/struggler-uniapp-add-tip.vue
  35. 30 0
      components/uni-status-bar/uni-status-bar.vue
  36. 25 0
      config.js
  37. 8 0
      ext.json
  38. 65 0
      main.js
  39. 188 0
      manifest.json
  40. 299 0
      mixin/goPage.js
  41. 11 0
      node_modules/number-precision/.travis.yml
  42. 50 0
      node_modules/number-precision/README.md
  43. 162 0
      node_modules/number-precision/build-test/src/index.js
  44. 0 0
      node_modules/number-precision/build-test/src/index.js.map
  45. 78 0
      node_modules/number-precision/build/index.d.ts
  46. 152 0
      node_modules/number-precision/build/index.es.js
  47. 167 0
      node_modules/number-precision/build/index.iife.js
  48. 164 0
      node_modules/number-precision/build/index.js
  49. 0 0
      node_modules/number-precision/build/index.js.map
  50. 170 0
      node_modules/number-precision/build/index.umd.js
  51. 80 0
      node_modules/number-precision/package.json
  52. 26 0
      node_modules/number-precision/rollup.config.js
  53. 166 0
      node_modules/number-precision/src/index.ts
  54. 23 0
      node_modules/number-precision/tsconfig.json
  55. 19 0
      node_modules/number-precision/tsconfig.test.json
  56. 33 0
      node_modules/number-precision/tslint.json
  57. 747 0
      pages.json
  58. 817 0
      pages/cart/cart.vue
  59. 326 0
      pages/classification/CateFive.vue
  60. 658 0
      pages/classification/CateFour.vue
  61. 80 0
      pages/classification/CateOne.vue
  62. 293 0
      pages/classification/CateThree.vue
  63. 76 0
      pages/classification/CateTwo.vue
  64. 176 0
      pages/classification/cate.vue
  65. 100 0
      pages/index/FullScreen.vue
  66. 127 0
      pages/index/SearchAddress.vue
  67. 135 0
      pages/index/StartUpPage.vue
  68. 629 0
      pages/index/index.vue
  69. 1258 0
      pages/user/user.vue
  70. 157 0
      pagesT/Distribution/AddUpMoney.vue
  71. 34 0
      pagesT/Distribution/Agreement.vue
  72. 194 0
      pagesT/Distribution/Application.vue
  73. 321 0
      pagesT/Distribution/ApplyAudit.vue
  74. 374 0
      pagesT/Distribution/ApplyTerm.vue
  75. 389 0
      pagesT/Distribution/DOrder.vue
  76. 262 0
      pagesT/Distribution/Distribution.vue
  77. 516 0
      pagesT/Distribution/DorderDetail.vue
  78. 293 0
      pagesT/Distribution/GradeDescription.vue
  79. 181 0
      pagesT/Distribution/IncomeDetails.vue
  80. 271 0
      pagesT/Distribution/MyGroup.vue
  81. 222 0
      pagesT/Distribution/NotRecorded.vue
  82. 383 0
      pagesT/Distribution/Poster.vue
  83. 222 0
      pagesT/Distribution/Ranking.vue
  84. 434 0
      pagesT/Distribution/Withdrawal.vue
  85. 466 0
      pagesT/NewAgent/apply_cash.vue
  86. 100 0
      pagesT/NewAgent/balance_detail.vue
  87. 157 0
      pagesT/NewAgent/cash_detail.vue
  88. 185 0
      pagesT/NewAgent/cash_info.vue
  89. 210 0
      pagesT/NewAgent/commission_detail.vue
  90. 241 0
      pagesT/NewAgent/index.vue
  91. 466 0
      pagesT/NewPartner/apply_cash.vue
  92. 100 0
      pagesT/NewPartner/balance_detail.vue
  93. 157 0
      pagesT/NewPartner/cash_detail.vue
  94. 185 0
      pagesT/NewPartner/cash_info.vue
  95. 210 0
      pagesT/NewPartner/commission_detail.vue
  96. 233 0
      pagesT/NewPartner/index.vue
  97. 61 0
      pagesT/activity/Activity.vue
  98. 175 0
      pagesT/address/SelAddress.vue
  99. 286 0
      pagesT/address/address.vue
  100. 274 0
      pagesT/address/addressManage.vue

+ 12 - 0
.gitignore

@@ -0,0 +1,12 @@
+.DS_Store
+/dist
+package-lock.json
+yarn.lock
+yarn-error.log
+.idea/
+.vscode/
+loader
+electron-dist/
+build/packages
+unpackage/
+.hbuilderx/

+ 45 - 0
App.vue

@@ -0,0 +1,45 @@
+<script>
+export default {
+	onLaunch() {
+		uni.setStorageSync('showchangename',0)
+		// #ifdef MP-WEIXIN
+		const updateManager = wx.getUpdateManager();
+
+		updateManager.onCheckForUpdate(function(res) {
+			// 请求完新版本信息的回调
+			console.log(res.hasUpdate);
+		});
+
+		updateManager.onUpdateReady(function() {
+			wx.showModal({
+				title: '更新提示',
+				content: '新版本已经准备好,是否重启应用?',
+				success: function(res) {
+					if (res.confirm) {
+						// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
+						updateManager.applyUpdate();
+					}
+				}
+			});
+		});
+
+		updateManager.onUpdateFailed(function() {
+			// 新版本下载失败
+		});
+		// #endif
+	},
+	onShow() {
+		// console.log('App Show');
+	},
+	onHide() {
+		// console.log('App Hide');
+	}
+};
+</script>
+<style>
+@import url('./static/css/iconfont.css');
+@import url('./static/css/common.css');
+</style>
+<style lang="scss">
+@import 'uview-ui/index.scss';
+</style>

File diff suppressed because it is too large
+ 0 - 0
access/amap-wx.js


+ 39 - 0
access/base64.js

@@ -0,0 +1,39 @@
+export function encode(input) {
+	let _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+	let chr1, chr2, chr3, enc1, enc2, enc3, enc4, i = 0,
+		output = '',
+		utftext = '';
+	input = input.replace(/\r\n/g, "\n");
+	for (let n = 0; n < input.length; n++) {
+		let c = input.charCodeAt(n);
+		if (c < 128) {
+			utftext += String.fromCharCode(c);
+		} else if ((c > 127) && (c < 2048)) {
+			utftext += String.fromCharCode((c >> 6) | 192);
+			utftext += String.fromCharCode((c & 63) | 128);
+		} else {
+			utftext += String.fromCharCode((c >> 12) | 224);
+			utftext += String.fromCharCode(((c >> 6) & 63) | 128);
+			utftext += String.fromCharCode((c & 63) | 128);
+		}
+
+	}
+	while (i < utftext.length) {
+		chr1 = utftext.charCodeAt(i++);
+		chr2 = utftext.charCodeAt(i++);
+		chr3 = utftext.charCodeAt(i++);
+		enc1 = chr1 >> 2;
+		enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
+		enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
+		enc4 = chr3 & 63;
+		if (isNaN(chr2)) {
+			enc3 = enc4 = 64;
+		} else if (isNaN(chr3)) {
+			enc4 = 64;
+		}
+		output = output +
+			_keyStr.charAt(enc1) + _keyStr.charAt(enc2) +
+			_keyStr.charAt(enc3) + _keyStr.charAt(enc4);
+	}
+	return output;
+}

+ 110 - 0
access/common.js

@@ -0,0 +1,110 @@
+import {
+	encode
+} from '@/access/base64.js';
+/**
+ * 判断是否登陆
+ * returns {boolean}
+ */
+export function isLogin() {
+	return !!uni.getStorageSync('token')
+}
+/**
+ * 判断当前系统
+ */
+export function source() {
+	// #ifdef H5
+	const app = navigator.appVersion;
+	const ua = navigator.userAgent.toLowerCase(); //获取判断用的对象
+	//在微信浏览器中打开
+	if (ua.match(/MicroMessenger/i) == 'micromessenger') {
+		return 9
+	} else {
+		return 5
+	}
+	return 5;
+	// #endif
+	// #ifdef MP-WEIXIN
+	return 3;
+	// #endif
+	// #ifdef MP-TOUTIAO
+	return 8;
+	// #endif
+	// #ifdef APP-PLUS
+	const res = uni.getSystemInfoSync();
+	return res.platform === 'ios' ? 1 : 2;
+	// #endif
+}
+
+/**
+ * 获取用户信息
+ */
+export function getUserInfo() {
+	const session = JSON.parse(uni.getStorageSync('userInfo')) || {}
+	return session
+}
+/**
+ * 获取登录过期时间
+ */
+export function getExpireTime() {
+	const session = uni.getStorageSync('expireTime') || ''
+	return session
+}
+/**
+ * 获取用户登录token
+ */
+export function getToken() {
+	const token = uni.getStorageSync('token') || ''
+	return token
+}
+// 获取微信小程序用户的图像
+export function getAvator() {
+	const avator = uni.getStorageSync('avator') || ''
+	return avator
+}
+// 获取微信小程序用户昵称
+export function getName() {
+	const NickName = uni.getStorageSync('NickName') || ''
+	return NickName
+}
+// 获取微信小程序session_key
+export function getkey() {
+	const session_key = uni.getStorageSync('session_key') || ''
+	return session_key
+}
+// 获取微信小程序getUnionId
+export function getUnionId() {
+	const unionId = uni.getStorageSync('unionid') || ''
+	return unionId
+}
+// 一键登录的手机号
+export function getphoneNumber() {
+	const phoneNumber = uni.getStorageSync('phoneNumber') || ''
+	return phoneNumber
+}
+/**
+ * 获取企业token
+ */
+export function getEnToken() {
+	// return '35e97bca34dab476692d2ad8cc47954b' //dev
+	// return 'b8ca10e4ce35fded735c980403dfedf7' //master
+	// #ifdef MP
+	// const entoken = uni.getExtConfigSync().token || ''
+	return "931544405107da76ca2ec31cd63fae49"
+	// return "fa4c7dee4c8c37d41204a9c1e11f3e43"
+	// return entoken
+	// #endif
+	// #ifdef H5||APP-PLUS
+	// return "fa4c7dee4c8c37d41204a9c1e11f3e43"
+	return "931544405107da76ca2ec31cd63fae49"
+	// #endif
+}
+// 获取openid
+export function getOpenid() {
+	const openid = uni.getStorageSync('openid') || '';
+	return openid;
+}
+// 获取 请求头 定位信息
+export function getLocation() {
+	const location = uni.getStorageSync('locationObj') || '';
+	return encode(location);
+}

+ 342 - 0
access/utils.js

@@ -0,0 +1,342 @@
+/**
+ * 将小数点后面的字体变小
+ * */
+export const splitPrice = (price = 0, px = 10) => {
+	let arr = (price || 0).toString().split(".");
+	return `${arr[0]}<span style="font-size:${px}px;">.${arr[1]||"00"}</span>`;
+}
+
+// 判断市场常见的几种刘海屏机型
+export const modelmes = () => {
+	// 判断市场常见的几种刘海屏机型
+	const systemInfo = uni.getSystemInfoSync();
+	let modelmes = systemInfo.model;
+	if (modelmes.indexOf('iPhone X') >= 0 || modelmes.indexOf('iPhone XR') >= 0 || modelmes.indexOf('iPhone XS') >=
+		0 ||
+		modelmes.indexOf('iPhone 12') >= 0 || modelmes.indexOf('iPhone 11') >= 0 || modelmes.indexOf('iPhone11') >=
+		0 ||
+		modelmes.indexOf('iPhone12') >= 0 || modelmes.indexOf('iPhoneXR') >= 0 || modelmes.indexOf('iPhoneX') >= 0
+	) {
+		return true
+	} else {
+		return false
+	}
+}
+/**
+ * 将rgba转为十六进制
+ * */
+export const hexify = (color) => {
+	if (!color) return ''
+	var values = color
+		.replace(/rgba?\(/, '')
+		.replace(/\)/, '')
+		.replace(/[\s+]/g, '')
+		.split(',');
+	var a = parseFloat(values[3] || 1),
+		r = Math.floor(a * parseInt(values[0]) + (1 - a) * 255),
+		g = Math.floor(a * parseInt(values[1]) + (1 - a) * 255),
+		b = Math.floor(a * parseInt(values[2]) + (1 - a) * 255);
+	return "#" +
+		("0" + r.toString(16)).slice(-2) +
+		("0" + g.toString(16)).slice(-2) +
+		("0" + b.toString(16)).slice(-2);
+}
+
+/**
+ * 将十六进制颜色转为rgba
+ *使用时只需传入十六进制字符串,“n”表示透明度
+ * */
+export const colorRgba = (str, n) => {
+	console.log(n)
+	// 十六进制颜色值的正则表达式
+	let reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/
+	let sColor = str.toLowerCase()
+	if (str === 'rgb(95,171,42)') {
+		sColor = '#91E055'.toLowerCase()
+	}
+	if (str === 'rgb(145,224,85)') {
+		sColor = '#5FAB2A'.toLowerCase()
+	}
+	// 十六进制颜色转换为RGB格式
+	if (sColor && reg.test(sColor)) {
+		if (sColor.length === 4) {
+			let sColorNew = '#'
+			for (let i = 1; i < 4; i += 1) { // 例如:#eee,#fff等
+				sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1))
+			}
+			sColor = sColorNew
+		}
+		// 处理六位颜色值
+		let sColorChange = []
+		for (let i = 1; i < 7; i += 2) {
+			sColorChange.push(parseInt('0x' + sColor.slice(i, i + 2)))
+		}
+		return 'rgba(' + sColorChange.join(',') + ',' + n + ')'
+	} else {
+		return sColor
+	}
+}
+// 获取【加载更多】组件状态
+export function loadStatus(page, pageSize, total) {
+	if (total / pageSize > page) {
+		return 'loadmore';
+	} else {
+		return 'nomore';
+	}
+}
+/*加法函数,用来得到精确的加法结果 */
+export const accAdd = (num1, num2) => {
+	var p1 = 0;
+	var p2 = 0;
+
+	if (num1.toString().split('.').length > 1) {
+		p1 = num1.toString().split('.')[1].length;
+	}
+
+	if (num2.toString().split('.').length > 1) {
+		p2 = num2.toString().split(".")[1].length;
+	}
+
+	var p = p1 > p2 ? p1 : p2;
+
+	var n1 = num1 * Math.pow(10, p);
+	var n2 = num2 * Math.pow(10, p);
+
+	var result = (n1 + n2) / Math.pow(10, p);
+
+	return parseFloat(result.toPrecision(12));
+}
+/*减法函数,用来得到精确的减法结果 */
+export const Subtr = (arg1, arg2) => {
+	var r1, r2, m, n;
+	try {
+		r1 = arg1.toString().split(".")[1].length
+	} catch (e) {
+		r1 = 0
+	}
+	try {
+		r2 = arg2.toString().split(".")[1].length
+	} catch (e) {
+		r2 = 0
+	}
+	m = Math.pow(10, Math.max(r1, r2));
+	//last modify by deeka
+	//动态控制精度长度
+	n = (r1 >= r2) ? r1 : r2;
+	var result = ((arg1 * m - arg2 * m) / m).toFixed(n);
+	return result
+}
+
+// 本月第一天
+export function showMonthFirstDay() {
+	var Nowdate = new Date();
+	var MonthFirstDay = new Date(Nowdate.getFullYear(), Nowdate.getMonth(), 1);
+	const M = Number(MonthFirstDay.getMonth()) + 1;
+	return (
+		MonthFirstDay.getFullYear() +
+		"-" +
+		M +
+		"-" +
+		MonthFirstDay.getDate() +
+		" 00:00:00"
+	);
+}
+/**
+ * @description 时间格式化  时间戳转换为时间
+ * @param date
+ * @param fmt
+ * @return {*}
+ */
+export function formatDate(date, fmt) {
+	if (!date) {
+		return ''
+	}
+	// if (typeof date !== 'string') {
+	//   return ''
+	// }
+	date *= (date.toString().length === 10 ? 1000 : 1)
+	let _date = new Date(date)
+	let _fmt = fmt || 'yyyy-MM-dd hh:mm:ss'
+	let o = {
+		'M+': _date.getMonth() + 1,
+		'd+': _date.getDate(),
+		'h+': _date.getHours(),
+		'm+': _date.getMinutes(),
+		's+': _date.getSeconds()
+	}
+	if (/(y+)/.test(_fmt)) {
+		_fmt = _fmt.replace(RegExp.$1, (_date.getFullYear() + '').substr(4 - RegExp.$1.length))
+	}
+	for (let k in o) {
+		if (new RegExp('(' + k + ')').test(_fmt)) {
+			_fmt = _fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k])
+				.length)))
+		}
+	}
+	return _fmt
+}
+
+/**
+ * @description 时间格式化  时间字符串转换为时间戳
+ * @param date
+ * @param len     默认时间戳长度为10位
+ * @return {*}
+ */
+export function dateToStamp(str, len = 10) {
+	// new Date(yyyy-mm-dd hh:mm:ss) 这里ios会返回null,把‘-’划分替换为‘/’划分
+	let date = new Date(str.replace(/-/g, '/'))
+	return parseInt(date.getTime() / (len === 13 ? 1 : 1000))
+}
+/**
+ * 格式化数字,数字每隔三位加个逗号
+ * params: num 需要处理的数字
+ * params: len 需要保留的小数点位数
+ */
+export function formattedNumber(num, len = 2) {
+	let result = "",
+		counter = 0;
+	let formatNum;
+	if (num < 0) {
+		formatNum = formatNub(Math.abs(num) || 0, len);
+	} else {
+		formatNum = formatNub(num || 0, len);
+	}
+	let stringNum = formatNum.toString().split(".");
+	for (let i = stringNum[0].length - 1; i >= 0; i--) {
+		counter++;
+		result = stringNum[0].charAt(i) + result;
+		if (!(counter % 3) && i != 0) {
+			result = "," + result;
+		}
+	}
+	result = num < 0 ? "-" + result : result;
+	if (stringNum[1]) {
+		return "¥" + result + "." + stringNum[1];
+	} else {
+		return "¥" + result;
+	}
+};
+
+
+export function isDefine(value) {
+		  if (value == null || value == "" || value == "undefined" || value == undefined || value == "null" || value == "(null)" || value == 'NULL' || typeof (value) == 'undefined') {
+		    return false;
+		  }
+		  else {
+		    value = value + "";
+		    value = value.replace(/\s/g, "");
+		    if (value == "") {
+		      return false;
+		    }
+		    return true;
+		  }
+};
+
+
+export function isMobile(value){
+	var reg = /^1[0-9]{10,10}$/;
+	if (!reg.test(value)) {
+		return false; 
+	}else{
+		return true;
+	}
+}
+
+export function isMoney(price){
+	price = parseFloat(price);
+	if (!isDefine(price) || isNaN(price) || price<0){
+	    return false;
+	}
+	return true;
+}
+
+/**
+ * 不四舍五入保留n位小数
+ * params: val 需要处理的数字
+ * params: len 需要保留的小数点位数
+ */
+export function formatNub(num, n = 2) {
+	if (typeof num != "number" && !Number(num)) {
+		return "0.00";
+	}
+
+	num = Number(num).toString();
+	let result = "";
+	let zeroResult = function(n) {
+		let zero = "";
+		for (let i = 0; i < n; i++) {
+			zero += "0";
+		}
+		return zero;
+	};
+	if (num % 1 == 0) {
+		//整数
+		result = num + "." + zeroResult(n);
+	} else {
+		//小数
+		let num1 = num.split(".");
+		if (num1[1].length < n) {
+			result = num1[0] + "." + num1[1] + zeroResult(n - num1[1].length);
+		} else {
+			result = num1[0] + "." + num1[1].substring(0, n);
+		}
+	}
+	return result;
+};
+//省市区截取
+export function getArea(str) {
+	let area = {}
+	let index11 = 0
+	let index1 = str.indexOf("省")
+	if (index1 == -1) {
+		index11 = str.indexOf("自治区")
+		if (index11 != -1) {
+			area.provinceName = str.substring(0, index11 + 3)
+		} else {
+			area.provinceName = str.substring(0, 0)
+		}
+	} else {
+		area.provinceName = str.substring(0, index1 + 1)
+	}
+
+	let index2 = str.indexOf("市")
+	if (index11 == -1) {
+		area.cityName = str.substring(index11 + 1, index2 + 1)
+	} else {
+		if (index11 == 0) {
+			area.cityName = str.substring(index1 + 1, index2 + 1)
+		} else {
+			area.cityName = str.substring(index11 + 3, index2 + 1)
+		}
+	}
+
+
+	let index3 = str.lastIndexOf("区")
+	if (index3 == -1) {
+		index3 = str.indexOf("县")
+		if (index3 == -1) {
+			index3 = str.lastIndexOf("市")
+			area.districtName = str.substring(index2 + 1, index3 + 1)
+		} else {
+			area.districtName = str.substring(index2 + 1, index3 + 1)
+		}
+	} else {
+		area.districtName = str.substring(index2 + 1, index3 + 1)
+	}
+
+	area.address = str.substring(index3 + 1)
+	return area;
+}
+
+/**
+ * 将手机号以3-4-4格式展示
+ * */
+export const mobileFormat = (mobile) => {
+	return mobile.replace(/(\d{3})(\d{4})(\d{4})/, '$1 $2 $3');
+}
+/**
+ * 将手机号空格还原
+ * */
+export const mobileRe = (mobile) => {
+	return mobile.replace(/\s/g, '')
+}

+ 272 - 0
access/wa-permission/permission.js

@@ -0,0 +1,272 @@
+/**
+ * 本模块封装了Android、iOS的应用权限判断、打开应用权限设置界面、以及位置系统服务是否开启
+ */
+
+var isIos
+// #ifdef APP-PLUS
+isIos = (plus.os.name == "iOS")
+// #endif
+
+// 判断推送权限是否开启
+function judgeIosPermissionPush() {
+	var result = false;
+	var UIApplication = plus.ios.import("UIApplication");
+	var app = UIApplication.sharedApplication();
+	var enabledTypes = 0;
+	if (app.currentUserNotificationSettings) {
+		var settings = app.currentUserNotificationSettings();
+		enabledTypes = settings.plusGetAttribute("types");
+		console.log("enabledTypes1:" + enabledTypes);
+		if (enabledTypes == 0) {
+			console.log("推送权限没有开启");
+		} else {
+			result = true;
+			console.log("已经开启推送功能!")
+		}
+		plus.ios.deleteObject(settings);
+	} else {
+		enabledTypes = app.enabledRemoteNotificationTypes();
+		if (enabledTypes == 0) {
+			console.log("推送权限没有开启!");
+		} else {
+			result = true;
+			console.log("已经开启推送功能!")
+		}
+		console.log("enabledTypes2:" + enabledTypes);
+	}
+	plus.ios.deleteObject(app);
+	plus.ios.deleteObject(UIApplication);
+	return result;
+}
+
+// 判断定位权限是否开启
+function judgeIosPermissionLocation() {
+	var result = false;
+	var cllocationManger = plus.ios.import("CLLocationManager");
+	var status = cllocationManger.authorizationStatus();
+	result = (status != 2)
+	console.log("定位权限开启:" + result);
+	// 以下代码判断了手机设备的定位是否关闭,推荐另行使用方法 checkSystemEnableLocation
+	/* var enable = cllocationManger.locationServicesEnabled();
+	var status = cllocationManger.authorizationStatus();
+	console.log("enable:" + enable);
+	console.log("status:" + status);
+	if (enable && status != 2) {
+		result = true;
+		console.log("手机定位服务已开启且已授予定位权限");
+	} else {
+		console.log("手机系统的定位没有打开或未给予定位权限");
+	} */
+	plus.ios.deleteObject(cllocationManger);
+	return result;
+}
+
+// 判断麦克风权限是否开启
+function judgeIosPermissionRecord() {
+	var result = false;
+	var avaudiosession = plus.ios.import("AVAudioSession");
+	var avaudio = avaudiosession.sharedInstance();
+	var permissionStatus = avaudio.recordPermission();
+	console.log("permissionStatus:" + permissionStatus);
+	if (permissionStatus == 1684369017 || permissionStatus == 1970168948) {
+		console.log("麦克风权限没有开启");
+	} else {
+		result = true;
+		console.log("麦克风权限已经开启");
+	}
+	plus.ios.deleteObject(avaudiosession);
+	return result;
+}
+
+// 判断相机权限是否开启
+function judgeIosPermissionCamera() {
+	var result = false;
+	var AVCaptureDevice = plus.ios.import("AVCaptureDevice");
+	var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');
+	console.log("authStatus:" + authStatus);
+	if (authStatus == 3) {
+		result = true;
+		console.log("相机权限已经开启");
+	} else {
+		console.log("相机权限没有开启");
+	}
+	plus.ios.deleteObject(AVCaptureDevice);
+	return result;
+}
+
+// 判断相册权限是否开启
+function judgeIosPermissionPhotoLibrary() {
+	var result = false;
+	var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary");
+	var authStatus = PHPhotoLibrary.authorizationStatus();
+	console.log("authStatus:" + authStatus);
+	if (authStatus == 3) {
+		result = true;
+		console.log("相册权限已经开启");
+	} else {
+		console.log("相册权限没有开启");
+	}
+	plus.ios.deleteObject(PHPhotoLibrary);
+	return result;
+}
+
+// 判断通讯录权限是否开启
+function judgeIosPermissionContact() {
+	var result = false;
+	var CNContactStore = plus.ios.import("CNContactStore");
+	var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);
+	if (cnAuthStatus == 3) {
+		result = true;
+		console.log("通讯录权限已经开启");
+	} else {
+		console.log("通讯录权限没有开启");
+	}
+	plus.ios.deleteObject(CNContactStore);
+	return result;
+}
+
+// 判断日历权限是否开启
+function judgeIosPermissionCalendar() {
+	var result = false;
+	var EKEventStore = plus.ios.import("EKEventStore");
+	var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);
+	if (ekAuthStatus == 3) {
+		result = true;
+		console.log("日历权限已经开启");
+	} else {
+		console.log("日历权限没有开启");
+	}
+	plus.ios.deleteObject(EKEventStore);
+	return result;
+}
+
+// 判断备忘录权限是否开启
+function judgeIosPermissionMemo() {
+	var result = false;
+	var EKEventStore = plus.ios.import("EKEventStore");
+	var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);
+	if (ekAuthStatus == 3) {
+		result = true;
+		console.log("备忘录权限已经开启");
+	} else {
+		console.log("备忘录权限没有开启");
+	}
+	plus.ios.deleteObject(EKEventStore);
+	return result;
+}
+
+// Android权限查询
+function requestAndroidPermission(permissionID) {
+	return new Promise((resolve, reject) => {
+		plus.android.requestPermissions(
+			[permissionID], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装
+			function(resultObj) {
+				var result = 0;
+				for (var i = 0; i < resultObj.granted.length; i++) {
+					var grantedPermission = resultObj.granted[i];
+					console.log('已获取的权限:' + grantedPermission);
+					result = 1
+				}
+				for (var i = 0; i < resultObj.deniedPresent.length; i++) {
+					var deniedPresentPermission = resultObj.deniedPresent[i];
+					console.log('拒绝本次申请的权限:' + deniedPresentPermission);
+					result = 0
+				}
+				for (var i = 0; i < resultObj.deniedAlways.length; i++) {
+					var deniedAlwaysPermission = resultObj.deniedAlways[i];
+					console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);
+					result = -1
+				}
+				resolve(result);
+				// 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限
+				// if (result != 1) {
+				// gotoAppPermissionSetting()
+				// }
+			},
+			function(error) {
+				console.log('申请权限错误:' + error.code + " = " + error.message);
+				resolve({
+					code: error.code,
+					message: error.message
+				});
+			}
+		);
+	});
+}
+
+// 使用一个方法,根据参数判断权限
+function judgeIosPermission(permissionID) {
+	if (permissionID == "location") {
+		return judgeIosPermissionLocation()
+	} else if (permissionID == "camera") {
+		return judgeIosPermissionCamera()
+	} else if (permissionID == "photoLibrary") {
+		return judgeIosPermissionPhotoLibrary()
+	} else if (permissionID == "record") {
+		return judgeIosPermissionRecord()
+	} else if (permissionID == "push") {
+		return judgeIosPermissionPush()
+	} else if (permissionID == "contact") {
+		return judgeIosPermissionContact()
+	} else if (permissionID == "calendar") {
+		return judgeIosPermissionCalendar()
+	} else if (permissionID == "memo") {
+		return judgeIosPermissionMemo()
+	}
+	return false;
+}
+
+// 跳转到**应用**的权限页面
+function gotoAppPermissionSetting() {
+	if (isIos) {
+		var UIApplication = plus.ios.import("UIApplication");
+		var application2 = UIApplication.sharedApplication();
+		var NSURL2 = plus.ios.import("NSURL");
+		// var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");		
+		var setting2 = NSURL2.URLWithString("app-settings:");
+		application2.openURL(setting2);
+
+		plus.ios.deleteObject(setting2);
+		plus.ios.deleteObject(NSURL2);
+		plus.ios.deleteObject(application2);
+	} else {
+		// console.log(plus.device.vendor);
+		var Intent = plus.android.importClass("android.content.Intent");
+		var Settings = plus.android.importClass("android.provider.Settings");
+		var Uri = plus.android.importClass("android.net.Uri");
+		var mainActivity = plus.android.runtimeMainActivity();
+		var intent = new Intent();
+		intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+		var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
+		intent.setData(uri);
+		mainActivity.startActivity(intent);
+	}
+}
+
+// 检查系统的设备服务是否开启
+// var checkSystemEnableLocation = async function () {
+function checkSystemEnableLocation() {
+	if (isIos) {
+		var result = false;
+		var cllocationManger = plus.ios.import("CLLocationManager");
+		var result = cllocationManger.locationServicesEnabled();
+		console.log("系统定位开启:" + result);
+		plus.ios.deleteObject(cllocationManger);
+		return result;
+	} else {
+		var context = plus.android.importClass("android.content.Context");
+		var locationManager = plus.android.importClass("android.location.LocationManager");
+		var main = plus.android.runtimeMainActivity();
+		var mainSvr = main.getSystemService(context.LOCATION_SERVICE);
+		var result = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER);
+		console.log("系统定位开启:" + result);
+		return result
+	}
+}
+
+module.exports = {
+	judgeIosPermission: judgeIosPermission,
+	requestAndroidPermission: requestAndroidPermission,
+	checkSystemEnableLocation: checkSystemEnableLocation,
+	gotoAppPermissionSetting: gotoAppPermissionSetting
+}

+ 522 - 0
common/http.api.js

@@ -0,0 +1,522 @@
+// 此处第二个参数vm,就是我们在页面使用的this,你可以通过vm获取vuex等操作,更多内容详见uView对拦截器的介绍部分:
+// https://uviewui.com/js/http.html#%E4%BD%95%E8%B0%93%E8%AF%B7%E6%B1%82%E6%8B%A6%E6%88%AA%EF%BC%9F
+const install = (Vue, vm) => {
+	// 将各个定义的接口名称,统一放进对象挂载到vm.$u.api(因为vm就是this,也即this.$u.api)下
+	vm.$u.api = {
+		// 根据系统模板d获取对应模板设置内容
+		getSettingDataByMessageId: (params = '') => vm.$u.post(
+			`/System/ApiPushMessage/getSettingDataByMessageIds`, params),
+		// 获取app版本
+		getVersion: (params = '') => vm.$u.post(`/System/ApiBasicSetup/getVersion`, params),
+
+		// App微信授权登录获取unionID
+		unionIDUserinfo: (params = '') => vm.$u.post(`/Common/Login/userinfo`, params),
+		// 获取网页版access_token type 1 公众号  2开放平台 {"code":"","type":2}
+		getAccessToken: (params = '') => vm.$u.post(`/Common/Login/access_token`, params),
+		// 判断订单支付状态
+		orderquery: (params = '') => vm.$u.post(`/Common/Pay/orderquery`, params),
+
+		// 字节跳动获取分享小程序码
+		byteCreateQRCode: (params = '') => vm.$u.post(`/Common/Login/byteCreateQRCode`, params),
+
+		// 获取分享微信小程序码 
+		createwxaqrcode: (params = '') => vm.$u.post(`/common/login/createwxaqrcode`, params),
+
+		// 获取基础资料 
+		getCustomerInfo: (params = '') => vm.$u.get(`/Customer/ApiCustomer/getCustomerInfo`, params),
+
+		//基础资料 
+		editCustomerInfo: (params = '') => vm.$u.post(`/Customer/ApiCustomer/editCustomerInfo`, params),
+		//首页模版及数据
+		getTemplate: (params = '') => vm.$u.get(`/System/ApiTemplate/getTemplate`, params),
+		//首页(万能模版)
+		getHome: (params = '') => vm.$u.get(`/System/ApiPage/home`, params),
+		//首页模版及数据2
+		homePage: (params = '') => vm.$u.post(`/System/ApiTemplate/homePage`, params),
+
+		//首页模版及数据2
+		getDetailById: (id, params = '') => vm.$u.get(`/System/ApiPage/getDetailById/${id}`, params),
+		/**
+		 * 地区
+		 * */
+		// 获取省份
+		getAllProvince: () => vm.$u.get(`/Common/SysAreaChina/getAllProvince`),
+		// 获取省下的市
+		getAllCityByProvinceCode: (code = '') => vm.$u.get(
+			`/Common/SysAreaChina/getAllCityByProvinceCode/${code}`),
+		// 获取市下的区
+		getAllAreaByCityCode: (code = '') => vm.$u.get(`/Common/SysAreaChina/getAllAreaByCityCode/${code}`),
+		/**
+		 * 生成七牛上传凭证
+		 * */
+		uploadToken: (params = '') => vm.$u.post(`/Common/Upload/uploadToken`, params),
+		UploadDel: (params = '') => vm.$u.post(`/Common/Upload/delete`, params),
+		// 短信登录 
+		smsLogin: (params = '') => vm.$u.post(`/UserCenter/ApiUserCenter/smsLogin`, params),
+		// 用户登录 
+		login: (params = '') =>
+			vm.$u.post(`/UserCenter/ApiUserCenter/login`, params),
+
+		//用户注册 
+		addUserCenter: (params = '') =>
+			vm.$u.post(`/UserCenter/ApiUserCenter/register`, params),
+
+		// 发送验证码 
+		sendMobileCode: (params = '') =>
+			vm.$u.post(`/Common/SmsCode/sendMobileCode`, params),
+
+		// 判断用户是否注册过 
+		mobileIsRegister: (id, params = '') =>
+			vm.$u.get(`/UserCenter/ApiUserCenter/mobileIsRegister/${id}`, params),
+
+		// 忘记密码  
+		forgetPassword: (params = '') =>
+			vm.$u.post(`/UserCenter/ApiUserCenter/changePassword`, params),
+
+		// 小程序绑定手机号
+		appletsBindMobile: (params = '') =>
+			vm.$u.post(`/UserCenter/ApiUserCenter/appletsBindMobile`, params),
+
+		// 根据openID进行登录 ApiUser/User/getUserInfoByOpenId
+		getOpenId: (params = '') =>
+			vm.$u.post(`/Common/Login/login`, params),
+
+		// 小程序判断是否已绑定 UserCenter/ApiUserCenter/checkBindMiniProgram  post
+		checkBindMiniProgram: (params = '') =>
+			vm.$u.post(`/UserCenter/ApiUserCenter/checkBindMiniProgram`, params),
+
+		//  小程序解密接口 Common/Login/decryptData
+		decryptData: (params = '') =>
+			vm.$u.post(`/Common/Login/decryptData`, params),
+
+		//  头条小程序登陆
+		microappLogin: (params = '') =>
+			vm.$u.post(`/Common/Login/microappLogin`, params),
+
+		/*-------------分类-----------*/
+		// 分类模版详情
+		getClassSettingInfo: (params = '') =>
+			vm.$u.post(`/System/ApiClassSetting/getClassSettingInfo`, params),
+
+		// 商品列表 Goods/Goods/search post
+		goodSearch: (params = '') =>
+			vm.$u.post(`/Goods/Goods/search`, params),
+
+		// 商品列表 Goods/ApiGoods/getGoodsByCategory  post
+		getGoodsByCategory: (params = '') =>
+			vm.$u.post(`/Goods/ApiGoods/getGoodsByCategory`, params),
+
+		// 商品详情 
+		getGoodsDetail: (id, params = '') =>
+			vm.$u.get(`/Goods/ApiGoods/getGoodsDetail/${id}`, params),
+
+		// 分类列表  GoodsCategory/ApiGoodsCategory/getAllCategory get
+		getAllCategory: (params = '') =>
+			vm.$u.post(`/GoodsCategory/ApiGoodsCategory/getAllCategory`, params),
+
+		// 子分类  GoodsCategory/ApiGoodsCategory/getAllCategoryByPid/1
+		getAllCategoryByPidid: (id, params = '') =>
+			vm.$u.get(`/GoodsCategory/ApiGoodsCategory/getAllCategoryByPid/${id}`, params),
+
+		// 所有一级分类  GoodsCategory/ApiGoodsCategory/getAllCategoryByPid  get
+		getAllCategoryByPid: (params = '') =>
+			vm.$u.get(`/GoodsCategory/ApiGoodsCategory/getAllCategoryByPid`, params),
+		// 小程序服务列表
+		getAllGoodsSupport: (params = '') =>
+			vm.$u.post(`/Goods/apiGoods/getAllGoodsSupport`, params),
+		// 小程序品牌列表
+		getAllBrand: (params = '') =>
+			vm.$u.post(`/Goods/apiGoods/getAllBrand`, params),
+		/*-------------常购清单------------*/
+		// 收藏/取消收藏
+		collectGoods: (id) => vm.$u.get(`/Goods/ApiGoods/collect/${id}`),
+
+		// 常购清单
+		normalList: (params = '') =>
+			vm.$u.post(`/Goods/ApiGoods/normalList`, params),
+
+		/*-------------购物车------------*/
+		// 加入购物车  Cart/ApiCart/addCart post
+		addCart: (params = '') =>
+			vm.$u.post(`/Cart/ApiCart/addCart`, params),
+
+		// 获取购物车 Cart/ApiCart/getCartByUserCenterId get
+		getCartByUserCenterId: (params = '') =>
+			vm.$u.get(`/Cart/ApiCart/getCartByUserCenterId`, params),
+
+		// 移除购物车  Cart/ApiCart/delCart  post
+		delCart: (params = '') =>
+			vm.$u.post(`/Cart/ApiCart/delCart`, params),
+
+		// 购物车商品选中/取消
+		updateSelection: (params = '') =>
+			vm.$u.post(`/Cart/ApiCart/updateSelection`, params),
+
+		// 更新购物车某个商品数量  Cart/ApiCart/updateBuyNum/5 put
+		updateBuyNum: (id, params = '') =>
+			vm.$u.put(`/Cart/ApiCart/updateBuyNum/${id}`, params),
+
+		// 确认订单
+		confirmationOfOrder: (params = '') =>
+			vm.$u.post(`/Cart/ApiCart/confirmationOfOrder`, params),
+		// 组合商品立即购买
+		buyNow: (params = '') =>
+			vm.$u.post(`/Cart/ApiCart/buyNow`, params),
+
+		// 商品立即购买
+		goodsBuyNow: (params = '') =>
+			vm.$u.post(`/cart/apiCart/goodsBuyNow`, params),
+		/*----------地址管理---------------*/
+		// 客户地址添加  Customer/ShippingAddress/addShippingAddress post
+		addShippingAddress: (params = '') =>
+			vm.$u.post(`/Customer/ShippingAddress/addShippingAddress`, params),
+
+		// 客户地址删除 Customer/ShippingAddress/deleteShippingAddress/1 del
+		deleteShippingAddress: (id, params = '') =>
+			vm.$u.delete(`/Customer/ShippingAddress/deleteShippingAddress/${id}`, params),
+
+		// 客户地址修改 Customer/ShippingAddress/updateShippingAddress put
+		updateShippingAddress: (id, params = '') =>
+			vm.$u.put(`/Customer/ShippingAddress/updateShippingAddress/${id}`, params),
+
+		// 客户地址详情 Customer/ShippingAddress/getShippingAddressInfo/1 get
+		getShippingAddressInfo: (id, params = '') =>
+			vm.$u.get(`/Customer/ShippingAddress/getShippingAddressInfo/${id}`, params),
+
+		// 客户类型
+		getCustomerSourceList: (params = '') =>
+			vm.$u.get(`/Customer/ApiCustomer/getCustomerSourceList`, params),
+
+		// 客户余额明细记录
+		getAllCustomerBalanceDetail: (params = '') =>
+			vm.$u.post(`/Customer/apiCustomer/getAllCustomerBalanceDetail`, params),
+
+		// 地址
+		getAllShippingAddress: (params = '') =>
+			vm.$u.post(`/Customer/ShippingAddress/getAllShippingAddress`, params),
+
+		/*---------客户订单---------*/
+		// 用户订单状态数量统计
+		getOrderStatusNum: (params = '') =>
+			vm.$u.post(`/Order/ApiOrder/getOrderStatusNum`, params),
+		// 提交银行打款凭证
+		addOrderBankData: (params = '') =>
+			vm.$u.post(`/Order/ApiOrder/addOrderBankData`, params),
+		// 售后订单列表
+		getAllOrderReturn: (params = '') =>
+			vm.$u.post(`/Order/ApiOrder/getAllOrderReturn`, params),
+
+		// 订单退货添加
+		addOrderReturn: (params = '') =>
+			vm.$u.post(`/Order/ApiOrder/addOrderReturn`, params),
+
+		// 订单物流查询
+		getExpressInfoByOrderId: (id, params = '') =>
+			vm.$u.post(`/Order/ApiOrder/getExpressInfoByOrderId/${id}`, params),
+
+		// 订单
+		getOrderSelect: (params = '') =>
+			vm.$u.post(`/Order/ApiOrder/getOrderSelect`, params),
+
+		// 添加订单
+		addOrder: (params = '') =>
+			vm.$u.post(`/Order/ApiOrder/addOrder`, params),
+
+		// 获取订单详情
+		getOrderInfoById: (id, params = '') =>
+			vm.$u.get(`/Order/ApiOrder/getOrderInfoById/${id}`, params),
+
+		// 取消订单&&确认收货
+		updateOrderStatus: (id, params = '') =>
+			vm.$u.put(`/Order/ApiOrder/updateOrderStatus/${id}`, params),
+
+		// 支付方式列表
+		getPaymentType: (params = '') =>
+			vm.$u.post(`/System/ApiPayment/getPaymentType`, params),
+
+		// 订单再次支付  Order/ApiOrder/payOrder  POST
+		payOrder: (params = '') =>
+			vm.$u.post(`/Order/ApiOrder/payOrder`, params),
+
+		//商品列表页调整购买数量 Cart/ApiCart/updateCartNum/1  put
+		updateCartNum: (id, params = '') =>
+			vm.$u.put(`/Cart/ApiCart/updateCartNum/${id}`, params),
+
+		// 获取用户基本设置  System/ApiBasicSetup/getBasicField  get
+		getBasicField: (params = '') =>
+			vm.$u.post(`/System/ApiBasicSetup/getBasicField`, params),
+
+		// 商品收藏 Customer/ApiCustomer/collect/19
+		collect: (id, params = '') =>
+			vm.$u.get(`/Customer/ApiCustomer/collect/${id}`, params),
+
+		/*---------优惠券---------*/
+		// 优惠券列表(注册,在线支付,主动领取)
+		couponList: (params = '') =>
+			vm.$u.post(`/Market/ApiCoupon/couponList`, params),
+
+		// 领取优惠券
+		receive: (params = '') =>
+			vm.$u.post(`/Market/ApiCoupon/receive`, params),
+
+		// 优惠券盒子
+		couponAll: (params = '') =>
+			vm.$u.post(`/Market/ApiCoupon/selectAll`, params),
+
+		// 获取秒杀列表 Market/ApiActivity/getActivityAll
+		getActivityAll: (params = '') =>
+			vm.$u.get(`/Market/ApiActivity/getActivityAll`, params),
+
+		// 企业详情
+		getEnterpriseInfo: (params = '') =>
+			vm.$u.get(`/Enterprise/ApiEnterprise/getEnterpriseInfo`, params),
+
+		// 会员卡列表 Market/ApiVipCard/getAllVipCard
+		getAllVipCard: (params = '') =>
+			vm.$u.post(`/Market/ApiVipCard/getAllVipCard`, params),
+
+		// 我的会员卡 Market/ApiVipCard/getMyVipCards
+		getMyVipCards: (params = '') =>
+			vm.$u.post(`/Market/ApiVipCard/getMyVipCards`, params),
+
+		// 会员卡详情 Market/ApiVipCard/getVipInfo/1
+		getVipInfo: (id, params = '') =>
+			vm.$u.get(`/Market/ApiVipCard/getVipInfo/${id}`, params),
+
+		// 创建会员卡订单 Market/ApiVipCard/createVipCardOrder
+		createVipCardOrder: (params = '') =>
+			vm.$u.post(`/Market/ApiVipCard/createVipCardOrder`, params),
+
+		// 获取公司的基本设置
+		getBasicSetup: (params = '') =>
+			vm.$u.get(`/System/ApiBasicSetup/getBasicField`, params),
+
+		// 一键领取优惠券(会员卡) Market/ApiCoupon/oneKeyReceive
+		oneKeyReceive: (params = '') =>
+			vm.$u.post(`/Market/ApiCoupon/oneKeyReceive`, params),
+
+		// 订单列表获取我的会员卡 Cart/ApiCart/getVipCard
+		orderVipCard: (params = '') =>
+			vm.$u.get(`/Cart/ApiCart/getVipCard`, params),
+
+		/* 分销中心 */
+		// 分销商申请
+		applicationBusinessman: (params = '') =>
+			vm.$u.post(`/Commission/ApiCommissionBusinessman/applicationBusinessman`, params),
+
+		// 分销商详情
+		getInfoBusinessman: (params = '') =>
+			vm.$u.get(`/Commission/ApiCommissionBusinessman/getInfoBusinessman`, params),
+
+		// 查询设置
+		getDistributionSetting: (params = '') =>
+			vm.$u.post(`/Commission/ApiCommissionSetting/getSetting`, params),
+
+		// 添加上下级关系
+		relationshipBusinessman: (params = '') =>
+			vm.$u.post(`/Commission/ApiCommissionBusinessman/relationshipBusinessman`, params),
+
+		// 查询文字设置
+		getTxtSetting: (params = '') =>
+			vm.$u.post(`/Commission/ApiCommissionSetting/getTxtSetting`, params),
+
+		// 查询分销商的下级
+		getAllSub: (params = '') =>
+			vm.$u.post(`/Commission/ApiCommissionBusinessman/getAllSub`, params),
+
+		// 查询升级商品
+		getBuyGoods: (params = '') =>
+			vm.$u.get(`/Commission/ApiCommissionSetting/getBuyGoods`, params),
+
+		// 分销中心订单
+		getCommissionOrder: (params = '') =>
+			vm.$u.post(`/Commission/ApiCommissionBusinessman/getCommissionOrder`, params),
+		// 分销订单详情
+		getCommissionOrderInfo: (id, params = '') =>
+			vm.$u.post(`/Commission/ApiCommissionBusinessman/getCommissionOrderInfo/${id}`, params),
+		// 申请提现
+		WithdrawalsAdd: (params = '') =>
+			vm.$u.post(`/Commission/ApiCommissionWithdrawals/add`, params),
+		// 获取提现申请列表
+		CommissionWithdrawalsGetAll: (params = '') =>
+			vm.$u.post(`/Commission/ApiCommissionWithdrawals/getAll`, params),
+		// 获取提现申请详情
+		CommissionWithdrawalsDetail: (id, params = '') =>
+			vm.$u.get(`/Commission/ApiCommissionWithdrawals/detail/${id}`, params),
+		// 等级说明
+		getAllGrade: (params = '') =>
+			vm.$u.get(`/Commission/ApiCommissionBusinessman/getAllGrade`, params),
+		// 排行榜
+		commissionTop: (params = '') =>
+			vm.$u.get(`/Commission/ApiCommissionBusinessman/commissionTop`, params),
+		// 获取设置(小程序)
+		MerchantGetSeting: (params = '') =>
+			vm.$u.get(`/Merchant/ApiMerchant/getSetting`, params),
+		// 商户入驻申请(小程序)
+		MerchantApply: (params = '') =>
+			vm.$u.post(`/Merchant/ApiMerchant/addApply`, params),
+		// 入驻申请修改(小程序)
+		updateApply: (id, params = '') =>
+			vm.$u.put(`/Merchant/ApiMerchant/updateApply/${id}`, params),
+		// 取消入驻申请(小程序)
+		delApply: (id, params = '') =>
+			vm.$u.get(`/Merchant/ApiMerchant/delApply/${id}`, params),
+		// 商户详情(小程序)
+		getInfoMerchant: (params = '') =>
+			vm.$u.get(`/Merchant/ApiMerchant/getInfoMerchant`, params),
+		// 商户列表
+		getAllApiMerchant: (params = '') => vm.$u.post(`/Merchant/ApiMerchant/getAll`, params),
+		// 获取店铺页面
+		shopHome: (params = '') =>
+			vm.$u.post(`/System/ApiTemplate/shopHome`, params),
+		// 商户设置
+		getSettingMerchant: (params = '') => vm.$u.post(`/Merchant/Merchant/getSetting`, params),
+		/*------组合套餐------*/
+		// 组合套餐列表
+		listsApiComBinPackage: (params = '') => vm.$u.post(`/Market/ApiComBinPackage/lists`, params),
+		// 组合套餐详情
+		detailsApiComBinPackage: (id, params = '') => vm.$u.get(`/Market/ApiComBinPackage/details/${id}`,
+			params),
+		/*------需求提报------*/
+		// 新增需求提报
+		addCustomerdemand: (params = '') => vm.$u.post(`/Customer/ApiCustomer/addCustomerdemand`, params),
+		/*------余额管理------*/
+		// 修改余额支付密码
+		updatePayPassword: (params = '') => vm.$u.post(`/Customer/ApiCustomer/updatePayPassword`, params),
+		// 添加余额支付密码
+		addpayPassword: (params = '') => vm.$u.post(`/Customer/ApiCustomer/addpayPassword`, params),
+		// 校验余额支付密码
+		checkPayPassword: (params = '') => vm.$u.post(`/Customer/ApiCustomer/checkPayPassword`, params),
+		// 余额明细
+		getAllMemberBalanceDetail: (params = '') => vm.$u.post(
+			`/Customer/apiCustomer/getAllMemberBalanceDetail`, params),
+		/*------股权------*/
+		// 股权商品详情
+		getIntegralGoodsInfo: (id, params = '') => vm.$u.get(
+			`/Integral/ApiIntegralGoods/getIntegralGoodsInfo/${id}`, params),
+		// 股权商品兑换列表
+		getAllIntegralGoodsExchange: (params = '') => vm.$u.post(
+			`/Integral/ApiIntegralGoods/getAllIntegralGoodsExchange`, params),
+		// 股权流水
+		getAllCustomerIntegralDesc: (params = '') => vm.$u.post(
+			`/Customer/ApiCustomer/getAllCustomerIntegralDesc`, params),
+		// 股权商品列表
+		getAllIntegralGoods: (params = '') => vm.$u.post(`/Integral/ApiIntegralGoods/getAllIntegralGoods`,
+			params),
+		// 股权兑换商品
+		addIntegralGoodsExchange: (params = '') => vm.$u.post(
+			`/Integral/ApiIntegralGoods/addIntegralGoodsExchange`, params),
+		// 股权商品兑换详情
+		getIntegralGoodsExchangeInfo: (id, params = '') => vm.$u.get(
+			`/Integral/ApiIntegralGoods/getIntegralGoodsExchangeInfo/${id}`, params),
+		/*------提现------*/
+		// 新增提现
+		addReflectDetail: (params = '') => vm.$u.post(`/Customer/apiCustomer/addReflectDetail`, params),
+		// 获取所有提现记录
+		getAllReflectDetail: (params = '') => vm.$u.post(`/Customer/apiCustomer/getAllReflectDetail`, params),
+		// 项目列表
+		getItemList:(params = '') => vm.$u.get(`/shop/ApiShopProject/list`, params),
+		// 项目详情
+		getItemDetail:(params = '') => vm.$u.get(`/shop/ApiShopProject/details`, params),
+		// 计算详情价格
+		calculation:(params = '') => vm.$u.post(`/shop/ApiShopProject/calculation`, params),
+		//获取门店列表
+		getStoreList: (params = '') => vm.$u.post(`/shop/ApiShop/getAll`, params),
+		//全部员工列表
+		getAllygList: (params = '') => vm.$u.get(`/Department/ApiStaff/staffAll`, params),
+		//选择时间员工 
+		getTimeYgList: (params = '') => vm.$u.post(`/shop/ApiShopProject/choice`, params),
+		//员工预约时间
+		getYgYyTimeArea: (params = '') => vm.$u.post(`/shop/ApiShopProject/choice_time`, params),
+		// 创建项目订单
+		createItemOrder: (params = '') => vm.$u.post(`/shop/ApiShopProject/create`, params),
+		//hop/ApiShopSubscribe/list 用户项目列表
+		getMyItem: (params = '') => vm.$u.post(`/shop/ApiShopSubscribe/list`, params),
+		// 取消预约项目/shop/ApiShopSubscribe/cancel
+		itemCancel: (params = '') => vm.$u.post(`/shop/ApiShopSubscribe/cancel`, params),
+		//支付待支付的项目shop/ApiShopProject/payment
+		itemPayment: (params = '') => vm.$u.post(`/shop/ApiShopProject/payment`, params),
+		// 抵用券列表shop/ApiShopCard/userCard
+		getDyquanList:(params = '') => vm.$u.post(`/shop/ApiShopCard/userCard`, params),
+		// 优惠卡列表
+		getYhkList:(params = '') => vm.$u.post(`/shop/ShopCard/list`, params),
+		//优惠卡详情
+		getYhkDetail:(params = '') => vm.$u.post(`/shop/ShopCard/details`, params),
+		//购买优惠卡
+		buyYhk:(params = '') => vm.$u.post(`/shop/ApiShopCard/buy_card`, params),
+		// 我的优惠卡
+		getMyyhkList:(params = '') => vm.$u.post(`/shop/ApiShopCard/card_order`, params),
+		// 提交员工评价
+		pjYg:(params = '') => vm.$u.post(`/shop/ApiShopSubscribe/comment`, params),
+		//员工详情/Department/staff/getStaffInfo
+		getYgdetail:(params = '') => vm.$u.post(`/Department/staff/getStaffInfo`, params),
+		// 员工评价列表
+		getYgPj:(params = '') => vm.$u.post(`/shop/ApiShopSubscribe/comment_list`, params),
+		//获取1招商2连锁3共享股东4高管
+		getOtherList:(params = '') => vm.$u.post(`/Enterprise/Personnel/list`, params),
+		//用户股权
+		getGq:(params = '') => vm.$u.get(`/UserCenter/ApiUserCenter/holders`, params),
+		//用户分红股份
+		getFh:(params = '') => vm.$u.get(`/UserCenter/ApiUserCenter/holders_bonus`, params),
+		//用户基础股份
+		getBsGf:(params = '') => vm.$u.get(`/UserCenter/ApiUserCenter/holders_record`, params),
+		// 文章详情
+		getArtDetail:(params = '') => vm.$u.get(`/Enterprise/Article/details`, params),
+		// 审核状态
+		getSh:(params = '') => vm.$u.get(`/System/ApiBasicSetup/over_examination`, params),
+		
+		
+		/*------新分销合伙人------*/
+		
+		// 合伙人详情
+		getCommissionPartnerData: (params = '') =>
+			vm.$u.post(`/NewCommission/ApiNewCommissionPartner/getCommissionPartnerData`, params),
+		//余额明细
+		getCommissionBalanceDetail: (params = '') =>
+			vm.$u.post(`/NewCommission/ApiNewCommissionPartner/getCommissionPartnerBalanceDetail`, params),
+		//佣金明细
+		getCommissionDetail: (params = '') =>
+			vm.$u.post(`/NewCommission/ApiNewCommissionPartner/getCommissionPartnerDetail`, params),
+		//提现记录
+		getPartnerCashApplyList: (params = '') =>
+			vm.$u.post(`/NewCommission/ApiNewCommissionPartner/getPartnerApplyCashList`, params),
+		//提现申请
+		partnerCashApply: (params = '') =>
+			vm.$u.post(`/NewCommission/ApiNewCommissionPartner/partnerApplyCash`, params),
+		//提现方式
+		getPartnerCashType: (params = '') =>
+			vm.$u.post(`/NewCommission/ApiNewCommissionPartner/getPartnerCashType`, params),
+		//提现详情
+		getPartnerApplyCashInfo: (params = '') =>
+			vm.$u.post(`/NewCommission/ApiNewCommissionPartner/getPartnerApplyCashInfo`, params),
+			
+		/*------新门店代理------*/
+		// 合伙人详情
+		getAgentData: (params = '') =>
+			vm.$u.post(`/NewCommission/ApiNewAgent/getApiAgentData`, params),
+		//余额明细
+		getAgentBalanceDetail: (params = '') =>
+			vm.$u.post(`/NewCommission/ApiNewAgent/getApiAgentBalanceDetail`, params),
+		//佣金明细
+		getAgentDetail: (params = '') =>
+			vm.$u.post(`/NewCommission/ApiNewAgent/getApiAgentDetail`, params),
+		//提现记录
+		getAgentCashApplyList: (params = '') =>
+			vm.$u.post(`/NewCommission/ApiNewAgent/getApiAgentApplyCashList`, params),
+		//提现申请
+		agentCashApply: (params = '') =>
+			vm.$u.post(`/NewCommission/ApiNewAgent/apiAgentApplyCash`, params),
+		//提现方式
+		getAgentCashType: (params = '') =>
+			vm.$u.post(`/NewCommission/ApiNewAgent/getApiAgentCashType`, params),
+		//提现详情
+		getAgentApplyCashInfo: (params = '') =>
+			vm.$u.post(`/NewCommission/ApiNewAgent/getApiAgentApplyCashInfo`, params),
+		
+		
+	};
+}
+
+export default {
+	install
+}

+ 93 - 0
common/http.interceptor.js

@@ -0,0 +1,93 @@
+// 这里的vm,就是我们在vue文件里面的this,所以我们能在这里获取vuex的变量,比如存放在里面的token
+// 同时,我们也可以在此使用getApp().globalData,如果你把token放在getApp().globalData的话,也是可以使用的
+import {
+	getToken,
+	getEnToken,
+	getLocation
+} from "@/access/common.js"
+import webUrl from '@/config.js'
+const install = (Vue, vm) => {
+	// uni.showNavigationBarLoading()
+	Vue.prototype.$u.http.setConfig({
+		// #ifdef H5
+		baseUrl: webUrl.QN_URL+'/api',
+		// #endif
+		// #ifndef H5
+		baseUrl: webUrl.QN_URL,
+		// #endif
+		loadingTime: 1000, // 在此时间内,请求还没回来的话,就显示加载中动画,单位ms
+		// 如果将此值设置为true,拦截回调中将会返回服务端返回的所有数据response,而不是response.data
+		// 设置为true后,就需要在this.$u.http.interceptor.response进行多一次的判断,请打印查看具体值
+		// originalData: true,
+		// 设置自定义头部content-type
+		// header: {
+		// 	'content-type': 'xxx'
+		// }
+	});
+	// 请求拦截,配置Token等参数
+	Vue.prototype.$u.http.interceptor.request = (config) => {
+		config.header.Authorization = getToken();
+		config.header.Token = getEnToken();
+		config.header.Location = getLocation();
+		console.log('接口token:',getEnToken())
+		// 方式一,存放在vuex的token,假设使用了uView封装的vuex方式,见:https://uviewui.com/components/globalVariable.html
+		// config.header.token = vm.token;
+
+		// 方式二,如果没有使用uView封装的vuex方法,那么需要使用$store.state获取
+		// config.header.token = vm.$store.state.token;
+
+		// 方式三,如果token放在了globalData,通过getApp().globalData获取
+		// config.header.token = getApp().globalData.username;
+
+		// 方式四,如果token放在了Storage本地存储中,拦截是每次请求都执行的,所以哪怕您重新登录修改了Storage,下一次的请求将会是最新值
+		// const token = uni.getStorageSync('token');
+		// config.header.token = token;
+
+		return config;
+	}
+	// 响应拦截,判断状态码是否通过
+	Vue.prototype.$u.http.interceptor.response = (res) => {
+		console.log(res,'fanhui');
+		uni.hideNavigationBarLoading();
+		// 如果把originalData设置为了true,这里得到将会是服务器返回的所有的原始数据
+		// 判断可能变成了res.statueCode,或者res.data.code之类的,请打印查看结果
+		if (res.state || res.data.errorCode === 9999) {
+			// 如果把originalData设置为了true,这里return回什么,this.$u.post的then回调中就会得到什么
+			return res;
+		} else {
+			// if (res.data.errorCode === 9999) {
+			// 	return false
+			// }
+			uni.showToast({
+				title: res.data,
+				icon: 'none'
+			})
+			if (res.data === '要查询的客户不存在') {
+				setTimeout(() => {
+					uni.hideLoading()
+					uni.removeStorageSync('token');
+					uni.removeStorageSync('userStatus');
+					uni.removeStorageSync('cartPrice');
+					uni.removeStorageSync('cartNum');
+					uni.removeStorageSync('loginCode');
+					uni.removeTabBarBadge({
+						index: 2
+					});
+					vm.$store.commit('commit_hasLogin', false);
+					uni.reLaunch({
+						url: '/pagesT/public/wxLogin'
+					})
+				}, 3000)
+				return
+			}
+			setTimeout(() => {
+				uni.hideLoading()
+			}, 3000)
+			return false
+		};
+	}
+}
+
+export default {
+	install
+}

+ 1133 - 0
components/AddCardModel.vue

@@ -0,0 +1,1133 @@
+<template>
+	<view>
+		<!-- 加入购物车弹窗 -->
+		<u-popup :value="isShow" :mask-close-able="false" :border-radius="12" mode="bottom">
+			<view class="add-cart-view">
+				<view class="close-icon"><u-icon name="close" color="#666666" size="26" @click="closeaddcartPop"></u-icon></view>
+				<view class="card-goods-info clearfix">
+					<view class="float_left card-goods-img">
+						<image v-if="now_sku_data.specImage" :src="now_sku_data.specImage" mode="aspectFill"></image>
+						<block v-else><image v-if="goodsDetail.images" :src="goodsDetail.images[0]" mode="aspectFill"></image></block>
+						<view v-if="goodsDetail.isEq === 5" class="Eq-view primary-bg">抄码</view>
+					</view>
+					<view class="float_left" style="width: 420rpx;">
+						<view class="goods-title ellipsis">{{ goodsDetail.title || '' }}</view>
+						<!-- 不是阶梯价 -->
+						<view class="card-goods-priceview primary-color" v-if="!now_sku_data.enabledLadder">
+							<text class="rmb-icon">¥</text>
+							<text v-if="!showGoodsPrice">
+								<block v-if="now_sku_data.id">{{ now_sku_data.salePrice || 0 }}</block>
+								<block v-else>{{ goodsDetail.isEq === 5 ? goodsDetail.maxSalePrice : goodsDetail.minSalePrice }}</block>
+							</text>
+							<text v-else class="showGoodsPrice">{{ showGoodsPrice }}</text>
+						</view>
+						<!-- 阶梯价 -->
+						<view class="lap-info clearfix" v-else>
+							<view class="lap-li" v-for="(item, index) in now_sku_data.ladderPrice" :key="index">
+								<view class="laprice-text">
+									<span style="font-size: 20rpx;">¥</span>
+									<text v-if="!showGoodsPrice">{{ item.price }}</text>
+									<text v-else class="showGoodsPrice">{{ showGoodsPrice }}</text>
+								</view>
+								<view class="laprice-goods-num" v-if="index + 1 === now_sku_data.ladderPrice.length">≥{{ item.from }}{{ now_sku_data.unitName }}</view>
+								<view class="laprice-goods-num" v-else>{{ item.from }}~{{ item.to }}{{ now_sku_data.unitName }}</view>
+							</view>
+						</view>
+						<!-- 会员价 -->
+						<block v-if="!showGoodsPrice">
+							<view class="vip-price clearfix" v-if="goodsDetail.minMemberPrice > 0 && !now_sku_data.id">
+								<view class="price-text">¥{{ goodsDetail.isEq === 5 ? goodsDetail.maxMemberPrice : goodsDetail.minMemberPrice }}</view>
+								<view class="price-bs">vip</view>
+							</view>
+							<block v-else>
+								<view class="vip-price clearfix" v-if="now_sku_data.memberPrice > 0">
+									<view class="price-text">¥{{ now_sku_data.memberPrice }}</view>
+									<view class="price-bs">vip</view>
+								</view>
+							</block>
+						</block>
+
+						<view class="activity-tag" v-if="now_sku_data.isActivity && now_sku_data.isActivity === 5">限时秒杀</view>
+						<view class="card-goods-stock">
+							<!-- 当前区域有库存 -->
+							<block v-if="is_not_express">
+								<!-- 选中规格 -->
+								<block v-if="now_sku_data.id">
+									<view class="snum-li" v-if="baseSet.stockDisplay === 5">
+										库存:{{ now_sku_data.inventory >= 1 || goodsDetail.isDistribution === 5 ? '有货' : '库存不足' }}
+									</view>
+									<view class="snum-li" v-if="baseSet.stockDisplay === 6">
+										库存:
+										<text v-if="goodsDetail.isEq === 4">
+											{{ now_sku_data.inventory >= 1 || goodsDetail.isDistribution === 5 ? Math.floor(now_sku_data.inventory) || '有货' : 0 }}
+										</text>
+										<text v-else>{{ now_sku_data.otherNum >= 1 || goodsDetail.isDistribution === 5 ? Math.floor(now_sku_data.otherNum) || '有货' : 0 }}</text>
+									</view>
+								</block>
+								<!-- 未选中规格 -->
+								<block v-else>
+									<view class="snum-li" v-if="baseSet.stockDisplay === 5">
+										库存:{{ goodsDetail.inventory >= 1 || goodsDetail.isDistribution === 5 ? '有货' : '库存不足' }}
+									</view>
+									<view class="snum-li" v-if="baseSet.stockDisplay === 6">
+										库存:
+										<text v-if="goodsDetail.isEq === 4">
+											{{ goodsDetail.inventory >= 1 || goodsDetail.isDistribution === 5 ? Math.floor(goodsDetail.inventory) || '有货' : 0 }}
+										</text>
+										<text v-else>{{ goodsDetail.inventory >= 1 || goodsDetail.isDistribution === 5 ? Math.floor(goodsDetail.otherNum) || '有货' : 0 }}</text>
+									</view>
+								</block>
+							</block>
+							<!-- 当前区域没有库存 -->
+							<block v-else>
+								<view class="snum-li" v-if="baseSet.stockDisplay === 5">库存:库存不足</view>
+								<view class="snum-li" v-if="baseSet.stockDisplay === 6">剩余 0</view>
+							</block>
+							<view class="snum-li">起订{{ now_sku_data.setNum || 1 }}{{ now_sku_data.unitName || goodsDetail.unitName || '' }}</view>
+							<view class="snum-li" v-if="now_sku_data.limitNum">限购{{ now_sku_data.limitNum }}{{ now_sku_data.unitName || goodsDetail.unitName }}</view>
+						</view>
+						<block v-for="(item, index) in goodsDetail.unitData" :key="index">
+							<view v-if="item.isMaster === 4" class="card-goods-stock">
+								<text v-if="goodsDetail.isEq === 5">1{{ item.unitName }}≈{{ item.conversion }}{{ goodsDetail.unitName }}</text>
+								<text v-else>1{{ item.unitName }}={{ item.conversion }}{{ goodsDetail.unitName }}</text>
+								<text style="margin-left: 10rpx;" v-if="goodsDetail.showMinUnitPrice === 5 && now_sku_data.minUnitPrice !== '0.00'">
+									1斤={{ now_sku_data.minUnitPrice || goodsDetail.minMinUnitPrice }}元
+								</text>
+							</view>
+						</block>
+						<view class="card-goods-unit" v-if="!now_sku_data.id">
+							选择【单位】
+							<block v-for="(item, index) in goodsDetail.specGroup" :key="index">
+								<text>【{{ item.groupSpec.specName }}】</text>
+							</block>
+						</view>
+						<view class="card-goods-unit" v-else>
+							已选:{{ buy_num }}{{ now_sku_data.unitName }}
+							<text v-if="now_sku_data.specGroup.length > 0">,</text>
+							<block v-for="(item, index) in now_sku_data.specGroup" :key="index">
+								<text>{{ item.specValueName }}</text>
+								<text v-if="index !== now_sku_data.specGroup.length - 1">,</text>
+							</block>
+
+							<text v-if="goodsDetail.isEq === 5">,{{ unitsalePrice }}元/{{ eq_sku_kg.unitName }}</text>
+						</view>
+					</view>
+				</view>
+				<!-- 配送地判断提醒 -->
+				<view
+					class="express-view"
+					v-if="isLogin && address_data.provinceCode && not_dispatch_areas.areas"
+					@click="goPage('/pagesT/address/SelAddress?address_data=' + JSON.stringify(address_data))"
+				>
+					<view class="express-tit">
+						<text>送至</text>
+						<text class="desc">(配送地可能会影响库存,请正确选择)</text>
+					</view>
+					<view class="region-view clearfix">
+						<view class="float_left">
+							<text class="ibonfont ibondizhi2"></text>
+							<text>{{ address_data.provinceName }}-{{ address_data.cityName }}-{{ address_data.districtName }}</text>
+						</view>
+						<view class="float_right"><text class="ibonfont ibonjinru"></text></view>
+					</view>
+				</view>
+				<scroll-view scroll-y class="spec-card-view">
+					<view class="spec-card-li">
+						<view class="spec-name">单位</view>
+						<view class="spec-value-view">
+							<block v-for="(item, index) in goodsDetail.unitData" :key="index">
+								<!-- 抄码商品不显示主单位 -->
+								<block v-if="item.isMaster !== 5 || (item.isMaster === 5 && goodsDetail.isEq !== 5)">
+									<view
+										class="spec-val-li"
+										@click="bindPickerChange(item.unitId, 1, '', item)"
+										:class="[parseInt(spec_id_group[1]) === parseInt(item.unitId) ? 'primary-bg spec-val-on' : '']"
+									>
+										<view v-if="!item.isdisabled" class="dis-tip">待补货</view>
+										<text :style="{ color: !item.isdisabled ? '#999' : '' }">{{ item.unitName }}</text>
+									</view>
+								</block>
+							</block>
+						</view>
+					</view>
+					<view class="spec-card-li" v-for="(item, index) in goodsDetail.specGroup" :key="index">
+						<view class="spec-name">{{ item.groupSpec.specName }}</view>
+						<view class="spec-value-view">
+							<block v-for="(itemP, indexP) in item.params" :key="indexP">
+								<view
+									class="spec-val-li"
+									:class="[parseInt(spec_id_group[index + 2]) === parseInt(itemP.specValueId) ? 'primary-bg spec-val-on' : '']"
+									@click="bindPickerChange(itemP.specValueId, index + 2, item.groupSpec.specId, itemP)"
+								>
+									<view v-if="!itemP.isdisabled" class="dis-tip">待补货</view>
+									<text :style="{ color: !itemP.isdisabled ? '#999' : '' }">{{ itemP.specValueName }}</text>
+								</view>
+							</block>
+						</view>
+					</view>
+					<view class="buy-num-view clearfix">
+						<view class="float_left">购买数量</view>
+						<view class="num-edit-view float_right" v-if="goodsDetail.isDistribution === 4">
+							<view class="subr-view" :class="[buy_num <= (now_sku_data.setNum || 1) ? 'disabled-color' : '']" @click="delNum">
+								<u-icon size="26" name="minus"></u-icon>
+							</view>
+							<view class="buy-num-input-view"><input @input="buyNumInput" type="number" :disabled="!now_sku_data.id" class="buy-num-input" :value="buy_num" /></view>
+							<view
+								class="plus-view"
+								:class="[
+									now_sku_data.limitNum
+										? buy_num >= now_sku_data.limitNum
+											? 'disabled-color'
+											: ''
+										: buy_num >= Math.floor(now_sku_data.inventory)
+										? 'disabled-color'
+										: ''
+								]"
+								@click="plusNum"
+							>
+								<u-icon size="26" name="plus"></u-icon>
+							</view>
+						</view>
+						<view class="num-edit-view float_right" v-else>
+							<view class="subr-view" :class="[buy_num <= (now_sku_data.setNum || 1) ? 'disabled-color' : '']" @click="delNum">
+								<u-icon size="26" name="minus"></u-icon>
+							</view>
+							<view class="buy-num-input-view"><input @input="buyNumInput" type="number" :disabled="!now_sku_data.id" class="buy-num-input" :value="buy_num" /></view>
+							<view class="plus-view" :class="[now_sku_data.limitNum ? (buy_num >= now_sku_data.limitNum ? 'disabled-color' : '') : '']" @click="plusNum">
+								<u-icon size="26" name="plus"></u-icon>
+							</view>
+						</view>
+					</view>
+				</scroll-view>
+				<view class="card-btn-view">
+					<block v-if="goodsDetail.isDistribution === 4 && goodsDetail.inventorTotal <= 0">
+						<view v-if="!(goodsDetail.inventorTotal - 0) || goodsDetail.inventorTotal - 0 <= 0" class="btn">
+							<view class="no-tip">抱歉,该商品在当前区域无库存</view>
+						</view>
+					</block>
+					<!-- <view class="no-tip" v-if="!is_not_express">抱歉,该商品在当前区域无库存</view> -->
+					<view class="buy-btn" v-else>
+						<view
+							@click="goodsBuyNow"
+							class="card-btn-li primary-fu-bg"
+							:class="[!is_not_express || (goodsDetail.isDistribution === 4 && !Math.floor(now_sku_data.inventory)) ? 'dis-add' : '']"
+						>
+							立即购买
+						</view>
+						<view
+							@click="addCart"
+							class="card-btn-li primary-bg"
+							:class="[!is_not_express || (goodsDetail.isDistribution === 4 && !Math.floor(now_sku_data.inventory)) ? 'dis-add' : '']"
+						>
+							加入购物车
+						</view>
+					</view>
+				</view>
+			</view>
+		</u-popup>
+
+		<NoLoginTip @cancel="cancelTip" :show="loginTip" v-if="loginTip" />
+	</view>
+</template>
+
+<script>
+import NoLoginTip from './NoLoginTip.vue';
+export default {
+	components: {
+		NoLoginTip
+	},
+	props: {
+		selAddress: {
+			type: Object,
+			default: () => {
+				return {};
+			}
+		},
+		isShow: {
+			type: Boolean,
+			default: false
+		},
+		goodsId: {
+			type: [Number, String],
+			default: 0
+		},
+		isList: {
+			type: Boolean,
+			default: true
+		},
+		skuId: {
+			type: [Number, String],
+			default: ''
+		}
+	},
+	watch: {
+		selAddress(val) {
+			if (val.provinceCode) {
+				this.address_data = val;
+				if (this.not_dispatch_areas.areas) {
+					if (this.address_data.districtCode) {
+						this.is_not_express = this.not_dispatch_areas.areas.indexOf(parseInt(this.address_data.districtCode)) === -1;
+					} else if (this.address_data.cityCode) {
+						this.is_not_express = this.not_dispatch_areas.citys.indexOf(parseInt(this.address_data.cityCode)) === -1;
+					} else {
+						this.is_not_express = this.not_dispatch_areas.provinces.indexOf(parseInt(this.address_data.provinceCode)) === -1;
+					}
+				}
+			}
+		},
+		skuId(val) {
+			if (this.goodsDetail.id) {
+				const nowSkuData = this.goodsDetail.specMultiple.find(item => item.id === parseInt(val));
+				if (nowSkuData) {
+					this.spec_id_group = nowSkuData.indexGroup.map(item => {
+						return parseInt(item);
+					});
+					this.buy_num = nowSkuData.setNum || 1;
+					this.now_sku_data = nowSkuData;
+				}
+			}
+		},
+		now_sku_data(val) {
+			this.$emit('skuChange', val);
+		},
+		goodsId(val) {
+			if (this.isShow) {
+				this.goodsDetail = {};
+				this.now_sku_data = {};
+				this.spec_id_group = [val];
+				this.getGoodsDetail();
+			}
+		},
+		async isShow(val) {
+			if (val) {
+				await this.SetShowGoodsPrice();
+				if (!this.goodsDetail.id) {
+					if (!this.isList) {
+						this.goodsDetail = {};
+						this.now_sku_data = {};
+						this.spec_id_group = [this.goodsId];
+						await this.getGoodsDetail();
+					}
+				}
+				if (!this.address_data.provinceCode && this.isLogin) {
+					await this.getAllShippingAddress();
+				}
+			} else {
+				this.closeaddcartPop();
+			}
+		},
+		buy_num(val) {
+			this.$emit('buyNumchange', val);
+		}
+	},
+	data() {
+		return {
+			eq_sku_kg: {},
+			isLogin: true, // 判断是否登录
+			loginTip: false,
+			showGoodsPrice: '',
+			goodsDetail: {
+				images: [],
+				specGroup: [],
+				unitData: []
+			},
+			spec_id_group: [],
+			now_sku_data: {},
+			buy_num: 1,
+			now_sel_address: {},
+			address_data: {}, // 客户地址数据
+			not_dispatch_areas: {}, // 该商品不能配送区域
+			is_not_express: true, // 当前选择区域是否能够配送
+			activityId: ''
+		};
+	},
+	computed: {
+		baseSet() {
+			return this.$store.state.baseSet;
+		},
+		// 起送价
+		startDeliveryPrice() {
+			return this.$store.state.baseSet.startDeliveryPrice || 0;
+		},
+		// 辅助单位价格
+		unitsalePrice() {
+			if (this.goodsDetail.isEq === 5) {
+				if (this.eq_sku_kg.enabledLadder !== 1) {
+					return this.eq_sku_kg.salePrice;
+				} else {
+					const unitnum = this.buy_num * Number(this.now_sku_data.conversion);
+					const priceData = this.eq_sku_kg.ladderPrice.find(item => {
+						return unitnum > item.from && unitnum <= item.to;
+					});
+					return priceData.price;
+				}
+			} else {
+				return this.eq_sku_kg.salePrice;
+			}
+		}
+	},
+	created() {
+		this.spec_id_group[0] = this.goodsId;
+		this.isLogin = this.$store.state.hasLogin;
+		this.address_data = this.$store.state.nowAddress;
+		if (this.address_data.provinceCode) {
+			if (this.not_dispatch_areas.areas) {
+				if (this.address_data.districtCode) {
+					this.is_not_express = this.not_dispatch_areas.areas.indexOf(parseInt(this.address_data.districtCode)) === -1;
+				} else if (this.address_data.cityCode) {
+					this.is_not_express = this.not_dispatch_areas.citys.indexOf(parseInt(this.address_data.cityCode)) === -1;
+				} else {
+					this.is_not_express = this.not_dispatch_areas.provinces.indexOf(parseInt(this.address_data.provinceCode)) === -1;
+				}
+			}
+		}
+	},
+	methods: {
+		// 商品立即购买
+		goodsBuyNow() {
+			if (!this.$store.state.hasLogin) {
+				this.loginTip = true;
+				this.closeaddcartPop();
+				return;
+			}
+			if (!this.is_not_express) {
+				return;
+			}
+
+			// 验证账户状态
+			this.userAudit();
+			if (!this.isUserAudit) {
+				return;
+			}
+
+			if (!this.now_sku_data.id) {
+				this.$api.msg('请选择商品属性');
+				return;
+			}
+			if (this.goodsDetail.isDistribution === 4 && !Math.floor(this.now_sku_data.inventory)) {
+				this.$api.msg('当前商品库存不足');
+				return;
+			}
+			if (this.buy_num <= 0) {
+				this.$api.msg('请输入大于0的购买数量');
+				return;
+			}
+			if (this.buy_num < this.now_sku_data.setNum) {
+				this.$api.msg('该商品起订数量为' + this.now_sku_data.setNum + this.now_sku_data.unitName);
+				return;
+			}
+			const totalPrice = this.$NP.times(this.now_sku_data.salePrice, this.buy_num);
+			if (totalPrice < this.startDeliveryPrice) {
+				this.$u.toast('当前下单金额不足起送价:' + this.startDeliveryPrice + '元,先加入购物车吧');
+				return;
+			}
+			console.log(this.now_sku_data);
+			if (this.now_sku_data.isActivity === 5) {
+				this.activityId = this.now_sku_data.activity.activityId;
+			}
+			uni.navigateTo({
+				url: `/pagesT/order/createOrder?goodsId=${this.goodsDetail.id}&goodsBasicId=${this.goodsDetail.basicGoodsId}&skuId=${this.now_sku_data.id}&buyNum=${
+					this.buy_num
+				}&shopId=${this.goodsDetail.shopId}&activityId=${this.activityId}`
+			});
+		},
+		cancelTip() {
+			this.loginTip = false;
+		},
+		SetShowGoodsPrice() {
+			if (this.$store.state.baseSet.goodsPrice === 5 && this.$store.state.hasLogin) {
+				this.showGoodsPrice = '';
+			} else if (!this.$store.state.hasLogin && this.$store.state.baseSet.goodsPrice === 4) {
+				this.showGoodsPrice = '¥**';
+			} else if (this.$store.state.userStatus.enableStatus === 4 && this.$store.state.baseSet.goodsPrice === 4) {
+				this.showGoodsPrice = '已禁用';
+			} else if (this.$store.state.userStatus.status !== 2 && this.$store.state.baseSet.goodsPrice === 4) {
+				if (this.$store.state.userStatus.status === 0) {
+					this.showGoodsPrice = '待审核';
+				} else if (this.$store.state.userStatus.status === 1) {
+					this.showGoodsPrice = '审核中';
+				} else if (this.$store.state.userStatus.status === 3) {
+					this.showGoodsPrice = '已驳回';
+				}
+			} else {
+				this.showGoodsPrice = '';
+			}
+		},
+		delNum() {
+			if (!this.now_sku_data.id) {
+				this.$api.msg('请选择商品属性');
+				return;
+			}
+			// 不支持负库存销售
+			if (this.goodsDetail.isDistribution === 4) {
+				if (this.buy_num > Math.floor(this.now_sku_data.inventory)) {
+					this.buy_num = Math.floor(this.now_sku_data.inventory) < 0 ? 0 : Math.floor(this.now_sku_data.inventory);
+					return;
+				}
+			}
+
+			if (this.now_sku_data.cartNum > 0) {
+				if (this.buy_num > 1) {
+					this.buy_num = this.buy_num - 1;
+				} else {
+					this.$api.msg('不能再减少了哦!');
+				}
+			} else {
+				// this.$api.msg('不能再减少了哦!')
+				if (this.buy_num > this.now_sku_data.setNum) {
+					this.buy_num = this.buy_num - 1;
+				} else {
+					this.$api.msg('不能再减少了哦!');
+				}
+			}
+		},
+		plusNum() {
+			if (!this.now_sku_data.id) {
+				this.$api.msg('请选择商品属性');
+				return;
+			}
+			if (this.now_sku_data.limitNum > 0) {
+				if (this.buy_num >= this.now_sku_data.limitNum) {
+					// this.$api.msg(`限购${this.now_sku_data.limitNum}${this.now_sku_data.unitName},不能再增加了哦!`);
+					return;
+				}
+			}
+			if (this.goodsDetail.isDistribution === 4) {
+				if (this.buy_num >= Math.floor(this.now_sku_data.inventory)) {
+					// this.$api.msg('不能再增加了哦!');
+					return;
+				}
+			}
+
+			this.buy_num = this.buy_num - 0 + 1;
+		},
+		buyNumInput(e) {
+			// 当重复设置某些属性为相同的值时,不会同步到view层。解决方法,在设置新值之前先设置为记录的当前值
+			this.buy_num = e.detail.value - 0;
+			// 没有启用预售不用检查库存
+			if (this.goodsDetail.isDistribution === 4) {
+				if (e.detail.value - 0 > Math.floor(this.now_sku_data.inventory)) {
+					this.$api.msg('库存不足,已为您修正');
+					this.$nextTick(() => {
+						this.buy_num = Math.floor(this.now_sku_data.inventory);
+					});
+					return;
+				}
+			}
+
+			if (this.now_sku_data.limitNum) {
+				if (e.detail.value - 0 > this.now_sku_data.limitNum) {
+					this.$api.msg(`限购${this.now_sku_data.limitNum}${this.now_sku_data.unitName},已为您修正`);
+					this.$nextTick(() => {
+						this.buy_num = Math.floor(this.now_sku_data.limitNum);
+					});
+				} else if (e.detail.value - 0 < this.now_sku_data.limitNum) {
+					// 当起订数量小于限购数量莳
+					if (this.now_sku_data.setNum && this.now_sku_data.setNum <= this.now_sku_data.limitNum) {
+						// 当存在起订数量
+						// if (e.detail.value - 0 < this.now_sku_data.setNum) {
+						// 	this.$api.msg('该商品起订数量为' + this.now_sku_data.setNum + this.now_sku_data.unitName);
+						// 	this.$nextTick(() => {
+						// 		this.buy_num = this.now_sku_data.setNum;
+						// 	});
+						// }
+					} else if (this.now_sku_data.setNum && this.now_sku_data.setNum > this.now_sku_data.limitNum) {
+						// 当存在起订数量
+						if (e.detail.value - 0 < this.now_sku_data.limitNum) {
+							this.$api.msg(`限购${this.now_sku_data.limitNum}${this.now_sku_data.unitName},已为您修正`);
+							this.$nextTick(() => {
+								this.buy_num = Math.floor(this.now_sku_data.limitNum);
+							});
+						}
+					} else {
+						this.$nextTick(() => {
+							this.buy_num = this.now_sku_data.setNum || e.detail.value - 0;
+						});
+					}
+				}
+			} else {
+				// 没有启用预售不用检查库存
+				if (this.goodsDetail.isDistribution === 4) {
+					if (e.detail.value - 0 > Math.floor(this.now_sku_data.inventory)) {
+						this.$api.msg('库存不足,已为您修正');
+						this.$nextTick(() => {
+							this.buy_num = Math.floor(this.now_sku_data.inventory);
+						});
+					}
+				}
+			}
+		},
+		// 关闭加入购物车弹窗
+		closeaddcartPop() {
+			this.$emit('close', false);
+		},
+		/*
+		 *选择规格
+		 * id 单位属性的ID
+		 * index 规格id组的下标
+		 * specId 属性名id
+		 * row 当前选中属性值
+		 */
+		bindPickerChange(id, index, specId, row) {
+			// 判断当前规格是否禁用
+			if (row && !row.isdisabled) {
+				return;
+			}
+			this.$set(this.spec_id_group, index, parseInt(id));
+			if (this.spec_id_group.every(item => !!item)) {
+				const indexGroup = this.spec_id_group.join(':');
+				const nowSkuData = this.goodsDetail.specMultiple.find(item => item.index === indexGroup);
+				if (nowSkuData) {
+					this.now_sku_data = nowSkuData;
+				}
+			}
+			// this.buy_num = this.now_sku_data.setNum || 1;
+			if (this.now_sku_data.limitNum > 0 && this.now_sku_data.setNum > this.now_sku_data.limitNum) {
+				this.buy_num = this.now_sku_data.limitNum || 1;
+			} else {
+				this.buy_num = this.now_sku_data.setNum || 1;
+			}
+			// 判断当前规格是否要禁用,规格组不存在或者库存为0的时候,当前规格禁用
+			if (index) {
+				// 过滤出包含当前规格的规格组
+				const containSpecMultiple = this.goodsDetail.specMultiple.filter(item => item.indexGroup.includes(id + ''));
+				const target = this.$u.deepClone(this.goodsDetail.specGroup);
+				target.forEach(item => {
+					if (item.groupSpec.specId !== specId) {
+						item.params.forEach(itemP => {
+							const isObj = containSpecMultiple.find(itemF => {
+								return itemF.indexGroup.includes(itemP.specValueId + '');
+							});
+							// 没有开启预售判断库存
+							if (this.goodsDetail.isDistribution === 4) {
+								itemP.isdisabled = !!isObj && Math.floor(isObj.inventory) > 0 && isObj.isSale !== 4;
+							} else {
+								itemP.isdisabled = isObj.isSale !== 4;
+							}
+						});
+					}
+				});
+				this.goodsDetail.specGroup = target;
+			}
+		},
+		// 加入购物车
+		async addCart() {
+			if (!this.$store.state.hasLogin) {
+				this.loginTip = true;
+				this.closeaddcartPop();
+				return;
+			}
+			if (!this.is_not_express) {
+				return;
+			}
+			// 验证账户状态
+			this.userAudit();
+			if (!this.isUserAudit) {
+				return;
+			}
+
+			if (!this.now_sku_data.id) {
+				this.$api.msg('请选择商品属性');
+				return;
+			}
+			if (this.goodsDetail.isDistribution === 4 && !Math.floor(this.now_sku_data.inventory)) {
+				this.$api.msg('当前商品库存不足');
+				return;
+			}
+			if (this.buy_num <= 0) {
+				this.$api.msg('请输入大于0的购买数量');
+				return;
+			}
+			if (this.buy_num < this.now_sku_data.setNum) {
+				this.$api.msg('该商品起订数量为' + this.now_sku_data.setNum + this.now_sku_data.unitName);
+				return;
+			}
+			const goodsData = [
+				{
+					goodsBasicId: this.goodsDetail.basicGoodsId,
+					goodsId: this.goodsDetail.id,
+					buyNum: this.buy_num,
+					shopId: this.goodsDetail.shopId,
+					source: this.$common.source(),
+					skuId: this.now_sku_data.id
+				}
+			];
+			this.$u.api
+				.addCart({
+					goodsData
+				})
+				.then(res => {
+					uni.showToast({
+						title: '加入成功',
+						icon: 'none'
+					});
+
+					let stateNum = this.$_utils.accAdd((this.$store.state.cartNum || 0) - 0, this.buy_num);
+					let statePrice = this.$_utils.accAdd((this.$store.state.cartPrice || 0) - 0, (this.now_sku_data.salePrice - 0) * this.buy_num);
+
+					this.$store.commit('commit_cartNum', stateNum);
+					this.$store.commit('commit_cartPrice', statePrice);
+					this.closeaddcartPop();
+					// 点击购物车发送请求
+					// setTimeout(() => {
+					// 	uni.switchTab({
+					// 		url: '/pages/cart/cart'
+					// 	});
+					// }, 100)
+				});
+		},
+		// 请求商品品详情
+		async getGoodsDetail() {
+			this.$u.api
+				.getGoodsDetail(this.goodsId)
+				.then(({ data }) => {
+					this.goodsDetail = data;
+					// 抄码商品获取 KG 数据
+					if (data.isEq === 5) {
+						this.eq_sku_kg = data.specMultiple.find(item => item.isMaster === 5);
+					}
+					this.buy_num = 1;
+					// 多规格时处理属性禁用标示
+					if (data.specType !== 1) {
+						data.specGroup = data.specGroup.map(item => {
+							return {
+								...item,
+								params: item.params.map(itemP => {
+									return {
+										...itemP,
+										isdisabled: true
+									};
+								})
+							};
+						});
+						data.unitData.forEach(item => {
+							item.isdisabled = true;
+						});
+					} else {
+						//单规格 添加当前单位没有库存的标记
+						const arr = data.specMultiple.filter(item => Math.floor(item.inventory) <= 0);
+						data.unitData.forEach(item => {
+							const unitItem = data.specMultiple.find(itemF => itemF.unitId === item.unitId);
+							// 没有开启预售判断库存
+							if (this.goodsDetail.isDistribution === 4) {
+								item.isdisabled = Math.floor(unitItem.inventory) > 0 && unitItem.isSale !== 4;
+							} else {
+								item.isdisabled = unitItem.isSale !== 4;
+							}
+						});
+					}
+
+					if (this.skuId) {
+						// 如果已有选中的skuId 根据ID匹配对应规格数据
+						const specMultiple = data.specMultiple.find(item => item.id === parseInt(this.skuId));
+						if (specMultiple.isSale !== 4) {
+							this.now_sku_data = specMultiple;
+						}
+					} else if (data.specMultiple.length === 1) {
+						//当规格只有一个默认选中
+						// 没有开启预售
+						if (data.specMultiple[0].isSale !== 4) {
+							if (this.goodsDetail.isDistribution === 4) {
+								// 如果当前商品规格只有一个且库存大于0则默认选中
+								if (data.specMultiple[0].inventory > 0 && data.specMultiple[0].isSale !== 4) {
+									this.now_sku_data = data.specMultiple[0];
+								}
+							} else {
+								this.now_sku_data = data.specMultiple[0];
+							}
+						}
+					} else {
+						// 如果当前商品是非抄码商品 默认选中默认规格
+						if (data.isEq === 4) {
+							const specMultiple = data.specMultiple.find(item => item.isDefault === 5);
+							if (specMultiple && specMultiple.isSale !== 4) {
+								this.now_sku_data = specMultiple;
+							}
+						} else {
+							// 抄码商品默认选中一个
+							const specMultiple = data.specMultiple.find(item => item.isMaster === 4);
+							if (specMultiple && specMultiple.isSale !== 4) {
+								this.now_sku_data = specMultiple;
+							}
+						}
+					}
+					// 如果有已选中的规格则进行下一步规格的操作处理
+					// console.log(this.goodsDetail);
+					if (!this.now_sku_data.id) {
+						return;
+					}
+					// 进行组合选中规格的id数组
+					this.spec_id_group = this.now_sku_data.indexGroup.map(item => {
+						return parseInt(item);
+					});
+					//如果起订数量大于限购数量,默认购买数量为限购数量
+					if (this.now_sku_data.limitNum > 0 && this.now_sku_data.setNum > this.now_sku_data.limitNum) {
+						this.buy_num = this.now_sku_data.limitNum || 1;
+					} else {
+						// 否则购买数量为起订数量
+						this.buy_num = this.now_sku_data.setNum || 1;
+					}
+					// 该商品不能配送区域
+					this.not_dispatch_areas = data.express.ruleData.not_dispatch_areas;
+					//  默认设置当前选择区域是否能够配送的标示为true
+					this.is_not_express = true;
+					this.$nextTick(() => {
+						if (this.not_dispatch_areas.areas) {
+							if (this.address_data.districtCode) {
+								this.is_not_express = this.not_dispatch_areas.areas.indexOf(parseInt(this.address_data.districtCode)) === -1;
+							} else if (this.address_data.cityCode) {
+								this.is_not_express = this.not_dispatch_areas.citys.indexOf(parseInt(this.address_data.cityCode)) === -1;
+							} else {
+								this.is_not_express = this.not_dispatch_areas.provinces.indexOf(parseInt(this.address_data.provinceCode)) === -1;
+							}
+						}
+					});
+				})
+				.catch(err => {
+					this.closeaddcartPop();
+				});
+		},
+		// 获取地址列表
+		async getAllShippingAddress() {
+			this.$u.api
+				.getAllShippingAddress({
+					page: 1,
+					pageSize: 10
+				})
+				.then(({ data }) => {
+					if (data.length) {
+						const address = data.find(item => item.defaultStatus === 5) || data[0];
+						this.address_data = {
+							provinceCode: address.provinceCode,
+							cityCode: address.cityCode,
+							districtCode: address.districtCode,
+							provinceName: address.area.provinceName,
+							cityName: address.area.cityName,
+							districtName: address.area.districtName
+						};
+						this.$store.commit('commit_nowAddress', this.address_data);
+						if (this.not_dispatch_areas.areas) {
+							if (this.address_data.districtCode) {
+								this.is_not_express = this.not_dispatch_areas.areas.indexOf(parseInt(this.address_data.districtCode)) === -1;
+							} else if (this.address_data.cityCode) {
+								this.is_not_express = this.not_dispatch_areas.citys.indexOf(parseInt(this.address_data.cityCode)) === -1;
+							} else {
+								this.is_not_express = this.not_dispatch_areas.provinces.indexOf(parseInt(this.address_data.provinceCode)) === -1;
+							}
+						}
+					}
+				});
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+.activity-tag {
+	font-size: 20upx;
+	padding: 2upx 4upx;
+	background-color: #ff4d01;
+	color: #fff;
+	border-radius: 4upx;
+	display: inline-block;
+}
+
+.add-cart-view {
+	position: relative;
+	background-color: #fff;
+	padding: 30upx;
+	border-top-left-radius: 8upx;
+	border-top-right-radius: 8upx;
+
+	.close-icon {
+		position: absolute;
+		top: 20upx;
+		right: 20upx;
+	}
+
+	.card-goods-info {
+		.card-goods-img {
+			padding-right: 32upx;
+			position: relative;
+			overflow: hidden;
+
+			image {
+				border-radius: 8upx;
+				width: 230upx;
+				height: 230upx;
+				display: block;
+			}
+
+			.Eq-view {
+				width: 140rpx;
+				background-color: $uni-color-primary;
+				color: #ffffff;
+				position: absolute;
+				left: -40rpx;
+				top: 14rpx;
+				transform: rotate(-45deg);
+				font-size: 20rpx;
+				text-align: center;
+				line-height: 30rpx;
+			}
+		}
+
+		.goods-title {
+			font-weight: 600;
+			-webkit-line-clamp: 1;
+		}
+
+		.lap-info {
+			display: flex;
+			font-size: 24upx;
+
+			.lap-li {
+				text-align: center;
+				flex: 3;
+				padding: 0 20upx;
+
+				.laprice-text {
+					font-size: 28upx;
+					font-weight: 600;
+					color: #ff4d01;
+					font-family: DIN-Medium;
+				}
+			}
+		}
+
+		.card-goods-priceview {
+			color: #ff4d01;
+			font-weight: 600;
+			font-size: 40upx;
+			padding-top: 16upx;
+			font-family: DIN-Medium;
+
+			.rmb-icon {
+				font-weight: 400;
+				margin-right: 8upx;
+				font-size: 24upx;
+			}
+		}
+
+		.card-goods-stock {
+			font-size: 24upx;
+			color: #999999;
+			padding-top: 10upx;
+
+			.snum-li {
+				padding-right: 10upx;
+				display: inline-block;
+
+				&:last-child-child {
+					padding-right: 0;
+				}
+			}
+		}
+
+		.card-goods-unit {
+			font-size: 24upx;
+			padding-top: 10upx;
+		}
+	}
+
+	.spec-card-view {
+		max-height: 700upx;
+		overflow-y: auto;
+
+		.spec-card-li {
+			padding: 20upx 0 0;
+			border-bottom: 1px solid #f5f5f5;
+
+			.spec-name {
+				font-size: 28upx;
+				padding-bottom: 20upx;
+			}
+
+			.spec-value-view {
+				.spec-val-li {
+					margin-right: 30upx;
+					margin-bottom: 18upx;
+					border-radius: 8upx;
+					font-size: 26upx;
+					display: inline-block;
+					min-width: 52upx;
+					padding: 0 24upx;
+					line-height: 54upx;
+					text-align: center;
+					color: #333333;
+					border: 1px solid #eeeeee;
+					background-color: #eeeeee;
+					position: relative;
+
+					.dis-tip {
+						position: absolute;
+						font-size: 18rpx;
+						color: #ffffff;
+						background-color: #c0c4cc;
+						padding: 4rpx 6rpx;
+						border-top-left-radius: 12rpx;
+						border-bottom-right-radius: 12rpx;
+						top: -20rpx;
+						right: -30rpx;
+						line-height: 20rpx;
+					}
+				}
+
+				.spec-val-on {
+					background-color: $uni-color-primary;
+					color: #ffffff;
+				}
+			}
+		}
+	}
+
+	.buy-num-view {
+		padding: 20upx 0 130upx;
+		font-size: 28upx;
+
+		.num-edit-view {
+			text-align: center;
+			display: inline-flex;
+			align-items: center;
+
+			.buy-num-input-view {
+				display: flex;
+				position: relative;
+				text-align: center;
+				padding: 0;
+				justify-content: center;
+				align-items: center;
+				margin: 0 6rpx;
+				flex-direction: row;
+
+				.buy-num-input {
+					width: 80upx;
+					text-align: center;
+					line-height: 44upx;
+					height: 44upx;
+					font-size: 26upx;
+				}
+			}
+
+			.subr-view,
+			.plus-view {
+				justify-content: center;
+				align-items: center;
+				flex-direction: row;
+				display: flex;
+				margin-top: 0upx;
+				width: 44upx;
+				height: 44upx;
+				background-color: #f2f3f5;
+				font-size: 36upx;
+				color: #323233;
+				border-radius: 8upx;
+			}
+
+			.disabled-color {
+				color: #c8c9cc;
+				background: #f7f8fa;
+			}
+		}
+	}
+
+	.card-btn-view {
+		position: absolute;
+		bottom: 0;
+		left: 0;
+		z-index: 9;
+		width: 750upx;
+		background-color: #fff;
+		border-top: 1px solid #f5f5f5;
+
+		.no-tip {
+			font-size: 22upx;
+			background-color: #fdf6ec;
+			color: #d48d24;
+			text-align: center;
+			line-height: 42upx;
+		}
+
+		.buy-btn {
+			display: flex;
+
+			.card-btn-li {
+				flex: 2;
+				// width: 100%;
+				text-align: center;
+				line-height: 90upx;
+				color: #fff;
+				background-color: #007aff;
+			}
+
+			.dis-add {
+				color: #cccccc;
+			}
+		}
+	}
+}
+
+.express-view {
+	padding: 20upx 0;
+	border-bottom: 1px solid #f5f5f5;
+
+	.express-tit {
+		font-size: 28upx;
+		padding-bottom: 10upx;
+
+		.desc {
+			font-size: 20upx;
+			color: #999999;
+		}
+	}
+
+	.region-view {
+		font-size: 26upx;
+
+		.float_left {
+			.ibondizhi2 {
+				font-size: 28upx;
+				margin-right: 10upx;
+				color: #666666;
+			}
+		}
+
+		.float_right {
+			.ibonjinru {
+				font-size: 28upx;
+				color: #666666;
+			}
+		}
+	}
+}
+
+.vip-price {
+	margin-top: 6rpx;
+	line-height: 32rpx;
+	height: 32rpx;
+	border-radius: 3rpx;
+	overflow: hidden;
+	font-family: DINPro-Regular;
+
+	.price-text {
+		float: left;
+		min-width: 80rpx;
+		text-align: center;
+		vertical-align: middle;
+		font-size: 20rpx;
+		color: #ffdfa2;
+		background: linear-gradient(270deg, #1e5657 0%, #0d2b2c 100%);
+		padding: 0 8rpx;
+	}
+
+	.price-bs {
+		text-align: center;
+		float: left;
+		vertical-align: middle;
+		width: 32rpx;
+		background-color: #ffdfa2;
+		font-size: 20rpx;
+		color: #2c7564;
+	}
+}
+</style>

+ 440 - 0
components/GoodsItem.vue

@@ -0,0 +1,440 @@
+<template>
+	<view :class="[isList ? 'list-box' : 'list-box-two']" :style="{ display: isList ? 'block' : 'inline-block' }" @click="goPage(`/pagesT/product/product?id=${item.id}`)">
+		<!-- 单列 -->
+		<view class="goods_item_justify clearfix" v-if="isList">
+			<view class="imgStyle float_left">
+				<block v-if="item.isDistribution === 4">
+					<view :style="{ height: item.minMemberPrice > 0 ? '206rpx' : '176rpx' }" v-if="!(item.inventorTotal - 0) || item.inventorTotal - 0 <= 0" class="sale-end">
+						<text class="ibonfont ibonbuhuozhong"></text>
+					</view>
+				</block>
+				<view v-if="item.brandName" class="brand-name primary-lg">{{ item.brandName }}</view>
+				<image :style="{ height: item.minMemberPrice > 0 ? '206rpx' : '176rpx' }" mode="aspectFill" :src="item.images[0]"></image>
+			</view>
+			<view class="float_right goods-info">
+				<view class="title ellipsis">{{ item.title }}</view>
+				<view class="unit clearfix">
+					<!-- <text class="float_right"
+						v-if="item.showMinUnitPrice === 5 && item.minMinUnitPrice !== '0.00'">1斤={{ Number(item.minMinUnitPrice) }}元</text> -->
+					已售
+					<text v-if="baseSet.isSalesNum === 5" style="color: #333333;font-size: 24rpx;margin-left: 10rpx;">{{ item.realSalesNum }}</text>
+				</view>
+				<!-- <view class="unit" v-if="baseSet.isSalesNum === 5" style="font-size: 26rpx;color: #000000;">已售:{{ item.realSalesNum }}</view> -->
+				<view class="price clearfix primary-color">
+					<view class="float_left" v-if="!showGoodsPrice">
+						<view>
+							<text class="rmb-icon" v-if="item.showMinUnitPrice !== 5">¥</text>
+							<view style="display: inline-block;" v-if="item.isEq === 4">
+								<view style="display: inline-block;" v-if="item.showMinUnitPrice === 5">
+									<view class="float_left rmb-icon" style="margin-top: 14rpx;">¥</view>
+									<rich-text class="float_left" :nodes="$_utils.splitPrice(item.minMinUnitPrice)"></rich-text>
+									<view class="float_left">-</view>
+									<rich-text class="float_left" :nodes="$_utils.splitPrice(item.maxMinUnitPrice)"></rich-text>
+									<view class="float_left" style="font-size: 20rpx;margin-top: 14rpx;">/斤</view>
+								</view>
+								<rich-text v-else :nodes="$_utils.splitPrice(item.minSalePrice)"></rich-text>
+							</view>
+							<view style="display: inline-block;" v-else>
+								<view style="display: inline-block;" v-if="item.showMinUnitPrice === 5">
+									<view class="float_left rmb-icon" style="margin-top: 14rpx;">¥</view>
+									<rich-text class="float_left" :nodes="$_utils.splitPrice(item.maxMinUnitPrice)"></rich-text>
+									<view class="float_left" style="font-size: 20rpx;margin-top: 14rpx;">/斤</view>
+								</view>
+								<rich-text v-else :nodes="$_utils.splitPrice(item.maxSalePrice)"></rich-text>
+							</view>
+							<!-- <text class="market-price">¥{{ item.maxMarketPrice }}</text> -->
+						</view>
+						<view class="vip-price clearfix" v-if="item.minMemberPrice > 0">
+							<view class="price-text" v-if="item.isEq === 4">¥{{ item.minMemberPrice }}</view>
+							<view class="price-text" v-else>¥{{ item.maxMemberPrice }}</view>
+							<view class="price-bs">VIP</view>
+						</view>
+					</view>
+					<view class="float_left showGoodsPrice" v-else>{{ showGoodsPrice }}</view>
+					<!-- <view class="float_right" @click.stop="addCart"><text
+							class="ibonfont ibonxinzeng1 cart-icon p-background-img"></text></view> -->
+				</view>
+				<view class="addCart-btn p-background-img" @click.stop="addCart">加入购物车</view>
+			</view>
+		</view>
+		<!-- 两列 -->
+		<view class="goods_item_align" v-else>
+			<view class="img_style">
+				<block v-if="item.isDistribution === 4">
+					<view class="sale-end" v-if="!(item.inventorTotal - 0) || item.inventorTotal - 0 <= 0"><text class="ibonfont ibonbuhuozhong"></text></view>
+				</block>
+				<view v-if="item.brandName" class="brand-name primary-btn">{{ item.brandName }}</view>
+				<image mode="aspectFill" :src="item.images[0]"></image>
+			</view>
+			<view class="goods-info">
+				<view class="title_align ellipsis">{{ item.title }}</view>
+				<!-- <view class="unit_align">{{ item.describe }}</view> -->
+				<view class="price_align clearfix">
+					<view class="float_left">
+						<view class="now-price" v-if="!showGoodsPrice">
+							<text class="rmb-icon">¥</text>
+							<view style="display: inline-block;" v-if="item.isEq === 4"><rich-text :nodes="$_utils.splitPrice(item.minSalePrice)"></rich-text></view>
+							<view style="display: inline-block;" v-else><rich-text :nodes="$_utils.splitPrice(item.maxSalePrice)"></rich-text></view>
+							<text class="market-price">¥{{ item.maxMarketPrice }}</text>
+							<view class="vip-price clearfix" v-if="item.minMemberPrice > 0">
+								<view class="price-text" v-if="item.isEq === 4">¥{{ item.minMemberPrice }}</view>
+								<view class="price-text" v-else>¥{{ item.maxMemberPrice }}</view>
+								<view class="price-bs">vip</view>
+							</view>
+						</view>
+						<view class="now-price showGoodsPrice" v-else>
+							<text>{{ showGoodsPrice }}</text>
+						</view>
+					</view>
+					<view class="k-add-btn" @click.stop="addCart"><text class="ibonfont ibonxinzeng1 cart-icon p-background-img"></text></view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			tip_show: false
+		};
+	},
+	computed: {
+		hasLogin() {
+			return this.$store.state.hasLogin;
+		},
+		baseSet() {
+			return this.$store.state.baseSet;
+		},
+		showGoodsPrice() {
+			if (this.baseSet.goodsPrice === 5 && this.$store.state.hasLogin) {
+				return '';
+			} else if (!this.$store.state.hasLogin && this.baseSet.goodsPrice === 4) {
+				return '请登录';
+			} else if (this.$store.state.userStatus.enableStatus === 4 && this.baseSet.goodsPrice === 4) {
+				return '已禁用';
+			} else if (this.$store.state.userStatus.status !== 2 && this.baseSet.goodsPrice === 4) {
+				if (this.$store.state.userStatus.status === 0) {
+					return '待审核';
+				} else if (this.$store.state.userStatus.status === 1) {
+					return '审核中';
+				} else if (this.$store.state.userStatus.status === 3) {
+					return '已驳回';
+				}
+			} else {
+				return '';
+			}
+		}
+	},
+	props: {
+		isList: {
+			type: Boolean,
+			default: false
+		},
+		item: {
+			type: Object,
+			default: () => {
+				return {
+					images: ['https://cdn.uviewui.com/uview/example/fade.jpg'],
+					title: '商品名称商品名称商品名称商品名称商品名称商品名称',
+					describe: 'describedescribedescribedescribe',
+					id: 1
+				};
+			}
+		},
+		index: {
+			type: [String, Number],
+			default: 0
+		}
+	},
+	methods: {
+		addCart(skuId) {
+			this.$emit('addCart');
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.list-box-two {
+	padding: 0 10rpx;
+}
+
+.goods_item_justify {
+	background-color: #ffffff;
+	padding: 24upx;
+	width: 100%;
+	border-radius: 12upx;
+
+	.imgStyle {
+		position: relative;
+
+		.sale-end {
+			position: absolute;
+			height: 176upx;
+			width: 176upx;
+			border-radius: 10upx;
+			display: block;
+			left: 0;
+			top: 0;
+			text-align: center;
+			z-index: 8;
+			line-height: 160rpx;
+			background-color: rgba($color: #000000, $alpha: 0.3);
+
+			.ibonfont {
+				font-size: 120rpx;
+				color: #ffffff;
+			}
+		}
+
+		image {
+			height: 176upx;
+			width: 176upx;
+			border-radius: 10upx;
+			display: block;
+		}
+
+		.brand-name {
+			position: absolute;
+			z-index: 9;
+			top: -12rpx;
+			left: -12rpx;
+			padding: 0 10rpx;
+			line-height: 32rpx;
+			height: 32rpx;
+			color: #ffffff;
+			border-radius: 8rpx;
+			font-size: 20rpx;
+		}
+	}
+
+	.goods-info {
+		// width: 476upx;
+		width: calc(100% - 188rpx);
+		position: relative;
+		.title {
+			font-size: 28upx;
+			width: 100%;
+			height: 80upx;
+			line-height: 40upx;
+			font-weight: 500;
+			color: #111111;
+		}
+
+		.unit {
+			font-size: 20upx;
+			font-family: DIN-Medium;
+			color: #9d9d9d;
+			width: 100%;
+			height: 28upx;
+			line-height: 28upx;
+			margin-top: 8rpx;
+			margin-bottom: 12rpx;
+		}
+
+		.price {
+			color: $price-color;
+			font-size: 32upx;
+			font-weight: 500;
+			font-family: DIN-Medium;
+
+			.rmb-icon {
+				font-size: 20upx;
+				font-weight: 400;
+			}
+
+			.float_right {
+				.cart-icon {
+					font-size: 40rpx;
+					background-image: -webkit-linear-gradient(45deg, #fe923e 0%, #ff3724 100%);
+					-webkit-background-clip: text;
+					color: transparent;
+					display: block;
+				}
+			}
+
+			.market-price {
+				font-family: DINPro-Regular;
+				color: #d8d8d8;
+				text-decoration: line-through;
+				font-size: 24upx;
+				margin-left: 20upx;
+				font-weight: 400;
+			}
+		}
+	}
+}
+
+.vip-price {
+	// margin-left: 20upx;
+	margin-top: 6upx;
+	line-height: 32rpx;
+	height: 32rpx;
+	border-radius: 4rpx;
+	overflow: hidden;
+	font-family: DINPro-Regular;
+
+	.price-text {
+		min-width: 80rpx;
+		text-align: center;
+		float: left;
+		vertical-align: middle;
+		font-size: 20rpx;
+		color: #ffdfa2;
+		background: linear-gradient(270deg, #1e5657 0%, #0d2b2c 100%);
+		padding: 0 8rpx;
+	}
+
+	.price-bs {
+		text-align: center;
+		float: left;
+		vertical-align: middle;
+		width: 32rpx;
+		background-color: #ffdfa2;
+		font-size: 16rpx;
+		color: #2c7564;
+		font-family: DIN-Medium;
+	}
+}
+.addCart-btn {
+	width: 198rpx;
+	height: 60rpx;
+	background: linear-gradient(90deg, #fe923e 0%, #ff3724 100%);
+	border-radius: 30rpx;
+	color: #ffffff;
+	line-height: 60rpx;
+	font-size: 28rpx;
+	text-align: center;
+	position: absolute;
+	bottom: 0;
+	right: 0;
+}
+
+.goods_item_align {
+	width: 350upx;
+	margin-top: 12upx;
+	background-color: #ffffff;
+	border-radius: 10upx;
+	overflow: hidden;
+
+	.img_style {
+		padding-top: 24rpx;
+		position: relative;
+
+		.sale-end {
+			position: absolute;
+			height: 260upx;
+			width: 260upx;
+			border-radius: 10upx;
+			display: block;
+			left: 50%;
+			transform: translate(-50%, -50%);
+			top: calc(50% + 12rpx);
+			text-align: center;
+			line-height: 260rpx;
+			background-color: rgba($color: #000000, $alpha: 0.3);
+
+			.ibonfont {
+				font-size: 120rpx;
+				color: #ffffff;
+			}
+		}
+
+		image {
+			width: 260rpx;
+			height: 260rpx;
+			display: block;
+			margin: 0 auto;
+			border-radius: 8rpx;
+		}
+
+		.brand-name {
+			position: absolute;
+			top: 12rpx;
+			left: 12rpx;
+			padding: 0 10rpx;
+			line-height: 32rpx;
+			height: 32rpx;
+			color: #ffffff;
+			border-radius: 8rpx;
+			font-size: 20rpx;
+			z-index: 9;
+		}
+	}
+
+	.goods-info {
+		padding: 20upx;
+
+		.title_align {
+			font-size: 28upx;
+			font-weight: 500;
+			width: 100%;
+			height: 72upx;
+			line-height: 36upx;
+		}
+
+		.unit_align {
+			font-size: 24upx;
+			height: 32upx;
+			line-height: 32upx;
+			color: #9d9d9d;
+			overflow: hidden;
+			text-overflow: ellipsis;
+			white-space: nowrap;
+			margin: 8upx 0;
+		}
+
+		.price_align {
+			color: $price-color;
+			font-size: 28upx;
+			position: relative;
+
+			.k-add-btn {
+				position: absolute;
+				right: 0;
+				top: 50%;
+				transform: translateY(-50%);
+
+				.cart-icon {
+					font-size: 40rpx;
+					background-image: -webkit-linear-gradient(45deg, #fe923e 0%, #ff3724 100%);
+					-webkit-background-clip: text;
+					color: transparent;
+					display: block;
+				}
+			}
+
+			.now-price {
+				display: inline-block;
+				font-weight: 500;
+				font-size: 32upx;
+				font-family: DIN-Medium;
+
+				.rmb-icon {
+					font-size: 24upx;
+					font-weight: 400;
+				}
+			}
+
+			.market-price {
+				font-size: 24rpx;
+				color: #d8d8d8;
+				font-family: DINPro-Regular;
+				text-decoration: line-through;
+				margin-left: 20rpx;
+				font-weight: 400;
+			}
+
+			.cart-icon {
+				font-size: 40rpx;
+				background-image: -webkit-linear-gradient(45deg, #fe923e 0%, #ff3724 100%);
+				-webkit-background-clip: text;
+				color: transparent;
+				display: inline-block;
+			}
+		}
+	}
+}
+</style>

+ 217 - 0
components/J-skeleton.vue

@@ -0,0 +1,217 @@
+<template>
+<!--	骨架屏-->
+	<view>
+		<view v-if="loading" class="skeleton" :class="{ animate: animate }" :style="{ justifyContent: flexType }">
+			<!-- 轮播图 -->
+			<view v-if="imgTitle" class="skeleton-imgTitle" style="width: 95%;border-radius: 10px;height: 100px;display: block;"></view>
+			<!-- 头像图 -->
+
+			<view
+				v-if="showAvatar && !imgTitle"
+				class="skeleton-avatar"
+				v-for="(item, index) in nameRow"
+				:key="index"
+				:class="[avatarShape]"
+				:style="{ width: avatarSize, height: avatarSize }"
+			></view>
+			<!-- 文字条 -->
+			<view class="skeleton-content" v-if="showTitle && !imgTitle">
+				<view class="skeleton-title" :style="{ width: titleWidth }"></view>
+				<view class="skeleton-rows"><view class="skeleton-row-item" v-for="(item, index) in rowList" :key="index" :style="{ width: item.width }"></view></view>
+			</view>
+		</view>
+		<view v-else><slot></slot></view>
+		<view class="NavBar clearfix">
+			<view class="nav-li" v-for="(item, index) in 8" :key="index"><view class="nav-icon"></view></view>
+		</view>
+		<view class="magic-adv-view"></view>
+		<view class="seckill-view">
+			<view class="seckill-top"></view>
+			<view class="seckill-goods-view">
+				<view
+					class="seckill-goods"
+					style="margin-right: 20upx;"
+				></view>
+				<view class="seckill-goods"></view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+const DEFAULT_ROW_WIDTH = '100%';
+const DEFAULT_LAST_ROW_WIDTH = '60%';
+
+export default {
+	name: "Skeleton",
+	props: {
+		loading: {
+			type: Boolean,
+			default: true
+		},
+		imgTitle: {
+			type: Boolean,
+			default: false
+		},
+		nameRow: {
+			type: Number,
+			default: 1
+		},
+		flexType: {
+			type: String,
+			default: 'flex-start' // center	居中	√		space-between	两端对齐	√		space-around	子元素拉手分布	√		flex-start	居左		flex-end	居右
+		},
+		showAvatar: {
+			type: Boolean,
+			default: true
+		},
+		avatarSize: {
+			type: String,
+			default: '50px'
+		},
+		avatarShape: {
+			type: String,
+			default: 'round' // square | round
+		},
+		showTitle: {
+			type: Boolean,
+			default: false
+		},
+		titleWidth: {
+			type: String,
+			default: '40%'
+		},
+		row: {
+			type: Number,
+			default: 3
+		},
+		animate: {
+			type: Boolean,
+			default: true
+		}
+	},
+	data() {
+		return {};
+	},
+	computed: {
+		rowList() {
+			let list = [];
+			for (let i = 0; i < this.row; i++) {
+				list.push({
+					width: i === this.row - 1 && i !== 0 ? DEFAULT_LAST_ROW_WIDTH : DEFAULT_ROW_WIDTH
+				});
+			}
+			return list;
+		}
+	}
+};
+</script>
+
+<style scoped lang="scss">
+.seckill-view {
+	width: 680upx;
+	margin: 0 auto;
+	.seckill-top {
+		height: 70upx;
+		background-color: #f5f5f5;
+		margin-bottom: 30upx;
+	}
+	.seckill-goods-view {
+		.seckill-goods {
+			display: inline-block;
+			width: 330upx;
+			height: 300upx;
+			background-color: #f5f5f5;
+		}
+	}
+}
+.magic-adv-view {
+	width: 680upx;
+	height: 200upx;
+	background-color: #f5f5f5;
+	margin: 20upx auto;
+}
+.NavBar {
+	background: #fff;
+	padding-top: 40upx;
+	display: -webkit-flex;
+	display: flex;
+	width: 100%;
+	justify-content: space-between;
+	flex-wrap: wrap;
+}
+.nav-icon {
+	width: 88upx;
+	height: 88upx;
+	margin: 0 auto;
+	display: block;
+	background-color: #f5f5f5;
+	padding-bottom: 10upx;
+}
+.nav-li {
+	width: 25%;
+	font-size: 26upx;
+	text-align: center;
+	margin-bottom: 40upx;
+}
+.skeleton {
+	display: flex;
+	margin: 16px;
+	--bg-color: #f2f3f5;
+	--row-height: 16px;
+	--row-margin-top: 16px;
+}
+.skeleton-imgTitle {
+	flex-wrap: wrap;
+	background: var(--bg-color);
+	margin: 10px auto;
+}
+.skeleton-avatar {
+	flex-shrink: 0;
+	background: var(--bg-color);
+	margin-right: 8px;
+}
+.skeleton-avatar.round {
+	border-radius: 50%;
+}
+
+.skeleton-content {
+	width: 100%;
+}
+
+.skeleton-title {
+	background-color: var(--bg-color);
+	height: var(--row-height);
+}
+
+.skeleton-title + .skeleton-rows {
+	margin-top: var(--row-margin-top);
+}
+
+.skeleton-rows {
+}
+
+.skeleton-row-item {
+	background-color: var(--bg-color);
+	height: var(--row-height);
+}
+.skeleton-row-item:not(:first-child) {
+	margin-top: var(--row-margin-top);
+}
+
+.skeleton.animate {
+	animation: skeleton-blink 1.2s ease-in-out infinite;
+}
+
+@keyframes skeleton-blink {
+	0% {
+		opacity: 1;
+	}
+	50% {
+		opacity: 0.6;
+	}
+	100% {
+		opacity: 1;
+	}
+}
+</style>

+ 303 - 0
components/Login.vue

@@ -0,0 +1,303 @@
+<template>
+	<view class="login-btn-box">
+		<!-- #ifdef MP-WEIXIN -->
+		<button v-if="canIUseGetUserProfile" @click="getUserProfile" class="login-btn primary-color"><slot name="lBtn">登录/注册</slot></button>
+		<button v-else class="login-btn primary-color" open-type="getUserInfo" @getuserinfo="getuserinfo"><slot name="lBtn">登录/注册</slot></button>
+		<!-- #endif -->
+		<!-- #ifdef MP-TOUTIAO -->
+		<button class="login-btn primary-color" @click="getuserinfoTT"><slot name="lBtn">登录/注册</slot></button>
+		<!-- #endif -->
+		<!-- #ifdef APP-PLUS || H5 -->
+		<button class="login-btn primary-color" @click="appLogin"><slot name="lBtn">去登录</slot></button>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			userInfo: {},
+			wxUserInfo: {},
+			loginCode: '',
+			provider: '',
+			canIUseGetUserProfile: false
+		};
+	},
+	created() {
+		// #ifdef MP-WEIXIN
+		if (!this.$common.isLogin()) {
+			uni.login({
+				provider: 'weixin',
+				success: res => {
+					this.loginCode = res.code;
+				}
+			});
+		}
+		this.canIUseGetUserProfile = !!uni.getUserProfile;
+		// #endif
+	},
+	methods: {
+		// APP登录
+		appLogin() {
+			// #ifdef APP-PLUS
+			this.$emit('loginSuccess');
+			const res = uni.getSystemInfoSync();
+			if (res.platform === 'ios') {
+				const iosAuditStatus = this.$store.state.iosAuditStatus;
+				const isUpdate = uni.getStorageSync('isUpdate');
+				if (iosAuditStatus === 4 && !isUpdate) {
+					this.goPage('/pagesT/public/login');
+				} else {
+					this.goPage('/pagesT/public/wxLogin');
+				}
+			} else {
+				this.goPage('/pagesT/public/login');
+				// this.goPage('/pagesT/public/wxLogin');
+			}
+			// #endif
+			// #ifdef H5
+			this.$emit('loginSuccess');
+			this.goPage('/pagesT/public/wxLogin');
+			// #endif
+		},
+		// 拒绝跳转主页面
+		goIndex() {
+			uni.switchTab({
+				url: '/pages/index/index'
+			});
+		},
+		// 头条
+		getuserinfoTT() {
+			uni.login({
+				provider: 'toutiao',
+				success: res => {
+					uni.setStorageSync('loginCode', res.code);
+					this.loginCode = res.code;
+					uni.getUserInfo({
+						provider: 'toutiao',
+						success: prop => {
+							console.log(prop);
+							this.wxUserInfo = prop;
+							// 用户图像
+							const avator = prop.userInfo.avatarUrl;
+							uni.setStorageSync('avator', avator);
+							// 用户昵称
+							const NickName = prop.userInfo.nickName;
+							uni.setStorageSync('NickName', NickName);
+							this.microappLogin(this.loginCode);
+						}
+					});
+				}
+			});
+		},
+		getUserProfile() {
+			wx.getUserProfile({
+				desc: '用于完善用户资料',
+				lang: 'zh_CN',
+				success: res => {
+					console.log(res);
+					console.log('获取用户授权信息成功');
+					this.getuserinfo(res);
+				},
+				fail: fail => {
+					console.log('获取用户授权信息失败');
+				}
+			});
+		},
+		// 允许获取信息 微信
+		getuserinfo(val) {
+			this.$emit('loginSuccess');
+			this.wxUserInfo = val.detail || val;
+			// 用户图像
+			const avator = this.wxUserInfo.userInfo.avatarUrl;
+			uni.setStorageSync('avator', avator);
+			// 用户昵称
+			const NickName = this.wxUserInfo.userInfo.nickName;
+			uni.setStorageSync('NickName', NickName);
+			if (!this.loginCode) {
+				uni.login({
+					provider: 'weixin',
+					success: res => {
+						this.loginCode = res.code;
+						this.Login(this.loginCode);
+					}
+				});
+			} else {
+				this.Login(this.loginCode);
+			}
+		},
+		// 头条小程序登陆
+		microappLogin(code) {
+			this.$u.api
+				.microappLogin({
+					code: code
+				})
+				.then(({ data }) => {
+					uni.setStorageSync('openid', data.openid);
+					this.checkBindMiniProgram(data.openid, '');
+				});
+		},
+		// 微信小程序通过code获取openId
+		Login(code) {
+			uni.showLoading();
+			this.$u.api
+				.getOpenId({
+					code: code
+				})
+				.then(data => {
+					uni.hideLoading();
+					// code 用过之后 清除缓存的code
+					this.loginCode = '';
+					if (!data.data.unionid) {
+						this.decryptData(this.wxUserInfo.iv, this.wxUserInfo.encryptedData, data.data.openid);
+					} else {
+						uni.setStorageSync('openid', data.data.openid);
+						uni.setStorageSync('unionid', data.data.unionid);
+						this.checkBindMiniProgram(data.data.openid, data.data.unionid);
+					}
+					// this.checkBindMiniProgram(data.data.openid, data.data.unionid);
+					// uni.setStorageSync('session_key', data.data.session_key);
+				});
+		},
+		// 反解 unionId
+		decryptData(iv, encryptedData, openid) {
+			// const iv = e.detail.iv;
+			// const encryptedData = e.detail.encryptedData;
+			this.$u.api
+				.decryptData({
+					openid: openid,
+					iv: iv,
+					encryptedData: encryptedData
+				})
+				.then(data => {
+					uni.setStorageSync('openid', openid);
+					uni.setStorageSync('unionid', data.data.unionId);
+					this.checkBindMiniProgram(openid, data.data.unionId);
+				});
+		},
+		// 判断是否已绑定  checkBindMiniProgram
+		checkBindMiniProgram(openid, unionid) {
+			this.$u.api
+				.checkBindMiniProgram({
+					openId: openid || '',
+					unionId: unionid || '',
+					source: this.$common.source()
+				})
+				.then(async data => {
+					// 如果返回空绑定手机
+					if (!data.data.token) {
+						setTimeout(() => {
+							this.goPage(`/pagesT/binding/bindPhone`);
+						}, 100);
+						return;
+					} else {
+						const token = data.data.token;
+						uni.setStorageSync('token', token);
+						uni.setStorageSync('expireTime', data.data.expireTime);
+						// 更新登录状态
+						this.$store.commit('commit_hasLogin', true);
+						// 添加分销上下级关系
+						await this.relationshipBusinessman();
+						// 否则验证审核
+						await this.getCustomerInfo(data.data.token, data.data.expireTime);
+					}
+				});
+		},
+		// 添加分销上下级关系 source: 1:首次点击链接 2:首次下单 3:首次付款'
+		async relationshipBusinessman() {
+			if (!this.$store.state.businessmanId) {
+				return;
+			}
+			this.$u.api
+				.relationshipBusinessman({
+					businessmanId: this.$store.state.businessmanId,
+					source: 1
+				})
+				.then(res => {
+					console.log('上下:', res);
+				});
+		},
+		//先获取个人资料
+		getCustomerInfo(token) {
+			this.$u.api.getCustomerInfo().then(({ data }) => {
+				if (data.enableStatus === 4) {
+					uni.clearStorageSync();
+					uni.showModal({
+						title: '账号已被禁用,您可以',
+						content: '联系电话:' + (data.enterpriseMobile||''),
+						confirmText: '联系客服',
+						cancelText: '取消',
+						success: res => {
+							if (res.confirm) {
+								uni.makePhoneCall({
+									phoneNumber: data.enterpriseMobile
+								});
+							} else {
+								this.goPage('/pages/binding/bindInfo', 'reLaunch');
+							}
+						}
+					});
+					return;
+				}
+				// if (this.$store.state.baseSet.personnelReview === 5) {
+				if (data.status === 3) {
+					// uni.clearStorageSync();
+					// 说明资料不完善,跳转到完善资料的页面
+					uni.showModal({
+						title: '审核未通过,请重新修改资料',
+						content: data.auditFailReason || '',
+						cancelText: '联系客服',
+						confirmText: '修改资料',
+						success: res => {
+							if (res.confirm) {
+								this.goPage('/pagesT/user/editUserInfo?token=' + token);
+							} else if (res.cancel) {
+								uni.makePhoneCall({
+									phoneNumber: data.enterpriseMobile
+								});
+							}
+						}
+					});
+				} else if (data.status === 1) {
+					// uni.clearStorageSync();
+					uni.showModal({
+						title: '账号正在审核中,您可以',
+						content: '联系电话:' + (data.enterpriseMobile||''),
+						confirmText: '先去逛逛',
+						cancelText: '联系客服',
+						success: res => {
+							if (res.confirm) {
+								this.goPage('/pages/index/index', 'switchTab');
+							} else {
+								uni.makePhoneCall({
+									phoneNumber: data.enterpriseMobile
+								});
+							}
+						}
+					});
+				} else {
+					this.$emit('loginFinish');
+				}
+			});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.login-btn {
+	font-size: 28rpx;
+	// height: 40upx;
+	line-height: inherit;
+	background: transparent;
+	color: $uni-color-primary;
+	// width: 200upx;
+	margin-left: 0;
+	margin-right: 0;
+	// display: inline-block;
+}
+.login-btn::after {
+	border: 0 none;
+}
+</style>

+ 80 - 0
components/NoLoginTip.vue

@@ -0,0 +1,80 @@
+<template>
+	<!--
+
+	 show-cancel-button
+	 confirm-color="#ffffff"
+	 confirm-text="立即登录"
+	 cancel-text="暂不登录"
+	 @confirm="confirm"
+	 @cancel="cancel"
+	 -->
+	<u-modal :show-confirm-button="false" v-model="show" title="您还未登录">
+		<view style="text-align: center;">
+			<view style="font-size: 24rpx; color: #666;padding: 20rpx; 0">请先登录之后再进行操作</view>
+			<image style="width: 200rpx; height: 200rpx;margin-bottom: 20rpx;" src="https://onlineimg.qianniao.vip/login-tip.jpg" mode="aspectFit"></image>
+			<view class="m-btn-ul">
+				<view class="m-btn-li" @click="cancel">暂不登录</view>
+				<view class="m-btn-li confirm-btn primary-bg" >
+					<Login @loginSuccess="loginSuccess"><view slot="lBtn" style="color: #fff;">立即登录</view></Login>
+				</view>
+			</view>
+		</view>
+	</u-modal>
+</template>
+
+<script>
+import Login from '@/components/Login.vue';
+export default {
+	components: {
+		Login
+	},
+	props: {
+		show: {
+			type: Boolean,
+			default: false
+		}
+	},
+	data() {},
+	methods: {
+		loginSuccess() {
+			this.cancel();
+		},
+		confirm() {
+			// #ifdef APP-PLUS
+			uni.reLaunch({
+				url: '/pagesT/public/wxLogin'
+			});
+			// #endif
+			// #ifdef MP-WEIXIN || MP-TOUTIAO
+			uni.reLaunch({
+				url: '/pages/binding/bindInfo'
+			});
+			//#endif
+			// #ifdef H5
+			uni.reLaunch({
+				url: '/pagesT/public/wxLogin?loginType=2'
+			});
+			// #endif
+		},
+		cancel() {
+			console.log(123)
+			this.$emit('cancel');
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.m-btn-ul {
+	display: flex;
+	border-top: 1px solid #f4f4f4;
+	.m-btn-li {
+		flex: 2;
+		font-size: 28upx;
+		line-height: 88upx;
+	}
+	.confirm-btn {
+		color: #ffffff;
+	}
+}
+</style>

+ 260 - 0
components/PageDesign/PageDesign.vue

@@ -0,0 +1,260 @@
+<template>
+	<view class="pageDesin-box" v-if="temData.length">
+		<!-- <view class="address-view" @click="openLocation" :style="{ backgroundColor: temData[0].modelData.topBgColor, color:temData[0].modelData.textColor }">
+			<text class="ibonfont ibondingweiweizhi"></text>
+			<text class="address-text">{{ location.address || '请手动定位' }}</text>
+			<text class="ibonfont ibonjinru"></text>
+		</view> -->
+		<!-- <view style="position: relative;z-index: 2;"> -->
+		<block v-for="(item, index) in temData" :key="index">
+			<ImgSwiper v-if="item.comName === 'ImgSwiper'" :modelData="item.modelData" />
+			<SearchC v-if="item.comName === 'SearchC'" :modelData="item.modelData" />
+			<MagicImg v-if="item.comName === 'MagicImg'" :modelData="item.modelData" />
+			<Notice v-if="item.comName === 'Notice'" :modelData="item.modelData" :noticeData="item.data" />
+			<NavBar v-if="item.comName === 'NavBar'" :modelData="item.modelData" />
+			<view class="" v-if="temData[index].comName === 'NavBar' && temData[index+1].comName !== 'NavBar'">
+				<image src="http://up.liuniukj.com/167307900573324/931544405107da76ca2ec31cd63fae49/yyzq.png" mode=""
+					class="banner-ad"
+					@click="goPage('/pagesT/unit/item')"></image>
+			</view>
+			<AdvGroup v-if="item.comName === 'AdvGroup'" :modelData="item.modelData" />
+			<GoodsGroup v-if="item.comName === 'GoodsGroup'" :modelData="item.modelData" :goodsList="item.data"
+				:showGoodsPrice="showGoodsPrice" :selAddress="selAddressD" />
+			<LimitedSeckill v-if="item.comName === 'LimitedSeckill'" :modelData="item.modelData" :goodsList="item.data"
+				:showGoodsPrice="showGoodsPrice" :selAddress="selAddressD" />
+			<CouponGroup v-if="item.comName === 'CouponGroup'" :modelData="item.modelData" :couponList="item.data" />
+			<LineF v-if="item.comName === 'LineF'" :modelData="item.modelData" />
+			<Blank v-if="item.comName === 'Blank'" :modelData="item.modelData" />
+			<div v-if="item.comName === 'FloatBth'" class="float-bth" @click="btnEvent(item)" :style="{
+					backgroundColor: item.modelData.btnStyle === 2 ? item.modelData.bgColor : 'transparent',
+					borderColor: item.modelData.btnStyle === 2 ? item.modelData.bgColor : '#999999'
+				}">
+				<image :src="item.modelData.image" class="float-img" />
+			</div>
+			<!-- #ifdef MP-WEIXIN -->
+			<button v-if="item.comName === 'wxService'" class="float-bth wxService" :style="{
+					color: item.modelData.color
+				}" open-type="contact">
+				<text class="ibonfont ibonkefu"></text>
+			</button>
+			<!-- #endif -->
+		</block>
+		<!-- <view class="logo-view" v-if="$common.getEnToken() !== '8fa553d53f44e33123e4d0d51a0de634'">
+			<image src="https://onlineimg.qianniao.vip/QNlogo-i-1.png" mode="aspectFit"></image>
+			<view class="logo-tip">- 千鸟云商提供技术支持 -</view>
+		</view> -->
+		<!-- </view> -->
+	</view>
+</template>
+
+<script>
+	import SearchC from './components/Search.vue';
+	import ImgSwiper from './components/Banner.vue';
+	import MagicImg from './components/MagicImg.vue';
+	import Notice from './components/Notice.vue';
+	import NavBar from './components/NavBar.vue';
+	import GoodsGroup from './components/GoodsGroup.vue';
+	import LimitedSeckill from './components/LimitedSeckill.vue';
+	import CouponGroup from './components/CouponGroup.vue';
+	import LineF from './components/Line.vue';
+	import Blank from './components/Blank.vue';
+	import AdvGroup from './components/AdvGroup.vue';
+	// import NavigationBar from './components/NavigationBar.vue';
+
+	export default {
+		name: 'PageDesign',
+		components: {
+			SearchC,
+			ImgSwiper,
+			MagicImg,
+			Notice,
+			NavBar,
+			GoodsGroup,
+			LimitedSeckill,
+			CouponGroup,
+			LineF,
+			Blank,
+			AdvGroup
+			// NavigationBar
+		},
+		props: {
+			showGoodsPrice: {
+				type: [Number, String],
+				default: ''
+			},
+			temData: {
+				type: Array,
+				default: () => {
+					return [];
+				}
+			},
+			pageBack: {
+				type: Boolean,
+				default: false
+			},
+			isBackIndex: {
+				type: Boolean,
+				default: false
+			},
+			amapPlugin: {
+				type: [Object, Function],
+				default: () => {
+					return {};
+				}
+			},
+			selAddress: {
+				type: Object,
+				default: () => {
+					return {};
+				}
+			}
+		},
+		computed: {
+			style() {
+				const systemInfo = uni.getSystemInfoSync();
+				return `padding-top:${systemInfo.statusBarHeight + 50}px`;
+			},
+			location() {
+				return this.$store.state.locationObj;
+			}
+		},
+		data() {
+			return {
+				selAddressD: {}
+			};
+		},
+		watch: {
+			selAddress(val) {
+				this.selAddressD = val;
+			}
+		},
+		created() {
+			// console.log(this.$common.getEnToken())
+			// this.getHome();
+		},
+		methods: {
+			backEvent() {
+				if (this.isBackIndex) {
+					this.goPage('/pages/index/index', 'switchTab');
+				} else {
+					uni.navigateBack();
+				}
+			},
+			openLocation() {
+				this.$emit('openLocation');
+			},
+			getHome() {
+				this.$u.api.getHome().then(res => {
+					uni.stopPullDownRefresh();
+					this.temData = res.data;
+				});
+			},
+			btnEvent(item) {
+				if (item.modelData.btnType === 2) {
+					uni.makePhoneCall({
+						phoneNumber: item.modelData.phone
+					});
+				} else if (item.modelData.btnType === 1) {
+					this.goPage(item.modelData.url, item.modelData.switchTab);
+				} else {
+					uni.pageScrollTo({
+						scrollTop: 0,
+						duration: 300
+					});
+				}
+			}
+		}
+	};
+</script>
+
+<style lang="scss">
+	.pageDesin-box {
+		// background-color: #f5f9fc;
+		// padding-top: calc(44px + var(--status-bar-height));
+	}
+
+	.float-bth {
+		position: fixed;
+		bottom: 150upx;
+		right: 20upx;
+		width: 80upx;
+		height: 80upx;
+		text-align: center;
+		cursor: pointer;
+		border-radius: 100%;
+		border: 1upx solid #999;
+		box-shadow: 0 6upx 20upx #dcdcdc;
+		z-index: 99;
+
+		.float-img {
+			width: 40upx;
+			height: 40upx;
+			display: inline-block;
+			margin-top: 20upx;
+		}
+	}
+
+	.wxService {
+		padding: 0;
+		background-color: #ffffff;
+		border: 0 none;
+		bottom: 250upx;
+		line-height: 80upx;
+
+		.ibonkefu {
+			font-size: 46upx;
+		}
+
+		&::after {
+			border: 0 none;
+		}
+	}
+
+	.logo-view {
+		text-align: center;
+		padding: 10upx 0;
+
+		image {
+			width: 120upx;
+			height: 20upx;
+			opacity: 0.7;
+		}
+
+		.logo-tip {
+			// padding-top: 4upx;
+			font-size: 18upx;
+			color: #999;
+		}
+	}
+
+	.address-view {
+		padding: 20upx;
+		font-size: 26upx;
+
+		// background-color: #ffffff;
+		.address-text {
+			display: inline-block;
+			vertical-align: middle;
+			font-weight: bold;
+		}
+
+		.ibonfont {
+			margin-right: 10upx;
+			// color: #999;
+			vertical-align: middle;
+		}
+
+		.ibonjinru {
+			// color: #333;
+			font-weight: 300;
+			font-size: 28upx;
+		}
+	}
+
+	.banner-ad {
+		width: 690rpx;
+		height: 190rpx;
+		display: block;
+		margin: 20rpx auto;
+	}
+</style>

+ 255 - 0
components/PageDesign/components/AdvGroup.vue

@@ -0,0 +1,255 @@
+<template>
+	<div class="AdvGroup">
+		<div v-if="modelData.style.styleId !== 3" class="group-one">
+			<div class="one-li one-left" @click="navTo(modelData.adv_list[0].url, modelData.adv_list[0].switchTab)">
+				<div class="left-title-view">
+					<span class="title" :style="{ color: modelData.adv_list[0].titleColor }">{{ modelData.adv_list[0].title }}</span>
+					<span class="desc" :style="{ color: modelData.adv_list[0].descColor }">{{ modelData.adv_list[0].desc }}</span>
+				</div>
+				<div class="more-btn">
+					<span>{{ modelData.adv_list[0].btnText }}</span>
+					<span class="ibonfont ibonjinru"></span>
+				</div>
+				<div><image class="adv-img" mode="aspectFill" :src="modelData.adv_list[0].image.url" /></div>
+			</div>
+			<div class="one-li one-right">
+				<div class="right-li clearfix" @click="navTo(modelData.adv_list[1].url, modelData.adv_list[1].switchTab)">
+					<div class="float_left">
+						<p class="title" :style="{ color: modelData.adv_list[1].titleColor }">{{ modelData.adv_list[1].title }}</p>
+						<p class="desc" :style="{ color: modelData.adv_list[1].descColor }">{{ modelData.adv_list[1].desc }}</p>
+						<div class="more-btn">
+							<span>{{ modelData.adv_list[1].btnText }}</span>
+							<span class="ibonfont ibonjinru"></span>
+						</div>
+					</div>
+					<div class="float_right"><image class="adv-img" mode="aspectFill" :src="modelData.adv_list[1].image.url" /></div>
+				</div>
+				<div class="right-li clearfix" @click="navTo(modelData.adv_list[2].url, modelData.adv_list[2].switchTab)">
+					<div class="float_left">
+						<p class="title" :style="{ color: modelData.adv_list[2].titleColor }">{{ modelData.adv_list[2].title }}</p>
+						<p class="desc" :style="{ color: modelData.adv_list[2].descColor }">{{ modelData.adv_list[2].desc }}</p>
+						<div class="more-btn">
+							<span>{{ modelData.adv_list[2].btnText }}</span>
+							<span class="ibonfont ibonjinru"></span>
+						</div>
+					</div>
+					<div class="float_right"><image class="adv-img" mode="aspectFill" :src="modelData.adv_list[2].image.url" /></div>
+				</div>
+			</div>
+		</div>
+		<div v-if="modelData.style.styleId === 1" class="group-two">
+			<div class="group-li" @click="navTo(modelData.adv_list[3].url, modelData.adv_list[3].switchTab)">
+				<div class="group-title">
+					<span class="title" :style="{ color: modelData.adv_list[3].titleColor }">{{ modelData.adv_list[3].title }}</span>
+					<span class="desc" :style="{ color: modelData.adv_list[3].descColor }">{{ modelData.adv_list[3].desc }}</span>
+				</div>
+				<div class="clearfix">
+					<div class="more-btn float_left">
+						<span>{{ modelData.adv_list[3].btnText }}</span>
+						<span class="ibonfont ibonjinru"></span>
+					</div>
+					<div class="float_right"><image class="adv-img" mode="aspectFill" :src="modelData.adv_list[3].image.url" /></div>
+				</div>
+			</div>
+			<div class="group-li" @click="navTo(modelData.adv_list[4].url, modelData.adv_list[4].switchTab)">
+				<div class="group-title">
+					<span class="title" :style="{ color: modelData.adv_list[4].titleColor }">{{ modelData.adv_list[4].title }}</span>
+					<span class="desc" :style="{ color: modelData.adv_list[4].descColor }">{{ modelData.adv_list[4].desc }}</span>
+				</div>
+				<div class="clearfix">
+					<div class="more-btn float_left">
+						<span>{{ modelData.adv_list[4].btnText }}</span>
+						<span class="ibonfont ibonjinru"></span>
+					</div>
+					<div class="float_right"><image class="adv-img" :src="modelData.adv_list[4].image.url" mode="aspectFill" /></div>
+				</div>
+			</div>
+		</div>
+		<!--    样式3-->
+		<div v-if="modelData.style.styleId === 3" class="group-two">
+			<div class="group-li" @click="navTo(modelData.adv_list[0].url, modelData.adv_list[0].switchTab)">
+				<div class="group-title">
+					<span class="title" :style="{ color: modelData.adv_list[0].titleColor }">{{ modelData.adv_list[0].title }}</span>
+					<span class="desc" :style="{ color: modelData.adv_list[0].descColor }">{{ modelData.adv_list[0].desc }}</span>
+				</div>
+				<div class="clearfix">
+					<div class="more-btn float_left">
+						<span>{{ modelData.adv_list[0].btnText }}</span>
+						<span class="ibonfont ibonjinru"></span>
+					</div>
+					<div class="float_right"><image class="adv-img" mode="aspectFill" :src="modelData.adv_list[0].image.url" /></div>
+				</div>
+			</div>
+			<div class="group-li" @click="navTo(modelData.adv_list[1].url, modelData.adv_list[1].switchTab)">
+				<div class="group-title">
+					<span class="title" :style="{ color: modelData.adv_list[1].titleColor }">{{ modelData.adv_list[1].title }}</span>
+					<span class="desc" :style="{ color: modelData.adv_list[1].descColor }">{{ modelData.adv_list[1].desc }}</span>
+				</div>
+				<div class="clearfix">
+					<div class="more-btn float_left">
+						<span>{{ modelData.adv_list[1].btnText }}</span>
+						<span class="ibonfont ibonjinru"></span>
+					</div>
+					<div class="float_right"><image class="adv-img" mode="aspectFill" :src="modelData.adv_list[1].image.url" /></div>
+				</div>
+			</div>
+		</div>
+		<NoLoginTip @cancel="cancelTip" :show="loginTip" v-if="loginTip" />
+	</div>
+</template>
+
+<script>
+import NoLoginTip from '../../NoLoginTip.vue';
+export default {
+	name: 'AdvGroup',
+	components: {
+		NoLoginTip
+	},
+	props: {
+		modelData: {
+			type: Object,
+			default: () => {
+				return {};
+			}
+		}
+	},
+	data(){
+		return{
+			loginTip:false
+		}
+	},
+	methods: {
+		cancelTip() {
+			this.loginTip = false;
+		},
+		navTo(url, switchTab) {
+			if (!this.$common.isLogin()) {
+				this.loginTip = true;
+			} else {
+				this.goPage(url, switchTab);
+			}
+		}
+	}
+};
+</script>
+
+<style scoped lang="scss">
+.AdvGroup {
+	background-color: #ffffff;
+	.more-btn {
+		font-size: 20rpx;
+		font-weight: 400;
+		color: #cacaca;
+		line-height: 28rpx;
+		.ibonfont {
+			font-size: 20rpx;
+		}
+	}
+	.group-one {
+		display: flex;
+		.one-li {
+			flex: 2;
+		}
+		.one-left {
+			padding-left: 32rpx;
+			padding-top: 24rpx;
+			padding-bottom: 24rpx;
+			border-right: 1px solid #eeeeee;
+			.adv-img {
+				margin-top: 32rpx;
+				width: 318rpx;
+				height: 240rpx;
+				border-radius: 16rpx;
+			}
+			.left-title-view {
+				line-height: 46rpx;
+				padding-bottom: 8rpx;
+				.title {
+					font-size: 32rpx;
+					font-weight: 500;
+					color: #2a2a2a;
+				}
+				.desc {
+					margin-left: 8rpx;
+					font-size: 24rpx;
+					font-weight: 400;
+					color: #f05064;
+				}
+			}
+		}
+		.one-right {
+			padding-right: 32rpx;
+			.right-li {
+				padding: 24rpx 0 24rpx 24rpx;
+				position: relative;
+				.more-btn {
+					position: absolute;
+					left: 24rpx;
+					bottom: 24rpx;
+				}
+				.title {
+					font-size: 28rpx;
+					font-weight: 500;
+					color: #2a2a2a;
+					line-height: 40rpx;
+				}
+				.desc {
+					font-size: 24rpx;
+					font-weight: 400;
+					color: #fd6f02;
+					line-height: 34rpx;
+					padding-top: 8rpx;
+				}
+				&:first-child {
+					border-bottom: 1px solid #eeeeee;
+					.desc {
+						color: #3cb4b6;
+					}
+				}
+			}
+			.adv-img {
+				width: 134rpx;
+				height: 152rpx;
+				border-radius: 8rpx;
+			}
+		}
+	}
+}
+.group-two {
+	display: flex;
+	border-top: 1px solid #eeeeee;
+	.group-li {
+		padding: 24rpx 0;
+		flex: 2;
+		&:first-child {
+			padding-left: 32rpx;
+			padding-right: 24rpx;
+			border-right: 1px solid #eeeeee;
+		}
+		&:nth-child(2) {
+			padding-right: 32rpx;
+			padding-left: 24rpx;
+		}
+		.group-title {
+			padding-bottom: 12rpx;
+			line-height: 40rpx;
+			.title {
+				font-size: 28rpx;
+				font-weight: 500;
+				color: #2a2a2a;
+			}
+			.desc {
+				margin-left: 8rpx;
+				font-size: 24rpx;
+				font-weight: 400;
+				color: #19906c;
+			}
+		}
+		.adv-img {
+			width: 194rpx;
+			height: 108rpx;
+			border-radius: 8rpx;
+		}
+	}
+}
+</style>

+ 55 - 0
components/PageDesign/components/Banner.vue

@@ -0,0 +1,55 @@
+<template>
+	<view style="margin: 0 auto;" :style="{ width: modelData.style === 2 ? '710rpx' : '750rpx' }">
+		<u-swiper
+			:height="modelData.style === 2 ? '300' : '350'"
+			:interval="modelData.interval * 1000"
+			:list="modelData.bannerList"
+			name="img"
+			:autoplay="modelData.autoplay"
+			:effect3d="false"
+			bg-color="transparent"
+			:border-radius="modelData.style === 2 ? '24' : '0'"
+			@click="navTo"
+			img-mode="widthFix"
+			:mode="modelData.indicatorDots?'dot': 'none'"
+		></u-swiper>
+		<NoLoginTip @cancel="cancelTip" :show="loginTip" v-if="loginTip" />
+	</view>
+</template>
+<script>
+import NoLoginTip from '../../NoLoginTip.vue';
+export default {
+	components: {
+		NoLoginTip
+	},
+	props: {
+		modelData: {
+			type: Object,
+			default: () => {
+				return {};
+			}
+		}
+	},
+	data() {
+		return {
+			loginTip: false
+		};
+	},
+	mounted() {
+		console.log(this.modelData,'modelData+++')
+	},
+	methods: {
+		cancelTip() {
+			this.loginTip = false;
+		},
+		navTo(index) {
+			if (!this.$common.isLogin()) {
+				this.loginTip = true;
+			} else {
+				this.goPage(this.modelData.bannerList[index].url, this.modelData.bannerList[index].switchTab);
+			}
+		}
+	}
+};
+</script>
+<style scoped lang="scss"></style>

+ 24 - 0
components/PageDesign/components/Blank.vue

@@ -0,0 +1,24 @@
+<template>
+  <div
+    class="blank"
+    :style="{height:modelData.height*2+'rpx',backgroundColor:modelData.backgroundColor}"
+  ></div>
+</template>
+
+<script>
+  export default {
+    name: 'Blank',
+    props: {
+      modelData: {
+        type: Object,
+        default: () => {
+          return {}
+        }
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 155 - 0
components/PageDesign/components/CouponGroup.vue

@@ -0,0 +1,155 @@
+<template>
+		<div class="coupon-box" v-if="!!couponList.length">
+			<div v-if="modelData.title || modelData.titleDesc" class="coupon-title">
+				<span class="title">{{ modelData.title }}</span>
+				<span v-if="modelData.titleDesc" class="line">|</span>
+				<span class="desc">{{ modelData.titleDesc }}</span>
+			</div>
+			<ul class="coupon-ul" :style="{ paddingTop: modelData.title || modelData.titleDesc ? '4rpx' : '46rpx' }">
+				<view v-for="(item, index) in couponList" :key="index" class="coupon-li" :class="[modelData.rowNum === 2 ? 'coupon-two-li' : '']">
+					<div class="coupon-in" @click="getCoupon(item)">
+						<p class="num">¥{{ Number(item.reducePrice) }}</p>
+						<div class="coupon-desc" v-if="Number(item.minPrice)">商品满{{ Number(item.minPrice) }}元可用</div>
+						<div class="coupon-desc" v-else>无使用门槛</div>
+						<div class="get-btn">
+							<span>领取使用</span>
+							<span class="ibonfont ibonyoujiantou"></span>
+						</div>
+					</div>
+				</view>
+			</ul>
+		</div>
+</template>
+
+<script>
+export default {
+	name: 'CouponGroup',
+	props: {
+		modelData: {
+			type: Object,
+			default: () => {
+				return {};
+			}
+		},
+		couponList: {
+			type: Array,
+			default: () => {
+				return [];
+			}
+		}
+	},
+	methods: {
+		// 点击领取优惠券
+		async getCoupon(item) {
+			this.$u.api
+				.receive({
+					couponId: item.id,
+					vipCardId: item.vipCardId
+				})
+				.then(res => {
+					this.$api.msg('领取成功');
+				});
+		}
+	}
+};
+</script>
+<style scoped lang="scss">
+
+.coupon-box {
+	border-radius: 32rpx;
+	width: 710rpx;
+	margin: 0 auto;
+	background-image: url('https://liuniukj.com/static/img/coupon_bck.1336988a.png');
+	background-repeat: no-repeat;
+	background-position: center;
+	background-size: 100% 100%;
+	.coupon-title {
+		padding: 0 24rpx;
+		line-height: 90rpx;
+		height: 90rpx;
+		color: #ffe6c6;
+		font-size: 24rpx;
+		.line {
+			margin: 0 20rpx;
+		}
+		.title {
+			font-size: 36rpx;
+			font-weight: 600;
+			color: #ffd7a4;
+			text-shadow: 1px 4rpx 1px rgba(175, 19, 13, 0.51);
+		}
+	}
+	.coupon-ul {
+		padding-left: 8rpx;
+		display: flex;
+		padding-bottom: 46rpx;
+		padding-top: 4rpx;
+		width: 100%;
+		// flex-wrap: wrap;
+		white-space: nowrap;
+		overflow-x: scroll;
+		.coupon-li {
+			padding: 4rpx;
+			display: inline-block;
+			margin-left: 24rpx;
+			width: 200rpx;
+			height: 280rpx;
+			background: linear-gradient(180deg, #ffe3cb 3%, #fff8f2 100%);
+			border-radius: 10rpx;
+			&:last-child {
+				margin-right: 30rpx;
+			}
+			.coupon-in {
+				width: 192rpx;
+				height: 272rpx;
+				border-radius: 8rpx;
+				border: 1px solid #a5837a;
+				margin: 0 auto;
+				text-align: center;
+				.num {
+					font-size: 48rpx;
+					font-family: DIN-Medium, DIN;
+					font-weight: 500;
+					color: #8b3913;
+					line-height: 38rpx;
+					background: linear-gradient(180deg, #934331 0%, #c5785f 100%);
+					-webkit-background-clip: text;
+					-webkit-text-fill-color: transparent;
+					margin-top: 52rpx;
+				}
+				.coupon-desc {
+					font-size: 24rpx;
+					font-weight: 400;
+					color: #3c3c3c;
+					line-height: 34rpx;
+					margin-top: 16rpx;
+				}
+				.get-btn {
+					width: 152rpx;
+					height: 48rpx;
+					line-height: 48rpx;
+					background: #9e4722;
+					border-radius: 40rpx;
+					color: #ffffff;
+					font-size: 20rpx;
+					margin: 40rpx auto 0;
+					.ibonfont {
+						font-size: 20rpx;
+						margin-left: 10rpx;
+					}
+				}
+			}
+		}
+		.coupon-two-li {
+			width: 308rpx;
+			display: inline-block;
+			.coupon-in {
+				width: 300rpx;
+				.get-btn {
+					width: 172rpx;
+				}
+			}
+		}
+	}
+}
+</style>

+ 851 - 0
components/PageDesign/components/GoodsGroup.vue

@@ -0,0 +1,851 @@
+<template>
+	<div class="goods-view" :style="{ backgroundColor: modelData.bgColor || '' }">
+		<div v-if="modelData.navStyle === 1">
+			<!--    标题栏风格1-->
+			<div class="title-view clearfix" v-if="modelData.titleStyle === 2" :style="{ color: modelData.titleColor, backgroundColor: modelData.titleBgColor }">
+				{{ modelData.title }}
+				<text class="second-tit primary-btn" v-if="modelData.title_two">{{ modelData.title_two }}</text>
+			</div>
+			<!--    标题栏风格2-->
+			<div class="tit-view-two clearfix" v-if="modelData.titleStyle === 1" :style="{ color: modelData.titleColor, backgroundColor: modelData.titleBgColor }">
+				<text class="tit-view-two-line" :style="{ background: modelData.titleSetColor }"></text>
+				<text class="tit-two-text">{{ modelData.title }}</text>
+				<text class="tit-two-text-c" v-if="modelData.title_two">{{ modelData.title_two }}</text>
+			</div>
+			<!--    标题栏风格3-->
+			<div class="tit-view-three" v-if="modelData.titleStyle === 3" :style="{ color: modelData.titleColor, backgroundColor: modelData.titleBgColor }">
+				<div class="tit-three-text">
+					<div class="tit-view-style tit-view-style-left">
+						<text class="three-style-big" :style="{ background: modelData.titleSetColor }"></text>
+						<text class="three-style-small" :style="{ background: modelData.titleSetColor }"></text>
+					</div>
+					{{ modelData.title }}
+					<div class="tit-view-style tit-view-style-right">
+						<text class="three-style-small" :style="{ background: modelData.titleSetColor }"></text>
+						<text class="three-style-big" :style="{ background: modelData.titleSetColor }"></text>
+					</div>
+				</div>
+				<div class="tit-three-text-c" v-if="modelData.title_two">{{ modelData.title_two }}</div>
+			</div>
+			<!--    标题栏风格4 -->
+			<div class="tit-view-four" v-if="modelData.titleStyle === 4" :style="{ color: modelData.titleColor, backgroundColor: modelData.titleBgColor }">
+				<div class="tit-four-text">{{ modelData.title }}</div>
+				<div class="tit-four-text-c" v-if="modelData.title_two">{{ modelData.title_two }}</div>
+			</div>
+		</div>
+		<ul v-if="modelData.navStyle === 2" class="cate-nav-s">
+			<li class="cate-li" v-for="(item, index) in modelData.tabList" :key="index" :class="[index === tab_index ? 'cate-on' : '']" @click="changeTab(item, index)">
+				{{ item.tabName }}
+			</li>
+		</ul>
+		<div class="goods-div" :class="[modelData.type === 2 ? 'show-scroll' : '']">
+			<ul v-if="modelData.colNum === 1">
+				<li
+					class="clearfix goods-box"
+					v-for="(item, index) in modelData.navStyle === 2 ? tab_goods_list : goodsList"
+					:key="index"
+					@click="goPage(`/pagesT/product/product?id=${item.id}`)"
+					:style="{ backgroundColor: modelData.itemBgColor || '#ffffff', color: modelData.textColor || '#333333' }"
+				>
+					<view v-if="item.brandName" class="brand-name primary-lg">{{ item.brandName }}</view>
+					<view class="float_left img-box">
+						<block v-if="item.isDistribution === 4">
+							<view class="sale-end" v-if="!(item.inventorTotal - 0) || item.inventorTotal - 0 <= 0"><text class="ibonfont ibonbuhuozhong"></text></view>
+						</block>
+						<image class="goods-img-one" :src="item.images[0]" mode="aspectFill"></image>
+					</view>
+					<div class="float_left goods-info">
+						<div class="goods-one-name ellipsis" v-if="modelData.goodsInfo.includes(1)">{{ item.title }}</div>
+						<div class="goods-one-desc ellipsis" v-if="modelData.goodsInfo.includes(4)">{{ item.describe }}</div>
+						<div class="goods-one-sale">
+							<text v-if="modelData.goodsInfo.includes(5) && isSalesNum === 5">已售{{ item.realSalesNum || 0 }}</text>
+						</div>
+						<div class="goods-price clearfix">
+							<view class="float_left price-view">
+								<block v-if="!showGoodsPrice">
+									<view class="now-priceG" v-if="modelData.goodsInfo.includes(2)">
+										<text class="rmbG-icon" :style="{ color: modelData.priceColor || primaryColor }">¥</text>
+										<view style="display: inline-block;font-size: 32rpx;" :style="{ color: modelData.priceColor || primaryColor }">
+											<block v-if="item.isEq === 4"><rich-text :nodes="$_utils.splitPrice(item.minSalePrice)"></rich-text></block>
+											<block v-else><rich-text :nodes="$_utils.splitPrice(item.maxSalePrice)"></rich-text></block>
+										</view>
+										<view class="vip-price clearfix" v-if="item.minMemberPrice > 0">
+											<view class="price-text" v-if="item.isEq === 4">¥{{ item.minMemberPrice }}</view>
+											<view class="price-text" v-else>¥{{ item.maxMemberPrice }}</view>
+											<view class="price-bs">vip</view>
+										</view>
+									</view>
+									<view class="decs-price" v-if="modelData.goodsInfo.includes(3) && !showGoodsPrice">¥{{ item.marketPrice || 0 }}</view>
+								</block>
+								<block v-else>
+									<view class="now-priceG showGoodsPrice" v-if="modelData.goodsInfo.includes(2)">
+										<text :style="{ color: modelData.priceColor || primaryColor }">{{ showGoodsPrice }}</text>
+									</view>
+								</block>
+							</view>
+							<div :style="{ color: modelData.btnColor }" class="float_right add-Car-div" @click.stop="openPopSku(index)">
+								<text v-if="modelData.btnStyle === 2" class="ibonfont ibongouwuche1 p-background-img"></text>
+								<text v-else class="ibonfont ibonxinzeng1 p-background-img"></text>
+							</div>
+						</div>
+					</div>
+				</li>
+			</ul>
+			<!-- 两列 -->
+			<div class="more-col-view goods-two-ul" v-else-if="modelData.colNum === 2">
+				<div class="more-col-li goods-two-li" v-for="(item, index) in modelData.navStyle === 2 ? tab_goods_list : goodsList" :key="index">
+					<div :style="{ backgroundColor: modelData.itemBgColor }" class="goods-li" @click="goPage(`/pagesT/product/product?id=${item.id}`)">
+						<div class="goods-img-box">
+							<block v-if="item.isDistribution === 4">
+								<view class="sale-end" v-if="!(item.inventorTotal - 0) || item.inventorTotal - 0 <= 0"><text class="ibonfont ibonbuhuozhong"></text></view>
+							</block>
+							<view v-if="item.brandName" class="goods-brand primary-lg">{{ item.brandName }}</view>
+							<image class="goods-two-img" :src="item.images[0]" mode="aspectFill"></image>
+						</div>
+						<div class="goods-info-box">
+							<div class="goods-two-name ellipsis" v-if="modelData.goodsInfo.includes(1)">{{ item.title }}</div>
+							<div class="goods-price clearfix">
+								<view class="float_left price-view" v-if="!showGoodsPrice">
+									<view class="now-priceG" v-if="modelData.goodsInfo.includes(2)" :style="{ color: modelData.priceColor || primaryColor }">
+										<text class="rmbG-icon" :style="{ color: modelData.priceColor || primaryColor }">¥</text>
+										<view style="display: inline-block;">
+											<block v-if="item.isEq === 4"><rich-text :nodes="$_utils.splitPrice(item.minSalePrice)"></rich-text></block>
+											<block v-else><rich-text :nodes="$_utils.splitPrice(item.maxSalePrice)"></rich-text></block>
+										</view>
+									</view>
+
+									<view class="vip-price clearfix" v-if="item.minMemberPrice > 0">
+										<view class="price-text" v-if="item.isEq === 4">¥{{ item.minMemberPrice }}</view>
+										<view class="price-text" v-else>¥{{ item.maxMemberPrice }}</view>
+										<view class="price-bs">vip</view>
+									</view>
+									<block v-else>
+										<text class="y-price" :style="{ color: changeColor(modelData.textColor, 0.35) }" v-if="modelData.goodsInfo.includes(3)">
+											¥{{ item.marketPrice || 0 }}
+										</text>
+									</block>
+								</view>
+								<view class="float_left price-view" v-else>
+									<text class="now-priceG showGoodsPrice" v-if="modelData.goodsInfo.includes(2)" :style="{ color: modelData.priceColor || primaryColor }">
+										{{ showGoodsPrice }}
+									</text>
+								</view>
+
+								<view :style="{ color: modelData.btnColor || primaryColor }" class="float_right add-Car-div" @click.stop="openPopSku(index)">
+									<text v-if="modelData.btnStyle === 2" class="ibonfont ibongouwuche1 p-background-img"></text>
+									<text v-else class="ibonfont ibonxinzeng1 p-background-img"></text>
+								</view>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+			<!-- 三列 -->
+			<div class="more-col-view" v-else>
+				<div class="more-col-li goods-three-li" v-for="(item, index) in modelData.navStyle === 2 ? tab_goods_list : goodsList" :key="index">
+					<div :style="{ backgroundColor: modelData.itemBgColor }" class="goods-li" @click="goPage(`/pagesT/product/product?id=${item.id}`)">
+						<div class="goods-img-box">
+							<block v-if="item.isDistribution === 4">
+								<view class="sale-end" v-if="!(item.inventorTotal - 0) || item.inventorTotal - 0 <= 0"><text class="ibonfont ibonbuhuozhong"></text></view>
+							</block>
+							<view v-if="item.brandName" class="goods-brand primary-lg">{{ item.brandName }}</view>
+							<image class="goods-three-img" :src="item.images[0]" mode="aspectFill"></image>
+						</div>
+						<div class="goods-info-box">
+							<div class="goods-name ellipsis" v-if="modelData.goodsInfo.includes(1)">{{ item.title }}</div>
+							<div class="goods-price clearfix">
+								<view class="float_left now-priceG" v-if="!showGoodsPrice">
+									<view v-if="modelData.goodsInfo.includes(2)" :style="{ color: modelData.priceColor || primaryColor }">
+										<text class="rmbG-icon" :style="{ color: modelData.priceColor || primaryColor }">¥</text>
+										<view style="display: inline-block;">
+											<block v-if="item.isEq === 4"><rich-text :nodes="$_utils.splitPrice(item.minSalePrice)"></rich-text></block>
+											<block v-else><rich-text :nodes="$_utils.splitPrice(item.maxSalePrice)"></rich-text></block>
+										</view>
+									</view>
+								</view>
+								<view class="float_left price-view" v-else>
+									<text class="now-priceG showGoodsPrice" v-if="modelData.goodsInfo.includes(2)" :style="{ color: modelData.priceColor || primaryColor }">
+										{{ showGoodsPrice }}
+									</text>
+								</view>
+
+								<view :style="{ color: modelData.btnColor || primaryColor }" class="float_right add-Car-div" @click.stop="openPopSku(index)">
+									<text v-if="modelData.btnStyle === 2" class="ibonfont ibongouwuche1 p-background-img"></text>
+									<text v-else class="ibonfont ibonxinzeng1 p-background-img"></text>
+								</view>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+		<AddCardModel :selAddress="selAddressD" @close="is_add_show = false" :isShow="is_add_show" @change="cardModelPopChange" :goodsId="goods_id" />
+	</div>
+</template>
+<script>
+import AddCardModel from '@/components/AddCardModel';
+export default {
+	name: 'GoodsGroup',
+	components: {
+		AddCardModel
+	},
+
+	props: {
+		showGoodsPrice: {
+			type: [Number, String],
+			default: ''
+		},
+		modelData: {
+			type: Object,
+			default: () => {
+				return {};
+			}
+		},
+		goodsList: {
+			type: Array,
+			default: () => {
+				return [];
+			}
+		},
+		selAddress: {
+			type: Object,
+			default: () => {
+				return {};
+			}
+		}
+	},
+	data() {
+		return {
+			source: '',
+			tab_index: 0,
+			tab_goods_list: [],
+			add_goods: {
+				images: []
+			},
+			buyNum: 1,
+			goodsindex: 0,
+			goods_id: 0,
+			add_sku: {},
+			is_add_show: false,
+			isSalesNum: 4,
+			selAddressD: {}
+		};
+	},
+	watch: {
+		selAddress(val) {
+			this.selAddressD = val;
+		}
+	},
+	created() {
+		this.tab_goods_list = this.modelData.tabList[0].data || [];
+		this.isSalesNum = this.$store.state.baseSet.isSalesNum;
+	},
+	methods: {
+		changeColor(color, n) {
+			return this.$u.colorToRgba(this.$_utils.hexify(color), n);
+		},
+		changeTab(row, index) {
+			this.tab_index = index;
+			this.tab_goods_list = row.data;
+		},
+		cardModelPopChange(obj) {
+			if (!obj.show) {
+				this.is_add_show = false;
+			}
+		},
+		//打开加入购物车弹窗
+		openPopSku(index) {
+			// this.$refs.addCartPop.open();
+			this.is_add_show = true;
+			let row = {};
+			// 因为不知道为什么直接把数据带过来会保错,所以我只能把index带过来
+			if (this.modelData.navStyle === 2) {
+				row = this.tab_goods_list[index];
+			} else {
+				row = this.goodsList[index];
+			}
+			this.goods_id = row.id;
+			// this.add_goods = row;
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.cate-nav-s {
+	white-space: nowrap;
+	line-height: 70upx;
+	width: 100%;
+	overflow: hidden;
+}
+
+.cate-li {
+	display: inline-block;
+	font-size: 28upx;
+	color: #666;
+	font-weight: 400;
+	padding: 0 20upx;
+	text-align: center;
+}
+
+.cate-on:after {
+	content: ' ';
+	display: block;
+	width: 50upx;
+	margin: 0 auto;
+	border-radius: 6upx;
+	height: 6upx;
+	background: $base-btn-bg;
+	transform: translateY(-6upx);
+}
+
+.cate-on {
+	color: $uni-color-primary;
+	font-size: 32upx;
+}
+
+.goods-div {
+	padding: 20upx 12rpx;
+}
+
+.show-scroll {
+	height: 408upx;
+	overflow: hidden;
+}
+.rmbG-icon {
+	font-size: 22upx;
+	font-weight: 400;
+	margin-right: 2upx;
+}
+.vip-price {
+	display: inline-block;
+	vertical-align: middle;
+	margin-left: 20rpx;
+	line-height: 32rpx;
+	height: 32rpx;
+	border-radius: 3rpx;
+	overflow: hidden;
+	font-family: DINPro-Regular;
+	.price-text {
+		float: left;
+		min-width: 80rpx;
+		text-align: center;
+		vertical-align: middle;
+		font-size: 20rpx;
+		color: #ffdfa2;
+		background: linear-gradient(270deg, #1e5657 0%, #0d2b2c 100%);
+		padding: 0 8rpx;
+	}
+	.price-bs {
+		text-align: center;
+		float: left;
+		vertical-align: middle;
+		width: 32rpx;
+		background-color: #ffdfa2;
+		font-size: 20rpx;
+		color: #2c7564;
+	}
+}
+.goods-price {
+	.price-view {
+		width: 246rpx;
+		.now-priceG {
+			font-family: DIN-Medium;
+			color: $uni-color-error;
+			display: inline-block;
+			font-size: 32upx;
+			font-weight: bold;
+			line-height: 40upx;
+		}
+
+		.y-price {
+			font-family: DIN-Medium;
+			color: #d8d8d8;
+			padding-left: 12upx;
+			text-decoration: line-through;
+			line-height: 42upx;
+			font-weight: 400;
+			font-size: 22upx;
+		}
+	}
+}
+
+.goods-box {
+	padding: 20upx;
+	margin-bottom: 20upx;
+	background-color: #ffffff;
+	color: #333333;
+	margin-right: 20upx;
+	border-radius: 16upx;
+	position: relative;
+	margin-left: 20rpx;
+	box-shadow: 0px 2rpx 32rpx 0px rgba(110, 176, 138, 0.08);
+	.img-box {
+		position: relative;
+		.goods-img-one {
+			width: 260upx;
+			height: 260upx;
+			background-color: #f5f5f5;
+			border-radius: 8upx;
+		}
+		.sale-end {
+			position: absolute;
+			width: 260upx;
+			height: 260upx;
+			border-radius: 8upx;
+			display: block;
+			left: 0;
+			top: 0;
+			text-align: center;
+			z-index: 8;
+			line-height: 260upx;
+			background-color: rgba($color: #000000, $alpha: 0.3);
+			.ibonfont {
+				font-size: 120rpx;
+				color: #ffffff;
+			}
+		}
+	}
+	.brand-name {
+		position: absolute;
+		top: 12rpx;
+		left: 12rpx;
+		padding: 0 10rpx;
+		line-height: 32rpx;
+		height: 32rpx;
+		color: #ffffff;
+		border-radius: 8rpx;
+		font-size: 20rpx;
+		z-index: 9;
+	}
+	.goods-info {
+		padding-left: 20upx;
+		width: calc(100% - 284rpx);
+		.goods-one-name {
+			margin-bottom: 20upx;
+			font-size: 28rpx;
+			font-weight: bold;
+			color: #000000;
+			height: 80rpx;
+			line-height: 40rpx;
+		}
+		.goods-one-desc {
+			height: 32rpx;
+			font-size: 24rpx;
+			font-weight: 400;
+			color: #fa6400;
+			line-height: 32rpx;
+			margin-bottom: 20upx;
+			-webkit-line-clamp: 1;
+		}
+		.decs-price {
+			line-height: 28rpx;
+			font-size: 24upx;
+			color: #d8d8d8;
+			text-decoration: line-through;
+			font-weight: 400;
+		}
+		.goods-one-sale {
+			height: 32rpx;
+			font-size: 24rpx;
+			font-weight: 400;
+			color: #9d9d9d;
+			line-height: 32rpx;
+			margin-bottom: 10rpx;
+		}
+		.goods-price {
+			height: 48rpx;
+			line-height: 48rpx;
+			font-size: 20rpx;
+		}
+	}
+}
+
+.title-view {
+	font-size: 36rpx;
+	font-weight: 500;
+	color: #2a2a2a;
+	padding-top: 24rpx;
+	padding-bottom: 24rpx;
+	padding-left: 20rpx;
+	.second-tit {
+		margin-left: 26rpx;
+		min-width: 98rpx;
+		padding: 0 20rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		background: linear-gradient(90deg, #ff9148 0%, #fa6400 100%);
+		border-radius: 0px 24rpx 0px 24rpx;
+		font-size: 20rpx;
+		font-weight: 400;
+		color: #ffffff;
+		display: inline-block;
+	}
+}
+.goods-li {
+	background-color: #fff;
+	margin-bottom: 24upx;
+	// box-shadow: 0px 0px 10upx 4upx #f5f5f5;
+}
+
+.goods-info-box {
+	padding: 20upx 16upx 16upx;
+}
+
+.more-col-view {
+	display: -webkit-flex;
+	display: flex;
+	width: 100%;
+	// justify-content: space-between;
+	flex-wrap: wrap;
+
+	.more-col-li {
+		.goods-li {
+			border-radius: 8upx;
+			margin-right: 20upx;
+		}
+	}
+}
+.add-cart-view {
+	background-color: #fff;
+	padding: 40upx 30upx 30upx;
+	position: relative;
+	.close-icon-view {
+		position: absolute;
+		right: 30upx;
+		top: 10upx;
+		color: #999;
+	}
+	.goods-top {
+		.goods-pop-img-view {
+			width: 200upx;
+			height: 200upx;
+			background-color: #d0dee5;
+			border-radius: 8upx;
+			.goods-pop-img {
+				width: 100%;
+				height: 100%;
+			}
+		}
+		.goods-top-cont {
+			width: 440upx;
+			.goods-top-name {
+				font-size: 32upx;
+				height: 86upx;
+				-webkit-line-clamp: 2;
+			}
+			.goods-stock {
+				color: #666;
+				font-size: 24upx;
+			}
+			.goods-top-other {
+				padding-top: 20upx;
+				font-size: 28upx;
+				.goods-price {
+					color: $uni-color-error;
+					font-size: 32upx;
+					margin-right: 30upx;
+				}
+				.goods-markt-price {
+					color: #999;
+					line-height: 70upx;
+					font-size: 24upx;
+					text-decoration: line-through;
+				}
+			}
+		}
+	}
+	.sku-view {
+		padding-top: 30upx;
+		.sku-label {
+			font-size: 28upx;
+			font-weight: 300;
+		}
+		.sku-ul {
+			padding-top: 20upx;
+			font-size: 28upx;
+			.sku-li {
+				float: left;
+				min-width: 100upx;
+				height: 60upx;
+				line-height: 60upx;
+				border: 1px solid #fd463e;
+				color: #fd463e;
+				text-align: center;
+				border-radius: 6upx;
+				margin-right: 20upx;
+				margin-bottom: 20upx;
+			}
+			.sku-on {
+				// background: linear-gradient(315deg, #fd463e 0%, #ff7f61 100%);
+				border-color: #fff;
+				color: #fff;
+			}
+		}
+	}
+	.add-pop-btn {
+		width: 600upx;
+		height: 70upx;
+		line-height: 70upx;
+		font-size: 28upx;
+		// background: linear-gradient(315deg, #fd463e 0%, #ff7f61 100%);
+		text-align: center;
+		color: #fff;
+		margin: 30upx auto 0;
+		border-radius: 8upx;
+	}
+}
+
+/*  标题栏风格2*/
+.tit-view-two {
+	padding: 20upx;
+}
+.tit-two-text {
+	font-size: 32upx;
+	font-weight: bold;
+}
+.tit-view-two-line {
+	display: inline-block;
+	width: 6upx;
+	height: 32upx;
+	background: #fd463e;
+	vertical-align: middle;
+	transform: translateY(-4upx);
+	margin-right: 10upx;
+}
+.tit-two-text-c {
+	padding-left: 10upx;
+	font-size: 24upx;
+}
+/*  标题栏风格3*/
+.tit-view-three {
+	text-align: center;
+	padding: 20upx;
+}
+.tit-three-text {
+	font-size: 32upx;
+	font-weight: bold;
+	position: relative;
+	display: inline-block;
+	min-width: 128upx;
+	height: 44upx;
+}
+.tit-view-style {
+	position: absolute;
+	line-height: 36upx;
+}
+.tit-view-style-left {
+	left: -40upx;
+	top: 4upx;
+	transform: rotate(50deg);
+}
+.tit-view-style-left .three-style-small {
+	// transform: translateX(-4upx);
+	margin-left: 6upx;
+}
+.tit-view-style-right {
+	right: -40upx;
+	bottom: 4upx;
+	transform: rotate(50deg);
+}
+.tit-view-style-right .three-style-small {
+	// transform: translateX(4upx);
+	margin-right: 6upx;
+}
+.tit-four-text-c,
+.tit-three-text-c {
+	font-size: 20upx;
+	font-weight: 300;
+	padding-top: 4upx;
+}
+.three-style-big {
+	display: inline-block;
+	width: 8upx;
+	height: 36upx;
+	background: #fd463e;
+	border-radius: 8upx;
+	vertical-align: middle;
+}
+.three-style-small {
+	display: inline-block;
+	width: 6upx;
+	height: 16upx;
+	background: #fd463e;
+	opacity: 0.6;
+	border-radius: 8upx;
+	vertical-align: middle;
+}
+/*  标题栏风格4*/
+.tit-view-four {
+	text-align: center;
+	padding: 20upx;
+}
+.tit-four-text {
+	font-size: 32upx;
+	font-weight: bold;
+}
+.tit-four-text:before {
+	display: inline-block;
+	content: '';
+	width: 60upx;
+	height: 1px;
+	background: #333;
+	vertical-align: middle;
+	margin-right: 10upx;
+}
+.tit-four-text:after {
+	display: inline-block;
+	content: '';
+	width: 60upx;
+	height: 2upx;
+	background: #333;
+	vertical-align: middle;
+	margin-left: 10upx;
+}
+// 加入购物车按钮
+.add-Car-div {
+	// color: #fd463e;
+	.ibonfont {
+		font-size: 40rpx;
+		background-image: -webkit-linear-gradient(45deg, #fe923e 0%, #ff3724 100%);
+		-webkit-background-clip: text;
+		color: transparent;
+		display: inline-block;
+	}
+}
+
+.more-col-view {
+	padding-left: 10rpx;
+	.goods-three-li {
+		.goods-li {
+			margin-right: 12rpx;
+			width: 226rpx;
+			border-radius: 10rpx;
+			overflow: hidden;
+			box-shadow: 0 2rpx 32rpx 0 rgba(110, 176, 138, 0.08);
+			.goods-img-box {
+				padding-top: 24rpx;
+				position: relative;
+				.sale-end {
+					position: absolute;
+					width: 190rpx;
+					height: 190rpx;
+					border-radius: 10upx;
+					display: block;
+					left: 50%;
+					top: 50%;
+					transform: translate(-50%, calc(-50% + 12rpx));
+					text-align: center;
+					z-index: 8;
+					line-height: 190rpx;
+					background-color: rgba($color: #000000, $alpha: 0.3);
+					.ibonfont {
+						font-size: 120rpx;
+						color: #ffffff;
+					}
+				}
+				.goods-brand {
+					z-index: 9;
+					position: absolute;
+					padding: 0 10rpx;
+					height: 32rpx;
+					font-size: 20rpx;
+					font-weight: 500;
+					line-height: 32rpx;
+					left: 8rpx;
+					top: 8rpx;
+					color: #ffffff;
+					border-radius: 8rpx;
+					background: linear-gradient(139deg, #fd0000 0%, #fa6400 100%);
+				}
+				.goods-three-img {
+					width: 190rpx;
+					background-color: #f5f5f5;
+					height: 190rpx;
+					display: block;
+					margin: 0 auto;
+					border-radius: 10rpx;
+				}
+			}
+			.goods-info-box {
+				.goods-name {
+					height: 72rpx;
+					line-height: 36rpx;
+					font-weight: 600;
+				}
+				.goods-price {
+					font-weight: 500;
+					font-family: DIN-Medium;
+				}
+			}
+		}
+	}
+	.goods-two-li {
+		.goods-li {
+			width: 334rpx;
+			margin-right: 15rpx;
+			box-shadow: 0px 2rpx 32rpx 0px rgba(110, 176, 138, 0.08);
+			border-radius: 16rpx;
+		}
+		.goods-img-box {
+			padding-top: 30rpx;
+			position: relative;
+			.sale-end {
+				position: absolute;
+				width: 260rpx;
+				height: 260rpx;
+				border-radius: 10upx;
+				display: block;
+				left: 50%;
+				top: 50%;
+				transform: translate(-50%, calc(-50% + 14rpx));
+				text-align: center;
+				z-index: 8;
+				line-height: 260rpx;
+				background-color: rgba($color: #000000, $alpha: 0.3);
+				.ibonfont {
+					font-size: 120rpx;
+					color: #ffffff;
+				}
+			}
+			.goods-brand {
+				position: absolute;
+				padding: 0 10rpx;
+				height: 32rpx;
+				font-size: 20rpx;
+				font-weight: 500;
+				line-height: 32rpx;
+				left: 10px;
+				top: 16rpx;
+				color: #ffffff;
+				border-radius: 8rpx;
+				background: linear-gradient(139deg, #fd0000 0%, #fa6400 100%);
+			}
+			.goods-two-img {
+				background-color: #f5f5f5;
+				display: block;
+				width: 260rpx;
+				height: 260rpx;
+				border-radius: 8rpx;
+				margin: 0 auto;
+			}
+		}
+		.goods-info-box {
+			.goods-two-name {
+				font-size: 28rpx;
+				font-weight: 500;
+				color: #000000;
+				height: 80rpx;
+				line-height: 40rpx;
+			}
+			.goods-price {
+				padding-top: 4rpx;
+			}
+		}
+	}
+}
+.goods-two-ul {
+	padding-left: 20rpx;
+}
+</style>

+ 341 - 0
components/PageDesign/components/LimitedSeckill.vue

@@ -0,0 +1,341 @@
+<template>
+	<div class="LimitedSeckill" :style="{ backgroundColor: modelData.bgColor }" v-if="goodsList.activityGoods && goodsList.activityGoods.length">
+		<div class="top-div clearfix">
+			<div class="float_left icon-xsms">
+				<text class="ibonfont ibonshijian"></text>
+				<text class="xs-text">限时</text>
+				<text>秒杀</text>
+			</div>
+			<view class="count-down float_left">
+				<block v-if="phaseTime.day > 0">
+					<text class="day-num">{{ phaseTime.day }}</text>
+					<text class="day-text">天</text>
+				</block>
+				<u-count-down
+					height="40"
+					color="#ffffff"
+					separator-size="36"
+					font-size="26"
+					border-color="#000000"
+					bg-color="#000000"
+					separator-color="#000000"
+					:timestamp="phaseTime.second"
+					:show-days="false"
+				></u-count-down>
+			</view>
+			<div class="float_right more-btn" @click="goPage('/pagesT/seckill/Seckill')">
+				查看全部
+				<text class="ibonfont ibonjinru"></text>
+			</div>
+		</div>
+		<div class="goods-view-out">
+			<scroll-view class="goods-view" :scroll-x="modelData.type === 2" :style="{ whiteSpace: modelData.type === 2 ? 'nowrap' : 'normal' }">
+				<div
+					class="goods-li"
+					:style="{ width: 100 / modelData.colNum + '%', marginBottom: modelData.type === 2 ? '0' : '24rpx' }"
+					v-for="(item, index) in goodsList.activityGoods"
+					:key="index"
+				>
+					<div class="goods-in" @click="goPage(`/pagesT/product/product?id=${item.goodsId}&skuId=${item.skuId}`)">
+						<div class="goods-img-box">
+							<image class="goods-img" :class="'goods-img-' + modelData.colNum" :src="item.images[0]" mode="aspectFill"></image>
+						</div>
+						<div class="goods-info-box">
+							<div class="goods-name ellipsis">{{ item.goodsName }}</div>
+							<div class="goods-sku ellipsis">
+								{{ item.unitName }};
+								<text v-for="(sku, skuI) in item.specGroup" :key="skuI">{{ sku.specValueName }};</text>
+							</div>
+							<div class="goods-price clearfix">
+								<div class="float_left" v-if="!showGoodsPrice">¥{{ item.originPrice }}</div>
+								<div class="float_right">
+									<span class="rem-ic">¥</span>
+									<span class="price-text">{{ item.salePrice }}</span>
+									<div class="time-tag"></div>
+									<span class="time-text">抢</span>
+								</div>
+								<!-- <div class="float_right add-Car-div" @click.stop="addCart(item.goodsId, item.skuId)">
+									<text v-if="modelData.btnStyle === 2" class="ibonfont ibongouwuche1 primary-color"></text>
+									<text v-else class="ibonfont ibonxinzeng1 primary-color"></text>
+								</div> -->
+							</div>
+						</div>
+					</div>
+				</div>
+			</scroll-view>
+		</div>
+		<!-- 加入购物车动画 cartx 和 carty 是购物车位置在屏幕位置的比例 例如左上角x0.1 y0.1 右下角 x0.9 y0.9-->
+		<AddCardModel :selAddress="selAddressD" :skuId="goods_sku_id" @close="is_add_show = false" @change="cardModelPopChange" :isShow="is_add_show" :goodsId="goods_id" />
+	</div>
+</template>
+
+<script>
+import AddCardModel from '@/components/AddCardModel';
+export default {
+	name: 'LimitedSeckill',
+	components: {
+		AddCardModel
+	},
+	props: {
+		showGoodsPrice: {
+			type: [Number, String],
+			default: ''
+		},
+		modelData: {
+			type: Object,
+			default: () => {
+				return {};
+			}
+		},
+
+		goodsList: {
+			type: [Array, Object],
+			default: () => {
+				return {};
+			}
+		},
+		cartx: {
+			type: [Number, String],
+			default: '0.08'
+		},
+		selAddress: {
+			type: Object,
+			default: () => {
+				return {};
+			}
+		}
+	},
+	watch: {
+		selAddress(val) {
+			this.selAddressD = val;
+		}
+	},
+	data() {
+		return {
+			goods_id: 0,
+			goods_sku_id: 0,
+			is_add_show: false,
+			phaseTime: {
+				day:0,
+				second:''
+			},
+			selAddressD: {}
+		};
+	},
+	created() {
+		let nowData = parseInt(new Date().getTime() / 1000);
+		let totalSecond = this.goodsList.endTime - nowData;
+		if (totalSecond > 0) {
+			this.phaseTime = {
+				second: totalSecond % 86400,
+				day: totalSecond <= 0 ? 0 : parseInt(totalSecond / 86400)
+			};
+		}
+	},
+	
+	methods: {
+		cardModelPopChange(obj) {
+			if (!obj.show) {
+				this.is_add_show = false;
+			}
+		},
+		// 加入购物车
+		addCart(id, skuId) {
+			this.goods_id = id;
+			this.goods_sku_id = skuId;
+			this.is_add_show = true;
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.LimitedSeckill {
+	margin: 20upx 0;
+	.top-div {
+		height: 90rpx;
+		line-height: 90rpx;
+		padding: 0 30rpx;
+		.icon-xsms {
+			font-weight: 700;
+			font-size: 32upx;
+			.ibonshijian {
+				font-size: 28rpx;
+				margin-right: 6rpx;
+				color: #fa6400;
+			}
+			.xs-text {
+				color: #fa6400;
+			}
+		}
+		.count-down {
+			font-family: DIN-Medium;
+			margin-left: 10rpx;
+			.day-num {
+				height: 40rpx;
+				padding: 0 4rpx;
+				display: inline-block;
+				background-color: #000000;
+				color: #ffffff;
+				border-radius: 6rpx;
+				text-align: center;
+				line-height: 40rpx;
+				font-size: 28rpx;
+			}
+			.day-text {
+				display: inline-block;
+				line-height: 40rpx;
+				color: #000000;
+				font-size: 24rpx;
+				margin: 0 8rpx;
+			}
+		}
+	}
+}
+
+.more-btn {
+	font-size: 28upx;
+	line-height: 80upx;
+	color: #9d9d9d;
+	padding-right: 20upx;
+}
+
+.more-btn .ibonjinru {
+	font-size: 23upx;
+	vertical-align: middle;
+}
+
+/*  商品*/
+.goods-view-out {
+	padding:0 10rpx 20upx;
+	width: 706upx;
+	margin: 0 auto;
+	background-color: #ffffff;
+	border-radius: 12upx;
+	.goods-view {
+		display: -webkit-flex;
+		display: flex;
+		width: 100%;
+		flex-wrap: wrap;
+
+		.goods-li {
+			display: inline-block;
+			margin-bottom: 24upx;
+			// box-shadow: 2rpx 4rpx 6rpx 0rpx #f5f5f5;
+			.goods-in {
+				padding: 0 10rpx;
+				background-color: #fff;
+				// margin-right: 30upx;
+			}
+		}
+	}
+}
+
+.goods-img {
+	width: 100%;
+	display: block;
+	margin: 0 auto;
+	background-color: #F5F5F5;
+	border-radius: 8upx;
+}
+.goods-img-3 {
+	width: 214upx;
+	height: 214upx;
+	background-color: #F5F5F5;
+}
+.goods-img-2 {
+	height: 260upx;
+	width: 260upx;
+	background-color: #F5F5F5;
+}
+.goods-info-box {
+	padding-top: 10upx;
+}
+
+.goods-name {
+	font-size: 28upx;
+	color: #000000;
+	display: block;
+	width: 100%;
+	height: 72rpx;
+	line-height: 36rpx;
+	white-space:normal;
+}
+.goods-sku {
+	font-size: 24rpx;
+	margin: 6rpx 0;
+	color: #9d9d9d;
+}
+
+.goods-price {
+	margin: 0 10rpx;
+	.float_left {
+		font-size: 24rpx;
+		font-family: DIN-Medium;
+		font-weight: 400;
+		color: #9d9d9d;
+		line-height: 32rpx;
+		text-decoration: line-through;
+	}
+	.float_right {
+		width: 132rpx;
+		padding-left: 10rpx;
+		height: 38rpx;
+		background: linear-gradient(90deg, #fe923e 0%, #ff3724 100%);
+		border-radius: 20rpx 8rpx 8rpx 20rpx;
+		font-size: 20rpx;
+		font-family: DIN-Medium;
+		font-weight: 600;
+		color: #ffffff;
+		line-height: 38rpx;
+		position: relative;
+		overflow: hidden;
+		.rem-ic {
+			font-weight: 400;
+		}
+		.time-tag {
+			position: absolute;
+			right: -16rpx;
+			transform: rotate(-60deg);
+			top: 0;
+			text-align: center;
+			color: #ffffff;
+			width: 48rpx;
+			height: 48rpx;
+			background: linear-gradient(90deg, #fe923e 0%, #ff3724 100%);
+			border-radius: 8rpx;
+			border: 1px solid rgba(255, 255, 255, 0.8);
+		}
+		.time-text {
+			position: absolute;
+			right: 4rpx;
+			top: 2rpx;
+			font-size: 20rpx;
+		}
+	}
+}
+.rmb-icon {
+	font-size: 20upx;
+	// font-weight: 300;
+}
+
+.y-price {
+	color: #999;
+	padding-top: 6upx;
+	font-size: 22upx;
+	text-decoration: line-through;
+}
+
+.show-scroll {
+	height: 368upx;
+	overflow: hidden;
+}
+// 加入购物车按钮
+.add-Car-div {
+	.ibonfont {
+		color: #fd463e;
+		font-size: 36upx;
+		display: inline-block;
+	}
+}
+</style>

+ 32 - 0
components/PageDesign/components/Line.vue

@@ -0,0 +1,32 @@
+<template>
+  <div
+    class="Line-view"
+    :style="{backgroundColor:modelData.bgColor,paddingTop: modelData.padding*2+'rpx',paddingBottom: modelData.padding*2+'rpx'}"
+  >
+    <div
+      class="line-in"
+      :style="{borderTop:modelData.borderWidth*2+'rpx '+modelData.borderStyle+' '+modelData.borderColor}"
+    ></div>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'LineF',
+    props: {
+      modelData: {
+        type: Object,
+        default: () => {
+          return {}
+        }
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+  .line-in{
+   border-top:1px solid #000000;
+  }
+</style>

+ 216 - 0
components/PageDesign/components/MagicImg.vue

@@ -0,0 +1,216 @@
+<template>
+	<div class="MagicImg">
+		<div class="Magic-style" v-if="modelData.imgStyle !== 5">
+			<view
+				class="image-li"
+				v-for="(item, index) in modelData.imagesList"
+				:key="index"
+				:style="{
+					width: 100 / modelData.imgStyle + '%',
+					paddingBottom: modelData.paddingTB + 'px',
+					paddingTop: modelData.paddingTB + 'px',
+					paddingLeft: (index === 0 ? 0 : modelData.paddingLR / 2) + 'px',
+					paddingRight: (index === modelData.imagesList.length - 1 ? 0 : modelData.paddingLR) / 2 + 'px'
+				}"
+				@click="navTo(item.url, item.switchTab)"
+			>
+				<image
+					:src="item.image.url"
+					class="banner-img"
+					:class="[modelData.imagesList.length === 1 ? 'one-img' : '']"
+					:mode="modelData.imagesList.length === 1 ? 'widthFix' : 'aspectFill'"
+				></image>
+			</view>
+		</div>
+		<div v-if="modelData.imgStyle === 5">
+			<!--    单张图-->
+			<image
+				v-if="modelData.imagesList.length === 1"
+				:src="modelData.imagesList[0].image.url"
+				class="banner-img one-img"
+				mode="widthFix"
+				@click="navTo(modelData.imagesList[0].url, modelData.imagesList[0].switchTab)"
+			></image>
+			<!--    两张-->
+			<div
+				v-if="modelData.imagesList.length === 2"
+				class="Magic-view"
+				:style="{ paddingBottom: modelData.paddingTB * 2 + 'rpx', paddingTop: modelData.paddingTB * 2 + 'rpx' }"
+			>
+				<image
+					v-for="(item, index) in modelData.imagesList"
+					:key="index"
+					:src="item.image.url"
+					class="two-img"
+					mode="aspectFill"
+					@click="navTo(item.url, item.switchTab)"
+					:style="{ paddingRight: (index === 0 ? modelData.paddingLR : 0) + 'rpx', paddingLeft: (index === 1 ? modelData.paddingLR : 0) + 'rpx' }"
+				></image>
+			</div>
+			<!-- 三张 -->
+			<div
+				v-if="modelData.imagesList.length === 3"
+				class="Magic-view"
+				:style="{ paddingBottom: modelData.paddingTB * 2 + 'rpx', paddingTop: modelData.paddingTB * 2 + 'rpx' }"
+			>
+				<image
+					:src="modelData.imagesList[0].image.url"
+					class="tree-big-img"
+					mode="aspectFill"
+					:style="{ paddingRight: modelData.paddingLR * 2 + 'rpx' }"
+					@click="navTo(modelData.imagesList[0].url, modelData.imagesList[0].switchTab)"
+				></image>
+				<div class="tree-small-view">
+					<image
+						:src="modelData.imagesList[1].image.url"
+						class="tree-small-img"
+						mode="aspectFill"
+						:style="{ paddingBottom: modelData.paddingTB + 'rpx' }"
+						@click="navTo(modelData.imagesList[1].url, modelData.imagesList[1].switchTab)"
+					></image>
+					<image
+						:src="modelData.imagesList[2].image.url"
+						class="tree-small-img"
+						mode="aspectFill"
+						:style="{ paddingTop: modelData.paddingTB + 'rpx' }"
+						@click="navTo(modelData.imagesList[2].url, modelData.imagesList[2].switchTab)"
+					></image>
+				</div>
+			</div>
+			<!-- 四张 -->
+			<div
+				v-if="modelData.imagesList.length === 4"
+				class="Magic-view"
+				:style="{ paddingBottom: modelData.paddingTB * 2 + 'rpx', paddingTop: modelData.paddingTB * 2 + 'rpx' }"
+			>
+				<image
+					:src="modelData.imagesList[0].image.url"
+					class="tree-big-img"
+					mode="aspectFill"
+					:style="{ paddingRight: modelData.paddingLR * 2 + 'rpx' }"
+					@click="navTo(modelData.imagesList[0].url, modelData.imagesList[0].switchTab)"
+				></image>
+				<div class="tree-small-view">
+					<image
+						:src="modelData.imagesList[1].image.url"
+						class="tree-small-img"
+						mode="aspectFill"
+						:style="{ paddingBottom: modelData.paddingTB + 'rpx', height: 120 - modelData.paddingTB / 2 + 'rpx' }"
+						@click="navTo(modelData.imagesList[1].url, modelData.imagesList[1].switchTab)"
+					></image>
+					<div class="four-small-view" :style="{ paddingTop: modelData.paddingTB + 'rpx' }">
+						<image
+							:src="modelData.imagesList[2].image.url"
+							class="four-small-img"
+							mode="aspectFill"
+							:style="{ paddingRight: modelData.paddingLR + 'rpx', height: 120 - modelData.paddingTB / 2 + 'rpx' }"
+							@click="navTo(modelData.imagesList[2].url, modelData.imagesList[2].switchTab)"
+						></image>
+						<image
+							:src="modelData.imagesList[3].image.url"
+							class="four-small-img"
+							mode="aspectFill"
+							:style="{ paddingLeft: modelData.paddingLR + 'rpx', height: 120 - modelData.paddingTB / 2 + 'rpx' }"
+							@click="navTo(modelData.imagesList[3].url, modelData.imagesList[3].switchTab)"
+						></image>
+					</div>
+				</div>
+			</div>
+		</div>
+		<NoLoginTip @cancel="cancelTip" :show="loginTip" v-if="loginTip" />
+	</div>
+</template>
+
+<script>
+import NoLoginTip from '../../NoLoginTip.vue';
+export default {
+	name: 'MagicImg',
+	components: {
+		NoLoginTip
+	},
+	props: {
+		modelData: {
+			type: Object,
+			default: () => {
+				return {};
+			}
+		}
+	},
+	data() {
+		return {
+			loginTip: false
+		};
+	},
+	methods: {
+		cancelTip() {
+			this.loginTip = false;
+		},
+		navTo(url, switchTab) {
+			if (!this.$common.isLogin()) {
+				this.loginTip = true;
+			} else {
+				this.goPage(url, switchTab);
+			}
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.MagicImg {
+	margin: 0 auto;
+	width: 720upx;
+}
+
+.two-img {
+	width: 50%;
+	height: 240upx;
+}
+.tree-big-img {
+	width: 50%;
+	height: 240upx;
+	display: block;
+}
+.tree-small-view {
+	width: 50%;
+}
+.tree-small-img {
+	width: 100%;
+	height: 120upx;
+	display: block;
+}
+.four-small-view {
+	width: 100%;
+	display: -webkit-flex;
+	display: flex;
+	justify-content: space-between;
+	flex-wrap: nowrap;
+}
+.four-small-img {
+	width: 50%;
+	height: 120upx;
+}
+.Magic-view {
+	display: -webkit-flex;
+	display: flex;
+	width: 100%;
+	justify-content: space-between;
+	flex-wrap: nowrap;
+}
+.Magic-style {
+	display: -webkit-flex;
+	display: flex;
+	width: 100%;
+	justify-content: space-between;
+	flex-wrap: nowrap;
+}
+.banner-img {
+	width: 100%;
+	height: 172upx;
+	display: block;
+	border-radius: 10rpx;
+}
+.one-img {
+	height: auto;
+}
+</style>

+ 95 - 0
components/PageDesign/components/NavBar.vue

@@ -0,0 +1,95 @@
+<template>
+	<div class="NavBar clearfix" :style="{ backgroundColor: modelData.bgColor }">
+		<div class="nav-li" v-for="(item, index) in modelData.navList" :key="index"
+			:style="{ width: 100 / modelData.num + '%' }" @click="navTo(item.url, item.switchTab,item)">
+			<image class="nav-icon" :src="item.image.url" mode="aspectFit"></image>
+			<div :style="{ color: modelData.color }" class="nav-text">{{ item.text || '文字标题' }}</div>
+		</div>
+		<NoLoginTip @cancel="cancelTip" :show="loginTip" v-if="loginTip" />
+	</div>
+</template>
+
+<script>
+	import NoLoginTip from '../../NoLoginTip.vue';
+	export default {
+		name: 'NavBar',
+		components: {
+			NoLoginTip
+		},
+		props: {
+			modelData: {
+				type: Object,
+				default: () => {
+					return {};
+				}
+			}
+		},
+		data() {
+			return {
+				loginTip: false
+			};
+		},
+		methods: {
+			cancelTip() {
+				this.loginTip = false;
+			},
+			navTo(url, switchTab, item) {
+				if (!this.$common.isLogin()) {
+					this.loginTip = true;
+				} else {
+					if (item.text == '企业文化') {
+						this.goPage('/pagesT/unit/artdetail?type=2', switchTab);
+					} else if (item.text == '高管') {
+						this.goPage('/pagesT/unit/official?type=4', switchTab);
+					} else if (item.text == '员工') {
+						this.goPage('/pagesT/unit/official?type=5', switchTab);
+					} else if (item.text == '项目') {
+						this.goPage('/pagesT/unit/item', switchTab);
+					} else if (item.text == '会员') {
+						this.goPage('/pagesT/user/VipList',switchTab)
+					} else if (item.text == '股权') {
+						this.goPage('/pagesT/user/guquan', switchTab);
+					} else if (item.text == '共享股东') {
+						this.goPage('/pagesT/unit/official?type=3', switchTab);
+					} else if (item.text == '招商') {
+						this.goPage('/pagesT/unit/officialT?state=0', switchTab);
+					} else if (item.text == '招聘') {
+						this.goPage('/pagesT/unit/artdetail?type=1', switchTab);
+					}else {
+						this.goPage(url, switchTab);
+					}
+				}
+			}
+		}
+	};
+</script>
+
+<style scoped>
+	.NavBar {
+		padding: 32rpx 0 8rpx;
+		display: -webkit-flex;
+		display: flex;
+		width: 100%;
+		justify-content: space-between;
+		flex-wrap: wrap;
+	}
+
+	.nav-icon {
+		width: 88upx;
+		height: 88upx;
+		border-radius: 20rpx;
+		margin: 0 auto;
+		display: block;
+	}
+
+	.nav-text {
+		padding-top: 12upx;
+	}
+
+	.nav-li {
+		font-size: 24upx;
+		text-align: center;
+		font-weight: 400rpx;
+		margin-bottom: 24upx;
+	}
+</style>

+ 107 - 0
components/PageDesign/components/NavigationBar.vue

@@ -0,0 +1,107 @@
+<template>
+	<div>
+		<div class="page-head" :class="[modelData.style === 1 ? 'style-one' : modelData.style === 2 ? 'style-two' : 'style-three']" :style="style">
+			<div v-if="modelData.style === 2" :style="{ background: modelData.topBgColor }" class="circular"></div>
+		</div>
+		<u-navbar :background="{ background: background }" :title-color="modelData.textColor" :border-bottom="false" :is-back="false" :title="modelData.name">
+			<div class="address-div ellipsis" @click="openLocation">
+				<u-icon name="map-fill" color="#9fa8bd" size="30"></u-icon>
+				<span style="margin-left: 10rpx;">{{ location.districtName || '点击定位' }}</span>
+			</div>
+		</u-navbar>
+	</div>
+</template>
+
+<script>
+export default {
+	name: 'NavigationBar',
+	props: {
+		modelData: {
+			type: Object,
+			default: () => {
+				return {};
+			}
+		},
+		scrollTop: {
+			type: Number,
+			default: 0
+		}
+	},
+	computed: {
+		style() {
+			if (this.modelData.style === 3) {
+				return `background-color:${this.modelData.topBgColor};color:${this.modelData.textColor}`;
+			} else if (this.modelData.style === 1) {
+				return `background:linear-gradient(360deg,rgba(255, 255, 255, 0) 0%,${this.modelData.topBgColor} 100%,${this.modelData.topBgColor} 100%);color:${
+					this.modelData.textColor
+				}`;
+			} else {
+				return `color:${this.modelData.textColor}`;
+			}
+		},
+		location() {
+			return this.$store.state.locationObj;
+		},
+		background() {
+			if (this.modelData.style === 1) {
+				return this.$u.colorToRgba(this.$_utils.hexify(this.modelData.topBgColor), this.scrollTop/100)
+			} else {
+				return this.modelData.topBgColor;
+			}
+		}
+	},
+	methods: {
+		openLocation() {
+			this.$emit('openLocation');
+		}
+	}
+};
+</script>
+
+<style scoped lang="scss">
+.page-head {
+	// height: 226px;
+	height: 100vh;
+	width: 750rpx;
+	position: fixed;
+	top: 0;
+	left: 0;
+	width: 100%;
+}
+.style-two {
+	overflow: hidden;
+	.circular {
+		width: 140%;
+		height: 200px;
+		position: absolute;
+		left: -20%;
+		top: 0;
+		border-radius: 0 0 50% 50%;
+		background: #ec1c24;
+	}
+}
+.address-div {
+	position: absolute;
+	top: 50%;
+	transform: translateY(-50%);
+	padding: 0 10rpx;
+	left: 24rpx;
+	width: 180rpx;
+	height: 66rpx;
+	background: #ffffff;
+	border-radius: 66rpx;
+	line-height: 66rpx;
+	text-align: center;
+	font-size: 26rpx;
+	font-weight: 500;
+	border: 1px solid #eeeeee;
+	color: #111111;
+	-webkit-line-clamp: 1;
+}
+.style-one {
+	background: linear-gradient(360deg, rgba(255, 255, 255, 0) 0%, #ec1c24 100%);
+}
+.style-three {
+	background: #ec1c24;
+}
+</style>

+ 152 - 0
components/PageDesign/components/Notice.vue

@@ -0,0 +1,152 @@
+<template>
+	<view class="Notice-view blanck-pop clearfix" :style="{ backgroundColor: modelData.bgColor, margin: modelData.padding * 2 + 'rpx auto' }" v-if="noticeData.content">
+		<view @click="noticePop = true">
+			<view class="notice-icon float_left"><image src="https://onlineimg.qianniao.vip/noticeicon.png" mode="aspectFill"></image></view>
+			<view class="notice-main float_left">
+				<u-notice-bar
+					mode="horizontal"
+					padding="18rpx 0"
+					:volume-icon="false"
+					:font-size="28"
+					type="none"
+					:speed="50"
+					:color="modelData.textColor"
+					:border-radius="12"
+					:list="[noticeData.content]"
+				></u-notice-bar>
+			</view>
+		</view>
+		<u-popup
+			v-model="noticePop"
+			border-radius="18"
+			mode="center"
+			height="905"
+			:custom-style="{
+				background: 'rgba(0,0,0,0)'
+			}"
+		>
+			<view class="mag-view">
+				<view class="mag-top primary-bg"><image class="notice-i" src="https://onlineimg.qianniao.vip/notice-i.png" mode=""></image></view>
+				<view class="msg-cont">
+					<image class="msg-yun" src="https://onlineimg.qianniao.vip/notice-bg.png" mode=""></image>
+					<view class="mag-tit">{{ noticeData.title }}</view>
+					<scroll-view class="mag-main" scroll-y>{{ noticeData.content }}</scroll-view>
+				</view>
+				<view class="confirm-btn primary-btn-pain" @click="noticePop = false">我知道了</view>
+			</view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+export default {
+	name: 'Notice',
+	props: {
+		modelData: {
+			type: Object,
+			default: () => {
+				return {};
+			}
+		},
+		noticeData: {
+			type: Object,
+			default: () => {
+				return {};
+			}
+		}
+	},
+	data() {
+		return {
+			noticePop: false
+		};
+	},
+	methods: {
+		openPop() {
+			this.noticePop = true;
+		},
+		closePop() {
+			this.noticePop = false;
+		}
+	}
+};
+</script>
+<style scoped lang="scss">
+.Notice-view {
+	width: 710upx;
+	padding-right: 24upx;
+	margin: 10upx auto;
+	background-color: #ffffff;
+	border-radius: 64upx;
+	.notice-icon {
+		width: 72upx;
+		text-align: center;
+		line-height: 64upx;
+		height: 64upx;
+		image {
+			width: 30rpx;
+			height: 32rpx;
+			vertical-align: middle;
+			transform: translate(10rpx, 4rpx);
+		}
+	}
+	.notice-main {
+		width: 608upx;
+	}
+}
+
+.mag-view {
+	text-align: center;
+	transform: translateY(100rpx);
+	background-color: #ffffff;
+	width: 612rpx;
+	border-radius: 18rpx;
+	padding-bottom: 46rpx;
+	.mag-top {
+		height: 242rpx;
+		border-radius: 18rpx;
+		background-color: $uni-color-primary;
+		width: 100%;
+		position: relative;
+		.notice-i {
+			width: 422rpx;
+			height: 312rpx;
+			position: absolute;
+			top: -100rpx;
+			left: 140rpx;
+		}
+	}
+	.msg-cont {
+		padding: 0 50rpx;
+		padding-top: 56rpx;
+		position: relative;
+		.msg-yun {
+			position: absolute;
+			width: 622rpx;
+			height: 215rpx;
+			left: 0;
+			top: -116rpx;
+			z-index: 1;
+		}
+		.mag-main {
+			height: 200rpx;
+		}
+		.mag-tit {
+			position: relative;
+			z-index: 9;
+			font-size: 38upx;
+			font-weight: bold;
+			padding-bottom: 30rpx;
+		}
+	}
+	.confirm-btn {
+		line-height: 90rpx;
+		height: 90rpx;
+		font-size: 34rpx;
+		width: 506rpx;
+		margin: 30rpx auto 0;
+		border: 1px solid $uni-color-primary;
+		color: $uni-color-primary;
+		border-radius: 12rpx;
+	}
+}
+</style>

+ 82 - 0
components/PageDesign/components/Search.vue

@@ -0,0 +1,82 @@
+<template>
+	<view class="search-box" @click="goPage('/pagesT/search/index')">
+		<view class="search-in" :style="{ textAlign: modelData.textStyle, borderRadius: modelData.boxStyle === 3 ? '80rpx' : modelData.boxStyle === 2 ? '10rpx' : '0' }">
+			<text class="ibonfont ibonsousuo1 primary-color"></text>
+			<text>{{ modelData.tipText }}</text>
+		</view>
+	</view>
+</template>
+
+<script>
+
+export default {
+	props: {
+		fixed: {
+			type: Boolean,
+			default: false
+		},
+		modelData: {
+			type: Object,
+			default: () => {
+				return {
+					tipText: '请输入关键词',
+					boxStyle: '1',
+					textStyle: 'center'
+				};
+			}
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.search-box {
+	padding: 20upx 0;
+	.search-in {
+		background: #fff;
+		width: 710upx;
+		margin: 0 auto;
+		height: 70upx;
+		line-height: 70upx;
+		font-size: 24upx;
+		color: #999;
+		font-weight: 300;
+		padding: 0 20upx;
+		border-radius: 10upx;
+		.ibonfont {
+			vertical-align: middle;
+			margin-right: 10upx;
+		}
+	}
+}
+
+.nav-center {
+	padding: 16upx 0;
+	color: #9c9c9c;
+	text-align: left;
+	.like-input {
+		width: 540upx;
+		/* #ifdef APP-PLUS||H5 */
+		margin: 0 auto;
+		/* #endif */
+		/* #ifdef MP */
+		margin-left: 10upx;
+		/* #endif */
+		background: #fff;
+		height: 56upx;
+		line-height: 56upx;
+		border-radius: 56upx;
+		font-size: 20upx;
+		.icon-sousuo {
+			font-size: 24upx;
+			padding-left: 23upx;
+			padding-right: 13upx;
+			vertical-align: middle;
+		}
+		span {
+			font-weight: 300;
+			vertical-align: middle;
+		}
+	}
+}
+</style>

+ 72 - 0
components/PageDesign/components/shopInfo.vue

@@ -0,0 +1,72 @@
+<template>
+	<div
+		class="clearfix shop-info"
+		:style="{
+			color: modelData.color,
+			backgroundColor: modelData.bgColor
+		}"
+	>
+		<div class="float_left"><image :src="modelData.image.url" mode="aspectFill" class="shop-logo"></image></div>
+		<div class="float_left">
+			<p class="shop-name">{{storeData.name}}</p>
+			<!-- <p class="shop-num">9999人关注</p> -->
+		</div>
+		<!--div class="float_right college-btn">
+      <text class="ibonfont ibonshoucang3"></text>
+      <span style="margin-left: 3px">关注</span>
+    </div-->
+	</div>
+</template>
+
+<script>
+export default {
+	name: 'ShopInfo',
+	props: {
+		modelData: {
+			type: Object,
+			default: () => {
+				return {};
+			}
+		},
+		storeData: {
+			type: Object,
+			default: () => {
+				return {};
+			}
+		}
+	},
+	data() {
+		return {};
+	}
+};
+</script>
+
+<style scoped lang="scss">
+.shop-info {
+	padding: 20rpx 24rpx;
+	.shop-logo {
+		width: 88rpx;
+		height: 88rpx;
+		border-radius: 8rpx;
+		display: block;
+		margin-right: 20rpx;
+	}
+	.shop-name{
+		line-height: 88rpx;
+		font-weight: bold;
+	}
+	.shop-num {
+		font-size: 24rpx;
+		padding-top: 10rpx;
+	}
+	.college-btn {
+		font-size: 24rpx;
+		padding: 0 20rpx;
+		line-height: 60rpx;
+		background-color: #ff4400;
+		color: #ffffff;
+		border-radius: 8rpx;
+		transform: translateY(14rpx);
+	}
+}
+</style>

+ 449 - 0
components/SelSkuPop.vue

@@ -0,0 +1,449 @@
+<template>
+	<view class="blanck-pop">
+		<u-popup
+			:custom-style="{
+				background: 'rgba(0,0,0,0)'
+			}"
+			:value="isShow"
+			:mask-close-able="false"
+			mode="bottom"
+		>
+			<view class="detail-box">
+				<view class="detail-view">
+					<view class="close-icon"><u-icon @click="closeaddcartPop" name="close" color="#EAEAEA" size="32"></u-icon></view>
+					<view class="goods-view clearfix">
+						<view class="float_left"><image class="goods-img" :src="goods_detail.images[0]" mode="aspectFill"></image></view>
+						<view class="float_right goods-info">
+							<view class="goods-name ellipsis">{{ goods_detail.title || '' }}</view>
+							<view class="goods-desc">
+								<block v-if="baseSet.stockDisplay === 5">
+									<!-- 总库存大于0 且 支持负库存销售 显示【有货】 -->
+									<text class="goods-desc-text">
+										总库存:{{ Math.floor(goods_detail.inventoryTotal) > 0 || goods_detail.isDistribution === 5 ? '有货' : '库存不足' }}
+									</text>
+								</block>
+								<block v-if="baseSet.stockDisplay === 6">
+									<!-- 负库存销售即使没有库存也 显示【有货】 -->
+									<text class="goods-desc-text" v-if="goods_detail.isDistribution === 5">总库存:{{ Math.floor(goods_detail.inventoryTotal) || '有货' }}</text>
+									<text class="goods-desc-text" v-else>总库存:{{ Math.floor(goods_detail.inventoryTotal) || '库存不足' }}</text>
+								</block>
+								<text class="goods-desc-text">已售:{{ goods_detail.salesNum || 0 }}</text>
+							</view>
+						</view>
+					</view>
+					<scroll-view scroll-y="true" style="max-height: 700rpx;">
+						<view class="sku-ul">
+							<view class="sku-li" v-for="(item, index) in specMultiple" :key="index">
+								<view class="sku-name ellipsis">
+									{{ item.unitName }}
+									<text style="margin-left: 8rpx;" v-for="(sku, skuI) in item.specGroup" :key="skuI">{{ sku.specValueName }}</text>
+								</view>
+								<view class="sku-desc">
+									<!-- 库存大于0 且 支持负库存销售 显示【有货】 -->
+									<text class="sku-desc-text" v-if="baseSet.stockDisplay === 5">
+										库存:{{ Math.floor(item.inventory) > 0 || goods_detail.isDistribution === 5 ? '有货' : '库存不足' }}
+									</text>
+									<text class="sku-desc-text" v-if="baseSet.stockDisplay === 6">
+										<!-- 负库存销售即使没有库存也 显示【有货】 -->
+										<block v-if="goods_detail.isDistribution === 5 && Math.floor(item.inventory) <= 0">库存:有货</block>
+										<block v-else>库存:{{ Math.floor(item.inventory) }}{{ item.unitName }}</block>
+									</text>
+									<text class="sku-desc-text" v-if="item.setNum > 1">{{ item.setNum }}{{ item.unitName }}起购</text>
+									<text class="sku-desc-text" v-if="item.isMaster === 4">
+										1{{ item.unitName }}{{ goodsDetail.isEq === 5 ? '≈' : '=' }}{{ Number(item.conversion) }}{{ goods_detail.unitName }}
+									</text>
+								</view>
+								<view class="sku-price clearfix ">
+									<!-- 阶梯价 -->
+									<block v-if="!showGoodsPrice">
+										<view class="float_left ladder-ul" v-if="item.enabledLadder === 1">
+											<view class="ladder-li" v-for="(ladder, ladderI) in item.ladderPrice" :key="ladderI">
+												<view class="price-text clearfix primary-color">
+													<view class="float_left rmb-icon">¥</view>
+													<rich-text class="float_left" :nodes="$_utils.splitPrice(ladder.price)"></rich-text>
+												</view>
+												<view class="num-region" v-if="ladderI + 1 === item.ladderPrice.length">≥{{ ladder.from }}{{ item.unitName }}</view>
+												<view class="num-region" v-else>{{ ladder.from }}~{{ ladder.to }}{{ item.unitName }}</view>
+											</view>
+										</view>
+										<!-- 非阶梯价 -->
+										<view v-else class="float_left clearfix primary-color price-text">
+											<view class="float_left rmb-icon">¥</view>
+											<rich-text class="float_left" :nodes="$_utils.splitPrice(item.salePrice)"></rich-text>
+										</view>
+									</block>
+									<block v-else>
+										<text class="showGoodsPrice primary-color">{{ showGoodsPrice }}</text>
+									</block>
+									<view class="vip-price float_left clearfix" v-if="item.memberPrice > 0">
+										<view class="price-text">¥{{ item.memberPrice }}</view>
+										<view class="price-bs">VIP</view>
+									</view>
+									<!-- 步进器 -->
+									<view class="num-edit-view float_right">
+										<view class="subr-view p-background-img " :class="[item.buy_num <= 0 ? 'disabled-color' : '']" @click="delNum(index)">
+											<u-icon size="28" name="minus"></u-icon>
+										</view>
+										<view class="buy-num-input-view">
+											<input type="number" @blur="buyNumInput($event, index)" class="buy-num-input" :value="item.buy_num" />
+										</view>
+										<!-- 数量大于库存或者当前商品不支持负库存销售 则当前加号按钮禁用-->
+										<view
+											class="plus-view p-background-img"
+											:class="[item.buy_num >= Math.floor(item.inventory) && goods_detail.isDistribution !== 5 ? 'disabled-color' : '']"
+											@click="plusNum(index)"
+										>
+											<u-icon size="28" name="plus"></u-icon>
+										</view>
+									</view>
+								</view>
+							</view>
+						</view>
+					</scroll-view>
+
+					<view class="sub-btn p-background-img">加入购物车</view>
+				</view>
+			</view>
+		</u-popup>
+
+		<NoLoginTip @cancel="cancelTip" :show="loginTip" v-if="loginTip" />
+	</view>
+</template>
+
+<script>
+import NoLoginTip from './NoLoginTip.vue';
+export default {
+	components: {
+		NoLoginTip
+	},
+	props: {
+		selAddress: {
+			type: Object,
+			default: () => {
+				return {};
+			}
+		},
+		isShow: {
+			type: Boolean,
+			default: false
+		},
+		goodsId: {
+			type: [Number, String],
+			default: 0
+		},
+		isList: {
+			type: Boolean,
+			default: true
+		},
+		skuId: {
+			type: [Number, String],
+			default: ''
+		}
+	},
+	computed: {
+		hasLogin() {
+			return this.$store.state.hasLogin;
+		},
+		baseSet() {
+			return this.$store.state.baseSet;
+		},
+		userStatus() {
+			return this.$store.state.userStatus;
+		},
+		showGoodsPrice() {
+			if (this.baseSet.goodsPrice === 5 && this.hasLogin) {
+				return '';
+			} else if (!this.hasLogin && this.baseSet.goodsPrice === 4) {
+				return '请登录';
+			} else if (this.userStatus.enableStatus === 4 && this.baseSet.goodsPrice === 4) {
+				return '已禁用';
+			} else if (this.userStatus.status !== 2 && this.baseSet.goodsPrice === 4) {
+				if (this.userStatus.status === 0) {
+					return '待审核';
+				} else if (this.userStatus.status === 1) {
+					return '审核中';
+				} else if (this.userStatus.status === 3) {
+					return '已驳回';
+				}
+			} else {
+				return '';
+			}
+		}
+	},
+	watch: {
+		goodsId(val) {
+			if (this.isShow) {
+				this.goods_detail = {};
+				this.specMultiple = [];
+				this.getGoodsDetail();
+			}
+		}
+	},
+	data() {
+		return {
+			eq_sku_kg: {},
+			isLogin: true, // 判断是否登录
+			loginTip: false,
+			goods_detail: {
+				images: [],
+				specGroup: [],
+				unitData: []
+			},
+			spec_id_group: [],
+			now_sku_data: {},
+			buy_num: 1,
+			now_sel_address: {},
+			address_data: {}, // 客户地址数据
+			not_dispatch_areas: {}, // 该商品不能配送区域
+			is_not_express: true, // 当前选择区域是否能够配送
+			activityId: '',
+			specMultiple: []
+		};
+	},
+	methods: {
+		// 请求商品品详情
+		async getGoodsDetail() {
+			this.$u.api.getGoodsDetail(this.goodsId).then(res => {
+				this.goods_detail = res.data;
+				this.specMultiple = res.data.specMultiple.map(item => {
+					return {
+						...item,
+						buy_num: 0
+					};
+				});
+			});
+		},
+		// 关闭加入购物车弹窗
+		closeaddcartPop() {
+			this.$emit('close', false);
+		},
+		// 减号按钮
+		delNum(index) {
+			let target = this.$u.deepClone(this.specMultiple);
+			if (target[index].buy_num > 0) {
+				// 当前数量为起订量的时候,点击减号按钮直接设置成0
+				if (target[index].setNum > 1 && target[index].buy_num === target[index].setNum) {
+					target[index].buy_num = 0;
+				} else {
+					target[index].buy_num = target[index].buy_num - 1;
+				}
+			}
+			this.specMultiple = target;
+		},
+		// 加号按钮
+		plusNum(index) {
+			let target = this.$u.deepClone(this.specMultiple);
+			// 数量小于库存或者当前商品支持负库存销售,则可以继续添加数量
+			if (target[index].buy_num < Math.floor(target[index].inventory) || this.goods_detail.isDistribution === 5) {
+				if (target[index].buy_num < 1) {
+					// 当前数量为0的时候,第一次加起订量
+					target[index].buy_num += target[index].setNum;
+				} else {
+					target[index].buy_num += 1;
+				}
+			}
+			this.specMultiple = target;
+		},
+		// 输入框失去焦点
+		buyNumInput(e, index) {
+			let target = this.$u.deepClone(this.specMultiple);
+			target[index].buy_num = e.detail.value - 0;
+			// 数量小于库存或者当前商品支持负库存销售,则可以继续添加数量
+			if (target[index].buy_num >= Math.floor(target[index].inventory) && this.goods_detail.isDistribution !== 5) {
+				this.$u.toast('库存不足,已为您修正');
+				this.$nextTick(() => {
+					target[index].buy_num = Math.floor(target[index].inventory);
+				});
+			}
+			this.specMultiple = target;
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.detail-box {
+	padding-top: 34rpx;
+	.detail-view {
+		padding: 0 32rpx 32rpx;
+		background-color: #ffffff;
+		position: relative;
+		.close-icon {
+			position: absolute;
+			right: 32rpx;
+			top: 30rpx;
+		}
+		.goods-view {
+			.goods-img {
+				display: block;
+				transform: translateY(-34rpx);
+				width: 176rpx;
+				height: 176rpx;
+				background: #f5f7f7;
+				border-radius: 8rpx;
+			}
+			.goods-info {
+				width: calc(100% - 188rpx);
+				padding-top: 24rpx;
+				padding-right: 58rpx;
+				.goods-name {
+					width: 100%;
+					color: #111111;
+					font-size: 28rpx;
+					font-weight: 500;
+					line-height: 40rpx;
+					margin-bottom: 8rpx;
+					-webkit-line-clamp: 1;
+					height: 40rpx;
+				}
+				.goods-desc {
+					color: #9d9d9d;
+					font-size: 20rpx;
+					.goods-desc-text{
+						margin-right: 8rpx;
+					}
+				}
+			}
+		}
+		.sub-btn {
+			width: 686rpx;
+			height: 80rpx;
+			background: linear-gradient(90deg, #fe923e 0%, #ff3724 100%);
+			border-radius: 40rpx;
+			line-height: 80rpx;
+			text-align: center;
+			margin: 56rpx auto 0;
+			color: #ffffff;
+			font-size: 32rpx;
+			font-weight: 500;
+		}
+		.sku-ul {
+			.sku-li {
+				padding: 24rpx 0;
+				border-bottom: 1px solid #eeeeee;
+				&:last-child {
+					border-bottom: 0 none;
+				}
+				.sku-name {
+					width: 100%;
+					color: #111111;
+					font-size: 28rpx;
+					font-weight: 500;
+					line-height: 40rpx;
+					margin-bottom: 8rpx;
+					-webkit-line-clamp: 1;
+					height: 40rpx;
+				}
+				.sku-desc {
+					color: #9d9d9d;
+					font-size: 20rpx;
+					.sku-desc-text {
+						margin-right: 8rpx;
+					}
+				}
+				.sku-price {
+					.ladder-ul {
+						display: flex;
+						width: 432rpx;
+						.ladder-li {
+							position: relative;
+							flex: 3;
+							.num-region {
+								font-size: 22rpx;
+								color: #9d9d9d;
+								font-weight: 500;
+								margin-top: 8rpx;
+							}
+						}
+					}
+					.price-text {
+						font-size: 32rpx;
+						font-family: DIN-Medium;
+						padding-top: 16rpx;
+						.rmb-icon {
+							font-size: 20rpx;
+							margin-top: 12rpx;
+						}
+					}
+					.vip-price {
+						margin-left: 20upx;
+						margin-top: 18upx;
+						line-height: 32rpx;
+						height: 32rpx;
+						border-radius: 4rpx;
+						overflow: hidden;
+						font-family: DINPro-Regular;
+
+						.price-text {
+							min-width: 80rpx;
+							text-align: center;
+							float: left;
+							vertical-align: middle;
+							font-size: 20rpx;
+							color: #ffdfa2;
+							background: linear-gradient(270deg, #1e5657 0%, #0d2b2c 100%);
+							padding: 0 8rpx;
+						}
+
+						.price-bs {
+							text-align: center;
+							float: left;
+							vertical-align: middle;
+							width: 32rpx;
+							background-color: #ffdfa2;
+							font-size: 16rpx;
+							color: #2c7564;
+							font-family: DIN-Medium;
+						}
+					}
+					.num-edit-view {
+						text-align: center;
+						display: inline-flex;
+						align-items: center;
+
+						.buy-num-input-view {
+							display: flex;
+							position: relative;
+							text-align: center;
+							padding: 0;
+							justify-content: center;
+							align-items: center;
+							margin: 0 16rpx;
+							flex-direction: row;
+
+							.buy-num-input {
+								width: 104upx;
+								text-align: center;
+								font-family: DIN-Medium;
+								line-height: 48upx;
+								height: 48upx;
+								font-size: 26upx;
+								color: #111111;
+								background: rgba(202, 202, 202, 0.39);
+								border-radius: 6rpx;
+							}
+						}
+
+						.subr-view,
+						.plus-view {
+							justify-content: center;
+							align-items: center;
+							flex-direction: row;
+							display: flex;
+							margin-top: 0upx;
+							width: 48rpx;
+							height: 48rpx;
+							line-height: 48rpx;
+							color: #ffffff;
+							border-radius: 100%;
+						}
+						.disabled-color {
+							background-image: linear-gradient(90deg, rgba(202, 202, 202, 0.39) 0%, rgba(202, 202, 202, 0.39) 100%) !important;
+						}
+					}
+				}
+			}
+		}
+	}
+}
+</style>

+ 60 - 0
components/Tabbar/index.vue

@@ -0,0 +1,60 @@
+<template>
+	<u-tabbar :value="value" :list="tabbar_list" :active-color="activeColor" :border-top="false"></u-tabbar>
+</template>
+
+<script>
+export default {
+	model: {
+		props: 'value'
+	},
+	props: {
+		value: {
+			type: Number,
+			default: 0
+		}
+	},
+	computed: {
+		tabbar_list() {
+			return [
+				{
+					iconPath: this.$store.state.baseurl + '/img/user/' + 'home.png',
+					// selectedIconPath: 'https://onlineimg.qianniao.vip/tar-home-' + this.theme + '.png',
+					selectedIconPath: this.$store.state.baseurl + '/img/user/' + 'home-action.png',
+					text: '首页',
+					customIcon: false,
+					pagePath: '/pages/index/index'
+				},
+				{
+					iconPath: this.$store.state.baseurl + '/img/user/' + 'cate.png',
+					selectedIconPath: this.$store.state.baseurl + '/img/user/' + 'cate-action.png',
+					text: '分类',
+					customIcon: false,
+					pagePath: '/pages/classification/cate'
+				},
+				{
+					iconPath: this.$store.state.baseurl + '/img/user/' + 'cart.png',
+					selectedIconPath: this.$store.state.baseurl + '/img/user/' + 'cart-action.png',
+					text: '购物车',
+					customIcon: false,
+					// 红色角标显示的数字,如果需要移除角标,配置此参数为0即可
+					count: this.$store.state.cartNum,
+					pagePath: '/pages/cart/cart'
+				},
+				{
+					iconPath: this.$store.state.baseurl + '/img/user/' + 'user.png',
+					selectedIconPath: this.$store.state.baseurl + '/img/user/' + 'user-action.png',
+					text: '我的',
+					customIcon: false,
+					pagePath: '/pages/user/user'
+				}
+			];
+		},
+		activeColor() {
+			return this.$store.state.baseSet.themeStyle.color_o || '#FD463E';
+			// return '#FD463E';
+		}
+	}
+};
+</script>
+
+<style></style>

+ 52 - 0
components/empty/index.vue

@@ -0,0 +1,52 @@
+<template>
+	<view class="empty-view" :style="{ left: left }">
+		<image :src="src" mode="aspectFit" class="empty-img"></image>
+		<view class="empty-text">{{ text }}</view>
+		<view v-if="!isLogin">
+			<Login></Login>
+		</view>
+	</view>
+</template>
+
+<script>
+	import Login from '@/components/Login.vue';
+export default {
+	components:{Login},
+	computed:{
+		isLogin() {
+			return this.$store.state.hasLogin;
+		},
+	},
+	props: {
+		left: {
+			type: String,
+			default: '0'
+		},
+		text: {
+			type: String,
+			default: '没有数据哦~~'
+		},
+		src: {
+			type: String,
+			default: 'https://onlineimg.qianniao.vip/address.png'
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.empty-view {
+	width: 100%;
+	text-align: center;
+	margin-top: 200upx;
+	.empty-img {
+		width: 200rpx;
+		height: 200rpx;
+	}
+	.empty-text {
+		font-size: 26upx;
+		color: #999999;
+		padding-top: 10rpx;
+	}
+}
+</style>

+ 310 - 0
components/its-calendar/its-calendar.vue

@@ -0,0 +1,310 @@
+<template>
+	<view>
+		<view class="calendar">
+			<scroll-view scroll-x="true" class="top-wrap">
+				<view class="time-wrap" v-for="(dayitem,dayindex) in dayArr" :key="dayindex"
+					:class="{'action':day_index ==dayindex }" @click.stop="dayList(dayitem,dayindex)">
+					<text class="time-val">{{dayitem.days}}</text>
+					<text class="time-xq">{{dayitem.weeks}}</text>
+				</view>
+			</scroll-view>
+			<view scroll-y class="calendar_time">
+				<view class="time_x" :class="host_index == item.timeStamp ? 'time_x_sty' : ''"
+					v-for="(item, index) in hostArr[day_index]" :key="index"
+					@click="nowTimes < item.timeStamp ? hosts(item) : ''"
+					:style="{'color': (nowTimes > item.timeStamp ? '#999999' : '')}">{{item.hours}}</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			sta_num: {
+				type: Number | String,
+				default: 8
+			},
+			end_num: {
+				type: Number | String,
+				default: 23
+			},
+			int_num: {
+				type: Number | String,
+				default: 30
+			},
+		},
+		watch: {
+			sta_num(xin,low) {
+				console.log('改变了')
+				this.sxym()
+			}
+		},
+		data() {
+			return {
+				dayArr: [],
+				hostArr: [],
+				day_index: 0,
+				host_index: '',
+				host_All: [],
+				nowTimes: '',
+			}
+		},
+		mounted() {
+			this.sxym()
+		},
+		methods: {
+			sxym() {
+				console.log('执行获取',this.sta_num,this.end_num)
+				try{
+					let dateArr = [];
+					let today = new Date();
+					let nowTime = today.getTime() // 当前时间戳
+					this.nowTimes = parseInt(nowTime / 1000)
+					for (let i = 0; i < 6; i++) {
+						let newDate = new Date(today.getTime() + i * 1000 * 60 * 60 * 24);
+						let month = (parseInt(newDate.getMonth()) + 1) > 9 ? (parseInt(newDate.getMonth()) + 1) : "0" + (parseInt(
+							newDate.getMonth()) + 1); // 当前月份
+						let day = (newDate.getDate()) > 9 ? newDate.getDate() : "0" + newDate.getDate(); //当前日期
+						let backTime = newDate.getTime(); // 几天后时间戳
+						let backDays = newDate.getDay(); // 几天后周几
+						let remTime = (backTime - nowTime) / 1000; // 距离今天几天
+						let week = '';
+						// if (remTime == 0) {
+						// 	week = "今天"
+						// } else if (remTime == 86400) {
+						// 	week = "明天"
+						// } else if (remTime == 172800) {
+						// 	week = "后天"
+						// } else {
+						if (backDays == 0) {
+							week = "周日";
+						} else if (backDays == 1) {
+							week = "周一";
+						} else if (backDays == 2) {
+							week = "周二";
+						} else if (backDays == 3) {
+							week = "周三";
+						} else if (backDays == 4) {
+							week = "周四";
+						} else if (backDays == 5) {
+							week = "周五";
+						} else if (backDays == 6) {
+							week = "周六";
+						}
+						// }
+						// let fullDate = `${month}-${day}`;
+						let fullDate = `${day}`;
+						let ass = {
+							weeks: week,
+							days: fullDate
+						};
+						dateArr.push(ass);
+					}
+					this.dayArr = dateArr;
+					
+					let timeArr = [];
+					for (let i = 0; i < 6; i++) {
+						// let as = new Date(new Date().toLocaleDateString()).getTime() / 1000
+						let as = new Date(new Date().toLocaleDateString()).getTime() / 1000 + i * 60 * 60 * 24;
+						let staTime = this.sta_num * 60 * 60 + as;
+						let endTime = this.end_num * 60 * 60 + as;
+						let int = this.int_num * 60;
+						let timeArr_s = [];
+						for (staTime; staTime < endTime - int; staTime + int) {
+							staTime = staTime + int;
+							let hours = this.times(staTime);
+							let asb = {
+								hours,
+								timeStamp: staTime
+							};
+							timeArr_s.push(asb);
+						}
+						timeArr.push(timeArr_s);
+					}
+					this.hostArr = timeArr;
+					console.log(this.hostArr,'hostArr')
+				}catch(e){
+					//TODO handle the exception
+					console.log(e)
+				}
+				
+			},
+			// 点击日期
+			dayList(e, index) {
+				this.day_index = index;
+			},
+			// 点击时间
+			hosts(e) {
+				this.host_All = e;
+				this.host_index = e.timeStamp;
+				this.sub()
+			},
+			// 点击立即预约
+			sub() {
+				if (this.host_index == '') {
+					this.$tool.toast('请选择时间');
+				} else {
+					let day = this.dayArr[this.day_index];
+					let time = this.time(this.host_index);
+					let comTime = {
+						days: day.days,
+						weeks: day.weeks,
+						hours: this.host_All.hours,
+						timeStamp: this.host_All.timeStamp,
+						time: time
+					};
+					this.$emit('getTime', comTime);
+				}
+			},
+			// 格式化时间
+			times(data) {
+				let date = new Date(data * 1000);
+				//时间戳为10位需*1000,时间戳为13位的话不需乘1000
+				let h = date.getHours();
+				h = h < 10 ? ('0' + h) : h; //小时补0
+				let m = date.getMinutes();
+				m = m < 10 ? ('0' + m) : m; //分钟补0
+				return h + ':' + m;
+			},
+			time(data, type) {
+				let date = new Date(data * 1000);
+				//时间戳为10位需*1000,时间戳为13位的话不需乘1000
+				let y = date.getFullYear();
+				let MM = date.getMonth() + 1;
+				MM = MM < 10 ? ('0' + MM) : MM; //月补0
+				let d = date.getDate();
+				d = d < 10 ? ('0' + d) : d; //天补0
+				let h = date.getHours();
+				h = h < 10 ? ('0' + h) : h; //小时补0
+				let m = date.getMinutes();
+				m = m < 10 ? ('0' + m) : m; //分钟补0
+				let s = date.getSeconds();
+				s = s < 10 ? ('0' + s) : s; //秒补0
+				if (type == 'yymmdd') {
+					return y + '-' + MM + '-' + d;
+				} else if (type == 'hhmmss') {
+					return h + ':' + m + ':' + s;
+				} else {
+					return y + '-' + MM + '-' + d + ' ' + h + ':' + m + ':' + s;
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background-color: #F4F4F4;
+	}
+
+	.calendar {
+		width: 710rpx;
+		height: 590rpx;
+		background-color: #FFFFFF;
+		margin: 20rpx auto 10rpx;
+		border-radius: 8rpx;
+	}
+
+	.calendar_day {
+		display: flex;
+		width: 100%;
+		height: 120rpx;
+
+		.day_x {
+			display: flex;
+			// flex-flow: column nowrap;
+			flex-flow: nowrap;
+			justify-content: center;
+			align-items: center;
+			width: 20%;
+			height: 100%;
+			font-size: 30rpx;
+			color: #333333;
+		}
+	}
+
+	.calendar_time {
+		display: flex;
+		width: 100%;
+		height: 448rpx;
+		flex-flow: row wrap;
+		align-content: flex-start;
+		margin: 20rpx 0;
+		overflow-y: auto;
+
+		.time_x {
+			display: flex;
+			flex-flow: row;
+			justify-content: center;
+			align-items: center;
+			width: 20%;
+			height: 54rpx;
+			border-radius: 26rpx;
+			margin: 10rpx 0;
+			font-size: 30rpx;
+			color: #333333;
+		}
+
+		.time_x_sty {
+			background-color: #262261;
+			color: #fff !important;
+		}
+	}
+
+	.sub {
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		width: 710rpx;
+		height: 100rpx;
+		border-radius: 50rpx;
+		margin: 30rpx auto;
+		color: #FFFFFF;
+		font-size: 36rpx;
+		// background-color: #FE3B3C;
+	}
+
+	.top-wrap {
+
+		white-space: nowrap;
+		width: 700rpx;
+		// height: 100rpx;
+		padding: 20rpx 0;
+
+		.time-wrap {
+			margin: auto 15rpx;
+			display: inline-block;
+			width: 158rpx;
+			height: 63rpx;
+			border-radius: 32rpx;
+			line-height: 63rpx;
+			text-align: center;
+			background-color: #FDF9FA;
+
+			.time-xq {
+				font-size: 22rpx;
+				font-weight: 500;
+				color: #999999;
+			}
+
+			.time-val {
+				font-size: 32rpx;
+				font-weight: bold;
+				color: #333333;
+			}
+		}
+
+		.action {
+			background-color: #262261;
+
+			.time-xq {
+				color: #FDF9FA;
+			}
+
+			.time-val {
+				color: #FDF9FA;
+			}
+		}
+	}
+</style>

+ 220 - 0
components/setMealMore.vue

@@ -0,0 +1,220 @@
+<template>
+	<view>
+		<u-popup :value="isShow" mode="bottom" :mask-close-able="false" :border-radius="12">
+			<view class="set_more">
+				<view class="more clearfix">
+					<view class="float_left">
+						<text class="title">组合套餐</text>
+						<text class="tip">{{total}}组套餐,最多可省¥{{combinedPackage[0].originPrice - combinedPackage[0].price - 0}}</text>
+					</view>
+					<text class="ibonfont ibonguanbi close-icon float_right" @click="closeaddcartPop"></text>
+				</view>
+				<scroll-view scroll-y="true" style="height: 600rpx;">
+					<view class="group-ul">
+						<view class="group-li clearfix" v-for="item,index in combinedPackage" :key="index" @click="goPage('/pageT/goodsGroup/goodsGroupDetail?goodsid=' + goods_id +'&shopid=' + item.shopId+'&index='+index)">
+							<view class="float_left">
+								<scroll-view scroll-x="true" class="left-scroll">
+									<view class="goods-ul">
+										<view class="goods-li" v-for="item1,index1 in item.goodsData" :key="index1">
+											<image :src="item1.images[0]" mode="aspectFill"></image>
+											<view class="goods-name ellipsis">{{item1.title}}</view>
+										</view>
+									</view>
+								</scroll-view>
+							</view>
+							<view class="float_left dy-icon">
+								<text class="ibonfont ibonicon"></text>
+							</view>
+							<view class="float_left price-right">
+								<view class="group-price">
+									<text>套餐价</text>
+									<text class="primary-color">¥{{item.price}}</text>
+								</view>
+								<view class="save-price primary-color">
+									可省¥{{item.originPrice - item.price - 0}}
+								</view>
+								<view class="buy-btn primary-bg">
+									立即购买
+								</view>
+							</view>
+						</view>
+					</view>
+				</scroll-view>
+			</view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			isShow: {
+				type: Boolean,
+				default: false
+			},
+			goods_id: {
+				type: [Number, String],
+				default: 0,
+			},
+			shopId: {
+				type: [Number, String],
+				default: 0
+			},
+		},
+		data() {
+			return {
+				total: 0,
+				combinedPackage: []
+			}
+		},
+		watch:{
+			isShow(val){
+				if(val){
+					this.listsApiComBinPackage()
+				}
+			}
+		},
+		created() {
+			// this.listsApiComBinPackage()
+		},
+		methods: {
+			// 关闭弹窗
+			closeaddcartPop() {
+				this.$emit('close', false);
+				console.log(this.goodsId, this.shopId)
+			},
+			async listsApiComBinPackage() {
+				const {
+					data
+				} = await this.$u.api.listsApiComBinPackage({
+					page: 1,
+					pageSize: 10,
+					shopId: this.shopId,
+					goodsId: this.goodsId
+				})
+				this.combinedPackage = data
+				this.total = data.length
+				console.log(data)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.set_more {
+		height: 700rpx;
+		background-color: #f5f9fc;
+
+		.more {
+			height: 80rpx;
+			line-height: 80rpx;
+			padding: 0 30rpx;
+			background-color: #fff;
+
+			.title {
+				font-weight: 560;
+			}
+
+			.tip {
+				color: #999;
+				font-size: 24rpx;
+				margin-left: 10rpx;
+			}
+
+			.close-icon {
+				color: #999;
+				font-size: 40upx;
+			}
+		}
+
+		.group-ul {
+			padding: 20rpx;
+
+			.group-li {
+				background-color: #FFFFFF;
+				border-radius: 12rpx;
+				padding: 20rpx;
+				margin-bottom: 20rpx;
+
+				.float_left {
+					.left-scroll {
+						width: 430rpx;
+						white-space: nowrap;
+
+						.goods-li {
+							display: inline-block;
+							vertical-align: middle;
+
+							image {
+								display: block;
+								width: 150rpx;
+								height: 150rpx;
+								border-radius: 10rpx;
+								margin: 0 auto;
+							}
+
+							text-align: center;
+
+							.goods-name {
+								width: 150rpx;
+								height: 36rpx;
+								line-height: 36rpx;
+								margin-top: 10rpx;
+								font-size: 24rpx;
+								-webkit-line-clamp: 1;
+							}
+						}
+
+						.plus-icon {
+							vertical-align: middle;
+							display: inline-block;
+							line-height: 150rpx;
+							padding: 0 10rpx;
+							height: 200rpx;
+						}
+					}
+				}
+
+				.dy-icon {
+					padding: 0 10rpx;
+					line-height: 150rpx;
+					padding: 0 10rpx;
+					height: 200rpx;
+					color: #cecece;
+
+					.ibonicon {
+						font-size: 26rpx;
+					}
+				}
+
+				.price-right {
+					color: #666666;
+					font-size: 24rpx;
+					text-align: center;
+					width: 190rpx;
+
+					.group-price {
+						.primary-color {
+							font-weight: 700;
+							font-size: 28rpx;
+						}
+					}
+
+					.save-price {
+						padding: 10rpx 0;
+					}
+
+					.buy-btn {
+						line-height: 56rpx;
+						height: 56rpx;
+						border-radius: 8rpx;
+						text-align: center;
+						color: #FFFFFF;
+						width: 150rpx;
+						margin: 10rpx auto 0;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 108 - 0
components/struggler-uniapp-add-tip/struggler-uniapp-add-tip.vue

@@ -0,0 +1,108 @@
+<template>
+	<view>
+		<!-- #ifdef MP-WEIXIN -->
+		<view class="uni-add-tips-box" v-if="showTip">
+			<view class="uni-add-tips-content" @tap="hideTip">
+				<view class="clearfix" style="width: 100%;">
+					点击
+					<image src="https://onlineimg.qianniao.vip/wxdot.jpg" class="wxdot" mode="aspectFill"></image>
+					添加到我的小程序,微信首页下拉即可快速访问
+					<text class="ibonfont ibonguanbi close-icon" @click="hideTip"></text>
+				</view>
+			</view>
+		</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+const SHOW_TIP = 'SHOW_TIP';
+export default {
+	data() {
+		return {
+			showTip: false
+		};
+	},
+	mounted() {
+		this.showTip = !uni.getStorageInfoSync().keys.includes(SHOW_TIP);
+		// setTimeout(()=>{
+		// 	this.showTip = false
+		// },this.duration*1000)
+	},
+	props: {
+		tip: {
+			type: String,
+			default: '点击 ··· 添加到我到小程序,微信首页下拉即可快速访问'
+		},
+		duration: {
+			type: Number,
+			default: 10
+		}
+	},
+	methods: {
+		hideTip() {
+			uni.setStorageSync(SHOW_TIP, true);
+			this.showTip = false;
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+.wxdot {
+	width: 60upx;
+	height: 30upx;
+	// transform: translateY(-20upx);
+	margin-right: 8upx;
+	display: inline-block;
+}
+.close-icon {
+	font-size: 32upx;
+	position: absolute;
+	top: 22upx;
+	right: 12upx;
+}
+$themeColor: #ffffff; //主题色
+.uni-add-tips-box {
+	position: fixed;
+	top: 128upx;
+	right: 0;
+	z-index: 99999;
+	opacity: 0.8;
+	width: 600upx;
+	animation: opacityC 1s linear infinite;
+}
+.uni-add-tips-content::before {
+	content: '';
+	position: absolute;
+	width: 0;
+	height: 0;
+	top: -38upx;
+	right: 80upx;
+	border-width: 20upx;
+	border-style: solid;
+	display: block;
+	border-color: transparent transparent $themeColor transparent;
+}
+.uni-add-tips-content {
+	border-width: 0upx;
+	margin-top: 20upx;
+	position: relative;
+	background-color: $themeColor;
+	box-shadow: 0 10upx 20upx -10upx #ccc;
+	border-radius: 12upx;
+	padding: 18upx 26upx;
+	margin-right: 40upx;
+	color: #333;
+	font-size: 28upx;
+	font-weight: 400;
+}
+@keyframes opacityC {
+	0% {
+		opacity: 0.8;
+	}
+	50% {
+		opacity: 1;
+	}
+}
+</style>

+ 30 - 0
components/uni-status-bar/uni-status-bar.vue

@@ -0,0 +1,30 @@
+<template>
+    <view class="uni-status-bar" :style="style">
+        <slot></slot>
+    </view>
+</template>
+
+<script>
+    export default {
+        computed: {
+            style() {
+                //#ifdef MP-WEIXIN
+                var systemInfo = uni.getSystemInfoSync()
+                return `height:${systemInfo.statusBarHeight}px`
+                //#endif
+                //#ifdef APP-PLUS
+                return ''
+                //#endif
+            }
+        }
+    }
+</script>
+
+<style>
+    .uni-status-bar {
+        display: block;
+        width: 100%;
+        height: 20px;
+        height: var(--status-bar-height);
+    }
+</style>

+ 25 - 0
config.js

@@ -0,0 +1,25 @@
+const url = {
+	dev: {
+		QN_URL: 'https://apiqnys.liuniukj.com',
+		QINIU_URL: 'http://image.qianniao.vip',
+		QINIU_KEY: 'devdemo',
+	},
+	// 六牛科技
+	master: {
+		// #ifdef H5
+		QN_URL: 'http://localhost:8080',
+		// #endif
+		// #ifndef H5
+		QN_URL: 'https://apiqnys.liuniukj.com',
+		// #endif
+		QINIU_URL: 'http://up.liuniukj.com',
+		QINIU_KEY: 'niuliukj',
+	}
+}
+const webUrl = {
+	...url.master,
+	GDMap_key: 'd8d30eab203ac428dd3ede0371d641e9',
+	QINIU_UP: 'https://upload-z2.qiniup.com',
+	QRC_SRC: 'https://upload.qianniao.vip/',
+}
+export default webUrl

+ 8 - 0
ext.json

@@ -0,0 +1,8 @@
+{
+	"extEnable": true,
+	"extAppid": "wxb2198cca99031de1",
+	"directCommit": false,
+	"ext": {
+		"token": "931544405107da76ca2ec31cd63fae49"
+	}
+}

+ 65 - 0
main.js

@@ -0,0 +1,65 @@
+import Vue from 'vue'
+import store from './store'
+import App from './App'
+import goPage from '@/mixin/goPage.js'
+import * as utils from "@/access/utils.js"
+import * as common from "@/access/common.js"
+import Tabbar from '@/components/Tabbar/index';
+import empty from '@/components/empty/index.vue'
+Vue.component('Tabbar', Tabbar)
+Vue.component('Aempty', empty)
+// 数字精度计算
+import NP from "number-precision";
+Vue.prototype.$NP = NP; // 高精度数学计算
+import uView from "uview-ui";
+Vue.use(uView);
+const msg = (title, duration = 1500, mask = false, icon = 'none') => {
+	//统一提示方便全局修改
+	if (Boolean(title) === false) {
+		return;
+	}
+	uni.showToast({
+		title,
+		duration,
+		mask,
+		icon
+	});
+}
+
+const prePage = () => {
+	let pages = getCurrentPages();
+	let prePage = pages[pages.length - 2];
+	// #ifdef H5
+	return prePage;
+	// #endif
+	return prePage.$vm;
+}
+
+Vue.prototype.$api = {
+	msg,
+	prePage
+};
+Vue.mixin(goPage)
+Vue.config.productionTip = false
+Vue.prototype.$fire = new Vue();
+Vue.prototype.$store = store;
+Vue.prototype.$api = {
+	msg,
+	prePage
+};
+Vue.prototype.$_utils = utils
+Vue.prototype.$common = common
+App.mpType = 'app'
+
+const app = new Vue({
+	...App
+})
+
+// http拦截器,将此部分放在new Vue()和app.$mount()之间,才能App.vue中正常使用
+import httpInterceptor from '@/common/http.interceptor.js'
+Vue.use(httpInterceptor, app)
+
+// http接口API抽离,免于写url或者一些固定的参数
+import httpApi from '@/common/http.api.js'
+Vue.use(httpApi, app)
+app.$mount()

+ 188 - 0
manifest.json

@@ -0,0 +1,188 @@
+{
+    "name" : "侍草堂",
+    "appid" : "__UNI__BA7C0BF",
+    "description" : "六牛云商 - 为传统商户量身打造的全渠道线上线下一体化新零售营销系统! 以客户为中心,将线上和线下、进销存、CRM、财务一体化,完美融合!支持连锁、代理、经销多种运营模式,小程序一键发布,自定义APP界面,多套模板选择。7X24小时为您服务",
+    "versionName" : "1.1.3",
+    "versionCode" : 113,
+    "transformPx" : false,
+    "app-plus" : {
+        /* 5+App特有相关 */
+        "usingComponents" : true,
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : false,
+            "waiting" : false,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        "modules" : {
+            "Maps" : {},
+            "Payment" : {},
+            "OAuth" : {},
+            "Share" : {}
+        },
+        /* 模块配置 */
+        "distribute" : {
+            /* 应用发布信息 */
+            "android" : {
+                /* android打包配置 */
+                "permissions" : [
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.INTERNET\"/>",
+                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            "ios" : {
+                "privacyDescription" : {
+                    "NSPhotoLibraryUsageDescription" : "需要您的同意,才能访问相册,上传图片,以便修改头像",
+                    "NSPhotoLibraryAddUsageDescription" : "需要您的同意,才能访问相册,保存商品图片海报",
+                    "NSCameraUsageDescription" : "该应用需要使用您的相机,以便拍摄修改头像",
+                    "NSLocationAlwaysAndWhenInUseUsageDescription" : "需要您的同意,才能始终访问您的地理位置,获取当前地理位置的商品信息",
+                    "NSLocationWhenInUseUsageDescription" : "需要您的同意,才能在使用期间访问您的地理位置,获取当前地理位置的商品信息",
+                    "NSLocationAlwaysUsageDescription" : "App需要您的同意,才能访问您的地理位置,获取当前地理位置的商品信息"
+                },
+                "dSYMs" : false
+            },
+            /* ios打包配置 */
+            "sdkConfigs" : {
+                "maps" : {
+                    "amap" : {
+                        "appkey_ios" : "d8d30eab203ac428dd3ede0371d641e9",
+                        "appkey_android" : "3604fc62d1e4e5c3a203708002b702db"
+                    }
+                },
+                "payment" : {
+                    "alipay" : {},
+                    "weixin" : {
+                        "appid" : "wxeff351bc49a91bf7",
+                        "UniversalLinks" : "https://www.qianniaovip.com/"
+                    }
+                },
+                "oauth" : {
+                    "weixin" : {
+                        "appid" : "wxeff351bc49a91bf7",
+                        "appsecret" : "a5ffb07765ab01d91791db49a52799de",
+                        "UniversalLinks" : "https://www.qianniaovip.com/"
+                    }
+                },
+                "ad" : {},
+                "share" : {
+                    "weixin" : {
+                        "appid" : "wxeff351bc49a91bf7",
+                        "UniversalLinks" : "https://www.qianniaovip.com/"
+                    }
+                }
+            },
+            "icons" : {
+                "android" : {
+                    "hdpi" : "unpackage/res/icons/72x72.png",
+                    "xhdpi" : "unpackage/res/icons/96x96.png",
+                    "xxhdpi" : "unpackage/res/icons/144x144.png",
+                    "xxxhdpi" : "unpackage/res/icons/192x192.png"
+                },
+                "ios" : {
+                    "appstore" : "unpackage/res/icons/1024x1024.png",
+                    "ipad" : {
+                        "app" : "unpackage/res/icons/76x76.png",
+                        "app@2x" : "unpackage/res/icons/152x152.png",
+                        "notification" : "unpackage/res/icons/20x20.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "proapp@2x" : "unpackage/res/icons/167x167.png",
+                        "settings" : "unpackage/res/icons/29x29.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "spotlight" : "unpackage/res/icons/40x40.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png"
+                    },
+                    "iphone" : {
+                        "app@2x" : "unpackage/res/icons/120x120.png",
+                        "app@3x" : "unpackage/res/icons/180x180.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "notification@3x" : "unpackage/res/icons/60x60.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "settings@3x" : "unpackage/res/icons/87x87.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png",
+                        "spotlight@3x" : "unpackage/res/icons/120x120.png"
+                    }
+                }
+            },
+            "splashscreen" : {
+                "androidStyle" : "common",
+                "iosStyle" : "common"
+            }
+        }
+    },
+    /* SDK配置 */
+    "quickapp" : {},
+    /* 快应用特有相关 */
+    "mp-weixin" : {
+        /* 小程序特有相关 */
+        "usingComponents" : true,
+        "appid" : "wxff499fba4b9d9c9b",
+        "setting" : {
+            "urlCheck" : false,
+            "es6" : false,
+            "postcss" : false,
+            "minified" : false
+        },
+        "permission" : {
+            "scope.userFuzzyLocation" : {
+                "desc" : "需要获取用户附近门店位置"
+            }
+        },
+        "optimization" : {
+            "subPackages" : true
+        },
+        "requiredPrivateInfos" : [ "getFuzzyLocation", "chooseLocation" ]
+    },
+    "h5" : {
+        "sdkConfigs" : {
+            "maps" : {
+                "qqmap" : {
+                    "key" : "3YMBZ-OV6LX-L5C4V-ZKNI6-QBZ5Z-H4FJX"
+                }
+            }
+        },
+        "router" : {
+            "base" : "./"
+        },
+        "devServer" : {
+            "proxy" : {
+                "/api" : {
+                    "target" : "https://apiqnys.liuniukj.com",
+                    // "target" : "http://bsn.frp.liuniu946.com/api",
+                    // "changeOrigin": true,
+                    "pathRewrite" : {
+                        "/api" : "" // rewrite path
+                    }
+                }
+            }
+        }
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true,
+        "appid" : "tt78210e9ce71b918b",
+        "setting" : {
+            "minified" : true
+        }
+    }
+}

+ 299 - 0
mixin/goPage.js

@@ -0,0 +1,299 @@
+import amap from '@/access/amap-wx.js';
+import permision from "@/access/wa-permission/permission.js"
+import webUrl from '../config.js';
+export default {
+	onPageScroll(obj) {
+		// console.log(obj)
+		this.navFixed = (obj.scrollTop > 1)
+		// console.log(this.navFixed)
+	},
+	computed: {
+		barHeight() {
+			const systemInfo = uni.getSystemInfoSync();
+			return systemInfo.statusBarHeight
+		},
+		theme() {
+			if (this.$store.state.baseSet && this.$store.state.baseSet.themeStyle) {
+				return this.$store.state.baseSet.themeStyle.theme || 'red'
+			} else {
+				return 'red'
+			}
+		},
+		primaryColor() {
+			if (this.$store.state.baseSet && this.$store.state.baseSet.themeStyle) {
+				return this.$store.state.baseSet.themeStyle.color_o
+			} else {
+				return '#FD463E'
+			}
+		},
+		primaryJb() {
+			if (this.$store.state.baseSet && this.$store.state.baseSet.themeStyle) {
+				return `linear-gradient(315deg, ${this.$store.state.baseSet.themeStyle.color_o}, ${this.$store.state.baseSet.themeStyle.color_t})`
+			} else {
+				return `linear-gradient(315deg, #FD463E, #ff3883)`
+			}
+		},
+		isUserAudit() {
+			const userStatus = this.$store.state.userStatus
+			if (userStatus.enableStatus === 4) {
+				return false
+			} else if (userStatus.status === 3) {
+				return false
+			} else if (userStatus.status === 1) {
+				return false
+			} else if (userStatus.status === 0) {
+				return false
+			} else {
+				return true
+			}
+		}
+	},
+	data() {
+		return {
+			navFixed: false,
+			isLoding: false
+			// amapPlugin: null
+		}
+	},
+
+	onLoad() {
+		//在 onLoad 中初始化一个高德小程序 SDK 的实例对象。
+		this.amapPlugin = new amap.AMapWX({
+			key: webUrl.GDMap_key
+		});
+	},
+	methods: {
+		callphone(phone) {
+			uni.makePhoneCall({
+				phoneNumber: phone
+			})
+		},
+		goPage(url, type) {
+			if(!url) return
+			let urlT = ''
+			if (!['/pages/index/index', '/pages/cart/cart', '/pages/classification/cate'].includes(url)) {
+				const arr = url.split('/')
+				arr[1] = 'pagesT'
+				urlT = arr.join('/')
+			} else {
+				if (['/pages/index/Seckill'].includes(url)) {
+					urlT = 'pagesT/seckill/Seckill'
+				} else {
+					urlT = url
+				}
+			}
+			if (type === 'none') {
+				return
+			}
+			if (type === 'switchTab') {
+				uni.switchTab({
+					url: url
+				})
+			} else if (type === 'redirectTo') {
+				uni.redirectTo({
+					url: urlT
+				})
+			} else if (type === 'reLaunch') {
+				uni.reLaunch({
+					url: urlT
+				})
+			} else {
+				uni.navigateTo({
+					url: urlT
+				})
+			}
+		},
+
+		userAudit() {
+			// 判断用户status状态 0:待补全 1:待审核 2:已审核 3:审核失败 4:审核中
+			const userStatus = this.$store.state.userStatus
+			if (userStatus.enableStatus === 4) {
+				uni.clearStorageSync();
+				uni.showModal({
+					title: '账号已被禁用,您可以',
+					content: '联系电话:' + userStatus.enterpriseMobile,
+					confirmText: '联系客服',
+					cancelText: '取消',
+					success: res => {
+						if (res.confirm) {
+							uni.makePhoneCall({
+								phoneNumber: userStatus.enterpriseMobile
+							});
+						} else {
+							this.goPage('/pages/binding/bindInfo', 'reLaunch');
+						}
+					}
+				});
+
+				return;
+			}
+			// if (this.$store.state.baseSet.personnelReview === 5) {
+			if (userStatus.status === 3) {
+				// 说明资料不完善,跳转到完善资料的页面
+				uni.showModal({
+					title: '审核未通过审核,请重新修改资料',
+					content: userStatus.auditFailReason || '',
+					cancelText: '取消',
+					confirmText: '修改资料',
+					success: res => {
+						if (res.confirm) {
+							this.goPage('/pages/user/editUserInfo?token=' + this.$common.getToken());
+						}
+					}
+				});
+			} else if (userStatus.status === 1) {
+				uni.showModal({
+					title: '账号正在审核中,您可以',
+					content: '联系电话:' + userStatus.enterpriseMobile,
+					confirmText: '联系客服',
+					cancelText: '取消',
+					success: res => {
+						if (res.confirm) {
+							uni.makePhoneCall({
+								phoneNumber: userStatus.enterpriseMobile
+							});
+						}
+					}
+				});
+			} else if (userStatus.status === 0) {
+				uni.showModal({
+					title: '请完善信息后再进行操作',
+					content: '商家需要对客户资料进行审核,请您完善信息后再次进行操作',
+					confirmText: '完善信息',
+					cancelText: '取消',
+					success: res => {
+						if (res.confirm) {
+							this.goPage('/pages/user/editUserInfo');
+						}
+					}
+				});
+			}
+			// }
+
+		},
+		backPage() {
+			uni.navigateBack()
+		},
+
+		//授权
+		getAuthorizeInfo() {
+			this.getLocation();
+		},
+		// 再次获取授权 微信小程序
+		// 当用户第一次拒绝后再次请求授权
+		openConfirm() {
+			// uni.showModal({
+			// 	title: '请求授权当前位置',
+			// 	content: '商品信息将无法正常显示,请确认授权',
+			// 	success: res => {
+			// 		if(res.confirm) {
+			// 			this.isLoding = true
+			// 			uni.openSetting({
+			// 				success: reso => {
+			// 					if (!reso.authSetting['scope.userFuzzyLocation']) {
+			// 						this.openConfirm();
+			// 					}
+			// 				},
+			// 				complete: () => {
+			// 					this.isLoding = false
+			// 				}
+			// 			});
+			// 		}
+					
+			// 	}
+			// });
+		},
+		// 获取定位
+		getLocation() {
+			this.isLoding = true
+			this.amapPlugin.getRegeo({
+				success: data => {
+					const proCity = ['北京市', '天津市', '上海市', '重庆市']
+					this.isLoding = false
+					// console.log('获取定位:', data)
+					const provinceName = data[0].regeocodeData.addressComponent.province
+					console.log('获取定位:', provinceName)
+					const cityName = proCity.includes(provinceName) ? provinceName : data[0].regeocodeData
+						.addressComponent.city
+					const districtName = data[0].regeocodeData.addressComponent.district
+					// const address = data[0].regeocodeData.addressComponent.township
+					const address = data[0].desc || data[0].regeocodeData.addressComponent.streetNumber
+						.street || data[0].regeocodeData
+						.addressComponent.township;
+					const location = {
+						provinceName: provinceName,
+						cityName: cityName,
+						districtName: districtName,
+						address: address
+					};
+					// console.log(123, location)
+					this.$store.commit('commit_locationObj', {
+						...location,
+						latitude: data[0].latitude,
+						longitude: data[0].longitude
+					});
+					// this.getTemplate();
+				},
+				fail: err => {
+					console.log('定位失败,用户拒绝定位', err);
+					// 拒绝授权
+					// #ifdef MP
+					this.openConfirm();
+					// #endif
+					// #ifdef APP-PLUS
+					if (plus.os.name == "iOS") {
+						let result = permision.judgeIosPermission('location')
+						if (!result) {
+							this.judgeIosPermission('location')
+						}
+					} else {
+						this.requestAndroidPermission('android.permission.ACCESS_FINE_LOCATION')
+					}
+					// #endif
+					// console.log('你拒绝了授权,无法获得周边信息');
+				}
+
+			});
+		},
+		// 再次获取授权 安卓
+		async requestAndroidPermission(permisionID) {
+			let result = await permision.requestAndroidPermission(permisionID)
+			if (result == 1) {
+				strStatus = "已获得授权"
+			} else {
+				// uni.showToast({
+				// 	title: '未获取到您的位置信息,商品数据将无法正常显示,请前往【设置->应用->权限管理->位置】确认授权位置信息',
+				// 	duration: 10000,
+				// 	icon: 'none'
+				// });
+				// 设置->隐私->定位服务中开启定位服务
+				uni.showModal({
+					title: '定位服务已关闭',
+					content: '您需要打开定位权限,才可以获取商品信息,请前往【设置->应用->权限管理->位置】中开启定位服务',
+					success: (res) => {
+						if (res.confirm) {
+							permision.gotoAppPermissionSetting()
+						}
+					}
+				});
+			}
+		},
+		// 再次获取授权 IOS
+		judgeIosPermission(permisionID) {
+			var result = permision.judgeIosPermission(permisionID)
+			// var strStatus = (result) ? "已" : "未"
+			if (!result) {
+				uni.showModal({
+					title: '定位服务已关闭',
+					content: '您需要打开定位权限,才可以获取商品信息,请前往【设置->隐私->定位服务】中开启定位服务',
+					success: (res) => {
+						if (res.confirm) {
+							permision.gotoAppPermissionSetting()
+						}
+					}
+				});
+			}
+		}
+
+	}
+}

+ 11 - 0
node_modules/number-precision/.travis.yml

@@ -0,0 +1,11 @@
+dist: trusty
+language: node_js
+node_js:
+  - 8
+script:
+  - npm test
+addons:
+  firefox: "49.0"
+before_script:
+  - export DISPLAY=:99.0
+  - sh -e /etc/init.d/xvfb start

+ 50 - 0
node_modules/number-precision/README.md

@@ -0,0 +1,50 @@
+# number-precision [![npm version](https://badge.fury.io/js/number-precision.svg)](http://badge.fury.io/js/number-precision) [![Build Status](https://travis-ci.org/nefe/number-precision.svg)](https://travis-ci.org/nefe/number-precision) [![codecov](https://codecov.io/gh/nefe/number-precision/branch/master/graph/badge.svg)](https://codecov.io/gh/nefe/number-precision)
+
+Perform addition, subtraction, multiplication and division operations precisely using javascript
+
+### Why
+
+```js
+0.1 + 0.2 = 0.30000000000000004
+1.0 - 0.9 = 0.09999999999999998
+0.105.toFixed(2) = 0.1 // not 0.11
+```
+
+### Install
+
+```
+npm install number-precision --save
+```
+
+### Methods
+
+```js
+NP.strip(num)         // strip a number to nearest right number
+NP.plus(num1, num2, num3, ...)   // addition, num + num2 + num3, two numbers is required at least.
+NP.minus(num1, num2, num3, ...)  // subtraction, num1 - num2 - num3
+NP.times(num1, num2, num3, ...)  // multiplication, num1 * num2 * num3
+NP.divide(num1, num2, num3, ...) // division, num1 / num2 / num3
+NP.round(num, ratio)  // round a number based on ratio
+```
+
+### Usage
+
+```js
+import NP from 'number-precision'
+NP.strip(0.09999999999999998); // = 0.1
+NP.plus(0.1, 0.2);             // = 0.3, not 0.30000000000000004
+NP.plus(2.3, 2.4);             // = 4.7, not 4.699999999999999
+NP.minus(1.0, 0.9);            // = 0.1, not 0.09999999999999998
+NP.times(3, 0.3);              // = 0.9, not 0.8999999999999999
+NP.times(0.362, 100);          // = 36.2, not 36.199999999999996
+NP.divide(1.21, 1.1);          // = 1.1, not 1.0999999999999999
+NP.round(0.105, 2);            // = 0.11, not 0.1
+```
+
+PS: If you want to get rid of `XXX is beyond boundary when transfer to integer, the results may not be accurate`, use this at the beginning of your app to turn off boundary checking.
+```js
+NP.enableBoundaryChecking(false); // default param is true
+```
+
+### License
+MIT

+ 162 - 0
node_modules/number-precision/build-test/src/index.js

@@ -0,0 +1,162 @@
+"use strict";
+/**
+ * @desc 解决浮动运算问题,避免小数点后产生多位数和计算精度损失。
+ *
+ * 问题示例:2.3 + 2.4 = 4.699999999999999,1.0 - 0.9 = 0.09999999999999998
+ */
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.enableBoundaryChecking = exports.float2Fixed = exports.digitLength = exports.round = exports.divide = exports.times = exports.minus = exports.plus = exports.strip = void 0;
+/**
+ * Correct the given number to specifying significant digits.
+ *
+ * @param num The input number
+ * @param precision An integer specifying the number of significant digits
+ *
+ * @example strip(0.09999999999999998) === 0.1 // true
+ */
+function strip(num, precision) {
+    if (precision === void 0) { precision = 15; }
+    return +parseFloat(Number(num).toPrecision(precision));
+}
+exports.strip = strip;
+/**
+ * Return digits length of a number.
+ *
+ * @param num The input number
+ */
+function digitLength(num) {
+    // Get digit length of e
+    var eSplit = num.toString().split(/[eE]/);
+    var len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);
+    return len > 0 ? len : 0;
+}
+exports.digitLength = digitLength;
+/**
+ * Convert the given number to integer, support scientific notation.
+ * The number will be scale up if it is decimal.
+ *
+ * @param num The input number
+ */
+function float2Fixed(num) {
+    if (num.toString().indexOf('e') === -1) {
+        return Number(num.toString().replace('.', ''));
+    }
+    var dLen = digitLength(num);
+    return dLen > 0 ? strip(Number(num) * Math.pow(10, dLen)) : Number(num);
+}
+exports.float2Fixed = float2Fixed;
+/**
+ * Log a warning if the given number is out of bounds.
+ *
+ * @param num The input number
+ */
+function checkBoundary(num) {
+    if (_boundaryCheckingState) {
+        if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) {
+            console.warn(num + " is beyond boundary when transfer to integer, the results may not be accurate");
+        }
+    }
+}
+/**
+ * Create an operation to support rest params.
+ *
+ * @param operation The original operation
+ */
+function createOperation(operation) {
+    return function () {
+        var nums = [];
+        for (var _i = 0; _i < arguments.length; _i++) {
+            nums[_i] = arguments[_i];
+        }
+        var first = nums[0], others = nums.slice(1);
+        return others.reduce(function (prev, next) { return operation(prev, next); }, first);
+    };
+}
+/**
+ * Accurate multiplication.
+ *
+ * @param nums The numbers to multiply
+ */
+var times = createOperation(function (num1, num2) {
+    var num1Changed = float2Fixed(num1);
+    var num2Changed = float2Fixed(num2);
+    var baseNum = digitLength(num1) + digitLength(num2);
+    var leftValue = num1Changed * num2Changed;
+    checkBoundary(leftValue);
+    return leftValue / Math.pow(10, baseNum);
+});
+exports.times = times;
+/**
+ * Accurate addition.
+ *
+ * @param nums The numbers to add
+ */
+var plus = createOperation(function (num1, num2) {
+    // 取最大的小数位
+    var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));
+    // 把小数都转为整数然后再计算
+    return (times(num1, baseNum) + times(num2, baseNum)) / baseNum;
+});
+exports.plus = plus;
+/**
+ * Accurate subtraction.
+ *
+ * @param nums The numbers to subtract
+ */
+var minus = createOperation(function (num1, num2) {
+    var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));
+    return (times(num1, baseNum) - times(num2, baseNum)) / baseNum;
+});
+exports.minus = minus;
+/**
+ * Accurate division.
+ *
+ * @param nums The numbers to divide
+ */
+var divide = createOperation(function (num1, num2) {
+    var num1Changed = float2Fixed(num1);
+    var num2Changed = float2Fixed(num2);
+    checkBoundary(num1Changed);
+    checkBoundary(num2Changed);
+    // fix: 类似 10 ** -4 为 0.00009999999999999999,strip 修正
+    return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1))));
+});
+exports.divide = divide;
+/**
+ * Accurate rounding method.
+ *
+ * @param num The number to round
+ * @param decimal An integer specifying the decimal digits
+ */
+function round(num, decimal) {
+    var base = Math.pow(10, decimal);
+    var result = divide(Math.round(Math.abs(times(num, base))), base);
+    if (num < 0 && result !== 0) {
+        result = times(result, -1);
+    }
+    return result;
+}
+exports.round = round;
+var _boundaryCheckingState = true;
+/**
+ * Whether to check the bounds of number, default is enabled.
+ *
+ * @param flag The value to indicate whether is enabled
+ */
+function enableBoundaryChecking(flag) {
+    if (flag === void 0) { flag = true; }
+    _boundaryCheckingState = flag;
+}
+exports.enableBoundaryChecking = enableBoundaryChecking;
+exports.default = {
+    strip: strip,
+    plus: plus,
+    minus: minus,
+    times: times,
+    divide: divide,
+    round: round,
+    digitLength: digitLength,
+    float2Fixed: float2Fixed,
+    enableBoundaryChecking: enableBoundaryChecking,
+};
+//# sourceMappingURL=index.js.map

File diff suppressed because it is too large
+ 0 - 0
node_modules/number-precision/build-test/src/index.js.map


+ 78 - 0
node_modules/number-precision/build/index.d.ts

@@ -0,0 +1,78 @@
+/**
+ * @desc 解决浮动运算问题,避免小数点后产生多位数和计算精度损失。
+ *
+ * 问题示例:2.3 + 2.4 = 4.699999999999999,1.0 - 0.9 = 0.09999999999999998
+ */
+declare type NumberType = number | string;
+/**
+ * Correct the given number to specifying significant digits.
+ *
+ * @param num The input number
+ * @param precision An integer specifying the number of significant digits
+ *
+ * @example strip(0.09999999999999998) === 0.1 // true
+ */
+declare function strip(num: NumberType, precision?: number): number;
+/**
+ * Return digits length of a number.
+ *
+ * @param num The input number
+ */
+declare function digitLength(num: NumberType): number;
+/**
+ * Convert the given number to integer, support scientific notation.
+ * The number will be scale up if it is decimal.
+ *
+ * @param num The input number
+ */
+declare function float2Fixed(num: NumberType): number;
+/**
+ * Accurate multiplication.
+ *
+ * @param nums The numbers to multiply
+ */
+declare const times: (...nums: NumberType[]) => number;
+/**
+ * Accurate addition.
+ *
+ * @param nums The numbers to add
+ */
+declare const plus: (...nums: NumberType[]) => number;
+/**
+ * Accurate subtraction.
+ *
+ * @param nums The numbers to subtract
+ */
+declare const minus: (...nums: NumberType[]) => number;
+/**
+ * Accurate division.
+ *
+ * @param nums The numbers to divide
+ */
+declare const divide: (...nums: NumberType[]) => number;
+/**
+ * Accurate rounding method.
+ *
+ * @param num The number to round
+ * @param decimal An integer specifying the decimal digits
+ */
+declare function round(num: NumberType, decimal: number): number;
+/**
+ * Whether to check the bounds of number, default is enabled.
+ *
+ * @param flag The value to indicate whether is enabled
+ */
+declare function enableBoundaryChecking(flag?: boolean): void;
+export { strip, plus, minus, times, divide, round, digitLength, float2Fixed, enableBoundaryChecking };
+declare const _default: {
+    strip: typeof strip;
+    plus: (...nums: NumberType[]) => number;
+    minus: (...nums: NumberType[]) => number;
+    times: (...nums: NumberType[]) => number;
+    divide: (...nums: NumberType[]) => number;
+    round: typeof round;
+    digitLength: typeof digitLength;
+    float2Fixed: typeof float2Fixed;
+    enableBoundaryChecking: typeof enableBoundaryChecking;
+};
+export default _default;

+ 152 - 0
node_modules/number-precision/build/index.es.js

@@ -0,0 +1,152 @@
+/**
+ * @desc 解决浮动运算问题,避免小数点后产生多位数和计算精度损失。
+ *
+ * 问题示例:2.3 + 2.4 = 4.699999999999999,1.0 - 0.9 = 0.09999999999999998
+ */
+/**
+ * Correct the given number to specifying significant digits.
+ *
+ * @param num The input number
+ * @param precision An integer specifying the number of significant digits
+ *
+ * @example strip(0.09999999999999998) === 0.1 // true
+ */
+function strip(num, precision) {
+    if (precision === void 0) { precision = 15; }
+    return +parseFloat(Number(num).toPrecision(precision));
+}
+/**
+ * Return digits length of a number.
+ *
+ * @param num The input number
+ */
+function digitLength(num) {
+    // Get digit length of e
+    var eSplit = num.toString().split(/[eE]/);
+    var len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);
+    return len > 0 ? len : 0;
+}
+/**
+ * Convert the given number to integer, support scientific notation.
+ * The number will be scale up if it is decimal.
+ *
+ * @param num The input number
+ */
+function float2Fixed(num) {
+    if (num.toString().indexOf('e') === -1) {
+        return Number(num.toString().replace('.', ''));
+    }
+    var dLen = digitLength(num);
+    return dLen > 0 ? strip(Number(num) * Math.pow(10, dLen)) : Number(num);
+}
+/**
+ * Log a warning if the given number is out of bounds.
+ *
+ * @param num The input number
+ */
+function checkBoundary(num) {
+    if (_boundaryCheckingState) {
+        if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) {
+            console.warn(num + " is beyond boundary when transfer to integer, the results may not be accurate");
+        }
+    }
+}
+/**
+ * Create an operation to support rest params.
+ *
+ * @param operation The original operation
+ */
+function createOperation(operation) {
+    return function () {
+        var nums = [];
+        for (var _i = 0; _i < arguments.length; _i++) {
+            nums[_i] = arguments[_i];
+        }
+        var first = nums[0], others = nums.slice(1);
+        return others.reduce(function (prev, next) { return operation(prev, next); }, first);
+    };
+}
+/**
+ * Accurate multiplication.
+ *
+ * @param nums The numbers to multiply
+ */
+var times = createOperation(function (num1, num2) {
+    var num1Changed = float2Fixed(num1);
+    var num2Changed = float2Fixed(num2);
+    var baseNum = digitLength(num1) + digitLength(num2);
+    var leftValue = num1Changed * num2Changed;
+    checkBoundary(leftValue);
+    return leftValue / Math.pow(10, baseNum);
+});
+/**
+ * Accurate addition.
+ *
+ * @param nums The numbers to add
+ */
+var plus = createOperation(function (num1, num2) {
+    // 取最大的小数位
+    var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));
+    // 把小数都转为整数然后再计算
+    return (times(num1, baseNum) + times(num2, baseNum)) / baseNum;
+});
+/**
+ * Accurate subtraction.
+ *
+ * @param nums The numbers to subtract
+ */
+var minus = createOperation(function (num1, num2) {
+    var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));
+    return (times(num1, baseNum) - times(num2, baseNum)) / baseNum;
+});
+/**
+ * Accurate division.
+ *
+ * @param nums The numbers to divide
+ */
+var divide = createOperation(function (num1, num2) {
+    var num1Changed = float2Fixed(num1);
+    var num2Changed = float2Fixed(num2);
+    checkBoundary(num1Changed);
+    checkBoundary(num2Changed);
+    // fix: 类似 10 ** -4 为 0.00009999999999999999,strip 修正
+    return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1))));
+});
+/**
+ * Accurate rounding method.
+ *
+ * @param num The number to round
+ * @param decimal An integer specifying the decimal digits
+ */
+function round(num, decimal) {
+    var base = Math.pow(10, decimal);
+    var result = divide(Math.round(Math.abs(times(num, base))), base);
+    if (num < 0 && result !== 0) {
+        result = times(result, -1);
+    }
+    return result;
+}
+var _boundaryCheckingState = true;
+/**
+ * Whether to check the bounds of number, default is enabled.
+ *
+ * @param flag The value to indicate whether is enabled
+ */
+function enableBoundaryChecking(flag) {
+    if (flag === void 0) { flag = true; }
+    _boundaryCheckingState = flag;
+}
+var index = {
+    strip: strip,
+    plus: plus,
+    minus: minus,
+    times: times,
+    divide: divide,
+    round: round,
+    digitLength: digitLength,
+    float2Fixed: float2Fixed,
+    enableBoundaryChecking: enableBoundaryChecking,
+};
+
+export { strip, plus, minus, times, divide, round, digitLength, float2Fixed, enableBoundaryChecking };
+export default index;

+ 167 - 0
node_modules/number-precision/build/index.iife.js

@@ -0,0 +1,167 @@
+var NP = (function (exports) {
+'use strict';
+
+/**
+ * @desc 解决浮动运算问题,避免小数点后产生多位数和计算精度损失。
+ *
+ * 问题示例:2.3 + 2.4 = 4.699999999999999,1.0 - 0.9 = 0.09999999999999998
+ */
+/**
+ * Correct the given number to specifying significant digits.
+ *
+ * @param num The input number
+ * @param precision An integer specifying the number of significant digits
+ *
+ * @example strip(0.09999999999999998) === 0.1 // true
+ */
+function strip(num, precision) {
+    if (precision === void 0) { precision = 15; }
+    return +parseFloat(Number(num).toPrecision(precision));
+}
+/**
+ * Return digits length of a number.
+ *
+ * @param num The input number
+ */
+function digitLength(num) {
+    // Get digit length of e
+    var eSplit = num.toString().split(/[eE]/);
+    var len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);
+    return len > 0 ? len : 0;
+}
+/**
+ * Convert the given number to integer, support scientific notation.
+ * The number will be scale up if it is decimal.
+ *
+ * @param num The input number
+ */
+function float2Fixed(num) {
+    if (num.toString().indexOf('e') === -1) {
+        return Number(num.toString().replace('.', ''));
+    }
+    var dLen = digitLength(num);
+    return dLen > 0 ? strip(Number(num) * Math.pow(10, dLen)) : Number(num);
+}
+/**
+ * Log a warning if the given number is out of bounds.
+ *
+ * @param num The input number
+ */
+function checkBoundary(num) {
+    if (_boundaryCheckingState) {
+        if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) {
+            console.warn(num + " is beyond boundary when transfer to integer, the results may not be accurate");
+        }
+    }
+}
+/**
+ * Create an operation to support rest params.
+ *
+ * @param operation The original operation
+ */
+function createOperation(operation) {
+    return function () {
+        var nums = [];
+        for (var _i = 0; _i < arguments.length; _i++) {
+            nums[_i] = arguments[_i];
+        }
+        var first = nums[0], others = nums.slice(1);
+        return others.reduce(function (prev, next) { return operation(prev, next); }, first);
+    };
+}
+/**
+ * Accurate multiplication.
+ *
+ * @param nums The numbers to multiply
+ */
+var times = createOperation(function (num1, num2) {
+    var num1Changed = float2Fixed(num1);
+    var num2Changed = float2Fixed(num2);
+    var baseNum = digitLength(num1) + digitLength(num2);
+    var leftValue = num1Changed * num2Changed;
+    checkBoundary(leftValue);
+    return leftValue / Math.pow(10, baseNum);
+});
+/**
+ * Accurate addition.
+ *
+ * @param nums The numbers to add
+ */
+var plus = createOperation(function (num1, num2) {
+    // 取最大的小数位
+    var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));
+    // 把小数都转为整数然后再计算
+    return (times(num1, baseNum) + times(num2, baseNum)) / baseNum;
+});
+/**
+ * Accurate subtraction.
+ *
+ * @param nums The numbers to subtract
+ */
+var minus = createOperation(function (num1, num2) {
+    var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));
+    return (times(num1, baseNum) - times(num2, baseNum)) / baseNum;
+});
+/**
+ * Accurate division.
+ *
+ * @param nums The numbers to divide
+ */
+var divide = createOperation(function (num1, num2) {
+    var num1Changed = float2Fixed(num1);
+    var num2Changed = float2Fixed(num2);
+    checkBoundary(num1Changed);
+    checkBoundary(num2Changed);
+    // fix: 类似 10 ** -4 为 0.00009999999999999999,strip 修正
+    return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1))));
+});
+/**
+ * Accurate rounding method.
+ *
+ * @param num The number to round
+ * @param decimal An integer specifying the decimal digits
+ */
+function round(num, decimal) {
+    var base = Math.pow(10, decimal);
+    var result = divide(Math.round(Math.abs(times(num, base))), base);
+    if (num < 0 && result !== 0) {
+        result = times(result, -1);
+    }
+    return result;
+}
+var _boundaryCheckingState = true;
+/**
+ * Whether to check the bounds of number, default is enabled.
+ *
+ * @param flag The value to indicate whether is enabled
+ */
+function enableBoundaryChecking(flag) {
+    if (flag === void 0) { flag = true; }
+    _boundaryCheckingState = flag;
+}
+var index = {
+    strip: strip,
+    plus: plus,
+    minus: minus,
+    times: times,
+    divide: divide,
+    round: round,
+    digitLength: digitLength,
+    float2Fixed: float2Fixed,
+    enableBoundaryChecking: enableBoundaryChecking,
+};
+
+exports.strip = strip;
+exports.plus = plus;
+exports.minus = minus;
+exports.times = times;
+exports.divide = divide;
+exports.round = round;
+exports.digitLength = digitLength;
+exports.float2Fixed = float2Fixed;
+exports.enableBoundaryChecking = enableBoundaryChecking;
+exports['default'] = index;
+
+return exports;
+
+}({}));

+ 164 - 0
node_modules/number-precision/build/index.js

@@ -0,0 +1,164 @@
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+/**
+ * @desc 解决浮动运算问题,避免小数点后产生多位数和计算精度损失。
+ *
+ * 问题示例:2.3 + 2.4 = 4.699999999999999,1.0 - 0.9 = 0.09999999999999998
+ */
+/**
+ * Correct the given number to specifying significant digits.
+ *
+ * @param num The input number
+ * @param precision An integer specifying the number of significant digits
+ *
+ * @example strip(0.09999999999999998) === 0.1 // true
+ */
+function strip(num, precision) {
+    if (precision === void 0) { precision = 15; }
+    return +parseFloat(Number(num).toPrecision(precision));
+}
+/**
+ * Return digits length of a number.
+ *
+ * @param num The input number
+ */
+function digitLength(num) {
+    // Get digit length of e
+    var eSplit = num.toString().split(/[eE]/);
+    var len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);
+    return len > 0 ? len : 0;
+}
+/**
+ * Convert the given number to integer, support scientific notation.
+ * The number will be scale up if it is decimal.
+ *
+ * @param num The input number
+ */
+function float2Fixed(num) {
+    if (num.toString().indexOf('e') === -1) {
+        return Number(num.toString().replace('.', ''));
+    }
+    var dLen = digitLength(num);
+    return dLen > 0 ? strip(Number(num) * Math.pow(10, dLen)) : Number(num);
+}
+/**
+ * Log a warning if the given number is out of bounds.
+ *
+ * @param num The input number
+ */
+function checkBoundary(num) {
+    if (_boundaryCheckingState) {
+        if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) {
+            console.warn(num + " is beyond boundary when transfer to integer, the results may not be accurate");
+        }
+    }
+}
+/**
+ * Create an operation to support rest params.
+ *
+ * @param operation The original operation
+ */
+function createOperation(operation) {
+    return function () {
+        var nums = [];
+        for (var _i = 0; _i < arguments.length; _i++) {
+            nums[_i] = arguments[_i];
+        }
+        var first = nums[0], others = nums.slice(1);
+        return others.reduce(function (prev, next) { return operation(prev, next); }, first);
+    };
+}
+/**
+ * Accurate multiplication.
+ *
+ * @param nums The numbers to multiply
+ */
+var times = createOperation(function (num1, num2) {
+    var num1Changed = float2Fixed(num1);
+    var num2Changed = float2Fixed(num2);
+    var baseNum = digitLength(num1) + digitLength(num2);
+    var leftValue = num1Changed * num2Changed;
+    checkBoundary(leftValue);
+    return leftValue / Math.pow(10, baseNum);
+});
+/**
+ * Accurate addition.
+ *
+ * @param nums The numbers to add
+ */
+var plus = createOperation(function (num1, num2) {
+    // 取最大的小数位
+    var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));
+    // 把小数都转为整数然后再计算
+    return (times(num1, baseNum) + times(num2, baseNum)) / baseNum;
+});
+/**
+ * Accurate subtraction.
+ *
+ * @param nums The numbers to subtract
+ */
+var minus = createOperation(function (num1, num2) {
+    var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));
+    return (times(num1, baseNum) - times(num2, baseNum)) / baseNum;
+});
+/**
+ * Accurate division.
+ *
+ * @param nums The numbers to divide
+ */
+var divide = createOperation(function (num1, num2) {
+    var num1Changed = float2Fixed(num1);
+    var num2Changed = float2Fixed(num2);
+    checkBoundary(num1Changed);
+    checkBoundary(num2Changed);
+    // fix: 类似 10 ** -4 为 0.00009999999999999999,strip 修正
+    return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1))));
+});
+/**
+ * Accurate rounding method.
+ *
+ * @param num The number to round
+ * @param decimal An integer specifying the decimal digits
+ */
+function round(num, decimal) {
+    var base = Math.pow(10, decimal);
+    var result = divide(Math.round(Math.abs(times(num, base))), base);
+    if (num < 0 && result !== 0) {
+        result = times(result, -1);
+    }
+    return result;
+}
+var _boundaryCheckingState = true;
+/**
+ * Whether to check the bounds of number, default is enabled.
+ *
+ * @param flag The value to indicate whether is enabled
+ */
+function enableBoundaryChecking(flag) {
+    if (flag === void 0) { flag = true; }
+    _boundaryCheckingState = flag;
+}
+var index = {
+    strip: strip,
+    plus: plus,
+    minus: minus,
+    times: times,
+    divide: divide,
+    round: round,
+    digitLength: digitLength,
+    float2Fixed: float2Fixed,
+    enableBoundaryChecking: enableBoundaryChecking,
+};
+
+exports.strip = strip;
+exports.plus = plus;
+exports.minus = minus;
+exports.times = times;
+exports.divide = divide;
+exports.round = round;
+exports.digitLength = digitLength;
+exports.float2Fixed = float2Fixed;
+exports.enableBoundaryChecking = enableBoundaryChecking;
+exports['default'] = index;

File diff suppressed because it is too large
+ 0 - 0
node_modules/number-precision/build/index.js.map


+ 170 - 0
node_modules/number-precision/build/index.umd.js

@@ -0,0 +1,170 @@
+(function (global, factory) {
+	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+	typeof define === 'function' && define.amd ? define(['exports'], factory) :
+	(factory((global.NP = {})));
+}(this, (function (exports) { 'use strict';
+
+/**
+ * @desc 解决浮动运算问题,避免小数点后产生多位数和计算精度损失。
+ *
+ * 问题示例:2.3 + 2.4 = 4.699999999999999,1.0 - 0.9 = 0.09999999999999998
+ */
+/**
+ * Correct the given number to specifying significant digits.
+ *
+ * @param num The input number
+ * @param precision An integer specifying the number of significant digits
+ *
+ * @example strip(0.09999999999999998) === 0.1 // true
+ */
+function strip(num, precision) {
+    if (precision === void 0) { precision = 15; }
+    return +parseFloat(Number(num).toPrecision(precision));
+}
+/**
+ * Return digits length of a number.
+ *
+ * @param num The input number
+ */
+function digitLength(num) {
+    // Get digit length of e
+    var eSplit = num.toString().split(/[eE]/);
+    var len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);
+    return len > 0 ? len : 0;
+}
+/**
+ * Convert the given number to integer, support scientific notation.
+ * The number will be scale up if it is decimal.
+ *
+ * @param num The input number
+ */
+function float2Fixed(num) {
+    if (num.toString().indexOf('e') === -1) {
+        return Number(num.toString().replace('.', ''));
+    }
+    var dLen = digitLength(num);
+    return dLen > 0 ? strip(Number(num) * Math.pow(10, dLen)) : Number(num);
+}
+/**
+ * Log a warning if the given number is out of bounds.
+ *
+ * @param num The input number
+ */
+function checkBoundary(num) {
+    if (_boundaryCheckingState) {
+        if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) {
+            console.warn(num + " is beyond boundary when transfer to integer, the results may not be accurate");
+        }
+    }
+}
+/**
+ * Create an operation to support rest params.
+ *
+ * @param operation The original operation
+ */
+function createOperation(operation) {
+    return function () {
+        var nums = [];
+        for (var _i = 0; _i < arguments.length; _i++) {
+            nums[_i] = arguments[_i];
+        }
+        var first = nums[0], others = nums.slice(1);
+        return others.reduce(function (prev, next) { return operation(prev, next); }, first);
+    };
+}
+/**
+ * Accurate multiplication.
+ *
+ * @param nums The numbers to multiply
+ */
+var times = createOperation(function (num1, num2) {
+    var num1Changed = float2Fixed(num1);
+    var num2Changed = float2Fixed(num2);
+    var baseNum = digitLength(num1) + digitLength(num2);
+    var leftValue = num1Changed * num2Changed;
+    checkBoundary(leftValue);
+    return leftValue / Math.pow(10, baseNum);
+});
+/**
+ * Accurate addition.
+ *
+ * @param nums The numbers to add
+ */
+var plus = createOperation(function (num1, num2) {
+    // 取最大的小数位
+    var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));
+    // 把小数都转为整数然后再计算
+    return (times(num1, baseNum) + times(num2, baseNum)) / baseNum;
+});
+/**
+ * Accurate subtraction.
+ *
+ * @param nums The numbers to subtract
+ */
+var minus = createOperation(function (num1, num2) {
+    var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));
+    return (times(num1, baseNum) - times(num2, baseNum)) / baseNum;
+});
+/**
+ * Accurate division.
+ *
+ * @param nums The numbers to divide
+ */
+var divide = createOperation(function (num1, num2) {
+    var num1Changed = float2Fixed(num1);
+    var num2Changed = float2Fixed(num2);
+    checkBoundary(num1Changed);
+    checkBoundary(num2Changed);
+    // fix: 类似 10 ** -4 为 0.00009999999999999999,strip 修正
+    return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1))));
+});
+/**
+ * Accurate rounding method.
+ *
+ * @param num The number to round
+ * @param decimal An integer specifying the decimal digits
+ */
+function round(num, decimal) {
+    var base = Math.pow(10, decimal);
+    var result = divide(Math.round(Math.abs(times(num, base))), base);
+    if (num < 0 && result !== 0) {
+        result = times(result, -1);
+    }
+    return result;
+}
+var _boundaryCheckingState = true;
+/**
+ * Whether to check the bounds of number, default is enabled.
+ *
+ * @param flag The value to indicate whether is enabled
+ */
+function enableBoundaryChecking(flag) {
+    if (flag === void 0) { flag = true; }
+    _boundaryCheckingState = flag;
+}
+var index = {
+    strip: strip,
+    plus: plus,
+    minus: minus,
+    times: times,
+    divide: divide,
+    round: round,
+    digitLength: digitLength,
+    float2Fixed: float2Fixed,
+    enableBoundaryChecking: enableBoundaryChecking,
+};
+
+exports.strip = strip;
+exports.plus = plus;
+exports.minus = minus;
+exports.times = times;
+exports.divide = divide;
+exports.round = round;
+exports.digitLength = digitLength;
+exports.float2Fixed = float2Fixed;
+exports.enableBoundaryChecking = enableBoundaryChecking;
+exports['default'] = index;
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+})));

+ 80 - 0
node_modules/number-precision/package.json

@@ -0,0 +1,80 @@
+{
+  "_from": "number-precision",
+  "_id": "number-precision@1.6.0",
+  "_inBundle": false,
+  "_integrity": "sha512-05OLPgbgmnixJw+VvEh18yNPUo3iyp4BEWJcrLu4X9W05KmMifN7Mu5exYvQXqxxeNWhvIF+j3Rij+HmddM/hQ==",
+  "_location": "/number-precision",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "tag",
+    "registry": true,
+    "raw": "number-precision",
+    "name": "number-precision",
+    "escapedName": "number-precision",
+    "rawSpec": "",
+    "saveSpec": null,
+    "fetchSpec": "latest"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/number-precision/-/number-precision-1.6.0.tgz",
+  "_shasum": "e309d28f80871d36ac9f6ecd974e13afb1ec0de0",
+  "_spec": "number-precision",
+  "_where": "D:\\2022\\12\\QianNiaoUser",
+  "author": {
+    "name": "cam song"
+  },
+  "ava": {
+    "files": [
+      "build-test/**/*.test.js"
+    ]
+  },
+  "bugs": {
+    "url": "https://github.com/nefe/number-precision/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "Perform addition, subtraction, multiplication and division operations precisely using javascript",
+  "devDependencies": {
+    "ava": "^3.8.2",
+    "braces": ">=2.3.1",
+    "codecov": "^3.1.0",
+    "nyc": "^15.0.1",
+    "pre-commit": "^1.2.2",
+    "rollup": "^0.52.2",
+    "rollup-plugin-typescript": "^0.8.1",
+    "rollup-plugin-typescript2": "^0.8.4",
+    "rollup-watch": "^4.3.1",
+    "tslint": "^5.8.0",
+    "typescript": "^3.8.3"
+  },
+  "homepage": "https://github.com/nefe/number-precision",
+  "keywords": [
+    "number precision",
+    "floating problem",
+    "rounding error"
+  ],
+  "license": "MIT",
+  "main": "build/index.js",
+  "module": "build/index.es.js",
+  "name": "number-precision",
+  "pre-commit": [
+    "tslint"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/nefe/number-precision.git"
+  },
+  "scripts": {
+    "build": "rollup -c",
+    "posttest": "codecov -f coverage/*.json -t 072762c4-c5bc-4393-bcd9-71eac9e7725b",
+    "prepublish": "rm -rf build && tsc && npm run build",
+    "test": "tsc -p tsconfig.test.json && nyc --reporter=lcov --reporter=text --reporter=json ava && rm -rf .nyc_output",
+    "tslint": "tslint ./src/**/*.ts --fix",
+    "watch": "rollup -cw"
+  },
+  "types": "build/index.d.ts",
+  "version": "1.6.0"
+}

+ 26 - 0
node_modules/number-precision/rollup.config.js

@@ -0,0 +1,26 @@
+import typescript from 'rollup-plugin-typescript2'
+
+export default {
+  input: './src/index.ts',
+  output: [
+    {
+      format: 'iife',
+      name: 'NP',
+      dest: './build/index.iife.js'
+    },
+    {
+      format: 'umd',
+      name: 'NP',
+      dest: './build/index.umd.js'
+    },
+    {
+      format: 'cjs',
+      dest: './build/index.js'
+    },
+    {
+      format: 'es',
+      dest: './build/index.es.js'
+    }
+  ],
+  plugins: [typescript({cacheRoot: `${require('temp-dir')}/.rpt2_cache`})]
+}

+ 166 - 0
node_modules/number-precision/src/index.ts

@@ -0,0 +1,166 @@
+/**
+ * @desc 解决浮动运算问题,避免小数点后产生多位数和计算精度损失。
+ *
+ * 问题示例:2.3 + 2.4 = 4.699999999999999,1.0 - 0.9 = 0.09999999999999998
+ */
+
+type NumberType = number | string;
+
+/**
+ * Correct the given number to specifying significant digits.
+ *
+ * @param num The input number
+ * @param precision An integer specifying the number of significant digits
+ *
+ * @example strip(0.09999999999999998) === 0.1 // true
+ */
+function strip(num: NumberType, precision = 15): number {
+  return +parseFloat(Number(num).toPrecision(precision));
+}
+
+/**
+ * Return digits length of a number.
+ *
+ * @param num The input number
+ */
+function digitLength(num: NumberType): number {
+  // Get digit length of e
+  const eSplit = num.toString().split(/[eE]/);
+  const len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);
+  return len > 0 ? len : 0;
+}
+
+/**
+ * Convert the given number to integer, support scientific notation.
+ * The number will be scale up if it is decimal.
+ *
+ * @param num The input number
+ */
+function float2Fixed(num: NumberType): number {
+  if (num.toString().indexOf('e') === -1) {
+    return Number(num.toString().replace('.', ''));
+  }
+  const dLen = digitLength(num);
+  return dLen > 0 ? strip(Number(num) * Math.pow(10, dLen)) : Number(num);
+}
+
+/**
+ * Log a warning if the given number is out of bounds.
+ *
+ * @param num The input number
+ */
+function checkBoundary(num: number) {
+  if (_boundaryCheckingState) {
+    if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) {
+      console.warn(`${num} is beyond boundary when transfer to integer, the results may not be accurate`);
+    }
+  }
+}
+
+/**
+ * Create an operation to support rest params.
+ *
+ * @param operation The original operation
+ */
+function createOperation(operation: (n1: NumberType, n2: NumberType) => number): (...nums: NumberType[]) => number {
+  return (...nums: NumberType[]) => {
+    const [first, ...others] = nums;
+    return others.reduce((prev, next) => operation(prev, next), first) as number;
+  };
+}
+
+/**
+ * Accurate multiplication.
+ *
+ * @param nums The numbers to multiply
+ */
+const times = createOperation((num1, num2) => {
+  const num1Changed = float2Fixed(num1);
+  const num2Changed = float2Fixed(num2);
+  const baseNum = digitLength(num1) + digitLength(num2);
+  const leftValue = num1Changed * num2Changed;
+
+  checkBoundary(leftValue);
+
+  return leftValue / Math.pow(10, baseNum);
+});
+
+/**
+ * Accurate addition.
+ *
+ * @param nums The numbers to add
+ */
+const plus = createOperation((num1, num2) => {
+  // 取最大的小数位
+  const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));
+  // 把小数都转为整数然后再计算
+  return (times(num1, baseNum) + times(num2, baseNum)) / baseNum;
+});
+
+/**
+ * Accurate subtraction.
+ *
+ * @param nums The numbers to subtract
+ */
+const minus = createOperation((num1, num2) => {
+  const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));
+  return (times(num1, baseNum) - times(num2, baseNum)) / baseNum;
+});
+
+/**
+ * Accurate division.
+ *
+ * @param nums The numbers to divide
+ */
+const divide = createOperation((num1, num2) => {
+  const num1Changed = float2Fixed(num1);
+  const num2Changed = float2Fixed(num2);
+
+  checkBoundary(num1Changed);
+  checkBoundary(num2Changed);
+
+  // fix: 类似 10 ** -4 为 0.00009999999999999999,strip 修正
+  return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1))));
+});
+
+/**
+ * Accurate rounding method.
+ *
+ * @param num The number to round
+ * @param decimal An integer specifying the decimal digits
+ */
+function round(num: NumberType, decimal: number): number {
+  const base = Math.pow(10, decimal);
+  let result = divide(Math.round(Math.abs(times(num, base))), base);
+
+  if (num < 0 && result !== 0) {
+    result = times(result, -1);
+  }
+
+  return result;
+}
+
+let _boundaryCheckingState = true;
+
+/**
+ * Whether to check the bounds of number, default is enabled.
+ *
+ * @param flag The value to indicate whether is enabled
+ */
+function enableBoundaryChecking(flag = true) {
+  _boundaryCheckingState = flag;
+}
+
+export { strip, plus, minus, times, divide, round, digitLength, float2Fixed, enableBoundaryChecking };
+
+export default {
+  strip,
+  plus,
+  minus,
+  times,
+  divide,
+  round,
+  digitLength,
+  float2Fixed,
+  enableBoundaryChecking,
+};

+ 23 - 0
node_modules/number-precision/tsconfig.json

@@ -0,0 +1,23 @@
+{
+  "compilerOptions": {
+    "module": "commonjs",
+    "strict": true,
+    "emitDecoratorMetadata": true,
+    "experimentalDecorators": true,
+    "lib": [
+      "dom",
+      "es5",
+      "es6"
+    ],
+    "target": "es5",
+    "outDir": "build",
+    "sourceMap": true,
+    "declaration": true
+  },
+  "include": [
+    "src/*.ts"
+  ],
+  "exclude": [
+    "node_modules"
+  ]
+}

+ 19 - 0
node_modules/number-precision/tsconfig.test.json

@@ -0,0 +1,19 @@
+{
+  "compilerOptions": {
+    "module": "commonjs",
+    "strict": true,
+    "emitDecoratorMetadata": true,
+    "experimentalDecorators": true,
+    "lib": [
+      "dom",
+      "es5",
+      "es6"
+    ],
+    "target": "es5",
+    "outDir": "build-test",
+    "sourceMap": true
+  },
+  "exclude": [
+    "node_modules"
+  ]
+}

+ 33 - 0
node_modules/number-precision/tslint.json

@@ -0,0 +1,33 @@
+{
+  "extends": ["tslint:recommended"],
+  "rules": {
+    "arrow-parens": false,
+    "arrow-return-shorthand": [true],
+    "import-spacing": true,
+    "interface-name": [false],
+    "interface-over-type-literal": false,
+    "linebreak-style": [true, "LF"],
+    "max-classes-per-file": [false],
+    "member-access": [false],
+    "no-require-imports": true,
+    "object-literal-sort-keys": false,
+    "ordered-imports": [false],
+    "no-console": false,
+    "prefer-const": true,
+    "quotemark": [true, "single", "jsx-double"],
+    "space-before-function-paren": [true, {
+      "anonymous": "always",
+      "asyncArrow": "always",
+      "constructor": "never",
+      "method": "never",
+      "named": "never"
+    }],
+    "variable-name": [
+      true,
+      "ban-keywords",
+      "check-format",
+      "allow-pascal-case",
+      "allow-leading-underscore"
+    ]
+  }
+}

+ 747 - 0
pages.json

@@ -0,0 +1,747 @@
+{
+	"easycom": {
+		"^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue"
+	},
+	"pages": [{
+			"path": "pages/index/StartUpPage",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path": "pages/index/index",
+			"style": {
+				"navigationStyle": "custom",
+				"enablePullDownRefresh": true,
+				"navigationBarTitleText": "首页"
+			}
+		},
+
+		{
+			"path": "pages/index/SearchAddress",
+			"style": {
+				"navigationBarTitleText": "搜索地址"
+			}
+		},
+
+
+		{
+			"path": "pages/user/user",
+			"style": {
+				"navigationBarTitleText": "我的",
+				"navigationStyle": "custom",
+				"enablePullDownRefresh": true
+			}
+		},
+		{
+			"path": "pages/cart/cart",
+			"style": {
+				"navigationBarTitleText": "购物车",
+				"enablePullDownRefresh": true,
+				"app-plus": {
+					"titleNView": {
+						"buttons": [ //原生标题栏按钮配置,
+							{
+								"text": "编辑",
+								"fontSize": "14px"
+							}
+						]
+					}
+				}
+			}
+		},
+		{
+			"path": "pages/classification/cate",
+			"style": {
+				"navigationBarTitleText": "产品分类"
+			}
+		},
+		{
+			"path": "pages/index/FullScreen",
+			"style": {
+				"navigationStyle": "custom", // 取消本页面的导航栏
+				"app-plus": {
+					"animationType": "fade-in", // 设置fade-in淡入动画,为最合理的动画类型
+					"background": "transparent", // 背景透明
+					"backgroundColor": "rgba(0,0,0,0)", // 背景透明
+					"popGesture": "none" // 关闭IOS屏幕左边滑动关闭当前页面的功能
+				}
+			}
+		}
+	],
+	"subPackages": [{
+		"root": "pagesT",
+		"pages": [{
+				"path": "activity/Activity",
+				"style": {
+					"enablePullDownRefresh": true,
+					"navigationBarTitleText": "专题活动"
+				}
+			},
+			{
+				"path": "seckill/Seckill",
+				"style": {
+					"navigationBarTitleText": "秒杀抢购",
+					"enablePullDownRefresh": true,
+					"navigationStyle": "custom"
+				}
+			},
+			{
+				"path": "selfconfig/selfconfig",
+				"style": {
+					"navigationBarTitleText": "个人设置"
+				}
+			},
+			{
+				"path": "unit/official",
+				"style": {
+					"navigationBarTitleText": ""
+				}
+			},
+			{
+				"path": "unit/yhk",
+				"style": {
+					"navigationBarTitleText": "优惠卡"
+				}
+			},
+			{
+				"path": "unit/officialT",
+				"style": {
+					"navigationBarTitleText": ""
+				}
+			},
+			{
+				"path": "unit/ygdetail",
+				"style": {
+					"navigationBarTitleText": "员工详情"
+				}
+			},
+			{
+				"path": "unit/artdetail",
+				"style": {
+					"navigationBarTitleText": ""
+				}
+			},
+			{
+				"path": "unit/lc",
+				"style": {
+					"navigationBarTitleText": "疗程"
+				}
+			},
+			{
+				"path": "unit/item",
+				"style": {
+					"navigationBarTitleText": "项目"
+				}
+			},
+			{
+				"path": "unit/evaluate",
+				"style": {
+					"navigationBarTitleText": "评价"
+				}
+			},
+			{
+				"path": "unit/itemdetail",
+				"style": {
+					"navigationBarTitleText": "详情展示",
+					"navigationStyle": "custom",
+					"app-plus": {
+						"titleNView": {
+							"type": "transparent"
+						}
+					}
+				}
+			},
+			{
+				"path": "user/editUserInfo",
+				"style": {
+					"navigationBarTitleText": "完善资料"
+				}
+			},
+			{
+				"path": "user/VipList",
+				"style": {
+					"navigationBarTitleText": "会员卡中心"
+				}
+			},
+			{
+				"path": "user/VipDetail",
+				"style": {
+					"navigationBarTitleText": "会员卡详情"
+				}
+			},
+			{
+				"path": "user/GetCoupon",
+				"style": {
+					"navigationBarTitleText": "领取优惠券"
+				}
+			},
+			{
+				"path": "user/DiscountCoupon",
+				"style": {
+					"navigationBarTitleText": "我的优惠券"
+				}
+			},
+			{
+				"path": "user/Collection",
+				"style": {
+					"navigationBarTitleText": "常购清单"
+				}
+			},
+			{
+				"path": "user/guquan",
+				"style": {
+					"navigationBarTitleText": "股份"
+				}
+			},
+			{
+				"path": "user/dyquan",
+				"style": {
+					"navigationBarTitleText": "我的抵用券"
+				}
+			},
+			{
+				"path": "user/myyhk",
+				"style": {
+					"navigationBarTitleText": "我的优惠卡"
+				}
+			},
+			{
+				"path": "user/gqDetail",
+				"style": {
+					"navigationBarTitleText": "股权明细"
+				}
+			},
+			{
+				"path": "search/index",
+				"style": {
+					"navigationBarTitleText": "搜索"
+				}
+			},
+			{
+				"path": "search/SearchResult",
+				"style": {
+					"navigationBarTitleText": "搜索列表"
+				}
+			},
+			{
+				"path": "product/product",
+				"style": {
+					"navigationBarTitleText": "详情展示",
+					"navigationStyle": "custom",
+					"app-plus": {
+						"titleNView": {
+							"type": "transparent"
+						}
+					}
+				}
+			},
+			{
+				"path": "product/goodsPoster",
+				"style": {
+					"navigationBarTitleText": "制作海报"
+				}
+			},
+			{
+				"path": "binding/bindInfo",
+				"style": {
+					"navigationBarTitleText": "登入",
+					"navigationStyle": "custom"
+				}
+			},
+			{
+				"path": "binding/bindPhone",
+				"style": {
+					"navigationBarTitleText": "绑定手机",
+					"navigationStyle": "custom"
+				}
+			}, {
+				"path": "public/wxLogin",
+				"style": {
+					"navigationBarTitleText": "",
+					"navigationStyle": "custom",
+					"app-plus": {
+						"titleNView": false,
+						"animationType": "slide-in-bottom"
+					}
+				}
+			},
+
+			{
+				"path": "public/login",
+				"style": {
+					"navigationBarTitleText": "",
+					"navigationStyle": "custom",
+					"app-plus": {
+						"titleNView": false,
+						"animationType": "slide-in-bottom"
+					}
+				}
+			},
+			{
+				"path": "productDetail/productDetail",
+				"style": {
+					"navigationBarTitleText": "分类商品",
+					"enablePullDownRefresh": true
+				}
+			},
+			{
+				"path": "productDetail/groupList",
+				"style": {
+					"navigationBarTitleText": "商品分组",
+					"enablePullDownRefresh": true
+				}
+			},
+			{
+				"path": "money/BankPay",
+				"style": {
+					"navigationBarTitleText": "上传打款凭证",
+					"navigationStyle": "custom"
+				}
+			},
+			{
+				"path": "money/pay",
+				"style": {
+					"navigationBarTitleText": "支付"
+				}
+			},
+			{
+				"path": "money/paySuccess",
+				"style": {
+					"navigationBarTitleText": "支付成功"
+				}
+			},
+			{
+				"path": "address/SelAddress",
+				"style": {
+					"navigationBarTitleText": "收货地址"
+				}
+			},
+			{
+				"path": "address/address",
+				"style": {
+					"navigationBarTitleText": "收货地址"
+				}
+			}, {
+				"path": "address/addressManage",
+				"style": {
+					"navigationBarTitleText": ""
+				}
+			},
+			{
+				"path": "order/ReturnOrder",
+				"style": {
+					"navigationBarTitleText": "退款/售后"
+				}
+			},
+			{
+				"path": "order/order",
+				"style": {
+					"navigationBarTitleText": "我的订单"
+				}
+			},
+			{
+				"path": "order/orderT",
+				"style": {
+					"navigationBarTitleText": "项目订单"
+				}
+			},{
+				"path": "order/createOrder",
+				"style": {
+					"navigationBarTitleText": "确认订单"
+				}
+			},
+			{
+				"path": "order/createOrderT",
+				"style": {
+					"navigationBarTitleText": "确认订单"
+				}
+			},
+			{
+				"path": "order/orderDetail",
+				"style": {
+					"navigationBarTitleText": "订单详情",
+					"navigationStyle": "custom"
+				}
+			},
+			{
+				"path": "order/ReturnSales",
+				"style": {
+					"enablePullDownRefresh": true,
+					"navigationBarTitleText": "退货"
+				}
+			},
+			{
+				"path": "order/orderLogistics",
+				"style": {
+					"navigationBarTitleText": "订单跟踪"
+				}
+			}, {
+				"path": "Distribution/ApplyAudit",
+				"style": {
+					"navigationBarTitleText": "申请成为分销商"
+				}
+			},
+			{
+				"path": "Distribution/ApplyTerm",
+				"style": {
+					"navigationBarTitleText": "申请成为分销商"
+				}
+			},
+			{
+				"path": "Distribution/Application",
+				"style": {
+					"navigationBarTitleText": "提现详情"
+				}
+			},
+			{
+				"path": "Distribution/Ranking",
+				"style": {
+					"navigationBarTitleText": "排行榜",
+					"navigationStyle": "custom"
+				}
+			},
+			{
+				"path": "Distribution/Withdrawal",
+				"style": {
+					"navigationBarTitleText": "申请提现"
+				}
+			},
+			{
+				"path": "Distribution/Agreement",
+				"style": {
+					"navigationBarTitleText": "成为分销商协议"
+				}
+			},
+			{
+				"path": "Distribution/Distribution",
+				"style": {
+					"enablePullDownRefresh": true,
+					"navigationBarTitleText": "分销中心"
+				}
+			},
+			{
+				"path": "NewPartner/index",
+				"style": {
+					"enablePullDownRefresh": true,
+					"navigationBarTitleText": "合伙人中心"
+				}
+			},
+			{
+				"path": "NewPartner/commission_detail",
+				"style": {
+					"enablePullDownRefresh": true,
+					"navigationBarTitleText": "分佣记录"
+				}
+			},
+			{
+				"path": "NewPartner/cash_detail",
+				"style": {
+					"navigationBarTitleText": "提现记录"
+				}
+			},
+			{
+				"path": "NewPartner/apply_cash",
+				"style": {
+					"navigationBarTitleText": "提现申请"
+				}
+			},
+			{
+				"path": "NewPartner/cash_info",
+				"style": {
+					"navigationBarTitleText": "提现详情"
+				}
+			},
+			{
+				"path": "NewPartner/balance_detail",
+				"style": {
+					"navigationBarTitleText": "余额明细"
+				}
+			},
+			
+			
+			
+			
+			
+			{
+				"path": "NewAgent/index",
+				"style": {
+					"enablePullDownRefresh": true,
+					"navigationBarTitleText": "门店代理中心"
+				}
+			},
+			{
+				"path": "NewAgent/commission_detail",
+				"style": {
+					"enablePullDownRefresh": true,
+					"navigationBarTitleText": "分佣记录"
+				}
+			},
+			{
+				"path": "NewAgent/cash_detail",
+				"style": {
+					"navigationBarTitleText": "提现记录"
+				}
+			},
+			{
+				"path": "NewAgent/apply_cash",
+				"style": {
+					"navigationBarTitleText": "提现申请"
+				}
+			},
+			{
+				"path": "NewAgent/cash_info",
+				"style": {
+					"navigationBarTitleText": "提现详情"
+				}
+			},
+			{
+				"path": "NewAgent/balance_detail",
+				"style": {
+					"navigationBarTitleText": "余额明细"
+				}
+			},
+			
+			
+			
+			
+			{
+				"path": "Distribution/Poster",
+				"style": {
+					"navigationBarTitleText": "海报"
+				}
+			},
+
+
+			{
+				"path": "Distribution/NotRecorded",
+				"style": {
+					"navigationBarTitleText": "待入账佣金"
+				}
+			},
+			{
+				"path": "Distribution/AddUpMoney",
+				"style": {
+					"navigationBarTitleText": "累计佣金"
+				}
+			},
+
+			{
+				"path": "Distribution/IncomeDetails",
+				"style": {
+					"navigationBarTitleText": "提现明细"
+				}
+			},
+			{
+				"path": "Distribution/MyGroup",
+				"style": {
+					"navigationBarTitleText": "我的团队"
+				}
+			},
+			{
+				"path": "Distribution/GradeDescription",
+				"style": {
+					"navigationBarTitleText": "等级说明"
+				}
+			},
+			// 分销商订单详情
+			{
+				"path": "Distribution/DorderDetail",
+				"style": {
+					"navigationBarTitleText": "订单详情",
+					"navigationStyle": "custom"
+				}
+			},
+
+			{
+				"path": "Distribution/DOrder",
+				"style": {
+					"navigationBarTitleText": "分销订单"
+				}
+			},
+			{
+				"path": "store/ChangeStore",
+				"style": {
+					"navigationBarTitleText": "选择门店",
+					"enablePullDownRefresh": true
+				}
+			},
+			// 商户入驻
+			{
+				"path": "store/Apply",
+				"style": {
+					"navigationBarTitleText": "商户入驻申请"
+				}
+			},
+			{
+				"path": "store/StoreList",
+				"style": {
+					"navigationBarTitleText": "商户列表"
+				}
+			},
+			{
+				"path": "store/StoreHome",
+				"style": {
+					"navigationBarTitleText": "商户主页",
+					"navigationStyle": "custom"
+				}
+			},
+			{
+				"path": "goodsGroup/index",
+				"style": {
+					"navigationBarTitleText": "组合套餐专场"
+				}
+			},
+			{
+				"path": "goodsGroup/goodsGroupDetail",
+				"style": {
+					"navigationBarTitleText": "套餐详情"
+				}
+			},
+			{
+				"path": "user/needSubmit",
+				"style": {
+					"navigationBarTitleText": "需求提报"
+				}
+			},
+			{
+				"path": "money/Balance",
+				"style": {
+					"navigationBarTitleText": "我的余额"
+				}
+			},
+			{
+				"path": "money/CustomerBalanceDetail",
+				"style": {
+					"navigationBarTitleText": "余额明细表"
+				}
+			},
+			{
+				"path": "money/BalanceDetail",
+				"style": {
+					"navigationBarTitleText": "余额明细"
+				}
+			},
+			{
+				"path": "money/addWithdrawal",
+				"style": {
+					"navigationBarTitleText": "提现"
+				}
+			},
+			{
+				"path": "money/PayPasswordEditCheck",
+				"style": {
+					"navigationBarTitleText": "验证身份",
+					"navigationStyle": "custom"
+				}
+			},
+			{
+				"path": "money/PayPassword",
+				"style": {
+					"navigationBarTitleText": "设置支付密码",
+					"navigationStyle": "custom"
+				}
+			},
+			{
+				"path": "money/PayPasswordAgin",
+				"style": {
+					"navigationBarTitleText": "确认支付密码",
+					"navigationStyle": "custom"
+				}
+			},
+			{
+				"path": "pointsMall/index",
+				"style": {
+					"navigationBarTitleText": "股权商城",
+					"enablePullDownRefresh": true //开启下拉刷新
+				}
+			},
+			{
+				"path": "pointsMall/PointsDetail",
+				"style": {
+					"navigationBarTitleText": "股权明细",
+					"enablePullDownRefresh": true //开启下拉刷新
+				}
+			},
+			{
+				"path": "pointsMall/ExchangeLog",
+				"style": {
+					"navigationBarTitleText": "兑换记录",
+					"enablePullDownRefresh": true //开启下拉刷新
+				}
+			},
+			{
+				"path": "pointsMall/ExchangeOrder",
+				"style": {
+					"navigationBarTitleText": "确认兑换",
+					"enablePullDownRefresh": true //开启下拉刷新
+				}
+			},
+			{
+				"path": "pointsMall/ExchangeOrderDetail",
+				"style": {
+					"navigationBarTitleText": "兑换详情",
+					"navigationStyle": "custom"
+				}
+			},
+			{
+				"path": "pointsMall/IntegralGoodsDetail",
+				"style": {
+					"enablePullDownRefresh": true,
+					"navigationBarTitleText": "股权商品详情",
+					"navigationStyle": "custom",
+					"app-plus": {
+						"titleNView": {
+							"type": "transparent"
+						}
+					}
+				}
+			}
+		]
+	}],
+	"globalStyle": {
+		"navigationBarTextStyle": "black",
+		"navigationBarTitleText": "",
+		"navigationBarBackgroundColor": "#FFFFFF",
+		"backgroundColor": "#f8f8f8"
+	},
+	"tabBar": {
+		"borderStyle": "white",
+		"backgroundColor": "#ffffff",
+		"color": "#999999",
+		"selectedColor": "#ff2d2d",
+		"list": [{
+				"pagePath": "pages/index/index",
+				"iconPath": "static/img/tabbar-icon/home.png",
+				"selectedIconPath": "static/img/tabbar-icon/home-action.png",
+				"text": "首页"
+			},
+			{
+				"pagePath": "pages/classification/cate",
+				"iconPath": "static/img/tabbar-icon/cate.png",
+				"selectedIconPath": "static/img/tabbar-icon/cate-action.png",
+				"text": "分类"
+			},
+			{
+				"pagePath": "pages/cart/cart",
+				"iconPath": "static/img/tabbar-icon/cart.png",
+				"selectedIconPath": "static/img/tabbar-icon/cart-action.png",
+				"text": "购物车"
+			},
+			{
+				"pagePath": "pages/user/user",
+				"iconPath": "static/img/tabbar-icon/user.png",
+				"selectedIconPath": "static/img/tabbar-icon/user-action.png",
+				"text": "我的"
+			}
+		]
+	},
+	"condition": { //模式配置,仅开发期间生效
+		"current": 0, //当前激活的模式(list 的索引项)
+		"list": [{
+			"name": "", //模式名称
+			"path": "", //启动页面,必选
+			"query": "" //启动参数,在页面的onLoad函数里面得到
+		}]
+	}
+}

+ 817 - 0
pages/cart/cart.vue

@@ -0,0 +1,817 @@
+<template>
+	<view :class="['qn-page-' + theme]">
+		<view class="container">
+			<Aempty text="您购物车暂无商品,快去加购吧~" src="https://onlineimg.qianniao.vip/car.png" v-if="!isLogin || (invalidData.length === 0 && goodsData.length === 0)"></Aempty>
+			<view v-else>
+				<!-- 列表 goodsData -->
+				<view class="card" v-for="(item, index) in goodsData" :key="index">
+					<view class="box clearfix">
+						<text
+							@click="checkShop(item.checkedShop, item.shopId, 2, item)"
+							class="ibonfont"
+							:class="[item.checkedShop ? 'ibonxuanze_xuanzhong primary-color' : 'ibonxuanze']"
+						></text>
+						<text class="title">{{ item.shopName }}</text>
+					</view>
+					<view class="cart-list">
+						<u-swipe-action
+							class="uniSwipe"
+							:options="options"
+							v-for="(goods, goodsindex) in item.shopGoodsData"
+							:key="goodsindex"
+							:show="goods.isShow"
+							:index="goodsindex"
+							@open="openItem(index, goodsindex)"
+							@click="deleteCartItem([goods.cartId], goods)"
+						>
+							<view class="cart-item clearfix">
+								<!-- 是否选中 -->
+								<text
+									@click="checkShop(goods.selection === 5, goods.cartId, 1, goods, item)"
+									class="ibonfont float_left"
+									:class="[goods.selection === 5 ? 'ibonxuanze_xuanzhong primary-color' : 'ibonxuanze']"
+								></text>
+								<view class="image-wrapper float_left" @click="goPage(`/pagesT/product/product?id=${goods.goodsId}`)">
+									<!-- 图片 -->
+									<image :src="goods.goodsImages" mode="aspectFill" />
+								</view>
+								<!-- 标题 -->
+								<view class="item-right float_left">
+									<text class="title" @click="goPage(`/pagesT/product/product?id=${goods.goodsId}`)">{{ goods.goodsName }}</text>
+									<view class="attr" @click="goPage(`/pagesT/product/product?id=${goods.goodsId}`)">
+										<block v-if="goods.specGroup && goods.specGroup.length">
+											<text>规格:</text>
+											<text v-for="(sku, skui) in goods.specGroup" :key="skui" style="padding-right: 4upx;">{{ sku.specValueName }};</text>
+										</block>
+									</view>
+									<view class="BotStyle clearfix">
+										<view class="price float_left primary-color">
+											<text class="icon-rmb">¥</text>
+											<view style="display: inline-block;"><rich-text :nodes="$_utils.splitPrice(goods.price)"></rich-text></view>
+											<text style="font-size: 20rpx;">/{{ goods.unitName }}</text>
+										</view>
+										<view v-if="goods.isActivity === 5" class="activity-tag float_left primary-bg">活动价</view>
+										<view class="float_right clearfix number-box">
+											<block v-if="goods.isDistribution === 5">
+												<!-- 开启预售不验证最大值 -->
+												<u-number-box
+													:bg-color="primaryColor"
+													color="#fff"
+													:value="goods.buyNum"
+													:input-height="44"
+													:min="goods.setNum"
+													@blur="numberChange($event, goods)"
+													@plus="clacAdd($event, goods)"
+													@minus="clacSusubtract($event, goods)"
+												></u-number-box>
+											</block>
+											<block v-else>
+												<!-- 未开启预售最大值为库存数 -->
+												<u-number-box
+													:bg-color="primaryColor"
+													color="#fff"
+													:value="goods.buyNum"
+													:input-height="44"
+													:max="Number(goods.inventoryNum)"
+													:min="goods.setNum"
+													@blur="numberChange($event, goods)"
+													@plus="clacAdd($event, goods)"
+													@minus="clacSusubtract($event, goods)"
+												></u-number-box>
+											</block>
+										</view>
+									</view>
+								</view>
+							</view>
+						</u-swipe-action>
+					</view>
+				</view>
+				<view class="card invalid-card" v-if="invalidData.length">
+					<view class="clearfix invalid-view">
+						<text class="float_left invalid-tit">失效商品({{ invalidData.length }})</text>
+						<text class="float_right invalid-btn primary-color" @click="clearInvalid">清空失效商品</text>
+					</view>
+					<view class="cart-list" v-for="(goods, goodsindex) in invalidData" :key="goodsindex">
+						<view class="cart-item clearfix">
+							<!-- 是否选中 -->
+							<view class="image-wrapper float_left">
+								<view class="invalid-tag"><text>已失效</text></view>
+								<!-- 图片 -->
+								<image :src="goods.goodsImages" mode="aspectFill" />
+							</view>
+							<!-- 标题 -->
+							<view class="item-right float_left">
+								<view class="title ellipsis">{{ goods.goodsName }}</view>
+								<view class="invalid-msg">{{ goods.invalidMsg }}</view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+			<!-- 优惠券面板 -->
+		</view>
+		<!-- 底部菜单栏 -->
+		<view class="action-section" v-if="isLogin" :style="{ bottom: isBang ? '170rpx' : '100rpx' }">
+			<view class="action-section-main">
+				<view class="checkbox clearfix">
+					<text @click="checkShop(allChecked, '', 3)" class="ibonfont float_left" :class="[allChecked ? 'ibonxuanze_xuanzhong primary-color' : 'ibonxuanze']"></text>
+					<view class="all-btn float_right" :class="{ show: allChecked }">
+						<text @click="checkShop(allChecked, '', 3)">全选</text>
+						<!-- #ifdef MP -->
+						<text style="margin-left: 24upx;" @click="is_edit = !is_edit">{{ is_edit ? '完成' : '编辑' }}</text>
+						<!-- #endif -->
+					</view>
+				</view>
+				<view class="total-box" v-if="!is_edit">
+					<view>
+						<text class="total-text">合计:</text>
+						<text class="price primary-color">¥{{ $_utils.formatNub(goodsDataAll.payMoney) || 0 }}</text>
+					</view>
+					<!-- 说明 -->
+					<view class="freeExpressPrice" v-if="!goodsDataAll.totalMoney && startDeliveryPrice" @click="goPage('/pages/classification/cate', 'switchTab')">
+						<text>满{{ startDeliveryPrice }}元起送,先去逛逛</text>
+						<u-icon name="arrow-right" size="20"></u-icon>
+					</view>
+					<view
+						class="freeExpressPrice"
+						v-else-if="startDeliveryPrice && goodsDataAll.totalMoney < startDeliveryPrice"
+						@click="goPage('/pages/classification/cate', 'switchTab')"
+					>
+						<text>还差{{ $NP.minus(startDeliveryPrice, goodsDataAll.totalMoney) }}元起送,再去逛逛</text>
+						<u-icon name="arrow-right" size="20"></u-icon>
+					</view>
+
+					<view class="freeExpressPrice" v-else-if="freeExpressPrice > 0" @click="goPage('/pages/classification/cate', 'switchTab')">
+						还差{{ freeExpressPrice.toFixed(2) }}元免运费,去凑单
+						<u-icon name="arrow-right" size="20"></u-icon>
+					</view>
+					<!--  v-else-if="goodsDataAll.preferential > 0"  -->
+					<view class="freeExpressPrice" v-else @click="goPage('/pages/classification/cate', 'switchTab')">
+						总额:¥{{ goodsDataAll.totalMoney || 0 }} 活动优惠:-¥{{ goodsDataAll.preferential || 0 }}
+					</view>
+				</view>
+				<view v-if="!is_edit" @click="createOrder" class="confirm-btn primary-bg">
+					<text v-if="!goodsDataAll.totalMoney">随便逛逛</text>
+					<text v-else-if="goodsDataAll.totalMoney < startDeliveryPrice">去凑单</text>
+					<text v-else>去结算</text>
+					<!--  ({{ goodsDataAll.checkNum || 0 }}) -->
+				</view>
+				<text v-if="is_edit" class="del-goods-btn" @click="delSelect">删除</text>
+			</view>
+		</view>
+		<!-- 底部tabbar -->
+		<Tabbar v-model="tab_current"></Tabbar>
+	</view>
+</template>
+<script>
+import Login from '@/components/Login.vue';
+export default {
+	components: {
+		Login
+	},
+	data() {
+		return {
+			tab_current: 2,
+			is_edit: false,
+			totalMoney: 0, //总价格
+			buyNum: 1, //更新购物数字
+			checkedShop: false, //商铺选择
+			allChecked: false, //全选状态  true|false
+			empty: false, //空白页现实  true|false
+			goodsData: [], //店铺列表
+			invalidData: [], //失效商品
+			shopGoodsData: [], //商品列表
+			options: [
+				{
+					text: '删除',
+					style: {
+						backgroundColor: 'rgb(255,58,49)'
+					}
+				}
+			],
+			goodsDataAll: {
+				activityMoney: '0.00',
+				cartNum: 0,
+				checkNum: 0,
+				expressMoney: 0,
+				goodsData: [],
+				goodsNum: 0,
+				invalidData: [],
+				payMoney: '0.00',
+				preferential: '0.00',
+				totalMoney: '0.00',
+				vipDiscount: 0,
+				vipDoubleDiscount: 0
+			}
+		};
+	},
+	// #ifdef APP-PLUS || H5
+	onNavigationBarButtonTap(obj) {
+		var currentWebview = this.$mp.page.$getAppWebview();
+		var tn = currentWebview.getStyle().titleNView;
+		// 修改buttons
+		// index: 按钮索引, style {WebviewTitleNViewButtonStyles }
+		if (!this.is_edit) {
+			this.is_edit = true;
+			tn.buttons[0].text = '完成'; //[0] 按钮的下标
+			currentWebview.setStyle({
+				titleNView: tn
+			});
+		} else if (this.is_edit) {
+			// console.log(132312);
+			this.is_edit = false;
+			tn.buttons[0].text = '编辑'; //[0] 按钮的下标
+			currentWebview.setStyle({
+				titleNView: tn
+			});
+		}
+	},
+	// #endif
+
+	watch: {
+		'$store.state.locationObj'(val) {
+			if (JSON.stringify(val) === '{}') {
+				this.getAuthorizeInfo();
+				return;
+			}
+			if (this.isLogin) {
+				this.getCartByUserCenterId();
+			}
+		},
+		isLogin(val) {
+			if (val) {
+				this.getCartByUserCenterId();
+			}
+		}
+	},
+	computed: {
+		// 判断市场常见的几种刘海屏机型 true为刘海机型
+		isBang() {
+			return this.$_utils.modelmes();
+		},
+		isLogin() {
+			return this.$store.state.hasLogin;
+		},
+		startDeliveryPrice() {
+			return this.$store.state.baseSet.startDeliveryPrice || 0;
+		},
+		freeExpressPrice() {
+			const freeExpressPrice = this.$store.state.baseSet.freeExpressPrice || 0;
+			return this.$NP.minus(freeExpressPrice, this.goodsDataAll.totalMoney);
+		}
+	},
+	onLoad() {
+		if (JSON.stringify(this.$store.state.locationObj) === '{}') {
+			this.getAuthorizeInfo();
+		}
+		// #ifdef MP-WEIXIN
+		// 小程序的原生菜单中显示分享按钮
+		uni.showShareMenu({
+			withShareTicket: false,
+			menus: ['shareAppMessage', 'shareTimeline']
+		});
+		// #endif
+	},
+
+	onShow() {
+		if (this.$store.state.hasLogin) {
+			this.getCartByUserCenterId();
+		}
+	},
+	onPullDownRefresh() {
+		if (this.isLogin) {
+			this.getCartByUserCenterId();
+		} else {
+			uni.stopPullDownRefresh();
+		}
+	},
+	methods: {
+		// 点击添加clacAdd
+		clacAdd(e, goods) {
+			if (goods.selection === 5) {
+				this.goodsDataAll.totalMoney = this.$NP.plus(Number(this.goodsDataAll.totalMoney), Number(goods.price));
+			}
+
+			this.updateBuyNum(goods.cartId, e.value);
+		},
+		// 点击减少数量
+		clacSusubtract(e, goods) {
+			// if (goods.buyNum === 1) {
+			// 	this.$api.msg('商品数量不可以再减少了哦');
+			// 	return;
+			// }
+			if (goods.selection === 5) {
+				this.goodsDataAll.totalMoney = this.$NP.minus(Number(this.goodsDataAll.totalMoney), Number(goods.price));
+			}
+
+			this.updateBuyNum(goods.cartId, e.value);
+		},
+		// 手动输入
+		numberChange(e, goods) {
+			if (e.value <= 0) {
+				this.$api.msg('请输入正确的数量');
+				return;
+			}
+			this.updateBuyNum(goods.cartId, e.value);
+		},
+		// 更新购物车数量 updateBuyNum
+		updateBuyNum(id, buyNum) {
+			this.$u.api
+				.updateBuyNum(id, {
+					buyNum: buyNum
+				})
+				.then(res => {
+					this.getCartByUserCenterId();
+				})
+				.catch(() => {
+					this.getCartByUserCenterId();
+				});
+		},
+		//请求数据 获取商品列表
+		getCartByUserCenterId() {
+			this.$u.api.getCartByUserCenterId().then(({ data }) => {
+				uni.stopPullDownRefresh();
+				if (Array.isArray(data)) {
+					this.goodsDataAll = {
+						activityMoney: '0.00',
+						cartNum: 0,
+						checkNum: 0,
+						expressMoney: 0,
+						goodsData: [],
+						goodsNum: 0,
+						invalidData: [],
+						payMoney: '0.00',
+						preferential: '0.00',
+						totalMoney: '0.00',
+						vipDiscount: 0,
+						vipDoubleDiscount: 0
+					};
+					this.goodsData = [];
+					this.invalidData = [];
+					this.$store.commit('commit_cartNum', 0);
+					this.$store.commit('commit_cartPrice', 0);
+					return;
+				}
+				this.goodsDataAll = data;
+				this.invalidData = data.invalidData || [];
+				if (data.goodsData && data.goodsData.length) {
+					data.goodsData.forEach(item => {
+						item.checkedShop = item.shopGoodsData.every(itemG => itemG.selection === 5);
+						item.shopGoodsData.forEach(goods => {
+							goods.isShow = false;
+						});
+					});
+					this.goodsData = data.goodsData;
+					this.allChecked = this.goodsData.every(item => item.checkedShop);
+				} else {
+					this.goodsData = [];
+				}
+				this.$store.commit('commit_cartNum', data.goodsNum);
+				this.$store.commit('commit_cartPrice', data.totalMoney);
+			});
+		},
+		//  打开swipeAction
+		openItem(i, gi) {
+			// 先将正在被操作的swipeAction标记为打开状态,否则由于props的特性限制,
+			// 原本为'false',再次设置为'false'会无效
+			let target = this.$u.deepClone(this.goodsData);
+			target[i].shopGoodsData[gi].isShow = true;
+			this.goodsData = target;
+		},
+		// 选中切换
+		// type 1 单商品;2 店铺切换;3 全选切换
+		async checkShop(checked, id, type, row, PRow) {
+			const selection = checked ? 4 : 5;
+			const params = {
+				selection: selection,
+				type: type
+			};
+			if (type === 1) {
+				params.cartId = id;
+				// 前端手动把选择标示进行切换,优化操作体验
+				row.selection = selection;
+				PRow.checkedShop = PRow.shopGoodsData.every(itemG => itemG.selection === 5);
+				this.allChecked = this.goodsData.every(item => item.checkedShop);
+			} else if (type === 2) {
+				params.shopId = id;
+				// 前端手动把选择标示进行切换,优化操作体验
+				row.checkedShop = !checked;
+				row.shopGoodsData.forEach(item => {
+					item.selection = selection;
+				});
+				this.allChecked = this.goodsData.every(item => item.checkedShop);
+			} else {
+				// 前端手动把选择标示进行切换,优化操作体验
+				this.allChecked = !checked;
+				this.goodsData.forEach(item => {
+					item.checkedShop = !checked;
+					item.shopGoodsData.forEach(goods => {
+						goods.selection = selection;
+					});
+				});
+			}
+			this.$u.api
+				.updateSelection({
+					...params
+				})
+				.then(res => {
+					this.getCartByUserCenterId();
+				});
+		},
+		// 移出商品
+		delSelect() {
+			let chooseGoods = [];
+			this.goodsData.forEach(item => {
+				item.shopGoodsData.forEach(itemC => {
+					if (itemC.selection === 5) {
+						chooseGoods.push(itemC.cartId);
+					}
+				});
+			});
+			this.deleteCartItem(chooseGoods);
+		},
+		// 清空失效
+		clearInvalid() {
+			let chooseGoods = this.invalidData.map(item => {
+				return item.cartId;
+			});
+			this.deleteCartItem(chooseGoods);
+		},
+		// deleteCartItem 删除
+		deleteCartItem(cartId, row, index, gIndex) {
+			if (cartId.length === 0) {
+				this.$api.msg('请选择要删除的商品');
+				return;
+			}
+			uni.showModal({
+				title: '提示',
+				content: '你确定将此产品移除购物车',
+				success: res => {
+					if (res.confirm) {
+						this.$u.api
+							.delCart({
+								cartId: cartId
+							})
+							.then(res => {
+								this.getCartByUserCenterId();
+							});
+					}
+				}
+			});
+		},
+		//创建订单
+		createOrder() {
+			// if (this.$store.state.baseSet.personnelReview === 5) {
+			// 验证账户状态
+			this.userAudit();
+			if (!this.isUserAudit) {
+				return;
+			}
+			// }
+			if (!this.goodsDataAll.totalMoney) {
+				this.goPage('/pages/classification/cate', 'switchTab');
+				return;
+			}
+			if (this.startDeliveryPrice && this.goodsDataAll.totalMoney < this.startDeliveryPrice) {
+				// this.$api.msg('请选择要结算的商品');
+				this.goPage('/pages/classification/cate', 'switchTab');
+				return;
+			}
+			if (!this.goodsDataAll.checkNum) {
+				this.$api.msg('请选择要结算的商品');
+				return;
+			}
+			let isSub = true;
+			for (let i in this.goodsData) {
+				let item = this.goodsData[i];
+				for (let g in item.shopGoodsData) {
+					let goods = item.shopGoodsData[g];
+					if (goods.selection === 5 && goods.isInvalid === 4) {
+						isSub = false;
+						break;
+					}
+				}
+			}
+			if (!isSub) {
+				this.$api.msg('抱歉,您要结算的商品中包含失效商品,请取消后再次进行提交');
+				return;
+			}
+			uni.navigateTo({
+				url: `/pagesT/order/createOrder`
+			});
+		}
+	},
+	onShareAppMessage(options) {
+		return {
+			title: this.$store.state.baseSet.shop,
+			path: '/pages/index/index?businessmanId=' + (this.$store.state.userStatus.id||''),
+			success: res => {
+				console.log(res);
+			}
+		};
+	},
+	// #ifdef MP-WEIXIN
+	// 分享到朋友圈
+	onShareTimeline(obj) {},
+	// 收藏小程序
+	onAddToFavorites() {}
+	// #endif
+};
+</script>
+
+<style lang="scss">
+.box {
+	border-bottom: 1px solid #eeeeee;
+	.title {
+		font-size: 28upx;
+		font-weight: 510;
+		padding-left: 24upx;
+		line-height: 94rpx;
+		color: #3c3c3c;
+	}
+	.ibonfont {
+		display: inline-block;
+		color: #cccccc;
+		font-size: 36rpx;
+	}
+}
+.container {
+	padding-bottom: 100upx;
+}
+
+/* 购物车列表项 */
+.card {
+	background: #ffffff;
+	padding: 0 48upx 32rpx;
+	margin-bottom: 20rpx;
+}
+.total-view {
+	text-align: right;
+	font-size: 32upx;
+	color: #999;
+	padding: 24upx 0;
+
+	.price {
+		color: $price-color;
+		font-size: 30upx;
+		font-weight: 510;
+	}
+}
+
+.uniSwipe:last-child {
+	.cart-item {
+		border-bottom: 0 none;
+	}
+}
+.cart-item {
+	padding-top: 24upx;
+	.ibonfont {
+		transform: translateY(60upx);
+		color: #cccccc;
+		font-size: 36rpx;
+		display: inline-block;
+		width: 34rpx;
+		height: 34rpx;
+		margin-right: 16upx;
+	}
+	.image-wrapper {
+		width: 152upx;
+		height: 152upx;
+
+		background-color: #eef3f4;
+		border-radius: 12upx;
+		image {
+			width: 100%;
+			height: 100%;
+			border-radius: 12upx;
+		}
+	}
+	.item-right {
+		margin-left: 16upx;
+		width: 430rpx;
+		position: relative;
+		.del-btn {
+			padding: 4upx 10upx;
+			font-size: 30upx;
+			height: 50upx;
+			color: $font-color-light;
+			position: absolute;
+			top: 0;
+			right: 20upx;
+		}
+		.title {
+			color: #3c3c3c;
+			font-size: 28upx;
+			height: 40upx;
+			line-height: 40upx;
+			text-overflow: -o-ellipsis-lastline;
+			overflow: hidden;
+			text-overflow: ellipsis;
+			display: -webkit-box;
+			-webkit-line-clamp: 1;
+			line-clamp: 2;
+			-webkit-box-orient: vertical;
+			font-weight: 510;
+		}
+		.attr {
+			font-size: 24upx;
+			font-weight: 400;
+			color: #9b9b9b;
+			height: 32rpx;
+			margin: 8rpx 0;
+			line-height: 32rpx;
+		}
+		.price {
+			color: $price-color;
+			font-size: 40upx;
+			font-weight: 510;
+			font-family: DIN-Medium;
+		}
+		.activity-tag {
+			width: 76rpx;
+			font-size: 20rpx;
+			color: #ffffff;
+			height: 32rpx;
+			line-height: 32rpx;
+			text-align: center;
+			border-radius: 6rpx;
+			margin-left: 10rpx;
+			margin-top: 16rpx;
+		}
+	}
+}
+/* 底部栏 */
+.action-section {
+	position: fixed;
+	left: 0upx;
+	bottom: 100upx;
+	z-index: 95;
+	width: 100%;
+	height: 100rpx;
+	background-color: #ffffff;
+	.delivery-tip {
+		font-size: 22upx;
+		background-color: #fdf6ec;
+		color: #d48d24;
+		text-align: center;
+		line-height: 42upx;
+	}
+	.action-section-main {
+		padding: 0 0 0 32upx;
+		height: 100upx;
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		.checkbox {
+			height: 52upx;
+			image {
+				width: 30upx;
+				height: 100%;
+				z-index: 5;
+			}
+			.ibonfont {
+				font-size: 36rpx;
+				display: inline-block;
+				width: 34rpx;
+				height: 34rpx;
+				color: #cccccc;
+				transform: translateY(10rpx);
+			}
+		}
+		.all-btn {
+			color: #6c6c6c;
+			font-size: 24upx;
+			line-height: 60upx;
+			padding-left: 12upx;
+			font-weight: 400;
+		}
+		.total-box {
+			flex: 1;
+			text-align: right;
+			.total-text {
+				color: #3c3c3c;
+				font-size: 24upx;
+				font-weight: 400;
+			}
+			.price {
+				font-size: 36upx;
+				color: $price-color;
+				font-weight: 600;
+			}
+			.freeExpressPrice {
+				font-size: 20rpx;
+				color: #9c9c9c;
+			}
+		}
+		.confirm-btn {
+			height: 52upx;
+			line-height: 52upx;
+			color: #ffffff;
+			background-color: #f63434;
+			text-align: center;
+			border-radius: 52upx;
+			padding: 0 30rpx;
+			margin: 0 24rpx;
+			font-size: 28rpx;
+		}
+		.diff-price {
+			font-size: 24upx;
+			color: #666;
+			line-height: 90upx;
+			padding-right: 10upx;
+		}
+
+		.del-goods-btn {
+			width: 140upx;
+			height: 60upx;
+			line-height: 60upx;
+			border: 1px solid #fd463e;
+			color: #fd463e;
+			font-size: 26upx;
+			text-align: center;
+			border-radius: 6upx;
+			margin-right: 24upx;
+		}
+	}
+}
+
+/* 复选框选中状态 */
+.action-section .checkbox.checked,
+.cart-item .checkbox.checked {
+	color: #fd463e;
+}
+
+.invalid-card {
+	background: #ffffff;
+	border-radius: 12upx;
+	margin: 0 auto 24upx;
+	padding: 0 24rpx 24rpx;
+	width: 702rpx;
+	.invalid-view {
+		line-height: 94rpx;
+		border-bottom: 1px solid #eeeeee;
+		.invalid-tit {
+			font-size: 28upx;
+			font-weight: 510;
+			color: #3c3c3c;
+		}
+
+		.invalid-btn {
+			font-size: 24upx;
+			color: $uni-color-error;
+		}
+	}
+	.cart-list {
+		.cart-item {
+			.image-wrapper {
+				position: relative;
+				.invalid-tag {
+					position: absolute;
+					left: 50%;
+					top: 50%;
+					transform: translate(-50%, -50%);
+					width: 100rpx;
+					height: 100rpx;
+					background-color: rgba($color: #000000, $alpha: 0.5);
+					font-size: 20rpx;
+					color: #eeeeee;
+					font-weight: 300;
+					border-radius: 100%;
+					text {
+						position: absolute;
+						left: 50%;
+						top: 50%;
+						transform: translate(-50%, -50%);
+						text-align: center;
+						display: block;
+						width: 88rpx;
+						height: 88rpx;
+						line-height: 90rpx;
+						border-radius: 100%;
+						border: 2rpx solid #cccccc;
+					}
+				}
+			}
+			.item-right {
+				position: relative;
+				height: 152rpx;
+				.title {
+					height: 66rpx;
+					font-size: 24rpx;
+					font-weight: 400;
+					color: #9b9b9b;
+					line-height: 33rpx;
+				}
+				.invalid-msg {
+					position: absolute;
+					left: 0;
+					bottom: 0;
+					font-size: 24rpx;
+					font-weight: 400;
+					color: #3c3c3c;
+				}
+			}
+		}
+	}
+}
+</style>

+ 326 - 0
pages/classification/CateFive.vue

@@ -0,0 +1,326 @@
+<template>
+	<view class="clearfix" :class="['qn-page-' + theme]">
+		<view class="float_left">
+			<scroll-view scroll-y class="left-aside" :style="{ height: 'calc(100vh - 112rpx - ' + (isBang ? '84px' : '50px') + ')' }">
+				<view v-for="item in cate_list" :key="item.id" class="f-item b-b ellipsis" :class="{ active: item.id === current_item.id }" @click="tabtap(item)">
+					<view v-if="item.id === current_item.id" class="active-line primary-bg"></view>
+					{{ item.title }}
+				</view>
+			</scroll-view>
+		</view>
+		<view class="float_right">
+			<!-- 二级下拉菜单 -->
+			<view class="two-cate">
+				<scroll-view :scroll-x="true" scroll-with-animation class="two-cate-scroll" :scroll-left="two_cate_scroll">
+					<view
+						v-for="(item, index) in current_item.children"
+						:key="index"
+						:class="[tow_current === index ? 'primary-btn-pain' : '']"
+						class="cate-two-li"
+						@click="twoCateChange(index, item)"
+					>
+						{{ item.title }}
+					</view>
+				</scroll-view>
+			</view>
+			<scroll-view
+				scroll-y
+				scroll-with-animation
+				class="right-aside"
+				:style="{ height: 'calc(100vh - 188rpx - ' + (isBang ? '84px' : '50px') + ')' }"
+				:scroll-top="scroll_right_top"
+				@scroll="rightScroll"
+			>
+				<view v-for="(titem, tindex) in current_item.children" :key="tindex" class="cate-ul" :id="'item' + tindex">
+					<block v-if="titem.children.length">
+						<view class="cate-name">{{ titem.title }}</view>
+						<view class="clearfix">
+							<view
+								class="cate-li"
+								v-for="(item, index) in titem.children"
+								:key="index"
+								@click="goPage('/pagesT/productDetail/productDetail?id=' + item.id + '&name=' + item.title)"
+							>
+								<view class="cate-img-view">
+									<image v-if="item.images" :src="item.images" mode="aspectFill" class="cate-img"></image>
+									<view class="ibonfont ibonleimupinleifenleileibie cate-img-icon" v-else></view>
+								</view>
+								<view class="cate-tit ellipsis">{{ item.title }}</view>
+							</view>
+						</view>
+					</block>
+				</view>
+			</scroll-view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			cate_list: [],
+			tow_current: 0,
+			current_item: {},
+			scroll_right_top: 0, // 右边三级分类栏目scroll-view的滚动条高度
+			old_scroll_top: 0,
+			option_arr: [], // 把3级分类的每一块位置信息存储到数组中
+			two_cate_scroll: 0, // 2级分类滚动
+			menu_width: 0, // 2级分类菜单的宽度
+			menu_item_width: 0, // 2级分类菜单item的宽度
+			timer: null, // 定时器
+			menu_height: 0 // 3级菜单高度
+		};
+	},
+	computed: {
+		isBang() {
+			return this.$_utils.modelmes();
+		},
+		userId() {
+			return this.$store.state.userStatus.id;
+		}
+	},
+	created() {
+		this.getAllCategory();
+	},
+	methods: {
+		// 分类列表 getAllCategory
+		getAllCategory() {
+			this.$u.api
+				.getAllCategory({
+					userCenterId: this.userId || 0
+				})
+				.then(({ data }) => {
+					this.cate_list = data;
+					if (data.length) {
+						this.current_item = data[0];
+					}
+					this.getMenuItemTop();
+				});
+		},
+		// 一级分类切换
+		tabtap(row) {
+			this.current_item = row;
+			this.tow_current = 0;
+		},
+		// 2级分类切换
+		async twoCateChange(index, row) {
+			if (this.option_arr.length == 0) {
+				await this.getMenuItemTop();
+			}
+			if (row.id == this.two_id) return;
+			this.scroll_right_top = this.old_scroll_top;
+			this.$nextTick(() => {
+				this.scroll_right_top = this.option_arr[index];
+				this.tow_current = index;
+				this.twoMenuStatus(index, 1);
+			});
+		},
+		// 3级分类列表滚动
+		async rightScroll(e) {
+			this.old_scroll_top = e.detail.scrollTop;
+			// if(this.option_arr.length == 0) {
+			// 	await this.getMenuItemTop();
+			// }
+			// if(this.timer) return ;
+			// if(!this.menu_height) {
+			// 	await this.getElRect('right-aside', 'menu_height','height');
+			// }
+			// setTimeout(() => { // 节流
+			// 	this.timer = null;
+			// 	// scrollHeight为右边菜单垂直中点位置
+			// 	let scrollHeight = e.detail.scrollTop + this.menu_height / 2;
+			// 	for (let i = 0; i < this.option_arr.length; i++) {
+			// 		let height1 = this.option_arr[i];
+			// 		let height2 = this.option_arr[i + 1];
+			// 		// 如果不存在height2,意味着数据循环已经到了最后一个,设置2级菜单为最后一项即可
+			// 		if (!height2 || scrollHeight >= height1 && scrollHeight < height2) {
+			// 			this.twoMenuStatus(i);
+			// 			return ;
+			// 		}
+			// 	}
+			// }, 10)
+		},
+		// 设置2级分类的滚动状态
+		async twoMenuStatus(index) {
+			this.tow_current = index;
+			// 如果为0,意味着尚未初始化
+			if (this.menu_width == 0 || this.menu_item_width == 0) {
+				await this.getElRect('two-cate-scroll', 'menu_width', 'width');
+				await this.getElRect('cate-two-li', 'menu_item_width', 'width');
+			}
+			// 将菜单活动item居中
+			this.two_cate_scroll = index * this.menu_width + this.menu_item_width / 2 - this.menu_width / 2;
+		},
+		// 获取3级分类列表菜单每个item到顶部的距离
+		getMenuItemTop() {
+			new Promise(resolve => {
+				let selectorQuery = uni.createSelectorQuery().in(this);
+				//添加节点的布局位置的查询请求
+				selectorQuery
+					.selectAll('.cate-ul')
+					.boundingClientRect(rects => {
+						// 如果节点尚未生成,rects值为[](因为用selectAll,所以返回的是数组),循环调用执行
+						if (!rects.length) {
+							setTimeout(() => {
+								this.getMenuItemTop();
+							}, 10);
+							return;
+						}
+						rects.forEach(rect => {
+							// 这里减去rects[0].top,是因为第一项顶部可能不是贴到导航栏(比如有个搜索框的情况)
+							this.option_arr.push(rect.top - rects[0].top);
+							resolve();
+						});
+					})
+					.exec();
+			});
+		},
+		// 获取一个目标元素的宽度
+		getElRect(elClass, dataVal, option) {
+			new Promise((resolve, reject) => {
+				const query = uni.createSelectorQuery().in(this);
+				query
+					.select('.' + elClass)
+					.fields(
+						{
+							size: true
+						},
+						res => {
+							// 如果节点尚未生成,res值为null,循环调用执行
+							if (!res) {
+								setTimeout(() => {
+									this.getElRect(elClass, dataVal);
+								}, 10);
+								return;
+							}
+							this[dataVal] = res[option];
+							resolve();
+						}
+					)
+					.exec();
+			});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.left-aside {
+	width: 200upx;
+	background-color: #f5f6f7;
+	/* #ifdef H5||MP */
+	height: calc(100vh - 130upx);
+	/*#endif*/
+	/* #ifdef APP-PLUS */
+	height: 100vh;
+	/*#endif*/
+	.f-item {
+		-webkit-line-clamp: 1;
+		width: 100%;
+		height: 80upx;
+		line-height: 80rpx;
+		padding-left: 48rpx;
+		margin-bottom: 10rpx;
+		font-size: 26upx;
+		color: #4b4b4b;
+		position: relative;
+
+		&.active {
+			color: #000000;
+			font-size: 32upx;
+			font-weight: bold;
+			background-color: #ffffff;
+			border-radius: 100rpx 0 0 100rpx;
+		}
+		.active-line {
+			position: absolute;
+			left: 28rpx;
+			top: 50%;
+			transform: translateY(-50%);
+			height: 24upx;
+			width: 4upx;
+			border-radius: 4rpx;
+		}
+	}
+}
+.two-cate {
+	.two-cate-scroll {
+		width: 550upx;
+		padding: 14rpx 0;
+		white-space: nowrap;
+		.cate-two-li {
+			padding: 0 32rpx;
+			display: inline-block;
+			font-size: 24rpx;
+			margin-left: 16rpx;
+			border: 1px solid #f5f6f7;
+			background-color: #f5f6f7;
+			border-radius: 50rpx;
+			height: 48rpx;
+			line-height: 48rpx;
+			&:last-child {
+				margin-right: 40rpx;
+			}
+			&:first-child {
+				margin-left: 40rpx;
+			}
+		}
+	}
+}
+.right-aside {
+	/* #ifdef H5||MP */
+	height: calc(100vh - 140upx);
+	/*#endif*/
+	/* #ifdef APP-PLUS */
+	height: 100vh;
+	/*#endif*/
+	width: 550upx;
+	.cate-name {
+		padding-top: 20rpx;
+		padding-left: 40rpx;
+		font-size: 26rpx;
+		font-weight: 600;
+		color: #000000;
+	}
+	.cate-li {
+		float: left;
+		width: 130upx;
+		text-align: center;
+		margin: 20upx 0 20rpx 40rpx;
+		.cate-img-view {
+			width: 130rpx;
+			height: 104rpx;
+			background: #f5f7f7;
+			border-radius: 8px;
+			margin-bottom: 24rpx;
+			.cate-img {
+				width: 84upx;
+				height: 84upx;
+				border-radius: 8upx;
+				display: block;
+				margin: 0 auto;
+				transform: translateY(10rpx);
+			}
+			.cate-img-icon {
+				font-size: 80upx;
+				width: 84upx;
+				line-height: 84upx;
+				color: #eeeeee;
+				height: 84upx;
+				border-radius: 8upx;
+				margin: 0 auto;
+				transform: translateY(10rpx);
+			}
+		}
+
+		.cate-tit {
+			font-size: 24upx;
+			font-weight: 400;
+			color: #3a3a3a;
+			width: 100%;
+			-webkit-line-clamp: 1;
+		}
+	}
+}
+</style>

+ 658 - 0
pages/classification/CateFour.vue

@@ -0,0 +1,658 @@
+<template>
+	<view :class="['qn-page-' + theme]">
+		<view class="tabs-view" v-if="tlist.length">
+			<u-tabs
+				height="70"
+				inactive-color="#2A2A2A"
+				:active-color="primaryColor"
+				:bar-style="{ borderRadius: '0', height: '4rpx', backgroundColor: primaryColor }"
+				:list="tlist"
+				name="title"
+				font-size="28"
+				:is-scroll="true"
+				:current="cate_current"
+				@change="cateChange($event)"
+			></u-tabs>
+		</view>
+		<view class="clearfix main-cont" :style="mainStyle">
+			<view class="float_left">
+				<scroll-view scroll-y class="left-aside">
+					<view v-for="(item, index) in flist" :key="index" class="f-item ellipsis" :class="{ active: item.id === one_id }" @click="tabtap(item, 1)">
+						<view v-if="item.id === one_id" class="active-line primary-bg"></view>
+						{{ item.title }}
+					</view>
+				</scroll-view>
+			</view>
+			<view class="float_right">
+				<view class="search-view">
+					<view class="search-li" @click="changeSearch('zh')">综合</view>
+					<view class="search-li" @click="changeSearch('xl')">
+						销量
+						<view class="arrow-icon arrow-up"><u-icon name="arrow-up-fill" :color="sortt === 1 ? primaryColor : '#6c6c6c'" size="10"></u-icon></view>
+						<view class="arrow-icon arrow-down"><u-icon name="arrow-down-fill" :color="sortt === 2 ? primaryColor : '#6c6c6c'" size="10"></u-icon></view>
+					</view>
+					<view class="search-li" @click="openKey('show_brand')">
+						<text style="margin-right: 10rpx;">品牌</text>
+						<u-icon color="#6c6c6c" name="arrow-down" size="20"></u-icon>
+					</view>
+					<view class="search-li" @click="openKey('show_support')">
+						<text style="margin-right: 10rpx;">其他</text>
+						<u-icon color="#6c6c6c" name="arrow-down" size="20"></u-icon>
+					</view>
+				</view>
+				<!-- 品牌选择 -->
+				<view class="cate-down-view" v-if="show_brand">
+					<view class="search-pop">
+						<view class="head-view clearfix">
+							<text class="float_left">商品品牌</text>
+							<view class="float_right" @click.stop="closeKey('show_brand')"><u-icon color="#8f8f8f" size="28" name="arrow-down"></u-icon></view>
+						</view>
+						<view class="cate-cont">
+							<block v-for="(item, index) in brand_list" :key="index">
+								<view class="cate-li ellipsis" :class="[brandId_zc.indexOf(item.id) > -1 ? 'primary-btn-pain' : '']" @click.stop="brandChange(item.id)">
+									{{ item.title }}
+								</view>
+							</block>
+						</view>
+						<view class="btn-ul">
+							<view class="btn-li primary-btn-pain" @click="resetBrand">重置</view>
+							<view class="btn-li primary-bg" @click="confirmBrand">确认</view>
+						</view>
+					</view>
+				</view>
+				<!-- 商品服务选择 -->
+				<view class="cate-down-view" v-if="show_support">
+					<view class="search-pop">
+						<view class="head-view clearfix">
+							<text class="float_left">商品服务</text>
+							<view class="float_right" @click.stop="closeKey('show_support')"><u-icon color="#8f8f8f" size="28" name="arrow-down"></u-icon></view>
+						</view>
+						<view class="cate-cont">
+							<block v-for="(item, index) in support_list" :key="index">
+								<view class="cate-li ellipsis" :class="[supplier_zc.indexOf(item.id) > -1 ? 'primary-btn-pain' : '']" @click.stop="supportChange(item.id)">
+									{{ item.servicesName }}
+								</view>
+							</block>
+						</view>
+						<view class="btn-ul">
+							<view class="btn-li primary-btn-pain" @click="resetSupport">重置</view>
+							<view class="btn-li primary-bg" @click="confirmSupport">确认</view>
+						</view>
+					</view>
+				</view>
+				<!-- 三级下拉菜单 -->
+				<view class="cate-down-view" @click="changeThreeCate(false)" v-if="show_cate">
+					<view @click.stop="changeThreeCate(true)">
+						<view class="head-view clearfix">
+							<text class="float_left">{{ two_cate }}</text>
+							<view class="float_right" @click.stop="changeThreeCate(false)"><u-icon color="#8f8f8f" size="28" name="arrow-down"></u-icon></view>
+						</view>
+						<view class="cate-cont">
+							<view
+								v-for="(item, index) in three_cate"
+								:key="index"
+								class="cate-li"
+								:class="[three_id === item.id ? 'primary-btn-pain' : '']"
+								@click.stop="threeCateChange(item)"
+							>
+								{{ item.title }}
+							</view>
+						</view>
+					</view>
+				</view>
+				<view class="right-aside clearfix">
+					<view class="three-cate" v-if="three_cate.length">
+						<scroll-view :scroll-x="true" class="three-cate-scroll">
+							<view
+								v-for="(item, index) in three_cate"
+								:key="index"
+								:class="[three_id === item.id ? 'primary-btn-pain' : '']"
+								class="cate-li"
+								@click="threeCateChange(item)"
+							>
+								{{ item.title }}
+							</view>
+						</scroll-view>
+						<view class="down-btn" @click="changeThreeCate(true)"><u-icon color="#8f8f8f" size="28" name="arrow-down"></u-icon></view>
+					</view>
+
+					<!-- 循环item出来为对象 -->
+					<scroll-view
+						class="right-aside-scroll"
+						:style="goodsScrollHeight"
+						scroll-y
+						lower-threshold="100px"
+						@scrolltolower="lower"
+						v-if="shoppingList.length > 0"
+						:scroll-top="scroll_top_num"
+					>
+						<view class="goods-li" v-for="(item, index) in shoppingList" :key="index">
+							<GoodsItem :isList="true" :item="item" @addCart="addCard(item.id)"></GoodsItem>
+						</view>
+						<u-loadmore margin-top="20" v-if="shoppingList.length" :status="loading_status" />
+					</scroll-view>
+					<Aempty text="没有商品" src="https://onlineimg.qianniao.vip/search.png" v-else></Aempty>
+				</view>
+			</view>
+			<AddCardModel :selAddress="selAddressD" @close="cardModelPopChange" :isShow="is_add_show" :goodsId="goods_id" />
+		</view>
+	</view>
+</template>
+
+<script>
+import GoodsItem from '@/components/GoodsItem.vue';
+import Login from '@/components/Login.vue';
+import AddCardModel from '@/components/AddCardModel';
+
+export default {
+	components: {
+		AddCardModel,
+		GoodsItem,
+		Login
+	},
+
+	data() {
+		return {
+			show_support: false,
+			show_brand: false,
+			show_cate: false,
+			cate_current: 0,
+			is_add_show: false,
+			goods_id: 0,
+			loading_status: 'loadmore',
+			isShow: false,
+			scroll_top_num: 0,
+			sizeCalcState: false,
+			tabScrollTop: 0,
+			currentId: 1,
+			flist: [],
+			slist: [],
+			shoppingList: [],
+			tlist: [],
+			priceInfo: [],
+			before_cartNum: 0,
+			page: 1,
+			pageSize: 10,
+			pageTotal: 0,
+			selAddressD: {},
+			three_cate: [],
+			two_cate: '',
+			three_id: 0,
+			one_id: 0,
+			brandId_zc: [],
+			brand_list: [], // 商品品牌列表
+			support_list: [], // 商品服务列表
+			supplier_zc: [],
+			support: [], //商品服务
+			brandId: [], // 品牌多选
+			// sort 是js保留字段,所以定义为 sortt
+			sortt: '' // 销量 1是从大到小,2是从小到大, 默认不传
+		};
+	},
+	props: {
+		isLogin: {
+			type: Boolean,
+			default: true
+		},
+		selAddress: {
+			type: Object,
+			default: () => {
+				return {};
+			}
+		}
+	},
+	computed: {
+		cartNum() {
+			return this.$store.state.cartNum;
+		},
+		// 判断手机是否有刘海
+		isBang() {
+			return this.$_utils.modelmes();
+		},
+		mainStyle() {
+			return `paddingTop: ${this.tlist.length > 0 ? '0' : '12rpx'};height: calc(100vh - 112rpx - ${this.isBang ? '84px' : '50px'} - ${
+				this.tlist.length > 0 ? '80rpx' : '0rpx'
+			})`;
+		},
+		goodsScrollHeight() {
+			return `height:${this.three_cate.length ? 'calc(100% - 62rpx - 90rpx)' : 'calc(100% - 62rpx)'}`;
+		},
+		userId() {
+			return this.$store.state.userStatus.id;
+		}
+	},
+	watch: {
+		selAddress(val) {
+			this.selAddressD = val;
+		},
+		'$store.state.locationObj'(val) {
+			if (JSON.stringify(val) === '{}') {
+				return;
+			}
+			this.shoppingList = [];
+			this.pageSize = 10;
+			this.getGoodsByCategory();
+		},
+		async isLogin(Nval) {
+			this.tlist = [];
+			if (Nval) {
+				this.shoppingList = [];
+				this.pageSize = 10;
+				await this.getAllCategory();
+				await this.getGoodsByCategory();
+			}
+		}
+	},
+	async created() {
+		await this.getAllCategory();
+		await this.getAllGoodsSupport();
+		await this.getAllBrand();
+	},
+	methods: {
+		changeSearch(tag) {
+			if (tag === 'zh') {
+				this.brandId = [];
+				this.sortt = '';
+				this.support = [];
+			} else if (tag === 'xl') {
+				if (this.sortt === 2) {
+					this.sortt = 1;
+				} else {
+					this.sortt = 2;
+				}
+			}
+			this.page = 1;
+			this.getGoodsByCategory();
+		},
+		// 选择品牌
+		brandChange(id) {
+			const index = this.brandId_zc.indexOf(id);
+			if (index > -1) {
+				this.brandId_zc.splice(index, 1);
+			} else {
+				this.brandId_zc.push(id);
+			}
+		},
+		confirmBrand() {
+			this.brandId = this.brandId_zc;
+			this.page = 1;
+			this.getGoodsByCategory();
+			this.closeKey('show_brand');
+		},
+		// 选择服务
+		supportChange(id) {
+			const index = this.supplier_zc.indexOf(id);
+			if (index > -1) {
+				this.supplier_zc.splice(index, 1);
+			} else {
+				this.supplier_zc.push(id);
+			}
+		},
+		resetBrand() {
+			this.brandId = [];
+			this.page = 1;
+			this.getGoodsByCategory();
+			this.closeKey('show_brand');
+		},
+		resetSupport() {
+			this.support = [];
+			this.page = 1;
+			this.getGoodsByCategory();
+			this.closeKey('show_support');
+		},
+		confirmSupport() {
+			this.support = this.supplier_zc;
+			this.page = 1;
+			this.getGoodsByCategory();
+			this.closeKey('show_support');
+		},
+		openKey(key) {
+			if (key === 'show_support') {
+				this.supplier_zc = this.$u.deepClone(this.support);
+			} else {
+				this.brandId_zc = this.$u.deepClone(this.brandId);
+			}
+			this[key] = true;
+		},
+		closeKey(key) {
+			this[key] = false;
+		},
+		// 打开购物车
+		cardModelPopChange(obj) {
+			this.is_add_show = false;
+		},
+		// 加入购物车
+		addCard(id) {
+			this.goods_id = id;
+			this.is_add_show = true;
+		},
+		changeThreeCate(show) {
+			this.show_cate = show;
+		},
+		// 分类列表 getAllCategory
+		getAllCategory() {
+			this.$u.api
+				.getAllCategory({
+					userCenterId: this.userId || 0
+				})
+				.then(data => {
+					this.flist = data.data;
+					if (data.data.length) {
+						this.tlist = data.data[0].children || [];
+						this.currentId = data.data[0].id;
+						this.one_id = data.data[0].id;
+						// 二级菜单添加全部按钮
+						if (this.tlist.length) {
+							this.tlist.unshift({
+								title: '全部',
+								id: data.data[0].id,
+								pid: 0
+							});
+						}
+					}
+					this.getGoodsByCategory();
+				});
+		},
+		// 上拉加载
+		lower(e) {
+			if (this.pageTotal / this.pageSize > this.page) {
+				this.page += 1;
+				this.getGoodsByCategory();
+			}
+		},
+		// 获取商品列表
+		getGoodsByCategory() {
+			this.loading_status = 'loading';
+			this.isShow = false;
+			this.$u.api
+				.getGoodsByCategory({
+					categoryId: this.three_id || this.currentId,
+					page: this.page,
+					pageSize: this.pageSize,
+					brandId: this.brandId,
+					sort: this.sortt,
+					support: this.support
+				})
+				.then(data => {
+					this.scroll_top_num = 1;
+					const goods = data.data.map(item => {
+						return {
+							...item,
+							isShow: false
+						};
+					});
+					if (this.page === 1) {
+						this.shoppingList = goods;
+					} else {
+						this.shoppingList = this.shoppingList.concat(goods);
+					}
+					this.pageTotal = data.pageTotal;
+					this.loading_status = this.$_utils.loadStatus(this.page, this.pageSize, this.pageTotal);
+				});
+		},
+		//一级分类点击
+		tabtap(item, lever) {
+			this.currentId = item.id;
+			this.changeThreeCate(false);
+
+			if (lever === 1) {
+				this.one_id = item.id;
+				// 一级菜单
+				this.cate_current = 0;
+				const tlist = this.flist.find(cate => cate.id === item.id);
+				this.tlist = tlist.children || [];
+				// 二级菜单添加全部按钮
+				if (this.tlist.length && !this.tlist.find(cate => cate.title === '全部')) {
+					this.tlist.unshift({
+						title: '全部',
+						id: item.id
+					});
+				}
+				this.three_id = 0;
+				this.three_cate = [];
+			} else if (lever === 2) {
+				// 二级菜单
+				this.two_cate = item.title;
+				// 三级分类
+				this.three_cate = item.children || [];
+				// 三级分类添加全部按钮
+				if (this.three_cate.length && !this.three_cate.find(cate => cate.title === '全部')) {
+					this.three_cate.unshift({
+						title: '全部',
+						id: item.id
+					});
+				}
+				this.three_id = item.id;
+			}
+
+			this.page = 1;
+			this.shoppingList = [];
+			this.$nextTick(() => {
+				this.scroll_top_num = 0;
+			});
+			// 商品列表的切换
+			this.getGoodsByCategory();
+			// 品牌列表切换
+			this.getAllBrand();
+		},
+		cateChange(index) {
+			this.cate_current = index;
+			// 商品列表的切换
+			this.tabtap(this.tlist[index], 2);
+		},
+		threeCateChange(row) {
+			this.three_id = row.id;
+			this.tabtap(row, 3);
+		},
+		// 商品服务
+		async getAllGoodsSupport() {
+			await this.$u.api
+				.getAllGoodsSupport({
+					page: 1,
+					pageSize: 100
+				})
+				.then(res => {
+					this.support_list = res.data;
+				});
+		},
+		// 商品品牌
+		async getAllBrand() {
+			await this.$u.api
+				.getAllBrand({
+					page: 1,
+					pageSize: 999,
+					categoryId: this.three_id || this.currentId
+				})
+				.then(res => {
+					this.brand_list = res.data;
+				});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.tabs-view {
+	border-bottom: 1px solid #eeeeee;
+	font-weight: 510;
+}
+.main-cont {
+	overflow: hidden;
+	.float_left {
+		height: 100%;
+		.left-aside {
+			width: 182upx;
+			height: 100%;
+			background-color: #f5f6f7;
+
+			.f-item {
+				-webkit-line-clamp: 1;
+				width: 100%;
+				height: 80upx;
+				line-height: 80rpx;
+				margin: 13rpx 0;
+				text-align: center;
+				font-size: 28upx;
+				color: #4b4b4b;
+				position: relative;
+				&.active {
+					color: #000000;
+					font-weight: bold;
+					background-color: #ffffff;
+				}
+				.active-line {
+					position: absolute;
+					left: 22rpx;
+					top: 50%;
+					transform: translateY(-50%);
+					height: 24upx;
+					width: 4upx;
+					border-radius: 4rpx;
+				}
+			}
+		}
+	}
+	.float_right {
+		height: 100%;
+		position: relative;
+		.search-view {
+			display: flex;
+			font-size: 24rpx;
+			text-align: center;
+			line-height: 60rpx;
+			border-bottom: 1px solid #eeeeee;
+			.search-li {
+				flex: 4;
+				position: relative;
+				.arrow-icon {
+					/* #ifdef H5 */
+					transform: scale(0.5, 0.5);
+					/* #endif */
+					position: absolute;
+					right: 20rpx;
+					color: #6c6c6c;
+				}
+
+				.arrow-down {
+					top: 6rpx;
+				}
+				.arrow-up {
+					bottom: 14rpx;
+				}
+			}
+		}
+		.cate-down-view {
+			width: 100%;
+			position: absolute;
+			top: 0;
+			left: 0;
+			height: 100%;
+			background-color: rgba(0, 0, 0, 0.5);
+			z-index: 999;
+			.head-view {
+				line-height: 86rpx;
+				font-size: 24rpx;
+				color: #666666;
+				background-color: #ffffff;
+				padding: 0 24rpx;
+			}
+			.cate-cont {
+				display: flex;
+				flex-wrap: wrap;
+				max-height: 420rpx;
+				overflow: auto;
+				background-color: #ffffff;
+				.cate-li {
+					text-align: center;
+					display: inline-block;
+					width: 150rpx;
+					border: 1px solid #c6c6c6;
+					height: 48rpx;
+					line-height: 48rpx;
+					font-size: 24rpx;
+					margin-left: 24rpx;
+					border-radius: 66rpx;
+					margin-bottom: 20rpx;
+					-webkit-line-clamp: 1;
+				}
+			}
+		}
+		.right-aside {
+			position: relative;
+			height: 100%;
+			width: 568upx;
+			overflow: hidden;
+			background-color: #ffffff;
+			.three-cate {
+				position: relative;
+				.three-cate-scroll {
+					padding: 20rpx 0;
+					width: 100%;
+					white-space: nowrap;
+					.cate-li {
+						padding: 0 20rpx;
+						display: inline-block;
+						font-size: 20rpx;
+						margin-left: 10rpx;
+						border: 1px solid #c6c6c6;
+						border-radius: 50rpx;
+						height: 50rpx;
+						line-height: 50rpx;
+						&:last-child {
+							margin-right: 60rpx;
+						}
+					}
+				}
+				.down-btn {
+					position: absolute;
+					background-color: #ffffff;
+					width: 60rpx;
+					text-align: center;
+					right: 0;
+					top: 0;
+					height: 90rpx;
+					line-height: 90rpx;
+				}
+			}
+			.right-aside-scroll {
+				height: 100%;
+				.goods-li {
+					border-bottom: 1px solid #f4f5f6;
+				}
+			}
+			.nullSty {
+				font-size: 26upx;
+				text-align: center;
+				vertical-align: middle;
+				color: #999;
+				position: absolute;
+				top: 50%;
+				left: 50%;
+				transform: translate(-50%, -50%);
+				image {
+					width: 240upx;
+					height: 160upx;
+					margin-bottom: 30upx;
+				}
+			}
+		}
+	}
+}
+.search-pop {
+	background-color: #ffffff;
+	padding-bottom: 20rpx;
+	.btn-ul {
+		display: flex;
+		padding-top: 20rpx;
+		.btn-li {
+			flex: 2;
+			margin: 0 30rpx;
+			border: 1px solid $uni-color-primary;
+			border-radius: 8rpx;
+			line-height: 50rpx;
+			font-size: 24rpx;
+			text-align: center;
+		}
+	}
+}
+</style>

+ 80 - 0
pages/classification/CateOne.vue

@@ -0,0 +1,80 @@
+<template>
+	<div  :class="['qn-page-' + theme]">
+		<scroll-view scroll-y class="cate-ul" :style="{ height: 'calc(100vh - 112rpx - ' + (isBang ? '84px' : '50px') + ')'  }">
+			<view class="cate-li" v-for="(item, index) in cate_list" :key="index" @click="goPage('/pagesT/productDetail/productDetail?id=' + item.id + '&name=' + item.title)">
+				<view class="cate-name">
+					<view class="cate-name-in">{{ item.title }}</view>
+				</view>
+				<image class="cate-img" :src="item.adImage || item.images" mode="aspectFill"></image>
+			</view>
+		</scroll-view>
+
+	</div>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			cate_list: []
+		};
+	},
+	computed:{
+		userId() {
+			return this.$store.state.userStatus.id;
+		}
+	},
+	created() {
+		this.getAllCategory();
+	},
+	methods: {
+		// 分类列表 getAllCategory
+		 getAllCategory() {
+			this.$u.api.getAllCategory({
+				userCenterId: this.userId || 0
+			}).then(data=>{
+				this.cate_list = data.data;
+			});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.cate-ul {
+	width: 750upx;
+	height: calc(100vh - 112upx);
+	.cate-li {
+		background-color: #f5f5f5;
+		margin: 30upx auto 0;
+		width: 680upx;
+		position: relative;
+		.cate-img {
+			display: block;
+			width: 100%;
+			height: 300upx;
+		}
+		.cate-name {
+			position: absolute;
+			bottom: 24upx;
+			width: 400upx;
+			left: 50%;
+			transform: translateX(-200upx);
+			text-align: center;
+			z-index: 1;
+			font-size: 28upx;
+			font-weight: 600;
+			height: 88upx;
+
+			border: 2upx solid #fff;
+			.cate-name-in {
+				width: calc(100% - 8upx);
+				height: calc(100% - 8upx);
+				line-height: 80upx;
+				margin: 4upx auto;
+				background-color: rgba(255, 255, 255, 0.8);
+			}
+		}
+	}
+}
+</style>

+ 293 - 0
pages/classification/CateThree.vue

@@ -0,0 +1,293 @@
+<template>
+	<view class="clearfix" :class="['qn-page-' + theme]">
+		<view class="float_left">
+			<scroll-view
+				scroll-with-animation
+				scroll-y
+				class="left-aside"
+				:style="{ height: 'calc(100vh - 112rpx - ' + (isBang ? '84px' : '50px') + ')' }"
+				:scroll-top="scrollTop"
+				:scroll-into-view="itemId"
+			>
+				<view v-for="(item, index) in cate_list" :key="index" class="f-item b-b ellipsis" :class="{ active: index === current_index }" @click="tabtap(index, item)">
+					<view v-if="index === current_index" class="active-line primary-bg"></view>
+					{{ item.title }}
+				</view>
+			</scroll-view>
+		</view>
+		<view class="float_right">
+			<scroll-view
+				:scroll-top="scrollRightTop"
+				@scroll="rightScroll"
+				scroll-with-animation
+				scroll-y
+				class="right-aside"
+				:style="{ height: 'calc(100vh - 112rpx - ' + (isBang ? '84px' : '50px') + ')' }"
+			>
+				<view v-for="(titem, tindex) in cate_list" :key="tindex" class="cate-ul" :id="'item' + tindex">
+					<view class="cate-name">{{ titem.title }}</view>
+					<view class="clearfix">
+						<view class="cate-li" @click="goPage('/pagesT/productDetail/productDetail?id=' + titem.id + '&name=' + titem.title)">
+							<view class="cate-img-view">
+								<image v-if="titem.images" :src="titem.images" mode="aspectFill" class="cate-img"></image>
+								<view class="ibonfont ibonleimupinleifenleileibie cate-img-icon" v-else></view>
+							</view>
+							<view class="cate-tit">{{ titem.title }}</view>
+						</view>
+						<view
+							class="cate-li"
+							v-for="(item, index) in titem.children"
+							:key="index"
+							@click="goPage('/pagesT/productDetail/productDetail?id=' + item.id + '&name=' + item.title)"
+						>
+							<view class="cate-img-view">
+								<image v-if="item.images" :src="item.images" mode="aspectFill" class="cate-img"></image>
+								<view class="ibonfont ibonleimupinleifenleileibie cate-img-icon" v-else></view>
+							</view>
+
+							<view class="cate-tit ellipsis">{{ item.title }}</view>
+						</view>
+					</view>
+				</view>
+			</scroll-view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			cate_list: [],
+			cate_Two_list: [],
+			current_index: 0,
+			scrollTop: 0, //tab标题的滚动条位置
+			oldScrollTop: 0,
+			itemId: '', // 栏目右边scroll-view用于滚动的id
+			scrollRightTop: 0, // 右边栏目scroll-view的滚动条高度
+			arr: [],
+			timer: null, // 定时器
+			menuHeight: 0, // 左边菜单的高度
+			menuItemHeight: 0 // 左边菜单item的高度
+		};
+	},
+	computed: {
+		isBang() {
+			return this.$_utils.modelmes();
+		},
+		userId() {
+			return this.$store.state.userStatus.id;
+		}
+	},
+	created() {
+		this.getAllCategory();
+	},
+	methods: {
+		// 分类列表 getAllCategory
+		getAllCategory() {
+			this.$u.api
+				.getAllCategory({
+					userCenterId: this.userId || 0
+				})
+				.then(({ data }) => {
+					this.cate_list = data;
+				});
+		},
+		// 点击左边的栏目切换
+		async tabtap(index,row) {
+			if (this.arr.length == 0) {
+				await this.getMenuItemTop();
+			}
+			if (index == this.current_index) return;
+			this.scrollRightTop = this.oldScrollTop;
+			this.$nextTick(function() {
+				this.scrollRightTop = this.arr[index];
+				this.current_index = index;
+				this.leftMenuStatus(index);
+			});
+		},
+		// 设置左边菜单的滚动状态
+		async leftMenuStatus(index) {
+			this.current = index;
+			// 如果为0,意味着尚未初始化
+			if (this.menuHeight == 0 || this.menuItemHeight == 0) {
+				await this.getElRect('left-aside', 'menuHeight');
+				await this.getElRect('cate-two-li', 'menuItemHeight');
+			}
+			// 将菜单活动item垂直居中
+			this.scrollTop = index * this.menuItemHeight + this.menuItemHeight / 2 - this.menuHeight / 2;
+		},
+		// 获取右边菜单每个item到顶部的距离
+		getMenuItemTop() {
+			new Promise(resolve => {
+				let selectorQuery = uni.createSelectorQuery().in(this);
+				selectorQuery
+					.selectAll('.cate-ul')
+					.boundingClientRect(rects => {
+						// 如果节点尚未生成,rects值为[](因为用selectAll,所以返回的是数组),循环调用执行
+						if (!rects.length) {
+							setTimeout(() => {
+								this.getMenuItemTop();
+							}, 10);
+							return;
+						}
+						rects.forEach(rect => {
+							// 这里减去rects[0].top,是因为第一项顶部可能不是贴到导航栏(比如有个搜索框的情况)
+							this.arr.push(rect.top - rects[0].top);
+							resolve();
+						});
+					})
+					.exec();
+			});
+		},
+		// 右边菜单滚动
+		async rightScroll(e) {
+			this.oldScrollTop = e.detail.scrollTop;
+			if (this.arr.length == 0) {
+				await this.getMenuItemTop();
+			}
+			if (this.timer) return;
+			if (!this.menuHeight) {
+				await this.getElRect('left-aside', 'menuHeight');
+			}
+			setTimeout(() => {
+				// 节流
+				this.timer = null;
+				// scrollHeight为右边菜单垂直中点位置
+				let scrollHeight = e.detail.scrollTop + this.menuHeight / 2;
+				for (let i = 0; i < this.arr.length; i++) {
+					let height1 = this.arr[i];
+					let height2 = this.arr[i + 1];
+					// 如果不存在height2,意味着数据循环已经到了最后一个,设置左边菜单为最后一项即可
+					if (!height2 || (scrollHeight >= height1 && scrollHeight < height2)) {
+						this.leftMenuStatus(i);
+						return;
+					}
+				}
+			}, 10);
+		},
+		// 获取一个目标元素的高度
+		getElRect(elClass, dataVal) {
+			new Promise((resolve, reject) => {
+				const query = uni.createSelectorQuery().in(this);
+				query
+					.select('.' + elClass)
+					.fields(
+						{
+							size: true
+						},
+						res => {
+							// 如果节点尚未生成,res值为null,循环调用执行
+							if (!res) {
+								setTimeout(() => {
+									this.getElRect(elClass);
+								}, 10);
+								return;
+							}
+							this[dataVal] = res.height;
+							resolve();
+						}
+					)
+					.exec();
+			});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.left-aside {
+	width: 200upx;
+	background-color: #f5f6f7;
+	/* #ifdef H5||MP */
+	height: calc(100vh - 130upx);
+	/*#endif*/
+	/* #ifdef APP-PLUS */
+	height: 100vh;
+	/*#endif*/
+	.f-item {
+		-webkit-line-clamp: 1;
+		width: 100%;
+		height: 80upx;
+		line-height: 80rpx;
+		padding-left: 48rpx;
+		margin-bottom: 10rpx;
+		font-size: 26upx;
+		color: #4b4b4b;
+		position: relative;
+
+		&.active {
+			color: #000000;
+			font-size: 32upx;
+			font-weight: bold;
+			background-color: #ffffff;
+			border-radius: 100rpx 0 0 100rpx;
+		}
+		.active-line {
+			position: absolute;
+			left: 28rpx;
+			top: 50%;
+			transform: translateY(-50%);
+			height: 24upx;
+			width: 4upx;
+			border-radius: 4rpx;
+		}
+	}
+}
+.right-aside {
+	/* #ifdef H5||MP */
+	height: calc(100vh - 140upx);
+	/*#endif*/
+	/* #ifdef APP-PLUS */
+	height: 100vh;
+	/*#endif*/
+	width: 550upx;
+	.cate-name {
+		padding-top: 20rpx;
+		padding-left: 40rpx;
+		font-size: 26rpx;
+		font-weight: 600;
+		color: #000000;
+	}
+	.cate-li {
+		float: left;
+		width: 130upx;
+		margin-left: 40upx;
+		text-align: center;
+		margin-top: 20upx;
+		.cate-img-view {
+			width: 130rpx;
+			height: 104rpx;
+			background: #f5f7f7;
+			border-radius: 8px;
+			margin-bottom: 24rpx;
+			.cate-img {
+				width: 84upx;
+				height: 84upx;
+				border-radius: 8upx;
+				display: block;
+				margin: 0 auto;
+				transform: translateY(10rpx);
+			}
+			.cate-img-icon {
+				font-size: 80upx;
+				width: 84upx;
+				line-height: 84upx;
+				color: #eeeeee;
+				height: 84upx;
+				border-radius: 8upx;
+				margin: 0 auto;
+				transform: translateY(10rpx);
+			}
+		}
+
+		.cate-tit {
+			font-size: 24upx;
+			font-weight: 400;
+			color: #3a3a3a;
+			width: 100%;
+			-webkit-line-clamp: 1;
+		}
+	}
+}
+</style>

+ 76 - 0
pages/classification/CateTwo.vue

@@ -0,0 +1,76 @@
+<template>
+	<div :class="['qn-page-' + theme]">
+		<scroll-view scroll-y class="cate-ul clearfix" :style="{ height: 'calc(100vh - 112rpx - ' + (isBang ? '84px' : '50px') + ')' }">
+			<view class="cate-li" v-for="(item, index) in cate_list" :key="index" @click="goPage('/pagesT/productDetail/productDetail?id=' + item.id + '&name=' + item.title)">
+				<view class="cate-img-view"><image :src="item.images" mode="aspectFill" class="cate-img"></image></view>
+				<view class="cate-tit">{{ item.title }}</view>
+			</view>
+		</scroll-view>
+	</div>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			cate_list: []
+		};
+	},
+	computed: {
+		userId() {
+			return this.$store.state.userStatus.id;
+		}
+	},
+	created() {
+		this.getAllCategory();
+	},
+	methods: {
+		// 分类列表 getAllCategory
+		getAllCategory() {
+			this.$u.api
+				.getAllCategory({
+					userCenterId: this.userId || 0
+				})
+				.then(data => {
+					this.cate_list = data.data;
+				});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.cate-ul {
+	/* #ifdef H5||MP */
+	height: calc(100vh - 230upx);
+	/*#endif*/
+	/* #ifdef APP-PLUS */
+	height: calc(100vh - 100upx);
+	/*#endif*/
+	.cate-li {
+		float: left;
+		width: 150upx;
+		margin-left: 72upx;
+		text-align: center;
+		margin-top: 50upx;
+		.cate-img-view {
+			width: 150upx;
+			height: 150upx;
+			background-color: #f4f5f6;
+			border-radius: 8rpx;
+			overflow: hidden;
+			.cate-img {
+				width: 150upx;
+				height: 150upx;
+				display: block;
+			}
+		}
+
+		.cate-tit {
+			font-size: 28upx;
+			color: #333;
+			padding-top: 20upx;
+		}
+	}
+}
+</style>

+ 176 - 0
pages/classification/cate.vue

@@ -0,0 +1,176 @@
+<template>
+	<view class="content" :class="['qn-page-' + theme]">
+		<view :style="{ backgroundColor: cateModel === 4 ? '#ffffff' : '#f4f5f6' }" class="mp-search-box">
+			<view @click="goPage('/pagesT/search/index')" :style="{ backgroundColor: cateModel !== 4 ? '#ffffff' : '#f4f5f6' }" class="ser-input-view">
+				<text class="ibonfont ibonsousuo1"></text>
+				<text>输入搜索商品发现更多好物…</text>
+			</view>
+			<view class="right-view">
+				<!-- #ifdef MP-WEIXIN -->
+				<button class="contact-btn" open-type="contact">
+					<u-icon name="server-fill" color="#000000" size="32"></u-icon>
+					<view>商城客服</view>
+				</button>
+				<!--  #endif -->
+				<!-- #ifdef APP-PLUS || H5 -->
+				<button class="contact-btn" @click="callphone">
+					<u-icon name="server-fill" color="#000000" size="32"></u-icon>
+					<view>客服</view>
+				</button>
+				<!--  #endif -->
+			</view>
+		</view>
+		<view class="cate-main" :style="{ top: cateModel === 4 ? '100rpx' : '110rpx', zIndex: cateModel === 4 ? '1000' : '900' }">
+			<cateOne v-if="cateModel === 1"></cateOne>
+			<CateTwo v-if="cateModel === 2"></CateTwo>
+			<CateThree v-if="cateModel === 3"></CateThree>
+			<CateFive v-if="cateModel === 5"></CateFive>
+			<CateFour :selAddress="now_sel_address" v-if="cateModel === 4" :isLogin="isLogin"></CateFour>
+		</view>
+		<!-- 底部tabbar -->
+		<Tabbar v-model="current"></Tabbar>
+	</view>
+</template>
+
+<script>
+import cateOne from './CateOne.vue';
+import CateTwo from './CateTwo.vue';
+import CateThree from './CateThree.vue';
+import CateFour from './CateFour.vue';
+import CateFive from './CateFive.vue';
+
+export default {
+	components: {
+		cateOne,
+		CateTwo,
+		CateThree,
+		CateFour,
+		CateFive
+	},
+	computed: {
+		style() {
+			const systemInfo = uni.getSystemInfoSync();
+			return `top:${systemInfo.statusBarHeight + 44}px`;
+		},
+		enterprisemobile() {
+			return this.$store.state.enterpriseInfo.mobile;
+		},
+		cateModel(){
+			return this.$store.state.cateModel;
+		}
+	},
+	onNavigationBarButtonTap() {
+		this.goPage('/pagesT/search/index');
+	},
+	data() {
+		return {
+			current: 1,
+			now_sel_address: {},
+			conptop: {
+				// #ifdef H5
+				paddingTop: '44px',
+				// #endif
+				// #ifdef MP-WEIXIN
+				paddingTop: '124rpx'
+				// #endif
+			},
+			// cateModel: 4,
+			isLogin: true
+		};
+	},
+	onShow() {
+		this.isLogin = this.$common.isLogin();
+		// this.cateModel = this.$store.state.cateModel;
+	},
+	onLoad() {
+		// #ifdef MP-WEIXIN
+		// 小程序的原生菜单中显示分享按钮
+		uni.showShareMenu({
+			withShareTicket: false,
+			menus: ['shareAppMessage', 'shareTimeline']
+		});
+		// #endif
+	},
+	methods: {
+		callphone() {
+			uni.makePhoneCall({
+				phoneNumber: this.enterprisemobile
+			});
+		}
+	},
+	// 发送给朋友
+	onShareAppMessage() {
+		return {
+			title: this.$store.state.baseSet.shop,
+			path: '/pages/index/index?businessmanId=' + (this.$store.state.userStatus.id||''),
+			success: res => {
+				console.log(res);
+			}
+		};
+	},
+	// #ifdef MP-WEIXIN
+	// 分享到朋友圈
+	onShareTimeline(obj) {},
+	// 收藏小程序
+	onAddToFavorites() {}
+	// #endif
+};
+</script>
+
+<style lang="scss">
+.content {
+	height: 100vh;
+	background-color: #fff;
+}
+.cate-main {
+	position: fixed;
+	left: 0;
+	width: 100%;
+	top: 110rpx;
+	z-index: 997;
+}
+.mp-search-box {
+	background-color: #f5f6f7;
+	position: fixed;
+	padding: 24upx 0;
+	left: 0;
+	top: 0;
+	z-index: 9999;
+	width: 100%;
+	padding-left: 30rpx;
+	.ser-input-view {
+		width: 620rpx;
+		height: 64rpx;
+		background-color: #ffffff;
+		border-radius: 64upx;
+		line-height: 64upx;
+		font-size: 24upx;
+		color: #9fa8bd;
+		font-weight: 400;
+		.ibonfont {
+			margin: 0 18rpx;
+			display: inline-block;
+			vertical-align: middle;
+			font-size: 38rpx;
+		}
+	}
+	.right-view {
+		position: absolute;
+		right: 16rpx;
+		top: 50%;
+		transform: translateY(-50%);
+		.contact-btn {
+			background-color: transparent;
+			font-size: 18rpx;
+			font-weight: 400;
+			color: #2a2a2a;
+			line-height: 25rpx;
+			text-align: center;
+			padding: 0;
+			&::after {
+				border: 0 none;
+			}
+		}
+	}
+}
+</style>

+ 100 - 0
pages/index/FullScreen.vue

@@ -0,0 +1,100 @@
+<template>
+	<view>
+		<view class="u-update-content">
+			<view class="content">
+				<view>
+					当前店铺已打烊,请联系商家
+				</view>
+				<view>
+					电话:{{enterprice.mobile}}
+				</view>
+			</view>
+			<view class="btn" @click="confirm">一键拨号</view>
+		</view>
+		<view class="logo-view" v-if="$common.getEnToken() !== '8fa553d53f44e33123e4d0d51a0de634'">
+			<image src="https://onlineimg.qianniao.vip/QNlogo-i-1.png" mode="aspectFit"></image>
+			<text>提供技术支持</text>
+		</view>
+	</view>
+	
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			show: true
+		};
+	},
+	computed:{
+		enterprice(){
+			return this.$store.state.enterpriseInfo
+		}
+	},
+	methods: {
+		cancel() {
+			this.closeModal();
+		},
+		confirm() {
+			uni.makePhoneCall({
+				phoneNumber: this.enterprice.mobile
+			});
+		},
+		closeModal() {
+			uni.navigateBack();
+		}
+	}
+};
+</script>
+
+<style scoped lang="scss">
+.u-full-content {
+	background-color: #00c777;
+}
+
+.u-update-content {
+	color: $u-content-color;
+	line-height: 1.7;
+	padding: 30rpx;
+	text-align: center;
+	position: fixed;
+	top: 50%;
+	left: 50%;
+	transform: translate(-50%,-50%);
+	// .title{
+	// 	font-size: 28rpx;
+	// 	color: #333333;
+	// 	font-weight: bold;
+	// }
+	.content{
+		font-size: 32rpx;
+		padding: 50rpx 0;
+		font-weight: bold;
+	}
+	.btn{
+		line-height: 80rpx;
+		width: 600rpx;
+		color: #FFFFFF;
+		background-color: #007AFF;
+		text-align: center;
+		border-radius: 10rpx;
+	}
+}
+.logo-view {
+	text-align: center;
+	padding-top: 50upx;
+	font-size: 24upx;
+	color: #999;
+	line-height: 20rpx;
+	position: fixed;
+	bottom: 50rpx;
+	left: 50%;
+	transform: translateX(-50%);
+	image {
+		width: 150upx;
+		height: 25upx;
+		opacity: 0.7;
+		vertical-align: middle;
+	}
+}
+</style>

+ 127 - 0
pages/index/SearchAddress.vue

@@ -0,0 +1,127 @@
+<template>
+	<view class="container" :class="['qn-page-' + theme]">
+		<view class="header">
+			<text class="ibonfont ibonsousuo1 sear-icon"></text>
+			<input type="text" @input="bindInput" @confirm="bindConfirm" v-model="address_key" placeholder="请输入地址" class="ars_input" />
+		</view>
+		<view class="bg-ff">
+			<view class="list-title">从下面列表中选择</view>
+			<view class="list-li" v-for="(item, index) in list" :key="index" @click="address(item)">
+				<view class="adrs-label">{{ item.name }}</view>
+				<view class="adrs-val">{{ item.address.length ? item.address : item.name }}</view>
+			</view>
+		</view>
+
+	</view>
+</template>
+
+<script>
+import amap from '@/access/amap-wx.js';
+import webUrl from '../../config.js';
+
+export default {
+	data() {
+		return {
+			list: [],
+			address_key: ''
+		};
+	},
+	onLoad() {
+		//在 onLoad 中初始化一个高德小程序 SDK 的实例对象。
+		this.amapPlugin = new amap.AMapWX({
+			key: webUrl.GDMap_key
+		});
+	},
+	methods: {
+		bindConfirm() {},
+		bindInput() {
+			// #ifdef MP-TOUTIAO
+			if(['xijinping','xi jin ping','jinping','jin ping','习近平','近平','彭丽媛','丽媛'].includes(this.address_key)){
+				return
+			}
+			// #endif
+			this.amapPlugin.getInputtips({
+				keywords: this.address_key,
+				location: '',
+				success: data => {
+					if (data && data.tips) {
+						this.list = data.tips;
+						console.log(this.list);
+					}
+				}
+			});
+		},
+		address(item) {
+			console.log(item);
+			const location = item.location.split(',');
+			const locationD = this.$_utils.getArea(item.district);
+			// {"provinceName":"陕西省","cityName":"西安市","districtName":"莲湖区","address":"北院门街道","latitude":34.267011,"longitude":108.940245}
+			const longitude = location[0];
+			const latitude = location[1];
+			this.$store.commit('commit_locationObj', {
+				...locationD,
+				address: item.address.length ? item.address : item.name,
+				latitude: latitude,
+				longitude: longitude
+			});
+			this.isLoding=true
+			setTimeout(() => {
+				this.isLoding=false
+				uni.switchTab({
+					url: '/pages/index/index'
+				});
+			}, 100);
+		}
+	}
+};
+</script>
+
+<style scoped lang="scss">
+.container {
+	padding-top: 20rpx;
+}
+.header {
+	// position: fixed;
+	// z-index: 999;
+	// top: 0;
+	// left: 0;
+	line-height: 70upx;
+	border-bottom: 1px solid #eee;
+	background-color: #fff;
+	padding: 0 20upx;
+	.sear-icon {
+		font-size: 32upx;
+		color: #999;
+		vertical-align: middle;
+	}
+	.ars_input {
+		margin-left: 20upx;
+		width: 600upx;
+		display: inline-block;
+		height: 70upx;
+		line-height: 70upx;
+		vertical-align: middle;
+		font-size: 28upx;
+	}
+}
+.bg-ff {
+	margin-top: 20upx;
+	background-color: #fff;
+	padding: 0 20upx;
+	.list-title {
+		font-size: 26upx;
+		color: #999;
+		padding: 16upx 0;
+	}
+	.list-li {
+		font-size: 28upx;
+		border-top: 1px solid #eee;
+		padding: 20upx 0;
+		.adrs-val {
+			font-size: 26upx;
+			color: #666;
+			padding-top: 10upx;
+		}
+	}
+}
+</style>

+ 135 - 0
pages/index/StartUpPage.vue

@@ -0,0 +1,135 @@
+<template>
+	<view class="img-view" :class="['qn-page-' + theme]">
+		<block v-if="startUpPage.isEnable && startUpPage.img">
+			<view @click="goPageS('/pages/index/index', 'switchTab')" class="go-index-btn">跳过 {{ time }} s</view>
+			<view class="startUpPage-view">
+				<image @click="goPageS(startUpPage.url, startUpPage.switchTab)" class="start-img" :src="startUpPage.img" mode="aspectFill"></image>
+			</view>
+		</block>
+	</view>
+</template>
+
+<script>
+import amap from '@/access/amap-wx.js';
+export default {
+	data() {
+		return {
+			startUpPage: {
+				img: '',
+				isEnable: false,
+				time: 5
+			},
+			time: 5,
+			timesInterval: null
+		};
+	},
+	watch: {
+		// 监听倒计时,当时间为0时跳转页面,在这里监听的原因是为了跳出setInterval,防止setInterval不会终止,而不停的跳转首页
+		time(val) {
+			if (val === 0) {
+				uni.switchTab({
+					url: '/pages/index/index'
+				});
+			}
+		}
+	},
+	async onLoad() {
+		// #ifdef MP-TOUTIAO
+		uni.switchTab({
+			url: '/pages/index/index'
+		});
+		return;
+		// #endif
+		// #ifdef MP-WEIXIN || APP-PLUS || H5
+		await this.getBasicField();
+		// #endif
+	},
+	methods: {
+		goPageS(url, type) {
+			if (!url) {
+				return;
+			}
+			clearInterval(this.timesInterval);
+			this.goPage(url, type);
+		},
+		// 获取商城基本设置
+		async getBasicField() {
+			// startUpPage,启动页设置
+			await this.$u.api
+				.getBasicField({
+					field: ['startUpPage']
+				})
+				.then(({ data }) => {
+					if (!data.startUpPage || !data.startUpPage.isEnable || !data.startUpPage.img) {
+						uni.switchTab({
+							url: '/pages/index/index'
+						});
+						return;
+					}
+					if (data.startUpPage && data.startUpPage.isEnable && data.startUpPage.img) {
+						this.startUpPage = data.startUpPage;
+						this.time = this.startUpPage.time;
+						this.timesInterval = setInterval(() => {
+							if (this.time === 0) {
+								clearInterval(this.timesInterval);
+							} else {
+								this.time = this.time - 1;
+							}
+						}, 1000);
+					}
+				});
+		}
+	}
+};
+</script>
+
+<style scoped lang="scss">
+.img-view {
+	position: relative;
+	width: 750upx;
+	height: 100vh;
+	.logo-view {
+		height: 300rpx;
+		text-align: center;
+		background-color: #ffffff;
+		.logo-view-in {
+			transform: translateY(60rpx);
+			.en-logo {
+				height: 120rpx;
+				width: 120rpx;
+				display: block;
+				margin: 0 auto;
+			}
+			.en-name {
+				font-size: 36rpx;
+				padding-top: 20rpx;
+			}
+		}
+	}
+	.go-index-btn {
+		position: absolute;
+		bottom: 350upx;
+		right: 20upx;
+		font-size: 26upx;
+		color: #fff;
+		background-color: rgba($color: #000000, $alpha: 0.4);
+		width: 150upx;
+		height: 55upx;
+		line-height: 55upx;
+		text-align: center;
+		border-radius: 66upx;
+		z-index: 9;
+	}
+	.startUpPage-view {
+		width: 750upx;
+		height: 100vh;
+		overflow: hidden;
+		background-color: #ffffff;
+		.start-img {
+			width: 100%;
+			height: 100%;
+			display: block;
+		}
+	}
+}
+</style>

+ 629 - 0
pages/index/index.vue

@@ -0,0 +1,629 @@
+<template>
+	<view :class="['qn-page-' + theme]" class="view-wrap" :style="pageStyle">
+		<NavigationBar v-if="is_data" :scrollTop="scrollTop" :modelData="topData" @openLocation="openLocation" />
+		<view style="position: relative; z-index: 2;">
+			<block v-if="is_data"><PageDesign :temData="temData" :showGoodsPrice="showGoodsPrice" :selAddress="now_sel_address"></PageDesign></block>
+			<!-- 骨架 -->
+			<Skeleton v-else :imgTitle="true" :loading="true" :showAvatar="false"></Skeleton>
+			<!-- #ifdef APP-PLUS -->
+			<u-popup v-model="upgradePop" mode="center" :border-radius="12">
+				<view class="upgrade-view">
+					<image class="upgrade-img" src="https://onlineimg.qianniao.vip/shengji.jpg" mode="aspectFit"></image>
+					<view class="upgrade-tit">发现新版本</view>
+					<view class="upgrade-num">{{ newVersion }}</view>
+					<view class="upgrade-cont">
+						为了您更好的体验,
+						<br />
+						请您去升级到新版本哦!
+					</view>
+					<view @click="downloadApp" class="upgrade-btn">立即升级</view>
+					<view class="closePop" @click="closeUPop"><text class="ibonfont ibonguanbi"></text></view>
+				</view>
+			</u-popup>
+			<u-popup :mask-close-able="false" v-model="up_show" mode="center" :border-radius="12">
+				<view class="upgrade-view">
+					<image class="upgrade-img" src="https://onlineimg.qianniao.vip/shengji.jpg" mode="aspectFit"></image>
+					<view class="upgrade-tit">新版本更新中</view>
+					<view class="upgrade-cont"><u-line-progress :striped="true" :percent="up_percent" :striped-active="true"></u-line-progress></view>
+				</view>
+			</u-popup>
+			<!-- #endif -->
+			<u-modal v-model="tip_model" @confirm="finishCofirm" @cancel="tipCancel" :show-cancel-button="true" content="请先完善资料,再进行购物" confirm-text="去完善" cancel-text="逛逛商城"></u-modal>
+			<!-- 底部tabbar -->
+			<Tabbar v-model="current"></Tabbar>
+		</view>
+	</view>
+</template>
+<script>
+import permision from '@/access/wa-permission/permission.js';
+import PageDesign from '@/components/PageDesign/PageDesign.vue';
+import { getToken, getUserInfo } from '@/access/common.js';
+import NavigationBar from '@/components/PageDesign/components/NavigationBar.vue';
+import Skeleton from '@/components/J-skeleton.vue';
+export default {
+	components: {
+		PageDesign,
+		Skeleton,
+		NavigationBar
+	},
+	data() {
+		return {
+			tip_model: false, // 完善资料提示
+			up_percent: 0,
+			up_show: false,
+			current: 0,
+			upgradePop: false,
+			newVersion: '',
+			oldVersion: 'v1.0.6',
+			model: 0,
+			now_sel_address: {},
+			home_data: {},
+			temData: {},
+			is_data: false,
+			show_goods_price: 4,
+			userCenterId: '',
+			topData: {
+				name: '',
+				topBgColor: '#ffffff',
+				textColor: '#000000',
+				pageBgColor: '#f7f8fa',
+				bgImage: ''
+			},
+			startUpPage: {
+				img: '',
+				isEnable: false,
+				time: 5
+			},
+			scrollTop: 0
+		};
+	},
+	computed: {
+		enterprice() {
+			return this.$store.state.enterpriseInfo;
+		},
+		isUpdate() {
+			return this.$store.state.isUpdate;
+		},
+		pageTit() {
+			if (this.temData.length) {
+				const obj = this.temData[0].modelData;
+				return obj.name;
+			} else {
+				return this.baseSet.shop || '首页';
+			}
+		},
+		baseSet() {
+			return this.$store.state.baseSet;
+		},
+		pageStyle() {
+			if (this.temData.length) {
+				const obj = this.temData[0].modelData;
+				return `background-color:${obj.pageBgColor};background-image:url(${obj.bgImage});backgroundPosition: ${
+					obj.topBgColor ? '0 ' + (this.barHeight + 44) + 'px' : '0 0'
+				}`;
+			} else {
+				return '';
+			}
+		},
+		isLogin() {
+			return this.$store.state.hasLogin;
+		},
+		showGoodsPrice() {
+			if (this.baseSet.goodsPrice === 5 && this.isLogin) {
+				return '';
+			} else if (!this.isLogin && this.baseSet.goodsPrice === 4) {
+				return '请登录';
+			} else if (this.$store.state.userStatus.enableStatus === 4 && this.baseSet.goodsPrice === 4) {
+				return '已禁用';
+			} else if (this.$store.state.userStatus.status !== 2 && this.baseSet.goodsPrice === 4) {
+				if (this.$store.state.userStatus.status === 0) {
+					return '待审核';
+				} else if (this.$store.state.userStatus.status === 1) {
+					return '审核中';
+				} else if (this.$store.state.userStatus.status === 3) {
+					return '已驳回';
+				}
+			} else {
+				return '';
+			}
+		},
+		// #ifdef APP-PLUS
+		iosAuditStatus() {
+			return this.$store.state.iosAuditStatus;
+		}
+		// #endif
+	},
+	watch: {
+		'$store.state.locationObj'(val) {
+			if (JSON.stringify(val) === '{}') {
+				console.log(333);
+				this.getAuthorizeInfo();
+				return;
+			}
+			uni.hideToast();
+			this.getTemplate();
+		},
+		isLogin(val) {
+			this.getTemplate();
+			this.getIndexData();
+		}
+	},
+	async onShow() {
+		// #ifdef APP-PLUS
+		if (JSON.stringify(this.$store.state.locationObj || {}) === '{}') {
+			if (plus.os.name == 'iOS') {
+				let result = permision.judgeIosPermission('location');
+				if (result) {
+					await this.resetGetLocation();
+				}
+			} else {
+				let result = await permision.requestAndroidPermission('android.permission.ACCESS_FINE_LOCATION');
+				if (result == 1) {
+					await this.resetGetLocation();
+				}
+			}
+		}
+		// #endif
+		// #ifdef MP-WEIXIN || MP-TOUTIAO || H5
+		if (JSON.stringify(this.$store.state.locationObj || {}) === '{}') {
+			await this.getAuthorizeInfo();
+			return;
+		}
+		// #endif
+	},
+	// 发送给朋友
+	onShareAppMessage() {
+		return {
+			title: this.baseSet.shop,
+			path: '/pages/index/index?businessmanId=' + (this.$store.state.userStatus.id || ''),
+			success: res => {
+				console.log(res);
+			}
+		};
+	},
+	// #ifdef MP-WEIXIN
+	// 分享到朋友圈
+	onShareTimeline(obj) {},
+	// 收藏小程序
+	onAddToFavorites() {},
+	// #endif
+	async onLoad(options) {
+		console.log('h获取模板');
+		try{
+		await this.getTemplate();
+		console.log('h获取模板11');
+		await this.getEnterpriseInfo();
+		// #ifdef MP
+		//  获取小程序分销商参数
+		
+		console.log("xxxxxxx")
+		console.log(options.businessmanId)
+		if (options.businessmanId) {
+			this.$store.commit('commit_businessmanId', options.businessmanId);
+			this.relationshipBusinessman(options.businessmanId);
+		} else if (options.scene) {
+			// 扫码进入
+			const scene = decodeURIComponent(options.scene);
+			if (scene.indexOf('_') > -1) {
+				const id = scene.slice(0, scene.length - 1);
+				console.log('staffId', id);
+				this.$store.commit('commit_staffId', id);
+			} else {
+				this.$store.commit('commit_businessmanId', scene);
+				this.relationshipBusinessman(scene);
+			}
+		}
+
+		// #endif
+		this.show_goods_price = this.isLogin ? 5 : this.baseSet.goodsPrice;
+		// 实时定位
+		if (JSON.stringify(this.$store.state.locationObj) !== '{}') {
+			await this.resetGetLocation();
+		}
+		// #ifdef APP-PLUS
+		// 获取APP版本
+		await this.getVersion();
+		// #endif
+		await this.getBasicField();
+		await this.getIndexData();
+		await this.getClassSettingInfo();
+		// #ifdef MP-WEIXIN
+		// 小程序的原生菜单中显示分享按钮
+		uni.showShareMenu({
+			withShareTicket: false,
+			menus: ['shareAppMessage', 'shareTimeline']
+		});
+		// #endif
+		}catch(e){
+			console.log(e,'错误');
+			//TODO handle the exception
+		}
+	},
+	methods: {
+		// #ifdef MP
+		// 添加分销上下级关系 source: 1:首次点击链接 2:首次下单 3:首次付款'
+		async relationshipBusinessman(businessmanId) {
+			console.log('上级ID', businessmanId);
+			if (!this.isLogin) {
+				// 没有登录不请求接口
+				return;
+			}
+			await this.$u.api.relationshipBusinessman({
+				businessmanId: businessmanId,
+				source: 1
+			});
+
+			console.log('上下:', data.data);
+		},
+		
+		
+		
+		// #endif
+		// #ifdef APP-PLUS
+		// app 升级
+		downloadApp() {
+			this.closeUPop();
+			let url;
+			if (this.$common.source() === 2) {
+				this.up_show = true;
+				url = '';
+				const downloadTask = uni.downloadFile({
+					url: url,
+					success: downloadResult => {
+						if (downloadResult.statusCode === 200) {
+							plus.runtime.install(
+								downloadResult.tempFilePath,
+								{
+									force: false
+								},
+								function() {
+									console.log('install success...');
+									plus.runtime.restart();
+								},
+								function(e) {
+									console.log(e);
+									// console.error('install fail...');
+								}
+							);
+						}
+					}
+				});
+				downloadTask.onProgressUpdate(res => {
+					this.up_percent = res.progress;
+				});
+			} else {
+				plus.runtime.openURL(this.downloadUrl);
+			}
+		},
+		// 获取app版本 升级
+		async getVersion() {
+			await this.$u.api
+				.getVersion({
+					oldVersion: this.oldVersion
+				})
+				.then(res => {
+					uni.setStorageSync('isUpdate', res.data.isUpdate);
+					if (res.data.isUpdate) {
+						this.downloadUrl = res.data.downloadUrl;
+						// App 升级机制,检测安卓
+						if (this.$common.source() === 2) {
+							this.upgradePop = true;
+						} else {
+							// IOS 审核通过后再打开升级提示
+							if (this.iosAuditStatus === 5) {
+								this.upgradePop = true;
+							}
+						}
+					}
+				});
+		},
+		closeUPop() {
+			this.upgradePop = false;
+		},
+		// #endif
+		resetGetLocation() {
+			this.amapPlugin.getRegeo({
+				success: data => {
+					const proCity = ['北京市', '天津市', '上海市', '重庆市'];
+					// console.log('获取定位:', data)
+					const provinceName = data[0].regeocodeData.addressComponent.province;
+					const cityName = proCity.includes(provinceName) ? provinceName : data[0].regeocodeData.addressComponent.city;
+					const districtName = data[0].regeocodeData.addressComponent.district;
+					const address = data[0].desc || data[0].name || data[0].regeocodeData.addressComponent.streetNumber.street || data[0].regeocodeData.addressComponent.township;
+
+					const location = {
+						provinceName: provinceName,
+						cityName: cityName,
+						districtName: districtName,
+						address: address
+					};
+					if (location.districtName !== this.$store.state.locationObj.districtName) {
+						uni.showModal({
+							title: '提示',
+							content: '检测到您位置已改变,是否切换到新的位置',
+							success: res => {
+								if (res.confirm) {
+									this.$store.commit('commit_locationObj', {
+										...location,
+										latitude: data[0].latitude,
+										longitude: data[0].longitude
+									});
+								}
+							}
+						});
+					}
+				},
+				fail: err => {
+					console.log('获取位置失败::', err);
+				}
+			});
+		},
+		openLocation() {
+			// #ifdef MP-WEIXIN
+			uni.chooseLocation({
+				success: res => {
+					const location = this.$_utils.getArea(res.address);
+					this.$store.commit('commit_locationObj', {
+						...location,
+						address: location.address || res.name,
+						latitude: res.latitude,
+						longitude: res.longitude
+					});
+				}
+			});
+			// #endif
+			// #ifdef APP-PLUS || MP-TOUTIAO
+			uni.navigateTo({
+				url: '/pages/index/SearchAddress'
+			});
+			// #endif
+		},
+		async getIndexData() {
+			if (getToken()) {
+				await this.getCustomerInfo();
+				await this.getCartByUserCenterId();
+			}
+		},
+
+		//首页
+		async getTemplate() {
+			console.log('请求模板');
+			await this.$u.api
+				.homePage({
+					pageType: 1
+				})
+				.then(({ data }) => {
+					console.log('模板返回',data);
+					uni.stopPullDownRefresh();
+					this.is_data = true;
+					this.model = data.type;
+					if (data.type === 2) {
+						this.temData = data.data;
+						console.log('版面信息',this.temData)
+						this.topData = data.data[0].modelData;
+					} else {
+						const homeObj = {};
+						for (let i in data.data) {
+							const item = data.data[i];
+							homeObj[item.moduleAlias] = item;
+						}
+						this.home_data = homeObj;
+						this.cateOn = this.home_data.goodsCate.moduleData.cateData[0].categoryName;
+						this.goodsData = this.home_data.goodsCate.moduleData.cateData[0].goodsData;
+					}
+				}).catch((e)=>{
+					console.log(e,'末班错误');
+				});
+		},
+		//获取购物车数据
+		async getCartByUserCenterId() {
+			await this.$u.api.getCartByUserCenterId().then(data => {
+				this.$store.commit('commit_cartNum', data.data.goodsNum);
+				this.$store.commit('commit_cartPrice', data.data.totalMoney);
+			});
+		},
+		// 获取分类页面模版
+		async getClassSettingInfo() {
+			await this.$u.api.getClassSettingInfo().then(data => {
+				this.$store.commit('commit_cateModel', data.data.value);
+			});
+		},
+		// 获取商城基本设置
+		async getBasicField() {
+			// personnelReview,客户审核,
+			// finishData: 4,  完善资料 4禁用 5启用
+			// finishDataGo: false,  完善资料登录后立即去完善
+			// shop,商城名称,
+			// images,商城LOGO,
+			// goodsPrice,商品价格是否允许游客查看,
+			// stockDisplay,库存展示设置,4:不显示库存;5: 显示有/无货;6:显示库存数量
+			// themeStyle,风格设置
+			// startUpPage,启动页设置
+			// startDeliveryPrice,起送价
+			// freeExpressPrice 满多少元包邮
+			// isSalesNum,是否显示销量,4:不显示,5:显示
+			// cancelOrder,5开启:订单在出库前客户可以点击取消订单按钮;4禁用:只有待审核的订单客户才能操作取消订单按钮;
+			// cancelOrderAudit,取消订单审核状态 5开启 4禁用
+
+			await this.$u.api
+				.getBasicField({
+					field: [
+						'personnelReview',
+						'finishData',
+						'finishDataGo',
+						'shop',
+						'images',
+						'goodsPrice',
+						'stockDisplay',
+						'themeStyle',
+						'startUpPage',
+						'startDeliveryPrice',
+						'freeExpressPrice',
+						'isSalesNum',
+						'phone',
+						'cancelOrder',
+						'cancelOrderAudit'
+					]
+				})
+				.then(data => {
+					this.show_goods_price = this.isLogin ? 5 : data.data.goodsPrice;
+					this.startUpPage = data.data.startUpPage || {
+						img: '',
+						isEnable: false,
+						time: 5
+					};
+					let themeStyle = '';
+					if (data.data.themeStyle) {
+						let theme = data.data.themeStyle.theme;
+						if (!theme) {
+							switch (data.data.themeStyle.label) {
+								case '纯净绿':
+									theme = 'green';
+									break;
+								case '热情红':
+									theme = 'red';
+									break;
+								case '活力橙':
+									theme = 'orange';
+									break;
+								case '格调金':
+									theme = 'gold';
+									break;
+								case '雅致粉':
+									theme = 'pink';
+									break;
+								case '商务蓝':
+									theme = 'blue';
+									break;
+							}
+						}
+						themeStyle = {
+							...data.data.themeStyle,
+							theme: theme
+						};
+					}
+					this.$store.commit('commit_baseSet', {
+						...data.data,
+						isSalesNum: data.data.isSalesNum || 5,
+						preSale: data.data.preSale || 4,
+						startDeliveryPrice: data.data.startDeliveryPrice || 0,
+						themeStyle: themeStyle || {
+							label: '热情红',
+							theme: 'red',
+							color_t: '#ff3883',
+							color_o: '#fd463e'
+						},
+						startUpPage: data.data.startUpPage || {
+							img: '',
+							isEnable: false,
+							time: 5
+						}
+					});
+				});
+		},
+		//先获取个人资料 用来判断审核状态
+		async getCustomerInfo() {
+			await this.$u.api.getCustomerInfo().then(({ data }) => {
+				this.$store.commit('commit_userStatus', data);
+				if (this.baseSet.finishDataGo && data.status === 0) {
+					this.tip_model = true;
+				}
+			});
+		},
+		async getEnterpriseInfo() {
+			await this.$u.api.getEnterpriseInfo().then(({ data }) => {
+				this.$store.commit('commit_iosAuditStatus', data.iosAuditStatus);
+				this.$store.commit('commit_enterpriseInfo', data);
+				if (new Date().getTime() >= data.expireTime * 1000) {
+					uni.reLaunch({
+						url: '/pages/index/FullScreen'
+					});
+				}
+			});
+		},
+		// 完善资料提示取消
+		tipCancel(){
+			this.tip_model = false;
+		},
+		// 跳转完善资料页面
+		finishCofirm(){
+			this.goPage('/pagesT/user/editUserInfo');
+		}
+	},
+	// 下拉刷新
+	onPullDownRefresh() {
+		this.getTemplate();
+		this.getIndexData();
+		this.getBasicField();
+		this.getClassSettingInfo();
+	},
+	onPageScroll(obj) {
+		this.scrollTop = obj.scrollTop;
+	}
+};
+</script>
+<style lang="scss" scoped>
+.view-wrap {
+	background-repeat: no-repeat;
+	background-color: #f7f8fa;
+	background-size: 750rpx;
+	// background-position: 0 calc(var(--status-bar-height) + 44px);
+}
+
+.upgrade-view {
+	background-color: #fff;
+	text-align: center;
+	width: 600upx;
+	border-radius: 12upx;
+	padding: 24upx;
+	position: relative;
+
+	.closePop {
+		position: absolute;
+		bottom: -100upx;
+		width: 50upx;
+		height: 50upx;
+		color: #fff;
+		left: 50%;
+		transform: translateX(-25upx);
+
+		.ibonguanbi {
+			font-size: 48upx;
+		}
+	}
+
+	.upgrade-img {
+		width: 275upx;
+		height: 275upx;
+		margin: 30upx auto 0;
+		display: block;
+	}
+
+	.upgrade-tit {
+		font-size: 36upx;
+	}
+
+	.upgrade-num {
+		color: #999;
+		font-size: 24upx;
+		padding: 20upx;
+	}
+
+	.upgrade-cont {
+		font-size: 28upx;
+		padding-bottom: 30upx;
+		line-height: 36upx;
+	}
+
+	.upgrade-btn {
+		width: 516upx;
+		height: 86upx;
+		font-size: 32upx;
+		color: #fff;
+		border-radius: 8upx;
+		background-color: #007aff;
+		line-height: 86upx;
+		margin: 0 auto;
+	}
+}
+</style>

+ 1258 - 0
pages/user/user.vue

@@ -0,0 +1,1258 @@
+<template>
+	<view class="user-index" :class="['qn-page-' + theme]">
+		<view class="user-top" :style="{ height: vip_data.name ? '418rpx' : '348rpx' }">
+			<!-- 装饰 -->
+			<view class="circle-big" :style="{ height: vip_data.name ? '418rpx' : '348rpx' }">
+				<view class="circle-one"></view>
+				<view class="circle-two"></view>
+				<view class="vip-view clearfix" v-if="vip_data.name">
+					<view class="float_left">
+						<view class="vip-name">
+							<text class="ibonfont ibonhuiyuan" style="margin-right: 16rpx;"></text>
+							{{ vip_data.name }}
+						</view>
+						<view class="desc" v-if="vip_data.vipDiscount === 5">享受全场{{ vip_data.discount - 0 }}折</view>
+						<view class="desc" v-else>专享会员权益</view>
+					</view>
+					<view class="float_right vip-btn" @click="navTo(`/pagesT/user/VipDetail?id=${vip_data.id}`)">
+						<block v-if="vip_data.isSelf">立即查看</block>
+						<block v-else>立即开通</block>
+					</view>
+				</view>
+			</view>
+			<uniStatusBar />
+			<!-- 未登录 -->
+			<view class="user-info clearfix" v-if="!isLogin">
+				<view class="ui-img float_left">
+					<u-image shape="circle" width="120rpx" height="120rpx" error-icon="photo"
+						src="https://onlineimg.qianniao.vip/user-re.png"></u-image>
+				</view>
+				<view class="user-name float_left" style="padding-top: 20rpx;">
+					<Login @loginSuccess="loginSuccess">
+						<view class="login-btn" slot="lBtn">登录/注册</view>
+					</Login>
+				</view>
+				<view class="float_right right-icon" @click="setUserInfo">
+					<view><text class="ibonfont ibonshezhi21"></text></view>
+					<view class="text">设置</view>
+				</view>
+			</view>
+			<!-- 已登录 -->
+			<view class="user-info clearfix" v-else>
+				<view class="ui-img float_left" @click="setUserInfo">
+					<u-image error-icon="photo" shape="circle" width="120rpx" height="120rpx" :src="userInfo.avatar">
+					</u-image>
+					<view class="edit-bth">{{ userStatus === 0 ? '去完善' : '编辑' }}</view>
+				</view>
+				<view class="user-name float_left">
+					<view class="un-text ellipsis" v-if="userInfo.name">{{ userInfo.name || '匿名用户' }}</view>
+					<view class="un-text-desc"
+						v-if="(personnelReview === 5 || finishData === 5) && (userStatus !== 2 || enableStatus === 4)">
+						<text v-if="enableStatus === 4">已禁用</text>
+						<text v-else-if="userStatus === 0">待完善资料</text>
+						<text v-else-if="userStatus === 1">审核中</text>
+						<text v-else-if="userStatus === 3">已驳回,请重新完善资料</text>
+					</view>
+					<view class="un-text-desc" v-else>
+						<text class="customer-type-name">{{ userInfo.customerSourceTypeName || '默认类型' }}</text>
+					</view>
+					<view class="un-text-desc" style="margin-left: 20rpx;" v-if="vip_data.isSelf"><text
+							class="customer-type-name">VIP会员</text></view>
+				</view>
+				<view class="float_right right-icon" @click="setUserInfo">
+					<view><text class="ibonfont ibonshezhi21"></text></view>
+					<view class="text">设置</view>
+				</view>
+			</view>
+			<block v-if="personnelReview === 5 && userStatus === 3">
+				<u-notice-bar mode="horizontal" :list="['审核失败,原因:' + userInfo.auditFailReason]" :speed="100"
+					:volume-icon="false" :more-icon="true"></u-notice-bar>
+			</block>
+		</view>
+
+		<view class="num-view" v-if="isLogin">
+			<view class="num-li" v-if="en_token !== aier_en_token" @click="navTo('/pagesT/money/Balance')">
+				<view class="num-text">{{ Number(userInfo.memberBalance) || 0 }}</view>
+				<view class="num-tit">余额</view>
+			</view>
+			<!-- <view class="num-li" @click="navTo('/pagesT/pointsMall/index')">
+				<view class="num-text">{{ userInfo.integral || 0 }}</view>
+				<view class="num-tit">股权</view>
+			</view> -->
+			<view class="num-li" @click="navTo('/pagesT/user/DiscountCoupon')">
+				<view class="num-text">{{ userInfo.couponNum || 0 }}</view>
+				<view class="num-tit">优惠券</view>
+			</view>
+			<view class="num-li" @click="navTo('/pagesT/user/Collection')">
+				<view class="num-text">{{ userInfo.collNum || 0 }}</view>
+				<view class="num-tit">收藏</view>
+			</view>
+		</view>
+		<view class="model-view">
+			<view class="model-tit clearfix">
+				<view class="float_left">我的订单</view>
+				<view class="float_right" @click="navTo('/pagesT/order/order?state=0')">
+					<text>查看全部</text>
+					<text class="ibonfont ibonjinru"></text>
+				</view>
+			</view>
+			<view class="model-main fn-ul order-ul">
+				<view class="fn-li" @click="navTo('/pagesT/order/order?state=' + 1)">
+					<u-badge v-if="order_num['2'] > 0 && isLogin" type="error" :offset="[-16, 18]"
+						:count="order_num['2']"></u-badge>
+					<view class="fn-icon">
+						<image :src="'https://onlineimg.qianniao.vip/ic-dfk-' + theme + '.png'"></image>
+					</view>
+					<view class="fn-label">待付款</view>
+				</view>
+				<view class="fn-li" @click="navTo('/pagesT/order/order?state=' + 2)">
+					<u-badge v-if="order_num['3'] > 0 && isLogin" type="error" :offset="[-16, 18]"
+						:count="order_num['3']"></u-badge>
+					<view class="fn-icon">
+						<image :src="'https://onlineimg.qianniao.vip/ic-dfh-' + theme + '.png'"></image>
+					</view>
+					<view class="fn-label">待发货</view>
+				</view>
+				<view class="fn-li" @click="navTo('/pagesT/order/order?state=' + 3)">
+					<u-badge v-if="order_num['4'] > 0 && isLogin" type="error" :offset="[-16, 18]"
+						:count="order_num['4']"></u-badge>
+					<view class="fn-icon">
+						<image :src="'https://onlineimg.qianniao.vip/ic-dsh-' + theme + '.png'"></image>
+					</view>
+					<view class="fn-label">待收货</view>
+				</view>
+				<view class="fn-li" @click="navTo('/pagesT/order/order?state=' + 4)">
+					<u-badge v-if="order_num['5'] > 0 && isLogin" type="error" :offset="[-16, 18]"
+						:count="order_num['5']"></u-badge>
+					<view class="fn-icon">
+						<image :src="'https://onlineimg.qianniao.vip/ic-finish-' + theme + '.png'"></image>
+					</view>
+					<view class="fn-label">已完成</view>
+				</view>
+				<!-- <view class="fn-li" v-if="en_token !== aier_en_token" @click="navTo('/pagesT/order/ReturnOrder')">
+					<u-badge v-if="order_num['10'] > 0 && isLogin" type="error" :offset="[-16, 18]" :count="order_num['10']"></u-badge>
+					<view class="fn-icon"><image :src="'https://onlineimg.qianniao.vip/ic-service-' + theme + '.png'"></image></view>
+					<view class="fn-label">售后服务</view>
+				</view> -->
+			</view>
+		</view>
+		<!-- 负责代表信息 -->
+		<!-- <view class="model-view" v-if="isLogin">
+			<view class="information-top">
+				<image src="https://onlineimg.qianniao.vip/ic-db.png" class="img"></image>
+				<view class="text">负责代表信息</view>
+			</view>
+			<view class="information-bottom">
+				<ul class="ul-list">
+					<li class="ul-item ellipsis">
+						<text class="left">出货门店:</text>
+						<text class="right">{{ userInfo.shopDate.name }}</text>
+					</li>
+					<li class="ul-item">
+						<text class="left">业代姓名:</text>
+						<text class="right">{{ userInfo.salesManName || '客服' }}</text>
+					</li>
+					<li class="ul-item">
+						<text class="left">服务时间:</text>
+						<text class="right">全天</text>
+					</li>
+					<li class="ul-item">
+						<text class="left">门店电话:</text>
+						<text class="right right-last" @click="lianxi(userInfo.salesManMobile || userInfo.shopDate.mobile)">
+							{{ userInfo.salesManMobile || userInfo.shopDate.mobile }}
+						</text>
+					</li>
+				</ul>
+			</view>
+		</view> -->
+		<view class="model-view" v-if="en_token !== aier_en_token">
+			<view class="model-tit">我的服务</view>
+			<view class="model-main fn-ul">
+				<!-- <view class="fn-li" @click="navTo('/pagesT/user/VipList')">
+					<view class="fn-icon"><image :src="'https://onlineimg.qianniao.vip/ic-vip-' + theme + '.png'"></image></view>
+					<view class="fn-label">会员卡</view>
+				</view> -->
+				<view class="fn-li" @click="navTo('/pagesT/user/dyquan')">
+					<view class="fn-icon">
+						<image src="https://apiqnys.liuniukj.com/img/user/dyq.png"></image>
+					</view>
+					<view class="fn-label">我的优惠卡</view>
+				</view>
+				<view class="fn-li" @click="navTo('/pagesT/address/address')">
+					<view class="fn-icon">
+						<image src="https://apiqnys.liuniukj.com/img/user/wddz.png"></image>
+					</view>
+					<view class="fn-label">我的地址</view>
+				</view>
+				<view class="fn-li" @click="navTo('/pagesT/user/myyhk')">
+					<view class="fn-icon">
+						<image src="https://apiqnys.liuniukj.com/img/user/yhk.png"></image>
+					</view>
+					<view class="fn-label">优惠卡订单</view>
+				</view>
+				<!-- <view class="fn-li" @click="goDistribution">
+					<view class="fn-icon"><image :src="'https://onlineimg.qianniao.vip/ic-fen-' + theme + '.png'"></image></view>
+					<view class="fn-label">分销中心</view>
+				</view> -->
+
+				<view class="fn-li" @click="navTo('/pagesT/user/Collection')">
+					<view class="fn-icon">
+						<image src="https://apiqnys.liuniukj.com/img/user/wdsc.png"></image>
+					</view>
+					<view class="fn-label">我的收藏</view>
+				</view>
+			</view>
+		</view>
+		<view class="model-view list-model-view">
+			<view class="model-tit">工具与服务</view>
+			<view class="model-main list-ul new-class">
+				<view class="list-li clearfix" @click="openpop">
+					<view class="fn-icon">
+						<image src="https://apiqnys.liuniukj.com/img/user/ic-kf.png" mode="aspectFill"></image>
+						<view>{{ userInfo.salesManName ? '专属客服' : '客服中心' }}</view>
+					</view>
+				</view>
+				<!-- <view class="list-li clearfix" v-if="en_token === aier_en_token" @click="navTo('/pagesT/address/address')">
+					<view class="fn-icon">
+						<image src="https://onlineimg.qianniao.vip/ic-dz.png" mode="aspectFill"></image>
+						<view>我的地址</view>
+					</view>
+				</view> -->
+				<!-- <view class="list-li clearfix" v-if="en_token === aier_en_token" @click="navTo('/pagesT/money/CustomerBalanceDetail')">
+					<view class="fn-icon">
+						<image src="https://onlineimg.qianniao.vip/ic-3.png" mode="aspectFill"></image>
+						<view>往来查询</view>
+					</view>
+				</view> -->
+				<view class="list-li clearfix" @click="navTo('/pagesT/unit/yhk')">
+					<view class="fn-icon">
+						<image src="https://apiqnys.liuniukj.com/img/user/hyk.png" mode="aspectFill"></image>
+						<view>优惠卡</view>
+					</view>
+				</view>
+				<view class="list-li clearfix" @click="navTo('/pagesT/user/GetCoupon')">
+					<view class="fn-icon">
+						<image src="https://apiqnys.liuniukj.com/img/user/lqzx.png" mode="aspectFill"></image>
+						<view>领券中心</view>
+					</view>
+				</view>
+				<view class="list-li clearfix" @click="navTo('/pagesT/order/orderT?state=1')">
+					<view class="fn-icon">
+						<image src="https://apiqnys.liuniukj.com/img/user/cgqd.png" mode="aspectFill"></image>
+						<view>我的预约</view>
+					</view>
+				</view>
+				<view class="list-li clearfix" @click="navTo('/pagesT/user/needSubmit')">
+					<view class="fn-icon">
+						<image src="https://apiqnys.liuniukj.com/img/user/xqtb.png" mode="aspectFill"></image>
+						<view>需求提报</view>
+					</view>
+				</view>
+				<!-- <view class="list-li clearfix" @click="navTo('/pagesT/user/guquan')">
+					<view class="fn-icon">
+						<image src="https://apiqnys.liuniukj.com/img/user/gq.png" mode="aspectFill"></image>
+						<view>股份</view>
+					</view>
+				</view> -->
+				<view class="list-li clearfix" v-if="userInfo.isPartner==1" @click="goPartnerHome">
+					<view class="fn-icon">
+						<image src="https://apiqnys.liuniukj.com/img/user/gq.png" mode="aspectFill"></image>
+						<view>合伙人中心</view>
+					</view>
+				</view>
+				<view class="list-li clearfix" v-if="userInfo.agentId && userInfo.agentId>0" @click="goAgentHome">
+					<view class="fn-icon">
+						<image src="https://apiqnys.liuniukj.com/upload/icon/new_agent.png" mode="aspectFill"></image>
+						<view>代理中心</view>
+					</view>
+				</view>
+				<!-- #ifdef MP -->
+				<view class="list-li">
+					<button class="clearfix share-btn" open-type="share">
+						<view class="fn-icon">
+							<image src="https://apiqnys.liuniukj.com/img/user/tjfx.png" mode="aspectFill"></image>
+							<view class="share">推荐分享</view>
+						</view>
+					</button>
+				</view>
+				<!-- #endif -->
+				<!-- #ifdef APP-PLUS -->
+				<!-- <view class="list-li clearfix"  @click="share">
+					<view class="fn-icon">
+						<image src="https://onlineimg.qianniao.vip/ic-5.png" mode="aspectFill"></image>
+						<view>推荐分享</view>
+					</view>
+				</view> -->
+				<!-- <view class="list-li clearfix" @click="share">
+					<view class="float_left">
+						<view class="fn-icon"><image src="https://onlineimg.qianniao.vip/ic-5.png" mode="aspectFill"></image></view>
+						<text>推荐分享</text>
+					</view>
+					<view class="float_right"><text class="ibonfont ibonjinru"></text></view>
+				</view> -->
+				<!-- #endif -->
+
+				<view class="list-li clearfix" v-if="en_token !== aier_en_token" @click="setUserInfo">
+					<view class="fn-icon">
+						<image src="https://apiqnys.liuniukj.com/img/user/sz.png" mode="aspectFill"></image>
+						<view>设置</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<u-modal v-model="show_change_name" @confirm="nameCofirm" @cancel="nameCancel" :show-cancel-button="true"
+			content="您的昵称为小程序默认昵称,是否立即修改" confirm-text="去修改" cancel-text="下次再说"></u-modal>
+		<u-modal v-model="tip_model" @confirm="finishCofirm" @cancel="tipCancel" :show-cancel-button="true"
+			content="请先完善资料,再进行购物" confirm-text="去完善" cancel-text="逛逛商城"></u-modal>
+		<Tabbar v-model="current"></Tabbar>
+
+		<u-popup v-model="call_show" width="600rpx" mode="center" border-radius="20">
+			<view class="call-pop">
+				<view class="title">
+					<text>专属客户经理</text>
+					<view class="close-icon" @click="cancalCall">
+						<u-icon name="close" size="28" color="#6c6c6c"></u-icon>
+					</view>
+				</view>
+				<view class="call-ul">
+					<view class="call-li">
+						<text class="label">客户经理:</text>
+						<text class="value">{{ userInfo.salesManName }}</text>
+					</view>
+					<view class="call-li">
+						<text class="label">联系方式:</text>
+						<text class="value">{{ userInfo.salesManMobile }}</text>
+					</view>
+				</view>
+				<view class="call-btn primary-btn" @click="lianxi(userInfo.salesManMobile)">一键通话</view>
+			</view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+	import Login from '@/components/Login.vue';
+	import uniStatusBar from '@/components/uni-status-bar/uni-status-bar.vue';
+	import {
+		getEnToken,
+		getToken
+	} from '@/access/common.js';
+
+	export default {
+		components: {
+			Login,
+			uniStatusBar
+		},
+		// 下拉刷新
+		onPullDownRefresh() {
+			if (this.$store.state.hasLogin) {
+				this.getCustomerInfo();
+				this.getMyVipCards();
+				// 获取分销文字设置
+				this.getTxtSetting();
+				this.getDistributionSetting();
+			} else {
+				uni.stopPullDownRefresh();
+			}
+		},
+		data() {
+			return {
+				tip_model: false,
+				show_change_name: false,
+				call_show: false,
+				current: 3,
+				distributionSet: {},
+				userInfo: {isPartner:0},
+				avatar: '',
+				vip_data: {},
+				vip_num: 0,
+				// 爱尔
+				aier_en_token: '8ecdecee648713391dc144f29bea5ca7',
+				en_token: getEnToken(),
+				order_num: {}
+			};
+		},
+		watch: {
+			'$store.state.locationObj'(val) {
+				if (JSON.stringify(val) === '{}') {
+					this.getAuthorizeInfo();
+					return;
+				}
+				if (this.$store.state.hasLogin) {
+					this.getCustomerInfo();
+				}
+			},
+			isLogin(val) {
+				if (val) {
+					// 获取用户详情
+					this.getCustomerInfo();
+					// 获取分销文字设置
+					this.getTxtSetting();
+					// 获取分销基础设置
+					this.getDistributionSetting();
+					this.getOrderStatusNum();
+				} else {
+					this.vip_data = {};
+				}
+			}
+		},
+		computed: {
+			// 业代姓名
+			salesManName() {
+				if (this.$store.state.userStatus.salesManName) {
+					return this.$store.state.userStatus.salesManName;
+				} else {
+					return '客服';
+				}
+			},
+			// 门店电话
+			salesManMobile() {
+				if (this.$store.state.userStatus.salesManMobile) {
+					return this.$store.state.userStatus.salesManMobile;
+				} else {
+					return this.$store.state.userStatus.enterpriseMobile;
+				}
+			},
+			// 门店
+			enterpriseName() {
+				return this.$store.state.enterpriseInfo.enterpriseName;
+			},
+			baseSet() {
+				return this.$store.state.baseSet;
+			},
+			enterprisemobile() {
+				return this.$store.state.enterpriseInfo.mobile;
+			},
+			isLogin() {
+				return this.$store.state.hasLogin;
+			},
+			// 客户审核
+			personnelReview() {
+				return this.baseSet.personnelReview;
+			},
+			userStatus() {
+				return this.$store.state.userStatus.status;
+			},
+			enableStatus() {
+				return this.$store.state.userStatus.enableStatus;
+			},
+			// 完善资料 4禁用 5启用
+			finishData() {
+				return this.baseSet.finishData;
+			}
+		},
+		onLoad() {
+			if (JSON.stringify(this.$store.state.locationObj) === '{}') {
+				this.getAuthorizeInfo();
+				return;
+			}
+			if (this.$store.state.hasLogin) {
+				// 获取分销文字设置
+				this.getTxtSetting();
+				// 获取分销基础设置
+				this.getDistributionSetting();
+				// this.avatar = this.$common.getAvator();
+			}
+			// #ifdef MP-WEIXIN
+			// 小程序的原生菜单中显示分享按钮
+			uni.showShareMenu({
+				withShareTicket: false,
+				menus: ['shareAppMessage', 'shareTimeline']
+			});
+			// #endif
+		},
+		onShow() {
+			if (this.$store.state.hasLogin) {
+				// 获取用户详情
+				this.getCustomerInfo();
+				this.getOrderStatusNum();
+			}
+		},
+		methods: {
+			// #ifdef APP-PLUS
+			share() {
+				uni.share({
+					provider: 'weixin',
+					scene: 'WXSceneSession',
+					type: 5,
+					title: this.baseSet.shop,
+					imageUrl: this.baseSet.images,
+					success: function(res) {
+						console.log('success:' + JSON.stringify(res));
+					},
+					fail: function(err) {
+						console.log('fail:' + JSON.stringify(err));
+					}
+				});
+			},
+			// #endif
+			// 设置用户信息
+			setUserInfo() {
+				if (!(this.finishData === 5 && this.userInfo.status !== 2)) {
+					this.navTo('/pagesT/selfconfig/selfconfig');
+				} else {
+					this.navTo('/pagesT/user/editUserInfo');
+				}
+			},
+			loginSuccess() {
+				// this.isLogin = this.$store.state.hasLogin;
+				// this.getCustomerInfo();
+				// this.getMyVipCards();
+			},
+			/**
+			 * 统一跳转接口,拦截未登录路由
+			 * navigator标签现在默认没有转场动画,所以用view
+			 */
+			navTo(url) {
+				// console.log(this.hasLogin)
+				// return
+				if (!this.$store.state.hasLogin) {
+					// #ifdef APP-PLUS
+					uni.reLaunch({
+						url: '/pagesT/public/wxLogin'
+					});
+					// #endif
+					// #ifdef MP-WEIXIN
+					uni.reLaunch({
+						url: '/pagesT/binding/bindInfo'
+					});
+					//#endif
+					// #ifdef H5
+					uni.navigateTo({
+						url: '/pagesT/public/wxLogin?loginType=2'
+					});
+					// #endif
+				} else {
+					uni.navigateTo({
+						url
+					});
+				}
+			},
+			
+			
+			async goDistribution() {
+				if (!this.$store.state.hasLogin) {
+					// #ifdef APP-PLUS || H5
+					uni.reLaunch({
+						url: '/pagesT/public/wxLogin'
+					});
+					// #endif
+					// #ifdef MP-WEIXIN
+					uni.reLaunch({
+						url: '/pagesT/binding/bindInfo'
+					});
+					//#endif
+				} else {
+					if (this.distributionSet.level && this.distributionSet.level > 0) {
+						this.getInfoBusinessman();
+					} else {
+						this.$api.msg('抱歉,当前商家暂未开启分销功能');
+					}
+				}
+			},
+			// 获取文字设置
+			async getTxtSetting() {
+				this.$u.api.getTxtSetting().then(({
+					data
+				}) => {
+					this.$store.commit('commit_distributionTextSet', data.base_form || {});
+				});
+			},
+			// 获取分销商详情
+			async getInfoBusinessman() {
+				if (this.userInfo.status !== 2) {
+					this.$api.msg('抱歉,您的账号未通过审核');
+					return;
+				}
+				this.$u.api.getInfoBusinessman().then(({
+					data
+				}) => {
+					if (JSON.stringify(data) === '{}') {
+						// 不是分销商进入申请分销商页面
+						this.goPage('/pagesT/Distribution/ApplyTerm');
+					} else {
+						if (data.auditStatus === 2) {
+							// 进入分销中心页面
+							this.goPage('/pagesT/Distribution/Distribution');
+						} else {
+							this.goPage('/pagesT/Distribution/ApplyAudit?auditStatus=1&applicationCondition=' +
+								data.applicationCondition);
+						}
+					}
+				});
+			},
+			
+			
+			
+			/**
+			 * 合伙人中心
+			 */
+			async goPartnerHome(){
+				if (!this.$store.state.hasLogin) {
+					// #ifdef APP-PLUS || H5
+					uni.reLaunch({
+						url: '/pagesT/public/wxLogin'
+					});
+					// #endif
+					// #ifdef MP-WEIXIN
+					uni.reLaunch({
+						url: '/pagesT/binding/bindInfo'
+					});
+					//#endif
+				} else {
+					if (this.userInfo.isPartner==1) {
+						this.getPartnerInfo();
+					} else {
+						this.$api.msg('抱歉,您还未成为合伙人');
+					}
+				}
+			},
+			async getPartnerInfo(){
+				if (this.userInfo.status !== 2) {
+					this.$api.msg('抱歉,您的账号未通过审核');
+					return;
+				}
+				this.$u.api.getCommissionPartnerData().then(({data}) => {
+					if(data && data.id>0){
+						this.goPage('/pagesT/NewPartner/index');
+					}else{
+						this.$api.msg('信息获取失败');
+					}
+				});
+			},
+			
+			
+			/**
+			 * 代理中心
+			 */
+			async goAgentHome(){
+				if (!this.$store.state.hasLogin) {
+					// #ifdef APP-PLUS || H5
+					uni.reLaunch({
+						url: '/pagesT/public/wxLogin'
+					});
+					// #endif
+					// #ifdef MP-WEIXIN
+					uni.reLaunch({
+						url: '/pagesT/binding/bindInfo'
+					});
+					//#endif
+				} else {
+					if (this.userInfo.agentId>0) {
+						this.getAgentInfo();
+					} else {
+						this.$api.msg('抱歉,您还未成为代理');
+					}
+				}
+			},
+			async getAgentInfo(){
+				if (this.userInfo.status !== 2) {
+					this.$api.msg('抱歉,您的账号未通过审核');
+					return;
+				}
+				this.$u.api.getAgentData().then(({data}) => {
+					if(data && data.id>0){
+						this.goPage('/pagesT/NewAgent/index');
+					}else{
+						this.$api.msg('信息获取失败');
+					}
+				});
+			},
+			
+			
+			
+			
+			
+			
+			
+			
+			getDistributionSetting() {
+				this.$u.api.getDistributionSetting().then(({
+					data
+				}) => {
+					this.$store.commit('commit_distributionSet', data);
+					this.distributionSet = data;
+				});
+			},
+			// 获取我的会员卡
+			getMyVipCards() {
+				this.$u.api
+					.getMyVipCards({
+						page: 1,
+						pageSize: 1
+					})
+					.then(({
+						data,
+						pageTotal
+					}) => {
+						if (data.length) {
+							this.vip_num = pageTotal;
+							this.vip_data = {
+								...data[0],
+								isSelf: true
+							};
+						} else {
+							this.getAllVipCard();
+						}
+					});
+			},
+			// 获取会员列表
+			getAllVipCard() {
+				this.$u.api
+					.getAllVipCard({
+						page: 1,
+						pageSize: 1
+					})
+					.then(({
+						data
+					}) => {
+						if (data.length) {
+							this.vip_data = data[0];
+						}
+					});
+			},
+			//用户订单状态数量统计
+			getOrderStatusNum() {
+				this.$u.api.getOrderStatusNum().then(res => {
+					this.order_num = res.data;
+				});
+			},
+			// 获取用户信息
+			getCustomerInfo() {
+				this.$u.api.getCustomerInfo().then(({
+					data
+				}) => {
+					uni.stopPullDownRefresh();
+					this.userInfo = data;
+					if (this.userInfo.status === 2) {
+						this.getMyVipCards();
+					}
+					this.$store.commit('commit_userStatus', data);
+					if (this.baseSet.finishDataGo && data.status === 0) {
+						this.tip_model = true;
+					}
+					if (this.userInfo.name == '微信用户') {
+						let show = uni.getStorageSync('showchangename')
+						if(show != 1) {
+							this.show_change_name = true
+						}
+					}
+				});
+			},
+			// 联系客服
+			async lianxi(phone) {
+				this.cancalCall();
+				uni.makePhoneCall({
+					phoneNumber: phone || this.enterprisemobile
+				});
+			},
+			cancalCall() {
+				this.call_show = false;
+			},
+			openpop() {
+				if (this.userInfo.salesManName) {
+					this.call_show = true;
+				} else {
+					this.lianxi(this.enterprisemobile);
+				}
+			},
+			// 完善资料提示取消
+			tipCancel() {
+				this.tip_model = false;
+			},
+			nameCancel() {
+				uni.setStorageSync('showchangename',1)
+				this.show_change_name = false;
+				
+			},
+			// 跳转完善资料页面
+			finishCofirm() {
+				this.goPage('/pagesT/user/editUserInfo');
+			},
+			nameCofirm() {
+				uni.setStorageSync('showchangename',1)
+				this.goPage('/pagesT/selfconfig/selfconfig');
+			},
+			
+		},
+		onShareAppMessage(options) {
+			console.log(this.$store.state.userStatus)
+			return {
+				title: this.$store.state.baseSet.shop,
+				path: '/pages/index/index?businessmanId=' + (this.$store.state.userStatus.id || ''),
+				success: res => {
+					console.log(res);
+				}
+			};
+		},
+		// #ifdef MP-WEIXIN
+		// 分享到朋友圈
+		onShareTimeline(obj) {},
+		// 收藏小程序
+		onAddToFavorites() {}
+		// #endif
+	};
+</script>
+
+<style lang="scss">
+	page {
+		background-color: #ffffff;
+	}
+
+	.user-index {
+		overflow-x: hidden;
+		width: 750upx;
+	}
+
+	.user-top {
+		color: #ffffff;
+		position: relative;
+		width: 100%;
+		height: 418rpx;
+		overflow: hidden;
+
+		.circle-big {
+			content: '';
+			display: block;
+			width: 180%;
+			height: 418rpx;
+			position: absolute;
+			left: 50%;
+			transform: translateX(-50%);
+			top: 0;
+			overflow: hidden;
+			border-radius: 0 0 50% 50%;
+			background: linear-gradient(156deg, #ff6b2c 0%, #ec2723 100%);
+
+			.circle-one {
+				position: absolute;
+				top: 0;
+				left: 20%;
+				border-bottom-right-radius: 100%;
+				width: 557rpx;
+				height: 60rpx;
+				background: linear-gradient(180deg, rgba(255, 60, 58, 0.62) 10%, #ff6d2f 100%);
+			}
+
+			.circle-two {
+				width: 155rpx;
+				height: 155rpx;
+				background: linear-gradient(211deg, #ff8d33 0%, #ff633b 62%);
+				border-radius: 100%;
+				position: absolute;
+				bottom: -12rpx;
+				left: 19%;
+			}
+
+			.vip-view {
+				width: 670upx;
+				padding: 26rpx 40rpx;
+				height: 98rpx;
+				border-radius: 15rpx;
+				background: linear-gradient(90deg, #8e0e15 0%, #550609 100%);
+				border-top: 4rpx solid rgba(255, 219, 153, 1);
+				color: #ffe285;
+				z-index: 1;
+				position: absolute;
+				bottom: 0;
+				left: 50%;
+				transform: translateX(-50%);
+				overflow: hidden;
+
+				.vip-name {
+					display: inline-block;
+					font-size: 32rpx;
+					font-weight: 500;
+				}
+
+				.desc {
+					font-size: 28rpx;
+					font-weight: 400;
+					margin-left: 16rpx;
+					display: inline-block;
+				}
+
+				.vip-btn {
+					width: 140rpx;
+					font-size: 24rpx;
+					font-weight: 400;
+					height: 42rpx;
+					background: linear-gradient(90deg, #ffbf59 0%, #ff3b2d 100%);
+					border-radius: 21rpx;
+					color: #ffefc5;
+					text-align: center;
+					line-height: 42rpx;
+				}
+			}
+		}
+
+		.user-info {
+			padding: 0 40rpx;
+			padding-top: 80rpx;
+			position: relative;
+			z-index: 9;
+
+			.ui-img {
+				border-radius: 100%;
+				border: 4upx solid #ffffff;
+				position: relative;
+
+				.edit-bth {
+					position: absolute;
+					width: 86rpx;
+					height: 32rpx;
+					background: #b620e0;
+					border-radius: 16rpx;
+					text-align: center;
+					font-size: 20rpx;
+					line-height: 32rpx;
+					left: 50%;
+					transform: translateX(-50%);
+					bottom: -8rpx;
+				}
+			}
+
+			.right-icon {
+				text-align: center;
+				padding-top: 22rpx;
+
+				.ibonfont {
+					font-size: 40rpx;
+				}
+
+				.text {
+					font-size: 20rpx;
+					font-weight: 400;
+					color: #ffffff;
+					line-height: 28rpx;
+					margin-top: 9rpx;
+				}
+			}
+
+			.user-name {
+				font-size: 32upx;
+				padding-left: 10upx;
+				margin-top: 14rpx;
+				width: 450rpx;
+
+				.login-btn {
+					color: #fff;
+					font-size: 32rpx;
+					width: 100%;
+					text-align: left;
+				}
+
+				.un-text {
+					-webkit-line-clamp: 1;
+				}
+
+				.un-text-desc {
+					float: left;
+					font-size: 20upx;
+					margin-top: 12rpx;
+					width: 120rpx;
+					height: 36rpx;
+					line-height: 36rpx;
+					text-align: center;
+					background: rgba(255, 139, 130, 0.38);
+					border-radius: 18rpx;
+				}
+
+				.ulogin-bth {
+					text-align: left;
+					height: 46upx;
+					line-height: 46upx;
+					border-radius: 46upx;
+					padding: 0;
+					color: #ffffff;
+					float: left;
+					background-color: transparent;
+					margin-top: 20upx;
+
+					&::after {
+						border: 0 none;
+					}
+				}
+			}
+		}
+	}
+
+	.num-view {
+		display: flex;
+		padding-bottom: 10upx;
+		border-bottom: 16rpx solid #f9f9f9;
+		padding: 30rpx 0;
+
+		.num-li {
+			flex: 4;
+			text-align: center;
+			position: relative;
+
+			.num-text {
+				font-size: 32upx;
+				font-weight: 600;
+				padding-bottom: 10upx;
+				font-family: DIN-Medium;
+			}
+
+			.num-tit {
+				font-size: 24upx;
+				font-weight: 400;
+			}
+
+			&::after {
+				content: '';
+				display: block;
+				position: absolute;
+				width: 1px;
+				height: 40upx;
+				background-color: #ffffff;
+				right: 0;
+				top: 50%;
+				transform: translateY(-50%);
+			}
+		}
+
+		.num-li:last-child {
+			&::after {
+				background-color: transparent;
+			}
+		}
+	}
+
+	.model-view {
+		border-bottom: 16rpx solid #f9f9f9;
+		border-radius: 12upx;
+		padding-bottom: 40upx;
+		background-color: #ffffff;
+		position: relative;
+		z-index: 1;
+
+		.information-bottom {
+			// width: 750rpx;
+			height: 100rpx;
+			text-align: center;
+			padding-left: 48rpx;
+
+			.ul-list {
+				display: flex;
+				flex-wrap: wrap;
+				margin-top: 32rpx;
+
+				.ul-item {
+					text-align: left;
+					width: 50%;
+					-webkit-line-clamp: 1;
+
+					&:nth-child(3),
+					&:nth-child(4) {
+						margin-top: 24rpx;
+					}
+
+					.left {
+						font-size: 24rpx;
+						line-height: 33rpx;
+						color: #9d9d9d;
+						font-weight: 500;
+					}
+
+					.right {
+						font-size: 24rpx;
+						line-height: 33rpx;
+						color: #000000;
+						font-weight: 600;
+					}
+
+					.right-last {
+						color: #fa6400;
+						font-weight: 600;
+					}
+				}
+			}
+		}
+
+		// 负责信息
+		.information-top {
+			// width:750rpx ;
+			height: 72rpx;
+			background: url(https://onlineimg.qianniao.vip/bck.png) no-repeat;
+			background-position: -24rpx 0, 0 0;
+			background-size: 800rpx 99rpx;
+			padding-top: 17rpx;
+
+			.img {
+				display: inline-block;
+				width: 33rpx;
+				height: 33rpx;
+				vertical-align: middle;
+				margin-left: 56rpx;
+			}
+
+			.text {
+				font-size: 32rpx;
+				font-weight: 600;
+				color: #2a2a2a;
+				line-height: 45rpx;
+				vertical-align: middle;
+				display: inline-block;
+				margin-left: 6rpx;
+			}
+		}
+
+		.model-tit {
+			padding: 32upx;
+			font-size: 32rpx;
+			font-weight: 600;
+			color: #000000;
+
+			.float_right {
+				font-size: 28upx;
+				color: #9d9d9d;
+				font-weight: 400;
+
+				.ibonjinru {
+					margin-left: 10upx;
+					font-size: 24upx;
+				}
+			}
+		}
+
+		.list-ul {
+			padding: 0 30upx;
+			display: flex;
+			flex-wrap: wrap;
+
+			.list-li {
+				line-height: 90upx;
+				font-size: 28upx;
+				color: #2a2a2a;
+				width: 25%;
+				text-align: center;
+
+				.fn-icon {
+					// margin-right: 24upx;
+					// display: inline-block;
+					text-align: center;
+
+					.share {
+						line-height: 95rpx;
+						padding-left: 8rpx;
+					}
+
+					image {
+						width: 89rpx;
+						height: 89rpx;
+						vertical-align: middle;
+						transform: translateY(3rpx); // width: 50upx;
+						// height: 50upx;
+						// vertical-align: middle;
+						// transform: translateY(-2upx);
+					}
+				}
+
+				.ibonjinru {
+					font-size: 28upx;
+					color: #9d9d9d;
+				}
+
+				.share-btn {
+					background-color: #ffffff;
+					font-size: 28rpx;
+					padding-left: 0;
+					padding-right: 0;
+					padding-top: 2rpx;
+					text-align: left;
+					color: #2a2a2a;
+				}
+			}
+		}
+
+		.fn-ul {
+			display: flex;
+			flex-wrap: wrap;
+
+			.fn-li {
+				width: 25%;
+				flex-grow: 1;
+				text-align: center;
+				font-size: 26upx;
+				margin-top: 16upx;
+
+				.fn-label {
+					color: #6a6a6a;
+					font-size: 26rpx;
+				}
+
+				.fn-icon {
+					image {
+						width: 70upx;
+						height: 70upx;
+					}
+
+					.ibonfont {
+						color: #000000;
+						font-size: 50upx;
+						padding-bottom: 10upx;
+						display: inline-block;
+					}
+				}
+			}
+		}
+
+		.order-ul {
+			.fn-li {
+				width: 20%;
+				position: relative;
+
+				.fn-icon {
+					image {
+						width: 64upx;
+						height: 64upx;
+						margin-bottom: 10rpx;
+					}
+				}
+			}
+		}
+	}
+
+	.list-model-view {
+		margin-bottom: 0;
+		border-bottom: 0;
+		padding-bottom: 0;
+	}
+
+	.call-pop {
+		.title {
+			text-align: center;
+			padding: 0 30rpx;
+			line-height: 90rpx;
+			height: 90rpx;
+			font-weight: bold;
+			position: relative;
+
+			.close-icon {
+				position: absolute;
+				font-weight: normal;
+				right: 30rpx;
+				top: 50%;
+				transform: translateY(-50%);
+			}
+		}
+
+		.call-ul {
+			padding: 0 30rpx 30rpx;
+
+			.call-li {
+				line-height: 80rpx;
+				height: 80rpx;
+			}
+		}
+
+		.call-btn {
+			width: 100%;
+			line-height: 80rpx;
+			height: 80rpx;
+			text-align: center;
+		}
+	}
+</style>

+ 157 - 0
pagesT/Distribution/AddUpMoney.vue

@@ -0,0 +1,157 @@
+<template>
+	<view class="AddUpMoney">
+		<view class="top-money-view">
+			<view class="money-num">{{ totalMoney || 0 }}</view>
+			<view class="add-up-label">{{ text_set.commission_c || '累计佣金' }}(元)</view>
+		</view>
+		<view class="cash-out-view">
+			<view class="money-num">{{ balance || 0 }}</view>
+			<view class="add-up-label">{{ text_set.commission_w || '可提现佣金' }}(元)</view>
+			<view class="cash-our-btn" @click="goPage('/pagesT/Distribution/Withdrawal?balance=' + (balance || 0) + '&id=' + businessman_id)">
+				申请{{ text_set.withdrawal || '提现' }}
+			</view>
+		</view>
+		<view class="cash-ul">
+			<view class="cash-li clearfix">
+				<text class="float_left cash-li-label">{{ text_set.commission_s || '待审核佣金' }}</text>
+				<text class="float_right cash-li-value">
+					¥
+					<text class="num-text">{{ waitAuditWithdraw || 0 }}</text>
+				</text>
+			</view>
+			<view class="cash-li clearfix">
+				<text class="float_left cash-li-label">{{ text_set.commission_d || '待打款佣金' }}</text>
+				<text class="float_right cash-li-value">
+					¥
+					<text class="num-text">{{ auditWithdraw || 0 }}</text>
+				</text>
+			</view>
+			<view class="cash-li clearfix">
+				<text class="float_left cash-li-label">{{ text_set.commission_r || '待入账佣金' }}</text>
+				<text class="float_right cash-li-value">
+					¥
+					<text class="num-text">{{ waitMoney || 0 }}</text>
+				</text>
+			</view>
+		</view>
+		<view class="user-tip">
+			<view class="user-tip-tit">用户须知</view>
+			<view class="user-tip-li">买家确认收货后,立即获得{{ text_set.commission || '佣金' }}</view>
+			<view class="user-tip-li">注意:{{ text_set.commission_w || '可提现佣金' }}满0.01元后才能申请{{ text_set.withdrawal || '提现' }}</view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			text_set: {},
+			balance: 0,
+			businessman_id: 0,
+			totalMoney: 0,
+			waitMoney: 0,
+			waitAuditWithdraw: 0,
+			auditWithdraw: 0
+		};
+	},
+	onLoad(options) {
+		uni.setNavigationBarColor({
+			frontColor: '#ffffff',
+			backgroundColor: '#fb604e'
+		});
+
+		this.text_set = this.$store.state.distributionTextSet;
+		if (this.text_set.commission_c) {
+			uni.setNavigationBarTitle({
+				title: this.text_set.commission_c || '累计佣金'
+			});
+		}
+		console.log(options);
+		this.balance = options.balance;
+		this.totalMoney = options.totalMoney;
+		this.waitMoney = options.waitMoney;
+		this.auditWithdraw = options.auditWithdraw;
+		this.waitAuditWithdraw = options.waitAuditWithdraw;
+		this.businessman_id = options.id;
+	}
+};
+</script>
+
+<style lang="scss">
+.top-money-view {
+	background: #fb604e;
+	padding: 50upx 0;
+	text-align: center;
+	.money-num {
+		font-size: 64upx;
+		color: #ffffff;
+		padding-bottom: 20upx;
+	}
+	.add-up-label {
+		color: #ffffff;
+		opacity: 0.5;
+		font-size: 24upx;
+	}
+}
+.cash-out-view {
+	text-align: center;
+	padding: 50upx 0;
+	border-bottom: 20upx solid $page-color-base;
+	.money-num {
+		font-size: 54upx;
+		color: #ff4c1a;
+		padding-bottom: 20upx;
+		font-weight: bold;
+	}
+	.add-up-label {
+		color: #999;
+		font-size: 24upx;
+	}
+	.cash-our-btn {
+		line-height: 60upx;
+		height: 60upx;
+		background-color: #fa502c;
+		color: #fff;
+		text-align: center;
+		font-size: 28upx;
+		border-radius: 60upx;
+		width: 400upx;
+		margin: 50upx auto 0;
+	}
+}
+.cash-ul {
+	padding: 0 20upx;
+	border-bottom: 20upx solid $page-color-base;
+	.cash-li {
+		line-height: 90upx;
+		border-bottom: 1px solid #f5f5f5;
+		font-size: 26upx;
+		.cash-li-value {
+			font-size: 22upx;
+			.num-text {
+				font-weight: bold;
+				font-size: 28upx;
+				margin-left: 4upx;
+			}
+		}
+		&:last-child {
+			border-bottom: 0 none;
+		}
+	}
+}
+.user-tip {
+	padding: 30upx 20upx;
+	.user-tip-tit {
+		font-size: 24upx;
+		font-weight: bold;
+		padding-bottom: 26upx;
+		color: #444;
+	}
+	.user-tip-li {
+		font-size: 24upx;
+		line-height: 36upx;
+		color: #666666;
+	}
+}
+</style>

+ 34 - 0
pagesT/Distribution/Agreement.vue

@@ -0,0 +1,34 @@
+<template>
+	<!-- 申请协议 -->
+	<view>
+		<view class="argee-title">{{ distributionSet.title }}</view>
+		<view class="argee-cont"><u-parse :html="distributionSet.desc"></u-parse></view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			distributionSet: {}
+		};
+	},
+	onLoad() {
+		this.distributionSet = this.$store.state.distributionSet;
+		uni.setNavigationBarTitle({
+			title: this.distributionSet.title
+		});
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+.argee-title {
+	line-height: 32upx;
+	padding: 20upx 0;
+	text-align: center;
+}
+.argee-cont {
+	padding: 0 20upx 20upx;
+}
+</style>

+ 194 - 0
pagesT/Distribution/Application.vue

@@ -0,0 +1,194 @@
+<template>
+	<!-- 提现详情 -->
+	<view class="application">
+		<view class="application_e">
+			<text class="num">+{{ detail_data.money || 0 }}</text>
+			<text class="examine">
+				{{
+					detail_data.auditStatus === 1
+						? '待审核'
+						: detail_data.auditStatus === 2
+						? '打款成功'
+						: detail_data.auditStatus === 3
+						? '无效'
+						: detail_data.auditStatus === 4
+						? '待打款'
+						: ''
+				}}
+			</text>
+		</view>
+		<view class="application_t">
+			<view class="application_type">
+				<text class="application_txt">提现类型</text>
+				<view style="float: right;">
+					<text class="ibonfont ibonweixinzhifu application_img" v-if="detail_data.type === 1"></text>
+					<text class="ibonfont application_img ibonumidd17" v-if="detail_data.type === 2"></text>
+					<text class="ibonfont application_img ibonhuodaofukuan" v-if="detail_data.type === 3"></text>
+					<text class="application_name">{{ detail_data.type === 1 ? '微信钱包' : detail_data.type === 2 ? '支付宝' : detail_data.type === 3 ? '银行卡' : '' }}</text>
+				</view>
+			</view>
+			<view style="margin:30upx 0 0 60upx;">
+				<u-time-line>
+					<u-time-line-item node-top="2">
+						<template v-slot:node>
+							<view class="u-node" :style="{ background: detail_data.auditStatus >= 1 ? '#19be6b' : '#d0d0d0' }">
+								<u-icon name="checkbox-mark" color="#fff" :size="24"></u-icon>
+							</view>
+						</template>
+						<template v-slot:content>
+							<view class="u-line-box" :style="{ color: detail_data.auditStatus >= 1 ? '#333' : '#999999' }">
+								<view class="u-order-desc">申请时间</view>
+								<view class="u-order-time">{{ $_utils.formatDate(detail_data.createTime) }}</view>
+							</view>
+						</template>
+					</u-time-line-item>
+					<u-time-line-item node-top="2">
+						<template v-slot:node>
+							<view class="u-node" :style="{ background: [2, 4].includes(detail_data.auditStatus) ? '#19be6b' : '#d0d0d0' }">
+								<u-icon name="checkbox-mark" color="#fff" :size="24"></u-icon>
+							</view>
+						</template>
+						<template v-slot:content>
+							<view class="u-line-box" :style="{ color: [2, 4].includes(detail_data.auditStatus) ? '#333' : '#999999' }">
+								<view class="u-order-desc">审核时间</view>
+								<view class="u-order-time" v-if="detail_data.auditTime">{{ $_utils.formatDate(detail_data.auditTime) }}</view>
+							</view>
+						</template>
+					</u-time-line-item>
+					<u-time-line-item node-top="2">
+						<template v-slot:node>
+							<view class="u-node" :style="{ background: detail_data.auditStatus === 2 ? '#19be6b' : '#d0d0d0' }">
+								<u-icon name="checkbox-mark" color="#fff" :size="24"></u-icon>
+							</view>
+						</template>
+						<template v-slot:content>
+							<view class="u-line-box" :style="{ color: detail_data.auditStatus === 2 ? '#333' : '#999999' }">
+								<view class="u-order-desc">完成打款</view>
+								<view class="u-order-time" v-if="detail_data.payTime">{{ $_utils.formatDate(detail_data.payTime) }}</view>
+							</view>
+						</template>
+					</u-time-line-item>
+				</u-time-line>
+			</view>
+		</view>
+
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			withdrawals_id: 0,
+			isLoding: false,
+			detail_data: {}
+		};
+	},
+	onLoad(options) {
+		this.withdrawals_id = options.id;
+	},
+	onShow() {
+		this.CommissionWithdrawalsDetail();
+	},
+	methods: {
+		CommissionWithdrawalsDetail() {
+			this.$u.api.CommissionWithdrawalsDetail(this.withdrawals_id).then(res=>{
+				this.detail_data = res.data;
+			})
+
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+body {
+	background-color: $page-color-base;
+}
+
+.application {
+	.application_e {
+		text-align: center;
+		height: 300upx;
+		background-color: #ffffff;
+
+		.num {
+			font-weight: bold;
+			font-size: 80upx;
+			display: block;
+			padding-top: 80upx;
+		}
+
+		.examine {
+			color: #fd463e;
+			font-size: 30upx;
+			padding-top: 40upx;
+			display: block;
+		}
+	}
+
+	.application_t {
+		margin-top: 20upx;
+		background-color: #ffffff;
+		height: 400upx;
+
+		.application_type {
+			height: 80upx;
+			line-height: 80upx;
+			border-bottom: 1px solid $page-color-base;
+			font-size: 28upx;
+
+			.application_txt {
+				font-size: 26upx;
+				padding-left: 20upx;
+				float: left;
+			}
+
+			.application_img {
+				margin-right: 10upx;
+				font-size: 46;
+				vertical-align: middle;
+			}
+			.ibonweixinzhifu {
+				color: #04be02;
+			}
+			.ibonumidd17 {
+				color: #108ee9;
+			}
+			.ibonhuodaofukuan {
+				color: #f2b844;
+			}
+			.application_name {
+				margin-right: 20upx;
+			}
+		}
+
+		.u-node {
+			width: 44rpx;
+			height: 44rpx;
+			border-radius: 100rpx;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			background: #d0d0d0;
+		}
+		.u-line-box {
+			color: #999999;
+			position: relative;
+		}
+		.u-order-desc {
+			font-size: 28rpx;
+			margin-bottom: 26rpx;
+		}
+
+		.u-order-time {
+			font-size: 26rpx;
+			float: right;
+			margin-right: 20upx;
+			position: absolute;
+			top: 10upx;
+			right: 20upx;
+		}
+	}
+}
+</style>

+ 321 - 0
pagesT/Distribution/ApplyAudit.vue

@@ -0,0 +1,321 @@
+<template>
+	<view class="apply-term">
+		<image :src="distributionSet.image || default_img" mode="aspectFill" class="apply-img"></image>
+		<!-- 成为分销商审核中 -->
+		<view class="apply-cont" v-if="auditStatus === 1 && applicationCondition === 1">
+			<view class="apply-tip">
+				<view class="audit-img"><image src="https://onlineimg.qianniao.vip/audit_img.jpg" mode="aspectFit"></image></view>
+				<view class="tip-text" v-if="applicationCondition === 4">您已购买指定商品,满足申请条件,请等待审核</view>
+				<view class="tip-text" v-else>感谢您的支持,请等待审核</view>
+			</view>
+			<view @click="goPage('/pages/index/index', 'switchTab')" class="sub-btn">去商城逛逛</view>
+		</view>
+		<!--  申请成为分销商条件为累计消费次数或者累计消费金额 -->
+		<view class="apply-cont" v-if="auditStatus === 1 && [2, 3].includes(applicationCondition)">
+			<view class="apply-num-cont">
+				<view>您已累计消费</view>
+				<view class="num-weight" v-if="applicationCondition === 2">
+					<text class="_number">{{ businessmanInfo.statistics ? businessmanInfo.statistics.auditOrderTotal || 0 : 0 }}</text>
+					<text>次</text>
+				</view>
+				<view class="num-weight" v-if="applicationCondition === 3">
+					<text class="_number">{{ businessmanInfo.statistics ? businessmanInfo.statistics.auditTotalMoney || 0 : 0 }}</text>
+					<text>元</text>
+				</view>
+			</view>
+
+			<view class="apply-tip-view" v-if="applicationCondition === 2">
+				<block v-if="distributionSet.buyNum > businessmanInfo.statistics.auditOrderTotal">
+					本店累计消费满
+					<text class="_importent">{{ distributionSet.buyNum }}</text>
+					次,
+					<text v-if="distributionSet.audit === 4">通过审核后</text>
+					即可{{ text_set.distributor || '成为分销商' }}
+				</block>
+				<block v-else>您的累计消费次数满足申请条件,请等待审核</block>
+			</view>
+
+			<view class="apply-tip-view" v-if="applicationCondition === 3">
+				<block v-if="distributionSet.buyAmount > businessmanInfo.statistics.auditTotalMoney">
+					本店累计消费满
+					<text class="_importent">{{ distributionSet.buyAmount }}</text>
+					元,
+					<text v-if="distributionSet.audit === 4">通过审核后</text>
+					即可{{ text_set.distributor || '成为分销商' }}
+				</block>
+				<block v-else>您的累计消费金额满足申请条件,请等待审核</block>
+			</view>
+			<view @click="goPage('/pages/index/index', 'switchTab')" class="sub-btn">继续去购物</view>
+		</view>
+		<!--  申请成为分销商条件为购买商品 -->
+		<view class="apply-cont" v-if="applicationCondition === 4">
+			<scroll-view scroll-y="true" style="height: calc(100vh - 360rpx);">
+				<view>
+					<block v-for="(item, index) in goodsList" :key="index">
+						<view class="goods-item-box clearfix">
+							<!-- 左边 -->
+							<view class="imgStyle float_left" @click="goPage(`/pagesT/product/product?id=${item.goodsId}`)">
+								<image mode="aspectFit" :src="item.images[0]"></image>
+							</view>
+							<!-- 右边 -->
+							<view class="right float_left">
+								<p class="title" @click="goPage(`/pagesT/product/product?id=${item.goodsId}`)">{{ item.goodsName }}</p>
+								<p class="subTitle" @click="goPage(`/pagesT/product/product?id=${item.goodsId}`)">
+									<text class="gradeName">{{ item.gradeName }}</text>
+									{{ item.unitName }}
+									<text v-for="(itemS, indexS) in item.specGroup" :key="indexS">_{{ itemS.specValueName }}</text>
+								</p>
+								<view class="clearfix" style="position:relative">
+									<view class="price float_left" v-if="!isShow" @click="goPage(`/pagesT/product/product?id=${item.goodsId}`)">
+										<text class="icon-rmb">¥</text>
+										<text>{{ item.salePrice }}</text>
+									</view>
+									<view class="float_right" v-if="item.inventory - 0 > 0">
+										<text class="add-cart-btn ibonfont ibongouwuche " @click="addCard(item.goodsId, item.skuId)"></text>
+									</view>
+								</view>
+							</view>
+							<text v-if="!(item.inventory - 0) || item.inventory - 0 <= 0" class="ibonfont ibonyishouwan-copy sale-end-icon"></text>
+						</view>
+					</block>
+				</view>
+			</scroll-view>
+		</view>
+		<AddCardModel :selAddress="now_sel_address" :skuId="goods_sku_id" @close="is_add_show = false" @change="cardModelPopChange" :isShow="is_add_show" :goodsId="goods_id" />
+	</view>
+</template>
+
+<script>
+	import AddCardModel from '@/components/AddCardModel';
+export default {
+	components: {
+		AddCardModel,
+	},
+	data() {
+		return {
+			default_img: 'https://onlineimg.qianniao.vip/931544405107da76ca2ec31cd63fae49/1596008994491apply_banner.png',
+			is_add_show: false,
+			isLoding: false,
+			goods_id: 0,
+			goods_sku_id: 0,
+			now_sel_address: {},
+			goodsList: [],
+			distributionSet: {
+				image: '',
+				info: [],
+				businessmanCondition: 0
+			},
+			auditStatus: 0, // 审核状态
+			applicationCondition: 0, // 申请成为分销商条件
+			text_set: {},
+			businessmanInfo: {
+				statistics:{}
+			}
+		};
+	},
+	onLoad(options) {
+		this.distributionSet = this.$store.state.distributionSet;
+		this.auditStatus = parseInt(options.auditStatus);
+		this.applicationCondition = parseInt(options.applicationCondition);
+		this.text_set = this.$store.state.distributionTextSet;
+		this.getInfoBusinessman()
+		// 申请成为分销商条件为购买商品
+		if (this.applicationCondition === 4) {
+			this.getBuyGoods();
+		}
+	},
+	methods: {
+		// 获取分销商详情
+		 getInfoBusinessman() {
+			this.$u.api.getInfoBusinessman().then(res=>{
+				this.businessmanInfo = res.data;
+			});
+		},
+		// 查询升级商品
+		 getBuyGoods() {
+			this.$u.api.getBuyGoods().then(res=>{
+				this.goodsList = data;
+			});
+		},
+		cardModelPopChange(obj) {
+			if (!obj.show) {
+				this.is_add_show = false;
+			}
+		},
+		addCard(id, skuId) {
+			this.goods_id = id;
+			this.goods_sku_id = skuId;
+			this.is_add_show = true;
+		},
+	}
+};
+</script>
+
+<style lang="scss">
+.apply-img {
+	width: 100%;
+	height: 322upx;
+	display: block;
+}
+.apply-cont {
+	padding: 20upx 30upx;
+	.apply-agree {
+		font-size: 24upx;
+		color: #999;
+		padding: 20upx 0;
+	}
+	.apply-tip-view {
+		text-align: center;
+		._importent {
+			color: #ff5a5f;
+		}
+	}
+	.apply-tip {
+		border-radius: 8upx;
+		width: 650upx;
+		margin: 26upx auto 46upx;
+		box-shadow: 0 0 20upx 4upx #f5f5f5;
+		padding: 50upx 0;
+		.audit-img {
+			image {
+				display: block;
+				width: 200upx;
+				height: 200upx;
+				margin: 0 auto;
+			}
+		}
+		.tip-text {
+			padding: 0 24upx;
+			text-align: center;
+			opacity: 0.9;
+			line-height: 60upx;
+		}
+	}
+	.sub-btn {
+		font-size: 30upx;
+		text-align: center;
+		color: #ffffff;
+		width: 645upx;
+		height: 72upx;
+		background-color: #fe582e;
+		border-radius: 40px;
+		line-height: 72upx;
+		margin: 50upx auto 0;
+	}
+}
+.apply-num-cont {
+	width: 650upx;
+	margin: 46upx auto;
+	font-size: 24upx;
+	color: #898c98;
+	text-align: center;
+	box-shadow: 0 0 20upx 4upx #f5f5f5;
+	padding: 64upx 0;
+	.num-weight {
+		padding-top: 40upx;
+		font-weight: bold;
+		color: #3d404c;
+		._number {
+			margin-right: 10upx;
+			font-size: 66upx;
+		}
+	}
+}
+
+.goods-item-box {
+	border-bottom: 1upx solid #eee;
+	padding: 18upx 0;
+	position: relative;
+	.sale-end-icon {
+		font-size: 90upx;
+		color: $uni-color-error;
+		display: block;
+		position: absolute;
+		right: 60upx;
+		top: 80upx;
+	}
+
+	.right {
+		width: calc(100% - 188upx);
+	}
+
+	.title {
+		font-size: 28upx;
+		color: #303133;
+		width: 100%;
+		height: 76upx;
+		line-height: 36upx;
+		text-overflow: -o-ellipsis-lastline;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		display: -webkit-box;
+		-webkit-line-clamp: 2;
+		line-clamp: 2;
+		-webkit-box-orient: vertical;
+	}
+
+	.subTitle {
+		font-size: 24upx;
+		color: #666;
+		white-space: nowrap;
+		width: 100%;
+		overflow: hidden;
+		/* 默认溢出隐藏 */
+		text-overflow: ellipsis;
+		padding: 6upx 0;
+		height: 48upx;
+		line-height: 42upx;
+		.gradeName {
+			padding: 0 10upx;
+			line-height: 32upx;
+			color: #fe582e;
+			border: 1upx solid #fe582e;
+			border-radius: 20upx;
+			display: inline-block;
+			vertical-align: middle;
+			height: 32upx;
+			margin-right: 10upx;
+		}
+	}
+
+	.price {
+		display: inline-block;
+		font-size: 28upx;
+		color: #fe582e;
+		font-weight: 500;
+	}
+
+	.price .icon-rmb {
+		font-size: 22upx;
+	}
+
+	.imgStyle {
+		padding-right: 24upx;
+	}
+
+	.imgStyle image {
+		width: 160upx;
+		height: 160upx;
+		border: 1px solid #eee;
+		border-radius: 4upx;
+		display: block;
+	}
+
+	/* 选规格 */
+	.add-cart-btn {
+		position: absolute;
+		right: 0;
+		bottom: 45%;
+		transform: translateY(50%);
+		background-color: #fe582e;
+		color: #fff;
+		display: block;
+		width: 50upx;
+		height: 50upx;
+		border-radius: 100%;
+		font-size: 24upx;
+		text-align: center;
+		line-height: 50upx;
+	}
+}
+</style>

+ 374 - 0
pagesT/Distribution/ApplyTerm.vue

@@ -0,0 +1,374 @@
+<template>
+	<view class="apply-term">
+		<image :src="distributionSet.image || default_img" mode="aspectFill" class="apply-img"></image>
+		<!--  无条件成为分销商 -->
+		<view class="apply-cont" v-if="distributionSet.businessmanCondition === 0">
+			<view class="apply-tip">
+				<view class="audit-img"><image src="https://onlineimg.qianniao.vip/no_coll.jpg" mode="aspectFit"></image></view>
+				<view class="tip-text">您还不是{{ text_set.name || '分销商' }},点击下方按钮立即{{ text_set.distributor || '成为分销商' }}</view>
+			</view>
+			<view @click="subApply" class="sub-btn">立即{{ text_set.distributor || '成为分销商' }}</view>
+		</view>
+		<!--  申请成为分销商条件为填写资料申请 -->
+		<view class="apply-cont" v-if="distributionSet.businessmanCondition === 1">
+			<u-form label-width="140rpx">
+				<block v-for="(item, index) in distributionSet.info" :key="index">
+					<u-form-item :label="item.prop"><u-input :clearable="false" v-model="item.value" /></u-form-item>
+				</block>
+			</u-form>
+			<view class="apply-agree" v-if='distributionSet.title'>
+				提交代表您同意
+				<text @click="goPage('/pagesT/Distribution/Agreement')" class="apply-agree-text primary-color">《{{ distributionSet.title }}》</text>
+			</view>
+			<view @click="subApply" class="sub-btn">申请{{ text_set.distributor || '成为分销商' }}</view>
+		</view>
+		<!--  申请成为分销商条件为累计消费次数或者累计消费金额 -->
+		<view class="apply-cont" v-if="[2, 3].includes(distributionSet.businessmanCondition)">
+			<view class="apply-num-cont">
+				<view>您已累计消费</view>
+				<view class="num-weight" v-if="distributionSet.businessmanCondition === 2">
+					<text class="_number">0</text>
+					<text>次</text>
+				</view>
+				<view class="num-weight" v-if="distributionSet.businessmanCondition === 3">
+					<text class="_number">0</text>
+					<text>元</text>
+				</view>
+			</view>
+
+			<view class="apply-tip-view">
+				您还不是{{ text_set.name || '分销商' }},点击下方按钮申请{{ text_set.distributor || '成为分销商' }}
+			</view>
+			<view class="sub-btn" @click="subApply">申请成为分销商</view>
+			<view class="user-discription">
+				<view class="user-d-tit">
+					用户须知
+				</view>
+				<view class="user-d-info">
+					1、当您点击申请成为分销商按钮后,开始累计您在本店的{{distributionSet.businessmanCondition === 3?'消费金额':'消费次数'}}</text>;
+				</view>
+				<view class="user-d-info">
+					2、您在本店累计{{distributionSet.businessmanCondition === 3?'消费金额':'消费次数'}}</text>满<text class="_importent">{{distributionSet.businessmanCondition === 3?distributionSet.buyAmount+'元':distributionSet.buyNum+'次'}}</text>,<text v-if="distributionSet.audit===4">通过审核后</text>即可{{ text_set.distributor || '成为分销商' }}
+				</view>
+			</view>
+		</view>
+		<!--  申请成为分销商条件为购买商品 -->
+		<view class="apply-cont" v-if="distributionSet.businessmanCondition === 4">
+			<view class="apply-tip-view">
+				您还不是{{ text_set.name || '分销商' }},点击下方按钮申请{{ text_set.distributor || '成为分销商' }}
+			</view>
+			<view class="sub-btn" @click="subApply">申请成为分销商</view>
+			<view class="user-discription">
+				<view class="user-d-tit">
+					用户须知
+				</view>
+				<view class="user-d-info">
+					当您点击申请成为分销商按钮后,购买指定商品,<text v-if="distributionSet.audit===4">通过审核后</text>即可{{ text_set.distributor || '成为分销商' }}
+				</view>
+			</view>
+		</view>
+		<AddCardModel :selAddress="now_sel_address" :skuId="goods_sku_id" @close="is_add_show = false" @change="cardModelPopChange" :isShow="is_add_show" :goodsId="goods_id" />
+
+	</view>
+</template>
+
+<script>
+import AddCardModel from '@/components/AddCardModel';
+export default {
+	components: {
+		AddCardModel,
+	},
+	data() {
+		return {
+			default_img: 'https://onlineimg.qianniao.vip/931544405107da76ca2ec31cd63fae49/1596008994491apply_banner.png',
+			is_add_show: false,
+			isLoding: false,
+			goods_id: 0,
+			now_sel_address: {},
+			goodsList: [],
+			apply_form: {
+				email: '',
+				name: '',
+				phone: ''
+			},
+			customerId: 0,
+			userName: '',
+			distributionSet: {
+				image: '',
+				info: [],
+				businessmanCondition: 0
+			},
+			auditStatus: 0, // 审核状态
+			applicationCondition: 0, // 申请成为分销商条件
+			goods_sku_id: 0,
+			text_set: {}
+		};
+	},
+	onLoad(options) {
+		if (options.auditStatus && options.applicationCondition) {
+			this.auditStatus = parseInt(options.auditStatus);
+			this.applicationCondition = parseInt(options.applicationCondition);
+		} else {
+			this.customerId = this.$store.state.userStatus.id;
+			this.userName = this.$store.state.userStatus.name;
+			this.distributionSet = this.$store.state.distributionSet;
+			// 申请成为分销商条件为购买商品
+			if (this.distributionSet.businessmanCondition === 4) {
+				this.getBuyGoods();
+			}
+		}
+		this.text_set = this.$store.state.distributionTextSet;
+	},
+	methods: {
+		// 查询升级商品
+		async getBuyGoods() {
+			this.$u.api.getBuyGoods().then(({data})=>{
+				this.goodsList = data;
+			})
+		},
+		cardModelPopChange(obj) {
+			if (!obj.show) {
+				this.is_add_show = false;
+			}
+		},
+		addCard(id, skuId) {
+			this.goods_id = id;
+			this.goods_sku_id = skuId;
+			this.is_add_show = true;
+		},
+		async subApply() {
+			let params = {
+				customerId: this.customerId
+			};
+			if (this.distributionSet.businessmanCondition === 1) {
+				let isSub = true;
+				for (let i in this.distributionSet.info) {
+					if (!this.distributionSet.info[i].value) {
+						isSub = false;
+						break;
+					}
+				}
+				if (!isSub) {
+					this.$api.msg('请输入申请资料');
+					return;
+				}
+				params.info = this.distributionSet.info;
+			}
+			this.$u.api.applicationBusinessman(params).then(res=>{
+				if (this.distributionSet.businessmanCondition === 0) {
+					// 无条件 点击按钮自动成为分销商
+					this.$api.msg('恭喜您已成为分销商');
+					setTimeout(() => {
+						this.goPage('/pagesT/Distribution/Distribution');
+					}, 500);
+				} else if(this.distributionSet.businessmanCondition === 4){
+					this.$api.msg('申请成功');
+					setTimeout(() => {
+						this.goPage('/pagesT/Distribution/ApplyAudit?auditStatus=1&applicationCondition=4','redirectTo');
+					}, 500);
+				}else {
+					// 不需要审核,填写完了条件成为分销商
+					if (this.distributionSet.audit === 4&&this.distributionSet.businessmanCondition === 1) {
+						this.$api.msg('恭喜您已成为分销商');
+						setTimeout(() => {
+							this.goPage('/pagesT/Distribution/Distribution');
+						}, 500);
+					} else {
+						// 不需要审核,填写完了等待审核
+						this.$api.msg('申请成功,正在审核中');
+						setTimeout(() => {
+							uni.navigateBack();
+						}, 500);
+					}
+				}
+			})
+
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.apply-img {
+	width: 100%;
+	height: 322upx;
+	display: block;
+}
+.apply-cont {
+	padding: 20upx 30upx;
+	.apply-agree {
+		font-size: 24upx;
+		color: #999;
+		padding: 20upx 0;
+	}
+	.apply-tip-view {
+		text-align: center;
+		._importent {
+			color: #ff5a5f;
+		}
+	}
+	.apply-tip {
+		border-radius: 8upx;
+		width: 650upx;
+		margin: 26upx auto 46upx;
+		box-shadow: 0 0 20upx 4upx #f5f5f5;
+		padding: 50upx 0;
+		.audit-img {
+			image {
+				display: block;
+				width: 200upx;
+				height: 200upx;
+				margin: 0 auto;
+			}
+		}
+		.tip-text {
+			padding: 0 24upx;
+			text-align: center;
+			opacity: 0.9;
+			line-height: 60upx;
+		}
+	}
+	.sub-btn {
+		font-size: 30upx;
+		text-align: center;
+		color: #ffffff;
+		width: 645upx;
+		height: 72upx;
+		background-color: #fe582e;
+		border-radius: 40px;
+		line-height: 72upx;
+		margin: 50upx auto 0;
+	}
+	.user-discription{
+		font-size: 24upx;
+		line-height: 40rpx;
+		padding-top: 30rpx;
+		.user-d-tit{
+			color: #333;
+			font-weight: bold;
+		}
+		.user-d-info{
+			color: #666;
+			._importent{
+				color: #fe582e;
+				font-weight: bold;
+			}
+		}
+	}
+}
+.apply-num-cont {
+	width: 650upx;
+	margin: 46upx auto;
+	font-size: 24upx;
+	color: #898c98;
+	text-align: center;
+	box-shadow: 0 0 20upx 4upx #f5f5f5;
+	padding: 64upx 0;
+	.num-weight {
+		padding-top: 40upx;
+		font-weight: bold;
+		color: #3d404c;
+		._number {
+			margin-right: 10upx;
+			font-size: 66upx;
+		}
+	}
+}
+
+.goods-item-box {
+	border-bottom: 1upx solid #eee;
+	padding: 18upx 0;
+	position: relative;
+	.sale-end-icon {
+		font-size: 90upx;
+		color: $uni-color-error;
+		display: block;
+		position: absolute;
+		right: 60upx;
+		top: 80upx;
+	}
+
+	.right {
+		width: calc(100% - 188upx);
+	}
+
+	.title {
+		font-size: 28upx;
+		color: #303133;
+		width: 100%;
+		height: 76upx;
+		line-height: 36upx;
+		text-overflow: -o-ellipsis-lastline;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		display: -webkit-box;
+		-webkit-line-clamp: 2;
+		line-clamp: 2;
+		-webkit-box-orient: vertical;
+	}
+
+	.subTitle {
+		font-size: 24upx;
+		color: #666;
+		white-space: nowrap;
+		width: 100%;
+		overflow: hidden;
+		/* 默认溢出隐藏 */
+		text-overflow: ellipsis;
+		padding: 6upx 0;
+		height: 48upx;
+		line-height: 42upx;
+		.gradeName {
+			padding: 0 10upx;
+			line-height: 32upx;
+			color: #fe582e;
+			border: 1upx solid #fe582e;
+			border-radius: 20upx;
+			display: inline-block;
+			vertical-align: middle;
+			height: 32upx;
+			margin-right: 10upx;
+		}
+	}
+
+	.price {
+		display: inline-block;
+		font-size: 28upx;
+		color: #fe582e;
+		font-weight: 500;
+	}
+
+	.price .icon-rmb {
+		font-size: 22upx;
+	}
+
+	.imgStyle {
+		padding-right: 24upx;
+	}
+
+	.imgStyle image {
+		width: 160upx;
+		height: 160upx;
+		border: 1px solid #eee;
+		border-radius: 4upx;
+		display: block;
+	}
+
+	/* 选规格 */
+	.add-cart-btn {
+		position: absolute;
+		right: 0;
+		bottom: 45%;
+		transform: translateY(50%);
+		background-color: #fe582e;
+		color: #fff;
+		display: block;
+		width: 50upx;
+		height: 50upx;
+		border-radius: 100%;
+		font-size: 24upx;
+		text-align: center;
+		line-height: 50upx;
+	}
+}
+</style>

+ 389 - 0
pagesT/Distribution/DOrder.vue

@@ -0,0 +1,389 @@
+<template>
+	<view style="height: 100vh">
+		<view class="content">
+			<view class="navbar">
+				<view
+					v-for="(item, index) in navList"
+					:key="index"
+					class="nav-item"
+					:class="[ tabCurrentIndex === index?'current primary-color':'']"
+					@click="tabClick(item, index)"
+				>
+					{{ item.text }}
+					<view class="current-line primary-btn"></view>
+				</view>
+			</view>
+
+			<swiper :current="tabCurrentIndex" class="swiper-box" duration="300" @change="changeTab">
+				<swiper-item class="tab-content" v-for="(tabItem, tabIndex) in navList" :key="tabIndex">
+					<scroll-view @scrolltolower="scrollBootom" scroll-y="true" style="height:100%">
+						<Aempty text="您还没有相关订单" src="https://onlineimg.qianniao.vip/order.png" v-if="orderList.length === 0"></Aempty>
+						<view v-for="(item, index) in orderList" :key="index" class="order-item">
+							<view class="clearfix order-no-view" @click="goPage(`/pagesT/Distribution/DorderDetail?id=` + item.id)">
+								<text class="float_left order-no-text">{{ $_utils.formatDate(item.createTime) }}</text>
+								<text class="float_right order-status-text">
+									{{
+										item.orderStatus === 1
+											? '待付款'
+											: item.orderStatus === 2
+											? '待付款'
+											: item.orderStatus === 3
+											? '待发货'
+											: item.orderStatus === 4
+											? '待收货'
+											: item.orderStatus === 5
+											? '已完成'
+											: item.orderStatus === 6
+											? '已关闭'
+											: ''
+									}}
+								</text>
+							</view>
+							<view class="goods-ul">
+								<view
+									class="goods-li clearfix"
+									v-for="(it, gindex) in item.orderGoods"
+									:key="gindex"
+									@click="goPage(`/pagesT/Distribution/DorderDetail?id=` + item.id)"
+								>
+									<image class="goods-img float_left" :src="it.goodsImages" mode="aspectFit"></image>
+									<view class="float_right goods-right">
+										<view class="goods-name">{{ it.goodsName }}</view>
+										<view class="goods-descrip">
+											规格:
+											<text style="padding-right: 6upx;">{{ it.unitName }}</text>
+											<block v-for="(ip, indexSp) in it.specGroup" :key="indexSp">
+												<text v-if="indexSp > 0">-</text>
+												<text>{{ ip.specValueName }}</text>
+											</block>
+										</view>
+										<view class="goods-price clearfix">
+											<view class="float_left">
+												<text class="price primary-color">¥{{ it.price }}</text>
+												<!-- <text class="sku">/{{ it.unitName }}</text> -->
+											</view>
+											<view class="float_right">
+												<text class="icon-jia">*</text>
+												<text class="goods-num">{{ it.buyNum }}</text>
+											</view>
+										</view>
+									</view>
+								</view>
+							</view>
+							<view class="middle clearfix">
+								<view class="float_left money-view">
+									{{ text_set.commission || '佣金' }}:
+									<text class="primary-color">¥{{ item.retMoney }}</text>
+								</view>
+								<view class="float_right">
+									实付:
+									<text class="price primary-color">¥{{ item.payAmount }}</text>
+								</view>
+							</view>
+						</view>
+						<u-loadmore margin-top="20" v-if="orderList.length" :status="loading_status" />
+					</scroll-view>
+				</swiper-item>
+			</swiper>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			orderList: [],
+			tabCurrentIndex: 0,
+			state: 1,
+			loading_status: 'loadmore',
+			navList: [
+				{
+					state: 0,
+					text: '全部',
+					loadingType: 'more',
+					orderList: []
+				},
+				{
+					state: 2,
+					text: '待付款',
+					loadingType: 'more',
+					orderList: []
+				},
+				{
+					state: 3,
+					text: '待发货',
+					loadingType: 'more',
+					orderList: []
+				},
+				{
+					state: 4,
+					text: '待收货',
+					loadingType: 'more',
+					orderList: []
+				},
+				{
+					state: 5,
+					text: '已完成',
+					loadingType: 'more',
+					orderList: []
+				}
+			],
+			page: 1,
+			pageSize: 10,
+			pageTotal: 0,
+			text_set: {}
+		};
+	},
+
+	onLoad(options) {
+		this.state = 0;
+		this.text_set = this.$store.state.distributionTextSet;
+		if (this.text_set.commission_r) {
+			uni.setNavigationBarTitle({
+				title: this.text_set.distribution_order || '分销订单'
+			});
+		}
+	},
+	onShow() {
+		this.getOrderSelect();
+	},
+	methods: {
+		scrollBootom() {
+			if (this.pageTotal / this.pageSize > this.page) {
+				this.page += 1;
+				this.getOrderSelect();
+			}
+		},
+		// 获取订单列表
+		getOrderSelect() {
+			// this.orderList = [];
+			const params = {
+				page: this.page,
+				pageSize: this.pageSize
+			};
+			if (this.state) {
+				params.orderStatus = this.state;
+			}
+			this.loading_status = 'loading';
+			this.$u.api
+				.getCommissionOrder({
+					...params
+				})
+				.then(data => {
+					if (this.page === 1) {
+						this.orderList = data.data;
+					} else {
+						this.orderList = this.orderList.concat(data.data);
+					}
+					this.pageTotal = data.pageTotal;
+					this.loading_status = this.$_utils.loadStatus(this.page, this.pageSize, this.pageTotal);
+				});
+		},
+		//swiper 切换
+		changeTab(e) {
+			this.tabCurrentIndex = e.target.current;
+			this.page = 1;
+			switch (this.tabCurrentIndex) {
+				case 0:
+					this.state = 0;
+					break;
+				case 1:
+					this.state = 2;
+					break;
+				case 2:
+					this.state = 3;
+					break;
+				case 3:
+					this.state = 4;
+					break;
+			}
+			this.orderList = [];
+			this.getOrderSelect();
+		},
+		//顶部tab点击
+		tabClick(item, index) {
+			this.tabCurrentIndex = index;
+			this.state = item.state;
+			// this.getOrderSelect()
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.order-item {
+	margin: 24upx 0;
+	// padding: 0 30upx;
+	background-color: #fff;
+
+	.order-no-view {
+		font-size: 24upx;
+		padding: 24upx 30upx;
+		color: #666;
+		font-weight: 300;
+		border-bottom: 1upx solid #eee;
+		.order-status-text {
+			font-weight: 500;
+		}
+	}
+
+	.goods-li:last-child {
+		margin-bottom: 0;
+	}
+
+	.goods-li {
+		background: #fafafa;
+		padding: 30upx 20upx;
+		margin-bottom: 20upx;
+
+		.goods-img {
+			width: 180upx;
+			height: 180upx;
+		}
+
+		.goods-right {
+			width: 500upx;
+			margin-left: 20upx;
+
+			.goods-name {
+				color: #333;
+				font-size: 32upx;
+				margin-bottom: 19upx;
+				text-overflow: -o-ellipsis-lastline;
+				overflow: hidden;
+				text-overflow: ellipsis;
+				display: -webkit-box;
+				-webkit-line-clamp: 1;
+				line-clamp: 1;
+				-webkit-box-orient: vertical;
+			}
+
+			.goods-descrip {
+				font-size: 22upx;
+				color: #999;
+				margin-bottom: 28upx;
+				// font-weight: 300;
+				text-overflow: -o-ellipsis-lastline;
+				overflow: hidden;
+				text-overflow: ellipsis;
+				display: -webkit-box;
+				-webkit-line-clamp: 1;
+				line-clamp: 1;
+				-webkit-box-orient: vertical;
+			}
+
+			.goods-price {
+				.price {
+					color: $price-color;
+					font-size: 40upx;
+				}
+
+				.sku {
+					font-size: 22upx;
+					font-weight: 300;
+					color: #666;
+				}
+
+				.icon-jia {
+					color: #666;
+					font-size: 24upx;
+				}
+
+				.goods-num {
+					font-size: 24upx;
+				}
+			}
+		}
+	}
+}
+
+.middle {
+	font-size: 24upx;
+	position: relative;
+	padding: 24upx 30upx;
+	.money-view {
+		color: #444;
+		.price {
+			font-size: 32upx;
+			font-weight: bold;
+			color: $price-color;
+		}
+	}
+}
+
+.btnS {
+	padding: 0 28upx;
+	line-height: 60upx;
+	color: #6e6e6e;
+	font-size: 24upx;
+	text-align: center;
+	margin-right: 10upx;
+	height: 60upx;
+	background: rgba(241, 241, 241, 1);
+	// box-shadow: 0px 2upx 14upx 0px rgba(0, 0, 0, 0.1);
+	border-radius: 40upx;
+}
+
+.btnSAdd {
+	padding: 0 28upx;
+	line-height: 60upx;
+	color: #ffffff;
+	font-size: 24upx;
+	text-align: center;
+	height: 60upx;
+	border-radius: 40upx;
+}
+.content {
+	background: $page-color-base;
+	height: 100vh;
+}
+
+.swiper-box {
+	height: calc(100% - 80upx);
+}
+
+.list-scroll-content {
+	height: 100%;
+}
+
+.navbar {
+	display: flex;
+	height: 88upx;
+	background: #fff;
+	position: relative;
+	z-index: 10;
+	border-bottom: 1upx solid #eee;
+
+	.nav-item {
+		flex: 1;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		height: 100%;
+		font-size: 28upx;
+		color: #666666;
+		position: relative;
+		font-weight: 300;
+
+		&.current {
+			// color: $uni-color-primary;
+			font-weight: 500;
+			font-size: 32upx;
+
+			.current-line {
+				content: '';
+				position: absolute;
+				left: 50%;
+				bottom: 10upx;
+				transform: translateX(-50%);
+				width: 40upx;
+				height: 6upx;
+				background: $base-btn-bg;
+				border-radius: 6upx;
+				/*border-bottom: 2px solid #F53C28;*/
+			}
+		}
+	}
+}
+</style>

+ 262 - 0
pagesT/Distribution/Distribution.vue

@@ -0,0 +1,262 @@
+<template>
+	<view class="Distribution">
+		<view class="top-view">
+			<view class="lever-view clearfix">
+				<view class="lever-view-left float_left">
+					<image class="user-avator" :src="avator" mode="aspectFill"></image>
+					<text>{{ businessman_detail.gradeName }}</text>
+				</view>
+				<view class="float_right ew-code" @click="goPage('/pagesT/Distribution/Poster')"><text class="ibonfont ibonerweima-copy"></text></view>
+			</view>
+			<view class="cash-out clearfix">
+				<view class="float_left">
+					<view class="cash-tit">{{ text_set.commission_w || '可提现佣金' }}(元)</view>
+					<view class="cash-num">{{ businessman_detail.balance || 0 }}</view>
+				</view>
+				<view class="float_right" @click="goPage('/pagesT/Distribution/Withdrawal?balance=' + (businessman_detail.balance || 0) + '&id=' + businessman_detail.id)">
+					<view class="cash-btn">{{ text_set.withdrawal || '提现' }}</view>
+				</view>
+			</view>
+			<view class="money-num">
+				<view class="money-num-li" @click="goAddUpMoney">
+					<text>{{ text_set.commission_c || '累计佣金' }}</text>
+					<view class="money-num-text">
+						<text class="rmb-icon">¥</text>
+						{{ businessman_detail.totalMoney || 0 }}
+					</view>
+				</view>
+				<view class="money-num-li" @click="goPage('/pagesT/Distribution/NotRecorded?waitMoney=' + businessman_detail.waitMoney || 0)">
+					<text>{{ text_set.commission_r || '待入账佣金' }}</text>
+					<view class="money-num-text">
+						<text class="rmb-icon">¥</text>
+						{{ businessman_detail.waitMoney || 0 }}
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="handel-ul">
+			<view class="handel-li clearfix" @click="goPage('/pagesT/Distribution/DOrder?id=' + businessman_detail.id)">
+				<view class="float_left icon-left-view"><text class="ibonfont ibondingdan icon-left" style="color:#f46248"></text></view>
+				<view class="float_left clearfix handel-right">
+					<text class="float_left">{{ text_set.distribution_order || '分销订单' }}</text>
+					<view class="float_right handel-right-r">
+						<text>{{ businessman_detail.statistics.orderNum || 0 }}笔</text>
+						<text class="ibonfont ibonjinru"></text>
+					</view>
+				</view>
+			</view>
+			<view class="handel-li clearfix" @click="goPage('/pagesT/Distribution/MyGroup?id=' + businessman_detail.id)">
+				<view class="float_left icon-left-view"><text class="ibonfont ibonicon-test icon-left" style="color:#f46248"></text></view>
+				<view class="float_left clearfix handel-right">
+					<text class="float_left">{{ text_set.self || '我的团队' }}</text>
+					<view class="float_right handel-right-r">
+						<text>{{ businessman_detail.statistics.sub || 0 }}人</text>
+						<text class="ibonfont ibonjinru"></text>
+					</view>
+				</view>
+			</view>
+			<view class="handel-li clearfix" @click="goPage('/pagesT/Distribution/IncomeDetails?id=' + businessman_detail.id)">
+				<view class="float_left icon-left-view"><text class="ibonfont ibontixian icon-left" style="color:#46c09b"></text></view>
+				<view class="float_left clearfix handel-right">
+					<text class="float_left">{{ text_set.withdrawal_m || '提现明细' }}</text>
+					<view class="float_right handel-right-r"><text class="ibonfont ibonjinru"></text></view>
+				</view>
+			</view>
+			<view class="handel-li clearfix" @click="goPage('/pagesT/Distribution/GradeDescription?gradeName=' + businessman_detail.gradeName)">
+				<view class="float_left icon-left-view"><text class="ibonfont ibonhuiyuan icon-left" style="color:#2d5dc9"></text></view>
+				<view class="float_left clearfix handel-right">
+					<text class="float_left">等级说明</text>
+					<view class="float_right handel-right-r"><text class="ibonfont ibonjinru"></text></view>
+				</view>
+			</view>
+			<view class="handel-li clearfix" @click="goPage('/pagesT/Distribution/Ranking?id=' + businessman_detail.id)">
+				<view class="float_left icon-left-view"><text class="ibonfont ibondianshang icon-left" style="color:#fed261"></text></view>
+				<view class="float_left clearfix handel-right">
+					<text class="float_left">排行榜</text>
+					<view class="float_right handel-right-r"><text class="ibonfont ibonjinru"></text></view>
+				</view>
+			</view>
+		</view>
+
+	</view>
+</template>
+
+<script>
+import { getAvator } from '@/access/common.js';
+export default {
+	data() {
+		return {
+			isLoding: false,
+			text_set: {},
+			avator: '',
+			businessman_detail: {
+				statistics: {}
+			}
+		};
+	},
+	onShareAppMessage() {
+		return {
+			title: this.$store.state.baseSet.shop,
+			path: '/pages/index/index?businessmanId=' + this.$store.state.userStatus.id,
+			imageUrl: this.$store.state.baseSet.images,
+			success: res => {
+				console.log(res);
+			}
+		};
+	},
+	// 下拉刷新
+	onPullDownRefresh() {
+		this.getInfoBusinessman();
+	},
+	onLoad() {
+		uni.setNavigationBarColor({
+			frontColor: '#ffffff',
+			backgroundColor: '#fe582e'
+		});
+		this.text_set = this.$store.state.distributionTextSet;
+		this.avator = getAvator();
+	},
+	onShow() {
+		this.getInfoBusinessman();
+	},
+	methods: {
+		goAddUpMoney() {
+			this.goPage(
+				`/pagesT/Distribution/AddUpMoney?id=${this.businessman_detail.id}&totalMoney=${this.businessman_detail.totalMoney || 0}&waitMoney=${this.businessman_detail
+					.waitMoney || 0}&balance=${this.businessman_detail.balance || 0}&auditWithdraw=${this.businessman_detail.auditWithdraw || 0}&waitAuditWithdraw=${this
+					.businessman_detail.waitAuditWithdraw || 0}`
+			);
+		},
+		// 分销商详情
+		 getInfoBusinessman() {
+			this.$u.api.getInfoBusinessman().then(res=>{
+				uni.stopPullDownRefresh();
+				this.businessman_detail = res.data;
+			});
+
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+body {
+	background: $page-color-base;
+}
+.top-view {
+	color: #ffffff;
+	background-color: #fe582e;
+	.lever-view {
+		padding: 30upx 24upx;
+		.lever-view-left {
+			font-size: 22upx;
+			font-weight: bold;
+			line-height: 38upx;
+			height: 42upx;
+			padding-right: 16upx;
+			border-radius: 22upx;
+			background-color: rgba($color: #ffffff, $alpha: 0.3);
+			text {
+				transform: translateY(4upx);
+				display: inline-block;
+			}
+			.user-avator {
+				margin-right: 8upx;
+				width: 42upx;
+				height: 42upx;
+				border-radius: 100%;
+				vertical-align: middle;
+				transform: translateY(-2upx);
+			}
+		}
+		.ew-code {
+			line-height: 36upx;
+			height: 36upx;
+			opacity: 0.5;
+			.ibonerweima-copy {
+				font-size: 48upx;
+			}
+		}
+	}
+	.cash-out {
+		padding: 0 24upx 30upx;
+		.cash-tit {
+			font-size: 24upx;
+		}
+		.cash-num {
+			font-size: 60upx;
+			font-weight: bold;
+			padding-top: 20upx;
+		}
+		.cash-btn {
+			margin-top: 76upx;
+			font-size: 24upx;
+			width: 146upx;
+			height: 46upx;
+			line-height: 46upx;
+			text-align: center;
+			background-color: #ffffff;
+			border-radius: 40upx;
+			color: #fe582e;
+		}
+	}
+	.money-num {
+		background-color: #f03b28;
+		display: flex;
+		padding: 34upx 0;
+		.money-num-li {
+			flex: 2;
+			font-size: 24upx;
+			padding-left: 24upx;
+			&:first-child {
+				border-right: 1px solid rgba($color: #ffffff, $alpha: 0.3);
+			}
+
+			.money-num-text {
+				font-size: 32upx;
+				margin-left: 16upx;
+				display: inline-block;
+				transform: translateY(4upx);
+				.rmb-icon {
+					font-size: 24upx;
+					margin-right: 6upx;
+				}
+			}
+		}
+	}
+}
+.handel-ul {
+	.handel-li {
+		background-color: #ffffff;
+		padding-left: 20upx;
+		line-height: 100upx;
+		font-size: 28upx;
+		.icon-left-view {
+			line-height: 100upx;
+			height: 100upx;
+			.icon-left {
+				font-size: 36upx;
+				margin-right: 30upx;
+			}
+		}
+
+		.handel-right {
+			width: 660upx;
+			border-bottom: 1px solid #f5f5f5;
+			.handel-right-r {
+				color: #999999;
+				padding-right: 20upx;
+				.ibonjinru {
+					font-size: 28upx;
+					margin-left: 20upx;
+				}
+			}
+		}
+		&:last-child {
+			.handel-right {
+				border-bottom: 0 none;
+			}
+		}
+	}
+}
+</style>

+ 516 - 0
pagesT/Distribution/DorderDetail.vue

@@ -0,0 +1,516 @@
+<template>
+	<view style="height: 100%;">
+		<u-navbar v-if="navFixed" title="订单详情" title-color="#ffffff" back-icon-color="#ffffff" :border-bottom="false" :background="{ backgroundImage: primaryJb }"></u-navbar>
+		<view class="box" v-if="order_detail.orderStatus">
+			<view class="top-view primary-btn">
+				<uniStatusBar/>
+				<view class="nav-bar">
+					<image @click="backPage" class="nv-back" src="https://onlineimg.qianniao.vip/ic-back-fff.png" mode="aspectFit"></image>
+					<text class="title-text">订单详情</text>
+				</view>
+				<view class="order-status-view clearfix">
+					<view class="float_left">
+						<view class="order-status-text">
+							<text>
+								{{
+									order_detail.orderStatus === 1
+										? '待付款'
+										: order_detail.orderStatus === 2
+										? '待付款'
+										: order_detail.orderStatus === 3
+										? '待发货'
+										: order_detail.orderStatus === 4
+										? '待收货'
+										: order_detail.orderStatus === 5
+										? '已完成'
+										: order_detail.orderStatus === 6
+										? '已关闭'
+										: ''
+								}}
+							</text>
+							<view class="children-order-status">
+								{{
+									order_detail.orderStatus === 1
+										? '请尽快付款,宝贝才能快些到您身边哦'
+										: order_detail.orderStatus === 2
+										? '请尽快付款,宝贝才能快些到您身边哦'
+										: order_detail.orderStatus === 3
+										? '正在为您紧急备货中……'
+										: order_detail.orderStatus === 4
+										? '确认宝贝无误后再签收哦!'
+										: order_detail.orderStatus === 5
+										? '本次交易已完成'
+										: order_detail.orderStatus === 6
+										? '本次交易已关闭'
+										: ''
+								}}
+							</view>
+						</view>
+					</view>
+					<view class="float_right">
+						<text
+							class="ibonfont order-icon"
+							:class="[
+								order_detail.orderStatus === 1
+									? 'ibondaifukuan1'
+									: order_detail.orderStatus === 2
+									? 'ibondaifukuan1'
+									: order_detail.orderStatus === 3
+									? 'ibondaifahuo1'
+									: order_detail.orderStatus === 4
+									? 'ibondaishouhuo'
+									: order_detail.orderStatus === 5
+									? 'ibonyiwancheng'
+									: order_detail.orderStatus === 6
+									? 'ibonjiaoyiguanbix'
+									: ''
+							]"
+						></text>
+					</view>
+				</view>
+			</view>
+			<view class="address-view view-main clearfix">
+				<view class="vip-info">
+					<text class="vip-i-label">会员:</text>
+					<image class="customerAvatar" :src="order_detail.customerAvatar" mode="aspectFill"></image>
+					<text>{{ order_detail.customerName }}</text>
+				</view>
+				<view class="vip-info">
+					<text class="vip-i-label">分销层级:</text>
+					<text>{{ order_detail.retLevelMsg }}</text>
+				</view>
+			</view>
+			<view class="goods-view view-main">
+				<block v-for="(it, gindex) in order_detail.orderGoods" :key="gindex">
+					<view class="goods-li clearfix" @click="goPage(`/pagesT/product/product?id=${it.goodsId}`)">
+						<image class="goods-img float_left" :src="it.goodsImages" mode="aspectFit"></image>
+						<view class="float_right goods-right">
+							<view class="goods-name">{{ it.goodsName }}</view>
+							<view class="goods-descrip">
+								规格:
+								<text style="padding-right: 6upx;">{{ it.unitName }}</text>
+								<block v-for="(ip, indexSP) in it.specGroup" :key="indexSP">
+									<text v-if="indexSP > 0">-</text>
+									<text>{{ ip.specValueName }}</text>
+								</block>
+							</view>
+							<view class="goods-price clearfix">
+								<view class="float_left">
+									<text class="price primary-color">¥{{ it.price }}</text>
+								</view>
+								<view class="float_right">
+									<text class="icon-jia">*</text>
+									<text class="goods-num">{{ it.buyNum }}</text>
+								</view>
+							</view>
+						</view>
+					</view>
+				</block>
+			</view>
+			<view class="view-main order-info-view">
+				<view class="order-info-tit">订单信息</view>
+				<view class="order-info-cont">
+					<view class="order-info-li">
+						<view class="clearfix info-item">
+							<text class="subtitle float_left">订单编号:</text>
+							<text class="titledetail float_right">{{ order_detail.orderNo || '--' }}</text>
+						</view>
+						<view class="clearfix info-item">
+							<text class="subtitle float_left">下单时间:</text>
+							<text class="titledetail float_right">{{ $_utils.formatDate(order_detail.createTime) || '--' }}</text>
+						</view>
+					</view>
+
+					<view class="order-info-li order-money-view">
+						<view class="clearfix info-item">
+							<text class="subtitle float_left">支付方式</text>
+							<text class="money-val float_right">{{ order_detail.payTypeMsg }}</text>
+						</view>
+						<view class="clearfix info-item">
+							<text class="subtitle float_left">配送方式</text>
+							<text class="money-val float_right">{{ order_detail.deliveryMsg || '--' }}</text>
+						</view>
+					</view>
+				</view>
+				<view class="order-price-view clearfix">
+					<view class="float_left">
+						<span>{{ text_set.commission || '佣金' }}:</span>
+						<span class="price primary-color">¥{{ order_detail.retMoney }}</span>
+					</view>
+					<view class="float_right">
+						<span>实付款:</span>
+						<span class="price primary-color">¥{{ order_detail.payAmount }}</span>
+					</view>
+				</view>
+			</view>
+		</view>
+
+		<view class="clearfix botton-btn-view" v-if="[1, 2, 4, 5].includes(order_detail.orderStatus)">
+			<!-- #ifdef APP-PLUS||MP-WEIXIN -->
+			<BtnView @click="gopay" class=" float_right" v-if="order_detail.orderStatus === 1 || order_detail.orderStatus === 2"><view class="btnS">去付款</view></BtnView>
+			<!-- #endif -->
+			<BtnView class="float_right" v-if="order_detail.orderStatus === 4" @click="confirmOrder"><view class="btnS">确认收货</view></BtnView>
+			<BtnView class="float_right" v-if="order_detail.orderStatus === 5" @click="againPay"><view class="btnS">再次购买</view></BtnView>
+			<span @click="cancelOrder" class="clearBtnS float_right" v-if="order_detail.orderStatus === 1 || order_detail.orderStatus === 2">取消订单</span>
+		</view>
+
+	</view>
+</template>
+
+<script>
+import uniStatusBar from '@/components/uni-status-bar/uni-status-bar.vue';
+export default {
+	components: {
+		uniStatusBar
+	},
+	data() {
+		return {
+			navFixed: false,
+			order_id: 0,
+			price: '',
+			order_detail: {
+				receiveData: {
+					area: {}
+				},
+				deliveryMsg: ''
+			},
+			no: '',
+			// 再次购买的goodsData
+			goodsData: [],
+			Dorder_id: 0,
+			text_set: {}
+		};
+	},
+	onLoad(options) {
+		this.Dorder_id = options.id;
+		this.text_set = this.$store.state.distributionTextSet;
+	},
+	onShow() {
+		this.getOrderInfoById();
+	},
+	onPageScroll(val) {
+		this.navFixed = val.scrollTop > 5;
+	},
+	methods: {
+		// 再次购买
+		 againPay() {
+			// if (this.$store.state.baseSet.personnelReview === 5) {
+			// 验证账户状态
+			this.userAudit();
+			if (!this.isUserAudit) {
+				return;
+			}
+			// }
+			this.goodsData = this.order_detail.goodsData.map(item => {
+				return {
+					goodsId: item.goodsId,
+					buyNum: item.buyNum,
+					shopId: item.shopId,
+					skuId: item.skuId,
+					source: this.$common.source(),
+					goodsBasicId: item.goodsBasicId
+				};
+			});
+			this.$u.api.addCart({
+				goodsData: this.goodsData
+			}).then(res=>{
+				this.goPage('/pages/cart/cart', 'switchTab');
+			});
+		},
+		// 获取订单详情
+		 getOrderInfoById() {
+			this.$u.api.getCommissionOrderInfo(this.Dorder_id).then(data=>{
+				this.order_detail = data.data;
+				this.price = this.order_detail.totalMoney;
+				this.no = this.order_detail.no;
+				this.order_id = data.data.orderId;
+			});
+		},
+		// 去支付
+		gopay() {
+			uni.navigateTo({
+				url: `/pagesT/money/pay?id=${this.order_id}&price=${this.price}&no=${this.no}&payType=${this.order_detail.payType}`
+			});
+		},
+		//取消订单
+		cancelOrder() {
+			uni.showModal({
+				title: '提示',
+				content: '确定要取消该订单吗?',
+				success: res => {
+					if (res.confirm) {
+						this.$u.api.updateOrderStatus(this.order_id, {
+							orderStatus: 6
+						}).then(res=>{
+							this.$api.msg('取消成功');
+							this.getOrderInfoById();
+						});
+					}
+				}
+			});
+		},
+		confirmOrder() {
+			uni.showModal({
+				title: '提示',
+				content: '确定要确认收货吗?',
+				success:  res => {
+					if (res.confirm) {
+						this.$u.api.updateOrderStatus(this.order_id, {
+							orderStatus: 5
+						}).then(res=>{
+							this.$api.msg('操作成功');
+							this.getOrderInfoById();
+						});
+					}
+				}
+			});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+body {
+	background: $page-color-base;
+}
+.top-view {
+	background: $base-btn-bg;
+	.nav-bar {
+		padding: 24upx 0;
+		position: relative;
+		.nv-back {
+			position: absolute;
+			top: 24upx;
+			left: 24upx;
+		}
+		.title-text {
+			font-size: 32upx;
+			color: #fff;
+			display: inline-block;
+			width: 100%;
+			text-align: center;
+			height: 40upx;
+		}
+	}
+
+	.order-status-view {
+		color: #fff;
+		font-size: 36upx;
+		padding: 40upx;
+		.order-icon {
+			margin-right: 10upx;
+			font-size: 80upx;
+			opacity: 0.9;
+		}
+		.children-order-status {
+			font-size: 24upx;
+			font-weight: 300;
+			padding-top: 10upx;
+		}
+	}
+}
+
+.box {
+	width: 100%;
+	// overflow-y: scroll;
+	padding-bottom: 140upx;
+	// height: 100%;
+	// margin-bottom: 130upx;
+	background: $page-color-base;
+
+	.view-main {
+		margin-bottom: 24upx;
+		background: #fff;
+		// border-radius: 12upx;
+		padding: 24upx;
+	}
+
+	.goods-view {
+		padding: 24upx 0;
+		.shop-name {
+			color: #333;
+			font-weight: bold;
+			font-size: 24upx;
+			padding: 0 24upx 24upx;
+			line-height: 30upx;
+			.shop-logo {
+				width: 30upx;
+				height: 30upx;
+				vertical-align: middle;
+				margin-right: 10upx;
+			}
+			.order-status {
+				color: $uni-color-primary;
+			}
+		}
+
+		.goods-li:last-child {
+			margin-bottom: 0;
+		}
+		.goods-li {
+			background: #fafafa;
+			padding: 30upx 20upx;
+			margin-bottom: 20upx;
+			.goods-img {
+				width: 180upx;
+				height: 180upx;
+			}
+			.goods-right {
+				width: 500upx;
+				margin-left: 20upx;
+				.goods-name {
+					color: #333;
+					font-size: 32upx;
+					margin-bottom: 19upx;
+					text-overflow: -o-ellipsis-lastline;
+					overflow: hidden;
+					text-overflow: ellipsis;
+					display: -webkit-box;
+					-webkit-line-clamp: 1;
+					line-clamp: 1;
+					-webkit-box-orient: vertical;
+				}
+				.goods-descrip {
+					font-size: 22upx;
+					color: #999;
+					margin-bottom: 28upx;
+					font-weight: 300;
+					text-overflow: -o-ellipsis-lastline;
+					overflow: hidden;
+					text-overflow: ellipsis;
+					display: -webkit-box;
+					-webkit-line-clamp: 1;
+					line-clamp: 1;
+					-webkit-box-orient: vertical;
+				}
+				.goods-price {
+					.price {
+						color: $price-color;
+						font-size: 40upx;
+					}
+					.sku {
+						font-size: 22upx;
+						font-weight: 300;
+						color: #666;
+					}
+					.icon-jia {
+						color: #666;
+						font-size: 24upx;
+					}
+					.goods-num {
+						font-size: 24upx;
+					}
+				}
+			}
+		}
+	}
+}
+
+.address-view {
+	font-size: 28upx;
+	.vip-info {
+		padding-bottom: 20upx;
+		.vip-i-label {
+			font-size: 24upx;
+			color: #666;
+		}
+		.customerAvatar {
+			width: 50upx;
+			height: 50upx;
+			border-radius: 100%;
+			margin-right: 20upx;
+			vertical-align: middle;
+		}
+	}
+}
+
+.order-info-view {
+	// font-size: 24upx;
+	color: #3c3c3c;
+	.order-info-tit {
+		font-size: 28upx;
+		padding-bottom: 20upx;
+	}
+	.order-info-cont {
+		font-size: 24upx;
+
+		.info-item {
+			padding-bottom: 10upx;
+			.subtitle {
+				color: #666;
+			}
+		}
+	}
+	.order-info-li {
+		border-bottom: 1upx solid #eee;
+		padding-bottom: 24upx;
+		margin-bottom: 24upx;
+		.info-item {
+			padding-bottom: 10upx;
+			.subtitle {
+				color: #666;
+				font-weight: 300;
+			}
+		}
+	}
+
+	.order-price-view {
+		text-align: right;
+		font-size: 26upx;
+		.price {
+			color: $price-color;
+			padding-left: 6upx;
+			font-size: 32upx;
+			font-weight: 600;
+		}
+	}
+}
+
+.botton-btn-view {
+	background: #fff;
+	position: fixed;
+	box-shadow: 0upx -2upx 10upx 0upx rgba(136, 136, 136, 0.24);
+	left: 0;
+	bottom: 0;
+	width: 100%;
+	padding: 20upx;
+	font-size: 28upx;
+
+	.btnS {
+		width: 240upx;
+		line-height: 64upx;
+		color: #ffffff;
+		text-align: center;
+		height: 64upx;
+		// background: $base-btn-bg;
+		// box-shadow: 0px 2upx 14upx 0upx rgba(116, 190, 66, 0.4);
+		border-radius: 40upx;
+	}
+
+	.clearBtnS {
+		width: 240upx;
+		line-height: 64upx;
+		color: #6e6e6e;
+		text-align: center;
+		margin-right: 10upx;
+		height: 64upx;
+		background: rgba(241, 241, 241, 1);
+		border-radius: 40upx;
+	}
+}
+
+.circleSty {
+	display: inline-block;
+	background-color: #9e9e9e;
+	width: 20upx;
+	height: 20upx;
+	border-radius: 50%;
+	margin-left: 20upx;
+}
+
+.subOrder {
+	position: absolute;
+	top: -10upx;
+	left: 60upx;
+}
+</style>

+ 293 - 0
pagesT/Distribution/GradeDescription.vue

@@ -0,0 +1,293 @@
+<template>
+	<view class="Distribution">
+		<view class="top-view">
+			<view class="lever-view clearfix">
+				<view class="lever-view-left float_left">
+					<image class="user-avator" :src="avator" mode="aspectFill"></image>
+					<text>{{ gradeName }}</text>
+				</view>
+			</view>
+			<!--  -->
+			<!-- <scroll-view class="Grade-view" :scroll-left="scroll_left_num" scroll-x @scroll="scrollGrade">
+				<view style="display: inline-block;width: 280rpx;"></view>
+				<view class="Grade-li" v-for="(item, index) in grade_list" :key="index">
+					<view class="Grade-icon ibonfont ibonhuodaofukuan"></view>
+					<view class="Grade-text">{{ item.name }}</view>
+				</view>
+				<view style="display: inline-block;width: 300rpx;"></view>
+			</scroll-view> -->
+			<swiper class="Grade-swiper" @change="gradeChange" :indicator-dots="false" :autoplay="false">
+				<swiper-item class="left_item"></swiper-item>
+				<swiper-item class="left_item"></swiper-item>
+				<swiper-item class="Grade-item" v-for="(item, index) in grade_list" :key="index">
+					<view class="Grade-li" :class="[grade_on === index ? 'Grade-on' : '']">
+						<view class="Grade-icon ibonfont ibonhuiyuan"></view>
+						<view class="Grade-text">{{ item.name }}</view>
+					</view>
+				</swiper-item>
+			</swiper>
+			<view class="ibonfont ibonxiangshangjiantou top-jt-icon"></view>
+		</view>
+		<view class="money-ratio-view">
+			<view class="money-ratio-tit">{{ text_set.commission || '佣金' }}比例</view>
+			<view class="money-ratio-ul">
+				<view class="money-ratio-li clearfix">
+					<view class="float_left m-label">
+						<text class="ibonfont ibonhuodaofukuan"></text>
+						<text class="m-label-text">{{ text_set.level_one || '一级' }}{{ text_set.commission || '佣金' }}比例</text>
+					</view>
+					<view class="float_right m-value">{{ grade_detail.oneRate }}%</view>
+				</view>
+				<view class="money-ratio-li clearfix">
+					<view class="float_left m-label">
+						<text class="ibonfont ibonhuodaofukuan"></text>
+						<text class="m-label-text">{{ text_set.level_two || '二级' }}{{ text_set.commission || '佣金' }}比例</text>
+					</view>
+					<view class="float_right m-value">{{ grade_detail.twoRate }}%</view>
+				</view>
+				<view class="money-ratio-li clearfix">
+					<view class="float_left m-label">
+						<text class="ibonfont ibonhuodaofukuan"></text>
+						<text class="m-label-text">{{ text_set.level_three || '三级' }}{{ text_set.commission || '佣金' }}比例</text>
+					</view>
+					<view class="float_right m-value">{{ grade_detail.threeRate }}%</view>
+				</view>
+			</view>
+		</view>
+		<view class="up-term" v-if="grade_detail.upgradeConditionInfo.length">
+			<view class="up-term-tit">
+				<text>升级条件</text>
+				<text class="fu-tit">(满足以下条件可升级)</text>
+			</view>
+			<view class="up-term-ul">
+				<view class="up-term-li clearfix" v-for="(item, index) in grade_detail.upgradeConditionInfo" :key="index">
+					<view class="float_left">
+						<text>{{ item.name }}达到</text>
+						<text class="money-u-num">{{ item.value }}</text>
+						<text v-if="item.name.indexOf('额') > -1">元</text>
+						<text v-else-if="item.name.indexOf('人') > -1">人</text>
+						<text v-else>个</text>
+					</view>
+					<view class="float_right">
+						<view class="status-btn" v-if="!item.status">未完成</view>
+						<view class="status-btn status-ac-btn" v-else>已完成</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+import { getAvator } from '@/access/common.js';
+export default {
+	data() {
+		return {
+			avator: '',
+			scroll_left_num: 0,
+			text_set: {},
+			grade_list: [],
+			gradeName: '',
+			grade_detail: {
+				upgradeConditionInfo: [],
+				oneRate: '',
+				twoRate: '',
+				threeRate: ''
+			},
+			grade_on: 0
+		};
+	},
+	onLoad(options) {
+		uni.setNavigationBarColor({
+			frontColor: '#ffffff',
+			backgroundColor: '#fe582e'
+		});
+		this.avator = getAvator();
+		this.text_set = this.$store.state.distributionTextSet;
+		this.getAllGrade();
+		this.gradeName = options.gradeName;
+	},
+	methods: {
+		scrollGrade(e) {
+			const scrollLeft = e.detail.scrollLeft;
+			// console.log(Math.round(scrollLeft / 50)* 100);
+			// console.log(scrollLeft);
+			// this.scroll_left_num = Math.round(scrollLeft / 50) * 100;
+		},
+		gradeChange(e) {
+			console.log(e);
+			this.grade_on = e.detail.current;
+			this.grade_detail = this.grade_list[this.grade_on];
+		},
+		async getAllGrade() {
+			this.$u.api.getAllGrade().then(({data})=>{
+				this.grade_list = data;
+				this.grade_detail = data[0];
+			});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.top-view {
+	color: #ffffff;
+	background-color: #fe582e;
+	position: relative;
+	.top-jt-icon {
+		position: absolute;
+		bottom: -14upx;
+		line-height: 36upx;
+		height: 36upx;
+		font-size: 36upx;
+		color: #fff;
+		left: 50%;
+		transform: translateX(-18upx);
+	}
+	.lever-view {
+		padding: 30upx 24upx;
+		.lever-view-left {
+			font-size: 22upx;
+			font-weight: bold;
+			line-height: 38upx;
+			height: 42upx;
+			padding-right: 16upx;
+			border-radius: 22upx;
+			background-color: rgba($color: #ffffff, $alpha: 0.3);
+			text {
+				transform: translateY(4upx);
+				display: inline-block;
+			}
+			.user-avator {
+				margin-right: 8upx;
+				width: 42upx;
+				height: 42upx;
+				border-radius: 100%;
+				vertical-align: middle;
+				transform: translateY(-2upx);
+			}
+		}
+	}
+	.Grade-swiper {
+		height: 200rpx;
+		.Grade-item {
+			width: 150upx !important;
+		}
+		.left_item {
+			width: 150upx !important;
+		}
+		.Grade-li {
+			width: 150upx;
+			text-align: center;
+			font-size: 24upx;
+			opacity: 0.6;
+			.Grade-icon {
+				width: 60upx;
+				height: 60upx;
+				line-height: 60upx;
+				font-size: 40upx;
+				margin-bottom: 30upx;
+				display: block;
+				border: 1upx solid #FFFFFF;
+				border-radius: 100%;
+				margin: 0 auto 20upx;
+			}
+		}
+		.Grade-on {
+			opacity: 1;
+			.Grade-icon{
+				background-color: #FFFFFF;
+				color: #fe582e;
+			}
+		}
+	}
+
+	.Grade-view {
+		padding: 50upx 0;
+		white-space: nowrap;
+		width: 100%;
+		.Grade-li {
+			display: inline-block;
+			width: 200upx;
+			text-align: center;
+			font-size: 24upx;
+			opacity: 0.6;
+			.Grade-icon {
+				font-size: 60upx;
+				margin-bottom: 30upx;
+			}
+		}
+		.Grade-on {
+			opacity: 1;
+		}
+	}
+}
+.money-ratio-view {
+	padding: 0 40upx;
+	.money-ratio-tit {
+		line-height: 100upx;
+		font-size: 32upx;
+	}
+	.money-ratio-ul {
+		border-radius: 10upx;
+		background-color: #fbf4e2;
+		color: #9b7953;
+		.money-ratio-li {
+			padding: 0 40upx;
+			line-height: 100upx;
+			border-bottom: 1upx solid #fff;
+			.ibonhuodaofukuan {
+				color: #d8a96c;
+				margin-right: 20upx;
+			}
+			.m-value {
+				font-size: 32upx;
+			}
+		}
+	}
+}
+.up-term {
+	padding: 0 40rpx;
+	.up-term-tit {
+		line-height: 100upx;
+		font-size: 32upx;
+		.fu-tit {
+			font-size: 24upx;
+			color: #666;
+			font-weight: 300;
+		}
+	}
+	.up-term-ul {
+		background-color: #fff;
+		border-radius: 10upx;
+		box-shadow: 0 0 10upx 4upx #f5f5f5;
+		.up-term-li {
+			line-height: 100upx;
+			padding: 0 24upx;
+			border-bottom: 1px solid #f5f5f5;
+			.money-u-num {
+				color: #d83d1f;
+				font-weight: 300;
+				margin-left: 10upx;
+				margin-right: 10upx;
+			}
+			.status-btn {
+				background-color: #fef0f0;
+				color: #fa3534;
+				padding: 6upx 20upx;
+				font-size: 24upx;
+				border-radius: 32upx;
+				line-height: 32upx;
+				display: inline-block;
+			}
+			.status-ac-btn{
+				color: #999999;
+				background-color: #f4f4f4;
+			}
+			&:last-child {
+				border-bottom: 0 none;
+			}
+		}
+	}
+}
+</style>

+ 181 - 0
pagesT/Distribution/IncomeDetails.vue

@@ -0,0 +1,181 @@
+<template>
+	<!-- 提现明细 -->
+	<view class="IncomeDetails">
+		<view class="navbar">
+			<view v-for="(item, index) in tab_list" :key="index" class="nav-item" :class="{ current: tabCurrentIndex === index }" @click="tabClick(item, index)">
+				{{ item.name }}
+				<view class="current-line"></view>
+			</view>
+		</view>
+		<scroll-view class="income-ul" @scrolltolower="scrollBootom" scroll-y="true" style="height:100%">
+			<view class="income-li clearfix" @click="goPage('/pagesT/Distribution/Application?id=' + item.id)" v-for="(item, index) in withdrawals_list" :key="index">
+				<view class="float_left income-label">
+					<view class="income-label-text">提现到{{ item.type === 1 ? '微信钱包' : item.type === 2 ? '支付宝' : item.type === 3 ? '银行卡' : '' }}</view>
+					<view class="income-time">{{ $_utils.formatDate(item.createTime) }}</view>
+				</view>
+				<view class="float_right">
+					<view class="income-money">
+						+
+						<text style="margin-left: 6upx;">{{ item.money }}</text>
+					</view>
+					<view class="status-text">
+						{{ item.auditStatus === 1 ? '待审核' : item.auditStatus === 2 ? '打款成功' : item.auditStatus === 3 ? '无效' : item.auditStatus === 4 ? '待打款' : '' }}
+					</view>
+				</view>
+			</view>
+			<u-loadmore margin-top="20" v-if="withdrawals_list.length" :status="loading_status" />
+		</scroll-view>
+
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			tabCurrentIndex: 0,
+			isLoding: false,
+			loading_status: 'loadmore',
+			//   1待审核 4待打款  2打款成功  3失效
+			tab_list: [
+				{
+					name: '全部',
+					value: 0
+				},
+				{
+					name: '待审核',
+					value: 1
+				},
+				{
+					name: '待打款',
+					value: 4
+				},
+				{
+					name: '已打款',
+					value: 2
+				},
+				{
+					name: '无效',
+					value: 3
+				}
+			],
+			page: 1,
+			pageSize: 10,
+			auditStatus: 0,
+			withdrawals_list: []
+		};
+	},
+	onLoad() {
+		this.text_set = this.$store.state.distributionTextSet;
+		if (this.text_set.commission_r) {
+			uni.setNavigationBarTitle({
+				title: (this.text_set.withdrawal || '提现') + '明细'
+			});
+		}
+	},
+	onShow() {
+		this.CommissionWithdrawalsGetAll();
+	},
+	methods: {
+		scrollBootom() {
+			if (this.pageTotal / this.pageSize > this.page) {
+				this.page += 1;
+				this.CommissionWithdrawalsGetAll();
+			}
+		},
+		tabClick(row, index) {
+			this.auditStatus = row.value;
+			this.tabCurrentIndex = index;
+			this.page = 1;
+			this.CommissionWithdrawalsGetAll();
+		},
+		async CommissionWithdrawalsGetAll() {
+			this.loading_status = 'loading';
+			let params = {
+				page: this.page,
+				pageSize: this.pageSize,
+				auditStatus: this.auditStatus
+			};
+			this.$u.api.CommissionWithdrawalsGetAll({
+				...params
+			}).then(data=>{
+				if (this.page === 1) {
+					this.withdrawals_list = data.data
+				} else {
+					this.withdrawals_list = this.withdrawals_list.concat(data.data);
+				}
+				this.pageTotal = data.pageTotal;
+				this.loading_status =  this.$_utils.loadStatus(this.page, this.pageSize, this.pageTotal);
+			});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.income-ul {
+	.income-li {
+		background-color: #FFFFFF;
+		padding: 20upx;
+		border-bottom: 1upx solid #f5f5f5;
+		.income-label {
+			.income-time {
+				font-size: 24upx;
+				color: #999;
+				padding-top: 10upx;
+			}
+		}
+		.float_right {
+			text-align: right;
+			.income-money {
+				color: #333;
+				font-size: 32upx;
+				font-weight: bold;
+			}
+			.status-text {
+				font-size: 24upx;
+				padding-top: 10upx;
+				color: #fd463e;
+			}
+		}
+	}
+}
+
+.navbar {
+	display: flex;
+	height: 88upx;
+	background: #fff;
+	position: relative;
+	z-index: 10;
+	border-bottom: 1upx solid #eee;
+
+	.nav-item {
+		flex: 1;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		height: 100%;
+		font-size: 28upx;
+		color: #666666;
+		position: relative;
+		font-weight: 300;
+
+		&.current {
+			font-weight: 500;
+			font-size: 32upx;
+			color: #fd463e;
+			.current-line {
+				content: '';
+				position: absolute;
+				left: 50%;
+				bottom: 10upx;
+				transform: translateX(-50%);
+				width: 40upx;
+				height: 6upx;
+				background: #fd463e;
+				border-radius: 6upx;
+			}
+		}
+	}
+}
+</style>

+ 271 - 0
pagesT/Distribution/MyGroup.vue

@@ -0,0 +1,271 @@
+<template>
+	<view class="MyGroup">
+		<view class="top-view">
+			<view class="num-ul">
+				<view class="num-li">
+					<view class="num-li-tit">{{ text_set.Offline || '下线' }}总数</view>
+					<view class="num-li-num">{{ subTotal }}</view>
+				</view>
+				<view class="num-li-line"></view>
+				<view class="num-li">
+					<view class="num-li-tit">{{ text_set.name || '分销商名称' }}总数</view>
+					<view class="num-li-num">{{ businessmanTotal }}</view>
+				</view>
+			</view>
+			<view class="grade-ul" v-if="grade_list.length">
+				<view class="grade-li" @click="tabChange(index)" :class="[level === index + 1 ? 'grade-on' : '']" v-for="(item, index) in grade_list" :key="index">
+					{{ item.name }}
+					<view class="ibonfont ibonxiangshangjiantou top-jt-icon" v-if="level === index + 1"></view>
+				</view>
+			</view>
+		</view>
+		<view class="total-view clearfix" v-if="grade_list.length">
+			<view class="total-left float_left">
+				<view class="left-num">总数:{{ pageTotal }}</view>
+				<view class="line-num"></view>
+				<view class="left-num">{{ text_set.name || '分销商名称' }}总数:{{ subBusinessmanTotal }}</view>
+			</view>
+		</view>
+		<scroll-view @scrolltolower="scrollBootom" scroll-y="true" :style="style" class="group-ul">
+			<view class="group-li" v-for="(item, index) in group_list" :key="index">
+				<view class="user-avator-view"><image class="user-avator" :src="item.avatar" mode="aspectFill"></image></view>
+				<view class="user-info clearfix">
+					<view class="user-info-left float_left">
+						<view class="user-name ellipsis">{{ item.name }}</view>
+						<view class="user-time">消费:¥{{ item.totalMoney || 0 }}</view>
+					</view>
+					<view class="user-info-right float_right">
+						<view class="user-time" style="padding-top: 0;">{{ $_utils.formatDate(item.createTime) }}</view>
+						<view class="user-time">订单:{{ item.orderTotal }}</view>
+					</view>
+				</view>
+			</view>
+			<u-loadmore margin-top="20" v-if="group_list.length" :status="loading_status" />
+		</scroll-view>
+
+	</view>
+</template>
+
+<script>
+
+export default {
+	computed: {
+		style() {
+			const systemInfo = uni.getSystemInfoSync();
+			if(this.distribution_set.level===1){
+				return `height: calc(100vh - ${systemInfo.statusBarHeight + 82}px)`;
+			}else{
+				return `height: calc(100vh - ${systemInfo.statusBarHeight + 171}px)`;
+			}
+
+		},
+		location() {
+			return this.$store.state.locationObj;
+		}
+	},
+	data() {
+		return {
+			loading_status: 'loadmore',
+			isLogin: false,
+			grade_list: [],
+			current: 0,
+			myId: 0,
+			group_list: [],
+			page: 1,
+			pageSize: 10,
+			pageTotal: 0,
+			level: 1,
+			text_set: {},
+			topTotal: 0,
+			subTotal: 0,
+			businessmanTotal: 0,
+			subBusinessmanTotal: 0,
+			distribution_set:{}
+		};
+	},
+	onLoad(options) {
+		uni.setNavigationBarColor({
+			frontColor: '#ffffff',
+			backgroundColor: '#fe582e'
+		});
+		this.text_set = this.$store.state.distributionTextSet;
+		this.distribution_set = this.$store.state.distributionSet;
+		this.myId = parseInt(options.id);
+		if(this.distribution_set.level===2){
+			this.grade_list = [
+				{
+					name: this.text_set.level_one || '一级'
+				},
+				{
+					name: this.text_set.level_two || '二级'
+				}
+			];
+
+		}else if(this.distribution_set.level===3){
+			this.grade_list = [
+				{
+					name: this.text_set.level_one || '一级'
+				},
+				{
+					name: this.text_set.level_two || '二级'
+				},
+				{
+					name: this.text_set.level_three || '三级'
+				}
+			];
+		}
+
+	},
+	onShow() {
+		this.getAllSub();
+	},
+	methods: {
+		// 查询分销商的下级
+		async getAllSub() {
+			this.loading_status = 'loading';
+			this.$u.api.getAllSub({
+				id: this.myId,
+				level: this.level,
+				page: this.page,
+				pageSize: this.pageSize
+			}).then(data=>{
+				if (this.page === 1) {
+					this.group_list = data.data;
+				} else {
+					this.group_list = this.group_list.concat(data.data);
+				}
+				this.pageTotal = data.pageTotal;
+				this.topTotal = data.topTotal;
+				this.subTotal = data.subTotal;
+				this.businessmanTotal = data.businessmanTotal;
+				this.subBusinessmanTotal = data.subBusinessmanTotal;
+				this.loading_status =  this.$_utils.loadStatus(this.page, this.pageSize, this.pageTotal);
+			});
+		},
+		scrollBootom() {
+			if (this.pageTotal / this.pageSize > this.page) {
+				this.page += 1;
+				this.getAllSub();
+			}
+		},
+		tabChange(index) {
+			this.current = index;
+			this.level = index + 1;
+			this.page = 1;
+			this.getAllSub();
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.top-view {
+	color: #ffffff;
+	background-color: #fe582e;
+
+	.num-ul {
+		padding: 40upx 0;
+		display: flex;
+		.num-li {
+			flex: 2;
+			text-align: center;
+			.num-li-tit {
+				font-size: 24upx;
+			}
+			.num-li-num {
+				font-size: 40upx;
+				padding-top: 30upx;
+			}
+		}
+		.num-li-line {
+			width: 1upx;
+			height: 56upx;
+			background-color: #fff;
+			opacity: 0.5;
+			transform: translateY(70upx);
+		}
+	}
+	.grade-ul {
+		background-color: rgba($color: #ffffff, $alpha: 0.2);
+		font-size: 28upx;
+		display: flex;
+		color: rgba($color: #ffffff, $alpha: 0.7);
+		.grade-li {
+			flex: 2;
+			text-align: center;
+			line-height: 90upx;
+			position: relative;
+			.top-jt-icon {
+				position: absolute;
+				bottom: -10upx;
+				left: 50%;
+				transform: translateX(-50%);
+				display: block;
+				height: 30upx;
+				line-height: 30upx;
+				font-size: 32upx;
+				color: rgba($color: #ffffff, $alpha: 1);
+			}
+		}
+		.grade-on {
+			color: rgba($color: #ffffff, $alpha: 1);
+			font-size: 32upx;
+		}
+	}
+}
+.total-view {
+	line-height: 90upx;
+	color: #3d404d;
+	background-color: #fff1f0;
+	font-size: 24upx;
+	.total-left {
+		.left-num {
+			padding: 0 24upx;
+			display: inline-block;
+		}
+		.line-num {
+			display: inline-block;
+			width: 2upx;
+			height: 28upx;
+			background-color: #fff;
+		}
+	}
+}
+.group-ul {
+	.group-li {
+		padding: 20upx;
+		background-color: #fff;
+		border-radius: 8upx;
+		.user-avator-view {
+			display: inline-block;
+			padding-right: 20upx;
+			.user-avator {
+				display: block;
+				width: 100upx;
+				height: 100upx;
+				border-radius: 100%;
+			}
+		}
+		.user-info {
+			border-bottom: 1upx solid #f4f4f4;
+			width: 588upx;
+			display: inline-block;
+			padding-bottom: 20upx;
+			.user-name{
+				width: 310rpx;
+				-webkit-line-clamp:1;
+				height: 40rpx;
+				line-height: 40rpx;
+			}
+			.user-time {
+				color: #999;
+				font-size: 24upx;
+				padding-top: 10upx;
+			}
+			.user-info-right {
+				text-align: right;
+			}
+		}
+	}
+}
+</style>

+ 222 - 0
pagesT/Distribution/NotRecorded.vue

@@ -0,0 +1,222 @@
+<template>
+	<view class="NotRecorded">
+		<view class="top-money-view">
+			<view class="money-num">{{ waitMoney || 0 }}</view>
+			<view class="add-up-label">{{ text_set.commission_r || '待入账佣金' }}(元)</view>
+		</view>
+		<view class="order-list">
+			<view v-for="(item, index) in orderList" :key="index" class="order-item" @click="goPage(`/pagesT/Distribution/DorderDetail?id=` + item.id)">
+				<view class="clearfix order-no-view">
+					<text class="float_left order-no-text">{{ $_utils.formatDate(item.createTime) }}</text>
+					<text class="float_right order-status-text">
+						{{ text_set.commission || '佣金' }}:
+						<text class="rmb-ic">¥</text>
+						<text class="price-num">{{ item.retMoney || 0 }}</text>
+					</text>
+				</view>
+				<view class="goods-ul">
+					<view class="goods-li clearfix" v-for="(it, gindex) in item.orderGoods" :key="gindex">
+						<image class="goods-img float_left" :src="it.goodsImages" mode="aspectFit"></image>
+						<view class="float_right goods-right">
+							<view class="goods-name">{{ it.goodsName }}</view>
+							<view class="goods-descrip">
+								规格:
+								<text style="padding-right: 6upx;">{{ it.unitName }}</text>
+								<block v-for="(ip, indexSp) in it.specGroup" :key="indexSp">
+									<text v-if="indexSp > 0">-</text>
+									<text>{{ ip.specValueName }}</text>
+								</block>
+							</view>
+							<view class="goods-price clearfix">
+								<view class="float_left">
+									<text class="price" style="color: fa3534">¥{{ it.price || 0 }}</text>
+								</view>
+								<view class="float_right">
+									<text class="icon-jia">*</text>
+									<text class="goods-num">{{ it.buyNum }}</text>
+								</view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+			<u-loadmore v-if="orderList.length" :status="loading_status" />
+		</view>
+
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			loading_status: 'loadmore',
+			orderList: [],
+			text_set: {},
+			isLoding: false,
+			page: 1,
+			pageSize: 10,
+			pageTotal: 0,
+			waitMoney: 0
+		};
+	},
+	onLoad(options) {
+		uni.setNavigationBarColor({
+			frontColor: '#ffffff',
+			backgroundColor: '#fb604e'
+		});
+		this.text_set = this.$store.state.distributionTextSet;
+		if (this.text_set.commission_r) {
+			uni.setNavigationBarTitle({
+				title: this.text_set.commission_r || '待入账佣金'
+			});
+		}
+		this.waitMoney = options.waitMoney || 0;
+	},
+	onShow() {
+		this.getCommissionOrder();
+	},
+	onReachBottom() {
+		if (this.pageTotal / this.pageSize > this.page) {
+			this.page += 1;
+			this.getOrderSelect();
+		}
+	},
+	methods: {
+		// 订单
+		 getCommissionOrder() {
+			this.loading_status = 'loading';
+			this.$u.api.getCommissionOrder({
+				page: this.page,
+				pageSize: this.pageSize,
+				orderStatus: [2, 3, 4]
+			}).then(data=>{
+				if (this.page === 1) {
+					this.orderList = data.data;
+				} else {
+					this.orderList = this.orderList.concat(data.data);
+				}
+				this.pageTotal = data.pageTotal;
+				this.loading_status =  this.$_utils.loadStatus(this.page, this.pageSize, this.pageTotal);
+			});
+
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+body {
+	background: $page-color-base;
+}
+.top-money-view {
+	background: #fb604e;
+	padding: 50upx 0;
+	text-align: center;
+	.money-num {
+		font-size: 64upx;
+		color: #ffffff;
+		padding-bottom: 20upx;
+	}
+	.add-up-label {
+		color: #ffffff;
+		opacity: 0.5;
+		font-size: 24upx;
+	}
+}
+.order-item {
+	margin: 24upx 0;
+	// padding: 0 30upx;
+	background-color: #fff;
+	border-bottom: 2upx solid #f5f5f5;
+	.order-no-view {
+		font-size: 24upx;
+		padding: 24upx 30upx;
+		color: #666;
+		font-weight: 300;
+		border-bottom: 1upx solid #eee;
+		.order-status-text {
+			font-weight: 400;
+			color: #999;
+			.rmb-ic {
+				color: #fa3534;
+				font-size: 22upx;
+			}
+			.price-num {
+				color: #fa3534;
+				font-size: 28upx;
+				margin-left: 6upx;
+			}
+		}
+	}
+	.goods-li {
+		// background: #fafafa;
+		border-bottom: 1upx solid #eee;
+		padding: 30upx 20upx;
+		margin-bottom: 20upx;
+
+		.goods-img {
+			width: 180upx;
+			height: 180upx;
+		}
+
+		.goods-right {
+			width: 500upx;
+			margin-left: 20upx;
+
+			.goods-name {
+				color: #333;
+				font-size: 32upx;
+				margin-bottom: 19upx;
+				text-overflow: -o-ellipsis-lastline;
+				overflow: hidden;
+				text-overflow: ellipsis;
+				display: -webkit-box;
+				-webkit-line-clamp: 1;
+				line-clamp: 1;
+				-webkit-box-orient: vertical;
+			}
+
+			.goods-descrip {
+				font-size: 22upx;
+				color: #999;
+				margin-bottom: 28upx;
+				// font-weight: 300;
+				text-overflow: -o-ellipsis-lastline;
+				overflow: hidden;
+				text-overflow: ellipsis;
+				display: -webkit-box;
+				-webkit-line-clamp: 1;
+				line-clamp: 1;
+				-webkit-box-orient: vertical;
+			}
+
+			.goods-price {
+				.price {
+					color: $price-color;
+					font-size: 40upx;
+				}
+
+				.sku {
+					font-size: 22upx;
+					font-weight: 300;
+					color: #666;
+				}
+
+				.icon-jia {
+					color: #666;
+					font-size: 24upx;
+				}
+
+				.goods-num {
+					font-size: 24upx;
+				}
+			}
+		}
+	}
+	.goods-li:last-child {
+		margin-bottom: 0;
+		border-bottom: 0 none;
+	}
+}
+</style>

+ 383 - 0
pagesT/Distribution/Poster.vue

@@ -0,0 +1,383 @@
+<template>
+	<view class="poster_page">
+		<canvas canvas-id="poster" class="poster_canvas"></canvas>
+		<view class="poster_image">
+			<image class="poster_bg_image" :src="promoteBgImgs" mode="widthFix"></image>
+			<image class="poster_code_image" :src="promoteCodeImg" mode="aspectFit"></image>
+		</view>
+
+		<view class="share_save_box">
+			<!-- #ifdef MP -->
+			<button open-type="share" class="b-btn">
+				<text class="ibonfont ibonsousuo"></text>
+				<text>发给好友</text>
+			</button>
+			<!-- #endif -->
+			<!-- #ifdef APP-PLUS -->
+			<view @click="onAppShare"  class="b-btn">
+				<text class="ibonfont ibonsousuo"></text>
+				<text>发给好友</text>
+			</view>
+			<!-- #endif -->
+			<view class="b-btn" @click="onSaveImg">
+				<text class="ibonfont ibonbaocun-" style="color: #f2b844;"></text>
+				<text>保存图片</text>
+			</view>
+		</view>
+		<!-- #ifdef H5 -->
+		<view class="h5_press_save" v-if="h5SaveImg" @click="h5SaveImg = ''">
+			<image :src="h5SaveImg" mode="widthFix"></image>
+			<button class="download">长按图片保存图片</button>
+		</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+import { mapState, mapMutations } from 'vuex';
+let settingWritePhotosAlbum = false;
+import webUrl from '../../config.js';
+export default {
+	data() {
+		return {
+			promoteCodeImg: '',
+			swiperIndex: 0,
+			posterImgs: [],
+			base_set_info:{},
+			h5SaveImg: '',
+			promoteBgImgs:'https://onlineimg.qianniao.vip/94d23d0a2f4c4e6187de1ba6e12050b5/1595924199706推广.jpg'
+		};
+	},
+	//第一次加载
+	onLoad(e) {
+		this.getQrSrc();
+		this.base_set_info = this.$store.state.baseSet;
+	},
+	computed: {
+		...mapState(['userInfo'])
+	},
+	//方法
+	methods: {
+		async getQrSrc() {
+			// #ifdef MP-TOUTIAO
+			// let pathT = 'pages/index/index' + this.goods_id;
+			// pathT = encodeURIComponent(pathT);
+			// this.$u.api.byteCreateQRCode({
+			// 	path: pathT,
+			// 	params: this.goods_id,
+			// 	appname: 'toutiao'
+			// }).then(res=>{});
+			// #endif
+			// #ifdef MP-WEIXIN || H5
+			let pathS = 'pages/index/index';
+			this.$u.api.createwxaqrcode({
+				path: pathS,
+				params: this.$store.state.userStatus.id
+			}).then(res=>{
+				this.promoteCodeImg = res.data.indexOf('https') > -1 ? res.data : webUrl.QRC_SRC + res.data;
+			})
+			// #endif
+		},
+		// 轮播图变化
+		onSwiperChange(e) {
+			this.swiperIndex = e.detail.current;
+		},
+		// 创建海报
+		createPoster() {
+			return new Promise((resolve, reject) => {
+				if (this.posterImgs[this.swiperIndex]) {
+					resolve(this.posterImgs[this.swiperIndex]);
+				} else {
+					uni.showLoading({
+						title: '海报生成中'
+					});
+					const ctx = uni.createCanvasContext('poster');
+					ctx.fillRect(0, 0, 375, 667);
+					uni.downloadFile({
+						url: this.promoteBgImgs,
+						success: res => {
+							if (res.statusCode === 200) {
+								ctx.drawImage(res.tempFilePath, 0, 0, 375, 667);
+								uni.downloadFile({
+									url: this.promoteCodeImg,
+									success: res => {
+										if (res.statusCode === 200) {
+											ctx.drawImage(res.tempFilePath, 137, 416, 100.1, 100.1);
+											ctx.draw(true, () => {
+												// canvas画布转成图片并返回图片地址
+												uni.canvasToTempFilePath({
+													canvasId: 'poster',
+													width: 375,
+													height: 667,
+													success: res => {
+														if (this.posterImgs[this.swiperIndex]) {
+															this.posterImgs[this.swiperIndex].temporary = res.tempFilePath;
+														} else {
+															this.posterImgs[this.swiperIndex] = {};
+															this.posterImgs[this.swiperIndex].temporary = res.tempFilePath;
+														}
+														resolve(res.tempFilePath);
+														console.log(res.tempFilePath);
+													},
+													fail: () => {
+														uni.hideLoading();
+														reject();
+													}
+												});
+											});
+										} else {
+											uni.hideLoading();
+											uni.showToast({
+												title: '海报制作失败,图片下载失败',
+												icon: 'none'
+											});
+										}
+									},
+									fail: err => {
+										uni.hideLoading();
+										uni.showToast({
+											title: '海报制作失败,图片下载失败',
+											icon: 'none'
+										});
+									}
+								});
+							} else {
+								uni.hideLoading();
+								uni.showToast({
+									title: '海报制作失败,图片下载失败',
+									icon: 'none'
+								});
+							}
+						},
+						fail: err => {
+							uni.hideLoading();
+							uni.showToast({
+								title: '海报制作失败,图片下载失败',
+								icon: 'none'
+							});
+						}
+					});
+				}
+			});
+		},
+		// 保存图片
+		async onSaveImg() {
+			let imgUrl = '';
+			if (this.posterImgs[this.swiperIndex] && this.posterImgs[this.swiperIndex].temporary) {
+				imgUrl = await this.posterImgs[this.swiperIndex].temporary;
+			} else {
+				imgUrl = await this.createPoster();
+			}
+			// #ifdef H5
+			this.h5SaveImg = imgUrl;
+			uni.hideLoading();
+			// #endif
+			// #ifdef MP-WEIXIN
+			uni.showLoading({
+				title: '海报下载中'
+			});
+			if (settingWritePhotosAlbum) {
+				uni.getSetting({
+					success: res => {
+						if (res.authSetting['scope.writePhotosAlbum']) {
+							uni.saveImageToPhotosAlbum({
+								filePath: imgUrl,
+								success: () => {
+									uni.hideLoading();
+									uni.showToast({
+										title: '保存成功'
+									});
+								}
+							});
+						} else {
+							uni.showModal({
+								title: '提示',
+								content: '请先在设置页面打开“保存相册”使用权限',
+								confirmText: '去设置',
+								cancelText: '算了',
+								success: data => {
+									if (data.confirm) {
+										uni.hideLoading();
+										uni.openSetting();
+									}
+								}
+							});
+						}
+					}
+				});
+			} else {
+				settingWritePhotosAlbum = true;
+				uni.authorize({
+					scope: 'scope.writePhotosAlbum',
+					success: () => {
+						uni.saveImageToPhotosAlbum({
+							filePath: imgUrl,
+							success: () => {
+								uni.hideLoading();
+								uni.showToast({
+									title: '保存成功'
+								});
+							}
+						});
+					}
+				});
+			}
+			// #endif
+			// #ifdef APP-PLUS
+			uni.showLoading({
+				title: '海报下载中'
+			});
+			uni.saveImageToPhotosAlbum({
+				filePath: imgUrl,
+				success: () => {
+					uni.hideLoading();
+					uni.showToast({
+						title: '保存成功'
+					});
+				}
+			});
+			// #endif
+		},
+		async onAppShare() {
+			uni.share({
+				provider: 'weixin',
+				scene: 'WXSceneSession',
+				type: 5,
+				title: this.base_set_info.shop,
+				imageUrl: this.base_set_info.images,
+				success: function(res) {
+					console.log('success:' + JSON.stringify(res));
+				},
+				fail: function(err) {
+					console.log('fail:' + JSON.stringify(err));
+				}
+			});
+		}
+	},
+	//页面隐藏
+	onHide() {},
+	//页面卸载
+	onUnload() {},
+	//页面下来刷新
+	onPullDownRefresh() {},
+	//页面上拉触底
+	onReachBottom() {},
+	//用户点击分享
+	onShareAppMessage(e) {
+		return {
+			title: this.$store.state.baseSet.shop,
+			path: '/pages/index/index?businessmanId=' + this.$store.state.userStatus.id,
+			imageUrl: this.$store.state.baseSet.images,
+			success: res => {
+				console.log(res);
+			}
+		}
+	}
+};
+</script>
+<style lang="scss" scoped>
+// @import '@/style/mixin.scss';
+.poster_page {
+	min-height: 100vh;
+	background-color: #fff;
+	display: flex;
+	align-items: center;
+}
+.poster_canvas {
+	width: 750rpx;
+	height: 1334rpx;
+	position: fixed;
+	top: -10000rpx;
+	left: 0rpx;
+}
+.poster_image {
+	position: fixed;
+	top: 0;
+	left: 0;
+	.poster_bg_image {
+		width: 750upx;
+		height: 100vh;
+	}
+	.poster_code_image {
+		position: absolute;
+		bottom: 350rpx;
+		width: 136rpx;
+		height: 136rpx;
+		left: 50%;
+		transform: translateX(-50%);
+	}
+}
+.share_save_box {
+	position: fixed;
+	bottom: 0;
+	left: 0;
+	z-index: 6;
+	width: 100%;
+	display: flex;
+	padding: 10upx 0;
+	background-color: rgba($color: #ffffff, $alpha: 0.6);
+	.b-btn {
+		flex: 2;
+		text-align: center;
+		color: #000000;
+		font-size: 24rpx;
+		height: auto;
+		background-color: transparent;
+		overflow: inherit;
+		line-height: 46upx;
+		padding-left: 0;
+		padding-right: 0;
+		.ibonfont {
+			font-size: 60upx;
+			display: block;
+			color: #04be02;
+			margin: 0 auto 10upx;
+			width: 58rpx;
+			height: 58rpx;
+			border-radius: 100%;
+			background-color: #ffffff;
+			line-height: 60rpx;
+
+		}
+	}
+	button::after{
+		border: 0 none;
+	}
+}
+.h5_press_save {
+	background-color: #000;
+	position: fixed;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	display: flex;
+	align-items: center;
+	z-index: 100;
+	image {
+		width: 100%;
+	}
+	.download {
+		font-size: 24rpx;
+		color: #ffffff;
+		background-color: rgba(0, 0, 0, 0.5);
+		display: flex;
+		align-items: center;
+		flex-direction: row;
+		justify-content: center;
+		position: absolute;
+		padding: 5rpx 30rpx;
+		border-radius: 40rpx;
+		bottom: 30rpx;
+		left: 50%;
+		transform: translateX(-50%);
+		&:before {
+			content: '';
+			// @include bis('../../../static/demo/icon_download.png');
+			width: 24rpx;
+			height: 24rpx;
+			margin-right: 15rpx;
+		}
+	}
+}
+</style>

+ 222 - 0
pagesT/Distribution/Ranking.vue

@@ -0,0 +1,222 @@
+<template>
+	<view class="Ranking">
+		<u-navbar title="排行榜" title-color="#ffffff" back-icon-color="#ffffff" :border-bottom="false" :background="{ backgroundColor: '#ff4f63' }"></u-navbar>
+		<view class="ranking-cont" v-if="grade_list.length > 0">
+			<image class="ranking-bg" src="https://onlineimg.qianniao.vip/ranking-bg.png" mode=""></image>
+			<view class="top-three clearfix">
+				<view class="top-three-li second">
+					<view class="user-avator-view"  v-if="grade_list[1]">
+						<view class="ranking-sort">
+							2
+						</view>
+						<image class="r-vip" src="https://onlineimg.qianniao.vip/r-two.png" mode="aspectFill"></image>
+						<image class="user-avator" :src="grade_list[1].avatar" mode="aspectFill"></image>
+					</view>
+					<view class="user-info-view" v-if="grade_list[1]">
+						<view class="user-name">{{ grade_list[1].name }}</view>
+						<view class="user-money">¥{{ grade_list[1].totalMoney || 0  }}</view>
+					</view>
+				</view>
+				<view class="top-three-li first">
+					<view class="user-avator-view">
+						<view class="ranking-sort">
+							1
+						</view>
+						<image class="r-vip" src="https://onlineimg.qianniao.vip/r-one.png" mode="aspectFill"></image>
+						<image class="user-avator" :src="grade_list[0].avatar" mode="aspectFill"></image>
+					</view>
+					<view class="user-info-view">
+						<view class="user-name">{{ grade_list[0].name }}</view>
+						<view class="user-money">¥{{ grade_list[0].totalMoney || 0 }}</view>
+					</view>
+				</view>
+				<view class="top-three-li third">
+					<view class="user-avator-view"  v-if="grade_list[2]">
+						<view class="ranking-sort">
+							3
+						</view>
+						<image class="r-vip" src="https://onlineimg.qianniao.vip/r-three.png" mode="aspectFill"></image>
+						<image class="user-avator" :src="grade_list[2].avatar" mode="aspectFill"></image>
+					</view>
+					<view class="user-info-view"  v-if="grade_list[2]">
+						<view class="user-name">{{ grade_list[2].name }}</view>
+						<view class="user-money">¥{{ grade_list[2].totalMoney || 0 }}</view>
+					</view>
+				</view>
+			</view>
+			<view class="ranking-list">
+				<block v-for="(item, index) in grade_list" :key="index">
+					<view class="ranking-li clearfix" v-if="index > 2">
+						<view class="float_left sort-num">{{ index + 1 }}</view>
+						<image class="float_left user-avator" :src="item.avatar" mode="aspectFill"></image>
+						<view class="float_left user-info clearfix">
+							<view class="user-name float_left">{{ item.name }}</view>
+							<view class="money float_right">¥{{ item.totalMoney || 0 }}</view>
+						</view>
+					</view>
+				</block>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			grade_list: []
+		};
+	},
+	onLoad() {
+		this.commissionTop();
+	},
+	methods: {
+		 commissionTop() {
+			this.$u.api.commissionTop().then(res=>{
+				this.grade_list = res.data.moneyTop;
+			});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+body {
+	background-color: #ff4f63;
+}
+.Ranking {
+	.ranking-cont {
+		padding-top: 165upx;
+		.ranking-bg {
+			width: 424upx;
+			height: 79upx;
+			display: block;
+			margin: 0 auto;
+			transform: translateY(-100upx);
+		}
+		.top-three {
+			padding-left: 36upx;
+			.top-three-li {
+				float: left;
+				width: 192upx;
+				height: 309upx;
+				background-color: #ff354c;
+				border-radius: 12upx;
+				.user-avator-view {
+					position: relative;
+					.ranking-sort{
+						font-size: 24upx;
+						width: 34upx;
+						height: 34upx;
+						line-height: 34upx;
+						background-color: #8fc7fe;
+						color: #fff;
+						border-radius: 100%;
+						border: 1px solid #6eb7ff;
+						position: absolute;
+						bottom: 34upx;
+						left: 50%;
+						transform: translateX(-50%);
+						z-index: 9;
+						text-align: center;
+					}
+					.r-vip {
+						width: 58upx;
+						height: 42upx;
+						display: block;
+						position: absolute;
+						top: -68upx;
+						left: 50%;
+						transform: translateX(-29upx);
+					}
+					.user-avator {
+						width: 136upx;
+						height: 136upx;
+						border-radius: 100%;
+						display: block;
+						border: 4upx solid #8cc5fd;
+						margin: 0 auto;
+						transform: translateY(-30upx);
+					}
+				}
+				.user-info-view {
+					text-align: center;
+					color: #ffffff;
+					font-weight: bold;
+					font-size: 32upx;
+					.user-money {
+						font-weight: normal;
+						padding-top: 12upx;
+					}
+				}
+			}
+			.first {
+				width: 260upx;
+				height: 359upx;
+				margin: 0 16upx;
+				transform: translateY(-50upx);
+				.user-avator-view {
+					.user-avator {
+						width: 180upx;
+						height: 180upx;
+						border-color: #fdb10d;
+					}
+					.ranking-sort{
+						width: 44upx;
+						height: 44upx;
+						line-height: 44upx;
+						border-color: #f9ce72;
+						font-size: 26upx;
+						background-color: #febd03;
+					}
+				}
+			}
+			.third {
+				.user-avator-view {
+					.user-avator {
+						border-color: #ffaa6a;
+					}
+					.ranking-sort{
+						border-color: #f5abb5;
+						background-color: #ffaa6a;
+					}
+				}
+			}
+		}
+		.ranking-list {
+			min-height: 756upx;
+			background-color: #fff;
+			border-top-left-radius: 20upx;
+			border-top-right-radius: 20upx;
+			transform: translateY(-70upx);
+			padding: 30upx 0;
+			.ranking-li {
+				padding: 0 36upx 20upx;
+				.sort-num {
+					line-height: 100upx;
+					font-size: 30upx;
+					font-weight: bold;
+					padding-right: 26upx;
+				}
+				.user-avator {
+					width: 100upx;
+					height: 100upx;
+					border-radius: 100%;
+					margin-right: 30upx;
+				}
+				.user-info {
+					width: 500upx;
+					line-height: 100upx;
+					.user-name {
+						font-size: 28upx;
+						font-weight: bold;
+					}
+					.money {
+						color: #fe582e;
+					}
+				}
+			}
+		}
+	}
+}
+</style>

+ 434 - 0
pagesT/Distribution/Withdrawal.vue

@@ -0,0 +1,434 @@
+<template>
+	<!-- 申请提现 -->
+	<view class="Withdrawal">
+		<u-alert-tips v-if="!distributionSet.payType || !distributionSet.payType.length" type="warning" title="抱歉,管理员未配置提现方式" show-icon></u-alert-tips>
+		<view class="w-view w-channel clearfix" @click="openPay">
+			<view class="float_left">转出方式</view>
+			<view class="float_right">
+				<text v-if="cash_out_num">{{ cash_out_num }}</text>
+				<text v-else class="w-input-place">请选择</text>
+				<text class="ibonfont ibonjinru"></text>
+			</view>
+		</view>
+		<view class="w-view clearfix" v-if="cash_out_num && cash_out_num !== '微信钱包'">
+			<view class="float_left">姓名</view>
+			<view class="float_right">
+				<input type="text" placeholder-class="w-input-place" placeholder="请输入真实姓名" class="w-input" v-model="cash_out_form.accountContent.name" />
+			</view>
+		</view>
+		<block v-if="cash_out_num === '支付宝'">
+			<view class="w-view clearfix">
+				<view class="float_left">支付宝账号</view>
+				<view class="float_right">
+					<input placeholder-class="w-input-place" class="w-input" placeholder="请输入支付宝账号" type="text" v-model="cash_out_form.accountContent.account" />
+				</view>
+			</view>
+		</block>
+		<block v-if="cash_out_num === '银行卡'">
+			<picker @change="bindBankChange" :value="bank_index" range-key="cardNum" :range="bank_list">
+				<view class="w-view clearfix">
+					<view class="float_left">选择银行</view>
+					<view class="float_right clearfix" style="width: 480rpx;">
+						<text class="float_left" v-if="cash_out_form.accountContent.bankName">{{ cash_out_form.accountContent.bankName }}</text>
+						<text v-else class="w-input-place float_left">请选择</text>
+						<text class="ibonfont ibonjinru float_right" style="margin-top: 4rpx;"></text>
+					</view>
+				</view>
+			</picker>
+			<view class="w-view clearfix">
+				<view class="float_left">银行卡号</view>
+				<view class="float_right">
+					<input placeholder-class="w-input-place" placeholder="请输入银行卡号" class="w-input" type="text" v-model="cash_out_form.accountContent.account" />
+				</view>
+			</view>
+			<view class="w-view clearfix">
+				<view class="float_left">确认卡号</view>
+				<view class="float_right"><input placeholder-class="w-input-place" placeholder="请再次输入银行卡号" class="w-input" type="text" v-model="agin_card_num" /></view>
+			</view>
+		</block>
+		<view class="w-view w-money">
+			<view class="w-tit">
+				<text>{{ text_set.withdrawal || '提现' }}金额</text>
+				<text class="w-tit-r">最少{{ text_set.withdrawal || '提现' }}金额{{ distributionSet.quota }}元</text>
+			</view>
+			<view class="w-money-input-view">
+				<text class="rmb-icon">¥</text>
+				<input class="w-money-input" type="text" v-model="cash_out_form.money" />
+			</view>
+		</view>
+		<view class="clearfix w-tip">
+			<text class="float_left">{{ text_set.commission_w || '可提现佣金' }}:¥{{ cash_out_form.nowMoney || 0 }}</text>
+			<text class="float_right primary-color" @click="allWitjdrawal">全部{{ text_set.withdrawal || '提现' }}</text>
+		</view>
+		<view class="w-btn" @click="withdrawalsAdd" :class="[cash_out_form.money >= Number(distributionSet.quota) ? 'w-btn-on' : '']">{{ text_set.withdrawal || '提现' }}</view>
+		<u-popup mode="bottom" v-model="payPop" :border-radius="12">
+			<view class="pay-pop-view">
+				<view class="pay-sel-title clearfix">
+					<text class="float_left">{{ text_set.withdrawal || '提现' }}方式</text>
+					<text class="float_right ibonfont ibonguanbi" @click="closePayPop"></text>
+				</view>
+				<view class="pay-ul">
+					<view class="pay-li" @click="paymentChange(4)" v-if="distributionSet.payType.indexOf(4) > -1">
+						<text class="ibonfont ibonweixinzhifu"></text>
+						<view class="pay-name clearfix">
+							<text class="float_left">微信钱包</text>
+							<text class="float_right ibonfont primary-color" :class="[payType === 4 ? 'ibonxuanze1' : 'ibonweixuanze']"></text>
+						</view>
+					</view>
+					<block v-if="distributionSet.payType.indexOf(5) > -1">
+						<!-- <view class="pay-tip">手动打款</view> -->
+						<!-- 手动打款 -->
+						<view class="pay-li" @click="withdrawTypeChange(4)" v-if="distributionSet.withdrawType.indexOf(4) > -1">
+							<text class="ibonfont ibonumidd17"></text>
+							<view class="pay-name clearfix">
+								<text class="float_left">支付宝</text>
+								<text
+									class="float_right ibonfont primary-color"
+									:class="[payType === 5 && withdrawType === 4 ? 'ibonxuanze1' : 'ibonweixuanze']"
+								></text>
+							</view>
+						</view>
+						<view class="pay-li" @click="withdrawTypeChange(5)" v-if="distributionSet.withdrawType.indexOf(5) > -1">
+							<text class="ibonfont ibonyinhangqia"></text>
+							<view class="pay-name clearfix">
+								<text class="float_left">银行卡</text>
+								<text
+									class="float_right ibonfont primary-color"
+									:class="[payType === 5 && withdrawType === 5 ? 'ibonxuanze1' : 'ibonweixuanze']"
+								></text>
+							</view>
+						</view>
+					</block>
+				</view>
+			</view>
+		</u-popup>
+
+	</view>
+</template>
+
+<script>
+import { getOpenid } from '@/access/common.js';
+export default {
+	data() {
+		return {
+			isLoding: false,
+			payPop: false,
+			cash_out_form: {
+				businessmanId: '', // 提现者分销商id
+				type: 1, //1 微信钱包;2,支付宝;3,银行卡
+				accountContent: {
+					name: '', // 提现者姓名
+					account: '', // 提现账号
+					bankName: '' //银行名称
+				},
+				money: 0, // 输入提现金额
+				nowMoney: 0 // 当前实际金额
+			},
+			bank_list: [], // 银行卡列表
+			bank_index: 0, //选择银行卡下标
+			text_set: {}, //文字设置
+			cash_out_num: '', // 转出方式
+			agin_card_num: '', //确认卡号
+			payType: 4, // 自动提现
+			distributionSet: {
+				quota: 0,
+				// 分销基础设置
+				payType: [],
+				withdrawType: []
+			},
+			cardNum: '', //银行卡
+			withdrawType: 4 //手动提现  4:支付宝 5:银行卡',
+		};
+	},
+	onLoad(options) {
+		this.text_set = this.$store.state.distributionTextSet;
+		if (this.text_set.commission_r) {
+			uni.setNavigationBarTitle({
+				title: '申请' + (this.text_set.withdrawal || '提现')
+			});
+		}
+		// 判断申请方式
+		this.distributionSet = this.$store.state.distributionSet;
+		if (this.distributionSet.payType && this.distributionSet.payType.length) {
+			this.payType = this.distributionSet.payType[0];
+			if (this.payType === 5) {
+				if (this.distributionSet.withdrawType && this.distributionSet.withdrawType.length) {
+					this.withdrawType = this.distributionSet.withdrawType[0];
+					this.cash_out_num = this.withdrawType === 4 ? '支付宝' : this.withdrawType === 5 ? '银行卡' : '';
+				}
+			} else {
+				this.cash_out_num = '微信钱包';
+			}
+		}
+		// 可提现金额
+		if (options.balance) {
+			this.cash_out_form.nowMoney = options.balance || 0;
+		}
+		// 银行卡列表
+		if (this.distributionSet.withdrawInfo) {
+			this.bank_list = this.distributionSet.withdrawInfo;
+		}
+
+		// 获取提现者分销商id
+		this.cash_out_form.businessmanId = options.id;
+		// 获取OPenID
+		this.cash_out_form.accountContent.account = getOpenid();
+	},
+	methods: {
+		// 申请提现
+		 withdrawalsAdd() {
+			if (this.cash_out_form.type === 2) {
+				if (!this.cash_out_form.accountContent.name) {
+					this.$api.msg('请输入您的真实姓名');
+					return;
+				}
+				if (!this.cash_out_form.accountContent.account) {
+					this.$api.msg('请输入您的支付宝账号');
+					return;
+				}
+			}
+			if (this.cash_out_form.type === 3) {
+				if (!this.cash_out_form.accountContent.name) {
+					this.$api.msg('请输入您的真实姓名');
+					return;
+				}
+				if (!this.cash_out_form.accountContent.bankName) {
+					this.$api.msg('请选择银行名称');
+					return;
+				}
+				if (!this.cash_out_form.accountContent.account) {
+					this.$api.msg('请输入您的银行账号');
+					return;
+				}
+				if (!this.agin_card_num) {
+					this.$api.msg('请再次输入您的银行账号');
+					return;
+				}
+				if (this.agin_card_num !== this.cash_out_form.accountContent.account) {
+					this.$api.msg('确认卡号与银行卡号不一致');
+					return;
+				}
+			}
+			if (!this.cash_out_form.money) {
+				this.$api.msg('请输入要提现金额');
+				return;
+			}
+			if (this.cash_out_form.money < Number(this.distributionSet.quota)) {
+				this.$api.msg('最低提现金额为' + this.distributionSet.quota + '元');
+				return;
+			}
+			if (this.cash_out_form.money > this.cash_out_form.nowMoney) {
+				this.$api.msg('可提现金额不足');
+				return;
+			}
+			this.$u.api.WithdrawalsAdd(this.cash_out_form).then(res=>{
+				this.$api.msg('提现申请成功');
+				this.goPage('/pagesT/Distribution/Application?id=' + res.data, 'redirectTo');
+			});
+		},
+		// 全部提现按钮点击事件
+		allWitjdrawal() {
+			this.cash_out_form.money = this.cash_out_form.nowMoney;
+		},
+		// 选择银行change事件
+		bindBankChange(e) {
+			const index = e.target.value;
+			this.bank_index = index;
+			this.cash_out_form.accountContent.bankName = this.bank_list[index].cardNum;
+		},
+		// 自动提现
+		paymentChange(val) {
+			this.payType = val;
+			switch (val) {
+				case 4:
+					this.cash_out_num = '微信钱包';
+					this.cash_out_form.type = 1;
+					break;
+				case 5:
+					this.cash_out_num = '手动提现';
+					break;
+			}
+			this.closePayPop();
+		},
+		// 手动提现
+		withdrawTypeChange(val) {
+			this.payType = 5;
+			this.withdrawType = val;
+			switch (val) {
+				case 4:
+					this.cash_out_num = '支付宝';
+					this.cash_out_form.type = 2;
+					break;
+				case 5:
+					this.cash_out_num = '银行卡';
+					this.cash_out_form.type = 3;
+					break;
+			}
+			this.closePayPop();
+		},
+
+		closePayPop() {
+			this.payPop=false
+			this.cash_out_form.accountContent.account = '';
+			this.cash_out_form.accountContent.bankName = '';
+		},
+		openPay() {
+			if (!this.distributionSet.payType || !this.distributionSet.payType.length) {
+				this.$api.msg('抱歉,管理员未配置提现方式');
+				return;
+			}
+			this.payPop=true
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+body {
+	background: $page-color-base;
+}
+.Withdrawal {
+	width: 702upx;
+	margin: 20upx auto;
+	padding: 0 24upx 50upx;
+	background-color: #ffffff;
+	font-size: 28upx;
+	.w-view {
+		border-bottom: 1px solid #f5f5f5;
+		padding: 24upx 0;
+		.ibonjinru {
+			font-size: 28upx;
+			color: #666;
+			height: 32upx;
+			margin-left: 10upx;
+		}
+		.w-input {
+			width: 480rpx;
+		}
+		.w-input-place {
+			color: #b0b3bf;
+			font-size: 26upx;
+		}
+		.w-tit {
+			.w-tit-r {
+				margin-left: 10upx;
+				font-size: 24upx;
+				color: #b0b3bf;
+			}
+		}
+	}
+	.w-money {
+		.w-money-input-view {
+			padding-top: 40upx;
+			.rmb-icon {
+				font-size: 60upx;
+				font-weight: bold;
+				display: inline-block;
+				vertical-align: middle;
+				height: 70upx;
+			}
+			.w-money-input {
+				display: inline-block;
+				width: 580upx;
+				height: 70upx;
+				font-size: 60upx;
+				padding-left: 20upx;
+				font-weight: bold;
+				vertical-align: middle;
+				padding-top: 6rpx;
+			}
+		}
+	}
+	.w-tip {
+		font-size: 24upx;
+		padding: 20upx 0 50upx;
+	}
+	.w-btn {
+		margin: 0 auto;
+		width: 660upx;
+		line-height: 70upx;
+		height: 70upx;
+		color: #666;
+		text-align: center;
+		font-size: 28upx;
+		border-radius: 70upx;
+		background-color: #eee;
+	}
+	.w-btn-on {
+		color: #fff;
+		background-color: #fe582e;
+	}
+}
+.pay-pop-view {
+	background-color: #ffffff;
+	border-top-left-radius: 12upx;
+	border-top-right-radius: 12upx;
+	padding-bottom: 40upx;
+	font-size: 28upx;
+	.pay-sel-title {
+		padding: 0 30upx;
+		line-height: 88upx;
+		font-weight: bold;
+		font-size: 32upx;
+		.ibonfont {
+			color: #999;
+			font-weight: 400;
+		}
+	}
+	.pay-btn {
+		width: 690upx;
+		height: 80upx;
+		line-height: 80upx;
+		color: #fff;
+		font-size: 32upx;
+		text-align: center;
+		margin: 20upx auto 0;
+		border-radius: 80upx;
+	}
+	.pay-ul {
+		.pay-tip {
+			font-size: 24upx;
+			color: #999999;
+			line-height: 32upx;
+			padding: 20upx 30upx 0;
+		}
+		.pay-li {
+			line-height: 100upx;
+
+			.ibonfont {
+				padding-left: 30upx;
+				font-size: 46upx;
+				vertical-align: middle;
+				margin-right: 24upx;
+			}
+			.ibonweixinzhifu {
+				color: #04be02;
+			}
+			.ibonumidd17 {
+				color: #108ee9;
+			}
+			.ibonyinhangqia {
+				color: #f2b844;
+			}
+			.pay-name {
+				width: 650upx;
+				display: inline-block;
+				padding-right: 30upx;
+				vertical-align: middle;
+				border-bottom: 1px solid #f5f5f5;
+				.ibonweixuanze,
+				.ibonxuanze1 {
+					margin-right: 0;
+					padding-left: 0;
+					font-size: 38upx;
+				}
+			}
+		}
+		.pay-li:last-child {
+			.pay-name {
+				border-bottom: 0 none;
+			}
+		}
+	}
+}
+</style>

+ 466 - 0
pagesT/NewAgent/apply_cash.vue

@@ -0,0 +1,466 @@
+<template>
+	<!-- 申请提现 -->
+	<view class="Withdrawal" :class="['qn-page-' + theme]">
+		<view class="w-view w-channel clearfix" @click="openPay">
+			<view class="float_left">转出方式</view>
+			<view class="float_right">
+				<text v-if="cashTypeIndex>-1">{{ cashType.length>0 ? cashType[cashTypeIndex].title:""}}</text>
+				<text v-else class="w-input-place">请选择</text>
+				<text class="ibonfont ibonjinru"></text>
+			</view>
+		</view>
+		<view class="w-view clearfix" v-if="cashType.length>0">
+			<view class="float_left">姓名</view>
+			<view class="float_right">
+				<input type="text" placeholder-class="w-input-place" placeholder="请输入真实姓名" class="w-input" v-model="subData.bank_name" />
+			</view>
+		</view>
+		
+		<view class="w-view clearfix" v-if="cashTypeIndex>-1 && cashType[cashTypeIndex].code == 'bank'">
+			<view class="float_left">开户银行</view>
+			<view class="float_right">
+				<input placeholder-class="w-input-place" class="w-input" placeholder="请输入开户银行" type="text" v-model="subData.bank_ad" />
+			</view>
+		</view>
+		<view class="w-view clearfix">
+			<view class="float_left">
+				{{cashTypeIndex>-1 && cashType[cashTypeIndex].code == 'bank' ? "银行卡号" : "提现账号"}}
+			</view>
+			<view class="float_right">
+				<input placeholder-class="w-input-place" class="w-input" :placeholder="cashTypeIndex>-1 && cashType[cashTypeIndex].code == 'bank' ? '请输入银行卡号' : '请输入提现账号'" type="text" v-model="subData.bank_num" />
+			</view>
+		</view>
+		<view class="w-view clearfix" v-if="cashTypeIndex>-1 && cashType[cashTypeIndex].code == 'bank'">
+			<view class="float_left">确认卡号</view>
+			<view class="float_right">
+				<input placeholder-class="w-input-place" class="w-input" placeholder="请输入确认卡号" type="number" v-model="subData.bank_num_agin" />
+			</view>
+		</view>
+
+
+		<view class="w-view w-money">
+			<view class="w-tit">
+				<text>提现金额</text>
+				<text class="w-tit-r">最少提现金额{{ min_money }}元</text>
+			</view>
+			<view class="w-money-input-view">
+				<text class="rmb-ic">¥</text>
+				<input class="w-money-input" type="number" v-model="subData.money" />
+			</view>
+		</view>
+		<view class="clearfix w-tip">
+			<view class="float_left">
+				<text>可提现:¥{{ dataInfo.balance }}</text>
+				<!-- <text>(手续费:10%)</text> -->
+			</view>
+			<view class="float_right primary-color" @click="allWitjdrawal">全部提现</view>
+		</view>
+		<view class="w-btn w-btn-on" @click="subForm">
+			<u-loading :show="isLoding"></u-loading>
+			<text style="margin-left: 10rpx;">提现</text>
+		</view>
+		<u-popup mode="bottom" v-model="payPop" :border-radius="12">
+			<view class="pay-pop-view">
+				<view class="pay-sel-title clearfix">
+					<text class="float_left">提现方式</text>
+					<text class="float_right ibonfont ibonguanbi1" @click="closePayPop"></text>
+				</view>
+				<view class="pay-ul">
+					<view class="pay-li"  v-for="(item,index) in cashType" :key="index" @click="paymentChange(index)">
+						<text class="ibonfont ibonweixinzhifu" :class="item.icon?item.icon:'ibonyinhangqia'"></text>
+						<view class="pay-name clearfix">
+							<text class="float_left">{{item.title}}</text>
+							<text class="float_right ibonfont primary-color" :class="[cashTypeIndex === index ? 'ibonxuanze_xuanzhong' : 'ibonxuanze']"></text>
+						</view>
+					</view>
+				</view>
+			</view>
+		</u-popup>
+		
+		<u-modal v-model="tip_show" content="抱歉,您未设置支付密码,无法提现余额" :show-cancel-button="true" confirm-text="立即设置" cancel-text="取消" @confirm="setPassword"></u-modal>
+		<!-- 余额支付密码弹窗 -->
+		<u-keyboard default="" ref="uKeyboard" mode="number" :mask="true" :mask-close-able="false" :dot-enabled="false"
+			v-model="pwd_show" :safe-area-inset-bottom="true" :tooltip="false" @change="balancePopChange"
+			@backspace="onBackspace">
+			<view>
+				<view class="u-text-center u-padding-20 balance-money">
+					<text>密码验证</text>
+					<view class="u-padding-10 close" data-flag="false" @tap="inputShowPop(false)">
+						<u-icon name="close" color="#333333" size="28"></u-icon>
+					</view>
+				</view>
+				<view class="u-flex u-row-center">
+					<u-message-input mode="box" :maxlength="6" :dot-fill="true" v-model="balance_pwd"
+						:disabled-keyboard="true" @finish="inputFinish"></u-message-input>
+				</view>
+				<view class="u-text-center u-padding-top-10 u-padding-bottom-20 tips">密码键盘</view>
+			</view>
+		</u-keyboard>
+		
+	</view>
+</template>
+
+<script>
+// import { getOpenid } from '@/access/common.js';
+export default {
+	data() {
+		return {
+			min_money: 1, // 最少提现
+			isLoding: false,
+			payPop: false,
+			
+			tip_show: false, // 余额支付提示
+			pwd_show: false, // 余额支付密码输入弹窗
+			balance_pwd: '', // 余额支付密码
+			
+			
+			
+			
+			cashType:[],
+			cashTypeIndex:-1,
+			dataInfo:{balance:0.00},
+			subData:{
+				money:"",
+				bank_type:"",
+				bank_name:"",
+				bank_ad:"",
+				bank_num:"",
+				bank_num_agin:"",
+			},
+			payCheckStatus:false,
+		};
+	},
+	computed: {
+		userInfo() {
+			return this.$store.state.userStatus;
+		}
+	},
+
+	onShow() {
+		this.getAgentInfo();
+		
+	},
+	methods: {
+		subCheckPayPassword(){
+			if (this.userInfo.payPassword) {
+				//输入支付密码
+				this.inputShowPop();
+			} else {
+				this.tip_show = true;
+			}
+		},
+		// 密码弹窗显示
+		inputShowPop(flag = true) {
+			this.balance_pwd = '';
+			this.pwd_show = flag;
+		},
+		// 余额密码输入完成
+		inputFinish() {
+			// 唤起支付
+			// this.subForm();
+		},
+		// 去设置支付密码
+		setPassword() {
+			this.goPage('/pagesT/money/PayPassword');
+		},
+		//键盘退格键被点击
+		onBackspace(e) {
+			if (this.balance_pwd.length > 0) {
+				this.balance_pwd = this.balance_pwd.substring(0, this.balance_pwd.length - 1);
+			}
+		},
+		// 余额支付密码键盘按键被点击(不包含退格键被点击)
+		balancePopChange(val) {
+			if (this.balance_pwd.length < 6) {
+				this.balance_pwd += val;
+			}
+			if (this.balance_pwd.length >= 6) {
+				// 唤起密码验证
+				this.checkPayPassword();
+			}
+		},
+		
+		// 支付密码校验
+		checkPayPassword() {
+			uni.showLoading();
+			this.$u.api.checkPayPassword({id: this.userInfo.id,payPassword: this.balance_pwd}).then(res => {
+				this.payCheckStatus = true;
+				this.inputShowPop(false);
+				this.subForm();
+			}).catch(res => {
+				this.balance_pwd = '';
+			});
+		},
+		
+
+		getAgentCashType() {
+			var that = this;
+			this.$u.api.getAgentCashType().then(res=>{
+				if(res.data && res.data.length>0){
+					that.cashType = res.data;
+				}
+			})
+		},
+		getAgentInfo(){
+			var that = this;
+			this.$u.api.getAgentData().then(res=>{
+				if(res.data && res.data.id>0){
+					that.dataInfo = res.data;
+					that.getAgentCashType();
+				}
+			});
+		},
+
+		
+		// 申请提现
+		subForm() {
+			var postData = this.subData,that = this;
+			if(!this.payCheckStatus){
+				that.subCheckPayPassword();
+				return;
+			}
+			
+			
+			if(this.isLoding==true){
+				return false;
+			}
+			if(this.cashTypeIndex<0 || this.cashType.length<=0){
+				this.$api.msg('请选择提现方式');
+				return;
+			}
+			postData.bank_type = this.cashType[this.cashTypeIndex].title || "";
+			if(!this.$_utils.isDefine(postData.bank_type)){
+				this.$api.msg('请选择提现方式');
+				return;
+			}
+			if(!this.$_utils.isDefine(postData.bank_name)){
+				this.$api.msg('请输入您的真实姓名');
+				return;
+			}
+			var code = this.cashType[this.cashTypeIndex].code;
+			if(this.cashType[this.cashTypeIndex].code == "bank"){
+				if(!this.$_utils.isDefine(postData.bank_ad)){
+					this.$api.msg('请输入您的开户行');
+					return;
+				}
+				if(!this.$_utils.isDefine(postData.bank_num)){
+					this.$api.msg('请输入您的银行卡号');
+					return;
+				}
+				if(!this.$_utils.isDefine(postData.bank_num_agin)){
+					this.$api.msg('请再次输入您的银行卡号');
+					return;
+				}
+				if(postData.bank_num!=postData.bank_num_agin){
+					this.$api.msg('两次卡号输入不一致');
+					return;
+				}
+			}else{
+				if(!this.$_utils.isDefine(postData.bank_num)){
+					this.$api.msg('请输入您的提现账号');
+					return;
+				}
+				if(code=="wxpay" && !this.$_utils.isMobile(postData.bank_num)){
+					this.$api.msg('请输入正确微信手机账号');
+					return;
+				}
+				postData.bank_ad = this.cashType[this.cashTypeIndex].title;
+			}
+			if(!this.$_utils.isMoney(postData.money)){
+				this.$api.msg('请输入正确的提现金额');
+				return;
+			}
+			if (Number(postData.money) < this.min_money) {
+				this.$api.msg('最低提现金额为' + this.min_money + '元');
+				return;
+			}
+			if (Number(postData.money) > Number(this.dataInfo.balance)) {
+				this.$api.msg('可提现金额不足');
+				return;
+			}
+			
+			this.isLoding = true;
+			this.$u.api.agentCashApply(postData).then(res => {
+				that.isLoding = false;
+				if(res.errorcode==0){
+					that.$api.msg("提现成功");
+					setTimeout(res => {
+						that.goPage('/pages/user/user', 'switchTab');
+					}, 1500);
+				}else{
+					that.$api.msg(res.data);
+				}
+			}).catch(res => {
+				that.isLoding = false;
+			});
+		},
+		// 全部提现按钮点击事件
+		allWitjdrawal() {
+			this.subData.money = this.dataInfo.balance;
+		},
+		// 自动提现
+		paymentChange(index) {
+			this.cashTypeIndex = index;
+			this.closePayPop();
+		},
+		closePayPop() {
+			this.payPop = false;
+			this.cash_out_form.reflectInfo.account = '';
+			this.cash_out_form.reflectInfo.bankName = '';
+		},
+		openPay() {
+			this.payPop = true;
+		},
+	}
+};
+</script>
+
+<style lang="scss">
+.Withdrawal {
+	width: 702upx;
+	margin: 20upx auto;
+	padding: 0 24upx 50upx;
+	background-color: #ffffff;
+	font-size: 28upx;
+	.w-view {
+		border-bottom: 1px solid #f5f5f5;
+		padding: 24upx 0;
+		.ibonjinru {
+			font-size: 28upx;
+			color: #666;
+			height: 32upx;
+			margin-left: 10upx;
+		}
+		.w-input {
+			width: 480rpx;
+		}
+		.w-input-place {
+			color: #b0b3bf;
+			font-size: 26upx;
+		}
+		.w-tit {
+			.w-tit-r {
+				margin-left: 10upx;
+				font-size: 24upx;
+				color: #b0b3bf;
+			}
+		}
+	}
+	.w-money {
+		.w-money-input-view {
+			padding-top: 40upx;
+			.rmb-ic {
+				font-size: 60upx;
+				font-weight: bold;
+				display: inline-block;
+				vertical-align: middle;
+				height: 70upx;
+			}
+			.w-money-input {
+				display: inline-block;
+				width: 580upx;
+				height: 70upx;
+				font-size: 60upx;
+				padding-left: 20upx;
+				font-weight: bold;
+				vertical-align: middle;
+				padding-top: 6rpx;
+			}
+		}
+	}
+	.w-tip {
+		font-size: 24upx;
+		padding: 20upx 0 50upx;
+	}
+	.w-btn {
+		margin: 0 auto;
+		width: 660upx;
+		line-height: 70upx;
+		height: 70upx;
+		color: #666;
+		text-align: center;
+		font-size: 28upx;
+		border-radius: 70upx;
+		background-color: #eee;
+	}
+	.w-btn-on {
+		color: #fff;
+		background-color: #fe582e;
+	}
+}
+.pay-pop-view {
+	background-color: #ffffff;
+	border-top-left-radius: 12upx;
+	border-top-right-radius: 12upx;
+	padding-bottom: 40upx;
+	font-size: 28upx;
+	.pay-sel-title {
+		padding: 0 30upx;
+		line-height: 88upx;
+		font-weight: bold;
+		font-size: 32upx;
+		.ibonfont {
+			color: #999;
+			font-weight: 400;
+			width: 50rpx;
+			text-align: center;
+			font-size: 24rpx;
+		}
+	}
+	.pay-btn {
+		width: 690upx;
+		height: 80upx;
+		line-height: 80upx;
+		color: #fff;
+		font-size: 32upx;
+		text-align: center;
+		margin: 20upx auto 0;
+		border-radius: 80upx;
+	}
+	.pay-ul {
+		.pay-tip {
+			font-size: 24upx;
+			color: #999999;
+			line-height: 32upx;
+			padding: 20upx 30upx 0;
+		}
+		.pay-li {
+			line-height: 100upx;
+
+			.ibonfont {
+				padding-left: 30upx;
+				font-size: 46upx;
+				vertical-align: middle;
+				margin-right: 24upx;
+			}
+			.ibonweixinzhifu {
+				color: #04be02;
+			}
+			.ibonumidd17 {
+				color: #108ee9;
+			}
+			.ibonyinhangqia {
+				color: #f2b844;
+			}
+			.pay-name {
+				width: 650upx;
+				display: inline-block;
+				padding-right: 30upx;
+				vertical-align: middle;
+				border-bottom: 1px solid #f5f5f5;
+				.ibonxuanze,
+				.ibonxuanze_xuanzhong {
+					margin-right: 0;
+					padding-left: 0;
+					font-size: 38upx;
+				}
+			}
+		}
+		.pay-li:last-child {
+			.pay-name {
+				border-bottom: 0 none;
+			}
+		}
+	}
+}
+</style>

+ 100 - 0
pagesT/NewAgent/balance_detail.vue

@@ -0,0 +1,100 @@
+<template>
+	<view :class="['qn-page-' + theme]">
+		<view class="detail-ul">
+			<view class="detail-li" v-for="(item, index) in listData" :key="index">
+				<view class="ellipsis title">{{ item.title }}</view>
+				<view class="time">{{ $u.timeFormat(item.time, 'yyyy-mm-dd hh:MM:ss') }}</view>
+				<view class="money">
+					<text>{{ item.type === 1 ? '+' : '' }}{{ item.type === -1 ? '-' : '' }}</text>
+					<text>¥{{ item.money }}</text>
+				</view>
+			</view>
+			<!-- 空白页 -->
+			<Aempty text="暂无数据" src="https://onlineimg.qianniao.vip/list.png" v-if="listData.length === 0"></Aempty>
+			<u-loadmore v-else :status="load_status" />
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			load_status: 'nomore',
+			page: 1,
+			pageSize: 10,
+			total: 0,
+			listData: []
+		};
+	},
+	computed: {
+		userId() {
+			return this.$store.state.userStatus.id;
+		}
+	},
+	onLoad() {
+		this.getData();
+	},
+	onPullDownRefresh() {
+		this.page = 1;
+		this.getData();
+	},
+	onReachBottom() {
+		if (this.total / this.pageSize > this.page) {
+			this.page += 1;
+			this.getData();
+		}
+	},
+	methods: {
+		getData(){
+			var that = this;
+			let post={page: this.page,pageSize: this.pageSize}
+			this.load_status = 'loading';
+			this.$u.api.getAgentBalanceDetail(post).then(res=>{
+				uni.stopPullDownRefresh();
+				if (that.page === 1) {
+					that.listData = res.data.data;
+				} else {
+					that.listData = that.listData.concat(res.data.data);
+				}
+				that.total = res.data.total;
+				that.load_status = that.$_utils.loadStatus(that.page, that.pageSize, that.total);
+			}).catch(err=>{
+				uni.stopPullDownRefresh();
+				that.load_status = 'nomore';
+			})
+		},
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+.detail-ul {
+	.detail-li {
+		width: 710rpx;
+		margin: 20rpx auto;
+		background-color: #ffffff;
+		border-radius: 16rpx;
+		padding: 24rpx;
+		position: relative;
+		.title {
+			font-weight: bold;
+			padding-bottom: 12rpx;
+			-webkit-line-clamp: 2;
+		}
+		.time {
+			font-size: 24rpx;
+			color: #6c6c6c;
+		}
+		.money {
+			font-weight: bold;
+			font-family: DIN-Medium;
+			position: absolute;
+			right: 24rpx;
+			top: 50%;
+			transform: translateY(-50%);
+			color: $price-color;
+		}
+	}
+}
+</style>

+ 157 - 0
pagesT/NewAgent/cash_detail.vue

@@ -0,0 +1,157 @@
+<template>
+	<!-- 提现明细 -->
+	<view class="IncomeDetails">
+		<view class="navbar">
+			<view v-for="(item, index) in tabData" :key="index" class="nav-item" :class="{ current: tabIndex === index }" @click="tabChange(index)">
+				{{ item.title }}
+				<view class="current-line"></view>
+			</view>
+		</view>
+		<scroll-view class="income-ul" @scrolltolower="scrollBootom" scroll-y="true" style="height:100%">
+			<view class="income-li clearfix" @click="goPage('/pagesT/NewAgent/cash_info?id=' + item.id)" v-for="(item, index) in listData" :key="index">
+				<view class="float_left income-label">
+					<view class="income-label-text">提现到{{item.bank_type}}</view>
+					<view class="income-time">{{ $_utils.formatDate(item.time) }}</view>
+				</view>
+				<view class="float_right">
+					<view class="income-money">
+						<text style="margin-left: 6upx;">{{ item.money }}</text>
+					</view>
+					<view class="status-text">
+						{{ item.status === 1 ? '打款成功' : item.status === -1 ? '审核驳回' : item.status === 0 ? '处理中' : '' }}
+					</view>
+				</view>
+			</view>
+			<u-loadmore margin-top="20" v-if="listData.length" :status="loading_status" />
+		</scroll-view>
+
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			isLoding: false,
+			loading_status: 'loadmore',
+			tabData:[
+				{title:"全部",status:"all"},
+				{title:"处理中",status:"wait"},
+				{title:"已打款",status:"ok"},
+				{title:"已驳回",status:"no"},
+			],
+			tabIndex:0,
+			listData:[],
+			page: 1,
+			pageSize: 10,
+			
+		};
+	},
+	onLoad() {
+		
+	},
+	onShow() {
+		this.getData();
+	},
+	methods: {
+		scrollBootom() {
+			if (this.pageTotal / this.pageSize > this.page) {
+				this.page += 1;
+				this.getData();
+			}
+		},
+		tabChange(index) {
+			this.tabIndex = index;
+			this.page = 1;
+			this.getData();
+		},
+		getData(){
+			var that = this;
+			let post={page: this.page,pageSize: this.pageSize,status:this.tabData[this.tabIndex].status}
+			this.load_status = 'loading';
+			this.$u.api.getAgentCashApplyList(post).then(res=>{
+				uni.stopPullDownRefresh();
+				console.log(res);
+				if (that.page === 1) {
+					that.listData = res.data.data;
+				} else {
+					that.listData = that.listData.concat(res.data.data);
+				}
+				that.total = res.data.total;
+				that.load_status = that.$_utils.loadStatus(that.page, that.pageSize, that.total);
+			}).catch(err=>{
+				uni.stopPullDownRefresh();
+				that.load_status = 'nomore';
+			})
+		},
+	}
+};
+</script>
+
+<style lang="scss">
+.income-ul {
+	.income-li {
+		background-color: #FFFFFF;
+		padding: 20upx;
+		border-bottom: 1upx solid #f5f5f5;
+		.income-label {
+			.income-time {
+				font-size: 24upx;
+				color: #999;
+				padding-top: 10upx;
+			}
+		}
+		.float_right {
+			text-align: right;
+			.income-money {
+				color: #333;
+				font-size: 32upx;
+				font-weight: bold;
+			}
+			.status-text {
+				font-size: 24upx;
+				padding-top: 10upx;
+				color: #fd463e;
+			}
+		}
+	}
+}
+
+.navbar {
+	display: flex;
+	height: 88upx;
+	background: #fff;
+	position: relative;
+	z-index: 10;
+	border-bottom: 1upx solid #eee;
+
+	.nav-item {
+		flex: 1;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		height: 100%;
+		font-size: 28upx;
+		color: #666666;
+		position: relative;
+		font-weight: 300;
+
+		&.current {
+			font-weight: 500;
+			font-size: 32upx;
+			color: #fd463e;
+			.current-line {
+				content: '';
+				position: absolute;
+				left: 50%;
+				bottom: 10upx;
+				transform: translateX(-50%);
+				width: 40upx;
+				height: 6upx;
+				background: #fd463e;
+				border-radius: 6upx;
+			}
+		}
+	}
+}
+</style>

+ 185 - 0
pagesT/NewAgent/cash_info.vue

@@ -0,0 +1,185 @@
+<template>
+	<!-- 提现详情 -->
+	<view class="application">
+		<view class="application_e">
+			<text class="num">{{ data.money || 0 }}</text>
+			<text class="examine">
+				{{ data.status === 1 ? '打款成功' : data.status === -1 ? '审核驳回' : data.status === 0 ? '处理中' : '' }}
+			</text>
+		</view>
+		<view class="application_t">
+			<view class="application_type">
+				<text class="application_txt">提现类型</text>
+				<view style="float: right;">
+					<!-- <text class="ibonfont ibonweixinzhifu application_img" v-if="data.type === 1"></text>
+					<text class="ibonfont application_img ibonumidd17" v-if="data.type === 2"></text>
+					<text class="ibonfont application_img ibonhuodaofukuan" v-if="data.type === 3"></text> -->
+					<text class="application_name">{{ data.bank_type || ""}}</text>
+				</view>
+			</view>
+			<view style="margin:30upx 0 0 60upx;">
+				<u-time-line>
+					<u-time-line-item node-top="2">
+						<template v-slot:node>
+							<view class="u-node" style="background:#19be6b">
+								<u-icon name="checkbox-mark" color="#fff" :size="24"></u-icon>
+							</view>
+						</template>
+						<template v-slot:content>
+							<view class="u-line-box" style="color:#333">
+								<view class="u-order-desc">申请时间</view>
+								<view class="u-order-time">{{ $_utils.formatDate(data.time) }}</view>
+							</view>
+						</template>
+					</u-time-line-item>
+					<u-time-line-item node-top="2">
+						<template v-slot:node>
+							<view class="u-node" :style="{ background: [1, -1].includes(data.status) ? '#19be6b' : '#d0d0d0' }">
+								<u-icon name="checkbox-mark" color="#fff" :size="24"></u-icon>
+							</view>
+						</template>
+						<template v-slot:content>
+							<view class="u-line-box" :style="{ color: [1, -1].includes(data.status) ? '#333' : '#999999' }">
+								<view class="u-order-desc">处理时间</view>
+								<view class="u-order-time" v-if="data.audit_time">{{ $_utils.formatDate(data.audit_time) }}</view>
+							</view>
+						</template>
+					</u-time-line-item>
+					<u-time-line-item node-top="2">
+						<template v-slot:node>
+							<view class="u-node" :style="{ background: [1, -1].includes(data.status) ? '#19be6b' : '#d0d0d0' }">
+								<u-icon name="checkbox-mark" color="#fff" :size="24"></u-icon>
+							</view>
+						</template>
+						<template v-slot:content>
+							<view class="u-line-box" :style="{ color: [1, -1].includes(data.status) ? '#333' : '#999999' }">
+								<view class="u-order-desc" v-if="data.status===1">完成打款</view>
+								<view class="u-order-desc" v-if="data.status===-1" style="color:red">审核驳回:{{data.audit_mono?data.audit_mono:""}}</view>
+								<view class="u-order-time" v-if="data.audit_time">{{ $_utils.formatDate(data.audit_time) }}</view>
+							</view>
+						</template>
+					</u-time-line-item>
+				</u-time-line>
+			</view>
+		</view>
+
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			id: 0,
+			isLoding: false,
+			data: {}
+		};
+	},
+	onLoad(options) {
+		this.id = options.id;
+	},
+	onShow() {
+		this.getAgentApplyCashInfo();
+	},
+	methods: {
+		getAgentApplyCashInfo() {
+			this.$u.api.getAgentApplyCashInfo({id:this.id}).then(res=>{
+				this.data = res.data;
+			})
+
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+body {
+	background-color: $page-color-base;
+}
+
+.application {
+	.application_e {
+		text-align: center;
+		height: 300upx;
+		background-color: #ffffff;
+
+		.num {
+			font-weight: bold;
+			font-size: 80upx;
+			display: block;
+			padding-top: 80upx;
+		}
+
+		.examine {
+			color: #fd463e;
+			font-size: 30upx;
+			padding-top: 40upx;
+			display: block;
+		}
+	}
+
+	.application_t {
+		margin-top: 20upx;
+		background-color: #ffffff;
+		height: 400upx;
+
+		.application_type {
+			height: 80upx;
+			line-height: 80upx;
+			border-bottom: 1px solid $page-color-base;
+			font-size: 28upx;
+
+			.application_txt {
+				font-size: 26upx;
+				padding-left: 20upx;
+				float: left;
+			}
+
+			.application_img {
+				margin-right: 10upx;
+				font-size: 46;
+				vertical-align: middle;
+			}
+			.ibonweixinzhifu {
+				color: #04be02;
+			}
+			.ibonumidd17 {
+				color: #108ee9;
+			}
+			.ibonhuodaofukuan {
+				color: #f2b844;
+			}
+			.application_name {
+				margin-right: 20upx;
+			}
+		}
+
+		.u-node {
+			width: 44rpx;
+			height: 44rpx;
+			border-radius: 100rpx;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			background: #d0d0d0;
+		}
+		.u-line-box {
+			color: #999999;
+			position: relative;
+		}
+		.u-order-desc {
+			font-size: 28rpx;
+			margin-bottom: 26rpx;
+		}
+
+		.u-order-time {
+			font-size: 26rpx;
+			float: right;
+			margin-right: 20upx;
+			position: absolute;
+			top: 10upx;
+			right: 20upx;
+		}
+	}
+}
+</style>

+ 210 - 0
pagesT/NewAgent/commission_detail.vue

@@ -0,0 +1,210 @@
+<template>
+	<view class="MyGroup">
+<!-- 		<view class="top-view">
+			<view class="grade-ul" v-if="tabData.length">
+				<view class="grade-li" @click="tabChange(index)" :class="[tabIndex === index ? 'grade-on' : '']" v-for="(item, index) in tabData" :key="index">
+					{{ item.title }}
+					<view class="ibonfont ibonxiangshangjiantou top-jt-icon" v-if="tabIndex === index"></view>
+				</view>
+			</view>
+		</view> -->
+
+		<scroll-view @scrolltolower="scrollBootom" scroll-y="true" :style="style" class="group-ul">
+			<view class="group-li" v-for="(item, index) in listData" :key="index">
+				<view class="user-avator-view"><image class="user-avator" :src="item.logo" mode="aspectFill"></image></view>
+				<view class="user-info clearfix">
+					<view class="user-info-left float_left">
+						<view class="user-name ellipsis">{{ item.name }}</view>
+						<view class="user-time">{{item.title}}:¥{{ item.commission || 0 }}</view>
+					</view>
+					<view class="user-info-right float_right">
+						<view class="user-time" style="padding-top: 0;">{{ $_utils.formatDate(item.time) }}</view>
+						<view class="user-time">{{item.type===1?"收益":"采购金额"}}:¥{{ item.calcMoney || 0 }}</view>
+					</view>
+				</view>
+			</view>
+			<u-loadmore margin-top="20" v-if="listData.length" :status="loading_status" />
+		</scroll-view>
+
+	</view>
+</template>
+
+<script>
+
+export default {
+	computed: {
+		style() {
+			const systemInfo = uni.getSystemInfoSync();
+			return `height: calc(100vh - ${systemInfo.statusBarHeight + 171}px)`;
+
+		},
+	},
+	data() {
+		return {
+			loading_status: 'loadmore',
+			isLogin: false,
+			tabData:[
+				{type:0,title:"子级用户消费",code:"consume"},
+				{type:1,title:"子级合伙人收益",code:"income"}
+			],
+			tabIndex:0,
+			listData:[],
+			page: 1,
+			pageSize: 10,
+			pageTotal: 0,
+		};
+	},
+	onLoad(options) {
+		uni.setNavigationBarColor({
+			frontColor: '#ffffff',
+			backgroundColor: '#fe582e'
+		});
+	},
+	onShow() {
+		this.getData();
+	},
+	methods: {
+		getData(){
+			var that = this;
+			let post={page: this.page,pageSize: this.pageSize,code:this.tabData[this.tabIndex].code}
+			this.load_status = 'loading';
+			this.$u.api.getAgentDetail(post).then(res=>{
+				uni.stopPullDownRefresh();
+				if (that.page === 1) {
+					that.listData = res.data.data;
+				} else {
+					that.listData = that.listData.concat(res.data.data);
+				}
+				that.total = res.data.total;
+				that.load_status = that.$_utils.loadStatus(that.page, that.pageSize, that.total);
+			}).catch(err=>{
+				uni.stopPullDownRefresh();
+				that.load_status = 'nomore';
+			})
+		},
+		scrollBootom() {
+			if (this.pageTotal / this.pageSize > this.page) {
+				this.page += 1;
+				this.getData();
+			}
+		},
+		tabChange(index) {
+			this.tabIndex = index;
+			this.page = 1;
+			this.getData();
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.top-view {
+	color: #ffffff;
+	background-color: #fe582e;
+
+	.num-ul {
+		padding: 40upx 0;
+		display: flex;
+		.num-li {
+			flex: 2;
+			text-align: center;
+			.num-li-tit {
+				font-size: 24upx;
+			}
+			.num-li-num {
+				font-size: 40upx;
+				padding-top: 30upx;
+			}
+		}
+		.num-li-line {
+			width: 1upx;
+			height: 56upx;
+			background-color: #fff;
+			opacity: 0.5;
+			transform: translateY(70upx);
+		}
+	}
+	.grade-ul {
+		background-color: rgba($color: #ffffff, $alpha: 0.2);
+		font-size: 28upx;
+		display: flex;
+		color: rgba($color: #ffffff, $alpha: 0.7);
+		.grade-li {
+			flex: 2;
+			text-align: center;
+			line-height: 90upx;
+			position: relative;
+			.top-jt-icon {
+				position: absolute;
+				bottom: -10upx;
+				left: 50%;
+				transform: translateX(-50%);
+				display: block;
+				height: 30upx;
+				line-height: 30upx;
+				font-size: 32upx;
+				color: rgba($color: #ffffff, $alpha: 1);
+			}
+		}
+		.grade-on {
+			color: rgba($color: #ffffff, $alpha: 1);
+			font-size: 32upx;
+		}
+	}
+}
+.total-view {
+	line-height: 90upx;
+	color: #3d404d;
+	background-color: #fff1f0;
+	font-size: 24upx;
+	.total-left {
+		.left-num {
+			padding: 0 24upx;
+			display: inline-block;
+		}
+		.line-num {
+			display: inline-block;
+			width: 2upx;
+			height: 28upx;
+			background-color: #fff;
+		}
+	}
+}
+.group-ul {
+	.group-li {
+		padding: 20upx;
+		background-color: #fff;
+		border-radius: 8upx;
+		.user-avator-view {
+			display: inline-block;
+			padding-right: 20upx;
+			.user-avator {
+				display: block;
+				width: 100upx;
+				height: 100upx;
+				border-radius: 100%;
+			}
+		}
+		.user-info {
+			border-bottom: 1upx solid #f4f4f4;
+			width: 588upx;
+			display: inline-block;
+			padding-bottom: 20upx;
+			.user-name{
+				width: 310rpx;
+				-webkit-line-clamp:1;
+				height: 40rpx;
+				line-height: 40rpx;
+			}
+			.user-time {
+				color: #999;
+				font-size: 24upx;
+				padding-top: 10upx;
+			}
+			.user-info-right {
+				text-align: right;
+			}
+		}
+	}
+}
+</style>

+ 241 - 0
pagesT/NewAgent/index.vue

@@ -0,0 +1,241 @@
+<template>
+	<view class="Distribution">
+		<view class="top-view">
+
+			<view class="cash-out clearfix">
+				<view class="float_left">
+					<view class="cash-tit">{{ '可提现佣金' }}(元)</view>
+					<view class="cash-num">{{ dataInfo.balance || 0 }}</view>
+				</view>
+				<view class="float_right" @click="goPage('/pagesT/NewAgent/apply_cash?balance=' + (dataInfo.balance || 0) + '&id=' + dataInfo.id)">
+					<view class="cash-btn">{{ '提现' }}</view>
+				</view>
+			</view>
+			
+			
+			
+			<view class="money-num">
+				<view class="money-num-li">
+					<text>{{ '累计佣金' }}</text>
+					<view class="money-num-text">
+						<text class="rmb-icon">¥</text>
+						{{ dataInfo.totalMoney || 0 }}
+					</view>
+				</view>
+				<view class="money-num-li">
+					<text>{{ '已提现佣金' }}</text>
+					<view class="money-num-text">
+						<text class="rmb-icon">¥</text>
+						{{ dataInfo.withdraw || 0 }}
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="handel-ul">
+			<view class="handel-li clearfix" @click="goPage('/pagesT/NewAgent/commission_detail?id=' + dataInfo.id)">
+				<view class="float_left icon-left-view"><text class="ibonfont ibondingdan icon-left" style="color:#f46248"></text></view>
+				<view class="float_left clearfix handel-right">
+					<text class="float_left">{{ '分佣记录' }}</text>
+					<view class="float_right handel-right-r">
+						<text>{{ dataInfo.detailCount || 0 }}笔</text>
+						<text class="ibonfont ibonjinru"></text>
+					</view>
+				</view>
+			</view>
+			<view class="handel-li clearfix" @click="goPage('/pagesT/NewAgent/balance_detail?id=' + dataInfo.id)">
+				<view class="float_left icon-left-view"><text class="ibonfont ibondianshang icon-left" style="color:#fed261"></text></view>
+				<view class="float_left clearfix handel-right">
+					<text class="float_left">{{'余额明细' }}</text>
+					<view class="float_right handel-right-r"><text class="ibonfont ibonjinru"></text></view>
+				</view>
+			</view>
+			<view class="handel-li clearfix" @click="goPage('/pagesT/NewAgent/cash_detail?id=' + dataInfo.id)">
+				<view class="float_left icon-left-view"><text class="ibonfont ibontixian icon-left" style="color:#46c09b"></text></view>
+				<view class="float_left clearfix handel-right">
+					<text class="float_left">{{'提现记录' }}</text>
+					<view class="float_right handel-right-r"><text class="ibonfont ibonjinru"></text></view>
+				</view>
+			</view>
+
+		</view>
+
+	</view>
+</template>
+
+<script>
+import { getAvator } from '@/access/common.js';
+export default {
+	data() {
+		return {
+			isLoding: false,
+			text_set: {},
+			avator: '',
+			dataInfo: {
+				
+			}
+		};
+	},
+	onShareAppMessage() {
+		// return {
+		// 	title: this.$store.state.baseSet.shop,
+		// 	path: '/pages/index/index?businessmanId=' + this.$store.state.userStatus.id,
+		// 	imageUrl: this.$store.state.baseSet.images,
+		// 	success: res => {
+		// 		console.log(res);
+		// 	}
+		// };
+		return {
+			title: this.$store.state.baseSet.shop,
+			path: '/pages/index/index',
+			// imageUrl: this.$store.state.baseSet.images,
+			success: res => {
+				console.log(res);
+			}
+		};
+	},
+	// 下拉刷新
+	onPullDownRefresh() {
+		this.getAgentInfo();
+	},
+	onLoad() {
+		uni.setNavigationBarColor({frontColor: '#ffffff',backgroundColor: '#fe582e'});
+	},
+	onShow() {
+		this.getAgentInfo();
+	},
+	methods: {
+		getAgentInfo(){
+			var that = this;
+			this.$u.api.getAgentData().then(res=>{
+				uni.stopPullDownRefresh();
+				if(res.data && res.data.id>0){
+					that.dataInfo = res.data;
+				}
+			});
+		},
+		
+	}
+};
+</script>
+
+<style lang="scss">
+body {
+	background: $page-color-base;
+}
+.top-view {
+	color: #ffffff;
+	background-color: #fe582e;
+	.lever-view {
+		padding: 30upx 24upx;
+		.lever-view-left {
+			font-size: 22upx;
+			font-weight: bold;
+			line-height: 38upx;
+			height: 42upx;
+			padding-right: 16upx;
+			border-radius: 22upx;
+			background-color: rgba($color: #ffffff, $alpha: 0.3);
+			text {
+				transform: translateY(4upx);
+				display: inline-block;
+			}
+			.user-avator {
+				margin-right: 8upx;
+				width: 42upx;
+				height: 42upx;
+				border-radius: 100%;
+				vertical-align: middle;
+				transform: translateY(-2upx);
+			}
+		}
+		.ew-code {
+			line-height: 36upx;
+			height: 36upx;
+			opacity: 0.5;
+			.ibonerweima-copy {
+				font-size: 48upx;
+			}
+		}
+	}
+	.cash-out {
+		padding: 0 24upx 30upx;
+		.cash-tit {
+			font-size: 24upx;
+		}
+		.cash-num {
+			font-size: 60upx;
+			font-weight: bold;
+			padding-top: 20upx;
+		}
+		.cash-btn {
+			margin-top: 76upx;
+			font-size: 24upx;
+			width: 146upx;
+			height: 46upx;
+			line-height: 46upx;
+			text-align: center;
+			background-color: #ffffff;
+			border-radius: 40upx;
+			color: #fe582e;
+		}
+	}
+	.money-num {
+		background-color: #f03b28;
+		display: flex;
+		padding: 34upx 0;
+		.money-num-li {
+			flex: 2;
+			font-size: 24upx;
+			padding-left: 24upx;
+			&:first-child {
+				border-right: 1px solid rgba($color: #ffffff, $alpha: 0.3);
+			}
+
+			.money-num-text {
+				font-size: 32upx;
+				margin-left: 16upx;
+				display: inline-block;
+				transform: translateY(4upx);
+				.rmb-icon {
+					font-size: 24upx;
+					margin-right: 6upx;
+				}
+			}
+		}
+	}
+}
+.handel-ul {
+	.handel-li {
+		background-color: #ffffff;
+		padding-left: 20upx;
+		line-height: 100upx;
+		font-size: 28upx;
+		.icon-left-view {
+			line-height: 100upx;
+			height: 100upx;
+			.icon-left {
+				font-size: 36upx;
+				margin-right: 30upx;
+			}
+		}
+
+		.handel-right {
+			width: 660upx;
+			border-bottom: 1px solid #f5f5f5;
+			.handel-right-r {
+				color: #999999;
+				padding-right: 20upx;
+				.ibonjinru {
+					font-size: 28upx;
+					margin-left: 20upx;
+				}
+			}
+		}
+		&:last-child {
+			.handel-right {
+				border-bottom: 0 none;
+			}
+		}
+	}
+}
+</style>

+ 466 - 0
pagesT/NewPartner/apply_cash.vue

@@ -0,0 +1,466 @@
+<template>
+	<!-- 申请提现 -->
+	<view class="Withdrawal" :class="['qn-page-' + theme]">
+		<view class="w-view w-channel clearfix" @click="openPay">
+			<view class="float_left">转出方式</view>
+			<view class="float_right">
+				<text v-if="cashTypeIndex>-1">{{ cashType.length>0 ? cashType[cashTypeIndex].title:""}}</text>
+				<text v-else class="w-input-place">请选择</text>
+				<text class="ibonfont ibonjinru"></text>
+			</view>
+		</view>
+		<view class="w-view clearfix" v-if="cashType.length>0">
+			<view class="float_left">姓名</view>
+			<view class="float_right">
+				<input type="text" placeholder-class="w-input-place" placeholder="请输入真实姓名" class="w-input" v-model="subData.bank_name" />
+			</view>
+		</view>
+		
+		<view class="w-view clearfix" v-if="cashTypeIndex>-1 && cashType[cashTypeIndex].code == 'bank'">
+			<view class="float_left">开户银行</view>
+			<view class="float_right">
+				<input placeholder-class="w-input-place" class="w-input" placeholder="请输入开户银行" type="text" v-model="subData.bank_ad" />
+			</view>
+		</view>
+		<view class="w-view clearfix">
+			<view class="float_left">
+				{{cashTypeIndex>-1 && cashType[cashTypeIndex].code == 'bank' ? "银行卡号" : "提现账号"}}
+			</view>
+			<view class="float_right">
+				<input placeholder-class="w-input-place" class="w-input" :placeholder="cashTypeIndex>-1 && cashType[cashTypeIndex].code == 'bank' ? '请输入银行卡号' : '请输入提现账号'" type="text" v-model="subData.bank_num" />
+			</view>
+		</view>
+		<view class="w-view clearfix" v-if="cashTypeIndex>-1 && cashType[cashTypeIndex].code == 'bank'">
+			<view class="float_left">确认卡号</view>
+			<view class="float_right">
+				<input placeholder-class="w-input-place" class="w-input" placeholder="请输入确认卡号" type="number" v-model="subData.bank_num_agin" />
+			</view>
+		</view>
+
+
+		<view class="w-view w-money">
+			<view class="w-tit">
+				<text>提现金额</text>
+				<text class="w-tit-r">最少提现金额{{ min_money }}元</text>
+			</view>
+			<view class="w-money-input-view">
+				<text class="rmb-ic">¥</text>
+				<input class="w-money-input" type="number" v-model="subData.money" />
+			</view>
+		</view>
+		<view class="clearfix w-tip">
+			<view class="float_left">
+				<text>可提现:¥{{ dataInfo.balance }}</text>
+				<!-- <text>(手续费:10%)</text> -->
+			</view>
+			<view class="float_right primary-color" @click="allWitjdrawal">全部提现</view>
+		</view>
+		<view class="w-btn w-btn-on" @click="subForm">
+			<u-loading :show="isLoding"></u-loading>
+			<text style="margin-left: 10rpx;">提现</text>
+		</view>
+		<u-popup mode="bottom" v-model="payPop" :border-radius="12">
+			<view class="pay-pop-view">
+				<view class="pay-sel-title clearfix">
+					<text class="float_left">提现方式</text>
+					<text class="float_right ibonfont ibonguanbi1" @click="closePayPop"></text>
+				</view>
+				<view class="pay-ul">
+					<view class="pay-li"  v-for="(item,index) in cashType" :key="index" @click="paymentChange(index)">
+						<text class="ibonfont ibonweixinzhifu" :class="item.icon?item.icon:'ibonyinhangqia'"></text>
+						<view class="pay-name clearfix">
+							<text class="float_left">{{item.title}}</text>
+							<text class="float_right ibonfont primary-color" :class="[cashTypeIndex === index ? 'ibonxuanze_xuanzhong' : 'ibonxuanze']"></text>
+						</view>
+					</view>
+				</view>
+			</view>
+		</u-popup>
+		
+		<u-modal v-model="tip_show" content="抱歉,您未设置支付密码,无法提现余额" :show-cancel-button="true" confirm-text="立即设置" cancel-text="取消" @confirm="setPassword"></u-modal>
+		<!-- 余额支付密码弹窗 -->
+		<u-keyboard default="" ref="uKeyboard" mode="number" :mask="true" :mask-close-able="false" :dot-enabled="false"
+			v-model="pwd_show" :safe-area-inset-bottom="true" :tooltip="false" @change="balancePopChange"
+			@backspace="onBackspace">
+			<view>
+				<view class="u-text-center u-padding-20 balance-money">
+					<text>密码验证</text>
+					<view class="u-padding-10 close" data-flag="false" @tap="inputShowPop(false)">
+						<u-icon name="close" color="#333333" size="28"></u-icon>
+					</view>
+				</view>
+				<view class="u-flex u-row-center">
+					<u-message-input mode="box" :maxlength="6" :dot-fill="true" v-model="balance_pwd"
+						:disabled-keyboard="true" @finish="inputFinish"></u-message-input>
+				</view>
+				<view class="u-text-center u-padding-top-10 u-padding-bottom-20 tips">密码键盘</view>
+			</view>
+		</u-keyboard>
+		
+	</view>
+</template>
+
+<script>
+// import { getOpenid } from '@/access/common.js';
+export default {
+	data() {
+		return {
+			min_money: 1, // 最少提现
+			isLoding: false,
+			payPop: false,
+			
+			tip_show: false, // 余额支付提示
+			pwd_show: false, // 余额支付密码输入弹窗
+			balance_pwd: '', // 余额支付密码
+			
+			
+			
+			
+			cashType:[],
+			cashTypeIndex:-1,
+			dataInfo:{balance:0.00},
+			subData:{
+				money:"",
+				bank_type:"",
+				bank_name:"",
+				bank_ad:"",
+				bank_num:"",
+				bank_num_agin:"",
+			},
+			payCheckStatus:false,
+		};
+	},
+	computed: {
+		userInfo() {
+			return this.$store.state.userStatus;
+		}
+	},
+
+	onShow() {
+		this.getPartnerInfo();
+		
+	},
+	methods: {
+		subCheckPayPassword(){
+			if (this.userInfo.payPassword) {
+				//输入支付密码
+				this.inputShowPop();
+			} else {
+				this.tip_show = true;
+			}
+		},
+		// 密码弹窗显示
+		inputShowPop(flag = true) {
+			this.balance_pwd = '';
+			this.pwd_show = flag;
+		},
+		// 余额密码输入完成
+		inputFinish() {
+			// 唤起支付
+			// this.subForm();
+		},
+		// 去设置支付密码
+		setPassword() {
+			this.goPage('/pagesT/money/PayPassword');
+		},
+		//键盘退格键被点击
+		onBackspace(e) {
+			if (this.balance_pwd.length > 0) {
+				this.balance_pwd = this.balance_pwd.substring(0, this.balance_pwd.length - 1);
+			}
+		},
+		// 余额支付密码键盘按键被点击(不包含退格键被点击)
+		balancePopChange(val) {
+			if (this.balance_pwd.length < 6) {
+				this.balance_pwd += val;
+			}
+			if (this.balance_pwd.length >= 6) {
+				// 唤起密码验证
+				this.checkPayPassword();
+			}
+		},
+		
+		// 支付密码校验
+		checkPayPassword() {
+			uni.showLoading();
+			this.$u.api.checkPayPassword({id: this.userInfo.id,payPassword: this.balance_pwd}).then(res => {
+				this.payCheckStatus = true;
+				this.inputShowPop(false);
+				this.subForm();
+			}).catch(res => {
+				this.balance_pwd = '';
+			});
+		},
+		
+
+		getPartnerCashType() {
+			var that = this;
+			this.$u.api.getPartnerCashType().then(res=>{
+				if(res.data && res.data.length>0){
+					that.cashType = res.data;
+				}
+			})
+		},
+		getPartnerInfo(){
+			var that = this;
+			this.$u.api.getCommissionPartnerData().then(res=>{
+				if(res.data && res.data.id>0){
+					that.dataInfo = res.data;
+					that.getPartnerCashType();
+				}
+			});
+		},
+
+		
+		// 申请提现
+		subForm() {
+			var postData = this.subData,that = this;
+			if(!this.payCheckStatus){
+				that.subCheckPayPassword();
+				return;
+			}
+			
+			
+			if(this.isLoding==true){
+				return false;
+			}
+			if(this.cashTypeIndex<0 || this.cashType.length<=0){
+				this.$api.msg('请选择提现方式');
+				return;
+			}
+			postData.bank_type = this.cashType[this.cashTypeIndex].title || "";
+			if(!this.$_utils.isDefine(postData.bank_type)){
+				this.$api.msg('请选择提现方式');
+				return;
+			}
+			if(!this.$_utils.isDefine(postData.bank_name)){
+				this.$api.msg('请输入您的真实姓名');
+				return;
+			}
+			var code = this.cashType[this.cashTypeIndex].code;
+			if(this.cashType[this.cashTypeIndex].code == "bank"){
+				if(!this.$_utils.isDefine(postData.bank_ad)){
+					this.$api.msg('请输入您的开户行');
+					return;
+				}
+				if(!this.$_utils.isDefine(postData.bank_num)){
+					this.$api.msg('请输入您的银行卡号');
+					return;
+				}
+				if(!this.$_utils.isDefine(postData.bank_num_agin)){
+					this.$api.msg('请再次输入您的银行卡号');
+					return;
+				}
+				if(postData.bank_num!=postData.bank_num_agin){
+					this.$api.msg('两次卡号输入不一致');
+					return;
+				}
+			}else{
+				if(!this.$_utils.isDefine(postData.bank_num)){
+					this.$api.msg('请输入您的提现账号');
+					return;
+				}
+				if(code=="wxpay" && !this.$_utils.isMobile(postData.bank_num)){
+					this.$api.msg('请输入正确微信手机账号');
+					return;
+				}
+				postData.bank_ad = this.cashType[this.cashTypeIndex].title;
+			}
+			if(!this.$_utils.isMoney(postData.money)){
+				this.$api.msg('请输入正确的提现金额');
+				return;
+			}
+			if (Number(postData.money) < this.min_money) {
+				this.$api.msg('最低提现金额为' + this.min_money + '元');
+				return;
+			}
+			if (Number(postData.money) > Number(this.dataInfo.balance)) {
+				this.$api.msg('可提现金额不足');
+				return;
+			}
+			
+			this.isLoding = true;
+			this.$u.api.partnerCashApply(postData).then(res => {
+				that.isLoding = false;
+				if(res.errorcode==0){
+					that.$api.msg("提现成功");
+					setTimeout(res => {
+						that.goPage('/pages/user/user', 'switchTab');
+					}, 1500);
+				}else{
+					that.$api.msg(res.data);
+				}
+			}).catch(res => {
+				that.isLoding = false;
+			});
+		},
+		// 全部提现按钮点击事件
+		allWitjdrawal() {
+			this.subData.money = this.dataInfo.balance;
+		},
+		// 自动提现
+		paymentChange(index) {
+			this.cashTypeIndex = index;
+			this.closePayPop();
+		},
+		closePayPop() {
+			this.payPop = false;
+			this.cash_out_form.reflectInfo.account = '';
+			this.cash_out_form.reflectInfo.bankName = '';
+		},
+		openPay() {
+			this.payPop = true;
+		},
+	}
+};
+</script>
+
+<style lang="scss">
+.Withdrawal {
+	width: 702upx;
+	margin: 20upx auto;
+	padding: 0 24upx 50upx;
+	background-color: #ffffff;
+	font-size: 28upx;
+	.w-view {
+		border-bottom: 1px solid #f5f5f5;
+		padding: 24upx 0;
+		.ibonjinru {
+			font-size: 28upx;
+			color: #666;
+			height: 32upx;
+			margin-left: 10upx;
+		}
+		.w-input {
+			width: 480rpx;
+		}
+		.w-input-place {
+			color: #b0b3bf;
+			font-size: 26upx;
+		}
+		.w-tit {
+			.w-tit-r {
+				margin-left: 10upx;
+				font-size: 24upx;
+				color: #b0b3bf;
+			}
+		}
+	}
+	.w-money {
+		.w-money-input-view {
+			padding-top: 40upx;
+			.rmb-ic {
+				font-size: 60upx;
+				font-weight: bold;
+				display: inline-block;
+				vertical-align: middle;
+				height: 70upx;
+			}
+			.w-money-input {
+				display: inline-block;
+				width: 580upx;
+				height: 70upx;
+				font-size: 60upx;
+				padding-left: 20upx;
+				font-weight: bold;
+				vertical-align: middle;
+				padding-top: 6rpx;
+			}
+		}
+	}
+	.w-tip {
+		font-size: 24upx;
+		padding: 20upx 0 50upx;
+	}
+	.w-btn {
+		margin: 0 auto;
+		width: 660upx;
+		line-height: 70upx;
+		height: 70upx;
+		color: #666;
+		text-align: center;
+		font-size: 28upx;
+		border-radius: 70upx;
+		background-color: #eee;
+	}
+	.w-btn-on {
+		color: #fff;
+		background-color: #fe582e;
+	}
+}
+.pay-pop-view {
+	background-color: #ffffff;
+	border-top-left-radius: 12upx;
+	border-top-right-radius: 12upx;
+	padding-bottom: 40upx;
+	font-size: 28upx;
+	.pay-sel-title {
+		padding: 0 30upx;
+		line-height: 88upx;
+		font-weight: bold;
+		font-size: 32upx;
+		.ibonfont {
+			color: #999;
+			font-weight: 400;
+			width: 50rpx;
+			text-align: center;
+			font-size: 24rpx;
+		}
+	}
+	.pay-btn {
+		width: 690upx;
+		height: 80upx;
+		line-height: 80upx;
+		color: #fff;
+		font-size: 32upx;
+		text-align: center;
+		margin: 20upx auto 0;
+		border-radius: 80upx;
+	}
+	.pay-ul {
+		.pay-tip {
+			font-size: 24upx;
+			color: #999999;
+			line-height: 32upx;
+			padding: 20upx 30upx 0;
+		}
+		.pay-li {
+			line-height: 100upx;
+
+			.ibonfont {
+				padding-left: 30upx;
+				font-size: 46upx;
+				vertical-align: middle;
+				margin-right: 24upx;
+			}
+			.ibonweixinzhifu {
+				color: #04be02;
+			}
+			.ibonumidd17 {
+				color: #108ee9;
+			}
+			.ibonyinhangqia {
+				color: #f2b844;
+			}
+			.pay-name {
+				width: 650upx;
+				display: inline-block;
+				padding-right: 30upx;
+				vertical-align: middle;
+				border-bottom: 1px solid #f5f5f5;
+				.ibonxuanze,
+				.ibonxuanze_xuanzhong {
+					margin-right: 0;
+					padding-left: 0;
+					font-size: 38upx;
+				}
+			}
+		}
+		.pay-li:last-child {
+			.pay-name {
+				border-bottom: 0 none;
+			}
+		}
+	}
+}
+</style>

+ 100 - 0
pagesT/NewPartner/balance_detail.vue

@@ -0,0 +1,100 @@
+<template>
+	<view :class="['qn-page-' + theme]">
+		<view class="detail-ul">
+			<view class="detail-li" v-for="(item, index) in listData" :key="index">
+				<view class="ellipsis title">{{ item.title }}</view>
+				<view class="time">{{ $u.timeFormat(item.time, 'yyyy-mm-dd hh:MM:ss') }}</view>
+				<view class="money">
+					<text>{{ item.type === 1 ? '+' : '' }}{{ item.type === -1 ? '-' : '' }}</text>
+					<text>¥{{ item.money }}</text>
+				</view>
+			</view>
+			<!-- 空白页 -->
+			<Aempty text="暂无数据" src="https://onlineimg.qianniao.vip/list.png" v-if="listData.length === 0"></Aempty>
+			<u-loadmore v-else :status="load_status" />
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			load_status: 'nomore',
+			page: 1,
+			pageSize: 10,
+			total: 0,
+			listData: []
+		};
+	},
+	computed: {
+		userId() {
+			return this.$store.state.userStatus.id;
+		}
+	},
+	onLoad() {
+		this.getData();
+	},
+	onPullDownRefresh() {
+		this.page = 1;
+		this.getData();
+	},
+	onReachBottom() {
+		if (this.total / this.pageSize > this.page) {
+			this.page += 1;
+			this.getData();
+		}
+	},
+	methods: {
+		getData(){
+			var that = this;
+			let post={page: this.page,pageSize: this.pageSize}
+			this.load_status = 'loading';
+			this.$u.api.getCommissionBalanceDetail(post).then(res=>{
+				uni.stopPullDownRefresh();
+				if (that.page === 1) {
+					that.listData = res.data.data;
+				} else {
+					that.listData = that.listData.concat(res.data.data);
+				}
+				that.total = res.data.total;
+				that.load_status = that.$_utils.loadStatus(that.page, that.pageSize, that.total);
+			}).catch(err=>{
+				uni.stopPullDownRefresh();
+				that.load_status = 'nomore';
+			})
+		},
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+.detail-ul {
+	.detail-li {
+		width: 710rpx;
+		margin: 20rpx auto;
+		background-color: #ffffff;
+		border-radius: 16rpx;
+		padding: 24rpx;
+		position: relative;
+		.title {
+			font-weight: bold;
+			padding-bottom: 12rpx;
+			-webkit-line-clamp: 2;
+		}
+		.time {
+			font-size: 24rpx;
+			color: #6c6c6c;
+		}
+		.money {
+			font-weight: bold;
+			font-family: DIN-Medium;
+			position: absolute;
+			right: 24rpx;
+			top: 50%;
+			transform: translateY(-50%);
+			color: $price-color;
+		}
+	}
+}
+</style>

+ 157 - 0
pagesT/NewPartner/cash_detail.vue

@@ -0,0 +1,157 @@
+<template>
+	<!-- 提现明细 -->
+	<view class="IncomeDetails">
+		<view class="navbar">
+			<view v-for="(item, index) in tabData" :key="index" class="nav-item" :class="{ current: tabIndex === index }" @click="tabChange(index)">
+				{{ item.title }}
+				<view class="current-line"></view>
+			</view>
+		</view>
+		<scroll-view class="income-ul" @scrolltolower="scrollBootom" scroll-y="true" style="height:100%">
+			<view class="income-li clearfix" @click="goPage('/pagesT/NewPartner/cash_info?id=' + item.id)" v-for="(item, index) in listData" :key="index">
+				<view class="float_left income-label">
+					<view class="income-label-text">提现到{{item.bank_type}}</view>
+					<view class="income-time">{{ $_utils.formatDate(item.time) }}</view>
+				</view>
+				<view class="float_right">
+					<view class="income-money">
+						<text style="margin-left: 6upx;">{{ item.money }}</text>
+					</view>
+					<view class="status-text">
+						{{ item.status === 1 ? '打款成功' : item.status === -1 ? '审核驳回' : item.status === 0 ? '处理中' : '' }}
+					</view>
+				</view>
+			</view>
+			<u-loadmore margin-top="20" v-if="listData.length" :status="loading_status" />
+		</scroll-view>
+
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			isLoding: false,
+			loading_status: 'loadmore',
+			tabData:[
+				{title:"全部",status:"all"},
+				{title:"处理中",status:"wait"},
+				{title:"已打款",status:"ok"},
+				{title:"已驳回",status:"no"},
+			],
+			tabIndex:0,
+			listData:[],
+			page: 1,
+			pageSize: 10,
+			
+		};
+	},
+	onLoad() {
+		
+	},
+	onShow() {
+		this.getData();
+	},
+	methods: {
+		scrollBootom() {
+			if (this.pageTotal / this.pageSize > this.page) {
+				this.page += 1;
+				this.getData();
+			}
+		},
+		tabChange(index) {
+			this.tabIndex = index;
+			this.page = 1;
+			this.getData();
+		},
+		getData(){
+			var that = this;
+			let post={page: this.page,pageSize: this.pageSize,status:this.tabData[this.tabIndex].status}
+			this.load_status = 'loading';
+			this.$u.api.getPartnerCashApplyList(post).then(res=>{
+				uni.stopPullDownRefresh();
+				console.log(res);
+				if (that.page === 1) {
+					that.listData = res.data.data;
+				} else {
+					that.listData = that.listData.concat(res.data.data);
+				}
+				that.total = res.data.total;
+				that.load_status = that.$_utils.loadStatus(that.page, that.pageSize, that.total);
+			}).catch(err=>{
+				uni.stopPullDownRefresh();
+				that.load_status = 'nomore';
+			})
+		},
+	}
+};
+</script>
+
+<style lang="scss">
+.income-ul {
+	.income-li {
+		background-color: #FFFFFF;
+		padding: 20upx;
+		border-bottom: 1upx solid #f5f5f5;
+		.income-label {
+			.income-time {
+				font-size: 24upx;
+				color: #999;
+				padding-top: 10upx;
+			}
+		}
+		.float_right {
+			text-align: right;
+			.income-money {
+				color: #333;
+				font-size: 32upx;
+				font-weight: bold;
+			}
+			.status-text {
+				font-size: 24upx;
+				padding-top: 10upx;
+				color: #fd463e;
+			}
+		}
+	}
+}
+
+.navbar {
+	display: flex;
+	height: 88upx;
+	background: #fff;
+	position: relative;
+	z-index: 10;
+	border-bottom: 1upx solid #eee;
+
+	.nav-item {
+		flex: 1;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		height: 100%;
+		font-size: 28upx;
+		color: #666666;
+		position: relative;
+		font-weight: 300;
+
+		&.current {
+			font-weight: 500;
+			font-size: 32upx;
+			color: #fd463e;
+			.current-line {
+				content: '';
+				position: absolute;
+				left: 50%;
+				bottom: 10upx;
+				transform: translateX(-50%);
+				width: 40upx;
+				height: 6upx;
+				background: #fd463e;
+				border-radius: 6upx;
+			}
+		}
+	}
+}
+</style>

+ 185 - 0
pagesT/NewPartner/cash_info.vue

@@ -0,0 +1,185 @@
+<template>
+	<!-- 提现详情 -->
+	<view class="application">
+		<view class="application_e">
+			<text class="num">{{ data.money || 0 }}</text>
+			<text class="examine">
+				{{ data.status === 1 ? '打款成功' : data.status === -1 ? '审核驳回' : data.status === 0 ? '处理中' : '' }}
+			</text>
+		</view>
+		<view class="application_t">
+			<view class="application_type">
+				<text class="application_txt">提现类型</text>
+				<view style="float: right;">
+					<!-- <text class="ibonfont ibonweixinzhifu application_img" v-if="data.type === 1"></text>
+					<text class="ibonfont application_img ibonumidd17" v-if="data.type === 2"></text>
+					<text class="ibonfont application_img ibonhuodaofukuan" v-if="data.type === 3"></text> -->
+					<text class="application_name">{{ data.bank_type || ""}}</text>
+				</view>
+			</view>
+			<view style="margin:30upx 0 0 60upx;">
+				<u-time-line>
+					<u-time-line-item node-top="2">
+						<template v-slot:node>
+							<view class="u-node" style="background:#19be6b">
+								<u-icon name="checkbox-mark" color="#fff" :size="24"></u-icon>
+							</view>
+						</template>
+						<template v-slot:content>
+							<view class="u-line-box" style="color:#333">
+								<view class="u-order-desc">申请时间</view>
+								<view class="u-order-time">{{ $_utils.formatDate(data.time) }}</view>
+							</view>
+						</template>
+					</u-time-line-item>
+					<u-time-line-item node-top="2">
+						<template v-slot:node>
+							<view class="u-node" :style="{ background: [1, -1].includes(data.status) ? '#19be6b' : '#d0d0d0' }">
+								<u-icon name="checkbox-mark" color="#fff" :size="24"></u-icon>
+							</view>
+						</template>
+						<template v-slot:content>
+							<view class="u-line-box" :style="{ color: [1, -1].includes(data.status) ? '#333' : '#999999' }">
+								<view class="u-order-desc">处理时间</view>
+								<view class="u-order-time" v-if="data.audit_time">{{ $_utils.formatDate(data.audit_time) }}</view>
+							</view>
+						</template>
+					</u-time-line-item>
+					<u-time-line-item node-top="2">
+						<template v-slot:node>
+							<view class="u-node" :style="{ background: [1, -1].includes(data.status) ? '#19be6b' : '#d0d0d0' }">
+								<u-icon name="checkbox-mark" color="#fff" :size="24"></u-icon>
+							</view>
+						</template>
+						<template v-slot:content>
+							<view class="u-line-box" :style="{ color: [1, -1].includes(data.status) ? '#333' : '#999999' }">
+								<view class="u-order-desc" v-if="data.status===1">完成打款</view>
+								<view class="u-order-desc" v-if="data.status===-1" style="color:red">审核驳回:{{data.audit_mono?data.audit_mono:""}}</view>
+								<view class="u-order-time" v-if="data.audit_time">{{ $_utils.formatDate(data.audit_time) }}</view>
+							</view>
+						</template>
+					</u-time-line-item>
+				</u-time-line>
+			</view>
+		</view>
+
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			id: 0,
+			isLoding: false,
+			data: {}
+		};
+	},
+	onLoad(options) {
+		this.id = options.id;
+	},
+	onShow() {
+		this.getPartnerApplyCashInfo();
+	},
+	methods: {
+		getPartnerApplyCashInfo() {
+			this.$u.api.getPartnerApplyCashInfo({id:this.id}).then(res=>{
+				this.data = res.data;
+			})
+
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+body {
+	background-color: $page-color-base;
+}
+
+.application {
+	.application_e {
+		text-align: center;
+		height: 300upx;
+		background-color: #ffffff;
+
+		.num {
+			font-weight: bold;
+			font-size: 80upx;
+			display: block;
+			padding-top: 80upx;
+		}
+
+		.examine {
+			color: #fd463e;
+			font-size: 30upx;
+			padding-top: 40upx;
+			display: block;
+		}
+	}
+
+	.application_t {
+		margin-top: 20upx;
+		background-color: #ffffff;
+		height: 400upx;
+
+		.application_type {
+			height: 80upx;
+			line-height: 80upx;
+			border-bottom: 1px solid $page-color-base;
+			font-size: 28upx;
+
+			.application_txt {
+				font-size: 26upx;
+				padding-left: 20upx;
+				float: left;
+			}
+
+			.application_img {
+				margin-right: 10upx;
+				font-size: 46;
+				vertical-align: middle;
+			}
+			.ibonweixinzhifu {
+				color: #04be02;
+			}
+			.ibonumidd17 {
+				color: #108ee9;
+			}
+			.ibonhuodaofukuan {
+				color: #f2b844;
+			}
+			.application_name {
+				margin-right: 20upx;
+			}
+		}
+
+		.u-node {
+			width: 44rpx;
+			height: 44rpx;
+			border-radius: 100rpx;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			background: #d0d0d0;
+		}
+		.u-line-box {
+			color: #999999;
+			position: relative;
+		}
+		.u-order-desc {
+			font-size: 28rpx;
+			margin-bottom: 26rpx;
+		}
+
+		.u-order-time {
+			font-size: 26rpx;
+			float: right;
+			margin-right: 20upx;
+			position: absolute;
+			top: 10upx;
+			right: 20upx;
+		}
+	}
+}
+</style>

+ 210 - 0
pagesT/NewPartner/commission_detail.vue

@@ -0,0 +1,210 @@
+<template>
+	<view class="MyGroup">
+		<view class="top-view">
+			<view class="grade-ul" v-if="tabData.length">
+				<view class="grade-li" @click="tabChange(index)" :class="[tabIndex === index ? 'grade-on' : '']" v-for="(item, index) in tabData" :key="index">
+					{{ item.title }}
+					<view class="ibonfont ibonxiangshangjiantou top-jt-icon" v-if="tabIndex === index"></view>
+				</view>
+			</view>
+		</view>
+
+		<scroll-view @scrolltolower="scrollBootom" scroll-y="true" :style="style" class="group-ul">
+			<view class="group-li" v-for="(item, index) in listData" :key="index">
+				<view class="user-avator-view"><image class="user-avator" :src="item.avatar" mode="aspectFill"></image></view>
+				<view class="user-info clearfix">
+					<view class="user-info-left float_left">
+						<view class="user-name ellipsis">{{ item.name }}</view>
+						<view class="user-time">{{item.title}}:¥{{ item.commission || 0 }}</view>
+					</view>
+					<view class="user-info-right float_right">
+						<view class="user-time" style="padding-top: 0;">{{ $_utils.formatDate(item.time) }}</view>
+						<view class="user-time">{{item.type===1?"收益":"消费"}}:¥{{ item.calcMoney || 0 }}</view>
+					</view>
+				</view>
+			</view>
+			<u-loadmore margin-top="20" v-if="listData.length" :status="loading_status" />
+		</scroll-view>
+
+	</view>
+</template>
+
+<script>
+
+export default {
+	computed: {
+		style() {
+			const systemInfo = uni.getSystemInfoSync();
+			return `height: calc(100vh - ${systemInfo.statusBarHeight + 171}px)`;
+
+		},
+	},
+	data() {
+		return {
+			loading_status: 'loadmore',
+			isLogin: false,
+			tabData:[
+				{type:0,title:"子级用户消费",code:"consume"},
+				{type:1,title:"子级合伙人收益",code:"income"}
+			],
+			tabIndex:0,
+			listData:[],
+			page: 1,
+			pageSize: 10,
+			pageTotal: 0,
+		};
+	},
+	onLoad(options) {
+		uni.setNavigationBarColor({
+			frontColor: '#ffffff',
+			backgroundColor: '#fe582e'
+		});
+	},
+	onShow() {
+		this.getData();
+	},
+	methods: {
+		getData(){
+			var that = this;
+			let post={page: this.page,pageSize: this.pageSize,code:this.tabData[this.tabIndex].code}
+			this.load_status = 'loading';
+			this.$u.api.getCommissionDetail(post).then(res=>{
+				uni.stopPullDownRefresh();
+				if (that.page === 1) {
+					that.listData = res.data.data;
+				} else {
+					that.listData = that.listData.concat(res.data.data);
+				}
+				that.total = res.data.total;
+				that.load_status = that.$_utils.loadStatus(that.page, that.pageSize, that.total);
+			}).catch(err=>{
+				uni.stopPullDownRefresh();
+				that.load_status = 'nomore';
+			})
+		},
+		scrollBootom() {
+			if (this.pageTotal / this.pageSize > this.page) {
+				this.page += 1;
+				this.getData();
+			}
+		},
+		tabChange(index) {
+			this.tabIndex = index;
+			this.page = 1;
+			this.getData();
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.top-view {
+	color: #ffffff;
+	background-color: #fe582e;
+
+	.num-ul {
+		padding: 40upx 0;
+		display: flex;
+		.num-li {
+			flex: 2;
+			text-align: center;
+			.num-li-tit {
+				font-size: 24upx;
+			}
+			.num-li-num {
+				font-size: 40upx;
+				padding-top: 30upx;
+			}
+		}
+		.num-li-line {
+			width: 1upx;
+			height: 56upx;
+			background-color: #fff;
+			opacity: 0.5;
+			transform: translateY(70upx);
+		}
+	}
+	.grade-ul {
+		background-color: rgba($color: #ffffff, $alpha: 0.2);
+		font-size: 28upx;
+		display: flex;
+		color: rgba($color: #ffffff, $alpha: 0.7);
+		.grade-li {
+			flex: 2;
+			text-align: center;
+			line-height: 90upx;
+			position: relative;
+			.top-jt-icon {
+				position: absolute;
+				bottom: -10upx;
+				left: 50%;
+				transform: translateX(-50%);
+				display: block;
+				height: 30upx;
+				line-height: 30upx;
+				font-size: 32upx;
+				color: rgba($color: #ffffff, $alpha: 1);
+			}
+		}
+		.grade-on {
+			color: rgba($color: #ffffff, $alpha: 1);
+			font-size: 32upx;
+		}
+	}
+}
+.total-view {
+	line-height: 90upx;
+	color: #3d404d;
+	background-color: #fff1f0;
+	font-size: 24upx;
+	.total-left {
+		.left-num {
+			padding: 0 24upx;
+			display: inline-block;
+		}
+		.line-num {
+			display: inline-block;
+			width: 2upx;
+			height: 28upx;
+			background-color: #fff;
+		}
+	}
+}
+.group-ul {
+	.group-li {
+		padding: 20upx;
+		background-color: #fff;
+		border-radius: 8upx;
+		.user-avator-view {
+			display: inline-block;
+			padding-right: 20upx;
+			.user-avator {
+				display: block;
+				width: 100upx;
+				height: 100upx;
+				border-radius: 100%;
+			}
+		}
+		.user-info {
+			border-bottom: 1upx solid #f4f4f4;
+			width: 588upx;
+			display: inline-block;
+			padding-bottom: 20upx;
+			.user-name{
+				width: 310rpx;
+				-webkit-line-clamp:1;
+				height: 40rpx;
+				line-height: 40rpx;
+			}
+			.user-time {
+				color: #999;
+				font-size: 24upx;
+				padding-top: 10upx;
+			}
+			.user-info-right {
+				text-align: right;
+			}
+		}
+	}
+}
+</style>

+ 233 - 0
pagesT/NewPartner/index.vue

@@ -0,0 +1,233 @@
+<template>
+	<view class="Distribution">
+		<view class="top-view">
+
+			<view class="cash-out clearfix">
+				<view class="float_left">
+					<view class="cash-tit">{{ '可提现佣金' }}(元)</view>
+					<view class="cash-num">{{ dataInfo.balance || 0 }}</view>
+				</view>
+				<view class="float_right" @click="goPage('/pagesT/NewPartner/apply_cash?balance=' + (dataInfo.balance || 0) + '&id=' + dataInfo.id)">
+					<view class="cash-btn">{{ '提现' }}</view>
+				</view>
+			</view>
+			
+			
+			
+			<view class="money-num">
+				<view class="money-num-li">
+					<text>{{ '累计佣金' }}</text>
+					<view class="money-num-text">
+						<text class="rmb-icon">¥</text>
+						{{ dataInfo.totalMoney || 0 }}
+					</view>
+				</view>
+				<view class="money-num-li">
+					<text>{{ '已提现佣金' }}</text>
+					<view class="money-num-text">
+						<text class="rmb-icon">¥</text>
+						{{ dataInfo.withdraw || 0 }}
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="handel-ul">
+			<view class="handel-li clearfix" @click="goPage('/pagesT/NewPartner/commission_detail?id=' + dataInfo.id)">
+				<view class="float_left icon-left-view"><text class="ibonfont ibondingdan icon-left" style="color:#f46248"></text></view>
+				<view class="float_left clearfix handel-right">
+					<text class="float_left">{{ '分佣记录' }}</text>
+					<view class="float_right handel-right-r">
+						<text>{{ dataInfo.orderNum || 0 }}笔</text>
+						<text class="ibonfont ibonjinru"></text>
+					</view>
+				</view>
+			</view>
+			<view class="handel-li clearfix" @click="goPage('/pagesT/NewPartner/balance_detail?id=' + dataInfo.id)">
+				<view class="float_left icon-left-view"><text class="ibonfont ibondianshang icon-left" style="color:#fed261"></text></view>
+				<view class="float_left clearfix handel-right">
+					<text class="float_left">{{'余额明细' }}</text>
+					<view class="float_right handel-right-r"><text class="ibonfont ibonjinru"></text></view>
+				</view>
+			</view>
+			<view class="handel-li clearfix" @click="goPage('/pagesT/NewPartner/cash_detail?id=' + dataInfo.id)">
+				<view class="float_left icon-left-view"><text class="ibonfont ibontixian icon-left" style="color:#46c09b"></text></view>
+				<view class="float_left clearfix handel-right">
+					<text class="float_left">{{'提现记录' }}</text>
+					<view class="float_right handel-right-r"><text class="ibonfont ibonjinru"></text></view>
+				</view>
+			</view>
+
+		</view>
+
+	</view>
+</template>
+
+<script>
+import { getAvator } from '@/access/common.js';
+export default {
+	data() {
+		return {
+			isLoding: false,
+			text_set: {},
+			avator: '',
+			dataInfo: {
+				
+			}
+		};
+	},
+	onShareAppMessage() {
+		return {
+			title: this.$store.state.baseSet.shop,
+			path: '/pages/index/index?businessmanId=' + this.$store.state.userStatus.id,
+			imageUrl: this.$store.state.baseSet.images,
+			success: res => {
+				console.log(res);
+			}
+		};
+	},
+	// 下拉刷新
+	onPullDownRefresh() {
+		this.getPartnerInfo();
+	},
+	onLoad() {
+		uni.setNavigationBarColor({frontColor: '#ffffff',backgroundColor: '#fe582e'});
+	},
+	onShow() {
+		this.getPartnerInfo();
+	},
+	methods: {
+		getPartnerInfo(){
+			var that = this;
+			this.$u.api.getCommissionPartnerData().then(res=>{
+				uni.stopPullDownRefresh();
+				if(res.data && res.data.id>0){
+					that.dataInfo = res.data;
+				}
+			});
+		},
+		
+	}
+};
+</script>
+
+<style lang="scss">
+body {
+	background: $page-color-base;
+}
+.top-view {
+	color: #ffffff;
+	background-color: #fe582e;
+	.lever-view {
+		padding: 30upx 24upx;
+		.lever-view-left {
+			font-size: 22upx;
+			font-weight: bold;
+			line-height: 38upx;
+			height: 42upx;
+			padding-right: 16upx;
+			border-radius: 22upx;
+			background-color: rgba($color: #ffffff, $alpha: 0.3);
+			text {
+				transform: translateY(4upx);
+				display: inline-block;
+			}
+			.user-avator {
+				margin-right: 8upx;
+				width: 42upx;
+				height: 42upx;
+				border-radius: 100%;
+				vertical-align: middle;
+				transform: translateY(-2upx);
+			}
+		}
+		.ew-code {
+			line-height: 36upx;
+			height: 36upx;
+			opacity: 0.5;
+			.ibonerweima-copy {
+				font-size: 48upx;
+			}
+		}
+	}
+	.cash-out {
+		padding: 0 24upx 30upx;
+		.cash-tit {
+			font-size: 24upx;
+		}
+		.cash-num {
+			font-size: 60upx;
+			font-weight: bold;
+			padding-top: 20upx;
+		}
+		.cash-btn {
+			margin-top: 76upx;
+			font-size: 24upx;
+			width: 146upx;
+			height: 46upx;
+			line-height: 46upx;
+			text-align: center;
+			background-color: #ffffff;
+			border-radius: 40upx;
+			color: #fe582e;
+		}
+	}
+	.money-num {
+		background-color: #f03b28;
+		display: flex;
+		padding: 34upx 0;
+		.money-num-li {
+			flex: 2;
+			font-size: 24upx;
+			padding-left: 24upx;
+			&:first-child {
+				border-right: 1px solid rgba($color: #ffffff, $alpha: 0.3);
+			}
+
+			.money-num-text {
+				font-size: 32upx;
+				margin-left: 16upx;
+				display: inline-block;
+				transform: translateY(4upx);
+				.rmb-icon {
+					font-size: 24upx;
+					margin-right: 6upx;
+				}
+			}
+		}
+	}
+}
+.handel-ul {
+	.handel-li {
+		background-color: #ffffff;
+		padding-left: 20upx;
+		line-height: 100upx;
+		font-size: 28upx;
+		.icon-left-view {
+			line-height: 100upx;
+			height: 100upx;
+			.icon-left {
+				font-size: 36upx;
+				margin-right: 30upx;
+			}
+		}
+
+		.handel-right {
+			width: 660upx;
+			border-bottom: 1px solid #f5f5f5;
+			.handel-right-r {
+				color: #999999;
+				padding-right: 20upx;
+				.ibonjinru {
+					font-size: 28upx;
+					margin-left: 20upx;
+				}
+			}
+		}
+		&:last-child {
+			.handel-right {
+				border-bottom: 0 none;
+			}
+		}
+	}
+}
+</style>

+ 61 - 0
pagesT/activity/Activity.vue

@@ -0,0 +1,61 @@
+<template>
+	<view v-if="is_data"  :class="['qn-page-' + theme]"><PageDesign :temData="temData" :pageBack="true" :isBackIndex="true"></PageDesign></view>
+</template>
+
+<script>
+import PageDesign from '@/components/PageDesign/PageDesign.vue';
+export default {
+	components: {
+		PageDesign
+	},
+	data() {
+		return {
+			temData: [],
+			is_data: false,
+			page_id: 18
+		};
+	},
+	watch:{
+		 '$store.state.locationObj'(val){
+			if(JSON.stringify(val)==='{}'){
+				this.getAuthorizeInfo();
+				return
+			}
+			this.getDetailById();
+		}
+	},
+	onLoad(options) {
+		if(JSON.stringify(this.$store.state.locationObj)==='{}'){
+			this.getAuthorizeInfo();
+			return
+		}
+		this.page_id = parseInt(options.id);
+		this.getDetailById();
+	},
+	// 下拉刷新
+	onPullDownRefresh() {
+		this.getDetailById();
+	},
+	methods: {
+		//首页
+		 getDetailById() {
+			this.$u.api.getDetailById(this.page_id).then(({data})=>{
+				uni.stopPullDownRefresh();
+				this.is_data = true;
+				this.temData = data;
+			});
+		}
+	},
+	onShareAppMessage(options) {
+		return {
+			title: this.$store.state.baseSet.shop,
+			path: '/pages/index/index?businessmanId=' + (this.$store.state.userStatus.id||''),
+			success: res => {
+				console.log(res);
+			}
+		};
+	}
+};
+</script>
+
+<style></style>

+ 175 - 0
pagesT/address/SelAddress.vue

@@ -0,0 +1,175 @@
+<template>
+	<view :class="['qn-page-' + theme]">
+		<view class="now-address">
+			<view class="a-title">当前配送至</view>
+			<view class="a-sel">
+				<text class="ibonfont ibondizhi2"></text>
+				<text>{{ now_address.provinceName || '' }}-{{ now_address.cityName || '' }}-{{ now_address.districtName || '' }}</text>
+			</view>
+		</view>
+		<view class="address-view">
+			<view class="a-title">从我的收货地址选择</view>
+			<ul class="address-ul">
+				<li class="address-li" v-for="(item, index) in addressList" :key="index" @click="selAddress(item)">
+					<view class="user-info clearfix">
+						<text class="float_left">{{ item.name }}</text>
+						<text class="float_right">{{ item.mobile }}</text>
+					</view>
+					<view class="address-de">
+						<text v-if="item.defaultStatus === 5" class="default-tag">[默认地址]</text>
+						{{ item.area.provinceName }} {{ item.area.cityName }} {{ item.area.districtName }} {{ item.address }}
+					</view>
+				</li>
+			</ul>
+		</view>
+		<view class="fixed-bottom">
+			<RegionSel @pickerRegionChange="pickerRegionChange">
+				<view class="bottom-btn">选择其他地区</view>
+			</RegionSel>
+		</view>
+	</view>
+</template>
+
+<script>
+import RegionSel from '../components/region/RegionSel.vue';
+export default {
+	components: {
+		RegionSel
+	},
+	data() {
+		return {
+			now_address: {},
+			addressList: [],
+			pageTotal: 0,
+			page: 1,
+			pageSize: 10,
+			loading_status: 'loadmore'
+		};
+	},
+	onLoad(options) {
+		this.now_address = JSON.parse(options.address_data);
+		this.getAllShippingAddress();
+	},
+	onPullDownRefresh() {
+		if (this.pageTotal / this.pageSize > this.page) {
+			this.page += 1;
+			this.getAllShippingAddress();
+		}
+	},
+	methods: {
+		pickerRegionChange(row) {
+			this.now_address = {
+				provinceCode: row[0].value,
+				cityCode: row[1].value || '',
+				districtCode: row[2].value || '',
+				provinceName: row[0].label || '',
+				cityName: row[1].label || '',
+				districtName: row[2].label || ''
+			};
+			this.$api.prePage().now_sel_address = this.now_address;
+			uni.navigateBack();
+		},
+		selAddress(row) {
+			this.now_address = {
+				provinceCode: row.provinceCode,
+				cityCode: row.cityCode,
+				districtCode: row.districtCode,
+				provinceName: row.area.provinceName,
+				cityName: row.area.cityName,
+				districtName: row.area.districtName
+			};
+			this.$api.prePage().now_sel_address = this.now_address;
+			uni.navigateBack();
+		},
+		// 获取客户地址列表 getAllShippingAddress
+		getAllShippingAddress() {
+			this.loading_status = 'more';
+			this.$u.api.getAllShippingAddress({
+				page: this.page,
+				pageSize: this.pageSize
+			}).then(data=>{
+				this.loading_status = 'noMore';
+				uni.stopPullDownRefresh();
+				if (this.page === 1) {
+					this.addressList = data.data;
+				} else {
+					this.addressList = this.addressList.concat(data.data);
+				}
+				if (this.addressList.length) {
+					if(!this.now_address.provinceCode){
+						const address = this.addressList.find(item => item.defaultStatus === 5) || this.addressList[0];
+						this.now_address = {
+							provinceCode: address.provinceCode,
+							cityCode: address.cityCode,
+							districtCode: address.districtCode,
+							provinceName: address.area.provinceName,
+							cityName: address.area.cityName,
+							districtName: address.area.districtName
+						};
+					}
+				}
+				this.pageTotal = data.pageTotal;
+			});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+body,
+pages {
+	background-color: #f7f7f7;
+}
+.a-title {
+	font-size: 24upx;
+	color: #999999;
+	line-height: 66upx;
+	padding: 0 24upx;
+}
+.now-address {
+	.a-sel {
+		background-color: #ffffff;
+		line-height: 80upx;
+		padding: 0 24upx;
+		.ibonfont {
+			font-size: 28upx;
+			color: #666666;
+			margin-right: 20upx;
+		}
+	}
+}
+.address-view {
+	.address-ul {
+		.address-li {
+			background-color: #ffffff;
+			padding: 20upx 24upx;
+			border-bottom: 1px solid #f7f7f7;
+			.user-info {
+				font-size: 28upx;
+				padding-bottom: 10upx;
+			}
+			.address-de {
+				font-size: 24upx;
+				.default-tag {
+					margin-right: 10upx;
+				}
+			}
+		}
+	}
+}
+.fixed-bottom {
+	position: fixed;
+	bottom: 30upx;
+	left: 0;
+	width: 100%;
+}
+.bottom-btn {
+	width: 680upx;
+	line-height: 78upx;
+	font-size: 28upx;
+	border-radius: 8upx;
+	text-align: center;
+	color: #ffffff;
+	margin: 0 auto;
+}
+</style>

+ 286 - 0
pagesT/address/address.vue

@@ -0,0 +1,286 @@
+<template>
+	<view class="content" :class="['qn-page-' + theme]">
+		<!-- 空白页 -->
+		<Aempty text="您还没有收货地址哦~~" src="https://onlineimg.qianniao.vip/address.png" v-if="addressList.length === 0"></Aempty>
+		<!-- #ifdef MP-WEIXIN -->
+		<!-- <view class="get-WX-Address clearfix" @click="chooseWxAddress">
+			<text class="ibonfont ibonweixin"></text>
+			<text>获取微信收货地址</text>
+			<text class="ibonfont ibonjinru float_right"></text>
+		</view> -->
+		<!-- #endif -->
+		<view @scrolltolower="lower" v-for="(item, index) in addressList" :key="index" class="address-item">
+			<view class="list-item-in clearfix" @click="checkAddress(item)">
+				<view class="wrapper float_left">
+					<view class="u-box">
+						<text>收货人:</text>
+						<text class="name">{{ item.name }}</text>
+						<text class="mobile">{{ item.mobile }}</text>
+					</view>
+					<view class="address-box ">
+						<text class="address">收货地址:{{ item.area.provinceName }}{{ item.area.cityName }}{{ item.area.districtName }}{{ item.address }}</text>
+					</view>
+				</view>
+			</view>
+			<view class="ad-bottom-view clearfix">
+				<view class="float_left" @click="editAddress(item)">
+					<text class="icon-del ibonfont" :class="[item.defaultStatus===5?'ibonxuanze1 primary-color':'ibonweixuanze']"></text>
+					设为默认
+				</view>
+				<view class="float_right">
+					<view style="margin-right: 40rpx;display: inline-block" @click="addAddress(item.id)">
+						<text class="ibonfont ibonbianji icon-del"></text>
+						编辑
+					</view>
+					<view @click="delData(item.id)" style="display: inline-block">
+						<text class="ibonfont ibonshanchu icon-del"></text>
+						删除
+					</view>
+				</view>
+			</view>
+		</view>
+		<u-loadmore margin-top="20" v-if="addressList.length" :status="loading_status" />
+		<button class="add-btn primary-bg" @click="addAddress('add')">新增地址</button>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			pageTotal: 0,
+			pageSize: 10,
+			page: 1,
+			loading_status: 'loadmore',
+			source: 0,
+			isLoding: false,
+			addressList: [],
+			options: [
+				{
+					text: '删除',
+					style: {
+						backgroundColor: 'rgb(255,58,49)'
+					}
+				}
+			]
+		};
+	},
+	onLoad(option) {
+		this.source = option.source;
+	},
+	onShow() {
+		this.getAllShippingAddress();
+	},
+	onPullDownRefresh() {
+		if (this.pageTotal / this.pageSize > this.page) {
+			this.page += 1;
+			this.getAllShippingAddress();
+		}
+	},
+	methods: {
+		chooseWxAddress() {
+			uni.chooseAddress({
+				success(res) {
+					console.log(res);
+				}
+			});
+		},
+		// 设为默认
+		editAddress(item) {
+			this.$u.api
+				.updateShippingAddress(item.id, {
+					name: item.name,
+					mobile: item.mobile,
+					provinceCode: item.provinceCode,
+					cityCode: item.cityCode,
+					districtCode: item.districtCode,
+					address: item.address,
+					defaultStatus: 5
+				})
+				.then(res => {
+					this.getAllShippingAddress();
+				});
+		},
+		// 点击按钮
+		delData(id) {
+			uni.showModal({
+				title: '提示',
+				content: '你确定删除地址',
+				success: () => {
+					this.$u.api.deleteShippingAddress(id).then(res => {
+						uni.showToast({
+							title: '删除成功',
+							icon: 'none'
+						});
+						this.getAllShippingAddress();
+					});
+				}
+			});
+		},
+		//选择地址
+		checkAddress(item) {
+			if (parseInt(this.source) === 1) {
+				this.$api.prePage().addressData = item;
+				uni.navigateBack();
+			}
+		},
+		addAddress(type, item) {
+			uni.navigateTo({
+				url: `/pagesT/address/addressManage?type=${type}&data=${JSON.stringify(item)}`
+			});
+		},
+		// 获取客户地址列表 getAllShippingAddress
+		getAllShippingAddress() {
+			this.loading_status = 'loading';
+			this.$u.api
+				.getAllShippingAddress({
+					page: this.page,
+					pageSize: 10
+				})
+				.then(data => {
+					uni.stopPullDownRefresh();
+					if (this.page === 1) {
+						this.addressList = data.data;
+					} else {
+						this.addressList = this.addressList.concat(data.data);
+					}
+					const address = data.data.find(item => item.defaultStatus === 5) || this.addressList[0];
+					const addressData = {
+						provinceCode: address.provinceCode,
+						cityCode: address.cityCode,
+						districtCode: address.districtCode,
+						provinceName: address.area.provinceName,
+						cityName: address.area.cityName,
+						districtName: address.area.districtName
+					};
+					this.$store.commit('commit_nowAddress', addressData);
+					this.pageTotal = data.pageTotal;
+					this.loading_status =  this.$_utils.loadStatus(this.page, this.pageSize, this.pageTotal);
+				});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+page {
+	padding-bottom: 120upx;
+	background: #fafafa;
+}
+
+.content {
+	position: relative;
+}
+.no-select {
+	display: inline-block;
+	width: 34upx;
+	height: 34upx;
+	border-radius: 100%;
+	border: 1px solid #999;
+}
+.list {
+	display: flex;
+	align-items: center;
+	background: #fff;
+	position: relative;
+}
+
+.address-box {
+	font-size: 26upx;
+	color: #666;
+	font-weight: 300;
+}
+
+.u-box {
+	font-size: 28upx;
+	color: $font-color-dark;
+	padding-bottom: 10upx;
+
+	.name {
+		margin-right: 30upx;
+	}
+}
+
+.address-item {
+	width: 702upx;
+	margin: 20upx auto;
+	background: #ffffff;
+	padding: 28upx 24upx;
+	border-radius: 8upx;
+	box-shadow: 0px 0px 20upx 0px #eee;
+	/*margin-bottom: 20upx;*/
+
+	.ad-bottom-view {
+		font-size: 24upx;
+		font-weight: 300;
+		padding-top: 20upx;
+
+		.icon-del {
+			width: 26upx;
+			height: 26upx;
+			font-size: 26upx;
+			line-height: 26upx;
+			margin-right: 10upx;
+			transform: translateY(4upx);
+		}
+		.ibonfont{
+			font-size: 28rpx;
+		}
+	}
+
+	.list-item-in {
+		padding-bottom: 20upx;
+		border-bottom: 1upx solid #f5f5f5;
+	}
+}
+
+.icon-bianji {
+	display: flex;
+	align-items: center;
+	height: 80upx;
+	font-size: 40upx;
+	color: $font-color-light;
+	padding-left: 30upx;
+}
+
+.add-btn {
+	position: fixed;
+	left: 30upx;
+	right: 30upx;
+	bottom: 16upx;
+	z-index: 95;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	width: 690upx;
+	height: 80upx;
+	font-size: 32upx;
+	color: #fff;
+	// background: $base-btn-bg;
+	// box-shadow: 0px 2upx 14upx 0px rgba(116, 190, 66, 0.4);
+	border-radius: 10upx;
+}
+
+.add-btn:after {
+	border: 0 none;
+}
+.get-WX-Address {
+	line-height: 88upx;
+	height: 88upx;
+	width: 702upx;
+	box-shadow: 0px 0px 20rpx 0px #eee;
+	margin: 20upx auto 0;
+	background-color: #ffffff;
+	padding: 0 24rpx;
+	border-radius: 8upx;
+	.ibonweixin {
+		font-size: 40upx;
+		color: #04be02;
+		margin-right: 10upx;
+	}
+	.ibonjinru {
+		color: #999;
+		font-size: 26upx;
+	}
+}
+</style>

+ 274 - 0
pagesT/address/addressManage.vue

@@ -0,0 +1,274 @@
+<template>
+	<view :class="['qn-page-' + theme]" class="content">
+		<view class="row b-b">
+			<text class="tit">联系人</text>
+			<input class="input" type="text" v-model="addressData.name" placeholder="收货人姓名" placeholder-class="placeholder" />
+		</view>
+		<view class="row b-b">
+			<text class="tit">手机号</text>
+			<!-- #ifdef MP -->
+			<input class="input" type="number" @input="mobileInput" :value="addressData.mobile" placeholder="收货人手机号码" placeholder-class="placeholder" />
+			<!-- #endif -->
+			<!-- #ifdef APP-PLUS -->
+			<input class="input" type="number" v-model="addressData.mobile" placeholder="收货人手机号码" placeholder-class="placeholder" />
+			<!-- #endif -->
+		</view>
+		<!-- <view class="row b-b">
+			<text class="tit">地址</text>
+			<text @click="chooseLocation" class="input">
+				{{addressData.addressName}}
+			</text>
+			<text class="yticon icon-shouhuodizhi"></text>
+		</view> -->
+
+		<RegionSel @getRegionName="getRegionName" @pickerRegionChange="pickerRegionChange" :provinceCode="provinceCode" :cityCode="cityCode" :districtCode="districtCode">
+			<view class="row b-b clearfix" style="border-bottom:1rpx solid #E4E7ED;">
+				<view class="tit float_left">地址</view>
+				<view class="float_right">
+					<span v-if="region_name" style="font-size: 28rpx;">{{ region_name }}</span>
+					<span v-else style="color: #999;font-size: 28rpx;">请选择</span>
+				</view>
+			</view>
+		</RegionSel>
+		<view class="row b-b">
+			<text class="tit">门牌号</text>
+			<input class="input" type="button" v-model="addressData.address" placeholder="楼号、门牌" placeholder-class="placeholder" />
+		</view>
+
+		<view class="row default-row">
+			<text class="tit">设为默认</text>
+			<switch :checked="defaule" color="#45A418" @change="switchChange" />
+		</view>
+
+		<button class="add-btn primary-bg" @click="confirm">提交</button>
+	</view>
+</template>
+
+<script>
+import RegionSel from '../components/region/RegionSel.vue';
+export default {
+	components: {
+		RegionSel
+	},
+	data() {
+		return {
+			provinceCode: 0,
+			cityCode: 0,
+			districtCode: 0,
+			region_name: '',
+			// 地址部分
+			height: '500px',
+			address: [],
+			defaule: false,
+			// 修改地址的id
+			coustrom_id: '',
+			manageType: '', //路由地址
+			addressData: {
+				name: '',
+				mobile: '',
+				defaultStatus: 4,
+				provinceCode: '',
+				cityCode: '',
+				districtCode: '',
+				addressName: '',
+				address: '',
+				area: ''
+			}
+		};
+	},
+	onLoad(option) {
+		// 获取当前是增加页面还是编辑
+		this.manageType = option.type;
+		if (this.manageType != 'add') {
+			this.coustrom_id = this.manageType;
+			this.getShippingAddressInfo();
+			uni.setNavigationBarTitle({
+				title: '修改地址'
+			});
+		} else {
+			uni.setNavigationBarTitle({
+				title: '新增地址'
+			});
+		}
+	},
+	methods: {
+		mobileInput(e) {
+			// #ifdef MP
+			let val = e.detail.value;
+			if (val.length === 3 || val.length === 8) {
+				val += ' ';
+			}
+			this.$nextTick(() => {
+				this.addressData.mobile = val;
+			});
+			// #endif
+		},
+		switchChange(val) {
+			// 添加地址传
+			this.defaule = val.detail.value;
+			if (this.defaule) {
+				this.addressData.defaultStatus = 5;
+			} else {
+				this.addressData.defaultStatus = 4;
+			}
+		},
+		getRegionName(name) {
+			this.region_name = name;
+		},
+		pickerRegionChange(row) {
+			this.addressData.provinceCode = row[0].value;
+			this.addressData.cityCode = row[1].value || '';
+			this.addressData.districtCode = row[2].value || '';
+			this.region_name = row[0].label + (row[1].label ? '-' + row[1].label + (row[2].label ? '-' + row[2].label : '') : '');
+		},
+		// 点击提交Annie
+		confirm() {
+			if (this.coustrom_id) {
+				this.updateShippingAddress();
+			} else {
+				this.addShippingAddress();
+			}
+		},
+		//添加
+		addShippingAddress() {
+			if (!this.addressData.name) {
+				this.$api.msg('请填写收货人姓名');
+				return;
+			}
+			const mobile = this.$_utils.mobileRe(this.addressData.mobile);
+			if (!/(^1[3|4|5|6|7|8|9][0-9]{9}$)/.test(mobile)) {
+				this.$api.msg('请输入正确的手机号码');
+				return;
+			}
+			if (!this.addressData.address) {
+				this.$api.msg('请填写门牌号信息');
+				return;
+			}
+			// 发送请求
+
+			this.$u.api
+				.addShippingAddress({
+					...this.addressData,
+					mobile: mobile,
+					defaultStatus: this.defaule ? 5 : 4
+				})
+				.then(res => {
+					this.$api.msg('添加成功');
+					setTimeout(function() {
+						uni.navigateBack();
+					}, 800);
+				});
+		},
+		// 获取地址的详情
+		getShippingAddressInfo() {
+			this.$u.api.getShippingAddressInfo(this.coustrom_id).then(data => {
+				this.addressData = data.data;
+				this.addressData.mobile = this.$_utils.mobileFormat(data.data.mobile);
+				this.provinceCode = this.addressData.provinceCode;
+				this.cityCode = this.addressData.cityCode;
+				this.districtCode = this.addressData.districtCode;
+				// 获取地址显示页面
+				this.defaule = data.data.defaultStatus === 5;
+			});
+		},
+		// 修改地址
+		updateShippingAddress() {
+			if (!this.addressData.name) {
+				this.$api.msg('请填写收货人姓名');
+				return;
+			}
+			const mobile = this.$_utils.mobileRe(this.addressData.mobile);
+			if (!/(^1[3|4|5|7|8][0-9]{9}$)/.test(mobile)) {
+				this.$api.msg('请输入正确的手机号码');
+				return;
+			}
+			// if(!addressData.addressName){
+			// 	this.$api.msg('请选择所在位置');
+			// 	return;
+			// }
+			if (!this.addressData.address) {
+				this.$api.msg('请填写门牌号信息');
+				return;
+			}
+
+			this.$u.api
+				.updateShippingAddress(this.coustrom_id, {
+					name: this.addressData.name,
+					mobile: mobile,
+					provinceCode: this.addressData.provinceCode,
+					cityCode: this.addressData.cityCode,
+					districtCode: this.addressData.districtCode,
+					address: this.addressData.address,
+					defaultStatus: this.addressData.defaultStatus
+				})
+				.then(res => {
+					this.$api.msg('修改成功');
+					setTimeout(function() {
+						uni.navigateBack();
+					}, 800);
+				});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+page {
+	background: $page-color-base;
+	padding-top: 16upx;
+}
+
+.row {
+	display: flex;
+	align-items: center;
+	position: relative;
+	padding: 0 30upx;
+	height: 110upx;
+	background: #fff;
+
+	.tit {
+		flex-shrink: 0;
+		width: 120upx;
+		font-size: 30upx;
+		color: $font-color-dark;
+	}
+
+	.input {
+		flex: 1;
+		font-size: 30upx;
+		color: $font-color-dark;
+	}
+
+	.icon-shouhuodizhi {
+		font-size: 36upx;
+		color: $font-color-light;
+	}
+}
+
+.default-row {
+	margin-top: 16upx;
+
+	.tit {
+		flex: 1;
+	}
+
+	switch {
+		transform: translateX(16upx) scale(0.9);
+	}
+}
+
+.add-btn {
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	width: 690upx;
+	height: 80upx;
+	margin: 60upx auto;
+	font-size: $font-lg;
+	color: #fff;
+	border-radius: 10upx;
+}
+.add-btn:after {
+	border: 0 none;
+}
+</style>

Some files were not shown because too many files changed in this diff