Compare commits

...

98 Commits

Author SHA1 Message Date
038c616a52 update 2025-09-22 14:49:28 +08:00
6d195af85e update 2025-09-18 18:48:19 +08:00
c3907904ff update 2025-09-17 21:52:42 +08:00
6d29326dc4 update 2025-09-12 19:07:34 +08:00
efa521af56 'update' 2025-09-12 19:06:27 +08:00
3b21630d78 update 2025-09-08 14:52:09 +08:00
0464dc2657 update 2025-09-08 14:50:34 +08:00
d1af10a28a update 2025-09-06 13:46:11 +08:00
53e8ce8478 'update' 2025-09-05 21:45:41 +08:00
9cd8d36a9d update 2025-09-01 18:25:51 +08:00
d2794dfe1a update 2025-08-27 16:01:18 +08:00
6dfb913822 update 2025-08-25 13:22:50 +08:00
b1b2d1d8dc update 2025-08-20 20:25:11 +08:00
王一嘉
ce253405d9 update 2025-08-19 15:19:08 +08:00
王一嘉
0db9c62a8a update 2025-08-19 08:59:35 +08:00
王一嘉
28515f5d3a update 2025-08-18 21:15:40 +08:00
王一嘉
39a701f666 update 2025-08-18 15:41:37 +08:00
王一嘉
2eb5ad2f6f update 2025-08-13 11:41:08 +08:00
王一嘉
592a7bf333 update 2025-08-13 11:01:05 +08:00
王一嘉
0e61a98a5e update 2025-08-12 14:02:39 +08:00
王一嘉
dd55a759be update 2025-08-06 16:01:01 +08:00
王一嘉
e2636149e5 update 2025-07-29 17:42:54 +08:00
王一嘉
9d166e919c update 2025-07-28 18:36:47 +08:00
王一嘉
7885f0e2e0 update 2025-07-28 18:08:42 +08:00
王一嘉
ead031f2ae update 2025-07-24 21:23:06 +08:00
王一嘉
e237f77086 update 2025-07-24 20:40:44 +08:00
王一嘉
9b162d49d0 update 2025-07-24 16:46:31 +08:00
王一嘉
54bdfb6261 update 2025-07-24 16:21:01 +08:00
王一嘉
7658c63b46 update 2025-07-24 16:03:29 +08:00
王一嘉
0819032049 update 2025-07-24 11:00:48 +08:00
王一嘉
bddd14faff update 2025-07-23 19:10:17 +08:00
王一嘉
f5da17b9f9 update 2025-07-23 19:06:07 +08:00
王一嘉
4a49650bfe update 2025-07-22 20:31:39 +08:00
王一嘉
1c7513dfdd update 2025-07-22 19:53:28 +08:00
王一嘉
a3a17ec96a update 2025-07-22 19:49:53 +08:00
王一嘉
8d4c585e53 update 2025-07-22 18:38:39 +08:00
王一嘉
d4b90b09f8 update 2025-07-22 17:10:03 +08:00
王一嘉
38538db468 update 2025-07-21 16:19:55 +08:00
王一嘉
422d082d72 update 2025-07-21 11:28:03 +08:00
王一嘉
b15962dd65 update 2025-07-21 08:54:13 +08:00
王一嘉
50a85dd274 update 2025-07-18 20:36:00 +08:00
王一嘉
bdb05623e9 update 2025-07-17 20:26:41 +08:00
王一嘉
8117a7ace1 update 2025-07-17 20:23:08 +08:00
王一嘉
49d294f453 update 2025-07-17 19:42:32 +08:00
王一嘉
8cd3064948 update 2025-07-17 19:17:42 +08:00
王一嘉
a5661e935e update 2025-07-17 19:07:09 +08:00
王一嘉
9f97bcb78e update 2025-07-17 18:46:33 +08:00
王一嘉
a9d57ac260 update 2025-07-15 19:00:47 +08:00
王一嘉
e6801555b1 update 2025-07-15 18:53:44 +08:00
王一嘉
c04598460d update 2025-07-15 15:29:54 +08:00
王一嘉
7f1d3c0f4b update 2025-07-15 14:42:56 +08:00
王一嘉
61fb0171fb update 2025-07-14 18:56:19 +08:00
王一嘉
62fd756962 update 2025-07-14 18:05:57 +08:00
王一嘉
d68450709b update 2025-07-14 16:58:46 +08:00
af94cd0a97 update 2025-07-08 18:53:09 +08:00
a9b635750b update 2025-07-08 18:16:13 +08:00
df703398cb update 2025-07-08 17:44:31 +08:00
31095494fd update 2025-07-08 17:33:49 +08:00
de2aeb6abb update 2025-07-07 19:31:43 +08:00
2841a70642 update 2025-07-07 18:08:16 +08:00
06e4d99691 update 2025-07-07 16:07:46 +08:00
2d03c09cc1 update 2025-07-07 15:23:10 +08:00
d9ef508399 update 2025-07-02 18:14:54 +08:00
14f64944a5 update 2025-07-02 18:12:58 +08:00
369d123a9f update 2025-07-02 16:11:18 +08:00
deb4cca695 update 2025-07-02 15:59:04 +08:00
90f815b4f9 update 2025-07-02 15:34:54 +08:00
392533a3b6 update 2025-07-02 15:22:16 +08:00
5a3012d0fb update 2025-07-02 14:06:46 +08:00
5a737478b9 update 2025-07-02 09:52:55 +08:00
a7cd0f1520 update 2025-07-01 09:42:30 +08:00
f1b456e520 update 2025-07-01 09:41:04 +08:00
cbfd818879 update 2025-07-01 09:19:59 +08:00
da14663be7 update 2025-06-30 20:09:44 +08:00
07889701b3 update 2025-06-30 19:21:24 +08:00
a18737012b update 2025-06-27 15:40:40 +08:00
c540bf78f8 update 2025-06-27 09:09:00 +08:00
063d7812da update 2025-06-27 09:06:41 +08:00
24501eba9d update 2025-06-27 09:04:06 +08:00
cfff1b4062 update 2025-06-26 20:25:32 +08:00
e18168ea73 update 2025-06-26 20:05:36 +08:00
0a9da0f5af update 2025-06-26 19:46:37 +08:00
c022c0c6da update 2025-06-26 17:14:20 +08:00
5f682d0467 update 2025-06-26 17:13:33 +08:00
04c26fbba8 update 2025-06-26 17:12:15 +08:00
a48bbd1980 update 2025-06-26 16:27:22 +08:00
26fed40ba2 update 2025-06-26 15:56:48 +08:00
dcd277835b update 2025-06-26 13:56:00 +08:00
5147d79bff update 2025-06-25 20:25:44 +08:00
346471ab91 update 2025-06-25 15:28:23 +08:00
3ac2bbcf07 update 2025-06-24 20:55:09 +08:00
b98de4746d update 2025-06-23 19:07:23 +08:00
1ae5c75f5e update 2025-06-23 17:28:26 +08:00
534adf126a update 2025-06-23 14:44:05 +08:00
56caa92801 update 2025-06-21 16:36:32 +08:00
2af3effa6f update 2025-06-21 16:29:45 +08:00
31fa4e0a5c update 2025-06-21 15:59:38 +08:00
5d714030be update 2025-06-21 15:45:01 +08:00
96 changed files with 4587 additions and 816 deletions

4
.env
View File

@@ -1,5 +1,5 @@
VITE_API_URL=http://admin.ceshi.guo123.cn/api
VITE_API_URL=https://api.ykaaa.cn/api
VITE_TINYMCE_KEY=agmu6i1c6k7bcp36oenzyz7yi1yplptq7goyx88y1g6ofnqu
VITE_AES_KEY=st123456654321st
VITE_APP_ID=wxa4dd2d036c8156a4
VITE_APP_VERSION=trial
VITE_APP_VERSION=release

2415
bun.lock Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -56,6 +56,7 @@
"@dcloudio/uni-mp-xhs": "3.0.0-alpha-4050420250306001",
"@dcloudio/uni-quickapp-webview": "3.0.0-alpha-4050420250306001",
"@tailwindcss/vite": "^4.1.7",
"@types/lodash": "^4.17.20",
"@uni-helper/vite-plugin-uni-tailwind": "^0.15.2",
"axios": "0.27.0",
"crypto-js": "^4.2.0",
@@ -66,6 +67,7 @@
"pinia": "^2.3.1",
"pinia-plugin-persistedstate": "^4.3.0",
"postcss": "^8.5.3",
"sass": "^1.89.2",
"sass-embedded": "^1.89.0",
"tailwindcss": "^4.1.7",
"tailwindcss-rem2px-preset": "^1.0.3",

257
pnpm-lock.yaml generated
View File

@@ -13,10 +13,10 @@ importers:
version: 3.0.0-alpha-4050420250306001(@dcloudio/types@3.4.15)(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vue@3.5.14)
'@dcloudio/uni-app-harmony':
specifier: 3.0.0-alpha-4050420250306001
version: 3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)
version: 3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)
'@dcloudio/uni-app-plus':
specifier: 3.0.0-alpha-4050420250306001
version: 3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)
version: 3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)
'@dcloudio/uni-components':
specifier: 3.0.0-alpha-4050420250306001
version: 3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vue@3.5.14)
@@ -58,10 +58,13 @@ importers:
version: 3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vue@3.5.14)
'@tailwindcss/vite':
specifier: ^4.1.7
version: 4.1.7(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1))
version: 4.1.7(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1))
'@types/lodash':
specifier: ^4.17.20
version: 4.17.20
'@uni-helper/vite-plugin-uni-tailwind':
specifier: ^0.15.2
version: 0.15.2(rollup@4.41.0)(tailwindcss@4.1.7)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1))
version: 0.15.2(rollup@4.41.0)(tailwindcss@4.1.7)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1))
axios:
specifier: 0.27.0
version: 0.27.0
@@ -89,6 +92,9 @@ importers:
postcss:
specifier: ^8.5.3
version: 8.5.3
sass:
specifier: ^1.89.2
version: 1.89.2
sass-embedded:
specifier: ^1.89.0
version: 1.89.0
@@ -131,7 +137,7 @@ importers:
version: 3.0.0-alpha-4050420250306001
'@dcloudio/vite-plugin-uni':
specifier: 3.0.0-alpha-4050420250306001
version: 3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)
version: 3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)
'@tailwindcss/postcss':
specifier: ^4.1.7
version: 4.1.7
@@ -143,7 +149,7 @@ importers:
version: 3.5.14
vite:
specifier: 6.3.5
version: 6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1)
version: 6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1)
weapp-tailwindcss:
specifier: ^4.1.7
version: 4.1.7(tailwindcss@4.1.7)
@@ -1728,6 +1734,88 @@ packages:
resolution: {integrity: sha512-aw6u6mT3TnM/MmcCRDMv3i9Sbm5/ZMSJgDl+N+WsrWNDIQ2sWmsqdDkjb/HyXF20SNwc2891hRBkaQr3hG2mhA==}
engines: {node: '>=18.12.0'}
'@parcel/watcher-android-arm64@2.5.1':
resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [android]
'@parcel/watcher-darwin-arm64@2.5.1':
resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [darwin]
'@parcel/watcher-darwin-x64@2.5.1':
resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [darwin]
'@parcel/watcher-freebsd-x64@2.5.1':
resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [freebsd]
'@parcel/watcher-linux-arm-glibc@2.5.1':
resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==}
engines: {node: '>= 10.0.0'}
cpu: [arm]
os: [linux]
'@parcel/watcher-linux-arm-musl@2.5.1':
resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==}
engines: {node: '>= 10.0.0'}
cpu: [arm]
os: [linux]
'@parcel/watcher-linux-arm64-glibc@2.5.1':
resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [linux]
'@parcel/watcher-linux-arm64-musl@2.5.1':
resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [linux]
'@parcel/watcher-linux-x64-glibc@2.5.1':
resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [linux]
'@parcel/watcher-linux-x64-musl@2.5.1':
resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [linux]
'@parcel/watcher-win32-arm64@2.5.1':
resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [win32]
'@parcel/watcher-win32-ia32@2.5.1':
resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==}
engines: {node: '>= 10.0.0'}
cpu: [ia32]
os: [win32]
'@parcel/watcher-win32-x64@2.5.1':
resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [win32]
'@parcel/watcher@2.5.1':
resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==}
engines: {node: '>= 10.0.0'}
'@pkgjs/parseargs@0.11.0':
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
@@ -1775,67 +1863,56 @@ packages:
resolution: {integrity: sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA==}
cpu: [arm]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm-musleabihf@4.41.0':
resolution: {integrity: sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg==}
cpu: [arm]
os: [linux]
libc: [musl]
'@rollup/rollup-linux-arm64-gnu@4.41.0':
resolution: {integrity: sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw==}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm64-musl@4.41.0':
resolution: {integrity: sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ==}
cpu: [arm64]
os: [linux]
libc: [musl]
'@rollup/rollup-linux-loongarch64-gnu@4.41.0':
resolution: {integrity: sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w==}
cpu: [loong64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-powerpc64le-gnu@4.41.0':
resolution: {integrity: sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg==}
cpu: [ppc64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-riscv64-gnu@4.41.0':
resolution: {integrity: sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A==}
cpu: [riscv64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-riscv64-musl@4.41.0':
resolution: {integrity: sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A==}
cpu: [riscv64]
os: [linux]
libc: [musl]
'@rollup/rollup-linux-s390x-gnu@4.41.0':
resolution: {integrity: sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw==}
cpu: [s390x]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-gnu@4.41.0':
resolution: {integrity: sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ==}
cpu: [x64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-musl@4.41.0':
resolution: {integrity: sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg==}
cpu: [x64]
os: [linux]
libc: [musl]
'@rollup/rollup-win32-arm64-msvc@4.41.0':
resolution: {integrity: sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg==}
@@ -1902,28 +1979,24 @@ packages:
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@tailwindcss/oxide-linux-arm64-musl@4.1.7':
resolution: {integrity: sha512-PjGuNNmJeKHnP58M7XyjJyla8LPo+RmwHQpBI+W/OxqrwojyuCQ+GUtygu7jUqTEexejZHr/z3nBc/gTiXBj4A==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [musl]
'@tailwindcss/oxide-linux-x64-gnu@4.1.7':
resolution: {integrity: sha512-HMs+Va+ZR3gC3mLZE00gXxtBo3JoSQxtu9lobbZd+DmfkIxR54NO7Z+UQNPsa0P/ITn1TevtFxXTpsRU7qEvWg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [glibc]
'@tailwindcss/oxide-linux-x64-musl@4.1.7':
resolution: {integrity: sha512-MHZ6jyNlutdHH8rd+YTdr3QbXrHXqwIhHw9e7yXEBcQdluGwhpQY2Eku8UZK6ReLaWtQ4gijIv5QoM5eE+qlsA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [musl]
'@tailwindcss/oxide-wasm32-wasi@4.1.7':
resolution: {integrity: sha512-ANaSKt74ZRzE2TvJmUcbFQ8zS201cIPxUDm5qez5rLEwWkie2SkGtA4P+GPTj+u8N6JbPrC8MtY8RmJA35Oo+A==}
@@ -1995,6 +2068,9 @@ packages:
'@types/istanbul-reports@3.0.4':
resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==}
'@types/lodash@4.17.20':
resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==}
'@types/node@22.15.19':
resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==}
@@ -2628,6 +2704,11 @@ packages:
resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
detect-libc@1.0.3:
resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
engines: {node: '>=0.10'}
hasBin: true
detect-libc@2.0.4:
resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==}
engines: {node: '>=8'}
@@ -3416,28 +3497,24 @@ packages:
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
libc: [glibc]
lightningcss-linux-arm64-musl@1.30.1:
resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
libc: [musl]
lightningcss-linux-x64-gnu@1.30.1:
resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
libc: [glibc]
lightningcss-linux-x64-musl@1.30.1:
resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
libc: [musl]
lightningcss-win32-arm64-msvc@1.30.1:
resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==}
@@ -3676,6 +3753,9 @@ packages:
resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==}
engines: {node: '>= 0.6'}
node-addon-api@7.1.1:
resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
node-fetch-native@1.6.6:
resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==}
@@ -4385,6 +4465,11 @@ packages:
engines: {node: '>=16.0.0'}
hasBin: true
sass@1.89.2:
resolution: {integrity: sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==}
engines: {node: '>=14.0.0'}
hasBin: true
sax@1.4.1:
resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
@@ -6017,10 +6102,10 @@ snapshots:
'@dcloudio/types@3.4.15': {}
'@dcloudio/uni-app-harmony@3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)':
'@dcloudio/uni-app-harmony@3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)':
dependencies:
'@dcloudio/uni-app-uts': 3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vue@3.5.14)
'@dcloudio/uni-app-vite': 3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)
'@dcloudio/uni-app-vite': 3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)
debug: 4.4.1
fs-extra: 10.1.0
licia: 1.48.0
@@ -6035,10 +6120,10 @@ snapshots:
- vite
- vue
'@dcloudio/uni-app-plus@3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)':
'@dcloudio/uni-app-plus@3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)':
dependencies:
'@dcloudio/uni-app-uts': 3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vue@3.5.14)
'@dcloudio/uni-app-vite': 3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)
'@dcloudio/uni-app-vite': 3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)
'@dcloudio/uni-app-vue': 3.0.0-alpha-4050420250306001
debug: 4.4.1
fs-extra: 10.1.0
@@ -6088,14 +6173,14 @@ snapshots:
- ts-node
- vue
'@dcloudio/uni-app-vite@3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)':
'@dcloudio/uni-app-vite@3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)':
dependencies:
'@dcloudio/uni-cli-shared': 3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vue@3.5.14)
'@dcloudio/uni-i18n': 3.0.0-alpha-4050420250306001
'@dcloudio/uni-nvue-styler': 3.0.0-alpha-4050420250306001
'@dcloudio/uni-shared': 3.0.0-alpha-4050420250306001
'@rollup/pluginutils': 5.1.4(rollup@4.41.0)
'@vitejs/plugin-vue': 5.1.0(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)
'@vitejs/plugin-vue': 5.1.0(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)
'@vue/compiler-dom': 3.4.21
'@vue/compiler-sfc': 3.4.21
debug: 4.4.1
@@ -6611,7 +6696,7 @@ snapshots:
- ts-node
- vue
'@dcloudio/vite-plugin-uni@3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)':
'@dcloudio/vite-plugin-uni@3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)':
dependencies:
'@babel/core': 7.27.1
'@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.1)
@@ -6619,9 +6704,9 @@ snapshots:
'@dcloudio/uni-cli-shared': 3.0.0-alpha-4050420250306001(@nuxt/kit@3.17.3)(postcss@8.5.3)(rollup@4.41.0)(vue@3.5.14)
'@dcloudio/uni-shared': 3.0.0-alpha-4050420250306001
'@rollup/pluginutils': 5.1.4(rollup@4.41.0)
'@vitejs/plugin-legacy': 5.3.2(terser@5.39.2)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1))
'@vitejs/plugin-vue': 5.1.0(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)
'@vitejs/plugin-vue-jsx': 3.1.0(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)
'@vitejs/plugin-legacy': 5.3.2(terser@5.39.2)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1))
'@vitejs/plugin-vue': 5.1.0(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)
'@vitejs/plugin-vue-jsx': 3.1.0(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)
'@vue/compiler-core': 3.4.21
'@vue/compiler-dom': 3.4.21
'@vue/compiler-sfc': 3.4.21
@@ -6638,7 +6723,7 @@ snapshots:
picocolors: 1.1.1
terser: 5.39.2
unplugin-auto-import: 0.18.6(@nuxt/kit@3.17.3)(rollup@4.41.0)
vite: 6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1)
vite: 6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1)
transitivePeerDependencies:
- '@nuxt/kit'
- '@vueuse/core'
@@ -7366,6 +7451,67 @@ snapshots:
transitivePeerDependencies:
- magicast
'@parcel/watcher-android-arm64@2.5.1':
optional: true
'@parcel/watcher-darwin-arm64@2.5.1':
optional: true
'@parcel/watcher-darwin-x64@2.5.1':
optional: true
'@parcel/watcher-freebsd-x64@2.5.1':
optional: true
'@parcel/watcher-linux-arm-glibc@2.5.1':
optional: true
'@parcel/watcher-linux-arm-musl@2.5.1':
optional: true
'@parcel/watcher-linux-arm64-glibc@2.5.1':
optional: true
'@parcel/watcher-linux-arm64-musl@2.5.1':
optional: true
'@parcel/watcher-linux-x64-glibc@2.5.1':
optional: true
'@parcel/watcher-linux-x64-musl@2.5.1':
optional: true
'@parcel/watcher-win32-arm64@2.5.1':
optional: true
'@parcel/watcher-win32-ia32@2.5.1':
optional: true
'@parcel/watcher-win32-x64@2.5.1':
optional: true
'@parcel/watcher@2.5.1':
dependencies:
detect-libc: 1.0.3
is-glob: 4.0.3
micromatch: 4.0.8
node-addon-api: 7.1.1
optionalDependencies:
'@parcel/watcher-android-arm64': 2.5.1
'@parcel/watcher-darwin-arm64': 2.5.1
'@parcel/watcher-darwin-x64': 2.5.1
'@parcel/watcher-freebsd-x64': 2.5.1
'@parcel/watcher-linux-arm-glibc': 2.5.1
'@parcel/watcher-linux-arm-musl': 2.5.1
'@parcel/watcher-linux-arm64-glibc': 2.5.1
'@parcel/watcher-linux-arm64-musl': 2.5.1
'@parcel/watcher-linux-x64-glibc': 2.5.1
'@parcel/watcher-linux-x64-musl': 2.5.1
'@parcel/watcher-win32-arm64': 2.5.1
'@parcel/watcher-win32-ia32': 2.5.1
'@parcel/watcher-win32-x64': 2.5.1
optional: true
'@pkgjs/parseargs@0.11.0':
optional: true
@@ -7529,12 +7675,12 @@ snapshots:
postcss: 8.5.3
tailwindcss: 4.1.7
'@tailwindcss/vite@4.1.7(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1))':
'@tailwindcss/vite@4.1.7(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1))':
dependencies:
'@tailwindcss/node': 4.1.7
'@tailwindcss/oxide': 4.1.7
tailwindcss: 4.1.7
vite: 6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1)
vite: 6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1)
'@tootallnate/once@1.1.2': {}
@@ -7577,6 +7723,8 @@ snapshots:
dependencies:
'@types/istanbul-lib-report': 3.0.3
'@types/lodash@4.17.20': {}
'@types/node@22.15.19':
dependencies:
undici-types: 6.21.0
@@ -7595,20 +7743,20 @@ snapshots:
dependencies:
std-env: 3.9.0
'@uni-helper/vite-plugin-uni-tailwind@0.15.2(rollup@4.41.0)(tailwindcss@4.1.7)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1))':
'@uni-helper/vite-plugin-uni-tailwind@0.15.2(rollup@4.41.0)(tailwindcss@4.1.7)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1))':
dependencies:
'@babel/core': 7.27.1
'@uni-helper/uni-env': 0.1.7
'@vivaxy/wxml': 2.1.0
postcss: 8.5.3
tailwindcss: 4.1.7
vite: 6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1)
vite: 6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1)
optionalDependencies:
rollup: 4.41.0
transitivePeerDependencies:
- supports-color
'@vitejs/plugin-legacy@5.3.2(terser@5.39.2)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1))':
'@vitejs/plugin-legacy@5.3.2(terser@5.39.2)(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1))':
dependencies:
'@babel/core': 7.27.1
'@babel/preset-env': 7.27.2(@babel/core@7.27.1)
@@ -7619,23 +7767,23 @@ snapshots:
regenerator-runtime: 0.14.1
systemjs: 6.15.1
terser: 5.39.2
vite: 6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1)
vite: 6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1)
transitivePeerDependencies:
- supports-color
'@vitejs/plugin-vue-jsx@3.1.0(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)':
'@vitejs/plugin-vue-jsx@3.1.0(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)':
dependencies:
'@babel/core': 7.27.1
'@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.1)
'@vue/babel-plugin-jsx': 1.4.0(@babel/core@7.27.1)
vite: 6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1)
vite: 6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1)
vue: 3.5.14
transitivePeerDependencies:
- supports-color
'@vitejs/plugin-vue@5.1.0(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)':
'@vitejs/plugin-vue@5.1.0(vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1))(vue@3.5.14)':
dependencies:
vite: 6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1)
vite: 6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1)
vue: 3.5.14
'@vivaxy/wxml@2.1.0': {}
@@ -8285,6 +8433,9 @@ snapshots:
destroy@1.2.0: {}
detect-libc@1.0.3:
optional: true
detect-libc@2.0.4: {}
detect-newline@3.1.0: {}
@@ -9592,6 +9743,9 @@ snapshots:
negotiator@1.0.0: {}
node-addon-api@7.1.1:
optional: true
node-fetch-native@1.6.6: {}
node-int64@0.4.0: {}
@@ -10326,6 +10480,14 @@ snapshots:
sass-embedded-win32-ia32: 1.89.0
sass-embedded-win32-x64: 1.89.0
sass@1.89.2:
dependencies:
chokidar: 4.0.3
immutable: 5.1.2
source-map-js: 1.2.1
optionalDependencies:
'@parcel/watcher': 2.5.1
sax@1.4.1: {}
saxes@5.0.1:
@@ -10788,7 +10950,7 @@ snapshots:
vary@1.1.2: {}
vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(terser@5.39.2)(yaml@2.7.1):
vite@6.3.5(@types/node@22.15.19)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.89.0)(sass@1.89.2)(terser@5.39.2)(yaml@2.7.1):
dependencies:
esbuild: 0.25.4
fdir: 6.4.4(picomatch@4.0.2)
@@ -10801,6 +10963,7 @@ snapshots:
fsevents: 2.3.3
jiti: 2.4.2
lightningcss: 1.30.1
sass: 1.89.2
sass-embedded: 1.89.0
terser: 5.39.2
yaml: 2.7.1

View File

@@ -1,16 +1,26 @@
<script>
import {useUserStore} from "./pinia/UserStore/index.js";
import {toPage} from "./utils/uils.js";
import {useSystemStore} from "./pinia/SystemStore/index.js";
export default {
onLaunch: function () {
},
onShow: function () {
// #ifndef MP-WEIXIN
const ua = navigator.userAgent.toLowerCase();
if (ua.indexOf("micromessenger") !== -1) {
toPage('/pages/notSupported/index');
return;
}
const UserStore = useUserStore();
if (!UserStore.isLogin) {
if (!UserStore.isLogin && window.location.href.indexOf('/pages/register/index') < 0 && window.location.href.indexOf('/pages/fastInput/index') < 0) {
toPage('/pages/login/index');
}
if (UserStore.isLogin) {
const SystemStore = useSystemStore();
SystemStore.getMessageCount();
}
// #endif
},
onHide: function () {

View File

@@ -163,7 +163,7 @@ const system = {
} else {
return request({
method: MethodsENUM.POST,
url: "/notice/getNotice",
url: "/task/getNewExchangeLog",
data: data,
});
}
@@ -271,6 +271,13 @@ const system = {
data: data
});
},
editWithdrawLog: async (data) => {
return request({
method: MethodsENUM.POST,
url: "/user/editWithdrawLog",
data: data
});
},
getWithdrawalInfo: async (id) => {
return request({
method: MethodsENUM.POST,
@@ -376,6 +383,13 @@ const system = {
data: data
});
},
interventionV2: async (data) => {
return request({
method: MethodsENUM.POST,
url: "/Task/addIntervention",
data: data
});
},
complaint: async (data) => {
return request({
method: MethodsENUM.POST,
@@ -390,6 +404,69 @@ const system = {
data: data
});
},
setExchangeTop: async (data) => {
return request({
method: MethodsENUM.POST,
url: "/task/setChildrenTop",
data: data
});
},
setChildrenRead: async (data) => {
return request({
method: MethodsENUM.POST,
url: "/task/setChildrenRead",
data: data
});
},
getUserIncome: async (data) => {
return request({
method: MethodsENUM.POST,
url: "/user/getUserIncome",
data: data
});
},
getPoster: async (data) => {
return request({
method: MethodsENUM.POST,
url: "/user/getPoster",
data: data
});
},
passLogin: async (id) => {
return request({
method: MethodsENUM.POST,
url: "/login/passLogin",
data: {id}
});
},
checkDownload: async (id) => {
return request({
method: MethodsENUM.POST,
url: "/Task/checkDownload",
data: {id}
});
},
setAccountStatus: async (data) => {
return request({
method: MethodsENUM.POST,
url: "/user/setAccountStatus",
data: data
});
},
getPlatformImages: async (data) => {
return request({
method: MethodsENUM.POST,
url: "/Task/getPlatformImages",
data: data
});
},
getChildrenCount: async (data) => {
return request({
method: MethodsENUM.POST,
url: "/task/getChildrenCount",
data: data
});
},
}
export default system;

View File

@@ -1,10 +1,11 @@
<script setup lang="ts">
import NULLICON from "../static/images/缺省图.png";
<script setup>
import NULLICON from "../static/images/yczh.png";
import XModal from "./XModal.vue";
import {getCurrentInstance, nextTick, onMounted, reactive, ref, watch} from "vue";
import PlatformENUM from "../enum/PlatformENUM";
import Api from "../api/index";
import {showToast} from "../utils/uils";
import {showToast, toPage} from "../utils/uils";
import {debounce} from "lodash";
const emits = defineEmits(['success']);
const {details} = defineProps({
@@ -71,19 +72,20 @@ watch(
{deep: true}
)
const success = async () => {
const success = debounce(async () => {
if (!selected.value) {
showToast('请选择帐号');
return;
}
const {msg} = await Api.system.acceptTask({
const {data: {task_children_id, task_id}} = await Api.system.acceptTask({
id: details.id,
account: selected.value,
});
showToast(msg);
showToast('任务接受成功');
show.value = false;
await toPage(`/pages/taskDetails/index?id=${task_id}&task_children_id=${task_children_id}&delta=999`)
emits('success');
}
}, 500);
</script>
<template>
@@ -111,30 +113,39 @@ const success = async () => {
<view class="!mt-[20rpx] px-[16rpx]">
<template v-if="vo.length > 0">
<view
:key="index"
@click="v.is_use !== 0 && po.status === 0 ? selected = v.id : null"
v-for="(v, index) in vo"
class="!flex items-center py-[22rpx]">
<radio :checked="selected === v.id"
:disabled="v.is_use === 0 || po.status>0"></radio>
<image class="!size-[80rpx] rounded-[50%] overflow-hidden !ml-[34rpx]"
:src="PlatformENUM[v.platform_id]"></image>
<view class="!flex flex-col !ml-[16rpx]">
<view class="test-28r">{{ v.nickname }}</view>
<view class="text-[#86909C] test-24r">{{ v.account }}</view>
<scroll-view style="height: 30vh" scroll-y>
<view
:key="index"
@click="v.is_use !== 0 && po.status === 0 ? selected = v.id : null"
v-for="(v, index) in vo"
class="!flex items-center py-[22rpx]">
<view class="relative">
<radio
@focus="(e) => {console.log(e)}"
:checked="selected === v.id"
:disabled="v.is_use === 0 || po.status>0">
</radio>
<view @click="v.is_use !== 0 && po.status === 0 ? selected = v.id : null"
class="!size-full absolute left-0 top-0"></view>
</view>
<image class="!size-[80rpx] rounded-[50%] overflow-hidden !ml-[34rpx]"
:src="PlatformENUM[v.platform_id]"></image>
<view class="!flex flex-col !ml-[16rpx]">
<view class="test-28r">{{ v.nickname }}</view>
<view class="text-[#86909C] test-24r">{{ v.account }}</view>
</view>
<view class="text-[#4E5969] test-24r bg-[#F2F3F5] rounded-[4rpx] !ml-auto"
v-if="v.is_use === 0">
今日已接其他任务
</view>
</view>
<view class="text-[#4E5969] test-24r bg-[#F2F3F5] rounded-[4rpx] !ml-auto"
v-if="v.is_use === 0">
今日已接其他任务
</view>
</view>
</scroll-view>
</template>
<template v-else>
<view class="!flex flex-col items-center pb-[50rpx]">
<image class="!size-[260rpx]" :src="NULLICON"></image>
<view class="test-28r">
<view class="test-28r" v-if="po.status===0">
可在我的账号管理中添加自媒体账号
</view>
</view>

View File

@@ -0,0 +1,40 @@
<script setup>
import BACK_TOP_ICON from "../static/icons/backtop.png";
const emits = defineEmits(['top', 'setScroll']);
const {tabs} = defineProps({
tabs: {
type: [],
default: () => []
}
});
</script>
<template>
<view class="bg-[rgba(29,33,41,1)] rounded-[12rpx] p-[8rpx] fixed top-1/2 -translate-y-1/2 right-0 z-[999]">
<view
@click="emits('top')"
class="py-[18rpx] px-[24rpx] !flex justify-around flex-col items-center h-[100rpx] bg-[rgba(78,89,105,1)] rounded-[8rpx]">
<image class="!h-[12rpx]" :src="BACK_TOP_ICON" mode="heightFix"></image>
<view class="text-[rgba(201,205,212,1)] test-28r">顶部</view>
</view>
<view class="h-[16rpx] !flex justify-center items-center">
<view class="w-[40rpx] bg-[#4E5969] h-[2rpx]"></view>
</view>
<template v-for="(v, index) in tabs">
<view class="py-[18rpx] px-[24rpx]" @click="emits('setScroll', v.value)">
<view :class="['text-[rgba(201,205,212,1)] test-28r', v.now ? 'text-white' : '']">{{ v.name1 }}</view>
<view :class="['text-[rgba(201,205,212,1)] test-28r', v.now ? 'text-white' : '']">{{ v.name2 }}</view>
</view>
<view class="h-[16rpx] !flex justify-center items-center" v-if="index < tabs.length-1">
<view class="w-[40rpx] bg-[#4E5969] h-[2rpx]"></view>
</view>
</template>
</view>
</template>
<style scoped lang="scss">
.text-white {
color: #fff;
}
</style>

View File

@@ -1,16 +1,14 @@
<script setup>
import {computed} from 'vue';
import {computed, onMounted} from 'vue';
import messageIcon from "../static/icons/messageIcon.png";
import XActionsheet from "./XActionsheet.vue";
import OpenTypeFun from "./OpenTypeFun.js";
import {showToast, toPage} from "../utils/uils.js";
import {useSystemStore} from "../pinia/SystemStore/index.js";
import Api from "../api/index.js";
const itemList = computed(() => {
const item = [];
true ?
item.push({text: '标记未读', type: 0}) :
item.push({text: '标记已读', type: 1});
return item;
})
const SystemStore = useSystemStore();
const emits = defineEmits(['success']);
const {contextRow, type, data} = defineProps({
contextRow: {
type: String,
@@ -26,9 +24,55 @@ const {contextRow, type, data} = defineProps({
}
});
const selectActionsheet = (e) => {
console.log(e);
const itemList = computed(() => {
const tp = SystemStore.message.find(v => v.id === data.id);
const list = type === 0 ? [
{text: '置顶', type: 1, hide: data.is_top === 1},
{text: '取消置顶', type: 0, hide: data.is_top === 0},
{text: '标记已读', type: 1, hide: data.is_read === 0},
{text: '标记未读', type: 0, hide: data.is_read > 0},
] : [
{text: '标记已读', type: 0, hide: tp.is_read},
{text: '标记未读', type: 1, hide: !tp.is_read},
]
return list.filter(v => !v.hide);
})
const selectActionsheet = async (e) => {
if (e.text === '置顶' || e.text === '取消置顶') {
const {msg} = await Api.system.setExchangeTop({
id: data.id,
type: e.type,
});
showToast(msg);
} else {
if (type === 0) {
const {msg} = await Api.system.setChildrenRead({
id: data.id,
type: e.type,
});
showToast(msg);
} else {
const index = SystemStore.message.findIndex(v => v.id === data.id);
SystemStore.message[index].is_read = !SystemStore.message[index].is_read;
}
}
emits('success');
}
const openOpenTypeFun = () => {
const index = SystemStore.message.findIndex(v => v.id === data.id);
SystemStore.message[index].is_read = true;
OpenTypeFun(data);
emits('success');
}
onMounted(() => {
if (type === 1) {
const now = SystemStore.message.find(v => v.id === data.id);
if (!now) SystemStore.message.push({...data, is_read: false});
}
});
</script>
<template>
@@ -36,13 +80,18 @@ const selectActionsheet = (e) => {
@success="selectActionsheet"
:itemList="itemList">
<view
@click.stop="OpenTypeFun(data)"
@click.stop="type === 0 ? toPage(`/pages/taskDetails/index?id=${data.task_id}&task_children_id=${data.id}&tab=3`) : openOpenTypeFun()"
class="!py-[30rpx] !px-[24rpx] bg-[#fff] rounded-[8rpx] !flex items-center gap-[20rpx] overflow-hidden relative !mb-[20rpx]">
<image class="!size-[72rpx] flex-shrink-0" mode="aspectFill" :src="messageIcon"></image>
<view class="relative">
<image class="!size-[72rpx] flex-shrink-0" mode="aspectFill" :src="messageIcon"></image>
<view v-if="type === 0 ? data.is_read>0 : !SystemStore.message.find(v => v.id===data.id).is_read"
class="size-[20rpx] bg-[#f00] absolute right-0 top-0 rounded-[50%]"></view>
</view>
<view class="flex-grow !flex flex-col gap-[12rpx]">
<view class="!flex justify-between items-center">
<view class="bh">{{ type === 0 ? '任务编号: DF12122' : data.title }}</view>
<view class="time">2024-01-26 14:00</view>
<view class="bh">{{ data.title }}</view>
<view class="time">{{ data.createtime }}</view>
</view>
<view :class="['context', contextRow]">
{{ data.content }}

View File

@@ -0,0 +1,46 @@
<script setup>
import {ref} from "vue";
const {type} = defineProps({
type: {
type: Number,
default: 2
}
});
let promise, resolve, reject;
const value = ref();
const DateTimeRef = ref();
const open = () => {
const {promise: _promise, resolve: _resolve, reject: _reject} = Promise.withResolvers();
promise = _promise;
resolve = _resolve;
reject = _reject;
DateTimeRef.value.show();
return promise;
}
const success = ({result}) => {
value.value = result;
resolve(result);
}
const cancel = () => {
reject("取消了选择");
}
defineExpose({
open,
});
</script>
<template>
<tui-datetime ref="DateTimeRef" :type="type" @confirm="success" @cancel="cancel"></tui-datetime>
</template>
<style scoped lang="scss">
</style>

View File

@@ -1,6 +1,4 @@
<script setup>
import dy from "../static/images/抖音.png";
import qrw from "../static/icons/qrw.png";
import XCountdown from "./XCountdown.vue";
import {toPage} from "../utils/uils.js";
import FBENUM from "../enum/FBENUM.js";
@@ -22,21 +20,25 @@ const {data} = defineProps({
<view style="font-size: 28rpx">
任务编号{{ data.uid }}
</view>
<view v-if="data.back_status === 1" style="font-size: 24rpx">
<view v-if="data.back_status === 0" style="font-size: 24rpx">
<Text class="text-[#165DFF]">{{ dayjs(data.time).format('MM-DD-HH:mm') }}</Text>
后可开始回填
</view>
<view v-else-if="data.status === -1" class="text-[rgb(78,89,105)]" style="font-size: 24rpx">
已失效
</view>
<x-countdown v-else :time="dayjs(data.time)">
<x-countdown v-else-if="data.back_status === 1" :time="dayjs(data.time)">
<view style="font-size: 24rpx;font-weight: 400;" class="text-[rgb(78,89,105)]">回填倒计时:</view>
</x-countdown>
<x-countdown v-else-if="data.back_status === 2" :time="dayjs(data.time)">
<view style="font-size: 24rpx;font-weight: 400;" class="text-[rgb(78,89,105)]">审核倒计时:</view>
</x-countdown>
<view v-else-if="data.status === -1 || data.status === 3" class="text-[rgb(78,89,105)]"
style="font-size: 24rpx">
{{ data.time }}
</view>
</view>
<view class="!flex gap-[26rpx] !pt-[20rpx]">
<image class="!size-[88rpx] rounded-[50%] overflow-hidden" mode="aspectFill"
:src="PlatformENUM[data.platform_id]"></image>
:src="data.logo"></image>
<view class="!h-[88rpx] !flex flex-col justify-between">
<view class="title">{{ data.goods_name }}</view>
<view class="!flex gap-[8rpx]">
@@ -45,7 +47,11 @@ const {data} = defineProps({
</view>
</view>
<view class="!h-[88rpx] !ml-auto !flex items-center gap-[6rpx]">
<view class="price-info">{{ data.status_text }}</view>
<view class="price-info">
<text class="text-[rgb(255,87,34)]" v-if="data.is_settlement===1">{{ data.status_text }}</text>
<text class="text-black" v-if="data.is_settlement===0">{{ data.status_text }}</text>
<text class="text-[rgb(0,180,42)]" v-if="data.is_settlement===2">{{ data.status_text }}</text>
</view>
<view class="price">
<text class="unit">¥</text>
{{ data.coin.toFixed(2) }}
@@ -62,6 +68,10 @@ const {data} = defineProps({
<view>领取时间:</view>
<view>{{ data.accept_time }}</view>
</view>
<view v-if="data.is_settlement === 2" class="!flex gap-[8rpx] justify-between">
<view>提示:</view>
<view>{{ data.retention }}</view>
</view>
</view>
</view>
</template>

View File

@@ -15,7 +15,7 @@ const {data} = defineProps({
<template>
<view class="rounded-[8rpx] bg-[#fff] !p-[24rpx]" @click="toPage(`/pages/taskDetails/index?id=${data.id}&home=1`)">
<view class="!flex gap-[26rpx]">
<image class="!size-[88rpx] rounded-[50%] overflow-hidden" mode="aspectFill" :src="dy"></image>
<image class="!size-[88rpx] rounded-[50%] overflow-hidden" mode="aspectFill" :src="data.logo"></image>
<view class="!h-[88rpx] !flex flex-col justify-between">
<view class="title">{{ data.goods_name }}</view>
<view class="!flex gap-[8rpx]">

View File

@@ -1,12 +1,14 @@
<script setup>
import {onMounted} from "vue";
import {onMounted, reactive} from "vue";
import XModal from "./XModal.vue";
import XQrCode from "./XQrCode.vue";
import Api from "../api/index.js";
const show = defineModel('show');
const detail = reactive({});
onMounted(() => {
Api.system.getQrcode(2).then(({data}) => {
Object.assign(detail, data);
});
});
</script>
@@ -14,11 +16,12 @@ onMounted(() => {
<x-modal
v-model:show="show">
<view class="px-[30rpx] py-[40rpx] relative">
<image @click="show=false" class="!w-[52rpx] !h-[52rpx] absolute top-[-110rpx] right-[calc(-100%-10rpx)]" src="/static/icons/close.png"></image>
<image @click="show=false" class="!w-[52rpx] !h-[52rpx] absolute top-[-110rpx] right-[calc(-100%-10rpx)]"
src="/static/icons/close.png"></image>
<view class="title">关注微信公众号</view>
<view class="!mt-[24rpx] w-[320rpx] !mx-auto aspect-square">
<x-qr-code size="320rpx" :qrSize="180" content="公众号"></x-qr-code>
<image class="!size-[320rpx]" :src="detail.qrcode" mode="aspectFill"></image>
</view>
<view class="desc">截图后扫码变现快人一步</view>
</view>

View File

@@ -0,0 +1,65 @@
<script setup>
import XModal from "./XModal.vue";
import {reactive, ref} from "vue";
import XSelect from "./XSelect.vue";
import Api from "../api";
import {debounce} from "lodash";
import {showToast} from "../utils/uils.js";
const emits = defineEmits(['success']);
const props = defineProps({
id: {
type: String,
default: null,
}
});
const show = ref(false);
const form = reactive({
payType: null,
});
const getApi = async () => {
const {data} = await Api.system.getWithdrawal();
return {
data: data.map(v => ({
...v,
id: v.id,
name: `(${v.type_text}) ${v.realname} ${v.account}`,
})),
}
}
const success = debounce(async () => {
const {msg} = await Api.system.editWithdrawLog({
id: props.id,
wid: form.payType,
});
showToast(msg);
show.value = false;
emits('success')
}, 500);
</script>
<template>
<Text @click="show=true">
<slot></slot>
</Text>
<x-modal v-model:show="show">
<view class="px-[16px] py-[20px] text-[#000]">
<view class="text-[#000] text-center">提现失败</view>
<view class="!my-2 text-black">请修改您的提现信息确保所有信息都归属于用一个自然人修改后在下方选择正确的提现信息
</view>
<x-select v-model:model-value="form.payType" :api="getApi"
placeholder="请选择提现方式"></x-select>
<view class="!flex gap-3 !mt-3">
<tui-button height="80rpx" type="gray" @click="show=false">取消</tui-button>
<tui-button height="80rpx" @click="success">重新提现</tui-button>
</view>
</view>
</x-modal>
</template>
<style scoped lang="scss">
</style>

View File

@@ -5,6 +5,7 @@ const emits = defineEmits(['success']);
const show = ref(false);
const success = (e) => {
show.value = false;
emits('success', e);
}
</script>
@@ -19,7 +20,6 @@ const success = (e) => {
:show="show"
@click="success"
@cancel="show=false">
</tui-actionsheet>
</template>

View File

@@ -1,25 +1,39 @@
<script setup>
import {ref} from "vue";
import {ref, watch} from "vue";
import dayjs from "dayjs";
const {time} = defineProps({
const props = defineProps({
time: {
type: String,
default: dayjs(new Date()).add(20, 'minutes'),
default: null,
}
});
const diff = ref(dayjs(time).diff(dayjs(new Date()), 'second'));
const diff = ref(dayjs(props.time).diff(dayjs(new Date()), 'second'));
const hours = ref(null);
const minutes = ref(null);
const seconds = ref(null);
const timer = setInterval(() => {
diff.value = dayjs(time).diff(dayjs(new Date()), 'second');
hours.value = Math.floor(diff.value / 3600);
minutes.value = Math.floor((diff.value % 3600) / 60);
seconds.value = diff.value % 60;
}, 1000);
let timer = null;
watch(
() => props.time,
() => {
console.log('运行')
clearInterval(timer);
diff.value = dayjs(props.time).diff(dayjs(new Date()), 'second');
hours.value = Math.floor(diff.value / 3600);
minutes.value = Math.floor((diff.value % 3600) / 60);
seconds.value = diff.value % 60;
timer = setInterval(() => {
diff.value = dayjs(props.time).diff(dayjs(new Date()), 'second');
hours.value = Math.floor(diff.value / 3600);
minutes.value = Math.floor((diff.value % 3600) / 60);
seconds.value = diff.value % 60;
}, 1000);
},
{deep: true, immediate: true}
)
</script>
<template>
@@ -27,10 +41,13 @@ const timer = setInterval(() => {
<slot></slot>
<view class="!flex gap-[16rpx] items-center">
<view class="time-block" v-if="hours && hours>0">{{ hours < 10 ? `0${hours}` : hours }}</view>
<view class="time-block" v-else>00</view>
<view v-if="hours">:</view>
<view class="time-block" v-if="minutes && minutes>0">{{ minutes < 10 ? `0${minutes}` : minutes }}</view>
<view class="time-block" v-else>00</view>
<view v-if="minutes">:</view>
<view class="time-block" v-if="seconds && seconds>0">{{ seconds < 10 ? `0${seconds}` : seconds }}</view>
<view class="time-block" v-else>00</view>
</view>
</view>
</template>

View File

@@ -1,12 +1,15 @@
<script setup>
const visible = defineModel('visible');
const model = defineModel('model');
const emits = defineEmits(['success']);
const emits = defineEmits(['success', 'init']);
import {watch, ref} from "vue";
const XFilterRef = ref();
const init = () => {
Object.keys(model.value).forEach(key => {
model.value[key] = null;
});
emits('init');
success();
}
@@ -14,10 +17,25 @@ const success = () => {
visible.value = false;
emits('success');
}
watch(
() => visible.value,
(val) => {
const node = XFilterRef.value.$el.nextElementSibling.childNodes[2];
console.log(node);
if (val) {
node.style.transform = 'none';
} else {
node.style.transform = 'translate3d(0, -100%, 0)';
}
},
{deep: true}
)
</script>
<template>
<tui-drawer
ref="XFilterRef"
mode="top"
maskZIndex="999"
zIndex="999"

View File

@@ -1,6 +1,6 @@
<script setup>
import {ref} from 'vue';
import SY_ICON from '../static/icons/水印_预览.png';
import SY_ICON from '../static/icons/syyl.png';
const {src, list, imageClass, sy} = defineProps({
src: {
@@ -36,13 +36,20 @@ defineExpose({
</script>
<template>
<template v-if="!$slots.default">
<!-- #ifndef MP-WEIXIN -->
<image @click="open" v-bind="$attrs" :src="src" mode="aspectFill"></image>
<image v-if="!src.endsWith('.mp4')" @click="open" v-bind="$attrs" :src="src" mode="aspectFill"></image>
<view class="relative" v-else @click="open">
<video v-bind="$attrs" :controls="false" :src="src"></video>
<view class="size-full absolute z-10 left-0 top-0"></view>
</view>
<!-- #endif -->
<!-- #ifdef MP-WEIXIN -->
<image @click="open" :class="imageClass" :src="src" mode="aspectFill"></image>
<image v-if="!src.endsWith('.mp4')" @click="open" :class="imageClass" :src="src" mode="aspectFill"></image>
<view :class="imageClass" style="position: relative;" v-else @click="open">
<video :controls="false" :src="src" class="!size-full"></video>
<view class="size-full absolute z-10 left-0 top-0"></view>
</view>
<!-- #endif -->
</template>
<view v-else @click="open">
@@ -57,9 +64,16 @@ defineExpose({
<template v-if="list.length>1">
<swiper class="!size-full" :current="cur" @change="({detail:{current}})=>cur=current">
<swiper-item v-for="src in list">
<image class="!size-full" :src="src" mode="aspectFit"></image>
<image v-if="sy" class="!size-full !absolute left-0 top-0" :src="SY_ICON"
mode="aspectFit"></image>
<template v-if="!src.endsWith('.mp4')">
<image @click.stop class="!size-full" :src="src" mode="aspectFit"></image>
<image @click.stop v-if="sy" class="!size-full !absolute left-0 top-0" :src="SY_ICON"
mode="aspectFit"></image>
</template>
<template v-else>
<view class="!size-full !flex items-center" @click.stop>
<video class="!w-full" :src="src" :controls="true"></video>
</view>
</template>
</swiper-item>
</swiper>
@@ -69,7 +83,16 @@ defineExpose({
</view>
</template>
<template v-else>
<image class="!size-full" :src="src" mode="aspectFit"></image>
<template v-if="!src.endsWith('.mp4')">
<image class="!size-full" :src="src" mode="aspectFit"></image>
<image v-if="sy" class="!size-full !absolute left-0 top-0" :src="SY_ICON"
mode="aspectFit"></image>
</template>
<template v-else>
<view class="!size-full !flex items-center" @click.stop>
<video class="!w-full" :src="src" :controls="true"></video>
</view>
</template>
</template>

View File

@@ -2,10 +2,14 @@
import {ref} from 'vue';
import {backPage, isWXWeb} from "../utils/uils.js";
const {showBack} = defineProps({
const {showBack, delta} = defineProps({
showBack: {
type: Boolean,
default: true
},
delta: {
type: Number,
default: 1,
}
});
@@ -17,7 +21,7 @@ const title = ref(document.title);
<view class="!flex justify-center items-center w-full h-[100rpx] bg-[#f9f9f9] fixed left-0 top-0 z-[1000]">
<image
v-if="showBack"
@click="backPage()"
@click="backPage(delta)"
class="!w-[9px] !h-[17px] cursor-pointer !absolute left-[50rpx]"
src="/static/icons/back.png">
</image>

View File

@@ -1,5 +1,5 @@
<script setup>
import {onMounted, ref, watch} from "vue";
import {nextTick, ref, watch} from "vue";
import warn from '../static/icons/warn.png';
import success from '../static/icons/info.png';
@@ -16,8 +16,8 @@ const STATUS = {
const {text, status, tile, textColor} = defineProps({
text: {
type: String,
default: '提示请在规定时间内按要求提交回填1。以免影响收益。哈哈哈哈哈哈哈哈哈哈'
type: Array,
default: ['1.你好你好', '2.啊我就会发回复哈', '3.测试啊u发哈u发货']
},
textColor: {
type: String,
@@ -32,52 +32,68 @@ const {text, status, tile, textColor} = defineProps({
default: false,
}
});
const showIndex = ref(0);
const XNoticeBox = ref();
const Context = ref();
const roll = ref(false);
watch(
() => text,
() => showIndex.value,
() => {
if (!tile) {
if (
Context.value.$el.clientWidth
>
XNoticeBox.value.$el.clientWidth
) {
roll.value = true;
}
nextTick(() => {
if (
Context.value.$el.clientWidth
>
XNoticeBox.value.$el.clientWidth
) {
roll.value = true;
} else {
roll.value = false;
}
})
}
},
{deep: true}
)
onMounted(() => {
if (!tile) {
if (
Context.value.$el.clientWidth
>
XNoticeBox.value.$el.clientWidth
) {
const changeCur = ({detail: {current}}) => {
if (
Context.value[current].$el.clientWidth
>
XNoticeBox.value[current].$el.clientWidth
) {
setTimeout(() => {
roll.value = true;
}
}, 500);
} else {
roll.value = false;
}
});
}
</script>
<template>
<view ref="XNoticeBox" :class="['x-notice-box', STATUS[status].bg]">
<view ref="Context" :class="['context', roll ? 'roll' : '', STATUS[status].context]"
:style="{alignItems: tile ? 'start' : 'center'}">
<image v-if="status==='error'" class="!size-[26rpx] flex-shrink-0" :src="warn"></image>
<image v-else class="!size-[26rpx] flex-shrink-0" :src="success"></image>
<text v-if="!tile" class="!whitespace-nowrap flex-shrink-0" :style="{color: textColor}"
v-html="text"></text>
<text v-else :style="{color: textColor}" v-html="text">
</text>
</view>
</view>
<swiper style="height: 80rpx;" autoplay vertical @change="changeCur">
<swiper-item v-for="v in text">
<view ref="XNoticeBox" :class="['x-notice-box', STATUS[status].bg]">
<view ref="Context" :class="['context', roll ? 'roll' : '', STATUS[status].context]"
:style="{alignItems: tile ? 'start' : 'center'}">
<image v-if="status==='error'" class="!size-[26rpx] flex-shrink-0" :src="warn"></image>
<image v-else class="!size-[26rpx] flex-shrink-0" :src="success"></image>
<view v-if="!tile">
<view
class="!whitespace-nowrap flex-shrink-0"
:style="{color: textColor}"
v-html="v">
</view>
</view>
<text v-else :style="{color: textColor}" v-html="text">
</text>
</view>
</view>
</swiper-item>
</swiper>
</template>
<style scoped lang="scss">
@@ -98,7 +114,7 @@ onMounted(() => {
}
.x-notice-box {
padding: 18rpx 24rpx;
padding: 18rpx 24rpx 18rpx 36rpx;
width: 100%;
overflow: hidden;
}
@@ -120,7 +136,7 @@ onMounted(() => {
@keyframes Roll {
0% {
transform: translateX(100%);
transform: translateX(0%);
}
100% {
transform: translateX(-100%);

View File

@@ -8,9 +8,9 @@ const show = ref(false);
<template>
<image v-if="!$slots.button" class="!size-[24rpx]" :src="ICON" mode="aspectFill" @click="show=true"></image>
<div v-else @click="show=true">
<Text v-else @click="show=true">
<slot name="button"></slot>
</div>
</Text>
<x-confirm-modal
width="500rpx"

View File

@@ -2,6 +2,7 @@
import DOWNICON from "../static/icons/down.png";
import {onMounted, reactive} from "vue";
const emits = defineEmits(['change']);
const {placeholder, api} = defineProps({
placeholder: {
type: String,
@@ -19,6 +20,7 @@ const modelValue = defineModel();
const change = ({detail: {value}}) => {
modelValue.value = list.filter(v => !v.hidden)[value].id;
emits('change', list.filter(v => !v.hidden)[value].id);
}
onMounted(() => {
@@ -31,7 +33,7 @@ onMounted(() => {
<template>
<picker :range="list.filter(v => !v.hidden).map(v => v.name)" @change="change">
<view class="x-select">
<view class="x-select" v-if="!$slots.default">
<view v-if="modelValue === null" class="text-[#86909C] test-28r">
{{ placeholder }}
</view>
@@ -41,6 +43,7 @@ onMounted(() => {
<image :src="DOWNICON" class="!size-[24rpx]" mode="aspectFill"></image>
</view>
<slot v-else></slot>
</picker>
</template>

View File

@@ -2,7 +2,7 @@
import {ref} from "vue";
import testIcon from '../static/images/test.png';
import XImage from "./XImage.vue";
import ICON from "../static/icons/水印_素材案例.png";
import ICON from "../static/icons/sy_sc.png";
const XImageRef = ref();
const {list, showSY} = defineProps({
@@ -25,13 +25,14 @@ const openPrew = () => {
<template>
<view class="relative">
<x-image :sy="showSY" ref="XImageRef" class="!w-[160rpx] !h-[160rpx]" mode="aspectFill" :src="list[0]"
<x-image :sy="showSY" ref="XImageRef" class="!w-[160rpx] !h-[160rpx]"
mode="aspectFill" :src="list[0]"
:list="list"></x-image>
<image v-if="showSY" class="!size-full !absolute left-0 top-0" :src="ICON" mode="aspectFill"
@click="openPrew"></image>
<view class="!flex absolute left-1/2 -translate-x-1/2 bottom-[20rpx] z-10 gap-[8rpx]">
<view class="!flex absolute left-1/2 -translate-x-1/2 bottom-[20rpx] z-20 gap-[8rpx]">
<view v-for="(_v, index) in list"
:class="[`rounded-[50%] !size-[12rpx] ${index === 0 ? 'bg-[rgba(255,255,255,1)]' : 'bg-[rgba(255,255,255,.67)]'}`]"></view>
</view>

View File

@@ -1,8 +1,9 @@
<script setup lang="ts">
<script setup>
import CLOSE_ICON from "../static/icons/close2.png";
import ADDICON from "../static/icons/add.png";
import {uploadFile} from "../utils/uils";
import XImage from "./XImage.vue";
import useUploadLength from "../hooks/useUploadLength.js";
const {size, single, del} = defineProps({
size: {
@@ -21,12 +22,21 @@ const {size, single, del} = defineProps({
const emits = defineEmits(['success']);
const files = defineModel('files');
if (single) useUploadLength({
array: files.value,
length: 1,
})
const upload = async () => {
uploadFile({
count: 1,
}).then(([res]) => {
const {data} = res;
files.value?.push(data);
if (!single) {
files.value?.push(data);
} else {
files.value = [data];
}
emits('success', data);
})
}

View File

@@ -1,5 +1,5 @@
<script setup>
import {ref} from 'vue'
import {ref, watch} from 'vue'
import XModal from "./XModal.vue";
import fmt from '../static/images/fmt.png';
import play from '../static/icons/play.png';
@@ -22,6 +22,16 @@ defineExpose({
open
});
watch(
() => show.value,
(val) => {
if (!val) {
playVideo.value = false;
}
},
{deep: true}
)
const changeSwiper = ({detail}) => {
current.value = detail.current;
}
@@ -62,7 +72,7 @@ const changeSwiper = ({detail}) => {
</image>
<view class="!w-full relative rounded-[16rpx] overflow-hidden">
<image v-if="!playVideo" class="!w-full" mode="widthFix" :src="fmt"></image>
<image v-if="!playVideo" class="!w-full" mode="widthFix" :src="options.file"></image>
<view @click="playVideo=!playVideo" v-if="!playVideo"
class="absolute left-0 top-0 w-full h-full bg-[rgba(0,0,0,.4)] z-10 !flex justify-center items-center">
<image class="!w-[94rpx] !h-[94rpx]" :src="play"></image>
@@ -73,7 +83,7 @@ const changeSwiper = ({detail}) => {
@pause="playVideo=!playVideo"
class="!w-full"
v-else
src="https://shopyunlng.oss-cn-beijing.aliyuncs.com/upload/2025/03-18/15-31-150289-429952696.m4v">
:src="options.pop_video[0]">
</video>
</view>
</view>

View File

@@ -12,6 +12,7 @@ function useTableQuery({
parameter,
api,
callback,
uuid = false,
immediate = true,
watchParameter = false,
}) {
@@ -56,12 +57,14 @@ function useTableQuery({
vo.page = _vo.page;
vo.total = _vo.total;
vo.rows = [...vo.rows, ..._vo.rows];
vo.rows = Array.from(
vo.rows.reduce((map, item) => {
map.set(item.id, item);
return map;
}, new Map()).values()
)
if (uuid) {
vo.rows = Array.from(
vo.rows.reduce((map, item) => {
map.set(item.id, item);
return map;
}, new Map()).values()
)
}
callback && callback(vo);
} finally {

View File

@@ -0,0 +1,17 @@
import {watch} from "vue";
import {showToast} from "../utils/uils.js";
const useUploadLength = ({array, length}) => {
watch(
() => array,
(val) => {
if (val.length > length) {
showToast(`最多可上传${length}`);
val.length = length;
}
},
{deep: true,}
)
}
export default useUploadLength;

View File

@@ -22,6 +22,13 @@
"navigationStyle": "custom"
}
},
{
"path": "pages/fastInput/index",
"style": {
"navigationBarTitleText": "快速进入",
"navigationStyle": "custom"
}
},
{
"path": "pages/myTask/index",
"style": {
@@ -183,6 +190,13 @@
"navigationBarTitleText": "投诉邀请人",
"navigationStyle": "custom"
}
},
{
"path": "pages/notSupported/index",
"style": {
"navigationBarTitleText": "前往浏览器",
"navigationStyle": "custom"
}
}
// #endif
],

View File

@@ -0,0 +1,85 @@
<script setup>
import UQRCode from 'uqrcodejs';
import {onMounted, ref, onUnmounted} from 'vue';
const emits = defineEmits(['handleLongPress']);
const {bg, invite, member_url} = defineProps({
bg: {
type: String,
default: null
},
invite: {
type: String,
default: null
},
member_url: {
type: String,
default: null
},
});
const itemList = [
{text: '置顶', type: 1},
{text: '取消', type: 0},
]
const CanvasRef = ref();
const QRRef = ref();
let canvas = null;
let timer = null;
const imageSrc = ref(null);
onMounted(() => {
const _canvas = CanvasRef.value.$el.children[0];
const ctx = _canvas.getContext("2d");
canvas = _canvas;
draw(ctx, _canvas);
timer = setInterval(() => {
imageSrc.value = canvas.toDataURL('image/png')
}, 1000)
});
onUnmounted(() => {
clearInterval(timer);
})
const draw = (ctx, canvas) => {
const img = new Image();
img.crossOrigin = 'Anonymous';
img.src = bg;
img.onload = function () {
ctx.drawImage(img, 0, 0, canvas.width / 3, canvas.height / 3);
const qr = new UQRCode();
qr.data = `${member_url}/pages/register/index?invite=${invite}`;
qr.size = 200;
qr.margin = 10;
qr.make()
const QRRefCanvas = QRRef.value.$el.children[0];
qr.canvasContext = QRRefCanvas.getContext("2d");
qr.drawCanvas().then(() => {
const base64 = QRRefCanvas.toDataURL('image/png');
const qr_img = new Image();
qr_img.src = base64;
qr_img.onload = function () {
const size = 65;
const x = 17.5;
const y = canvas.height / 3 - 88 + 7;
ctx.drawImage(qr_img, x, y, size, size);
}
});
}
}
</script>
<template>
<view class="!size-full relative">
<canvas class="!absolute !size-[200px] opacity-0" ref="QRRef"></canvas>
<canvas
class="!size-full"
ref="CanvasRef"/>
<image class="!size-full !absolute z-50 left-0 top-0" :src="imageSrc"></image>
</view>
</template>
<style scoped lang="scss">
</style>

View File

@@ -1,17 +1,103 @@
<script setup>
import {onMounted, reactive, ref} from 'vue';
import YQBX from '../../static/images/YQBX.png';
import SHOU from '../../static/icons/SHOU.png';
import LMK from '../../static/images/LMK.png';
import HB1 from '../../static/images/HB1.png';
import HB2 from '../../static/images/HB2.png';
import WS from '../../static/images/WS.png';
import TITLEBG from '../../static/images/TITLEBG.png';
import yqhyBg from '../../static/icons/yqhy-bg.png';
import XNav from "../../components/XNav.vue";
import Api from "../../api/index.js";
import Poster from "./Poster.vue";
import {download} from "../../utils/uils.js";
const swiperCur = ref(0);
const showActionSheet = ref(false);
const itemList = [
{text: '保存到相册', type: 1},
{text: '取消', type: 0},
];
const list = reactive({
invite: null,
member_url: null,
poster: [],
});
onMounted(() => {
Api.system.getPoster().then(({data}) => {
list.length = 0;
Object.assign(list, data);
})
})
let nowActive = null;
const handleLongPress = (base64) => {
nowActive = base64;
showActionSheet.value = true;
}
const success = ({type}) => {
if (type === 1) {
download(nowActive);
}
}
</script>
<template>
<!--邀请好友-->
<XNav></XNav>
<view class="h-[calc(100vh-100rpx)] relative">
<image class="!w-full" mode="widthFix" :src="yqhyBg"></image>
<view class="h-[calc(100vh-100rpx)] w-full fixed top-0 left-0">
<image class="!size-full" mode="widthFix" :src="yqhyBg"></image>
</view>
<view class="!w-full !flex justify-center !mt-[48rpx]">
<image class="!h-[100rpx]" :src="YQBX" mode="heightFix"></image>
</view>
<view class="!w-full !flex justify-center !mt-[28rpx] relative">
<image class="!h-[70rpx]" :src="TITLEBG" mode="heightFix"></image>
<image class="!h-[54rpx] !absolute top-1/2 left-1/2 -translate-1/2" :src="LMK" mode="heightFix"></image>
<image class="!h-[104rpx] !absolute left-[10%]" :src="HB1" mode="heightFix"></image>
<image class="!h-[102rpx] !absolute right-[10%] bottom-[10%]" :src="HB2" mode="heightFix"></image>
</view>
<image class="!w-[942rpx] !absolute left-1/2 -translate-x-1/2 top-[40rpx]" :src="WS" mode="widthFix"></image>
<swiper
class="!h-[908rpx] !mt-[90rpx]"
previous-margin="95rpx"
next-margin="95rpx"
@change="({detail: {current}}) => swiperCur=current"
:current="swiperCur"
circular>
<swiper-item class="!w-[564rpx]" v-for="(v, index) in list.poster">
<Poster
:bg="v"
:invite="list.invite"
:member_url="list.member_url"
@handleLongPress="handleLongPress"
:class="['duration-500', index!==swiperCur?'scale-[0.8]':'']"></Poster>
</swiper-item>
</swiper>
<tui-actionsheet
:show="showActionSheet"
:itemList="itemList"
@click="success"
@cancel="showActionSheet=false">
</tui-actionsheet>
<view
class="!w-full !h-[88rpx] bg-[rgba(0,0,0,.21)] text-white relative z-10 !flex justify-center items-center !mt-[48rpx]">
提示
<image class="!w-[56rpx] !ml-[14rpx] !mr-[10rpx]" :src="SHOU" mode="widthFix"></image>
长摁图片保存到本地
</view>
</template>
<style scoped>
<style lang="scss" scoped>
</style>

View File

@@ -10,10 +10,13 @@ import PLUSICON from "../../static/icons/plus.png";
import XNav from "../../components/XNav.vue";
import XNoticeBar from "../../components/XNoticeBar.vue";
import {showToast, toPage} from "../../utils/uils.js";
import {reactive} from "vue";
import {reactive, ref} from "vue";
import Api from "../../api/index.js";
import {onShow} from "@dcloudio/uni-app";
import {useSystemStore} from "../../pinia/SystemStore/index.js";
import XPrompt from "../../components/XPrompt.vue";
import XSelect from "../../components/XSelect.vue";
import SelectTimeAsync from "../../components/SelectTimeAsync.vue";
const SystemStore = useSystemStore();
const BASE = [
@@ -43,6 +46,7 @@ const BASE = [
icon: TTICON,
},
];
const SelectTimeAsyncRef = ref();
const list = reactive([]);
const dataList = reactive([]);
@@ -83,12 +87,30 @@ const deleteItem = async (id) => {
showToast(msg);
await getData();
}
const changeStatus = async (value, item) => {
try {
let abnormaltime = null;
if (value === 2) {
abnormaltime = await SelectTimeAsyncRef.value.open();
}
const {msg} = await Api.system.setAccountStatus({
...item,
status: value,
abnormaltime: abnormaltime,
});
showToast(msg);
} finally {
await getData();
}
}
</script>
<template>
<!--账号管理-->
<x-nav></x-nav>
<x-notice-bar status="success" text="提示:左滑查看更多,点击可查看该平台所有的账号"></x-notice-bar>
<x-notice-bar status="success" :text="['提示:左滑查看更多,点击可查看该平台所有的账号']"></x-notice-bar>
<SelectTimeAsync ref="SelectTimeAsyncRef"></SelectTimeAsync>
<view class="p-[36rpx] bg-[#fff] !flex justify-around items-center">
<template v-for="(item, index) in list" :key="item.id">
@@ -121,14 +143,49 @@ const deleteItem = async (id) => {
<view class="test-28r">{{ v.nickname }}</view>
<view class="text-[#86909C] test-24r">{{ v.account }}</view>
</view>
<view class="px-[12rpx] py-[7rpx] test-24r success" v-if="v.status === 1">
<view class="px-[12rpx] py-[7rpx] test-24r success !flex items-center gap-0.5" v-if="v.status === 1">
{{ v.status_text }}
<x-select v-if="[1,2,3].includes(v.status)" v-model:model-value="v.status"
:api="Api.system.getAccountStatus"
@change="changeStatus($event, v)">
<tui-icon size="14" name="arrowdown"></tui-icon>
</x-select>
</view>
<view class="px-[12rpx] py-[7rpx] test-24r warn" v-else-if="v.status === 0 || v.status === 3">
<view class="px-[12rpx] py-[7rpx] test-24r warn !flex items-center gap-0.5"
v-else-if="v.status === 0 || v.status === 3">
{{ v.status_text }}
<x-select v-if="[1,2,3].includes(v.status)" v-model:model-value="v.status"
:api="Api.system.getAccountStatus"
@change="changeStatus($event, v)">
<tui-icon size="14" name="arrowdown"></tui-icon>
</x-select>
</view>
<view class="px-[12rpx] py-[7rpx] test-24r error" v-else>
<view class="px-[12rpx] py-[7rpx] test-24r error !flex items-center gap-0.5"
v-else-if="v.status === -2">
<x-prompt title="封禁原因" :info="v.check_text">
<template v-slot:button>
<tui-icon name="about" :size="15" color="#F53F3F"></tui-icon>
</template>
</x-prompt>
{{ v.status_text }}
<x-select v-if="[1,2,3].includes(v.status)" v-model:model-value="v.status"
:api="Api.system.getAccountStatus"
@change="changeStatus($event, v)">
<tui-icon size="14" name="arrowdown"></tui-icon>
</x-select>
</view>
<view class="px-[12rpx] py-[7rpx] test-24r error !flex items-center gap-0.5" v-else>
<x-prompt :title="v.status_text+'原因'" :info="v.check_text">
<template v-slot:button>
<tui-icon name="about" :size="15" color="#F53F3F"></tui-icon>
</template>
</x-prompt>
{{ v.status_text }}
<x-select v-if="[1,2,3].includes(v.status)" v-model:model-value="v.status"
:api="Api.system.getAccountStatus"
@change="changeStatus($event, v)">
<tui-icon size="14" name="arrowdown"></tui-icon>
</x-select>
</view>
</view>
<view class="!w-full !h-[2rpx] bg-[#E5E6EB] !my-[20rpx]"></view>
@@ -137,9 +194,10 @@ const deleteItem = async (id) => {
<image class="!size-[88rpx] image-bor rounded-[12rpx]" :src="v.qrcode" mode="aspectFill"></image>
<!---->
<image @click="toPage(`/pages/addAccount/index?id=${v.id}`)"
<image v-if="v.status!==0 && v.status!==-2" @click="toPage(`/pages/addAccount/index?id=${v.id}`)"
class="!size-[72rpx] rounded-[50%] overflow-hidden !ml-auto" :src="EDITICON"></image>
<image @click="deleteItem(v.id)" class="!size-[72rpx] rounded-[50%] overflow-hidden"
<image v-if="v.status!==0 && v.status!==-2" @click="deleteItem(v.id)"
class="!size-[72rpx] rounded-[50%] overflow-hidden"
:src="DELETEICON"></image>
</view>
</view>

View File

@@ -6,11 +6,13 @@ import XSelect from "../../components/XSelect.vue";
import Api from "../../api/index.js";
import XInput from "../../components/XInput.vue";
import XUpload from "../../components/XUpload.vue";
import {reactive} from "vue";
import {reactive, watch} from "vue";
import {backPage, showToast} from "../../utils/uils.js";
import {onLoad} from "@dcloudio/uni-app";
import XDateTime from "../../components/XDateTime.vue";
import {useSystemStore} from "../../pinia/SystemStore/index.js";
import XImage from "../../components/XImage.vue";
import XLink from "../../components/XLink.vue";
const SystemStore = useSystemStore();
@@ -52,6 +54,30 @@ onLoad((options) => {
});
if (SystemStore.accountManagementPo.pid) form.pid = Number(SystemStore.accountManagementPo.pid);
})
const getSelect = async () => {
const {data} = await Api.system.getPlatform();
data.shift();
return {
data: data,
}
}
const ZYObj = reactive({
images1: [],
images2: [],
});
const changeP = async () => {
const {data} = await Api.system.getPlatformImages({id: form.pid});
Object.assign(ZYObj, data);
}
watch(
() => form.pid,
(val) => {
if (val) changeP();
},
{deep: true, immediate: true}
)
</script>
<template>
@@ -61,7 +87,7 @@ onLoad((options) => {
<view class="min-h-[calc(100vh-100rpx)] bg-[#fff] px-[30rpx] py-[25rpx]">
<x-form>
<x-form-item label="宣发平台">
<x-select v-model:model-value="form.pid" :api="Api.system.getPlatform"></x-select>
<x-select v-model:model-value="form.pid" :api="getSelect" @change="changeP"></x-select>
</x-form-item>
<x-form-item label="账号">
<x-input v-model:model-value="form.account" height="80rpx" placeholder="请输入帐号"></x-input>
@@ -69,17 +95,32 @@ onLoad((options) => {
<x-form-item label="昵称">
<x-input v-model:model-value="form.nickname" height="80rpx" placeholder="请输入昵称"></x-input>
</x-form-item>
<x-form-item label="账号状态">
<x-select v-model:model-value="form.status" :api="Api.system.getAccountStatus"></x-select>
</x-form-item>
<x-form-item label="恢复时间" v-if="form.status === 2">
<x-date-time :type="1" v-model:model-value="form.abnormaltime"></x-date-time>
</x-form-item>
<x-form-item label="主页截图">
<x-upload v-model:files="form.homepage"></x-upload>
<template v-slot:label>
<view class="!flex justify-between">
<view>主页截图</view>
<x-image v-if="form.pid && ZYObj.images1.length > 0" :src="ZYObj.images1[0]"
:list="ZYObj.images1">
<x-link>查看指引</x-link>
</x-image>
</view>
</template>
<x-upload v-model:files="form.homepage" single></x-upload>
</x-form-item>
<x-form-item label="主页二维码">
<x-upload v-model:files="form.qrcode"></x-upload>
<template v-slot:label>
<view class="!flex justify-between">
<view>主页二维码</view>
<x-image v-if="form.pid && ZYObj.images2.length > 0" :src="ZYObj.images2[0]"
:list="ZYObj.images2">
<x-link>查看指引</x-link>
</x-image>
</view>
</template>
<x-upload v-model:files="form.qrcode" single></x-upload>
</x-form-item>
</x-form>

View File

@@ -89,7 +89,7 @@ const success = async () => {
<view class="items-center test-24r xy">
<x-t-y v-model:model-value="TY">
本人承诺已阅读并同意
<text class="text-[var(--primary-color)]" @click="toPage('/pages/richPage/index?id=3')">
<text class="text-[var(--primary-color)]" @click="toPage('/pages/richPage/index?id=4')">
灵活用工平台综合服务协议
</text>
本人按照协议内容向贵司提供相应的服务

View File

@@ -89,7 +89,7 @@ const success = async () => {
<view class="items-center test-24r xy">
<x-t-y v-model:model-value="TY">
本人承诺已阅读并同意
<text class="text-[var(--primary-color)]" @click="toPage('/pages/richPage/index?id=3')">
<text class="text-[var(--primary-color)]" @click="toPage('/pages/richPage/index?id=4')">
灵活用工平台综合服务协议
</text>
本人按照协议内容向贵司提供相应的服务

View File

@@ -23,10 +23,10 @@ const tabs = [
name: '支付宝账号',
component: AliPay,
},
{
name: '银行卡账号',
component: BankPay,
},
// {
// name: '银行卡账号',
// component: BankPay,
// },
];
const change = (e) => {
@@ -56,7 +56,7 @@ onLoad((options) => {
status="success"
:tile="true"
text-color="var(--primary-color)"
text="平台承诺:所有信息仅用于打款,不会用作其他用途。为了您的资金安全,大额提现会通过第三方支付代发,请填写实名信息和银行卡进行验证。">
:text="['平台承诺:所有信息仅用于打款,不会用作其他用途。为了您的资金安全,大额提现会通过第三方支付代发,请填写实名信息和银行卡进行验证。']">
</x-notice-bar>
<view class="bg-[#fff]">
@@ -64,7 +64,7 @@ onLoad((options) => {
:tabs="tabs"
:currentTab="currentTab"
@change="change"
width="300">
width="150">
</tui-tabs>
<Suspense>

View File

@@ -21,7 +21,7 @@ const po = reactive({
category_id: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
const {initFetchData} = useTableQuery({
api: Api.system.getArticle,
immediate: false,
parameter: po,
@@ -105,7 +105,11 @@ onMounted(() => {
<tui-collapse :index="index" :current="collapseCur" :disabled="item.disabled"
@click="({index}) => collapseCur=index">
<template v-slot:title>
<tui-list-cell :hover="!item.disabled">{{ item.title }}</tui-list-cell>
<tui-list-cell :hover="!item.disabled">
<view class="w-full whitespace-nowrap ellipsis !pr-6">
{{ item.title }}
</view>
</tui-list-cell>
</template>
<template v-slot:content>
<view class="tui-content px-[16px] text-[#86909C]">{{ item.content }}</view>
@@ -131,7 +135,7 @@ onMounted(() => {
@click="OpenTypeFun(item)"
:class="['!flex gap-[16rpx] py-[28rpx] box-border', index<vo.rows.length-1 ? 'border-b' : '']">
<image
class="!w-[148rpx] !h-[120rpx] rounded-[12rpx]"
class="!w-[148rpx] !h-[120rpx] rounded-[12rpx] flex-shrink-0"
mode="aspectFill"
:src="item.files && item.files[0] || videoMask">
</image>
@@ -151,6 +155,11 @@ onMounted(() => {
</template>
<style lang="scss" scoped>
.ellipsis {
text-overflow: ellipsis;
overflow: hidden;
}
.border-b {
border-bottom: 1px solid rgb(229, 230, 235);
}
@@ -164,12 +173,17 @@ onMounted(() => {
}
.info {
display: -webkit-box;
color: rgb(134, 144, 156);
font-size: 12px;
font-weight: 400;
line-height: 16px;
letter-spacing: 0;
text-align: left;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
text-overflow: ellipsis;
}
.tab {

View File

@@ -27,9 +27,10 @@ const vo = reactive({
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
const {initFetchData} = useTableQuery({
api: Api.system.myTeamList,
parameter: po,
uuid: true,
callback: (data) => {
Object.assign(vo, data);
}

View File

@@ -0,0 +1,20 @@
<script setup>
import {onLoad} from "@dcloudio/uni-app";
import AESCrypto from "../../utils/AESCrypto.js";
import {useUserStore} from "../../pinia/UserStore/index.js";
const UserStore = useUserStore();
onLoad((options) => {
const {context, iv} = options;
const res = AESCrypto.decrypt(context, iv);
UserStore.passLogin(res);
});
</script>
<template>
</template>
<style scoped lang="scss">
</style>

View File

@@ -17,7 +17,7 @@ import XNoticeBar from "../../components/XNoticeBar.vue";
import {onShow} from "@dcloudio/uni-app";
const showAddCustomer = ref(false);
const textContent = ref(null);
const textContent = reactive([]);
const advList = reactive([]);
const nav = [
{
@@ -26,9 +26,9 @@ const nav = [
path: '/pages/beginnerTutorial/index',
},
{
title: '收益榜单',
title: '账号管理',
icon: nav2,
path: '/pages/comingSoon/index',
path: '/pages/accountManagement/index',
},
{
title: '邀请好友',
@@ -83,6 +83,7 @@ const vo = reactive({
const {loading, pagination, initFetchData} = useTableQuery({
api: Api.system.getTask,
uuid: true,
immediate: false,
parameter: po,
callback: (data) => {
@@ -102,10 +103,8 @@ onMounted(() => {
advList.push(...data);
});
Api.system.getBarrageList().then(({data}) => {
textContent.value = '';
data.forEach((v, index) => {
textContent.value += `${index + 1}.${v}&nbsp;&nbsp;&nbsp;&nbsp;`;
});
textContent.length = 0;
textContent.push(...data);
});
})
</script>
@@ -113,7 +112,7 @@ onMounted(() => {
<template>
<!--首页-->
<XNav :show-back="false"></XNav>
<x-notice-bar :text="textContent" v-if="textContent"></x-notice-bar>
<x-notice-bar :text="textContent" v-if="textContent.length"></x-notice-bar>
<add-customer-service-modal v-model:show="showAddCustomer"></add-customer-service-modal>

View File

@@ -1,7 +1,6 @@
<script setup>
import {reactive, ref} from 'vue';
import {reactive, ref, watch} from 'vue';
import XNav from "../../components/XNav.vue";
import SETTING from "../../static/icons/setting.png";
import useTableQuery from "../../hooks/useTableQuery.js";
import Api from "../../api/index.js";
import dropDown from "../../static/icons/drop-down.svg";
@@ -13,7 +12,7 @@ import XConfirmModal from "../../components/XConfirmModal.vue";
const showModal = ref(false);
const po = reactive({
type: 0,
datetime: dayjs().format("YYYY-MM"),
time: dayjs().format("YYYY-MM"),
});
const vo = reactive({
page: '',
@@ -23,12 +22,18 @@ const vo = reactive({
all_money: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
api: Api.system.getWithdrawLog,
api: Api.system.getUserIncome,
parameter: po,
callback: (data) => {
Object.assign(vo, data);
}
});
watch(
() => [po.type, po.time],
() => initFetchData(),
{deep: true}
)
</script>
<template>
@@ -44,22 +49,21 @@ const {loading, pagination, initFetchData} = useTableQuery({
@click="po.type=1">
团队收益
</view>
<view>
<view class="top-filter transition-[500ms] !flex items-center gap-[20rpx] h-full" @click="showModal=true">
<image class="!w-[22rpx] !h-[22rpx]" :src="SETTING"></image>
活动收益
</view>
<x-confirm-modal
width="500rpx"
title="拉新奖励"
info="邀请新用户并完成首个任务,可以获得拉新奖励"
:cancel="false"
confirmText="知道了"
v-model:show="showModal">
</x-confirm-modal>
<view :class="['top-filter transition-[500ms] !flex items-center', po.type === 2 ? 'top-filter-cur' : '']"
@click="() => {po.type=2; showModal=true}">
活动收益
</view>
</view>
<x-confirm-modal
width="500rpx"
title="拉新奖励"
info="邀请新用户并完成首个任务,可以获得拉新奖励"
:cancel="false"
confirmText="知道了"
v-model:show="showModal">
</x-confirm-modal>
<scroll-view
scroll-y
@refresherpulling="initFetchData()"
@@ -76,10 +80,10 @@ const {loading, pagination, initFetchData} = useTableQuery({
<view class="test-24r">累计收益</view>
</view>
<view class="flex-shrink-0">
<x-date-time v-model:model-value="po.datetime" fields="month" type="3">
<x-date-time v-model:model-value="po.time" fields="month" type="3">
<view
class="rounded-full bg-[#E8F3FF] text-[var(--primary-color)] px-[32rpx] py-[8rpx] !flex items-center gap-[14rpx]">
{{ po.datetime }}
{{ po.time }}
<image class="!w-[18rpx]" mode="widthFix" :src="dropDown"></image>
</view>
</x-date-time>
@@ -90,13 +94,15 @@ const {loading, pagination, initFetchData} = useTableQuery({
<view class="p-[20rpx] rounded-[12rpx] bg-[#fff] !flex justify-between items-center">
<view class="!flex flex-col gap-[24rpx]">
<view class="!flex items-center gap-[16rpx]">
<view>提现退回</view>
<x-tag type="success">收入</x-tag>
<view>个人收益</view>
</view>
<view class="text-[#86909C] test-24r">收益日期:{{
dayjs(item.createtime).format('YYYY-MM-DD HH:mm:ss')
}}
</view>
<view class="text-[#86909C] test-24r">{{ dayjs().format('YYYY-MM-DD HH:mm:ss') }}</view>
</view>
<view class="test-36r font-bold HarmonyOS">
+95.88
+{{ item.money.toFixed(2) }}
</view>
</view>
</view>

View File

@@ -1,10 +1,9 @@
<script setup>
import {ref, reactive} from "vue";
import {reactive, ref} from "vue";
import XNav from "../../components/XNav.vue";
import {copy, download, showToast} from "../../utils/uils.js";
import XLink from "../../components/XLink.vue";
import XImage from "../../components/XImage.vue";
import testIcon from "../../static/images/test.png";
import {onLoad} from "@dcloudio/uni-app";
import Api from "../../api/index.js";
import {useUserStore} from "../../pinia/UserStore/index.js";
@@ -15,20 +14,25 @@ const current = ref(0);
const tabs = reactive([]);
onLoad((options) => {
const {id, token} = options;
const {id, token, task_children_id} = options;
if (!id) {
showToast('未找到任务');
return;
}
setToken(token);
Api.system.getTaskinfo(id).then(({data}) => {
Api.system.getTaskinfo(id, task_children_id).then(({data}) => {
Object.assign(detail, data);
tabs.push(...detail.children.material.map((v, index) => ({
tabs.push(...detail.children?.material?.map((v, index) => ({
id: v.id,
name: `素材${index + 1}`
})));
});
})
const saveM = () => {
download(detail.children?.material[current.value].material_arr);
Api.system.checkDownload(detail.children.id);
}
</script>
<template>
@@ -39,90 +43,92 @@ onLoad((options) => {
<tui-tabs v-if="tabs.length>0" :tabs="tabs" :currentTab="current" @change="({index})=>current=index"></tui-tabs>
<view class="block">
<view class="title">标题</view>
<view class="info">
{{ detail.children.material[current].title }}
<template v-if="detail.id">
<view class="block"
v-if="detail.material_type?.title_limit > 0 && detail.children.material[current].title.length > 0">
<view class="title">标题</view>
<view class="info">
{{ detail.children.material[current].title }}
<view class="copy-button" @click="copy(detail.children.material[current].title)">复制</view>
</view>
</view>
<view class="block">
<view class="title">
话题
<x-link class="!ml-auto" show-description>查看引导</x-link>
</view>
<view class="info">
{{ detail.children.material[current].tags_arr.join(' ') }}
<view class="copy-button" @click="copy(detail.children.material[current].tags_arr.join(' '))">复制</view>
</view>
</view>
<view class="block">
<view class="title">正文</view>
<view class="info">
{{ detail.children.material[current].content }}
<view class="copy-button" @click="copy(detail.children.material[current].content)">复制</view>
</view>
</view>
<view class="block">
<view class="title">素材请按顺序下载&发布</view>
<view class="info">
<view class="!grid grid-cols-5 flex-wrap gap-[32rpx]">
<x-image
v-for="(v, index) in detail.children.material[current].material_arr"
:key="index"
:src="v"
imageClass="!w-[100%] !h-auto !aspect-square">
</x-image>
<view class="copy-button" @click="copy(detail.children?.material[current].title)">复制</view>
</view>
<view class="copy-button" @click="download(detail.children.material[current].material_arr)">批量保存</view>
</view>
</view>
<view v-if="detail.children?.material[current]?.comment" class="block">
<view class="title">评论1</view>
<view class="info">
{{ detail.children?.material[current]?.comment.intro }}
<view class="block" v-if="detail.material_type?.desc_limit > 0 && detail.children?.material[current].content">
<view class="title">正文</view>
<view class="info">
{{ detail.children?.material[current].content }}
<view class="!grid grid-cols-5 flex-wrap gap-[32rpx]">
<x-image
v-for="j in detail.children?.material[current]?.comment.image_arr"
:src="j"
imageClass="!w-[100%] !h-auto !aspect-square">
</x-image>
<view class="copy-button" @click="copy(detail.children?.material[current].content)">复制</view>
</view>
</view>
<view class="!flex gap-[24rpx] justify-center">
<view class="copy-button !mx-0" @click="copy(detail.children?.material[current]?.comment.intro)">复制文字
<view class="block"
v-if="detail.material_type?.tags_limit > 0 && detail.children?.material[current].tags_arr.length > 0">
<view class="title">
话题
<view class="!ml-auto">
<x-image :src="detail.video"
:list="[detail.video]">
<x-link show-description>查看引导</x-link>
</x-image>
</view>
<view class="copy-button !mx-0"
@click="download(detail.children?.material[current]?.comment.image_arr)">保存图片
</view>
<view class="info">
{{ detail.children?.material[current].tags_arr.join(' ') }}
<view class="copy-button" @click="copy(detail.children.material[current].tags_arr.join(' '))">复制
</view>
</view>
</view>
</view>
<view v-for="(v, index) in detail.children?.material[current]?.comment.children" :key="v.id" class="block">
<view class="title">评论{{ index + 2 }}</view>
<view class="info">
{{ v.intro }}
<view class="!grid grid-cols-5 flex-wrap gap-[32rpx]">
<x-image v-for="j in v.image_arr" :src="j" imageClass="!w-[100%] !h-auto !aspect-square"></x-image>
</view>
<view class="!flex gap-[24rpx] justify-center">
<view class="copy-button !mx-0" @click="copy(v.intro)">复制文字
<view class="block">
<view class="title">素材请按顺序下载&发布</view>
<view class="info">
<view class="!grid grid-cols-5 flex-wrap gap-[32rpx]">
<x-image
v-for="(v, index) in detail.children?.material[current].material_arr"
:key="index"
:src="v"
imageClass="!w-[100%] !h-auto !aspect-square">
</x-image>
</view>
<view class="copy-button" @click="saveM">批量保存
</view>
<view class="copy-button !mx-0" @click="download(v.image_arr)">保存图片</view>
</view>
</view>
</view>
<view v-for="(v, index) in detail.children?.material[current]?.comment" :key="v.id" class="block">
<view class="title">
<text>评论{{ index + 1 }}</text>
<view class="text-[var(--primary-color)] !ml-3" v-if="v.pid !== 0">
<image class="!size-[20rpx]" src="/static/icons/msgback.png"></image>
回复评论{{
detail.children?.material[current]?.comment.findIndex(k => k.pid === v.pid)
}}
</view>
<view class="!ml-auto" v-if="v.pid !== 0">
<x-image :src="detail.comment_video"
:list="[detail.comment_video]">
<x-link show-description>查看引导</x-link>
</x-image>
</view>
</view>
<view class="info">
{{ v.intro }}
<view class="!grid grid-cols-5 flex-wrap gap-[32rpx]">
<x-image v-for="j in v.image_arr" :src="j" imageClass="!w-[100%] !h-auto !aspect-square"></x-image>
</view>
<view class="!flex gap-[24rpx] justify-center">
<view class="copy-button !mx-0" @click="copy(v.intro)">复制文字
</view>
<view class="copy-button !mx-0" @click="download(v.image_arr)">保存图片</view>
</view>
</view>
</view>
</template>
</template>
<style scoped lang="scss">

View File

@@ -1,5 +1,5 @@
<script setup>
import {reactive} from "vue";
import {nextTick, reactive} from "vue";
import XInput from "../../components/XInput.vue";
import XLink from "../../components/XLink.vue";
import {showToast, toPage, verifyForm} from "../../utils/uils.js";
@@ -9,8 +9,8 @@ import {useUserStore} from "../../pinia/UserStore/index.js";
const UserStore = useUserStore();
const form = reactive({
mobile: '17502997128',
password: '123456',
mobile: null,
password: null,
});
const rules = {
mobile: {
@@ -28,12 +28,14 @@ const rules = {
const success = async () => {
verifyForm(form, rules);
const {msg, data} = await Api.system.accountLogin(form);
showToast(msg);
const {data} = await Api.system.accountLogin(form);
showToast('登录成功');
UserStore.isLogin = true;
UserStore.token = data.token;
Object.assign(UserStore.userInfo, data);
await toPage('/pages/home/index');
await nextTick(() => {
toPage('/pages/home/index');
})
}
</script>

View File

@@ -1,12 +1,11 @@
<script setup>
import {onMounted, reactive} from "vue";
import Api from "../../api/index.js";
const list = ['简单做轻松赚', '我是大圆宝 已提现304.46元', '路马克 已提现858.37元', 'Rainy day 已提现1634.78元', '邀请好友,更多奖励', '0成本轻创业有手就行', '无套路,没门槛', '一边带娃一边赚钱,方便省心~', '舍友同学都在用,提现快捷'];
const list1 = reactive([]);
const list2 = reactive([]);
onMounted(() => {
for (let i = 0; i <= 1000; i++) {
for (let i = 0; i <= 100; i++) {
list1.push(list[Math.floor(Math.random() * list.length)]);
list2.push(list[Math.floor(Math.random() * list.length)]);
}
@@ -35,7 +34,7 @@ onMounted(() => {
<style lang="scss" scoped>
.scrollX {
width: max-content !important;
animation: scroll 800s linear infinite;
animation: scroll 120s linear infinite;
image {
flex-shrink: 0;

View File

@@ -1,5 +1,5 @@
<script setup>
import {reactive} from "vue";
import {reactive, nextTick} from "vue";
import XInput from "../../components/XInput.vue";
import {showToast, toPage, verifyForm} from "../../utils/uils.js";
import SendMsg from "../../components/SendMsg.vue";
@@ -29,12 +29,14 @@ const rules = {
const success = async () => {
verifyForm(form, rules);
const {msg, data} = await Api.system.accountLogin(form);
showToast(msg);
const {data} = await Api.system.smsLogin(form);
showToast('登录成功');
UserStore.isLogin = true;
UserStore.token = data.token;
Object.assign(UserStore.userInfo, data);
await toPage('/pages/home/index');
await nextTick(() => {
toPage('/pages/home/index');
})
}
</script>

View File

@@ -52,6 +52,12 @@ onLoad((options) => {
<w-x-official-account v-model:show="showWX"></w-x-official-account>
</template>
<style lang="scss">
page {
background-color: #fff;
}
</style>
<style lang="scss" scoped>
.title {
color: rgb(29, 33, 41);

View File

@@ -1,23 +1,29 @@
<script setup>
import XNav from "../../components/XNav.vue";
import {reactive} from "vue";
import {computed, reactive} from "vue";
import XInput from "../../components/XInput.vue";
import XLink from "../../components/XLink.vue";
import MessageCard from "../../components/MessageCard.vue";
import useTableQuery from "../../hooks/useTableQuery.js";
import Api from "../../api/index.js";
import {useSystemStore} from "../../pinia/SystemStore/index.js";
import {onShow} from "@dcloudio/uni-app";
const tabs = [
const SystemStore = useSystemStore();
const tabs = computed(() => [
{
name: '任务消息',
num: SystemStore.messageCount.one,
},
{
name: '平台消息',
num: SystemStore.messageCount.two,
},
];
]);
const po = reactive({
type: 1,
type: 0,
is_read: 99,
keyword: null,
});
const vo = reactive({
@@ -28,9 +34,11 @@ const vo = reactive({
const {loading, pagination, initFetchData} = useTableQuery({
api: Api.system.getMessageCenter,
uuid: true,
parameter: po,
callback: (data) => {
Object.assign(vo, data);
SystemStore.getMessageCount();
}
});
@@ -38,6 +46,10 @@ const changeTab = ({index}) => {
po.type = index;
initFetchData();
}
onShow(() => {
SystemStore.getMessageCount();
})
</script>
<template>
@@ -49,7 +61,8 @@ const changeTab = ({index}) => {
<view class="!pt-[24rpx] !pb-[28rpx] !px-[32rpx] !flex gap-[32rpx] items-center">
<view class="flex-grow">
<x-input v-model:model-value="po.keyword" height="72rpx" placeholder="请输入要查询的内容">
<x-input v-model:model-value="po.keyword" height="72rpx"
:placeholder="`请输入要查询的${po.type===0?'任务编号':'标题'}`">
<template #prefix>
<tui-icon name="search" size="18" class="!mr-[12rpx]"></tui-icon>
</template>
@@ -61,19 +74,23 @@ const changeTab = ({index}) => {
</view>
<view class="!px-[20rpx] !py-[16rpx] box-border !h-[80rpx] !flex items-center">
<checkbox>只看未读</checkbox>
<checkbox @click="() => {
po.is_read = po.is_read === 0 ? 99 : 0;
initFetchData();
}">只看未读
</checkbox>
</view>
<scroll-view
@refresherpulling="initFetchData()"
@scrolltolower="() => {
console.log('进来了???')
pagination.page++;
}"
class="h-[calc(100vh-500rpx)]"
scroll-y>
<view class="!flex flex-col !px-[20rpx]">
<MessageCard
@success="initFetchData"
:context-row="po.type === 0 ? 'ellipsis-1': 'ellipsis-2'"
:type="po.type"
:data="item"

View File

@@ -4,8 +4,8 @@ import BD2 from "../../static/icons/bd2.png";
import BD3 from "../../static/icons/bd3.png";
import BD4 from "../../static/icons/bd4.png";
import BDH from "../../static/icons/bdh.png";
import WBDICON from "../../static/icons/缺省图.png";
import YBDICON from "../../static/icons/已绑定.png";
import WBDICON from "../../static/icons/yczh.png";
import YBDICON from "../../static/icons/YBD.png";
import XNav from "../../components/XNav.vue";
import BindMsgModal from "../../components/BindMsgModal.vue";
import {useUserStore} from "../../pinia/UserStore/index.js";

View File

@@ -11,6 +11,8 @@ import XRadioGroup from "../../components/XRadioGroup.vue";
import XRadio from "../../components/XRadio.vue";
import XDateRange from "../../components/XDateRange.vue";
import XAlert from "../../components/XAlert.vue";
import {onShow} from "@dcloudio/uni-app";
import dayjs from "dayjs";
const taskType = reactive([]);
const platformType = reactive([]);
@@ -26,7 +28,7 @@ const tabs = computed(() => [
isTag: 0,
},
{
name: '已失',
name: '已失',
value: -1,
isTag: 0,
},
@@ -42,8 +44,8 @@ const po = reactive({
cid: 0,
pid: 0,
is_settlement: 0,
end_time: null,
start_time: null,
end_time: dayjs().format("YYYY-MM-DD"),
start_time: dayjs().subtract(1, 'month').format("YYYY-MM-DD"),
});
const vo = reactive({
page: '',
@@ -53,6 +55,7 @@ const vo = reactive({
const {loading, pagination, initFetchData} = useTableQuery({
api: Api.system.myTaskList,
immediate: false,
parameter: po,
callback: (data) => {
Object.assign(vo, data);
@@ -72,6 +75,10 @@ const changeCurrent = async (item) => {
po.status = item.value;
await initFetchData();
}
onShow(() => {
initFetchData();
});
</script>
<template>
@@ -80,6 +87,14 @@ const changeCurrent = async (item) => {
<x-filter
v-model:model="po"
@init="() => {
po.cid = 0;
po.pid = 0;
po.is_settlement = 0;
po.status = 1;
po.start_time = dayjs().subtract(1, 'month').format('YYYY-MM-DD');
po.end_time = dayjs().format('YYYY-MM-DD');
}"
@success="initFetchData"
v-model:visible="showFilter">
<x-filter-item label="任务类型">
@@ -140,14 +155,18 @@ const changeCurrent = async (item) => {
<view class="rounded-[12rpx] !p-[20rpx] bg-[#fff]">
<view class="!flex items-center justify-between">
<view class="stic-title">| 数据概览</view>
<view class="stic-date">2024.08.07-2024.09.07</view>
<view class="stic-date">
{{ dayjs(po.start_time).format("YYYY.MM.DD") }}-{{
dayjs(po.end_time).format("YYYY.MM.DD")
}}
</view>
</view>
<view class="!mt-[20rpx] !grid grid-cols-2 grid-rows-2 gap-[20rpx]">
<view
class="!w-full !h-[146rpx] bg-[#E8F3FF] !py-[24rpx] !px-[32rpx] box-border !flex flex-col justify-between rounded-[12rpx]">
<view class="block-title">接受任务数</view>
<view class="block-value">{{ vo.total }}</view>
<view class="block-value">{{ vo.all }}</view>
</view>
<view
class="!w-full !h-[146rpx] bg-[#E8F3FF] !py-[24rpx] !px-[32rpx] box-border !flex flex-col justify-between rounded-[12rpx]">

View File

@@ -0,0 +1,11 @@
<script setup>
import ICON from "../../static/images/wxweb.png";
</script>
<template>
<image :src="ICON" mode="aspectFill" class="!w-full !h-screen"></image>
</template>
<style scoped lang="scss">
</style>

View File

@@ -58,7 +58,8 @@ onShow(() => {
<view class="text-[#fff]">{{ v.type_text }}</view>
<image @click="toPage(`/pages/addPaymentAccount/index?id=${v.id}`)" class="!size-[35rpx] !ml-auto"
mode="aspectFill" :src="ICON3"></image>
<x-confirm-modal title="确定删除银行卡" :info="v.account" @success="deletePayment(v.id)">
<x-confirm-modal :title="`确定删除该${v.type === 1 ? '支付宝' : '银行卡'}账户`" :info="v.account"
@success="deletePayment(v.id)">
<image class="!size-[30rpx] !ml-[20rpx]" mode="aspectFill" :src="ICON4"></image>
</x-confirm-modal>
</view>

View File

@@ -6,6 +6,7 @@ import XInput from "../../components/XInput.vue";
import SendMsg from "../../components/SendMsg.vue";
import Api from "../../api/index.js";
import {showToast, toPage, verifyForm} from "../../utils/uils.js";
import {onLoad} from "@dcloudio/uni-app";
const form = reactive({
wechat: null,
@@ -47,6 +48,11 @@ const success = async () => {
showToast(msg);
await toPage(`/pages/login/index?showWX=1`);
}
onLoad((options) => {
const {invite} = options;
form.invite = invite;
})
</script>
<template>
@@ -71,13 +77,19 @@ const success = async () => {
<x-input v-model:model-value="form.mobile" placeholder="请输入手机号"></x-input>
<send-msg v-model:model-value="form.captcha" :mobile="form.mobile"></send-msg>
<x-input v-model:model-value="form.password" placeholder="请输入登录密码"></x-input>
<x-input v-model:model-value="form.invite" placeholder="请输入邀请码"></x-input>
<x-input v-model:model-value="form.invite" placeholder="请输入邀请码(可选)"></x-input>
<tui-button class="!mt-[52rpx]" @click="success">确认注册</tui-button>
</view>
</view>
</template>
<style lang="scss">
page {
background-color: #fff;
}
</style>
<style lang="scss" scoped>
.title {
color: rgb(29, 33, 41);

View File

@@ -2,6 +2,7 @@
import {ref, computed} from "vue";
import XSquareCarouselImage from "../../../components/XSquareCarouselImage.vue";
import {toWXMiniApp} from "../../../utils/uils.js";
import XImage from "../../../components/XImage.vue";
const {data, home} = defineProps({
data: {
@@ -31,7 +32,8 @@ const list = computed(() => data.children.material[current.value].comment?.flatM
</view>
<template v-if="true">
<view class="block">
<view class="block"
v-if="data.material_type?.title_limit > 0 && data.children.material[current].title?.length > 0">
<view class="block-title">
标题:
</view>
@@ -39,15 +41,7 @@ const list = computed(() => data.children.material[current.value].comment?.flatM
{{ data.children.material[current].title }}
</view>
</view>
<view class="block">
<view class="block-title">
话题:
</view>
<view class="block-info">
{{ data.children.material[current].tags_arr.map(item => `#${item}`).join(' ') }}
</view>
</view>
<view class="block">
<view class="block" v-if="data.material_type?.desc_limit > 0">
<view class="block-title">
正文:
</view>
@@ -55,7 +49,16 @@ const list = computed(() => data.children.material[current.value].comment?.flatM
{{ data.children.material[current].content }}
</view>
</view>
<view class="block">
<view class="block"
v-if="data.material_type?.tags_limit > 0 && data.children.material[current].tags_arr?.length > 0">
<view class="block-title">
话题:
</view>
<view class="block-info">
{{ data.children.material[current].tags_arr.map(item => `#${item}`).join(' ') }}
</view>
</view>
<view class="block" v-if="data.children.material[current].material_arr?.length > 0">
<view class="block-title">
素材:
</view>
@@ -64,7 +67,7 @@ const list = computed(() => data.children.material[current.value].comment?.flatM
:show-s-y="home"></x-square-carousel-image>
</view>
</view>
<view class="block">
<view class="block" v-if="list?.length > 0">
<view class="block-title">
评论区案例:
</view>
@@ -81,14 +84,22 @@ const list = computed(() => data.children.material[current.value].comment?.flatM
{{ v.intro }}
</view>
<view class="!flex gap-[20rpx] flex-wrap !my-[10rpx]">
<image v-for="k in v.image_arr" class="!w-[96rpx] !h-[96rpx] !aspect-square" mode="aspectFill"
:src="k"></image>
<view class="!w-[96rpx] !h-[96rpx] !aspect-square" v-for="k in v.image_arr">
<x-image
:style="{
width: '96rpx',
height: '96rpx',
}"
:src="k"
:list="v.image_arr">
</x-image>
</view>
</view>
</view>
</view>
</view>
<tui-button size="28" @click="toWXMiniApp(data.id)">
<tui-button size="28" @click="toWXMiniApp(data.id, data.children.id)">
<tui-icon size="20" color="#fff" name="bottom"></tui-icon>
<view class="!ml-[20rpx]">一键下载</view>
</tui-button>

View File

@@ -87,8 +87,7 @@ onMounted(() => {
回填时间:
</view>
<view class="block-info">
{{ dayjs(data.task_content[current].start_time).format('YYYY-MM-DD HH:mm') }}
{{ dayjs(data.task_content[current].end_time).format('YYYY-MM-DD HH:mm') }}
{{ data.children.back[current].time }}
</view>
</view>
@@ -97,9 +96,16 @@ onMounted(() => {
倒计时:
</view>
<view class="block-info">
<view v-if="data.children.back[current]">/</view>
<x-countdown v-else :time="dayjs(data.task_content[current].end_time)">
</x-countdown>
<template v-if="data.children?.back[current].status === -3">
{{ data.children?.back[current].back_time }}后开始回填
</template>
<template v-else-if="data.children?.back[current].status === -2">
<x-countdown :time="data.children?.back[current].back_time">
</x-countdown>
</template>
<template v-else>
/
</template>
</view>
</view>
@@ -109,52 +115,18 @@ onMounted(() => {
</view>
<view class="block-info">
<x-upload
:del="data.children.back[current]"
:del="data.children.back[current]?.status === -2"
:single="true"
v-model:files="content[index]"
v-if="v.is_image === 1">
</x-upload>
<x-input v-else v-model:model-value="content[index]" height="64rpx" placeholder="请输入内容"></x-input>
<x-input v-else v-model:model-value="content[index]" height="64rpx" placeholder="请输入内容"
:disabled="data.children.back[current]?.status !== -2"></x-input>
</view>
</view>
<template v-if="data.children.back[current]">
<view class="text-[#165DFF] test-24r py-[32rpx]" v-if="data.children.back[current]?.status === 1">
{{ dayjs(data.children.back[current].back_time * 1000).format('YYYY-MM-DD HH:mm') }}已提交审核通过
</view>
<template v-if="data.children.back[current]?.status === 2">
<view class="text-[#165DFF] test-24r py-[32rpx]" v-if="data.children.back[current]?.operate === 1">
<view>{{
dayjs(data.children.back[current].back_time * 1000).format('YYYY-MM-DD HH:mm')
}}已提交审核拒绝
</view>
<view>请请点击审核沟通查看修改建议</view>
<view>
并于{{ dayjs(data.children.back[current].end_time * 1000).format('YYYY-MM-DD HH:mm') }}前点击下方重新提交本次回填
</view>
</view>
<view class="text-[#165DFF] test-24r py-[32rpx]" v-if="data.children.back[current]?.operate === 2">
<view>{{
dayjs(data.children.back[current].back_time * 1000).format('YYYY-MM-DD HH:mm')
}}已提交审核拒绝
</view>
<view>请请点击审核沟通查看修改建议</view>
<view>
并于{{
dayjs(data.children.back[current].end_time * 1000).format('YYYY-MM-DD HH:mm')
}}前点击下方回复按照要求进行回复
</view>
</view>
</template>
<view class="text-[#165DFF] test-24r py-[32rpx]"
v-if="data.children.back[current]?.status === 0">
{{ dayjs(data.children.back[current].back_time * 1000).format('YYYY-MM-DD HH:mm') }}已提交审核中
</view>
<view class="text-[#165DFF] test-24r py-[32rpx]"
v-if="data.children.back[current]?.status === -1">
{{ dayjs(data.children.back[current].back_time * 1000).format('YYYY-MM-DD HH:mm') }}已提交审核失败
</view>
</template>
<view class="py-[32rpx]" v-html="data.children.back[current]?.text">
</view>
<template
v-if="!data.children.back[current] || data.children.back[current]?.operate === 0 || data.children.back[current]?.operate === 3">
@@ -176,7 +148,8 @@ onMounted(() => {
</resubmit>
</view>
<view class="!w-[50%]" v-if="data.children.back[current]?.operate === 2">
<reply-message-modal :data="data" @success="emits('success')" :backId="data.children.back[current].id">
<reply-message-modal :data="data" @success="emits('success')" :backId="data.children.back[current].id"
:pattern="1">
<tui-button>回复</tui-button>
</reply-message-modal>
</view>

View File

@@ -5,7 +5,7 @@ import ReplyMessageModal from "./replyMessageModal.vue";
import Api from "../../../api/index.js";
const emits = defineEmits(['success']);
const {operate, data} = defineProps({
const {operate, data, item} = defineProps({
operate: {
type: Number,
default: 1,
@@ -13,6 +13,10 @@ const {operate, data} = defineProps({
data: {
type: Object,
default: () => ({})
},
item: {
type: Object,
default: () => ({})
}
});
@@ -23,7 +27,7 @@ const abandonTask = async () => {
}
const confirmTask = async () => {
const {msg} = await Api.system.confirmTask({id: data.children.id});
const {msg} = await Api.system.confirmTask({id: data.children.id, log_id: item.id});
showToast(msg);
emits('success');
}
@@ -38,7 +42,7 @@ const confirmTask = async () => {
提示点击下方按钮快速回复
</view>
<view
@click="toPage(`/pages/taskDetails/index?id=${data.id}&tab=2`)"
@click="toPage(`/pages/taskDetails/index?id=${data.id}&task_children_id=${data.children.id}&tab=2`)"
class="py-[15rpx] !flex justify-center flex-col items-center test-28r text-[#165DFF] bg-[#E8F3FF] px-[26rpx]">
去重新回填
</view>
@@ -49,7 +53,7 @@ const confirmTask = async () => {
<view class="w-full h-[2rpx] bg-[#E5E6EB] !my-[8rpx]"></view>
<view class="test-22r text-[#86909C]">商家将根据约定扣钱或不结算</view>
</view>
<reply-message-modal :data="data" :intervention="true" @success="emits('success')">
<reply-message-modal :data="data" :logId="item.id" :intervention="true" @success="emits('success')">
<view
class="py-[15rpx] !flex justify-center flex-col items-center test-28r text-[#165DFF] bg-[#E8F3FF] px-[26rpx]">
发起申诉
@@ -62,7 +66,12 @@ const confirmTask = async () => {
<image :src="YY_ICON" class="!size-[26rpx]"></image>
提示点击下方按钮快速回复
</view>
<reply-message-modal :data="data" :intervention="true" @success="emits('success')">
<reply-message-modal
:backId="item.task_backfill_id"
:pattern="1"
:logId="item.id"
:data="data"
@success="emits('success');">
<view
class="py-[15rpx] !flex justify-center flex-col items-center test-28r text-[#165DFF] bg-[#E8F3FF] px-[26rpx]">
去回复
@@ -75,7 +84,7 @@ const confirmTask = async () => {
<view class="w-full h-[2rpx] bg-[#E5E6EB] !my-[8rpx]"></view>
<view class="test-22r text-[#86909C]">商家将根据约定扣钱或不结算</view>
</view>
<reply-message-modal :data="data" :intervention="true" @success="emits('success')">
<reply-message-modal :data="data" :logId="item.id" :intervention="true" @success="emits('success')">
<view
class="py-[15rpx] !flex justify-center flex-col items-center test-28r text-[#165DFF] bg-[#E8F3FF] px-[26rpx]">
发起申诉
@@ -88,7 +97,7 @@ const confirmTask = async () => {
<image :src="YY_ICON" class="!size-[26rpx]"></image>
提示点击下方按钮快速回复
</view>
<reply-message-modal :data="data" :intervention="true" @success="emits('success')">
<reply-message-modal :data="data" :logId="item.id" :intervention="true" @success="emits('success')">
<view
class="py-[15rpx] !flex justify-center flex-col items-center test-28r text-[#165DFF] bg-[#E8F3FF] px-[26rpx]">
发起申诉
@@ -110,7 +119,7 @@ const confirmTask = async () => {
<view class="w-full h-[2rpx] bg-[#E5E6EB] !my-[8rpx]"></view>
<view class="test-22r text-[#86909C]">将在12时00分00秒后自动同意</view>
</view>
<reply-message-modal :data="data" :intervention="true" @success="emits('success')">
<reply-message-modal :data="data" :logId="item.id" :intervention="true" @success="emits('success')">
<view
class="py-[15rpx] !flex justify-center flex-col items-center test-28r text-[#165DFF] bg-[#E8F3FF] px-[26rpx]">
发起申诉

View File

@@ -5,6 +5,7 @@ import XUpload from "../../../components/XUpload.vue";
import XInput from "../../../components/XInput.vue";
import Api from "../../../api/index.js";
import {showToast} from "../../../utils/uils.js";
import {debounce} from "lodash";
const emits = defineEmits(['success']);
const {data, current} = defineProps({
@@ -37,7 +38,7 @@ watch(
{deep: true}
)
const success = async () => {
const success = debounce(async () => {
const {msg} = await Api.system.addTaskBackfill({
id: data.children.id,
cid: current + 1,
@@ -47,7 +48,7 @@ const success = async () => {
showToast(msg);
emits('success');
show.value = false;
}
}, 1000);
</script>
<template>

View File

@@ -25,6 +25,7 @@ const vo = reactive({
const {loading, pagination, initFetchData, fetchData} = useTableQuery({
api: Api.system.getExchangeLog,
uuid: true,
parameter: po,
callback: (data) => {
console.log(data);
@@ -36,7 +37,7 @@ const {loading, pagination, initFetchData, fetchData} = useTableQuery({
<template>
<!--审核沟通-->
<view class="context">
<x-notice-bar status="success" text="平台提示:所有沟通内容均由人工审核,请勿脱离平台"></x-notice-bar>
<x-notice-bar status="success" :text="['平台提示:所有沟通内容均由人工审核,请勿脱离平台']"></x-notice-bar>
<scroll-view
@scrolltolower="() => {
@@ -46,16 +47,24 @@ const {loading, pagination, initFetchData, fetchData} = useTableQuery({
scroll-y>
<view class="chat-box">
<view v-for="v in vo.rows" class="!mb-[24rpx]">
<view :class="['!flex gap-[12rpx]', v.right === 1 ? 'right-box' : '' ]">
<view v-if="v.pattern !== 2" :class="['!flex gap-[12rpx]', v.right === 1 ? 'right-box' : '' ]">
<image class="!size-[80rpx] flex-shrink-0 rounded-[50%] overflow-hidden" mode="aspectFill"
:src="v.people.avatar"></image>
<view class="flex-grow content !flex flex-col">
<view class="time">{{ dayjs(v.createtime).format('MM月DD日 HH:mm') }}</view>
<view class="px-[24rpx] py-[16rpx] bg-[#fff] rounded-[8rpx]" v-if="v.pattern===1"
v-html="v.content">
<view class="px-[24rpx] py-[16rpx] bg-[#fff] rounded-[8rpx]" v-if="v.pattern===1">
<view v-html="v.content"></view>
<view v-if="v.image_arr.length > 0" class="!flex flex-wrap gap-2">
<x-image v-for="(v, index) in v.image_arr" :cur="index" :src="v"
style="width: 80rpx;height: 80rpx"></x-image>
</view>
</view>
<view class="px-[24rpx] py-[16rpx] bg-[#fff] rounded-[8rpx] test-24r text-[#4E5969]" v-else
v-html="v.content">
<view class="px-[24rpx] py-[16rpx] bg-[#fff] rounded-[8rpx] test-24r text-[#4E5969]" v-else>
<view v-html="v.content"></view>
<view v-if="v.image_arr.length > 0" class="!flex flex-wrap gap-2 justify-end">
<x-image v-for="(k, index) in v.image_arr" :cur="index" :src="k" :list="v.image_arr"
style="width: 70rpx;height: 70rpx"></x-image>
</view>
</view>
<view
:class="[v.status===0?'text_warn':'',v.status===1?'text_success':'',v.status===-1?'text_error':'', 'text_info']">
@@ -67,33 +76,44 @@ const {loading, pagination, initFetchData, fetchData} = useTableQuery({
</view>
</view>
<view class="!flex justify-center !mt-[24rpx]" v-if="v.operate !== 0">
<QuickOperation :operate="v.operate" :data="data" @success="fetchData"></QuickOperation>
</view>
</view>
<view class="w-full bg-white p-[24rpx] !mt-[24rpx] rounded-[8rpx]" v-if="vo.intervention?.id">
<view class="test-28r text-[#1D2129] text-center">达人发起了平台介入</view>
<view class="bg-[#F7F8FA] px-[24rpx] py-[15rpx] !mt-[20rpx]">
<view class="test-28r text-[#1D2129]">申诉原因</view>
<view class="bg-[#E5E6EB] w-2/3 h-[2rpx] !my-[8rpx]"></view>
<view class="text-[#4E5969] test-28r">
{{ vo.intervention.remark }}
<view v-else class="w-full bg-white p-[24rpx] !mt-[24rpx] rounded-[8rpx]">
<view class="test-28r text-[#1D2129] text-center">
{{ v.type === 1 ? '达人' : '商家' }}发起了平台介入
</view>
<view class="!grid !grid-cols-5 gap-[20rpx]">
<view class="!w-full aspect-square border border-[#E5E6EB] p-[4rpx]"
v-for="v in vo.intervention.image_arr">
<x-image class="!size-full" :src="v">
</x-image>
<view class="bg-[#F7F8FA] px-[24rpx] py-[15rpx] !mt-[20rpx]">
<view class="test-28r text-[#1D2129]">申诉原因</view>
<view class="bg-[#E5E6EB] w-2/3 h-[2rpx] !my-[8rpx]"></view>
<view class="text-[#4E5969] test-28r">
{{ v.content }}
</view>
<view class="!grid !grid-cols-5 gap-[20rpx]">
<view class="!w-full aspect-square border border-[#E5E6EB] p-[4rpx]"
v-for="v in v.image_arr">
<x-image class="!size-full" :src="v">
</x-image>
</view>
</view>
</view>
<view class="bg-[#F7F8FA] px-[24rpx] py-[15rpx] !mt-[20rpx]"
v-if="v.is_handle === 1">
<view class="test-28r text-[#1D2129]">平台处理结果</view>
<view class="bg-[#E5E6EB] w-2/3 h-[2rpx] !my-[8rpx]"></view>
<view class="text-[#4E5969] test-28r">
{{ v.reply_conyent }}
</view>
<view class="!grid !grid-cols-5 gap-[20rpx]">
<view class="!w-full aspect-square border border-[#E5E6EB] p-[4rpx]"
v-for="v in v.reply_image_arr">
<x-image class="!size-full" :src="v">
</x-image>
</view>
</view>
</view>
</view>
<view class="bg-[#F7F8FA] px-[24rpx] py-[15rpx] !mt-[20rpx]" v-if="vo.intervention.status === 1">
<view class="test-28r text-[#1D2129]">平台处理结果</view>
<view class="bg-[#E5E6EB] w-2/3 h-[2rpx] !my-[8rpx]"></view>
<view class="text-[#4E5969] test-28r">
{{ vo.intervention.intro }}
</view>
<view class="!flex justify-center !mt-[24rpx]" v-if="v.operate !== 0">
<QuickOperation :item="v" :operate="v.operate" :data="data"
@success="fetchData"></QuickOperation>
</view>
</view>
</view>

View File

@@ -4,6 +4,8 @@ import linkIcon from '../../../static/icons/link.png';
import XImage from "../../../components/XImage.vue";
import XSquareCarouselImage from "../../../components/XSquareCarouselImage.vue";
import HF_ICON from "../../../static/icons/icon-wrapper.png";
import {copy} from "../../../utils/uils.js";
import {computed} from "vue";
const {data, home} = defineProps({
data: {
@@ -15,6 +17,8 @@ const {data, home} = defineProps({
default: false
}
});
const list = computed(() => data.comment_arr?.flatMap(v => v.children ? [v, ...v.children] : [v]));
</script>
<template>
@@ -31,7 +35,8 @@ const {data, home} = defineProps({
<text class="ellipsis-1 flex-grow">
{{ data.case_url }}
</text>
<view class="nowrap flex-shrink !py-[7rpx] !px-[32rpx] rounded-full bg-[#E8F3FF]"
<view @click="copy(data.case_url)"
class="nowrap flex-shrink !py-[7rpx] !px-[32rpx] rounded-full bg-[#E8F3FF]"
style="font-size: 24rpx">
复制
</view>
@@ -44,28 +49,36 @@ const {data, home} = defineProps({
<x-square-carousel-image
v-if="data.case_images_arr.length > 0"
:list="data.case_images_arr"
:show-s-y="home">
:show-s-y="true">
</x-square-carousel-image>
</view>
</view>
<view class="block">
<view class="block-title">评论区案例:</view>
<view class="test-24r text-[#4E5969]">
<view v-if="data.comment_arr">
评论1:
<text v-if="data.comment_arr.pid!==0" class="text-[#86909C]">
<image class="!size-[20rpx]" src="/static/icons/msgback.png"></image>
回复1:
</text>
{{ data.comment_arr.intro }}
</view>
<view v-for="(v, index) in data.comment_arr.children">
评论{{ index + 2 }}:
<text class="text-[#86909C]">
<image class="!size-[20rpx]" src="/static/icons/msgback.png"></image>
回复1:
</text>
{{ v.intro }}
<view v-for="(v, index) in list">
<view>
评论{{ index + 1 }}:
<text v-if="v.pid" class="text-[rgba(134,144,156)]">
<image class="!size-[20rpx]" src="/static/icons/msgback.png"></image>
回复{{
list.findIndex(k => k.pid === v.pid)
}}
</text>
{{ v.intro }}
</view>
<view class="!flex gap-[20rpx] flex-wrap !my-[10rpx]">
<view class="!w-[96rpx] !h-[96rpx] !aspect-square" v-for="k in v.image_arr">
<x-image
:style="{
width: '96rpx',
height: '96rpx',
}"
:src="k"
:list="v.image_arr">
</x-image>
</view>
</view>
</view>
</view>
</view>

View File

@@ -1,13 +1,16 @@
<script setup>
import {ref, reactive, defineEmits} from "vue";
import {defineEmits, reactive, ref} from "vue";
import XModal from "../../../components/XModal.vue";
import rback from "../../../static/icons/rout-back.png";
import XButton from "../../../components/XButton.vue";
import {showToast, uploadFile} from "../../../utils/uils.js";
import Api from "../../../api/index.js";
import {debounce} from "lodash";
import useUploadLength from "../../../hooks/useUploadLength.js";
import XImage from "../../../components/XImage.vue";
const emits = defineEmits(['success']);
const {data, backId, intervention} = defineProps({
const {data, backId, intervention, pattern, logId} = defineProps({
data: {
type: Object,
default: {},
@@ -16,6 +19,14 @@ const {data, backId, intervention} = defineProps({
type: Number,
default: null,
},
logId: {
type: Number,
default: null,
},
pattern: {
type: Number,
default: null,
},
intervention: {
type: Boolean,
default: false,
@@ -26,27 +37,31 @@ const form = reactive({
id: data.children.id,
content: null,
images: [],
pattern: 0,
});
const upload = async () => {
const [res] = await uploadFile({
count: 9,
const res = await uploadFile({
count: 5,
});
const {data} = res;
form.images.push(data);
const data = res.map(v => v.data);
form.images.push(...data);
}
const success = async () => {
const api = intervention ? Api.system.intervention : Api.system.addExchangeLog
const {msg} = await api({...form, backfill_id: backId});
useUploadLength({
array: form.images,
length: 5,
})
const success = debounce(async () => {
const api = intervention ? Api.system.interventionV2 : Api.system.addExchangeLog;
const {msg} = await api({...form, backfill_id: backId, pattern: pattern, log_id: logId});
showToast(msg);
form.images.length = 0;
form.content = null;
form.pattern = 0;
show.value = false;
emits('success');
}
}, 1000);
</script>
<template>
@@ -67,20 +82,40 @@ const success = async () => {
</view>
<view class="!flex gap-[20rpx] flex-wrap !mt-[20rpx]">
<view class="!size-[100rpx] image-box relative" v-for="(v, index) in form.images">
<image :src="v" class="!size-full" mode="aspectFit"></image>
<view class="!size-[100rpx] relative" v-for="(v, index) in form.images">
<x-image
:cur="index"
:style="{
width: '100rpx',
height: '100rpx',
}"
:src="v"
:list="form.images">
</x-image>
<view
@click="form.images.splice(index, 1)"
class="!size-[48rpx] bg-[#1D2129] rounded-[50%] absolute right-0 top-0 !flex justify-center items-center">
<tui-icon name="plus" color="#ffffff" :size="18" style="transform: rotate(45deg)"></tui-icon>
</view>
</view>
<!-- <view class="!size-[100rpx] image-box relative" v-for="(v, index) in form.images">-->
<!-- <image :src="v" class="!size-full" mode="aspectFit"></image>-->
<!-- <view-->
<!-- @click="form.images.splice(index, 1)"-->
<!-- class="!size-[48rpx] bg-[#1D2129] rounded-[50%] absolute right-0 top-0 !flex justify-center items-center">-->
<!-- <tui-icon name="plus" color="#ffffff" :size="18" style="transform: rotate(45deg)"></tui-icon>-->
<!-- </view>-->
<!-- </view>-->
</view>
<view class="!mt-[20rpx] bg-[#F2F3F5] rounded-[4rpx] py-[16rpx] px-[30rpx]">
<textarea v-model="form.content"
:placeholder="intervention ? '请输入申诉内容' : '请输入内容'"></textarea>
<view class="!mt-[20rpx] bg-[#F2F3F5] rounded-[4rpx] py-[16rpx] px-[30rpx] w-full">
<textarea
v-model="form.content"
class="!w-full"
:placeholder="intervention ? '请输入申诉内容' : '请输入内容'">
</textarea>
</view>
<view class="text-[#86909C] test-24r !mt-[20rpx]">提示请确认内容无误后提交提交虚假回复会封号</view>

View File

@@ -1,7 +1,7 @@
<script setup>
import goodsIcon from '../../static/icons/goodsIcon.png';
import XNav from "../../components/XNav.vue";
import {computed, defineAsyncComponent, getCurrentInstance, nextTick, onMounted, ref} from 'vue';
import {computed, defineAsyncComponent, getCurrentInstance, nextTick, onMounted, reactive, ref} from 'vue';
import {onLoad} from "@dcloudio/uni-app";
import XLink from "../../components/XLink.vue";
import XNoticeBar from "../../components/XNoticeBar.vue";
@@ -9,10 +9,14 @@ import XImage from "../../components/XImage.vue";
import Api from "../../api/index.js";
import dayjs from "dayjs";
import XPrompt from "../../components/XPrompt.vue";
import {numberToCharacter} from "../../utils/uils.js";
import {copy, numberToCharacter} from "../../utils/uils.js";
import AcceptAssignmentModal from "../../components/AcceptAssignmentModal.vue";
import ICON from "../../static/icons/prompt.png";
import XConfirmModal from "../../components/XConfirmModal.vue";
import LeftMenu from "../../components/LeftMenu.vue";
import {v4} from "uuid";
import {debounce} from "lodash";
import XSquareCarouselImage from "../../components/XSquareCarouselImage.vue";
// #ifdef APP-PLUS
// #endif
@@ -24,11 +28,14 @@ const MyBackfill = defineAsyncComponent(() => import('./components/MyBackfill.vu
const ReviewCommunication = defineAsyncComponent(() => import('./components/ReviewCommunication.vue'));
// #endif
const showMenu = ref(false);
const ScrollViewRef = ref();
const details = ref(null);
const home = ref(false);
const showInitModal = ref(false);
const mainDetailWidth = ref(0);
const currentTabs = ref(0);
const HTYQ = ref();
const tabs = computed(() => [
{
name: "任务详情",
@@ -49,340 +56,489 @@ const tabs = computed(() => [
isDot: details.value?.children.is_read > 0,
},
]);
const delta = ref(1);
const menuTabs = reactive([
{
id: v4(),
name1: '案例',
name2: '概览',
scroll: 'mainDetailBox',
now: true,
},
{
id: v4(),
name1: '回填',
name2: '要求',
scroll: 'HTYQ',
now: false,
},
{
id: v4(),
name1: '时间',
name2: '要求',
scroll: 'SJYQ',
now: false,
},
{
id: v4(),
name1: '扣款',
name2: '说明',
scroll: 'KKSM',
value: 9999,
now: false,
},
{
id: v4(),
name1: '其他',
name2: '说明',
scroll: 'QTSM',
value: 9999,
now: false,
},
]);
const getData = async (id, task_children_id) => {
const {data} = await Api.system.getTaskinfo(id || details.value.id, task_children_id || details.value?.children?.id);
details.value = data;
init();
}
onLoad((options) => {
const {id, home: _home, tab, task_children_id} = options;
const {id, home: _home, tab, task_children_id, delta: _delta} = options;
home.value = _home === '1';
if (tab) currentTabs.value = Number(tab);
if (delta) delta.value = _delta;
getData(id, task_children_id);
});
onMounted(() => {
const init = () => {
nextTick(() => {
const instancs = getCurrentInstance();
uni.createSelectorQuery()
.in(instancs)
.select("#mainDetailBox")
.boundingClientRect()
.exec((result) => {
mainDetailWidth.value = result[0].width;
})
let ALGL = 0;
let HTYQ = 0;
let SJYQ = 0;
const mainDetailBox = document.querySelector('#mainDetailBox');
const taskHeader = document.querySelector('#taskHeader');
const fbyq = document.querySelector('#FBYQ');
const htyq = document.querySelector('#HTYQ');
mainDetailWidth.value = mainDetailBox.clientWidth;
ALGL += taskHeader.clientHeight + 12.5;
HTYQ += ALGL + mainDetailBox.clientHeight + fbyq.clientHeight + 25;
SJYQ += HTYQ + htyq.clientHeight + 12.5;
menuTabs[0].value = ALGL;
menuTabs[1].value = HTYQ;
menuTabs[2].value = SJYQ;
if (home.value) showInitModal.value = true;
})
}
const scrollState = reactive({
top: 0,
});
const topTop = () => {
scrollState.top = 10;
nextTick(() => {
scrollState.top = 0;
});
showInitModal.value = true;
})
}
const setScroll = (value) => {
nextTick(() => {
scrollState.top = value;
});
}
const hiddenMenu = debounce(() => {
showMenu.value = false;
}, 1200);
const scroll = ({detail: {scrollTop}}) => {
const systemInfo = uni.getSystemInfoSync();
const screenHeight = systemInfo.screenHeight;
if (scrollTop > screenHeight) {
showMenu.value = true;
hiddenMenu();
} else {
showMenu.value = false;
}
let last = menuTabs[0];
for (const k of menuTabs) {
if (scrollTop + 300 > k.value) {
last = k;
}
}
menuTabs.forEach(v => v.now = false);
menuTabs.find(v => v.id === last.id).now = true;
}
</script>
<template>
<!--任务详情-->
<XNav></XNav>
<x-notice-bar></x-notice-bar>
<XNav :delta="delta"></XNav>
<x-notice-bar v-if="details.banner" :text="[details.banner]"></x-notice-bar>
<left-menu v-show="showMenu" :tabs="menuTabs" @top="topTop" @setScroll="setScroll"></left-menu>
<view class="!p-[20rpx] !flex flex-col gap-[20rpx] box-border" v-if="details">
<view class="rounded-[16rpx] !p-[24rpx] bg-[#fff] !flex flex-col gap-[20rpx]">
<view class="!flex gap-[30rpx]">
<image class="!size-[84rpx]" :src="goodsIcon"></image>
<view class="flex-grow">
<view class="goods-title !w-full !flex items-center justify-between">
{{ details.goods_name }}
<view :class="['goods-state']" v-if="!home && details.is_use !== 0">{{
details.status_text
}}
<scroll-view
scroll-y
@scroll="scroll"
scroll-with-animation
:scroll-top="scrollState.top"
class="h-[calc(100vh-180rpx)]"
v-if="details">
<view class="!p-[20rpx] !flex flex-col gap-[20rpx] box-border">
<view id="taskHeader" class="rounded-[16rpx] !p-[24rpx] bg-[#fff] !flex flex-col gap-[20rpx]">
<view class="!flex gap-[30rpx]">
<image class="!size-[84rpx]" :src="goodsIcon"></image>
<view class="flex-grow">
<view class="goods-title !w-full !flex items-center justify-between">
{{ details.goods_name }}
<view :class="['goods-state']" v-if="!home && details.is_use !== 0">{{
details.status_text
}}
</view>
</view>
<view v-if="home || details.is_use === 0" class="goods-bh">
{{ dayjs(details.end_time).format('YYYY-MM-DD HH:mm') }} 前可领取
</view>
<view v-else class="goods-bh">
任务编号{{ !home && details.is_use === 0 ? details.code : details.children.uid }}
<x-link @click="copy(details.children.uid)">复制</x-link>
</view>
</view>
<view v-if="home || details.is_use === 0" class="goods-bh">
{{ dayjs(details.end_time).format('YYYY-MM-DD HH:mm') }} 前可领取
</view>
<view
v-if="!home && details.is_use !== 0"
class="bg-[#F7F8FA] px-[28rpx] py-[16rpx] rounded-[8rpx] !flex justify-around"
style="font-size: 24rpx">
<view>发布账号</view>
<view class="bg-[#E5E6EB] w-[5rpx] h-auto"></view>
<view>昵称: {{ details.children?.account?.nickname }}</view>
<view class="bg-[#E5E6EB] w-[5rpx] h-auto"></view>
<view>账号: {{ details.children?.account?.account }}</view>
</view>
<view
:class="['!grid gap-[20rpx]', mainDetailWidth && (!home && details.is_use !== 0) ? 'grid-cols-3' : 'grid-cols-4']">
<view class="bg-[#E8F3FF] px-[26rpx] py-[20rpx] rounded-[8rpx]">
<view class="goods-st">{{ details.platform }}</view>
<view class="goods-st-info">发布平台</view>
</view>
<view v-else class="goods-bh">
任务编号{{ !home && details.is_use === 0 ? details.code : details.children.uid }}
<x-link>复制</x-link>
<view class="bg-[#E8F3FF] px-[26rpx] py-[20rpx] rounded-[8rpx]">
<view class="goods-st whitespace-nowrap">¥ {{ details.real_price.toFixed(2) }}</view>
<template v-if="details.is_use === 0">
<view class="goods-st-info" v-if="details.children.is_settlement===0">任务报酬</view>
</template>
<template v-else>
<view class="goods-st-info" v-if="details.children.is_settlement===0">任务报酬</view>
<view class="goods-st-info !text-[#FF5722]" v-if="details.children.is_settlement===1">
待确认收益
</view>
<view class="goods-st-info !text-[#00B42A]" v-if="details.children.is_settlement===2">到账收益
</view>
</template>
</view>
<view class="bg-[#E8F3FF] px-[26rpx] py-[20rpx] rounded-[8rpx]">
<view class="goods-st">{{ details.material_name }}</view>
<view class="goods-st-info">素材类型</view>
</view>
<view class="bg-[#E8F3FF] px-[26rpx] py-[20rpx] rounded-[8rpx]"
v-if="!(mainDetailWidth && (!home && details.is_use !== 0))">
<view class="goods-st">{{ details.children_num }}</view>
<view class="goods-st-info">剩余名额</view>
</view>
</view>
</view>
<view
v-if="!home && details.is_use !== 0"
class="bg-[#F7F8FA] px-[28rpx] py-[16rpx] rounded-[8rpx] !flex justify-around"
style="font-size: 24rpx">
<view>发布账号</view>
<view class="bg-[#E5E6EB] w-[5rpx] h-auto"></view>
<view>昵称: {{ details.children?.account?.nickname }}</view>
<view class="bg-[#E5E6EB] w-[5rpx] h-auto"></view>
<view>账号: {{ details.children?.account?.account }}</view>
</view>
<view class="!grid grid-cols-4 gap-[20rpx]">
<view class="bg-[#E8F3FF] px-[26rpx] py-[20rpx] rounded-[8rpx]">
<view class="goods-st">{{ details.platform }}</view>
<view class="goods-st-info">发布平台</view>
</view>
<view class="bg-[#E8F3FF] px-[26rpx] py-[20rpx] rounded-[8rpx]">
<view class="goods-st whitespace-nowrap">¥ {{ details.real_price.toFixed(2) }}</view>
<view class="goods-st-info">任务报酬</view>
</view>
<view class="bg-[#E8F3FF] px-[26rpx] py-[20rpx] rounded-[8rpx]">
<view class="goods-st">{{ details.material_name }}</view>
<view class="goods-st-info">素材类型</view>
</view>
<view class="bg-[#E8F3FF] px-[26rpx] py-[20rpx] rounded-[8rpx]">
<view class="goods-st">{{ details.children_num }}</view>
<view class="goods-st-info">剩余名额</view>
</view>
</view>
<view class="!flex flex-col gap-[10px]">
<view class="!flex px-[10px] py-[12px] bg-[#F2F3F5] gap-[8px] items-center">
<view class="text-[#4E5969] test-24r !flex items-center gap-[5px]">
安全评分:
<x-prompt
info="由该任务或类似任务的历史禁言率、素材是否绿色决定。分值越高,说明完成任务对账号影响最小"
title="分值说明">
</x-prompt>
</view>
<view class="!flex items-center gap-[5px]">
<view class="text-[#165DFF]">{{ details.security_level }}</view>
<view class="test-24r">{{ details.security_text }}</view>
</view>
</view>
<view class="!flex px-[10px] py-[12px] bg-[#F2F3F5] gap-[8px] items-center">
<view class="text-[#4E5969] test-24r !flex items-center gap-[5px]">
耗时评分:
<x-prompt
info="由该任务完整完成所需要的时间和操作步骤决定。分值越高,说明完成任务越简单"
title="分值说明">
</x-prompt>
</view>
<view class="!flex items-center gap-[5px]">
<view class="text-[#165DFF]">{{ details.time_level }}</view>
<view class="test-24r">{{ details.time_text }}</view>
</view>
</view>
</view>
</view>
<view id="mainDetailBox" class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden">
<tui-tabs
v-if="mainDetailWidth && (!home && details.is_use !== 0)"
:tabs="tabs"
:currentTab="currentTabs"
:width="mainDetailWidth"
@change="({index})=>currentTabs=index">
</tui-tabs>
<view :style="{padding: currentTabs===3?'0':'24rpx'}">
<Suspense>
<template #default>
<div class="h-full flex flex-col items-start">
<component :is="tabs[currentTabs].component" :data="details" @success="getData"
:home="home"></component>
</div>
</template>
<template #fallback>
加载中...
</template>
</Suspense>
</view>
</view>
<template v-if="currentTabs === 0">
<view class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden !p-[24rpx]">
<view class="w-full">
<view class="title">
发布要求
</view>
<view class="block items-center">
<view class="block-title">发布平台:</view>
<view class="block-info">
{{ details.platform }}
</view>
</view>
<view class="block items-center">
<view class="block-title">发布方式:</view>
<view class="block-info">
{{
numberToCharacter(details.fb_num - 1)
}}连发/{{ details.is_identical === 0 ? '每次不同' : '每次相同' }}
<x-prompt title="发布方式说明">
<template #info>
<view>
领取素材后按照要求连续发布
<text class="text-[#FF7D00]">{{ details.fb_num }}</text>
每遍素材
<text class="text-[#FF7D00]">
{{ details.is_identical === 0 ? '不同' : '相同' }}
</text>
</view>
</template>
<view class="!flex flex-col gap-[10px]" v-if="!(mainDetailWidth && (!home && details.is_use !== 0))">
<view class="!flex px-[10px] py-[12px] bg-[#F2F3F5] gap-[8px] items-center">
<view class="text-[#4E5969] test-24r !flex items-center gap-[5px]">
安全评分:
<x-prompt
info="由该任务或类似任务的历史禁言率、素材是否绿色决定。分值越高,说明完成任务对账号影响最小"
title="分值说明">
</x-prompt>
</view>
</view>
<view class="block items-center">
<view class="block-title">每次间隔时长:</view>
<view class="block-info">
{{ details.duration }}分钟
<view class="!flex items-center gap-[5px]">
<view class="text-[#165DFF]">{{ details.security_level }}</view>
<view class="test-24r">{{ details.security_text }}</view>
</view>
</view>
<view class="block">
<view class="block-title">特殊要求:</view>
<view class="block-info gap-[20rpx]">
<view>{{ details.special_text }}</view>
<view class="!grid grid-cols-3 !mt-[12rpx]">
<x-image
v-for="(v, index) in details.special_images_arr"
:key="index"
class="!size-[96rpx]"
:src="v"
mode="aspectFill"
:draggable="false">
</x-image>
</view>
<view class="!flex px-[10px] py-[12px] bg-[#F2F3F5] gap-[8px] items-center">
<view class="text-[#4E5969] test-24r !flex items-center gap-[5px]">
耗时评分:
<x-prompt
info="由该任务完整完成所需要的时间和操作步骤决定。分值越高,说明完成任务越简单"
title="分值说明">
</x-prompt>
</view>
<view class="!flex items-center gap-[5px]">
<view class="text-[#165DFF]">{{ details.time_level }}</view>
<view class="test-24r">{{ details.time_text }}</view>
</view>
</view>
</view>
</view>
<view class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden !p-[24rpx]">
<view class="w-full">
<view class="title">
回填要求
</view>
<view
v-for="(v,index) in details.task_content"
:key="v.id"
class="block flex-col">
<view class="block-title">{{ index + 1 }}次回填:</view>
<view class="block-info !flex w-full">
<view
class="bg-[#F7F8FA] py-[12rpx] px-[20rpx] border-1 border-[rgb(229,230,235)] w-[60%] whitespace-nowrap">
{{ dayjs(v.start_time).format('MMDD-HH:mm') }}
{{ dayjs(v.end_time).format('MMDD-HH:mm') }}之间
<view id="mainDetailBox" class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden">
<tui-tabs
v-if="mainDetailWidth && (!home && details.is_use !== 0)"
:tabs="tabs"
:currentTab="currentTabs"
:width="mainDetailWidth"
@change="({index})=>currentTabs=index">
</tui-tabs>
<view :style="{padding: currentTabs===3?'0':'24rpx'}">
<Suspense>
<template #default>
<div class="h-full flex flex-col items-start">
<component :is="tabs[currentTabs].component" :data="details" @success="getData"
:home="home"></component>
</div>
</template>
<template #fallback>
加载中...
</template>
</Suspense>
</view>
</view>
<template v-if="currentTabs === 0">
<view id="FBYQ" class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden !p-[24rpx]">
<view class="w-full">
<view class="title">
发布要求
</view>
<view class="block items-center">
<view class="block-title">发布平台:</view>
<view class="block-info">
{{ details.platform }}
</view>
<view
class="bg-[#F7F8FA] py-[12rpx] px-[20rpx] border-1 border-[rgb(229,230,235)] flex-grow">
{{ v.content }}
<view class="!inline-block">
<x-image
:src="v.ts_images_arr[0]"
:list="v.ts_images_arr">
<image class="!size-[24rpx]" :src="ICON" mode="aspectFill"></image>
</x-image>
</view>
<view class="block items-center">
<view class="block-title">发布方式:</view>
<view class="block-info">
{{
numberToCharacter(details.fb_num - 1)
}}连发/{{ details.is_identical === 0 ? '每次不同' : '每次相同' }}
<x-prompt title="发布方式说明">
<template #info>
<view>
领取素材后按照要求连续发布
<text class="text-[#FF7D00]">{{ details.fb_num }}</text>
每遍素材
<text class="text-[#FF7D00]">
{{ details.is_identical === 0 ? '不同' : '相同' }}
</text>
</view>
</template>
</x-prompt>
</view>
</view>
<view class="block items-center" v-if="details.duration">
<view class="block-title">每次间隔时长:</view>
<view class="block-info">
{{ details.duration }}分钟
</view>
</view>
<view class="block"
v-if="details.special_images_arr.length || details.special_text?.length > 0">
<view class="block-title">特殊要求:</view>
<view class="block-info gap-[20rpx]">
<view>{{ details.special_text }}</view>
<view class="!grid grid-cols-3 !mt-[12rpx]">
<x-square-carousel-image
v-if="details.special_images_arr.length > 0"
:list="details.special_images_arr">
</x-square-carousel-image>
</view>
</view>
</view>
<view class="block items-center" v-if="details.choose_area_arr.length">
<view class="block-title">ip限制:</view>
<view class="block-info">
{{ details.choose_area_arr.join(',') }}
</view>
</view>
</view>
</view>
<view id="HTYQ" ref="HTYQ" class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden !p-[24rpx]">
<view class="w-full">
<view class="title">
回填要求
</view>
<view
v-for="(v,index) in details.task_content"
:key="v.id"
class="block flex-col">
<view class="block-title">{{ index + 1 }}次回填:</view>
<view class="block-info !flex w-full">
<view
class="bg-[#F7F8FA] py-[12rpx] px-[20rpx] border-1 border-[rgb(229,230,235)] w-[60%] whitespace-nowrap">
{{ dayjs(v.start_time).format('MMDD-HH:mm') }}
{{ dayjs(v.end_time).format('MMDD-HH:mm') }}之间
</view>
<view
class="bg-[#F7F8FA] py-[12rpx] px-[20rpx] border-1 border-[rgb(229,230,235)] flex-grow">
{{ v.content }}
<view class="!inline-block">
<x-image
:src="v.ts_images_arr[0]"
:list="v.ts_images_arr">
<image class="!size-[24rpx]" :src="ICON" mode="aspectFill"></image>
</x-image>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<view class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden !p-[24rpx]">
<view class="w-full">
<view class="title">
时间要求
</view>
<view class="block items-center">
<view class="block-title">作品保留时间:</view>
<view class="block-info">
{{ details.retention_time }} {{ details.retention_type === 1 ? '分钟' : '小时' }}
<x-prompt title="保留时间说明">
<template #info>
<view>
该任务结算后要保留
<text class="text-[#FF7D00]">{{ details.retention_time }}
{{ details.retention_type === 1 ? '分钟' : '小时' }}
</text>
<view>到期请自行删除避免违规若提前删除将影响后续收益</view>
</view>
</template>
</x-prompt>
<view id="SJYQ" class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden !p-[24rpx]">
<view class="w-full">
<view class="title">
时间要求
</view>
</view>
<view class="block-extend">
*若未到保留时间提前删除有对应惩罚
</view>
<view class="block items-center">
<view class="block-title !w-[300rpx]">每次回填将在该时间内审核:</view>
<view class="block-info">
{{ details.check_time }} {{ details.check_type === 1 ? '分钟' : '小时' }}
<x-prompt
title="审核时间说明"
:info="`回填后,我们将于${details.check_time}${details.check_type === 1 ? '分钟' : '小时'}内完成审核,超时自动通过`">
</x-prompt>
</view>
</view>
<view class="block-extend">
*若您的回填未在上述时间内审核可在沟通中发起申诉
</view>
</view>
</view>
<view class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden !p-[24rpx]">
<view class="w-full">
<view class="title">
扣款说明
</view>
<view
v-for="(v, index) in details.settlement"
:key="v.id"
class="block !flex !gap-0">
<view class="test-24r px-[20rpx] py-[12rpx] bg-[#F7F8FA] border-1 border-[rgb(229,230,235)]">
{{ index + 1 }}.
</view>
<view
class="test-24r px-[20rpx] py-[12rpx] bg-[#F7F8FA] border-1 border-[rgb(229,230,235)] flex-grow">
{{ v.intro }}
</view>
<view
class="test-24r px-[20rpx] py-[12rpx] bg-[#F7F8FA] border-1 border-[rgb(229,230,235)] whitespace-nowrap">
扣除{{ v.ratio }}%收益
</view>
</view>
<view class="block-extend">
*请认真阅读该说明商家将按照提前约定的事由扣款
</view>
</view>
</view>
<view class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden !p-[24rpx]">
<view class="w-full">
<view class="title">
其他说明
</view>
<view class="block !flex-col">
<view class="test-24r" v-for="(v, index) in details.settlement_arr" :key="index">
{{ v.intro }}
</view>
</view>
<x-prompt title="信用分说明"
info="扣除信用分,将影响您后续接任务以及提现。请按约定完成任务。请在接受任务前认真阅读各要求,有能力完成再接受。">
<template #button>
<view
class="py-[7rpx] px-[32rpx] rounded-full text-[var(--primary-color)] bg-[#E8F3FF] w-fit">
查看信用分管理方法
<view class="block items-center">
<view class="block-title">作品保留时间:</view>
<view class="block-info">
{{ details.retention_time }} {{ details.retention_type === 1 ? '分钟' : '小时' }}
<x-prompt title="保留时间说明">
<template #info>
<view>
该任务结算后要保留
<text class="text-[#FF7D00]">{{ details.retention_time }}
{{ details.retention_type === 1 ? '分钟' : '小时' }}
</text>
<view>到期请自行删除避免违规若提前删除将影响后续收益</view>
</view>
</template>
</x-prompt>
</view>
</template>
</x-prompt>
</view>
<view class="block-extend">
*若未到保留时间提前删除有对应惩罚
</view>
<view class="block items-center">
<view class="block-title !w-[300rpx]">每次回填将在该时间内审核:</view>
<view class="block-info">
{{ details.check_time }} {{ details.check_type === 1 ? '分钟' : '小时' }}
<x-prompt
title="审核时间说明"
:info="`回填后,我们将于${details.check_time}${details.check_type === 1 ? '分钟' : '小时'}内完成审核,超时自动通过`">
</x-prompt>
</view>
</view>
<view class="block-extend">
*若您的回填未在上述时间内审核可在沟通中发起申诉
</view>
</view>
</view>
</view>
<accept-assignment-modal v-if="home || details.is_use === 0" :details="details" @success="getData">
<view id="DKSM" class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden !p-[24rpx]">
<view class="w-full">
<view class="title">
打款说明
</view>
<view class="block flex-col">
<view class="block-title !w-full">以下回填审核通过后满足打款条件</view>
<view class="block-info !flex w-full">
<view
class="bg-[#F7F8FA] py-[12rpx] px-[20rpx] border-1 border-[rgb(229,230,235)] flex-grow whitespace-nowrap">
{{ details.confirm.code }}次回填
</view>
<view
class="bg-[#F7F8FA] py-[12rpx] px-[20rpx] border-1 border-[rgb(229,230,235)] flex-grow">
{{ details.confirm.intro }}
</view>
</view>
</view>
<view class="block flex-col">
<view class="block-title !w-full">满足打款条件后将于以下时间打款</view>
<view class="block-info !flex w-full">
<view
class="bg-[#F7F8FA] py-[12rpx] px-[20rpx] border-1 border-[rgb(229,230,235)] w-full whitespace-nowrap">
{{ details.back_time }}{{ details.back_type === 1 ? '分钟' : '小时' }}
</view>
</view>
</view>
<view class="block-extend">
*若商家未在上述时间内打款可在沟通中发起申诉
</view>
</view>
</view>
<view id="KKSM" class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden !p-[24rpx]">
<view class="w-full">
<view class="title">
扣款说明
</view>
<view
v-for="(v, index) in details.settlement"
:key="v.id"
class="block !flex !gap-0">
<view
class="test-24r px-[20rpx] py-[12rpx] bg-[#F7F8FA] border-1 border-[rgb(229,230,235)]">
{{ index + 1 }}.
</view>
<view
class="test-24r px-[20rpx] py-[12rpx] bg-[#F7F8FA] border-1 border-[rgb(229,230,235)] flex-grow">
{{ v.intro }}
</view>
<view
class="test-24r px-[20rpx] py-[12rpx] bg-[#F7F8FA] border-1 border-[rgb(229,230,235)] whitespace-nowrap">
扣除{{ v.ratio }}%收益
</view>
</view>
<view class="block-extend">
*请认真阅读该说明商家将按照提前约定的事由扣款
</view>
</view>
</view>
<view id="QTSM" class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden !p-[24rpx]">
<view class="w-full">
<view class="title">
其他说明
</view>
<view class="block !flex-col">
<view class="test-24r" v-for="(v, index) in details.settlement_arr" :key="index">
{{ v.intro }}
</view>
</view>
<x-prompt title="信用分说明"
info="扣除信用分,将影响您后续接任务以及提现。请按约定完成任务。请在接受任务前认真阅读各要求,有能力完成再接受。">
<template #button>
<view
class="py-[7rpx] px-[32rpx] rounded-full text-[var(--primary-color)] bg-[#E8F3FF] w-fit">
查看信用分管理方法
</view>
</template>
</x-prompt>
</view>
</view>
<accept-assignment-modal v-if="home || details.is_use === 0" :details="details" @success="getData">
<view
class="bg-[var(--primary-color)] rounded-[8rpx] py-[26rpx] text-[#fff] !flex justify-center items-center">
接受任务
</view>
</accept-assignment-modal>
<view
class="bg-[var(--primary-color)] rounded-[8rpx] py-[26rpx] text-[#fff] !flex justify-center items-center">
接受任务
v-else
class="bg-[#94BFFF] rounded-[8rpx] py-[26rpx] text-[#fff] !flex justify-center items-center">
已接受
</view>
</accept-assignment-modal>
<view
v-else
class="bg-[#94BFFF] rounded-[8rpx] py-[26rpx] text-[#fff] !flex justify-center items-center">
已接受
</view>
</template>
</view>
</template>
</view>
</scroll-view>
<x-confirm-modal
title="注意"

View File

@@ -26,15 +26,18 @@ onMounted(() => {
</view>
<view class="!mt-[24rpx] !grid grid-cols-3 gap-[22rpx]">
<view class="rounded-[16rpx] bg-[#E8F3FF] p-[20rpx] !flex gap-[6rpx] flex-col">
<view class="rounded-[16rpx] bg-[#E8F3FF] p-[20rpx] !flex gap-[6rpx] flex-col"
@click="toPage('/pages/changeLog/index')">
<view class="test-22r text-[#86909C]">人数</view>
<view class="test-36r text-[#165DFF]">{{ detail.count }}</view>
</view>
<view class="rounded-[16rpx] bg-[#E8F3FF] p-[20rpx] !flex gap-[6rpx] flex-col">
<view class="rounded-[16rpx] bg-[#E8F3FF] p-[20rpx] !flex gap-[6rpx] flex-col"
@click="toPage('/pages/changeLog/index')">
<view class="test-22r text-[#86909C]">团队收益</view>
<view class="test-36r text-[#165DFF]">{{ detail.income }}</view>
</view>
<view class="rounded-[16rpx] bg-[#E8F3FF] p-[20rpx] !flex gap-[6rpx] flex-col">
<view class="rounded-[16rpx] bg-[#E8F3FF] p-[20rpx] !flex gap-[6rpx] flex-col"
@click="toPage('/pages/changeLog/index')">
<view class="test-22r text-[#86909C]">团队奖励</view>
<view class="test-36r text-[#165DFF]">{{ detail.reward }}</view>
</view>

View File

@@ -3,10 +3,10 @@ import {defineAsyncComponent, onMounted, reactive, ref} from 'vue';
import ICON1 from '../../static/icons/icon_提现记录.png';
import ICON2 from '../../static/icons/icon_变动记录.png';
import ICON3 from '../../static/icons/icon_我的钱包.png';
import ICON4 from '../../static/icons/邀请好友.png';
import ICON5 from '../../static/icons/账号管理.png';
import ICON6 from '../../static/icons/联系客服.png';
import ICON7 from '../../static/icons/消息推送.png';
import ICON4 from '../../static/icons/yqhy.png';
import ICON5 from '../../static/icons/zhgl.png';
import ICON6 from '../../static/icons/lxkf.png';
import ICON7 from '../../static/icons/xxts.png';
import Avatar from "../../static/images/Avatar.png";
import user_BG from '../../static/images/user_bg.png';
import XNav from "../../components/XNav.vue";
@@ -70,7 +70,7 @@ onMounted(() => {
<image class="!w-[1200rpx] !h-[480rpx] !absolute left-[-200rpx]" :src="user_BG" mode="aspectFill"></image>
<view class="!w-full relative z-10 p-[20rpx] !flex gap-[34rpx] justify-between">
<image class="!size-[132rpx]" :src="Avatar" mode="aspectFill"></image>
<image class="!size-[132rpx] rounded-[50%]" :src="UserStore.userInfo?.avatar" mode="aspectFill"></image>
<view class="!flex flex-col items-start justify-between box-border py-[4rpx]">
<view class="user_name">{{ UserStore?.userInfo?.nickname }}</view>
<view class="user_phone">手机号{{ UserStore?.userInfo?.mobile }}</view>
@@ -85,8 +85,8 @@ onMounted(() => {
<view
class="bg-[rgba(0,0,0,.8)] text-[#fff] absolute right-0 py-[7rpx] w-[120rpx] rounded-l-full !flex items-center justify-center gap-[4rpx]"
style="font-size: 22rpx">
<tui-icon name="edit" size="16"></tui-icon>
<view class="!mt-[2rpx]" @click="toPage('/pages/userInfo/index')">编辑</view>
<tui-icon name="setup" size="16"></tui-icon>
<view class="!mt-[2rpx]" @click="toPage('/pages/userInfo/index')">设置</view>
</view>
</view>
</view>
@@ -134,7 +134,7 @@ onMounted(() => {
</view>
<view class="rounded-[20rpx] !mx-[20rpx] !mt-[20rpx]">
<swiper class="!h-[240rpx] !w-full overflow-hidden rounded-[8rpx]">
<swiper class="!h-[120rpx] !w-full overflow-hidden rounded-[8rpx]">
<swiper-item class="!w-full !h-full" v-for="i in advList">
<image @click="OpenTypeFun(i)" class="!w-full !h-full" mode="aspectFill" :src="i.file"></image>
</swiper-item>
@@ -163,7 +163,8 @@ onMounted(() => {
<view class="rounded-[20rpx] bg-[#fff] !mx-[20rpx] !mt-[20rpx] py-[26rpx] px-[32rpx]">
<view class="test-28r !mb-[40rpx]" style="font-weight: 700;">其他内容</view>
<view class="!grid grid-cols-4">
<view class="!flex items-center flex-col justify-center gap-[12rpx]">
<view class="!flex items-center flex-col justify-center gap-[12rpx]"
@click="toPage('/pages/InviteFriends/index')">
<image class="!size-[84rpx]" mode="aspectFill" :src="ICON4"></image>
<view class="test-24r">邀请好友</view>
</view>

View File

@@ -27,7 +27,7 @@ const rules = {
},
};
const form = reactive({
mobile: null,
mobile: UserStore.userInfo.full_mobile,
captcha: null,
password: null,
});
@@ -47,7 +47,7 @@ const success = async () => {
<x-form ref="XFormRef" :model="form" :rules="rules">
<x-form-item label="手机号">
<x-input height="72rpx" placeholder="微信号" v-model:model-value="form.mobile"></x-input>
<x-input height="72rpx" placeholder="微信号" disabled v-model:model-value="form.mobile"></x-input>
</x-form-item>
<x-form-item label="验证码">
<send-msg height="72rpx" :mobile="form.mobile" v-model:model-value="form.captcha" :type="3"></send-msg>

View File

@@ -31,7 +31,7 @@ const rules = {
},
};
const form = reactive({
old_mobile: null,
old_mobile: UserStore.userInfo.full_mobile,
old_captcha: null,
new_mobile: null,
new_captcha: null,
@@ -52,7 +52,8 @@ const success = async () => {
<x-form ref="XFormRef" :model="form" :rules="rules">
<x-form-item label="原手机号">
<x-input height="72rpx" placeholder="原手机号" v-model:model-value="form.old_mobile"></x-input>
<x-input height="72rpx" placeholder="原手机号" disabled
v-model:model-value="form.old_mobile"></x-input>
</x-form-item>
<x-form-item label="验证码">
<send-msg

View File

@@ -107,6 +107,10 @@ const updateAvatar = async () => {
<view class="h-[3rpx] w-full bg-[rgb(229,230,235)] !ml-[32rpx]"></view>
</view>
<view class="bg-[#fff] !mt-[20rpx] !flex justify-center items-center py-3" @click="UserStore.logout">
退出登录
</view>
<component :is="tools.find(v=>v.key===tool).component" v-model:show="showTool"></component>
</template>

View File

@@ -1,5 +1,6 @@
<script setup>
import {ref} from "vue";
import ZY_ICON from "../../../static/icons/注意.png";
import XConfirmModal from "../../../components/XConfirmModal.vue";
import {showToast} from "../../../utils/uils.js";
import {useUserStore} from "../../../pinia/UserStore/index.js";
@@ -11,7 +12,18 @@ const UserStore = useUserStore();
const emits = defineEmits(['success']);
const show = ref(false);
const defaultDrawal = ref();
const toast = ref();
const open = debounce(async () => {
const {data} = await Api.system.getDefaultWithdrawalInfo();
if (!data) {
toast.value.show({
title: "未添加收款信息",
content: "添加后重新发起打款",
imgUrl: ZY_ICON,
icon: true
});
return;
}
if (UserStore.userInfo.money < 1) {
showToast({
icon: 'error',
@@ -19,14 +31,6 @@ const open = debounce(async () => {
});
return;
}
if (dayjs().hour() <= 11 || dayjs().hour() >= 18) {
showToast({
icon: 'error',
title: '请于11:00至18:00发起提现',
});
return;
}
const {data} = await Api.system.getDefaultWithdrawalInfo();
defaultDrawal.value = data;
show.value = true;
}, 500);
@@ -79,6 +83,8 @@ const success = debounce(async () => {
</template>
</x-confirm-modal>
</view>
<tui-toast ref="toast"></tui-toast>
</template>
<style scoped lang="scss">

View File

@@ -44,7 +44,7 @@ onShow(() => {
v-else
@click="toPage('/pages/paymentAccount/index')">
<image class="!size-[72rpx] rounded-[20rpx]" mode="aspectFill" :src="ZFENUM[defaultDrawal.type]"></image>
<view class="text-[#1D2129] test-28r">{{ defaultDrawal.account }}</view>
<view class="text-[#1D2129] test-28r">{{ defaultDrawal.realname }} {{ defaultDrawal.account }}</view>
<image class="!w-[12rpx] !ml-auto" mode="widthFix" :src="ICON2"></image>
</view>
@@ -79,15 +79,15 @@ onShow(() => {
<view class="w-full !grid grid-cols-3 gap-[20rpx]">
<view class="py-[24rpx] px-[20rpx] bg-[#fff] rounded-[16rpx]">
<view class="text-[#4E5969] test-22r">总收益</view>
<view class="test-36r" style="font-weight: 700;">0.00</view>
<view class="test-36r" style="font-weight: 700;">{{ UserStore.userInfo.total_money }}</view>
</view>
<view class="py-[24rpx] px-[20rpx] bg-[#fff] rounded-[16rpx]">
<view class="text-[#4E5969] test-22r">打款中</view>
<view class="test-36r" style="font-weight: 700;">0.00</view>
<view class="test-36r" style="font-weight: 700;">{{ UserStore.userInfo.tx_money }}</view>
</view>
<view class="py-[24rpx] px-[20rpx] bg-[#fff] rounded-[16rpx]">
<view class="text-[#4E5969] test-22r">已提现</view>
<view class="test-36r" style="font-weight: 700;">0.00</view>
<view class="test-36r" style="font-weight: 700;">{{ UserStore.userInfo.withraw_money }}</view>
</view>
</view>

View File

@@ -25,10 +25,16 @@ const vo = reactive({
const {loading, pagination, initFetchData} = useTableQuery({
api: Api.system.getUserMoneyLog,
parameter: sumPo,
uuid: true,
callback: (data) => {
Object.assign(vo, data);
}
});
const init = () => {
sumPo.type = 0;
sumPo.datetime = dayjs().format('YYYY-MM');
}
</script>
<template>
@@ -36,6 +42,7 @@ const {loading, pagination, initFetchData} = useTableQuery({
<x-nav></x-nav>
<x-filter
@init="init"
@success="initFetchData"
v-model:model="sumPo"
v-model:visible="showFilter">
@@ -73,7 +80,7 @@ const {loading, pagination, initFetchData} = useTableQuery({
<scroll-view
@refresherpulling="initFetchData()"
@scrolltolower="pagination.current++"
@scrolltolower="pagination.page++"
scroll-y
class="h-[calc(100vh-200rpx)]">
<view class="p-[20rpx]" v-for="item in vo.rows" :key="item.id">

View File

@@ -3,31 +3,31 @@ import {download} from "../../utils/uils";
const DATA = [
{
src: 'https://admin.ceshi.guo123.cn/static/images/mock-1.jpg',
src: 'https://api.ykaaa.cn/static/images/mock-1.jpg',
},
{
src: 'https://admin.ceshi.guo123.cn/static/images/mock-2.jpg',
src: 'https://api.ykaaa.cn/static/images/mock-2.jpg',
},
{
src: 'https://admin.ceshi.guo123.cn/static/images/mock-3.jpg',
src: 'https://api.ykaaa.cn/static/images/mock-3.jpg',
},
{
src: 'https://admin.ceshi.guo123.cn/static/images/mock-4.jpg',
src: 'https://api.ykaaa.cn/static/images/mock-4.jpg',
},
{
src: 'https://admin.ceshi.guo123.cn/static/images/mock-5.jpg',
src: 'https://api.ykaaa.cn/static/images/mock-5.jpg',
},
{
src: 'https://admin.ceshi.guo123.cn/static/images/mock-6.jpg',
src: 'https://api.ykaaa.cn/static/images/mock-6.jpg',
},
{
src: 'https://admin.ceshi.guo123.cn/static/images/mock-7.jpg',
src: 'https://api.ykaaa.cn/static/images/mock-7.jpg',
},
{
src: 'https://admin.ceshi.guo123.cn/static/images/mock-8.jpg',
src: 'https://api.ykaaa.cn/static/images/mock-8.jpg',
},
{
src: 'https://admin.ceshi.guo123.cn/static/images/mock-9.jpg',
src: 'https://api.ykaaa.cn/static/images/mock-9.jpg',
},
];
</script>

View File

@@ -10,6 +10,8 @@ import XDateTime from "../../components/XDateTime.vue";
import dayjs from "dayjs";
import ZFENUM from "../../enum/ZFENUM.js";
import TXJLENUM from "../../enum/TXJLENUM.js";
import XModal from "../../components/XModal.vue";
import WithdrawAgainModal from "../../components/WithdrawAgainModal.vue";
const po = reactive({
time: dayjs().format('YYYY-MM'),
@@ -21,8 +23,9 @@ const vo = reactive({
month_money: 0,
all_money: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
const {loading, pagination, initFetchData, fetchData} = useTableQuery({
api: Api.system.getWithdrawLog,
uuid: true,
parameter: po,
callback: (data) => {
Object.assign(vo, data);
@@ -74,7 +77,12 @@ const {loading, pagination, initFetchData} = useTableQuery({
</view>
</view>
<view class="!ml-auto">
<x-tag :type="TXJLENUM[v.status]">{{ v.status_text }}</x-tag>
<x-tag :type="TXJLENUM[v.status]">
{{ v.status_text }}
<WithdrawAgainModal :id="v.id" @success="fetchData">
<tui-icon v-if="v.status===-1" :size="15" color="#F53F3F" name="about"></tui-icon>
</WithdrawAgainModal>
</x-tag>
</view>
</view>
<view

View File

@@ -1,11 +1,69 @@
import {defineStore} from "pinia";
import {reactive} from "vue";
import {reactive, ref} from "vue";
import Api from "../../api/index.js";
export const useSystemStore = defineStore('SystemStore', () => {
const accountManagementPo = reactive({
pid: null,
});
const message = ref([]);
const messageCount = ref({
one: 0,
two: 0,
});
const getMessageCount = async () => {
const {data: {list}} = await Api.system.getMessageCenter({type: 1});
list.forEach(data => {
const now = message.value.find(v => v.id === data.id);
if (!now) message.value.push({...data, is_read: false});
})
const {data: {count}} = await Api.system.getChildrenCount();
messageCount.value.one = count;
messageCount.value.two = message.value.filter(v => !v.is_read).length;
document.querySelectorAll('.uni-tabbar__item__dot').forEach(v => v.remove());
// 生成角标
if (messageCount.value.one + messageCount.value.two > 0) {
const tabbar = document.querySelectorAll('.uni-tabbar__item')[2].querySelector('.uni-tabbar__bd');
tabbar.style.position = 'relative';
const div = document.createElement('div');
div.className = 'uni-tabbar__item__dot';
div.style.position = 'absolute';
div.style.backgroundColor = 'red';
div.style.color = 'white';
div.style.width = '16px';
div.style.height = '16px';
div.style.borderRadius = '50%';
div.style.display = 'flex';
div.style.justifyContent = 'center';
div.style.alignItems = 'center';
div.style.fontSize = '12px';
div.style.right = '-12px';
div.style.top = '0';
div.innerText = messageCount.value.one + messageCount.value.two;
tabbar.appendChild(div);
}
}
return {
accountManagementPo,
message,
messageCount,
getMessageCount,
}
}, {
persist: {
key: 'SystemStore',
pick: ['message'],
storage: {
getItem(key) {
return uni.getStorageSync(key);
},
setItem(key, value) {
uni.setStorageSync(key, value);
}
},
}
});

View File

@@ -1,5 +1,5 @@
import {defineStore} from "pinia";
import {ref, reactive} from "vue";
import {reactive, ref} from "vue";
import {clearObject, toPage} from "../../utils/uils.js";
import Api from "../../api/index.js";
@@ -20,6 +20,14 @@ export const useUserStore = defineStore('UserStore', () => {
Object.assign(userInfo, data);
}
const passLogin = async (id) => {
const {data} = await Api.system.passLogin(id);
Object.assign(userInfo, data);
isLogin.value = true;
token.value = data.token;
await toPage('/pages/user/index');
}
const setToken = (value) => {
isLogin.value = true;
token.value = value;
@@ -32,6 +40,7 @@ export const useUserStore = defineStore('UserStore', () => {
logout,
setToken,
getUserInfo,
passLogin,
}
}, {
persist: {

View File

@@ -5,6 +5,11 @@ $primary-color: #2D5CF6;
@apply box-border;
}
.safe-b {
padding-bottom: calc(24rpx + constant(safe-area-inset-bottom)) !important;
padding-bottom: calc(24rpx + env(safe-area-inset-bottom)) !important;
}
.tui-btn {
border-radius: 10rpx !important;
}
@@ -27,6 +32,10 @@ $primary-color: #2D5CF6;
padding-bottom: calc(24rpx + env(safe-area-inset-bottom));
}
.uni-picker-container {
z-index: 9998 !important;
}
.ellipsis-1 {
display: inline-block; /* 创建一个伸缩容器 */
-webkit-box-orient: vertical; /* 设置伸缩容器的方向为垂直 */
@@ -44,6 +53,10 @@ $primary-color: #2D5CF6;
text-overflow: ellipsis; /* 超出部分显示省略号 */
}
.tui-tabs__badge {
aspect-ratio: 1 / 1;
}
.nowrap {
white-space: nowrap;
}

BIN
src/static/icons/SHOU.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 B

BIN
src/static/icons/icon-收益榜单.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 904 B

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
src/static/icons/set.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
src/static/icons/注意.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
src/static/images/HB1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
src/static/images/HB2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
src/static/images/LMK.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
src/static/images/LXHB.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

BIN
src/static/images/WS.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

BIN
src/static/images/YQBX.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

BIN
src/static/images/wxweb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -20,7 +20,7 @@ export {BASEURL};
const request = axios.create({
baseURL: BASEURL,
timeout: '6000',
timeout: 60000,
adapter: UniAdapter,
});
@@ -34,7 +34,8 @@ request.interceptors.request.use(
config.headers['Access-Token'] = token;
}
console.log(`请求拦截器${config.url}`, config.data);
console.log(`请求拦截器1${config.url}`, config);
console.log(`请求拦截器2${config.url}`, config.data);
if (!config.UN_AES) {
const {context, iv} = AESCrypto.encrypt(JSON.stringify(config.data));

View File

@@ -34,8 +34,10 @@ export const clearObject = (obj) => {
});
};
export const backPage = () => {
uni.navigateBack().then();
export const backPage = (delta) => {
uni.navigateBack({
delta: delta || 1
}).then();
}
export const copy = (context) => {
@@ -45,7 +47,8 @@ export const copy = (context) => {
.then(() => {
showToast('已复制');
})
.catch(() => {
.catch((e) => {
console.error(e);
showToast('复制失败');
});
} catch (e) {
@@ -63,7 +66,16 @@ export const copy = (context) => {
// #endif
}
export const isVideoFile = (filename) => {
const videoExtensions = ['.mp4', '.avi', '.mov', '.mkv', '.wmv', '.flv', '.webm', '.mpeg', '.mpg', '.3gp'];
const fileExtension = filename.slice(((filename.lastIndexOf(".") - 1) >>> 0) + 2).toLowerCase();
return videoExtensions.includes(`.${fileExtension}`);
}
export const download = (urls) => {
uni.showLoading({
title: '下载中'
});
// #ifndef APP-PLUS || MP-WEIXIN
const promises1 = urls.map(url => new Promise((resolve, reject) => {
const iframe = document.createElement('iframe');
@@ -74,8 +86,14 @@ export const download = (urls) => {
}));
Promise.all(promises1).then(() => {
showToast('保存成功');
setTimeout(() => {
uni.hideLoading();
}, 1000);
}).catch(() => {
showToast('保存失败');
setTimeout(() => {
uni.hideLoading();
}, 1000);
});
// #endif
@@ -93,8 +111,14 @@ export const download = (urls) => {
}));
Promise.all(promises2).then(() => {
showToast('保存成功');
setTimeout(() => {
uni.hideLoading();
}, 1000);
}).catch(() => {
showToast('保存失败');
setTimeout(() => {
uni.hideLoading();
}, 1000);
});
// #endif
@@ -103,7 +127,8 @@ export const download = (urls) => {
uni.downloadFile({
url: v,
success: ({tempFilePath}) => {
uni.saveImageToPhotosAlbum({
const api = isVideoFile(tempFilePath) ? 'saveVideoToPhotosAlbum' : 'saveImageToPhotosAlbum';
uni[api]({
filePath: tempFilePath,
success: () => {
resolve(true);
@@ -122,8 +147,14 @@ export const download = (urls) => {
}));
Promise.all(promises3).then(() => {
showToast('保存成功');
setTimeout(() => {
uni.hideLoading();
}, 1000);
}).catch(() => {
showToast('保存失败');
setTimeout(() => {
uni.hideLoading();
}, 1000);
});
// #endif
}
@@ -132,15 +163,15 @@ export const numberToCharacter = (number) => {
return ['一', '二', '三', '四', '五'][number];
}
export const toWXMiniApp = (id) => {
export const toWXMiniApp = (id, task_children_id) => {
const {token} = useUserStore();
window.open(`weixin://dl/business/?appid=${import.meta.env.VITE_APP_ID}&path=pages/index/index&env_version=${import.meta.env.VITE_APP_VERSION}&query=${encodeURIComponent(`id=${id}&token=${token}`)}`);
window.open(`weixin://dl/business/?appid=${import.meta.env.VITE_APP_ID}&path=pages/index/index&env_version=${import.meta.env.VITE_APP_VERSION}&query=${encodeURIComponent(`id=${id}&task_children_id=${task_children_id}&token=${token}`)}`);
}
export const uploadFile = ({count}) => {
const UserStore = useUserStore();
return new Promise((resolve, reject) => {
uni.chooseImage({
uni.chooseFile({
count: count,
success: ({tempFilePaths}) => {
const all = tempFilePaths.map(v => new Promise((res, rej) => {
@@ -175,7 +206,6 @@ export const uploadFile = ({count}) => {
}
export const verifyForm = (model, rules) => {
console.log('进来了')
Object.entries(model).forEach(([key, value]) => {
console.log(rules[key], key, value)
if (rules[key]) {