Kaynağa Gözat

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.
CalciumIon 1 yıl önce
ebeveyn
işleme
8129aa76f9
2 değiştirilmiş dosya ile 60 ekleme ve 30 silme
  1. 28 3
      controller/pricing.go
  2. 32 27
      web/src/components/ModelPricing.js

+ 28 - 3
controller/pricing.go

@@ -8,10 +8,35 @@ import (
 
 func GetPricing(c *gin.Context) {
 	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{
-		"success":     true,
-		"data":        pricing,
-		"group_ratio": common.GroupRatio,
+		"success":      true,
+		"data":         pricing,
+		"group_ratio":  groupRatio,
+		"usable_group": usableGroup,
 	})
 }
 

+ 32 - 27
web/src/components/ModelPricing.js

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