feat(shop): 新增文章管理功能

- 添加文章列表页面,支持搜索、分页加载、下拉刷新等功能
- 实现文章详情查看、编辑和删除功能- 新增文章发布页面,支持富文本编辑和图片上传
- 优化地址管理页面,统一底部按钮样式
- 新增 FixedButton 组件用于底部固定按钮
This commit is contained in:
2025-08-13 02:54:28 +08:00
parent 9dabda3d47
commit 0e457f66d8
8 changed files with 686 additions and 189 deletions

View File

@@ -6,8 +6,9 @@ import Taro from '@tarojs/taro'
import {View} from '@tarojs/components'
import {Address} from '@nutui/nutui-react-taro'
import {ShopUserAddress} from "@/api/shop/shopUserAddress/model";
import {getShopUserAddress, listShopUserAddress, updateShopUserAddress} from "@/api/shop/shopUserAddress";
import {getShopUserAddress, listShopUserAddress, updateShopUserAddress, addShopUserAddress} from "@/api/shop/shopUserAddress";
import RegionData from '@/api/json/regions-data.json';
import FixedButton from "@/components/FixedButton";
const AddUserAddress = () => {
const {params} = useRouter();
@@ -19,13 +20,29 @@ const AddUserAddress = () => {
const [inputText, setInputText] = useState<string>('')
const formRef = useRef<any>(null)
// 判断是编辑还是新增模式
const isEditMode = !!params.id
const addressId = params.id ? Number(params.id) : undefined
const reload = async () => {
const address = await getShopUserAddress(Number(params.id))
setFormData(address)
// 设置所在地区
setText(`${address.province} ${address.city} ${address.region}`)
// 整理地区数据
setRegionData()
// 如果是编辑模式,加载地址数据
if (isEditMode && addressId) {
try {
const address = await getShopUserAddress(addressId)
setFormData(address)
// 设置所在地区
setText(`${address.province} ${address.city} ${address.region}`)
} catch (error) {
console.error('加载地址失败:', error)
Taro.showToast({
title: '加载地址失败',
icon: 'error'
});
}
}
}
/**
@@ -195,43 +212,72 @@ const AddUserAddress = () => {
// 提交表单
const submitSucceed = async (values: any) => {
try {
// 准备提交的数据
const submitData = {
...values,
province: FormData.province,
city: FormData.city,
region: FormData.region,
isDefault: true // 新增或编辑的地址都设为默认地址
};
const defaultAddress = await listShopUserAddress({isDefault: true})
if(!defaultAddress) return
// 如果是编辑模式添加id
if (isEditMode && addressId) {
submitData.id = addressId;
}
const setNotDefault = await updateShopUserAddress({
...defaultAddress[0],
isDefault: false
})
if(!setNotDefault) return
// 先处理默认地址逻辑
const defaultAddress = await listShopUserAddress({isDefault: true});
if (defaultAddress && defaultAddress.length > 0) {
// 如果当前编辑的不是默认地址,或者是新增地址,需要取消其他默认地址
if (!isEditMode || (isEditMode && defaultAddress[0].id !== addressId)) {
await updateShopUserAddress({
...defaultAddress[0],
isDefault: false
});
}
}
// 执行新增或更新操作
if (isEditMode) {
await updateShopUserAddress(submitData);
} else {
await addShopUserAddress(submitData);
}
updateShopUserAddress({
...values,
id: Number(params.id),
province: FormData.province,
city: FormData.city,
region: FormData.region
}).then(() => {
Taro.showToast({title: `保存成功`, icon: 'success'})
setTimeout(() => {
return Taro.navigateBack()
}, 1000)
}).catch(() => {
Taro.showToast({
title: '保存失败',
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>
@@ -246,25 +292,6 @@ const AddUserAddress = () => {
labelPosition="left"
onFinish={(values) => submitSucceed(values)}
onFinishFailed={(errors) => submitFailed(errors)}
footer={
<div
style={{
display: 'flex',
justifyContent: 'center',
width: '100%'
}}
>
<Button
nativeType="submit"
type="success"
size="large"
className={'w-full'}
block
>
使
</Button>
</div>
}
>
<CellGroup className={'px-3'}>
<div
@@ -336,6 +363,9 @@ const AddUserAddress = () => {
}}
onClose={() => setVisible(false)}
/>
{/* 底部浮动按钮 */}
<FixedButton text={isEditMode ? '更新地址' : '保存并使用'} onClick={submitSucceed} />
</>
);
};

View File

@@ -5,6 +5,7 @@ import {Dongdong, ArrowRight, CheckNormal, Checked} from '@nutui/icons-react-tar
import {View} from '@tarojs/components'
import {ShopUserAddress} from "@/api/shop/shopUserAddress/model";
import {listShopUserAddress, removeShopUserAddress, updateShopUserAddress} from "@/api/shop/shopUserAddress";
import FixedButton from "@/components/FixedButton";
const Address = () => {
const [list, setList] = useState<ShopUserAddress[]>([])
@@ -144,17 +145,8 @@ 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>
{/* 底部浮动按钮 */}
<FixedButton text={'新增地址'} onClick={() => Taro.navigateTo({url: '/user/address/add'})} />
</>
);
};

View File

@@ -2,7 +2,7 @@ import {useEffect} from "react";
import Taro from '@tarojs/taro'
import {addShopUserAddress} from "@/api/shop/shopUserAddress";
const Address = () => {
const WxAddress = () => {
/**
* 从微信API获取用户收货地址
* 调用微信原生地址选择界面,获取成功后保存到服务器并刷新列表
@@ -64,4 +64,4 @@ const Address = () => {
);
};
export default Address;
export default WxAddress;