diff --git a/env b/env deleted file mode 100644 index da303d9..0000000 --- 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/comment/list.vue b/pages/goods/comment/list.vue index f8958ad..138b5f5 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 d81bac3..2c96ac0 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 10b4fa3..90cd4df 100644 --- a/pages/goods/components/detail/detail-comment-card.vue +++ b/pages/goods/components/detail/detail-comment-card.vue @@ -46,9 +46,10 @@ async function getComment(id) { const { data } = await sheep.$api.goods.comment(id, { list_rows: 3, - }); - state.commentList = data.data; - state.total = data.total; + }); + const {data:datas} = await sheep.$api.goods.comment2(id); + state.commentList = data; + state.total = datas.total; } onBeforeMount(() => { getComment(props.goodsId); diff --git a/pages/goods/index.vue b/pages/goods/index.vue index 5f20fe1..2c70b59 100644 --- a/pages/goods/index.vue +++ b/pages/goods/index.vue @@ -95,7 +95,7 @@ - + { + console.log('页面被访问') // 非法参数 if (!options.id) { state.goodsInfo = null; @@ -250,10 +251,17 @@ 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.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.images); + state.goodsSwiper = formatGoodsSwiper(state.goodsInfo.sliderPicUrls); } else { // 未找到商品 state.goodsInfo = null; diff --git a/pages/goods/list.vue b/pages/goods/list.vue index d7de122..19923d1 100644 --- a/pages/goods/list.vue +++ b/pages/goods/list.vue @@ -261,12 +261,12 @@ sort: Sort, order: Order, category_id: !keyword ? categoryId : '', - list_rows, + pageSize:list_rows, keyword: keyword, - page, + pageNo:page, }); - if (res.error === 0) { - let couponList = _.concat(state.pagination.data, res.data.data); + if (res.code === 0) { + let couponList = _.concat(state.pagination.data, res.data.list); state.pagination = { ...res.data, data: couponList, diff --git a/pages/index/cart.vue b/pages/index/cart.vue index 2485ae8..aba9db4 100644 --- a/pages/index/cart.vue +++ b/pages/index/cart.vue @@ -36,19 +36,19 @@ /> @@ -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 9024ef0..e6e049e 100644 --- a/pages/index/category.vue +++ b/pages/index/category.vue @@ -1,250 +1,232 @@ + .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 8d953c6..41567d9 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 efa5c8a..a319ec5 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 742f9c0..9c82506 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 72b0a80..c2dfe61 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: { @@ -15,8 +16,8 @@ export default { // 商品列表 list: (params) => - request({ - url: 'goods/goods', + request2({ + url: 'product/spu/page', method: 'GET', params, custom: { @@ -39,8 +40,18 @@ export default { // 商品评价列表 comment: (id, params = {}) => - request({ - url: 'goods/comment/' + id, + request2({ + url: 'product/comment/list?spuId=' + id, + method: 'GET', + params, + custom: { + showLoading: false, + showError: false, + }, + }), + comment2: (id, params = {pageNo:1,pageSize:10,type:0}) => + request2({ + url: 'product/comment/page?spuId='+id, method: 'GET', params, custom: { diff --git a/sheep/api/index2.js b/sheep/api/index2.js new file mode 100644 index 0000000..60fa605 --- /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/config/index.js b/sheep/config/index.js index dfd5bbb..2d6a870 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 0000000..358ddcc --- /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.code !== 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 86796e5..e4c18c5 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)) { diff --git a/sheep/store/cart.js b/sheep/store/cart.js index 829dd08..8e07634 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(); }