Compare commits
98 Commits
481ef6edd4
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 038c616a52 | |||
| 6d195af85e | |||
| c3907904ff | |||
| 6d29326dc4 | |||
| efa521af56 | |||
| 3b21630d78 | |||
| 0464dc2657 | |||
| d1af10a28a | |||
| 53e8ce8478 | |||
| 9cd8d36a9d | |||
| d2794dfe1a | |||
| 6dfb913822 | |||
| b1b2d1d8dc | |||
|
|
ce253405d9 | ||
|
|
0db9c62a8a | ||
|
|
28515f5d3a | ||
|
|
39a701f666 | ||
|
|
2eb5ad2f6f | ||
|
|
592a7bf333 | ||
|
|
0e61a98a5e | ||
|
|
dd55a759be | ||
|
|
e2636149e5 | ||
|
|
9d166e919c | ||
|
|
7885f0e2e0 | ||
|
|
ead031f2ae | ||
|
|
e237f77086 | ||
|
|
9b162d49d0 | ||
|
|
54bdfb6261 | ||
|
|
7658c63b46 | ||
|
|
0819032049 | ||
|
|
bddd14faff | ||
|
|
f5da17b9f9 | ||
|
|
4a49650bfe | ||
|
|
1c7513dfdd | ||
|
|
a3a17ec96a | ||
|
|
8d4c585e53 | ||
|
|
d4b90b09f8 | ||
|
|
38538db468 | ||
|
|
422d082d72 | ||
|
|
b15962dd65 | ||
|
|
50a85dd274 | ||
|
|
bdb05623e9 | ||
|
|
8117a7ace1 | ||
|
|
49d294f453 | ||
|
|
8cd3064948 | ||
|
|
a5661e935e | ||
|
|
9f97bcb78e | ||
|
|
a9d57ac260 | ||
|
|
e6801555b1 | ||
|
|
c04598460d | ||
|
|
7f1d3c0f4b | ||
|
|
61fb0171fb | ||
|
|
62fd756962 | ||
|
|
d68450709b | ||
| af94cd0a97 | |||
| a9b635750b | |||
| df703398cb | |||
| 31095494fd | |||
| de2aeb6abb | |||
| 2841a70642 | |||
| 06e4d99691 | |||
| 2d03c09cc1 | |||
| d9ef508399 | |||
| 14f64944a5 | |||
| 369d123a9f | |||
| deb4cca695 | |||
| 90f815b4f9 | |||
| 392533a3b6 | |||
| 5a3012d0fb | |||
| 5a737478b9 | |||
| a7cd0f1520 | |||
| f1b456e520 | |||
| cbfd818879 | |||
| da14663be7 | |||
| 07889701b3 | |||
| a18737012b | |||
| c540bf78f8 | |||
| 063d7812da | |||
| 24501eba9d | |||
| cfff1b4062 | |||
| e18168ea73 | |||
| 0a9da0f5af | |||
| c022c0c6da | |||
| 5f682d0467 | |||
| 04c26fbba8 | |||
| a48bbd1980 | |||
| 26fed40ba2 | |||
| dcd277835b | |||
| 5147d79bff | |||
| 346471ab91 | |||
| 3ac2bbcf07 | |||
| b98de4746d | |||
| 1ae5c75f5e | |||
| 534adf126a | |||
| 56caa92801 | |||
| 2af3effa6f | |||
| 31fa4e0a5c | |||
| 5d714030be |
4
.env
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
12
src/App.vue
@@ -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 () {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
40
src/components/LeftMenu.vue
Normal 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>
|
||||
@@ -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 }}
|
||||
|
||||
46
src/components/SelectTimeAsync.vue
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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]">
|
||||
|
||||
@@ -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>
|
||||
|
||||
65
src/components/WithdrawAgainModal.vue
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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%);
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
})
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 {
|
||||
|
||||
17
src/hooks/useUploadLength.js
Normal 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;
|
||||
@@ -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
|
||||
],
|
||||
|
||||
85
src/pages/InviteFriends/Poster.vue
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
,本人按照协议内容向贵司提供相应的服务。
|
||||
|
||||
@@ -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>
|
||||
,本人按照协议内容向贵司提供相应的服务。
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
20
src/pages/fastInput/index.vue
Normal 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>
|
||||
@@ -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} `;
|
||||
});
|
||||
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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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]">
|
||||
|
||||
11
src/pages/notSupported/index.vue
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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]">
|
||||
发起申诉
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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="注意"
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
},
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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
|
After Width: | Height: | Size: 9.9 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
BIN
src/static/icons/backtop.png
Normal file
|
After Width: | Height: | Size: 178 B |
BIN
src/static/icons/icon-收益榜单.png
Executable file → Normal file
|
Before Width: | Height: | Size: 904 B After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB |
BIN
src/static/icons/set.png
Normal file
|
After Width: | Height: | Size: 7.5 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
BIN
src/static/icons/注意.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
src/static/images/HB1.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
src/static/images/HB2.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
src/static/images/LMK.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
src/static/images/LXHB.png
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
src/static/images/TITLEBG.png
Normal file
|
After Width: | Height: | Size: 98 KiB |
BIN
src/static/images/WS.png
Normal file
|
After Width: | Height: | Size: 178 KiB |
BIN
src/static/images/YQBX.png
Normal file
|
After Width: | Height: | Size: 78 KiB |
BIN
src/static/images/wxweb.png
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
@@ -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));
|
||||
|
||||
@@ -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]) {
|
||||
|
||||