From 150e56fce339080df81f281d03b9cf9653d26e33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=90=BD=E6=97=A5=E6=99=9A=E9=A3=8E?= <1811466536@qq.com> Date: Mon, 30 Oct 2023 18:20:12 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- env | 20 ---- pages/goods/index.vue | 10 +- sheep/api/goods.js | 5 +- sheep/config/index.js | 2 +- sheep/request2/index.js | 217 ++++++++++++++++++++++++++++++++++++++++ sheep/router/index.js | 8 +- 6 files changed, 233 insertions(+), 29 deletions(-) delete mode 100644 env create mode 100644 sheep/request2/index.js diff --git a/env b/env deleted file mode 100644 index da303d9b..00000000 --- a/env +++ /dev/null @@ -1,20 +0,0 @@ -# 版本号 -SHOPRO_VERSION = v1.8.3 - -# 正式环境接口域名 -SHOPRO_BASE_URL = https://api.shopro.sheepjs.com - -# 开发环境接口域名 -SHOPRO_DEV_BASE_URL = https://api.shopro.sheepjs.com - -# 开发环境运行端口 -SHOPRO_DEV_PORT = 3000 - -# 接口地址前缀 -SHOPRO_API_PATH = /shop/api/ - -# 客户端静态资源地址 空=默认使用服务端指定的CDN资源地址前缀 | local=本地 | http(s)://xxx.xxx=自定义静态资源地址前缀 -SHOPRO_STATIC_URL = https://file.sheepjs.com - -# 是否开启直播 1 开启直播 | 0 关闭直播 (小程序官方后台未审核开通直播权限时请勿开启) -SHOPRO_MPLIVE_ON = 0 \ No newline at end of file diff --git a/pages/goods/index.vue b/pages/goods/index.vue index 5f20fe13..c53262c2 100644 --- a/pages/goods/index.vue +++ b/pages/goods/index.vue @@ -242,6 +242,7 @@ }); onLoad(async (options) => { + console.log('页面被访问') // 非法参数 if (!options.id) { state.goodsInfo = null; @@ -250,10 +251,15 @@ state.goodsId = options.id; // 加载商品信息 sheep.$api.goods.detail(state.goodsId).then((res) => { + console.log(res) state.skeletonLoading = false; - if (res.error === 0) { + if (res.code === 0) { + // 在此处对数据做出转换 + res.data.sales=res.data.salesCount + res.data.original_price=res.data.price + res.data.introduction=res.data.title state.goodsInfo = res.data; - state.goodsSwiper = formatGoodsSwiper(state.goodsInfo.images); + state.goodsSwiper = formatGoodsSwiper(state.goodsInfo.picUrl.split(',')); } else { // 未找到商品 state.goodsInfo = null; diff --git a/sheep/api/goods.js b/sheep/api/goods.js index 72b0a804..824c1b38 100644 --- a/sheep/api/goods.js +++ b/sheep/api/goods.js @@ -1,10 +1,11 @@ import request from '@/sheep/request'; +import request2 from '@/sheep/request2'; export default { // 商品详情 detail: (id, params = {}) => - request({ - url: 'goods/goods/' + id, + request2({ + url: 'product/spu/get-detail?id=' + id, method: 'GET', params, custom: { diff --git a/sheep/config/index.js b/sheep/config/index.js index dfd5bbb7..2d6a8703 100644 --- a/sheep/config/index.js +++ b/sheep/config/index.js @@ -7,7 +7,7 @@ if (process.env.NODE_ENV === 'development') { baseUrl = import.meta.env.SHOPRO_BASE_URL; } version = import.meta.env.SHOPRO_VERSION; -console.log(`[Shopro ${version}] https://www.sheepjs.com/`); +console.log(`[Shopro ${version}] http://api-dashboard.yudao.iocoder.cn/`); export const apiPath = import.meta.env.SHOPRO_API_PATH; export const staticUrl = import.meta.env.SHOPRO_STATIC_URL; diff --git a/sheep/request2/index.js b/sheep/request2/index.js new file mode 100644 index 00000000..0ed91e48 --- /dev/null +++ b/sheep/request2/index.js @@ -0,0 +1,217 @@ +/** + * Shopro-request + * @description api模块管理,loading配置,请求拦截,错误处理 + */ + +import Request from 'luch-request'; +import { baseUrl, apiPath } from '@/sheep/config'; +import $store from '@/sheep/store'; +import $platform from '@/sheep/platform'; +import { showAuthModal } from '@/sheep/hooks/useModal'; + +const options = { + // 显示操作成功消息 默认不显示 + showSuccess: false, + // 成功提醒 默认使用后端返回值 + successMsg: '', + // 显示失败消息 默认显示 + showError: true, + // 失败提醒 默认使用后端返回信息 + errorMsg: '', + // 显示请求时loading模态框 默认显示 + showLoading: true, + // loading提醒文字 + loadingMsg: '加载中', + // 需要授权才能请求 默认放开 + auth: false, + // ... +}; + +// Loading全局实例 +let LoadingInstance = { + target: null, + count: 0, +}; + +/** + * 关闭loading + */ +function closeLoading() { + if (LoadingInstance.count > 0) LoadingInstance.count--; + if (LoadingInstance.count === 0) uni.hideLoading(); +} + +/** + * @description 请求基础配置 可直接使用访问自定义请求 + */ +const http = new Request({ + baseURL: 'https://api.shopro.sheepjs.com/', + timeout: 8000, + method: 'GET', + header: { + Accept: 'text/json', + 'Content-Type': 'application/json;charset=UTF-8', + platform: $platform.name, + }, + // #ifdef APP-PLUS + sslVerify: false, + // #endif + // #ifdef H5 + // 跨域请求时是否携带凭证(cookies)仅H5支持(HBuilderX 2.6.15+) + withCredentials: false, + // #endif + custom: options, +}); + +/** + * @description 请求拦截器 + */ +http.interceptors.request.use( + (config) => { + console.log(config); + if (config.custom.auth && !$store('user').isLogin) { + showAuthModal(); + return Promise.reject(); + } + if (config.custom.showLoading) { + LoadingInstance.count++; + LoadingInstance.count === 1 && + uni.showLoading({ + title: config.custom.loadingMsg, + mask: true, + fail: () => { + uni.hideLoading(); + }, + }); + } + const token = uni.getStorageSync('token'); + if (token) config.header['Authorization'] = token; + // TODO 芋艿:特殊处理 + if (config.url.indexOf('/app-api/') !== -1) { + config.header['Accept'] = '*/*' + config.header['tenant-id'] = '1'; + config.header['Authorization'] = 'Bearer test247'; + } + return config; + }, + (error) => { + return Promise.reject(error); + }, +); + +/** + * @description 响应拦截器 + */ +http.interceptors.response.use( + (response) => { + // 自动设置登陆令牌 + if (response.header.authorization || response.header.Authorization) { + $store('user').setToken(response.header.authorization || response.header.Authorization); + } + + response.config.custom.showLoading && closeLoading(); + if (response.data.error !== 0) { + if (response.config.custom.showError) + uni.showToast({ + title: response.data.msg || '服务器开小差啦,请稍后再试~', + icon: 'none', + mask: true, + }); + return Promise.resolve(response.data); + } + if ( + response.data.error === 0 && + response.data.msg !== '' && + response.config.custom.showSuccess + ) { + uni.showToast({ + title: response.config.custom.successMsg || response.data.msg, + icon: 'none', + }); + } + return Promise.resolve(response.data); + }, + (error) => { + const userStore = $store('user'); + const isLogin = userStore.isLogin; + let errorMessage = '网络请求出错'; + if (error !== undefined) { + switch (error.statusCode) { + case 400: + errorMessage = '请求错误'; + break; + case 401: + if (isLogin) { + errorMessage = '您的登陆已过期'; + } else { + errorMessage = '请先登录'; + } + userStore.logout(true); + showAuthModal(); + break; + case 403: + errorMessage = '拒绝访问'; + break; + case 404: + errorMessage = '请求出错'; + break; + case 408: + errorMessage = '请求超时'; + break; + case 429: + errorMessage = '请求频繁, 请稍后再访问'; + break; + case 500: + errorMessage = '服务器开小差啦,请稍后再试~'; + break; + case 501: + errorMessage = '服务未实现'; + break; + case 502: + errorMessage = '网络错误'; + break; + case 503: + errorMessage = '服务不可用'; + break; + case 504: + errorMessage = '网络超时'; + break; + case 505: + errorMessage = 'HTTP版本不受支持'; + break; + } + if (error.errMsg.includes('timeout')) errorMessage = '请求超时'; + // #ifdef H5 + if (error.errMsg.includes('Network')) + errorMessage = window.navigator.onLine ? '服务器异常' : '请检查您的网络连接'; + // #endif + } + + if (error && error.config) { + if (error.config.custom.showError === false) { + uni.showToast({ + title: error.data?.msg || errorMessage, + icon: 'none', + mask: true, + }); + } + error.config.custom.showLoading && closeLoading(); + } + + return false; + }, +); + +const request = (config) => { + if (config.url[0] !== '/') { + config.url = '/app-api/' + config.url; + } + // TODO 芋艿:额外拼接 + if (config.url.indexOf('/app-api/') >= 0) { + config.url = 'http://api-dashboard.yudao.iocoder.cn' + config.url; // 调用【云端】 + // config.url = 'http://127.0.0.1:48080' + config.url; // 调用【本地】 + } + return http.middleware(config); +}; + +export default request; diff --git a/sheep/router/index.js b/sheep/router/index.js index 86796e5a..e4c18c56 100644 --- a/sheep/router/index.js +++ b/sheep/router/index.js @@ -58,10 +58,10 @@ const _go = ( } // 页面登录拦截 - if (nextRoute.meta?.auth && !$store('user').isLogin) { - showAuthModal(); - return; - } + // if (nextRoute.meta?.auth && !$store('user').isLogin) { + // showAuthModal(); + // return; + // } url = page; if (!isEmpty(query)) { -- Gitee From 6a327ac0e7d19e02d328e69a6d3f2061dc0669a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=90=BD=E6=97=A5=E6=99=9A=E9=A3=8E?= <1811466536@qq.com> Date: Tue, 31 Oct 2023 10:09:45 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=88=86=E6=94=AF?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=EF=BC=8C=E8=AF=A6=E6=83=85=E9=A1=B5=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/goods/components/detail/detail-comment-card.vue | 3 ++- pages/goods/index.vue | 8 +++++--- sheep/api/goods.js | 4 ++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/pages/goods/components/detail/detail-comment-card.vue b/pages/goods/components/detail/detail-comment-card.vue index 10b4fa37..9068d402 100644 --- a/pages/goods/components/detail/detail-comment-card.vue +++ b/pages/goods/components/detail/detail-comment-card.vue @@ -47,7 +47,8 @@ const { data } = await sheep.$api.goods.comment(id, { list_rows: 3, }); - state.commentList = data.data; + console.log(data) + state.commentList = data; state.total = data.total; } onBeforeMount(() => { diff --git a/pages/goods/index.vue b/pages/goods/index.vue index c53262c2..27bb45c4 100644 --- a/pages/goods/index.vue +++ b/pages/goods/index.vue @@ -256,10 +256,12 @@ if (res.code === 0) { // 在此处对数据做出转换 res.data.sales=res.data.salesCount - res.data.original_price=res.data.price - res.data.introduction=res.data.title + res.data.original_price=res.data.marketPrice/100 + res.data.subtitle=res.data.introduction + res.data.title=res.data.name + res.data.price=[res.data.price/100] state.goodsInfo = res.data; - state.goodsSwiper = formatGoodsSwiper(state.goodsInfo.picUrl.split(',')); + state.goodsSwiper = formatGoodsSwiper(state.goodsInfo.sliderPicUrls); } else { // 未找到商品 state.goodsInfo = null; diff --git a/sheep/api/goods.js b/sheep/api/goods.js index 824c1b38..f9a00ad8 100644 --- a/sheep/api/goods.js +++ b/sheep/api/goods.js @@ -40,8 +40,8 @@ export default { // 商品评价列表 comment: (id, params = {}) => - request({ - url: 'goods/comment/' + id, + request2({ + url: 'product/comment/list?spuId=' + id, method: 'GET', params, custom: { -- Gitee From f4c1b30f2e86d17ef94a2370847c37de46d721de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=90=BD=E6=97=A5=E6=99=9A=E9=A3=8E?= <1811466536@qq.com> Date: Tue, 31 Oct 2023 17:41:57 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=95=86=E5=93=81=E8=AF=A6=E6=83=85.?= =?UTF-8?q?=E8=AF=84=E4=BB=B7=E9=A1=B5=E9=9D=A2.=E8=B4=AD=E7=89=A9?= =?UTF-8?q?=E8=BD=A6=E9=A1=B5=E9=9D=A2.=E9=A6=96=E9=A1=B5=E8=BD=AE?= =?UTF-8?q?=E6=92=AD=E5=9B=BE.=E6=90=9C=E7=B4=A2=E5=8A=9F=E8=83=BD.?= =?UTF-8?q?=E5=88=86=E7=B1=BB=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/goods/comment/list.vue | 308 ++++++------ .../goods/components/detail/comment-item.vue | 8 +- .../components/detail/detail-comment-card.vue | 6 +- pages/goods/index.vue | 2 +- pages/goods/list.vue | 8 +- pages/index/cart.vue | 16 +- pages/index/category.vue | 460 +++++++++--------- pages/index/index.vue | 126 ++--- sheep/api/cart.js | 15 +- sheep/api/category.js | 6 +- sheep/api/goods.js | 14 +- sheep/api/index2.js | 9 + sheep/request2/index.js | 4 +- sheep/store/cart.js | 16 +- 14 files changed, 512 insertions(+), 486 deletions(-) create mode 100644 sheep/api/index2.js diff --git a/pages/goods/comment/list.vue b/pages/goods/comment/list.vue index f8958ad9..138b5f54 100644 --- a/pages/goods/comment/list.vue +++ b/pages/goods/comment/list.vue @@ -1,160 +1,170 @@ + .avatar { + width: 52rpx; + height: 52rpx; + border-radius: 50%; + } + + .nickname { + font-size: 26rpx; + font-weight: 500; + color: #999999; + } + + .create-time { + font-size: 24rpx; + font-weight: 500; + color: #c4c4c4; + } + + .content-title { + font-size: 26rpx; + font-weight: 400; + color: #666666; + line-height: 42rpx; + } + + .content-img { + width: 174rpx; + height: 174rpx; + } + + .cicon-info-o { + font-size: 26rpx; + color: #c4c4c4; + } + + .foot-title { + font-size: 24rpx; + font-weight: 500; + color: #999999; + } + } + + .btn-box { + width: 100%; + height: 120rpx; + background: #fff; + border-top: 2rpx solid #eee; + } + + .tab-btn { + width: 130rpx; + height: 62rpx; + background: #eeeeee; + border-radius: 31rpx; + font-size: 28rpx; + font-weight: 400; + color: #999999; + border: 1px solid #e5e5e5; + margin-right: 10rpx; + } + \ No newline at end of file diff --git a/pages/goods/components/detail/comment-item.vue b/pages/goods/components/detail/comment-item.vue index d81bac30..2c96ac04 100644 --- a/pages/goods/components/detail/comment-item.vue +++ b/pages/goods/components/detail/comment-item.vue @@ -5,19 +5,19 @@ - {{ item.user_nickname }} + {{ item.userNickname }} - + {{ item.content }} - + - + diff --git a/pages/goods/components/detail/detail-comment-card.vue b/pages/goods/components/detail/detail-comment-card.vue index 9068d402..90cd4dfd 100644 --- a/pages/goods/components/detail/detail-comment-card.vue +++ b/pages/goods/components/detail/detail-comment-card.vue @@ -46,10 +46,10 @@ async function getComment(id) { const { data } = await sheep.$api.goods.comment(id, { list_rows: 3, - }); - console.log(data) + }); + const {data:datas} = await sheep.$api.goods.comment2(id); state.commentList = data; - state.total = data.total; + state.total = datas.total; } onBeforeMount(() => { getComment(props.goodsId); diff --git a/pages/goods/index.vue b/pages/goods/index.vue index 27bb45c4..2c70b59c 100644 --- a/pages/goods/index.vue +++ b/pages/goods/index.vue @@ -95,7 +95,7 @@ - + @@ -112,9 +112,9 @@ isAllSelected: computed(() => cart.isAllSelected), totalPriceSelected: computed(() => cart.totalPriceSelected), }); - // 单选选中 function onSelectSingle(id) { + console.log('单选') cart.selectSingle(id); } // 全选 @@ -154,7 +154,7 @@ if(cartItem.goods_num === e) return; cartItem.goods_num = e; cart.update({ - goods_id: cartItem.goods_id, + goods_id: cartItem.id, goods_num: e, goods_sku_price_id: cartItem.goods_sku_price_id, }); diff --git a/pages/index/category.vue b/pages/index/category.vue index 9024ef04..e6e049e9 100644 --- a/pages/index/category.vue +++ b/pages/index/category.vue @@ -1,250 +1,232 @@ + .s-category { + :deep() { + .side-menu-wrap { + width: 200rpx; + height: 100%; + padding-left: 12rpx; + background-color: #f6f6f6; + + .menu-item { + width: 100%; + height: 88rpx; + position: relative; + transition: all linear 0.2s; + + .menu-title { + line-height: 32rpx; + font-size: 30rpx; + font-weight: 400; + color: #333; + margin-left: 28rpx; + position: relative; + z-index: 0; + + &::before { + content: ''; + width: 64rpx; + height: 12rpx; + background: linear-gradient(90deg, + var(--ui-BG-Main-gradient), + var(--ui-BG-Main-light)) !important; + position: absolute; + left: -64rpx; + bottom: 0; + z-index: -1; + transition: all linear 0.2s; + } + } + + &.menu-item-active { + background-color: #fff; + border-radius: 20rpx 0 0 20rpx; + + &::before { + content: ''; + position: absolute; + right: 0; + bottom: -20rpx; + width: 20rpx; + height: 20rpx; + background: radial-gradient(circle at 0 100%, transparent 20rpx, #fff 0); + } + + &::after { + content: ''; + position: absolute; + top: -20rpx; + right: 0; + width: 20rpx; + height: 20rpx; + background: radial-gradient(circle at 0% 0%, transparent 20rpx, #fff 0); + } + + .menu-title { + font-weight: 600; + + &::before { + left: 0; + } + } + } + } + } + + .goods-list-box { + background-color: #fff; + width: calc(100vw - 100px); + padding: 10px; + } + + .banner-img { + width: calc(100vw - 130px); + border-radius: 5px; + margin-bottom: 20rpx; + } + } + } + \ No newline at end of file diff --git a/pages/index/index.vue b/pages/index/index.vue index 8d953c6b..41567d99 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -1,70 +1,84 @@ - + \ No newline at end of file diff --git a/sheep/api/cart.js b/sheep/api/cart.js index efa5c8aa..a319ec55 100644 --- a/sheep/api/cart.js +++ b/sheep/api/cart.js @@ -1,9 +1,10 @@ import request from '@/sheep/request'; +import request2 from '@/sheep/request2'; export default { list: (data) => - request({ - url: 'cart', + request2({ + url: 'trade/cart/list', method: 'GET', custom: { showLoading: false, @@ -25,14 +26,14 @@ export default { }), // 删除购物车 delete: (ids) => - request({ - url: 'cart/' + ids, + request2({ + url: 'trade/cart/delete?ids=' + ids, method: 'DELETE', }), update: (data) => - request({ - url: 'cart', - method: 'POST', + request2({ + url: 'trade/cart/update-count', + method: 'PUT', data: { ...data, type: 'cover', diff --git a/sheep/api/category.js b/sheep/api/category.js index 742f9c0c..9c825069 100644 --- a/sheep/api/category.js +++ b/sheep/api/category.js @@ -1,9 +1,9 @@ -import request from '@/sheep/request'; +import request2 from '@/sheep/request2'; export default { list: (params) => - request({ - url: 'category', + request2({ + url: 'product/category/list', method: 'GET', params, }), diff --git a/sheep/api/goods.js b/sheep/api/goods.js index f9a00ad8..c2dfe610 100644 --- a/sheep/api/goods.js +++ b/sheep/api/goods.js @@ -16,8 +16,8 @@ export default { // 商品列表 list: (params) => - request({ - url: 'goods/goods', + request2({ + url: 'product/spu/page', method: 'GET', params, custom: { @@ -49,6 +49,16 @@ export default { showError: false, }, }), + comment2: (id, params = {pageNo:1,pageSize:10,type:0}) => + request2({ + url: 'product/comment/page?spuId='+id, + method: 'GET', + params, + custom: { + showLoading: false, + showError: false, + }, + }), // 商品评价类型 getType: (id) => request({ diff --git a/sheep/api/index2.js b/sheep/api/index2.js new file mode 100644 index 00000000..60fa605a --- /dev/null +++ b/sheep/api/index2.js @@ -0,0 +1,9 @@ +import request2 from '@/sheep/request2'; + +export default { + decorate: () => + request2({ + url: 'promotion/decorate/list?page=1', + method: 'GET', + }), +}; diff --git a/sheep/request2/index.js b/sheep/request2/index.js index 0ed91e48..358ddccd 100644 --- a/sheep/request2/index.js +++ b/sheep/request2/index.js @@ -68,7 +68,7 @@ const http = new Request({ */ http.interceptors.request.use( (config) => { - console.log(config); + // console.log(config); if (config.custom.auth && !$store('user').isLogin) { showAuthModal(); return Promise.reject(); @@ -110,7 +110,7 @@ http.interceptors.response.use( } response.config.custom.showLoading && closeLoading(); - if (response.data.error !== 0) { + if (response.data.code !== 0) { if (response.config.custom.showError) uni.showToast({ title: response.data.msg || '服务器开小差啦,请稍后再试~', diff --git a/sheep/store/cart.js b/sheep/store/cart.js index 829dd088..8e076343 100644 --- a/sheep/store/cart.js +++ b/sheep/store/cart.js @@ -15,7 +15,7 @@ const cart = defineStore({ if (!state.selectedIds.length) return price.toFixed(2); state.list.forEach((item) => { price += state.selectedIds.includes(item.id) - ? Number(item.sku_price.price) * item.goods_num + ? Number(item.sku.price/100) * item.count : 0; }); return price.toFixed(2); @@ -24,9 +24,9 @@ const cart = defineStore({ actions: { // 获取购物车列表 async getList() { - const { data, error } = await cartApi.list(); - if (error === 0) { - this.list = data; + const { data, code } = await cartApi.list(); + if (code === 0) { + this.list = data.validList; } }, // 添加购物车 @@ -44,8 +44,8 @@ const cart = defineStore({ // 更新购物车 async update(goodsInfo) { const { error } = await cartApi.update({ - goods_id: goodsInfo.goods_id, - goods_num: goodsInfo.goods_num, + id: goodsInfo.goods_id, + count: goodsInfo.goods_num, goods_sku_price_id: goodsInfo.goods_sku_price_id, }); if (error === 0) { @@ -58,8 +58,8 @@ const cart = defineStore({ if (typeof ids === 'array') { ids = ids.join(','); } - const { error } = await cartApi.delete(ids); - if (error === 0) { + const { code } = await cartApi.delete(ids); + if (code === 0) { this.selectAll(false); this.getList(); } -- Gitee