feat: Enhance pricing functionality with user group support

- Updated the GetPricing function in the backend to include user group information, allowing for dynamic adjustment of group ratios based on the user's group.
- Implemented logic to filter group ratios based on the user's usable groups, improving the accuracy of pricing data returned.
- Modified the ModelPricing component to utilize the new usable group data, ensuring only relevant groups are displayed in the UI.
- Enhanced state management in the frontend to accommodate the new usable group information, improving user experience and data consistency.
This commit is contained in:
CalciumIon
2024-12-24 19:23:29 +08:00
parent fb8595da18
commit 8129aa76f9
2 changed files with 60 additions and 30 deletions

View File

@@ -8,10 +8,35 @@ import (
func GetPricing(c *gin.Context) { func GetPricing(c *gin.Context) {
pricing := model.GetPricing() pricing := model.GetPricing()
userId, exists := c.Get("id")
usableGroup := map[string]string{}
groupRatio := common.GroupRatio
var group string
if exists {
user, err := model.GetChannelById(userId.(int), false)
if err != nil {
c.JSON(200, gin.H{
"success": false,
"message": err.Error(),
})
return
}
group = user.Group
}
usableGroup = common.GetUserUsableGroups(group)
// check groupRatio contains usableGroup
for group := range common.GroupRatio {
if _, ok := usableGroup[group]; !ok {
delete(groupRatio, group)
}
}
c.JSON(200, gin.H{ c.JSON(200, gin.H{
"success": true, "success": true,
"data": pricing, "data": pricing,
"group_ratio": common.GroupRatio, "group_ratio": groupRatio,
"usable_group": usableGroup,
}) })
} }

View File

@@ -162,36 +162,39 @@ const ModelPricing = () => {
title: t('可用分组'), title: t('可用分组'),
dataIndex: 'enable_groups', dataIndex: 'enable_groups',
render: (text, record, index) => { render: (text, record, index) => {
// enable_groups is a string array // enable_groups is a string array
return ( return (
<Space> <Space>
{text.map((group) => { {text.map((group) => {
if (group === selectedGroup) { if (usableGroup[group]) {
return ( if (group === selectedGroup) {
<Tag return (
color='blue' <Tag
size='large' color='blue'
prefixIcon={<IconVerify />} size='large'
> prefixIcon={<IconVerify />}
{group} >
</Tag> {group}
); </Tag>
} else { );
return ( } else {
<Tag return (
color='blue' <Tag
size='large' color='blue'
onClick={() => { size='large'
setSelectedGroup(group); onClick={() => {
showInfo(t('当前查看的分组为:{{group}},倍率为:{{ratio}}', { setSelectedGroup(group);
group: group, showInfo(t('当前查看的分组为:{{group}},倍率为:{{ratio}}', {
ratio: groupRatio[group] group: group,
})); ratio: groupRatio[group]
}} }));
> }}
{group} >
</Tag> {group}
); </Tag>
);
}
} }
})} })}
</Space> </Space>
@@ -275,6 +278,7 @@ const ModelPricing = () => {
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
const [userState, userDispatch] = useContext(UserContext); const [userState, userDispatch] = useContext(UserContext);
const [groupRatio, setGroupRatio] = useState({}); const [groupRatio, setGroupRatio] = useState({});
const [usableGroup, setUsableGroup] = useState({});
const setModelsFormat = (models, groupRatio) => { const setModelsFormat = (models, groupRatio) => {
for (let i = 0; i < models.length; i++) { for (let i = 0; i < models.length; i++) {
@@ -309,9 +313,10 @@ const ModelPricing = () => {
let url = ''; let url = '';
url = `/api/pricing`; url = `/api/pricing`;
const res = await API.get(url); const res = await API.get(url);
const { success, message, data, group_ratio } = res.data; const { success, message, data, group_ratio, usable_group } = res.data;
if (success) { if (success) {
setGroupRatio(group_ratio); setGroupRatio(group_ratio);
setUsableGroup(usable_group);
setSelectedGroup(userState.user ? userState.user.group : 'default') setSelectedGroup(userState.user ? userState.user.group : 'default')
setModelsFormat(data, group_ratio); setModelsFormat(data, group_ratio);
} else { } else {