feat: 添加分销功能并优化订单和支付流程

此次提交主要实现了以下功能:
1. 添加了分销功能,包括分销员申请、佣金计算和分享功能。
2. 优化了订单和支付流程,增加了订单退款状态的处理。
3. 修改了发票申请逻辑,增加了用户发票信息检查。
4. 更新了商品展示页面,支持特殊套餐的展示和购买。
5. 修复了多个页面的样式问题和功能缺陷。

这些改动旨在提升用户体验,支持分销业务,并优化现有功能的稳定性和性能。
This commit is contained in:
yindongqi 2025-04-21 11:08:15 +08:00
parent a93999c041
commit 0540292497
23 changed files with 1673 additions and 1047 deletions

View File

@ -27,3 +27,10 @@ export function getInvoiceApplicationDetail(id) {
export function getUserInvoiceInfo(id) {
return api.get(`/invoiceapplication/get?id=${id}`, {}, { login: false })
}
/**
* 判断用户是否已经填写开发票所需信息
*/
export function checkUserInvoiceInfo() {
return api.get(`/invoiceapplication/check-info`,{ login: false })
}

View File

@ -5,6 +5,7 @@
* @Description:
*/
import util from '@/utils'
import shareConfig from '@/utils/share.js'
import App from './App'
@ -16,6 +17,7 @@ export function createApp() {
const app = createSSRApp(App)
app.use(util)
app.use(createPinia())
app.mixin(shareConfig)
return {
app,
}

View File

@ -1,6 +1,6 @@
{
"name" : "yshop-miniapp",
"appid" : "__UNI__800DD11",
"name" : "aiyushantp-miniapp",
"appid" : "__UNI__6588C0E",
"description" : "",
"versionName" : "1.0.0",
"versionCode" : 1,

645
package-lock.json generated
View File

@ -10,6 +10,7 @@
"license": "ISC",
"dependencies": {
"@vant/area-data": "^1.5.0",
"@vue/server-renderer": "^3.5.13",
"add": "^2.0.6",
"flyio": "^0.6.14",
"jweixin-module": "^1.6.0",
@ -25,7 +26,6 @@
"resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
"integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=6.9.0"
}
@ -35,7 +35,6 @@
"resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
"integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=6.9.0"
}
@ -45,7 +44,6 @@
"resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.27.0.tgz",
"integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==",
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/types": "^7.27.0"
},
@ -61,7 +59,6 @@
"resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.27.0.tgz",
"integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==",
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/helper-string-parser": "^7.25.9",
"@babel/helper-validator-identifier": "^7.25.9"
@ -100,7 +97,6 @@
"resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.13.tgz",
"integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==",
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/parser": "^7.25.3",
"@vue/shared": "3.5.13",
@ -113,15 +109,13 @@
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
"license": "MIT",
"peer": true
"license": "MIT"
},
"node_modules/@vue/compiler-dom": {
"version": "3.5.13",
"resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz",
"integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==",
"license": "MIT",
"peer": true,
"dependencies": {
"@vue/compiler-core": "3.5.13",
"@vue/shared": "3.5.13"
@ -157,7 +151,6 @@
"resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz",
"integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==",
"license": "MIT",
"peer": true,
"dependencies": {
"@vue/compiler-dom": "3.5.13",
"@vue/shared": "3.5.13"
@ -207,8 +200,6 @@
"version": "3.5.13",
"resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.13.tgz",
"integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==",
"license": "MIT",
"peer": true,
"dependencies": {
"@vue/compiler-ssr": "3.5.13",
"@vue/shared": "3.5.13"
@ -346,7 +337,6 @@
"resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
"license": "BSD-2-Clause",
"peer": true,
"engines": {
"node": ">=0.12"
},
@ -698,7 +688,6 @@
"resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"license": "BSD-3-Clause",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
@ -881,20 +870,17 @@
"@babel/helper-string-parser": {
"version": "7.25.9",
"resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
"integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
"peer": true
"integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="
},
"@babel/helper-validator-identifier": {
"version": "7.25.9",
"resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
"integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
"peer": true
"integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="
},
"@babel/parser": {
"version": "7.27.0",
"resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.27.0.tgz",
"integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==",
"peer": true,
"requires": {
"@babel/types": "^7.27.0"
}
@ -903,7 +889,6 @@
"version": "7.27.0",
"resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.27.0.tgz",
"integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==",
"peer": true,
"requires": {
"@babel/helper-string-parser": "^7.25.9",
"@babel/helper-validator-identifier": "^7.25.9"
@ -935,7 +920,6 @@
"version": "3.5.13",
"resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.13.tgz",
"integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==",
"peer": true,
"requires": {
"@babel/parser": "^7.25.3",
"@vue/shared": "3.5.13",
@ -947,8 +931,7 @@
"estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
"peer": true
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
}
}
},
@ -956,7 +939,6 @@
"version": "3.5.13",
"resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz",
"integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==",
"peer": true,
"requires": {
"@vue/compiler-core": "3.5.13",
"@vue/shared": "3.5.13"
@ -991,7 +973,6 @@
"version": "3.5.13",
"resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz",
"integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==",
"peer": true,
"requires": {
"@vue/compiler-dom": "3.5.13",
"@vue/shared": "3.5.13"
@ -1037,7 +1018,6 @@
"version": "3.5.13",
"resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.13.tgz",
"integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==",
"peer": true,
"requires": {
"@vue/compiler-ssr": "3.5.13",
"@vue/shared": "3.5.13"
@ -1149,8 +1129,7 @@
"entities": {
"version": "4.5.0",
"resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
"peer": true
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="
},
"extend": {
"version": "3.0.2",
@ -1392,8 +1371,7 @@
"source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"peer": true
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="
},
"sshpk": {
"version": "1.17.0",
@ -1506,11 +1484,11 @@
"version": "file:",
"requires": {
"@vant/area-data": "^1.5.0",
"@vue/server-renderer": "*",
"add": "^2.0.6",
"flyio": "^0.6.14",
"jweixin-module": "^1.6.0",
"pinia": "^2.1.6",
"pinia-plugin-persistedstate": "^4.2.0",
"vant": "^4.6.2",
"weixin-js-sdk": "^1.6.3",
"yarn": "^1.22.19",
@ -1520,20 +1498,17 @@
"@babel/helper-string-parser": {
"version": "7.25.9",
"resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
"integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
"peer": true
"integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="
},
"@babel/helper-validator-identifier": {
"version": "7.25.9",
"resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
"integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
"peer": true
"integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="
},
"@babel/parser": {
"version": "7.27.0",
"resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.27.0.tgz",
"integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==",
"peer": true,
"requires": {
"@babel/types": "^7.27.0"
}
@ -1542,7 +1517,6 @@
"version": "7.27.0",
"resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.27.0.tgz",
"integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==",
"peer": true,
"requires": {
"@babel/helper-string-parser": "^7.25.9",
"@babel/helper-validator-identifier": "^7.25.9"
@ -1551,69 +1525,8 @@
"@jridgewell/sourcemap-codec": {
"version": "1.5.0",
"resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
},
"@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
"requires": {
"@nodelib/fs.stat": "2.0.5",
"run-parallel": "^1.1.9"
}
},
"@nodelib/fs.stat": {
"version": "2.0.5",
"resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="
},
"@nodelib/fs.walk": {
"version": "1.2.8",
"resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
"requires": {
"@nodelib/fs.scandir": "2.1.5",
"fastq": "^1.6.0"
}
},
"@nuxt/kit": {
"version": "3.16.2",
"resolved": "https://registry.npmmirror.com/@nuxt/kit/-/kit-3.16.2.tgz",
"integrity": "sha512-K1SAUo2vweTfudKZzjKsZ5YJoxPLTspR5qz5+G61xtZreLpsdpDYfBseqsIAl5VFLJuszeRpWQ01jP9LfQ6Ksw==",
"requires": {
"c12": "^3.0.2",
"consola": "^3.4.2",
"defu": "^6.1.4",
"destr": "^2.0.3",
"errx": "^0.1.0",
"exsolve": "^1.0.4",
"globby": "^14.1.0",
"ignore": "^7.0.3",
"jiti": "^2.4.2",
"klona": "^2.0.6",
"knitwork": "^1.2.0",
"mlly": "^1.7.4",
"ohash": "^2.0.11",
"pathe": "^2.0.3",
"pkg-types": "^2.1.0",
"scule": "^1.3.0",
"semver": "^7.7.1",
"std-env": "^3.8.1",
"ufo": "^1.5.4",
"unctx": "^2.4.1",
"unimport": "^4.1.3",
"untyped": "^2.0.0"
}
},
"@sindresorhus/merge-streams": {
"version": "2.3.0",
"resolved": "https://registry.npmmirror.com/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz",
"integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg=="
},
"@types/estree": {
"version": "1.0.7",
"resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.7.tgz",
"integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
"peer": true
},
"@vant/area-data": {
"version": "1.5.0",
@ -1635,7 +1548,6 @@
"version": "3.5.13",
"resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.13.tgz",
"integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==",
"peer": true,
"requires": {
"@babel/parser": "^7.25.3",
"@vue/shared": "3.5.13",
@ -1647,8 +1559,7 @@
"estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
"peer": true
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
}
}
},
@ -1656,7 +1567,6 @@
"version": "3.5.13",
"resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz",
"integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==",
"peer": true,
"requires": {
"@vue/compiler-core": "3.5.13",
"@vue/shared": "3.5.13"
@ -1691,7 +1601,6 @@
"version": "3.5.13",
"resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz",
"integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==",
"peer": true,
"requires": {
"@vue/compiler-dom": "3.5.13",
"@vue/shared": "3.5.13"
@ -1737,7 +1646,6 @@
"version": "3.5.13",
"resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.13.tgz",
"integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==",
"peer": true,
"requires": {
"@vue/compiler-ssr": "3.5.13",
"@vue/shared": "3.5.13"
@ -1748,11 +1656,6 @@
"resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.13.tgz",
"integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="
},
"acorn": {
"version": "8.14.1",
"resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.1.tgz",
"integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="
},
"add": {
"version": "2.0.6",
"resolved": "https://registry.npmmirror.com/add/-/add-2.0.6.tgz",
@ -1805,54 +1708,11 @@
"tweetnacl": "^0.14.3"
}
},
"braces": {
"version": "3.0.3",
"resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"requires": {
"fill-range": "^7.1.1"
}
},
"c12": {
"version": "3.0.3",
"resolved": "https://registry.npmmirror.com/c12/-/c12-3.0.3.tgz",
"integrity": "sha512-uC3MacKBb0Z15o5QWCHvHWj5Zv34pGQj9P+iXKSpTuSGFS0KKhUWf4t9AJ+gWjYOdmWCPEGpEzm8sS0iqbpo1w==",
"requires": {
"chokidar": "^4.0.3",
"confbox": "^0.2.2",
"defu": "^6.1.4",
"dotenv": "^16.4.7",
"exsolve": "^1.0.4",
"giget": "^2.0.0",
"jiti": "^2.4.2",
"ohash": "^2.0.11",
"pathe": "^2.0.3",
"perfect-debounce": "^1.0.0",
"pkg-types": "^2.1.0",
"rc9": "^2.1.2"
}
},
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
},
"chokidar": {
"version": "4.0.3",
"resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz",
"integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
"requires": {
"readdirp": "^4.0.1"
}
},
"citty": {
"version": "0.1.6",
"resolved": "https://registry.npmmirror.com/citty/-/citty-0.1.6.tgz",
"integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==",
"requires": {
"consola": "^3.2.3"
}
},
"combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
@ -1861,16 +1721,6 @@
"delayed-stream": "~1.0.0"
}
},
"confbox": {
"version": "0.2.2",
"resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.2.tgz",
"integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="
},
"consola": {
"version": "3.4.2",
"resolved": "https://registry.npmmirror.com/consola/-/consola-3.4.2.tgz",
"integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="
},
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz",
@ -1890,31 +1740,11 @@
"assert-plus": "^1.0.0"
}
},
"deep-pick-omit": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/deep-pick-omit/-/deep-pick-omit-1.2.1.tgz",
"integrity": "sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw=="
},
"defu": {
"version": "6.1.4",
"resolved": "https://registry.npmmirror.com/defu/-/defu-6.1.4.tgz",
"integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
},
"destr": {
"version": "2.0.5",
"resolved": "https://registry.npmmirror.com/destr/-/destr-2.0.5.tgz",
"integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="
},
"dotenv": {
"version": "16.4.7",
"resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.4.7.tgz",
"integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="
},
"ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
@ -1927,31 +1757,7 @@
"entities": {
"version": "4.5.0",
"resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
"peer": true
},
"errx": {
"version": "0.1.0",
"resolved": "https://registry.npmmirror.com/errx/-/errx-0.1.0.tgz",
"integrity": "sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q=="
},
"escape-string-regexp": {
"version": "5.0.0",
"resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
"integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="
},
"estree-walker": {
"version": "3.0.3",
"resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz",
"integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
"requires": {
"@types/estree": "^1.0.0"
}
},
"exsolve": {
"version": "1.0.4",
"resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.4.tgz",
"integrity": "sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw=="
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="
},
"extend": {
"version": "3.0.2",
@ -1968,39 +1774,11 @@
"resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
"fast-glob": {
"version": "3.3.3",
"resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz",
"integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
"requires": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
"glob-parent": "^5.1.2",
"merge2": "^1.3.0",
"micromatch": "^4.0.8"
}
},
"fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
},
"fastq": {
"version": "1.19.1",
"resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz",
"integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
"requires": {
"reusify": "^1.0.4"
}
},
"fill-range": {
"version": "7.1.1",
"resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"requires": {
"to-regex-range": "^5.0.1"
}
},
"flyio": {
"version": "0.6.14",
"resolved": "https://registry.npmmirror.com/flyio/-/flyio-0.6.14.tgz",
@ -2032,40 +1810,6 @@
"assert-plus": "^1.0.0"
}
},
"giget": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/giget/-/giget-2.0.0.tgz",
"integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==",
"requires": {
"citty": "^0.1.6",
"consola": "^3.4.0",
"defu": "^6.1.4",
"node-fetch-native": "^1.6.6",
"nypm": "^0.6.0",
"pathe": "^2.0.3"
}
},
"glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"requires": {
"is-glob": "^4.0.1"
}
},
"globby": {
"version": "14.1.0",
"resolved": "https://registry.npmmirror.com/globby/-/globby-14.1.0.tgz",
"integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==",
"requires": {
"@sindresorhus/merge-streams": "^2.1.0",
"fast-glob": "^3.3.3",
"ignore": "^7.0.3",
"path-type": "^6.0.0",
"slash": "^5.1.0",
"unicorn-magic": "^0.3.0"
}
},
"har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/har-schema/-/har-schema-2.0.0.tgz",
@ -2090,29 +1834,6 @@
"sshpk": "^1.7.0"
}
},
"ignore": {
"version": "7.0.3",
"resolved": "https://registry.npmmirror.com/ignore/-/ignore-7.0.3.tgz",
"integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA=="
},
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="
},
"is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"requires": {
"is-extglob": "^2.1.1"
}
},
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
},
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz",
@ -2123,16 +1844,6 @@
"resolved": "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
},
"jiti": {
"version": "2.4.2",
"resolved": "https://registry.npmmirror.com/jiti/-/jiti-2.4.2.tgz",
"integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="
},
"js-tokens": {
"version": "9.0.1",
"resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.1.tgz",
"integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="
},
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz",
@ -2169,48 +1880,15 @@
"resolved": "https://registry.npmmirror.com/jweixin-module/-/jweixin-module-1.6.0.tgz",
"integrity": "sha512-dGk9cf+ipipHmtzYmKZs5B2toX+p4hLyllGLF6xuC8t+B05oYxd8fYoaRz0T30U2n3RUv8a4iwvjhA+OcYz52w=="
},
"klona": {
"version": "2.0.6",
"resolved": "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz",
"integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA=="
},
"knitwork": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/knitwork/-/knitwork-1.2.0.tgz",
"integrity": "sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg=="
},
"local-pkg": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.1.1.tgz",
"integrity": "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==",
"requires": {
"mlly": "^1.7.4",
"pkg-types": "^2.0.1",
"quansync": "^0.2.8"
}
},
"magic-string": {
"version": "0.30.17",
"resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz",
"integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
"peer": true,
"requires": {
"@jridgewell/sourcemap-codec": "^1.5.0"
}
},
"merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
},
"micromatch": {
"version": "4.0.8",
"resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz",
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"requires": {
"braces": "^3.0.3",
"picomatch": "^2.3.1"
}
},
"mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
@ -2224,82 +1902,17 @@
"mime-db": "1.52.0"
}
},
"mlly": {
"version": "1.7.4",
"resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.7.4.tgz",
"integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==",
"requires": {
"acorn": "^8.14.0",
"pathe": "^2.0.1",
"pkg-types": "^1.3.0",
"ufo": "^1.5.4"
},
"dependencies": {
"confbox": {
"version": "0.1.8",
"resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz",
"integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="
},
"pkg-types": {
"version": "1.3.1",
"resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz",
"integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
"requires": {
"confbox": "^0.1.8",
"mlly": "^1.7.4",
"pathe": "^2.0.1"
}
}
}
},
"nanoid": {
"version": "3.3.11",
"resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz",
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"peer": true
},
"node-fetch-native": {
"version": "1.6.6",
"resolved": "https://registry.npmmirror.com/node-fetch-native/-/node-fetch-native-1.6.6.tgz",
"integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ=="
},
"nypm": {
"version": "0.6.0",
"resolved": "https://registry.npmmirror.com/nypm/-/nypm-0.6.0.tgz",
"integrity": "sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==",
"requires": {
"citty": "^0.1.6",
"consola": "^3.4.0",
"pathe": "^2.0.3",
"pkg-types": "^2.0.0",
"tinyexec": "^0.3.2"
}
},
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmmirror.com/oauth-sign/-/oauth-sign-0.9.0.tgz",
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
},
"ohash": {
"version": "2.0.11",
"resolved": "https://registry.npmmirror.com/ohash/-/ohash-2.0.11.tgz",
"integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="
},
"path-type": {
"version": "6.0.0",
"resolved": "https://registry.npmmirror.com/path-type/-/path-type-6.0.0.tgz",
"integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ=="
},
"pathe": {
"version": "2.0.3",
"resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz",
"integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="
},
"perfect-debounce": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
"integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="
},
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz",
@ -2311,11 +1924,6 @@
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"peer": true
},
"picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
},
"pinia": {
"version": "2.3.1",
"resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.3.1.tgz",
@ -2325,27 +1933,6 @@
"vue-demi": "^0.14.10"
}
},
"pinia-plugin-persistedstate": {
"version": "4.2.0",
"resolved": "https://registry.npmmirror.com/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-4.2.0.tgz",
"integrity": "sha512-3buhA7ac+ssbOIx3VRCC8oHkoFwhDM9oHRCjo7nj+O8WUqnW+jRqh7eYT5eS/DNa3H28zp3dYf/nd/Vc8zj8eQ==",
"requires": {
"@nuxt/kit": "^3.14.1592",
"deep-pick-omit": "^1.2.1",
"defu": "^6.1.4",
"destr": "^2.0.3"
}
},
"pkg-types": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.1.0.tgz",
"integrity": "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==",
"requires": {
"confbox": "^0.2.1",
"exsolve": "^1.0.1",
"pathe": "^2.0.3"
}
},
"postcss": {
"version": "8.5.3",
"resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.3.tgz",
@ -2372,30 +1959,6 @@
"resolved": "https://registry.npmmirror.com/qs/-/qs-6.5.3.tgz",
"integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="
},
"quansync": {
"version": "0.2.10",
"resolved": "https://registry.npmmirror.com/quansync/-/quansync-0.2.10.tgz",
"integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A=="
},
"queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
},
"rc9": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/rc9/-/rc9-2.1.2.tgz",
"integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==",
"requires": {
"defu": "^6.1.4",
"destr": "^2.0.3"
}
},
"readdirp": {
"version": "4.1.2",
"resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz",
"integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="
},
"request": {
"version": "2.88.2",
"resolved": "https://registry.npmmirror.com/request/-/request-2.88.2.tgz",
@ -2423,19 +1986,6 @@
"uuid": "^3.3.2"
}
},
"reusify": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz",
"integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="
},
"run-parallel": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
"requires": {
"queue-microtask": "^1.2.2"
}
},
"safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
@ -2446,26 +1996,10 @@
"resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"scule": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz",
"integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g=="
},
"semver": {
"version": "7.7.1",
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.1.tgz",
"integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="
},
"slash": {
"version": "5.1.0",
"resolved": "https://registry.npmmirror.com/slash/-/slash-5.1.0.tgz",
"integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg=="
},
"source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"peer": true
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="
},
"sshpk": {
"version": "1.17.0",
@ -2483,54 +2017,6 @@
"tweetnacl": "~0.14.0"
}
},
"std-env": {
"version": "3.9.0",
"resolved": "https://registry.npmmirror.com/std-env/-/std-env-3.9.0.tgz",
"integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw=="
},
"strip-literal": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-3.0.0.tgz",
"integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==",
"requires": {
"js-tokens": "^9.0.1"
}
},
"tinyexec": {
"version": "0.3.2",
"resolved": "https://registry.npmmirror.com/tinyexec/-/tinyexec-0.3.2.tgz",
"integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="
},
"tinyglobby": {
"version": "0.2.12",
"resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.12.tgz",
"integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==",
"requires": {
"fdir": "^6.4.3",
"picomatch": "^4.0.2"
},
"dependencies": {
"fdir": {
"version": "6.4.3",
"resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.4.3.tgz",
"integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==",
"requires": {}
},
"picomatch": {
"version": "4.0.2",
"resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz",
"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="
}
}
},
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"requires": {
"is-number": "^7.0.0"
}
},
"tough-cookie": {
"version": "2.5.0",
"resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-2.5.0.tgz",
@ -2553,100 +2039,6 @@
"resolved": "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
},
"ufo": {
"version": "1.6.1",
"resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.1.tgz",
"integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="
},
"unctx": {
"version": "2.4.1",
"resolved": "https://registry.npmmirror.com/unctx/-/unctx-2.4.1.tgz",
"integrity": "sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==",
"requires": {
"acorn": "^8.14.0",
"estree-walker": "^3.0.3",
"magic-string": "^0.30.17",
"unplugin": "^2.1.0"
}
},
"unicorn-magic": {
"version": "0.3.0",
"resolved": "https://registry.npmmirror.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
"integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="
},
"unimport": {
"version": "4.2.0",
"resolved": "https://registry.npmmirror.com/unimport/-/unimport-4.2.0.tgz",
"integrity": "sha512-mYVtA0nmzrysnYnyb3ALMbByJ+Maosee2+WyE0puXl+Xm2bUwPorPaaeZt0ETfuroPOtG8jj1g/qeFZ6buFnag==",
"requires": {
"acorn": "^8.14.1",
"escape-string-regexp": "^5.0.0",
"estree-walker": "^3.0.3",
"local-pkg": "^1.1.1",
"magic-string": "^0.30.17",
"mlly": "^1.7.4",
"pathe": "^2.0.3",
"picomatch": "^4.0.2",
"pkg-types": "^2.1.0",
"scule": "^1.3.0",
"strip-literal": "^3.0.0",
"tinyglobby": "^0.2.12",
"unplugin": "^2.2.2",
"unplugin-utils": "^0.2.4"
},
"dependencies": {
"picomatch": {
"version": "4.0.2",
"resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz",
"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="
}
}
},
"unplugin": {
"version": "2.3.0",
"resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-2.3.0.tgz",
"integrity": "sha512-zNTDfbzOZzkbgXvH1QgQFW5nAyvjA0q3q9FGPFx2sKpDnaoU09VP1wT1mE+LYa6EF2rfezfd1y2EPLLR8ka6nw==",
"requires": {
"acorn": "^8.14.1",
"picomatch": "^4.0.2",
"webpack-virtual-modules": "^0.6.2"
},
"dependencies": {
"picomatch": {
"version": "4.0.2",
"resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz",
"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="
}
}
},
"unplugin-utils": {
"version": "0.2.4",
"resolved": "https://registry.npmmirror.com/unplugin-utils/-/unplugin-utils-0.2.4.tgz",
"integrity": "sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==",
"requires": {
"pathe": "^2.0.2",
"picomatch": "^4.0.2"
},
"dependencies": {
"picomatch": {
"version": "4.0.2",
"resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz",
"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="
}
}
},
"untyped": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/untyped/-/untyped-2.0.0.tgz",
"integrity": "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==",
"requires": {
"citty": "^0.1.6",
"defu": "^6.1.4",
"jiti": "^2.4.2",
"knitwork": "^1.2.0",
"scule": "^1.3.0"
}
},
"uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz",
@ -2706,11 +2098,6 @@
"integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
"requires": {}
},
"webpack-virtual-modules": {
"version": "0.6.2",
"resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
"integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="
},
"weixin-js-sdk": {
"version": "1.6.3",
"resolved": "https://registry.npmmirror.com/weixin-js-sdk/-/weixin-js-sdk-1.6.3.tgz",

View File

@ -10,6 +10,7 @@
"license": "ISC",
"dependencies": {
"@vant/area-data": "^1.5.0",
"@vue/server-renderer": "^3.5.13",
"add": "^2.0.6",
"flyio": "^0.6.14",
"jweixin-module": "^1.6.0",

View File

@ -30,12 +30,13 @@
</view>
</view>
</scroll-view>
</view>
<view class="fixed-bottom flex justify-between align-center bg-white ">
<view class="mx-2 ont-weight-light">
<view>商品总价: {{ (getCartGoodsPrice - getPackingFee).toFixed(2) }}</view>
<view>打包费: {{ getPackingFee.toFixed(2) }}</view>
<view>应付: <text class="text-danger">{{ getCartGoodsPrice }}</text></view>
<view class="fixed-bottom flex justify-between align-center bg-white">
<view class="mx-2">
<view class="text-sm">商品总价: {{ (getCartGoodsPrice - getPackingFee).toFixed(2) }}</view>
<view class="text-xs text-gray-500">打包费: {{ getPackingFee.toFixed(2) }}</view>
<view class="text-base font-medium">应付: <text class="text-danger">{{ getCartGoodsPrice }}</text></view>
</view>
<view>
<uv-button
@ -265,4 +266,22 @@ const toPay = () => {
}
}
}
.fixed-bottom {
.text-sm {
font-size: 24rpx;
}
.text-xs {
font-size: 22rpx;
}
.text-base {
font-size: 28rpx;
}
.text-gray-500 {
color: #999;
}
.font-medium {
font-weight: 500;
}
}
</style>

View File

@ -1,43 +1,42 @@
<template>
<uv-navbar
:fixed="false"
:title="title"
left-arrow
@leftClick="$onClickLeft"
/>
<uv-navbar :fixed="false" :title="title" left-arrow @leftClick="$onClickLeft" />
<view class="container">
<view class="form-box">
<view class="form">
<list-cell :hover="false">
<view class="form-input">
<view class="label">收货人</view>
<input class="input" placeholder="请输入收货人" v-model="form.realName" placeholder-class="text-color-assist" />
<input class="input" placeholder="请输入收货人" v-model="form.realName"
placeholder-class="text-color-assist" />
</view>
</list-cell>
<list-cell :hover="false">
<view class="form-input">
<view class="label">联系方式</view>
<input class="input" placeholder="请输入收货人联系方式" v-model="form.phone" placeholder-class="text-color-assist" />
<input class="input" placeholder="请输入收货人联系方式" v-model="form.phone"
placeholder-class="text-color-assist" />
</view>
</list-cell>
<list-cell :hover="false">
<view class="form-input">
<view class="label">收货地址</view>
<view class="input" @click="chooseLocation">{{form.address ? form.address : '请选择收货地址'}}</view>
<view class="input" @click="chooseLocation">{{ form.address ? form.address : '请选择收货地址' }}</view>
</view>
</list-cell>
<list-cell :hover="false">
<view class="form-input">
<view class="label">详细地址</view>
<input class="input" placeholder="请输入收货人详细地址" v-model="form.detail" placeholder-class="text-color-assist" />
<input class="input" placeholder="请输入收货人详细地址" v-model="form.detail"
placeholder-class="text-color-assist" />
</view>
</list-cell>
<list-cell :hover="false">
<view class="form-input">
<view class="label">默认地址</view>
<view class="radio-group">
<view class="radio" :class="{'checked': !form.isDefault}" style="margin-right: 10rpx;" @tap="form.isDefault=0"></view>
<view class="radio" :class="{'checked': form.isDefault}" @tap="form.isDefault=1"></view>
<view class="radio" :class="{ 'checked': !form.isDefault }" style="margin-right: 10rpx;"
@tap="form.isDefault = 0"></view>
<view class="radio" :class="{ 'checked': form.isDefault }" @tap="form.isDefault = 1"></view>
</view>
</view>
</list-cell>
@ -56,13 +55,13 @@ import {
} from 'vue'
import { useMainStore } from '@/store/store'
import { storeToRefs } from 'pinia'
import { onLoad,onShow } from '@dcloudio/uni-app'
import { formatDateTime,prePage } from '@/utils/util'
import { onLoad, onShow } from '@dcloudio/uni-app'
import { formatDateTime, prePage } from '@/utils/util'
import {
getAddressAddAndEdit
} from '@/api/address'
const main = useMainStore()
const { isLogin,addresses } = storeToRefs(main)
const { isLogin, addresses } = storeToRefs(main)
const title = ref('编辑地址')
const form = ref({
@ -77,13 +76,13 @@ const form = ref({
onLoad((option) => {
//便
console.log('option:',option)
console.log('option:', option)
if (option.id) {
form.value = addresses.value.find(item => item.id == option.id)
}
})
const save = async() => {
const save = async () => {
let data = {}
if (form.value.hasOwnProperty('id')) {
data = await getAddressAddAndEdit(form.value);
@ -91,13 +90,11 @@ const save = async() => {
data = await getAddressAddAndEdit(form.value);
}
if (data) {
setTimeout(function(){
uni.navigateBack()
}, 2000);
}
}
const chooseLocation = async() => {
const chooseLocation = async () => {
uni.chooseLocation({
success: function (res) {
form.value.address = res.address + ' ' + res.name;
@ -116,7 +113,7 @@ const chooseLocation = async() => {
</script>
<style lang="scss" scoped>
.form-box {
.form-box {
width: 100%;
height: 100%;
padding: 30rpx;
@ -179,5 +176,5 @@ const chooseLocation = async() => {
justify-content: center;
}
}
}
}
</style>

View File

@ -1,19 +1,17 @@
<template>
<uv-navbar
:fixed="false"
:title="title"
left-arrow
@leftClick="$onClickLeft"
/>
<uv-navbar :fixed="false" :title="title" left-arrow @leftClick="$onClickLeft" />
<view>
<view class="wrap">
<view class="bg-white" v-if="cate == 0">
<uv-tabs activeColor="#f29100" ref="tabs" :list="list" :current="current" @change="change" :scrollable="false" swiperWidth="750"></uv-tabs>
<uv-tabs activeColor="#f29100" ref="tabs" :list="list" :current="current" @change="change"
:scrollable="false" swiperWidth="750"></uv-tabs>
</view>
<view class="bg-white" v-else>
<uv-tabs activeColor="#f29100" ref="tabs" :list="list1" :current="current" @change="change" :scrollable="false" swiperWidth="750"></uv-tabs>
<uv-tabs activeColor="#f29100" ref="tabs" :list="list1" :current="current" @change="change"
:scrollable="false" swiperWidth="750"></uv-tabs>
</view>
<swiper class="swiper-box" :current="swiperCurrent" @transition="transition" @animationfinish="animationfinish">
<swiper class="swiper-box" :current="swiperCurrent" @transition="transition"
@animationfinish="animationfinish">
<swiper-item class="swiper-item" v-for="(item, index) in orderList" :key="index">
<scroll-view scroll-y style="height: 100%;width: 100%;" @scrolltolower="reachBottom">
@ -35,15 +33,15 @@
<view v-else>
<view class="order" v-for="(res, resIndex) in orderList[index]" :key="resIndex">
<view class="type">
<view>{{res.title}}</view>
<view>{{res.mark}}</view>
<view>{{ res.title }}</view>
<view>{{ res.mark }}</view>
</view>
<view class="total">
<view>
{{res.pm == 0 ? '-':''}}{{res.number}}
{{ res.pm == 0 ? '-' : '' }}{{ res.number }}
</view>
<view>
{{formatDateTime(res.createTime)}}
{{ formatDateTime(res.createTime) }}
</view>
</view>
</view>
@ -64,7 +62,7 @@ import {
} from 'vue'
import { useMainStore } from '@/store/store'
import { storeToRefs } from 'pinia'
import { onLoad,onShow} from '@dcloudio/uni-app'
import { onLoad, onShow } from '@dcloudio/uni-app'
import { formatDateTime } from '@/utils/util'
import {
balanceGetBillList
@ -86,7 +84,7 @@ const list = ref([
{
name: '退款'
}
]
]
)
const list1 = ref([
{
@ -95,40 +93,40 @@ const list1 = ref([
{
name: '消费'
}
]
]
)
const current = ref(0)
const swiperCurrent = ref(0)
const tabsHeight =ref(0)
const tabsHeight = ref(0)
const dx = ref(0)
const loadStatus = ref(['loadmore','loadmore','loadmore','loadmore'])
const loadStatus = ref(['loadmore', 'loadmore', 'loadmore', 'loadmore'])
const page = ref(1)
const pageSize = ref(20)
const tabs = ref()
const cate = ref(0)
onLoad((option) => {
console.log('cate:',option.cate)
console.log('cate:', option.cate)
cate.value = option.cate
getBill();
})
const getBill = async() => {
const getBill = async () => {
if (loadStatus.value[swiperCurrent.value] == 'loading') {
return;
}
loadStatus.value.splice(swiperCurrent.value,1,"loading")
let data = await balanceGetBillList({cate:cate.value,type:swiperCurrent.value,page:page.value,pagesize:pageSize.value});
if (page.value == 1 ){
loadStatus.value.splice(swiperCurrent.value, 1, "loading")
let data = await balanceGetBillList({ cate: cate.value, type: swiperCurrent.value, page: page.value, pagesize: pageSize.value });
if (page.value == 1) {
orderList.value[swiperCurrent.value] = [];
}
if (data && data.length > 0) {
page.value++;
orderList.value[swiperCurrent.value] = orderList.value[swiperCurrent.value].concat(data);
loadStatus.value.splice(swiperCurrent.value,1,"loadmore")
} else{
loadStatus.value.splice(swiperCurrent.value,1,"nomore")
loadStatus.value.splice(swiperCurrent.value, 1, "loadmore")
} else {
loadStatus.value.splice(swiperCurrent.value, 1, "nomore")
}
}
const reachBottom = () => {
@ -139,8 +137,14 @@ const reachBottom = () => {
}
// tab
const change = (e) => {
if (e.name == '退款') {
swiperCurrent.value = 3;
page.value = 1;
} else {
swiperCurrent.value = e.index;
page.value = 1;
}
}
const transition = ({ detail: { dx } }) => {
}
@ -160,6 +164,7 @@ page {
height: 100%;
background-color: #f2f2f2;
}
/* #endif */
</style>
@ -180,29 +185,35 @@ page {
.total-price {
font-size: 36rpx;
}
float: right;
}
.type {
display: inline-block;
}
}
.centre {
text-align: center;
margin: 200rpx auto;
font-size: 32rpx;
image {
width: 164rpx;
height: 164rpx;
border-radius: 50%;
margin-bottom: 20rpx;
}
.tips {
font-size: 24rpx;
color: #999999;
margin-top: 20rpx;
}
.btn {
margin: 80rpx auto;
width: 200rpx;
@ -213,17 +224,19 @@ page {
background: linear-gradient(270deg, rgba(249, 116, 90, 1) 0%, rgba(255, 158, 1, 1) 100%);
}
}
.wrap {
display: flex;
flex-direction: column;
height: calc(100vh - var(--window-top));
width: 100%;
}
.swiper-box {
flex: 1;
}
.swiper-item {
height: 100%;
}
</style>

View File

@ -21,10 +21,10 @@
<text class="invite-code" @tap="showInviteCodePopup">邀请码</text>
</view>
</view>
<view class="share-btn" @tap="share">
<button class="share-btn" open-type="share" hover-class="none">
<image class="share-icon" src="/static/images/share.png" mode="aspectFill"></image>
<text class="share-text">分享</text>
</view>
</button>
</view>
</view>
@ -67,11 +67,13 @@
<view class="detail-info">
<text class="detail-name">{{ item.name }}</text>
<text class="detail-date">下单日期: {{ item.date }}</text>
<text class="detail-date">结算时间: {{ item.commissionTime }}</text>
</view>
</view>
<view class="detail-amount">
<text class="add-icon">+</text>
<text>{{ item.amount }}</text>
<text class="add-icon" v-if="item.refundStatus !== 2">+</text>
<text v-if="item.refundStatus !== 2">{{ item.amount }}</text>
<text v-else class="refund-text">已退款</text>
</view>
</view>
</view>
@ -94,7 +96,7 @@
<image class="invite-popup-avatar" :src="userAvatar" mode="aspectFill"></image>
<view class="invite-popup-id">分销员ID: {{ userId }}</view>
<view class="invite-popup-qrcode-container">
<uv-qrcode ref="qrcode" canvas-id="qrcode" :value="userId" :size="260" background-color="#FFFFFF"
<uv-qrcode ref="qrcode" canvas-id="qrcode" :value="qrcodeValue" :size="200" background-color="#FFFFFF"
foreground-color="#000000"></uv-qrcode>
</view>
</view>
@ -104,10 +106,10 @@
</template>
<script setup>
import { ref, onMounted } from "vue";
import { ref, onMounted, computed } from "vue";
import { useMainStore } from "@/store/store";
import { storeToRefs } from "pinia";
import { onLoad } from "@dcloudio/uni-app";
import { onLoad, onShow } from "@dcloudio/uni-app";
import { getDistributorInfo, getCommissionList } from "@/api/distributor";
const main = useMainStore();
@ -147,6 +149,7 @@ const showInvitePopup = ref(false);
//
onLoad((options) => {
uni.hideShareMenu();
if (!isLogin.value) {
uni.navigateTo({ url: "/pages/components/pages/login/login" });
}
@ -154,6 +157,7 @@ onLoad((options) => {
// ID
if (options && options.spreadUid) {
spreadUid.value = options.spreadUid;
console.log("spreadUid:", spreadUid.value);
}
uni.showLoading({
@ -161,6 +165,16 @@ onLoad((options) => {
});
getCommissionData();
uni.hideLoading();
setTimeout(() => {
uni.$mpShare = shareData.value; //
}, 1000);
});
onShow(() => {
setTimeout(() => {
uni.$mpShare = shareData.value; //
}, 1000);
});
//
@ -188,7 +202,9 @@ const getOrderCommissionList = async () => {
avatar: item.avatar || '/static/images/avatar.png',
name: item.realName || '用户',
date: formatDate(item.createTime) || '', // 使formatDate
amount: item.commission || '0.00'
amount: item.commission || '0.00',
refundStatus: item.refundStatus || 0,
commissionTime: formatDate(item.commissionTime) || ''
}));
orderCount.value = data.length;
}
@ -207,14 +223,6 @@ const formatDate = (timestamp) => {
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
};
//
const share = () => {
uni.showToast({
title: "分享功能",
icon: "none",
});
};
//
const addCommission = () => {
// uni.showToast({
@ -239,6 +247,35 @@ const showInviteCodePopup = () => {
const closeInviteCodePopup = () => {
showInvitePopup.value = false;
};
const qrcodeValue = computed(() => {
return `https://www.aiyushantp.com/pages/menu/menu?distributorId=${userId.value}`;
});
//
const shareData = computed(() => { //
return {
title: "爱愈膳汤浦",
path: '/pages/menu/menu?distributorId=' + userId.value,
imageUrl: "https://file.aiyushantp.com/file/b22aa4e4625714e2747b15cfa174ea2351e59df4bacec69d338f9c87c7dae5ca.png"
}
})
// const onShareAppMessage = () => {
// return {
// title: '1111',
// path: `/pages/menu/menu?distributorId=${userId.value}`,
// imageUrl: "https://file.aiyushantp.com/file/b22aa4e4625714e2747b15cfa174ea2351e59df4bacec69d338f9c87c7dae5ca.png"
// }
// };
// const onShareTimeline = () => {
// return {
// title: '11111',
// path: `/pages/menu/menu?distributorId=${userId.value}`,
// imageUrl: "https://file.aiyushantp.com/file/b22aa4e4625714e2747b15cfa174ea2351e59df4bacec69d338f9c87c7dae5ca.png"
// }
// }
</script>
<style scoped>
@ -307,9 +344,16 @@ const closeInviteCodePopup = () => {
justify-content: center;
align-items: center;
margin-bottom: 10rpx;
padding: 20rpx;
}
.invite-popup-qrcode-container>>>.uqrcode {
margin: 0 auto;
}
.refund-text {
color: #ff0000;
font-weight: bold;
font-size: 28rpx;
}
</style>

View File

@ -42,7 +42,7 @@
}
.form-label {
width: 160rpx;
width: 170rpx;
font-size: 30rpx;
color: #333333;
padding-right: 20rpx;

View File

@ -1,10 +1,5 @@
<template>
<uv-navbar
:fixed="false"
title="申请成为分销员"
left-arrow
@leftClick="$onClickLeft"
/>
<uv-navbar :fixed="false" title="申请成为分销员" left-arrow @leftClick="$onClickLeft" />
<view class="page">
<!-- 头部导航 -->
<!-- <view class="header">
@ -21,80 +16,62 @@
<!-- 姓名 -->
<view class="form-item" style="">
<text class="form-label">姓名<text style="color: red;"> *</text></text>
<input
class="form-input"
type="text"
v-model="formData.name"
placeholder="请输入姓名"
placeholder-class="placeholder"
/>
<input class="form-input" type="text" v-model="formData.name" placeholder="请输入姓名"
placeholder-class="placeholder" />
</view>
<!-- 电话 -->
<view class="form-item">
<text class="form-label">电话<text style="color: red;"> *</text></text>
<input
class="form-input"
type="number"
v-model="formData.phone"
placeholder="请输入电话"
placeholder-class="placeholder"
maxlength="11"
/>
<input class="form-input" type="number" v-model="formData.phone" placeholder="请输入电话"
placeholder-class="placeholder" maxlength="11" />
</view>
<!-- 工作单位 -->
<view class="form-item">
<text class="form-label">工作单位</text>
<input
class="form-input"
type="text"
v-model="formData.workUnit"
placeholder="请输入工作单位"
placeholder-class="placeholder"
/>
<input class="form-input" type="text" v-model="formData.workUnit" placeholder="请输入工作单位"
placeholder-class="placeholder" />
</view>
<!-- 银行卡号 -->
<view class="form-item">
<text class="form-label">银行卡号<text style="color: red;"> *</text></text>
<input
class="form-input"
type="number"
v-model="formData.bankCardNumber"
placeholder="请输入银行卡号(结算佣金时需要)"
placeholder-class="placeholder"
/>
<input class="form-input" type="number" v-model="formData.bankCardNumber" placeholder="请输入银行卡号(结算佣金时需要)"
placeholder-class="placeholder" />
</view>
<!-- 收款人姓名 -->
<view class="form-item">
<text class="form-label">开户名<text style="color: red;"> *</text></text>
<input
class="form-input"
type="text"
v-model="formData.recipientName"
placeholder="请输入开户名(结算佣金时需要)"
placeholder-class="placeholder"
/>
<input class="form-input" type="text" v-model="formData.recipientName" placeholder="请输入开户名(结算佣金时需要)"
placeholder-class="placeholder" />
</view>
<!-- 开户行 -->
<view class="form-item">
<text class="form-label">开户行<text style="color: red;"> *</text></text>
<input
class="form-input"
type="text"
v-model="formData.bankName"
placeholder="请输入开户行(结算佣金时需要)"
placeholder-class="placeholder"
/>
<input class="form-input" type="text" v-model="formData.bankName" placeholder="请输入开户行(结算佣金时需要)"
placeholder-class="placeholder" />
</view>
</view>
<!-- 提交按钮 -->
<view class="action-area">
<view class="submit-btn" @tap="submitForm">提交</view>
<view class="benefit-box">
<view class="benefit-title" style="font-weight: bold; font-size: 36rpx;">为什么要加入我们</view>
<view class="benefit-item">
<text class="benefit-text">加入我们的分销团队不仅能共享潜力巨大的健康市场红利更是爱的传递</text>
</view>
<view class="benefit-item">
<text class="benefit-text">高比例佣金回报轻松销售模式已备好</text>
</view>
<view class="benefit-title" style="font-weight: bold; font-size: 36rpx;">如何加入我们</view>
<view class="benefit-item">
<text class="benefit-text">填写分销员申请表审批通过即可获得专属分销码客户扫码下单即可赚取收益一起用爱创造价值</text>
</view>
</view>
</view>
</view>
</template>
@ -230,4 +207,38 @@ onLoad((options) => {
<style scoped>
@import "./fenxiaorequestform.css";
.benefit-box {
margin-top: 40rpx;
padding: 30rpx;
background-color: #f8f8f8;
border-radius: 16rpx;
border: 1rpx solid #eee;
}
.benefit-title {
font-size: 32rpx;
font-weight: bold;
color: #333;
margin-bottom: 10rpx;
text-align: center;
}
.benefit-item {
display: flex;
align-items: center;
padding: 20rpx 0;
}
.benefit-icon {
width: 40rpx;
height: 40rpx;
margin-right: 20rpx;
}
.benefit-text {
font-size: 28rpx;
color: #666;
flex: 1;
}
</style>

View File

@ -250,14 +250,14 @@ const getUserInvoice = async (id) => {
const data = await getUserInvoiceInfo(id)
if (data) {
console.log('获取到发票信息:', data)
// console.log(':', data)
//
if (data.invoiceType === 'enterprise') {
invoiceType.value = 'company'
//
companyForm.userId = data.userId || userInfo.value?.uid || ''
companyForm.userId = data.userId || ''
companyForm.invoiceTitle = data.invoiceTitle || ''
companyForm.taxNumber = data.taxNumber || ''
companyForm.companyAddress = data.companyAddress || ''
@ -268,19 +268,12 @@ const getUserInvoice = async (id) => {
invoiceType.value = 'personal'
//
personalForm.userId = data.userId || userInfo.value?.uid || ''
personalForm.userId = data.userId || ''
personalForm.invoiceTitle = data.invoiceTitle || ''
}
} else {
// 使ID
companyForm.userId = userInfo.value?.uid || ''
personalForm.userId = userInfo.value?.uid || ''
}
} catch (error) {
console.error('获取发票信息失败:', error)
// ID
companyForm.userId = userInfo.value?.uid || ''
personalForm.userId = userInfo.value?.uid || ''
} finally {
loading.value = false
uni.hideLoading()
@ -288,8 +281,11 @@ const getUserInvoice = async (id) => {
}
onLoad((option) => {
if (!isLogin.value) {
uni.navigateTo({ url: "/pages/components/pages/login/login" });
}
//
console.log('用户ID:', member.value.id)
console.log('用户ID:', option.userId)
// userId
if (option.userId) {
@ -306,7 +302,7 @@ onLoad((option) => {
}
//
getUserInvoice(member.value.id)
getUserInvoice(option.userId);
})
</script>

View File

@ -1,16 +1,12 @@
<template>
<view class="container">
<uv-navbar
:fixed="false"
title="客服中心"
left-arrow
@leftClick="$onClickLeft"
/>
<uv-navbar :fixed="false" title="客服中心" left-arrow @leftClick="$onClickLeft" />
<view class="service-content">
<view class="section-title">常见问题</view>
<view class="question-list">
<view class="question-item" v-for="(item, index) in questionList" :key="index" @click="showDetail(item)">
<view class="question-item" v-for="(item, index) in questionList" :key="index"
@click="showDetail(item)">
<text class="question-text">{{ item.title }}</text>
<view class="arrow-icon">
<uv-icon name="arrow-right" size="16" color="#C8C9CC"></uv-icon>
@ -58,7 +54,7 @@ const questionList = ref([
{
title: '外送订单超时',
content: [
'点击“订单”查看订单详情,了解订单状态;','配送时间超过30分钟可点击帮助中心底部客服电话人工咨询'
'点击“订单”查看订单详情,了解订单状态;', '配送时间超过30分钟可点击帮助中心底部客服电话人工咨询'
]
},
{
@ -70,7 +66,7 @@ const questionList = ref([
{
title: '外送订单退款',
content: [
'订单申请取消成功后,钱款和优惠券都将自动返还支付账户;','如遇退款异常情况,可点击帮助中心底部客服电话人工咨询'
'订单申请取消成功后,钱款和优惠券都将自动返还支付账户;', '如遇退款异常情况,可点击帮助中心底部客服电话人工咨询'
]
},
{
@ -82,6 +78,12 @@ const questionList = ref([
]);
onLoad((options) => {
if (options && options.phone) {
phoneNumber.value = options.phone;
}
});
//
@ -177,8 +179,10 @@ const callService = () => {
overflow: hidden;
position: relative;
margin-bottom: 0;
padding-bottom: constant(safe-area-inset-bottom); /* iOS 11.0 */
padding-bottom: env(safe-area-inset-bottom); /* iOS 11.2+ */
padding-bottom: constant(safe-area-inset-bottom);
/* iOS 11.0 */
padding-bottom: env(safe-area-inset-bottom);
/* iOS 11.2+ */
}
/* 弹窗样式 */

View File

@ -42,13 +42,19 @@
<view class="font-size-lg text-color-error">订单未支付</view>
</view>
<view
v-if="order.paid > 0"
v-if="order.paid == 1 && order.refundStatus == 2"
class="d-flex align-items-center just-content-center mb-40"
>
<view class="font-size-lg text-color-error">订单已退款</view>
</view>
<view
v-if="order.paid > 0 && order.refundStatus == 0"
class="d-flex align-items-center just-content-center"
>
<view class="sort-num">{{ order.numberId }}</view>
</view>
<!-- steps begin -->
<view v-if="order.paid > 0" class="d-flex just-content-center">
<view v-if="order.paid > 0 && order.refundStatus == 0" class="d-flex just-content-center">
<view class="steps d-flex flex-column w-80">
<view class="steps__img-column">
<view class="steps__img-column-item">
@ -230,6 +236,10 @@
<view>订单金额</view>
<view class="font-weight-bold">{{ order.totalPrice }}</view>
</view>
<view class="pay-cell">
<view>打包费</view>
<view class="font-weight-bold">{{ order.payBox }}</view>
</view>
<view class="pay-cell" v-if="order.orderType == 'takeout'">
<view>配送费</view>
<view class="font-weight-bold">{{ order.payPostage }}</view>
@ -280,7 +290,7 @@
<view class="pay-cell">
<view>取餐时间</view>
<view class="font-weight-bold">{{
order.getTime ? formatDateTime(order.getTime) : "立即取餐"
order.getTime ? formatDateTime(order.getTime) : ""
}}</view>
</view>
<view class="pay-cell">
@ -292,7 +302,7 @@
<view class="pay-cell">
<view>备注</view>
<view class="font-weight-bold">{{
order.remark ? order.remark : "无"
order.mark ? order.mark : "无"
}}</view>
</view>
</view>

View File

@ -0,0 +1,919 @@
<template>
<uv-navbar :fixed="false" :title="title" left-arrow @leftClick="$onClickLeft" />
<view class="container position-relative">
<view style="margin-bottom: 130rpx">
<view class="section-1">
<template v-if="store.distance > 0">
<list-cell class="location">
<view class="flex-fill d-flex justify-content-between align-items-center">
<view class="store-name flex-fill">{{
orderType == "takeout" ? "外卖配送" : "点餐自取"
}}</view>
<uv-switch activeColor="#52ac41" v-model="active" @change="takout">
</uv-switch>
</view>
</list-cell>
</template>
<template v-if="orderType == 'takeout'">
<list-cell @click="chooseAddress">
<view v-if="address.realName" class="w-100 d-flex flex-column">
<view class="d-flex align-items-center justify-content-between mb-10">
<view class="font-size-lg text-color-base">
{{ address.address + " " + address.detail }}
</view>
<image src="/static/images/navigator-1.png" class="arrow"></image>
</view>
<view class="d-flex text-color-assist font-size-sm align-items-center">
<view class="mr-10">{{ address.realName }}</view>
<view>{{ address.phone }}</view>
</view>
</view>
<view v-else class="flex-fill d-flex justify-content-between align-items-center">
<view class="store-name flex-fill">选择收货地址</view>
<image src="/static/images/navigator-1.png" class="arrow"></image>
</view>
</list-cell>
</template>
</view>
<view class="section-1">
<template>
<list-cell class="location">
<view class="flex-fill d-flex justify-content-between align-items-center">
<view class="store-name flex-fill">{{ store.name }}</view>
<!-- <image src="/static/images/navigator-1.png" class="arrow"></image> -->
</view>
</list-cell>
</template>
<template>
<list-cell arrow class="meal-time" v-if="orderType == 'takein'">
<view class="flex-fill d-flex justify-content-between align-items-center" @click="takeinTIme = !takeinTIme">
<view class="title">取餐时间</view>
<view class="time">
{{ takeinRange[defaultSelector[0]].name }}
<u-picker v-model="takeinTIme" :range="takeinRange" range-key="name" mode="selector"
@cancel="takeinCancelTime" @confirm="takeinConfirmTime"
:default-selector="defaultSelector"></u-picker>
</view>
</view>
</list-cell>
<list-cell class="contact" last :hover="false" v-if="orderType == 'takein'">
<view class="flex-fill d-flex justify-content-between align-items-center">
<view class="title flex-fill">联系电话</view>
<view class="time"><input class="text-right" placeholder="请输入手机号码" :value="member.mobile" />
</view>
<!-- <button class="contact-tip font-size-sm" @click="fillMobile">自动填写</button> -->
</view>
</list-cell>
</template>
<template v-if="orderType == 'takeout'">
<list-cell>
<view class="w-100 d-flex flex-column">
<view class="d-flex align-items-center font-size-base text-color-base">
<view class="flex-fill">预计送达时间</view>
<view class="mr-10">
{{ defaultTime }}
<u-picker :default-time="defaultTime" v-model="takeoutTIme" :params="paramsTime" mode="time"
@cancel="cancelTime" @confirm="choiceTime"></u-picker>
</view>
</view>
</view>
</list-cell>
</template>
</view>
<!-- 购物车列表 begin -->
<view class="section-2">
<view class="cart d-flex flex-column">
<list-cell last v-for="(item, index) in cart" :key="index">
<view class="w-100 d-flex flex-column">
<view class="d-flex align-items-center mb-10">
<view class="d-flex flex-fill justify-content-between align-items-center text-color-base font-size-lg">
<image style="width: 80rpx; height: 80rpx" mode="aspectFill" :src="item.image">
</image>
</view>
<view class="name-and-props overflow-hidden">
<view class="text-color-base font-size-lg">{{
item.name
}}</view>
</view>
<view class="d-flex flex-fill justify-content-between align-items-center text-color-base font-size-lg">
<view>x{{ item.number }}</view>
<view>{{ item.price }}</view>
</view>
</view>
<view class="text-truncate font-size-base text-color-assist">{{
item.valueStr
}}</view>
</view>
</list-cell>
</view>
<!-- <list-cell>
<view class="flex-fill d-flex justify-content-between align-items-center">
<view class="text-color-base">分销员ID</view>
<input
type="number"
placeholder="请输入分销员ID"
v-model="distributorId"
class="text-right"
style="width: 200rpx;"
/>
</view>
</list-cell> -->
<!-- <list-cell>
<view v-if="orderType == 'takeout'"class="flex-fill d-flex justify-content-between align-items-center">
<view class="text-color-base">餐盒费:({{ store.canheDesc}})</view>
<view>{{ store.canhePrice }}</view>
</view>
</list-cell> -->
<list-cell>
<view class="flex-fill d-flex justify-content-between align-items-center">
<view class="text-color-base">打包费</view>
<view>{{ getPackingFee.toFixed(2) }}</view>
</view>
</list-cell>
<list-cell v-if="orderType == 'takeout'">
<view class="flex-fill d-flex justify-content-between align-items-center">
<view class="text-color-base">配送费</view>
<view>{{ store.deliveryPrice }}</view>
</view>
</list-cell>
<list-cell arrow @click="goToPackages">
<view class="flex-fill d-flex justify-content-between align-items-center">
<view class="text-color-base">优惠券</view>
<!-- <view v-if="orderType == 'takeout'">餐盒费({{ store.canheDesc}}){{ store.canhePrice }}</view> -->
<view v-if="coupons == 0" class="text-color-base">暂无可用</view>
<view v-else-if="coupon.title" class="text-color-danger">
{{ coupon.title }}({{ coupon.least }}{{ coupon.value }})
</view>
<view v-else class="text-color-primary">可用优惠券{{ coupons }}</view>
</view>
</list-cell>
<list-cell last>
<view class="flex-fill d-flex justify-content-end align-items-center">
<view>
总计{{ total }}
<!-- <text v-if="orderType == 'takeout'">,配送费{{ store.deliveryPrice }}</text> -->
<text v-if="coupon.value">,-{{ coupon.value }}</text>
,实付
</view>
<view class="font-size-extra-lg font-weight-bold">{{ amount }}</view>
</view>
</list-cell>
</view>
<!-- 购物车列表 end -->
<view class="d-flex align-items-center justify-content-start font-size-sm text-color-warning"
style="padding: 20rpx 0">
</view>
<!-- 支付方式 begin -->
<view class="payment">
<list-cell last :hover="false"><text>支付方式</text></list-cell>
<!-- <list-cell>
<view class="d-flex align-items-center justify-content-between w-100 disabled"
@click="setPayType('yue')">
<view class="iconfont iconbalance line-height-100 payment-icon"></view>
<view class="flex-fill">余额支付余额{{ member.nowMoney }}</view>
<view class="font-size-sm" v-if="member.nowMoney == 0">余额不足</view>
<view class="iconfont line-height-100 checkbox checked iconradio-button-on" v-if="payType == 'yue'">
</view>
<view class="iconfont line-height-100 checkbox iconradio-button-off" v-else></view>
</view>
</list-cell> -->
<list-cell last>
<view class="d-flex align-items-center justify-content-between w-100" @click="setPayType('weixin')">
<view class="iconfont iconwxpay line-height-100 payment-icon" style="color: #52ac41"></view>
<view class="flex-fill">微信支付</view>
<view class="iconfont line-height-100 checkbox checked iconradio-button-on" style="color: #52ac41"
v-if="payType == 'weixin'">
</view>
<view class="iconfont line-height-100 checkbox iconradio-button-off" v-else></view>
</view>
</list-cell>
<!-- #ifdef H5 -->
<!-- <list-cell>
<view class="d-flex align-items-center justify-content-between w-100" @click="setPayType('alipay')">
<view class="iconfont-yshop icon-alipay line-height-100 payment-icon" style="color: #07b4fd"></view>
<view class="flex-fill">支付宝</view>
<view class="iconfont line-height-100 checkbox checked iconradio-button-on" v-if="payType == 'alipay'">
</view>
<view class="iconfont line-height-100 checkbox iconradio-button-off" v-else></view>
</view>
</list-cell> -->
<!-- #endif -->
</view>
<!-- 支付方式 end -->
<!-- 备注 begin -->
<list-cell last @click="goToRemark">
<view class="d-flex flex-fill align-items-center justify-content-between overflow-hidden"
style="margin-bottom: 110rpx">
<view class="flex-shrink-0 mr-20">备注</view>
<view class="flex-fill text-truncate text-right" style="">{{ form.remark ||
"" }}
</view>
</view>
</list-cell>
<!-- 备注 end -->
</view>
<!-- 付款栏 begin -->
<view style="z-index: 1"
class="w-100 pay-box position-fixed fixed-bottom d-flex align-items-center justify-content-between bg-white">
<view class="font-size-sm" style="margin-left: 20rpx">合计</view>
<view class="font-size-lg flex-fill">{{ amount }}</view>
<view class="bg-primary h-100 d-flex align-items-center just-content-center text-color-white font-size-base"
style="padding: 0 60rpx; background-color: #52ac41" @tap="debounce(submit, 500)">付款</view>
</view>
<!-- 付款栏 end -->
<modal :show="ensureAddressModalVisible" custom :mask-closable="false" :radius="'0rpx'" width="90%">
<view class="modal-content">
<view class="d-flex justify-content-end">
<image src="/static/images/pay/close.png" style="width: 40rpx; height: 40rpx"
@tap="ensureAddressModalVisible = false"></image>
</view>
<view class="d-flex just-content-center align-items-center" style="margin-bottom: 40px">
<view class="font-size-extra-lg text-color-base">请再次确认下单地址</view>
</view>
<view
class="d-flex font-size-base text-color-base font-weight-bold align-items-center justify-content-between mb-20">
<view>{{ address.realName }}</view>
<view>{{ address.phone }}</view>
</view>
<view class="d-flex font-size-sm text-color-assist align-items-center justify-content-between mb-40">
<view style="max-width: 60%">{{
address.address + address.detail
}}</view>
<button type="primary" size="mini" plain class="change-address-btn" style="white-space: nowrap"
@click="chooseAddress">
修改地址
</button>
</view>
<button type="primary" class="pay_btn" @tap="debounce(pay, 500)">
确认并付款
</button>
</view>
</modal>
<uv-toast ref="uToast"></uv-toast>
</view>
</template>
<script setup>
import { ref, computed, nextTick } from "vue";
import { useMainStore } from "@/store/store";
import { storeToRefs } from "pinia";
import { onLoad, onShow, onPullDownRefresh, onHide } from "@dcloudio/uni-app";
import { formatDateTime, isWeixin } from "@/utils/util";
import debounce from "@/uni_modules/uv-ui-tools/libs/function/debounce";
import { orderSubmit, payUnify, getWechatConfig } from "@/api/order";
import { couponCount } from "@/api/coupon";
// #ifdef H5
import * as jweixin from "weixin-js-sdk";
// #endif
const main = useMainStore();
const { orderType, address, store, location, isLogin, member, mycoupon } =
storeToRefs(main);
const distributorId = ref(null); // ID
const active = ref(false);
const title = ref("支付");
const jsStr = ref("");
const cart = ref([]);
const form = ref({
remark: "",
});
const ensureAddressModalVisible = ref(false);
const takeoutTIme = ref(false); // picker
const paramsTime = ref({
year: false,
month: false,
day: false,
hour: true,
minute: true,
second: false,
});
const defaultTime = ref("00:00");
const takeinTIme = ref(false); // selector
const takeinRange = ref([
{
name: "立即用餐",
value: 0,
},
{
name: "10分钟后",
value: 10,
},
{
name: "20分钟后",
value: 20,
},
{
name: "30分钟后",
value: 30,
},
{
name: "40分钟后",
value: 40,
},
{
name: "50分钟后",
value: 50,
},
]);
const defaultSelector = ref([0]);
const payType = ref("weixin"); //
const coupons = ref(0); //
const coupon = ref(main.mycoupon); //
const subscribeMss = ref({
takein: "",
takeout: "",
takein_made: "",
takeout_made: "",
}); //
const uToast = ref();
// script
const getPackingFee = computed(() => {
// boxFee
return cart.value.reduce((acc, cur) => acc + cur.number * (cur.boxFee || 0), 0);
});
// total
const total = computed(() => {
let total = cart.value.reduce((acc, cur) => acc + cur.number * cur.price, 0) + getPackingFee.value;
//
if (store.value.distance > 0 && orderType.value == "takeout") {
total += parseFloat(store.value.deliveryPrice);
}
return total.toFixed(2);
});
// amount
const amount = computed(() => {
let amount = cart.value.reduce((acc, cur) => acc + cur.number * cur.price, 0) + getPackingFee.value;
//
if (store.value.distance > 0 && orderType.value == "takeout") {
amount += parseFloat(store.value.deliveryPrice);
}
//
if (main.mycoupon.hasOwnProperty("id")) {
amount -= parseFloat(main.mycoupon.value);
}
return amount.toFixed(2);
});
onShow(() => {
coupon.value = main.mycoupon;
let date = new Date(new Date().getTime() + 1200000); //
let hour = date.getHours();
let minute = date.getMinutes();
if (hour < 10) {
hour = "0" + hour;
}
if (minute < 10) {
minute = "0" + minute;
}
defaultTime.value = hour + ":" + minute;
console.log("member:", member.value);
if (member.value.spreadUid && distributorId.value && member.value.spreadUid === distributorId.value) {
nextTick(() => {
uToast.value.show({
message: "不能使用自己的分销ID支付",
type: "error"
});
});
return;
}
if (orderType.value == "takeout") {
active.value = true;
} else {
active.value = false;
}
getCoupons();
let paytype = uni.getStorageSync("paytype");
payType.value = paytype ? paytype : "weixin";
});
onHide(() => {
subscribeMss.value = [];
coupons.value = 0;
});
onLoad((option) => {
cart.value = uni.getStorageSync("cart");
if (option.remark) {
form.value.remark = option.remark;
}
// ID
if (option.distributorId) {
distributorId.value = option.distributorId;
}
});
const getSubscribeMss = async () => {
let data = [];
if (data) {
subscribeMss.value = data;
}
};
//
const setPayType = (paytype) => {
payType.value = "weixin";
payType.value = paytype;
uni.setStorage({
key: "paytype",
data: paytype,
});
};
const getCoupons = async () => {
//0=,1=,2=
let type = orderType.value == "takein" ? 1 : 2;
let data = await couponCount({
shop_id: store.value.id ? store.value.id : 0,
type: type,
});
if (data) {
coupons.value = data;
}
};
//
const choiceTime = (value) => {
let hour = value.hour;
let minute = value.minute;
let date = new Date(new Date().getTime() + 1200000); //
let nowhour = date.getHours();
let nowminute = date.getMinutes();
if (
(hour * 60 * 60 + minute * 60) * 1000 - 1200000 <
(nowhour * 60 * 60 + nowminute * 60) * 1000
) {
uToast.value.show({
message: "请至少选择一个小时之后",
type: "error",
});
return;
}
if (hour < 10) {
hour = "0" + hour;
}
if (minute < 10) {
minute = "0" + minute;
}
defaultTime, (value = hour + ":" + minute);
takeoutTIme.value = false;
};
const cancelTime = (value) => {
takeoutTIme.value = false;
};
// -
const takeinCancelTime = (value) => {
takeinTIme.value = false;
};
// -
const takeinConfirmTime = (value) => {
defaultSelector.value = value;
};
//
const takout = (value) => {
let type = "takeout";
if (value == false) {
type = "takein";
}
main.SET_ORDER_TYPE(type);
//
if (coupon.value.hasOwnProperty("type")) {
//0=,1=,2=
if (coupon.value.type != 0) {
if (coupon.value.type == 1 && orderType.value == "takeout") {
coupon.value = {};
}
if (coupon.value.type == 2 && orderType.value == "takeint") {
coupon.value = {};
}
}
}
subscribeMss.value = [];
coupons.value = 0;
getCoupons();
};
const goToRemark = () => {
uni.redirectTo({
url: "/pages/components/pages/remark/remark?remark=" + form.value.remark,
});
};
const chooseAddress = () => {
uni.navigateTo({
url: "/pages/components/pages/address/address?is_choose=true&scene=pay",
});
};
const goToPackages = () => {
let newamount = amount.value;
let coupon_id = coupon.value.id ? coupon.value.id : 0;
let type = orderType.value == "takein" ? 1 : 2;
let shop_id = store.value.id;
uni.navigateTo({
url:
"/pages/components/pages/packages/index?amount=" +
newamount +
"&coupon_id=" +
coupon_id +
"&shop_id=" +
shop_id +
"&type=" +
type,
});
};
const goToShop = () => {
uni.navigateTo({
url: `/pages/components/pages/shop/shop`,
});
};
const submit = () => {
if (orderType.value == "takeout") {
//
const hasAloneSell = cart.value.some(item => item.aloneSell === 1);
if (!hasAloneSell) {
uToast.value.show({
message: "所选商品不能单独配送",
type: "error",
});
return;
}
//
if (typeof address.value.id == "undefined") {
uToast.value.show({
message: "请选择收货地址",
type: "error",
});
return;
}
//
if (store.value.min_price > total.value) {
uToast.value.show({
message: "本店外卖起送价为¥" + store.value.min_price,
type: "error",
});
return;
}
pay();
} else {
pay();
}
};
const pay = async () => {
let that = this;
// #ifdef MP-WEIXIN
await new Promise(function (revolve) {
//id
let subscribeMss = ["8qDIfzfL19eFT-qG1PRQJBbzZSTxpzUDo3nDa1bxc3M"];
// wx.showModal({ //
// title: '', //
// content: '', //
// confirmText: "", //
// cancelText: "", //
// success: function(res) { //
// if (res.confirm) { // ""
// uni.requestSubscribeMessage({ // uni-appAPI
// tmplIds: subscribeMss, // ID
// complete(res) { //
// console.log(res,"11111111111111111") //
// revolve(true) // Promise
// }
// });
// } else { // ""
// revolve(true) // Promise
// }
// }
// })
revolve(true);
});
// #endif
uni.showLoading({
title: "加载中",
});
let data = {
orderType: orderType.value, // :takein=,takeout=
addressId: orderType.value == "takeout" ? address.value.id : 0, //
shopId: store.value.id, // id
mobile: member.value.mobile, //
gettime: takeinRange.value[defaultSelector.value[0]].value, //
payType: payType.value, //
remark: form.value.remark, //
productId: [],
spec: [],
number: [],
couponId: coupon.value.id ? coupon.value.id : 0, // id
distributorId: distributorId.value ? distributorId.value : null, // id
};
cart.value.forEach((item, index) => {
data.productId.push(item.id);
data.spec.push(item.valueStr.replace(/,/g, "|"));
//data.spec.push(item.valueStr);
data.number.push(item.number);
});
if (!data.orderType || !data.shopId || data.shopId == "undefined" || data.shopId == null) {
uToast.value.show({
message: "订单信息不完整,请重新下单",
type: "error"
});
setTimeout(() => {
uni.switchTab({
url: "/pages/menu/menu"
});
}, 3000);
return;
}
//console.log(data);
let order = await orderSubmit(data);
if (!order) {
uni.hideLoading();
return;
}
main.DEL_COUPON();
if (payType.value == "weixin") {
//
weixinPay(order);
} else if (payType.value == "yue") {
//
balancePay(order);
} else if (payType.value == "alipay") {
//
aliPay(order);
}
uni.hideLoading();
return;
};
const balancePay = async (order) => {
let from = "routine";
// #ifdef H5
from = "h5";
// #endif
let pay = await payUnify({
uni: order.orderId,
from: from,
paytype: "yue",
});
uni.hideLoading();
if (!pay) {
return;
}
member.value.money -= amount.value;
main.SET_MEMBER(member.value);
uni.removeStorageSync("cart");
uni.switchTab({
url: "/pages/order/order",
fail(res) {
console.log(res);
},
});
};
const weixinPay = async (order) => {
let from = "routine";
// #ifdef H5
from = "h5";
if (isWeixin()) {
from = "wechat";
}
// #endif
//let that = this;
let data = await payUnify({
uni: order.orderId,
from: from,
paytype: "weixin",
});
console.log("param2:", data);
if (!data) {
uni.hideLoading();
return;
}
if (data.trade_type == "MWEB") {
// #ifdef H5
// H5
console.log("data:", data);
location.href = data.data;
// #endif
console.log("data1:", data);
} else if (data.trade_type == "JSAPI") {
console.log("param:", data);
// #ifdef MP-WEIXIN
uni.requestPayment({
provider: "wxpay",
timeStamp: data.data.timeStamp,
nonceStr: data.data.nonceStr,
package: data.data.package,
signType: "MD5",
paySign: data.data.paySign,
success: function (res) {
uni.removeStorageSync("cart");
uni.switchTab({
url: `/pages/order/order`,
});
},
fail: function (err) {
console.log("fail:" + JSON.stringify(err));
},
});
// #endif
} else if (data.trade_type == "W-JSAPI") {
//
} else if (data.trade_type == "APP") {
}
};
const aliPay = async (order) => {
// #ifdef H5
//let that = this;
if (isWeixin()) {
uni.showToast({
title: "请普通浏览器打开进行支付宝支付~",
icon: "none",
});
return;
}
let data = await payUnify({
uni: order.orderId,
from: "h5",
paytype: "alipay",
});
console.log("data:", data.data);
//
let form = data.data;
const div = document.createElement("formdiv");
div.innerHTML = form;
document.body.appendChild(div);
//document.forms[0].setAttribute('target', ' self');
document.forms[0].submit();
//div.remove();
// #endif
};
const fillMobile = () => {
if (member.value && member.value.mobile) {
member.value.mobile = member.value.mobile;
} else {
uToast.value.show({
message: "未获取到手机号",
type: "error"
});
}
};
</script>
<style lang="scss" scoped>
.container {
padding: 30rpx;
}
.arrow {
width: 50rpx;
height: 50rpx;
position: relative;
margin-right: -10rpx;
}
.location {
.store-name {
font-size: $font-size-lg;
}
.iconfont {
font-size: 50rpx;
line-height: 100%;
color: $color-primary;
// color: #52ac41;
}
}
.section-1 {
margin-bottom: 30rpx;
.contact {
.contact-tip {
margin-left: 10rpx;
// border: 2rpx solid $color-primary;
border: 2rpx solid #52ac41;
padding: 6rpx 10rpx;
// color: $color-primary;
color: #52ac41;
}
}
}
.section-2 {
.name-and-props {
width: 65%;
}
}
.payment {
margin-bottom: 30rpx;
.disabled {
color: $text-color-grey;
}
.payment-icon {
font-size: 44rpx;
margin-right: 10rpx;
}
.checkbox {
font-size: 36rpx;
margin-left: 10rpx;
}
.checked {
color: $color-primary;
}
}
.pay-box {
box-shadow: 0 0 20rpx rgba(0, 0, 0, 0.1);
height: 100rpx;
}
.modal-content {
.change-address-btn {
line-height: 2;
padding: 0 1em;
}
.pay_btn {
width: 100%;
border-radius: 50rem !important;
line-height: 3;
}
}
.choice {
background-color: $bg-color-grey;
border-radius: 38rpx;
display: flex;
align-items: center;
font-size: $font-size-sm;
padding: 0 38rpx;
color: $text-color-assist;
.dinein,
.takeout {
width: 50%;
position: relative;
display: flex;
align-items: center;
&.active {
padding: 14rpx 38rpx;
color: #ffffff;
background-color: $color-primary;
border-radius: 38rpx;
}
}
.takeout {
margin-left: 20rpx;
height: 100%;
flex: 1;
padding: 14rpx 0;
}
.dinein.active {
//margin-left: -38rpx;
}
.takeout.active {
//margin-right: -38rpx;
}
}
</style>

View File

@ -196,7 +196,7 @@
</view>
</list-cell>
<!-- #ifdef H5 -->
<list-cell>
<!-- <list-cell>
<view class="d-flex align-items-center justify-content-between w-100" @click="setPayType('alipay')">
<view class="iconfont-yshop icon-alipay line-height-100 payment-icon" style="color: #07b4fd"></view>
<view class="flex-fill">支付宝</view>
@ -204,17 +204,24 @@
</view>
<view class="iconfont line-height-100 checkbox iconradio-button-off" v-else></view>
</view>
</list-cell>
</list-cell> -->
<!-- #endif -->
</view>
<!-- 支付方式 end -->
<!-- 备注 begin -->
<list-cell last @click="goToRemark">
<view class="d-flex flex-fill align-items-center justify-content-between overflow-hidden"
style="margin-bottom: 110rpx">
<list-cell last>
<!-- <view class="d-flex flex-fill align-items-center justify-content-between overflow-hidden">
<view class="flex-shrink-0 mr-20">备注</view>
<view class="text-color-primary flex-fill text-truncate text-right" style="color: #52ac41">{{ form.remark ||
"备注" }}
</view> -->
<view class="flex-fill">
<textarea placeholder-class="text-color-assist font-size-base" v-model="form.remark"
class="bg-white w-100 border-box font-size-base"
:class="{ 'text-color-danger': remarkLength > 50, 'text-color-assist': remarkLength <= 50 }"
placeholder="请填写备注信息" />
<view class="tips"
:class="{ 'text-color-danger': remarkLength > 50, 'text-color-assist': remarkLength <= 50 }">
{{ remarkLength }}/50
</view>
</view>
</list-cell>
@ -371,7 +378,7 @@ const amount = computed(() => {
onShow(() => {
coupon.value = main.mycoupon;
let date = new Date(new Date().getTime() + 3600000); //
let date = new Date(new Date().getTime() + 1200000); //
let hour = date.getHours();
let minute = date.getMinutes();
if (hour < 10) {
@ -384,6 +391,16 @@ onShow(() => {
console.log("member:", member.value);
if (member.value.spreadUid && distributorId.value && member.value.spreadUid === distributorId.value) {
nextTick(() => {
uToast.value.show({
message: "不能使用自己的分销ID支付",
type: "error"
});
});
return;
}
if (orderType.value == "takeout") {
active.value = true;
} else {
@ -404,6 +421,10 @@ onLoad((option) => {
if (option.remark) {
form.value.remark = option.remark;
}
// ID
if (option.distributorId) {
distributorId.value = option.distributorId;
}
});
const getSubscribeMss = async () => {
@ -437,12 +458,12 @@ const choiceTime = (value) => {
let hour = value.hour;
let minute = value.minute;
let date = new Date(new Date().getTime() + 3600000); //
let date = new Date(new Date().getTime() + 1200000); //
let nowhour = date.getHours();
let nowminute = date.getMinutes();
if (
(hour * 60 * 60 + minute * 60) * 1000 - 3600000 <
(hour * 60 * 60 + minute * 60) * 1000 - 1200000 <
(nowhour * 60 * 60 + nowminute * 60) * 1000
) {
uToast.value.show({
@ -497,10 +518,19 @@ const takout = (value) => {
getCoupons();
};
const goToRemark = () => {
uni.navigateTo({
uni.redirectTo({
url: "/pages/components/pages/remark/remark?remark=" + form.value.remark,
});
};
const remarkLength = computed(() => {
return form.value.remark.length
})
const isDanger = computed(() => {
return form.value.remark.length > 50
})
const chooseAddress = () => {
uni.navigateTo({
url: "/pages/components/pages/address/address?is_choose=true&scene=pay",
@ -529,6 +559,15 @@ const goToShop = () => {
});
};
const submit = () => {
if (form.value.remark.length > 50) {
uToast.value.show({
message: '备注不能超过50个字符',
type: 'error'
});
return
}
if (orderType.value == "takeout") {
//
const hasAloneSell = cart.value.some(item => item.aloneSell === 1);
@ -902,4 +941,9 @@ const fillMobile = () => {
//margin-right: -38rpx;
}
}
.tips {
font-size: 0.8em;
text-align: right;
}
</style>

View File

@ -64,9 +64,9 @@ const submit = () => {
});
return
}
uni.navigateTo({
uni.redirectTo({
url: "/pages/components/pages/pay/pay?remark=" + remark.value
})
});
}

View File

@ -2,7 +2,7 @@
background-color: rgba(255, 255, 255, 1);
position: relative;
width: 750rpx;
height: 1624rpx;
height: auto;
overflow: hidden;
}
@ -19,13 +19,13 @@
.group_8 {
width: 507rpx;
height: 178rpx;
height: auto;
margin: 111rpx 0 0 121rpx;
}
.group_9 {
width: 136rpx;
height: 171rpx;
height: auto;
margin-top: 7rpx;
}
@ -70,7 +70,7 @@
.image-text_7 {
width: 136rpx;
height: 178rpx;
height: auto;
}
.image_2 {

View File

@ -5,15 +5,15 @@
offset-top="0"
customNavHeight="0"
>
<uv-navbar
<!-- <uv-navbar
:fixed="false"
:safeAreaInsetTop="true"
height="0"
bgColor="transparent"
leftIcon=""
/>
/> -->
<!-- #ifndef MP -->
<blank size="10"></blank>
<blank size="0"></blank>
<!-- #endif -->
<blank size="0"></blank>
@ -31,6 +31,7 @@
class="image_1"
referrerpolicy="no-referrer"
src="/static/images/index/store_pickup.png"
mode="widthFix"
/>
<view class="text-group_13 flex-col justify-between">
<text class="text_1">到店自取</text>
@ -175,6 +176,20 @@ onLoad(() => {
// main.init()
handGetListAds()
})
const onShareAppMessage = (res) => {
return {
title: '爱愈膳汤浦', //
path: '/pages/index/index', //
imageUrl: 'https://file.aiyushantp.com/file/b22aa4e4625714e2747b15cfa174ea2351e59df4bacec69d338f9c87c7dae5ca.png' // 300x300
}
}
const onShareTimeline = () => {
return {
title: '爱愈膳汤浦', //
imageUrl: 'https://file.aiyushantp.com/file/b22aa4e4625714e2747b15cfa174ea2351e59df4bacec69d338f9c87c7dae5ca.png' // 300x300
}
}
</script>

View File

@ -30,13 +30,15 @@
</view>
<view class="left overflow-hidden" v-else>
<view class="store-name flex-row align-center" @click="selectShop()">
<view>{{ store.name }}
<text class="small" v-if="store.distance > 0 && orderType == 'takeout'">(配送距离:
{{ store.distance }}km)</text>
<text class="small" v-else-if="orderType == 'takeout'">(本店不支持外卖)</text>
</view>
<view style="font-weight: 800">{{ store.name }}</view>
<view class="iconfont iconarrow-right"></view>
</view>
<view class="store-location flex-row align-center">
<text class="small" v-if="store.distance > 0 && orderType == 'takeout'">(配送距离: {{
store.distance }}km)</text>
<text class="small" v-else-if="orderType == 'takeout'">(本店不支持外卖)</text>
</view>
</view>
</view>
<view class="order-type flex-row">
@ -101,13 +103,59 @@
<view class="category-items">
<!-- 商品 begin -->
<view class="good-card" v-for="(good, key) in item.goodsList" :key="key"
:class="{ 'sold-out': good.stock <= 0 }">
:class="{ 'sold-out': good.stock <= 0, 'large-image': isSpecialPackage(good.storeName) }">
<template v-if="isSpecialPackage(good.storeName)">
<image mode="aspectFill" :src="good.image" class="good-image-large"
@tap="showGoodDetailModal(item, good)"></image>
<view class="good-details-large flex-row justify-between">
<view class="good-info" style="flex: 2; padding-right: 20rpx;">
<text class="good-name">{{ good.storeName }}</text>
<text class="good-description">{{ good.storeInfo }}</text>
</view>
<view class="price-action" style="flex: 1;">
<text class="good-price">{{ good.price }}</text>
<view class="action-buttons" v-if="good.stock > 0">
<button type="primary" class="spec-button"
hover-class="none" size="mini"
@tap="showGoodDetailModal(item, good)">
<view class="iconfont iconadd-select"></view>
</button>
<view class="item-badge" v-if="goodCartNum(good.id)">
{{ goodCartNum(good.id) }}
</view>
</view>
<view class="sold-out-label" v-if="good.stock == 0">已售罄
</view>
</view>
</view>
</template>
<template v-else>
<image mode="aspectFill" :src="good.image" class="good-image"
@tap="showGoodDetailModal(item, good)"></image>
<!-- <image mode="aspectFill"
src="https://lanhu-oss-2537-2.lanhuapp.com/FigmaDDSSlicePNG62414071ec6e0e4e00603407efd42e53.png"
class="good-image" @tap="showGoodDetailModal(item, good)"></image> -->
<!-- https://lanhu-oss-2537-2.lanhuapp.com/FigmaDDSSlicePNG62414071ec6e0e4e00603407efd42e53.png -->
<view class="good-details">
<text class="good-name">{{ good.storeName }}</text>
<text class="good-description">{{ good.storeInfo }}</text>
<view
class="price-action flex-row justify-between align-center">
<text class="good-price">{{ good.price }}</text>
<view class="action-buttons" v-if="good.stock > 0">
<button type="primary" class="spec-button"
hover-class="none" size="mini"
@tap="showGoodDetailModal(item, good)">
<view class="iconfont iconadd-select"></view>
</button>
<view class="item-badge" v-if="goodCartNum(good.id)">
{{ goodCartNum(good.id) }}
</view>
</view>
<view class="sold-out-label" v-if="good.stock == 0">已售罄
</view>
</view>
</view>
</template>
<!-- <image mode="aspectFill" :src="good.image" class="good-image"
@tap="showGoodDetailModal(item, good)"></image>
<view class="good-details">
<text class="good-name">{{ good.storeName }}</text>
<text class="good-description">{{ good.storeInfo }}</text>
@ -119,19 +167,33 @@
@tap="showGoodDetailModal(item, good)">
<view class="iconfont iconadd-select"></view>
</button>
<view class="item-badge" v-show="goodCartNum(good.id)">
<view class="item-badge" v-if="goodCartNum(good.id)">
{{ goodCartNum(good.id) }}
</view>
</view>
<view class="sold-out-label" v-if="good.stock == 0">已售罄</view>
</view>
</view>
</view> -->
</view>
<!-- 商品 end -->
</view>
</view>
<!-- category end -->
<!-- 提示 begin -->
<view class="title_title flex-row justify-between">
<image
class="title_image"
referrerpolicy="no-referrer"
src="https://file.aiyushantp.com/file/ea023e706e727e5c6dd4437382df9e36ea43d742c2d364e8c4b79997abfa6131.png"
/>
<text class="title_a">致敏物质提示:</text>
</view>
<text class="title_content">
本菜单中含有含麸质的谷物及其制品甲壳类动物及甲壳类动物制品蛋类及蛋类制品鱼类及鱼类制品花生大豆及其制品奶类及奶类制品木本坚果及坚果制品汤内含有当归当归不适宜人群有脾胃虚弱腹泻孕妇经期女性热盛出血及当归过敏者
</text>
<!-- 提示 end -->
</view>
</view>
</scroll-view>
@ -172,8 +234,9 @@
<view class="modal-content">
<view class="good-basic-info">
<view class="good-title">{{ good.storeName }}</view>
<view class="good-subtitle flex justify-between">{{ good.storeInfo }} <text
class="points-info">可获积分:10</text></view>
<view class="good-subtitle flex justify-between">{{ good.storeInfo }}
<!-- <text class="points-info">可获积分:10</text> -->
</view>
</view>
<view class="good-properties">
<view class="property-item" v-for="(item, index) in good.productAttr" :key="index">
@ -332,6 +395,7 @@ const newValue = ref([]);
const shopAd = ref(
"https://lanhu-oss-2537-2.lanhuapp.com/FigmaDDSSlicePNGca115cd446d280796935fea74b5cd20f.png"
);
const distributorId = ref(null); // id
const isCartShow = ref(true);
const popup = ref();
const headerHeight = ref(300); // rpx
@ -401,7 +465,27 @@ uni.$on("refreshMenu", () => {
onPullDownRefresh(() => {
init();
});
onLoad(() => {
onLoad((options) => {
//
if (options && options.q) {
try {
// URL
const decodedUrl = decodeURIComponent(options.q);
// 使
const distributorIdMatch = decodedUrl.match(/distributorId=([^&]*)/);
const disId = distributorIdMatch ? distributorIdMatch[1] : null;
if (disId) {
// ID
distributorId.value = disId;
}
} catch (e) {
console.error('解析二维码URL失败:', e);
}
}
if (options && options.distributorId) {
console.log("distributorId111111111111111分销员页面分享:", options.distributorId);
distributorId.value = options.distributorId;
}
init();
refreshCart();
nextTick(() => {
@ -409,6 +493,7 @@ onLoad(() => {
currentCateId.value = goods.value[0].id;
}
});
});
onHide(() => {
//
@ -741,11 +826,10 @@ const calcLayoutHeights = () => {
// sizeCalcState.value = true
// }
const handleAddToCart = (cate, newGood, num) => {
console.log("handleAddToCart121212:", cate, newGood, num);
//
const index = cart.value.findIndex((item) => {
if (newGood) {
return item.id === newGood.id && item.props_text === good.value.valueStr;
return item.id === newGood.id && item.valueStr === good.value.valueStr;
} else {
return item.id === newGood.id;
}
@ -916,7 +1000,7 @@ const toPay = () => {
uni.setStorageSync("cart", JSON.parse(JSON.stringify(cart.value)));
uni.navigateTo({
url: "/pages/components/pages/pay/pay",
url: `/pages/components/pages/pay/pay?distributorId=${distributorId.value}`,
});
}
@ -933,6 +1017,16 @@ const toPackingFeeDetail = () => {
// url: "/pages/components/pages/packing-fee/packing-fee"
// });
};
const isSpecialPackage = (name) => {
const specialNames = [
"原鲜本味鸽子汤套餐",
"原味老鸡汤套餐",
"黑毛猪浓香筒骨汤套餐",
"杜仲劲爽半筋牛肉汤套餐"
];
return specialNames.includes(name);
};
</script>
<style lang="scss" scoped>
@ -972,7 +1066,7 @@ page {
.flex-row {
display: flex;
flex-direction: row;
flex-direction: column;
}
.justify-between {
@ -1020,7 +1114,7 @@ page {
.store-name {
font-size: 32rpx;
font-weight: 500;
font-weight: 800;
color: #000;
}
@ -1184,17 +1278,19 @@ page {
.good-description {
font-size: 22rpx;
color: #999;
margin-bottom: 30rpx;
}
.price-action {
margin-top: auto;
display: flex;
flex-direction: column;
align-items: flex-end;
}
.good-price {
font-size: 32rpx;
font-weight: 500;
color: #000;
margin-bottom: 10rpx;
}
.action-buttons {
@ -1545,4 +1641,62 @@ button[type="primary"] {
height: 6rpx;
margin: 194rpx 0 0 319rpx;
}
.good-image-large {
width: 100%;
height: 300rpx;
border-radius: 8rpx;
object-fit: cover;
}
.good-details-large {
width: 100%;
margin-top: 20rpx;
display: flex;
align-items: center;
}
.large-image {
flex-direction: column;
padding: 20rpx;
}
.good-info {
display: flex;
flex-direction: column;
}
.title_title {
width: 183rpx;
height: 34rpx;
}
.title_image {
width: 32rpx;
height: 32rpx;
margin-top: 1rpx;
}
.title_a {
width: 151rpx;
height: 34rpx;
overflow-wrap: break-word;
color: rgba(153, 153, 153, 1);
font-size: 24rpx;
font-family: PingFang SC-Regular;
font-weight: normal;
text-align: left;
white-space: nowrap;
}
.title_content {
width: 540rpx;
height: 155rpx;
overflow-wrap: break-word;
color: rgba(153, 153, 153, 1);
font-size: 22rpx;
font-family: PingFang SC-Regular;
font-weight: normal;
text-align: left;
}
</style>

View File

@ -2,28 +2,20 @@
<view class="page flex-col">
<view class="box_1 flex-row">
<view class="image-wrapper_1 flex-col">
<image
class="image_1"
:src="
isLogin
<image class="image_1" :src="isLogin
? member.avatar
? member.avatar
: '/static/images/mine/default.png'
: '/static/images/mine/default.png'
"
/>
" />
</view>
<view class="text-group_1 flex-col justify-between">
<text
class="text_1"
v-if="isLogin"
@tap="
<text class="text_1" v-if="isLogin" @tap="
serv({
type: 'pages',
pages: '/pages/components/pages/mine/userinfo',
})
"
>
">
Hi, {{ member.nickname }}
</text>
<text class="text_1" v-else @tap="login"> Hi, 游客 </text>
@ -37,20 +29,14 @@
<text class="text_4">积分</text>
<view class="group_3 flex-row justify-between">
<text class="text_5">{{ isLogin ? member.integral : 0 }}</text>
<view
class="box_7 flex-row justify-end"
@tap="
<view class="box_7 flex-row justify-end" @tap="
serv({
type: 'pages',
pages: '/pages/components/pages/balance/bill?cate=1',
})
"
>
">
<text class="text_6">去兑换</text>
<image
class="label_2"
src="/static/images/mine/arrow_right_small.png"
/>
<image class="label_2" src="/static/images/mine/arrow_right_small.png" />
</view>
</view>
<text class="text_7">积分可用于兑换产品</text>
@ -60,20 +46,14 @@
<text class="text_8">优惠券</text>
<view class="section_1 flex-row justify-between">
<text class="text_9">{{ isLogin ? member.couponCount : 0 }}</text>
<view
class="block_1 flex-row justify-end"
@tap="
<view class="block_1 flex-row justify-end" @tap="
serv({
type: 'pages',
pages: '/pages/components/pages/coupons/coupons',
})
"
>
">
<text class="text_10">去使用</text>
<image
class="label_3"
src="/static/images/mine/arrow_right_small.png"
/>
<image class="label_3" src="/static/images/mine/arrow_right_small.png" />
</view>
</view>
<text class="text_11">使用优惠券享受更多优惠</text>
@ -91,19 +71,16 @@
<image class="label_5" src="/static/images/mine/arrow_right.png" />
</view> -->
<!-- 订单 -->
<view v-if="index === 0" class="box_8 flex-row" @tap="serv(item)">
<!-- <view v-if="index === 1" class="box_8 flex-row" @tap="serv(item)">
<view class="image-wrapper_3 flex-col">
<image
class="label_4"
:src="item.image || '/static/images/mine/order_icon.png'"
/>
<image class="label_4" :src="item.image || '/static/images/mine/order_icon.png'" />
</view>
<text class="text_12">{{ item.name }}</text>
<image class="label_5" src="/static/images/mine/arrow_right.png" />
</view>
</view> -->
<!-- 历史消费 -->
<view
<!-- <view
v-else-if="index === 1"
class="box_9 flex-row"
@tap="
@ -121,10 +98,10 @@
</view>
<text class="text_13">历史消费</text>
<image class="label_6" src="/static/images/mine/arrow_right.png" />
</view>
</view> -->
<!-- 客服 -->
<view v-else-if="index === 2" class="box_11 flex-row" @tap="serv(item)">
<!-- <view v-else-if="index === 2" class="box_11 flex-row" @tap="serv(item)">
<view class="image-wrapper_5 flex-col">
<image
class="label_7"
@ -135,10 +112,10 @@
</view>
<text class="text_14">{{ item.name }}</text>
<image class="label_8" src="/static/images/mine/arrow_right.png" />
</view>
</view> -->
<!-- 地址 -->
<view v-else-if="index === 3" class="box_12 flex-row" @tap="serv(item)">
<!-- <view v-else-if="index === 3" class="box_12 flex-row" @tap="serv(item)">
<view class="section_3 flex-col">
<image
class="label_4"
@ -147,15 +124,12 @@
</view>
<text class="text_15">{{ item.name }}</text>
<image class="label_9" src="/static/images/mine/arrow_right.png" />
</view>
</view> -->
<!-- 其他服务项 -->
<view v-else class="box_14 flex-row" @tap="serv(item)">
<view class="box_14 flex-row" @tap="serv(item)">
<view class="image-wrapper_6 flex-col">
<image
class="label_10"
:src="item.image || '/static/images/mine/help_center_icon.png'"
/>
<image class="label_10" :src="item.image || '/static/images/mine/help_center_icon.png'" />
</view>
<text class="text_16">{{ item.name }}</text>
<image class="label_11" src="/static/images/mine/arrow_right.png" />
@ -248,10 +222,25 @@ const serv = (item) => {
url: `${item.pages}?spreadUid=${member.value.spreadUid}`,
});
}
} else if(item.pages === "/pages/components/pages/invoice/invoice") {
} else if (item.pages === "/pages/components/pages/invoice/invoice") {
uni.navigateTo({
url: `/pages/components/pages/invoice/invoice?userId=${member.value.id}`,
});
} else if (item.pages === "/pages/order/order") {
uni.switchTab({
url: '/pages/order/order'
});
} else if (item.pages === "/pages/components/pages/mine/helpcenter") {
uni.navigateTo({
url:
"/pages/components/pages/mine/helpcenter?id=" +
item.id +
"&name=" +
item.name +
"&phone=" +
item.phone,
});
break;
} else {
uni.navigateTo({
url: item.pages,

View File

@ -8,33 +8,21 @@
</view>
</view>
<view class="text-wrapper_9 flex-row justify-between">
<text
v-for="(item, index) in tabList"
:key="index"
:class="[
<text v-for="(item, index) in tabList" :key="index" :class="[
'tab-text',
current === index ? 'tab-active' : 'tab-inactive',
]"
@tap="change({ type: item.type, index })"
>
]" @tap="change({ type: item.type, index })">
{{ item.name }}
</text>
</view>
</view>
<view class="box_5 flex-col">
<!-- 订单列表 -->
<view
v-for="(item, index) in orders"
:key="index"
class="section_4 flex-col"
@tap="detail(item.orderId)"
>
<view v-for="(item, index) in orders" :key="index" class="section_4 flex-col" @tap="detail(item.orderId)">
<view class="group_3 flex-row justify-between">
<view class="text-group_3 flex-col justify-between">
<text class="text_6">{{ item.shop.name }}</text>
<text class="text_7"
>下单日期{{ formatDateTime(item.createTime) }}</text
>
<text class="text_7">下单日期{{ formatDateTime(item.createTime) }}</text>
</view>
<view class="section_9 flex-col justify-between">
<!-- <view class="text-wrapper_4 flex-col">
@ -53,22 +41,12 @@
<!-- 订单商品信息 -->
<view class="order-goods flex-col">
<view
class="flex goods-item"
v-for="(good, goodIndex) in item.cartInfo"
:key="goodIndex"
>
<image
:src="good.image"
mode="aspectFill"
class="goods-image"
></image>
<view class="flex goods-item" v-for="(good, goodIndex) in item.cartInfo" :key="goodIndex">
<image :src="good.image" mode="aspectFill" class="goods-image"></image>
<view class="flex flex-column goods-info">
<view class="goods-title">{{ good.title }}</view>
<view class="goods-spec">{{ good.spec }}</view>
<view class="goods-price"
>×{{ good.number }} ¥{{ good.price }}</view
>
<view class="goods-price">×{{ good.number }} ¥{{ good.price }}</view>
</view>
</view>
</view>
@ -76,19 +54,13 @@
<!-- 操作按钮 -->
<!-- 支付按钮 -->
<view class="group_4 flex-row">
<view
v-if="item.statusDto.type === '0'"
class="text-wrapper_6 flex-col action-button"
@tap.stop="handlePay(item)"
>
<view v-if="item.statusDto.type === '0'" class="text-wrapper_6 flex-col action-button"
@tap.stop="handlePay(item)">
<text class="text_11">支付</text>
</view>
<!-- 发票按钮 -->
<view
v-if="item.statusDto.type === '4'"
class="text-wrapper_6 flex-col action-button"
@tap.stop="handleInvoice(item)"
>
<view v-if="item.statusDto.type === '4'" class="text-wrapper_6 flex-col action-button"
@tap.stop="handleInvoice(item)">
<text class="text_11">
{{
item.invoiceStatus === "UNREQUESTED"
@ -102,17 +74,16 @@
</text>
</view>
<view
v-if="item.paid > 0 && item.status < 2 && item.refundStatus == 0"
class="text-wrapper_6 flex-col action-button"
@tap.stop="receive(item)"
>
<view v-if="item.paid > 0 && item.status < 2 && item.refundStatus == 0"
class="text-wrapper_6 flex-col action-button" @tap.stop="receive(item)">
<text class="text_11">确认收到餐</text>
</view>
<view
class="text-wrapper_6 flex-col action-button detail-button"
@tap.stop="detail(item.orderId)"
>
<view v-if="item.refundStatus == 2" class="text-wrapper_6 flex-col action-button"
style="background-color: #f0f0f0;">
<text class="text_11" style="color: #999;">已退款</text>
</view>
<view class="text-wrapper_6 flex-col action-button detail-button" @tap.stop="detail(item.orderId)">
<text class="text_11">订单详情</text>
</view>
</view>
@ -136,6 +107,7 @@ import {
} from "@dcloudio/uni-app";
import { formatDateTime, kmUnit } from "@/utils/util";
import { orderGetOrders, orderReceive } from "@/api/order";
import { checkUserInvoiceInfo } from "@/api/invoice";
import { applyInvoice } from "@/api/order";
// payUnify
@ -143,7 +115,7 @@ import { payUnify } from "@/api/order";
import { isWeixin } from "@/utils/util";
const main = useMainStore();
const { isLogin } = storeToRefs(main);
const { member, isLogin } = storeToRefs(main);
const title = ref("我的订单");
const page = ref(1);
@ -186,7 +158,9 @@ onLoad(() => {
if (!isLogin.value) {
uni.navigateTo({ url: "/pages/components/pages/login/login" });
}
onShow();
if (isLogin.value) {
getOrders(true); //
}
});
onShow(() => {
if (isLogin.value) {
@ -289,12 +263,28 @@ const handlePay = async (item) => {
const handleInvoice = async (item) => {
if (item.invoiceStatus === "UNREQUESTED") {
//
const checkInvoice = await checkUserInvoiceInfo();
if (checkInvoice) {
const res = await applyInvoice(item.orderId);
if (res) {
uni.showToast({ title: "发票申请已提交", icon: "success" });
await getOrders(true); //
}
} else {
//
uni.showToast({
title: '未填写开发票所需信息,请先填写',
icon: 'none',
duration: 1500
});
// 2s
setTimeout(() => {
uni.navigateTo({
url: `/pages/components/pages/invoice/invoice?userId=${member.value.id}`,
});
}, 1500);
}
} else if (item.invoiceStatus === "SUCCESS") {
//
if (item.invoiceAddress) {

24
utils/share.js Normal file
View File

@ -0,0 +1,24 @@
// utils/share.js
export default {
onLoad() { // 创建时设置统一页面的默认值
uni.$mpShare = {
title: '爱愈膳汤浦',
path: '/pages/index/index',
imageUrl: 'https://file.aiyushantp.com/file/b22aa4e4625714e2747b15cfa174ea2351e59df4bacec69d338f9c87c7dae5ca.png' // 全局图片链接
}
},
onShareAppMessage() { //发送给朋友
console.log(uni.$mpShare);
return uni.$mpShare
},
onShareTimeline() { //分享到朋友圈
return uni.$mpShare
},
onUnload() { // 关闭页面时重置
uni.$mpShare = {
title: '爱愈膳汤浦',
path: '/pages/index/index',
imageUrl: 'https://file.aiyushantp.com/file/b22aa4e4625714e2747b15cfa174ea2351e59df4bacec69d338f9c87c7dae5ca.png' // 全局图片链接
}
}
}