Browse Source

refactor(user): 优化用户优惠券相关功能

- 移除新增收货地址页面
- 删除 ShopArticle 相关代码
- 优化优惠券详情页面布局- 更新优惠券筛选和使用逻辑
- 调整 app配置,重新启用优惠券功能
- 优化 Tailwind CSS配置,禁用不必要功能
master
科技小王子 2 weeks ago
parent
commit
5d4dc4518f
  1. 3
      src/api/shop/shopCoupon/model/index.ts
  2. 4
      src/app.config.ts
  3. 4
      src/user/coupon/add.config.ts
  4. 323
      src/user/coupon/add.tsx
  5. 2
      src/user/coupon/detail.tsx
  6. 7
      src/user/coupon/index.tsx
  7. 10
      tailwind.config.js

3
src/api/shop/shopCoupon/model/index.ts

@ -62,5 +62,8 @@ export interface ShopCoupon {
*/ */
export interface ShopCouponParam extends PageParam { export interface ShopCouponParam extends PageParam {
id?: number; id?: number;
status?: number;
isExpire?: number;
sortBy?: string;
keywords?: string; keywords?: string;
} }

4
src/app.config.ts

@ -38,8 +38,8 @@ export default defineAppConfig({
"help/index", "help/index",
"about/index", "about/index",
"wallet/wallet", "wallet/wallet",
// "coupon/index",
// "points/points",
"coupon/index",
"points/points",
"gift/index" "gift/index"
] ]
}, },

4
src/user/coupon/add.config.ts

@ -1,4 +0,0 @@
export default definePageConfig({
navigationBarTitleText: '新增收货地址',
navigationBarTextStyle: 'black'
})

323
src/user/coupon/add.tsx

@ -1,323 +0,0 @@
import {useEffect, useState, useRef} from "react";
import {useRouter} from '@tarojs/taro'
import {Button, Loading, CellGroup, Input, TextArea, Form, Switch, InputNumber, Radio, Image} from '@nutui/nutui-react-taro'
import {Edit, Upload as UploadIcon} from '@nutui/icons-react-taro'
import Taro from '@tarojs/taro'
import {View} from '@tarojs/components'
import {ShopArticle} from "@/api/shop/shopArticle/model";
import {getShopArticle, addShopArticle, updateShopArticle} from "@/api/shop/shopArticle";
import FixedButton from "@/components/FixedButton";
const AddShopArticle = () => {
const {params} = useRouter();
const [loading, setLoading] = useState<boolean>(true)
const [formData, setFormData] = useState<ShopArticle>({
type: 0, // 默认常规文章
status: 0, // 默认已发布
permission: 0, // 默认所有人可见
recommend: 0, // 默认不推荐
showType: 10, // 默认小图展示
virtualViews: 0, // 默认虚拟阅读量
actualViews: 0, // 默认实际阅读量
sortNumber: 0 // 默认排序
})
const formRef = useRef<any>(null)
// 判断是编辑还是新增模式
const isEditMode = !!params.id
const articleId = params.id ? Number(params.id) : undefined
// 文章类型选项
const typeOptions = [
{ text: '常规文章', value: 0 },
{ text: '视频文章', value: 1 }
]
// 状态选项
const statusOptions = [
{ text: '已发布', value: 0 },
{ text: '待审核', value: 1 },
{ text: '已驳回', value: 2 },
{ text: '违规内容', value: 3 }
]
// 可见性选项
const permissionOptions = [
{ text: '所有人可见', value: 0 },
{ text: '登录可见', value: 1 },
{ text: '密码可见', value: 2 }
]
// 显示方式选项
const showTypeOptions = [
{ text: '小图展示', value: 10 },
{ text: '大图展示', value: 20 }
]
const reload = async () => {
// 如果是编辑模式,加载文章数据
if (isEditMode && articleId) {
try {
const article = await getShopArticle(articleId)
setFormData(article)
// 更新表单值
if (formRef.current) {
formRef.current.setFieldsValue(article)
}
} catch (error) {
console.error('加载文章失败:', error)
Taro.showToast({
title: '加载文章失败',
icon: 'error'
});
}
}
}
// 图片上传处理
const handleImageUpload = async () => {
try {
const res = await Taro.chooseImage({
count: 1,
sizeType: ['compressed'],
sourceType: ['album', 'camera']
});
if (res.tempFilePaths && res.tempFilePaths.length > 0) {
// 这里应该调用上传接口,暂时使用本地路径
const imagePath = res.tempFilePaths[0];
setFormData({
...formData,
image: imagePath
});
Taro.showToast({
title: '图片选择成功',
icon: 'success'
});
}
} catch (error) {
Taro.showToast({
title: '图片选择失败',
icon: 'error'
});
}
};
// 提交表单
const submitSucceed = async (values: any) => {
try {
// 准备提交的数据
const submitData = {
...formData,
...values,
};
// 如果是编辑模式,添加id
if (isEditMode && articleId) {
submitData.articleId = articleId;
}
// 执行新增或更新操作
if (isEditMode) {
await updateShopArticle(submitData);
} else {
await addShopArticle(submitData);
}
Taro.showToast({
title: `${isEditMode ? '更新' : '保存'}成功`,
icon: 'success'
});
setTimeout(() => {
Taro.navigateBack();
}, 1000);
} catch (error) {
console.error('保存失败:', error);
Taro.showToast({
title: `${isEditMode ? '更新' : '保存'}失败`,
icon: 'error'
});
}
}
const submitFailed = (error: any) => {
console.log(error, 'err...')
}
useEffect(() => {
// 动态设置页面标题
Taro.setNavigationBarTitle({
title: isEditMode ? '编辑文章' : '新增文章'
});
reload().then(() => {
setLoading(false)
})
}, [isEditMode]);
if (loading) {
return <Loading className={'px-2'}></Loading>
}
return (
<>
<Form
ref={formRef}
divider
initialValues={formData}
labelPosition="left"
onFinish={(values) => submitSucceed(values)}
onFinishFailed={(errors) => submitFailed(errors)}
>
{/* 基本信息 */}
<CellGroup title="基本信息">
<Form.Item
name="title"
label="文章标题"
required
rules={[{ required: true, message: '请输入文章标题' }]}
initialValue={formData.title}
>
<Input placeholder="请输入文章标题" maxLength={100}/>
</Form.Item>
<Form.Item name="overview" label="文章概述" initialValue={formData.overview}>
<TextArea placeholder="请输入文章概述,用于列表展示" maxLength={200} rows={3}/>
</Form.Item>
<Form.Item
name="detail"
label="文章内容"
required
rules={[{ required: true, message: '请输入文章内容' }]}
initialValue={formData.detail}
>
<TextArea placeholder="请输入文章内容" maxLength={10000} rows={8}/>
</Form.Item>
<Form.Item name="author" label="作者" initialValue={formData.author}>
<Input placeholder="请输入作者名称" maxLength={50}/>
</Form.Item>
<Form.Item name="source" label="来源" initialValue={formData.source}>
<Input placeholder="请输入文章来源" maxLength={100}/>
</Form.Item>
</CellGroup>
{/* 文章设置 */}
<CellGroup title="文章设置">
<Form.Item name="type" label="文章类型" initialValue={formData.type}>
<Radio.Group direction="horizontal" value={formData.type}>
{typeOptions.map(option => (
<Radio key={option.value} value={option.value}>
{option.text}
</Radio>
))}
</Radio.Group>
</Form.Item>
<Form.Item name="status" label="发布状态" initialValue={formData.status}>
<Radio.Group direction="horizontal" value={formData.status}>
{statusOptions.map(option => (
<Radio key={option.value} value={option.value}>
{option.text}
</Radio>
))}
</Radio.Group>
</Form.Item>
<Form.Item name="permission" label="可见性" initialValue={formData.permission}>
<Radio.Group direction="horizontal" value={formData.permission}>
{permissionOptions.map(option => (
<Radio key={option.value} value={option.value}>
{option.text}
</Radio>
))}
</Radio.Group>
</Form.Item>
<Form.Item name="showType" label="显示方式" initialValue={formData.showType}>
<Radio.Group direction="horizontal" value={formData.showType}>
{showTypeOptions.map(option => (
<Radio key={option.value} value={option.value}>
{option.text}
</Radio>
))}
</Radio.Group>
</Form.Item>
</CellGroup>
{/* 高级设置 */}
<CellGroup title="高级设置">
<Form.Item name="recommend" label="推荐文章" initialValue={formData.recommend}>
<Switch
checked={formData.recommend === 1}
onChange={(checked) =>
setFormData({...formData, recommend: checked ? 1 : 0})
}
/>
</Form.Item>
<Form.Item name="price" label="付费金额" initialValue={formData.price}>
<Input placeholder="0.00" type="number"/>
<View className="text-xs text-gray-500 mt-1"></View>
</Form.Item>
<Form.Item name="virtualViews" label="虚拟阅读量" initialValue={formData.virtualViews}>
<InputNumber min={0} defaultValue={formData.virtualViews || 0}/>
</Form.Item>
<Form.Item name="actualViews" label="实际阅读量" initialValue={formData.actualViews}>
<InputNumber min={0} defaultValue={formData.actualViews || 0}/>
</Form.Item>
<Form.Item name="sortNumber" label="排序" initialValue={formData.sortNumber}>
<InputNumber min={0} defaultValue={formData.sortNumber || 0}/>
<View className="text-xs text-gray-500 mt-1"></View>
</Form.Item>
<Form.Item name="tags" label="标签" initialValue={formData.tags}>
<Input placeholder="请输入标签,多个标签用逗号分隔" maxLength={200}/>
</Form.Item>
<Form.Item name="topic" label="话题" initialValue={formData.topic}>
<Input placeholder="请输入话题" maxLength={100}/>
</Form.Item>
</CellGroup>
{/* 图片上传 */}
<CellGroup title="文章图片">
<Form.Item name="image" label="封面图片" initialValue={formData.image}>
<View className="flex items-center gap-3">
{formData.image && (
<Image
src={formData.image}
width="80"
height="80"
radius="8"
/>
)}
<Button
size="small"
type="primary"
fill="outline"
icon={<UploadIcon />}
onClick={handleImageUpload}
>
{formData.image ? '更换图片' : '上传图片'}
</Button>
</View>
</Form.Item>
</CellGroup>
{/* 提交按钮 */}
<FixedButton text={isEditMode ? '更新文章' : '发布文章'} onClick={submitSucceed} icon={<Edit />} />
</Form>
</>
);
};
export default AddShopArticle;

2
src/user/coupon/detail.tsx

@ -191,7 +191,7 @@ const CouponDetail = () => {
<View className="bg-white mx-4 rounded-xl p-4"> <View className="bg-white mx-4 rounded-xl p-4">
<Text className="text-lg font-semibold mb-4">使</Text> <Text className="text-lg font-semibold mb-4">使</Text>
<View className="space-y-3">
<View className="gap-2">
<View className="flex items-center"> <View className="flex items-center">
<Clock size="16" className="text-gray-400 mr-3" /> <Clock size="16" className="text-gray-400 mr-3" />
<View> <View>

7
src/user/coupon/index.tsx

@ -240,7 +240,7 @@ const CouponManage = () => {
// 筛选条件变更 // 筛选条件变更
const handleFiltersChange = (newFilters: any) => { const handleFiltersChange = (newFilters: any) => {
setFilters(newFilters) setFilters(newFilters)
reload(true)
reload(true).then()
} }
// 检查即将过期的优惠券 // 检查即将过期的优惠券
@ -290,6 +290,7 @@ const CouponManage = () => {
// 使用即将过期的优惠券 // 使用即将过期的优惠券
const handleUseExpiringSoonCoupon = (coupon: ExpiringSoon) => { const handleUseExpiringSoonCoupon = (coupon: ExpiringSoon) => {
console.log(coupon, '使用即将过期优惠券')
setShowExpireNotice(false) setShowExpireNotice(false)
// 跳转到商品页面 // 跳转到商品页面
Taro.navigateTo({ Taro.navigateTo({
@ -447,7 +448,7 @@ const CouponManage = () => {
onClose={() => setShowGuide(false)} onClose={() => setShowGuide(false)}
/> />
{/* 筛选弹窗 */}
{/*/!* 筛选弹窗 *!/*/}
<CouponFilter <CouponFilter
visible={showFilter} visible={showFilter}
filters={filters} filters={filters}
@ -455,7 +456,7 @@ const CouponManage = () => {
onClose={() => setShowFilter(false)} onClose={() => setShowFilter(false)}
/> />
{/* 到期提醒弹窗 */}
{/*/!* 到期提醒弹窗 *!/*/}
<CouponExpireNotice <CouponExpireNotice
visible={showExpireNotice} visible={showExpireNotice}
expiringSoonCoupons={expiringSoonCoupons} expiringSoonCoupons={expiringSoonCoupons}

10
tailwind.config.js

@ -9,4 +9,14 @@ module.exports = {
extend: {}, extend: {},
}, },
plugins: [], plugins: [],
corePlugins: {
// 禁用微信小程序不支持的功能
preflight: false, // 禁用默认样式重置
// 禁用包含复杂选择器的插件
space: false, // 禁用 space-x, space-y 等(包含 :not([hidden]) 选择器)
divideWidth: false, // 禁用 divide-x, divide-y 等
divideColor: false,
divideStyle: false,
divideOpacity: false,
},
}; };

Loading…
Cancel
Save