Browse Source

feat(shop): 添加文章详情页面并优化购物车样式

- 新增文章详情页面组件,用于显示文章内容
- 优化购物车页面样式,增加空购物车状态的透明背景
- 添加多个购物相关 API 接口,包括优惠券、订单等
- 更新环境配置,修改 API 基础 URL
- 调整发现页面布局,增加文章详情入口
master
科技小王子 2 weeks ago
parent
commit
1c2e00b7ba
  1. 2
      config/env.ts
  2. 3
      src/admin/article/index.config.ts
  3. 53
      src/admin/article/index.tsx
  4. 101
      src/api/shop/shopCoupon/index.ts
  5. 101
      src/api/shop/shopDealerApply/index.ts
  6. 101
      src/api/shop/shopDealerCapital/index.ts
  7. 101
      src/api/shop/shopDealerOrder/index.ts
  8. 101
      src/api/shop/shopDealerReferee/index.ts
  9. 101
      src/api/shop/shopDealerSetting/index.ts
  10. 101
      src/api/shop/shopDealerUser/index.ts
  11. 101
      src/api/shop/shopDealerWithdraw/index.ts
  12. 35
      src/api/shop/shopGoodsCoupon/model/index.ts
  13. 113
      src/api/shop/shopGoodsReview/model/index.ts
  14. 101
      src/api/shop/shopUserCoupon/index.ts
  15. 19
      src/app.config.ts
  16. 31
      src/pages/cart/cart.scss
  17. 32
      src/pages/cart/cart.tsx
  18. 23
      src/pages/find/find.tsx
  19. 13
      src/user/address/index.tsx

2
config/env.ts

@ -2,7 +2,7 @@
export const ENV_CONFIG = {
// 开发环境
development: {
API_BASE_URL: 'https://cms-api.websoft.top/api',
API_BASE_URL: 'http://127.0.0.1:9200/api',
APP_NAME: '开发环境',
DEBUG: 'true',
},

3
src/admin/article/index.config.ts

@ -0,0 +1,3 @@
export default definePageConfig({
navigationBarTitleText: '文章详情'
})

53
src/admin/article/index.tsx

@ -0,0 +1,53 @@
import Taro from '@tarojs/taro'
import {useEffect, useState} from 'react'
import {useRouter} from '@tarojs/taro'
import {Loading} from '@nutui/nutui-react-taro'
import {View, RichText} from '@tarojs/components'
import {wxParse} from "@/utils/common";
import {getCmsArticle} from "@/api/cms/cmsArticle";
import {CmsArticle} from "@/api/cms/cmsArticle/model"
import Line from "@/components/Gap";
import './index.scss'
function Detail() {
const {params} = useRouter();
const [loading, setLoading] = useState<boolean>(true)
// 文章详情
const [item, setItem] = useState<CmsArticle>()
const reload = async () => {
const item = await getCmsArticle(Number(params.id))
if (item) {
item.content = wxParse(item.content)
setItem(item)
Taro.setNavigationBarTitle({
title: `${item?.categoryName}`
})
}
}
useEffect(() => {
reload().then(() => {
setLoading(false)
});
}, []);
if (loading) {
return (
<Loading className={'px-2'}></Loading>
)
}
return (
<div className={'bg-white'}>
<div className={'p-4 font-bold text-lg'}>{item?.title}</div>
<div className={'text-gray-400 text-sm px-4 '}>{item?.createTime}</div>
<View className={'content p-4'}>
<RichText nodes={item?.content}/>
</View>
<Line height={44}/>
</div>
)
}
export default Detail

101
src/api/shop/shopCoupon/index.ts

@ -0,0 +1,101 @@
import request from '@/utils/request';
import type { ApiResult, PageResult } from '@/api/index';
import type { ShopCoupon, ShopCouponParam } from './model';
/**
*
*/
export async function pageShopCoupon(params: ShopCouponParam) {
const res = await request.get<ApiResult<PageResult<ShopCoupon>>>(
'/shop/shop-coupon/page',
params
);
if (res.code === 0) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function listShopCoupon(params?: ShopCouponParam) {
const res = await request.get<ApiResult<ShopCoupon[]>>(
'/shop/shop-coupon',
params
);
if (res.code === 0 && res.data) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function addShopCoupon(data: ShopCoupon) {
const res = await request.post<ApiResult<unknown>>(
'/shop/shop-coupon',
data
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function updateShopCoupon(data: ShopCoupon) {
const res = await request.put<ApiResult<unknown>>(
'/shop/shop-coupon',
data
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function removeShopCoupon(id?: number) {
const res = await request.del<ApiResult<unknown>>(
'/shop/shop-coupon/' + id
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function removeBatchShopCoupon(data: (number | undefined)[]) {
const res = await request.del<ApiResult<unknown>>(
'/shop/shop-coupon/batch',
{
data
}
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
* id查询优惠券
*/
export async function getShopCoupon(id: number) {
const res = await request.get<ApiResult<ShopCoupon>>(
'/shop/shop-coupon/' + id
);
if (res.code === 0 && res.data) {
return res.data;
}
return Promise.reject(new Error(res.message));
}

101
src/api/shop/shopDealerApply/index.ts

@ -0,0 +1,101 @@
import request from '@/utils/request';
import type { ApiResult, PageResult } from '@/api/index';
import type { ShopDealerApply, ShopDealerApplyParam } from './model';
/**
*
*/
export async function pageShopDealerApply(params: ShopDealerApplyParam) {
const res = await request.get<ApiResult<PageResult<ShopDealerApply>>>(
'/shop/shop-dealer-apply/page',
params
);
if (res.code === 0) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function listShopDealerApply(params?: ShopDealerApplyParam) {
const res = await request.get<ApiResult<ShopDealerApply[]>>(
'/shop/shop-dealer-apply',
params
);
if (res.code === 0 && res.data) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function addShopDealerApply(data: ShopDealerApply) {
const res = await request.post<ApiResult<unknown>>(
'/shop/shop-dealer-apply',
data
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function updateShopDealerApply(data: ShopDealerApply) {
const res = await request.put<ApiResult<unknown>>(
'/shop/shop-dealer-apply',
data
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function removeShopDealerApply(id?: number) {
const res = await request.del<ApiResult<unknown>>(
'/shop/shop-dealer-apply/' + id
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function removeBatchShopDealerApply(data: (number | undefined)[]) {
const res = await request.del<ApiResult<unknown>>(
'/shop/shop-dealer-apply/batch',
{
data
}
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
* id查询分销商申请记录表
*/
export async function getShopDealerApply(id: number) {
const res = await request.get<ApiResult<ShopDealerApply>>(
'/shop/shop-dealer-apply/' + id
);
if (res.code === 0 && res.data) {
return res.data;
}
return Promise.reject(new Error(res.message));
}

101
src/api/shop/shopDealerCapital/index.ts

@ -0,0 +1,101 @@
import request from '@/utils/request';
import type { ApiResult, PageResult } from '@/api/index';
import type { ShopDealerCapital, ShopDealerCapitalParam } from './model';
/**
*
*/
export async function pageShopDealerCapital(params: ShopDealerCapitalParam) {
const res = await request.get<ApiResult<PageResult<ShopDealerCapital>>>(
'/shop/shop-dealer-capital/page',
params
);
if (res.code === 0) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function listShopDealerCapital(params?: ShopDealerCapitalParam) {
const res = await request.get<ApiResult<ShopDealerCapital[]>>(
'/shop/shop-dealer-capital',
params
);
if (res.code === 0 && res.data) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function addShopDealerCapital(data: ShopDealerCapital) {
const res = await request.post<ApiResult<unknown>>(
'/shop/shop-dealer-capital',
data
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function updateShopDealerCapital(data: ShopDealerCapital) {
const res = await request.put<ApiResult<unknown>>(
'/shop/shop-dealer-capital',
data
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function removeShopDealerCapital(id?: number) {
const res = await request.del<ApiResult<unknown>>(
'/shop/shop-dealer-capital/' + id
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function removeBatchShopDealerCapital(data: (number | undefined)[]) {
const res = await request.del<ApiResult<unknown>>(
'/shop/shop-dealer-capital/batch',
{
data
}
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
* id查询分销商资金明细表
*/
export async function getShopDealerCapital(id: number) {
const res = await request.get<ApiResult<ShopDealerCapital>>(
'/shop/shop-dealer-capital/' + id
);
if (res.code === 0 && res.data) {
return res.data;
}
return Promise.reject(new Error(res.message));
}

101
src/api/shop/shopDealerOrder/index.ts

@ -0,0 +1,101 @@
import request from '@/utils/request';
import type { ApiResult, PageResult } from '@/api/index';
import type { ShopDealerOrder, ShopDealerOrderParam } from './model';
/**
*
*/
export async function pageShopDealerOrder(params: ShopDealerOrderParam) {
const res = await request.get<ApiResult<PageResult<ShopDealerOrder>>>(
'/shop/shop-dealer-order/page',
params
);
if (res.code === 0) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function listShopDealerOrder(params?: ShopDealerOrderParam) {
const res = await request.get<ApiResult<ShopDealerOrder[]>>(
'/shop/shop-dealer-order',
params
);
if (res.code === 0 && res.data) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function addShopDealerOrder(data: ShopDealerOrder) {
const res = await request.post<ApiResult<unknown>>(
'/shop/shop-dealer-order',
data
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function updateShopDealerOrder(data: ShopDealerOrder) {
const res = await request.put<ApiResult<unknown>>(
'/shop/shop-dealer-order',
data
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function removeShopDealerOrder(id?: number) {
const res = await request.del<ApiResult<unknown>>(
'/shop/shop-dealer-order/' + id
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function removeBatchShopDealerOrder(data: (number | undefined)[]) {
const res = await request.del<ApiResult<unknown>>(
'/shop/shop-dealer-order/batch',
{
data
}
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
* id查询分销商订单记录表
*/
export async function getShopDealerOrder(id: number) {
const res = await request.get<ApiResult<ShopDealerOrder>>(
'/shop/shop-dealer-order/' + id
);
if (res.code === 0 && res.data) {
return res.data;
}
return Promise.reject(new Error(res.message));
}

101
src/api/shop/shopDealerReferee/index.ts

@ -0,0 +1,101 @@
import request from '@/utils/request';
import type { ApiResult, PageResult } from '@/api/index';
import type { ShopDealerReferee, ShopDealerRefereeParam } from './model';
/**
*
*/
export async function pageShopDealerReferee(params: ShopDealerRefereeParam) {
const res = await request.get<ApiResult<PageResult<ShopDealerReferee>>>(
'/shop/shop-dealer-referee/page',
params
);
if (res.code === 0) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function listShopDealerReferee(params?: ShopDealerRefereeParam) {
const res = await request.get<ApiResult<ShopDealerReferee[]>>(
'/shop/shop-dealer-referee',
params
);
if (res.code === 0 && res.data) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function addShopDealerReferee(data: ShopDealerReferee) {
const res = await request.post<ApiResult<unknown>>(
'/shop/shop-dealer-referee',
data
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function updateShopDealerReferee(data: ShopDealerReferee) {
const res = await request.put<ApiResult<unknown>>(
'/shop/shop-dealer-referee',
data
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function removeShopDealerReferee(id?: number) {
const res = await request.del<ApiResult<unknown>>(
'/shop/shop-dealer-referee/' + id
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function removeBatchShopDealerReferee(data: (number | undefined)[]) {
const res = await request.del<ApiResult<unknown>>(
'/shop/shop-dealer-referee/batch',
{
data
}
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
* id查询分销商推荐关系表
*/
export async function getShopDealerReferee(id: number) {
const res = await request.get<ApiResult<ShopDealerReferee>>(
'/shop/shop-dealer-referee/' + id
);
if (res.code === 0 && res.data) {
return res.data;
}
return Promise.reject(new Error(res.message));
}

101
src/api/shop/shopDealerSetting/index.ts

@ -0,0 +1,101 @@
import request from '@/utils/request';
import type { ApiResult, PageResult } from '@/api/index';
import type { ShopDealerSetting, ShopDealerSettingParam } from './model';
/**
*
*/
export async function pageShopDealerSetting(params: ShopDealerSettingParam) {
const res = await request.get<ApiResult<PageResult<ShopDealerSetting>>>(
'/shop/shop-dealer-setting/page',
params
);
if (res.code === 0) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function listShopDealerSetting(params?: ShopDealerSettingParam) {
const res = await request.get<ApiResult<ShopDealerSetting[]>>(
'/shop/shop-dealer-setting',
params
);
if (res.code === 0 && res.data) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function addShopDealerSetting(data: ShopDealerSetting) {
const res = await request.post<ApiResult<unknown>>(
'/shop/shop-dealer-setting',
data
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function updateShopDealerSetting(data: ShopDealerSetting) {
const res = await request.put<ApiResult<unknown>>(
'/shop/shop-dealer-setting',
data
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function removeShopDealerSetting(id?: number) {
const res = await request.del<ApiResult<unknown>>(
'/shop/shop-dealer-setting/' + id
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function removeBatchShopDealerSetting(data: (number | undefined)[]) {
const res = await request.del<ApiResult<unknown>>(
'/shop/shop-dealer-setting/batch',
{
data
}
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
* id查询分销商设置表
*/
export async function getShopDealerSetting(id: number) {
const res = await request.get<ApiResult<ShopDealerSetting>>(
'/shop/shop-dealer-setting/' + id
);
if (res.code === 0 && res.data) {
return res.data;
}
return Promise.reject(new Error(res.message));
}

101
src/api/shop/shopDealerUser/index.ts

@ -0,0 +1,101 @@
import request from '@/utils/request';
import type { ApiResult, PageResult } from '@/api/index';
import type { ShopDealerUser, ShopDealerUserParam } from './model';
/**
*
*/
export async function pageShopDealerUser(params: ShopDealerUserParam) {
const res = await request.get<ApiResult<PageResult<ShopDealerUser>>>(
'/shop/shop-dealer-user/page',
params
);
if (res.code === 0) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function listShopDealerUser(params?: ShopDealerUserParam) {
const res = await request.get<ApiResult<ShopDealerUser[]>>(
'/shop/shop-dealer-user',
params
);
if (res.code === 0 && res.data) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function addShopDealerUser(data: ShopDealerUser) {
const res = await request.post<ApiResult<unknown>>(
'/shop/shop-dealer-user',
data
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function updateShopDealerUser(data: ShopDealerUser) {
const res = await request.put<ApiResult<unknown>>(
'/shop/shop-dealer-user',
data
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function removeShopDealerUser(id?: number) {
const res = await request.del<ApiResult<unknown>>(
'/shop/shop-dealer-user/' + id
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function removeBatchShopDealerUser(data: (number | undefined)[]) {
const res = await request.del<ApiResult<unknown>>(
'/shop/shop-dealer-user/batch',
{
data
}
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
* id查询分销商用户记录表
*/
export async function getShopDealerUser(id: number) {
const res = await request.get<ApiResult<ShopDealerUser>>(
'/shop/shop-dealer-user/' + id
);
if (res.code === 0 && res.data) {
return res.data;
}
return Promise.reject(new Error(res.message));
}

101
src/api/shop/shopDealerWithdraw/index.ts

@ -0,0 +1,101 @@
import request from '@/utils/request';
import type { ApiResult, PageResult } from '@/api/index';
import type { ShopDealerWithdraw, ShopDealerWithdrawParam } from './model';
/**
*
*/
export async function pageShopDealerWithdraw(params: ShopDealerWithdrawParam) {
const res = await request.get<ApiResult<PageResult<ShopDealerWithdraw>>>(
'/shop/shop-dealer-withdraw/page',
params
);
if (res.code === 0) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function listShopDealerWithdraw(params?: ShopDealerWithdrawParam) {
const res = await request.get<ApiResult<ShopDealerWithdraw[]>>(
'/shop/shop-dealer-withdraw',
params
);
if (res.code === 0 && res.data) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function addShopDealerWithdraw(data: ShopDealerWithdraw) {
const res = await request.post<ApiResult<unknown>>(
'/shop/shop-dealer-withdraw',
data
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function updateShopDealerWithdraw(data: ShopDealerWithdraw) {
const res = await request.put<ApiResult<unknown>>(
'/shop/shop-dealer-withdraw',
data
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function removeShopDealerWithdraw(id?: number) {
const res = await request.del<ApiResult<unknown>>(
'/shop/shop-dealer-withdraw/' + id
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function removeBatchShopDealerWithdraw(data: (number | undefined)[]) {
const res = await request.del<ApiResult<unknown>>(
'/shop/shop-dealer-withdraw/batch',
{
data
}
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
* id查询分销商提现明细表
*/
export async function getShopDealerWithdraw(id: number) {
const res = await request.get<ApiResult<ShopDealerWithdraw>>(
'/shop/shop-dealer-withdraw/' + id
);
if (res.code === 0 && res.data) {
return res.data;
}
return Promise.reject(new Error(res.message));
}

35
src/api/shop/shopGoodsCoupon/model/index.ts

@ -1,35 +0,0 @@
import type { PageParam } from '@/api/index';
/**
*
*/
export interface ShopGoodsCoupon {
//
id?: number;
// 商品id
goodsId?: number;
// 优惠劵id
issueCouponId?: number;
// 排序(数字越小越靠前)
sortNumber?: number;
// 状态, 0正常, 1冻结
status?: number;
// 是否删除, 0否, 1是
deleted?: number;
// 用户ID
userId?: number;
// 租户id
tenantId?: number;
// 注册时间
createTime?: string;
// 修改时间
updateTime?: string;
}
/**
*
*/
export interface ShopGoodsCouponParam extends PageParam {
id?: number;
keywords?: string;
}

113
src/api/shop/shopGoodsReview/model/index.ts

@ -1,113 +0,0 @@
import type { PageParam } from '@/api/index';
/**
*
*/
export interface ShopGoodsReview {
// 评价ID
reviewId?: number;
// 商品ID
goodsId?: number;
// 订单ID
orderId?: number;
// 用户ID
userId?: number;
// 用户昵称
nickname?: string;
// 用户头像
avatar?: string;
// 评价内容
content?: string;
// 评分 1-5星
rating?: number;
// 评价图片,JSON数组格式
images?: string;
// 是否匿名评价
isAnonymous?: boolean;
// 商家回复
reply?: string;
// 商家回复时间
replyTime?: string;
// 评价状态 0待审核 1已通过 2已拒绝
status?: number;
// 是否置顶
isTop?: boolean;
// 点赞数
likeCount?: number;
// 创建时间
createTime?: string;
// 更新时间
updateTime?: string;
// 商品信息
goodsName?: string;
goodsImage?: string;
goodsPrice?: string;
// SKU信息
skuId?: number;
specInfo?: string;
}
/**
*
*/
export interface ReviewStats {
// 总评价数
totalCount: number;
// 好评数
goodCount: number;
// 中评数
mediumCount: number;
// 差评数
badCount: number;
// 好评率
goodRate: number;
// 平均评分
avgRating: number;
// 各星级统计
ratingStats: {
[key: number]: number; // 星级 -> 数量
};
}
/**
*
*/
export interface ShopGoodsReviewParam extends PageParam {
// 商品ID
goodsId?: number;
// 用户ID
userId?: number;
// 订单ID
orderId?: number;
// 评分筛选
rating?: number;
// 状态筛选
status?: number;
// 是否有图片
hasImages?: boolean;
// 排序方式 time:时间 rating:评分 like:点赞数
sortBy?: string;
// 排序方向 asc:升序 desc:降序
sortOrder?: string;
}
/**
*
*/
export interface SubmitReviewRequest {
// 商品ID
goodsId: number;
// 订单ID
orderId: number;
// 评价内容
content: string;
// 评分
rating: number;
// 评价图片
images?: string[];
// 是否匿名
isAnonymous?: boolean;
// SKU信息
skuId?: number;
specInfo?: string;
}

101
src/api/shop/shopUserCoupon/index.ts

@ -0,0 +1,101 @@
import request from '@/utils/request';
import type { ApiResult, PageResult } from '@/api/index';
import type { ShopUserCoupon, ShopUserCouponParam } from './model';
/**
*
*/
export async function pageShopUserCoupon(params: ShopUserCouponParam) {
const res = await request.get<ApiResult<PageResult<ShopUserCoupon>>>(
'/shop/shop-user-coupon/page',
params
);
if (res.code === 0) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function listShopUserCoupon(params?: ShopUserCouponParam) {
const res = await request.get<ApiResult<ShopUserCoupon[]>>(
'/shop/shop-user-coupon',
params
);
if (res.code === 0 && res.data) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function addShopUserCoupon(data: ShopUserCoupon) {
const res = await request.post<ApiResult<unknown>>(
'/shop/shop-user-coupon',
data
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function updateShopUserCoupon(data: ShopUserCoupon) {
const res = await request.put<ApiResult<unknown>>(
'/shop/shop-user-coupon',
data
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function removeShopUserCoupon(id?: number) {
const res = await request.del<ApiResult<unknown>>(
'/shop/shop-user-coupon/' + id
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
*
*/
export async function removeBatchShopUserCoupon(data: (number | undefined)[]) {
const res = await request.del<ApiResult<unknown>>(
'/shop/shop-user-coupon/batch',
{
data
}
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
* id查询用户优惠券
*/
export async function getShopUserCoupon(id: number) {
const res = await request.get<ApiResult<ShopUserCoupon>>(
'/shop/shop-user-coupon/' + id
);
if (res.code === 0 && res.data) {
return res.data;
}
return Promise.reject(new Error(res.message));
}

19
src/app.config.ts

@ -53,15 +53,16 @@ export default defineAppConfig({
]
},
{
"root": "shop",
"pages": [
'category/index',
'orderDetail/index',
'goodsDetail/index',
'orderConfirm/index',
'orderConfirmCart/index',
'search/index'
]
"root": "shop",
"pages": [
'category/index',
'orderDetail/index',
'goodsDetail/index',
'orderConfirm/index',
'orderConfirmCart/index',
'search/index',
'shopArticle/index'
]
}
],
window: {

31
src/pages/cart/cart.scss

@ -0,0 +1,31 @@
// 购物车页面样式
.cart-page {
// 当购物车为空时设置透明背景
&.empty {
page {
background-color: transparent !important;
}
.cart-empty-container {
background-color: transparent !important;
}
}
}
// 空购物车容器样式
.cart-empty-container {
background-color: transparent !important;
// 确保 Empty 组件及其子元素也是透明的
.nut-empty {
background-color: transparent !important;
}
.nut-empty__image {
background-color: transparent !important;
}
.nut-empty__description {
background-color: transparent !important;
}
}

32
src/pages/cart/cart.tsx

@ -13,6 +13,7 @@ import {
import {ArrowLeft, Del, Shopping} from '@nutui/icons-react-taro';
import {View} from '@tarojs/components';
import {CartItem, useCart} from "@/hooks/useCart";
import './cart.scss';
function Cart() {
const [statusBarHeight, setStatusBarHeight] = useState<number>(0);
@ -69,6 +70,21 @@ function Cart() {
});
}, []);
// 根据购物车状态动态设置页面背景色
useEffect(() => {
if (cartItems.length === 0) {
// 购物车为空时设置透明背景
Taro.setBackgroundColor({
backgroundColor: 'transparent'
});
} else {
// 有商品时恢复默认背景
Taro.setBackgroundColor({
backgroundColor: '#f5f5f5'
});
}
}, [cartItems.length]);
// 处理单个商品选择
const handleItemSelect = (goodsId: number, checked: boolean) => {
if (checked) {
@ -184,7 +200,10 @@ function Cart() {
<Empty
description="购物车空空如也"
actions={[{ text: '去逛逛' }]}
style={{ marginTop: `${statusBarHeight + 50}px` }}
style={{
marginTop: `${statusBarHeight + 50}px`,
backgroundColor: 'transparent'
}}
onClick={() => Taro.switchTab({ url: '/pages/index/index' })}
/>
</>
@ -226,13 +245,20 @@ function Cart() {
</NavBar>
{/* 购物车内容 */}
<View className="pt-24">
<View
className="pt-24"
style={{ backgroundColor: cartItems.length === 0 ? 'transparent' : undefined }}
>
{cartItems.length === 0 ? (
// 空购物车
<View className="flex flex-col items-center justify-center h-96">
<View
className="cart-empty-container flex flex-col items-center justify-center h-96"
style={{ backgroundColor: 'transparent' }}
>
<Empty
image={<Shopping size={80}/>}
description="购物车空空如也"
style={{ backgroundColor: 'transparent' }}
>
<Button
type="primary"

23
src/pages/find/find.tsx

@ -6,6 +6,7 @@ import {NavBar, Cell} from '@nutui/nutui-react-taro';
import {Text} from '@tarojs/components';
import {ArrowRight, ImageRectangle, Coupon, Follow} from '@nutui/icons-react-taro'
import './find.scss'
import navTo from "@/utils/common";
/**
*
@ -52,19 +53,25 @@ const Find = () => {
<Cell title={
<div style={{display: 'inline-flex', alignItems: 'center'}}>
<ImageRectangle size={18}/>
<Text className={'pl-3'} style={{ fontSize: '16px'}}></Text>
</div>
} extra={<ArrowRight color="#cccccc" size={18}/>}/>
<Cell title={
<div style={{display: 'inline-flex', alignItems: 'center'}}>
<Coupon size={18}/>
<span className={'pl-3'} style={{ fontSize: '16px'}}></span>
<Text className={'pl-3'} style={{fontSize: '16px'}}></Text>
</div>
} extra={<ArrowRight color="#cccccc" size={18}/>}/>
<Cell
title={
<div style={{display: 'inline-flex', alignItems: 'center'}}>
<Coupon size={18}/>
<span className={'pl-3'} style={{fontSize: '16px'}}></span>
</div>
}
extra={<ArrowRight color="#cccccc" size={18}/>}
onClick={() => {
navTo('/shop/shopArticle/index', true)
}}
/>
<Cell title={
<div style={{display: 'inline-flex', alignItems: 'center'}}>
<Follow size={18}/>
<span className={'pl-3'} style={{ fontSize: '16px'}}></span>
<span className={'pl-3'} style={{fontSize: '16px'}}></span>
</div>
} extra={<ArrowRight color="#cccccc" size={18}/>}/>
</>

13
src/user/address/index.tsx

@ -67,7 +67,7 @@ const Address = () => {
})
setTimeout(() => {
Taro.navigateBack()
},500)
}, 500)
}
useDidShow(() => {
@ -144,6 +144,17 @@ const Address = () => {
/>
</Cell.Group>
))}
<View
className="fixed z-50 bottom-0 left-0 right-0 bg-white border-t border-gray-200 px-4 py-3 safe-area-bottom">
<Button
type="success"
size="large"
block
className="px-6"
onClick={() => Taro.navigateTo({url: '/user/address/add'})}>
</Button>
</View>
</>
);
};

Loading…
Cancel
Save