mirror of
https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp.git
synced 2025-12-20 01:15:53 +08:00
Compare commits
455 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7939998a30 | ||
|
|
1fcc016ccd | ||
|
|
3219f6d576 | ||
|
|
83da8f3003 | ||
|
|
c858c82950 | ||
|
|
f9c7610976 | ||
|
|
919af44fda | ||
|
|
db7cfcea85 | ||
|
|
e95aed8e38 | ||
|
|
24454e2546 | ||
|
|
0ee03d9fcf | ||
|
|
c93862066b | ||
|
|
46dbeb77c8 | ||
|
|
8bcc9de352 | ||
|
|
bac8e3a327 | ||
|
|
29a20afe93 | ||
|
|
0ef3eb9bf7 | ||
|
|
ef6f572311 | ||
|
|
c1fce859ce | ||
|
|
2cd7b7b63f | ||
|
|
75991db6f6 | ||
|
|
f894b5b1fc | ||
|
|
7ae6967b1e | ||
|
|
de94f212c3 | ||
|
|
d166d5943c | ||
|
|
c0e5d75cc6 | ||
|
|
9195bcdeb5 | ||
|
|
7778a62d6a | ||
|
|
31c341148f | ||
|
|
0b601e4f3e | ||
|
|
1d93d9103d | ||
|
|
5bc5152e49 | ||
|
|
e9d1a81612 | ||
|
|
7d3d06e8af | ||
|
|
55bb6ab51a | ||
|
|
70c2e68bff | ||
|
|
17287df293 | ||
|
|
a8d321c66d | ||
|
|
fad004aed5 | ||
|
|
fe9060073f | ||
|
|
393c60200f | ||
|
|
e61222928e | ||
|
|
b51caa9135 | ||
|
|
992bb76072 | ||
|
|
863315eaed | ||
|
|
52bf47e358 | ||
|
|
8f49dce8f0 | ||
|
|
4490a4119e | ||
|
|
2d0b78af52 | ||
|
|
7148b32c43 | ||
|
|
20b2ca04f0 | ||
|
|
25677ced97 | ||
|
|
4517c9562a | ||
|
|
2634017fb3 | ||
|
|
b69c7d5a05 | ||
|
|
098bee9bb4 | ||
|
|
2d369ad729 | ||
|
|
3bf0be98cb | ||
|
|
1046a1052e | ||
|
|
1cc6cc4ac7 | ||
|
|
dae3e74a60 | ||
|
|
fddceb5f36 | ||
|
|
2aed3b9305 | ||
|
|
101aa279d8 | ||
|
|
abbadfbab1 | ||
|
|
8ad76a5278 | ||
|
|
726a85e76c | ||
|
|
2d69967f51 | ||
|
|
4aeaa115dc | ||
|
|
2d251faff1 | ||
|
|
231936c91d | ||
|
|
37b8e17cba | ||
|
|
7d928e3df9 | ||
|
|
bb4435fab4 | ||
|
|
1e0580ba15 | ||
|
|
f5716c901d | ||
|
|
2c4c0ea4f0 | ||
|
|
63fee6f272 | ||
|
|
9ab1cec1bb | ||
|
|
7c2a50eec0 | ||
|
|
82810eb179 | ||
|
|
53917d32c0 | ||
|
|
f324fbe71d | ||
|
|
c6afd889ef | ||
|
|
116ba65bda | ||
|
|
02812a9128 | ||
|
|
fcc99b61e8 | ||
|
|
c9a3c72c10 | ||
|
|
abc9c59e29 | ||
|
|
9ed897aa85 | ||
|
|
5a84f2192f | ||
|
|
9ac9cd480b | ||
|
|
b635f91e9f | ||
|
|
99079f0b3d | ||
|
|
317c2171e4 | ||
|
|
cba7ae98fa | ||
|
|
e6dcb5cd3a | ||
|
|
94f1da349a | ||
|
|
06b5a9d7f1 | ||
|
|
48bebc0503 | ||
|
|
af1897f4ea | ||
|
|
8238211f33 | ||
|
|
907f51b13a | ||
|
|
3b036a7cb7 | ||
|
|
9a0cb35637 | ||
|
|
1c938e0007 | ||
|
|
f31ff79a39 | ||
|
|
d5ea5a4fa9 | ||
|
|
c7237e561c | ||
|
|
6717721725 | ||
|
|
5e5d5b904b | ||
|
|
a353022d36 | ||
|
|
ca4e458db1 | ||
|
|
7b8e954555 | ||
|
|
b4f46ded2b | ||
|
|
274a03fe73 | ||
|
|
0a07ebfe8b | ||
|
|
39c82361b6 | ||
|
|
89f4e051ca | ||
|
|
c04ae5eb39 | ||
|
|
ec692e1134 | ||
|
|
02a1f7ee83 | ||
|
|
97aa989e0b | ||
|
|
ac67c16378 | ||
|
|
2bdb8682e1 | ||
|
|
c070ed01f7 | ||
|
|
af4cfe7fba | ||
|
|
6a8e666fb8 | ||
|
|
c097a423f9 | ||
|
|
f0dcf473e8 | ||
|
|
bdff6a3c93 | ||
|
|
74829c966d | ||
|
|
77db8df123 | ||
|
|
a403a7d432 | ||
|
|
951d2d7f30 | ||
|
|
e8ddc53188 | ||
|
|
0708226890 | ||
|
|
b0447eec3a | ||
|
|
e37a8ec41d | ||
|
|
467b7a0cba | ||
|
|
9a583e75f3 | ||
|
|
f9ae51606f | ||
|
|
e768a4c1db | ||
|
|
a77390bf5c | ||
|
|
1e41801612 | ||
|
|
d870ee409a | ||
|
|
b2a448447c | ||
|
|
38a00e6177 | ||
|
|
767ad94565 | ||
|
|
7499682883 | ||
|
|
9192f32bbb | ||
|
|
d256fd3559 | ||
|
|
5844e74d32 | ||
|
|
989a567ecb | ||
|
|
d5d47ffae5 | ||
|
|
8001622be2 | ||
|
|
fc5a6a6f7f | ||
|
|
dc15439861 | ||
|
|
c9c0d2d171 | ||
|
|
44cf46fed3 | ||
|
|
63ebf1a7c5 | ||
|
|
bc10d774a7 | ||
|
|
90f656beab | ||
|
|
66c729b539 | ||
|
|
db4dfd3edc | ||
|
|
e7879aac65 | ||
|
|
723570b392 | ||
|
|
5dc562396c | ||
|
|
b266aad634 | ||
|
|
a25c75bf7a | ||
|
|
43fc159e27 | ||
|
|
2e37cb8158 | ||
|
|
529175c0ab | ||
|
|
071599074c | ||
|
|
d420c128eb | ||
|
|
b33fd7e2b3 | ||
|
|
815118d496 | ||
|
|
83031507b9 | ||
|
|
7565086291 | ||
|
|
7c71375b6c | ||
|
|
c919b1463c | ||
|
|
b72d831df9 | ||
|
|
2c494ac0d1 | ||
|
|
83b2295818 | ||
|
|
11a831299a | ||
|
|
bbe315fb45 | ||
|
|
9c03205c9f | ||
|
|
12a4e15c13 | ||
|
|
0843e457b0 | ||
|
|
b1bde2f105 | ||
|
|
d2ff0b1ea1 | ||
|
|
7ff13babaa | ||
|
|
0da7dc6796 | ||
|
|
f84f9ab696 | ||
|
|
8b5f7def93 | ||
|
|
8c33b899bf | ||
|
|
8767ad6d3f | ||
|
|
f797538935 | ||
|
|
cfb4310d6f | ||
|
|
d59cd74bf0 | ||
|
|
c378ce7d71 | ||
|
|
9cc6f519a9 | ||
|
|
18251dde89 | ||
|
|
04bf707836 | ||
|
|
5e38247ce8 | ||
|
|
979a1e6b14 | ||
|
|
9127d61a59 | ||
|
|
fed76499a0 | ||
|
|
6843feebfa | ||
|
|
e650ee66ff | ||
|
|
fa6f571f61 | ||
|
|
09b7ece510 | ||
|
|
b30caf051c | ||
|
|
861bf1eb07 | ||
|
|
a0f1417f42 | ||
|
|
2b5f57dfab | ||
|
|
22a5f15201 | ||
|
|
6baf1534c1 | ||
|
|
df3ce9eda7 | ||
|
|
7f71614781 | ||
|
|
8c5b703c47 | ||
|
|
394cda3efd | ||
|
|
7b9b5c2819 | ||
|
|
4625c087d5 | ||
|
|
f7c3c56b53 | ||
|
|
0aa9831a62 | ||
|
|
ea32948b84 | ||
|
|
0feaf55381 | ||
|
|
eaa04e395b | ||
|
|
0f8d53b09a | ||
|
|
031aa0f173 | ||
|
|
5f5b571899 | ||
|
|
b6f041f68c | ||
|
|
558a3228be | ||
|
|
2e4bedae31 | ||
|
|
e2905e8fdd | ||
|
|
ddee1fca8e | ||
|
|
d2b13e146e | ||
|
|
9b3704a141 | ||
|
|
9b5e2ec7f0 | ||
|
|
adf4e106d8 | ||
|
|
d01edbdfe2 | ||
|
|
f08d166c86 | ||
|
|
b8c61fdabd | ||
|
|
6b3b61acb5 | ||
|
|
1a6951b717 | ||
|
|
165df678b3 | ||
|
|
2abbee0a49 | ||
|
|
a6883fe607 | ||
|
|
6ee0abd150 | ||
|
|
68e927c6f4 | ||
|
|
1776f43425 | ||
|
|
fc8123c194 | ||
|
|
34448b8a23 | ||
|
|
7179ca41de | ||
|
|
3c7d940ba8 | ||
|
|
1225a41de4 | ||
|
|
d101cd1b6a | ||
|
|
4851487ecd | ||
|
|
eb0faad7ec | ||
|
|
524666f6e4 | ||
|
|
e9da67dcce | ||
|
|
aa8fc523df | ||
|
|
63570a923b | ||
|
|
638e82dd28 | ||
|
|
68dc960232 | ||
|
|
bbbe25e339 | ||
|
|
d8cca8b372 | ||
|
|
1e9df74034 | ||
|
|
8c8522c68e | ||
|
|
5afc5477a9 | ||
|
|
a6e48813cd | ||
|
|
a1a286dfb6 | ||
|
|
132c64f438 | ||
|
|
8e0bde3428 | ||
|
|
d9ac9eb2eb | ||
|
|
6ccdeba85e | ||
|
|
bbf0f39d69 | ||
|
|
109af44c6b | ||
|
|
bc9c012bb2 | ||
|
|
ba02c6ca7d | ||
|
|
b840a0adf1 | ||
|
|
5cb2f6ad91 | ||
|
|
36a7a80814 | ||
|
|
17299d00e1 | ||
|
|
a56ea2d456 | ||
|
|
3a705cce8e | ||
|
|
5550285531 | ||
|
|
0ba7644862 | ||
|
|
0e169bd116 | ||
|
|
4b9515b21a | ||
|
|
3f0e34b715 | ||
|
|
a393910c0a | ||
|
|
213f4b8408 | ||
|
|
8cb01d0ba8 | ||
|
|
d8c46b49d9 | ||
|
|
73e4ba9994 | ||
|
|
3aa5b21d49 | ||
|
|
f90807ebc6 | ||
|
|
a555009ac9 | ||
|
|
af21d1abba | ||
|
|
dcf77ba862 | ||
|
|
f281011a47 | ||
|
|
6bb8ca73d3 | ||
|
|
a070edc1c2 | ||
|
|
09485747a6 | ||
|
|
cbd73ae638 | ||
|
|
1aeec348eb | ||
|
|
ea8e783909 | ||
|
|
e06338dd2e | ||
|
|
d6fffc43e4 | ||
|
|
7633f84385 | ||
|
|
93fc20c825 | ||
|
|
ca32c11296 | ||
|
|
d2b8d2238a | ||
|
|
04ea9c39e1 | ||
|
|
905e965917 | ||
|
|
1ada23584d | ||
|
|
1456fd9076 | ||
|
|
941dd6015d | ||
|
|
b1f320f361 | ||
|
|
63e3718178 | ||
|
|
9bfa30f849 | ||
|
|
bb24b27963 | ||
|
|
403d93831f | ||
|
|
9a149eb673 | ||
|
|
470995c13d | ||
|
|
ddcd03f096 | ||
|
|
b8fe2aacf1 | ||
|
|
3c9f0d3c5c | ||
|
|
ded0ab5381 | ||
|
|
42d20f0fd9 | ||
|
|
0e8ace560b | ||
|
|
6e04a5d3da | ||
|
|
a3d8a8037f | ||
|
|
1dc42e1333 | ||
|
|
68cdcd8587 | ||
|
|
ebf0d585fc | ||
|
|
75365c428d | ||
|
|
3e30f5e18f | ||
|
|
e8d3b3decb | ||
|
|
5dcb364469 | ||
|
|
df9530e48f | ||
|
|
240a27a61a | ||
|
|
a6a8a5d583 | ||
|
|
a9046aded4 | ||
|
|
6f60cc6afb | ||
|
|
6e5470e20c | ||
|
|
dc04b4220f | ||
|
|
b1cfdef41c | ||
|
|
06e609613e | ||
|
|
8e66c24ff9 | ||
|
|
b4e2761b1f | ||
|
|
884d3e8c34 | ||
|
|
53739d24df | ||
|
|
f59a76d9a0 | ||
|
|
6cd36b19b2 | ||
|
|
b22ad88f37 | ||
|
|
f87ec18669 | ||
|
|
64686e165f | ||
|
|
055bad9ca9 | ||
|
|
c6e04bc4b9 | ||
|
|
b6782df565 | ||
|
|
2b4cb2cc88 | ||
|
|
14d12d90e3 | ||
|
|
4ed3832a5f | ||
|
|
b0714ab27e | ||
|
|
201ee840d5 | ||
|
|
79f737404e | ||
|
|
0b649e3f5b | ||
|
|
c756223363 | ||
|
|
ea60742d82 | ||
|
|
2ce90ba008 | ||
|
|
63211457e4 | ||
|
|
67f014d74a | ||
|
|
08fffade74 | ||
|
|
c8adb52660 | ||
|
|
4f74502951 | ||
|
|
4a5a4c19a5 | ||
|
|
e73d76eb57 | ||
|
|
b9a89d7c40 | ||
|
|
1a1bf814a0 | ||
|
|
f52e929d04 | ||
|
|
38d8d2e1ca | ||
|
|
ab4015d0e0 | ||
|
|
15027e51ee | ||
|
|
557d7ef1d9 | ||
|
|
4dea906e23 | ||
|
|
68e25cb0b3 | ||
|
|
4d033e59f1 | ||
|
|
a80c579d8a | ||
|
|
5cc48ed462 | ||
|
|
2abc8ff9d8 | ||
|
|
198bd6c322 | ||
|
|
7fb96f1eac | ||
|
|
2020f55826 | ||
|
|
c58f8d7831 | ||
|
|
32a6bbacd0 | ||
|
|
b08c77b6c0 | ||
|
|
a8836744f6 | ||
|
|
3a2202a2e8 | ||
|
|
896749d812 | ||
|
|
09ec1e8c06 | ||
|
|
07627c41e3 | ||
|
|
e4e278c2fa | ||
|
|
1b1b239ba0 | ||
|
|
c1d4d39265 | ||
|
|
dfd3885486 | ||
|
|
892f49c83a | ||
|
|
85d0671443 | ||
|
|
f22e7b9fcb | ||
|
|
d282ef1b24 | ||
|
|
9c2529ae3d | ||
|
|
108b7f5b0b | ||
|
|
b4c8be3e63 | ||
|
|
4064c56b21 | ||
|
|
1416762afe | ||
|
|
17f23fe920 | ||
|
|
c412c92b3e | ||
|
|
deed875c1b | ||
|
|
f600b628ce | ||
|
|
0c887a25e3 | ||
|
|
89dbd32351 | ||
|
|
98c5863973 | ||
|
|
3d1089b756 | ||
|
|
6c8102aecd | ||
|
|
56fdb2c2f0 | ||
|
|
7c85460fbb | ||
|
|
47b58c290a | ||
|
|
cdf57806d6 | ||
|
|
9671d60555 | ||
|
|
f8b388c968 | ||
|
|
91cc98e853 | ||
|
|
58484f1b61 | ||
|
|
d65ad6c5fd | ||
|
|
68bc1d6974 | ||
|
|
b1c518c3a8 | ||
|
|
48c7030c0e | ||
|
|
13c9d521f9 | ||
|
|
375653eb78 | ||
|
|
8c72cdcb0a | ||
|
|
cfb88d798b | ||
|
|
ebf32a18b0 | ||
|
|
5f6c1adf91 | ||
|
|
44648e9971 | ||
|
|
fd37087c43 | ||
|
|
4c47a1249f | ||
|
|
ea3563e4e9 | ||
|
|
c98c5b64e1 | ||
|
|
3b9b2e8ba2 | ||
|
|
cebde87682 | ||
|
|
0b2bf1faf1 | ||
|
|
73560e8366 | ||
|
|
afabfdd1d5 | ||
|
|
dadce33d74 |
4
.gitignore
vendored
4
.gitignore
vendored
@@ -1,6 +1,7 @@
|
|||||||
# OSX
|
# OSX
|
||||||
#
|
#
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
node_modules/
|
||||||
|
|
||||||
#Intellij idea
|
#Intellij idea
|
||||||
.idea/
|
.idea/
|
||||||
@@ -8,3 +9,6 @@
|
|||||||
.vscode/
|
.vscode/
|
||||||
/unpackage/
|
/unpackage/
|
||||||
.hbuilderx/launch.json
|
.hbuilderx/launch.json
|
||||||
|
.project.config.json
|
||||||
|
.project.private.config.json
|
||||||
|
|
||||||
|
|||||||
103
App.vue
103
App.vue
@@ -1,26 +1,42 @@
|
|||||||
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
/**
|
/**
|
||||||
* vuex管理登录状态,具体可以参考官方登录模板示例
|
* vuex管理登录状态,具体可以参考官方登录模板示例
|
||||||
*/
|
*/
|
||||||
import { mapMutations } from "vuex";
|
import config from "@/config/config";
|
||||||
|
import {
|
||||||
|
getClipboardData
|
||||||
|
} from "@/js_sdk/h5-copy/h5-copy.js";
|
||||||
import APPUpdate from "@/plugins/APPUpdate";
|
import APPUpdate from "@/plugins/APPUpdate";
|
||||||
import { getClipboardData } from "@/js_sdk/h5-copy/h5-copy.js";
|
import storage from "@/utils/storage";
|
||||||
import config from "@/config/config";
|
import {
|
||||||
// 悬浮球
|
mapMutations
|
||||||
|
} from "vuex";
|
||||||
|
|
||||||
export default {
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 路由监听并删除路由
|
||||||
|
* https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.navigateTo.html
|
||||||
|
* */
|
||||||
|
// #ifdef MP-WEIXIN
|
||||||
|
wx.onAppRoute((res) => {
|
||||||
|
|
||||||
|
})
|
||||||
|
// #endif
|
||||||
|
|
||||||
|
export default {
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
config,
|
config,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 监听返回
|
* 监听返回
|
||||||
*/
|
*/
|
||||||
onBackPress(e) {
|
onBackPress(e) {
|
||||||
|
console.log("onBackPress-APP", e);
|
||||||
if (e.from == "backbutton") {
|
if (e.from == "backbutton") {
|
||||||
let routes = getCurrentPages();
|
let routes = getCurrentPages();
|
||||||
let curRoute = routes[routes.length - 1].options;
|
let curRoute = routes[routes.length - 1].options;
|
||||||
@@ -48,11 +64,12 @@ export default {
|
|||||||
methods: {
|
methods: {
|
||||||
...mapMutations(["login"]),
|
...mapMutations(["login"]),
|
||||||
},
|
},
|
||||||
onLaunch: function () {
|
onLaunch: function(val) {
|
||||||
// #ifdef APP-PLUS
|
if(val.query.inviter){
|
||||||
this.checkArguments(); // 检测启动参数
|
storage.setInviter(val.query.inviter)
|
||||||
APPUpdate();
|
}
|
||||||
|
|
||||||
|
// #ifdef APP-PLUS
|
||||||
// 重点是以下: 一定要监听后台恢复 !一定要
|
// 重点是以下: 一定要监听后台恢复 !一定要
|
||||||
plus.globalEvent.addEventListener("newintent", (e) => {
|
plus.globalEvent.addEventListener("newintent", (e) => {
|
||||||
this.checkArguments(); // 检测启动参数
|
this.checkArguments(); // 检测启动参数
|
||||||
@@ -66,7 +83,18 @@ export default {
|
|||||||
|
|
||||||
onShow() {
|
onShow() {
|
||||||
// #ifndef H5
|
// #ifndef H5
|
||||||
|
if(this.config.enableGetClipboard){
|
||||||
this.getClipboard();
|
this.getClipboard();
|
||||||
|
}
|
||||||
|
// #endif
|
||||||
|
// #ifdef APP-PLUS
|
||||||
|
|
||||||
|
if (storage.getShow()) {
|
||||||
|
if (uni.getSystemInfoSync().platform == 'ios') {
|
||||||
|
this.$u.route("/pages/tabbar/screen/fullScreen");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
// #endif
|
// #endif
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -76,11 +104,11 @@ export default {
|
|||||||
applyUpdateWeChat() {
|
applyUpdateWeChat() {
|
||||||
const updateManager = uni.getUpdateManager();
|
const updateManager = uni.getUpdateManager();
|
||||||
|
|
||||||
updateManager.onCheckForUpdate(function (res) {
|
updateManager.onCheckForUpdate(function(res) {
|
||||||
// 请求完新版本信息的回调
|
// 请求完新版本信息的回调
|
||||||
});
|
});
|
||||||
|
|
||||||
updateManager.onUpdateReady(function (res) {
|
updateManager.onUpdateReady(function(res) {
|
||||||
uni.showModal({
|
uni.showModal({
|
||||||
title: "更新提示",
|
title: "更新提示",
|
||||||
content: "发现新版本,是否重启应用?",
|
content: "发现新版本,是否重启应用?",
|
||||||
@@ -92,7 +120,7 @@ export default {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
updateManager.onUpdateFailed(function (res) {
|
updateManager.onUpdateFailed(function(res) {
|
||||||
// 新的版本下载失败
|
// 新的版本下载失败
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@@ -108,8 +136,7 @@ export default {
|
|||||||
//app启动时打开启动广告页
|
//app启动时打开启动广告页
|
||||||
var w = plus.webview.open(
|
var w = plus.webview.open(
|
||||||
"/hybrid/html/advertise/advertise.html",
|
"/hybrid/html/advertise/advertise.html",
|
||||||
"本地地址",
|
"本地地址", {
|
||||||
{
|
|
||||||
top: 0,
|
top: 0,
|
||||||
bottom: 0,
|
bottom: 0,
|
||||||
zindex: 999,
|
zindex: 999,
|
||||||
@@ -118,7 +145,7 @@ export default {
|
|||||||
500
|
500
|
||||||
);
|
);
|
||||||
//设置定时器,4s后关闭启动广告页
|
//设置定时器,4s后关闭启动广告页
|
||||||
setTimeout(function () {
|
setTimeout(function() {
|
||||||
plus.webview.close(w);
|
plus.webview.close(w);
|
||||||
APPUpdate();
|
APPUpdate();
|
||||||
}, 3000);
|
}, 3000);
|
||||||
@@ -128,7 +155,7 @@ export default {
|
|||||||
uni.setStorage({
|
uni.setStorage({
|
||||||
key: "launchFlag",
|
key: "launchFlag",
|
||||||
data: true,
|
data: true,
|
||||||
success: function () {
|
success: function() {
|
||||||
console.log("error时存储launchFlag");
|
console.log("error时存储launchFlag");
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@@ -140,15 +167,18 @@ export default {
|
|||||||
*/
|
*/
|
||||||
async getClipboard() {
|
async getClipboard() {
|
||||||
let res = await getClipboardData();
|
let res = await getClipboardData();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 解析粘贴板数据
|
* 解析粘贴板数据
|
||||||
*/
|
*/
|
||||||
if (res.indexOf(config.shareLink) != -1) {
|
|
||||||
|
if (res.indexOf(config.shareLink) != -1 && (res != this.$store.state.shareLink)) {
|
||||||
|
this.$store.state.shareLink = res
|
||||||
uni.showModal({
|
uni.showModal({
|
||||||
title: "提示",
|
title: "提示",
|
||||||
content: "检测到一个分享链接是否跳转?",
|
content: "检测到一个分享链接是否跳转?",
|
||||||
confirmText: "跳转",
|
confirmText: "跳转",
|
||||||
success: function (callback) {
|
success: function(callback) {
|
||||||
if (callback.confirm) {
|
if (callback.confirm) {
|
||||||
const path = res.split(config.shareLink)[1];
|
const path = res.split(config.shareLink)[1];
|
||||||
if (path.indexOf("tabbar") != -1) {
|
if (path.indexOf("tabbar") != -1) {
|
||||||
@@ -190,32 +220,35 @@ export default {
|
|||||||
// #endif
|
// #endif
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
@import "uview-ui/index.scss";
|
@import "uview-ui/index.scss";
|
||||||
|
|
||||||
// -------适配底部安全区 苹果x系列刘海屏
|
// -------适配底部安全区 苹果x系列刘海屏
|
||||||
|
|
||||||
// #ifdef MP-WEIXIN
|
// #ifdef MP-WEIXIN
|
||||||
.mp-iphonex-bottom {
|
.mp-iphonex-bottom {
|
||||||
padding-bottom: constant(safe-area-inset-bottom);
|
padding-bottom: constant(safe-area-inset-bottom);
|
||||||
padding-bottom: env(safe-area-inset-bottom);
|
padding-bottom: env(safe-area-inset-bottom);
|
||||||
box-sizing: content-box;
|
box-sizing: content-box;
|
||||||
height: auto !important;
|
height: auto !important;
|
||||||
padding-top: 10rpx;
|
padding-top: 10rpx;
|
||||||
}
|
}
|
||||||
// #endif
|
|
||||||
|
|
||||||
body {
|
// #endif
|
||||||
|
|
||||||
|
body {
|
||||||
background-color: $bg-color;
|
background-color: $bg-color;
|
||||||
}
|
}
|
||||||
/************************ */
|
|
||||||
.w200 {
|
/************************ */
|
||||||
|
.w200 {
|
||||||
width: 200rpx !important;
|
width: 200rpx !important;
|
||||||
}
|
}
|
||||||
.flex1 {
|
|
||||||
|
.flex1 {
|
||||||
flex: 1; //必须父级设置flex
|
flex: 1; //必须父级设置flex
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
qSyvBPhDsPdxvOhC
|
|
||||||
415
README.md
415
README.md
@@ -1,277 +1,226 @@
|
|||||||
## Lilishop B2B2C商城系统
|
## Lilishop B2B2C 商城系统
|
||||||
|
|
||||||
##### 官方公众号 & 开源不易,如有帮助请点Star
|
### 近期常出现的问题解决方法
|
||||||

|
|
||||||
|
|
||||||
[](https://gitee.com/beijing_hongye_huicheng/lilishop/stargazers)
|
1. 高版本hbulider启动会报错建议先固定使用 4.45
|
||||||
|
2. 编译到微信小程序会报错 xxx defined 这里注意微信小程序基础调试库要使用 3.5.3
|
||||||
|
|
||||||
|
|
||||||
### 介绍
|
|
||||||
|
### 商城介绍
|
||||||
|
|
||||||
**官网**:https://pickmall.cn
|
**官网**:https://pickmall.cn
|
||||||
|
|
||||||
Lilishop 是一款Java开发,基于SpringBoot研发的B2B2C多用户商城,前端使用 Vue、uniapp开发 **系统全端全部代码开源**
|
**更多 README**:https://gitee.com/beijing_hongye_huicheng/lilishop/blob/master/README.md
|
||||||
|
|
||||||
产品前后端分离、支持分布式部署。
|
**演示站点**:https://m-b2b2c.pickmall.cn/ 账号:13011111111 验证码:111111
|
||||||
|
|
||||||
商城展示端包含 PC、H5、微信小程序、APP。
|
**商城 小程序/公众号/APP**:扫描二维码
|
||||||
|
|
||||||
商城包含 会员模块、**第三方登录模块**、**第三方支付模块**、**楼层装修模块**、订单模块、分销模块、文章模块、系统设置模块、流量分析模块
|

|
||||||
|
|
||||||
系统包含各种中间件、搜索引擎、多级缓存、分布式事务、分布式任务调度等,支持Docker,支持k8s。是一款高性能,支持高并发等商城系统。
|
## lilishop-uniapp如何在本地h5和微信小程序中运行
|
||||||
|
https://www.bilibili.com/video/BV17K8EemEh2/
|
||||||
|
|
||||||
开箱即用,简单配置即可部署一套属于您的系统。
|
## lilishop-uniapp如何打包h5到服务器
|
||||||
|
https://www.bilibili.com/video/BV1CX87exE64/
|
||||||
|
|
||||||
### 文档
|
### 快速开始
|
||||||
|
|
||||||
**产品文档**(需求、架构、使用、部署、开发):https://docs.pickmall.cn
|
#### 阅读文档
|
||||||
|
|
||||||
|
`uni-app` https://uniapp.dcloud.net.cn/api/
|
||||||
|
|
||||||
### 项目链接(gitee)
|
`vue2` https://v2.cn.vuejs.org/
|
||||||
|
|
||||||
**Java后台**:https://gitee.com/beijing_hongye_huicheng/lilishop.git
|
`uView v1` https://v1.uviewui.com/
|
||||||
|
|
||||||
**Vue后台前端**: https://gitee.com/beijing_hongye_huicheng/lilishop-ui.git
|
#### 环境
|
||||||
|
|
||||||
**Uni-app**:https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp.git
|
在开发之前保证本地安装了以下软件
|
||||||
|
`hbulider` https://www.dcloud.io/hbuilderx.html
|
||||||
|
|
||||||
**docker一键部署**:https://gitee.com/beijing_hongye_huicheng/docker.git
|
### 技术栈
|
||||||
|
|
||||||
### 项目链接(github)
|
本项目技术栈为 `uni-app` + `scss` + `ES2015` + `uView` 提前学习和了解这些知识将帮助你更好地上手我们的项目。
|
||||||
|
|
||||||
**Java后台**:https://github.com/hongyehuicheng/lilishop.git
|
### 安装
|
||||||
|
|
||||||
**Vue后台前端**: https://github.com/hongyehuicheng/lilishop-ui.git
|
1. 克隆项目到本地
|
||||||
|
|
||||||
**Uni-app**:https://github.com/hongyehuicheng/lilishop-uniapp.git
|
|
||||||
|
|
||||||
**docker一键部署**:https://github.com/hongyehuicheng/docker.git
|
|
||||||
|
|
||||||
### 演示地址
|
|
||||||
|
|
||||||
**运营后台**:https://admin-b2b2c.pickmall.cn 账号:admin/123456
|
|
||||||
|
|
||||||
**店铺后台**:https://store-b2b2c.pickmall.cn 账号:13011111111/111111
|
|
||||||
|
|
||||||
**用户前台**:https://pc-b2b2c.pickmall.cn
|
|
||||||
|
|
||||||
**移动端**:https://m-b2b2c.pickmall.cn
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### 3行命令搭建本地环境
|
|
||||||
|
|
||||||
温馨提示:由于服务较多,如果笔记本环境启动内存没有32g可能无法启动成功(macbookpro 2020 16g内存启动无法成功),台式机在16g内存、AMD 3700x 的ubuntu系统成功运行。
|
|
||||||
|
|
||||||
##### 下载docker脚本
|
|
||||||
`git clone https://gitee.com/beijing_hongye_huicheng/docker.git `
|
|
||||||
##### 部署基础环境
|
|
||||||
`docker-compose up -d`
|
|
||||||
|
|
||||||
##### 部署应用
|
|
||||||
`docker-compose -f docker-compose-application.yml up -d`
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
PS:单独部署的话,数据库文件访问这里:https://gitee.com/beijing_hongye_huicheng/docker/tree/master/init/mysql
|
|
||||||
|
|
||||||
##### 各个地址
|
|
||||||
|
|
||||||
| API | 地址 |
|
|
||||||
| -------------- | --------------- |
|
|
||||||
| 买家API | http://127.0.0.1:8888 |
|
|
||||||
| 商家API | http://127.0.0.1:8889 |
|
|
||||||
| 管理端API | http://127.0.0.1:8887 |
|
|
||||||
| 通用API | http://127.0.0.1:8890 |
|
|
||||||
|
|
||||||
| 前端演示 | 地址 |
|
|
||||||
| -------------- | --------------- |
|
|
||||||
| PC | http://127.0.0.1:10000 |
|
|
||||||
| WAP | http://127.0.0.1:10001 |
|
|
||||||
| 商家 | http://127.0.0.1:10002 |
|
|
||||||
| 管理端 | http://127.0.0.1:10003 |
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### 功能列表
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#### 平台功能
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#### 商家端功能
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### 功能展示
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#### 移动端
|
|
||||||
|
|
||||||
<img src="https://pickmall.cn/assets/imgs/other/app.gif" alt="管理端功能展示" style="zoom:50%;" />
|
|
||||||
|
|
||||||
<img src="https://pickmall.cn/assets/imgs/other/app.gif" alt="移动端功能展示" style="zoom:50%;" />
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#### 管理端
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
### 技术选型
|
|
||||||
|
|
||||||
#### 架构图
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
##### Java后台
|
|
||||||
|
|
||||||
| 说明 | 框架 | 说明 | |
|
|
||||||
| -------------- | --------------- | -------------- | ------------- |
|
|
||||||
| 基础框架 | Spring Boot | MVC框架 | Spring MVC |
|
|
||||||
| 持久框架 | Mybatis-Plus | 程序构建 | Maven |
|
|
||||||
| 关系型数据库 | MySQL | 消息中间件AMQP | RocketMQ |
|
|
||||||
| 缓存 | Redis +MongoDB | 搜索引擎 | Elasticsearch |
|
|
||||||
| 安全框架 | Spring Security | 数据库连接池 | Druid |
|
|
||||||
| 数据库分库分表 | sharding | 定时任务 | xxl-job |
|
|
||||||
| 负载均衡 | Nginx | 静态资源 | 阿里云OSS |
|
|
||||||
| 短信 | 阿里云短信 | 认证 | JWT |
|
|
||||||
| 日志处理 | Log4j | 接口规范 | RESTful |
|
|
||||||
|
|
||||||
##### 前端-运营后台、店铺后台
|
|
||||||
|
|
||||||
| 说明 | 框架 | 说明 | 框架 |
|
|
||||||
| ---------- | ---------- | ---------- | ------- |
|
|
||||||
| 构建工具 | webpack | JS版本 | ES6 |
|
|
||||||
| 基础JS框架 | Vue.js | 视频播放器 | Dplayer |
|
|
||||||
| 路由管理 | Vue Router | 状态管理 | Vuex |
|
|
||||||
| 基础UI库 | iView | UI界面基于 | iView |
|
|
||||||
| 网络请求 | axios | | |
|
|
||||||
|
|
||||||
##### 前端-移动端
|
|
||||||
|
|
||||||
| 说明 | 架构 | 说明 | 架构 |
|
|
||||||
| --------- | ------- | -------- | ------- |
|
|
||||||
| 基础UI库 | uViewui | 基础框架 | uni-app |
|
|
||||||
| CSS预处理 | scss | 地图引擎 | amap |
|
|
||||||
|
|
||||||
### 升级计划
|
|
||||||
|
|
||||||
#### 计划每个月发布一个版本,具体时间可能有出入
|
|
||||||
|
|
||||||
时间:2021年6月15日
|
|
||||||
|
|
||||||
```
|
|
||||||
新增功能:
|
|
||||||
1.微信小程序直播
|
|
||||||
2.优惠券活动
|
|
||||||
3.新人赠券
|
|
||||||
4.准确发券
|
|
||||||
5.用户等级
|
|
||||||
6.数据导出
|
|
||||||
7.订单批量
|
|
||||||
8.APP版本升级检测
|
|
||||||
9.积分商城
|
|
||||||
|
|
||||||
功能优化:
|
|
||||||
1.优惠券有效期增加类型:设置领取后*内有效。
|
|
||||||
2.秒杀活动设置为每天开启,需设置秒杀活动开启时间。
|
|
||||||
3.店铺配送模板,配送地区如果选择省份则下方的市级地址不展示。
|
|
||||||
4.店铺配送模板支持,店铺包邮。
|
|
||||||
5.普通商品设置去除卖家承担运费。
|
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git clone https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp.git
|
||||||
```
|
```
|
||||||
|
|
||||||
时间:2021年7月15日
|
2. 从`hbulider`中打开项目
|
||||||
|
|
||||||
```
|
```shell
|
||||||
新增功能:
|
直接将项目拖进hbulider中点击运行即可
|
||||||
1.会员权益
|
|
||||||
2.支持用户升级会员
|
|
||||||
3.供求单
|
|
||||||
4.IM:腾讯云智服
|
|
||||||
5.服务商品
|
|
||||||
6.店铺支持订单核销
|
|
||||||
7.店铺自提点
|
|
||||||
功能优化:
|
|
||||||
1.用户分享商城、关注店铺、邀请新用户可获取积分、经验值。
|
|
||||||
```
|
```
|
||||||
|
|
||||||
时间:2021年8月16日
|
### 目录结构
|
||||||
|
|
||||||
```
|
```
|
||||||
新增功能:
|
├── api // 接口
|
||||||
1.微淘功能
|
├── components // 组件
|
||||||
2.店铺移动端
|
├── config // 配置文件
|
||||||
3.店铺发货单
|
├── CustomStartPage // 打包配置的开屏页
|
||||||
|
├── CustomStoryboard // ios自定义storyboard启动页
|
||||||
|
├── hybrid // 广告配置页
|
||||||
|
├── js_sdk // 封装的js_sdk
|
||||||
|
├── lib // 封装的部分方法
|
||||||
|
├── pages // 页面
|
||||||
|
├── plugins // 插件
|
||||||
|
├── static // 静态资源
|
||||||
|
├── store // vuex
|
||||||
|
├── utils // 工具类
|
||||||
|
├── uview-ui // uview
|
||||||
|
├── App.vue // 入口页面
|
||||||
|
├── main.js // 入口文件
|
||||||
|
├── manifest.json // hbulider配置文件
|
||||||
|
├── pages.json // 路由配置文件
|
||||||
|
├── uni.scss // 全局样式
|
||||||
|
└── vue.config.js // vue配置文件
|
||||||
```
|
```
|
||||||
|
|
||||||
时间:2021年9月15日
|
### 运行
|
||||||
|
|
||||||
|
#### 运行在 h5
|
||||||
|
|
||||||
|
在`hbulider`中点击`运行`->`运行到浏览器`->`选择自己的浏览器九号`
|
||||||
|
|
||||||
|
#### 运行在微信小程序
|
||||||
|
|
||||||
|
1.需要保证本地要有`微信开发者工具` https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html
|
||||||
|
|
||||||
|
2.在`hbulider`中点击`运行`->`运行到小程序模拟器`->`微信开发者工具` 运行的时候需要配置小程序的`appid`,配置完成后即可运行
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### 运行 APP
|
||||||
|
|
||||||
|
##### 运行在安卓
|
||||||
|
|
||||||
|
在`hbulider`中点击`运行`->`运行到手机或模拟器`->`选择运行到安卓APP基座`
|
||||||
|
|
||||||
|
##### 运行在 IOS
|
||||||
|
|
||||||
|
在`hbulider`中点击`运行`->`运行到手机或模拟器`->`选择运行到IOS基座`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 项目配置/开发
|
||||||
|
|
||||||
|
#### config配置
|
||||||
|
在根目录`config`下的`config`设置中配置了一些默认的配置,可以根据自己的需求进行修改
|
||||||
|
|
||||||
```
|
```
|
||||||
新增功能:
|
const name = "lilishop"; //全局商城name
|
||||||
增加供应商功能
|
const schemeName = "lilishop"; //唤醒app需要的schemeName
|
||||||
```
|
export default {
|
||||||
|
name: name,
|
||||||
### 版本升级
|
schemeLink: `${schemeName}://`, //唤起app地址
|
||||||
|
downloadLink: "https://pickmall.cn/download-page/index.html", //下载地址,下载app的地址
|
||||||
|
shareLink: "https://m-b2b2c.pickmall.cn", //分享地址,也就是在h5中默认的复制地址
|
||||||
|
appid: "", //小程序唯一凭证,即 AppID,可在「微信公众平台 - 设置 - 开发设置」页中获得。(需要已经成为开发者,且帐号没有异常状态)
|
||||||
|
aMapKey: "", //在高德中申请Web服务key
|
||||||
|
scanAuthNavigation: ["https://m-b2b2c.pickmall.cn/"], //扫码认证跳转域名配置 会根据此处配置的路由进行跳转
|
||||||
|
iosAppId: "id1564638363", //AppStore的应用地址id 具体在分享->拷贝链接中查看
|
||||||
|
logo: "https://lilishop-oss.oss-cn-beijing.aliyuncs.com/4c864e133c2944efad1f7282ac8a3b9e.png", //logo地址
|
||||||
|
customerServiceMobile: "13161366885", //客服电话
|
||||||
|
customerServiceEmail: "lili@lili.com", //客服邮箱
|
||||||
|
imWebSrc: "https://im.pickmall.cn", //IM地址
|
||||||
|
baseWsUrl: "wss://im-api.pickmall.cn/lili/webSocket", // IM WS 地址
|
||||||
|
enableGetClipboard: false, //是否启用粘贴板获取 scanAuthNavigation 中的链接,如果匹配则会跳转到对应页面
|
||||||
|
enableMiniBarStartUpApp: true, //是否在h5中右侧浮空按钮点击启动app
|
||||||
|
/**
|
||||||
|
* 如需更换主题请修改此处以及uni.scss中的全局颜色
|
||||||
|
*/
|
||||||
|
mainColor: "#ff3c2a", // 主题色
|
||||||
|
lightColor: "#ff6b35", // 高亮主题色
|
||||||
|
aiderLightColor: "#ff9f28", // 辅助高亮颜色
|
||||||
|
defaultUserPhoto: "/static/missing-face.png", // 默认用户头像
|
||||||
|
enableFetchMobileLogin: false // 是否启用获取手机号登录 如果微信小程序提示封禁手机号获取权限 可将此选项设置成false作为备用登录方案
|
||||||
|
};
|
||||||
|
|
||||||
```
|
```
|
||||||
后续会持续版本升级,修复bug,完善功能,覆盖更多业务场景 o2o/b2b/s2b2b2c/跨境电商
|
#### 组件
|
||||||
|
在根目录`components`下的`components`设置中配置了一些默认的组件,可以根据自己的需求进行修改或阅读组件详情代码以及README.md文档
|
||||||
|
|
||||||
后续会考虑推出微服务/中台等 企业级版本
|
#### 页面
|
||||||
|
在`pages`文件夹写入或修改页面代码,在`pages.json`中去配置页面路由,具体配置可以参考`pages.json` 或参考uni-app的文档
|
||||||
|
|
||||||
|
在微信小程序中默认启用分包操作,如果需要在微信小程序中使用分包,需要在`pages.json`中配置分包路径,具体配置可以参考`pages.json` 或参考uni-app的文档
|
||||||
|
|
||||||
|
#### 主题
|
||||||
|
1.现在`config`中设置主题色
|
||||||
|
|
||||||
|
2.在`uni.scss`中设置全局颜色
|
||||||
|
|
||||||
|
3.替换项目中一些icon以及图片的颜色
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 常见问题
|
||||||
|
|
||||||
|
#### 微信小程序移动端启动报错
|
||||||
|
|
||||||
|
小程序直播插件报错,在`manifest`中删除代码。
|
||||||
|

|
||||||
|
|
||||||
|
#### 微信小程序上传文件过大超出 2MB
|
||||||
|
|
||||||
|
1.关闭微信小程序,停止微信小程序运行
|
||||||
|
|
||||||
|
2.重新点击运行小程序模拟器,在最下方有一个 `运行时是否压缩代码` 勾选并重新运行
|
||||||
|
|
||||||
|
3.如果还是提示超出2MB,重新执行1步骤,然后点击`发行`->`小程序`即可
|
||||||
|
|
||||||
|
4.以上1-3步骤都不行,可以尝试删除一些自己开发的代码或本地的静态资源图片
|
||||||
|
|
||||||
|
#### 微信小程序在开发者工具中可以使用接口在测试版却不行
|
||||||
|
1.首先保证是否填写`request`合法域名 在微信小程序后台配置
|
||||||
|
|
||||||
|
2.需保证接口为https请求
|
||||||
|
|
||||||
|
request合法域名基础配置如下
|
||||||
|
```
|
||||||
|
https://buyer-api.pickmall.cn
|
||||||
|
https://common-api.pickmall.cn
|
||||||
|
https://im-api.pickmall.cn
|
||||||
|
https://restapi.amap.com
|
||||||
```
|
```
|
||||||
|
|
||||||
### 技术亮点
|
socket合法域名
|
||||||
|
```
|
||||||
|
wss://im-api.pickmall.cn
|
||||||
|
```
|
||||||
|
uploadFile合法域名
|
||||||
|
```
|
||||||
|
https://common-api.pickmall.cn
|
||||||
|
```
|
||||||
|
downloadFile合法域名
|
||||||
|
```
|
||||||
|
https://buyer-api.pickmall.cn
|
||||||
|
https://common-api.pickmall.cn
|
||||||
|
https://im-api.pickmall.cn
|
||||||
|
https://lilishop-oss.oss-cn-beijing.aliyuncs.com
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 如何配置API
|
||||||
|
在根目录 `config` -> `api` 中配置开发环境以及生产环境 api 接口地址
|
||||||
|
|
||||||
|
#### 运行报错
|
||||||
|
初次运行时候可能因为本地环境缺少编译插件,这个时候一定要注意看报错信息,根据报错信息安装相应的插件即可
|
||||||
|
|
||||||
|
#### 如何配置微信小程序appid
|
||||||
|
在根目录 `manifest.json` 中配置微信小程序appid
|
||||||
|
|
||||||
|
|
||||||
1.后端框架基于Springboot,构建基于maven,持久层使用MyBatisPlus。使用elasticsearch、redis、mongodb、rocketmq 等各种中间健。都是主流架构,轻松应对各种环境。
|
#### 微信登录报错
|
||||||
|
需检查appId是否配置正确,在后台管理中信任登录的`appId`以及`appSecret`是否配置正确
|
||||||
2.支持集群、分布式,支持docker 轻松部署,解决各种复杂场景!
|
|
||||||
|
|
||||||
3.代码模块清晰,主要分为三端api(买家、卖家、管理),各端API互相隔离,自己鉴权,自己操作业务。
|
|
||||||
|
|
||||||
4.使用阿里开源的RocketMQ,基于mq解决各种并发场景,解决事务一致性,解决搞并发延迟场景问题。
|
|
||||||
|
|
||||||
5.项目使用多级缓存,应用不同场景,redis缓存业务数据、mongodb缓存关系型多对多关系问题、nginx缓存高频访问低频修改的页面。
|
|
||||||
|
|
||||||
6.支持各种联合登陆,支持各种客户端的支付问题,灵活配置灵活开启。
|
|
||||||
|
|
||||||
7.内置完善的楼层装修机制,各种拖拉拽,维护跳转页面或外网,即便是一个什么都不懂的运营也可以轻松掌握。
|
|
||||||
|
|
||||||
8.内置阿里短信接口,可以在线申请短信模版。内置阿里oss系统,可以对文件执行各种操作。oss商家端资源相互隔离。
|
|
||||||
|
|
||||||
10.强大的统计报表,统计效果,可以实现各个场景,包含在线人数,历史在线人数,活跃人数等信息。
|
|
||||||
|
|
||||||
11.标准Api接口、提供swagger文档,快速二开。
|
|
||||||
|
|
||||||
12.分布式调度任务中心,解决分布式定时任务多次执行问题。
|
|
||||||
|
|
||||||
13.代码注释完善,快速上手。
|
|
||||||
|
|
||||||
14.非移动端采用IView框架,各种自定义插件、选择器实现。移动端采用uniapp,一次编写,全端使用
|
|
||||||
|
|
||||||
15.已经对接好各种第三方插件,支持各种复杂等联合登陆,联合支付等场景。
|
|
||||||
|
|
||||||
|
|
||||||
### 开源须知
|
|
||||||
1.仅允许用于个人学习研究使用.
|
|
||||||
|
|
||||||
2.禁止将本开源的代码和资源进行任何形式任何名义的出售.
|
|
||||||
|
|
||||||
3.限制商用,如果需要商业使用请联系我们。QQ3409056806.
|
|
||||||
|
|
||||||
### 交流群
|
|
||||||
|
|
||||||
**QQ群**:961316482
|
|
||||||
|
|
||||||
|
|||||||
17
androidPrivacy.json
Normal file
17
androidPrivacy.json
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"version" : "1",
|
||||||
|
"prompt" : "template",
|
||||||
|
"title" : "服务协议和隐私政策",
|
||||||
|
"message" : " 请你务必审慎阅读、充分理解“服务协议”和“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。<br/> 你可阅读<a href=\"https://pc-b2b2c.pickmall.cn/article/detail?id=1371992704333905920\">《服务协议》</a>和<a href=\"https://pc-b2b2c.pickmall.cn/article/detail?id=1371779927900160000\">《隐私政策》</a>了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。",
|
||||||
|
"buttonAccept" : "同意并接受",
|
||||||
|
"buttonRefuse" : "暂不同意",
|
||||||
|
"second" : {
|
||||||
|
"title" : "确认提示",
|
||||||
|
"message" : " 进入应用前,你需先同意<a href=\"https://pc-b2b2c.pickmall.cn/article/detail?id=1371992704333905920\">《服务协议》</a>和<a href=\"https://pc-b2b2c.pickmall.cn/article/detail?id=1371779927900160000\">《隐私政策》</a>,否则将退出应用。",
|
||||||
|
"buttonAccept" : "同意并继续",
|
||||||
|
"buttonRefuse" : "退出应用"
|
||||||
|
},
|
||||||
|
"styles" : {
|
||||||
|
"borderRadius" : "5px"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,7 +12,7 @@ import api from "@/config/api.js";
|
|||||||
*/
|
*/
|
||||||
export function getAddressList(pageNumber, pageSize) {
|
export function getAddressList(pageNumber, pageSize) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: "/memberAddress",
|
url: "/member/address",
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
params: { pageNumber, pageSize },
|
params: { pageNumber, pageSize },
|
||||||
@@ -25,7 +25,7 @@ export function getAddressList(pageNumber, pageSize) {
|
|||||||
*/
|
*/
|
||||||
export function getLogistics() {
|
export function getLogistics() {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: "/logistics",
|
url: "/other/logistics",
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
params: { pageNumber: 1, pageSize: 200, disabled: "OPEN" },
|
params: { pageNumber: 1, pageSize: 200, disabled: "OPEN" },
|
||||||
@@ -37,7 +37,7 @@ export function getLogistics() {
|
|||||||
*/
|
*/
|
||||||
export function getAddressCode(cityCode, townName) {
|
export function getAddressCode(cityCode, townName) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: api.common + "/region/region",
|
url: api.common + "/common/region/region",
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
params: { cityCode, townName },
|
params: { cityCode, townName },
|
||||||
@@ -51,7 +51,7 @@ export function getAddressCode(cityCode, townName) {
|
|||||||
*/
|
*/
|
||||||
export function addAddress(data) {
|
export function addAddress(data) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: "/memberAddress",
|
url: "/member/address",
|
||||||
method: Method.POST,
|
method: Method.POST,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
header: { "content-type": "application/x-www-form-urlencoded" },
|
header: { "content-type": "application/x-www-form-urlencoded" },
|
||||||
@@ -67,7 +67,7 @@ export function addAddress(data) {
|
|||||||
*/
|
*/
|
||||||
export function editAddress(params) {
|
export function editAddress(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/memberAddress`,
|
url: `/member/address`,
|
||||||
method: Method.PUT,
|
method: Method.PUT,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
header: { "content-type": "application/x-www-form-urlencoded" },
|
header: { "content-type": "application/x-www-form-urlencoded" },
|
||||||
@@ -81,7 +81,7 @@ export function editAddress(params) {
|
|||||||
*/
|
*/
|
||||||
export function deleteAddress(id) {
|
export function deleteAddress(id) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/memberAddress/delById/${id}`,
|
url: `/member/address/delById/${id}`,
|
||||||
method: Method.DELETE,
|
method: Method.DELETE,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
});
|
});
|
||||||
@@ -95,7 +95,7 @@ export function deleteAddress(id) {
|
|||||||
*/
|
*/
|
||||||
export function getAddressDetail(id) {
|
export function getAddressDetail(id) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/memberAddress/get/${id}`,
|
url: `/member/address/get/${id}`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
loading: false,
|
loading: false,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
@@ -107,7 +107,7 @@ export function getAddressDetail(id) {
|
|||||||
*/
|
*/
|
||||||
export function getAddressDefault() {
|
export function getAddressDefault() {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/memberAddress/get/default`,
|
url: `/member/address/get/default`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
loading: false,
|
loading: false,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
|
|||||||
@@ -34,16 +34,29 @@ export function applyCancelOrder(params) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
/**
|
/**
|
||||||
* 获取商家售后收件地址
|
* 获取商家售后收件地址
|
||||||
*/
|
*/
|
||||||
export function getstoreAfterSaleAddress(sn) {
|
export function getStoreAfterSaleAddress(sn) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/afterSale/getStoreAfterSaleAddress/${sn}`,
|
url: `/order/afterSale/getStoreAfterSaleAddress/${sn}`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 取消售后
|
||||||
|
*/
|
||||||
|
export function cancelAfterSale(afterSaleSn) {
|
||||||
|
return http.request({
|
||||||
|
url: `/order/afterSale/cancel/${afterSaleSn}`,
|
||||||
|
method: Method.POST,
|
||||||
|
needToken: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取售后服务记录相关数据
|
* 获取售后服务记录相关数据
|
||||||
@@ -51,7 +64,7 @@ export function getstoreAfterSaleAddress(sn) {
|
|||||||
*/
|
*/
|
||||||
export function getAfterSaleList(params) {
|
export function getAfterSaleList(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/afterSale/page`,
|
url: `/order/afterSale/page`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
params,
|
params,
|
||||||
@@ -64,7 +77,7 @@ export function getAfterSaleList(params) {
|
|||||||
*/
|
*/
|
||||||
export function getServiceDetail(sn) {
|
export function getServiceDetail(sn) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/afterSale/get/${sn}`,
|
url: `/order/afterSale/get/${sn}`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
});
|
});
|
||||||
@@ -76,7 +89,7 @@ export function getServiceDetail(sn) {
|
|||||||
*/
|
*/
|
||||||
export function addComplain(params) {
|
export function addComplain(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/complain`,
|
url: `/order/complain`,
|
||||||
method: Method.POST,
|
method: Method.POST,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
header: {
|
header: {
|
||||||
@@ -91,7 +104,7 @@ export function addComplain(params) {
|
|||||||
*/
|
*/
|
||||||
export function clearComplain(id, params) {
|
export function clearComplain(id, params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/complain/status/${id}`,
|
url: `/order/complain/status/${id}`,
|
||||||
method: Method.PUT,
|
method: Method.PUT,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
params,
|
params,
|
||||||
@@ -103,7 +116,7 @@ export function clearComplain(id, params) {
|
|||||||
*/
|
*/
|
||||||
export function getAfterSaleLog(sn) {
|
export function getAfterSaleLog(sn) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/afterSale/get/getAfterSaleLog/${sn}`,
|
url: `/order/afterSale/get/getAfterSaleLog/${sn}`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
});
|
});
|
||||||
@@ -114,7 +127,7 @@ export function getAfterSaleLog(sn) {
|
|||||||
*/
|
*/
|
||||||
export function getComplain(params) {
|
export function getComplain(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/complain`,
|
url: `/order/complain`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
params,
|
params,
|
||||||
@@ -126,7 +139,7 @@ export function getComplain(params) {
|
|||||||
*/
|
*/
|
||||||
export function getAfterSaleReason(serviceType) {
|
export function getAfterSaleReason(serviceType) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/afterSale/get/afterSaleReason/${serviceType}`,
|
url: `/order/afterSale/get/afterSaleReason/${serviceType}`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
});
|
});
|
||||||
@@ -137,7 +150,7 @@ export function getAfterSaleReason(serviceType) {
|
|||||||
*/
|
*/
|
||||||
export function getClearReason() {
|
export function getClearReason() {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/afterSale/get/afterSaleReason/CANCEL`,
|
url: `/order/afterSale/get/afterSaleReason/CANCEL`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
});
|
});
|
||||||
@@ -148,7 +161,7 @@ export function getClearReason() {
|
|||||||
*/
|
*/
|
||||||
export function getComplainReason() {
|
export function getComplainReason() {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/afterSale/get/afterSaleReason/COMPLAIN`,
|
url: `/order/afterSale/get/afterSaleReason/COMPLAIN`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
});
|
});
|
||||||
@@ -158,7 +171,7 @@ export function getComplainReason() {
|
|||||||
*/
|
*/
|
||||||
export function getComplainDetail(id) {
|
export function getComplainDetail(id) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/complain/${id}`,
|
url: `/order/complain/${id}`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
});
|
});
|
||||||
@@ -169,7 +182,7 @@ export function getComplainDetail(id) {
|
|||||||
*/
|
*/
|
||||||
export function getAfterSaleInfo(sn) {
|
export function getAfterSaleInfo(sn) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/afterSale/applyAfterSaleInfo/${sn}`,
|
url: `/order/afterSale/applyAfterSaleInfo/${sn}`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
});
|
});
|
||||||
@@ -181,7 +194,7 @@ export function getAfterSaleInfo(sn) {
|
|||||||
*/
|
*/
|
||||||
export function applyReturn(orderItemSn, params) {
|
export function applyReturn(orderItemSn, params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/afterSale/save/${orderItemSn}`,
|
url: `/order/afterSale/save/${orderItemSn}`,
|
||||||
method: Method.POST,
|
method: Method.POST,
|
||||||
header: {
|
header: {
|
||||||
"Content-Type": "application/x-www-form-urlencoded",
|
"Content-Type": "application/x-www-form-urlencoded",
|
||||||
@@ -197,7 +210,7 @@ export function applyReturn(orderItemSn, params) {
|
|||||||
*/
|
*/
|
||||||
export function fillShipInfo(afterSaleSn, params) {
|
export function fillShipInfo(afterSaleSn, params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/afterSale/delivery/${afterSaleSn}`,
|
url: `/order/afterSale/delivery/${afterSaleSn}`,
|
||||||
method: Method.POST,
|
method: Method.POST,
|
||||||
header: {
|
header: {
|
||||||
"Content-Type": "application/x-www-form-urlencoded",
|
"Content-Type": "application/x-www-form-urlencoded",
|
||||||
@@ -205,3 +218,13 @@ export function fillShipInfo(afterSaleSn, params) {
|
|||||||
data: params,
|
data: params,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 添加交易投诉对话
|
||||||
|
export function communication(params) {
|
||||||
|
return http.request({
|
||||||
|
url: `/order/complain/communication`,
|
||||||
|
method: Method.POST,
|
||||||
|
needToken: true,
|
||||||
|
params
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -23,8 +23,21 @@ export function getArticleCategory(category_type) {
|
|||||||
*/
|
*/
|
||||||
export function getArticleDetail(type) {
|
export function getArticleDetail(type) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/article/type/${type}`,
|
url: `/other/article/get/${type}`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取文章详情
|
||||||
|
* @param type
|
||||||
|
*/
|
||||||
|
export function getArticleDetailByType(type) {
|
||||||
|
return http.request({
|
||||||
|
url: `/other/article/type/${type}`,
|
||||||
|
method: Method.GET,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
/**
|
/**
|
||||||
* 公共API
|
* 公共API
|
||||||
*/
|
*/
|
||||||
import {http, Method} from '@/utils/request.js';
|
import { http, Method } from "@/utils/request.js";
|
||||||
import api from '@/config/api.js';
|
import api from "@/config/api.js";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取地区数据
|
* 获取地区数据
|
||||||
@@ -12,7 +10,16 @@ import api from '@/config/api.js';
|
|||||||
*/
|
*/
|
||||||
export function getRegionsById(id = 0) {
|
export function getRegionsById(id = 0) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `${api.common}/region/item/${id}`,
|
url: `${api.common}/common/region/item/${id}`,
|
||||||
|
method: Method.GET,
|
||||||
|
message: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取IM接口前缀
|
||||||
|
export function getIMDetail() {
|
||||||
|
return http.request({
|
||||||
|
url: `${api.common}/IM`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
message: false,
|
message: false,
|
||||||
});
|
});
|
||||||
@@ -22,5 +29,4 @@ export function getRegionsById(id = 0) {
|
|||||||
* 文件上传地址
|
* 文件上传地址
|
||||||
* @type {string}
|
* @type {string}
|
||||||
*/
|
*/
|
||||||
export const upload =api.common+'/upload/file';
|
export const upload = api.common + "/common/upload/file";
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ const request = http.request;
|
|||||||
*/
|
*/
|
||||||
export function webConnect(code) {
|
export function webConnect(code) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `connect/login/web/${code}`,
|
url: `passport/connect/connect/login/web/${code}`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
header: {
|
header: {
|
||||||
@@ -25,8 +25,8 @@ export function webConnect(code) {
|
|||||||
}
|
}
|
||||||
export function openIdLogin(params, clientType) {
|
export function openIdLogin(params, clientType) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `connect/app/login`,
|
url: `passport/connect/connect/app/login`,
|
||||||
method: Method.GET,
|
method: Method.POST,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
data: params,
|
data: params,
|
||||||
header: {
|
header: {
|
||||||
@@ -40,7 +40,7 @@ export function openIdLogin(params, clientType) {
|
|||||||
*/
|
*/
|
||||||
export function loginCallback(state) {
|
export function loginCallback(state) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `connect/result?state=${state}`,
|
url: `passport/connect/connect/result?state=${state}`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: false
|
needToken: false
|
||||||
});
|
});
|
||||||
@@ -54,7 +54,7 @@ export function loginCallback(state) {
|
|||||||
*/
|
*/
|
||||||
export function mpAutoLogin(params) {
|
export function mpAutoLogin(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: 'mini-program/auto-login',
|
url: 'passport/connect/miniProgram/auto-login',
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
params
|
params
|
||||||
});
|
});
|
||||||
|
|||||||
41
api/entry.js
Normal file
41
api/entry.js
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
/**
|
||||||
|
* 入驻类相关api
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { http, Method } from "@/utils/request.js";
|
||||||
|
|
||||||
|
// 获取当前用户的代理入驻详情
|
||||||
|
export function getCompanyDetail(params) {
|
||||||
|
return http.request({
|
||||||
|
url: "/store/store/apply",
|
||||||
|
method: Method.GET,
|
||||||
|
params,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 申请店铺第一步-填写企业信息
|
||||||
|
export function applyFirst(params) {
|
||||||
|
return http.request({
|
||||||
|
url: "/store/store/apply/first",
|
||||||
|
method: Method.PUT,
|
||||||
|
params,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 申请店铺第二步-填写银行
|
||||||
|
export function applySecond(params) {
|
||||||
|
return http.request({
|
||||||
|
url: "/store/store/apply/second",
|
||||||
|
method: Method.PUT,
|
||||||
|
params,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 申请店铺第三步-填写银行
|
||||||
|
export function applyThird(params) {
|
||||||
|
return http.request({
|
||||||
|
url: "/store/store/apply/third",
|
||||||
|
method: Method.PUT,
|
||||||
|
params,
|
||||||
|
});
|
||||||
|
}
|
||||||
26
api/goods.js
26
api/goods.js
@@ -9,7 +9,7 @@ import { http, Method } from "@/utils/request.js";
|
|||||||
*/
|
*/
|
||||||
export function getGoodsMessage(goodsId) {
|
export function getGoodsMessage(goodsId) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/goods/get/${goodsId}`,
|
url: `/goods/goods/get/${goodsId}`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -19,7 +19,7 @@ import { http, Method } from "@/utils/request.js";
|
|||||||
*/
|
*/
|
||||||
export function getGoodsRelated(params) {
|
export function getGoodsRelated(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/goods/es/related`,
|
url: `/goods/goods/es/related`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
params,
|
params,
|
||||||
});
|
});
|
||||||
@@ -32,7 +32,7 @@ export function getGoodsRelated(params) {
|
|||||||
*/
|
*/
|
||||||
export function getGoods(skuId, goodsId) {
|
export function getGoods(skuId, goodsId) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/goods/sku/${goodsId}/${skuId}`,
|
url: `/goods/goods/sku/${goodsId}/${skuId}`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -43,7 +43,7 @@ export function getGoodsRelated(params) {
|
|||||||
*/
|
*/
|
||||||
export function getGoodsDistribution(distributionId) {
|
export function getGoodsDistribution(distributionId) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/distribution/bindingDistribution/${distributionId}`,
|
url: `/distribution/distribution/bindingDistribution/${distributionId}`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -56,7 +56,7 @@ export function getGoodsRelated(params) {
|
|||||||
*/
|
*/
|
||||||
export function getGoodsList(params) {
|
export function getGoodsList(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: "/goods/es",
|
url: "/goods/goods/es",
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
params,
|
params,
|
||||||
});
|
});
|
||||||
@@ -112,7 +112,7 @@ export function getPlateformTagGoods(tag_id) {
|
|||||||
*/
|
*/
|
||||||
export function getCategoryList(id) {
|
export function getCategoryList(id) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/category/get/${id}`,
|
url: `/goods/category/get/${id}`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
loading: false,
|
loading: false,
|
||||||
});
|
});
|
||||||
@@ -126,7 +126,7 @@ export function getCategoryList(id) {
|
|||||||
*/
|
*/
|
||||||
export function distribution() {
|
export function distribution() {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/distribution`,
|
url: `/distribution/distribution`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -136,7 +136,7 @@ export function distribution() {
|
|||||||
*/
|
*/
|
||||||
export function applyDistribution(params) {
|
export function applyDistribution(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/distribution`,
|
url: `/distribution/distribution`,
|
||||||
method: Method.POST,
|
method: Method.POST,
|
||||||
params,
|
params,
|
||||||
});
|
});
|
||||||
@@ -170,7 +170,7 @@ export function cashLog(params) {
|
|||||||
*/
|
*/
|
||||||
export function distributionOrderList(params) {
|
export function distributionOrderList(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/distribution/distributionOrder`,
|
url: `/distribution/distribution/distributionOrder`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
params
|
params
|
||||||
});
|
});
|
||||||
@@ -181,7 +181,7 @@ export function distributionOrderList(params) {
|
|||||||
*/
|
*/
|
||||||
export function distributionGoods(params) {
|
export function distributionGoods(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/distributionGoods`,
|
url: `/distribution/goods`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
params,
|
params,
|
||||||
});
|
});
|
||||||
@@ -191,7 +191,7 @@ export function distributionGoods(params) {
|
|||||||
*/
|
*/
|
||||||
export function checkedDistributionGoods(params) {
|
export function checkedDistributionGoods(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/distributionGoods/checked/${params.id}`,
|
url: `/distribution/goods/checked/${params.id}`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
params
|
params
|
||||||
});
|
});
|
||||||
@@ -202,7 +202,7 @@ export function checkedDistributionGoods(params) {
|
|||||||
*/
|
*/
|
||||||
export function getMpCode(params){
|
export function getMpCode(params){
|
||||||
return http.request({
|
return http.request({
|
||||||
url:`/mini-program/mp/unlimited`,
|
url:`/passport/connect/miniProgram/mp/unlimited`,
|
||||||
method:Method.GET,
|
method:Method.GET,
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
@@ -213,7 +213,7 @@ export function checkedDistributionGoods(params) {
|
|||||||
*/
|
*/
|
||||||
export function getMpScene(id){
|
export function getMpScene(id){
|
||||||
return http.request({
|
return http.request({
|
||||||
url:`/mini-program/mp/unlimited/scene?id=${id}`,
|
url:`/passport/connect/miniProgram/mp/unlimited/scene?id=${id}`,
|
||||||
method:Method.GET,
|
method:Method.GET,
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|||||||
37
api/home.js
37
api/home.js
@@ -1,6 +1,21 @@
|
|||||||
import { http, Method } from "@/utils/request.js";
|
import { http, Method } from "@/utils/request.js";
|
||||||
|
|
||||||
|
export function toSpecial(data) {
|
||||||
|
return http.request({
|
||||||
|
url: `/other/pageData/getSpecial`,
|
||||||
|
method: Method.GET,
|
||||||
|
data
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 专题内容
|
||||||
|
*/
|
||||||
|
export function getSpecial(id) {
|
||||||
|
return http.request({
|
||||||
|
url: `/other/pageData/get/${id}`,
|
||||||
|
method: Method.GET,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取广告图
|
* 获取广告图
|
||||||
@@ -32,7 +47,7 @@ export function getCategory(parent_id = 0) {
|
|||||||
*/
|
*/
|
||||||
export function getHotKeywords(count) {
|
export function getHotKeywords(count) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: "/goods/hot-words",
|
url: "/goods/goods/hot-words",
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
loading: false,
|
loading: false,
|
||||||
params: { count },
|
params: { count },
|
||||||
@@ -44,10 +59,22 @@ export function getHotKeywords(count) {
|
|||||||
* @param client_type
|
* @param client_type
|
||||||
* @param page_type
|
* @param page_type
|
||||||
*/
|
*/
|
||||||
export function getFloorData() {
|
export function getFloorData(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/pageData/getIndex?clientType=H5`,
|
url: `/other/pageData/getIndex?clientType=H5`,
|
||||||
method: "get",
|
method: "get",
|
||||||
|
params
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取店铺楼层数据
|
||||||
|
*/
|
||||||
|
export function getFloorStoreData(params) {
|
||||||
|
return http.request({
|
||||||
|
url: `/other/pageData?pageClientType=H5`,
|
||||||
|
method: "get",
|
||||||
|
params
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,7 +83,7 @@ export function getFloorData() {
|
|||||||
*/
|
*/
|
||||||
export function getCategoryIndexData(parentId = 0) {
|
export function getCategoryIndexData(parentId = 0) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/category/get/${parentId}`,
|
url: `/goods/category/get/${parentId}`,
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
82
api/im.js
Normal file
82
api/im.js
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
import { http,Method } from "@/utils/request.js";
|
||||||
|
|
||||||
|
import api from "@/config/api.js";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取聊天详情接口
|
||||||
|
* @param {*} talkId
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function getTalk(talkId) {
|
||||||
|
return http.request({
|
||||||
|
url: `${api.im}/talk/${talkId}`,
|
||||||
|
method: Method.GET,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取与用户的聊天详情
|
||||||
|
* @param {*} talkId
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function getTalkByUser(userId) {
|
||||||
|
return http.request({
|
||||||
|
url: `${api.im}/talk/by/user/${userId}`,
|
||||||
|
method: Method.GET,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取聊天列表
|
||||||
|
* @param {*} talkId
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function getTalkList(params) {
|
||||||
|
return http.request({
|
||||||
|
url: `${api.im}/talk/list`,
|
||||||
|
method: Method.GET,
|
||||||
|
params
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取聊天信息接口
|
||||||
|
* @param {*} params
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function getTalkMessage(params) {
|
||||||
|
return http.request({
|
||||||
|
url: `${api.im}/message`,
|
||||||
|
method: Method.GET,
|
||||||
|
params
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取聊天信息接口
|
||||||
|
* @param {*} params
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function cleanUnreadMessage(params) {
|
||||||
|
return http.request({
|
||||||
|
url: `${api.im}/message/clean/unred`,
|
||||||
|
method: Method.PUT,
|
||||||
|
params
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// 从商品页点击 客服 跳转 获取商品详情
|
||||||
|
export function jumpObtain(skuId, goodsId) {
|
||||||
|
return http.request({
|
||||||
|
url: `/goods/goods/sku/${goodsId}/${skuId}`,
|
||||||
|
method: Method.GET,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// 清除未读
|
||||||
|
// /im/message/clean/unred
|
||||||
|
export function clearmeaager() {
|
||||||
|
return http.request({
|
||||||
|
url: `${api.im}/message/clean/unred`,
|
||||||
|
method: Method.PUT,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
97
api/login.js
97
api/login.js
@@ -8,19 +8,58 @@ import api from "@/config/api.js";
|
|||||||
*/
|
*/
|
||||||
export function resetByMobile(params) {
|
export function resetByMobile(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/members/resetByMobile`,
|
url: `/passport/member/resetByMobile`,
|
||||||
method: "POST",
|
method: "POST",
|
||||||
params,
|
params,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 绑定手机号码
|
||||||
|
* @param mobile
|
||||||
|
*/
|
||||||
|
export function bindMobile(params) {
|
||||||
|
return http.request({
|
||||||
|
url: `/passport/member/bindMobile`,
|
||||||
|
method: "POST",
|
||||||
|
params,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取自动发券
|
||||||
|
export function getAutoCoup(){
|
||||||
|
return http.request({
|
||||||
|
url:`/promotion/coupon/activity`,
|
||||||
|
method:"GET",
|
||||||
|
needToken: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 账号密码登陆
|
||||||
|
* @params password
|
||||||
|
* @params username
|
||||||
|
*/
|
||||||
|
export function userLogin(params, clientType){
|
||||||
|
return http.request({
|
||||||
|
method: "POST",
|
||||||
|
url:`/passport/member/userLogin`,
|
||||||
|
data: params,
|
||||||
|
header: {
|
||||||
|
"content-type": "application/x-www-form-urlencoded",
|
||||||
|
clientType: clientType,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发送验证码
|
* 发送验证码
|
||||||
* @param mobile
|
* @param mobile
|
||||||
*/
|
*/
|
||||||
export function sendMobile(mobile,type='LOGIN') {
|
export function sendMobile(mobile,type='LOGIN') {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `${api.common}/sms/${type}/${mobile}`,
|
url: `${api.common}/common/sms/${type}/${mobile}`,
|
||||||
method: "GET",
|
method: "GET",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -32,7 +71,7 @@ export function sendMobile(mobile,type='LOGIN') {
|
|||||||
*/
|
*/
|
||||||
export function smsLogin(params, clientType) {
|
export function smsLogin(params, clientType) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/members/smsLogin`,
|
url: `/passport/member/smsLogin`,
|
||||||
method: "POST",
|
method: "POST",
|
||||||
data: params,
|
data: params,
|
||||||
header: {
|
header: {
|
||||||
@@ -50,18 +89,66 @@ export function smsLogin(params, clientType) {
|
|||||||
|
|
||||||
export function modifyPass(params) {
|
export function modifyPass(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/members/modifyPass`,
|
url: `/passport/member/modifyPass`,
|
||||||
method: "PUT",
|
method: "PUT",
|
||||||
params,
|
params,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改密码
|
||||||
|
* @param newPassword
|
||||||
|
* @param password
|
||||||
|
*/
|
||||||
|
export function resetPassword(params) {
|
||||||
|
return http.request({
|
||||||
|
url: `/passport/member/resetPassword`,
|
||||||
|
method: "POST",
|
||||||
|
params,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 刷新token
|
* 刷新token
|
||||||
*/
|
*/
|
||||||
export function refreshTokenFn(refresh_token) {
|
export function refreshTokenFn(refresh_token) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/members/refresh/${refresh_token}`,
|
url: `/passport/member/refresh/${refresh_token}`,
|
||||||
method: "GET",
|
method: "GET",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取密码状态
|
||||||
|
export function logout () {
|
||||||
|
return http.request({
|
||||||
|
url: '/passport/member/logout',
|
||||||
|
method: "POST",
|
||||||
|
needToken: true,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function scannerCodeLogin(params){
|
||||||
|
return http.request({
|
||||||
|
url: '/passport/member/app_scanner',
|
||||||
|
method: "POST",
|
||||||
|
params,
|
||||||
|
needToken: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
export function scannerCodeLoginConfirm(params){
|
||||||
|
return http.request({
|
||||||
|
url: '/passport/member/app_confirm',
|
||||||
|
method: "POST",
|
||||||
|
params,
|
||||||
|
needToken: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 注销用户
|
||||||
|
export function logoffConfirm() {
|
||||||
|
return http.request({
|
||||||
|
url: '/passport/member/cancellation',
|
||||||
|
method: "PUT",
|
||||||
|
needToken: true,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { http, Method } from "@/utils/request.js";
|
|||||||
*/
|
*/
|
||||||
export function feedBack(params) {
|
export function feedBack(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: "/feedback",
|
url: "/other/feedback",
|
||||||
method: Method.POST,
|
method: Method.POST,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
params,
|
params,
|
||||||
@@ -16,7 +16,7 @@ export function feedBack(params) {
|
|||||||
// 提现
|
// 提现
|
||||||
export function withdrawalApply(params) {
|
export function withdrawalApply(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: "/members/wallet/withdrawal",
|
url: "/wallet/wallet/withdrawal",
|
||||||
method: Method.POST,
|
method: Method.POST,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
params,
|
params,
|
||||||
@@ -30,7 +30,7 @@ export function withdrawalApply(params) {
|
|||||||
*/
|
*/
|
||||||
export function payCallback(params) {
|
export function payCallback(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/cashier/result`,
|
url: `/payment/cashier/result`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
params,
|
params,
|
||||||
});
|
});
|
||||||
@@ -117,7 +117,7 @@ export function getPointsData(params) {
|
|||||||
*/
|
*/
|
||||||
export function getComments(params) {
|
export function getComments(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: "/memberEvaluation",
|
url: "/member/evaluation",
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
params,
|
params,
|
||||||
@@ -131,7 +131,7 @@ export function getComments(params) {
|
|||||||
*/
|
*/
|
||||||
export function getFootprintNum(params) {
|
export function getFootprintNum(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: "/footprint/getFootprintNum",
|
url: "/member/footprint/getFootprintNum",
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
params,
|
params,
|
||||||
@@ -144,7 +144,7 @@ export function getFootprintNum(params) {
|
|||||||
*/
|
*/
|
||||||
export function commentsMemberOrder(params) {
|
export function commentsMemberOrder(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: "/memberEvaluation",
|
url: "/member/evaluation",
|
||||||
method: Method.POST,
|
method: Method.POST,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
header: { "content-type": "application/x-www-form-urlencoded" },
|
header: { "content-type": "application/x-www-form-urlencoded" },
|
||||||
@@ -202,6 +202,22 @@ export function getGoodsCollection(params, type) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取商品收藏
|
||||||
|
* @param params
|
||||||
|
* @returns {AxiosPromise}
|
||||||
|
*/
|
||||||
|
export function getStoreCollection(params, type) {
|
||||||
|
return http.request({
|
||||||
|
url: `/member/storeCollection/${type}`,
|
||||||
|
method: Method.GET,
|
||||||
|
needToken: true,
|
||||||
|
loading: false,
|
||||||
|
message: false,
|
||||||
|
params,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 收藏商品
|
* 收藏商品
|
||||||
* @returns {AxiosPromise}
|
* @returns {AxiosPromise}
|
||||||
@@ -236,7 +252,7 @@ export function deleteGoodsCollection(ids) {
|
|||||||
*/
|
*/
|
||||||
export function deleteStoreCollection(store_id) {
|
export function deleteStoreCollection(store_id) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/member/collection/delete/STORE/${store_id}`,
|
url: `/member/storeCollection/delete/STORE/${store_id}`,
|
||||||
method: Method.DELETE,
|
method: Method.DELETE,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
});
|
});
|
||||||
@@ -255,6 +271,19 @@ export function getGoodsIsCollect(type, good_id) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取商品是否被收藏
|
||||||
|
* @param good_id
|
||||||
|
*/
|
||||||
|
export function getStoreIsCollect(type, store_id) {
|
||||||
|
return http.request({
|
||||||
|
url: `/member/storeCollection/isCollection/${type}/${store_id}`,
|
||||||
|
method: Method.GET,
|
||||||
|
needToken: true,
|
||||||
|
loading: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 收藏店铺
|
* 收藏店铺
|
||||||
* @param store_id 店铺ID
|
* @param store_id 店铺ID
|
||||||
@@ -262,10 +291,9 @@ export function getGoodsIsCollect(type, good_id) {
|
|||||||
*/
|
*/
|
||||||
export function collectionStore(store_id) {
|
export function collectionStore(store_id) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: "members/collection/store",
|
url: `/member/storeCollection/add/STORE/${store_id}`,
|
||||||
header: { "content-type": "application/x-www-form-urlencoded" },
|
|
||||||
method: Method.POST,
|
method: Method.POST,
|
||||||
data: { store_id },
|
needToken: true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -275,7 +303,7 @@ export function collectionStore(store_id) {
|
|||||||
*/
|
*/
|
||||||
export function getUserInfo() {
|
export function getUserInfo() {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: "/members",
|
url: "/passport/member",
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
});
|
});
|
||||||
@@ -287,7 +315,7 @@ export function getUserInfo() {
|
|||||||
*/
|
*/
|
||||||
export function getUserWallet() {
|
export function getUserWallet() {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: "/members/wallet",
|
url: "/wallet/wallet",
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
});
|
});
|
||||||
@@ -300,7 +328,7 @@ export function getUserWallet() {
|
|||||||
*/
|
*/
|
||||||
export function saveUserInfo(params) {
|
export function saveUserInfo(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: "/members/editOwn",
|
url: "/passport/member/editOwn",
|
||||||
method: Method.PUT,
|
method: Method.PUT,
|
||||||
header: { "content-type": "application/x-www-form-urlencoded" },
|
header: { "content-type": "application/x-www-form-urlencoded" },
|
||||||
needToken: true,
|
needToken: true,
|
||||||
@@ -328,7 +356,7 @@ export function addReceipt(params) {
|
|||||||
*/
|
*/
|
||||||
export function getGoodsComments(goodsId, params) {
|
export function getGoodsComments(goodsId, params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/memberEvaluation/${goodsId}/goodsEvaluation`,
|
url: `/member/evaluation/${goodsId}/goodsEvaluation`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
loading: false,
|
loading: false,
|
||||||
params,
|
params,
|
||||||
@@ -341,7 +369,7 @@ export function getGoodsComments(goodsId, params) {
|
|||||||
*/
|
*/
|
||||||
export function getGoodsCommentsCount(goodsId) {
|
export function getGoodsCommentsCount(goodsId) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/memberEvaluation/${goodsId}/evaluationNumber`,
|
url: `/member/evaluation/${goodsId}/evaluationNumber`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
loading: false,
|
loading: false,
|
||||||
});
|
});
|
||||||
@@ -365,7 +393,7 @@ export function getNoReadMessageNum() {
|
|||||||
*/
|
*/
|
||||||
export function myTrackList(params) {
|
export function myTrackList(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/footprint`,
|
url: `/member/footprint`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
params,
|
params,
|
||||||
@@ -378,7 +406,7 @@ export function myTrackList(params) {
|
|||||||
*/
|
*/
|
||||||
export function deleteHistoryListId(ids) {
|
export function deleteHistoryListId(ids) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/footprint/delByIds/${ids}`,
|
url: `/member/footprint/delByIds/${ids}`,
|
||||||
method: Method.DELETE,
|
method: Method.DELETE,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
});
|
});
|
||||||
@@ -419,3 +447,16 @@ export function getMemberPointSum() {
|
|||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取会员积分VO
|
||||||
|
* @param
|
||||||
|
*/
|
||||||
|
export function withdrawalSettingVO() {
|
||||||
|
return http.request({
|
||||||
|
url: `/wallet/wallet/withdrawalSettingVO`,
|
||||||
|
method: Method.GET,
|
||||||
|
needToken: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import api from '@/config/api.js';
|
|||||||
*/
|
*/
|
||||||
export function getWeChatMpMessage() {
|
export function getWeChatMpMessage() {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: 'mini-program/subscribeMessage',
|
url: 'passport/connect/miniProgram/subscribeMessage',
|
||||||
method: Method.GET
|
method: Method.GET
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -42,12 +42,30 @@ export function getMessages(params) {
|
|||||||
*/
|
*/
|
||||||
export function messageMarkAsRead(ids) {
|
export function messageMarkAsRead(ids) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `members/member-nocice-logs/${ids}/read`,
|
url: `/message/member/${ids}`,
|
||||||
method: Method.PUT,
|
method: Method.PUT,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//读取站内消息
|
||||||
|
export function editMessages(message_id,params){
|
||||||
|
return http.request({
|
||||||
|
url:`/message/member/${message_id}`,
|
||||||
|
method:Method.PUT,
|
||||||
|
needToken:true,
|
||||||
|
params
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//获取站内消息
|
||||||
|
export function messages(params) {
|
||||||
|
return http.request({
|
||||||
|
url: "/message/member",
|
||||||
|
method: Method.GET,
|
||||||
|
needToken: true,
|
||||||
|
params,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取物流消息列表
|
* 获取物流消息列表
|
||||||
@@ -73,7 +91,7 @@ export function getLogisticsMessages(params) {
|
|||||||
*/
|
*/
|
||||||
export function getAppVersion(appType) {
|
export function getAppVersion(appType) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/appVersion/${appType}`,
|
url: `/other/appVersion/${appType}`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
type:"manager"
|
type:"manager"
|
||||||
});
|
});
|
||||||
@@ -86,7 +104,7 @@ export function getLogisticsMessages(params) {
|
|||||||
*/
|
*/
|
||||||
export function getAppVersionList(type,data) {
|
export function getAppVersionList(type,data) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/appVersion/appVersion/${type}`,
|
url: `/other/appVersion/appVersion/${type}`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
type:"manager",
|
type:"manager",
|
||||||
data
|
data
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ export function selectedShipMethod(params) {
|
|||||||
*/
|
*/
|
||||||
export function getOrderList(params) {
|
export function getOrderList(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: "/orders",
|
url: "/order/order",
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
params,
|
params,
|
||||||
@@ -64,7 +64,7 @@ export function getOrderList(params) {
|
|||||||
*/
|
*/
|
||||||
export function getOrderDetail(orderSn) {
|
export function getOrderDetail(orderSn) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/orders/${orderSn}`,
|
url: `/order/order/${orderSn}`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
});
|
});
|
||||||
@@ -77,7 +77,7 @@ export function getOrderDetail(orderSn) {
|
|||||||
*/
|
*/
|
||||||
export function cancelOrder(orderSn, reason) {
|
export function cancelOrder(orderSn, reason) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/orders/${orderSn}/cancel`,
|
url: `/order/order/${orderSn}/cancel`,
|
||||||
method: Method.POST,
|
method: Method.POST,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
header: { "content-type": "application/x-www-form-urlencoded" },
|
header: { "content-type": "application/x-www-form-urlencoded" },
|
||||||
@@ -91,7 +91,7 @@ export function cancelOrder(orderSn, reason) {
|
|||||||
*/
|
*/
|
||||||
export function confirmReceipt(orderSn) {
|
export function confirmReceipt(orderSn) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/orders/${orderSn}/receiving`,
|
url: `/order/order/${orderSn}/receiving`,
|
||||||
method: Method.POST,
|
method: Method.POST,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
});
|
});
|
||||||
|
|||||||
25
api/store.js
25
api/store.js
@@ -4,13 +4,16 @@
|
|||||||
|
|
||||||
import {http, Method} from '@/utils/request.js';
|
import {http, Method} from '@/utils/request.js';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取店铺列表
|
* 获取店铺列表
|
||||||
* @param params
|
* @param params
|
||||||
*/
|
*/
|
||||||
export function getstoreList(params) {
|
export function getStoreList(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: '/store',
|
url: '/store/store',
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
params,
|
params,
|
||||||
});
|
});
|
||||||
@@ -22,7 +25,7 @@ export function getstoreList(params) {
|
|||||||
*/
|
*/
|
||||||
export function getStoreBaseInfo(storeId) {
|
export function getStoreBaseInfo(storeId) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/store/get/detail/${storeId}`,
|
url: `/store/store/get/detail/${storeId}`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
loading: false,
|
loading: false,
|
||||||
});
|
});
|
||||||
@@ -34,7 +37,7 @@ export function getstoreList(params) {
|
|||||||
*/
|
*/
|
||||||
export function getStoreCategory(id) {
|
export function getStoreCategory(id) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/store/label/get/${id}`,
|
url: `/store/store/label/get/${id}`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -46,11 +49,23 @@ export function getstoreList(params) {
|
|||||||
*/
|
*/
|
||||||
export function getLicencePhoto(id) {
|
export function getLicencePhoto(id) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/store/get/licencePhoto/${id}`,
|
url: `/store/store/get/licencePhoto/${id}`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取自提点信息
|
||||||
|
* @param id
|
||||||
|
*/
|
||||||
|
export function getStoreAddress(storeId,params) {
|
||||||
|
return http.request({
|
||||||
|
url: `/store/address/page/${storeId}`,
|
||||||
|
method: Method.GET,
|
||||||
|
params
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
53
api/trade.js
53
api/trade.js
@@ -155,6 +155,18 @@ export function setAddressId(addressId,way) {
|
|||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 设置收货地址ID
|
||||||
|
* @param addressId
|
||||||
|
*/
|
||||||
|
export function setStoreAddressId(storeAddressId,way) {
|
||||||
|
return http.request({
|
||||||
|
url: `/trade/carts/storeAddress?storeAddressId=${storeAddressId}&way=${way}`,
|
||||||
|
method: Method.GET,
|
||||||
|
needToken: true,
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -177,7 +189,7 @@ export function createTrade(params) {
|
|||||||
*/
|
*/
|
||||||
export function getCashierData(params) {
|
export function getCashierData(params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: "cashier/tradeDetail",
|
url: "payment/cashier/tradeDetail",
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
params,
|
params,
|
||||||
@@ -194,7 +206,7 @@ export function getCashierData(params) {
|
|||||||
*/
|
*/
|
||||||
export function initiatePay(paymentMethod, paymentClient, params) {
|
export function initiatePay(paymentMethod, paymentClient, params) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `cashier/pay/${paymentMethod}/${paymentClient}`,
|
url: `payment/cashier/pay/${paymentMethod}/${paymentClient}`,
|
||||||
method: Method.GET,
|
method: Method.GET,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
params,
|
params,
|
||||||
@@ -209,7 +221,7 @@ export function initiatePay(paymentMethod, paymentClient, params) {
|
|||||||
*/
|
*/
|
||||||
export function getExpress(orderSn) {
|
export function getExpress(orderSn) {
|
||||||
return http.request({
|
return http.request({
|
||||||
url: `/orders/getTraces/${orderSn}`,
|
url: `/order/order/getTraces/${orderSn}`,
|
||||||
method: Method.POST,
|
method: Method.POST,
|
||||||
needToken: true,
|
needToken: true,
|
||||||
|
|
||||||
@@ -281,3 +293,38 @@ export function reBuy(sn) {
|
|||||||
needToken: true,
|
needToken: true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取全部配送方式
|
||||||
|
*/
|
||||||
|
export function shippingMethodList(params) {
|
||||||
|
return http.request({
|
||||||
|
url: `/trade/carts/shippingMethodList`,
|
||||||
|
method: Method.GET,
|
||||||
|
needToken: true,
|
||||||
|
params: params,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 提交配送方式
|
||||||
|
* @param params
|
||||||
|
*/
|
||||||
|
export function setShipMethod(params) {
|
||||||
|
return http.request({
|
||||||
|
url: "/trade/carts/shippingMethod",
|
||||||
|
method: Method.PUT,
|
||||||
|
needToken: true,
|
||||||
|
params,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查看包裹列表
|
||||||
|
export function getPackage(orderSn) {
|
||||||
|
return http.request({
|
||||||
|
url: `/order/order/getPackage/${orderSn}`,
|
||||||
|
method: Method.GET,
|
||||||
|
needToken: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
1439
components/Sansnn-uQRCode/uqrcode.js
Normal file
1439
components/Sansnn-uQRCode/uqrcode.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,42 +1,50 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
<u-popup class="popup" v-model="buyMask" :height="setup.height" closeable :mode="setup.mode"
|
<u-popup class="popup" v-model="buyMask" :height="setup.height" closeable :mode="setup.mode" :border-radius="setup.radius" @close="closeMask()">
|
||||||
:mask-close-able="isClose" :mask="isMask" :border-radius="setup.radius" @close="closeMask()">
|
|
||||||
<!-- 商品 -->
|
<!-- 商品 -->
|
||||||
<view class="goods-box bottom">
|
<view class="goods-box bottom">
|
||||||
<view class="goods-header">
|
<view class="goods-header">
|
||||||
<view class="goods-img">
|
<view class="goods-img">
|
||||||
<u-image width="200rpx" border-radius="20" class="uimage" height="200rpx"
|
<u-image width="200rpx" border-radius="20" class="uimage" height="200rpx" :src="selectedSpecImg ? selectedSpecImg : goodsDetail.thumbnail"></u-image>
|
||||||
:src="selectedSpecImg ? selectedSpecImg : goodsDetail.thumbnail"></u-image>
|
|
||||||
</view>
|
</view>
|
||||||
<view class="goods-skus">
|
<view class="goods-skus">
|
||||||
<!-- 有活动商品价格 -->
|
<!-- 有活动商品价格 -->
|
||||||
<view class="goods-price " v-if="goodsDetail.promotionPrice">
|
<view class="goods-price" v-if="goodsDetail.promotionPrice && ((isGroup && buyType === 'PINTUAN') || !isGroup)">
|
||||||
<span>
|
<span v-if="goodsDetail.promotionPrice && !pointDetail">
|
||||||
¥
|
¥
|
||||||
<span class="goods-price-promotionShow goods-price-bigshow"
|
<span class="goods-price-promotionShow goods-price-bigshow">{{ $options.filters.goodsFormatPrice(goodsDetail.promotionPrice)[0] }}</span>
|
||||||
v-if="goodsDetail.promotionPrice">{{ formatPrice(goodsDetail.promotionPrice)[0] }}</span>
|
.{{ $options.filters.goodsFormatPrice(goodsDetail.promotionPrice)[1] }}
|
||||||
.{{ formatPrice(goodsDetail.promotionPrice)[1] }}
|
</span>
|
||||||
<span></span>
|
<span v-if="pointDetail.points">
|
||||||
|
<span class="goods-price-promotionShow goods-price-bigshow">{{ pointDetail.points }}</span>
|
||||||
|
积分
|
||||||
</span>
|
</span>
|
||||||
<div class="promotion-box">
|
<div class="promotion-box">
|
||||||
¥
|
¥
|
||||||
<span class="goods-price-bigshow">{{
|
<span class="goods-price-bigshow">{{ $options.filters.goodsFormatPrice(goodsDetail.price)[0] }}</span>
|
||||||
formatPrice(goodsDetail.price)[0]
|
.{{ $options.filters.goodsFormatPrice(goodsDetail.price)[1] }}
|
||||||
}}</span>
|
|
||||||
.{{ formatPrice(goodsDetail.price)[1] }}
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</view>
|
</view>
|
||||||
<!-- 正常商品的价格 -->
|
<!-- 正常商品的价格 -->
|
||||||
<view class="goods-price" v-else>
|
<view v-else>
|
||||||
|
<!-- 批发价格 -->
|
||||||
|
<div class="price-row flex" v-if="goodsDetail.salesModel === 'WHOLESALE'">
|
||||||
|
<div class="goods-price" v-for="(item, index) in wholesaleList" :key="index">
|
||||||
<span>
|
<span>
|
||||||
¥
|
¥
|
||||||
<span class="goods-price-bigshow">{{
|
<span class="goods-price-bigshow">{{ $options.filters.goodsFormatPrice(item.price)[0] }}</span>
|
||||||
formatPrice(goodsDetail.price)[0]
|
.{{ $options.filters.goodsFormatPrice(item.price)[1] }}
|
||||||
}}</span>
|
|
||||||
.{{ formatPrice(goodsDetail.price)[1] }}
|
|
||||||
</span>
|
</span>
|
||||||
|
<span class="wholesale-item">{{ item.num }}{{ goodsDetail.goodsUnit }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="goods-price" v-else>
|
||||||
|
<span>
|
||||||
|
¥
|
||||||
|
<span class="goods-price-bigshow">{{ $options.filters.goodsFormatPrice(goodsDetail.price)[0] }}</span>
|
||||||
|
.{{ $options.filters.goodsFormatPrice(goodsDetail.price)[1] }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
</view>
|
</view>
|
||||||
<view class="goods-check-skus">
|
<view class="goods-check-skus">
|
||||||
已选
|
已选
|
||||||
@@ -45,32 +53,58 @@
|
|||||||
<span>,{{ num }}个</span>
|
<span>,{{ num }}个</span>
|
||||||
</span>
|
</span>
|
||||||
</view>
|
</view>
|
||||||
|
<view class="goods-check-skus">
|
||||||
|
库存
|
||||||
|
<span class="goods-check-skus-name">
|
||||||
|
<span>{{ goodsDetail.quantity }}</span>
|
||||||
|
</span>
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<!-- 商品信息 -->
|
<!-- 商品信息 -->
|
||||||
<view class="goods-skus-box">
|
<scroll-view class="goods-skus-box" :scroll-y="true">
|
||||||
<!-- 规格 -->
|
<!-- 规格 -->
|
||||||
<view class="goods-skus-view" :key="specIndex" v-for="(spec, specIndex) in formatList">
|
<view class="goods-skus-view" :key="specIndex" v-for="(spec, specIndex) in formatList">
|
||||||
<view class="skus-view-list">
|
<view class="skus-view-list">
|
||||||
<view class="view-class-title">{{ spec.name }}</view>
|
<view class="view-class-title">{{ spec.name }}</view>
|
||||||
<view :class="{ active: spec_val.value == currentSelceted[specIndex] }" class="skus-view-item"
|
|
||||||
v-for="(spec_val, spec_index) in spec.values" :key="spec_index"
|
|
||||||
@click="handleClickSpec(spec, specIndex, spec_val)">{{ spec_val.value }}</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<!-- 数量 -->
|
|
||||||
<view class="goods-skus-number">
|
|
||||||
<view class="view-class-title">数量</view>
|
|
||||||
<u-number-box :bg-color="numberBox.bgColor" :color="numberBox.color" :input-width="numberBox.width"
|
|
||||||
:input-height="numberBox.height" :size="numberBox.size" :min="1" v-model="num">
|
|
||||||
</u-number-box>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<!-- 按钮 -->
|
|
||||||
<view class="btns">
|
|
||||||
|
|
||||||
<view class="box-btn card" v-if="buyType != 'PINTUAN' && goodsDetail.goodsType!='VIRTUAL_GOODS'"
|
<!-- 正常逻辑 循环出sku -->
|
||||||
@click="addToCartOrBuy('cart')">加入购物车</view>
|
<view
|
||||||
|
v-if="!parentOrder"
|
||||||
|
:class="{ active: spec_val.value == currentSelected[specIndex] }"
|
||||||
|
class="skus-view-item"
|
||||||
|
v-for="(spec_val, spec_index) in spec.values"
|
||||||
|
:key="spec_index"
|
||||||
|
@click="handleClickSpec(spec, specIndex, spec_val)"
|
||||||
|
>
|
||||||
|
{{ spec_val.value }}
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<!-- 拼团购买,仅筛选出当前拼团类型商品 -->
|
||||||
|
<view
|
||||||
|
v-if="parentOrder && spec_val.skuId == goodsDetail.id"
|
||||||
|
:class="{ active: spec_val.value == currentSelected[specIndex] }"
|
||||||
|
class="skus-view-item"
|
||||||
|
v-for="(spec_val, spec_index) in spec.values"
|
||||||
|
:key="spec_index"
|
||||||
|
@click="handleClickSpec(spec, specIndex, spec_val)"
|
||||||
|
>
|
||||||
|
{{ spec_val.value }}
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<div class="soldout" v-if="goodsDetail.quantity === 0">
|
||||||
|
<u-alert-tips type="warning" title="商品已售罄" description="当前商品库存为0"></u-alert-tips>
|
||||||
|
</div>
|
||||||
|
<!-- 数量 -->
|
||||||
|
<view v-if="goodsDetail.quantity !== 0" class="goods-skus-number flex flex-a-c flex-j-sb">
|
||||||
|
<view class="view-class-title">数量</view>
|
||||||
|
<uni-number-box class="uNumber" :min="1" :max="999" :disabled="goodsDetail.quantity === 0" v-model="num"></uni-number-box>
|
||||||
|
</view>
|
||||||
|
</scroll-view>
|
||||||
|
<!-- 按钮 -->
|
||||||
|
<view class="btns" v-if="goodsDetail.quantity !== 0">
|
||||||
|
<view class="box-btn card" v-if="buyType != 'PINTUAN' && goodsDetail.goodsType != 'VIRTUAL_GOODS'" @click="addToCartOrBuy('cart')">加入购物车</view>
|
||||||
<view class="box-btn buy" @click="addToCartOrBuy('buy')">立即购买</view>
|
<view class="box-btn buy" @click="addToCartOrBuy('buy')">立即购买</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -78,76 +112,146 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import * as API_trade from "@/api/trade.js";
|
import * as API_trade from '@/api/trade.js';
|
||||||
import setup from "./popup";
|
import setup from './popup';
|
||||||
|
import uniNumberBox from '@/components/uni-number-box'
|
||||||
export default {
|
export default {
|
||||||
|
components: {
|
||||||
|
uniNumberBox
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
setup,
|
setup,
|
||||||
num: 1,
|
num: this.wholesaleList && this.wholesaleList.length > 0 ? this.wholesaleList[0].num : 1,
|
||||||
// 步进器的大小尺寸单位是 rpx
|
|
||||||
numberBox: {
|
selectName: '', //选中商品的昵称
|
||||||
width: "50",
|
selectSkuList: '', //选中商铺sku,
|
||||||
height: "50",
|
selectedSpecImg: '', //选中的图片路径
|
||||||
size: "22",
|
buyType: '', //用于存储促销,拼团等活动类型
|
||||||
color: "#333",
|
parentOrder: '', //父级拼团活动的数据 - 如果是团员则有数据
|
||||||
bgColor: "#fff",
|
|
||||||
},
|
|
||||||
selectName: "", //选中商品的昵称
|
|
||||||
selectSkuList: "", //选中商铺sku,
|
|
||||||
selectedSpecImg: "", //选中的图片路径
|
|
||||||
buyType: "", //用于存储促销,拼团等活动类型
|
|
||||||
parentOrder: "", //父级拼团活动的数据 - 如果是团员则有数据
|
|
||||||
formatList: [],
|
formatList: [],
|
||||||
currentSelceted: [],
|
currentSelected: [],
|
||||||
skuList: "",
|
skuList: '',
|
||||||
isMask: false, //是否显示遮罩层
|
isClose: false //是否可以点击遮罩关闭
|
||||||
isClose: false, //是否可以点击遮罩关闭
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
props: [
|
props: {
|
||||||
"goodsDetail", //商品详情
|
wholesaleList: {
|
||||||
"buyMask",
|
type: null,
|
||||||
"selectedSku",
|
default: false
|
||||||
"goodsSpec",
|
},
|
||||||
"addr",
|
buyMask: {
|
||||||
],
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
isGroup: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
goodsDetail: {
|
||||||
|
default: '',
|
||||||
|
type: null
|
||||||
|
},
|
||||||
|
selectedSku: {
|
||||||
|
default: '',
|
||||||
|
type: null
|
||||||
|
},
|
||||||
|
goodsSpec: {
|
||||||
|
default: '',
|
||||||
|
type: null
|
||||||
|
},
|
||||||
|
addr: {
|
||||||
|
default: '',
|
||||||
|
type: null
|
||||||
|
},
|
||||||
|
pointDetail: {
|
||||||
|
default: '',
|
||||||
|
type: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
wholesalePrice(key) {
|
||||||
|
return this.wholesaleList.length
|
||||||
|
? this.wholesaleList.map(item => {
|
||||||
|
return item.price;
|
||||||
|
})
|
||||||
|
: [];
|
||||||
|
},
|
||||||
|
wholesaleNum(key) {
|
||||||
|
return this.wholesaleList.length
|
||||||
|
? this.wholesaleList.map(item => {
|
||||||
|
return item.num;
|
||||||
|
})
|
||||||
|
: [];
|
||||||
|
}
|
||||||
|
},
|
||||||
watch: {
|
watch: {
|
||||||
|
num(val) {
|
||||||
|
|
||||||
|
val == 0 ? this.num = 1 : ''
|
||||||
|
if (val) {
|
||||||
|
|
||||||
|
//超过库存后修改回库存
|
||||||
|
if (val > this.goodsDetail.quantity) {
|
||||||
|
this.$nextTick(function() {
|
||||||
|
this.num = this.goodsDetail.quantity;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
buyType: {
|
buyType: {
|
||||||
handler(val) {
|
handler(val) {
|
||||||
|
if (val) {
|
||||||
this.buyType = val;
|
this.buyType = val;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
immediate: true,
|
immediate: true
|
||||||
},
|
},
|
||||||
selectSkuList: {
|
selectSkuList: {
|
||||||
|
handler(val, oldval) {
|
||||||
|
this.$emit('changed', val);
|
||||||
|
},
|
||||||
|
deep: true
|
||||||
|
},
|
||||||
|
'goodsDetail.quantity': {
|
||||||
handler(val) {
|
handler(val) {
|
||||||
this.$emit("changed", val);
|
if (val == 0) {
|
||||||
},
|
uni.showToast({
|
||||||
deep: true,
|
title: '商品已售罄',
|
||||||
},
|
duration: 2000,
|
||||||
|
icon: 'none'
|
||||||
|
})
|
||||||
|
this.num = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
// 格式化金钱 1999 --> [1999,00]
|
numCheck(val) {
|
||||||
formatPrice(val) {
|
if (this.wholesaleList && this.wholesaleList.length > 0) {
|
||||||
if (typeof val == "undefined") {
|
if (this.num <= this.wholesaleList[0].num) {
|
||||||
return val;
|
uni.showToast({
|
||||||
|
title: '批发商品购买数量不能小于起批数量!',
|
||||||
|
duration: 2000,
|
||||||
|
icon: 'none'
|
||||||
|
});
|
||||||
|
this.num = this.wholesaleList[0].num;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return val.toFixed(2).split(".");
|
|
||||||
},
|
},
|
||||||
|
|
||||||
closeMask() {
|
closeMask() {
|
||||||
this.$emit("closeBuy", false);
|
this.$emit('closeBuy', false);
|
||||||
},
|
},
|
||||||
|
|
||||||
/**点击规格 */
|
/**点击规格 */
|
||||||
handleClickSpec(val, index, specValue) {
|
handleClickSpec(val, index, specValue) {
|
||||||
this.$set(this.currentSelceted, index, specValue.value);
|
this.currentSelected[index] = specValue.value;
|
||||||
let selectedSkuId = this.goodsSpec.find((i) => {
|
let selectedSkuId = this.goodsSpec.find(i => {
|
||||||
let matched = true;
|
let matched = true;
|
||||||
let specValues = i.specValues.filter((j) => j.specName !== "images");
|
let specValues = i.specValues.filter(j => j.specName !== 'images');
|
||||||
for (let n = 0; n < specValues.length; n++) {
|
for (let n = 0; n < specValues.length; n++) {
|
||||||
if (specValues[n].specValue !== this.currentSelceted[n]) {
|
if (specValues[n].specValue !== this.currentSelected[n]) {
|
||||||
matched = false;
|
matched = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -156,18 +260,40 @@ export default {
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
if (selectedSkuId?.skuId) {
|
||||||
|
this.$set(this.currentSelected, index, specValue.value);
|
||||||
this.selectSkuList = {
|
this.selectSkuList = {
|
||||||
spec: {
|
spec: {
|
||||||
specName: val.name,
|
specName: val.name,
|
||||||
specValue: specValue.value,
|
specValue: specValue.value
|
||||||
},
|
},
|
||||||
data: this.goodsDetail,
|
data: this.goodsDetail
|
||||||
};
|
};
|
||||||
this.selectName = specValue.value;
|
this.selectName = specValue.value;
|
||||||
|
|
||||||
this.$emit("handleClickSku", {
|
this.$emit('handleClickSku', {
|
||||||
skuId: selectedSkuId.skuId,
|
skuId: selectedSkuId.skuId,
|
||||||
goodsId: this.goodsDetail.goodsId,
|
goodsId: this.goodsDetail.goodsId
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
uni.showToast({
|
||||||
|
title: '暂无该商品!',
|
||||||
|
duration: 2000,
|
||||||
|
icon: 'none'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 直接购买
|
||||||
|
*/
|
||||||
|
buy(data) {
|
||||||
|
API_trade.addToCart(data).then(res => {
|
||||||
|
if (res.data.success) {
|
||||||
|
uni.navigateTo({
|
||||||
|
url: `/pages/order/fillorder?way=${data.cartType}&addr=${''}&parentOrder=${encodeURIComponent(JSON.stringify(this.parentOrder))}`
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -177,81 +303,63 @@ export default {
|
|||||||
addToCartOrBuy(val) {
|
addToCartOrBuy(val) {
|
||||||
if (!this.selectSkuList) {
|
if (!this.selectSkuList) {
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
title: "请选择规格商品",
|
title: '请选择规格商品',
|
||||||
icon: "none",
|
icon: 'none'
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let data = {
|
let data = {
|
||||||
skuId: this.goodsDetail.id,
|
skuId: this.goodsDetail.id,
|
||||||
num: this.num,
|
num: this.num
|
||||||
};
|
};
|
||||||
|
|
||||||
if (val == "cart") {
|
if (val == 'cart') {
|
||||||
API_trade.addToCart(data).then((res) => {
|
API_trade.addToCart(data).then(res => {
|
||||||
if (res.data.code == 200) {
|
if (res.data.code == 200) {
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
title: "商品已添加到购物车",
|
title: '商品已添加到购物车',
|
||||||
icon: "none",
|
icon: 'none'
|
||||||
});
|
});
|
||||||
|
|
||||||
this.$emit("queryCart");
|
this.$emit('queryCart');
|
||||||
this.closeMask();
|
this.closeMask();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// 判断是否拼团商品
|
// 判断是否拼团商品
|
||||||
if (this.buyType) {
|
if (this.buyType) {
|
||||||
data.cartType = "PINTUAN";
|
data.cartType = 'PINTUAN';
|
||||||
} else if (this.goodsDetail.goodsType == "VIRTUAL_GOODS") {
|
} else if (this.goodsDetail.goodsType == 'VIRTUAL_GOODS') {
|
||||||
data.cartType = "VIRTUAL";
|
data.cartType = 'VIRTUAL';
|
||||||
} else {
|
} else {
|
||||||
data.cartType = "BUY_NOW";
|
data.cartType = 'BUY_NOW';
|
||||||
}
|
}
|
||||||
|
|
||||||
API_trade.addToCart(data).then((res) => {
|
API_trade.addToCart(data).then(res => {
|
||||||
if (res.data.code == 200) {
|
if (res.data.code == 200) {
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
url: `/pages/order/fillorder?way=${data.cartType}&addr=${
|
url: `/pages/order/fillorder?way=${data.cartType}&addr=${this.addr.id || ''}&parentOrder=${encodeURIComponent(JSON.stringify(this.parentOrder))}`
|
||||||
this.addr.id || ""
|
|
||||||
}&parentOrder=${encodeURIComponent(
|
|
||||||
JSON.stringify(this.parentOrder)
|
|
||||||
)}`,
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
|
||||||
* 直接购买
|
|
||||||
*/
|
|
||||||
buy(data) {
|
|
||||||
API_trade.addToCart(data).then((res) => {
|
|
||||||
if (res.data.success) {
|
|
||||||
uni.navigateTo({
|
|
||||||
url: `/pages/order/fillorder?way=${
|
|
||||||
data.cartType
|
|
||||||
}&addr=${""}&parentOrder=${encodeURIComponent(
|
|
||||||
JSON.stringify(this.parentOrder)
|
|
||||||
)}`,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
formatSku(list) {
|
formatSku(list) {
|
||||||
// 格式化数据
|
// 格式化数据
|
||||||
if (!Array.isArray(list)) return false;
|
|
||||||
let arr = [{}];
|
let arr = [{}];
|
||||||
|
|
||||||
|
if (!Array.isArray(list)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
list.forEach((item, index) => {
|
list.forEach((item, index) => {
|
||||||
item.specValues.forEach((spec, specIndex) => {
|
item.specValues.forEach((spec, specIndex) => {
|
||||||
let name = spec.specName;
|
let name = spec.specName;
|
||||||
let values = {
|
let values = {
|
||||||
value: spec.specValue,
|
value: spec.specValue,
|
||||||
quantity: item.quantity,
|
quantity: item.quantity,
|
||||||
|
skuId: item.skuId
|
||||||
};
|
};
|
||||||
if (name === "images") {
|
if (name === 'images') {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -259,54 +367,65 @@ export default {
|
|||||||
if (
|
if (
|
||||||
arrItem.name == name &&
|
arrItem.name == name &&
|
||||||
arrItem.values &&
|
arrItem.values &&
|
||||||
!arrItem.values.find((i) => i.value === values.value)
|
!arrItem.values.find(i => {
|
||||||
|
return i.value === values.value;
|
||||||
|
})
|
||||||
) {
|
) {
|
||||||
arrItem.values.push(values);
|
arrItem.values.push(values);
|
||||||
}
|
}
|
||||||
|
|
||||||
let keys = arr.map((key) => {
|
let keys = arr.map(key => {
|
||||||
return key.name;
|
return key.name;
|
||||||
});
|
});
|
||||||
if (!keys.includes(name)) {
|
if (!keys.includes(name)) {
|
||||||
arr.push({
|
arr.push({
|
||||||
name: name,
|
name: name,
|
||||||
values: [values],
|
values: [values]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
arr.shift();
|
arr.shift();
|
||||||
this.formatList = arr;
|
this.formatList = arr;
|
||||||
|
|
||||||
list.forEach((item) => {
|
list.forEach(item => {
|
||||||
|
// 默认选中
|
||||||
if (item.skuId === this.goodsDetail.id) {
|
if (item.skuId === this.goodsDetail.id) {
|
||||||
item.specValues
|
item.specValues
|
||||||
.filter((i) => i.specName !== "images")
|
.filter(i => i.specName !== 'images')
|
||||||
.forEach((value, _index) => {
|
.forEach((value, _index) => {
|
||||||
this.currentSelceted[_index] = value.specValue;
|
this.currentSelected[_index] = value.specValue;
|
||||||
|
|
||||||
this.selectName = value.specValue;
|
this.selectName = value.specValue;
|
||||||
|
|
||||||
this.selectSkuList = {
|
this.selectSkuList = {
|
||||||
spec: value,
|
spec: value,
|
||||||
data: this.goodsDetail,
|
data: this.goodsDetail
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
this.skuList = list;
|
this.skuList = list;
|
||||||
},
|
// console.log(" this.skuList", this.skuList)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
this.formatSku(this.goodsSpec);
|
this.formatSku(this.goodsSpec);
|
||||||
|
|
||||||
console.log(this.goodsDetail);
|
console.log("goodsDetail",this.goodsDetail)
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
@import "./popup.scss";
|
@import './popup.scss';
|
||||||
|
|
||||||
|
.price-row {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
.buy {
|
.buy {
|
||||||
background-image: linear-gradient(135deg, #ffba0d, #ffc30d 69%, #ffcf0d);
|
background-image: linear-gradient(135deg, #ffba0d, #ffc30d 69%, #ffcf0d);
|
||||||
@@ -318,7 +437,7 @@ export default {
|
|||||||
box-shadow: 0 2px 6px 0 rgba(255, 65, 66, 0.2);
|
box-shadow: 0 2px 6px 0 rgba(255, 65, 66, 0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/deep/.u-icon-plus,
|
::v-deep.u-icon-plus,
|
||||||
.u-icon-minus,
|
.u-icon-minus,
|
||||||
.u-icon-disabled {
|
.u-icon-disabled {
|
||||||
height: 30rpx !important;
|
height: 30rpx !important;
|
||||||
@@ -328,9 +447,17 @@ export default {
|
|||||||
.goods-skus-number {
|
.goods-skus-number {
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
||||||
|
> .view-class-title {
|
||||||
|
flex: 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .view-class-input {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/deep/ .uni-scroll-view {
|
::v-deep .uni-scroll-view {
|
||||||
overflow: hidden !important;
|
overflow: hidden !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -350,6 +477,9 @@ export default {
|
|||||||
// #endif
|
// #endif
|
||||||
margin-bottom: 10rpx;
|
margin-bottom: 10rpx;
|
||||||
}
|
}
|
||||||
|
.soldout{
|
||||||
|
margin: 20rpx 0;
|
||||||
|
}
|
||||||
|
|
||||||
.goods-skus-view {
|
.goods-skus-view {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@@ -374,6 +504,14 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.wholesale-item {
|
||||||
|
color: #999 !important;
|
||||||
|
font-size: 24rpx;
|
||||||
|
margin: 0 20rpx;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
.goods-header {
|
.goods-header {
|
||||||
height: 200rpx;
|
height: 200rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -392,8 +530,14 @@ export default {
|
|||||||
.goods-price {
|
.goods-price {
|
||||||
color: $price-color;
|
color: $price-color;
|
||||||
line-height: 80rpx;
|
line-height: 80rpx;
|
||||||
display: flex;
|
margin-right: 20rpx;
|
||||||
|
|
||||||
|
> * {
|
||||||
|
color: $price-color;
|
||||||
|
line-height: 80rpx;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.promotion-box {
|
.promotion-box {
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -401,22 +545,28 @@ export default {
|
|||||||
text-decoration: line-through;
|
text-decoration: line-through;
|
||||||
color: #999;
|
color: #999;
|
||||||
margin-left: 10rpx;
|
margin-left: 10rpx;
|
||||||
/deep/ span {
|
|
||||||
|
::v-deep span {
|
||||||
font-size: 30rpx;
|
font-size: 30rpx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.promotion {
|
.promotion {
|
||||||
font-size: 30rpx;
|
font-size: 30rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.goods-price-promotionShow {
|
.goods-price-promotionShow {
|
||||||
font-size: 48rpx;
|
font-size: 48rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.goods-check-skus {
|
.goods-check-skus {
|
||||||
font-size: 24rpx;
|
font-size: 24rpx;
|
||||||
color: #999;
|
color: #999;
|
||||||
|
|
||||||
> .goods-check-skus-name {
|
> .goods-check-skus-name {
|
||||||
margin-left: 4rpx;
|
margin-left: 4rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
> span {
|
> span {
|
||||||
color: #333;
|
color: #333;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -180,11 +180,18 @@ export default {
|
|||||||
if (this.tabbars[index].id != item.id) {
|
if (this.tabbars[index].id != item.id) {
|
||||||
this.tabbars[index].localName = item.name;
|
this.tabbars[index].localName = item.name;
|
||||||
this.tabbars[index].id = item.id;
|
this.tabbars[index].id = item.id;
|
||||||
|
this.tabbars[index].center = item.center
|
||||||
if (index < this.tabbars.length - 1) {
|
if (index < this.tabbars.length - 1) {
|
||||||
this.tabbars.splice(index + 1, this.tabbars.length - index - 1);
|
this.tabbars.splice(index + 1, this.tabbars.length - index - 1);
|
||||||
}
|
}
|
||||||
if (this.tabbars.length < this.pickersize) {
|
if (this.tabbars.length < this.pickersize) {
|
||||||
|
uni.showLoading({
|
||||||
|
title: "加载中",
|
||||||
|
mask:true
|
||||||
|
});
|
||||||
|
try {
|
||||||
let data = await getRegionsById(item.id);
|
let data = await getRegionsById(item.id);
|
||||||
|
uni.hideLoading();
|
||||||
// 当前选项级为最后一级时回调,将选中的数据返回
|
// 当前选项级为最后一级时回调,将选中的数据返回
|
||||||
if (data.data.result.length == 0) {
|
if (data.data.result.length == 0) {
|
||||||
this.$emit("funcValue", this.tabbars);
|
this.$emit("funcValue", this.tabbars);
|
||||||
@@ -195,13 +202,18 @@ export default {
|
|||||||
localName: "请选择",
|
localName: "请选择",
|
||||||
id: "",
|
id: "",
|
||||||
children: data.data.result,
|
children: data.data.result,
|
||||||
|
|
||||||
};
|
};
|
||||||
this.tabbars.push(current);
|
this.tabbars.push(current);
|
||||||
this.tabCurrentIndex++;
|
this.tabCurrentIndex++;
|
||||||
|
|
||||||
// 当前距离重新为最上面
|
// 当前距离重新为最上面
|
||||||
this.scrollTop = 0;
|
this.$set(this,'scrollTop',0)
|
||||||
}
|
}
|
||||||
|
} catch (error) {
|
||||||
|
uni.hideLoading();
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
this.$emit("funcValue", this.tabbars);
|
this.$emit("funcValue", this.tabbars);
|
||||||
this.hide();
|
this.hide();
|
||||||
|
|||||||
11
components/m-goods-list/README.md
Normal file
11
components/m-goods-list/README.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
## 商品列表展示
|
||||||
|
|
||||||
|
### OBJECT 参数说明
|
||||||
|
|
||||||
|
| 属性 | 说明 | 类型 | 必填 |
|
||||||
|
| ----------- | ---------------------------------------------------------- | ------- | ---- |
|
||||||
|
| `res` | 显示数据 | Array | 是 |
|
||||||
|
| `type` | 商品展示类型 oneColumns twoColumns ,默认展示一行两列商品 | String | 否 |
|
||||||
|
| `storeName` | 是否展示店铺名称,默认展示 | Boolean | 否 |
|
||||||
|
| `keywords` | 高亮展示搜索内容 | String | 否 |
|
||||||
|
|
||||||
277
components/m-goods-list/base-list.vue
Normal file
277
components/m-goods-list/base-list.vue
Normal file
@@ -0,0 +1,277 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<!-- 一行两列商品展示 -->
|
||||||
|
<view class="goods-list" v-if="type == 'twoColumns'">
|
||||||
|
<view v-for="(item, index) in res" :key="index" class="goods-item">
|
||||||
|
<view class="image-wrapper" @click="navigateToDetailPage(item)">
|
||||||
|
<u-image
|
||||||
|
:src="item.thumbnail"
|
||||||
|
width="100%"
|
||||||
|
height="330rpx"
|
||||||
|
mode="aspectFit"
|
||||||
|
>
|
||||||
|
<u-loading slot="loading"></u-loading>
|
||||||
|
</u-image>
|
||||||
|
</view>
|
||||||
|
<view class="goods-detail">
|
||||||
|
<div
|
||||||
|
class="title clamp"
|
||||||
|
v-html="lightSearchStr(keyword, item.goodsName)"
|
||||||
|
@click="navigateToDetailPage(item)"
|
||||||
|
></div>
|
||||||
|
<view class="price-box" @click="navigateToDetailPage(item)">
|
||||||
|
<div class="price" v-if="item.price != undefined">
|
||||||
|
¥<span
|
||||||
|
>{{
|
||||||
|
$options.filters.goodsFormatPrice(item.price)[0]
|
||||||
|
}} </span
|
||||||
|
>.{{ $options.filters.goodsFormatPrice(item.price)[1] }}
|
||||||
|
</div>
|
||||||
|
</view>
|
||||||
|
<div class="count-config" @click="navigateToDetailPage(item)">
|
||||||
|
<span>已售 {{ item.buyCount || "0" }}</span>
|
||||||
|
<span>{{ item.commentNum || "0" }}条评论</span>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="store-seller-name"
|
||||||
|
v-if="storeName"
|
||||||
|
@click="navigateToStoreDetailPage(item)"
|
||||||
|
>
|
||||||
|
<div class="text-hidden">
|
||||||
|
<u-tag
|
||||||
|
style="margin-right: 10rpx"
|
||||||
|
size="mini"
|
||||||
|
mode="dark"
|
||||||
|
v-if="item.selfOperated"
|
||||||
|
text="自营"
|
||||||
|
type="error"
|
||||||
|
/>
|
||||||
|
<span>{{ item.storeName || "暂无" }}</span>
|
||||||
|
</div>
|
||||||
|
<span>
|
||||||
|
<u-icon name="arrow-right"></u-icon>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<!-- 一行一列商品展示 -->
|
||||||
|
<div v-if="type == 'oneColumns'">
|
||||||
|
<div v-for="(item, index) in res" :key="index" class="goods-row">
|
||||||
|
<div class="flex goods-col">
|
||||||
|
<div class="goods-img" @click="navigateToDetailPage(item)">
|
||||||
|
<u-image
|
||||||
|
width="230rpx"
|
||||||
|
border-radius="16"
|
||||||
|
height="230rpx"
|
||||||
|
mode="aspectFit"
|
||||||
|
:src="item.goodsImage || item.thumbnail"
|
||||||
|
>
|
||||||
|
<u-loading slot="loading"></u-loading>
|
||||||
|
</u-image>
|
||||||
|
</div>
|
||||||
|
<div class="goods-detail">
|
||||||
|
<div class="title clamp3" @click="navigateToDetailPage(item)">
|
||||||
|
{{ item.goodsName }}
|
||||||
|
</div>
|
||||||
|
<view class="price-box" @click="navigateToDetailPage(item)">
|
||||||
|
<div class="price" v-if="item.price != undefined">
|
||||||
|
¥<span
|
||||||
|
>{{ $options.filters.goodsFormatPrice(item.price)[0] }} </span
|
||||||
|
>.{{ $options.filters.goodsFormatPrice(item.price)[1] }}
|
||||||
|
</div>
|
||||||
|
</view>
|
||||||
|
<div class="promotion" @click="navigateToDetailPage(item)">
|
||||||
|
<div v-if="item.salesModel == 'WHOLESALE'">
|
||||||
|
<span>批</span>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-for="(promotionItem, promotionIndex) in getPromotion(item)"
|
||||||
|
:key="promotionIndex"
|
||||||
|
>
|
||||||
|
<span v-if="promotionItem.indexOf('COUPON') != -1">劵</span>
|
||||||
|
<span v-if="promotionItem.indexOf('FULL_DISCOUNT') != -1"
|
||||||
|
>满减</span
|
||||||
|
>
|
||||||
|
<span v-if="promotionItem.indexOf('SECKILL') != -1">秒杀</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
style="overflow: hidden"
|
||||||
|
@click="navigateToDetailPage(item)"
|
||||||
|
class="count-config"
|
||||||
|
>
|
||||||
|
<span style="float: left; font-size: 22rpx"
|
||||||
|
>已售 {{ item.buyCount || "0" }}</span
|
||||||
|
>
|
||||||
|
<span style="float: right; font-size: 22rpx"
|
||||||
|
>{{ item.commentNum || "0" }}条评论</span
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import commonTpl from "@/components/m-goods-list/common";
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
lightColor: this.$mainColor,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
mixins: [commonTpl],
|
||||||
|
props: {
|
||||||
|
// 展示的类型
|
||||||
|
type:{
|
||||||
|
type:String,
|
||||||
|
default:"oneColumns"
|
||||||
|
},
|
||||||
|
// 遍历的数据
|
||||||
|
res: {
|
||||||
|
type: Array,
|
||||||
|
default: () => {
|
||||||
|
return [];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// 跳转到商品详情
|
||||||
|
navigateToDetailPage(item) {
|
||||||
|
uni.navigateTo({
|
||||||
|
url: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.goods-list {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
margin: 10rpx 20rpx 284rpx;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
> .goods-item {
|
||||||
|
background-color: #ffffff;
|
||||||
|
display: flex;
|
||||||
|
border-radius: 16rpx;
|
||||||
|
flex-direction: column;
|
||||||
|
width: calc(50% - 30rpx);
|
||||||
|
margin-bottom: 20rpx;
|
||||||
|
padding-bottom: 20rpx;
|
||||||
|
|
||||||
|
&:nth-child(2n + 1) {
|
||||||
|
margin-right: 20rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.image-wrapper {
|
||||||
|
width: 100%;
|
||||||
|
height: 330rpx;
|
||||||
|
border-radius: 16rpx 16rpx 0 0;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.count-config,
|
||||||
|
.store-seller-name {
|
||||||
|
font-size: $font-sm;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-hidden {
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.goods-row {
|
||||||
|
background: #fff;
|
||||||
|
padding: 16rpx;
|
||||||
|
|
||||||
|
> .goods-col {
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
> .goods-img {
|
||||||
|
overflow: hidden;
|
||||||
|
flex: 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .goods-detail {
|
||||||
|
flex: 7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.goods-detail {
|
||||||
|
margin: 0 20rpx;
|
||||||
|
|
||||||
|
> .title {
|
||||||
|
font-size: $font-base;
|
||||||
|
color: $font-color-dark;
|
||||||
|
line-height: 1.5;
|
||||||
|
height: 86rpx;
|
||||||
|
padding: 10rpx 0 0;
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.promotion {
|
||||||
|
margin-top: 4rpx;
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
div {
|
||||||
|
span {
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: $light-color;
|
||||||
|
margin-right: 10rpx;
|
||||||
|
padding: 0 4rpx;
|
||||||
|
border-radius: 2rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.store-seller-name {
|
||||||
|
color: #666;
|
||||||
|
overflow: hidden;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
.count-config {
|
||||||
|
padding: 5rpx 0;
|
||||||
|
color: #666;
|
||||||
|
display: flex;
|
||||||
|
font-size: 24rpx;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .price-box {
|
||||||
|
margin-top: 10rpx;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding-right: 10rpx;
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: $font-color-light;
|
||||||
|
|
||||||
|
> .price {
|
||||||
|
font-size: 26rpx;
|
||||||
|
line-height: 1;
|
||||||
|
color: $main-color;
|
||||||
|
font-weight: bold;
|
||||||
|
|
||||||
|
::v-deep span:nth-of-type(1) {
|
||||||
|
font-size: 38rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
69
components/m-goods-list/common.vue
Normal file
69
components/m-goods-list/common.vue
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
<template>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
methods: {
|
||||||
|
// 高亮显示搜索内容
|
||||||
|
lightSearchStr(keyword, str) {
|
||||||
|
if (!keyword) {
|
||||||
|
return str
|
||||||
|
} else {
|
||||||
|
let unicodes = '';
|
||||||
|
for (let i of Array.from(keyword)) {
|
||||||
|
unicodes += this.unicode(i) + "|"
|
||||||
|
}
|
||||||
|
const rule = '(' + unicodes + ')'
|
||||||
|
const reg = new RegExp(rule, 'gi');
|
||||||
|
return str ? str.replace(reg, matchValue =>
|
||||||
|
`<span style="color:${this.lightColor}">${matchValue}</span>`
|
||||||
|
) : ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 转换为unicode
|
||||||
|
unicode(str) {
|
||||||
|
var value = '';
|
||||||
|
for (var i = 0; i < str.length; i++) {
|
||||||
|
value += '\\u' + this.left_zero_4(parseInt(str.charCodeAt(i)).toString(16));
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
},
|
||||||
|
left_zero_4(str) {
|
||||||
|
if (str != null && str != '' && str != 'undefined') {
|
||||||
|
if (str.length == 2) {
|
||||||
|
return '00' + str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
},
|
||||||
|
// 数据去重一下 只显示一次 减免 劵 什么的
|
||||||
|
getPromotion(item) {
|
||||||
|
if (item.promotionMap) {
|
||||||
|
let array = [];
|
||||||
|
Object.keys(item.promotionMap).forEach((child) => {
|
||||||
|
if (!array.includes(child.split("-")[0])) {
|
||||||
|
array.push(child.split("-")[0]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 跳转到商品详情
|
||||||
|
navigateToDetailPage(item) {
|
||||||
|
uni.navigateTo({
|
||||||
|
url: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
// 跳转地址
|
||||||
|
navigateToStoreDetailPage(item) {
|
||||||
|
uni.navigateTo({
|
||||||
|
url: `/pages/product/shopPage?id=${item.storeId}`,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang='scss' scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
341
components/m-goods-list/list.vue
Normal file
341
components/m-goods-list/list.vue
Normal file
@@ -0,0 +1,341 @@
|
|||||||
|
<template>
|
||||||
|
<view>
|
||||||
|
<!-- 一行两列商品展示 -->
|
||||||
|
<view class="goods-list" v-if="type == 'twoColumns'">
|
||||||
|
<view v-for="(item, index) in res" :key="index" class="goods-item">
|
||||||
|
<view class="image-wrapper" @click="navigateToDetailPage(item)">
|
||||||
|
<u-image :src="item.thumbnail" width="100%" height='330rpx' mode="aspectFit">
|
||||||
|
<u-loading slot="loading"></u-loading>
|
||||||
|
</u-image>
|
||||||
|
</view>
|
||||||
|
<view class="goods-detail">
|
||||||
|
<div class="title clamp" v-html="lightSearchStr(keyword,item.goodsName)"
|
||||||
|
@click="navigateToDetailPage(item)">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<view class="price-box" @click="navigateToDetailPage(item)">
|
||||||
|
<div class="price" v-if="item.price!=undefined">
|
||||||
|
¥<span>{{ $options.filters.goodsFormatPrice(item.price )[0] }} </span>.{{
|
||||||
|
$options.filters.goodsFormatPrice(item.price )[1]
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
|
</view>
|
||||||
|
<div class="promotion" @click="navigateToDetailPage(item)">
|
||||||
|
<div v-if="item.salesModel == 'WHOLESALE'">
|
||||||
|
<span>批</span>
|
||||||
|
</div>
|
||||||
|
<div v-for="(promotionItem,promotionIndex) in getPromotion(item)" :key="promotionIndex">
|
||||||
|
<span v-if="promotionItem.indexOf('COUPON') != -1">劵</span>
|
||||||
|
<span v-if="promotionItem.indexOf('FULL_DISCOUNT') != -1">满减</span>
|
||||||
|
<span v-if="promotionItem.indexOf('SECKILL') != -1">秒杀</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="count-config" @click="navigateToDetailPage(item)">
|
||||||
|
<span>已售 {{ item.buyCount || "0" }}</span>
|
||||||
|
<span>{{ item.commentNum || "0" }}条评论</span>
|
||||||
|
</div>
|
||||||
|
<div class="store-seller-name" v-if="storeName" @click="navigateToStoreDetailPage(item)">
|
||||||
|
<div class="text-hidden">
|
||||||
|
<u-tag style="margin-right: 10rpx" size="mini" mode="dark" v-if="item.selfOperated"
|
||||||
|
text="自营" type="error" />
|
||||||
|
<span>{{ item.storeName || "暂无" }}</span>
|
||||||
|
</div>
|
||||||
|
<span>
|
||||||
|
<u-icon name="arrow-right"></u-icon>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<!-- 一行一列商品展示 -->
|
||||||
|
<div v-if="type == 'oneColumns'" class="goods-one-row">
|
||||||
|
<div v-for="(item, index) in res" :key="index" class="goods-row">
|
||||||
|
<div class="flex goods-col">
|
||||||
|
<div class="goods-img" @click="navigateToDetailPage(item)">
|
||||||
|
<u-image width="230rpx" mode="aspectFit" border-radius='16' height="230rpx" :src="item.thumbnail">
|
||||||
|
<u-loading slot="loading"></u-loading>
|
||||||
|
</u-image>
|
||||||
|
</div>
|
||||||
|
<div class="goods-detail">
|
||||||
|
<div class="title clamp3" @click="navigateToDetailPage(item)">{{ item.goodsName }}</div>
|
||||||
|
<view class="price-box" @click="navigateToDetailPage(item)">
|
||||||
|
<div class="price" v-if="item.price!=undefined">
|
||||||
|
¥<span>{{ $options.filters.goodsFormatPrice(item.price )[0] }} </span>.{{
|
||||||
|
$options.filters.goodsFormatPrice(item.price )[1]
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
|
</view>
|
||||||
|
<div class="promotion" @click="navigateToDetailPage(item)">
|
||||||
|
<div v-if="item.salesModel == 'WHOLESALE'">
|
||||||
|
<span>批</span>
|
||||||
|
</div>
|
||||||
|
<div v-for="(promotionItem,promotionIndex) in getPromotion(item)" :key="promotionIndex">
|
||||||
|
<span v-if="promotionItem.indexOf('COUPON') != -1">劵</span>
|
||||||
|
<span v-if="promotionItem.indexOf('FULL_DISCOUNT') != -1">满减</span>
|
||||||
|
<span v-if="promotionItem.indexOf('SECKILL') != -1">秒杀</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div style="overflow: hidden" @click="navigateToDetailPage(item)" class="count-config">
|
||||||
|
<span style="float: left; font-size: 22rpx">已售 {{ item.buyCount || '0' }}</span>
|
||||||
|
<span style="float: right; font-size: 22rpx">{{ item.commentNum || '0' }}条评论</span>
|
||||||
|
</div>
|
||||||
|
<div style="overflow: hidden" @click="navigateToStoreDetailPage(item)" class="count-config">
|
||||||
|
<div class="text-hidden" v-if="storeName">
|
||||||
|
<u-tag style="margin-right: 10rpx" size="mini" mode="dark" v-if="item.selfOperated"
|
||||||
|
text="自营" type="error" />
|
||||||
|
<span class="line1-store-name">{{ item.storeName }}</span>
|
||||||
|
<span class="to-store">进店<u-icon size="24" name="arrow-right" color="#666"></u-icon>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<span>
|
||||||
|
<u-icon name="arrow-right" color="#c5c5c5"></u-icon>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import commonTpl from '@/components/m-goods-list/common'
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
lightColor: this.$mainColor
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mixins: [commonTpl],
|
||||||
|
|
||||||
|
props: {
|
||||||
|
// 遍历的数据
|
||||||
|
res: {
|
||||||
|
type: Array,
|
||||||
|
default: () => {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 一行两列还是一行一列显示
|
||||||
|
type: {
|
||||||
|
type: String,
|
||||||
|
default: 'twoColumns',
|
||||||
|
validator() {
|
||||||
|
return ['twoColumns', 'oneColumns']
|
||||||
|
}
|
||||||
|
},
|
||||||
|
storeName: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
},
|
||||||
|
keyword: {
|
||||||
|
type: null,
|
||||||
|
default: ''
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
keyword(val) {
|
||||||
|
if (val) {
|
||||||
|
this.lightSearchStr(val)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
|
||||||
|
// 高亮显示搜索内容
|
||||||
|
lightSearchStr(keyword, str) {
|
||||||
|
if (!keyword) {
|
||||||
|
return str
|
||||||
|
} else {
|
||||||
|
let unicodes = '';
|
||||||
|
for (let i of Array.from(keyword)) {
|
||||||
|
unicodes += this.unicode(i) + "|"
|
||||||
|
}
|
||||||
|
const rule = '(' + unicodes + ')'
|
||||||
|
const reg = new RegExp(rule, 'gi');
|
||||||
|
return str ? str.replace(reg, matchValue =>
|
||||||
|
`<span style="color:${this.lightColor}">${matchValue}</span>`
|
||||||
|
) : ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 转换为unicode
|
||||||
|
unicode(str) {
|
||||||
|
var value = '';
|
||||||
|
for (var i = 0; i < str.length; i++) {
|
||||||
|
value += '\\u' + this.left_zero_4(parseInt(str.charCodeAt(i)).toString(16));
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
},
|
||||||
|
left_zero_4(str) {
|
||||||
|
if (str != null && str != '' && str != 'undefined') {
|
||||||
|
if (str.length == 2) {
|
||||||
|
return '00' + str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
},
|
||||||
|
// 数据去重一下 只显示一次 减免 劵 什么的
|
||||||
|
getPromotion(item) {
|
||||||
|
if (item ? item.promotionMap : item.promotionMap) {
|
||||||
|
const fieldList = item ? item.promotionMap : item.promotionMap
|
||||||
|
let array = [];
|
||||||
|
Object.keys(fieldList).forEach((child) => {
|
||||||
|
if (!array.includes(child.split("-")[0])) {
|
||||||
|
array.push(child.split("-")[0]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 跳转到商品详情
|
||||||
|
navigateToDetailPage(item) {
|
||||||
|
uni.navigateTo({
|
||||||
|
url: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
// 跳转地址
|
||||||
|
navigateToStoreDetailPage(item) {
|
||||||
|
uni.navigateTo({
|
||||||
|
url: `/pages/product/shopPage?id=${item.storeId}`,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang='scss' scoped>
|
||||||
|
.goods-one-row{
|
||||||
|
padding-bottom: 250rpx;
|
||||||
|
}
|
||||||
|
/* 商品列表 */
|
||||||
|
.goods-list {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
margin: 10rpx 20rpx 284rpx;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
>.goods-item {
|
||||||
|
background-color: #ffffff;
|
||||||
|
display: flex;
|
||||||
|
border-radius: 16rpx;
|
||||||
|
flex-direction: column;
|
||||||
|
width: calc(50% - 30rpx);
|
||||||
|
margin-bottom: 20rpx;
|
||||||
|
padding-bottom: 20rpx;
|
||||||
|
|
||||||
|
&:nth-child(2n + 1) {
|
||||||
|
margin-right: 20rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.image-wrapper {
|
||||||
|
width: 100%;
|
||||||
|
height: 330rpx;
|
||||||
|
border-radius: 16rpx 16rpx 0 0;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.count-config,
|
||||||
|
.store-seller-name {
|
||||||
|
font-size: $font-sm;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-hidden {
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.goods-row {
|
||||||
|
background: #fff;
|
||||||
|
padding: 16rpx;
|
||||||
|
|
||||||
|
>.goods-col {
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
>.goods-img {
|
||||||
|
overflow: hidden;
|
||||||
|
flex: 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
>.goods-detail {
|
||||||
|
flex: 7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.goods-detail {
|
||||||
|
margin: 0 20rpx;
|
||||||
|
|
||||||
|
>.title {
|
||||||
|
font-size: $font-base;
|
||||||
|
color: $font-color-dark;
|
||||||
|
line-height: 1.5;
|
||||||
|
height: 86rpx;
|
||||||
|
padding: 10rpx 0 0;
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.promotion {
|
||||||
|
margin-top: 4rpx;
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
div {
|
||||||
|
span {
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: $light-color;
|
||||||
|
margin-right: 10rpx;
|
||||||
|
padding: 0 4rpx;
|
||||||
|
border-radius: 2rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.store-seller-name {
|
||||||
|
color: #666;
|
||||||
|
overflow: hidden;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
.count-config {
|
||||||
|
padding: 5rpx 0;
|
||||||
|
color: #666;
|
||||||
|
display: flex;
|
||||||
|
font-size: 24rpx;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
>.price-box {
|
||||||
|
margin-top: 10rpx;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding-right: 10rpx;
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: $font-color-light;
|
||||||
|
|
||||||
|
>.price {
|
||||||
|
font-size: 26rpx;
|
||||||
|
line-height: 1;
|
||||||
|
color: $main-color;
|
||||||
|
font-weight: bold;
|
||||||
|
|
||||||
|
::v-deep span:nth-of-type(1) {
|
||||||
|
font-size: 38rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
</style>
|
||||||
170
components/m-goods-list/promotion.vue
Normal file
170
components/m-goods-list/promotion.vue
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<div v-for="(item, index) in res" :key="index" class="goods-row" @click="navigateToDetailPage(item)">
|
||||||
|
<div class="flex goods-col">
|
||||||
|
<div class="goods-img">
|
||||||
|
<u-image width="230rpx" mode="aspectFit" border-radius='16' height="230rpx" :src="item.goodsImage || item.thumbnail">
|
||||||
|
<u-loading slot="loading"></u-loading>
|
||||||
|
</u-image>
|
||||||
|
</div>
|
||||||
|
<div class="goods-detail">
|
||||||
|
<div class="title clamp3">{{ item.goodsName }}</div>
|
||||||
|
<div class='flex flex-a-c flex-j-sb'>
|
||||||
|
<view class="price-box">
|
||||||
|
<!-- 秒杀 / 拼团 -->
|
||||||
|
<div class="price" v-if="!type && item.price!=undefined">
|
||||||
|
¥<span>{{ $options.filters.goodsFormatPrice(item.price )[0] }} </span>.{{
|
||||||
|
$options.filters.goodsFormatPrice(item.price )[1]
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
|
<!-- 砍价 -->
|
||||||
|
<div class="price" v-if="type && item.purchasePrice!=undefined">
|
||||||
|
最低:
|
||||||
|
¥<span>{{ $options.filters.goodsFormatPrice(item.purchasePrice )[0] }} </span>.{{
|
||||||
|
$options.filters.goodsFormatPrice(item.purchasePrice )[1]
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
|
<!-- 兜底策略如果金额是0 -->
|
||||||
|
<div class="price" v-if="!item.price && !type">
|
||||||
|
¥<span>0 </span>.00
|
||||||
|
</div>
|
||||||
|
</view>
|
||||||
|
<div>
|
||||||
|
<image class='buy' :src="buy"></image>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class='count-config' v-if="!type">
|
||||||
|
<span>即将恢复{{ item.originalPrice}}元</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import commonTpl from '@/components/m-goods-list/common'
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
lightColor: this.$mainColor,
|
||||||
|
buy: require('@/static/buy.png')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mixins: [commonTpl],
|
||||||
|
props: {
|
||||||
|
// 遍历的数据
|
||||||
|
res: {
|
||||||
|
type: Array,
|
||||||
|
default: () => {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
type:{
|
||||||
|
type:null,
|
||||||
|
default:""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// 跳转到商品详情
|
||||||
|
navigateToDetailPage(item) {
|
||||||
|
if(this.type == 'kanJia'){
|
||||||
|
uni.navigateTo({
|
||||||
|
url: `/pages/promotion/bargain/detail?id=${item.id}`,
|
||||||
|
});
|
||||||
|
return
|
||||||
|
}
|
||||||
|
uni.navigateTo({
|
||||||
|
url: `/pages/product/goods?id=${item.skuId}&goodsId=${item.goodsId}`,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang='scss' scoped>
|
||||||
|
.buy {
|
||||||
|
width: 152rpx;
|
||||||
|
height: 108rpx;
|
||||||
|
}
|
||||||
|
.flex-j-sb {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.goods-row {
|
||||||
|
background: #fff;
|
||||||
|
padding: 16rpx;
|
||||||
|
>.goods-col {
|
||||||
|
display: flex;
|
||||||
|
>.goods-img {
|
||||||
|
overflow: hidden;
|
||||||
|
flex: 4;
|
||||||
|
}
|
||||||
|
>.goods-detail {
|
||||||
|
flex: 7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.goods-detail {
|
||||||
|
margin: 0 20rpx;
|
||||||
|
>.title {
|
||||||
|
font-size: $font-base;
|
||||||
|
color: $font-color-dark;
|
||||||
|
line-height: 1.5;
|
||||||
|
height: 86rpx;
|
||||||
|
padding: 10rpx 0 0;
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.promotion {
|
||||||
|
margin-top: 4rpx;
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
div {
|
||||||
|
span {
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: $light-color;
|
||||||
|
margin-right: 10rpx;
|
||||||
|
padding: 0 4rpx;
|
||||||
|
border-radius: 2rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.count-config {
|
||||||
|
padding: 5rpx 0;
|
||||||
|
color: #666;
|
||||||
|
display: flex;
|
||||||
|
font-size: 24rpx;
|
||||||
|
letter-spacing:2rpx;
|
||||||
|
padding-left: 10rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-box {
|
||||||
|
margin-top: 10rpx;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding-right: 10rpx;
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: $font-color-light;
|
||||||
|
|
||||||
|
>.price {
|
||||||
|
font-size: 26rpx;
|
||||||
|
line-height: 1;
|
||||||
|
color: $main-color;
|
||||||
|
font-weight: bold;
|
||||||
|
|
||||||
|
::v-deep span:nth-of-type(1) {
|
||||||
|
font-size: 48rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -1,27 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<div class="goods-recommend">{{title ? `--${title}-- `:''}}</div>
|
<div class="goods-recommend">{{title ? `--${title}-- `:''}}</div>
|
||||||
<div class="goods-list">
|
<goodsTemplate :res='goodsList' />
|
||||||
<div @click="handleClick(item)" class="goods-item" v-for="(item, item_index) in goodsList" :key="item_index">
|
|
||||||
<div class="goods-img">
|
|
||||||
<u-image :src="item.content.thumbnail" mode="aspectFill" height="350rpx" width="100%">
|
|
||||||
<u-loading slot="loading"></u-loading>
|
|
||||||
</u-image>
|
|
||||||
</div>
|
|
||||||
<div class="goods-desc">
|
|
||||||
<div class="goods-title">
|
|
||||||
{{ item.content.goodsName }}
|
|
||||||
</div>
|
|
||||||
<div class="goods-bottom">
|
|
||||||
<div class="goods-price">¥{{ item.content.price | unitPrice }}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import goodsTemplate from '@/components/m-goods-list/list'
|
||||||
import { getGoodsList } from "@/api/goods.js";
|
import { getGoodsList } from "@/api/goods.js";
|
||||||
export default {
|
export default {
|
||||||
data() {
|
data() {
|
||||||
@@ -50,6 +34,7 @@ export default {
|
|||||||
default: "",
|
default: "",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
components:{goodsTemplate},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.initGoods();
|
this.initGoods();
|
||||||
},
|
},
|
||||||
@@ -74,11 +59,11 @@ export default {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
let goodsList = await getGoodsList(submit);
|
let goodsList = await getGoodsList(submit);
|
||||||
this.goodsList.push(...goodsList.data.result.content);
|
this.goodsList.push(...goodsList.data.result.records);
|
||||||
},
|
},
|
||||||
handleClick(item) {
|
handleClick(item) {
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
url: `/pages/product/goods?id=${item.content.id}&goodsId=${item.content.goodsId}`,
|
url: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
225
components/m-placard/index.vue
Normal file
225
components/m-placard/index.vue
Normal file
@@ -0,0 +1,225 @@
|
|||||||
|
<template>
|
||||||
|
<div class="index">
|
||||||
|
<view v-model="show" class="slot-content">
|
||||||
|
<image @click="downLoad()" class="img" :src="imgUrl" />
|
||||||
|
<div class="canvas-hide">
|
||||||
|
<!-- #ifdef MP-WEIXIN -->
|
||||||
|
<canvas id="canvas" type="2d" style="width: 560px; height: 800px" />
|
||||||
|
<!-- #endif -->
|
||||||
|
<!-- #ifndef MP-WEIXIN -->
|
||||||
|
<canvas canvas-id="canvas" id="canvas" style="width: 560px; height: 800px" />
|
||||||
|
<!-- #endif -->
|
||||||
|
</div>
|
||||||
|
</view>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
// 引入绘制插件
|
||||||
|
import DrawPoster from "@/js_sdk/u-draw-poster";
|
||||||
|
// 生成二维码
|
||||||
|
import uQRCode from '@/components/Sansnn-uQRCode/uqrcode.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
data: () => ({
|
||||||
|
imgUrl: "", //绘制出来的图片路径
|
||||||
|
show: false, //是否展示模态框
|
||||||
|
dp: {}, //绘制的dp对象,用于存储绘制等一些方法。
|
||||||
|
logo: require("@/pages/passport/static/logo-title.png"), // 本地logo地址
|
||||||
|
myFace: require("@/pages/passport/static/missing-face.png"), // 本地默认头像
|
||||||
|
sharingLink: '', // 二维码链接
|
||||||
|
}),
|
||||||
|
props: {
|
||||||
|
/**
|
||||||
|
* 父级传参的数据
|
||||||
|
*/
|
||||||
|
res: {
|
||||||
|
type: null,
|
||||||
|
default: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
onUnload() {},
|
||||||
|
onReady() {},
|
||||||
|
methods: {
|
||||||
|
/** 解决微信小程序中图片模糊问题 */
|
||||||
|
// #ifdef MP-WEIXIN
|
||||||
|
st2: (size) => size * 2,
|
||||||
|
// #endif
|
||||||
|
|
||||||
|
// #ifndef MP-WEIXIN
|
||||||
|
st2: (size) => size,
|
||||||
|
// #endif
|
||||||
|
|
||||||
|
/** 保存图片 */
|
||||||
|
downLoad() {
|
||||||
|
uni.saveImageToPhotosAlbum({
|
||||||
|
filePath: this.imgUrl,
|
||||||
|
success: function () {
|
||||||
|
uni.showToast({title: "保存成功!",icon: "none",});
|
||||||
|
},
|
||||||
|
fail: function () {
|
||||||
|
uni.showToast({title: "保存失败,请稍后重试!",icon: "none",});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/** 创建canvas */
|
||||||
|
async init() {
|
||||||
|
this.show = true;
|
||||||
|
this.dp = await DrawPoster.build({
|
||||||
|
selector: "canvas",
|
||||||
|
componentThis: this,
|
||||||
|
loading: true,
|
||||||
|
debugging: true,
|
||||||
|
});
|
||||||
|
let dp = this.dp;
|
||||||
|
// #ifdef MP-WEIXIN
|
||||||
|
// 用于微信小程序中画布错乱问题
|
||||||
|
dp.canvas.width = this.st2(560);
|
||||||
|
dp.canvas.height = this.st2(800);
|
||||||
|
// #endif
|
||||||
|
this.showQRCode(dp);
|
||||||
|
},
|
||||||
|
/** 生成二维码 */
|
||||||
|
async showQRCode(dp){
|
||||||
|
await uQRCode.make({
|
||||||
|
canvasId: 'canvas', // canvas画布
|
||||||
|
componentInstance: this,
|
||||||
|
text: this.res.bottom.code, // 二维码内容
|
||||||
|
size: 130, // 二维码大小
|
||||||
|
margin: 5, // 二维码内边距
|
||||||
|
backgroundColor: '#ffffff', // ! 二维码背景颜色
|
||||||
|
foregroundColor: '#000000', // !二维码色块颜色
|
||||||
|
fileType: 'jpg',
|
||||||
|
errorCorrectLevel: 0, // <== 关键 容错率,M:0,L:1,H:2,Q:3,
|
||||||
|
// errorCorrectLevel: uQRCode.errorCorrectLevel.M, // <== 关键 容错率,M:0,L:1,H:2,Q:3,
|
||||||
|
success: res => {
|
||||||
|
this.sharingLink = res; // res => 图片路径
|
||||||
|
// 对画布进行绘制
|
||||||
|
this.draw(dp);
|
||||||
|
},
|
||||||
|
fail: res => {
|
||||||
|
// console.log('失败',res)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
async draw(dp) {
|
||||||
|
const { face, nickName, desc } = this.res.memberInfo;
|
||||||
|
const { width, height, background, title } = this.res.container;
|
||||||
|
const { code, img, price } = this.res.bottom;
|
||||||
|
|
||||||
|
/** 绘制背景 */
|
||||||
|
await dp.draw((ctx) => {
|
||||||
|
ctx.fillStyle = background;
|
||||||
|
ctx.fillRoundRect( this.st2(0), this.st2(0), this.st2(width), this.st2(height), this.st2(12));
|
||||||
|
ctx.clip();
|
||||||
|
});
|
||||||
|
/** 绘制圆角矩形 */
|
||||||
|
await dp.draw(async (ctx)=>{
|
||||||
|
// 设置矩形色彩
|
||||||
|
ctx.fillStyle = "#ffffff";
|
||||||
|
// 设置图形轮廓的颜色。默认情况下,线条和填充颜色都是黑色(CSS 颜色值 #000000)
|
||||||
|
ctx.strokeStyle = "#ffffff";
|
||||||
|
// 这个属性设置当前绘线的粗细。属性值必须为正数。描述线段宽度的数字。 0、 负数、 Infinity 和 NaN 会被忽略。默认值是1.0。
|
||||||
|
ctx.lineWidth = this.st2(1);
|
||||||
|
// 进行绘制
|
||||||
|
ctx.fillRoundRect(30, 150, 500, 620, 0);
|
||||||
|
// ctx.strokeRoundRect(30, 150, 500, 620, 0);
|
||||||
|
// ctx.strokeRect(30, 150, 500, 620, 0);
|
||||||
|
})
|
||||||
|
/** 绘制图片 */
|
||||||
|
dp.draw(async (ctx) => {
|
||||||
|
await Promise.all([
|
||||||
|
// 绘制头像face
|
||||||
|
ctx.drawImage(face?face:this.myFace, this.st2(30), this.st2(30), this.st2(90), this.st2(90)),
|
||||||
|
// 绘制Logo
|
||||||
|
// ctx.drawImage( this.logo, this.st2(175), this.st2(0), this.st2(256), this.st2(144)),
|
||||||
|
// 中间图片
|
||||||
|
ctx.drawImage(img, this.st2(60), this.st2(170), this.st2(440), this.st2(440)),
|
||||||
|
// 二维码
|
||||||
|
ctx.drawImage(this.sharingLink, this.st2(375), this.st2(625), this.st2(130), this.st2(130))
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
/** 绘制顶部文字(昵称 简述) */
|
||||||
|
await dp.draw((ctx) => {
|
||||||
|
ctx.fillStyle = "#666";
|
||||||
|
ctx.font = `${this.st2(24)}px PingFang SC`;
|
||||||
|
ctx.fillText(nickName, this.st2(150), this.st2(65));
|
||||||
|
ctx.fillStyle = "#666";
|
||||||
|
ctx.font = `${this.st2(24)}px PingFang SC`;
|
||||||
|
ctx.fillText(desc, this.st2(150), this.st2(105));
|
||||||
|
});
|
||||||
|
/** 绘制中间文字(商品名称 价格) */
|
||||||
|
await dp.draw((ctx) => {
|
||||||
|
ctx.fillStyle = "#333";
|
||||||
|
ctx.font = `bold ${this.st2(24)}px PingFang SC`;
|
||||||
|
ctx.textAlign = "left";
|
||||||
|
ctx.fillWarpText({
|
||||||
|
text: title,
|
||||||
|
lineHeight: this.st2(32),
|
||||||
|
maxWidth: this.st2(280),
|
||||||
|
x: this.st2(60),
|
||||||
|
y: this.st2(710),
|
||||||
|
layer: 2,
|
||||||
|
});
|
||||||
|
ctx.fillStyle = "#ff3c2a";
|
||||||
|
ctx.font = `${this.st2(38)}px PingFang SC`;
|
||||||
|
ctx.textAlign = "left";
|
||||||
|
ctx.fillText(price, this.st2(60), this.st2(665));
|
||||||
|
});
|
||||||
|
/** 绘制底部文字 */
|
||||||
|
// await dp.draw((ctx) => {
|
||||||
|
// ctx.fillStyle = "#666";
|
||||||
|
// ctx.font = `${this.st2(24)}px PingFang SC`;
|
||||||
|
// ctx.fillText("长按图片,识别二维码", this.st2(200), this.st2(866));
|
||||||
|
// ctx.fillStyle = "#666";
|
||||||
|
// ctx.font = `${this.st2(24)}px PingFang SC`;
|
||||||
|
// ctx.fillText("查看商品详情", this.st2(200), this.st2(900));
|
||||||
|
// });
|
||||||
|
|
||||||
|
// 绘制生成本地地址
|
||||||
|
this.imgUrl = await dp.createImagePath();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
async mounted() {
|
||||||
|
this.init();
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
page,
|
||||||
|
.index {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
.canvas-hide {
|
||||||
|
/* 1 */
|
||||||
|
position: fixed;
|
||||||
|
right: 100vw;
|
||||||
|
bottom: 100vh;
|
||||||
|
/* 2 */
|
||||||
|
z-index: -9999;
|
||||||
|
/* 3 */
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
.index {
|
||||||
|
position: relative;
|
||||||
|
text-align: center;
|
||||||
|
background: rgba($color: grey, $alpha: 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
image {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.img {
|
||||||
|
width: 560rpx;
|
||||||
|
height: 800rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.qrcode-content {
|
||||||
|
width: 100rpx;
|
||||||
|
height: 100rpx;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -1,20 +1,21 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="serach">
|
<view class="serach">
|
||||||
<view class="left-box" @tap="onClickLeft">
|
<view class="left-box" @tap="onClickLeft">
|
||||||
<uni-icons style="line-height:70rpx" type="back" size="24" />
|
<u-icon name="arrow-left" size="40" color="#666"></u-icon>
|
||||||
</view>
|
</view>
|
||||||
<view class="content" :style="{ 'border-radius': radius + 'px' }">
|
<view class="content" :style="{ 'border-radius': radius + 'px' }">
|
||||||
<!-- HM修改 增加进入输入状态的点击范围 -->
|
<!-- HM修改 增加进入输入状态的点击范围 -->
|
||||||
<view class="content-box" :class="{ center: mode === 2 }">
|
<view class="content-box" :class="{ center: mode === 2 }">
|
||||||
<u-icon name="search" size="32" style="padding:0 15rpx;"></u-icon>
|
<u-icon name="search" size="32" style="padding:0 15rpx;"></u-icon>
|
||||||
<!-- HM修改 增加placeholder input confirm-type confirm-->
|
<!-- HM修改 增加placeholder input confirm-type confirm-->
|
||||||
<input style="width:100%; " :placeholder="placeholder" placeholder-class="placeholder-color" @input="inputChange" confirm-type="search" @confirm="triggerConfirm" class="input"
|
<input style="width:100%; " :placeholder="placeholder" placeholder-class="placeholder-color"
|
||||||
|
@input="inputChange" confirm-type="search" @confirm="triggerConfirm" class="input"
|
||||||
:class="{ center: !active && mode === 2 }" :focus="isFocus" v-model="inputVal" @focus="focus" @blur="blur" />
|
:class="{ center: !active && mode === 2 }" :focus="isFocus" v-model="inputVal" @focus="focus" @blur="blur" />
|
||||||
<u-icon name="close" v-if="isDelShow" style="padding:0 30rpx;" @click="clear"></u-icon>
|
<u-icon name="close" v-if="isDelShow" style="padding:0 30rpx;" @click="clear"></u-icon>
|
||||||
</view>
|
</view>
|
||||||
<view v-show="(active && show && button === 'inside') || (isDelShow && button === 'inside')" class="serachBtn" @click="search">搜索</view>
|
|
||||||
</view>
|
</view>
|
||||||
<view v-if="button === 'outside'" class="button" :class="{ active: show || active }">
|
<view class="button active" >
|
||||||
<view v-if="isShowSeachGoods !=true" class="button-item">
|
<view v-if="isShowSeachGoods !=true" class="button-item">
|
||||||
<div @click="out()">取消</div>
|
<div @click="out()">取消</div>
|
||||||
</view>
|
</view>
|
||||||
@@ -28,14 +29,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import uniStatusBar from "../uni-status-bar/uni-status-bar.vue";
|
|
||||||
import uniIcons from "../uni-icons/uni-icons.vue";
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
|
||||||
uniStatusBar,
|
|
||||||
uniIcons,
|
|
||||||
},
|
|
||||||
props: {
|
props: {
|
||||||
mode: {
|
mode: {
|
||||||
value: Number,
|
value: Number,
|
||||||
@@ -50,15 +44,6 @@ export default {
|
|||||||
type: String,
|
type: String,
|
||||||
default: "",
|
default: "",
|
||||||
},
|
},
|
||||||
button: {
|
|
||||||
value: String,
|
|
||||||
default: "outside",
|
|
||||||
},
|
|
||||||
//
|
|
||||||
show: {
|
|
||||||
value: Boolean,
|
|
||||||
default: true,
|
|
||||||
},
|
|
||||||
// 默认半径为60
|
// 默认半径为60
|
||||||
radius: {
|
radius: {
|
||||||
value: String,
|
value: String,
|
||||||
@@ -132,12 +117,19 @@ export default {
|
|||||||
//this.$emit('search', '');//HM修改 清空内容时候不进行搜索
|
//this.$emit('search', '');//HM修改 清空内容时候不进行搜索
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 回退到上一级
|
* 回退到上一级
|
||||||
*/
|
*/
|
||||||
onClickLeft() {
|
onClickLeft() {
|
||||||
|
const paths = getCurrentPages();
|
||||||
|
console.log(paths)
|
||||||
|
if(paths.length > 1){
|
||||||
uni.navigateBack();
|
uni.navigateBack();
|
||||||
|
}else{
|
||||||
|
uni.switchTab({
|
||||||
|
url:"/pages/tabbar/home/index"
|
||||||
|
})
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -145,7 +137,7 @@ export default {
|
|||||||
*/
|
*/
|
||||||
search() {
|
search() {
|
||||||
if (!this.inputVal) {
|
if (!this.inputVal) {
|
||||||
if (!this.show && this.searchName == "取消") {
|
if (this.searchName == "取消") {
|
||||||
uni.hideKeyboard();
|
uni.hideKeyboard();
|
||||||
this.isFocus = false;
|
this.isFocus = false;
|
||||||
this.active = false;
|
this.active = false;
|
||||||
@@ -172,9 +164,12 @@ export default {
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
//border-bottom: 1px #f5f5f5 solid; //HM修改 去掉边框
|
//border-bottom: 1px #f5f5f5 solid; //HM修改 去掉边框
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
font-size: $uni-font-size-base;
|
font-size: 24rpx;
|
||||||
|
|
||||||
.left-box {
|
.left-box {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
width: 15%;
|
width: 15%;
|
||||||
/* #ifndef APP-NVUE */
|
/* #ifndef APP-NVUE */
|
||||||
text-align: center;
|
text-align: center;
|
||||||
@@ -225,19 +220,6 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.serachBtn {
|
|
||||||
height: 100%;
|
|
||||||
flex-shrink: 0;
|
|
||||||
padding: 0 30rpx;
|
|
||||||
//HM修改 按钮背景色
|
|
||||||
background: linear-gradient(to right, grey, grey);
|
|
||||||
//background: $uni-color-success;
|
|
||||||
line-height: 60rpx;
|
|
||||||
color: #eee;
|
|
||||||
//border-left: 1px #ccc solid; //HM修改 去掉边框
|
|
||||||
transition: all 0.3s;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.button {
|
.button {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<view class="share-list">
|
<view class="share-list">
|
||||||
<!-- #ifdef MP-WEIXIN -->
|
<!-- #ifdef MP-WEIXIN -->
|
||||||
<view class="share-item">
|
<view class="share-item">
|
||||||
<button class="share-btn" open-type="share">
|
<button class="share-btn" @click="weChatShare" open-type="share">
|
||||||
<u-icon color="#04BE02" size="80" name="weixin-fill"></u-icon>微信好友
|
<u-icon color="#04BE02" size="80" name="weixin-fill"></u-icon>微信好友
|
||||||
</button>
|
</button>
|
||||||
</view>
|
</view>
|
||||||
@@ -62,6 +62,16 @@ export default {
|
|||||||
close() {
|
close() {
|
||||||
this.$emit("close");
|
this.$emit("close");
|
||||||
},
|
},
|
||||||
|
weChatShare(){
|
||||||
|
this.$u.mpShare = {
|
||||||
|
title: this.shareTitle(), // 默认为小程序名称,可自定义
|
||||||
|
path: '', // 默认为当前页面路径,一般无需修改,QQ小程序不支持
|
||||||
|
// 分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径。
|
||||||
|
// 支持PNG及JPG,默认为当前页面的截图
|
||||||
|
imageUrl: this.thumbnail ||''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
// h5复制链接
|
// h5复制链接
|
||||||
// #ifdef H5
|
// #ifdef H5
|
||||||
copyLink() {
|
copyLink() {
|
||||||
@@ -73,33 +83,20 @@ export default {
|
|||||||
this.configs.shareLink +
|
this.configs.shareLink +
|
||||||
getCurrentPages()[getCurrentPages().length - 1].__page__.fullPath;
|
getCurrentPages()[getCurrentPages().length - 1].__page__.fullPath;
|
||||||
}
|
}
|
||||||
if (content === null || content === undefined) {
|
this.$options.filters.setClipboard(content)
|
||||||
content = "";
|
|
||||||
} else content = content + "";
|
|
||||||
const result = h5Copy(content);
|
|
||||||
if (result === false) {
|
|
||||||
uni.showToast({
|
|
||||||
title: "不支持",
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
uni.showToast({
|
|
||||||
title: "复制成功",
|
|
||||||
icon: "none",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
// #endif
|
// #endif
|
||||||
|
|
||||||
shareTitle() {
|
shareTitle() {
|
||||||
let shareTitle;
|
let shareTitle;
|
||||||
if (this.type == "goods") {
|
if (this.type == "goods") {
|
||||||
shareTitle = `我发现了一个${this.goodsName}商品快来跟我一起看看吧`;
|
shareTitle = `[好友推荐]${this.goodsName}快来跟我一起看看吧`;
|
||||||
} else if (this.type == "shops") {
|
} else if (this.type == "shops") {
|
||||||
shareTitle = `我发现了一个${this.goodsName}店铺快来跟我一起看看吧`;
|
shareTitle = `[好友发现]${this.goodsName}快来跟我一起看看吧`;
|
||||||
} else if (this.type == "pintuan") {
|
} else if (this.type == "pintuan") {
|
||||||
shareTitle = `我拼了一个${this.goodsName}快来跟我一起抢购吧!`;
|
shareTitle = `[好友邀请]${this.goodsName}快来跟我一起抢购吧!`;
|
||||||
} else if (this.type == "kanjia") {
|
} else if (this.type == "kanjia") {
|
||||||
shareTitle = `请快来帮我砍一刀${this.goodsName}`;
|
shareTitle = `[好友邀请]请快来帮我砍一刀${this.goodsName}`;
|
||||||
}
|
}
|
||||||
return shareTitle;
|
return shareTitle;
|
||||||
},
|
},
|
||||||
|
|||||||
34
components/m-take-down-sale-goods/index.vue
Normal file
34
components/m-take-down-sale-goods/index.vue
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<u-popup v-model="show" mode="bottom" height="800rpx" border-radius="14">
|
||||||
|
<div class="wrapper">
|
||||||
|
<view class="down-goods-tips">该商品已下架</view>
|
||||||
|
<scroll-view scroll-y="true" style="height: 670rpx">
|
||||||
|
<goodsRecommend title="其他商品" />
|
||||||
|
</scroll-view>
|
||||||
|
</div>
|
||||||
|
</u-popup>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import goodsRecommend from "@/components/m-goods-recommend/index.vue";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
show: true, // 是否显示
|
||||||
|
};
|
||||||
|
},
|
||||||
|
components: { goodsRecommend },
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.down-goods-tips {
|
||||||
|
font-size: 36rpx;
|
||||||
|
text-align: center;
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 40rpx 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -1,241 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="dropdown-item">
|
|
||||||
<!-- selected -->
|
|
||||||
<view class="dropdown-item__selected" @click="changePopup">
|
|
||||||
<slot name="title" v-if="$slots.title"></slot>
|
|
||||||
<block v-else>
|
|
||||||
<view class="selected__name">
|
|
||||||
{{title ? title : selectItem.text}}
|
|
||||||
</view>
|
|
||||||
<!-- <view class="selected__icon"
|
|
||||||
:class="showClass === 'show'? 'up' : 'down'"
|
|
||||||
>
|
|
||||||
<span class="iconfont"></span>
|
|
||||||
</view> -->
|
|
||||||
</block>
|
|
||||||
</view>
|
|
||||||
<view class="dropdown-item__content" :style="{top: contentTop + 'px'}" v-if="showList">
|
|
||||||
<!-- dropdown -->
|
|
||||||
<view :class="['list', showClass]">
|
|
||||||
<slot v-if="$slots.default"></slot>
|
|
||||||
<block v-else>
|
|
||||||
<view class="list__option" v-for="(item, index) in list" :key="index" @click="choose(item)">
|
|
||||||
<view>{{item.text}}</view>
|
|
||||||
<icon v-if="item.value === value" type="success_no_circle" size="26" />
|
|
||||||
</view>
|
|
||||||
</block>
|
|
||||||
</view>
|
|
||||||
<!-- dropdown-mask -->
|
|
||||||
|
|
||||||
<!-- @touchmove 禁止滑动 -->
|
|
||||||
<view @touchmove.stop.prevent="moveHandle" :class="['dropdown-mask', showClass]" v-if="showList" @click="closePopup"></view>
|
|
||||||
</view>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
components: {},
|
|
||||||
props: {
|
|
||||||
value: [Number, String, Object],
|
|
||||||
list: {
|
|
||||||
type: Array,
|
|
||||||
default: () => {
|
|
||||||
return []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
title: [Number, String],
|
|
||||||
contentTopReduse: {
|
|
||||||
type: Number,
|
|
||||||
default: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
showList: "",
|
|
||||||
showClass: '',
|
|
||||||
selectItem: {},
|
|
||||||
contentTop: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch: {},
|
|
||||||
mounted() {
|
|
||||||
this.showList = this.active;
|
|
||||||
this.selectItem = this.list[this.value];
|
|
||||||
// document.addEventListener('click', e => {
|
|
||||||
// //this.$el 可以获取当前组件的容器节点
|
|
||||||
// if (!this.$el.contains(e.target)) {
|
|
||||||
// console.log('change');
|
|
||||||
// this.close()
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
// 禁止滑动
|
|
||||||
moveHandle() {},
|
|
||||||
choose(item) {
|
|
||||||
this.selectItem = item
|
|
||||||
this.$emit('input', item.value)
|
|
||||||
this.closePopup()
|
|
||||||
},
|
|
||||||
changePopup() {
|
|
||||||
if (this.showList) {
|
|
||||||
this.closePopup()
|
|
||||||
} else {
|
|
||||||
this.openPopup()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
openPopup() {
|
|
||||||
// this.$parent -> dropdown-menu
|
|
||||||
this.$parent.$emit('close')
|
|
||||||
this.showList = true
|
|
||||||
this.$nextTick(() => {
|
|
||||||
this.getElementData('.dropdown-item__selected', (data) => {
|
|
||||||
this.contentTop = data[0].bottom - this.contentTopReduse;
|
|
||||||
this.showClass = 'show'
|
|
||||||
})
|
|
||||||
})
|
|
||||||
},
|
|
||||||
closePopup() {
|
|
||||||
this.showClass = ''
|
|
||||||
setTimeout(() => {
|
|
||||||
this.showList = false
|
|
||||||
}, 300)
|
|
||||||
},
|
|
||||||
close() {
|
|
||||||
this.showClass = ''
|
|
||||||
this.showList = false
|
|
||||||
},
|
|
||||||
getElementData(el, callback) {
|
|
||||||
uni.createSelectorQuery().in(this).selectAll(el).boundingClientRect().exec((data) => {
|
|
||||||
callback(data[0]);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
@font-face {
|
|
||||||
font-family: 'iconfont';
|
|
||||||
/* project id 1564327 */
|
|
||||||
src: url('https://at.alicdn.com/t/font_1564327_fcszez4n5i.eot');
|
|
||||||
src: url('https://at.alicdn.com/t/font_1564327_fcszez4n5i.eot?#iefix') format('embedded-opentype'),
|
|
||||||
url('https://at.alicdn.com/t/font_1564327_fcszez4n5i.woff2') format('woff2'),
|
|
||||||
url('https://at.alicdn.com/t/font_1564327_fcszez4n5i.woff') format('woff'),
|
|
||||||
url('https://at.alicdn.com/t/font_1564327_fcszez4n5i.ttf') format('truetype'),
|
|
||||||
url('https://at.alicdn.com/t/font_1564327_fcszez4n5i.svg#iconfont') format('svg');
|
|
||||||
}
|
|
||||||
|
|
||||||
.iconfont {
|
|
||||||
font-family: "iconfont" !important;
|
|
||||||
font-size: 28rpx;
|
|
||||||
font-style: normal;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-webkit-text-stroke-width: 0.2px;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
}
|
|
||||||
|
|
||||||
.line {
|
|
||||||
position: absolute;
|
|
||||||
height: 3px;
|
|
||||||
width: 100px;
|
|
||||||
background: #1abc9c;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dropdown-item {
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
&__selected {
|
|
||||||
position: relative;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
background: transparent;
|
|
||||||
// padding: 10rpx;
|
|
||||||
box-sizing: border-box;
|
|
||||||
justify-content: center;
|
|
||||||
|
|
||||||
.selected__name {
|
|
||||||
font-size: 32rpx;
|
|
||||||
white-space: nowrap;
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.selected__icon {
|
|
||||||
margin-left: 8rpx;
|
|
||||||
|
|
||||||
&.down {
|
|
||||||
transition: transform .3s;
|
|
||||||
transform: rotateZ(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
&.up {
|
|
||||||
transition: transform .3s;
|
|
||||||
transform: rotateZ(-180deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&__content {
|
|
||||||
position: fixed;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
overflow: hidden;
|
|
||||||
top: 0;
|
|
||||||
bottom: 0;
|
|
||||||
z-index: 10;
|
|
||||||
|
|
||||||
.list {
|
|
||||||
max-height: 400px;
|
|
||||||
overflow-y: auto;
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
z-index: 3;
|
|
||||||
background: #fff;
|
|
||||||
transform: translateY(-100%);
|
|
||||||
transition: all .3s;
|
|
||||||
|
|
||||||
&.show {
|
|
||||||
transform: translateY(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
&__option {
|
|
||||||
font-size: 32rpx;
|
|
||||||
padding: 26rpx 28rpx;
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
|
|
||||||
&:not(:last-child) {
|
|
||||||
border-bottom: 1rpx solid #DDDDDD;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.dropdown-mask {
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
top: 0;
|
|
||||||
bottom: 0;
|
|
||||||
transition: all .3s;
|
|
||||||
z-index: 2;
|
|
||||||
|
|
||||||
&.show {
|
|
||||||
background: rgba(0, 0, 0, 0.5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&:not(:last-child):after {
|
|
||||||
content: ' ';
|
|
||||||
position: absolute;
|
|
||||||
width: 2rpx;
|
|
||||||
top: 36rpx;
|
|
||||||
bottom: 36rpx;
|
|
||||||
right: 0;
|
|
||||||
background: $uni-border-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="dropdown-menu">
|
|
||||||
<slot></slot>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.$on('close', this.closeDropdown)
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
closeDropdown() {
|
|
||||||
this.$children.forEach(item =>{
|
|
||||||
item.close();
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
.dropdown-menu {
|
|
||||||
display: flex;
|
|
||||||
overflow: auto;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
dropdown-item {
|
|
||||||
flex: 1;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,132 +0,0 @@
|
|||||||
export default {
|
|
||||||
"pulldown": "\ue588",
|
|
||||||
"refreshempty": "\ue461",
|
|
||||||
"back": "\ue471",
|
|
||||||
"forward": "\ue470",
|
|
||||||
"more": "\ue507",
|
|
||||||
"more-filled": "\ue537",
|
|
||||||
"scan": "\ue612",
|
|
||||||
"qq": "\ue264",
|
|
||||||
"weibo": "\ue260",
|
|
||||||
"weixin": "\ue261",
|
|
||||||
"pengyouquan": "\ue262",
|
|
||||||
"loop": "\ue565",
|
|
||||||
"refresh": "\ue407",
|
|
||||||
"refresh-filled": "\ue437",
|
|
||||||
"arrowthindown": "\ue585",
|
|
||||||
"arrowthinleft": "\ue586",
|
|
||||||
"arrowthinright": "\ue587",
|
|
||||||
"arrowthinup": "\ue584",
|
|
||||||
"undo-filled": "\ue7d6",
|
|
||||||
"undo": "\ue406",
|
|
||||||
"redo": "\ue405",
|
|
||||||
"redo-filled": "\ue7d9",
|
|
||||||
"bars": "\ue563",
|
|
||||||
"chatboxes": "\ue203",
|
|
||||||
"camera": "\ue301",
|
|
||||||
"chatboxes-filled": "\ue233",
|
|
||||||
"camera-filled": "\ue7ef",
|
|
||||||
"cart-filled": "\ue7f4",
|
|
||||||
"cart": "\ue7f5",
|
|
||||||
"checkbox-filled": "\ue442",
|
|
||||||
"checkbox": "\ue7fa",
|
|
||||||
"arrowleft": "\ue582",
|
|
||||||
"arrowdown": "\ue581",
|
|
||||||
"arrowright": "\ue583",
|
|
||||||
"smallcircle-filled": "\ue801",
|
|
||||||
"arrowup": "\ue580",
|
|
||||||
"circle": "\ue411",
|
|
||||||
"eye-filled": "\ue568",
|
|
||||||
"eye-slash-filled": "\ue822",
|
|
||||||
"eye-slash": "\ue823",
|
|
||||||
"eye": "\ue824",
|
|
||||||
"flag-filled": "\ue825",
|
|
||||||
"flag": "\ue508",
|
|
||||||
"gear-filled": "\ue532",
|
|
||||||
"reload": "\ue462",
|
|
||||||
"gear": "\ue502",
|
|
||||||
"hand-thumbsdown-filled": "\ue83b",
|
|
||||||
"hand-thumbsdown": "\ue83c",
|
|
||||||
"hand-thumbsup-filled": "\ue83d",
|
|
||||||
"heart-filled": "\ue83e",
|
|
||||||
"hand-thumbsup": "\ue83f",
|
|
||||||
"heart": "\ue840",
|
|
||||||
"home": "\ue500",
|
|
||||||
"info": "\ue504",
|
|
||||||
"home-filled": "\ue530",
|
|
||||||
"info-filled": "\ue534",
|
|
||||||
"circle-filled": "\ue441",
|
|
||||||
"chat-filled": "\ue847",
|
|
||||||
"chat": "\ue263",
|
|
||||||
"mail-open-filled": "\ue84d",
|
|
||||||
"email-filled": "\ue231",
|
|
||||||
"mail-open": "\ue84e",
|
|
||||||
"email": "\ue201",
|
|
||||||
"checkmarkempty": "\ue472",
|
|
||||||
"list": "\ue562",
|
|
||||||
"locked-filled": "\ue856",
|
|
||||||
"locked": "\ue506",
|
|
||||||
"map-filled": "\ue85c",
|
|
||||||
"map-pin": "\ue85e",
|
|
||||||
"map-pin-ellipse": "\ue864",
|
|
||||||
"map": "\ue364",
|
|
||||||
"minus-filled": "\ue440",
|
|
||||||
"mic-filled": "\ue332",
|
|
||||||
"minus": "\ue410",
|
|
||||||
"micoff": "\ue360",
|
|
||||||
"mic": "\ue302",
|
|
||||||
"clear": "\ue434",
|
|
||||||
"smallcircle": "\ue868",
|
|
||||||
"close": "\ue404",
|
|
||||||
"closeempty": "\ue460",
|
|
||||||
"paperclip": "\ue567",
|
|
||||||
"paperplane": "\ue503",
|
|
||||||
"paperplane-filled": "\ue86e",
|
|
||||||
"person-filled": "\ue131",
|
|
||||||
"contact-filled": "\ue130",
|
|
||||||
"person": "\ue101",
|
|
||||||
"contact": "\ue100",
|
|
||||||
"images-filled": "\ue87a",
|
|
||||||
"phone": "\ue200",
|
|
||||||
"images": "\ue87b",
|
|
||||||
"image": "\ue363",
|
|
||||||
"image-filled": "\ue877",
|
|
||||||
"location-filled": "\ue333",
|
|
||||||
"location": "\ue303",
|
|
||||||
"plus-filled": "\ue439",
|
|
||||||
"plus": "\ue409",
|
|
||||||
"plusempty": "\ue468",
|
|
||||||
"help-filled": "\ue535",
|
|
||||||
"help": "\ue505",
|
|
||||||
"navigate-filled": "\ue884",
|
|
||||||
"navigate": "\ue501",
|
|
||||||
"mic-slash-filled": "\ue892",
|
|
||||||
"search": "\ue466",
|
|
||||||
"settings": "\ue560",
|
|
||||||
"sound": "\ue590",
|
|
||||||
"sound-filled": "\ue8a1",
|
|
||||||
"spinner-cycle": "\ue465",
|
|
||||||
"download-filled": "\ue8a4",
|
|
||||||
"personadd-filled": "\ue132",
|
|
||||||
"videocam-filled": "\ue8af",
|
|
||||||
"personadd": "\ue102",
|
|
||||||
"upload": "\ue402",
|
|
||||||
"upload-filled": "\ue8b1",
|
|
||||||
"starhalf": "\ue463",
|
|
||||||
"star-filled": "\ue438",
|
|
||||||
"star": "\ue408",
|
|
||||||
"trash": "\ue401",
|
|
||||||
"phone-filled": "\ue230",
|
|
||||||
"compose": "\ue400",
|
|
||||||
"videocam": "\ue300",
|
|
||||||
"trash-filled": "\ue8dc",
|
|
||||||
"download": "\ue403",
|
|
||||||
"chatbubble-filled": "\ue232",
|
|
||||||
"chatbubble": "\ue202",
|
|
||||||
"cloud-download": "\ue8e4",
|
|
||||||
"cloud-upload-filled": "\ue8e5",
|
|
||||||
"cloud-upload": "\ue8e6",
|
|
||||||
"cloud-download-filled": "\ue8e9",
|
|
||||||
"headphones":"\ue8bf",
|
|
||||||
"store":"\ue609"
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
220
components/uni-number-box.vue
Normal file
220
components/uni-number-box.vue
Normal file
@@ -0,0 +1,220 @@
|
|||||||
|
<template>
|
||||||
|
<view class="uni-numbox">
|
||||||
|
<view @click="_calcValue('minus')" class="uni-numbox__minus uni-numbox-btns" :style="{background}">
|
||||||
|
<text class="uni-numbox--text" :class="{ 'uni-numbox--disabled': inputValue <= min || disabled }" :style="{color}">-</text>
|
||||||
|
</view>
|
||||||
|
<input :disabled="disabled" @focus="_onFocus" @blur="_onBlur" class="uni-numbox__value" type="number"
|
||||||
|
v-model="inputValue" :style="{background, color}" />
|
||||||
|
<view @click="_calcValue('plus')" class="uni-numbox__plus uni-numbox-btns" :style="{background}">
|
||||||
|
<text class="uni-numbox--text" :class="{ 'uni-numbox--disabled': inputValue >= max || disabled }" :style="{color}">+</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
/**
|
||||||
|
* NumberBox 数字输入框
|
||||||
|
* @description 带加减按钮的数字输入框
|
||||||
|
* @tutorial https://ext.dcloud.net.cn/plugin?id=31
|
||||||
|
* @property {Number} value 输入框当前值
|
||||||
|
* @property {Number} min 最小值
|
||||||
|
* @property {Number} max 最大值
|
||||||
|
* @property {Number} step 每次点击改变的间隔大小
|
||||||
|
* @property {String} background 背景色
|
||||||
|
* @property {String} color 字体颜色(前景色)
|
||||||
|
* @property {Boolean} disabled = [true|false] 是否为禁用状态
|
||||||
|
* @event {Function} change 输入框值改变时触发的事件,参数为输入框当前的 value
|
||||||
|
* @event {Function} focus 输入框聚焦时触发的事件,参数为 event 对象
|
||||||
|
* @event {Function} blur 输入框失焦时触发的事件,参数为 event 对象
|
||||||
|
*/
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "UniNumberBox",
|
||||||
|
emits: ['change', 'input', 'update:modelValue', 'blur', 'focus'],
|
||||||
|
props: {
|
||||||
|
value: {
|
||||||
|
type: [Number, String],
|
||||||
|
default: 1
|
||||||
|
},
|
||||||
|
modelValue: {
|
||||||
|
type: [Number, String],
|
||||||
|
default: 1
|
||||||
|
},
|
||||||
|
min: {
|
||||||
|
type: Number,
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
|
max: {
|
||||||
|
type: Number,
|
||||||
|
default: 100
|
||||||
|
},
|
||||||
|
step: {
|
||||||
|
type: Number,
|
||||||
|
default: 1
|
||||||
|
},
|
||||||
|
background: {
|
||||||
|
type: String,
|
||||||
|
default: '#f5f5f5'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
type: String,
|
||||||
|
default: '#333'
|
||||||
|
},
|
||||||
|
disabled: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
inputValue: 0
|
||||||
|
};
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
value(val) {
|
||||||
|
this.inputValue = +val;
|
||||||
|
},
|
||||||
|
modelValue(val) {
|
||||||
|
this.inputValue = +val;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
if (this.value === 1) {
|
||||||
|
this.inputValue = +this.modelValue;
|
||||||
|
}
|
||||||
|
if (this.modelValue === 1) {
|
||||||
|
this.inputValue = +this.value;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
_calcValue(type) {
|
||||||
|
if (this.disabled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const scale = this._getDecimalScale();
|
||||||
|
let value = this.inputValue * scale;
|
||||||
|
let step = this.step * scale;
|
||||||
|
if (type === "minus") {
|
||||||
|
value -= step;
|
||||||
|
if (value < (this.min * scale)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (value > (this.max * scale)) {
|
||||||
|
value = this.max * scale
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type === "plus") {
|
||||||
|
value += step;
|
||||||
|
if (value > (this.max * scale)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (value < (this.min * scale)) {
|
||||||
|
value = this.min * scale
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.inputValue = (value / scale).toFixed(String(scale).length - 1);
|
||||||
|
this.$emit("change", +this.inputValue);
|
||||||
|
// TODO vue2 兼容
|
||||||
|
this.$emit("input", +this.inputValue);
|
||||||
|
// TODO vue3 兼容
|
||||||
|
this.$emit("update:modelValue", +this.inputValue);
|
||||||
|
},
|
||||||
|
_getDecimalScale() {
|
||||||
|
|
||||||
|
let scale = 1;
|
||||||
|
// 浮点型
|
||||||
|
if (~~this.step !== this.step) {
|
||||||
|
scale = Math.pow(10, String(this.step).split(".")[1].length);
|
||||||
|
}
|
||||||
|
return scale;
|
||||||
|
},
|
||||||
|
_onBlur(event) {
|
||||||
|
this.$emit('blur', event)
|
||||||
|
let value = event.detail.value;
|
||||||
|
if (!value) {
|
||||||
|
// this.inputValue = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
value = +value;
|
||||||
|
if (value > this.max) {
|
||||||
|
value = this.max;
|
||||||
|
} else if (value < this.min) {
|
||||||
|
value = this.min;
|
||||||
|
}
|
||||||
|
const scale = this._getDecimalScale();
|
||||||
|
this.inputValue = value.toFixed(String(scale).length - 1);
|
||||||
|
this.$emit("change", +this.inputValue);
|
||||||
|
this.$emit("input", +this.inputValue);
|
||||||
|
},
|
||||||
|
_onFocus(event) {
|
||||||
|
this.$emit('focus', event)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
$box-height: 48rpx;
|
||||||
|
$bg: #f5f5f5;
|
||||||
|
$br: 4rpx;
|
||||||
|
$color: #333;
|
||||||
|
|
||||||
|
.uni-numbox {
|
||||||
|
/* #ifndef APP-NVUE */
|
||||||
|
display: flex;
|
||||||
|
/* #endif */
|
||||||
|
flex-direction: row;
|
||||||
|
}
|
||||||
|
|
||||||
|
.uni-numbox-btns {
|
||||||
|
/* #ifndef APP-NVUE */
|
||||||
|
display: flex;
|
||||||
|
/* #endif */
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 0 8px;
|
||||||
|
background-color: $bg;
|
||||||
|
/* #ifdef H5 */
|
||||||
|
cursor: pointer;
|
||||||
|
/* #endif */
|
||||||
|
}
|
||||||
|
|
||||||
|
.uni-numbox__value {
|
||||||
|
margin: 0 4rpx;
|
||||||
|
background-color: $bg;
|
||||||
|
width: 70rpx;
|
||||||
|
height: $box-height;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 24rpx;
|
||||||
|
border-left-width: 0;
|
||||||
|
border-right-width: 0;
|
||||||
|
color: $color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.uni-numbox__minus {
|
||||||
|
border-top-left-radius: $br;
|
||||||
|
border-bottom-left-radius: $br;
|
||||||
|
}
|
||||||
|
|
||||||
|
.uni-numbox__plus {
|
||||||
|
border-top-right-radius: $br;
|
||||||
|
border-bottom-right-radius: $br;
|
||||||
|
}
|
||||||
|
|
||||||
|
.uni-numbox--text {
|
||||||
|
// fix nvue
|
||||||
|
line-height: 40rpx;
|
||||||
|
|
||||||
|
font-size: 40rpx;
|
||||||
|
font-weight: 300;
|
||||||
|
color: $color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.uni-numbox .uni-numbox--disabled {
|
||||||
|
color: #c0c0c0 !important;
|
||||||
|
/* #ifdef H5 */
|
||||||
|
cursor: not-allowed;
|
||||||
|
/* #endif */
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
<template>
|
|
||||||
<view :style="{ height: statusBarHeight }" class="uni-status-bar">
|
|
||||||
<slot />
|
|
||||||
</view>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
var statusBarHeight = uni.getSystemInfoSync().statusBarHeight + 'px'
|
|
||||||
export default {
|
|
||||||
name: 'UniStatusBar',
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
statusBarHeight: statusBarHeight
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.uni-status-bar {
|
|
||||||
width: 750rpx;
|
|
||||||
height: 20px;
|
|
||||||
// height: var(--status-bar-height);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -29,7 +29,8 @@ export default {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
fail() {
|
fail(e) {
|
||||||
|
console.log(e)
|
||||||
that.$emit("close");
|
that.$emit("close");
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@@ -1,39 +1,87 @@
|
|||||||
<template>
|
<template>
|
||||||
<view>
|
<view>
|
||||||
<view v-if="!hid" class="flex-row-center" :style="{ top: scHight }" style="width: 750rpx; position: fixed; z-index: 100; left: 0">
|
<view
|
||||||
<view class="flex-column-center" style="background-color: #fcfcfc; padding: 30rpx; border-radius: 10rpx">
|
v-if="!hid"
|
||||||
<movable-area class="flex" style="width: 100%" animation="false" :style="{ height: originalHeight }">
|
class="flex-row-center"
|
||||||
<movable-view scale-value="1" animation="false" damping="5000" :x="moveX" :style="{
|
:style="{ top: scHight }"
|
||||||
|
style="width: 750rpx; position: fixed; z-index: 100; left: 0"
|
||||||
|
>
|
||||||
|
<view
|
||||||
|
class="flex-column-center"
|
||||||
|
style="background-color: #fcfcfc; padding: 30rpx; border-radius: 10rpx"
|
||||||
|
>
|
||||||
|
<movable-area
|
||||||
|
class="flex"
|
||||||
|
style="width: 100%"
|
||||||
|
animation="false"
|
||||||
|
:style="{ height: originalHeight }"
|
||||||
|
>
|
||||||
|
<movable-view
|
||||||
|
scale-value="1"
|
||||||
|
animation="false"
|
||||||
|
damping="5000"
|
||||||
|
:x="moveX"
|
||||||
|
:style="{
|
||||||
height: sliderHeight,
|
height: sliderHeight,
|
||||||
width: sliderWidth,
|
width: sliderWidth,
|
||||||
'z-index': 101,
|
'z-index': 101,
|
||||||
}" direction="horizontal">
|
}"
|
||||||
<image :src="imgbk" class="image" mode="aspectFit" :style="{
|
direction="horizontal"
|
||||||
|
>
|
||||||
|
<image
|
||||||
|
:src="imgbk"
|
||||||
|
class="image"
|
||||||
|
mode="aspectFit"
|
||||||
|
:style="{
|
||||||
height: sliderHeight,
|
height: sliderHeight,
|
||||||
width: sliderWidth,
|
width: sliderWidth,
|
||||||
'margin-top': imgbKH,
|
'margin-top': imgbKH,
|
||||||
}"></image>
|
}"
|
||||||
|
></image>
|
||||||
</movable-view>
|
</movable-view>
|
||||||
<image :src="img" mode="aspectFit" :style="{ height: originalHeight, width: originalWidth }" style="border-radius: 10rpx"></image>
|
<image
|
||||||
|
:src="img"
|
||||||
|
mode="aspectFit"
|
||||||
|
:style="{ height: originalHeight, width: originalWidth }"
|
||||||
|
style="border-radius: 10rpx"
|
||||||
|
></image>
|
||||||
</movable-area>
|
</movable-area>
|
||||||
|
|
||||||
<movable-area class="flex-row-start" style="
|
<movable-area
|
||||||
|
class="flex-row-start"
|
||||||
|
style="
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background-color: #efefef;
|
background-color: #efefef;
|
||||||
height: 80rpx;
|
height: 80rpx;
|
||||||
border-radius: 40rpx;
|
border-radius: 40rpx;
|
||||||
margin-top: 30rpx;
|
margin-top: 30rpx;
|
||||||
">
|
"
|
||||||
<movable-view scale-value="1" animation="false" damping="50" :x="movePv" class="flex-row-center" style="
|
>
|
||||||
|
<movable-view
|
||||||
|
scale-value="1"
|
||||||
|
animation="false"
|
||||||
|
damping="50"
|
||||||
|
:x="movePv"
|
||||||
|
class="flex-row-center"
|
||||||
|
style="
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
height: 100rpx;
|
height: 100rpx;
|
||||||
width: 100rpx;
|
width: 100rpx;
|
||||||
background-color: #ffffff;
|
background-color: #ffffff;
|
||||||
border: 2rpx solid #e3e3e3;
|
border: 2rpx solid #e3e3e3;
|
||||||
margin-top: -13rpx;
|
margin-top: -13rpx;
|
||||||
" direction="horizontal" @change="moveChange" @touchend="end">
|
"
|
||||||
<view :class="endLoad ? 'cuIcon-right' : 'cuIcon-loading turn-load'" class="loadIcon" style="">
|
direction="horizontal"
|
||||||
</view>
|
@change="moveChange"
|
||||||
|
@touchend="end"
|
||||||
|
>
|
||||||
|
<u-icon
|
||||||
|
:color="mainColor"
|
||||||
|
size="40"
|
||||||
|
v-if="endLoad"
|
||||||
|
name="arrow-right"
|
||||||
|
></u-icon>
|
||||||
|
<u-icon :color="mainColor" size="40" v-else name="reload"></u-icon>
|
||||||
</movable-view>
|
</movable-view>
|
||||||
|
|
||||||
<text style="padding-left: 140rpx" :style="{ color: col }">{{
|
<text style="padding-left: 140rpx" :style="{ color: col }">{{
|
||||||
@@ -41,15 +89,20 @@
|
|||||||
}}</text>
|
}}</text>
|
||||||
</movable-area>
|
</movable-area>
|
||||||
<view class="flex-row-around padding-top" style="width: 100%">
|
<view class="flex-row-around padding-top" style="width: 100%">
|
||||||
<view @click="hide" class="cuIcon-close" style="font-size: 50rpx; color: #e25915">
|
<u-icon
|
||||||
</view>
|
@click="hide"
|
||||||
|
:color="mainColor"
|
||||||
|
size="40"
|
||||||
|
name="close"
|
||||||
|
></u-icon>
|
||||||
|
|
||||||
<text class="cu-tag bg-cyan round" @click="getCode">刷新拼图</text>
|
<text class="cu-tag round" @click="getCode">刷新拼图</text>
|
||||||
<text class="my-neirong-sm cuIcon-safe" style="color: #c1c1c1">Lili-FRAMEWORK</text>
|
<text class="my-neirong-sm cuIcon-safe" style="color: #c1c1c1"
|
||||||
|
>Lili-FRAMEWORK</text
|
||||||
|
>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -90,6 +143,7 @@ export default {
|
|||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
mainColor: this.$mainColor,
|
||||||
flage: false,
|
flage: false,
|
||||||
key: "", //key
|
key: "", //key
|
||||||
vsrtx: "点击进行验证", //按钮提示语
|
vsrtx: "点击进行验证", //按钮提示语
|
||||||
@@ -144,7 +198,7 @@ export default {
|
|||||||
storage.setUuid(uuid.v1());
|
storage.setUuid(uuid.v1());
|
||||||
}
|
}
|
||||||
uni.request({
|
uni.request({
|
||||||
url: api.common + "/slider/" + this.business,
|
url: api.common + "/common/slider/" + this.business,
|
||||||
header: {
|
header: {
|
||||||
uuid: storage.getUuid(),
|
uuid: storage.getUuid(),
|
||||||
},
|
},
|
||||||
@@ -179,7 +233,7 @@ export default {
|
|||||||
method: "POST",
|
method: "POST",
|
||||||
url:
|
url:
|
||||||
api.common +
|
api.common +
|
||||||
"/slider/" +
|
"/common/slider/" +
|
||||||
this.business +
|
this.business +
|
||||||
"?xPos=" +
|
"?xPos=" +
|
||||||
parseInt(this.moveCode * this.tl),
|
parseInt(this.moveCode * this.tl),
|
||||||
@@ -252,10 +306,6 @@ export default {
|
|||||||
.border-index {
|
.border-index {
|
||||||
border: 1rpx solid $main-color;
|
border: 1rpx solid $main-color;
|
||||||
}
|
}
|
||||||
.loadIcon {
|
|
||||||
color: $main-color;
|
|
||||||
font-size: 40rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.status_bar {
|
.status_bar {
|
||||||
height: var(--status-bar-height);
|
height: var(--status-bar-height);
|
||||||
|
|||||||
278
components/verify-code/verify-code.vue
Normal file
278
components/verify-code/verify-code.vue
Normal file
@@ -0,0 +1,278 @@
|
|||||||
|
<template>
|
||||||
|
<view class="xt__verify-code">
|
||||||
|
<!-- 输入框 -->
|
||||||
|
<input
|
||||||
|
id="xt__input"
|
||||||
|
:value="code"
|
||||||
|
class="xt__input"
|
||||||
|
:focus="isFocus"
|
||||||
|
:password="isPassword"
|
||||||
|
:type="inputType"
|
||||||
|
:maxlength="size"
|
||||||
|
@input="input"
|
||||||
|
@focus="inputFocus"
|
||||||
|
@blur="inputBlur"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<!-- 光标 -->
|
||||||
|
<view
|
||||||
|
id="xt__cursor"
|
||||||
|
v-if="cursorVisible && type !== 'middle'"
|
||||||
|
class="xt__cursor"
|
||||||
|
:style="{ left: codeCursorLeft[code.length] + 'px', height: cursorHeight + 'px', backgroundColor: cursorColor }"
|
||||||
|
></view>
|
||||||
|
|
||||||
|
<!-- 输入框 - 组 -->
|
||||||
|
<view id="xt__input-ground" class="xt__input-ground">
|
||||||
|
<template v-for="(item, index) in size">
|
||||||
|
<view
|
||||||
|
:key="index"
|
||||||
|
:style="{ borderColor: code.length === index && cursorVisible ? boxActiveColor : boxNormalColor }"
|
||||||
|
:class="['xt__box', `xt__box-${type + ''}`, `xt__box::after`]"
|
||||||
|
>
|
||||||
|
<view :style="{ borderColor: boxActiveColor }" class="xt__middle-line" v-if="type === 'middle' && !code[index]"></view>
|
||||||
|
<text class="xt__code-text">{{ code[index] | codeFormat(isPassword) }}</text>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
/**
|
||||||
|
* @description 输入验证码组件
|
||||||
|
* @property {string} type = [box|middle|bottom] - 显示类型 默认:box -eg:bottom
|
||||||
|
* @property {string} inputType = [text|number] - 输入框类型 默认:number -eg:number
|
||||||
|
* @property {number} size = [4|6] - 支持的验证码数量 默认:6 -eg:6
|
||||||
|
* @property {boolean} isFocus - 是否立即聚焦 默认:true
|
||||||
|
* @property {boolean} isPassword - 是否以密码形式显示 默认false -eg:false
|
||||||
|
* @property {string} cursorColor - 光标颜色 默认:#cccccc
|
||||||
|
* @property {string} boxNormalColor - 光标未聚焦到的框的颜色 默认:#cccccc
|
||||||
|
* @property {string} boxActiveColor - 光标聚焦到的框的颜色 默认:#000000
|
||||||
|
* @event {Function(data)} confirm - 输入完成
|
||||||
|
*/
|
||||||
|
export default {
|
||||||
|
name: 'xt-verify-code',
|
||||||
|
props: {
|
||||||
|
value: {
|
||||||
|
type: String,
|
||||||
|
default: () => ''
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
type: String,
|
||||||
|
default: () => 'box'
|
||||||
|
},
|
||||||
|
inputType: {
|
||||||
|
type: String,
|
||||||
|
default: () => 'number'
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
type: Number,
|
||||||
|
default: () => 6
|
||||||
|
},
|
||||||
|
isFocus: {
|
||||||
|
type: Boolean,
|
||||||
|
default: () => true
|
||||||
|
},
|
||||||
|
isPassword: {
|
||||||
|
type: Boolean,
|
||||||
|
default: () => false
|
||||||
|
},
|
||||||
|
cursorColor: {
|
||||||
|
type: String,
|
||||||
|
default: () => '#cccccc'
|
||||||
|
},
|
||||||
|
boxNormalColor: {
|
||||||
|
type: String,
|
||||||
|
default: () => '#cccccc'
|
||||||
|
},
|
||||||
|
boxActiveColor: {
|
||||||
|
type: String,
|
||||||
|
default: () => '#000000'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
model: {
|
||||||
|
prop: 'value',
|
||||||
|
event: 'input'
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
cursorVisible: false,
|
||||||
|
cursorHeight: 35,
|
||||||
|
code: '', // 输入的验证码
|
||||||
|
codeCursorLeft: [] // 向左移动的距离数组
|
||||||
|
};
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.cursorVisible = this.isFocus;
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.init();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
/**
|
||||||
|
* @description 初始化
|
||||||
|
*/
|
||||||
|
init() {
|
||||||
|
this.getCodeCursorLeft();
|
||||||
|
this.setCursorHeight();
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @description 获取元素节点
|
||||||
|
* @param {string} elm - 节点的id、class 相当于 document.querySelect的参数 -eg: #id
|
||||||
|
* @param {string} type = [single|array] - 单个元素获取多个元素 默认是单个元素
|
||||||
|
* @param {Function} callback - 回调函数
|
||||||
|
*/
|
||||||
|
getElement(elm, type = 'single', callback) {
|
||||||
|
uni
|
||||||
|
.createSelectorQuery()
|
||||||
|
.in(this)
|
||||||
|
[type === 'array' ? 'selectAll' : 'select'](elm)
|
||||||
|
.boundingClientRect()
|
||||||
|
.exec(data => {
|
||||||
|
callback(data[0]);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @description 计算光标的高度
|
||||||
|
*/
|
||||||
|
setCursorHeight() {
|
||||||
|
this.getElement('.xt__box', 'single', boxElm => {
|
||||||
|
this.cursorHeight = boxElm.height * 0.6;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @description 获取光标在每一个box的left位置
|
||||||
|
*/
|
||||||
|
getCodeCursorLeft() {
|
||||||
|
// 获取父级框的位置信息
|
||||||
|
this.getElement('#xt__input-ground', 'single', parentElm => {
|
||||||
|
const parentLeft = parentElm.left;
|
||||||
|
// 获取各个box信息
|
||||||
|
this.getElement('.xt__box', 'array', elms => {
|
||||||
|
this.codeCursorLeft = [];
|
||||||
|
elms.forEach(elm => {
|
||||||
|
this.codeCursorLeft.push(elm.left - parentLeft + elm.width / 2);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
// 输入框输入变化的回调
|
||||||
|
input(e) {
|
||||||
|
const value = e.detail.value;
|
||||||
|
this.cursorVisible = value.length !== this.size;
|
||||||
|
this.$emit('input', value);
|
||||||
|
this.inputSuccess(value);
|
||||||
|
},
|
||||||
|
|
||||||
|
// 输入完成回调
|
||||||
|
inputSuccess(value) {
|
||||||
|
if (value.length === this.size) {
|
||||||
|
this.$emit('confirm', value);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 输入聚焦
|
||||||
|
inputFocus() {
|
||||||
|
this.cursorVisible = this.code.length !== this.size;
|
||||||
|
},
|
||||||
|
// 输入失去焦点
|
||||||
|
inputBlur() {
|
||||||
|
this.cursorVisible = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
value(val) {
|
||||||
|
this.code = val;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
filters: {
|
||||||
|
codeFormat(val, isPassword) {
|
||||||
|
let value = '';
|
||||||
|
if (val) {
|
||||||
|
value = isPassword ? '*' : val;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.xt__verify-code {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
.xt__input {
|
||||||
|
height: 100%;
|
||||||
|
width: 200%;
|
||||||
|
position: absolute;
|
||||||
|
left: -100%;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
.xt__cursor {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
display: inline-block;
|
||||||
|
width: 2px;
|
||||||
|
animation-name: cursor;
|
||||||
|
animation-duration: 0.8s;
|
||||||
|
animation-iteration-count: infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xt__input-ground {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
width: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
.xt__box {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
width: 76rpx;
|
||||||
|
height: 112rpx;
|
||||||
|
&-bottom {
|
||||||
|
border-bottom-width: 2px;
|
||||||
|
border-bottom-style: solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-box {
|
||||||
|
border-width: 2px;
|
||||||
|
border-style: solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-middle {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xt__middle-line {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
width: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
border-bottom-width: 2px;
|
||||||
|
border-bottom-style: solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xt__code-text {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
font-size:52rpx;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes cursor {
|
||||||
|
0% {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -4,12 +4,16 @@
|
|||||||
*/
|
*/
|
||||||
// 开发环境
|
// 开发环境
|
||||||
const dev = {
|
const dev = {
|
||||||
|
im: "https://im-api.pickmall.cn",
|
||||||
common: "https://common-api.pickmall.cn",
|
common: "https://common-api.pickmall.cn",
|
||||||
buyer: "https://buyer-api.pickmall.cn",
|
buyer: "https://buyer-api.pickmall.cn",
|
||||||
|
// common: "http://192.168.0.113:8890",
|
||||||
|
// buyer: "http://192.168.0.113:8888",
|
||||||
|
// im: "http://192.168.0.113:8885",
|
||||||
};
|
};
|
||||||
// 生产环境
|
// 生产环境
|
||||||
const prod = {
|
const prod = {
|
||||||
|
im: "https://im-api.pickmall.cn",
|
||||||
common: "https://common-api.pickmall.cn",
|
common: "https://common-api.pickmall.cn",
|
||||||
buyer: "https://buyer-api.pickmall.cn",
|
buyer: "https://buyer-api.pickmall.cn",
|
||||||
};
|
};
|
||||||
@@ -29,6 +33,7 @@ api = prod;
|
|||||||
|
|
||||||
api.buyer += "/buyer";
|
api.buyer += "/buyer";
|
||||||
api.common += "/common";
|
api.common += "/common";
|
||||||
|
api.im += "/im";
|
||||||
export default {
|
export default {
|
||||||
...api,
|
...api,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,16 +1,27 @@
|
|||||||
const name = "lilishop"; //全局商城name
|
const name = "lilishop"; //全局商城name
|
||||||
const schemeName = 'lilishop' //唤醒app需要的schemeName
|
const schemeName = "lilishop"; //唤醒app需要的schemeName
|
||||||
export default {
|
export default {
|
||||||
name: name,
|
name: name,
|
||||||
schemeLink: `${schemeName}://`, //唤起app地址
|
schemeLink: `${schemeName}://`, //唤起app地址
|
||||||
downloadLink: "https://pickmall.cn/download-page/index.html", //下载地址,下载app的地址
|
downloadLink: "https://pickmall.cn/download-page/index.html", //下载地址,下载app的地址
|
||||||
shareLink: "https://m-b2b2c.pickmall.cn", //分享地址,也就是在h5中默认的复制地址
|
shareLink: "https://m-b2b2c.pickmall.cn", //分享地址,也就是在h5中默认的复制地址
|
||||||
appid: "wx6f10f29075dc1b0b", //小程序唯一凭证,即 AppID,可在「微信公众平台 - 设置 - 开发设置」页中获得。(需要已经成为开发者,且帐号没有异常状态)
|
appid: "wx6f10f29075dc1b0b", //小程序唯一凭证,即 AppID,可在「微信公众平台 - 设置 - 开发设置」页中获得。(需要已经成为开发者,且帐号没有异常状态)
|
||||||
appSecret: "6dfbe0c72380dce5d49d65b3c91059b1", //可在 manifest.json 查看
|
aMapKey: "1f78544934b66c9fbc0104117f663973", //在高德中申请Web服务key
|
||||||
aMapKey: "d649892b3937a5ad20b76dacb2bcb5bd", //在高德中申请web端key
|
scanAuthNavigation: ["https://m-b2b2c.pickmall.cn/"], //扫码认证跳转域名配置 会根据此处配置的路由进行跳转
|
||||||
scanAuthNavigation:['https://m-b2b2c.pickmall.cn/'], //扫码认证跳转域名配置 会根据此处配置的路由进行跳转
|
iosAppId: "id1564638363", //AppStore的应用地址id 具体在分享->拷贝链接中查看
|
||||||
iosAppId:"id1564638363", //AppStore的应用地址id 具体在分享->拷贝链接中查看
|
logo: "https://lilishop-oss.oss-cn-beijing.aliyuncs.com/4c864e133c2944efad1f7282ac8a3b9e.png", //logo地址
|
||||||
logo:"https://lilishop-oss.oss-cn-beijing.aliyuncs.com/4c864e133c2944efad1f7282ac8a3b9e.png", //logo地址
|
customerServiceMobile: "13161366885", //客服电话
|
||||||
customerServiceMobile:"13161366885", //客服电话
|
customerServiceEmail: "lili@lili.com", //客服邮箱
|
||||||
customerServiceEmail:"lili@lili.com" //客服邮箱
|
imWebSrc: "https://im.pickmall.cn", //IM地址
|
||||||
|
baseWsUrl: "wss://im-api.pickmall.cn/lili/webSocket", // IM WS 地址
|
||||||
|
enableGetClipboard: false, //是否启用粘贴板获取 scanAuthNavigation 中的链接,如果匹配则会跳转到对应页面
|
||||||
|
enableMiniBarStartUpApp: true, //是否在h5中右侧浮空按钮点击启动app
|
||||||
|
/**
|
||||||
|
* 如需更换主题请修改此处以及uni.scss中的全局颜色
|
||||||
|
*/
|
||||||
|
mainColor: "#ff3c2a", // 主题色
|
||||||
|
lightColor: "#ff6b35", // 高亮主题色
|
||||||
|
aiderLightColor: "#ff9f28", // 辅助高亮颜色
|
||||||
|
defaultUserPhoto: "/static/missing-face.png", // 默认用户头像
|
||||||
|
enableFetchMobileLogin: false // 是否启用获取手机号登录 如果微信小程序提示封禁手机号获取权限 可将此选项设置成false作为备用登录方案
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
* @param {sn,price}
|
* @param {sn,price}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { initiatePay } from "@/api/trade";
|
|
||||||
import { getWeChatMpMessage } from "@/api/message.js";
|
import { getWeChatMpMessage } from "@/api/message.js";
|
||||||
|
import { initiatePay } from "@/api/trade";
|
||||||
class LiLiWXPay {
|
class LiLiWXPay {
|
||||||
constructor(...payList) {
|
constructor(...payList) {
|
||||||
this.data = payList[0];
|
this.data = payList[0];
|
||||||
@@ -65,8 +65,8 @@ class LiLiWXPay {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function sendMessage(price) {
|
function sendMessage(price) {
|
||||||
//判断用户是否已经进行了订阅
|
|
||||||
if (!uni.getStorageSync("acceptSubscribeMessage")) {
|
|
||||||
//订阅消息
|
//订阅消息
|
||||||
getWeChatMpMessage().then((res) => {
|
getWeChatMpMessage().then((res) => {
|
||||||
var message = res.data.result;
|
var message = res.data.result;
|
||||||
@@ -74,20 +74,18 @@ function sendMessage(price) {
|
|||||||
uni.requestSubscribeMessage({
|
uni.requestSubscribeMessage({
|
||||||
tmplIds: templateid,
|
tmplIds: templateid,
|
||||||
success: (res) => {
|
success: (res) => {
|
||||||
for (let key in res) {
|
|
||||||
// 表示用户拒绝订阅该信息
|
|
||||||
if (res[key] == "reject") {
|
|
||||||
this.checked = false;
|
|
||||||
} else {
|
|
||||||
uni.setStorageSync("acceptSubscribeMessage", res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
fail: (res) => {
|
fail: (res) => {
|
||||||
uni.removeStorageSync("acceptSubscribeMessage");
|
console.log('fail', res)
|
||||||
this.checked = false;
|
uni.showToast({
|
||||||
|
icon: "none",
|
||||||
|
title: "订阅消息失败",
|
||||||
|
})
|
||||||
},
|
},
|
||||||
complete: () => {
|
complete: (res) => {
|
||||||
|
console.log('complete', res)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 已经支付成功
|
* 已经支付成功
|
||||||
*/
|
*/
|
||||||
@@ -100,17 +98,7 @@ function sendMessage(price) {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
} else {
|
|
||||||
/**
|
|
||||||
* 已经支付成功
|
|
||||||
*/
|
|
||||||
uni.redirectTo({
|
|
||||||
url:
|
|
||||||
"/pages/cart/payment/success?paymentMethod=WECHAT" +
|
|
||||||
"&payPrice=" +
|
|
||||||
price,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default LiLiWXPay;
|
export default LiLiWXPay;
|
||||||
|
|||||||
77
js_sdk/t-jwt/jwt.js
Normal file
77
js_sdk/t-jwt/jwt.js
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
|
||||||
|
var b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/;
|
||||||
|
exports.weBtoa = function (string) {
|
||||||
|
string = String(string);
|
||||||
|
var bitmap, a, b, c, result = "", i = 0, rest = string.length % 3;
|
||||||
|
for (; i < string.length;) {
|
||||||
|
if ((a = string.charCodeAt(i++)) > 255 ||
|
||||||
|
(b = string.charCodeAt(i++)) > 255 ||
|
||||||
|
(c = string.charCodeAt(i++)) > 255)
|
||||||
|
throw new TypeError("Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.");
|
||||||
|
bitmap = (a << 16) | (b << 8) | c;
|
||||||
|
result += b64.charAt(bitmap >> 18 & 63) + b64.charAt(bitmap >> 12 & 63) +
|
||||||
|
b64.charAt(bitmap >> 6 & 63) + b64.charAt(bitmap & 63);
|
||||||
|
}
|
||||||
|
return rest ? result.slice(0, rest - 3) + "===".substring(rest) : result;
|
||||||
|
};
|
||||||
|
exports.weAtob = function (string) {
|
||||||
|
string = String(string).replace(/[\t\n\f\r ]+/g, "");
|
||||||
|
if (!b64re.test(string))
|
||||||
|
throw new TypeError("Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.");
|
||||||
|
string += "==".slice(2 - (string.length & 3));
|
||||||
|
var bitmap, result = "", r1, r2, i = 0;
|
||||||
|
for (; i < string.length;) {
|
||||||
|
bitmap = b64.indexOf(string.charAt(i++)) << 18 | b64.indexOf(string.charAt(i++)) << 12 |
|
||||||
|
(r1 = b64.indexOf(string.charAt(i++))) << 6 | (r2 = b64.indexOf(string.charAt(i++)));
|
||||||
|
result += r1 === 64 ? String.fromCharCode(bitmap >> 16 & 255) :
|
||||||
|
r2 === 64 ? String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255) :
|
||||||
|
String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255, bitmap & 255);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
function b64DecodeUnicode(str) {
|
||||||
|
return decodeURIComponent(exports.weAtob(str).replace(/(.)/g, function (p) {
|
||||||
|
var code = p.charCodeAt(0).toString(16).toUpperCase();
|
||||||
|
if (code.length < 2) {
|
||||||
|
code = "0" + code;
|
||||||
|
}
|
||||||
|
return "%" + code;
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
function base64_url_decode(str) {
|
||||||
|
var output = str.replace(/-/g, "+").replace(/_/g, "/");
|
||||||
|
switch (output.length % 4) {
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
output += "==";
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
output += "=";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw "Illegal base64url string!";
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return b64DecodeUnicode(output);
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
return exports.weAtob(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function weappJwtDecode(token, options) {
|
||||||
|
if (typeof token !== "string") {
|
||||||
|
throw ("Invalid token specified");
|
||||||
|
}
|
||||||
|
options = options || {};
|
||||||
|
var pos = options.header === true ? 0 : 1;
|
||||||
|
try {
|
||||||
|
return JSON.parse(base64_url_decode(token.split(".")[pos]));
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
throw ("Invalid token specified: " + e.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.default = weappJwtDecode;
|
||||||
22
main.js
22
main.js
@@ -3,19 +3,24 @@ import App from "./App";
|
|||||||
import * as filters from "./utils/filters.js"; // global filter
|
import * as filters from "./utils/filters.js"; // global filter
|
||||||
import uView from "uview-ui";
|
import uView from "uview-ui";
|
||||||
import store from "./store";
|
import store from "./store";
|
||||||
|
import config from '@/config/config';
|
||||||
|
import airBtn from "@/components/m-airbtn/index.vue";
|
||||||
|
import socketIO from './pages/mine/im/socket';
|
||||||
/**
|
/**
|
||||||
* 仅在h5中显示唤醒app功能
|
* 仅在h5中显示唤醒app功能
|
||||||
* 在h5页面手动挂载
|
* 在h5页面手动挂载
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
// #ifdef H5
|
// #ifdef H5
|
||||||
import airBtn from "@/components/m-airbtn/index.vue";
|
if (config.enableMiniBarStartUpApp) {
|
||||||
let btn = Vue.component("airBtn", airBtn); //全局注册
|
let btn = Vue.component("airBtn", airBtn); //全局注册
|
||||||
document.body.appendChild(new btn().$mount().$el);
|
document.body.appendChild(new btn().$mount().$el);
|
||||||
|
}
|
||||||
// #endif
|
// #endif
|
||||||
|
|
||||||
|
// 引入uView对小程序分享的mixin封装
|
||||||
|
let mpShare = require('uview-ui/libs/mixin/mpShare.js');
|
||||||
|
Vue.mixin(mpShare)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 全局filters
|
* 全局filters
|
||||||
@@ -27,6 +32,7 @@ Object.keys(filters).forEach((key) => {
|
|||||||
|
|
||||||
// 引入Vuex
|
// 引入Vuex
|
||||||
Vue.prototype.$store = store;
|
Vue.prototype.$store = store;
|
||||||
|
// Vue.prototype.socketIo = new socketIO();
|
||||||
Vue.use(uView);
|
Vue.use(uView);
|
||||||
Vue.config.productionTip = false;
|
Vue.config.productionTip = false;
|
||||||
|
|
||||||
@@ -38,11 +44,11 @@ Vue.config.productionTip = false;
|
|||||||
* 如需更换主题请修改此处以及uni.scss中的全局颜色
|
* 如需更换主题请修改此处以及uni.scss中的全局颜色
|
||||||
*/
|
*/
|
||||||
// 主题色
|
// 主题色
|
||||||
Vue.prototype.$mainColor = "#ff3c2a";
|
Vue.prototype.$mainColor = config.mainColor;
|
||||||
// 高亮主题色
|
// 高亮主题色
|
||||||
Vue.prototype.$lightColor = "#ff6b35";
|
Vue.prototype.$lightColor = config.lightColor;
|
||||||
// 辅助高亮颜色
|
// 辅助高亮颜色
|
||||||
Vue.prototype.$aiderLightColor = "#ff9f28";
|
Vue.prototype.$aiderLightColor = config.aiderLightColor;
|
||||||
|
|
||||||
|
|
||||||
App.mpType = "app";
|
App.mpType = "app";
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
{
|
{
|
||||||
"name" : "lili商城",
|
"name" : "lilishop",
|
||||||
"appid" : "__UNI__C100675",
|
"appid" : "__UNI__ED807EA",
|
||||||
"description" : "",
|
"description" : "",
|
||||||
"versionName" : "4.0.42",
|
"versionName" : "4.5.3",
|
||||||
"versionCode" : 4000042,
|
"versionCode" : 4000503,
|
||||||
"transformPx" : false,
|
"transformPx" : false,
|
||||||
"app-plus" : {
|
"app-plus" : {
|
||||||
"compatible" : {
|
"compatible" : {
|
||||||
@@ -63,8 +63,19 @@
|
|||||||
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
|
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
|
||||||
],
|
],
|
||||||
"abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ],
|
"abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ],
|
||||||
"schemes" : "lilishop"
|
"schemes" : "lilishop",
|
||||||
|
//安卓自添加 权限 应用市场 过度索取权限
|
||||||
|
"permissionExternalStorage" : {
|
||||||
|
"request" : "none",
|
||||||
|
"prompt" : "应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。"
|
||||||
},
|
},
|
||||||
|
"permissionPhoneState" : {
|
||||||
|
"request" : "none",
|
||||||
|
"prompt" : "为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许"
|
||||||
|
},
|
||||||
|
"autoSdkPermissions" : false
|
||||||
|
},
|
||||||
|
//安卓自添加 权限 应用市场 过度索取权限
|
||||||
"ios" : {
|
"ios" : {
|
||||||
"idfa" : false,
|
"idfa" : false,
|
||||||
"privacyDescription" : {
|
"privacyDescription" : {
|
||||||
@@ -72,9 +83,11 @@
|
|||||||
"NSPhotoLibraryAddUsageDescription" : "保存商品图片到本地",
|
"NSPhotoLibraryAddUsageDescription" : "保存商品图片到本地",
|
||||||
"NSFaceIDUsageDescription" : "使用面部识别进行登录",
|
"NSFaceIDUsageDescription" : "使用面部识别进行登录",
|
||||||
"NSCameraUsageDescription" : "需要用与扫描二维码和商品评论图片拍摄",
|
"NSCameraUsageDescription" : "需要用与扫描二维码和商品评论图片拍摄",
|
||||||
"NSLocationAlwaysAndWhenInUseUsageDescription" : "位置信息将用于高德地图的效果展示"
|
"NSLocationAlwaysAndWhenInUseUsageDescription" : "位置信息将用于高德地图的效果展示",
|
||||||
|
"NSMicrophoneUsageDescription" : "用户上传视频时需使用音频信息"
|
||||||
},
|
},
|
||||||
"urltypes" : "lilishop"
|
"urltypes" : "lilishop",
|
||||||
|
"dSYMs" : false
|
||||||
},
|
},
|
||||||
/* ios打包配置 */
|
/* ios打包配置 */
|
||||||
"sdkConfigs" : {
|
"sdkConfigs" : {
|
||||||
@@ -191,18 +204,18 @@
|
|||||||
"permission" : {
|
"permission" : {
|
||||||
"scope.userLocation" : {
|
"scope.userLocation" : {
|
||||||
"desc" : "位置信息将用于高德地图的效果展示"
|
"desc" : "位置信息将用于高德地图的效果展示"
|
||||||
|
},
|
||||||
|
"scope.writePhotosAlbum" : {
|
||||||
|
"desc" : "将用于保存图片"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"plugins" : {
|
"plugins" : {},
|
||||||
"myPlugin" : {
|
// 直播插件注释
|
||||||
"version" : "1.1.0",
|
// "live-player-plugin" : {
|
||||||
"provider" : "wx738958e0f4c894f9"
|
// "version" : "1.3.0",
|
||||||
},
|
// "provider" : "wx2b03c6e691cd7370"
|
||||||
"live-player-plugin" : {
|
// }
|
||||||
"version" : "1.3.0",
|
"requiredPrivateInfos" : [ "chooseLocation", "getLocation" ]
|
||||||
"provider" : "wx2b03c6e691cd7370"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"h5" : {
|
"h5" : {
|
||||||
"devServer" : {
|
"devServer" : {
|
||||||
|
|||||||
160
pages.json
160
pages.json
@@ -10,17 +10,35 @@
|
|||||||
"style": {
|
"style": {
|
||||||
"navigationBarTitleText": "首页",
|
"navigationBarTitleText": "首页",
|
||||||
"navigationStyle": "custom", // 隐藏系统导航栏
|
"navigationStyle": "custom", // 隐藏系统导航栏
|
||||||
"navigationBarTextStyle": "black"
|
"navigationBarTextStyle": "black",
|
||||||
|
"enablePullDownRefresh":true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path":"pages/tabbar/screen/fullScreen",
|
||||||
|
"style": {
|
||||||
|
"navigationStyle": "custom", // 隐藏系统导航栏
|
||||||
|
"app-plus":{
|
||||||
|
"animationType": "fade-in", // 设置fade-in淡入动画,为最合理的动画类型
|
||||||
|
"background": "transparent", // 背景透明
|
||||||
|
"backgroundColor": "rgba(0,0,0,0)", // 背景透明
|
||||||
|
"popGesture": "none" // 关闭IOS屏幕左边滑动关闭当前页面的功能
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "pages/tabbar/home/title",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "消息"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"path": "pages/tabbar/cart/cartList",
|
"path": "pages/tabbar/cart/cartList",
|
||||||
"style": {
|
"style": {
|
||||||
"navigationBarTitleText": "购物车",
|
"navigationBarTitleText": "购物车",
|
||||||
"navigationStyle": "custom",
|
"navigationStyle": "custom", // 隐藏系统导航栏
|
||||||
|
"navigationBarBackgroundColor": "#fff",
|
||||||
"navigationBarBackgroundColor": "#fff"
|
"enablePullDownRefresh":true //实现下拉刷新样式
|
||||||
|
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
@@ -42,9 +60,16 @@
|
|||||||
"style": {
|
"style": {
|
||||||
"navigationBarTitleText": "搜索",
|
"navigationBarTitleText": "搜索",
|
||||||
"navigationStyle": "custom",
|
"navigationStyle": "custom",
|
||||||
|
|
||||||
"app-plus": {
|
"app-plus": {
|
||||||
//app页面不显示滚动条
|
//app页面不显示滚动条
|
||||||
"scrollIndicator": "none"
|
"scrollIndicator": "none",
|
||||||
|
"bottom": "0",
|
||||||
|
"contentAdjust": "false",
|
||||||
|
"bounce": "none",
|
||||||
|
"safearea": {
|
||||||
|
"bottom": "none"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
@@ -61,6 +86,12 @@
|
|||||||
"style": {
|
"style": {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "pages/tabbar/special/special",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "专题"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
],
|
],
|
||||||
@@ -80,21 +111,14 @@
|
|||||||
"style": {
|
"style": {
|
||||||
"navigationBarTitleText": "我的足迹",
|
"navigationBarTitleText": "我的足迹",
|
||||||
"enablePullDownRefresh": true,
|
"enablePullDownRefresh": true,
|
||||||
"app-plus": {
|
"navigationStyle": "custom"
|
||||||
"titleNView": {
|
|
||||||
"buttons": [{
|
|
||||||
"text": "编辑",
|
|
||||||
"fontSize": "14"
|
|
||||||
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
"path": "myCollect",
|
"path": "myCollect",
|
||||||
"style": {
|
"style": {
|
||||||
"navigationBarTitleText": "收藏",
|
"navigationBarTitleText": "收藏",
|
||||||
"enablePullDownRefresh": true, //下拉刷新
|
"enablePullDownRefresh": true, //下拉刷新
|
||||||
|
"navigationStyle": "custom",
|
||||||
"app-plus": {
|
"app-plus": {
|
||||||
"scrollIndicator": "none"
|
"scrollIndicator": "none"
|
||||||
}
|
}
|
||||||
@@ -202,6 +226,13 @@
|
|||||||
"navigationBarTitleText": "地址管理"
|
"navigationBarTitleText": "地址管理"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"path": "address/storeAddress",
|
||||||
|
"style": {
|
||||||
|
"enablePullDownRefresh": true,
|
||||||
|
"navigationBarTitleText": "自提点"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "address/add",
|
"path": "address/add",
|
||||||
"style": {
|
"style": {
|
||||||
@@ -233,6 +264,8 @@
|
|||||||
"navigationBarTitleText": "面容登录"
|
"navigationBarTitleText": "面容登录"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
"path": "set/securityCenter/editPassword",
|
"path": "set/securityCenter/editPassword",
|
||||||
"style": {
|
"style": {
|
||||||
@@ -243,13 +276,54 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"path": "set/securityCenter/bindMobile",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "绑定手机号",
|
||||||
|
"app-plus": {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"path": "im/list",
|
||||||
|
"style": {
|
||||||
|
"navigationStyle": "custom", // 隐藏系统导航栏
|
||||||
|
"enablePullDownRefresh": true,
|
||||||
|
"app-plus": {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "im/index",
|
||||||
|
"style": {
|
||||||
|
"navigationStyle": "custom", // 隐藏系统导航栏
|
||||||
|
"enablePullDownRefresh": true,
|
||||||
|
"app-plus": {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "set/feedBack",
|
"path": "set/feedBack",
|
||||||
"style": {
|
"style": {
|
||||||
"navigationBarTitleText": "意见反馈"
|
"navigationBarTitleText": "意见反馈"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"path": "set/securityCenter/updatePwdTab",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "修改密码"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "set/securityCenter/editLoginPassword",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "修改密码"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "set/securityCenter/securityCenter",
|
"path": "set/securityCenter/securityCenter",
|
||||||
"style": {
|
"style": {
|
||||||
@@ -340,6 +414,12 @@
|
|||||||
"navigationBarTitleText": "",
|
"navigationBarTitleText": "",
|
||||||
"navigationStyle": "custom"
|
"navigationStyle": "custom"
|
||||||
}
|
}
|
||||||
|
},{
|
||||||
|
"path": "shopList",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "",
|
||||||
|
"navigationStyle": "custom"
|
||||||
|
}
|
||||||
},{
|
},{
|
||||||
"path": "licencePhoto",
|
"path": "licencePhoto",
|
||||||
"style": {
|
"style": {
|
||||||
@@ -396,6 +476,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
},
|
},
|
||||||
@@ -425,6 +506,21 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"path": "entry/seller/index",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "店铺入驻",
|
||||||
|
"navigationStyle": "custom"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "entry/seller/control",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "",
|
||||||
|
"navigationStyle": "custom"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "article",
|
"path": "article",
|
||||||
"style": {
|
"style": {
|
||||||
@@ -438,6 +534,14 @@
|
|||||||
"navigationStyle": "custom",
|
"navigationStyle": "custom",
|
||||||
"navigationBarTextStyle": "black"
|
"navigationBarTextStyle": "black"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "scannerCodeLoginConfirm",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "扫码登录",
|
||||||
|
"navigationStyle": "custom",
|
||||||
|
"navigationBarTextStyle": "black"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -445,17 +549,12 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
"root": "pages/promotion",
|
"root": "pages/promotion",
|
||||||
"pages": [{
|
"pages": [ {
|
||||||
"path": "sale",
|
|
||||||
"style": {
|
|
||||||
"navigationBarTitleText": "特惠推荐",
|
|
||||||
"navigationStyle": "custom"
|
|
||||||
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
"path": "seckill",
|
"path": "seckill",
|
||||||
"style": {
|
"style": {
|
||||||
"navigationBarTitleText": "限时抢购",
|
"navigationBarTitleText": "限时抢购",
|
||||||
|
"navigationStyle": "custom", // 隐藏系统导航栏
|
||||||
|
"navigationBarTextStyle": "black" ,
|
||||||
"app-plus": {
|
"app-plus": {
|
||||||
"titleNView": {
|
"titleNView": {
|
||||||
"homeButton":true
|
"homeButton":true
|
||||||
@@ -469,19 +568,12 @@
|
|||||||
"style": {
|
"style": {
|
||||||
"navigationBarTitleText": "拼团活动",
|
"navigationBarTitleText": "拼团活动",
|
||||||
"navigationStyle": "custom", // 隐藏系统导航栏
|
"navigationStyle": "custom", // 隐藏系统导航栏
|
||||||
|
"navigationBarTextStyle": "black" ,
|
||||||
"app-plus": {
|
"app-plus": {
|
||||||
// 将回弹属性关掉
|
// 将回弹属性关掉
|
||||||
"bounce": "none"
|
"bounce": "none"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, {
|
|
||||||
"path": "recommend",
|
|
||||||
"style": {
|
|
||||||
"navigationBarTitleText": "人气推荐",
|
|
||||||
"navigationStyle": "custom"
|
|
||||||
|
|
||||||
}
|
|
||||||
},{
|
},{
|
||||||
"path": "lives",
|
"path": "lives",
|
||||||
"style": {
|
"style": {
|
||||||
@@ -638,6 +730,12 @@
|
|||||||
"navigationBarTitleText": "订单详情"
|
"navigationBarTitleText": "订单详情"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"path": "deliverDetail",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "物流详情"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "evaluate/evaluateDetail",
|
"path": "evaluate/evaluateDetail",
|
||||||
"style": {
|
"style": {
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="coupon-center">
|
<view class="coupon-center">
|
||||||
<swiper class="swiper-box">
|
<div class="swiper-box">
|
||||||
<swiper-item class="swiper-item">
|
<div class="swiper-item">
|
||||||
<scroll-view class="scroll-v" enableBackToTop="true" scroll-y @scrolltolower="loadMore">
|
<div class="scroll-v" enableBackToTop="true" scroll-y>
|
||||||
<u-empty mode="coupon" text="没有优惠券了" v-if="whetherEmpty"></u-empty>
|
<u-empty mode="coupon" style='margin-top: 20%;' text="没有优惠券了" v-if="whetherEmpty"></u-empty>
|
||||||
<view v-else class="coupon-item" v-for="(item, index) in couponList" :key="index">
|
<view v-else class="coupon-item" v-for="(item, index) in couponList" :key="index">
|
||||||
<view class="left">
|
<view class="left">
|
||||||
<view class="wave-line">
|
<view class="wave-line">
|
||||||
@@ -23,12 +23,13 @@
|
|||||||
<view class="right">
|
<view class="right">
|
||||||
<view>
|
<view>
|
||||||
<!-- 根据scopeType 判断是否是 平台、品类或店铺 -->
|
<!-- 根据scopeType 判断是否是 平台、品类或店铺 -->
|
||||||
<view v-if="item.scopeType">
|
<view class="coupon-title wes-3" v-if="item.scopeType">
|
||||||
<span v-if="item.scopeType == 'ALL' && item.id == 'platform'">全平台</span>
|
<span v-if="item.scopeType == 'ALL' && item.storeId == '0'">全平台</span>
|
||||||
<span v-if="item.scopeType == 'PORTION_CATEGORY'">仅限品类</span>
|
<span v-if="item.scopeType == 'PORTION_GOODS_CATEGORY'">仅限品类</span>
|
||||||
<view v-else>{{ item.storeName == 'platform' ? '全平台' :item.storeName+'店铺' }}使用</view>
|
<view v-else>{{ item.storeName == 'platform' ? '全平台' :item.storeName+'店铺' }}使用
|
||||||
</view>
|
</view>
|
||||||
<view>有效期至:{{ item.endTime.split(" ")[0] }}</view>
|
</view>
|
||||||
|
<view v-if="item.endTime">有效期至:{{ item.endTime.split(" ")[0] }}</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="receive" @click="receive(item)">
|
<view class="receive" @click="receive(item)">
|
||||||
<text>点击</text><br />
|
<text>点击</text><br />
|
||||||
@@ -37,17 +38,21 @@
|
|||||||
<view class="bg-quan"> 券 </view>
|
<view class="bg-quan"> 券 </view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<uni-load-more :status="loadStatus"></uni-load-more>
|
|
||||||
</scroll-view>
|
</div>
|
||||||
</swiper-item>
|
</div>
|
||||||
</swiper>
|
</div>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { receiveCoupons } from "@/api/members.js";
|
import {
|
||||||
import { getAllCoupons } from "@/api/promotions.js";
|
receiveCoupons
|
||||||
export default {
|
} from "@/api/members.js";
|
||||||
|
import {
|
||||||
|
getAllCoupons
|
||||||
|
} from "@/api/promotions.js";
|
||||||
|
export default {
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
loadStatus: "more", //下拉状态
|
loadStatus: "more", //下拉状态
|
||||||
@@ -57,13 +62,18 @@ export default {
|
|||||||
pageNumber: 1,
|
pageNumber: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
},
|
},
|
||||||
storeId: "", //店铺 id
|
storeId: "", //店铺 id,
|
||||||
|
couponData: ""
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
onLoad(option) {
|
onLoad(option) {
|
||||||
this.storeId = option.storeId;
|
this.storeId = option.storeId;
|
||||||
this.getCoupon();
|
this.getCoupon();
|
||||||
},
|
},
|
||||||
|
onReachBottom() {
|
||||||
|
|
||||||
|
this.loadMore()
|
||||||
|
},
|
||||||
onPullDownRefresh() {
|
onPullDownRefresh() {
|
||||||
//下拉刷新
|
//下拉刷新
|
||||||
this.params.pageNumber = 1;
|
this.params.pageNumber = 1;
|
||||||
@@ -78,34 +88,46 @@ export default {
|
|||||||
uni.showLoading({
|
uni.showLoading({
|
||||||
title: "加载中",
|
title: "加载中",
|
||||||
});
|
});
|
||||||
let submitData = { ...this.params };
|
let submitData = {
|
||||||
|
...this.params
|
||||||
|
};
|
||||||
// 判断当前是否有店铺
|
// 判断当前是否有店铺
|
||||||
this.storeId ? (submitData = { ...this.params, storeId: this.storeId }): "",
|
this.storeId ? (submitData = {
|
||||||
|
...this.params,
|
||||||
|
storeId: this.storeId
|
||||||
|
}) : "",
|
||||||
getAllCoupons(submitData)
|
getAllCoupons(submitData)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
uni.hideLoading();
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
uni.stopPullDownRefresh();
|
uni.stopPullDownRefresh();
|
||||||
if (res.data.code == 200) {
|
if (res.data.code == 200) {
|
||||||
// 如果请求成功,展示数据并进行展示
|
// 如果请求成功,展示数据并进行展示
|
||||||
let data = res.data.result;
|
this.couponData = res.data.result
|
||||||
if (data.total == 0) {
|
if (this.couponData.total == 0) {
|
||||||
// 当本次请求数据为空展示空信息
|
// 当本次请求数据为空展示空信息
|
||||||
this.whetherEmpty = true;
|
this.whetherEmpty = true;
|
||||||
} else {
|
} else {
|
||||||
this.couponList.push(...data.records);
|
this.couponList.push(...this.couponData.records);
|
||||||
this.loadStatus = "noMore";
|
this.loadStatus = "noMore";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
uni.hideLoading();
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
* 领取优惠券
|
* 领取优惠券
|
||||||
*/
|
*/
|
||||||
receive(item) {
|
receive(val) {
|
||||||
receiveCoupons(item.id).then((res) => {
|
this.$u.throttle(()=>{
|
||||||
|
this.fetchCoupon(val)
|
||||||
|
}, 1500)
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
fetchCoupon(val){
|
||||||
|
receiveCoupons(val.id).then((res) => {
|
||||||
if (res.data.code == 200) {
|
if (res.data.code == 200) {
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
title: "领取成功",
|
title: "领取成功",
|
||||||
@@ -119,13 +141,14 @@ export default {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 加载更多
|
* 加载更多
|
||||||
*/
|
*/
|
||||||
loadMore() {
|
loadMore() {
|
||||||
if (this.loadStatus != "noMore") {
|
if (this.couponData.total > this.params.pageNumber * this.params.pageSize) {
|
||||||
this.params.pageNumber++;
|
this.params.pageNumber++;
|
||||||
this.getAllCoupons();
|
this.getCoupon();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -134,52 +157,18 @@ export default {
|
|||||||
url: "/pages/cart/coupon/couponIntro",
|
url: "/pages/cart/coupon/couponIntro",
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<style>
|
<style>
|
||||||
page {
|
page {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.coupon-center {
|
.coupon-center {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|
||||||
.couponList-scroll-content {
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
display: flex;
|
|
||||||
white-space: nowrap;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
background-color: $main-color;
|
|
||||||
color: #ffffff;
|
|
||||||
|
|
||||||
.tab-item {
|
|
||||||
width: 160rpx;
|
|
||||||
height: 80rpx;
|
|
||||||
line-height: 60rpx;
|
|
||||||
text-align: center;
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.active {
|
|
||||||
border-bottom: 2px solid #ffffff;
|
|
||||||
broder-width: 60rpx;
|
|
||||||
font-size: 30rpx;
|
|
||||||
font-weight: 700;
|
|
||||||
padding-bottom: 4rpx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.swiper-box {
|
.swiper-box {
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
.scroll-v {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.coupon-item {
|
.coupon-item {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -191,6 +180,7 @@ page {
|
|||||||
width: 260rpx;
|
width: 260rpx;
|
||||||
background-color: $light-color;
|
background-color: $light-color;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
.message {
|
.message {
|
||||||
color: $font-color-white;
|
color: $font-color-white;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -226,6 +216,7 @@ page {
|
|||||||
margin-top: 4rpx;
|
margin-top: 4rpx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.circle {
|
.circle {
|
||||||
width: 40rpx;
|
width: 40rpx;
|
||||||
height: 40rpx;
|
height: 40rpx;
|
||||||
@@ -234,10 +225,12 @@ page {
|
|||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
z-index: 111;
|
z-index: 111;
|
||||||
}
|
}
|
||||||
|
|
||||||
.circle-top {
|
.circle-top {
|
||||||
top: -20rpx;
|
top: -20rpx;
|
||||||
right: -20rpx;
|
right: -20rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.circle-bottom {
|
.circle-bottom {
|
||||||
bottom: -20rpx;
|
bottom: -20rpx;
|
||||||
right: -20rpx;
|
right: -20rpx;
|
||||||
@@ -254,11 +247,16 @@ page {
|
|||||||
background-color: #ffffff;
|
background-color: #ffffff;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
position: relative;
|
position: relative;
|
||||||
> view:nth-child(1) {
|
|
||||||
|
>view:nth-child(1) {
|
||||||
color: #666666;
|
color: #666666;
|
||||||
margin-left: 20rpx;
|
margin-left: 20rpx;
|
||||||
line-height: 3em;
|
display: flex;
|
||||||
> view:nth-child(1) {
|
height: 100%;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-around;
|
||||||
|
|
||||||
|
>view:nth-child(1) {
|
||||||
color: #ff6262;
|
color: #ff6262;
|
||||||
font-size: 30rpx;
|
font-size: 30rpx;
|
||||||
}
|
}
|
||||||
@@ -295,5 +293,10 @@ page {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.coupon-title {
|
||||||
|
width: 260rpx;
|
||||||
|
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -3,7 +3,8 @@
|
|||||||
<view class="body">
|
<view class="body">
|
||||||
<view class="top-view">
|
<view class="top-view">
|
||||||
<view class="title">{{coupon.title}}</view>
|
<view class="title">{{coupon.title}}</view>
|
||||||
<view class="price"><text>¥</text>{{coupon.price | unitPrice}}</view>
|
<view class="price" v-if="coupon.couponType =='PRICE'"><text>¥</text>{{coupon.price | unitPrice}}</view>
|
||||||
|
<view class="price" v-if="coupon.couponType =='DISCOUNT'">{{coupon.discount}}折</view>
|
||||||
<view class="text">满{{coupon.consumeThreshold}}元可用</view>
|
<view class="text">满{{coupon.consumeThreshold}}元可用</view>
|
||||||
<view class="bg-quan">
|
<view class="bg-quan">
|
||||||
券
|
券
|
||||||
@@ -13,11 +14,13 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="bottom-view">
|
<view class="bottom-view">
|
||||||
<view class="text">• 使用平台:{{
|
<view class="text">• 使用范围:{{
|
||||||
coupon.scopeType == 'ALL' && coupon.id == 'platform'
|
coupon.scopeType == 'ALL' && coupon.storeId == '0'
|
||||||
? "全平台"
|
? "全平台"
|
||||||
: coupon.scopeType == "PORTION_CATEGORY"
|
: coupon.scopeType == "PORTION_GOODS"
|
||||||
? "仅限品类"
|
? "部分商品"
|
||||||
|
: coupon.scopeType == "PORTION_GOODS_CATEGORY"
|
||||||
|
? "部分分类商品"
|
||||||
: coupon.storeName == 'platform' ? '全平台' :coupon.storeName+''
|
: coupon.storeName == 'platform' ? '全平台' :coupon.storeName+''
|
||||||
}}使用</view>
|
}}使用</view>
|
||||||
<view class="text">• 有效期至:{{coupon.endTime}}</view>
|
<view class="text">• 有效期至:{{coupon.endTime}}</view>
|
||||||
|
|||||||
@@ -1,12 +1,22 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
<u-tabs :list="list" :is-scroll="false" :active-color="lightColor" :current="current" @change="(i)=>{current = i}">
|
<u-tabs
|
||||||
|
:list="list"
|
||||||
|
:is-scroll="false"
|
||||||
|
:active-color="lightColor"
|
||||||
|
:current="current"
|
||||||
|
@change="
|
||||||
|
(i) => {
|
||||||
|
current = i;
|
||||||
|
}
|
||||||
|
"
|
||||||
|
>
|
||||||
</u-tabs>
|
</u-tabs>
|
||||||
|
|
||||||
<div class="empty" v-if="couponsList.length <= 0">
|
<div class="empty" v-if="couponsList.length <= 0">
|
||||||
<u-empty text="暂无优惠券" mode="coupon"></u-empty>
|
<u-empty text="暂无优惠券" mode="coupon"></u-empty>
|
||||||
</div>
|
</div>
|
||||||
<view class="coupon-item" v-for="(item, index) in couponsList" :key="index" >
|
<view class="coupon-item" v-for="(item, index) in couponsList" :key="index">
|
||||||
<view class="left">
|
<view class="left">
|
||||||
<view class="wave-line">
|
<view class="wave-line">
|
||||||
<view class="wave" v-for="(item, index) in 12" :key="index"></view>
|
<view class="wave" v-for="(item, index) in 12" :key="index"></view>
|
||||||
@@ -24,17 +34,29 @@
|
|||||||
<view class="right">
|
<view class="right">
|
||||||
<view class="desc">
|
<view class="desc">
|
||||||
<view v-if="item.scopeType">
|
<view v-if="item.scopeType">
|
||||||
<span v-if="item.scopeType == 'ALL' && item.id == 'platform'">全平台</span>
|
<span v-if="item.scopeType == 'ALL' && item.storeId == '0'">全平台</span>
|
||||||
<span v-if="item.scopeType == 'PORTION_CATEGORY'">仅限品类</span>
|
<span v-if="item.scopeType == 'PORTION_GOODS_CATEGORY'">仅限品类</span>
|
||||||
<view v-else>{{ item.storeName == 'platform' ? '全平台' :item.storeName+'店铺' }}使用</view>
|
<view v-else
|
||||||
|
>{{
|
||||||
|
item.storeName == "platform" ? "全平台" : item.storeName + "店铺"
|
||||||
|
}}使用</view
|
||||||
|
>
|
||||||
</view>
|
</view>
|
||||||
<view class="reason" v-if="item.reason">{{item.reason}}</view>
|
<view class="reason" v-if="item.reason">{{ item.reason }}</view>
|
||||||
<view class="end-time">有效期至:{{item.endTime}}</view>
|
<view class="end-time">有效期至:{{ item.endTime }}</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="receive" v-if="current ==0" @click="clickWay(item)">
|
<view
|
||||||
|
class="receive"
|
||||||
|
v-if="current == 0 && !routerVal.selectedCoupon.includes(item.id)"
|
||||||
|
@click="clickWay(item)"
|
||||||
|
>
|
||||||
<text>立即</text><br />
|
<text>立即</text><br />
|
||||||
<text>使用</text>
|
<text>使用</text>
|
||||||
</view>
|
</view>
|
||||||
|
<view class="used" v-if="current == 0 && routerVal.selectedCoupon.includes(item.id)" @click="clickWay(item)">
|
||||||
|
<text>取消</text><br />
|
||||||
|
<text>使用</text>
|
||||||
|
</view>
|
||||||
<view class="bg-quan">券</view>
|
<view class="bg-quan">券</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -69,6 +91,9 @@ export default {
|
|||||||
routerVal: "", //上级传参
|
routerVal: "", //上级传参
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
onLoad(options) {
|
||||||
|
this.routerVal = options;
|
||||||
|
},
|
||||||
watch: {
|
watch: {
|
||||||
current(val) {
|
current(val) {
|
||||||
console.log(this.$store.state.cantUseCoupons);
|
console.log(this.$store.state.cantUseCoupons);
|
||||||
@@ -80,6 +105,7 @@ export default {
|
|||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
this.init();
|
this.init();
|
||||||
|
console.log(this.routerVal);
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
@@ -95,7 +121,7 @@ export default {
|
|||||||
clickWay(coupon) {
|
clickWay(coupon) {
|
||||||
useCoupon({
|
useCoupon({
|
||||||
memberCouponId: coupon.id,
|
memberCouponId: coupon.id,
|
||||||
used: true,
|
used: !this.routerVal.selectedCoupon.includes(coupon.id),
|
||||||
way: this.routerVal.way,
|
way: this.routerVal.way,
|
||||||
}).then((res) => {
|
}).then((res) => {
|
||||||
if (res.data.success) {
|
if (res.data.success) {
|
||||||
@@ -114,10 +140,11 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.desc {
|
.desc {
|
||||||
height: 100%;
|
height: 220rpx;
|
||||||
|
flex: 2;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: center;
|
justify-content: space-around;
|
||||||
}
|
}
|
||||||
.end-time,
|
.end-time,
|
||||||
.reason {
|
.reason {
|
||||||
@@ -204,14 +231,14 @@ export default {
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
width: 450rpx;
|
width: 450rpx;
|
||||||
font-size: $font-sm;
|
font-size: $font-sm;
|
||||||
height: 100%;
|
height: 220rpx;
|
||||||
background-color: #ffffff;
|
background-color: #ffffff;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
position: relative;
|
position: relative;
|
||||||
> view:nth-child(1) {
|
> view:nth-child(1) {
|
||||||
color: #666666;
|
color: #666666;
|
||||||
margin-left: 20rpx;
|
margin-left: 20rpx;
|
||||||
line-height: 3em;
|
|
||||||
> view:nth-child(1) {
|
> view:nth-child(1) {
|
||||||
color: #ff6262;
|
color: #ff6262;
|
||||||
font-size: 30rpx;
|
font-size: 30rpx;
|
||||||
@@ -232,6 +259,20 @@ export default {
|
|||||||
z-index: 2;
|
z-index: 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.used {
|
||||||
|
color: #ffffff;
|
||||||
|
background-color: black;
|
||||||
|
border-radius: 50%;
|
||||||
|
width: 86rpx;
|
||||||
|
height: 86rpx;
|
||||||
|
text-align: center;
|
||||||
|
margin-right: 30rpx;
|
||||||
|
vertical-align: middle;
|
||||||
|
padding-top: 8rpx;
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
.bg-quan {
|
.bg-quan {
|
||||||
width: 244rpx;
|
width: 244rpx;
|
||||||
height: 244rpx;
|
height: 244rpx;
|
||||||
|
|||||||
@@ -2,26 +2,63 @@
|
|||||||
<view class="b-content">
|
<view class="b-content">
|
||||||
<view class="navbar">
|
<view class="navbar">
|
||||||
<!-- 循环出头部tab栏 -->
|
<!-- 循环出头部tab栏 -->
|
||||||
<view v-for="(item, index) in navList" :key="index" class="nav-item" @click="handleTabClick(index)"><text :class="{ current: tabCurrentIndex === index }">{{
|
<view
|
||||||
|
v-for="(item, index) in navList"
|
||||||
|
:key="index"
|
||||||
|
class="nav-item"
|
||||||
|
@click="handleTabClick(index)"
|
||||||
|
><text :class="{ current: tabCurrentIndex === index }">{{
|
||||||
item.text
|
item.text
|
||||||
}}</text></view>
|
}}</text></view
|
||||||
|
>
|
||||||
</view>
|
</view>
|
||||||
<swiper :current="tabCurrentIndex" class="swiper-box" duration="300" @change="changeTab">
|
<swiper
|
||||||
<swiper-item class="tab-content" v-for="(navItem, navIndex) in navList" :key="navIndex">
|
:current="tabCurrentIndex"
|
||||||
<scroll-view class="list-scroll-content" scroll-y @scrolltolower="loadData">
|
class="swiper-box"
|
||||||
|
duration="300"
|
||||||
|
@change="changeTab"
|
||||||
|
>
|
||||||
|
<swiper-item
|
||||||
|
class="tab-content"
|
||||||
|
v-for="(navItem, navIndex) in navList"
|
||||||
|
:key="navIndex"
|
||||||
|
>
|
||||||
|
<scroll-view
|
||||||
|
class="list-scroll-content"
|
||||||
|
scroll-y
|
||||||
|
@scrolltolower="loadData"
|
||||||
|
>
|
||||||
<!-- 空白页 -->
|
<!-- 空白页 -->
|
||||||
<u-empty mode="coupon" text="暂无优惠券了" v-if="navItem.wheterEmpty"></u-empty>
|
<u-empty
|
||||||
|
mode="coupon"
|
||||||
|
text="暂无优惠券了"
|
||||||
|
v-if="navItem.whetherEmpty"
|
||||||
|
></u-empty>
|
||||||
|
|
||||||
<!-- 数据 -->
|
<!-- 数据 -->
|
||||||
<view v-if="navItem.dataList && coupon" class="coupon-item" :class="{ 'coupon-used': navIndex != 0 }" v-for="(coupon, index) in navItem.dataList" :key="index">
|
<view
|
||||||
|
v-if="navItem.dataList && coupon"
|
||||||
|
class="coupon-item"
|
||||||
|
:class="{ 'coupon-used': navIndex != 0 }"
|
||||||
|
v-for="(coupon, index) in navItem.dataList"
|
||||||
|
:key="index"
|
||||||
|
>
|
||||||
<view class="left">
|
<view class="left">
|
||||||
<view class="wave-line">
|
<view class="wave-line">
|
||||||
<view class="wave" v-for="(item, index) in 12" :key="index"></view>
|
<view
|
||||||
|
class="wave"
|
||||||
|
v-for="(item, index) in 12"
|
||||||
|
:key="index"
|
||||||
|
></view>
|
||||||
</view>
|
</view>
|
||||||
<view class="message">
|
<view class="message">
|
||||||
<view class="price" v-if="coupon.couponType == 'DISCOUNT'">{{ coupon.discount }}折</view>
|
<view class="price" v-if="coupon.couponType == 'DISCOUNT'"
|
||||||
|
>{{ coupon.discount }}折</view
|
||||||
|
>
|
||||||
<view class="price" v-else>{{ coupon.price }}元</view>
|
<view class="price" v-else>{{ coupon.price }}元</view>
|
||||||
<view class="sub-price">满{{ coupon.consumeThreshold | unitPrice }}可用</view>
|
<view class="sub-price"
|
||||||
|
>满{{ coupon.consumeThreshold | unitPrice }}可用</view
|
||||||
|
>
|
||||||
</view>
|
</view>
|
||||||
<view class="circle circle-top"></view>
|
<view class="circle circle-top"></view>
|
||||||
<view class="circle circle-bottom"></view>
|
<view class="circle circle-bottom"></view>
|
||||||
@@ -29,27 +66,49 @@
|
|||||||
<view class="right" v-if="coupon">
|
<view class="right" v-if="coupon">
|
||||||
<view class="content">
|
<view class="content">
|
||||||
<view class="title-1">{{ coupon.title }}</view>
|
<view class="title-1">{{ coupon.title }}</view>
|
||||||
<view class="title-2">使用平台:{{
|
<view class="title-2"
|
||||||
coupon.scopeType == 'ALL' && coupon.id == 'platform'
|
>使用范围:{{
|
||||||
|
coupon.scopeType == "ALL" && coupon.storeId == "0"
|
||||||
? "全平台"
|
? "全平台"
|
||||||
: coupon.scopeType == "PORTION_CATEGORY"
|
: coupon.scopeType == "PORTION_GOODS"
|
||||||
? "仅限品类"
|
? "部分商品"
|
||||||
: coupon.storeName == 'platform' ? '全平台' :coupon.storeName+''
|
: coupon.scopeType == "PORTION_GOODS_CATEGORY"
|
||||||
}}使用</view>
|
? "部分分类商品"
|
||||||
<view v-if="coupon.endTime">{{
|
: coupon.storeName == "platform"
|
||||||
coupon.endTime
|
? "全平台"
|
||||||
}}</view>
|
: coupon.storeName + ""
|
||||||
<view @click="couponDetail(coupon)">详细说明
|
}}使用</view
|
||||||
<u-icon style="float: right; margin-top: 10rpx" name="arrow-right"></u-icon>
|
>
|
||||||
|
<view v-if="coupon.endTime">{{ coupon.endTime }}</view>
|
||||||
|
<view @click="couponDetail(coupon)"
|
||||||
|
>详细说明
|
||||||
|
<u-icon
|
||||||
|
style="float: right; margin-top: 10rpx"
|
||||||
|
name="arrow-right"
|
||||||
|
></u-icon>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="jiao-1" v-if="navIndex == 0">
|
<view class="jiao-1" v-if="navIndex == 0">
|
||||||
<text class="text-1">新到</text>
|
<text class="text-1">新到</text>
|
||||||
<text class="text-2" v-if="coupon.used_status == 1">将过期</text>
|
<text class="text-2" v-if="coupon.used_status == 1"
|
||||||
|
>将过期</text
|
||||||
|
>
|
||||||
</view>
|
</view>
|
||||||
<image class="no-icon" v-if="navIndex == 1" src="@/static/img/used.png"></image>
|
<image
|
||||||
<image class="no-icon" v-if="navIndex == 2" src="@/static/img/overdue.png"></image>
|
class="no-icon"
|
||||||
<view class="receive" v-if="navIndex == 0" @click="useItNow(coupon)">
|
v-if="navIndex == 1"
|
||||||
|
src="@/static/img/used.png"
|
||||||
|
></image>
|
||||||
|
<image
|
||||||
|
class="no-icon"
|
||||||
|
v-if="navIndex == 2"
|
||||||
|
src="@/static/img/overdue.png"
|
||||||
|
></image>
|
||||||
|
<view
|
||||||
|
class="receive"
|
||||||
|
v-if="navIndex == 0"
|
||||||
|
@click="useItNow(coupon)"
|
||||||
|
>
|
||||||
<text>立即</text><br />
|
<text>立即</text><br />
|
||||||
<text>使用</text>
|
<text>使用</text>
|
||||||
</view>
|
</view>
|
||||||
@@ -82,7 +141,7 @@ export default {
|
|||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
status: 1,
|
status: 1,
|
||||||
},
|
},
|
||||||
wheterEmpty: false,
|
whetherEmpty: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: "已使用",
|
text: "已使用",
|
||||||
@@ -94,7 +153,7 @@ export default {
|
|||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
status: 2,
|
status: 2,
|
||||||
},
|
},
|
||||||
wheterEmpty: false,
|
whetherEmpty: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: "已过期",
|
text: "已过期",
|
||||||
@@ -106,7 +165,7 @@ export default {
|
|||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
status: 3,
|
status: 3,
|
||||||
},
|
},
|
||||||
wheterEmpty: false,
|
whetherEmpty: false,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
couponList: [], //优惠券列表
|
couponList: [], //优惠券列表
|
||||||
@@ -114,6 +173,8 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
onShow() {
|
onShow() {
|
||||||
|
this.navList[this.tabCurrentIndex].params.pageNumber = 1;
|
||||||
|
this.navList[this.tabCurrentIndex].dataList = [];
|
||||||
this.getData();
|
this.getData();
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -147,7 +208,7 @@ export default {
|
|||||||
let data = res.data.result.records;
|
let data = res.data.result.records;
|
||||||
if (data.length == 0) {
|
if (data.length == 0) {
|
||||||
if (res.data.pageNumber == 1) {
|
if (res.data.pageNumber == 1) {
|
||||||
this.navList[index].wheterEmpty = true;
|
this.navList[index].whetherEmpty = true;
|
||||||
} else {
|
} else {
|
||||||
this.navList[index].loadStatus = "noMore";
|
this.navList[index].loadStatus = "noMore";
|
||||||
}
|
}
|
||||||
@@ -158,8 +219,7 @@ export default {
|
|||||||
this.navList[index].dataList.push(...data);
|
this.navList[index].dataList.push(...data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
console.log(this.navList[index].dataList)
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
uni.hideLoading();
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -185,15 +245,9 @@ export default {
|
|||||||
* 立即使用优惠券
|
* 立即使用优惠券
|
||||||
*/
|
*/
|
||||||
useItNow(item) {
|
useItNow(item) {
|
||||||
if (item.storeId) {
|
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
url: `/pages/product/shopPage?id=${item.storeId}`,
|
url: `/pages/navigation/search/searchPage?promotionsId=${item.couponId}&promotionType=COUPON`,
|
||||||
});
|
});
|
||||||
} else {
|
|
||||||
uni.switchTab({
|
|
||||||
url: "/pages/tabbar/home/index",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -104,7 +104,7 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
uni.redirectTo({
|
uni.navigateTo({
|
||||||
url: "/pages/order/myOrder?status=0",
|
url: "/pages/order/myOrder?status=0",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -139,6 +139,7 @@
|
|||||||
// 判断当前是否是充值
|
// 判断当前是否是充值
|
||||||
this.sn = this.routerVal.recharge_sn;
|
this.sn = this.routerVal.recharge_sn;
|
||||||
this.orderType = "RECHARGE";
|
this.orderType = "RECHARGE";
|
||||||
|
|
||||||
} else if (this.routerVal.trade_sn) {
|
} else if (this.routerVal.trade_sn) {
|
||||||
this.sn = this.routerVal.trade_sn;
|
this.sn = this.routerVal.trade_sn;
|
||||||
this.orderType = "TRADE";
|
this.orderType = "TRADE";
|
||||||
@@ -161,7 +162,7 @@
|
|||||||
});
|
});
|
||||||
// #endif
|
// #endif
|
||||||
|
|
||||||
// #ifndef MP-WEIXIN
|
|
||||||
if(this.routerVal.recharge_sn){
|
if(this.routerVal.recharge_sn){
|
||||||
this.payList = res.data.result.support.filter((item) => {
|
this.payList = res.data.result.support.filter((item) => {
|
||||||
return item != "WALLET";
|
return item != "WALLET";
|
||||||
@@ -170,7 +171,7 @@
|
|||||||
else{
|
else{
|
||||||
this.payList = res.data.result.support;
|
this.payList = res.data.result.support;
|
||||||
}
|
}
|
||||||
// #ifndef APP-PLUS
|
// #ifdef H5
|
||||||
//判断是否微信浏览器
|
//判断是否微信浏览器
|
||||||
var ua = window.navigator.userAgent.toLowerCase();
|
var ua = window.navigator.userAgent.toLowerCase();
|
||||||
if (ua.match(/MicroMessenger/i) == 'micromessenger') {
|
if (ua.match(/MicroMessenger/i) == 'micromessenger') {
|
||||||
@@ -178,11 +179,17 @@
|
|||||||
this.payList = res.data.result.support.filter((item) => {
|
this.payList = res.data.result.support.filter((item) => {
|
||||||
return item != "ALIPAY";
|
return item != "ALIPAY";
|
||||||
});
|
});
|
||||||
|
// 充值的话仅保留微信支付
|
||||||
|
if(this.orderType == "RECHARGE"){
|
||||||
|
this.payList = res.data.result.support.filter((item) => {
|
||||||
|
return item == "WECHAT";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
// #endif
|
// #endif
|
||||||
|
|
||||||
// #endif
|
|
||||||
|
|
||||||
|
|
||||||
this.walletValue = res.data.result.walletValue;
|
this.walletValue = res.data.result.walletValue;
|
||||||
@@ -227,12 +234,17 @@
|
|||||||
// 客户端类型 APP/NATIVE/JSAPI/H5
|
// 客户端类型 APP/NATIVE/JSAPI/H5
|
||||||
const paymentClient = this.paymentClient;
|
const paymentClient = this.paymentClient;
|
||||||
|
|
||||||
|
uni.showLoading({
|
||||||
|
title: "正在唤起支付...",
|
||||||
|
mask:true
|
||||||
|
});
|
||||||
|
|
||||||
// #ifdef APP-PLUS
|
// #ifdef APP-PLUS
|
||||||
//APP pay
|
//APP pay
|
||||||
// 初始化支付签名
|
// 初始化支付签名
|
||||||
await API_Trade.initiatePay(paymentMethod, paymentClient, params).then(
|
await API_Trade.initiatePay(paymentMethod, paymentClient, params).then(
|
||||||
(signXml) => {
|
(signXml) => {
|
||||||
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
//如果支付异常
|
//如果支付异常
|
||||||
if (!signXml.data.success) {
|
if (!signXml.data.success) {
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
@@ -245,19 +257,24 @@
|
|||||||
let payForm = signXml.data.result;
|
let payForm = signXml.data.result;
|
||||||
|
|
||||||
let paymentType = paymentMethod === "WECHAT" ? "wxpay" : "alipay";
|
let paymentType = paymentMethod === "WECHAT" ? "wxpay" : "alipay";
|
||||||
uni.requestPayment({
|
|
||||||
provider: paymentType,
|
if(paymentMethod === "WALLET"){
|
||||||
orderInfo: payForm,
|
uni.showToast({
|
||||||
success: (e) => {
|
icon: "none",
|
||||||
console.log(e);
|
title: "支付成功!",
|
||||||
|
});
|
||||||
|
this.callback(paymentMethod)
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
uni.requestPayment({
|
||||||
|
provider: paymentType,
|
||||||
|
orderInfo: payForm || '',
|
||||||
|
success: (e) => {
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
icon: "none",
|
icon: "none",
|
||||||
title: "支付成功!",
|
title: "支付成功!",
|
||||||
});
|
});
|
||||||
|
|
||||||
this.callback(paymentMethod)
|
this.callback(paymentMethod)
|
||||||
|
|
||||||
|
|
||||||
},
|
},
|
||||||
fail: (e) => {
|
fail: (e) => {
|
||||||
console.log(this);
|
console.log(this);
|
||||||
@@ -269,6 +286,7 @@
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
);
|
);
|
||||||
//APP pay
|
//APP pay
|
||||||
// #endif
|
// #endif
|
||||||
@@ -316,8 +334,25 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
} else {
|
} else {
|
||||||
window.location.href = JSON.parse(response.result).h5_url;
|
window.location.href = JSON.parse(response.result).h5_url;
|
||||||
|
const searchParams = {
|
||||||
|
...params,
|
||||||
|
price:this.cashierParams,
|
||||||
|
}
|
||||||
|
const timer = setInterval(()=>{
|
||||||
|
payCallback(searchParams).then(res=>{
|
||||||
|
if(res.data.result){
|
||||||
|
clearTimeout(timer);
|
||||||
|
uni.navigateTo({
|
||||||
|
url:"/pages/order/myOrder"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},3000)
|
||||||
|
|
||||||
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
}
|
}
|
||||||
} else if (paymentMethod === "WALLET") {
|
} else if (paymentMethod === "WALLET") {
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
@@ -412,7 +447,7 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
/deep/ .u-row {
|
::v-deep .u-row {
|
||||||
width: 100% !important;
|
width: 100% !important;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between !important;
|
justify-content: space-between !important;
|
||||||
|
|||||||
@@ -1,427 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="wrapper">
|
|
||||||
<u-popup class="popup" v-model="buyMask" :height="setup.height" closeable :mode="setup.mode"
|
|
||||||
:mask-close-able="isClose" :mask="isMask" :border-radius="setup.radius" @close="closeMask()">
|
|
||||||
<!-- 商品 -->
|
|
||||||
<view class="goods-box bottom">
|
|
||||||
<view class="goods-header">
|
|
||||||
<view class="goods-img">
|
|
||||||
<u-image width="200rpx" border-radius="20" class="uimage" height="200rpx"
|
|
||||||
:src="selectedSpecImg ? selectedSpecImg : goodsDetail.thumbnail"></u-image>
|
|
||||||
</view>
|
|
||||||
<view class="goods-skus">
|
|
||||||
<!-- 有活动商品价格 -->
|
|
||||||
<view class="goods-price " v-if="goodsDetail.promotionPrice">
|
|
||||||
<span>
|
|
||||||
¥
|
|
||||||
<span class="goods-price-promotionShow goods-price-bigshow"
|
|
||||||
v-if="goodsDetail.promotionPrice">{{ formatPrice(goodsDetail.promotionPrice)[0] }}</span>
|
|
||||||
.{{ formatPrice(goodsDetail.promotionPrice)[1] }}
|
|
||||||
<span></span>
|
|
||||||
</span>
|
|
||||||
<div class="promotion-box">
|
|
||||||
¥
|
|
||||||
<span class="goods-price-bigshow">{{
|
|
||||||
formatPrice(goodsDetail.price)[0]
|
|
||||||
}}</span>
|
|
||||||
.{{ formatPrice(goodsDetail.price)[1] }}
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</view>
|
|
||||||
<!-- 正常商品的价格 -->
|
|
||||||
<view class="goods-price" v-else>
|
|
||||||
<span>
|
|
||||||
¥
|
|
||||||
<span class="goods-price-bigshow">{{
|
|
||||||
formatPrice(goodsDetail.price)[0]
|
|
||||||
}}</span>
|
|
||||||
.{{ formatPrice(goodsDetail.price)[1] }}
|
|
||||||
</span>
|
|
||||||
</view>
|
|
||||||
<view class="goods-check-skus">
|
|
||||||
已选
|
|
||||||
<span class="goods-check-skus-name">
|
|
||||||
{{ selectName }}
|
|
||||||
<span>,{{ num }}个</span>
|
|
||||||
</span>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<!-- 商品信息 -->
|
|
||||||
<view class="goods-skus-box">
|
|
||||||
<!-- 规格 -->
|
|
||||||
<view class="goods-skus-view" :key="specIndex" v-for="(spec, specIndex) in formatList">
|
|
||||||
<view class="skus-view-list">
|
|
||||||
<view class="view-class-title">{{ spec.name }}</view>
|
|
||||||
<view :class="{ active: spec_val.value == currentSelceted[specIndex] }" class="skus-view-item"
|
|
||||||
v-for="(spec_val, spec_index) in spec.values" :key="spec_index"
|
|
||||||
@click="handleClickSpec(spec, specIndex, spec_val)">{{ spec_val.value }}</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<!-- 数量 -->
|
|
||||||
<view class="goods-skus-number">
|
|
||||||
<view class="view-class-title">数量</view>
|
|
||||||
<u-number-box :bg-color="numberBox.bgColor" :color="numberBox.color" :input-width="numberBox.width"
|
|
||||||
:input-height="numberBox.height" :size="numberBox.size" :min="1" v-model="num">
|
|
||||||
</u-number-box>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<!-- 按钮 -->
|
|
||||||
<view class="btns">
|
|
||||||
|
|
||||||
<view class="box-btn card" v-if="buyType != 'PINTUAN' && goodsDetail.goodsType!='VIRTUAL_GOODS'"
|
|
||||||
@click="addToCartOrBuy('cart')">加入购物车</view>
|
|
||||||
<view class="box-btn buy" @click="addToCartOrBuy('buy')">立即购买</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</u-popup>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<script>
|
|
||||||
import * as API_trade from "@/api/trade.js";
|
|
||||||
import setup from "./popup";
|
|
||||||
export default {
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
setup,
|
|
||||||
num: 1,
|
|
||||||
// 步进器的大小尺寸单位是 rpx
|
|
||||||
numberBox: {
|
|
||||||
width: "50",
|
|
||||||
height: "50",
|
|
||||||
size: "22",
|
|
||||||
color: "#333",
|
|
||||||
bgColor: "#fff",
|
|
||||||
},
|
|
||||||
selectName: "", //选中商品的昵称
|
|
||||||
selectSkuList: "", //选中商铺sku,
|
|
||||||
selectedSpecImg: "", //选中的图片路径
|
|
||||||
buyType: "", //用于存储促销,拼团等活动类型
|
|
||||||
parentOrder: "", //父级拼团活动的数据 - 如果是团员则有数据
|
|
||||||
formatList: [],
|
|
||||||
currentSelceted: [],
|
|
||||||
skuList: "",
|
|
||||||
isMask: false, //是否显示遮罩层
|
|
||||||
isClose: false, //是否可以点击遮罩关闭
|
|
||||||
};
|
|
||||||
},
|
|
||||||
props: [
|
|
||||||
"goodsDetail", //商品详情
|
|
||||||
"buyMask",
|
|
||||||
"selectedSku",
|
|
||||||
"goodsSpec",
|
|
||||||
"addr",
|
|
||||||
],
|
|
||||||
watch: {
|
|
||||||
buyType: {
|
|
||||||
handler(val) {
|
|
||||||
this.buyType = val;
|
|
||||||
},
|
|
||||||
immediate: true,
|
|
||||||
},
|
|
||||||
selectSkuList: {
|
|
||||||
handler(val, oldval) {
|
|
||||||
this.$emit("changed", val);
|
|
||||||
},
|
|
||||||
deep: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
// 格式化金钱 1999 --> [1999,00]
|
|
||||||
formatPrice(val) {
|
|
||||||
if (typeof val == "undefined") {
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
return val.toFixed(2).split(".");
|
|
||||||
},
|
|
||||||
|
|
||||||
closeMask() {
|
|
||||||
this.$emit("closeBuy", false);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**点击规格 */
|
|
||||||
handleClickSpec(val, index, specValue) {
|
|
||||||
this.$set(this.currentSelceted, index, specValue.value);
|
|
||||||
let selectedSkuId = this.goodsSpec.find((i) => {
|
|
||||||
let matched = true;
|
|
||||||
let specValues = i.specValues.filter((j) => j.specName !== "images");
|
|
||||||
for (let n = 0; n < specValues.length; n++) {
|
|
||||||
if (specValues[n].specValue !== this.currentSelceted[n]) {
|
|
||||||
matched = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (matched) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.selectSkuList = {
|
|
||||||
spec: {
|
|
||||||
specName: val.name,
|
|
||||||
specValue: specValue.value,
|
|
||||||
},
|
|
||||||
data: this.goodsDetail,
|
|
||||||
};
|
|
||||||
this.selectName = specValue.value;
|
|
||||||
|
|
||||||
this.$emit("handleClickSku", {
|
|
||||||
skuId: selectedSkuId.skuId,
|
|
||||||
goodsId: this.goodsDetail.goodsId,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 添加到购物车或购买
|
|
||||||
*/
|
|
||||||
addToCartOrBuy(val) {
|
|
||||||
if (!this.selectSkuList) {
|
|
||||||
uni.showToast({
|
|
||||||
title: "请选择规格商品",
|
|
||||||
icon: "none",
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let data = {
|
|
||||||
skuId: this.goodsDetail.id,
|
|
||||||
num: this.num,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (val == "cart") {
|
|
||||||
API_trade.addToCart(data).then((res) => {
|
|
||||||
if (res.data.code == 200) {
|
|
||||||
uni.showToast({
|
|
||||||
title: "商品已添加到购物车",
|
|
||||||
icon: "none",
|
|
||||||
});
|
|
||||||
|
|
||||||
this.$emit("queryCart");
|
|
||||||
this.closeMask();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
// 判断是否拼团商品
|
|
||||||
if (this.buyType) {
|
|
||||||
data.cartType = "PINTUAN";
|
|
||||||
} else if (this.goodsDetail.goodsType == "VIRTUAL_GOODS") {
|
|
||||||
data.cartType = "VIRTUAL";
|
|
||||||
} else {
|
|
||||||
data.cartType = "BUY_NOW";
|
|
||||||
}
|
|
||||||
|
|
||||||
API_trade.addToCart(data).then((res) => {
|
|
||||||
if (res.data.code == 200) {
|
|
||||||
uni.navigateTo({
|
|
||||||
url: `/pages/order/fillorder?way=${data.cartType}&addr=${
|
|
||||||
this.addr.id || ""
|
|
||||||
}&parentOrder=${encodeURIComponent(
|
|
||||||
JSON.stringify(this.parentOrder)
|
|
||||||
)}`,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 直接购买
|
|
||||||
*/
|
|
||||||
buy(data) {
|
|
||||||
API_trade.addToCart(data).then((res) => {
|
|
||||||
if (res.data.success) {
|
|
||||||
uni.navigateTo({
|
|
||||||
url: `/pages/order/fillorder?way=${
|
|
||||||
data.cartType
|
|
||||||
}&addr=${""}&parentOrder=${encodeURIComponent(
|
|
||||||
JSON.stringify(this.parentOrder)
|
|
||||||
)}`,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
formatSku(list) {
|
|
||||||
// 格式化数据
|
|
||||||
|
|
||||||
let arr = [{}];
|
|
||||||
list.forEach((item, index) => {
|
|
||||||
item.specValues.forEach((spec, specIndex) => {
|
|
||||||
let name = spec.specName;
|
|
||||||
let values = {
|
|
||||||
value: spec.specValue,
|
|
||||||
quantity: item.quantity,
|
|
||||||
};
|
|
||||||
if (name === "images") {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
arr.forEach((arrItem, arrIndex) => {
|
|
||||||
if (
|
|
||||||
arrItem.name == name &&
|
|
||||||
arrItem.values &&
|
|
||||||
!arrItem.values.find((i) => i.value === values.value)
|
|
||||||
) {
|
|
||||||
arrItem.values.push(values);
|
|
||||||
}
|
|
||||||
|
|
||||||
let keys = arr.map((key) => {
|
|
||||||
return key.name;
|
|
||||||
});
|
|
||||||
if (!keys.includes(name)) {
|
|
||||||
arr.push({
|
|
||||||
name: name,
|
|
||||||
values: [values],
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
arr.shift();
|
|
||||||
this.formatList = arr;
|
|
||||||
|
|
||||||
list.forEach((item) => {
|
|
||||||
if (item.skuId === this.goodsDetail.id) {
|
|
||||||
item.specValues
|
|
||||||
.filter((i) => i.specName !== "images")
|
|
||||||
.forEach((value, _index) => {
|
|
||||||
this.currentSelceted[_index] = value.specValue;
|
|
||||||
|
|
||||||
this.selectName = value.specValue;
|
|
||||||
|
|
||||||
this.selectSkuList = {
|
|
||||||
spec: value,
|
|
||||||
data: this.goodsDetail,
|
|
||||||
};
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
this.skuList = list;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
mounted() {
|
|
||||||
this.formatSku(this.goodsSpec);
|
|
||||||
|
|
||||||
console.log(this.goodsDetail);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
@import "./popup.scss";
|
|
||||||
|
|
||||||
.buy {
|
|
||||||
background-image: linear-gradient(135deg, #ffba0d, #ffc30d 69%, #ffcf0d);
|
|
||||||
box-shadow: 0 2px 6px 0 rgba(255, 65, 66, 0.2);
|
|
||||||
}
|
|
||||||
|
|
||||||
.card {
|
|
||||||
background-image: linear-gradient(135deg, #f2140c, #f2270c 70%, #f24d0c);
|
|
||||||
box-shadow: 0 2px 6px 0 rgba(255, 65, 66, 0.2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/deep/.u-icon-plus,
|
|
||||||
.u-icon-minus,
|
|
||||||
.u-icon-disabled {
|
|
||||||
height: 30rpx !important;
|
|
||||||
background: #fff !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.goods-skus-number {
|
|
||||||
justify-content: space-between;
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
|
|
||||||
/deep/ .uni-scroll-view {
|
|
||||||
overflow: hidden !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.active {
|
|
||||||
background: $price-light-color !important;
|
|
||||||
border: 2rpx solid $price-color;
|
|
||||||
font-weight: bold;
|
|
||||||
color: $price-color !important;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
.goods-skus-box {
|
|
||||||
overflow-y: auto;
|
|
||||||
height: 610rpx;
|
|
||||||
// #ifdef MP-WEIXIN
|
|
||||||
height: 570rpx;
|
|
||||||
// #endif
|
|
||||||
margin-bottom: 10rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.goods-skus-view {
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
.skus-view-list {
|
|
||||||
> .skus-view-item {
|
|
||||||
flex: 1;
|
|
||||||
padding: 0 36rpx;
|
|
||||||
|
|
||||||
overflow: hidden;
|
|
||||||
height: 60rpx;
|
|
||||||
line-height: 60rpx;
|
|
||||||
float: left;
|
|
||||||
text-align: center;
|
|
||||||
margin-left: 24rpx;
|
|
||||||
margin-bottom: 20rpx;
|
|
||||||
font-size: 22rpx;
|
|
||||||
color: #262626;
|
|
||||||
background: #f2f2f2;
|
|
||||||
border-radius: 30rpx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.goods-header {
|
|
||||||
height: 200rpx;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
margin-bottom: 36rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.goods-box {
|
|
||||||
padding: 50rpx 36rpx 0 36rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.goods-skus {
|
|
||||||
padding: 0 20rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.goods-price {
|
|
||||||
color: $price-color;
|
|
||||||
line-height: 80rpx;
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
.promotion-box {
|
|
||||||
line-height: 1;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
text-decoration: line-through;
|
|
||||||
color: #999;
|
|
||||||
margin-left: 10rpx;
|
|
||||||
/deep/ span {
|
|
||||||
font-size: 30rpx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.promotion {
|
|
||||||
font-size: 30rpx;
|
|
||||||
}
|
|
||||||
.goods-price-promotionShow {
|
|
||||||
font-size: 48rpx;
|
|
||||||
}
|
|
||||||
.goods-check-skus {
|
|
||||||
font-size: 24rpx;
|
|
||||||
color: #999;
|
|
||||||
> .goods-check-skus-name {
|
|
||||||
margin-left: 4rpx;
|
|
||||||
}
|
|
||||||
> span {
|
|
||||||
color: #333;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
export default {
|
|
||||||
height:"1000rpx", //弹出层高度
|
|
||||||
mode:"bottom", //弹出层位置
|
|
||||||
radius:"32", //圆角 rpx,
|
|
||||||
close:false //能否点击遮罩退出
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
.view-class-title {
|
|
||||||
font-size: 26rpx;
|
|
||||||
color: #262626;
|
|
||||||
|
|
||||||
font-weight: 700;
|
|
||||||
height: 80rpx;
|
|
||||||
line-height: 80rpx;
|
|
||||||
}
|
|
||||||
.confirmBtn {
|
|
||||||
width: 90%;
|
|
||||||
}
|
|
||||||
.confirmBtn,
|
|
||||||
.box-btn {
|
|
||||||
line-height: 80rpx;
|
|
||||||
height: 80rpx;
|
|
||||||
|
|
||||||
background: $price-color;
|
|
||||||
color: #fff;
|
|
||||||
border-radius: 200px;
|
|
||||||
text-align: center;
|
|
||||||
margin: 5rpx auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btns {
|
|
||||||
display: flex;
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
.goods-price-bigshow {
|
|
||||||
font-size: 48rpx;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
.box-btn {
|
|
||||||
flex: 1;
|
|
||||||
margin: 0 10rpx;
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="wrapper" v-if="flage">
|
<view class="wrapper" v-if="flag">
|
||||||
<div class='goods' v-if="selectedGoods">
|
<div class='goods' v-if="selectedGoods">
|
||||||
<image class="goods-image" :src="selectedGoods.thumbnail" alt="">
|
<image class="goods-image" :src="selectedGoods.thumbnail" alt="">
|
||||||
<p class="goodsName">{{selectedGoods.goodsName}}</p>
|
<p class="goodsName">{{selectedGoods.goodsName}}</p>
|
||||||
@@ -14,6 +14,9 @@
|
|||||||
<span v-if="isBuy &&!master.toBeGroupedNum >0">
|
<span v-if="isBuy &&!master.toBeGroupedNum >0">
|
||||||
已成功拼团
|
已成功拼团
|
||||||
</span>
|
</span>
|
||||||
|
<span v-if="!master.toBeGroupedNum >0">
|
||||||
|
拼团已结束
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="isMaster && !isOver">
|
<div v-if="isMaster && !isOver">
|
||||||
@@ -24,7 +27,7 @@
|
|||||||
去首页逛逛
|
去首页逛逛
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="!isMaster && !isOver && !isBuy">
|
<div v-if="!isMaster && !isOver && !isBuy && master.toBeGroupedNum">
|
||||||
<div class="share-user" @click="toBuy">
|
<div class="share-user" @click="toBuy">
|
||||||
参与拼团
|
参与拼团
|
||||||
</div>
|
</div>
|
||||||
@@ -45,7 +48,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 倒计时 -->
|
<!-- 倒计时 -->
|
||||||
<div class="count-down" v-if="!isOver">
|
<div class="count-down" v-if="!isOver && master.toBeGroupedNum">
|
||||||
<u-count-down bg-color="#ededed" :hide-zero-day="true" @end="isOver" :timestamp="timeStamp"></u-count-down>
|
<u-count-down bg-color="#ededed" :hide-zero-day="true" @end="isOver" :timestamp="timeStamp"></u-count-down>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -58,7 +61,7 @@
|
|||||||
|
|
||||||
<popupGoods :addr="addr" ref="popupGoods" :buyMask="maskFlag" @closeBuy="closePopupBuy" :goodsDetail="goodsDetail" :goodsSpec="goodsSpec" v-if="goodsDetail.id " @handleClickSku="getGoodsDetail" />
|
<popupGoods :addr="addr" ref="popupGoods" :buyMask="maskFlag" @closeBuy="closePopupBuy" :goodsDetail="goodsDetail" :goodsSpec="goodsSpec" v-if="goodsDetail.id " @handleClickSku="getGoodsDetail" />
|
||||||
<shares @close="closeShare" :link="'/pages/cart/payment/shareOrderGoods?sn='+this.routers.sn+'&sku='+this.routers.sku+'&goodsId='+this.routers.goodsId" type="pintuan"
|
<shares @close="closeShare" :link="'/pages/cart/payment/shareOrderGoods?sn='+this.routers.sn+'&sku='+this.routers.sku+'&goodsId='+this.routers.goodsId" type="pintuan"
|
||||||
:thumbnail="data.promotionGoods.thumbnail" :goodsName="data.promotionGoods.goodsName" v-if="shareFlage " />
|
:thumbnail="data.promotionGoods.thumbnail" :goodsName="data.promotionGoods.goodsName" v-if="shareFlag " />
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -72,13 +75,13 @@ import popupGoods from "@/components/m-buy/goods"; //购物车商品的模块
|
|||||||
export default {
|
export default {
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
flage: false, //判断接口是否正常请求
|
flag: false, //判断接口是否正常请求
|
||||||
addr: {
|
addr: {
|
||||||
id: "",
|
id: "",
|
||||||
},
|
},
|
||||||
maskFlag: false, //商品弹框
|
maskFlag: false, //商品弹框
|
||||||
timeStamp: 0,
|
timeStamp: 0,
|
||||||
shareFlage: false,
|
shareFlag: false,
|
||||||
data: "",
|
data: "",
|
||||||
isMaster: true,
|
isMaster: true,
|
||||||
selectedGoods: "", //选择的商品规格昵称
|
selectedGoods: "", //选择的商品规格昵称
|
||||||
@@ -116,7 +119,7 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
closeShare() {
|
closeShare() {
|
||||||
this.shareFlage = false;
|
this.shareFlag = false;
|
||||||
},
|
},
|
||||||
// 这里的话得先跳到商品详情才能购买商品
|
// 这里的话得先跳到商品详情才能购买商品
|
||||||
toBuy() {
|
toBuy() {
|
||||||
@@ -131,7 +134,7 @@ export default {
|
|||||||
},
|
},
|
||||||
// 分享
|
// 分享
|
||||||
share() {
|
share() {
|
||||||
this.shareFlage = true;
|
this.shareFlag = true;
|
||||||
},
|
},
|
||||||
closePopupBuy(val) {
|
closePopupBuy(val) {
|
||||||
this.maskFlag = false;
|
this.maskFlag = false;
|
||||||
@@ -140,7 +143,7 @@ export default {
|
|||||||
async init(sn, sku) {
|
async init(sn, sku) {
|
||||||
let res = await getPinTuanShare(sn, sku);
|
let res = await getPinTuanShare(sn, sku);
|
||||||
if (res.data.success && res.data.result.promotionGoods) {
|
if (res.data.success && res.data.result.promotionGoods) {
|
||||||
this.flage = true;
|
this.flag = true;
|
||||||
this.data = res.data.result;
|
this.data = res.data.result;
|
||||||
this.selectedGoods = res.data.result.promotionGoods;
|
this.selectedGoods = res.data.result.promotionGoods;
|
||||||
let endTime = Date.parse(
|
let endTime = Date.parse(
|
||||||
@@ -204,7 +207,7 @@ export default {
|
|||||||
this.goodsDetail = response.data.result.data;
|
this.goodsDetail = response.data.result.data;
|
||||||
this.selectedGoods = response.data.result.data;
|
this.selectedGoods = response.data.result.data;
|
||||||
this.goodsSpec = response.data.result.specs;
|
this.goodsSpec = response.data.result.specs;
|
||||||
uni.hideLoading();
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
this.PromotionList = response.data.result.promotionMap;
|
this.PromotionList = response.data.result.promotionMap;
|
||||||
|
|
||||||
// 判断是否拼团活动 如果有则显示拼团活动信息
|
// 判断是否拼团活动 如果有则显示拼团活动信息
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
¥{{ Number(payPrice) | unitPrice }}
|
¥{{ Number(payPrice) | unitPrice }}
|
||||||
</div>
|
</div>
|
||||||
<div class="pay-btns">
|
<div class="pay-btns">
|
||||||
<div v-show="!from" @click="checkOrder">查看{{this.orderType == "RECHARGE" ? '余额' : '订单'}}</div>
|
<div v-show="!from" @click="checkOrder">查看{{ this.orderType == "RECHARGE" ? '余额' : '订单' }}</div>
|
||||||
<div @click="navigateTo('/pages/tabbar/home/index', 'switch')">回到首页</div>
|
<div @click="navigateTo('/pages/tabbar/home/index', 'switch')">回到首页</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
<div>
|
<div>
|
||||||
支付方式:
|
支付方式:
|
||||||
</div>
|
</div>
|
||||||
<div>{{paymentMethod | paymentTypeFilter}}</div>
|
<div>{{ paymentMethod | paymentTypeFilter }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -60,7 +60,7 @@ export default {
|
|||||||
this.from = options.from || "";
|
this.from = options.from || "";
|
||||||
this.payPrice = options.payPrice || 0;
|
this.payPrice = options.payPrice || 0;
|
||||||
this.orderType = options.orderType;
|
this.orderType = options.orderType;
|
||||||
// this.sendMessage()
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
checkOrder() {
|
checkOrder() {
|
||||||
@@ -77,11 +77,6 @@ export default {
|
|||||||
this.navigateTo("/pages/order/myOrder?status=0");
|
this.navigateTo("/pages/order/myOrder?status=0");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
changeStatus(val) {
|
|
||||||
if (val) {
|
|
||||||
this.sendMessage();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
navigateTo(url, type) {
|
navigateTo(url, type) {
|
||||||
if (type === "switch") {
|
if (type === "switch") {
|
||||||
@@ -105,6 +100,7 @@ export default {
|
|||||||
padding: 0 20rpx 20rpx;
|
padding: 0 20rpx 20rpx;
|
||||||
width: 80%;
|
width: 80%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pay-btns {
|
.pay-btns {
|
||||||
display: flex;
|
display: flex;
|
||||||
width: 50%;
|
width: 50%;
|
||||||
@@ -112,7 +108,7 @@ export default {
|
|||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
|
|
||||||
> div {
|
>div {
|
||||||
padding: 6px 12px;
|
padding: 6px 12px;
|
||||||
border: 1px solid #fff;
|
border: 1px solid #fff;
|
||||||
border-radius: 100px;
|
border-radius: 100px;
|
||||||
@@ -146,7 +142,7 @@ export default {
|
|||||||
border-radius: 20rpx;
|
border-radius: 20rpx;
|
||||||
background: rgba($color: $main-color, $alpha: 0.2);
|
background: rgba($color: $main-color, $alpha: 0.2);
|
||||||
|
|
||||||
> h2 {
|
>h2 {
|
||||||
margin-top: 20rpx;
|
margin-top: 20rpx;
|
||||||
font-size: 40rpx;
|
font-size: 40rpx;
|
||||||
color: $main-color;
|
color: $main-color;
|
||||||
|
|||||||
@@ -2,9 +2,11 @@
|
|||||||
<view class="add-address">
|
<view class="add-address">
|
||||||
<div class="uForm">
|
<div class="uForm">
|
||||||
<u-form :border-bottom="false" :model="form" ref="uForm" :error-type="['toast']" :rule="rules">
|
<u-form :border-bottom="false" :model="form" ref="uForm" :error-type="['toast']" :rule="rules">
|
||||||
|
<!-- #ifndef H5 -->
|
||||||
<view class="selectAddress" @click="clickUniMap">
|
<view class="selectAddress" @click="clickUniMap">
|
||||||
选择收货地址
|
选择收货地址
|
||||||
</view>
|
</view>
|
||||||
|
<!-- #endif -->
|
||||||
<u-form-item class="border" label="收货人" label-width="130" prop="name">
|
<u-form-item class="border" label="收货人" label-width="130" prop="name">
|
||||||
<u-input v-model="form.name" clearable placeholder="请输入收货人姓名" />
|
<u-input v-model="form.name" clearable placeholder="请输入收货人姓名" />
|
||||||
</u-form-item>
|
</u-form-item>
|
||||||
@@ -13,7 +15,9 @@
|
|||||||
<u-input v-model="form.mobile" type="number" maxlength="11" placeholder="请输入收货人手机号码" />
|
<u-input v-model="form.mobile" type="number" maxlength="11" placeholder="请输入收货人手机号码" />
|
||||||
</u-form-item>
|
</u-form-item>
|
||||||
<u-form-item label="所在区域" label-width="130" prop="___path">
|
<u-form-item label="所在区域" label-width="130" prop="___path">
|
||||||
<u-input v-model="form.___path" type="select" @click="showPicker" placeholder="请选择所在地区" />
|
<div @click="showPicker" >
|
||||||
|
{{ form.___path || '请选择所在地区' }}
|
||||||
|
</div>
|
||||||
</u-form-item>
|
</u-form-item>
|
||||||
<u-form-item class="detailAddress" label="详细地址" label-width="130" prop="detail">
|
<u-form-item class="detailAddress" label="详细地址" label-width="130" prop="detail">
|
||||||
<u-input type="textarea" v-model="form.detail" maxlength="100" height="150" placeholder="街道楼牌号等" />
|
<u-input type="textarea" v-model="form.detail" maxlength="100" height="150" placeholder="街道楼牌号等" />
|
||||||
@@ -28,20 +32,21 @@
|
|||||||
<div class="saveBtn" @click="save">保存</div>
|
<div class="saveBtn" @click="save">保存</div>
|
||||||
</u-form>
|
</u-form>
|
||||||
|
|
||||||
<m-city :provinceData="list" headTitle="区域选择" ref="cityPicker" @funcValue="getpickerParentValue" pickerSize="4"></m-city>
|
<m-city :provinceData="list" headTitle="区域选择" ref="cityPicker" @funcValue="getpickerParentValue" pickerSize="4">
|
||||||
|
</m-city>
|
||||||
|
|
||||||
<uniMap v-if="mapFlage" @close="closeMap" @callback="callBackAddress" />
|
<uniMap v-if="mapFlag" @close="closeMap" @callback="callBackAddress" />
|
||||||
</div>
|
</div>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { addAddress, editAddress, getAddressDetail } from "@/api/address.js";
|
import { addAddress, editAddress, getAddressDetail } from "@/api/address.js";
|
||||||
import gkcity from "@/components/m-city/m-city.vue";
|
import city from "@/components/m-city/m-city.vue";
|
||||||
import uniMap from "./uniMap";
|
import uniMap from "@/components/uniMap";
|
||||||
import permision from "@/js_sdk/wa-permission/permission.js";
|
import permision from "@/js_sdk/wa-permission/permission.js";
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
"m-city": gkcity,
|
"m-city": city,
|
||||||
uniMap,
|
uniMap,
|
||||||
},
|
},
|
||||||
onShow() {
|
onShow() {
|
||||||
@@ -50,7 +55,7 @@ export default {
|
|||||||
methods: {
|
methods: {
|
||||||
// 关闭地图
|
// 关闭地图
|
||||||
closeMap() {
|
closeMap() {
|
||||||
this.mapFlage = false;
|
this.mapFlag = false;
|
||||||
},
|
},
|
||||||
// 打开地图并访问权限
|
// 打开地图并访问权限
|
||||||
clickUniMap() {
|
clickUniMap() {
|
||||||
@@ -58,8 +63,8 @@ export default {
|
|||||||
if (plus.os.name == "iOS") {
|
if (plus.os.name == "iOS") {
|
||||||
// ios系统
|
// ios系统
|
||||||
permision.judgeIosPermission("location")
|
permision.judgeIosPermission("location")
|
||||||
? (this.mapFlage = true)
|
? (this.mapFlag = true)
|
||||||
: this.refuseMapOuther();
|
: this.refuseMap();
|
||||||
} else {
|
} else {
|
||||||
// 安卓
|
// 安卓
|
||||||
this.requestAndroidPermission(
|
this.requestAndroidPermission(
|
||||||
@@ -69,12 +74,12 @@ export default {
|
|||||||
// #endif
|
// #endif
|
||||||
|
|
||||||
// #ifndef APP-PLUS
|
// #ifndef APP-PLUS
|
||||||
this.mapFlage = true;
|
this.mapFlag = true;
|
||||||
// #endif
|
// #endif
|
||||||
},
|
},
|
||||||
|
|
||||||
// 如果拒绝权限 提示区设置
|
// 如果拒绝权限 提示区设置
|
||||||
refuseMapOuther() {
|
refuseMap() {
|
||||||
uni.showModal({
|
uni.showModal({
|
||||||
title: "温馨提示",
|
title: "温馨提示",
|
||||||
content: "您已拒绝定位,请开启",
|
content: "您已拒绝定位,请开启",
|
||||||
@@ -110,14 +115,15 @@ export default {
|
|||||||
var result = await permision.requestAndroidPermission(permisionID);
|
var result = await permision.requestAndroidPermission(permisionID);
|
||||||
|
|
||||||
if (result == 1) {
|
if (result == 1) {
|
||||||
this.mapFlage = true;
|
this.mapFlag = true;
|
||||||
} else {
|
} else {
|
||||||
this.refuseMapOuther();
|
this.refuseMap();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// 选择地址后数据的回调
|
// 选择地址后数据的回调
|
||||||
callBackAddress(val) {
|
callBackAddress(val) {
|
||||||
|
console.log(val)
|
||||||
uni.showLoading({
|
uni.showLoading({
|
||||||
title: "加载中",
|
title: "加载中",
|
||||||
});
|
});
|
||||||
@@ -133,7 +139,7 @@ export default {
|
|||||||
uni.hideLoading();
|
uni.hideLoading();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.mapFlage = !this.mapFlage; //关闭地图
|
this.mapFlag = !this.mapFlag; //关闭地图
|
||||||
},
|
},
|
||||||
|
|
||||||
// 保存当前 地址
|
// 保存当前 地址
|
||||||
@@ -159,9 +165,7 @@ export default {
|
|||||||
delete this.form.updateTime;
|
delete this.form.updateTime;
|
||||||
editAddress(this.form).then((res) => {
|
editAddress(this.form).then((res) => {
|
||||||
if (res.data.success) {
|
if (res.data.success) {
|
||||||
uni.navigateTo({
|
uni.navigateBack();
|
||||||
url: `/${beforePage.route}`,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -190,8 +194,8 @@ export default {
|
|||||||
return _child.id == item.id;
|
return _child.id == item.id;
|
||||||
});
|
});
|
||||||
|
|
||||||
this.form.lat = _town[0].center.split(",")[0];
|
this.form.lat = _town[0].center.split(",")[1];
|
||||||
this.form.lon = _town[0].center.split(",")[1];
|
this.form.lon = _town[0].center.split(",")[0];
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@@ -205,7 +209,7 @@ export default {
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
lightColor: this.$lightColor, //高亮颜色
|
lightColor: this.$lightColor, //高亮颜色
|
||||||
mapFlage: false, // 地图选择开
|
mapFlag: false, // 地图选择开
|
||||||
routerVal: "",
|
routerVal: "",
|
||||||
form: {
|
form: {
|
||||||
detail: "", //地址详情
|
detail: "", //地址详情
|
||||||
@@ -275,7 +279,7 @@ export default {
|
|||||||
params.___path = params.consigneeAddressPath;
|
params.___path = params.consigneeAddressPath;
|
||||||
this.$set(this, "form", params);
|
this.$set(this, "form", params);
|
||||||
|
|
||||||
uni.hideLoading();
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
uni.hideLoading();
|
uni.hideLoading();
|
||||||
@@ -288,7 +292,7 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.detailAddress {
|
.detailAddress {
|
||||||
/deep/ .u-form-item--left {
|
::v-deep .u-form-item--left {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
}
|
}
|
||||||
@@ -328,7 +332,7 @@ export default {
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
padding-top: 3%;
|
padding-top: 3%;
|
||||||
|
|
||||||
/deep/ .u-form-item {
|
::v-deep .u-form-item {
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
padding: 24rpx 30rpx;
|
padding: 24rpx 30rpx;
|
||||||
}
|
}
|
||||||
@@ -337,7 +341,7 @@ export default {
|
|||||||
background-color: $main-color;
|
background-color: $main-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
/deep/.u-checkbox {
|
::v-deep.u-checkbox {
|
||||||
margin: 30rpx 30rpx 0 30rpx;
|
margin: 30rpx 30rpx 0 30rpx;
|
||||||
|
|
||||||
.u-label-class.u-checkbox__label {
|
.u-label-class.u-checkbox__label {
|
||||||
@@ -346,7 +350,7 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/deep/ .u-checkbox__label {
|
::v-deep .u-checkbox__label {
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ export default {
|
|||||||
this.addressList = res.data.result.records;
|
this.addressList = res.data.result.records;
|
||||||
console.log(this.addressList);
|
console.log(this.addressList);
|
||||||
|
|
||||||
uni.hideLoading();
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
//删除地址
|
//删除地址
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="address">
|
<view class="address">
|
||||||
<u-empty class="empty" v-if="this.addressList == 0" text="暂无收货地址" mode="address"></u-empty>
|
<u-empty class="empty" v-if="this.addressList.length === 0" text="暂无收货地址" mode="address"></u-empty>
|
||||||
<view class="list" >
|
<view class="list" >
|
||||||
<view class="item c-content" v-for="(item, index) in addressList" :key="index">
|
<view class="item c-content" v-for="(item, index) in addressList" :key="index">
|
||||||
<view class="basic">
|
<view class="basic">
|
||||||
@@ -86,22 +86,8 @@ export default {
|
|||||||
* 进入页面检测当前账户是否登录
|
* 进入页面检测当前账户是否登录
|
||||||
*/
|
*/
|
||||||
onShow() {
|
onShow() {
|
||||||
let that = this;
|
if (this.$options.filters.tipsToLogin()) {
|
||||||
if (this.$options.filters.isLogin("auth")) {
|
|
||||||
this.getAddressList();
|
this.getAddressList();
|
||||||
} else {
|
|
||||||
uni.showModal({
|
|
||||||
title: "提示",
|
|
||||||
content: "检测到您的账号还未登录,是否去登录?",
|
|
||||||
confirmColor: this.$lightColor,
|
|
||||||
success: function (res) {
|
|
||||||
if (res.confirm) {
|
|
||||||
that.$options.filters.navigateToLogin();
|
|
||||||
} else if (res.cancel) {
|
|
||||||
uni.navigateBack();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -117,7 +103,7 @@ export default {
|
|||||||
});
|
});
|
||||||
this.addressList = res.data.result.records;
|
this.addressList = res.data.result.records;
|
||||||
|
|
||||||
uni.hideLoading();
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
//删除地址
|
//删除地址
|
||||||
|
|||||||
88
pages/mine/address/storeAddress.vue
Normal file
88
pages/mine/address/storeAddress.vue
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
<template>
|
||||||
|
<view class="address">
|
||||||
|
|
||||||
|
<u-empty class="empty" v-if="storeAddressList.length == 0" text="暂无自提地址" mode="address"></u-empty>
|
||||||
|
<view class="list" v-else>
|
||||||
|
<view class="item c-content" v-for="(item, index) in storeAddressList" :key="index">
|
||||||
|
<view class="basic" @click="selectAddressData(item)">
|
||||||
|
<text>{{ item.addressName }}</text>
|
||||||
|
<text>{{ item.mobile }}</text>
|
||||||
|
<view>
|
||||||
|
<div class="region">
|
||||||
|
<span>{{ item.address }}</span>
|
||||||
|
</div>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view style="height: 100px"></view>
|
||||||
|
</view>
|
||||||
|
<u-action-sheet :list="removeList" :tips="tips" v-model="showAction" @click="deleteAddressMessage"></u-action-sheet>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import * as API_Trade from "@/api/trade";
|
||||||
|
import * as API_Store from "@/api/store.js";
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
storeAddressList: [], //地址列表
|
||||||
|
showAction: false, //是否显示下栏框
|
||||||
|
removeList: [
|
||||||
|
{
|
||||||
|
text: "确定",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
tips: {
|
||||||
|
text: "确定要删除该收货人信息吗?",
|
||||||
|
},
|
||||||
|
removeId: "", //删除的地址id
|
||||||
|
routerVal: "",
|
||||||
|
params: {
|
||||||
|
pageNumber: 1,
|
||||||
|
pageSize: 1000,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
},
|
||||||
|
onPullDownRefresh() {
|
||||||
|
//下拉刷新
|
||||||
|
this.storeAddressList = [];
|
||||||
|
this.getAddressList();
|
||||||
|
},
|
||||||
|
onLoad: function (val) {
|
||||||
|
this.routerVal = val;
|
||||||
|
},
|
||||||
|
onShow() {
|
||||||
|
this.storeAddressList = [];
|
||||||
|
this.getAddressList();
|
||||||
|
},
|
||||||
|
onHide() {},
|
||||||
|
methods: {
|
||||||
|
async selectAddressData(val) {
|
||||||
|
await API_Trade.setStoreAddressId(val.id, this.routerVal.way);
|
||||||
|
|
||||||
|
uni.navigateBack({
|
||||||
|
delta: 1,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
//获取地址列表
|
||||||
|
getAddressList() {
|
||||||
|
uni.showLoading();
|
||||||
|
|
||||||
|
API_Store.getStoreAddress(
|
||||||
|
this.routerVal.storeId,
|
||||||
|
this.params
|
||||||
|
).then((res) => {
|
||||||
|
this.storeAddressList = res.data.result.records;
|
||||||
|
console.log(this.storeAddressList);
|
||||||
|
|
||||||
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
@import "./address.scss";
|
||||||
|
</style>
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="wap">
|
<view class="wap">
|
||||||
<u-navbar back-text="" title="预存款列表">
|
<u-navbar title="预存款列表">
|
||||||
</u-navbar>
|
</u-navbar>
|
||||||
<view class="wrapper-show-money">
|
<view class="wrapper-show-money">
|
||||||
<view class="money-view">
|
<view class="money-view">
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
<swiper class="swiper-box" :current="swiperCurrent">
|
<swiper class="swiper-box" :current="swiperCurrent">
|
||||||
<swiper-item class="swiper-item" v-for="index in list.length" :key="index">
|
<swiper-item class="swiper-item" v-for="index in list.length" :key="index">
|
||||||
<scroll-view class="scroll-v view-wrapper" enableBackToTop="true" scroll-with-animation scroll-y @scrolltolower="loadMore">
|
<scroll-view class="scroll-v view-wrapper" enableBackToTop="true" scroll-with-animation scroll-y @scrolltolower="loadMore">
|
||||||
<view v-if="datas.length!=0" class="view-item" v-for="(logItem, logIndex) in datas" :key="logIndex">
|
<view v-if="depositData.length!=0" class="view-item" v-for="(logItem, logIndex) in depositData" :key="logIndex">
|
||||||
<view class="view-item-detail">
|
<view class="view-item-detail">
|
||||||
<view class="-title">{{logItem.detail}}</view>
|
<view class="-title">{{logItem.detail}}</view>
|
||||||
<!-- <view class="-number">{{logItem.detail}}</view> -->
|
<!-- <view class="-number">{{logItem.detail}}</view> -->
|
||||||
@@ -27,8 +27,8 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<u-empty v-if="datas.length==0" mode="history" text="暂无记录" />
|
<u-empty v-if="depositData.length==0" mode="history" text="暂无记录" />
|
||||||
<u-loadmore v-else bg-color='#f8f8f8' :status="status" />
|
|
||||||
</scroll-view>
|
</scroll-view>
|
||||||
|
|
||||||
</swiper-item>
|
</swiper-item>
|
||||||
@@ -45,7 +45,6 @@ export default {
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
walletNum: 0,
|
walletNum: 0,
|
||||||
status: "loadmore",
|
|
||||||
current: 0,
|
current: 0,
|
||||||
swiperCurrent: 0,
|
swiperCurrent: 0,
|
||||||
userInfo: "", //用户详情信息
|
userInfo: "", //用户详情信息
|
||||||
@@ -54,7 +53,7 @@ export default {
|
|||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
order: "desc",
|
order: "desc",
|
||||||
},
|
},
|
||||||
datas: [], //遍历的数据集合
|
depositData: [], //遍历的数据集合
|
||||||
rechargeList: "", //充值明细列表
|
rechargeList: "", //充值明细列表
|
||||||
walletLogList: "", //钱包变动列表
|
walletLogList: "", //钱包变动列表
|
||||||
list: [
|
list: [
|
||||||
@@ -82,27 +81,21 @@ export default {
|
|||||||
|
|
||||||
/**分页获取预存款充值记录 */
|
/**分页获取预存款充值记录 */
|
||||||
getRecharge() {
|
getRecharge() {
|
||||||
this.status = "loading";
|
|
||||||
getUserRecharge(this.params).then((res) => {
|
getUserRecharge(this.params).then((res) => {
|
||||||
if (res.data.success) {
|
if (res.data.success) {
|
||||||
if (res.data.result.records.length != 0) {
|
if (res.data.result.records.length != 0) {
|
||||||
this.status = "loadmore";
|
this.depositData.push(...res.data.result.records);
|
||||||
this.datas.push(...res.data.result.records);
|
|
||||||
} else {
|
|
||||||
this.status = "nomore";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
getWallet() {
|
getWallet() {
|
||||||
this.status = "loading";
|
|
||||||
getWalletLog(this.params).then((res) => {
|
getWalletLog(this.params).then((res) => {
|
||||||
if (res.data.success) {
|
if (res.data.success) {
|
||||||
if (res.data.result.records.length != 0) {
|
if (res.data.result.records.length != 0) {
|
||||||
this.datas.push(...res.data.result.records);
|
this.depositData.push(...res.data.result.records);
|
||||||
} else {
|
|
||||||
this.status = "nomore";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -110,7 +103,7 @@ export default {
|
|||||||
|
|
||||||
|
|
||||||
changed(index) {
|
changed(index) {
|
||||||
this.datas = [];
|
this.depositData = [];
|
||||||
this.swiperCurrent = index;
|
this.swiperCurrent = index;
|
||||||
this.params.pageNumber = 1;
|
this.params.pageNumber = 1;
|
||||||
if (index == 0) {
|
if (index == 0) {
|
||||||
|
|||||||
@@ -5,11 +5,11 @@
|
|||||||
<div class="deposit">预存款金额</div>
|
<div class="deposit">预存款金额</div>
|
||||||
<div class="money">¥{{walletNum | unitPrice }}</div>
|
<div class="money">¥{{walletNum | unitPrice }}</div>
|
||||||
<div class="operation-btns">
|
<div class="operation-btns">
|
||||||
<div class="operation-btn light" @click="navgition('/pages/mine/deposit/withdrawal')">提现</div>
|
<div class="operation-btn light" @click="navigateTo('/pages/mine/deposit/withdrawal')">提现</div>
|
||||||
<div class="operation-btn" @click="navgition('/pages/mine/deposit/recharge')">充值</div>
|
<div class="operation-btn" @click="navigateTo('/pages/mine/deposit/recharge')">充值</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="box list" @click="navgition('/pages/mine/deposit/index')">
|
<div class="box list" @click="navigateTo('/pages/mine/deposit/index')">
|
||||||
<div class="list-left">预存款明细</div>
|
<div class="list-left">预存款明细</div>
|
||||||
<div class="list-right">
|
<div class="list-right">
|
||||||
<u-icon name="arrow-right"></u-icon>
|
<u-icon name="arrow-right"></u-icon>
|
||||||
@@ -31,12 +31,6 @@ export default {
|
|||||||
let result = await getUserWallet(); //预存款
|
let result = await getUserWallet(); //预存款
|
||||||
this.walletNum = result.data.result.memberWallet;
|
this.walletNum = result.data.result.memberWallet;
|
||||||
} else {
|
} else {
|
||||||
uni.showToast({
|
|
||||||
icon: "none",
|
|
||||||
duration: 3000,
|
|
||||||
title: "请先登录!",
|
|
||||||
});
|
|
||||||
|
|
||||||
this.$options.filters.navigateToLogin("redirectTo");
|
this.$options.filters.navigateToLogin("redirectTo");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -49,7 +43,7 @@ export default {
|
|||||||
/**
|
/**
|
||||||
* 跳转
|
* 跳转
|
||||||
*/
|
*/
|
||||||
navgition(url) {
|
navigateTo(url) {
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
url,
|
url,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<view>
|
<view>
|
||||||
<view class="-list">
|
<view class="-list">
|
||||||
@@ -5,7 +6,8 @@
|
|||||||
<view class="content">
|
<view class="content">
|
||||||
<view class="price">
|
<view class="price">
|
||||||
<span> ¥</span>
|
<span> ¥</span>
|
||||||
<u-input v-model="price" placeholder="" type="number" />
|
<u-input v-model="price" placeholder='金额' type="number" />
|
||||||
|
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
</view>
|
</view>
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/deep/ .u-input__input,
|
::v-deep .u-input__input,
|
||||||
.u-input {
|
.u-input {
|
||||||
font-size: 80rpx !important;
|
font-size: 80rpx !important;
|
||||||
height: 102rpx !important;
|
height: 102rpx !important;
|
||||||
}
|
}
|
||||||
/deep/ .u-input__input {
|
::v-deep .u-input__input {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
font-size: 80rpx;
|
font-size: 80rpx;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,13 @@
|
|||||||
<template>
|
<template>
|
||||||
<view>
|
<view>
|
||||||
|
<view class="-list">
|
||||||
|
<view class="title">提现类型</view>
|
||||||
|
<view class="content">
|
||||||
|
<view class="price">
|
||||||
|
<u-input disabled :value="type === 'ALI' ? '支付宝' : '微信'" placeholder="" />
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
<view class="-list">
|
<view class="-list">
|
||||||
<view class="title">提现金额</view>
|
<view class="title">提现金额</view>
|
||||||
<view class="content">
|
<view class="content">
|
||||||
@@ -15,7 +23,23 @@
|
|||||||
|
|
||||||
</view>
|
</view>
|
||||||
<view class="tips">
|
<view class="tips">
|
||||||
最低提现金额为1.00元
|
最低提现金额为 {{ minPrice }} 元
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="-list" v-if="type === 'ALI'">
|
||||||
|
<view class="title">真实姓名</view>
|
||||||
|
<view class="content">
|
||||||
|
<view class="price">
|
||||||
|
<u-input v-model="realName" placeholder="" />
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="-list" v-if="type === 'ALI'">
|
||||||
|
<view class="title">第三方登录账号</view>
|
||||||
|
<view class="content">
|
||||||
|
<view class="price">
|
||||||
|
<u-input v-model="connectNumber" placeholder="" />
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
@@ -23,17 +47,24 @@
|
|||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { getUserWallet, withdrawalApply } from "@/api/members";
|
import { getUserWallet, withdrawalApply, withdrawalSettingVO } from "@/api/members";
|
||||||
export default {
|
export default {
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
price: 0,
|
price: 0,
|
||||||
walletNum: 0,
|
walletNum: 0,
|
||||||
|
minPrice: 0,
|
||||||
|
type: '',
|
||||||
|
connectNumber: '',
|
||||||
|
realName: ''
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
async mounted() {
|
async mounted() {
|
||||||
let result = await getUserWallet(); //预存款
|
let result = await getUserWallet(); //预存款
|
||||||
|
let res = await withdrawalSettingVO();
|
||||||
this.walletNum = result.data.result.memberWallet;
|
this.walletNum = result.data.result.memberWallet;
|
||||||
|
this.minPrice = res.data.result.minPrice;
|
||||||
|
this.type = res.data.result.type;
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
@@ -41,7 +72,20 @@ export default {
|
|||||||
this.price = this.price + "";
|
this.price = this.price + "";
|
||||||
|
|
||||||
if (this.$u.test.amount(parseInt(this.price))) {
|
if (this.$u.test.amount(parseInt(this.price))) {
|
||||||
withdrawalApply({ price: this.price }).then((res) => {
|
let params = { price: this.price };
|
||||||
|
if (this.type === 'ALI') {
|
||||||
|
if (!this.connectNumber || !this.realName) {
|
||||||
|
uni.showToast({
|
||||||
|
title: "请输入真实姓名和第三方登录账号",
|
||||||
|
duration: 2000,
|
||||||
|
icon: "none",
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
params.connectNumber = this.connectNumber;
|
||||||
|
params.realName = this.realName;
|
||||||
|
}
|
||||||
|
withdrawalApply(params).then((res) => {
|
||||||
if (res.data.success) {
|
if (res.data.success) {
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
title: "提现成功!",
|
title: "提现成功!",
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<view class="title">{{
|
<view class="title">{{
|
||||||
item.distributionCashStatus == "APPLY"
|
item.distributionCashStatus == "APPLY"
|
||||||
? "待处理"
|
? "待处理"
|
||||||
: item.distributionCashStatus == "PASS"
|
: item.distributionCashStatus == "VIA_AUDITING"
|
||||||
? "通过"
|
? "通过"
|
||||||
: "拒绝"
|
: "拒绝"
|
||||||
}}</view>
|
}}</view>
|
||||||
@@ -23,25 +23,30 @@
|
|||||||
<view class="log-way" v-if="achievementData.length != 0" v-for="(item, index) in achievementData" :key="index">
|
<view class="log-way" v-if="achievementData.length != 0" v-for="(item, index) in achievementData" :key="index">
|
||||||
<view class="log-item">
|
<view class="log-item">
|
||||||
<view class="log-item-view">
|
<view class="log-item-view">
|
||||||
<view class="title">{{item.goodsName}}</view>
|
<view class="title">{{ item.goodsName }}</view>
|
||||||
<view class="price">+{{ item.rebate | unitPrice }}</view>
|
<view class="price">提成金额:+{{ item.rebate | unitPrice }}</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="log-item-view">
|
<view class="log-item-view">
|
||||||
<view>{{ item.createTime }}</view>
|
<view>创建时间:{{ item.createTime }}</view>
|
||||||
<view>{{item.storeName}}</view>
|
<view>店铺:{{ item.storeName }}</view>
|
||||||
|
</view>
|
||||||
|
<view class="log-item-footer">
|
||||||
|
<view>会员名称:{{ item.memberName }}</view>
|
||||||
|
</view>
|
||||||
|
<view class="log-item-footers">
|
||||||
|
<view>订单号:{{ item.orderSn }}</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="empty" v-if="empty">
|
<view class="empty" v-if="empty">
|
||||||
<u-loadmore :status="status" :icon-type="iconType" bg-color="#f7f7f7" />
|
<u-loadmore :status="status" :icon-type="iconType" bg-color="#f7f7f7" />
|
||||||
|
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { cashLog, distributionOrderList } from "@/api/goods";
|
import { cashLog, distributionOrderList } from "@/api/goods";
|
||||||
export default {
|
export default {
|
||||||
data() {
|
data () {
|
||||||
return {
|
return {
|
||||||
cashLogData: [], //提现记录数据集合
|
cashLogData: [], //提现记录数据集合
|
||||||
achievementData: [], //分销业绩数据合集,
|
achievementData: [], //分销业绩数据合集,
|
||||||
@@ -61,7 +66,7 @@ export default {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
onLoad(option) {
|
onLoad (option) {
|
||||||
let title;
|
let title;
|
||||||
option.type == 0 ? (title = "分销业绩") : (title = "提现记录");
|
option.type == 0 ? (title = "分销业绩") : (title = "提现记录");
|
||||||
|
|
||||||
@@ -72,41 +77,41 @@ export default {
|
|||||||
this.type = option.type;
|
this.type = option.type;
|
||||||
option.type == 0 ? this.achievement() : this.history();
|
option.type == 0 ? this.achievement() : this.history();
|
||||||
},
|
},
|
||||||
mounted() {},
|
mounted () { },
|
||||||
onReachBottom() {
|
onReachBottom () {
|
||||||
this.status = "loading";
|
this.status = "loading";
|
||||||
this.type == 0 ? this.achParams.pageNumber++ : this.params.pageNumber++;
|
this.type == 0 ? this.achParams.pageNumber++ : this.params.pageNumber++;
|
||||||
this.type == 0 ? this.achievement() : this.history();
|
this.type == 0 ? this.achievement() : this.history();
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
// 业绩
|
// 业绩
|
||||||
achievement() {
|
achievement () {
|
||||||
uni.showLoading({
|
uni.showLoading({
|
||||||
title: "加载中",
|
title: "加载中",
|
||||||
});
|
});
|
||||||
distributionOrderList(this.achParams).then((res) => {
|
distributionOrderList(this.achParams).then((res) => {
|
||||||
if (res.data.success && res.data.result.records.length >= 1) {
|
if (res.data.success && res.data.result.records.length >= 1) {
|
||||||
this.achievementData = res.data.result.records;
|
this.achievementData.push(...res.data.result.records);
|
||||||
} else {
|
} else {
|
||||||
this.status = "nomore";
|
this.status = "nomore";
|
||||||
this.empty = true;
|
this.empty = true;
|
||||||
}
|
}
|
||||||
uni.hideLoading();
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
// 初始化提现历史
|
// 初始化提现历史
|
||||||
history() {
|
history () {
|
||||||
uni.showLoading({
|
uni.showLoading({
|
||||||
title: "加载中",
|
title: "加载中",
|
||||||
});
|
});
|
||||||
cashLog(this.params).then((res) => {
|
cashLog(this.params).then((res) => {
|
||||||
if (res.data.success && res.data.result.records.length >= 1) {
|
if (res.data.success && res.data.result.records.length >= 1) {
|
||||||
this.cashLogData = res.data.result.records;
|
this.cashLogData.push(...res.data.result.records);
|
||||||
} else {
|
} else {
|
||||||
this.status = "nomore";
|
this.status = "nomore";
|
||||||
this.empty = true;
|
this.empty = true;
|
||||||
}
|
}
|
||||||
uni.hideLoading();
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -116,15 +121,18 @@ export default {
|
|||||||
.empty {
|
.empty {
|
||||||
margin: 40rpx 0;
|
margin: 40rpx 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.price {
|
.price {
|
||||||
color: $main-color;
|
color: $main-color;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
.log-list {
|
.log-list {
|
||||||
padding: 0 8rpx;
|
padding: 0 8rpx;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
margin: 20rpx 0;
|
margin: 20rpx 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.log-way {
|
.log-way {
|
||||||
margin: 10rpx 0;
|
margin: 10rpx 0;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@@ -132,13 +140,30 @@ export default {
|
|||||||
border-radius: 10rpx;
|
border-radius: 10rpx;
|
||||||
padding: 20rpx 0;
|
padding: 20rpx 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.title {
|
.title {
|
||||||
font-size: 30rpx;
|
font-size: 30rpx;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
.log-item-view {
|
.log-item-view {
|
||||||
padding: 8rpx 32rpx;
|
padding: 8rpx 32rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
font-size: 13px;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
.log-item-footer {
|
||||||
|
padding: 8rpx 32rpx;
|
||||||
|
display: flex;
|
||||||
|
font-size: 13px;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
.log-item-footers {
|
||||||
|
padding: 8rpx 32rpx;
|
||||||
|
display: flex;
|
||||||
|
font-size: 13px;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -78,7 +78,7 @@ export default {
|
|||||||
if (res.data.result) {
|
if (res.data.result) {
|
||||||
this.distributionData = res.data.result;
|
this.distributionData = res.data.result;
|
||||||
}
|
}
|
||||||
uni.hideLoading();
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -98,7 +98,7 @@ export default {
|
|||||||
.nav-list {
|
.nav-list {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
padding: 40rpx 0;
|
padding: 40rpx 0;
|
||||||
background: $aider-light-color;
|
background: linear-gradient(91deg, $light-color 1%, $aider-light-color 99%);
|
||||||
}
|
}
|
||||||
.total {
|
.total {
|
||||||
padding: 10rpx 0;
|
padding: 10rpx 0;
|
||||||
|
|||||||
@@ -66,6 +66,7 @@
|
|||||||
<!-- 商品列表 -->
|
<!-- 商品列表 -->
|
||||||
|
|
||||||
<view class="goods-list">
|
<view class="goods-list">
|
||||||
|
<scroll-view class="body-view" scroll-y @scrolltolower="renderDate">
|
||||||
<u-swipe-action v-for="(item, index) in goodsList" :disabled="!params.checked" :show="item.___selected" @open="openAction(item)" :index="index" :options="options" bg-color="#fff"
|
<u-swipe-action v-for="(item, index) in goodsList" :disabled="!params.checked" :show="item.___selected" @open="openAction(item)" :index="index" :options="options" bg-color="#fff"
|
||||||
ref="swiperAction" :key="item.id" @click="changeActionTab(item)">
|
ref="swiperAction" :key="item.id" @click="changeActionTab(item)">
|
||||||
|
|
||||||
@@ -102,6 +103,8 @@
|
|||||||
</view>
|
</view>
|
||||||
</div>
|
</div>
|
||||||
</u-swipe-action>
|
</u-swipe-action>
|
||||||
|
</scroll-view>
|
||||||
|
|
||||||
|
|
||||||
<view class="empty">
|
<view class="empty">
|
||||||
<!-- <u-empty v-if="empty" text="没有分销商品了" mode="list"></u-empty> -->
|
<!-- <u-empty v-if="empty" text="没有分销商品了" mode="list"></u-empty> -->
|
||||||
@@ -295,15 +298,30 @@ export default {
|
|||||||
});
|
});
|
||||||
this.goodsList.push(...res.data.result.records);
|
this.goodsList.push(...res.data.result.records);
|
||||||
}
|
}
|
||||||
if (this.goodsList.length == 0) {
|
if (this.goodsList.length === 0) {
|
||||||
this.empty = true;
|
this.empty = true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 底部加载数据
|
||||||
|
*/
|
||||||
|
renderDate() {
|
||||||
|
|
||||||
|
this.params.pageNumber += 1;
|
||||||
|
this.init();
|
||||||
|
},
|
||||||
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
|
||||||
|
.body-view {
|
||||||
|
overflow-y: auto;
|
||||||
|
height: calc(100vh - 44px - 80rpx - 104rpx);
|
||||||
|
}
|
||||||
.canvas-hide {
|
.canvas-hide {
|
||||||
/* 1 */
|
/* 1 */
|
||||||
position: fixed;
|
position: fixed;
|
||||||
|
|||||||
@@ -75,20 +75,20 @@ export default {
|
|||||||
if (res.data.result) {
|
if (res.data.result) {
|
||||||
this.distributionData = res.data.result;
|
this.distributionData = res.data.result;
|
||||||
}
|
}
|
||||||
uni.hideLoading();
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
/deep/ .u-input__input,
|
::v-deep .u-input__input,
|
||||||
.u-input {
|
.u-input {
|
||||||
font-size: 80rpx !important;
|
font-size: 80rpx !important;
|
||||||
height: 102rpx !important;
|
height: 102rpx !important;
|
||||||
|
|
||||||
}
|
}
|
||||||
/deep/ .u-input__input{
|
::v-deep .u-input__input{
|
||||||
height: 100%;
|
height: 100%;
|
||||||
font-size: 80rpx;
|
font-size: 80rpx;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,37 +1,42 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
<u-parse v-html="res.content"></u-parse>
|
<u-parse :show-with-animation="true" :lazy-load="true" :selectable="true" :html="res.content" v-if="res"></u-parse>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { getArticleDetail } from "@/api/article";
|
import { getArticleDetailByType } from "@/api/article";
|
||||||
export default {
|
export default {
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
res: "",
|
res: "",
|
||||||
way: {
|
way: {
|
||||||
user: {
|
USER_AGREEMENT: {
|
||||||
title: "用户协议",
|
title: "服务协议",
|
||||||
type: "USER_AGREEMENT",
|
type: "USER_AGREEMENT",
|
||||||
},
|
},
|
||||||
privacy: {
|
PRIVACY_POLICY: {
|
||||||
title: "隐私政策",
|
title: "隐私政策",
|
||||||
type: "PRIVACY_POLICY",
|
type: "PRIVACY_POLICY",
|
||||||
},
|
},
|
||||||
message: {
|
LICENSE_INFORMATION: {
|
||||||
title: "证照信息",
|
title: "证照信息",
|
||||||
type: "LICENSE_INFORMATION",
|
type: "LICENSE_INFORMATION",
|
||||||
},
|
},
|
||||||
about: {
|
ABOUT: {
|
||||||
title: "关于我们",
|
title: "关于我们",
|
||||||
type: "ABOUT",
|
type: "ABOUT",
|
||||||
},
|
},
|
||||||
|
STORE_REGISTER: {
|
||||||
|
title: "店铺入驻协议",
|
||||||
|
type: "STORE_REGISTER",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
mounted() {},
|
mounted() {},
|
||||||
onLoad(option) {
|
onLoad(option) {
|
||||||
|
console.log(this.way)
|
||||||
uni.setNavigationBarTitle({
|
uni.setNavigationBarTitle({
|
||||||
title: this.way[option.type].title,
|
title: this.way[option.type].title,
|
||||||
});
|
});
|
||||||
@@ -40,9 +45,10 @@ export default {
|
|||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
init(option) {
|
init(option) {
|
||||||
getArticleDetail(this.way[option.type].type).then((res) => {
|
getArticleDetailByType(this.way[option.type].type).then((res) => {
|
||||||
if (res.data.success) {
|
if (res.data.success) {
|
||||||
this.res = res.data.result;
|
this.res = res.data.result;
|
||||||
|
console.log(res)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|||||||
5802
pages/mine/im/index-app.scss
Normal file
5802
pages/mine/im/index-app.scss
Normal file
File diff suppressed because one or more lines are too long
912
pages/mine/im/index.vue
Normal file
912
pages/mine/im/index.vue
Normal file
@@ -0,0 +1,912 @@
|
|||||||
|
<template>
|
||||||
|
<view class="wrapper">
|
||||||
|
<u-navbar class="my-title" title-size="32" :title="toUser.name"></u-navbar>
|
||||||
|
<!-- 空盒子用来防止消息过少时 拉起键盘会遮盖消息 -->
|
||||||
|
<view :animation="anData" style="height:0;">
|
||||||
|
</view>
|
||||||
|
<!-- 消息体 -->
|
||||||
|
<!-- 用来获取消息体高度 -->
|
||||||
|
<view id="msgList">
|
||||||
|
<!-- 消息 -->
|
||||||
|
<view class="flex-column-start" v-if="msgList.length" v-for="(item, index) in msgList" :key="index">
|
||||||
|
<view class="flex-row-start column-time">
|
||||||
|
<!-- <view v-show="compareTime(index, item.createTime)" class="flex-row-start date-text"
|
||||||
|
v-text="beautifyTime(item.createTime)">
|
||||||
|
</view> -->
|
||||||
|
</view>
|
||||||
|
<!-- 用户消息 头像可选加入-->
|
||||||
|
<view v-if="item.my" class="flex justify-end padding-right one-show align-start padding-top">
|
||||||
|
<view class="flex justify-end" style="width: 400rpx;margin-top: 12px;">
|
||||||
|
<view>
|
||||||
|
<view class="user-name">{{ user.nickName }}</view>
|
||||||
|
<view class="margin-left padding-chat bg-user-orang" style="border-radius: 35rpx; ">
|
||||||
|
<text style="word-break: break-all;"
|
||||||
|
v-if="item.messageType === 'MESSAGE' && !emojistwo.includes(item.text)">{{ item.text }}</text>
|
||||||
|
<view v-if="item.messageType === 'MESSAGE' && emojistwo.includes(item.text)"
|
||||||
|
v-html="textReplaceEmoji(item.text)"></view>
|
||||||
|
<view v-if="item.messageType == 'GOODS'">
|
||||||
|
<view class="goods-card u-flex u-row-between u-p-b-0" style="width:100%;margin: 0 0; ">
|
||||||
|
<view class="image-box" @click="jumpGoodDesc(item)">
|
||||||
|
<image class="image" :src="JSON.parse(item.text)['thumbnail']" mode="widthFix"></image>
|
||||||
|
</view>
|
||||||
|
<view class="goods-desc" @click="jumpGoodDesc(item)">
|
||||||
|
<view class="goods-desc-name">
|
||||||
|
<text class="goods-card-goods-name">{{
|
||||||
|
JSON.parse(item.text)['goodsName']
|
||||||
|
}}</text>
|
||||||
|
</view>
|
||||||
|
<view class="goods-desc-rice" >¥{{
|
||||||
|
JSON.parse(item.text)['price'] | unitPrice
|
||||||
|
}}
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<view v-if="item.messageType == 'ORDER'" @click="linkTosOrders(item.text)">
|
||||||
|
<view class="order-sn">
|
||||||
|
<div class="wes">订单号:{{ JSON.parse(item.text)['sn'] }}</div>
|
||||||
|
<div class='order-item flex' v-if="JSON.parse(item.text).orderItems.length" v-for='(order,orderIndex) in JSON.parse(item.text).orderItems'>
|
||||||
|
<u-image mode="widthFix" width='120rpx' height='120rpx' :src="order.image" />
|
||||||
|
<view class="name-or-time">
|
||||||
|
<div class="wes-2" >{{
|
||||||
|
order.name
|
||||||
|
}}</div>
|
||||||
|
<div class="main-color goods-desc-rice">{{
|
||||||
|
order.goodsPrice | unitPrice("¥")
|
||||||
|
}}</div>
|
||||||
|
|
||||||
|
</view>
|
||||||
|
</div>
|
||||||
|
<view class="order-list">
|
||||||
|
<view class="order-time">
|
||||||
|
<text>{{ JSON.parse(item.text)['paymentTime'] }}</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view>
|
||||||
|
<u-avatar :src="user.face" :text="user.face ? '' : user.name" bg-color="#DDDDDD"></u-avatar>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<!-- 接收人消息 -->
|
||||||
|
<view v-else class="flex-row-start margin-left margin-top one-show">
|
||||||
|
<view class="chat-img flex-row-center">
|
||||||
|
<u-avatar :src="toUser.face" :text="toUser.face ? '' : toUser.name" bg-color="#DDDDDD">
|
||||||
|
</u-avatar>
|
||||||
|
</view>
|
||||||
|
<view class="flex" style="width: 500rpx;">
|
||||||
|
<view>
|
||||||
|
<view class="other-name">{{ toUser.name }}</view>
|
||||||
|
<view class="margin-left padding-chat flex-column-start bg-to-color" style="border-radius: 35rpx;">
|
||||||
|
<text style="word-break: break-all;"
|
||||||
|
v-if="item.messageType === 'MESSAGE' && !emojistwo.includes(item.text)">{{ item.text }}</text>
|
||||||
|
<view v-if="item.messageType === 'MESSAGE' && emojistwo.includes(item.text)"
|
||||||
|
v-html="textReplaceEmoji(item.text)"></view>
|
||||||
|
<view v-if="item.messageType === 'GOODS'">
|
||||||
|
<view class="goods-card u-flex u-row-between u-p-b-0" style="width:100%;margin: 0 0; ">
|
||||||
|
<view class="image-box" @click="jumpGoodDesc(item)">
|
||||||
|
<image class="image" :src="JSON.parse(item.text)['thumbnail']" mode="widthFix"></image>
|
||||||
|
</view>
|
||||||
|
<view class="goods-desc" @click="jumpGoodDesc(item)">
|
||||||
|
<view class="goods-desc-name">
|
||||||
|
<text class="goods-card-goods-name">{{
|
||||||
|
JSON.parse(item.text)['goodsName']
|
||||||
|
}}</text>
|
||||||
|
</view>
|
||||||
|
<view class="goods-desc-rice" >¥{{
|
||||||
|
JSON.parse(item.text)['price']
|
||||||
|
}}
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view v-if="item.messageType === 'ORDER'">
|
||||||
|
<view class="order-sn">
|
||||||
|
<text>订单号:{{ JSON.parse(item.text)['sn'] }}</text>
|
||||||
|
<view class="order-list">
|
||||||
|
<img style="height: 120rpx; width: 120rpx; margin-top: 15rpx;"
|
||||||
|
:src="JSON.parse(item.text)['groupImages']" mode="widthFix" />
|
||||||
|
<view class="name-or-time">
|
||||||
|
<text @click="linkTosOrders(item.text)">{{
|
||||||
|
JSON.parse(item.text)['groupName']
|
||||||
|
}}</text>
|
||||||
|
<view class="order-time">
|
||||||
|
<text>{{ JSON.parse(item.text)['paymentTime'] }}</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<!-- 防止消息底部被遮 -->
|
||||||
|
<view v-if="showHide && !localImGoodsId && showHideModel" class="flex-row-start margin-left margin-top"
|
||||||
|
style="height: 120rpx;">
|
||||||
|
</view>
|
||||||
|
<!-- 如果没有聊天记录,定位到底部 -->
|
||||||
|
<view
|
||||||
|
:style="{ position:'fixed' , bottom:(inputHeight+66)+'px' , width: '100%' }">
|
||||||
|
<view class="cart-message" v-if="showHide && !localImGoodsId && showHideModel">
|
||||||
|
<view class="goods-card u-flex u-row-between u-p-b-0">
|
||||||
|
<view class="image-box" @click="jumpGoodDesc(item)">
|
||||||
|
<image class="image" :src="goodListData.thumbnail" mode="widthFix"></image>
|
||||||
|
</view>
|
||||||
|
<view class="goods-desc" @click="jumpGoodDesc(item)">
|
||||||
|
<view class="goods-desc-name">
|
||||||
|
<text class="goods-card-goods-name">{{
|
||||||
|
goodListData.goodsName
|
||||||
|
}}</text>
|
||||||
|
</view>
|
||||||
|
<view class="goods-desc-rice" > ¥{{
|
||||||
|
goodListData.price | unitPrice
|
||||||
|
}}
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="cancel" @click="cancelModel">X</view>
|
||||||
|
<view class="send-goods" @click="sendGoodsMessage">
|
||||||
|
<view>发送商品</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<!-- 防止消息底部被遮 -->
|
||||||
|
<view style="height: 120rpx;">
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<!-- 底部导航栏 -->
|
||||||
|
<view :style="{position: 'fixed', bottom:inputHeight+'px'}" class="flex-column-center bottom-dh" :animation="animationData">
|
||||||
|
<view class="bottom-dh-char flex-row-around" style="font-size: 55rpx;">
|
||||||
|
<!-- vue无法使用软键盘"发送" -->
|
||||||
|
|
||||||
|
<!-- #ifndef MP-WEIXIN -->
|
||||||
|
<div v-if="!isShow" @click="navigateToBottom" class="dh-input">
|
||||||
|
用一句简短的话描述您的问题
|
||||||
|
</div>
|
||||||
|
<input v-show="isShow" ref="inputRef" :focus="isShow" @focus="inputBindFocus" @blur="eventHandle" :adjust-position="false" v-model="msg" class="dh-input" type="text" style="background-color: #f0f0f0;" @confirm="sendMessage"
|
||||||
|
confirm-type="send" placeholder="用一句简短的话描述您的问题" />
|
||||||
|
<!-- #endif -->
|
||||||
|
|
||||||
|
<!-- #ifdef MP-WEIXIN -->
|
||||||
|
<input ref="inputRef" @focus="inputBindFocus" @blur="eventHandle" :adjust-position="false" v-model="msg" class="dh-input" type="text" style="background-color: #f0f0f0;" @confirm="sendMessage"
|
||||||
|
confirm-type="send" placeholder="用一句简短的话描述您的问题" />
|
||||||
|
<!-- #endif -->
|
||||||
|
|
||||||
|
<view @click="sendMessage" class="cu-tag bg-main-color send round">
|
||||||
|
发送
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<!-- <text @click="ckAdd" class="cuIcon-roundaddfill text-brown"></text> -->
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<div id="bottom"></div>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// rpx和px的比率
|
||||||
|
var l
|
||||||
|
// 可用窗口高度
|
||||||
|
var wh
|
||||||
|
// 顶部空盒子的高度
|
||||||
|
var mgUpHeight
|
||||||
|
import {
|
||||||
|
getTalkMessage,
|
||||||
|
getTalkByUser,
|
||||||
|
jumpObtain
|
||||||
|
} from "@/api/im.js";
|
||||||
|
import SocketService from "@/utils/socket_service.js";
|
||||||
|
import storage from "@/utils/storage.js";
|
||||||
|
import {
|
||||||
|
beautifyTime
|
||||||
|
} from "@/utils/filters.js"
|
||||||
|
import config from '@/config/config.js'
|
||||||
|
import { textReplaceEmoji, emojistwo } from '@/utils/emojis.js';
|
||||||
|
export default {
|
||||||
|
// 页面卸载后清除imGoodId
|
||||||
|
onUnload () {
|
||||||
|
// #ifdef H5
|
||||||
|
uni.setStorageSync("imGoodId", '');
|
||||||
|
// #endif
|
||||||
|
|
||||||
|
if (this.socketOpen == true) {
|
||||||
|
uni.closeSocket();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onLoad (options) {
|
||||||
|
// 没有goodsid则不显示 发送商品弹窗
|
||||||
|
this.showHideModel = options.goodsid
|
||||||
|
// 发送后刷新页面不显示 发送商品弹窗 local里面imGoodId不为空显示
|
||||||
|
// #ifdef H5
|
||||||
|
this.localImGoodsId = uni.getStorageSync("imGoodId");
|
||||||
|
// #endif
|
||||||
|
this.resolve = options
|
||||||
|
// 请求商品信息
|
||||||
|
if (this.resolve.goodsid) {
|
||||||
|
this.commodityDetails()
|
||||||
|
}
|
||||||
|
|
||||||
|
var query = uni.getSystemInfoSync()
|
||||||
|
|
||||||
|
l = query.screenWidth / 750
|
||||||
|
wh = query.windowHeight
|
||||||
|
this.scrollHeight = (query.windowHeight - 44) + "px"
|
||||||
|
this.user = storage.getUserInfo()
|
||||||
|
this.toUser = storage.getTalkToUser()
|
||||||
|
|
||||||
|
if (options.talkId) {
|
||||||
|
this.params.talkId = options.talkId;
|
||||||
|
this.getTalkMessage()
|
||||||
|
} else {
|
||||||
|
this.getTalk(options.userId)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// this.ws.connect();
|
||||||
|
this.socket();
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 页面隐藏
|
||||||
|
onHide () {
|
||||||
|
uni.closeSocket();
|
||||||
|
},
|
||||||
|
onUnload () {
|
||||||
|
uni.closeSocket();
|
||||||
|
},
|
||||||
|
onPullDownRefresh () {
|
||||||
|
this.params.pageNumber = this.params.pageNumber + 1
|
||||||
|
this.getTalkMessage()
|
||||||
|
setTimeout(function () {
|
||||||
|
uni.stopPullDownRefresh();
|
||||||
|
}, 1000);
|
||||||
|
},
|
||||||
|
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
textReplaceEmoji,
|
||||||
|
emojistwo,
|
||||||
|
socketOpen: false, //是否连接
|
||||||
|
storage,
|
||||||
|
fixed: 'fixed',
|
||||||
|
bottom: '50px',
|
||||||
|
width: '100%',
|
||||||
|
showHideModel: undefined,
|
||||||
|
localImGoodsId: '',
|
||||||
|
showHide: true,
|
||||||
|
msgLoad: false,
|
||||||
|
anData: {},
|
||||||
|
animationData: {},
|
||||||
|
msgList: [],
|
||||||
|
oldHeight: 0,
|
||||||
|
params: { //搜索条件
|
||||||
|
talkId: '',
|
||||||
|
pageSize: 10,
|
||||||
|
pageNumber: 1,
|
||||||
|
},
|
||||||
|
goToIndex: 0, // 前往位置
|
||||||
|
msg: "",
|
||||||
|
go: 0,
|
||||||
|
newMessageNum: 0,
|
||||||
|
user: {},
|
||||||
|
toUser: {},
|
||||||
|
scrollHeight: 0,
|
||||||
|
ws: new SocketService(),
|
||||||
|
resolve: {},
|
||||||
|
goodListData: {},
|
||||||
|
count: 0, //判断socket断开连接请求次数
|
||||||
|
inputHeight:0,
|
||||||
|
isShow:false,
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onPageScroll (e) {
|
||||||
|
|
||||||
|
// #ifdef APP-PLUS
|
||||||
|
uni.hideKeyboard()
|
||||||
|
this.isShow = false
|
||||||
|
// #endif
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
navigateToBottom(){
|
||||||
|
// #ifdef H5
|
||||||
|
this.isShow = true
|
||||||
|
this.$refs.inputRef.focus()
|
||||||
|
// #endif
|
||||||
|
|
||||||
|
// #ifdef APP-PLUS
|
||||||
|
this.$nextTick(() => {
|
||||||
|
uni.pageScrollTo({
|
||||||
|
scrollTop: 5000000,
|
||||||
|
duration: 50,
|
||||||
|
success: () => {
|
||||||
|
setTimeout(() => {
|
||||||
|
this.isShow = true
|
||||||
|
}, 200);
|
||||||
|
;
|
||||||
|
},
|
||||||
|
fail: () => { },
|
||||||
|
complete: () => {}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
// #endif
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
eventHandle(){
|
||||||
|
|
||||||
|
this.inputHeight = 0
|
||||||
|
this.isShow = false
|
||||||
|
},
|
||||||
|
inputBindFocus(e){
|
||||||
|
if (e.detail.height) {
|
||||||
|
|
||||||
|
|
||||||
|
// #ifdef APP-PLUS
|
||||||
|
// 判断是否是ios
|
||||||
|
if (uni.getSystemInfoSync().platform == 'ios') {
|
||||||
|
this.inputHeight = e.detail.height - 40 //这个高度就是软键盘的高度
|
||||||
|
}else{
|
||||||
|
this.inputHeight = e.detail.height
|
||||||
|
}
|
||||||
|
// #endif
|
||||||
|
|
||||||
|
// #ifndef APP-PLUS
|
||||||
|
this.inputHeight = e.detail.height //这个高度就是软键盘的高度
|
||||||
|
// #endif
|
||||||
|
}
|
||||||
|
},
|
||||||
|
sendMessage () {
|
||||||
|
if (this.msg == "") {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (this.socketOpen == false) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let msg = {
|
||||||
|
operation_type: "MESSAGE",
|
||||||
|
to: this.toUser.userId,
|
||||||
|
from: this.user.id,
|
||||||
|
message_type: "MESSAGE",
|
||||||
|
context: this.msg,
|
||||||
|
talk_id: this.params.talkId,
|
||||||
|
}
|
||||||
|
let data = JSON.stringify(msg);
|
||||||
|
uni.sendSocketMessage({
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
this.msgList.push({
|
||||||
|
"text": this.msg,
|
||||||
|
"my": true,
|
||||||
|
"messageType": 'MESSAGE'
|
||||||
|
})
|
||||||
|
let type = 'down';
|
||||||
|
this.msgGo(type)
|
||||||
|
this.msg = ""
|
||||||
|
},
|
||||||
|
sendGoodsMessage () {
|
||||||
|
let msg = {
|
||||||
|
operation_type: "MESSAGE",
|
||||||
|
to: this.toUser.userId,
|
||||||
|
from: this.user.id,
|
||||||
|
message_type: "GOODS",
|
||||||
|
context: this.goodListData,
|
||||||
|
talk_id: this.params.talkId,
|
||||||
|
}
|
||||||
|
let data = JSON.stringify(msg);
|
||||||
|
uni.sendSocketMessage({
|
||||||
|
data: data
|
||||||
|
});
|
||||||
|
this.msgList.push({
|
||||||
|
"text": JSON.stringify(this.goodListData),
|
||||||
|
"my": true,
|
||||||
|
"messageType": 'GOODS'
|
||||||
|
})
|
||||||
|
this.showHide = false
|
||||||
|
// #ifdef H5
|
||||||
|
uni.setStorageSync("imGoodId", 1111111);
|
||||||
|
// #endif
|
||||||
|
this.$nextTick(() => {
|
||||||
|
uni.pageScrollTo({
|
||||||
|
scrollTop: 2000000,
|
||||||
|
duration: 300
|
||||||
|
});
|
||||||
|
})
|
||||||
|
},
|
||||||
|
socket () {
|
||||||
|
var _this = this;
|
||||||
|
uni.closeSocket();
|
||||||
|
this.socketOpen = false;
|
||||||
|
try {
|
||||||
|
//WebSocket的地址
|
||||||
|
var url = config.baseWsUrl + '/' + storage.getAccessToken();
|
||||||
|
// 连接
|
||||||
|
uni.connectSocket({
|
||||||
|
url: url,
|
||||||
|
});
|
||||||
|
// 监听WebSocket连接已打开
|
||||||
|
uni.onSocketOpen(function (res) {
|
||||||
|
_this.socketOpen = true;
|
||||||
|
});
|
||||||
|
if (!this.socketOpen) {
|
||||||
|
// 监听连接失败
|
||||||
|
|
||||||
|
uni.onSocketError(function (err) {
|
||||||
|
if (this.count < 3) {
|
||||||
|
if (err && err.code != 1000) {
|
||||||
|
_this.socketOpen = true;
|
||||||
|
setTimeout(() => {
|
||||||
|
uni.connectSocket({
|
||||||
|
url: url,
|
||||||
|
});
|
||||||
|
}, 2000)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
uni.closeSocket();
|
||||||
|
}
|
||||||
|
this.count++
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// 监听收到信息
|
||||||
|
uni.onSocketMessage(function (res) {
|
||||||
|
res.data = JSON.parse(res.data)
|
||||||
|
console.log(res.data.result);
|
||||||
|
if (res.data.messageResultType == 'MESSAGE') {
|
||||||
|
_this.msgList.push(res.data.result)
|
||||||
|
console.log(_this.msgList)
|
||||||
|
}
|
||||||
|
console.log(res.data)
|
||||||
|
_this.msgGo()
|
||||||
|
})
|
||||||
|
} catch (e) {
|
||||||
|
uni.closeSocket();
|
||||||
|
}
|
||||||
|
// 监听是否断线,断线进行重新连接
|
||||||
|
uni.onSocketClose((res) => {
|
||||||
|
if (res.code != null && res.code != 1000) {
|
||||||
|
this.socket()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
beautifyTime,
|
||||||
|
//订单详情
|
||||||
|
linkTosOrders (val) {
|
||||||
|
let order = JSON.parse(val)
|
||||||
|
uni.navigateTo({
|
||||||
|
url: '/pages/order/orderDetail?sn=' + order.sn,
|
||||||
|
});
|
||||||
|
|
||||||
|
},
|
||||||
|
// 跳转商品详情页
|
||||||
|
jumpGoodDesc (item) {
|
||||||
|
let info = JSON.parse(item.text)
|
||||||
|
uni.navigateTo({
|
||||||
|
url: `/pages/product/goods?id=${info.id}&goodsId=${info.goodsId}`,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
//取消发送
|
||||||
|
cancelModel () {
|
||||||
|
this.showHide = false
|
||||||
|
},
|
||||||
|
// 请求商品详情
|
||||||
|
commodityDetails () {
|
||||||
|
jumpObtain(this.resolve.skuid, this.resolve.goodsid).then((res) => {
|
||||||
|
this.goodListData = res.data.result.data
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 切换输入法时移动输入框(按照官方的上推页面的原理应该会自动适应不同的键盘高度-->官方bug)
|
||||||
|
goPag (kh) {
|
||||||
|
this.retractBox(0, 250)
|
||||||
|
if (this.keyHeight != 0) {
|
||||||
|
if (kh - this.keyHeight > 0) {
|
||||||
|
this.retractBox(this.keyHeight - kh, 250)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 移动顶部的空盒子
|
||||||
|
messageBoxMove (x, t) {
|
||||||
|
var animation = uni.createAnimation({
|
||||||
|
duration: t,
|
||||||
|
timingFunction: 'linear',
|
||||||
|
})
|
||||||
|
this.animation = animation
|
||||||
|
animation.height(x).step()
|
||||||
|
this.anData = animation.export()
|
||||||
|
},
|
||||||
|
// 保持消息体可见
|
||||||
|
msgGo (type) {
|
||||||
|
const query = uni.createSelectorQuery()
|
||||||
|
// 延时100ms保证是最新的高度
|
||||||
|
setTimeout(() => {
|
||||||
|
// 获取消息体高度
|
||||||
|
query.select('#msgList').boundingClientRect(data => {
|
||||||
|
// 如果超过scorll高度就滚动scorll
|
||||||
|
if (type == 'up') {
|
||||||
|
this.go = data.height - this.oldHeight
|
||||||
|
} else if (type == 'down') {
|
||||||
|
this.go = data.height - wh + 120
|
||||||
|
}
|
||||||
|
// if (this.oldHeight > 0) {
|
||||||
|
// this.go = data.height - this.oldHeight
|
||||||
|
// } else {
|
||||||
|
// // if (data.height - (wh - 32) > 0) {
|
||||||
|
// this.go = data.height - wh + 120
|
||||||
|
// }
|
||||||
|
// 保证键盘第一次拉起时消息体能保持可见
|
||||||
|
var moveY = wh - data.height
|
||||||
|
// 超出页面则缩回空盒子
|
||||||
|
if (moveY - mgUpHeight < 0) {
|
||||||
|
// 小于0则视为0
|
||||||
|
if (moveY < 0) {
|
||||||
|
this.messageBoxMove(0, 200)
|
||||||
|
} else {
|
||||||
|
// 否则缩回盒子对应的高度
|
||||||
|
this.messageBoxMove(moveY, 200)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
uni.pageScrollTo({
|
||||||
|
scrollTop: this.go,
|
||||||
|
duration: 0
|
||||||
|
})
|
||||||
|
this.oldHeight = data.height
|
||||||
|
}).exec();
|
||||||
|
}, 100)
|
||||||
|
},
|
||||||
|
// 回答问题的业务逻辑
|
||||||
|
answer (id) {
|
||||||
|
// 这里应该传入问题的id,模拟就用index代替了
|
||||||
|
|
||||||
|
},
|
||||||
|
// 不建议输入框聚焦时操作此动画
|
||||||
|
ckAdd () {
|
||||||
|
if (!this.showTow) {
|
||||||
|
this.retractBox(-180, 350)
|
||||||
|
} else {
|
||||||
|
this.retractBox(0, 200)
|
||||||
|
}
|
||||||
|
this.showTow = !this.showTow
|
||||||
|
},
|
||||||
|
hideKey () {
|
||||||
|
uni.hideKeyboard()
|
||||||
|
},
|
||||||
|
// 拉起/收回附加栏
|
||||||
|
retractBox (x, t) {
|
||||||
|
var animation = uni.createAnimation({
|
||||||
|
duration: t,
|
||||||
|
timingFunction: 'ease',
|
||||||
|
})
|
||||||
|
this.animation = animation
|
||||||
|
animation.translateY(x).step()
|
||||||
|
this.animationData = animation.export()
|
||||||
|
},
|
||||||
|
async getTalkMessage () {
|
||||||
|
let type = '';
|
||||||
|
await getTalkMessage(this.params).then(res => {
|
||||||
|
if (res.data.success) {
|
||||||
|
if (this.msgList.length >= 10) {
|
||||||
|
this.msgList.unshift(...res.data.result)
|
||||||
|
type = 'up'
|
||||||
|
} else {
|
||||||
|
this.msgList.unshift(...res.data.result)
|
||||||
|
type = 'down'
|
||||||
|
}
|
||||||
|
this.msgList.forEach(item => {
|
||||||
|
if (item.fromUser === this.user.id) {
|
||||||
|
item.my = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
console.log(this.msgList);
|
||||||
|
this.msgGo(type)
|
||||||
|
},
|
||||||
|
// 上拉加载
|
||||||
|
touchMoreMessage (e) {
|
||||||
|
if (e.target.scrollTop == 0) {
|
||||||
|
this.params.pageNumber = this.params.pageNumber + 1
|
||||||
|
this.getTalkMessage()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getTalk (userId) {
|
||||||
|
getTalkByUser(userId).then(res => {
|
||||||
|
if (res.data.success) {
|
||||||
|
this.toUser = res.data.result
|
||||||
|
this.params.talkId = res.data.result.id
|
||||||
|
this.getTalkMessage()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 处理消息时间是否显示
|
||||||
|
compareTime (index, datetime) {
|
||||||
|
if (datetime == undefined) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (typeof datetime == "number") {
|
||||||
|
datetime = this.unixToDate(datetime, "yyyy-MM-dd hh:mm");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.msgList[index].is_revoke == 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (datetime) {
|
||||||
|
datetime = datetime.replace(/-/g, "/");
|
||||||
|
}
|
||||||
|
|
||||||
|
let time = Math.floor(Date.parse(datetime) / 1000);
|
||||||
|
let currTime = Math.floor(new Date().getTime() / 1000);
|
||||||
|
|
||||||
|
// 当前时间5分钟内时间不显示
|
||||||
|
if (currTime - time < 300) return false;
|
||||||
|
// 判断是否是最后一条消息,最后一条消息默认显示时间
|
||||||
|
if (index == this.msgList.length - 1) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
let nextDate
|
||||||
|
if (this.msgList[index + 1] && this.msgList[index + 1].createTime) {
|
||||||
|
nextDate = this.msgList[index + 1].createTime.replace(/-/g, "/");
|
||||||
|
if (nextDate - datetime < 300) return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return !(
|
||||||
|
this.unixToDate(new Date(datetime), "{y}-{m}-{d} {h}:{i}") ==
|
||||||
|
this.unixToDate(new Date(nextDate), "{y}-{m}-{d} {h}:{i}")
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将unix时间戳转换为指定格式
|
||||||
|
* @param unix 时间戳【秒】
|
||||||
|
* @param format 转换格式
|
||||||
|
* @returns {*|string}
|
||||||
|
*/
|
||||||
|
unixToDate (unix, format) {
|
||||||
|
if (!unix) return unix;
|
||||||
|
let _format = format || "yyyy-MM-dd hh:mm:ss";
|
||||||
|
const d = new Date(unix);
|
||||||
|
const o = {
|
||||||
|
"M+": d.getMonth() + 1,
|
||||||
|
"d+": d.getDate(),
|
||||||
|
"h+": d.getHours(),
|
||||||
|
"m+": d.getMinutes(),
|
||||||
|
"s+": d.getSeconds(),
|
||||||
|
"q+": Math.floor((d.getMonth() + 3) / 3),
|
||||||
|
S: d.getMilliseconds(),
|
||||||
|
};
|
||||||
|
if (/(y+)/.test(_format))
|
||||||
|
_format = _format.replace(
|
||||||
|
RegExp.$1,
|
||||||
|
(d.getFullYear() + "").substr(4 - RegExp.$1.length)
|
||||||
|
);
|
||||||
|
for (const k in o)
|
||||||
|
if (new RegExp("(" + k + ")").test(_format))
|
||||||
|
_format = _format.replace(
|
||||||
|
RegExp.$1,
|
||||||
|
RegExp.$1.length === 1 ?
|
||||||
|
o[k] :
|
||||||
|
("00" + o[k]).substr(("" + o[k]).length)
|
||||||
|
);
|
||||||
|
return _format;
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.send{
|
||||||
|
font-size: 24rpx !important;
|
||||||
|
}
|
||||||
|
.order-time {
|
||||||
|
margin-top: 15rpx;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wrapper {
|
||||||
|
height: auto !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-list {
|
||||||
|
display: flex;
|
||||||
|
color: black;
|
||||||
|
font-size: 20rpx;
|
||||||
|
font-weight: bold;
|
||||||
|
width: 95%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-sn {
|
||||||
|
width: 350rpx;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.name-or-time {
|
||||||
|
width: 200rpx;
|
||||||
|
margin: 15rpx 15rpx;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.goods-card {
|
||||||
|
border-radius: 20rpx;
|
||||||
|
margin-top: 15rpx;
|
||||||
|
background-color: #ffffff;
|
||||||
|
padding-left: 12rpx;
|
||||||
|
width: 95%;
|
||||||
|
height: 120rpx;
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
color: #302c2b;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.image-box {
|
||||||
|
width: 122rpx;
|
||||||
|
height: 122rpx;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.image {
|
||||||
|
width: 122rpx;
|
||||||
|
border-radius: 10rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.goods-desc {
|
||||||
|
flex: 1;
|
||||||
|
overflow: hidden;
|
||||||
|
margin-left: 12rpx;
|
||||||
|
width: 400rpx;
|
||||||
|
|
||||||
|
.goods-desc-name {
|
||||||
|
font-size: 30rpx;
|
||||||
|
line-height: 1.5;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
overflow: hidden;
|
||||||
|
margin-bottom: 20rpx;
|
||||||
|
|
||||||
|
|
||||||
|
.goods-card-goods-name {
|
||||||
|
color: black;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
font-size: 26rpx;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.price {
|
||||||
|
margin-top: 50rpx;
|
||||||
|
line-height: 2;
|
||||||
|
margin-left: 5px;
|
||||||
|
font-size: 26rpx;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.send-goods {
|
||||||
|
color: #ffffff;
|
||||||
|
height: 50rpx;
|
||||||
|
width: 130rpx;
|
||||||
|
background-color: #f21c0c;
|
||||||
|
font-size: 24rpx;
|
||||||
|
border-radius: 17rpx;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 50rpx;
|
||||||
|
padding: 0 10rpx;
|
||||||
|
position: relative;
|
||||||
|
top: 20rpx;
|
||||||
|
right: 20rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.cancel {
|
||||||
|
color: #737373;
|
||||||
|
position: relative;
|
||||||
|
bottom: 40rpx;
|
||||||
|
left: 12%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cart-message {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bottom-dh-char {
|
||||||
|
background-color: #f9f9f9;
|
||||||
|
width: 750rpx;
|
||||||
|
height: 110rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-name {
|
||||||
|
text-align: right;
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: #737373;
|
||||||
|
margin-bottom: 10rpx;
|
||||||
|
margin-right: 10rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.other-name {
|
||||||
|
text-align: left;
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: #737373;
|
||||||
|
margin-bottom: 10rpx;
|
||||||
|
margin-left: 10rpx;
|
||||||
|
}
|
||||||
|
.dh-input {
|
||||||
|
line-height: 65rpx;
|
||||||
|
width: 500rpx;
|
||||||
|
height: 65rpx;
|
||||||
|
border-radius: 30rpx;
|
||||||
|
padding-left: 15rpx;
|
||||||
|
font-size: 22rpx;
|
||||||
|
background-color: #FFFFFF;
|
||||||
|
}
|
||||||
|
.column-time {
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.chat-img {
|
||||||
|
border-radius: 50%;
|
||||||
|
width: 100rpx;
|
||||||
|
height: 100rpx;
|
||||||
|
background-color: #f7f7f7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.padding-chat {
|
||||||
|
padding: 17rpx 20rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tb-nv {
|
||||||
|
width: 50rpx;
|
||||||
|
height: 50rpx;
|
||||||
|
}
|
||||||
|
.goods-desc-rice{
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: $main-color;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-top: 10rpx;
|
||||||
|
}
|
||||||
|
.order-item{
|
||||||
|
margin: 10rpx 0
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uni-page-head {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
z-index: 9999;
|
||||||
|
}
|
||||||
|
.bottom-dh{
|
||||||
|
position: fixed; // input 所在盒子设置绝对定位
|
||||||
|
flex-shrink: 0;
|
||||||
|
width: 100%;
|
||||||
|
left: 0;
|
||||||
|
bottom: 0; // 默认 0
|
||||||
|
z-index: 199;
|
||||||
|
padding-bottom: env(safe-area-inset-bottom);
|
||||||
|
background: #FFFFFF;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
@import "./index-app.scss";
|
||||||
|
</style>
|
||||||
237
pages/mine/im/list.vue
Normal file
237
pages/mine/im/list.vue
Normal file
@@ -0,0 +1,237 @@
|
|||||||
|
<template>
|
||||||
|
<view class="content">
|
||||||
|
<u-navbar class="my-title" title-size="32" :title="'消息(' + talkList.length + ')'"></u-navbar>
|
||||||
|
<scroll-view class="list-scroll-content" scroll-y @scrolltolower="loadData(tabIndex)">
|
||||||
|
|
||||||
|
<!-- 消息列表 -->
|
||||||
|
<div class="iconBox">
|
||||||
|
<view class="icon-list">
|
||||||
|
<view class="icon-item" @click="cleanUnread()">
|
||||||
|
<div class="bag bag1">
|
||||||
|
<u-icon name="trash" size="50" color="#fff"></u-icon>
|
||||||
|
</div>
|
||||||
|
<view>清除未读</view>
|
||||||
|
</view>
|
||||||
|
<view class="icon-item" @click="navigateTo('/pages/tabbar/home/title')">
|
||||||
|
<div class="bag bag2">
|
||||||
|
<u-icon name="bell" size="50" color="#fff"></u-icon>
|
||||||
|
</div>
|
||||||
|
<view>系统消息</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</div>
|
||||||
|
<u-search class="nav-search" v-model="userName" clearabled @change="userTalkList()" placeholder="搜索用户"
|
||||||
|
:show-action="false"></u-search>
|
||||||
|
<view class="talk-view" :key="index" v-for="(item, index) in talkList">
|
||||||
|
<view>
|
||||||
|
<view @click="onclickToTalkInfo(item)">
|
||||||
|
<view class="talk-item-view">
|
||||||
|
<view class="talk-img">
|
||||||
|
<u-avatar :src="item.face" :text="item.face ? '' : item.name" bg-color="#DDDDDD"></u-avatar>
|
||||||
|
</view>
|
||||||
|
<view class="talk-info">
|
||||||
|
<view class="talk-name u-line-2">{{ item.name }}
|
||||||
|
<u-tag class="talk-tag" size="mini" text="店铺" type="warning" v-if="item.storeFlag" />
|
||||||
|
</view>
|
||||||
|
<view class="talk-message">
|
||||||
|
<span v-if="item.lastMessageType == 'MESSAGE'">{{ item.lastTalkMessage }}</span>
|
||||||
|
<span v-if="item.lastMessageType == 'GOODS'">[商品链接]</span>
|
||||||
|
<span v-if="item.lastMessageType == 'ORDER'">[订单信息]</span>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="talk-time">
|
||||||
|
<view>
|
||||||
|
{{ beautifyTime(item.lastTalkTime) }}
|
||||||
|
</view>
|
||||||
|
<view>
|
||||||
|
<u-badge type="error" absolute :offset="[45, 20]" :count="item.unread"></u-badge>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<!-- 空白页 -->
|
||||||
|
<u-empty text="暂无信息" mode="list" v-if="talkList.length === 0"></u-empty>
|
||||||
|
</scroll-view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { getTalkList, clearmeaager } from "@/api/im.js";
|
||||||
|
import storage from "@/utils/storage.js";
|
||||||
|
import { beautifyTime } from "@/utils/filters.js"
|
||||||
|
export default {
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
storage,
|
||||||
|
count: {
|
||||||
|
loadStatus: "more",
|
||||||
|
},
|
||||||
|
talkList: [], //聊天列表
|
||||||
|
userName: '',
|
||||||
|
pointData: {}, //累计获取 未输入 集合
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
onShow () {
|
||||||
|
this.userTalkList();
|
||||||
|
},
|
||||||
|
onPullDownRefresh () {
|
||||||
|
this.userTalkList()
|
||||||
|
console.log('下拉事件');
|
||||||
|
setTimeout(function () {
|
||||||
|
uni.stopPullDownRefresh();
|
||||||
|
}, 1000);
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 触底加载
|
||||||
|
*/
|
||||||
|
onReachBottom () {
|
||||||
|
this.userTalkList();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
beautifyTime,
|
||||||
|
onclickToTalkInfo (val) {
|
||||||
|
storage.setTalkToUser(val)
|
||||||
|
uni.navigateTo({
|
||||||
|
url:
|
||||||
|
"/pages/mine/im/index?talkId=" + val.id,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 获取聊天列表
|
||||||
|
*/
|
||||||
|
userTalkList () {
|
||||||
|
let params = {
|
||||||
|
userName: this.userName,
|
||||||
|
}
|
||||||
|
uni.showLoading({
|
||||||
|
title: "加载中",
|
||||||
|
});
|
||||||
|
getTalkList(params).then((res) => {
|
||||||
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
|
if (res.data.success) {
|
||||||
|
this.talkList = res.data.result;
|
||||||
|
console.log(this.talkList, 'this.talkListthis.talkList');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
navigateTo (url) {
|
||||||
|
uni.navigateTo({
|
||||||
|
url,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
cleanUnread () {
|
||||||
|
clearmeaager().then((res) => {
|
||||||
|
console.log(res);
|
||||||
|
if (res.data.code == 200) {
|
||||||
|
this.userTalkList();
|
||||||
|
uni.showToast({
|
||||||
|
icon: "none",
|
||||||
|
title: res.data.message,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.talk-view {
|
||||||
|
border-radius: 20rpx;
|
||||||
|
background-color: #fff;
|
||||||
|
|
||||||
|
.talk-item-view {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
flex-direction: row;
|
||||||
|
padding: 10rpx 20rpx;
|
||||||
|
|
||||||
|
.talk-img {
|
||||||
|
width: 100rpx;
|
||||||
|
height: 100rpx;
|
||||||
|
margin-right: 10rpx;
|
||||||
|
margin-bottom: 10rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.talk-info {
|
||||||
|
padding-left: 30rpx;
|
||||||
|
flex: 1;
|
||||||
|
|
||||||
|
.talk-name {
|
||||||
|
font-size: 28rpx;
|
||||||
|
margin-bottom: 10rpx;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.talk-message {
|
||||||
|
font-size: 28rpx;
|
||||||
|
margin-top: 10rpx;
|
||||||
|
color: #888787;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.talk-tag {
|
||||||
|
margin-left: 10rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.talk-time {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.iconBox {
|
||||||
|
width: 94%;
|
||||||
|
margin: 0 3%;
|
||||||
|
background: #fff;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
box-shadow: 0 4rpx 24rpx 0 rgba($color: #f6f6f6, $alpha: 1);
|
||||||
|
// transform: translateY(-30rpx);
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-list {
|
||||||
|
height: 140rpx;
|
||||||
|
text-align: center;
|
||||||
|
font-size: $font-sm;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-around;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0 3%;
|
||||||
|
color: #999;
|
||||||
|
|
||||||
|
.icon-item {
|
||||||
|
position: relative;
|
||||||
|
line-height: 2em;
|
||||||
|
width: 96rpx;
|
||||||
|
|
||||||
|
:first-child {
|
||||||
|
font-size: 48rpx;
|
||||||
|
margin-bottom: 10rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.bag {
|
||||||
|
width: 56rpx;
|
||||||
|
height: 56rpx;
|
||||||
|
border-radius: 50%;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bag1 {
|
||||||
|
background: #ff0015;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bag2 {
|
||||||
|
background: #73AF7C;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
@import "./index-app.scss";
|
||||||
|
</style>
|
||||||
166
pages/mine/im/socket.js
Normal file
166
pages/mine/im/socket.js
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
import config from '@/config/config.js'
|
||||||
|
import storage from '@/utils/storage';
|
||||||
|
class socketIO {
|
||||||
|
constructor(data, time, url) {
|
||||||
|
this.socketTask = null
|
||||||
|
this.is_open_socket = false //避免重复连接
|
||||||
|
this.url = config.baseWsUrl + '/' + storage.getAccessToken() //连接地址
|
||||||
|
this.data = data ? data : null
|
||||||
|
this.connectNum = 1 // 重连次数
|
||||||
|
this.traderDetailIndex = 100 // traderDetailIndex ==2 重连
|
||||||
|
this.accountStateIndex = 100 // traderDetailIndex ==1 重连
|
||||||
|
this.followFlake = false // traderDetailIndex == true 重连
|
||||||
|
//心跳检测
|
||||||
|
this.timeout = time ? time : 15000 //多少秒执行检测
|
||||||
|
this.heartbeatInterval = null //检测服务器端是否还活着
|
||||||
|
this.reconnectTimeOut = null //重连之后多久再次重连
|
||||||
|
}
|
||||||
|
// 进入这个页面的时候创建websocket连接【整个页面随时使用】
|
||||||
|
connectSocketInit (data) {
|
||||||
|
this.data = data
|
||||||
|
this.socketTask = uni.connectSocket({
|
||||||
|
url: this.url,
|
||||||
|
success: () => {
|
||||||
|
console.log("正准备建立websocket中...");
|
||||||
|
// 返回实例
|
||||||
|
return this.socketTask
|
||||||
|
},
|
||||||
|
});
|
||||||
|
this.socketTask.onOpen((res) => {
|
||||||
|
this.connectNum = 1
|
||||||
|
console.log("WebSocket连接正常!");
|
||||||
|
this.send(data)
|
||||||
|
clearInterval(this.reconnectTimeOut)
|
||||||
|
clearInterval(this.heartbeatInterval)
|
||||||
|
this.is_open_socket = true;
|
||||||
|
this.start();
|
||||||
|
// 注:只有连接正常打开中 ,才能正常收到消息
|
||||||
|
this.socketTask.onMessage((e) => {
|
||||||
|
// 字符串转json
|
||||||
|
let res = JSON.parse(e.data);
|
||||||
|
console.log("res---------->", res) // 这里 查看 推送过来的消息
|
||||||
|
if (res.data) {
|
||||||
|
uni.$emit('getPositonsOrder', res);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})
|
||||||
|
// 监听连接失败,这里代码我注释掉的原因是因为如果服务器关闭后,和下面的onclose方法一起发起重连操作,这样会导致重复连接
|
||||||
|
uni.onSocketError((res) => {
|
||||||
|
console.log('WebSocket连接打开失败,请检查!');
|
||||||
|
this.socketTask = null
|
||||||
|
this.is_open_socket = false;
|
||||||
|
clearInterval(this.heartbeatInterval)
|
||||||
|
clearInterval(this.reconnectTimeOut)
|
||||||
|
uni.$off('getPositonsOrder')
|
||||||
|
if (this.connectNum < 6) {
|
||||||
|
uni.showToast({
|
||||||
|
title: `WebSocket连接失败,正尝试第${this.connectNum}次连接`,
|
||||||
|
icon: "none"
|
||||||
|
})
|
||||||
|
this.reconnect();
|
||||||
|
this.connectNum += 1
|
||||||
|
} else {
|
||||||
|
uni.$emit('connectError');
|
||||||
|
this.connectNum = 1
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// 这里仅是事件监听【如果socket关闭了会执行】
|
||||||
|
this.socketTask.onClose(() => {
|
||||||
|
console.log("已经被关闭了-------")
|
||||||
|
clearInterval(this.heartbeatInterval)
|
||||||
|
clearInterval(this.reconnectTimeOut)
|
||||||
|
this.is_open_socket = false;
|
||||||
|
this.socketTask = null
|
||||||
|
uni.$off('getPositonsOrder')
|
||||||
|
if (this.connectNum < 6) {
|
||||||
|
this.reconnect();
|
||||||
|
} else {
|
||||||
|
uni.$emit('connectError');
|
||||||
|
this.connectNum = 1
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 主动关闭socket连接
|
||||||
|
Close () {
|
||||||
|
if (!this.is_open_socket) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.socketTask.close({
|
||||||
|
success () {
|
||||||
|
uni.showToast({
|
||||||
|
title: 'SocketTask 关闭成功',
|
||||||
|
icon: "none"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
//发送消息
|
||||||
|
send (data) {
|
||||||
|
console.log("data---------->", data);
|
||||||
|
// 注:只有连接正常打开中 ,才能正常成功发送消息
|
||||||
|
if (this.socketTask) {
|
||||||
|
this.socketTask.send({
|
||||||
|
data: JSON.stringify(data),
|
||||||
|
async success () {
|
||||||
|
console.log("消息发送成功");
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//开启心跳检测
|
||||||
|
start () {
|
||||||
|
this.heartbeatInterval = setInterval(() => {
|
||||||
|
this.send({
|
||||||
|
"traderid": 10260,
|
||||||
|
"type": "Ping"
|
||||||
|
});
|
||||||
|
}, this.timeout)
|
||||||
|
}
|
||||||
|
//重新连接
|
||||||
|
reconnect () {
|
||||||
|
//停止发送心跳
|
||||||
|
clearInterval(this.heartbeatInterval)
|
||||||
|
//如果不是人为关闭的话,进行重连
|
||||||
|
if (!this.is_open_socket && (this.traderDetailIndex == 2 || this.accountStateIndex == 0 || this
|
||||||
|
.followFlake)) {
|
||||||
|
this.reconnectTimeOut = setInterval(() => {
|
||||||
|
this.connectSocketInit(this.data);
|
||||||
|
}, 5000)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @description 将 scoket 数据进行过滤
|
||||||
|
* @param {array} array
|
||||||
|
* @param {string} type 区分 弹窗 openposition 分为跟随和我的
|
||||||
|
*/
|
||||||
|
arrayFilter (array, type = 'normal', signalId = 0) {
|
||||||
|
let arr1 = []
|
||||||
|
let arr2 = []
|
||||||
|
let obj = {
|
||||||
|
arr1: [],
|
||||||
|
arr2: []
|
||||||
|
}
|
||||||
|
arr1 = array.filter(v => v.flwsig == true)
|
||||||
|
arr2 = array.filter(v => v.flwsig == false)
|
||||||
|
if (type == 'normal') {
|
||||||
|
if (signalId) {
|
||||||
|
arr1 = array.filter(v => v.flwsig == true && v.sigtraderid == signalId)
|
||||||
|
return arr1
|
||||||
|
} else {
|
||||||
|
return arr1.concat(arr2)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (signalId > 0) {
|
||||||
|
arr1 = array.filter(v => v.flwsig == true && v.sigtraderid == signalId)
|
||||||
|
obj.arr1 = arr1
|
||||||
|
} else {
|
||||||
|
obj.arr1 = arr1
|
||||||
|
}
|
||||||
|
obj.arr2 = arr2
|
||||||
|
return obj
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export {
|
||||||
|
socketIO
|
||||||
|
}
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
background: #f9f9f9;
|
background: #f9f9f9;
|
||||||
}
|
}
|
||||||
|
|
||||||
/deep/ .u-col-2 {
|
::v-deep .u-col-2 {
|
||||||
height: 60px;
|
height: 60px;
|
||||||
line-height: 60px;
|
line-height: 60px;
|
||||||
text-align: center !important;
|
text-align: center !important;
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ export default {
|
|||||||
title:"加载中"
|
title:"加载中"
|
||||||
})
|
})
|
||||||
API_Message.getLogisticsMessages(this.params).then(async response => {
|
API_Message.getLogisticsMessages(this.params).then(async response => {
|
||||||
uni.hideLoading()
|
if (this.$store.state.isShowToast){ uni.hideLoading() }
|
||||||
const { data } = response
|
const { data } = response
|
||||||
if (!data || !data.length) {
|
if (!data || !data.length) {
|
||||||
this.messageList.push(...data.data)
|
this.messageList.push(...data.data)
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ export default {
|
|||||||
title: "加载中"
|
title: "加载中"
|
||||||
});
|
});
|
||||||
API_Message.getMessages(this.params).then(async response => {
|
API_Message.getMessages(this.params).then(async response => {
|
||||||
uni.hideLoading();
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
const { data } = response;
|
const { data } = response;
|
||||||
if (!data || !data.length) {
|
if (!data || !data.length) {
|
||||||
this.messageList.push(...data.data);
|
this.messageList.push(...data.data);
|
||||||
|
|||||||
@@ -1,56 +1,53 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="content">
|
<view class="content">
|
||||||
<view class="navbar">
|
<u-navbar>
|
||||||
<!-- 循环出顶部nav栏 -->
|
<u-tabs :active-color="lightColor" class="slot-wrap" :list="navList" count="count" :is-scroll="true" :current="tabCurrentIndex" @change="tabClick"></u-tabs>
|
||||||
<view v-for="(item, index) in navList" :key="index" class="nav-item" @click="tabClick(index)">
|
</u-navbar>
|
||||||
<text :class="{current: tabCurrentIndex === index}">{{item.text}}</text>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<view class="swiper-box">
|
<view class="swiper-box">
|
||||||
<!-- 显示商品栏 -->
|
<!-- 显示商品栏 -->
|
||||||
<view v-if="tabCurrentIndex == 0" class="tab-content">
|
<view v-if="tabCurrentIndex == 0" class="tab-content">
|
||||||
<scroll-view class="list-scroll-content" scroll-y @scrolltolower="loadMore">
|
<scroll-view class="list-scroll-content" scroll-y>
|
||||||
<!-- 空白页 -->
|
<!-- 空白页 -->
|
||||||
<u-empty style="margin-top:40rpx;" text="暂无收藏商品数据" mode="favor" v-if="goodsEmpty"></u-empty>
|
<u-empty style="margin-top: 40rpx" text="暂无收藏商品数据" mode="favor" v-if="goodsEmpty"></u-empty>
|
||||||
<!-- 商品展示数据 -->
|
<!-- 商品展示数据 -->
|
||||||
<u-swipe-action @open="openLeftChange(item,index,'goods')" :show="item.selected" btn-width="180"
|
<u-swipe-action @open="openLeftChange(item, index, 'goods')" :show="item.selected" btn-width="180"
|
||||||
:options="LeftOptions" v-else v-for="(item,index) in goodList" @click="clickGoodsSwiperAction(item,index)"
|
:options="LeftOptions" v-else v-for="(item, index) in goodList"
|
||||||
:index="index" :key="index">
|
@click="clickGoodsSwiperAction(item, index)" :index="index" :key="index">
|
||||||
<view class="goods" @click="goGoodsDetail(item)">
|
<view class="goods" @click="goGoodsDetail(item)">
|
||||||
<u-image width="131rpx" height="131rpx" :src="item.image" mode="aspectFit">
|
<u-image width="131rpx" height="131rpx" :src="item.image" mode="aspectFit">
|
||||||
<u-loading slot="loading"></u-loading>
|
<u-loading slot="loading"></u-loading>
|
||||||
</u-image>
|
</u-image>
|
||||||
<view class="goods-intro">
|
<view class="goods-intro">
|
||||||
<view>{{item.goodsName}}</view>
|
<view>{{ item.goodsName }}</view>
|
||||||
<view class="goods-sn">{{item.goods_sn}}</view>
|
<view class="goods-sn">{{ item.goods_sn }}</view>
|
||||||
<view>¥{{item.price | unitPrice}}</view>
|
<view>¥{{ item.price | unitPrice }}</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</u-swipe-action>
|
</u-swipe-action>
|
||||||
|
|
||||||
<uni-load-more :status="goodsLoad"></uni-load-more>
|
|
||||||
</scroll-view>
|
</scroll-view>
|
||||||
</view>
|
</view>
|
||||||
<!-- 显示收藏的店铺栏 -->
|
<!-- 显示收藏的店铺栏 -->
|
||||||
<view v-else class="tab-content">
|
<view v-else class="tab-content">
|
||||||
<scroll-view class="list-scroll-content" scroll-y @scrolltolower="loadMore">
|
<scroll-view class="list-scroll-content" scroll-y>
|
||||||
<!-- 空白页 -->
|
<!-- 空白页 -->
|
||||||
<u-empty style="margin-top:40rpx;" text="暂无收藏店铺数据" mode="favor" v-if="storeEmpty"></u-empty>
|
<u-empty style="margin-top: 40rpx" text="暂无收藏店铺数据" mode="favor" v-if="storeEmpty"></u-empty>
|
||||||
<!-- 店铺展示数据 -->
|
<!-- 店铺展示数据 -->
|
||||||
<u-swipe-action @open="openLeftChange(item,'store')" :show="item.selected" btn-width="180"
|
<u-swipe-action @open="openLeftChange(item, 'store')" :show="item.selected" btn-width="180"
|
||||||
:options="LeftOptions" v-else v-for="(item,index) in storeList" :key="index"
|
:options="LeftOptions" v-else v-for="(item, index) in storeList" :key="index"
|
||||||
@click="clickstoreSwiperAction(item)">
|
@click="clickStoreSwiperAction(item)">
|
||||||
<view class="store" @click="gostoreMainPage(item.id)">
|
<view class="store" @click="goStoreMainPage(item.id)">
|
||||||
<view class="intro">
|
<view class="intro">
|
||||||
<view class="store-logo">
|
<view class="store-logo">
|
||||||
<u-image width="102rpx" height="102rpx" :src="item.storeLogo" :alt="item.storeName" mode="aspectFit">
|
<u-image width="102rpx" height="102rpx" :src="item.storeLogo" :alt="item.storeName"
|
||||||
|
mode="aspectFit">
|
||||||
<u-loading slot="loading"></u-loading>
|
<u-loading slot="loading"></u-loading>
|
||||||
</u-image>
|
</u-image>
|
||||||
</view>
|
</view>
|
||||||
<view class="store-name">
|
<view class="store-name">
|
||||||
<view>{{item.storeName}}</view>
|
<view>{{ item.storeName }}</view>
|
||||||
<u-tag size="mini" type="error" :color="$mainColor" v-if="item.selfOperated" text="自营" mode="plain"
|
<u-tag size="mini" type="error" :color="$mainColor" v-if="item.selfOperated"
|
||||||
shape="circle" />
|
text="自营" mode="plain" shape="circle" />
|
||||||
</view>
|
</view>
|
||||||
<view class="store-collect">
|
<view class="store-collect">
|
||||||
<view>进店逛逛</view>
|
<view>进店逛逛</view>
|
||||||
@@ -58,7 +55,6 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</u-swipe-action>
|
</u-swipe-action>
|
||||||
<uni-load-more :status="storeLoad"></uni-load-more>
|
|
||||||
</scroll-view>
|
</scroll-view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -66,62 +62,86 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {
|
import {
|
||||||
getGoodsCollection,
|
getGoodsCollection,
|
||||||
|
getStoreCollection,
|
||||||
deleteGoodsCollection,
|
deleteGoodsCollection,
|
||||||
deleteStoreCollection,
|
deleteStoreCollection,
|
||||||
} from "@/api/members.js";
|
} from "@/api/members.js";
|
||||||
export default {
|
export default {
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
lightColor:this.$lightColor,
|
||||||
// 商品左滑侧边栏
|
// 商品左滑侧边栏
|
||||||
LeftOptions: [
|
LeftOptions: [{
|
||||||
{
|
|
||||||
text: "取消",
|
text: "取消",
|
||||||
style: {
|
style: {
|
||||||
backgroundColor: this.$lightColor,
|
backgroundColor: this.$lightColor,
|
||||||
},
|
},
|
||||||
},
|
}, ],
|
||||||
],
|
|
||||||
tabCurrentIndex: 0, //tab的下标默认为0,也就是说会默认请求商品
|
tabCurrentIndex: 0, //tab的下标默认为0,也就是说会默认请求商品
|
||||||
navList: [
|
navList: [
|
||||||
//tab显示数据
|
//tab显示数据
|
||||||
{
|
{
|
||||||
text: "商品(0)",
|
name: "商品(0)",
|
||||||
loadingType: "more",
|
|
||||||
params: {
|
params: {
|
||||||
pageNumber: 1,
|
pageNumber: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: "店铺(0)",
|
name: "店铺(0)",
|
||||||
loadingType: "more",
|
|
||||||
params: {
|
params: {
|
||||||
pageNumber: 1,
|
pageNumber: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
goodsLoad: "more", //商品加载
|
|
||||||
storeLoad: "more", //店铺加载
|
|
||||||
goodsEmpty: false, //商品数据是否为空
|
goodsEmpty: false, //商品数据是否为空
|
||||||
storeEmpty: false, //店铺数据是否为空
|
storeEmpty: false, //店铺数据是否为空
|
||||||
goodList: [], //商品集合
|
goodList: [], //商品集合
|
||||||
storeList: [], //店铺集合
|
storeList: [], //店铺集合
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
onLoad() {
|
onShow() {
|
||||||
this.getGoodList();
|
this.fetchReloadOrNextPage('reload')
|
||||||
this.getstoreList();
|
},
|
||||||
|
onReachBottom() {
|
||||||
|
this.fetchReloadOrNextPage('next')
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
|
// 刷新或者下一页
|
||||||
|
fetchReloadOrNextPage(type) {
|
||||||
|
if(type == 'next'){
|
||||||
|
this.navList[this.tabCurrentIndex].params.pageNumber ++;
|
||||||
|
if (this.tabCurrentIndex == 0) {
|
||||||
|
this.getGoodList();
|
||||||
|
} else {
|
||||||
|
this.getStoreList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
this.navList[0].params.pageNumber = 1;
|
||||||
|
this.navList[1].params.pageNumber = 1;
|
||||||
|
this.goodList = [];
|
||||||
|
this.storeList = [];
|
||||||
|
this.getGoodList();
|
||||||
|
this.getStoreList();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 打开商品左侧取消收藏
|
* 打开商品左侧取消收藏
|
||||||
*/
|
*/
|
||||||
openLeftChange(val, type) {
|
openLeftChange(val, type) {
|
||||||
const { goodList, storeList } = this;
|
const {
|
||||||
|
goodList,
|
||||||
|
storeList
|
||||||
|
} = this;
|
||||||
let way;
|
let way;
|
||||||
type == "goods" ? (way = goodList) : (way = storeList);
|
type == "goods" ? (way = goodList) : (way = storeList);
|
||||||
way.forEach((item) => {
|
way.forEach((item) => {
|
||||||
@@ -147,11 +167,11 @@ export default {
|
|||||||
/**
|
/**
|
||||||
* 点击店铺左侧取消收藏
|
* 点击店铺左侧取消收藏
|
||||||
*/
|
*/
|
||||||
clickstoreSwiperAction(val) {
|
clickStoreSwiperAction(val) {
|
||||||
deleteStoreCollection(val.storeId).then((res) => {
|
deleteStoreCollection(val.id).then((res) => {
|
||||||
if (res.statusCode == 200) {
|
if (res.statusCode == 200) {
|
||||||
this.storeList = [];
|
this.storeList = [];
|
||||||
this.getstoreList();
|
this.getStoreList();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@@ -176,7 +196,7 @@ export default {
|
|||||||
/**
|
/**
|
||||||
* 查看店铺详情
|
* 查看店铺详情
|
||||||
*/
|
*/
|
||||||
gostoreMainPage(id) {
|
goStoreMainPage(id) {
|
||||||
//店铺主页
|
//店铺主页
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
url: "/pages/product/shopPage?id=" + id,
|
url: "/pages/product/shopPage?id=" + id,
|
||||||
@@ -191,12 +211,13 @@ export default {
|
|||||||
title: "加载中",
|
title: "加载中",
|
||||||
});
|
});
|
||||||
getGoodsCollection(this.navList[0].params, "GOODS").then((res) => {
|
getGoodsCollection(this.navList[0].params, "GOODS").then((res) => {
|
||||||
uni.hideLoading();
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
uni.stopPullDownRefresh();
|
uni.stopPullDownRefresh();
|
||||||
if (res.data.success) {
|
if (res.data.success) {
|
||||||
let data = res.data.result;
|
let data = res.data.result;
|
||||||
data.selected = false;
|
data.selected = false;
|
||||||
this.navList[0].text = `商品(${data.total})`;
|
this.navList[0].name = `商品(${data.total})`;
|
||||||
|
|
||||||
if (data.total == 0) {
|
if (data.total == 0) {
|
||||||
this.goodsEmpty = true;
|
this.goodsEmpty = true;
|
||||||
} else if (data.total < 10) {
|
} else if (data.total < 10) {
|
||||||
@@ -213,42 +234,26 @@ export default {
|
|||||||
/**
|
/**
|
||||||
* 获取店铺集合
|
* 获取店铺集合
|
||||||
*/
|
*/
|
||||||
getstoreList() {
|
getStoreList() {
|
||||||
uni.showLoading({
|
uni.showLoading({
|
||||||
title: "加载中",
|
title: "加载中",
|
||||||
});
|
});
|
||||||
getGoodsCollection(this.navList[1].params, "store").then((res) => {
|
getStoreCollection(this.navList[1].params, "STORE").then((res) => {
|
||||||
uni.hideLoading();
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
uni.stopPullDownRefresh();
|
uni.stopPullDownRefresh();
|
||||||
if (res.data.success) {
|
if (res.data.success) {
|
||||||
let data = res.data.result;
|
let data = res.data.result;
|
||||||
data.selected = false;
|
data.selected = false;
|
||||||
this.navList[1].text = `店铺(${data.total})`;
|
this.navList[1].name = `店铺(${data.total})`;
|
||||||
if (data.total == 0) {
|
if (data.total == 0) {
|
||||||
this.storeEmpty = true;
|
this.storeEmpty = true;
|
||||||
} else if (data.total < 10) {
|
} else if (data.total < 10) {
|
||||||
this.storeLoad = "noMore";
|
|
||||||
this.storeList.push(...data.records);
|
this.storeList.push(...data.records);
|
||||||
} else {
|
|
||||||
this.storeList.push(...data.records);
|
|
||||||
if (data.total.length < 10) this.storeLoad = "noMore";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
|
||||||
* 底部加载更多
|
|
||||||
*/
|
|
||||||
loadMore() {
|
|
||||||
if (this.tabCurrentIndex == 0) {
|
|
||||||
this.navList[0].params.pageNumber++;
|
|
||||||
this.getGoodList();
|
|
||||||
} else {
|
|
||||||
this.navList[1].params.pageNumber++;
|
|
||||||
this.getstoreList();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -262,35 +267,44 @@ export default {
|
|||||||
} else {
|
} else {
|
||||||
this.navList[1].params.pageNumber = 1;
|
this.navList[1].params.pageNumber = 1;
|
||||||
this.storeList = [];
|
this.storeList = [];
|
||||||
this.getstoreList();
|
this.getStoreList();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
page,
|
page,
|
||||||
.content {
|
.content {
|
||||||
background: $page-color-base;
|
background: $page-color-base;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
.content {
|
|
||||||
width: 100%;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
.swiper-box {
|
|
||||||
overflow-y: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.list-scroll-content {
|
.slot-wrap{
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
padding-right: 72rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swiper-box {
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list-scroll-content {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
/deep/ .u-swipe-content {
|
::v-deep .u-swipe-content {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
.goods {
|
|
||||||
|
.goods {
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
border-bottom: 1px solid $border-color-light;
|
border-bottom: 1px solid $border-color-light;
|
||||||
height: 190rpx;
|
height: 190rpx;
|
||||||
@@ -298,11 +312,13 @@ page,
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 30rpx 20rpx;
|
padding: 30rpx 20rpx;
|
||||||
margin-top: 20rpx;
|
margin-top: 20rpx;
|
||||||
|
|
||||||
image {
|
image {
|
||||||
width: 131rpx;
|
width: 131rpx;
|
||||||
height: 131rpx;
|
height: 131rpx;
|
||||||
border-radius: 10rpx;
|
border-radius: 10rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.goods-intro {
|
.goods-intro {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
font-size: $font-base;
|
font-size: $font-base;
|
||||||
@@ -316,14 +332,17 @@ page,
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
color: #666;
|
color: #666;
|
||||||
}
|
}
|
||||||
|
|
||||||
view:nth-child(2) {
|
view:nth-child(2) {
|
||||||
color: #cccccc;
|
color: #cccccc;
|
||||||
font-size: 24rpx;
|
font-size: 24rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
view:nth-child(3) {
|
view:nth-child(3) {
|
||||||
color: $light-color;
|
color: $light-color;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
button {
|
button {
|
||||||
color: $main-color;
|
color: $main-color;
|
||||||
height: 50rpx;
|
height: 50rpx;
|
||||||
@@ -333,16 +352,19 @@ page,
|
|||||||
line-height: 50rpx;
|
line-height: 50rpx;
|
||||||
background-color: #ffffff;
|
background-color: #ffffff;
|
||||||
margin-top: 80rpx;
|
margin-top: 80rpx;
|
||||||
|
|
||||||
&::after {
|
&::after {
|
||||||
border-color: $main-color;
|
border-color: $main-color;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.store {
|
|
||||||
|
.store {
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
border: 1px solid $border-color-light;
|
border: 1px solid $border-color-light;
|
||||||
border-radius: 16rpx;
|
border-radius: 16rpx;
|
||||||
margin: 20rpx 10rpx;
|
margin: 20rpx 10rpx;
|
||||||
|
|
||||||
.intro {
|
.intro {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
@@ -355,36 +377,43 @@ page,
|
|||||||
height: 102rpx;
|
height: 102rpx;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
image {
|
image {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.store-name {
|
.store-name {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
margin-left: 30rpx;
|
margin-left: 30rpx;
|
||||||
line-height: 2em;
|
line-height: 2em;
|
||||||
|
|
||||||
:first-child {
|
:first-child {
|
||||||
font-size: $font-base;
|
font-size: $font-base;
|
||||||
}
|
}
|
||||||
|
|
||||||
:last-child {
|
:last-child {
|
||||||
font-size: $font-sm;
|
font-size: $font-sm;
|
||||||
color: #999;
|
color: #999;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.store-collect {
|
.store-collect {
|
||||||
border-left: 1px solid $border-color-light;
|
border-left: 1px solid $border-color-light;
|
||||||
padding-left: 20rpx;
|
padding-left: 20rpx;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
:last-child {
|
:last-child {
|
||||||
color: #999;
|
color: #999;
|
||||||
font-size: $font-sm;
|
font-size: $font-sm;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.navbar {
|
|
||||||
|
.navbar {
|
||||||
display: flex;
|
display: flex;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
padding: 0 5px;
|
padding: 0 5px;
|
||||||
@@ -392,6 +421,7 @@ page,
|
|||||||
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.06);
|
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.06);
|
||||||
position: relative;
|
position: relative;
|
||||||
z-index: 10;
|
z-index: 10;
|
||||||
|
|
||||||
.nav-item {
|
.nav-item {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -403,10 +433,12 @@ page,
|
|||||||
text {
|
text {
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
text.current {
|
text.current {
|
||||||
color: $light-color;
|
color: $light-color;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
|
|
||||||
&::after {
|
&::after {
|
||||||
content: "";
|
content: "";
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@@ -418,5 +450,5 @@ page,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,18 +1,29 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="myTracks">
|
<view class="myTracks">
|
||||||
|
<u-navbar title="我的足迹">
|
||||||
|
<div slot="right">
|
||||||
|
<div class="light-color edit" @click="isEdit = !isEdit">{{ !isEdit ? '编辑' : '完成'}}</div>
|
||||||
|
</div>
|
||||||
|
</u-navbar>
|
||||||
|
<u-notice-bar mode="vertical" :list="['右划删除浏览记录']"></u-notice-bar>
|
||||||
<u-empty text="暂无历史记录" style="margin-top:200rpx;" mode="history" v-if="whetherEmpty"></u-empty>
|
<u-empty text="暂无历史记录" style="margin-top:200rpx;" mode="history" v-if="whetherEmpty"></u-empty>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<view v-for="(item, index) in trackList" :key="index">
|
<view v-for="(item, index) in trackList" :key="index">
|
||||||
<view class="myTracks-title" @click="navgaiteToStore(item)">{{item.storeName}}</view>
|
<view class="myTracks-title" @click="navigateToStore(item)">{{item.storeName}}</view>
|
||||||
<view class="myTracks-items">
|
<view class="myTracks-items">
|
||||||
|
|
||||||
|
<u-swipe-action style="width: 100%;" :show="item.show" :index="index" :key="item.id"
|
||||||
|
@click="delTracks" @open="open" :options="options">
|
||||||
|
|
||||||
<view class="myTracks-item">
|
<view class="myTracks-item">
|
||||||
<u-checkbox-group>
|
<u-checkbox-group v-if="isEdit" class="store-line-check">
|
||||||
<u-checkbox v-model="item.___isDel" v-if="editFlag" active-color="#ff6b35" style="margin-right: 10rpx" @change="changeChecked(item)"></u-checkbox>
|
<u-checkbox shape="circle" :active-color="lightColor" v-model="item.checked"
|
||||||
|
@change="checkboxChangeDP(item)"></u-checkbox>
|
||||||
</u-checkbox-group>
|
</u-checkbox-group>
|
||||||
<view class="myTracks-item-img" @click.stop="navgaiteToDetail(item)">
|
<view class="myTracks-item-img" @click.stop="navigateToDetail(item)">
|
||||||
<image :src="item.thumbnail"></image>
|
<image :src="item.thumbnail"></image>
|
||||||
</view>
|
</view>
|
||||||
<view class="myTracks-item-content" @click.stop="navgaiteToDetail(item)">
|
<view class="myTracks-item-content" @click.stop="navigateToDetail(item)">
|
||||||
<view class="myTracks-item-title">
|
<view class="myTracks-item-title">
|
||||||
{{ item.goodsName }}
|
{{ item.goodsName }}
|
||||||
<view class="myTracks-item-title-desc"> </view>
|
<view class="myTracks-item-title-desc"> </view>
|
||||||
@@ -22,47 +33,44 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
</u-swipe-action>
|
||||||
|
|
||||||
</view>
|
</view>
|
||||||
<view class="myTracks-divider"></view>
|
<view class="myTracks-divider"></view>
|
||||||
|
|
||||||
</view>
|
</view>
|
||||||
<uni-load-more :status="loadStatus"></uni-load-more>
|
<div @click="handleClickDeleteSelected" v-if="isEdit" class="submit">
|
||||||
|
删除所选
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<view v-if="editFlag">
|
|
||||||
<view class="myTracks-action-placeholder"></view>
|
|
||||||
<view class="myTracks-action">
|
|
||||||
<view class="myTracks-action-check">
|
|
||||||
<u-checkbox-group>
|
|
||||||
<u-checkbox v-model="allChecked" v-if="editFlag" active-color="#ff6b35" style="margin-right: 10rpx" @change="checkedAllitem"></u-checkbox>
|
|
||||||
全选
|
|
||||||
</u-checkbox-group>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<view>
|
|
||||||
<u-button type="warning" plain="true" @click="delAllTracks" class="myTracks-action-btn">
|
|
||||||
删除
|
|
||||||
</u-button>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { myTrackList, deleteHistoryListId } from "@/api/members.js";
|
import {
|
||||||
|
myTrackList,
|
||||||
|
deleteHistoryListId
|
||||||
|
} from "@/api/members.js";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
editFlag: false, //是否编辑
|
isEdit:false,
|
||||||
allChecked: false, //是否全选
|
|
||||||
loadStatus: "more", //底部下拉加载状态
|
|
||||||
whetherEmpty: false, //是否数据为空
|
whetherEmpty: false, //是否数据为空
|
||||||
params: {
|
params: {
|
||||||
pageNumber: 1,
|
pageNumber: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
|
order: "desc",
|
||||||
|
sort: "updateTime",
|
||||||
},
|
},
|
||||||
|
lightColor:this.$lightColor,
|
||||||
|
options: [{
|
||||||
|
text: '删除',
|
||||||
|
style: {
|
||||||
|
backgroundColor: '#dd524d'
|
||||||
|
}
|
||||||
|
}],
|
||||||
trackList: [], //足迹列表
|
trackList: [], //足迹列表
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
@@ -71,56 +79,54 @@ export default {
|
|||||||
* 滑到底部加载下一页数据
|
* 滑到底部加载下一页数据
|
||||||
*/
|
*/
|
||||||
onReachBottom() {
|
onReachBottom() {
|
||||||
if (this.loadStatus != "noMore") {
|
|
||||||
this.params.pageNumber++;
|
this.params.pageNumber++;
|
||||||
this.getList();
|
this.getList();
|
||||||
}
|
|
||||||
},
|
},
|
||||||
onLoad() {
|
onShow() {
|
||||||
|
this.params.pageNumber = 1
|
||||||
|
this.trackList = [];
|
||||||
|
this.getList();
|
||||||
|
},
|
||||||
|
onPullDownRefresh() {
|
||||||
|
this.trackList = [];
|
||||||
this.getList();
|
this.getList();
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
checkboxChangeDP(val){
|
||||||
|
console.log(val)
|
||||||
|
},
|
||||||
|
// 删除所选的数据
|
||||||
|
handleClickDeleteSelected(val){
|
||||||
|
const ids = this.trackList.filter(item=>item.checked).map(item=>item.goodsId);
|
||||||
|
if(!ids.length){
|
||||||
|
uni.showToast({
|
||||||
|
title:"请选择删除数据",
|
||||||
|
icon:"none"
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
this.delTracks(0,ids)
|
||||||
|
}
|
||||||
|
},
|
||||||
/**
|
/**
|
||||||
* 导航到店铺
|
* 导航到店铺
|
||||||
*/
|
*/
|
||||||
navgaiteToStore(val) {
|
navigateToStore(val) {
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
url: "/pages/product/shopPage?id=" + val.storeId,
|
url: "/pages/product/shopPage?id=" + val.storeId,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
open(index) {
|
||||||
/**
|
// 先将正在被操作的swipeAction标记为打开状态,否则由于props的特性限制,
|
||||||
* 设置右侧导航栏文本
|
// 原本为'false',再次设置为'false'会无效
|
||||||
*/
|
this.trackList[index].show = true;
|
||||||
setStyle(text) {
|
this.trackList.map((val, idx) => {
|
||||||
//导航按钮文本设置
|
if (index != idx) this.trackList[idx].show = false;
|
||||||
let pages = getCurrentPages();
|
})
|
||||||
let page = pages[pages.length - 1];
|
|
||||||
// #ifdef APP-PLUS
|
|
||||||
let currentWebview = page.$getAppWebview();
|
|
||||||
let titleNView = currentWebview.getStyle().titleNView;
|
|
||||||
titleNView.buttons[0].text = text;
|
|
||||||
if (text == "完成") {
|
|
||||||
this.trackList.forEach((key) => {
|
|
||||||
key.history.forEach((item) => {
|
|
||||||
this.$set(item, "___isDel", false);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
currentWebview.setStyle({
|
|
||||||
titleNView: titleNView,
|
|
||||||
});
|
|
||||||
// #endif
|
|
||||||
// #ifdef H5
|
|
||||||
// h5 临时方案
|
|
||||||
document.getElementsByClassName("uni-btn-icon")[1].innerText = text;
|
|
||||||
// #endif
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 跳转详情
|
* 跳转详情
|
||||||
*/
|
*/
|
||||||
navgaiteToDetail(item) {
|
navigateToDetail(item) {
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
url: "/pages/product/goods?id=" + item.id + "&goodsId=" + item.goodsId,
|
url: "/pages/product/goods?id=" + item.id + "&goodsId=" + item.goodsId,
|
||||||
});
|
});
|
||||||
@@ -137,60 +143,31 @@ export default {
|
|||||||
uni.stopPullDownRefresh();
|
uni.stopPullDownRefresh();
|
||||||
uni.hideLoading();
|
uni.hideLoading();
|
||||||
if (res.statusCode == 200) {
|
if (res.statusCode == 200) {
|
||||||
res.data.result &&
|
res.data.result.records.length &&
|
||||||
res.data.result.forEach((item) => {
|
res.data.result.records.forEach((item) => {
|
||||||
item.___isDel = false;
|
item.show = false;
|
||||||
|
item.checked = false
|
||||||
});
|
});
|
||||||
|
|
||||||
let data = res.data.result;
|
let data = res.data.result.records;
|
||||||
if (data.total == 0) {
|
if (data.total == 0) {
|
||||||
this.whetherEmpty = true;
|
this.whetherEmpty = true;
|
||||||
} else if (data.total < 10) {
|
|
||||||
this.loadStatus = "noMore";
|
|
||||||
this.trackList.push(...data);
|
|
||||||
} else {
|
} else {
|
||||||
this.trackList.push(...data);
|
this.trackList.push(...data);
|
||||||
if (data.length < 10) this.loadStatus = "noMore";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
|
||||||
* 点击后判断是不是全选
|
|
||||||
*/
|
|
||||||
changeChecked(val) {
|
|
||||||
const isCheckedAll = this.trackList.every((key) => {
|
|
||||||
return key.___isDel == val.___isDel;
|
|
||||||
});
|
|
||||||
this.allChecked = isCheckedAll;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 点击全选按钮
|
|
||||||
*/
|
|
||||||
checkedAllitem() {
|
|
||||||
//全选按钮
|
|
||||||
this.trackList.forEach((key) => {
|
|
||||||
this.$set(key, "___isDel", this.allChecked);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除足迹
|
* 删除足迹
|
||||||
*/
|
*/
|
||||||
delAllTracks() {
|
delTracks(index,ids) {
|
||||||
let way = [];
|
deleteHistoryListId(ids || this.trackList[index].goodsId).then((res) => {
|
||||||
this.trackList.forEach((key) => {
|
|
||||||
if (key.___isDel) {
|
|
||||||
way.push(key.goodsId);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (way.length == 0) return false;
|
|
||||||
deleteHistoryListId(way).then((res) => {
|
|
||||||
if (res.data.code == 200) {
|
if (res.data.code == 200) {
|
||||||
this.trackList = [];
|
this.trackList = [];
|
||||||
this.allChecked = false;
|
this.params.pageNumber = 1
|
||||||
this.getList();
|
this.getList();
|
||||||
} else {
|
} else {
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
@@ -202,28 +179,29 @@ export default {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
};
|
||||||
/**
|
|
||||||
* 右侧标签栏切换
|
|
||||||
*/
|
|
||||||
onNavigationBarButtonTap(e) {
|
|
||||||
if (!this.editFlag) {
|
|
||||||
this.setStyle("完成");
|
|
||||||
} else {
|
|
||||||
this.setStyle("编辑");
|
|
||||||
}
|
|
||||||
this.editFlag = !this.editFlag;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.myTracks {
|
.submit{
|
||||||
|
position: fixed;
|
||||||
|
bottom: 20rpx;
|
||||||
|
left: 10%;
|
||||||
|
width: 80%;
|
||||||
|
height: 80rpx;
|
||||||
|
color: #fff;
|
||||||
|
border-radius: 100px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
background: $light-color;
|
||||||
|
}
|
||||||
|
.myTracks {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding-top: 2rpx;
|
padding-top: 2rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.myTracks-title {
|
.myTracks-title {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 110rpx;
|
height: 110rpx;
|
||||||
padding-left: 20rpx;
|
padding-left: 20rpx;
|
||||||
@@ -235,18 +213,18 @@ export default {
|
|||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
display: -webkit-flex;
|
display: -webkit-flex;
|
||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
|
|
||||||
.myTracks-items {
|
.myTracks-items {
|
||||||
padding-top: 2rpx;
|
padding-top: 2rpx;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
display: -webkit-flex;
|
display: -webkit-flex;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
.myTracks-item {
|
.myTracks-item {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 226rpx;
|
height: 226rpx;
|
||||||
padding-left: 20rpx;
|
padding-left: 20rpx;
|
||||||
@@ -259,53 +237,68 @@ export default {
|
|||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
display: -webkit-flex;
|
display: -webkit-flex;
|
||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
|
|
||||||
.myTracks-item-img {
|
.myTracks-item-img {
|
||||||
margin-right: 20rpx;
|
margin-right: 20rpx;
|
||||||
border-radius: 8rpx;
|
border-radius: 8rpx;
|
||||||
|
|
||||||
image {
|
image {
|
||||||
width: 130rpx;
|
width: 130rpx;
|
||||||
height: 130rpx;
|
height: 130rpx;
|
||||||
border-radius: 8rpx;
|
border-radius: 8rpx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.myTracks-item-title {
|
.myTracks-item-title {
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
color: #333;
|
color: #333;
|
||||||
}
|
}
|
||||||
|
|
||||||
.myTracks-item-title-desc {
|
.myTracks-item-title-desc {
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
color: #999;
|
color: #999;
|
||||||
}
|
}
|
||||||
|
|
||||||
.myTracks-item-price {
|
.myTracks-item-price {
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
color: $light-color;
|
color: $light-color;
|
||||||
padding: 10rpx 0 0 0;
|
padding: 10rpx 0 0 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.myTracks-action-btn {
|
.myTracks-action {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
background: #fff;
|
||||||
|
height: 75rpx;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0 32rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.myTracks-action-btn {
|
||||||
width: 130rpx;
|
width: 130rpx;
|
||||||
height: 60rpx;
|
height: 60rpx;
|
||||||
line-height: 60rpx;
|
line-height: 60rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.myTracks-divider {
|
.myTracks-divider {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 20rpx;
|
height: 20rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.myTracks-action-placeholder {
|
|
||||||
height: 110rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.myTracks-action-check {
|
|
||||||
|
.myTracks-action-check {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
display: -webkit-flex;
|
display: -webkit-flex;
|
||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
|
.edit{
|
||||||
|
padding-right: 32rpx;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -11,21 +11,21 @@
|
|||||||
<u-row class="portrait-box2">
|
<u-row class="portrait-box2">
|
||||||
<u-col span="6" class="portrait-box2-col" :gutter="16">
|
<u-col span="6" class="portrait-box2-col" :gutter="16">
|
||||||
<text>累计获得:</text>
|
<text>累计获得:</text>
|
||||||
<text class="pcolor">{{ pointData.point || 0 }}</text>
|
<text class="pcolor">{{ pointData.totalPoint || 0 }}</text>
|
||||||
</u-col>
|
</u-col>
|
||||||
<u-col span="6" class="portrait-box2-col">
|
<u-col span="6" class="portrait-box2-col">
|
||||||
<text>未使用:</text>
|
<text>剩余积分:</text>
|
||||||
<text class="pcolor">{{ pointData.variablePoint || 0 }}</text>
|
<text class="pcolor">{{ pointData.point || 0 }}</text>
|
||||||
</u-col>
|
</u-col>
|
||||||
</u-row>
|
</u-row>
|
||||||
|
|
||||||
<div class="point-list">
|
<div class="point-list">
|
||||||
<view class="point-item" v-for="(item, index) in pointList" :key="index">
|
<view class="point-item" v-for="(item, index) in pointList" :key="index">
|
||||||
<view>
|
<view>
|
||||||
<view>{{ item.content }}</view>
|
<view class="point-label">{{ item.content }}</view>
|
||||||
<view>{{ item.createTime}}</view>
|
<view>{{ item.createTime}}</view>
|
||||||
</view>
|
</view>
|
||||||
<view><span>{{item.pointType == "INCREASE" ? '+' : '-'}}</span>{{ item.variablePoint }}</view>
|
<view :class="[item.pointType == 'INCREASE' ? 'plus' : 'reduce']"><span>{{item.pointType == "INCREASE" ? '+' : '-'}}</span>{{ item.variablePoint }}</view>
|
||||||
</view>
|
</view>
|
||||||
<uni-load-more :status="count.loadStatus"></uni-load-more>
|
<uni-load-more :status="count.loadStatus"></uni-load-more>
|
||||||
</div>
|
</div>
|
||||||
@@ -72,7 +72,7 @@ export default {
|
|||||||
title: "加载中",
|
title: "加载中",
|
||||||
});
|
});
|
||||||
getPointsData(params).then((res) => {
|
getPointsData(params).then((res) => {
|
||||||
uni.hideLoading();
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
if (res.data.success) {
|
if (res.data.success) {
|
||||||
let data = res.data.result.records;
|
let data = res.data.result.records;
|
||||||
if (data.length < 10) {
|
if (data.length < 10) {
|
||||||
@@ -109,6 +109,14 @@ export default {
|
|||||||
font-size: 32rpx;
|
font-size: 32rpx;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
.plus{
|
||||||
|
color: $light-color;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.reduce{
|
||||||
|
color: $weChat-color;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
.point-item {
|
.point-item {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@@ -143,14 +151,14 @@ export default {
|
|||||||
border-radius: 0 0 20rpx 20rpx;
|
border-radius: 0 0 20rpx 20rpx;
|
||||||
margin: 0 20rpx;
|
margin: 0 20rpx;
|
||||||
font-size: 26rpx;
|
font-size: 26rpx;
|
||||||
/deep/ .u-col {
|
::v-deep .u-col {
|
||||||
text-align: center !important;
|
text-align: center !important;
|
||||||
}
|
}
|
||||||
/deep/ .u-col:first-child {
|
::v-deep .u-col:first-child {
|
||||||
border-right: 1px solid $border-color-light;
|
border-right: 1px solid $border-color-light;
|
||||||
}
|
}
|
||||||
.pcolor {
|
.pcolor {
|
||||||
color: #4ebb9d;
|
color: $light-color;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,7 +176,7 @@ export default {
|
|||||||
.portrait-box {
|
.portrait-box {
|
||||||
background-color: $main-color;
|
background-color: $main-color;
|
||||||
height: 250rpx;
|
height: 250rpx;
|
||||||
background: linear-gradient(134deg, #28d094 2%, #1abc9c 98%);
|
background: linear-gradient(91deg, $light-color 1%, $aider-light-color 99%);
|
||||||
border-radius: 20rpx 20rpx 0 0;
|
border-radius: 20rpx 20rpx 0 0;
|
||||||
margin: 20rpx 20rpx 0;
|
margin: 20rpx 20rpx 0;
|
||||||
position: relative;
|
position: relative;
|
||||||
@@ -212,5 +220,10 @@ export default {
|
|||||||
.point {
|
.point {
|
||||||
font-size: 56rpx;
|
font-size: 56rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
.point-label{
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 10rpx;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -7,6 +7,9 @@
|
|||||||
<!-- #ifdef APP-PLUS -->
|
<!-- #ifdef APP-PLUS -->
|
||||||
Version {{localVersion.version}}
|
Version {{localVersion.version}}
|
||||||
<!-- #endif -->
|
<!-- #endif -->
|
||||||
|
<!-- #ifdef MP-WEIXIN -->
|
||||||
|
小程序版本: {{localVersion.version}} {{ localVersion.envVersion}}
|
||||||
|
<!-- #endif -->
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<!-- {{localVersion}} -->
|
<!-- {{localVersion}} -->
|
||||||
@@ -16,10 +19,11 @@
|
|||||||
<u-cell-item title="功能介绍" @click="navigateTo('/pages/mine/set/versionFunctionList')"></u-cell-item>
|
<u-cell-item title="功能介绍" @click="navigateTo('/pages/mine/set/versionFunctionList')"></u-cell-item>
|
||||||
<u-cell-item title="检查更新" @click="checkUpdate"></u-cell-item>
|
<u-cell-item title="检查更新" @click="checkUpdate"></u-cell-item>
|
||||||
<!-- #endif -->
|
<!-- #endif -->
|
||||||
<u-cell-item title="证照信息" @click="navigateTo('/pages/mine/help/tips?type=message')"></u-cell-item>
|
|
||||||
<u-cell-item title="服务协议" @click="navigateTo('/pages/mine/help/tips?type=user')"></u-cell-item>
|
<u-cell-item title="证照信息" @click="navigateTo('/pages/mine/help/tips?type=LICENSE_INFORMATION')"></u-cell-item>
|
||||||
<u-cell-item title="隐私协议" @click="navigateTo('/pages/mine/help/tips?type=privacy')"></u-cell-item>
|
<u-cell-item title="服务协议" @click="navigateTo('/pages/mine/help/tips?type=USER_AGREEMENT')"></u-cell-item>
|
||||||
<u-cell-item title="关于我们" :border-bottom="false" @click="navigateTo('/pages/mine/help/tips?type=about')"></u-cell-item>
|
<u-cell-item title="隐私协议" @click="navigateTo('/pages/mine/help/tips?type=PRIVACY_POLICY')"></u-cell-item>
|
||||||
|
<u-cell-item title="关于我们" :border-bottom="false" @click="navigateTo('/pages/mine/help/tips?type=ABOUT')"></u-cell-item>
|
||||||
|
|
||||||
</u-cell-group>
|
</u-cell-group>
|
||||||
|
|
||||||
@@ -28,8 +32,8 @@
|
|||||||
<view style="margin:20rpx 0 0 0;">{{config.customerServiceEmail ? `客服邮箱:${config.customerServiceEmail}` : ``}}</view>
|
<view style="margin:20rpx 0 0 0;">{{config.customerServiceEmail ? `客服邮箱:${config.customerServiceEmail}` : ``}}</view>
|
||||||
|
|
||||||
<view>
|
<view>
|
||||||
<view style="margin:20rpx 0; color:#003a8c;" @click="navigateTo('/pages/mine/help/tips?type=user')">《{{config.name}}用户协议》</view>
|
<view style="margin:20rpx 0; color:#003a8c;" @click="navigateTo('/pages/mine/help/tips?type=USER_AGREEMENT')">《{{config.name}}用户协议》</view>
|
||||||
<view>CopyRight @{{config.name}} </view>
|
<view>CopyRight ©{{config.name}} </view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -74,6 +78,19 @@ export default {
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
// #endif
|
// #endif
|
||||||
|
|
||||||
|
|
||||||
|
// #ifdef MP-WEIXIN
|
||||||
|
const accountInfo = wx.getAccountInfoSync();
|
||||||
|
console.log("===========accountInfo==============");
|
||||||
|
console.log(accountInfo);
|
||||||
|
this.version_number = accountInfo.miniProgram.version // 小程序 版本号
|
||||||
|
this.localVersion = {
|
||||||
|
versionCode: accountInfo.miniProgram.version.replace(/\./g, ""),
|
||||||
|
version: accountInfo.miniProgram.version ,// 小程序 版本号,
|
||||||
|
envVersion:accountInfo.miniProgram.envVersion, //判断小程序是开发版本还是release版本
|
||||||
|
};
|
||||||
|
// #endif
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<div class="feedBack">
|
<div class="feedBack">
|
||||||
<div class="feedBack-box">
|
<div class="feedBack-box">
|
||||||
<h4>猜你想问</h4>
|
<h4>猜你想问</h4>
|
||||||
<div class="feedBack-item" @click="handleClick(index)" v-for="(item,index) in list" :key="index">
|
<div class="feedBack-item" :class="{'active':feedBack.type == item.value }" @click="handleClick(index)" v-for="(item,index) in list" :key="index">
|
||||||
{{item.text}}
|
{{item.text}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -16,9 +16,9 @@
|
|||||||
<!-- 上传凭证 -->
|
<!-- 上传凭证 -->
|
||||||
<div class="feedBack-box">
|
<div class="feedBack-box">
|
||||||
<view class="opt-view">
|
<view class="opt-view">
|
||||||
<view class="img-title">上传凭证(最多5张)</view>
|
<view class="img-title">上传凭证(最多2张)</view>
|
||||||
<view class="images-view">
|
<view class="images-view">
|
||||||
<u-upload :header=" { accessToken: storage.getAccessToken() }" :action="action" width="150" @on-uploaded="onUploaded" :max-count="5" :show-progress="false"></u-upload>
|
<u-upload :header=" { accessToken: storage.getAccessToken() }" :action="action" width="150" @on-uploaded="onUploaded" :max-count="2" :show-progress="false"></u-upload>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</div>
|
</div>
|
||||||
@@ -84,7 +84,7 @@ export default {
|
|||||||
}
|
}
|
||||||
if (!this.feedBack.context) {
|
if (!this.feedBack.context) {
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
title: "请填写反馈类型",
|
title: "请填写反馈信息",
|
||||||
duration: 2000,
|
duration: 2000,
|
||||||
icon: "none",
|
icon: "none",
|
||||||
});
|
});
|
||||||
@@ -130,6 +130,10 @@ export default {
|
|||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
border-radius: 100px;
|
border-radius: 100px;
|
||||||
}
|
}
|
||||||
|
.active{
|
||||||
|
color: $light-color !important;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
.feedBack {
|
.feedBack {
|
||||||
padding-bottom: 100rpx;
|
padding-bottom: 100rpx;
|
||||||
}
|
}
|
||||||
@@ -139,7 +143,7 @@ export default {
|
|||||||
padding: 32rpx;
|
padding: 32rpx;
|
||||||
margin-bottom: 40rpx;
|
margin-bottom: 40rpx;
|
||||||
}
|
}
|
||||||
/deep/ .u-input__textarea {
|
::v-deep .u-input__textarea {
|
||||||
padding: 12px;
|
padding: 12px;
|
||||||
}
|
}
|
||||||
.feedBack-box:nth-of-type(1) {
|
.feedBack-box:nth-of-type(1) {
|
||||||
|
|||||||
@@ -16,26 +16,38 @@
|
|||||||
</u-form-item>
|
</u-form-item>
|
||||||
|
|
||||||
<u-form-item label="生日" label-width="150" right-icon="arrow-right">
|
<u-form-item label="生日" label-width="150" right-icon="arrow-right">
|
||||||
<u-input v-model="birthday" disabled placeholder="请选择出生日期" @click="showBirthday = true" />
|
<div style="width: 100%;" @click="showBirthday = true">{{ birthday || '请选择出生日期' }}</div>
|
||||||
<u-picker v-model="showBirthday" mode="time" :confirm-color="lightColor" @confirm="selectTime"></u-picker>
|
<u-picker v-model="showBirthday" mode="time" :confirm-color="lightColor" @confirm="selectTime"></u-picker>
|
||||||
</u-form-item>
|
</u-form-item>
|
||||||
<u-form-item label="城市" label-width="150" placeholder="请选择城市" right-icon="arrow-right">
|
<u-form-item label="城市" label-width="150" placeholder="请选择城市" right-icon="arrow-right">
|
||||||
<u-input v-model="form.___path" disabled @click="clickRegion" />
|
<div style="width: 100%;" @click="clickRegion">{{ form.___path || '请选择城市' }}</div>
|
||||||
</u-form-item>
|
</u-form-item>
|
||||||
<view class="submit" @click="submit">保存</view>
|
|
||||||
</u-form>
|
|
||||||
|
|
||||||
<m-city :provinceData="region" headTitle="区域选择" ref="cityPicker" @funcValue="getpickerParentValue" pickerSize="4"></m-city>
|
<u-form-item label="手机号" label-width="150">
|
||||||
|
<view v-if="form.mobile">
|
||||||
|
{{form.mobile}}
|
||||||
|
</view>
|
||||||
|
<view v-else>
|
||||||
|
<view class="submit" style="text-align: left;" @click="navigateTo(form.username)">绑定手机号码</view>
|
||||||
|
</view>
|
||||||
|
</u-form-item>
|
||||||
|
|
||||||
|
</u-form>
|
||||||
|
<div class="bottom">
|
||||||
|
<view class="submit" @click="submit">保存</view>
|
||||||
|
<view class="submit light" @click="quiteLoginOut">退出登录</view>
|
||||||
|
</div>
|
||||||
|
<m-city :provinceData="region" headTitle="区域选择" ref="cityPicker" @funcValue="getPickerParentValue" pickerSize="4"></m-city>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { saveUserInfo } from "@/api/members.js";
|
import { saveUserInfo, getUserInfo } from "@/api/members.js";
|
||||||
import { upload } from "@/api/common.js";
|
import { upload } from "@/api/common.js";
|
||||||
import storage from "@/utils/storage.js";
|
import storage from "@/utils/storage.js";
|
||||||
import uFormItem from "@/uview-ui/components/u-form-item/u-form-item.vue";
|
import uFormItem from "@/uview-ui/components/u-form-item/u-form-item.vue";
|
||||||
import gkcity from "@/components/m-city/m-city.vue";
|
import city from "@/components/m-city/m-city.vue";
|
||||||
export default {
|
export default {
|
||||||
components: { uFormItem, "m-city": gkcity },
|
components: { uFormItem, "m-city": city },
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
lightColor: this.$lightColor, //高亮颜色
|
lightColor: this.$lightColor, //高亮颜色
|
||||||
@@ -45,8 +57,10 @@ export default {
|
|||||||
face: storage.getUserInfo().face || "/static/missing-face.png", //默认头像
|
face: storage.getUserInfo().face || "/static/missing-face.png", //默认头像
|
||||||
regionId: [], //地址Id
|
regionId: [], //地址Id
|
||||||
region: storage.getUserInfo().region || [], //地址
|
region: storage.getUserInfo().region || [], //地址
|
||||||
sex: storage.getUserInfo().sex || 1, //性别
|
sex: storage.getUserInfo().sex, //性别
|
||||||
___path: storage.getUserInfo().region,
|
___path: storage.getUserInfo().region,
|
||||||
|
mobile: storage.getUserInfo().mobile,
|
||||||
|
username: storage.getUserInfo().username,
|
||||||
},
|
},
|
||||||
birthday: storage.getUserInfo().birthday || "", //生日
|
birthday: storage.getUserInfo().birthday || "", //生日
|
||||||
photo: [
|
photo: [
|
||||||
@@ -65,10 +79,17 @@ export default {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
/**
|
||||||
|
* 退出登录
|
||||||
|
*/
|
||||||
|
quiteLoginOut() {
|
||||||
|
this.$options.filters.quiteLoginOut();
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 选择地址回调
|
* 选择地址回调
|
||||||
*/
|
*/
|
||||||
getpickerParentValue(e) {
|
getPickerParentValue(e) {
|
||||||
this.form.region = [];
|
this.form.region = [];
|
||||||
this.form.regionId = [];
|
this.form.regionId = [];
|
||||||
let name = "";
|
let name = "";
|
||||||
@@ -150,15 +171,43 @@ export default {
|
|||||||
this.form.birthday = `${time.year}-${time.month}-${time.day}`;
|
this.form.birthday = `${time.year}-${time.month}-${time.day}`;
|
||||||
this.birthday = `${time.year} - ${time.month} - ${time.day}`;
|
this.birthday = `${time.year} - ${time.month} - ${time.day}`;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
navigateTo(username) {
|
||||||
|
uni.navigateTo({
|
||||||
|
url: '/pages/mine/set/securityCenter/bindMobile' + '?username=' + username,
|
||||||
|
});
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 加载数据
|
* 加载数据
|
||||||
*/
|
*/
|
||||||
onLoad() {},
|
onLoad() {},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 页面显示时执行
|
||||||
|
*/
|
||||||
|
onShow() {
|
||||||
|
// 从缓存中重新获取用户信息
|
||||||
|
const userInfo = storage.getUserInfo();
|
||||||
|
// 更新表单数据
|
||||||
|
this.form.nickName = userInfo.nickName || "";
|
||||||
|
this.form.birthday = userInfo.birthday || "";
|
||||||
|
this.form.face = userInfo.face || "/static/missing-face.png";
|
||||||
|
this.form.region = userInfo.region || [];
|
||||||
|
this.form.sex = userInfo.sex;
|
||||||
|
this.form.___path = userInfo.region;
|
||||||
|
this.form.mobile = userInfo.mobile;
|
||||||
|
this.form.username = userInfo.username;
|
||||||
|
this.birthday = userInfo.birthday || "";
|
||||||
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
<style>
|
||||||
|
page{
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.submit {
|
.submit {
|
||||||
height: 90rpx;
|
height: 90rpx;
|
||||||
@@ -170,6 +219,7 @@ export default {
|
|||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
color: $main-color;
|
color: $main-color;
|
||||||
border-radius: 100px;
|
border-radius: 100px;
|
||||||
|
|
||||||
}
|
}
|
||||||
.head {
|
.head {
|
||||||
height: 260rpx;
|
height: 260rpx;
|
||||||
@@ -186,7 +236,7 @@ export default {
|
|||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/deep/ .u-form {
|
::v-deep .u-form {
|
||||||
background-color: #ffffff;
|
background-color: #ffffff;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin-top: 30rpx;
|
margin-top: 30rpx;
|
||||||
@@ -199,4 +249,21 @@ export default {
|
|||||||
.form {
|
.form {
|
||||||
background-color: #ffffff;
|
background-color: #ffffff;
|
||||||
}
|
}
|
||||||
|
.bottom{
|
||||||
|
position: fixed;
|
||||||
|
bottom: 40px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
width: 100%;
|
||||||
|
>.submit{
|
||||||
|
background: $light-color;
|
||||||
|
color: #fff;
|
||||||
|
width: 40%;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
.light{
|
||||||
|
background: rgba($color: $light-color, $alpha: 0.2) !important;
|
||||||
|
color: $light-color !important;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
227
pages/mine/set/securityCenter/bindMobile.vue
Normal file
227
pages/mine/set/securityCenter/bindMobile.vue
Normal file
@@ -0,0 +1,227 @@
|
|||||||
|
<template>
|
||||||
|
<view class="box">
|
||||||
|
<view class="box-tips">
|
||||||
|
<h2 class='h2'>
|
||||||
|
绑定手机号码
|
||||||
|
</h2>
|
||||||
|
<view class="verification"></view>
|
||||||
|
</view>
|
||||||
|
<view class="form">
|
||||||
|
<u-form :model="codeForm" ref="validateCodeForm">
|
||||||
|
<view v-if="!validateFlage">
|
||||||
|
<u-form-item label-width="120" label="手机号" prop="mobile">
|
||||||
|
<u-input maxlength="11" v-model="codeForm.mobile" placeholder="请输入您的手机号" />
|
||||||
|
</u-form-item>
|
||||||
|
|
||||||
|
<u-form-item class="sendCode" label-width="120" prop="code" label="验证码">
|
||||||
|
<u-input v-model="codeForm.code" placeholder="请输入验证码" />
|
||||||
|
<u-verification-code unique-key="page-edit" :seconds="seconds" @end="end" @start="start"
|
||||||
|
ref="uCode" @change="codeChange"></u-verification-code>
|
||||||
|
<view @tap="getCode" class="text-tips">{{ tips }}</view>
|
||||||
|
</u-form-item>
|
||||||
|
|
||||||
|
<view class="submit" @click="validatePhone">绑定</view>
|
||||||
|
<myVerification keep-running @send="verification" class="verification" ref="verification"
|
||||||
|
business="BIND_MOBILE" />
|
||||||
|
</view>
|
||||||
|
</u-form>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {
|
||||||
|
sendMobile,
|
||||||
|
bindMobile
|
||||||
|
} from "@/api/login";
|
||||||
|
import { getUserInfo } from "@/api/members.js";
|
||||||
|
import storage from "@/utils/storage.js";
|
||||||
|
|
||||||
|
import myVerification from "@/components/verification/verification.vue"; //验证
|
||||||
|
import uuid from "@/utils/uuid.modified.js";
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
myVerification,
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
uuid,
|
||||||
|
validateFlage: false, //是否进行了手机号验证
|
||||||
|
step: 0, //当前验证步骤
|
||||||
|
flage: false, //是否验证码验证
|
||||||
|
codeForm: {
|
||||||
|
mobile: "", //手机号
|
||||||
|
code: "", //验证码
|
||||||
|
username: "", //用户名
|
||||||
|
},
|
||||||
|
tips: "", //提示
|
||||||
|
seconds: 69, // 60s等待时间
|
||||||
|
|
||||||
|
// 验证码登录校验
|
||||||
|
codeRules: {
|
||||||
|
mobile: [{
|
||||||
|
validator: (rule, value, callback) => {
|
||||||
|
return this.$u.test.mobile(value);
|
||||||
|
},
|
||||||
|
message: "手机号码不正确",
|
||||||
|
trigger: ["blur"],
|
||||||
|
}, ],
|
||||||
|
code: [{
|
||||||
|
min: 4,
|
||||||
|
max: 6,
|
||||||
|
required: true,
|
||||||
|
message: "请输入验证码",
|
||||||
|
trigger: ["blur"],
|
||||||
|
}, ],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
},
|
||||||
|
onLoad(options) {
|
||||||
|
this.codeForm.username = options.username;
|
||||||
|
},
|
||||||
|
onReady() {
|
||||||
|
// 必须要在onReady生命周期,因为onLoad生命周期组件可能尚未创建完毕
|
||||||
|
this.$refs.validateCodeForm.setRules(this.codeRules);
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
flage(val) {
|
||||||
|
if (val) {
|
||||||
|
if (this.$refs.uCode.canGetCode) {
|
||||||
|
uni.showLoading({
|
||||||
|
title: "正在获取验证码",
|
||||||
|
});
|
||||||
|
sendMobile(this.codeForm.mobile, "BIND_MOBILE").then((res) => {
|
||||||
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
|
// 这里此提示会被this.start()方法中的提示覆盖
|
||||||
|
if (res.data.success) {
|
||||||
|
this.$refs.uCode.start();
|
||||||
|
} else {
|
||||||
|
uni.showToast({
|
||||||
|
title: res.data.message,
|
||||||
|
duration: 2000,
|
||||||
|
icon: "none",
|
||||||
|
});
|
||||||
|
this.flage = false;
|
||||||
|
this.$refs.verification.getCode();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
this.$u.toast("请倒计时结束后再发送");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
// 验证码验证
|
||||||
|
verification(val) {
|
||||||
|
this.flage = val == this.$store.state.verificationKey ? true : false;
|
||||||
|
},
|
||||||
|
|
||||||
|
// 验证手机号
|
||||||
|
validatePhone() {
|
||||||
|
this.$refs.validateCodeForm.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
bindMobile(this.codeForm).then((res) => {
|
||||||
|
if (res.data.success) {
|
||||||
|
this.validateFlage = !this.validateFlage;
|
||||||
|
// 获取最新的用户信息并更新缓存
|
||||||
|
getUserInfo().then(userRes => {
|
||||||
|
if (userRes.data.success) {
|
||||||
|
storage.setUserInfo(userRes.data.result);
|
||||||
|
}
|
||||||
|
// 显示成功提示
|
||||||
|
uni.showToast({
|
||||||
|
title: "绑定成功!",
|
||||||
|
duration: 2000,
|
||||||
|
icon: "none",
|
||||||
|
});
|
||||||
|
// 返回上一页
|
||||||
|
setTimeout(() => {
|
||||||
|
uni.navigateBack({
|
||||||
|
delta: 1,
|
||||||
|
});
|
||||||
|
}, 1000);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
codeChange(text) {
|
||||||
|
this.tips = text;
|
||||||
|
},
|
||||||
|
end() {
|
||||||
|
|
||||||
|
this.flage = false;
|
||||||
|
this.$refs.verification.getCode()
|
||||||
|
},
|
||||||
|
|
||||||
|
/**获取验证码 */
|
||||||
|
getCode() {
|
||||||
|
if (this.tips == "重新获取") {
|
||||||
|
this.$refs.verification.error(); //发送
|
||||||
|
}
|
||||||
|
if (!this.$u.test.mobile(this.codeForm.mobile)) {
|
||||||
|
uni.showToast({
|
||||||
|
title: "请输入正确手机号",
|
||||||
|
icon: "none",
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!this.flage) {
|
||||||
|
this.$refs.verification.error(); //发送
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
start() {
|
||||||
|
this.$u.toast("验证码已发送");
|
||||||
|
this.flage = true;
|
||||||
|
|
||||||
|
this.$refs.verification.hide();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
@import url("@/pages/passport/login.scss");
|
||||||
|
|
||||||
|
::v-deep .u-form-item {
|
||||||
|
margin: 40rpx 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sendCode {
|
||||||
|
::v-deep .u-form-item--right__content__slot {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.h2 {
|
||||||
|
font-size: 40rpx;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
page {
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box {
|
||||||
|
padding: 80rpx 0;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submit {
|
||||||
|
background: $light-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box-tips {
|
||||||
|
margin: 0 72rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.verification {
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: #999;
|
||||||
|
margin-top: 10rpx;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
160
pages/mine/set/securityCenter/editLoginPassword.vue
Normal file
160
pages/mine/set/securityCenter/editLoginPassword.vue
Normal file
@@ -0,0 +1,160 @@
|
|||||||
|
<template>
|
||||||
|
<view class="box">
|
||||||
|
<view class="box-tips">
|
||||||
|
<h2 class='h2'>
|
||||||
|
{{verificationTitle.title}}
|
||||||
|
</h2>
|
||||||
|
<view class="verification">{{verificationTitle.desc}}</view>
|
||||||
|
</view>
|
||||||
|
<view class="form">
|
||||||
|
<u-form :model="codeForm" ref="validateCodeForm">
|
||||||
|
<u-form-item label-width="120" label="旧密码">
|
||||||
|
<u-input type="password" v-model="oldPassword" placeholder="请输入您的旧密码" />
|
||||||
|
</u-form-item>
|
||||||
|
|
||||||
|
<u-form-item label-width="120" label="密码">
|
||||||
|
<u-input type="password" v-model="password" placeholder="请输入您的密码" />
|
||||||
|
</u-form-item>
|
||||||
|
|
||||||
|
<u-form-item label-width="120" label="确认密码">
|
||||||
|
<u-input type="password" v-model="newPassword" placeholder="请再次输入您的密码" />
|
||||||
|
</u-form-item>
|
||||||
|
|
||||||
|
<view class="submit" @click="updatePassword">修改密码</view>
|
||||||
|
</u-form>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {
|
||||||
|
resetByMobile,
|
||||||
|
modifyPass
|
||||||
|
} from "@/api/login";
|
||||||
|
|
||||||
|
import {
|
||||||
|
md5
|
||||||
|
} from "@/utils/md5.js"; // md5
|
||||||
|
import myVerification from "@/components/verification/verification.vue"; //验证
|
||||||
|
import uuid from "@/utils/uuid.modified.js";
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
myVerification,
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
uuid,
|
||||||
|
validateFlage: false, //是否进行了手机号验证
|
||||||
|
verificationTitle: {
|
||||||
|
title: "修改密码",
|
||||||
|
desc: "请验证并输入密码",
|
||||||
|
},
|
||||||
|
step: 0, //当前验证步骤
|
||||||
|
flage: false, //是否验证码验证
|
||||||
|
|
||||||
|
codeForm: {
|
||||||
|
mobile: "", //手机号
|
||||||
|
code: "", //验证码
|
||||||
|
},
|
||||||
|
newPassword: "", //新密码
|
||||||
|
password: "", //密码
|
||||||
|
oldPassword: '', //旧密码
|
||||||
|
tips: "", //提示
|
||||||
|
seconds: 69, // 60s等待时间
|
||||||
|
|
||||||
|
// 验证码登录校验
|
||||||
|
codeRules: {
|
||||||
|
mobile: [{
|
||||||
|
validator: (rule, value, callback) => {
|
||||||
|
return this.$u.test.mobile(value);
|
||||||
|
},
|
||||||
|
message: "手机号码不正确",
|
||||||
|
trigger: ["blur"],
|
||||||
|
}, ],
|
||||||
|
code: [{
|
||||||
|
min: 4,
|
||||||
|
max: 6,
|
||||||
|
required: true,
|
||||||
|
message: "请输入验证码",
|
||||||
|
trigger: ["blur"],
|
||||||
|
}, ],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
},
|
||||||
|
onReady() {
|
||||||
|
// 必须要在onReady生命周期,因为onLoad生命周期组件可能尚未创建完毕
|
||||||
|
this.$refs.validateCodeForm.setRules(this.codeRules);
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
// 修改密码
|
||||||
|
updatePassword() {
|
||||||
|
if(this.password !== this.newPassword){
|
||||||
|
uni.showToast({
|
||||||
|
title: "两次输入密码不一致!",
|
||||||
|
icon: "none",
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
modifyPass({
|
||||||
|
password: md5(this.oldPassword),
|
||||||
|
newPassword: md5(this.newPassword),
|
||||||
|
}).then((res) => {
|
||||||
|
if (res.data.success) {
|
||||||
|
uni.showToast({
|
||||||
|
title: "修改成功!",
|
||||||
|
duration: 2000,
|
||||||
|
icon: "none",
|
||||||
|
});
|
||||||
|
setTimeout(() => {
|
||||||
|
uni.navigateBack({
|
||||||
|
delta: 1,
|
||||||
|
});
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
@import url("@/pages/passport/login.scss");
|
||||||
|
|
||||||
|
::v-deep .u-form-item {
|
||||||
|
margin: 40rpx 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sendCode {
|
||||||
|
::v-deep .u-form-item--right__content__slot {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.h2 {
|
||||||
|
font-size: 40rpx;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
page {
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box {
|
||||||
|
padding: 80rpx 0;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submit {
|
||||||
|
background: $light-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box-tips {
|
||||||
|
margin: 0 72rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.verification {
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: #999;
|
||||||
|
margin-top: 10rpx;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -1,12 +1,13 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="box">
|
<view class="box">
|
||||||
<view class="box-tips">
|
<view class="box-tips">
|
||||||
<h2>
|
<h2 class='h2'>
|
||||||
{{verificationTitle[validateFlage==false ? 0 : 1].title}}
|
{{verificationTitle[validateFlage==false ? 0 : 1].title}}
|
||||||
</h2>
|
</h2>
|
||||||
<view class="verification">{{verificationTitle[step].desc}}</view>
|
<view class="verification">{{verificationTitle[step].desc}}</view>
|
||||||
</view>
|
</view>
|
||||||
<u-form :model="codeForm" class="form" ref="validateCodeForm">
|
<view class="form">
|
||||||
|
<u-form :model="codeForm" ref="validateCodeForm">
|
||||||
<view v-if="!validateFlage">
|
<view v-if="!validateFlage">
|
||||||
<u-form-item label-width="120" label="手机号" prop="mobile">
|
<u-form-item label-width="120" label="手机号" prop="mobile">
|
||||||
<u-input maxlength="11" v-model="codeForm.mobile" placeholder="请输入您的手机号" />
|
<u-input maxlength="11" v-model="codeForm.mobile" placeholder="请输入您的手机号" />
|
||||||
@@ -14,37 +15,44 @@
|
|||||||
|
|
||||||
<u-form-item class="sendCode" label-width="120" prop="code" label="验证码">
|
<u-form-item class="sendCode" label-width="120" prop="code" label="验证码">
|
||||||
<u-input v-model="codeForm.code" placeholder="请输入验证码" />
|
<u-input v-model="codeForm.code" placeholder="请输入验证码" />
|
||||||
<u-verification-code unique-key="page-edit" :seconds="seconds" @end="end" @start="start" ref="uCode" @change="codeChange"></u-verification-code>
|
<u-verification-code unique-key="page-edit" :seconds="seconds" @end="end" @start="start"
|
||||||
|
ref="uCode" @change="codeChange"></u-verification-code>
|
||||||
<view @tap="getCode" class="text-tips">{{ tips }}</view>
|
<view @tap="getCode" class="text-tips">{{ tips }}</view>
|
||||||
</u-form-item>
|
</u-form-item>
|
||||||
|
|
||||||
<view class="submit" @click="validatePhone">验证</view>
|
<view class="submit" @click="validatePhone">验证</view>
|
||||||
<myVerification keep-running @send="verification" class="verification" ref="verification" business="FIND_USER" />
|
<myVerification keep-running @send="verification" class="verification" ref="verification"
|
||||||
|
business="FIND_USER" />
|
||||||
</view>
|
</view>
|
||||||
<view v-if="validateFlage">
|
<view v-if="validateFlage">
|
||||||
<u-form-item label-width="120" label="旧密码">
|
<u-form-item label-width="120" label="密码">
|
||||||
<u-input type="password" v-model="password" placeholder="请输入您的旧密码" />
|
<u-input type="password" v-model="password" placeholder="请输入您的密码" />
|
||||||
</u-form-item>
|
</u-form-item>
|
||||||
|
|
||||||
<u-form-item label-width="120" label="新密码">
|
<u-form-item label-width="120" label="确认密码">
|
||||||
|
<u-input type="password" v-model="newPassword" placeholder="请再次输入您的密码" />
|
||||||
<u-input type="password" v-model="newPassword" placeholder="请输入您的新密码" />
|
|
||||||
|
|
||||||
</u-form-item>
|
</u-form-item>
|
||||||
|
|
||||||
<view class="submit" @click="updatePassword">修改密码</view>
|
<view class="submit" @click="updatePassword">修改密码</view>
|
||||||
</view>
|
</view>
|
||||||
</u-form>
|
</u-form>
|
||||||
</view>
|
</view>
|
||||||
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { sendMobile, resetByMobile, modifyPass } from "@/api/login";
|
import {
|
||||||
|
sendMobile,
|
||||||
|
resetByMobile,
|
||||||
|
resetPassword
|
||||||
|
} from "@/api/login";
|
||||||
|
|
||||||
import { md5 } from "@/utils/md5.js"; // md5
|
import {
|
||||||
import myVerification from "@/components/verification/verification.vue"; //验证
|
md5
|
||||||
import uuid from "@/utils/uuid.modified.js";
|
} from "@/utils/md5.js"; // md5
|
||||||
export default {
|
import myVerification from "@/components/verification/verification.vue"; //验证
|
||||||
|
import uuid from "@/utils/uuid.modified.js";
|
||||||
|
export default {
|
||||||
components: {
|
components: {
|
||||||
myVerification,
|
myVerification,
|
||||||
},
|
},
|
||||||
@@ -52,8 +60,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
uuid,
|
uuid,
|
||||||
validateFlage: false, //是否进行了手机号验证
|
validateFlage: false, //是否进行了手机号验证
|
||||||
verificationTitle: [
|
verificationTitle: [{
|
||||||
{
|
|
||||||
title: "安全验证",
|
title: "安全验证",
|
||||||
desc: "请输入当前手机号进行安全验证",
|
desc: "请输入当前手机号进行安全验证",
|
||||||
},
|
},
|
||||||
@@ -72,28 +79,24 @@ export default {
|
|||||||
newPassword: "", //新密码
|
newPassword: "", //新密码
|
||||||
password: "", //密码
|
password: "", //密码
|
||||||
tips: "", //提示
|
tips: "", //提示
|
||||||
seconds: 60, // 60s等待时间
|
seconds: 69, // 60s等待时间
|
||||||
|
|
||||||
// 验证码登录校验
|
// 验证码登录校验
|
||||||
codeRules: {
|
codeRules: {
|
||||||
mobile: [
|
mobile: [{
|
||||||
{
|
|
||||||
validator: (rule, value, callback) => {
|
validator: (rule, value, callback) => {
|
||||||
return this.$u.test.mobile(value);
|
return this.$u.test.mobile(value);
|
||||||
},
|
},
|
||||||
message: "手机号码不正确",
|
message: "手机号码不正确",
|
||||||
trigger: ["blur"],
|
trigger: ["blur"],
|
||||||
},
|
}, ],
|
||||||
],
|
code: [{
|
||||||
code: [
|
|
||||||
{
|
|
||||||
min: 4,
|
min: 4,
|
||||||
max: 6,
|
max: 6,
|
||||||
required: true,
|
required: true,
|
||||||
message: "请输入验证码",
|
message: "请输入验证码",
|
||||||
trigger: ["blur"],
|
trigger: ["blur"],
|
||||||
},
|
}, ],
|
||||||
],
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
@@ -104,14 +107,15 @@ export default {
|
|||||||
watch: {
|
watch: {
|
||||||
flage(val) {
|
flage(val) {
|
||||||
if (val) {
|
if (val) {
|
||||||
|
|
||||||
if (this.$refs.uCode.canGetCode) {
|
if (this.$refs.uCode.canGetCode) {
|
||||||
uni.showLoading({
|
uni.showLoading({
|
||||||
title: "正在获取验证码",
|
title: "正在获取验证码",
|
||||||
});
|
});
|
||||||
sendMobile(this.codeForm.mobile, "FIND_USER").then((res) => {
|
sendMobile(this.codeForm.mobile, "FIND_USER").then((res) => {
|
||||||
uni.hideLoading();
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
// 这里此提示会被this.start()方法中的提示覆盖
|
// 这里此提示会被this.start()方法中的提示覆盖
|
||||||
if (res.data.code == 200) {
|
if (res.data.success) {
|
||||||
this.$refs.uCode.start();
|
this.$refs.uCode.start();
|
||||||
} else {
|
} else {
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
@@ -119,8 +123,10 @@ export default {
|
|||||||
duration: 2000,
|
duration: 2000,
|
||||||
icon: "none",
|
icon: "none",
|
||||||
});
|
});
|
||||||
|
this.flage = false;
|
||||||
|
this.$refs.verification.getCode();
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
this.$u.toast("请倒计时结束后再发送");
|
this.$u.toast("请倒计时结束后再发送");
|
||||||
}
|
}
|
||||||
@@ -131,8 +137,14 @@ export default {
|
|||||||
methods: {
|
methods: {
|
||||||
// 修改密码
|
// 修改密码
|
||||||
updatePassword() {
|
updatePassword() {
|
||||||
modifyPass({
|
if(this.password !== this.newPassword){
|
||||||
newPassword: md5(this.newPassword),
|
uni.showToast({
|
||||||
|
title: "两次输入密码不一致!",
|
||||||
|
icon: "none",
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resetPassword({
|
||||||
password: md5(this.password),
|
password: md5(this.password),
|
||||||
}).then((res) => {
|
}).then((res) => {
|
||||||
if (res.data.success) {
|
if (res.data.success) {
|
||||||
@@ -176,7 +188,11 @@ export default {
|
|||||||
codeChange(text) {
|
codeChange(text) {
|
||||||
this.tips = text;
|
this.tips = text;
|
||||||
},
|
},
|
||||||
end() {},
|
end() {
|
||||||
|
|
||||||
|
this.flage = false;
|
||||||
|
this.$refs.verification.getCode()
|
||||||
|
},
|
||||||
|
|
||||||
/**判断是否是当前用户的手机号 */
|
/**判断是否是当前用户的手机号 */
|
||||||
isUserPhone() {
|
isUserPhone() {
|
||||||
@@ -198,7 +214,7 @@ export default {
|
|||||||
getCode() {
|
getCode() {
|
||||||
if (this.isUserPhone()) {
|
if (this.isUserPhone()) {
|
||||||
if (this.tips == "重新获取") {
|
if (this.tips == "重新获取") {
|
||||||
this.flage = true;
|
this.$refs.verification.error(); //发送
|
||||||
}
|
}
|
||||||
if (!this.$u.test.mobile(this.codeForm.mobile)) {
|
if (!this.$u.test.mobile(this.codeForm.mobile)) {
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
@@ -208,44 +224,58 @@ export default {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!this.flage) {
|
if (!this.flage) {
|
||||||
this.$refs.verification.hide();
|
this.$refs.verification.error(); //发送
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
start() {
|
start() {
|
||||||
this.$u.toast("验证码已发送");
|
this.$u.toast("验证码已发送");
|
||||||
this.flage = false;
|
this.flage = true;
|
||||||
|
|
||||||
|
this.$refs.verification.hide();
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
@import url("../../../passport/login.scss");
|
@import url("@/pages/passport/login.scss");
|
||||||
.u-form-item {
|
|
||||||
|
::v-deep .u-form-item {
|
||||||
margin: 40rpx 0;
|
margin: 40rpx 0;
|
||||||
}
|
}
|
||||||
.sendCode {
|
|
||||||
/deep/ .u-form-item--right__content__slot {
|
.sendCode {
|
||||||
|
::v-deep .u-form-item--right__content__slot {
|
||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
page {
|
|
||||||
|
.h2 {
|
||||||
|
font-size: 40rpx;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
page {
|
||||||
background: #fff;
|
background: #fff;
|
||||||
}
|
}
|
||||||
.box {
|
|
||||||
|
.box {
|
||||||
padding: 80rpx 0;
|
padding: 80rpx 0;
|
||||||
border-radius: 20rpx;
|
border-radius: 20rpx;
|
||||||
}
|
}
|
||||||
.submit {
|
|
||||||
|
.submit {
|
||||||
background: $light-color;
|
background: $light-color;
|
||||||
}
|
}
|
||||||
.box-tips {
|
|
||||||
|
.box-tips {
|
||||||
margin: 0 72rpx;
|
margin: 0 72rpx;
|
||||||
}
|
}
|
||||||
.verification {
|
|
||||||
|
.verification {
|
||||||
font-size: 24rpx;
|
font-size: 24rpx;
|
||||||
color: #999;
|
color: #999;
|
||||||
margin-top: 10rpx;
|
margin-top: 10rpx;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="securityCenter">
|
<view class="securityCenter">
|
||||||
<u-cell-group>
|
<u-cell-group>
|
||||||
<u-cell-item title="修改密码" @click="navigateTo('/pages/mine/set/securityCenter/editPassword')"></u-cell-item>
|
<u-cell-item title="修改密码" @click="navigateTo('/pages/mine/set/securityCenter/updatePwdTab')"></u-cell-item>
|
||||||
|
<u-cell-item title="注销账户" @click="zhuxiao"></u-cell-item>
|
||||||
</u-cell-group>
|
</u-cell-group>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
@@ -15,6 +16,35 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
|
zhuxiao(){
|
||||||
|
|
||||||
|
uni.showModal({
|
||||||
|
title: "警告",
|
||||||
|
content: "您确定要注销当前账号吗?",
|
||||||
|
confirmText: "确定注销",
|
||||||
|
confirmColor: "#FF0000",
|
||||||
|
cancelText: "取消",
|
||||||
|
success: (res) => {
|
||||||
|
if (res.confirm) {
|
||||||
|
uni.showModal({
|
||||||
|
title: "谨慎操作",
|
||||||
|
content: "再次向您确认,您确定要注销当前账号吗?",
|
||||||
|
confirmText: "坚持注销",
|
||||||
|
confirmColor: "#FF0000",
|
||||||
|
cancelText: "取消",
|
||||||
|
success: (res) => {
|
||||||
|
if (res.confirm) {
|
||||||
|
uni.showToast({
|
||||||
|
title: "您的注销申请已经提交,待管理员审核后。会自动注销当前账号",
|
||||||
|
duration: 10000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
navigateTo(url) {
|
navigateTo(url) {
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
url: url,
|
url: url,
|
||||||
|
|||||||
34
pages/mine/set/securityCenter/updatePwdTab.vue
Normal file
34
pages/mine/set/securityCenter/updatePwdTab.vue
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<template>
|
||||||
|
<view class="securityCenter">
|
||||||
|
<u-cell-group>
|
||||||
|
<u-cell-item title="验证密码" @click="navigateTo('/pages/mine/set/securityCenter/editLoginPassword')"></u-cell-item>
|
||||||
|
<u-cell-item title="验证手机号" @click="navigateTo('/pages/mine/set/securityCenter/editPassword')"></u-cell-item>
|
||||||
|
</u-cell-group>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
mobile: "", //存储手机号
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
navigateTo(url) {
|
||||||
|
uni.navigateTo({
|
||||||
|
url: url,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.securityCenter {
|
||||||
|
.u-cell {
|
||||||
|
line-height: normal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="container">
|
<view class="container">
|
||||||
<view class="person" @click="checkUserInfo()">
|
<view class="person" @click="checkUserInfo()">
|
||||||
<u-image width=140 height="140" shape="circle" :src="userInfo.face || '/static/missing-face.png'" mode=""></u-image>
|
<u-image width=140 height="140" shape="circle" :src="userInfo.face || userImage" mode="">
|
||||||
|
</u-image>
|
||||||
<view class="user-name">
|
<view class="user-name">
|
||||||
|
|
||||||
{{ userInfo.id ? userInfo.nickName || '' : '暂未登录' }}
|
{{ userInfo.id ? userInfo.nickName || '' : '暂未登录' }}
|
||||||
</view>
|
</view>
|
||||||
<u-icon color="#ccc" name="arrow-right"></u-icon>
|
<u-icon color="#ccc" name="arrow-right"></u-icon>
|
||||||
@@ -15,26 +15,26 @@
|
|||||||
<!-- #ifdef APP-PLUS -->
|
<!-- #ifdef APP-PLUS -->
|
||||||
<u-cell-item title="清除缓存" :value="fileSizeString" @click="clearCache"></u-cell-item>
|
<u-cell-item title="清除缓存" :value="fileSizeString" @click="clearCache"></u-cell-item>
|
||||||
<!-- #endif -->
|
<!-- #endif -->
|
||||||
|
<!-- #ifndef MP-WEIXIN -->
|
||||||
<u-cell-item title="安全中心" @click="navigateTo('/pages/mine/set/securityCenter/securityCenter')"></u-cell-item>
|
<u-cell-item title="安全中心" @click="navigateTo('/pages/mine/set/securityCenter/securityCenter')"></u-cell-item>
|
||||||
|
<!-- #endif -->
|
||||||
|
<u-cell-item title="用户注销" v-if="userInfo.id" @click="logoff"></u-cell-item>
|
||||||
<u-cell-item title="意见反馈" @click="navigateTo('/pages/mine/set/feedBack')"></u-cell-item>
|
<u-cell-item title="意见反馈" @click="navigateTo('/pages/mine/set/feedBack')"></u-cell-item>
|
||||||
<!-- #ifndef H5 -->
|
<!-- #ifndef H5 -->
|
||||||
<!-- #endif -->
|
<!-- #endif -->
|
||||||
<u-cell-item :title="`关于${config.name}`" @click="navigateTo('/pages/mine/set/editionIntro')"></u-cell-item>
|
<u-cell-item :title="`关于${config.name}`" @click="navigateTo('/pages/mine/set/editionIntro')"></u-cell-item>
|
||||||
</u-cell-group>
|
</u-cell-group>
|
||||||
<view class="submit" @click="showModalDialog">{{userInfo.id ?'退出登录':'返回登录'}}</view>
|
<view class="submit" v-if="userInfo.id" @click="quiteLoginOut">退出登录</view>
|
||||||
<u-modal show-cancel-button v-model="quitShow" @confirm="confirm" :confirm-color="lightColor" :async-close="true" :content="userInfo.id ? '确定要退出登录么?' : '确定要返回登录么?'"></u-modal>
|
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import storage from "@/utils/storage.js";
|
|
||||||
import config from "@/config/config";
|
import config from "@/config/config";
|
||||||
export default {
|
export default {
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
config,
|
config,
|
||||||
lightColor: this.$lightColor,
|
userImage:config.defaultUserPhoto,
|
||||||
quitShow: false,
|
|
||||||
isCertificate: false,
|
isCertificate: false,
|
||||||
userInfo: {},
|
userInfo: {},
|
||||||
fileSizeString: "0B",
|
fileSizeString: "0B",
|
||||||
@@ -50,23 +50,18 @@ export default {
|
|||||||
url: url,
|
url: url,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 确认退出
|
* 退出登录
|
||||||
* 清除缓存重新登录
|
|
||||||
*/
|
*/
|
||||||
confirm() {
|
quiteLoginOut() {
|
||||||
storage.setAccessToken("");
|
this.$options.filters.quiteLoginOut();
|
||||||
storage.setRefreshToken("");
|
|
||||||
storage.setUserInfo({});
|
|
||||||
this.$options.filters.navigateToLogin("redirectTo");
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 显示退出登录对话框
|
* 用户注销
|
||||||
*/
|
*/
|
||||||
showModalDialog() {
|
logoff(){
|
||||||
this.quitShow = true;
|
this.$options.filters.logoff();
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -99,11 +94,7 @@ export default {
|
|||||||
if (this.$options.filters.isLogin("auth")) {
|
if (this.$options.filters.isLogin("auth")) {
|
||||||
this.navigateTo("/pages/mine/set/personMsg");
|
this.navigateTo("/pages/mine/set/personMsg");
|
||||||
} else {
|
} else {
|
||||||
uni.showToast({
|
this.$options.filters.tipsToLogin();
|
||||||
title: "当前暂无用户请登录后重试",
|
|
||||||
duration: 2000,
|
|
||||||
icon: "none",
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -211,11 +202,11 @@ export default {
|
|||||||
color: #333333;
|
color: #333333;
|
||||||
}
|
}
|
||||||
|
|
||||||
/deep/ .u-cell__value {
|
::v-deep .u-cell__value {
|
||||||
color: #cccccc !important;
|
color: #cccccc !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/deep/ .u-cell__right-icon-wrap {
|
::v-deep .u-cell__right-icon-wrap {
|
||||||
color: #cccccc !important;
|
color: #cccccc !important;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -22,26 +22,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.promotion {
|
|
||||||
margin-top: 4rpx;
|
|
||||||
display: flex;
|
|
||||||
div {
|
|
||||||
span {
|
|
||||||
font-size: 24rpx;
|
|
||||||
color: $light-color;
|
|
||||||
margin-right: 10rpx;
|
|
||||||
padding: 0 4rpx;
|
|
||||||
border-radius: 2rpx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/deep/ .u-row {
|
|
||||||
// #ifdef MP-WEIXIN
|
|
||||||
padding: 0 5%;
|
|
||||||
// #endif
|
|
||||||
}
|
|
||||||
|
|
||||||
.status_bar {
|
.status_bar {
|
||||||
height: var(--status-bar-height);
|
height: var(--status-bar-height);
|
||||||
background: #fff !important;
|
background: #fff !important;
|
||||||
@@ -62,6 +42,7 @@ page {
|
|||||||
padding: 30rpx;
|
padding: 30rpx;
|
||||||
> .sort-item {
|
> .sort-item {
|
||||||
> .sort-title {
|
> .sort-title {
|
||||||
|
margin: 20rpx 0;
|
||||||
font-size: 26rpx;
|
font-size: 26rpx;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
@@ -105,7 +86,7 @@ page {
|
|||||||
line-height: 70rpx;
|
line-height: 70rpx;
|
||||||
font-size: 24rpx;
|
font-size: 24rpx;
|
||||||
}
|
}
|
||||||
/deep/ .uni-input-input {
|
::v-deep .uni-input-input {
|
||||||
font-size: 24rpx;
|
font-size: 24rpx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -121,7 +102,7 @@ page {
|
|||||||
font-size: 24rpx;
|
font-size: 24rpx;
|
||||||
}
|
}
|
||||||
.flex {
|
.flex {
|
||||||
margin: 30rpx 0;
|
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
> .sort-brand-item {
|
> .sort-brand-item {
|
||||||
@@ -138,47 +119,36 @@ page {
|
|||||||
height: 100vh;
|
height: 100vh;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
.storeSellerBox {
|
|
||||||
// #ifndef MP-WEIXIN
|
|
||||||
padding: 16rpx !important;
|
|
||||||
|
|
||||||
// #endif
|
|
||||||
}
|
|
||||||
.goodsClass {
|
|
||||||
padding: 0 20rpx;
|
|
||||||
|
|
||||||
/deep/ .u-row {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.index-nav-arrow:last-child {
|
.index-nav-arrow:last-child {
|
||||||
margin-top: -22rpx;
|
margin-top: -22rpx;
|
||||||
}
|
}
|
||||||
|
.line1-store-name{
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
.to-store{
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: #333;
|
||||||
|
margin-left: 10rpx;
|
||||||
|
}
|
||||||
.img {
|
.img {
|
||||||
width: 26rpx;
|
width: 26rpx;
|
||||||
height: 26rpx;
|
height: 26rpx;
|
||||||
}
|
}
|
||||||
.goodsRow {
|
.goods-row {
|
||||||
/deep/ .u-row {
|
|
||||||
// #ifdef MP-WEIXIN
|
|
||||||
padding: 0%;
|
|
||||||
background: #fff;
|
background: #fff;
|
||||||
// padding: 16rpx;
|
padding: 16rpx;
|
||||||
border-radius: 0.4em;
|
|
||||||
margin: 0 !important;
|
|
||||||
|
|
||||||
// #endif
|
>.goods-col{
|
||||||
|
display: flex;
|
||||||
|
>.goods-img{
|
||||||
|
flex: 4;
|
||||||
|
}
|
||||||
|
>.goods-detail{
|
||||||
|
flex: 7;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
background: #fff;
|
|
||||||
border-radius: 0.4em;
|
|
||||||
margin: 20rpx 0;
|
|
||||||
// #ifdef MP-WEIXIN
|
|
||||||
margin: 10rpx 0;
|
|
||||||
// #endif
|
|
||||||
padding: 0 16rpx;
|
|
||||||
width: 100%;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.add1 {
|
.add1 {
|
||||||
@@ -192,21 +162,14 @@ page {
|
|||||||
border-bottom: 1px solid #eeeeee;
|
border-bottom: 1px solid #eeeeee;
|
||||||
}
|
}
|
||||||
|
|
||||||
.logimg {
|
|
||||||
width: 40rpx;
|
|
||||||
height: 40rpx;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
.clamp3 {
|
.clamp3 {
|
||||||
padding-top: 30rpx;
|
|
||||||
margin-bottom: 10rpx;
|
margin-bottom: 10rpx;
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
|
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
line-height: 40rpx;
|
height: 80rpx;
|
||||||
-webkit-box-orient: vertical;
|
-webkit-box-orient: vertical;
|
||||||
|
|
||||||
-webkit-line-clamp: 2 !important;
|
-webkit-line-clamp: 2 !important;
|
||||||
@@ -217,25 +180,12 @@ page {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.switchType1 {
|
|
||||||
width: 50%;
|
|
||||||
overflow: hidden;
|
|
||||||
text-align: center;
|
|
||||||
|
|
||||||
> .img {
|
|
||||||
width: 182rpx;
|
|
||||||
height: 200rpx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.imgGoods {
|
|
||||||
width: 182rpx;
|
|
||||||
height: 200rpx;
|
|
||||||
}
|
|
||||||
view {
|
view {
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.storeSellerName {
|
.store-seller-name {
|
||||||
color: #666;
|
color: #666;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
@@ -248,7 +198,7 @@ view {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.countConfig {
|
.count-config {
|
||||||
padding: 10rpx 0;
|
padding: 10rpx 0;
|
||||||
color: #666;
|
color: #666;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -474,181 +424,13 @@ view {
|
|||||||
margin-left: 4rpx;
|
margin-left: 4rpx;
|
||||||
font-size: 26rpx;
|
font-size: 26rpx;
|
||||||
color: #888;
|
color: #888;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.xia {
|
.xia {
|
||||||
transform: scaleY(-1);
|
transform: scaleY(-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.cate-item {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
height: 100%;
|
|
||||||
width: 80rpx;
|
|
||||||
position: relative;
|
|
||||||
font-size: 44rpx;
|
|
||||||
|
|
||||||
&:after {
|
|
||||||
content: "";
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
top: 50%;
|
|
||||||
transform: translateY(-50%);
|
|
||||||
border-left: 1px solid #ddd;
|
|
||||||
width: 0;
|
|
||||||
height: 36rpx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 分类 */
|
|
||||||
.cate-mask {
|
|
||||||
position: fixed;
|
|
||||||
left: 0;
|
|
||||||
top: var(--window-top);
|
|
||||||
bottom: 0;
|
|
||||||
width: 100%;
|
|
||||||
background: rgba(0, 0, 0, 0);
|
|
||||||
z-index: 95;
|
|
||||||
transition: 0.3s;
|
|
||||||
|
|
||||||
.cate-content {
|
|
||||||
width: 630rpx;
|
|
||||||
height: 100%;
|
|
||||||
background: #fff;
|
|
||||||
float: right;
|
|
||||||
transform: translateX(100%);
|
|
||||||
transition: 0.3s;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.none {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.show {
|
|
||||||
background: rgba(0, 0, 0, 0.4);
|
|
||||||
|
|
||||||
.cate-content {
|
|
||||||
transform: translateX(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.cate-list {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
.cate-item {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
height: 90rpx;
|
|
||||||
padding-left: 30rpx;
|
|
||||||
font-size: 28rpx;
|
|
||||||
color: #555;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.two {
|
|
||||||
height: 64rpx;
|
|
||||||
color: #303133;
|
|
||||||
font-size: 30rpx;
|
|
||||||
background: #f8f8f8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.price-box {
|
|
||||||
margin-top: 10rpx;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
padding-right: 10rpx;
|
|
||||||
font-size: 24rpx;
|
|
||||||
color: $font-color-light;
|
|
||||||
}
|
|
||||||
|
|
||||||
.price {
|
|
||||||
font-size: 26rpx;
|
|
||||||
line-height: 1;
|
|
||||||
color: $main-color;
|
|
||||||
font-weight: bold;
|
|
||||||
/deep/ span:nth-of-type(1) {
|
|
||||||
font-size: 38rpx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* 商品列表 */
|
|
||||||
.goods-list {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
margin: 10rpx 20rpx 284rpx;
|
|
||||||
|
|
||||||
|
|
||||||
// background: #fff;
|
|
||||||
width: 100%;
|
|
||||||
.goods-item {
|
|
||||||
background-color: #ffffff;
|
|
||||||
display: flex;
|
|
||||||
border-radius: 16rpx;
|
|
||||||
flex-direction: column;
|
|
||||||
width: calc(50% - 30rpx);
|
|
||||||
margin-bottom: 20rpx;
|
|
||||||
padding-bottom: 20rpx;
|
|
||||||
|
|
||||||
&:nth-child(2n + 1) {
|
|
||||||
margin-right: 20rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.goods-detail {
|
|
||||||
margin: 0 20rpx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.image-wrapper {
|
|
||||||
width: 100%;
|
|
||||||
height: 330rpx;
|
|
||||||
border-radius: 16rpx 16rpx 0 0;
|
|
||||||
overflow: hidden;
|
|
||||||
padding: 0;
|
|
||||||
image {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
opacity: 1;
|
|
||||||
border-radius: 16rpx 16rpx 0 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.title {
|
|
||||||
font-size: $font-base;
|
|
||||||
color: $font-color-dark;
|
|
||||||
line-height: 1.5;
|
|
||||||
height: 84rpx;
|
|
||||||
padding: 10rpx 0 0;
|
|
||||||
display: -webkit-box;
|
|
||||||
|
|
||||||
-webkit-box-orient: vertical;
|
|
||||||
|
|
||||||
-webkit-line-clamp: 2;
|
|
||||||
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.countConfig,
|
|
||||||
.storeSellerName {
|
|
||||||
font-size: $font-sm;
|
|
||||||
}
|
|
||||||
|
|
||||||
.textHidden {
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.status_bar {
|
.status_bar {
|
||||||
height: var(--status-bar-height);
|
height: var(--status-bar-height);
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@@ -659,7 +441,7 @@ view {
|
|||||||
padding-top: 300rpx;
|
padding-top: 300rpx;
|
||||||
color: #999999;
|
color: #999999;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
/deep/ .u-image {
|
::v-deep .u-image {
|
||||||
width: 346rpx;
|
width: 346rpx;
|
||||||
height: 304rpx;
|
height: 304rpx;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,41 +1,43 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="content">
|
<view class="content">
|
||||||
<u-navbar :background="navObj" :is-back="false">
|
<u-navbar :background="navObj" :is-back="false">
|
||||||
<mSearch ref="mSearch" class="mSearch-input-box" @clickLeft="back" :mode="2" :placeholder="defaultKeyword"
|
<mSearch
|
||||||
@search="doSearch(false)" @confirm="doSearch(false)" @SwitchType="doSearchSwitch()" v-model="keyword"
|
ref="mSearch"
|
||||||
:isFocusVal="!isShowSeachGoods"></mSearch>
|
class="mSearch-input-box"
|
||||||
|
@clickLeft="back"
|
||||||
|
:mode="2"
|
||||||
|
:placeholder="defaultKeyword"
|
||||||
|
@search="doSearch(false)"
|
||||||
|
@confirm="doSearch(false)"
|
||||||
|
@SwitchType="doSearchSwitch()"
|
||||||
|
v-model="keyword"
|
||||||
|
:isFocusVal="!isShowSeachGoods"
|
||||||
|
></mSearch>
|
||||||
</u-navbar>
|
</u-navbar>
|
||||||
|
|
||||||
<view class="search-keyword" v-if="!isShowSeachGoods">
|
<view class="search-keyword" v-if="!isShowSeachGoods">
|
||||||
<scroll-view class="keyword-list-box" v-show="isShowKeywordList" scroll-y>
|
<scroll-view class="keyword-list-box" v-show="isShowKeywordList" scroll-y>
|
||||||
<block v-for="(row, index) in keywordList" :key="index">
|
<block v-for="(row, index) in keywordList" :key="index">
|
||||||
<view class="keyword-entry" hover-class="keyword-entry-tap">
|
<view class="keyword-entry" hover-class="keyword-entry-tap">
|
||||||
<view class="keyword-text" @tap.stop="doSearch(keywordList[index].words)">
|
<view class="keyword-text" @tap.stop="doSearch(keywordList[index].words)"><rich-text :nodes="row.words"></rich-text></view>
|
||||||
<rich-text :nodes="row.words"></rich-text>
|
|
||||||
</view>
|
|
||||||
</view>
|
</view>
|
||||||
</block>
|
</block>
|
||||||
</scroll-view>
|
</scroll-view>
|
||||||
<div class="keyword-box" v-show="!isShowKeywordList">
|
<div class="keyword-box" v-show="!isShowKeywordList">
|
||||||
<view class="keyword-block add1">
|
<view class="keyword-block add1">
|
||||||
<view class="keyword-list-header">
|
<view class="keyword-list-header"><view class="u-tips">热门搜索</view></view>
|
||||||
<view class="u-tips">热门搜索</view>
|
|
||||||
</view>
|
|
||||||
<view class="keyword keywordBox">
|
<view class="keyword keywordBox">
|
||||||
<view class="wes" v-for="(keyword, index) in hotKeywordList" @tap="doSearch(keyword)" :key="index">
|
<view class="wes" v-for="(keyword, index) in hotKeywordList" @tap="doSearch(keyword)" :key="index">{{ keyword }}</view>
|
||||||
{{ keyword }}</view>
|
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="keyword-block" v-if="oldKeywordList.length > 0">
|
<view class="keyword-block" v-if="oldKeywordList.length > 0">
|
||||||
<view class="keyword-list-header">
|
<view class="keyword-list-header"><view class="u-tips">搜索历史</view></view>
|
||||||
<view class="u-tips">搜索历史</view>
|
|
||||||
</view>
|
|
||||||
<div class="oldKeyList">
|
<div class="oldKeyList">
|
||||||
<div class="oldKeyItem" v-if="keyword" v-for="(keyword, index) in oldKeywordList" :key="index"
|
<div class="oldKeyItem" v-if="keyword" v-for="(keyword, index) in oldKeywordList" :key="index" @click="doSearch(keyword)">
|
||||||
@click="doSearch(keyword)">
|
<span>{{ keyword }}</span>
|
||||||
<span>{{ keyword }} </span>
|
|
||||||
</div>
|
</div>
|
||||||
<div @click="showMore" v-if=" oldKeywordIndex > loadIndex" class="oldKeyItem">展示更多</div>
|
|
||||||
|
<div @click="showMore" v-if="oldKeywordIndex > loadIndex" class="oldKeyItem">展示更多</div>
|
||||||
</div>
|
</div>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
@@ -50,13 +52,11 @@
|
|||||||
<text>销量</text>
|
<text>销量</text>
|
||||||
<view class="p-box">
|
<view class="p-box">
|
||||||
<view class="index-nav-arrow">
|
<view class="index-nav-arrow">
|
||||||
<image class="img" src="/static/index/arrow-up-1.png"
|
<image class="img" src="/static/index/arrow-up-1.png" v-if="params.sort === 'buyCount' && params.order === 'asc'" mode="aspectFit"></image>
|
||||||
v-if="params.sort === 'buyCount' && params.order === 'asc'" mode="aspectFit"></image>
|
|
||||||
<image class="img" src="/static/index/arrow-up.png" v-else mode="aspectFit"></image>
|
<image class="img" src="/static/index/arrow-up.png" v-else mode="aspectFit"></image>
|
||||||
</view>
|
</view>
|
||||||
<view class="index-nav-arrow">
|
<view class="index-nav-arrow">
|
||||||
<image class="img" src="/static/index/arrow-down.png"
|
<image class="img" src="/static/index/arrow-down.png" v-if="params.sort === 'buyCount' && params.order === 'desc'" mode="aspectFit"></image>
|
||||||
v-if="params.sort === 'buyCount' && params.order === 'desc'" mode="aspectFit"></image>
|
|
||||||
<image class="img" src="/static/index/arrow-down-1.png" v-else mode="aspectFit"></image>
|
<image class="img" src="/static/index/arrow-down-1.png" v-else mode="aspectFit"></image>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -65,13 +65,11 @@
|
|||||||
<text>价格</text>
|
<text>价格</text>
|
||||||
<view class="p-box">
|
<view class="p-box">
|
||||||
<view class="index-nav-arrow">
|
<view class="index-nav-arrow">
|
||||||
<image class="img" src="/static/index/arrow-up-1.png"
|
<image class="img" src="/static/index/arrow-up-1.png" v-if="params.sort === 'price' && params.order === 'asc'" mode="aspectFit"></image>
|
||||||
v-if="params.sort === 'price' && params.order === 'asc'" mode="aspectFit"></image>
|
|
||||||
<image class="img" src="/static/index/arrow-up.png" v-else mode="aspectFit"></image>
|
<image class="img" src="/static/index/arrow-up.png" v-else mode="aspectFit"></image>
|
||||||
</view>
|
</view>
|
||||||
<view class="index-nav-arrow">
|
<view class="index-nav-arrow">
|
||||||
<image class="img" src="/static/index/arrow-down.png"
|
<image class="img" src="/static/index/arrow-down.png" v-if="params.sort === 'price' && params.order === 'desc'" mode="aspectFit"></image>
|
||||||
v-if="params.sort === 'price' && params.order === 'desc'" mode="aspectFit"></image>
|
|
||||||
<image class="img" src="/static/index/arrow-down-1.png" v-else mode="aspectFit"></image>
|
<image class="img" src="/static/index/arrow-down-1.png" v-else mode="aspectFit"></image>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -80,120 +78,32 @@
|
|||||||
</view>
|
</view>
|
||||||
<!-- 一行一个商品展示 -->
|
<!-- 一行一个商品展示 -->
|
||||||
<div v-if="isSWitch">
|
<div v-if="isSWitch">
|
||||||
<scroll-view :style="{ height: goodsHeight }" enableBackToTop="true" lower-threshold="250"
|
<scroll-view
|
||||||
@scrolltolower="loadmore()" scroll-with-animation scroll-y class="scoll-page">
|
:style="{ height: goodsHeight }"
|
||||||
<div class="goodsClass">
|
enableBackToTop="true"
|
||||||
<u-row v-for="(item, index) in goodsList" :key="index" class="goodsRow">
|
lower-threshold="250"
|
||||||
<u-col :span="4" @click.native="navigateToDetailPage(item)" class="switchType1">
|
@scrolltolower="loadmore()"
|
||||||
<u-image width="182rpx" height="200rpx" class="imgGoods" :src="item.content.thumbnail">
|
scroll-with-animation
|
||||||
<u-loading slot="loading"></u-loading>
|
scroll-y
|
||||||
</u-image>
|
class="scoll-page"
|
||||||
</u-col>
|
>
|
||||||
<u-col :span="8" @click.native="navigateToDetailPage(item)" class="switchType2">
|
<goodsList :res="goodsList" type="oneColumns" :keyword="keyword" />
|
||||||
<div class="title clamp3" style="">{{ item.content.goodsName }}</div>
|
|
||||||
<view class="price-box">
|
|
||||||
<div class="price" v-if="item.content.price!=undefined">
|
|
||||||
¥<span>{{ formatPrice(item.content.price )[0] }} </span>.{{
|
|
||||||
formatPrice(item.content.price )[1]
|
|
||||||
}}
|
|
||||||
</div>
|
|
||||||
</view>
|
|
||||||
<div class="promotion">
|
|
||||||
<div v-for="(promotionItem,promotionIndex) in getPromotion(item)" :key="promotionIndex">
|
|
||||||
|
|
||||||
<span v-if="promotionItem.indexOf('COUPON') != -1">劵</span>
|
|
||||||
<span v-if="promotionItem.indexOf('FULL_DISCOUNT') != -1">满减</span>
|
|
||||||
<span v-if="promotionItem.indexOf('SECKILL') != -1">秒杀</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div style="overflow: hidden" class="countConfig">
|
|
||||||
<span style="float: left; font-size: 22rpx">已售 {{ item.buyCount || '0' }}</span>
|
|
||||||
<span style="float: right; font-size: 22rpx">{{ item.commentNum || '0' }}条评论</span>
|
|
||||||
</div>
|
|
||||||
</u-col>
|
|
||||||
<u-col :span="12" class="storeSellerBox">
|
|
||||||
<div class="storeSellerName" @click="clickTostore()">
|
|
||||||
<div class="textHidden">
|
|
||||||
<u-tag style="margin-right: 10rpx" size="mini" mode="dark" v-if="item.selfOperated" text="自营"
|
|
||||||
type="error" />
|
|
||||||
|
|
||||||
<span style="
|
|
||||||
color: #333333;
|
|
||||||
font-size: 28rpx;
|
|
||||||
padding-left: 17rpx;
|
|
||||||
">{{ item.storeName }}</span>
|
|
||||||
</div>
|
|
||||||
<span>
|
|
||||||
<u-icon name="arrow-right" color="#c5c5c5"></u-icon>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</u-col>
|
|
||||||
</u-row>
|
|
||||||
</div>
|
|
||||||
<uni-load-more :status="loadingType" @loadmore="loadmore()"></uni-load-more>
|
<uni-load-more :status="loadingType" @loadmore="loadmore()"></uni-load-more>
|
||||||
</scroll-view>
|
</scroll-view>
|
||||||
</div>
|
</div>
|
||||||
<div class="empty" v-if="goodsList == [] || goodsList == '' || goodsList == null">
|
|
||||||
<view>
|
|
||||||
<image style="width: 320rpx; height: 240rpx" src="/static/nodata.png">
|
|
||||||
|
|
||||||
</image>
|
|
||||||
</view>
|
|
||||||
<view>
|
|
||||||
<p>没有找到相关的商品信息</p>
|
|
||||||
<p>请换一个关键词试试吧</p>
|
|
||||||
</view>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- 一行两个商品展示 -->
|
<!-- 一行两个商品展示 -->
|
||||||
<div v-if="
|
<div v-if="!isSWitch && !(goodsList == [] || goodsList == '' || goodsList == null)">
|
||||||
!isSWitch &&
|
<scroll-view
|
||||||
!(goodsList == [] || goodsList == '' || goodsList == null)
|
:style="{ height: goodsHeight }"
|
||||||
">
|
scroll-anchoring
|
||||||
<scroll-view :style="{ height: goodsHeight }" scroll-anchoring enableBackToTop="true"
|
enableBackToTop="true"
|
||||||
@scrolltolower="loadmore()" scroll-with-animation scroll-y lower-threshold="250" class="scoll-page">
|
@scrolltolower="loadmore()"
|
||||||
<view class="goods-list">
|
scroll-with-animation
|
||||||
<view v-for="(item, index) in goodsList" :key="index" class="goods-item"
|
scroll-y
|
||||||
@click="navigateToDetailPage(item)">
|
lower-threshold="250"
|
||||||
<view class="image-wrapper">
|
class="scoll-page"
|
||||||
<image :src="item.content.thumbnail" mode="aspectFill"></image>
|
>
|
||||||
</view>
|
<goodsList :res="goodsList" :keyword="keyword" />
|
||||||
<view class="goods-detail">
|
|
||||||
<div class="title clamp">{{ item.content.goodsName }}</div>
|
|
||||||
<view class="price-box">
|
|
||||||
<div class="price" v-if="item.content.price!=undefined">
|
|
||||||
|
|
||||||
¥<span>{{ formatPrice(item.content.price )[0] }} </span>.{{
|
|
||||||
formatPrice(item.content.price )[1]
|
|
||||||
}}
|
|
||||||
</div>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<div class="promotion">
|
|
||||||
<div v-for="(promotionItem,promotionIndex) in getPromotion(item)" :key="promotionIndex">
|
|
||||||
|
|
||||||
<span v-if="promotionItem.indexOf('COUPON') != -1">劵</span>
|
|
||||||
<span v-if="promotionItem.indexOf('FULL_DISCOUNT') != -1">满减</span>
|
|
||||||
<span v-if="promotionItem.indexOf('SECKILL') != -1">秒杀</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="countConfig">
|
|
||||||
<span>已售 {{ item.buyCount || "0" }}</span>
|
|
||||||
<span>{{ item.commentNum || "0" }}条评论</span>
|
|
||||||
</div>
|
|
||||||
<div class="storeSellerName">
|
|
||||||
<div class="textHidden">
|
|
||||||
<u-tag style="margin-right: 10rpx" size="mini" mode="dark" v-if="item.selfOperated" text="自营"
|
|
||||||
type="error" />
|
|
||||||
<span>{{ item.storeName || "暂无" }}</span>
|
|
||||||
</div>
|
|
||||||
<span>
|
|
||||||
<u-icon name="arrow-right"></u-icon>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<uni-load-more :status="loadingType"></uni-load-more>
|
<uni-load-more :status="loadingType"></uni-load-more>
|
||||||
</scroll-view>
|
</scroll-view>
|
||||||
</div>
|
</div>
|
||||||
@@ -204,13 +114,15 @@
|
|||||||
<view class="sort-box ">
|
<view class="sort-box ">
|
||||||
<view class="sort-list">
|
<view class="sort-list">
|
||||||
<view class="sort-item">
|
<view class="sort-item">
|
||||||
<view class="sort-title"> 品牌 </view>
|
<view class="sort-title">品牌</view>
|
||||||
<view class="flex" v-if="sortData.brands">
|
<view class="flex" v-if="sortData.brands">
|
||||||
<view class="sort-brand-item" :key="brandsIndex" v-for="(brand, brandsIndex) in sortData.brands"
|
<view class="sort-brand-item" :key="brandsIndex" v-for="(brand, brandsIndex) in sortData.brands" @click="handleSort(brand, brandsIndex, 'brand')">
|
||||||
@click="handleSort(brand, brandsIndex, 'brand')">
|
<view
|
||||||
<view class="sort-radius" :class="{
|
class="sort-radius"
|
||||||
'sort-active': brand.__selected,
|
:class="{
|
||||||
}">
|
'sort-active': brand.__selected
|
||||||
|
}"
|
||||||
|
>
|
||||||
{{ brand.name }}
|
{{ brand.name }}
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -218,14 +130,20 @@
|
|||||||
<!-- <u-empty v-else text="暂无品牌" mode="list"></u-empty> -->
|
<!-- <u-empty v-else text="暂无品牌" mode="list"></u-empty> -->
|
||||||
</view>
|
</view>
|
||||||
<view class="sort-item">
|
<view class="sort-item">
|
||||||
<view class="sort-title"> 全部分类 </view>
|
<view class="sort-title">全部分类</view>
|
||||||
<view class="flex" style="flex-wrap: wrap;" v-if="sortData.categories">
|
<view class="flex" style="flex-wrap: wrap;" v-if="sortData.categories">
|
||||||
<view class="sort-brand-item" :key="categoriesIndex"
|
<view
|
||||||
|
class="sort-brand-item"
|
||||||
|
:key="categoriesIndex"
|
||||||
v-for="(categoryId, categoriesIndex) in sortData.categories"
|
v-for="(categoryId, categoriesIndex) in sortData.categories"
|
||||||
@click="handleSort(categoryId, categoriesIndex, 'categoryId')">
|
@click="handleSort(categoryId, categoriesIndex, 'categoryId')"
|
||||||
<view class="sort-radius" :class="{
|
>
|
||||||
'sort-active': categoryId.__selected,
|
<view
|
||||||
}">
|
class="sort-radius"
|
||||||
|
:class="{
|
||||||
|
'sort-active': categoryId.__selected
|
||||||
|
}"
|
||||||
|
>
|
||||||
{{ categoryId.name }}
|
{{ categoryId.name }}
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -235,18 +153,14 @@
|
|||||||
</view>
|
</view>
|
||||||
<view class="sort-list">
|
<view class="sort-list">
|
||||||
<view class="sort-item">
|
<view class="sort-item">
|
||||||
<view class="sort-title"> 价格区间 </view>
|
<view class="sort-title">价格区间</view>
|
||||||
<view style="display:flex; margin-top:20rpx; align-items: center;">
|
<view style="display:flex; margin-top:20rpx; align-items: center;">
|
||||||
<view class="sort-brand-item uinput">
|
<view class="sort-brand-item uinput">
|
||||||
<view class="sort-radius">
|
<view class="sort-radius"><u-input v-model="minPrice" type="number" placeholder="最低价" input-align="center" /></view>
|
||||||
<u-input v-model="minPrice" type="number" placeholder="最低价" input-align="center" />
|
|
||||||
</view>
|
|
||||||
</view>
|
</view>
|
||||||
<view>-</view>
|
<view>-</view>
|
||||||
<view class="sort-brand-item uinput">
|
<view class="sort-brand-item uinput">
|
||||||
<view class="sort-radius">
|
<view class="sort-radius"><u-input v-model="maxPrice" type="number" placeholder="最高价" input-align="center" /></view>
|
||||||
<u-input v-model="maxPrice" type="number" placeholder="最高价" input-align="center" />
|
|
||||||
</view>
|
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -254,13 +168,15 @@
|
|||||||
|
|
||||||
<view class="sort-list" v-if="sortData.paramOptions">
|
<view class="sort-list" v-if="sortData.paramOptions">
|
||||||
<view class="sort-item" :key="paramIndex" v-for="(param, paramIndex) in sortData.paramOptions">
|
<view class="sort-item" :key="paramIndex" v-for="(param, paramIndex) in sortData.paramOptions">
|
||||||
<view class="sort-title"> {{ param.key }} </view>
|
<view class="sort-title">{{ param.key }}</view>
|
||||||
<view class="flex" style="flex-warp:warp" v-if="param.values">
|
<view class="flex" style="flex-warp:warp" v-if="param.values">
|
||||||
<view class="sort-brand-item" :key="i" v-for="(value, i) in param.values"
|
<view class="sort-brand-item" :key="i" v-for="(value, i) in param.values" @click="handleSort(value, i, 'prop', param)">
|
||||||
@click="handleSort(value, i, 'prop', param)">
|
<view
|
||||||
<view class="sort-radius" :class="{
|
class="sort-radius"
|
||||||
'sort-active': value.__selected,
|
:class="{
|
||||||
}">
|
'sort-active': value.__selected
|
||||||
|
}"
|
||||||
|
>
|
||||||
{{ value.title }}
|
{{ value.title }}
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -275,63 +191,72 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</u-popup>
|
</u-popup>
|
||||||
|
<div class="empty" v-if="empty">
|
||||||
|
<view><image style="width: 320rpx; height: 240rpx" src="/static/nodata.png"></image></view>
|
||||||
|
<view>
|
||||||
|
<p>没有找到相关的商品信息</p>
|
||||||
|
<p>请换一个关键词试试吧</p>
|
||||||
|
</view>
|
||||||
|
</div>
|
||||||
|
<u-back-top :scroll-top="scrollTop"></u-back-top>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { getGoodsList, getGoodsRelated } from "@/api/goods.js";
|
import { getGoodsList, getGoodsRelated } from '@/api/goods.js';
|
||||||
|
import goodsList from '@/components/m-goods-list/list.vue';
|
||||||
import { getHotKeywords } from "@/api/home.js";
|
import { getHotKeywords } from '@/api/home.js';
|
||||||
import mSearch from "@/components/m-search-revision/m-search-revision.vue";
|
import mSearch from '@/components/m-search-revision/m-search-revision.vue';
|
||||||
import storage from "@/utils/storage";
|
import storage from '@/utils/storage';
|
||||||
export default {
|
export default {
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
empty: false,
|
||||||
|
scrollTop: 0,
|
||||||
loadIndex: 10,
|
loadIndex: 10,
|
||||||
oldKeywordIndex: "",
|
oldKeywordIndex: 0,
|
||||||
selectedWay: {
|
selectedWay: {
|
||||||
brand: [],
|
brand: [],
|
||||||
categoryId: [],
|
categoryId: [],
|
||||||
prop: [],
|
prop: []
|
||||||
},
|
},
|
||||||
|
|
||||||
sortPopup: false, //筛选的开关
|
sortPopup: false, //筛选的开关
|
||||||
navObj: {
|
navObj: {
|
||||||
background: "#fff",
|
background: '#fff'
|
||||||
},
|
},
|
||||||
typeSortData: {
|
typeSortData: {
|
||||||
type: "",
|
type: '',
|
||||||
index: "",
|
index: ''
|
||||||
},
|
},
|
||||||
goodsHeight: "",
|
goodsHeight: '',
|
||||||
defaultKeyword: "",
|
defaultKeyword: '',
|
||||||
keyword: "",
|
keyword: '',
|
||||||
oldKeywordList: [],
|
oldKeywordList: [],
|
||||||
hotKeywordList: [],
|
hotKeywordList: [],
|
||||||
keywordList: [],
|
keywordList: [],
|
||||||
goodsList: [],
|
goodsList: [],
|
||||||
|
|
||||||
cateMaskState: 0, //分类面板展开状态
|
cateMaskState: 0, //分类面板展开状态
|
||||||
loadingType: "more", //加载更多状态
|
loadingType: 'more', //加载更多状态
|
||||||
filterIndex: 0,
|
filterIndex: 0,
|
||||||
cateId: 0, //已选三级分类id
|
cateId: 0, //已选三级分类id
|
||||||
priceOrder: 0, //1 价格从低到高 2价格从高到低
|
priceOrder: 0, //1 价格从低到高 2价格从高到低
|
||||||
cateList: [],
|
cateList: [],
|
||||||
isShowSeachGoods: false,
|
isShowSeachGoods: false,
|
||||||
isShowKeywordList: false,
|
isShowKeywordList: false,
|
||||||
sortData: "",
|
sortData: '',
|
||||||
isSWitch: false,
|
isSWitch: false,
|
||||||
|
|
||||||
params: {
|
params: {
|
||||||
pageNumber: 1,
|
pageNumber: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
// sort: 'grade_asc',
|
// sort: 'grade_asc',
|
||||||
sort: "releaseTime",
|
|
||||||
order: "desc",
|
keyword: ''
|
||||||
keyword: "",
|
|
||||||
},
|
},
|
||||||
minPrice: "",
|
minPrice: '',
|
||||||
maxPrice: "",
|
maxPrice: '',
|
||||||
sortParams: {
|
sortParams: {
|
||||||
pageNumber: 1,
|
pageNumber: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
@@ -339,15 +264,20 @@ export default {
|
|||||||
// price: "", //价格,示例值(10_30)
|
// price: "", //价格,示例值(10_30)
|
||||||
// prop: "", //属性:参数名_参数值@参数名_参数值,示例值(屏幕类型_LED@屏幕尺寸_15英寸)
|
// prop: "", //属性:参数名_参数值@参数名_参数值,示例值(屏幕类型_LED@屏幕尺寸_15英寸)
|
||||||
// brandId:"", //品牌,可以多选 品牌Id@品牌Id@品牌Id
|
// brandId:"", //品牌,可以多选 品牌Id@品牌Id@品牌Id
|
||||||
categoryId: "",
|
categoryId: ''
|
||||||
},
|
},
|
||||||
|
|
||||||
routerVal: "",
|
routerVal: ''
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
onPageScroll(e) {
|
||||||
|
console.log(e);
|
||||||
|
this.scrollTop = e.scrollTop;
|
||||||
|
},
|
||||||
onLoad(val) {
|
onLoad(val) {
|
||||||
this.init();
|
this.init();
|
||||||
this.initSortGoods();
|
// this.initSortGoods();
|
||||||
// 接收分类的数据
|
// 接收分类的数据
|
||||||
|
|
||||||
this.routerVal = val;
|
this.routerVal = val;
|
||||||
@@ -355,7 +285,11 @@ export default {
|
|||||||
// 有值
|
// 有值
|
||||||
if (this.routerVal.category) {
|
if (this.routerVal.category) {
|
||||||
this.params.categoryId = this.routerVal.category;
|
this.params.categoryId = this.routerVal.category;
|
||||||
|
this.sortParams.categoryId = this.routerVal.category;
|
||||||
this.isShowSeachGoods = true;
|
this.isShowSeachGoods = true;
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs.mSearch.isShowSeachGoods = true;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
if (this.routerVal.keyword) {
|
if (this.routerVal.keyword) {
|
||||||
this.params.keyword = this.routerVal.keyword;
|
this.params.keyword = this.routerVal.keyword;
|
||||||
@@ -365,10 +299,19 @@ export default {
|
|||||||
this.params.storeId = this.routerVal.storeId;
|
this.params.storeId = this.routerVal.storeId;
|
||||||
this.isShowSeachGoods = true;
|
this.isShowSeachGoods = true;
|
||||||
}
|
}
|
||||||
|
if (this.routerVal.promotionType) {
|
||||||
|
this.params.promotionType = this.routerVal.promotionType;
|
||||||
|
this.isShowSeachGoods = true;
|
||||||
|
}
|
||||||
|
if (this.routerVal.promotionsId) {
|
||||||
|
this.params.promotionsId = this.routerVal.promotionsId;
|
||||||
|
this.isShowSeachGoods = true;
|
||||||
|
}
|
||||||
this.loadData();
|
this.loadData();
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
mSearch,
|
mSearch,
|
||||||
|
goodsList
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
/**
|
/**
|
||||||
@@ -380,9 +323,14 @@ export default {
|
|||||||
this.defaultKeyword = val;
|
this.defaultKeyword = val;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.defaultKeyword = "请输入搜索商品";
|
this.defaultKeyword = '请输入搜索商品';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
sortPopup(val) {
|
||||||
|
if (val) {
|
||||||
|
this.selectedWay = { brand: [], categoryId: [], prop: [] };
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
onReachBottom() {
|
onReachBottom() {
|
||||||
@@ -397,34 +345,30 @@ export default {
|
|||||||
let navHeight = 0;
|
let navHeight = 0;
|
||||||
|
|
||||||
uni.getSystemInfo({
|
uni.getSystemInfo({
|
||||||
success: function (res) {
|
success: function(res) {
|
||||||
// res - 各种参数
|
// res - 各种参数
|
||||||
|
|
||||||
let top = uni.createSelectorQuery().select(".u-navbar");
|
let top = uni.createSelectorQuery().select('.u-navbar');
|
||||||
top
|
top.boundingClientRect(function(data) {
|
||||||
.boundingClientRect(function (data) {
|
|
||||||
if (data && data.height) {
|
if (data && data.height) {
|
||||||
//data - 各种参数
|
//data - 各种参数
|
||||||
topHeight = data.height; // 获取元素宽度
|
topHeight = data.height; // 获取元素宽度
|
||||||
}
|
}
|
||||||
})
|
}).exec();
|
||||||
.exec();
|
let nav = uni.createSelectorQuery().select('.navbar');
|
||||||
let nav = uni.createSelectorQuery().select(".navbar");
|
nav.boundingClientRect(function(data) {
|
||||||
nav
|
|
||||||
.boundingClientRect(function (data) {
|
|
||||||
if (data && data.height) {
|
if (data && data.height) {
|
||||||
//data - 各种参数
|
//data - 各种参数
|
||||||
navHeight = data.height; // 获取元素宽度
|
navHeight = data.height; // 获取元素宽度
|
||||||
}
|
}
|
||||||
})
|
}).exec();
|
||||||
.exec();
|
}
|
||||||
},
|
|
||||||
});
|
});
|
||||||
this.goodsHeight = windowHeight - navHeight - topHeight;
|
this.goodsHeight = windowHeight - navHeight - topHeight;
|
||||||
// #ifdef APP-PLUS
|
// #ifdef APP-PLUS
|
||||||
this.goodsHeight = this.goodsHeight - 100;
|
this.goodsHeight = this.goodsHeight - 100;
|
||||||
// #endif
|
// #endif
|
||||||
this.goodsHeight += "px";
|
this.goodsHeight += 'px';
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
@@ -432,24 +376,15 @@ export default {
|
|||||||
getPromotion(item) {
|
getPromotion(item) {
|
||||||
if (item.promotionMap) {
|
if (item.promotionMap) {
|
||||||
let array = [];
|
let array = [];
|
||||||
Object.keys(item.promotionMap).forEach((child) => {
|
Object.keys(item.promotionMap).forEach(child => {
|
||||||
if (!array.includes(child.split("-")[0])) {
|
if (!array.includes(child.split('-')[0])) {
|
||||||
array.push(child.split("-")[0]);
|
array.push(child.split('-')[0]);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// 格式化金钱 1999 --> [1999,00]
|
|
||||||
formatPrice(val) {
|
|
||||||
if (typeof val == "undefined") {
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
return val.toFixed(2).split(".");
|
|
||||||
},
|
|
||||||
|
|
||||||
// 展示更多数据
|
// 展示更多数据
|
||||||
showMore() {
|
showMore() {
|
||||||
this.loadOldKeyword(this.oldKeywordIndex);
|
this.loadOldKeyword(this.oldKeywordIndex);
|
||||||
@@ -458,25 +393,37 @@ export default {
|
|||||||
// 点击确定进行筛选
|
// 点击确定进行筛选
|
||||||
sortConfim() {
|
sortConfim() {
|
||||||
// 处理品牌(多选
|
// 处理品牌(多选
|
||||||
|
if (!this.params.brandId) {
|
||||||
this.params.brandId = [];
|
this.params.brandId = [];
|
||||||
this.selectedWay["brand"].forEach((item) => {
|
} else {
|
||||||
|
this.params.brandId = [this.params.brandId];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果选中品牌 赋值
|
||||||
|
this.selectedWay['brand'].forEach(item => {
|
||||||
if (item.__selected) {
|
if (item.__selected) {
|
||||||
this.params.brandId.push(item.value);
|
this.params.brandId.push(item.value);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.params.brandId = this.params.brandId.join("@");
|
|
||||||
|
this.params.brandId = this.params.brandId.join('@') || '';
|
||||||
|
|
||||||
// 处理分类 (单选)
|
// 处理分类 (单选)
|
||||||
if (this.selectedWay["categoryId"][0]) {
|
if (this.selectedWay['categoryId'][0]) {
|
||||||
this.params.categoryId = this.selectedWay["categoryId"][0].value;
|
this.params.categoryId = this.selectedWay['categoryId'][0].value;
|
||||||
}
|
}
|
||||||
// 处理属性
|
if (!this.params.prop) {
|
||||||
this.params.prop = [];
|
this.params.prop = [];
|
||||||
this.selectedWay["prop"].forEach((item) => {
|
} else {
|
||||||
|
this.params.prop = [this.params.prop];
|
||||||
|
}
|
||||||
|
|
||||||
|
this.selectedWay['prop'].forEach(item => {
|
||||||
if (item.__selected) {
|
if (item.__selected) {
|
||||||
this.params.prop.push(`${item.parent}_${item.title}`);
|
this.params.prop.push(`${item.parent}_${item.title}`);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.params.prop = this.params.prop.join("@");
|
this.params.prop = this.params.prop.join('@');
|
||||||
// 处理价格
|
// 处理价格
|
||||||
if (this.minPrice || this.maxPrice) {
|
if (this.minPrice || this.maxPrice) {
|
||||||
this.params.price = `${this.minPrice}_${this.maxPrice}`;
|
this.params.price = `${this.minPrice}_${this.maxPrice}`;
|
||||||
@@ -485,30 +432,42 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.goodsList = [];
|
this.goodsList = [];
|
||||||
|
|
||||||
|
this.params.pageNumber = 1;
|
||||||
|
this.sortParams = this.params;
|
||||||
|
|
||||||
this.loadData();
|
this.loadData();
|
||||||
this.sortPopup = false;
|
this.sortPopup = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
// 重置
|
// 重置
|
||||||
repick() {
|
repick() {
|
||||||
|
this.sortParams = {
|
||||||
|
pageNumber: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
categoryId: this.routerVal.category || ''
|
||||||
|
};
|
||||||
|
this.sortPopup = false;
|
||||||
this.initSortGoods();
|
this.initSortGoods();
|
||||||
this.minPrice = "";
|
this.minPrice = '';
|
||||||
this.maxPrice = "";
|
this.maxPrice = '';
|
||||||
this.params = {
|
this.params = {
|
||||||
pageNumber: 1,
|
pageNumber: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
|
categoryId: this.routerVal.category || ''
|
||||||
};
|
};
|
||||||
|
this.goodsList = [];
|
||||||
this.loadData();
|
this.loadData();
|
||||||
},
|
},
|
||||||
|
|
||||||
// 点击筛选的内容
|
// 点击筛选的内容
|
||||||
handleSort(val, index, type, parent) {
|
handleSort(val, index, type, parent) {
|
||||||
if (type == "prop") {
|
if (type == 'prop') {
|
||||||
val.parent = parent.key;
|
val.parent = parent.key;
|
||||||
}
|
}
|
||||||
this.selectedWay[type].push(val);
|
this.selectedWay[type].push(val);
|
||||||
if (type == "categoryId") {
|
if (type == 'categoryId') {
|
||||||
this.sortData.categories.forEach((item) => {
|
this.sortData.categories.forEach(item => {
|
||||||
item.__selected = false;
|
item.__selected = false;
|
||||||
});
|
});
|
||||||
val.__selected = true;
|
val.__selected = true;
|
||||||
@@ -528,12 +487,19 @@ export default {
|
|||||||
},
|
},
|
||||||
back() {
|
back() {
|
||||||
uni.navigateBack({
|
uni.navigateBack({
|
||||||
delta: 1,
|
delta: 1
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
// 跳转到商品详情
|
||||||
navigateToDetailPage(item) {
|
navigateToDetailPage(item) {
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
url: `/pages/product/goods?id=${item.content.id}&goodsId=${item.content.goodsId}`,
|
url: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`
|
||||||
|
});
|
||||||
|
},
|
||||||
|
// 跳转地址
|
||||||
|
navigateToStoreDetailPage(item) {
|
||||||
|
uni.navigateTo({
|
||||||
|
url: `/pages/product/shopPage?id=${item.storeId}`
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
loadmore() {
|
loadmore() {
|
||||||
@@ -541,17 +507,17 @@ export default {
|
|||||||
this.loadData();
|
this.loadData();
|
||||||
},
|
},
|
||||||
initSortGoods() {
|
initSortGoods() {
|
||||||
getGoodsRelated(this.sortParams).then((res) => {
|
getGoodsRelated(this.sortParams).then(res => {
|
||||||
if (res.data.success) {
|
if (res.data.success) {
|
||||||
for (let item of Object.keys(res.data.result)) {
|
for (let item of Object.keys(res.data.result)) {
|
||||||
res.data.result[item].forEach((child) => {
|
res.data.result[item].forEach(child => {
|
||||||
child.__selected = false;
|
child.__selected = false;
|
||||||
|
|
||||||
// 循环出和品牌分类一样的数据格式
|
// 循环出和品牌分类一样的数据格式
|
||||||
if (child.values) {
|
if (child.values) {
|
||||||
child.values = child.values.map((item) => ({
|
child.values = child.values.map(item => ({
|
||||||
title: item,
|
title: item,
|
||||||
__selected: false,
|
__selected: false
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -571,30 +537,28 @@ export default {
|
|||||||
this.params.pageSize = 10;
|
this.params.pageSize = 10;
|
||||||
// this.params.order = "desc";
|
// this.params.order = "desc";
|
||||||
if (this.params.sort == type) {
|
if (this.params.sort == type) {
|
||||||
this.params.order == "asc"
|
this.params.order == 'asc' ? (this.params.order = 'desc') : (this.params.order = 'asc');
|
||||||
? (this.params.order = "desc")
|
|
||||||
: (this.params.order = "asc");
|
|
||||||
|
|
||||||
this.$set(this.params, "sort", type);
|
this.$set(this.params, 'sort', type);
|
||||||
} else {
|
} else {
|
||||||
this.params.order = "desc";
|
this.params.order = 'desc';
|
||||||
this.$set(this.params, "sort", type);
|
this.$set(this.params, 'sort', type);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (index == 0) {
|
if (index == 0) {
|
||||||
this.params.sort = "releaseTime";
|
this.params.sort = 'releaseTime';
|
||||||
this.params.order = "desc";
|
this.params.order = 'desc';
|
||||||
}
|
}
|
||||||
|
|
||||||
this.filterIndex = index;
|
this.filterIndex = index;
|
||||||
|
|
||||||
uni.pageScrollTo({
|
uni.pageScrollTo({
|
||||||
duration: 300,
|
duration: 300,
|
||||||
scrollTop: 0,
|
scrollTop: 0
|
||||||
});
|
});
|
||||||
this.loadData("refresh", 1);
|
this.loadData('refresh', 1);
|
||||||
uni.showLoading({
|
uni.showLoading({
|
||||||
title: "正在加载",
|
title: '正在加载'
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
//加载默认搜索关键字
|
//加载默认搜索关键字
|
||||||
@@ -607,21 +571,21 @@ export default {
|
|||||||
//
|
//
|
||||||
this.defaultKeyword = this.hotKeywordList[0];
|
this.defaultKeyword = this.hotKeywordList[0];
|
||||||
} else {
|
} else {
|
||||||
this.defaultKeyword = "请输入搜索商品";
|
this.defaultKeyword = '请输入搜索商品';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
//加载历史搜索,自动读取本地Storage
|
//加载历史搜索,自动读取本地Storage
|
||||||
loadOldKeyword(index) {
|
loadOldKeyword(index) {
|
||||||
this.oldKeywordList = [];
|
this.oldKeywordList = [];
|
||||||
uni.getStorage({
|
uni.getStorage({
|
||||||
key: "OldKeys",
|
key: 'OldKeys',
|
||||||
success: (res) => {
|
success: res => {
|
||||||
var OldKeys = JSON.parse(res.data);
|
var OldKeys = JSON.parse(res.data);
|
||||||
this.oldKeywordIndex = res.data.length;
|
this.oldKeywordIndex = OldKeys.length;
|
||||||
for (let i = 0; i < index; i++) {
|
for (let i = 0; i < index; i++) {
|
||||||
this.oldKeywordList.push(OldKeys[i]);
|
this.oldKeywordList.push(OldKeys[i]);
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -632,27 +596,24 @@ export default {
|
|||||||
*/
|
*/
|
||||||
async loadHotKeyword() {
|
async loadHotKeyword() {
|
||||||
this.hotKeywordList = [];
|
this.hotKeywordList = [];
|
||||||
if (
|
if (!storage.getHotWords().time || storage.getHotWords().time <= new Date().getTime() / 1000) {
|
||||||
!storage.getHotWords().time ||
|
|
||||||
storage.getHotWords().time <= new Date().getTime() / 1000
|
|
||||||
) {
|
|
||||||
// 没有缓存或者第一次进入请求接口保存缓存
|
// 没有缓存或者第一次进入请求接口保存缓存
|
||||||
let res = await getHotKeywords(10);
|
let res = await getHotKeywords(10);
|
||||||
let keywords = res.data.result;
|
let keywords = res.data.result;
|
||||||
|
|
||||||
keywords.forEach((item) => {
|
keywords.forEach(item => {
|
||||||
this.hotKeywordList.push(item);
|
this.hotKeywordList.push(item);
|
||||||
});
|
});
|
||||||
|
|
||||||
let hotData = {
|
let hotData = {
|
||||||
time: new Date().getTime() / 1000 + 30 * 5,
|
time: new Date().getTime() / 1000 + 30 * 5,
|
||||||
keywords: keywords,
|
keywords: keywords
|
||||||
};
|
};
|
||||||
storage.setHotWords(hotData);
|
storage.setHotWords(hotData);
|
||||||
} else {
|
} else {
|
||||||
let keywords = storage.getHotWords().keywords;
|
let keywords = storage.getHotWords().keywords;
|
||||||
|
|
||||||
keywords.forEach((item) => {
|
keywords.forEach(item => {
|
||||||
this.hotKeywordList.push(item);
|
this.hotKeywordList.push(item);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -660,19 +621,22 @@ export default {
|
|||||||
},
|
},
|
||||||
//加载商品 ,带下拉刷新和上滑加载
|
//加载商品 ,带下拉刷新和上滑加载
|
||||||
async loadData(type, loading) {
|
async loadData(type, loading) {
|
||||||
this.loadingType = "loading";
|
this.loadingType = 'loading';
|
||||||
if (type == "refresh") {
|
if (type == 'refresh') {
|
||||||
this.goodsList = [];
|
this.goodsList = [];
|
||||||
}
|
}
|
||||||
//没有更多直接返回 #TODO
|
//没有更多直接返回 #TODO
|
||||||
let goodsList = await getGoodsList(this.params);
|
let goodsList = await getGoodsList(this.params);
|
||||||
|
if (goodsList.data.result.records.length < 10) {
|
||||||
if (goodsList.data.result.content.length < 10) {
|
this.loadingType = 'noMore';
|
||||||
this.loadingType = "noMore";
|
this.empty = true;
|
||||||
|
} else {
|
||||||
|
this.empty = false;
|
||||||
}
|
}
|
||||||
this.goodsList.push(...goodsList.data.result.content);
|
this.goodsList.push(...goodsList.data.result.records);
|
||||||
|
|
||||||
this.initSortGoods();
|
this.initSortGoods();
|
||||||
uni.hideLoading();
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
},
|
},
|
||||||
|
|
||||||
//高亮关键字
|
//高亮关键字
|
||||||
@@ -682,14 +646,11 @@ export default {
|
|||||||
for (var i = 0; i < len; i++) {
|
for (var i = 0; i < len; i++) {
|
||||||
var row = keywords[i];
|
var row = keywords[i];
|
||||||
//定义高亮#9f9f9f
|
//定义高亮#9f9f9f
|
||||||
var html = row[0].replace(
|
var html = row[0].replace(keyword, "<span style='color: #9f9f9f;'>" + keyword + '</span>');
|
||||||
keyword,
|
html = '<div>' + html + '</div>';
|
||||||
"<span style='color: #9f9f9f;'>" + keyword + "</span>"
|
|
||||||
);
|
|
||||||
html = "<div>" + html + "</div>";
|
|
||||||
var tmpObj = {
|
var tmpObj = {
|
||||||
keyword: row[0],
|
keyword: row[0],
|
||||||
htmlStr: html,
|
htmlStr: html
|
||||||
};
|
};
|
||||||
keywordArr.push(tmpObj);
|
keywordArr.push(tmpObj);
|
||||||
}
|
}
|
||||||
@@ -702,15 +663,15 @@ export default {
|
|||||||
//清除历史搜索
|
//清除历史搜索
|
||||||
oldDelete() {
|
oldDelete() {
|
||||||
uni.showModal({
|
uni.showModal({
|
||||||
content: "确定清除历史搜索记录?",
|
content: '确定清除历史搜索记录?',
|
||||||
success: (res) => {
|
success: res => {
|
||||||
if (res.confirm) {
|
if (res.confirm) {
|
||||||
this.oldKeywordList = [];
|
this.oldKeywordList = [];
|
||||||
uni.removeStorage({
|
uni.removeStorage({
|
||||||
key: "OldKeys",
|
key: 'OldKeys'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -718,6 +679,9 @@ export default {
|
|||||||
doSearchSwitch() {
|
doSearchSwitch() {
|
||||||
this.isSWitch = !this.isSWitch;
|
this.isSWitch = !this.isSWitch;
|
||||||
this.isShowSeachGoods = true;
|
this.isShowSeachGoods = true;
|
||||||
|
this.params.pageNumber = 1;
|
||||||
|
this.params.pageSize = 10;
|
||||||
|
this.loadData('refresh', 1);
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -733,25 +697,27 @@ export default {
|
|||||||
* 第一次搜索如果没有关键词会将热门搜索中第一个热词进行判定
|
* 第一次搜索如果没有关键词会将热门搜索中第一个热词进行判定
|
||||||
* 如果没有热词则会展示一个空词搜索
|
* 如果没有热词则会展示一个空词搜索
|
||||||
*/
|
*/
|
||||||
keyword = (this.hotKeywordList.length && this.hotKeywordList[0]) || "";
|
keyword = (this.hotKeywordList.length && this.hotKeywordList[0]) || '';
|
||||||
}
|
}
|
||||||
this.defaultKeyword == "请输入搜索商品" ? (keyword = "") : "";
|
this.defaultKeyword == '请输入搜索商品' ? (keyword = '') : '';
|
||||||
// this.keyword = keyword;
|
|
||||||
keyword ? (this.keyword = keyword) : "";
|
|
||||||
|
keyword ? (this.keyword = keyword) : '';
|
||||||
this.saveKeyword(keyword); //保存为历史
|
this.saveKeyword(keyword); //保存为历史
|
||||||
this.isShowSeachGoods = true;
|
this.isShowSeachGoods = true;
|
||||||
this.$refs.mSearch.isShowSeachGoods = true;
|
this.$refs.mSearch.isShowSeachGoods = true;
|
||||||
|
this.$refs.mSearch.inputVal = keyword;
|
||||||
this.params.keyword = this.keyword;
|
this.params.keyword = this.keyword;
|
||||||
this.params.pageNumber = 1;
|
this.params.pageNumber = 1;
|
||||||
this.$set(this.sortParams, "keyword", keyword);
|
this.$set(this.sortParams, 'keyword', keyword);
|
||||||
this.loadData("refresh", 1);
|
this.loadData('refresh', 1);
|
||||||
},
|
},
|
||||||
//保存关键字到历史记录
|
//保存关键字到历史记录
|
||||||
saveKeyword(keyword) {
|
saveKeyword(keyword) {
|
||||||
if (!keyword) return false;
|
if (!keyword) return false;
|
||||||
uni.getStorage({
|
uni.getStorage({
|
||||||
key: "OldKeys",
|
key: 'OldKeys',
|
||||||
success: (res) => {
|
success: res => {
|
||||||
var OldKeys = JSON.parse(res.data);
|
var OldKeys = JSON.parse(res.data);
|
||||||
var findIndex = OldKeys.indexOf(keyword);
|
var findIndex = OldKeys.indexOf(keyword);
|
||||||
if (findIndex == -1) {
|
if (findIndex == -1) {
|
||||||
@@ -764,24 +730,24 @@ export default {
|
|||||||
OldKeys.length > 10 && OldKeys.pop();
|
OldKeys.length > 10 && OldKeys.pop();
|
||||||
|
|
||||||
uni.setStorage({
|
uni.setStorage({
|
||||||
key: "OldKeys",
|
key: 'OldKeys',
|
||||||
data: JSON.stringify(OldKeys),
|
data: JSON.stringify(OldKeys)
|
||||||
});
|
});
|
||||||
this.oldKeywordList = OldKeys; //更新历史搜索
|
this.oldKeywordList = OldKeys; //更新历史搜索
|
||||||
},
|
},
|
||||||
fail: (e) => {
|
fail: e => {
|
||||||
var OldKeys = [keyword];
|
var OldKeys = [keyword];
|
||||||
uni.setStorage({
|
uni.setStorage({
|
||||||
key: "OldKeys",
|
key: 'OldKeys',
|
||||||
data: JSON.stringify(OldKeys),
|
data: JSON.stringify(OldKeys)
|
||||||
});
|
});
|
||||||
this.oldKeywordList = OldKeys; //更新历史搜索
|
this.oldKeywordList = OldKeys; //更新历史搜索
|
||||||
},
|
}
|
||||||
});
|
});
|
||||||
},
|
}
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
@import "./search.scss";
|
@import './search.scss';
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,29 +1,54 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="content">
|
<view class="content">
|
||||||
<view class="u-tabs-box">
|
<view class="u-tabs-box">
|
||||||
<u-tabs bg-color="#fff" :list="list" :is-scroll="false" :current="current" @change="change" :active-color="$lightColor"></u-tabs>
|
<u-tabs
|
||||||
|
bg-color="#fff"
|
||||||
|
:list="list"
|
||||||
|
:is-scroll="false"
|
||||||
|
:current="current"
|
||||||
|
@change="change"
|
||||||
|
:active-color="$lightColor"
|
||||||
|
></u-tabs>
|
||||||
</view>
|
</view>
|
||||||
<div class="u-tabs-search">
|
<div class="u-tabs-search">
|
||||||
<u-search placeholder="请输入订单编号" @search="handleGetOrderList(current)" @clear="handleGetOrderList(current)" @custom="handleGetOrderList(current)" v-model="params.orderSn"></u-search>
|
<u-search
|
||||||
|
placeholder="请输入订单编号/商品名称/售后单号"
|
||||||
|
@search="submitSearchOrderList(current)"
|
||||||
|
@clear="clear(current)"
|
||||||
|
@custom="submitSearchOrderList(current)"
|
||||||
|
v-model="keywords"
|
||||||
|
>
|
||||||
|
</u-search>
|
||||||
</div>
|
</div>
|
||||||
<scroll-view class="body-view" scroll-y @scrolltolower="renderDate">
|
<scroll-view class="body-view" scroll-y @scrolltolower="renderDate">
|
||||||
<view class="seller-view" v-for="(order, orderIndex) in orderList" :key="orderIndex">
|
<view
|
||||||
|
class="seller-view"
|
||||||
|
v-for="(order, orderIndex) in orderList"
|
||||||
|
:key="orderIndex"
|
||||||
|
>
|
||||||
<!-- 店铺名称 -->
|
<!-- 店铺名称 -->
|
||||||
<view class="seller-info u-flex u-row-between" v-if="current == 0">
|
<view class="seller-info u-flex u-row-between" v-if="current == 0">
|
||||||
<view class="seller-name">
|
<view class="seller-name">
|
||||||
<view class="name">{{ order.storeName }}</view>
|
<view class="name">{{ order.storeName }}</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="order-sn">订单编号:{{order.sn}}</view>
|
<view class="order-sn">订单编号:{{ order.sn }}</view>
|
||||||
</view>
|
</view>
|
||||||
<!-- 申请记录 选项卡 -->
|
<!-- 申请记录 选项卡 -->
|
||||||
<view class="seller-info u-flex u-row-between" v-if="current != 0">
|
<view class="seller-info u-flex u-row-between" v-if="current != 0">
|
||||||
<view class="order-sn">售后单号:{{ order.service_sn || order.sn }}</view>
|
<view class="order-sn"
|
||||||
|
>售后单号:{{ order.service_sn || order.sn }}</view
|
||||||
|
>
|
||||||
<view class="order-sn">{{ order.serviceType_text }}</view>
|
<view class="order-sn">{{ order.serviceType_text }}</view>
|
||||||
</view>
|
</view>
|
||||||
<view v-for="(sku, goodsIndex) in order.orderItems" :key="goodsIndex">
|
<view v-for="(sku, goodsIndex) in order.orderItems" :key="goodsIndex">
|
||||||
<view class="goods-item-view" @click="onDetail(sku)">
|
<view class="goods-item-view" @click="onDetail(order, sku)">
|
||||||
<view class="goods-img">
|
<view class="goods-img">
|
||||||
<u-image border-radius="6" width="100%" height="100%" :src="sku.image"></u-image>
|
<u-image
|
||||||
|
border-radius="6"
|
||||||
|
width="100%"
|
||||||
|
height="100%"
|
||||||
|
:src="sku.image"
|
||||||
|
></u-image>
|
||||||
</view>
|
</view>
|
||||||
<view class="goods-info">
|
<view class="goods-info">
|
||||||
<view class="goods-title u-line-2">{{ sku.name }}</view>
|
<view class="goods-title u-line-2">{{ sku.name }}</view>
|
||||||
@@ -36,74 +61,147 @@
|
|||||||
<view>x{{ sku.num }}</view>
|
<view>x{{ sku.num }}</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="btn-view u-flex u-row-between">
|
|
||||||
<view class="description">
|
<view class="description">
|
||||||
<!-- 售后申请 -->
|
<!-- 售后申请 -->
|
||||||
<view v-if="
|
<view v-if="current === 0 && sku.afterSaleStatus">
|
||||||
current === 0 && order.groupAfterSaleStatus &&
|
<view
|
||||||
order.groupAfterSaleStatus === 'ALREADY_APPLIED'
|
v-if="sku.afterSaleStatus.includes('ALREADY_APPLIED')"
|
||||||
" class="cannot_apply">
|
class="cannot_apply not_center"
|
||||||
|
>
|
||||||
<u-icon class="icon" name="info-circle-fill"></u-icon>
|
<u-icon class="icon" name="info-circle-fill"></u-icon>
|
||||||
该商品已申请售后服务
|
该商品已申请售后服务
|
||||||
</view>
|
</view>
|
||||||
<view class="cannot_apply" v-if="current === 0 && order.groupAfterSaleStatus && order.groupAfterSaleStatus === 'EXPIRED'" @click="tipsShow = true">
|
</view>
|
||||||
|
<view v-if="current === 0 && sku.afterSaleStatus">
|
||||||
|
<view
|
||||||
|
v-if="sku.afterSaleStatus.includes('EXPIRED')"
|
||||||
|
class="cannot_apply not_center"
|
||||||
|
@click="tipsShow = true"
|
||||||
|
>
|
||||||
<u-icon class="icon" name="info-circle-fill"></u-icon>
|
<u-icon class="icon" name="info-circle-fill"></u-icon>
|
||||||
该商品无法申请售后
|
该商品无法申请售后
|
||||||
</view>
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
<div v-if="current === 1 || current === 2">
|
<div v-if="current === 1 || current === 2">
|
||||||
<!-- 申请中 -->
|
<!-- 申请中 -->
|
||||||
<view class="cannot_apply" v-if="order.serviceType == 'RETURN_GOODS'">退货处理-{{ order.serviceStatus | serviceStatusList }}</view>
|
<view
|
||||||
<view class="cannot_apply" v-if="order.serviceType == 'SUPPLY_AGAIN_GOODS'">补发商品-{{ order.serviceStatus | serviceStatusList }}</view>
|
class="cannot_apply not_center"
|
||||||
<view class="cannot_apply" v-if="order.serviceType == 'RETURN_MONEY'">退款-{{ order.serviceStatus | serviceStatusList }}</view>
|
v-if="order.serviceType == 'RETURN_GOODS'"
|
||||||
<view class="cannot_apply" v-if="order.serviceType == 'EXCHANGE_GOODS'">换货-{{ order.serviceStatus | serviceStatusList }}</view>
|
>
|
||||||
<view class="cannot_apply" v-if="order.serviceType == 'CANCEL'">取消订单-{{ order.serviceStatus | serviceStatusList }}</view>
|
退货处理-{{ order.serviceStatus | serviceStatusList }}</view
|
||||||
|
>
|
||||||
|
<view
|
||||||
|
class="cannot_apply not_center"
|
||||||
|
v-if="order.serviceType == 'SUPPLY_AGAIN_GOODS'"
|
||||||
|
>
|
||||||
|
补发商品-{{ order.serviceStatus | serviceStatusList }}</view
|
||||||
|
>
|
||||||
|
<view
|
||||||
|
class="cannot_apply not_center"
|
||||||
|
v-if="order.serviceType == 'RETURN_MONEY'"
|
||||||
|
>
|
||||||
|
退款-{{ order.serviceStatus | serviceStatusList }}</view
|
||||||
|
>
|
||||||
|
<view
|
||||||
|
class="cannot_apply not_center"
|
||||||
|
v-if="order.serviceType == 'EXCHANGE_GOODS'"
|
||||||
|
>
|
||||||
|
换货-{{ order.serviceStatus | serviceStatusList }}</view
|
||||||
|
>
|
||||||
|
<view
|
||||||
|
class="cannot_apply not_center"
|
||||||
|
v-if="order.serviceType == 'CANCEL'"
|
||||||
|
>
|
||||||
|
取消订单-{{ order.serviceStatus | serviceStatusList }}</view
|
||||||
|
>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 申请记录 -->
|
<!-- 申请记录 -->
|
||||||
</view>
|
</view>
|
||||||
<view class="after-line">
|
<view class="btn-view u-flex u-row-right">
|
||||||
<!-- 售后申请 -->
|
<!-- 售后申请 -->
|
||||||
<view v-if="
|
|
||||||
current === 0 && order.groupAfterSaleStatus=='NOT_APPLIED'
|
<div class="sale" v-if="current === 0 && sku.afterSaleStatus">
|
||||||
" @click="applyService(sku.sn, order, sku)" class="rebuy-btn">
|
<div
|
||||||
申请售后
|
v-if="
|
||||||
</view>
|
order.flowPrice != 0 &&
|
||||||
|
sku.afterSaleStatus.includes('NOT_APPLIED') ||
|
||||||
|
sku.afterSaleStatus.includes('PART_AFTER_SALE')
|
||||||
|
"
|
||||||
|
@click="applyService(sku.sn, order, sku)"
|
||||||
|
>
|
||||||
|
<view class="default-btn border"> 申请售后 </view>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<view class="after-line">
|
||||||
<!-- 申请中 -->
|
<!-- 申请中 -->
|
||||||
<view class="rebuy-btn" v-if="
|
<view
|
||||||
|
class="default-btn border"
|
||||||
|
v-if="
|
||||||
current === 2 &&
|
current === 2 &&
|
||||||
order.serviceStatus &&
|
order.serviceStatus &&
|
||||||
order.serviceStatus == 'PASS' &&
|
order.serviceStatus == 'PASS' &&
|
||||||
order.serviceType != 'RETURN_MONEY'
|
order.serviceType != 'RETURN_MONEY'
|
||||||
" @click="onExpress(order, sku)">
|
"
|
||||||
|
@click="onExpress(order, sku)"
|
||||||
|
>
|
||||||
提交物流
|
提交物流
|
||||||
</view>
|
</view>
|
||||||
<view @click="afterDetails(order, sku)" v-if="current === 1 || current === 2" class="rebuy-btn">
|
<view
|
||||||
|
@click="close(order, sku)"
|
||||||
|
v-if="current === 1"
|
||||||
|
class="default-btn close"
|
||||||
|
>
|
||||||
|
取消售后
|
||||||
|
</view>
|
||||||
|
<view
|
||||||
|
@click="afterDetails(order, sku)"
|
||||||
|
v-if="current === 1 || current === 2"
|
||||||
|
class="default-btn border"
|
||||||
|
>
|
||||||
售后详情
|
售后详情
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view v-if="
|
<view
|
||||||
current === 0 && order.groupAfterSaleStatus &&
|
v-if="
|
||||||
|
current === 0 &&
|
||||||
|
order.groupAfterSaleStatus &&
|
||||||
order.groupAfterSaleStatus != 'ALREADY_APPLIED' &&
|
order.groupAfterSaleStatus != 'ALREADY_APPLIED' &&
|
||||||
order.orderItems.length >= 1
|
order.orderItems.length >= 1
|
||||||
" class="btn-view u-flex u-row-between">
|
"
|
||||||
|
class="btn-view u-flex u-row-between"
|
||||||
|
>
|
||||||
<!-- 多个商品显示订单总价格 -->
|
<!-- 多个商品显示订单总价格 -->
|
||||||
<view class="cannot_apply">
|
<view class="cannot_apply">
|
||||||
订单总金额:<span class="countMoney">¥{{ order.flowPrice | unitPrice }}</span>
|
订单总金额:<span class="countMoney"
|
||||||
|
>¥{{ order.flowPrice | unitPrice }}</span
|
||||||
|
>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<u-loadmore bg-color="#f8f8f8" :status="status" />
|
<u-loadmore bg-color="#f8f8f8" :status="status" />
|
||||||
</scroll-view>
|
</scroll-view>
|
||||||
<u-modal v-model="tipsShow" content="当订单未确认收货|已过售后服务有效期|已申请售后服务时,不能申请售后"></u-modal>
|
<u-modal
|
||||||
|
show-cancel-button
|
||||||
|
@confirm="closeService"
|
||||||
|
v-model="cancelShow"
|
||||||
|
content="确认取消售后"
|
||||||
|
></u-modal>
|
||||||
|
<u-modal
|
||||||
|
v-model="tipsShow"
|
||||||
|
content="当订单未确认收货|已过售后服务有效期|已申请售后服务时,不能申请售后"
|
||||||
|
></u-modal>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import uniLoadMore from "@/components/uni-load-more/uni-load-more.vue";
|
import uniLoadMore from "@/components/uni-load-more/uni-load-more.vue";
|
||||||
import { getAfterSaleList } from "@/api/after-sale.js";
|
import { getAfterSaleList, cancelAfterSale } from "@/api/after-sale.js";
|
||||||
import { getOrderList } from "@/api/order.js";
|
import { getOrderList } from "@/api/order.js";
|
||||||
|
import storage from "@/utils/storage";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
@@ -125,11 +223,14 @@ export default {
|
|||||||
],
|
],
|
||||||
current: 0, //当前表头索引
|
current: 0, //当前表头索引
|
||||||
tipsShow: false, //提示开关
|
tipsShow: false, //提示开关
|
||||||
|
cancelShow: false, //取消显示开关
|
||||||
|
selectedOrder: "", //选中的order
|
||||||
orderList: [], //订单集合
|
orderList: [], //订单集合
|
||||||
params: {
|
params: {
|
||||||
pageNumber: 1,
|
pageNumber: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
sort: "createTime",
|
sort: "createTime",
|
||||||
|
flowPrice: 0,
|
||||||
order: "desc",
|
order: "desc",
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -138,21 +239,35 @@ export default {
|
|||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
},
|
},
|
||||||
status: "loadmore",
|
status: "loadmore",
|
||||||
|
keywords: "", // 搜索订单sn
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
onLoad(options) {
|
onLoad(options) {
|
||||||
this.orderList = [];
|
this.orderList = [];
|
||||||
this.params.pageNumber = 1;
|
this.params.pageNumber = 1;
|
||||||
if (options.orderSn) this.params.orderSn = options.orderSn;
|
if (options.orderSn) this.params.keywords = options.orderSn;
|
||||||
this.getOrderList(this.current);
|
this.searchOrderList(this.current);
|
||||||
},
|
},
|
||||||
onPullDownRefresh() {
|
onPullDownRefresh() {
|
||||||
this.change(this.current);
|
this.change(this.current);
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
handleGetOrderList(current) {
|
/**
|
||||||
|
* 点击搜索执行搜索
|
||||||
|
*/
|
||||||
|
submitSearchOrderList(current) {
|
||||||
|
this.params.pageNumber = 1;
|
||||||
|
this.logParams.pageNumber = 1;
|
||||||
this.orderList = [];
|
this.orderList = [];
|
||||||
this.getOrderList(current);
|
this.searchOrderList(current);
|
||||||
|
},
|
||||||
|
// 清空
|
||||||
|
clear(current){
|
||||||
|
this.params.pageNumber = 1;
|
||||||
|
this.logParams.pageNumber = 1;
|
||||||
|
this.params.keywords = ''
|
||||||
|
this.orderList = [];
|
||||||
|
this.searchOrderList(current);
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
* 切换tab页时,初始化数据
|
* 切换tab页时,初始化数据
|
||||||
@@ -165,8 +280,18 @@ export default {
|
|||||||
};
|
};
|
||||||
this.orderList = [];
|
this.orderList = [];
|
||||||
//如果是2 则读取售后申请记录列表
|
//如果是2 则读取售后申请记录列表
|
||||||
|
this.searchOrderList(index);
|
||||||
|
uni.stopPullDownRefresh();
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 搜索初始化
|
||||||
|
* 根据当前tab传值的索引进行更改
|
||||||
|
*/
|
||||||
|
searchOrderList(index) {
|
||||||
if (index == 0) {
|
if (index == 0) {
|
||||||
this.getOrderList(index);
|
this.keywords ? (this.params.keywords = this.keywords) : "";
|
||||||
|
this.getOrderList();
|
||||||
} else {
|
} else {
|
||||||
this.logParams = {
|
this.logParams = {
|
||||||
pageNumber: 1,
|
pageNumber: 1,
|
||||||
@@ -177,28 +302,28 @@ export default {
|
|||||||
if (index === 1) {
|
if (index === 1) {
|
||||||
this.logParams.serviceStatus = "APPLY";
|
this.logParams.serviceStatus = "APPLY";
|
||||||
}
|
}
|
||||||
|
this.keywords ? (this.logParams.keywords = this.keywords) : "";
|
||||||
this.orderList = [];
|
this.orderList = [];
|
||||||
this.getAfterSaleLogList();
|
this.getAfterSaleLogList();
|
||||||
}
|
}
|
||||||
uni.stopPullDownRefresh();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取订单列表
|
* 获取订单列表
|
||||||
*/
|
*/
|
||||||
getOrderList(index) {
|
getOrderList() {
|
||||||
uni.showLoading({
|
uni.showLoading({
|
||||||
title: "加载中",
|
title: "加载中",
|
||||||
mask: true,
|
mask: true,
|
||||||
});
|
});
|
||||||
getOrderList(this.params).then((res) => {
|
getOrderList(this.params).then((res) => {
|
||||||
uni.hideLoading();
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
const orderlist = res.data.result.records;
|
const orderList = res.data.result.records;
|
||||||
if (orderlist.length > 0) {
|
if (orderList.length > 0) {
|
||||||
this.orderList = this.orderList.concat(orderlist);
|
this.orderList = this.orderList.concat(orderList);
|
||||||
this.params.pageNumber += 1;
|
this.params.pageNumber += 1;
|
||||||
}
|
}
|
||||||
if (orderlist.length < 10) {
|
if (orderList.length < 10) {
|
||||||
this.status = "nomore";
|
this.status = "nomore";
|
||||||
} else {
|
} else {
|
||||||
this.status = "loading";
|
this.status = "loading";
|
||||||
@@ -206,6 +331,31 @@ export default {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
close(order, sku) {
|
||||||
|
console.log(order, sku);
|
||||||
|
this.selectedOrder = order;
|
||||||
|
this.cancelShow = true;
|
||||||
|
},
|
||||||
|
|
||||||
|
async closeService() {
|
||||||
|
uni.showLoading({
|
||||||
|
title: "加载中",
|
||||||
|
});
|
||||||
|
console.log(this.selectedOrder);
|
||||||
|
let res = await cancelAfterSale(this.selectedOrder.sn);
|
||||||
|
if (res.data.success) {
|
||||||
|
uni.showToast({
|
||||||
|
title: "取消成功!",
|
||||||
|
duration: 2000,
|
||||||
|
icon: "none",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
this.orderList = [];
|
||||||
|
this.searchOrderList(this.current);
|
||||||
|
|
||||||
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 售后详情
|
* 售后详情
|
||||||
*/
|
*/
|
||||||
@@ -252,11 +402,9 @@ export default {
|
|||||||
...order,
|
...order,
|
||||||
...sku,
|
...sku,
|
||||||
};
|
};
|
||||||
|
storage.setAfterSaleData(data);
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
url: `/pages/order/afterSales/afterSalesSelect?sn=${sn}&sku=${encodeURIComponent(
|
url: `/pages/order/afterSales/afterSalesSelect?sn=${sn}`,
|
||||||
JSON.stringify(data)
|
|
||||||
)}`,
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -265,21 +413,33 @@ export default {
|
|||||||
*/
|
*/
|
||||||
onExpress(order, sku) {
|
onExpress(order, sku) {
|
||||||
sku.storeName = order.storeName;
|
sku.storeName = order.storeName;
|
||||||
|
let data = {
|
||||||
|
...order,
|
||||||
|
...sku,
|
||||||
|
};
|
||||||
|
|
||||||
|
storage.setAfterSaleData(data);
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
url: `./afterSalesDetailExpress?serviceSn=${
|
url: `./afterSalesDetailExpress?serviceSn=${order.sn}`,
|
||||||
order.sn
|
|
||||||
}&sku=${encodeURIComponent(JSON.stringify(sku))}`,
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查看详情
|
* 查看详情
|
||||||
*/
|
*/
|
||||||
onDetail(sku) {
|
onDetail(goods, sku) {
|
||||||
if (!this.$u.test.isEmpty(sku.skuId)) {
|
// 售后申请
|
||||||
|
if (this.current == 0) {
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
url: `/pages/product/goods?id=${sku.skuId}&goodsId=${sku.goodsId}`,
|
url: `/pages/product/goods?id=${sku.skuId}&goodsId=${
|
||||||
|
sku.goodsId || sku.goodsId
|
||||||
|
}`,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
uni.navigateTo({
|
||||||
|
url: `/pages/product/goods?id=${goods.skuId}&goodsId=${
|
||||||
|
goods.goodsId || goods.goodsId
|
||||||
|
}`,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -306,35 +466,43 @@ page,
|
|||||||
background: $page-color-base;
|
background: $page-color-base;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.body-view {
|
.body-view {
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
height: calc(100vh - 44px - 80rpx - 104rpx);
|
height: calc(100vh - 44px - 80rpx - 104rpx);
|
||||||
}
|
}
|
||||||
|
|
||||||
.u-tabs-search {
|
.u-tabs-search {
|
||||||
padding: 20rpx;
|
padding: 20rpx;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.countMoney {
|
.countMoney {
|
||||||
margin-left: 7rpx;
|
margin-left: 7rpx;
|
||||||
color: $main-color;
|
color: $main-color;
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.seller-view {
|
.seller-view {
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
margin: 20rpx 0rpx;
|
margin: 20rpx 0rpx;
|
||||||
padding: 0rpx 20rpx;
|
padding: 0rpx 20rpx;
|
||||||
border-radius: 20rpx;
|
border-radius: 20rpx;
|
||||||
|
|
||||||
.seller-info {
|
.seller-info {
|
||||||
height: 70rpx;
|
height: 70rpx;
|
||||||
|
|
||||||
.seller-name {
|
.seller-name {
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
|
|
||||||
.name {
|
.name {
|
||||||
margin-left: 15rpx;
|
margin-left: 15rpx;
|
||||||
margin-top: -2rpx;
|
margin-top: -2rpx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.order-sn {
|
.order-sn {
|
||||||
font-size: 22rpx;
|
font-size: 22rpx;
|
||||||
color: #909399;
|
color: #909399;
|
||||||
@@ -378,6 +546,7 @@ page,
|
|||||||
color: $main-color;
|
color: $main-color;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-view {
|
.btn-view {
|
||||||
padding: 16rpx 0;
|
padding: 16rpx 0;
|
||||||
|
|
||||||
@@ -387,10 +556,12 @@ page,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.description {
|
.description {
|
||||||
color: #909399;
|
color: #909399;
|
||||||
size: 25rpx;
|
size: 25rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cannot_apply {
|
.cannot_apply {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-size: 22rpx;
|
font-size: 22rpx;
|
||||||
@@ -399,31 +570,37 @@ page,
|
|||||||
height: 70rpx;
|
height: 70rpx;
|
||||||
line-height: 70rpx;
|
line-height: 70rpx;
|
||||||
}
|
}
|
||||||
|
.not_center {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
.icon {
|
.icon {
|
||||||
margin-right: 10rpx;
|
margin-right: 10rpx;
|
||||||
}
|
}
|
||||||
.cancel-btn {
|
|
||||||
color: #999999;
|
.sale {
|
||||||
border-color: #999999;
|
width: 100%;
|
||||||
margin-left: 15rpx;
|
display: flex;
|
||||||
height: 60rpx;
|
justify-content: flex-end;
|
||||||
}
|
}
|
||||||
.pay-btn {
|
|
||||||
background-color: #1abc9c;
|
.default-btn {
|
||||||
color: #ffffff;
|
|
||||||
margin-left: 15rpx;
|
|
||||||
height: 60rpx;
|
|
||||||
}
|
|
||||||
.rebuy-btn {
|
|
||||||
background-color: #ffffff;
|
background-color: #ffffff;
|
||||||
margin-left: 15rpx;
|
margin-left: 15rpx;
|
||||||
height: 60rpx;
|
height: 60rpx;
|
||||||
line-height: 60rpx;
|
line-height: 60rpx;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-size: 24rpx;
|
font-size: 24rpx;
|
||||||
border: 2rpx solid $light-color;
|
|
||||||
color: $light-color;
|
|
||||||
padding: 0 24rpx;
|
padding: 0 24rpx;
|
||||||
border-radius: 200px;
|
border-radius: 200px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.close {
|
||||||
|
color: $light-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.border {
|
||||||
|
border: 2rpx solid $light-color;
|
||||||
|
color: $light-color;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -10,7 +10,8 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view>
|
<view>
|
||||||
<view class="goods-item-view" v-for="(item,index) in sku.orderItems" v-if="item.sn == sn" @click="gotoGoodsDetail(sku.goods_id)">
|
<view class="goods-item-view" v-for="(item,index) in sku.orderItems" v-if="item.sn == sn"
|
||||||
|
@click="gotoGoodsDetail(sku.goods_id)">
|
||||||
<view class="goods-img">
|
<view class="goods-img">
|
||||||
<u-image border-radius="6" width="131rpx" height="131rpx" :src="item.image"></u-image>
|
<u-image border-radius="6" width="131rpx" height="131rpx" :src="item.image"></u-image>
|
||||||
</view>
|
</view>
|
||||||
@@ -27,7 +28,8 @@
|
|||||||
<view class="after-num">
|
<view class="after-num">
|
||||||
<view>申请数量</view>
|
<view>申请数量</view>
|
||||||
<view>
|
<view>
|
||||||
<u-number-box :value="parseInt(form.num)" disabled-input :min="1" :max="parseInt(sku.num)" bg-color="#fff" @change="valChange"></u-number-box>
|
<u-number-box :value="parseInt(form.num)" disabled-input :min="1" :max="parseInt(sku.num)" bg-color="#fff"
|
||||||
|
@change="valChange"></u-number-box>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -35,8 +37,8 @@
|
|||||||
<view class="body-view">
|
<view class="body-view">
|
||||||
<!-- 退款原因 -->
|
<!-- 退款原因 -->
|
||||||
<view class="opt-view">
|
<view class="opt-view">
|
||||||
<u-form-item label="申请原因" :label-width="150">
|
<u-form-item label="申请原因" :label-width="150" >
|
||||||
<u-input v-model="form.reason" type="select" input-align="right" :select-open="reasonSelectShow" @click="reasonSelectShow = true" placeholder="请选择申请原因" />
|
<div style="width: 100%; text-align: right;" @click="reasonSelectShow = true">{{ form.reason || '请选择申请原因' }}</div>
|
||||||
</u-form-item>
|
</u-form-item>
|
||||||
<u-form-item label="申请说明" :label-width="150">
|
<u-form-item label="申请说明" :label-width="150">
|
||||||
<u-input input-align="right" type="textarea" v-model="form.problemDesc" placeholder="请描述申请售后的说明" />
|
<u-input input-align="right" type="textarea" v-model="form.problemDesc" placeholder="请描述申请售后的说明" />
|
||||||
@@ -47,7 +49,8 @@
|
|||||||
<view class="opt-view">
|
<view class="opt-view">
|
||||||
<view class="img-title">上传凭证(最多5张)</view>
|
<view class="img-title">上传凭证(最多5张)</view>
|
||||||
<view class="images-view">
|
<view class="images-view">
|
||||||
<u-upload :header=" { accessToken: storage.getAccessToken() }" :action="action" width="150" @on-uploaded="onUploaded" :max-count="5" :show-progress="false"></u-upload>
|
<u-upload :header=" { accessToken: storage.getAccessToken() }" :action="action" width="150"
|
||||||
|
@on-uploaded="onUploaded" :max-count="5" :show-progress="false"></u-upload>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
@@ -81,11 +84,14 @@
|
|||||||
</u-form>
|
</u-form>
|
||||||
|
|
||||||
<view class="submit-view">
|
<view class="submit-view">
|
||||||
<u-button type="primary" ripple shape="circle" v-if="applyInfo.refundWay" :custom-style="customStyle" @click="onSubmit">提交申请</u-button>
|
<u-button type="primary" ripple shape="circle" v-if="applyInfo.refundWay" :custom-style="customStyle"
|
||||||
|
@click="onSubmit">提交申请</u-button>
|
||||||
</view>
|
</view>
|
||||||
<u-select mode="single-column" :list="reasonList" v-model="reasonSelectShow" @confirm="reasonSelectConfirm"></u-select>
|
<u-select mode="single-column" :list="reasonList" v-model="reasonSelectShow" @confirm="reasonSelectConfirm">
|
||||||
|
</u-select>
|
||||||
<u-select mode="single-column" :list="typeList" v-model="typeSelectShow" @confirm="typeSelectConfirm"></u-select>
|
<u-select mode="single-column" :list="typeList" v-model="typeSelectShow" @confirm="typeSelectConfirm"></u-select>
|
||||||
<u-select mode="single-column" :list="returnList" v-model="returnSelectShow" @confirm="returnSelectConfirm"></u-select>
|
<u-select mode="single-column" :list="returnList" v-model="returnSelectShow" @confirm="returnSelectConfirm">
|
||||||
|
</u-select>
|
||||||
<u-toast ref="uToast" />
|
<u-toast ref="uToast" />
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
@@ -188,9 +194,7 @@ export default {
|
|||||||
title: navTitle, //此处写页面的title
|
title: navTitle, //此处写页面的title
|
||||||
});
|
});
|
||||||
this.sn = options.sn;
|
this.sn = options.sn;
|
||||||
let dsku = decodeURIComponent(options.sku);
|
this.sku = storage.getAfterSaleData();;
|
||||||
let newSku = JSON.parse(dsku);
|
|
||||||
this.sku = newSku;
|
|
||||||
|
|
||||||
this.form.orderItemSn = options.sn;
|
this.form.orderItemSn = options.sn;
|
||||||
this.form.skuId = this.sku.skuId;
|
this.form.skuId = this.sku.skuId;
|
||||||
@@ -219,7 +223,7 @@ export default {
|
|||||||
this.reasonList = action;
|
this.reasonList = action;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
uni.hideLoading();
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
},
|
},
|
||||||
//打开地区选择器
|
//打开地区选择器
|
||||||
showCitySelect() {
|
showCitySelect() {
|
||||||
@@ -283,7 +287,7 @@ export default {
|
|||||||
this.form.applyRefundPrice = this.applyInfo.applyRefundPrice;
|
this.form.applyRefundPrice = this.applyInfo.applyRefundPrice;
|
||||||
|
|
||||||
applyReturn(this.sn, this.form).then((resp) => {
|
applyReturn(this.sn, this.form).then((resp) => {
|
||||||
uni.hideLoading();
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
if (resp.data.success) {
|
if (resp.data.success) {
|
||||||
this.$refs.uToast.show({ title: "提交成功", type: "success" });
|
this.$refs.uToast.show({ title: "提交成功", type: "success" });
|
||||||
uni.redirectTo({
|
uni.redirectTo({
|
||||||
@@ -305,6 +309,7 @@ export default {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log(this.form.accountType)
|
||||||
if (this.form.accountType == "BANK_TRANSFER") {
|
if (this.form.accountType == "BANK_TRANSFER") {
|
||||||
// 银行开户行校验
|
// 银行开户行校验
|
||||||
if (this.$u.test.isEmpty(this.form.bankDepositName)) {
|
if (this.$u.test.isEmpty(this.form.bankDepositName)) {
|
||||||
@@ -329,12 +334,6 @@ export default {
|
|||||||
type: "error",
|
type: "error",
|
||||||
});
|
});
|
||||||
return false;
|
return false;
|
||||||
} else if (checkBankno(this.form.bankAccountNumber) === false) {
|
|
||||||
this.$refs.uToast.show({
|
|
||||||
title: "银行卡卡号不正确",
|
|
||||||
type: "error",
|
|
||||||
});
|
|
||||||
return false;
|
|
||||||
} else if (this.$u.test.chinese(this.form.bankAccountName) === false) {
|
} else if (this.$u.test.chinese(this.form.bankAccountName) === false) {
|
||||||
this.$refs.uToast.show({
|
this.$refs.uToast.show({
|
||||||
title: "银行开户名输入错误",
|
title: "银行开户名输入错误",
|
||||||
@@ -462,7 +461,6 @@ page,
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
.images-view {
|
.images-view {
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -484,12 +482,11 @@ page,
|
|||||||
background-color: #ffffff;
|
background-color: #ffffff;
|
||||||
height: 100rpx;
|
height: 100rpx;
|
||||||
width: 750rpx;
|
width: 750rpx;
|
||||||
|
justify-content: flex-end;
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
/deep/ .u-btn{
|
padding-right: 32rpx;
|
||||||
width: 94% !important;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view>
|
<view>
|
||||||
<view class="goods-item-view" @click="gotoGoodsDetail(sku.skuId)">
|
<view class="goods-item-view" @click="gotoGoodsDetail(sku)">
|
||||||
<view class="goods-img">
|
<view class="goods-img">
|
||||||
<u-image border-radius="6" width="131rpx" height="131rpx" :src="sku.image"></u-image>
|
<u-image border-radius="6" width="131rpx" height="131rpx" :src="sku.image"></u-image>
|
||||||
</view>
|
</view>
|
||||||
@@ -30,33 +30,42 @@
|
|||||||
<view class="opt-view">
|
<view class="opt-view">
|
||||||
<view class="img-title" style="font-size: 30rpx">填写物流信息</view>
|
<view class="img-title" style="font-size: 30rpx">填写物流信息</view>
|
||||||
<u-form-item label="返回方式" :label-width="150">
|
<u-form-item label="返回方式" :label-width="150">
|
||||||
<u-input type="text" input-align="right" value="快递至第三方卖家" />
|
<div style="width: 100%; text-align: right;">快递至第三方卖家</div>
|
||||||
</u-form-item>
|
</u-form-item>
|
||||||
<u-form-item label="快递公司" :label-width="150">
|
<u-form-item label="快递公司" :label-width="150">
|
||||||
<u-input v-model="form.courierCompany" type="select" input-align="right" :select-open="companySelectShow" @click="companySelectShow = true" placeholder="请选择快递公司" />
|
<div style="width: 100%; text-align: right;" @click="companySelectShow = true">
|
||||||
|
{{ form.courierCompany || '请选择快递公司' }}
|
||||||
|
</div>
|
||||||
</u-form-item>
|
</u-form-item>
|
||||||
<u-form-item label="快递单号" :label-width="150">
|
<u-form-item label="快递单号" :label-width="150">
|
||||||
<u-input input-align="right" v-model="form.logisticsNo" placeholder="请输入快递单号" />
|
<u-input input-align="right" v-model="form.logisticsNo" placeholder="请输入快递单号"/>
|
||||||
</u-form-item>
|
</u-form-item>
|
||||||
<u-form-item label="发货时间" :label-width="150">
|
<u-form-item label="发货时间" :label-width="150">
|
||||||
<u-input input-align="right" type="selects" disabled v-model="form.mDeliverTime" @click="timeshow = true" placeholder="请选择发货时间" />
|
<div style="width: 100%; text-align: right;" @click="timeshow = true">{{
|
||||||
|
form.mDeliverTime || '请选择发货时间'
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
</u-form-item>
|
</u-form-item>
|
||||||
</view>
|
</view>
|
||||||
</scroll-view>
|
</scroll-view>
|
||||||
|
|
||||||
<view class="submit-view">
|
<view class="submit-view">
|
||||||
<u-button ripple :customStyle="{'background':$lightColor,'color':'#fff' }" shape="circle" @click="onSubmit">提交申请</u-button>
|
<u-button ripple :customStyle="{'background':$lightColor,'color':'#fff' }" shape="circle" @click="onSubmit">
|
||||||
|
提交申请
|
||||||
|
</u-button>
|
||||||
</view>
|
</view>
|
||||||
</u-form>
|
</u-form>
|
||||||
<u-select mode="single-column" :list="companyList" v-model="companySelectShow" @confirm="companySelectConfirm"></u-select>
|
<u-select mode="single-column" :list="companyList" v-model="companySelectShow"
|
||||||
|
@confirm="companySelectConfirm"></u-select>
|
||||||
<u-calendar v-model="timeshow" :mode="'date'" @change="onTimeChange"></u-calendar>
|
<u-calendar v-model="timeshow" :mode="'date'" @change="onTimeChange"></u-calendar>
|
||||||
<u-toast ref="uToast" />
|
<u-toast ref="uToast"/>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { getLogistics } from "@/api/address.js";
|
import {getLogistics} from "@/api/address.js";
|
||||||
import { fillShipInfo } from "@/api/after-sale.js";
|
import {fillShipInfo} from "@/api/after-sale.js";
|
||||||
|
import storage from "@/utils/storage";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
data() {
|
data() {
|
||||||
@@ -76,7 +85,8 @@ export default {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
onLoad(options) {
|
onLoad(options) {
|
||||||
this.sku = JSON.parse(decodeURIComponent(options.sku));
|
|
||||||
|
this.sku = storage.getAfterSaleData();
|
||||||
let navTitle = "服务单详情";
|
let navTitle = "服务单详情";
|
||||||
uni.setNavigationBarTitle({
|
uni.setNavigationBarTitle({
|
||||||
title: navTitle, //此处写页面的title
|
title: navTitle, //此处写页面的title
|
||||||
@@ -120,13 +130,39 @@ export default {
|
|||||||
* 点击提交
|
* 点击提交
|
||||||
*/
|
*/
|
||||||
onSubmit() {
|
onSubmit() {
|
||||||
|
delete this.form.courierCompany;
|
||||||
|
|
||||||
|
if (this.form.logisticsId == "") {
|
||||||
|
this.$refs.uToast.show({
|
||||||
|
title: "请选择快递公司",
|
||||||
|
type: "error",
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this.form.logisticsNo == "") {
|
||||||
|
this.$refs.uToast.show({
|
||||||
|
title: "请填写快递单号",
|
||||||
|
type: "error",
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this.form.mDeliverTime == "") {
|
||||||
|
this.$refs.uToast.show({
|
||||||
|
title: "请选择发货时间",
|
||||||
|
type: "error",
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
uni.showLoading({
|
uni.showLoading({
|
||||||
title: "加载中",
|
title: "加载中",
|
||||||
mask: true,
|
mask: true,
|
||||||
});
|
});
|
||||||
delete this.form.courierCompany;
|
|
||||||
fillShipInfo(this.serviceDetail.sn, this.form).then((res) => {
|
fillShipInfo(this.serviceDetail.sn, this.form).then((res) => {
|
||||||
uni.hideLoading();
|
if (this.$store.state.isShowToast) {
|
||||||
|
uni.hideLoading()
|
||||||
|
}
|
||||||
|
;
|
||||||
if (res.statusCode === 200) {
|
if (res.statusCode === 200) {
|
||||||
this.$refs.uToast.show({
|
this.$refs.uToast.show({
|
||||||
title: "提交成功",
|
title: "提交成功",
|
||||||
@@ -137,6 +173,11 @@ export default {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
gotoGoodsDetail(sku) {
|
||||||
|
uni.navigateTo({
|
||||||
|
url: `/pages/product/goods?id=${sku.skuId}&goodsId=${sku.goodsId}`,
|
||||||
|
});
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
@@ -147,12 +188,15 @@ page,
|
|||||||
background: $page-color-base;
|
background: $page-color-base;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mp-iphonex-bottom {
|
.mp-iphonex-bottom {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.after-sales-goods-detail-view {
|
.after-sales-goods-detail-view {
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
padding: 10rpx 0rpx;
|
padding: 10rpx 0rpx;
|
||||||
|
|
||||||
.header {
|
.header {
|
||||||
background-color: #f7f7f7;
|
background-color: #f7f7f7;
|
||||||
color: #999999;
|
color: #999999;
|
||||||
@@ -162,15 +206,18 @@ page,
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
line-height: 70rpx;
|
line-height: 70rpx;
|
||||||
|
|
||||||
.header-text {
|
.header-text {
|
||||||
background-color: #999999;
|
background-color: #999999;
|
||||||
padding: 10rpx 30rpx;
|
padding: 10rpx 30rpx;
|
||||||
border-radius: 50rpx;
|
border-radius: 50rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.seller-name {
|
.seller-name {
|
||||||
color: $main-color;
|
color: $main-color;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.goods-item-view {
|
.goods-item-view {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
@@ -180,15 +227,18 @@ page,
|
|||||||
.goods-info {
|
.goods-info {
|
||||||
padding-left: 30rpx;
|
padding-left: 30rpx;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
|
||||||
.goods-title {
|
.goods-title {
|
||||||
margin-bottom: 10rpx;
|
margin-bottom: 10rpx;
|
||||||
color: $font-color-dark;
|
color: $font-color-dark;
|
||||||
}
|
}
|
||||||
|
|
||||||
.goods-specs {
|
.goods-specs {
|
||||||
font-size: 24rpx;
|
font-size: 24rpx;
|
||||||
margin-bottom: 10rpx;
|
margin-bottom: 10rpx;
|
||||||
color: #cccccc;
|
color: #cccccc;
|
||||||
}
|
}
|
||||||
|
|
||||||
.goods-price {
|
.goods-price {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
@@ -196,23 +246,27 @@ page,
|
|||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
margin-bottom: 10rpx;
|
margin-bottom: 10rpx;
|
||||||
color: $light-color;
|
color: $light-color;
|
||||||
|
|
||||||
.num {
|
.num {
|
||||||
font-size: 24rpx;
|
font-size: 24rpx;
|
||||||
color: #999999;
|
color: #999999;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.goods-num {
|
.goods-num {
|
||||||
width: 60rpx;
|
width: 60rpx;
|
||||||
color: $main-color;
|
color: $main-color;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.opt-view {
|
.opt-view {
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
padding: 40rpx 30rpx 0rpx 30rpx;
|
padding: 40rpx 30rpx 0rpx 30rpx;
|
||||||
|
|
||||||
font-size: 26rpx;
|
font-size: 26rpx;
|
||||||
|
|
||||||
.how-view {
|
.how-view {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
@@ -221,18 +275,21 @@ page,
|
|||||||
height: 80rpx;
|
height: 80rpx;
|
||||||
border-bottom: 1px solid $page-color-base;
|
border-bottom: 1px solid $page-color-base;
|
||||||
}
|
}
|
||||||
|
|
||||||
.explain-view {
|
.explain-view {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
height: 150rpx;
|
height: 150rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.img-title {
|
.img-title {
|
||||||
height: 80rpx;
|
height: 80rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.images-view {
|
.images-view {
|
||||||
padding: 20rpx;
|
padding: 20rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -241,6 +298,7 @@ page,
|
|||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.submit-view {
|
.submit-view {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
z-index: 999;
|
z-index: 999;
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
<view class="select-title">退货</view>
|
<view class="select-title">退货</view>
|
||||||
<view class="select-sub-title">
|
<view class="select-sub-title">
|
||||||
退回收到的商品
|
退回收到的商品
|
||||||
<uni-icons color="#BABABA" type="arrowright"></uni-icons>
|
<u-icon name="arrow-right" color="#bababa"></u-icon>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -46,7 +46,7 @@
|
|||||||
<view class="select-title">退款</view>
|
<view class="select-title">退款</view>
|
||||||
<view class="select-sub-title">
|
<view class="select-sub-title">
|
||||||
退款商品返还金额
|
退款商品返还金额
|
||||||
<uni-icons color="#BABABA" type="arrowright"></uni-icons>
|
<u-icon name="arrow-right" color="#bababa"></u-icon>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -55,13 +55,9 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import UniIcons from "@/components/uni-icons/uni-icons.vue";
|
|
||||||
|
|
||||||
import { getAfterSaleInfo } from "@/api/after-sale";
|
import { getAfterSaleInfo } from "@/api/after-sale";
|
||||||
|
import storage from "@/utils/storage";
|
||||||
export default {
|
export default {
|
||||||
components: {
|
|
||||||
UniIcons,
|
|
||||||
},
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
sn: "",
|
sn: "",
|
||||||
@@ -71,10 +67,7 @@ export default {
|
|||||||
},
|
},
|
||||||
onLoad(options) {
|
onLoad(options) {
|
||||||
this.sn = options.sn;
|
this.sn = options.sn;
|
||||||
let dData = decodeURIComponent(options.sku);
|
this.sku = storage.getAfterSaleData();
|
||||||
let newData = JSON.parse(dData);
|
|
||||||
this.sku = newData;
|
|
||||||
|
|
||||||
// 查看当前商品是否支持退款退货
|
// 查看当前商品是否支持退款退货
|
||||||
this.init()
|
this.init()
|
||||||
},
|
},
|
||||||
@@ -93,9 +86,7 @@ export default {
|
|||||||
*/
|
*/
|
||||||
onSelect(value) {
|
onSelect(value) {
|
||||||
uni.redirectTo({
|
uni.redirectTo({
|
||||||
url: `./afterSalesDetail?sn=${this.sn}&sku=${encodeURIComponent(
|
url: `./afterSalesDetail?sn=${this.sn}&value=${value}`,
|
||||||
JSON.stringify(this.sku)
|
|
||||||
)}&value=${value}`,
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
logs[0].message
|
logs[0].message
|
||||||
}}</view>
|
}}</view>
|
||||||
</view>
|
</view>
|
||||||
<uni-icons type="arrowright" style="margin-right: 5px"></uni-icons>
|
<u-icon name="arrow-right" style="margin-right: 5px" size="30" color="#999"></u-icon>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="goods-info">
|
<view class="goods-info">
|
||||||
@@ -90,11 +90,14 @@
|
|||||||
serviceDetail.afterSaleImage &&
|
serviceDetail.afterSaleImage &&
|
||||||
serviceDetail.afterSaleImage.split(',').length != 0
|
serviceDetail.afterSaleImage.split(',').length != 0
|
||||||
">
|
">
|
||||||
<image :src="img" @click="preview(serviceDetail.afterSaleImage.split(','), index)" v-for="(img, index) in serviceDetail.afterSaleImage.split(',')" :key="index"
|
<view v-for="(img, index) in serviceDetail.afterSaleImage.split(',')" :key="index">
|
||||||
style="width: 50px; height: 50px; margin: 0px 5px"></image>
|
<u-image width="100" height="100" :src="img" @click="preview(serviceDetail.afterSaleImage.split(','), index)"
|
||||||
|
></u-image>
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<!-- 如果服务类型为退款则不显示 -->
|
<!-- 如果服务类型为退款则不显示 -->
|
||||||
<view class="detail-item" v-if="serviceDetail.serviceType != 'RETURN_MONEY' && serviceDetail.serviceStatus != 'APPLY'">
|
<view class="detail-item"
|
||||||
|
v-if="serviceDetail.serviceType != 'RETURN_MONEY' && serviceDetail.serviceStatus != 'APPLY'">
|
||||||
<view class="title">收货地址:</view>
|
<view class="title">收货地址:</view>
|
||||||
<view class="value">
|
<view class="value">
|
||||||
<span v-if="storeAfterSaleAddress.salesConsigneeAddressPath">{{
|
<span v-if="storeAfterSaleAddress.salesConsigneeAddressPath">{{
|
||||||
@@ -103,12 +106,14 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<!-- 如果服务类型为退款则不显示 -->
|
<!-- 如果服务类型为退款则不显示 -->
|
||||||
<view class="detail-item" v-if="serviceDetail.serviceType != 'RETURN_MONEY' && serviceDetail.serviceStatus != 'APPLY'">
|
<view class="detail-item"
|
||||||
|
v-if="serviceDetail.serviceType != 'RETURN_MONEY' && serviceDetail.serviceStatus != 'APPLY'">
|
||||||
<view class="title">联系人:</view>
|
<view class="title">联系人:</view>
|
||||||
<view class="value">{{ storeAfterSaleAddress.salesConsigneeName }}</view>
|
<view class="value">{{ storeAfterSaleAddress.salesConsigneeName }}</view>
|
||||||
</view>
|
</view>
|
||||||
<!-- 如果服务类型为退款则不显示 -->
|
<!-- 如果服务类型为退款则不显示 -->
|
||||||
<view class="detail-item" v-if="serviceDetail.serviceType != 'RETURN_MONEY' && serviceDetail.serviceStatus != 'APPLY'">
|
<view class="detail-item"
|
||||||
|
v-if="serviceDetail.serviceType != 'RETURN_MONEY' && serviceDetail.serviceStatus != 'APPLY'">
|
||||||
<view class="title">联系方式:</view>
|
<view class="title">联系方式:</view>
|
||||||
<view class="value">{{
|
<view class="value">{{
|
||||||
storeAfterSaleAddress.salesConsigneeMobile || "" | secrecyMobile
|
storeAfterSaleAddress.salesConsigneeMobile || "" | secrecyMobile
|
||||||
@@ -193,16 +198,11 @@
|
|||||||
<script>
|
<script>
|
||||||
import {
|
import {
|
||||||
getServiceDetail,
|
getServiceDetail,
|
||||||
getstoreAfterSaleAddress,
|
getStoreAfterSaleAddress,
|
||||||
getAfterSaleLog,
|
getAfterSaleLog,
|
||||||
getAfterSaleReason,
|
getAfterSaleReason,
|
||||||
} from "@/api/after-sale.js";
|
} from "@/api/after-sale.js";
|
||||||
import UniIcons from "@/components/uni-icons/uni-icons.vue";
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
|
||||||
UniIcons,
|
|
||||||
},
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
reason: "", //申请原因
|
reason: "", //申请原因
|
||||||
@@ -316,7 +316,7 @@ export default {
|
|||||||
* 获取地址信息
|
* 获取地址信息
|
||||||
*/
|
*/
|
||||||
getAddress() {
|
getAddress() {
|
||||||
getstoreAfterSaleAddress(this.sn).then((res) => {
|
getStoreAfterSaleAddress(this.sn).then((res) => {
|
||||||
if (res.data.success) {
|
if (res.data.success) {
|
||||||
this.storeAfterSaleAddress = res.data.result;
|
this.storeAfterSaleAddress = res.data.result;
|
||||||
}
|
}
|
||||||
@@ -339,9 +339,7 @@ export default {
|
|||||||
getAfterSaleReason(serviceType).then((res) => {
|
getAfterSaleReason(serviceType).then((res) => {
|
||||||
if (res.data.success) {
|
if (res.data.success) {
|
||||||
// 1357583466371219456
|
// 1357583466371219456
|
||||||
this.reason = res.data.result.filter((item) => {
|
this.reason = this.serviceDetail.reason;
|
||||||
return item.id == this.serviceDetail.reason;
|
|
||||||
})[0].reason;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@@ -354,7 +352,7 @@ export default {
|
|||||||
title: "加载中",
|
title: "加载中",
|
||||||
});
|
});
|
||||||
getServiceDetail(this.sn).then((res) => {
|
getServiceDetail(this.sn).then((res) => {
|
||||||
uni.hideLoading();
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
this.serviceDetail = res.data.result;
|
this.serviceDetail = res.data.result;
|
||||||
if (
|
if (
|
||||||
this.serviceDetail.serviceType == "RETURN_GOODS" ||
|
this.serviceDetail.serviceType == "RETURN_GOODS" ||
|
||||||
@@ -367,12 +365,13 @@ export default {
|
|||||||
(this.serviceDetail.serviceType === "RETURN_GOODS" ||
|
(this.serviceDetail.serviceType === "RETURN_GOODS" ||
|
||||||
this.serviceDetail.serviceType === "ORDER_CANCEL") &&
|
this.serviceDetail.serviceType === "ORDER_CANCEL") &&
|
||||||
this.serviceDetail.refundWay === "OFFLINE";
|
this.serviceDetail.refundWay === "OFFLINE";
|
||||||
|
|
||||||
this.bankShow =
|
this.bankShow =
|
||||||
this.serviceDetail.serviceType === "RETURN_MONEY" ||
|
this.serviceDetail.accountType === "BANK_TRANSFER" &&
|
||||||
((this.serviceDetail.serviceType === "RETURN_GOODS" ||
|
|
||||||
this.serviceDetail.serviceType === "ORDER_CANCEL") &&
|
|
||||||
this.serviceDetail.refundWay === "OFFLINE" &&
|
this.serviceDetail.refundWay === "OFFLINE" &&
|
||||||
this.serviceDetail.accountType === "BANK_TRANSFER");
|
((this.serviceDetail.serviceType === "RETURN_GOODS") |
|
||||||
|
(this.serviceDetail.serviceType === "ORDER_CANCEL") ||
|
||||||
|
this.serviceDetail.serviceType === "RETURN_MONEY");
|
||||||
|
|
||||||
this.getReasonList(this.serviceDetail.serviceType);
|
this.getReasonList(this.serviceDetail.serviceType);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -45,13 +45,13 @@
|
|||||||
<view class="cell-item">
|
<view class="cell-item">
|
||||||
<view class="cell-title"> 投诉凭证 </view>
|
<view class="cell-title"> 投诉凭证 </view>
|
||||||
<view class="cell-view">
|
<view class="cell-view">
|
||||||
<u-upload ref="uUpload" :header=" { accessToken: storage.getAccessToken() }" upload-text="" :show-progress="false" :action="action" width="100" @on-uploaded="onUploaded" :max-count="5">
|
<u-upload ref="uUpload" :header=" { accessToken: storage.getAccessToken() }" :action="action" width="200" @on-uploaded="onUploaded" :max-count="5">
|
||||||
</u-upload>
|
</u-upload>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<view class="submit-btn" @click="handleSumit">提交</view>
|
<view class="submit-btn" @click="handleSubmit">提交</view>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -68,6 +68,7 @@ export default {
|
|||||||
orderStatusList: {
|
orderStatusList: {
|
||||||
//订单状态列表
|
//订单状态列表
|
||||||
UNDELIVERED: "待发货",
|
UNDELIVERED: "待发货",
|
||||||
|
PARTS_DELIVERED: "部分发货",
|
||||||
UNPAID: "未付款",
|
UNPAID: "未付款",
|
||||||
PAID: "已付款",
|
PAID: "已付款",
|
||||||
DELIVERED: "已发货",
|
DELIVERED: "已发货",
|
||||||
@@ -109,7 +110,15 @@ export default {
|
|||||||
/**
|
/**
|
||||||
* 提交
|
* 提交
|
||||||
*/
|
*/
|
||||||
handleSumit() {
|
handleSubmit() {
|
||||||
|
if(!this.images.length && !this.complainValue){
|
||||||
|
uni.showToast({
|
||||||
|
title:'请上传图片凭证和投诉内容',
|
||||||
|
icon:'none'
|
||||||
|
})
|
||||||
|
return
|
||||||
|
|
||||||
|
}
|
||||||
// 循环出商品
|
// 循环出商品
|
||||||
let goods = this.orderGoodsList.filter((item) => {
|
let goods = this.orderGoodsList.filter((item) => {
|
||||||
return item.skuId == this.skuId;
|
return item.skuId == this.skuId;
|
||||||
@@ -170,7 +179,7 @@ export default {
|
|||||||
this.order = order.order;
|
this.order = order.order;
|
||||||
this.orderGoodsList = order.orderItems;
|
this.orderGoodsList = order.orderItems;
|
||||||
this.orderDetail = res.data.result;
|
this.orderDetail = res.data.result;
|
||||||
uni.hideLoading();
|
if (this.$store.state.isShowToast){ uni.hideLoading() };
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -208,7 +217,7 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/deep/ .u-input__textarea {
|
::v-deep .u-input__textarea {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
.cell-title {
|
.cell-title {
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user