Преглед изворни кода

feat: add dedicated API for user channel binding selection

Add a new /api/user/channels endpoint that returns only enabled channels
with non-sensitive fields (id, name, type, remark) for token channel binding.
Update EditTokenModal to use this endpoint and display remark instead of ID
in the channel dropdown.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
feat/alipay-payment
fengsilin пре 1 месец
родитељ
комит
352806c099
4 измењених фајлова са 43 додато и 2 уклоњено
  1. +27
    -0
      controller/channel.go
  2. +11
    -0
      model/channel.go
  3. +1
    -0
      router/api-router.go
  4. +4
    -2
      web/src/components/table/tokens/modals/EditTokenModal.jsx

+ 27
- 0
controller/channel.go Прегледај датотеку

@@ -2094,3 +2094,30 @@ func OllamaVersion(c *gin.Context) {
},
})
}

// GetUserChannelsForBinding 获取用户可用于绑定的渠道列表
// 只返回 id、name、type 和 remark,不包含敏感信息(如key)
func GetUserChannelsForBinding(c *gin.Context) {
channels, err := model.GetAllChannelsForBinding()
if err != nil {
common.ApiError(c, err)
return
}

// 构建返回结果
result := make([]gin.H, 0, len(channels))
for _, ch := range channels {
result = append(result, gin.H{
"id": ch.Id,
"name": ch.Name,
"type": ch.Type,
"remark": ch.Remark,
})
}

c.JSON(http.StatusOK, gin.H{
"success": true,
"message": "",
"data": result,
})
}

+ 11
- 0
model/channel.go Прегледај датотеку

@@ -275,6 +275,17 @@ func GetAllChannels(startIdx int, num int, selectAll bool, idSort bool) ([]*Chan
return channels, err
}

// GetAllChannelsForBinding 获取所有启用的渠道(用于用户绑定渠道)
// 只返回 id, name, type, remark,不包含敏感信息
func GetAllChannelsForBinding() ([]*Channel, error) {
var channels []*Channel
err := DB.Select("id, name, type, remark").
Where("status = ?", common.ChannelStatusEnabled).
Order("priority desc").
Find(&channels).Error
return channels, err
}

func GetChannelsByTag(tag string, idSort bool, selectAll bool) ([]*Channel, error) {
var channels []*Channel
order := "priority desc"


+ 1
- 0
router/api-router.go Прегледај датотеку

@@ -70,6 +70,7 @@ func SetApiRouter(router *gin.Engine) {
selfRoute.GET("/self/groups", controller.GetUserGroups)
selfRoute.GET("/self", controller.GetSelf)
selfRoute.GET("/models", controller.GetUserModels)
selfRoute.GET("/channels", controller.GetUserChannelsForBinding)
selfRoute.PUT("/self", controller.UpdateSelf)
selfRoute.DELETE("/self", controller.DeleteSelf)
selfRoute.GET("/token", controller.GenerateAccessToken)


+ 4
- 2
web/src/components/table/tokens/modals/EditTokenModal.jsx Прегледај датотеку

@@ -152,11 +152,13 @@ const EditTokenModal = (props) => {
};

const loadChannels = async () => {
let res = await API.get(`/api/channel/`);
let res = await API.get(`/api/user/channels`);
const { success, message, data } = res.data;
if (success) {
let localChannelOptions = (data || []).map((channel) => ({
label: `${channel.name} (ID: ${channel.id})`,
label: channel.remark
? `${channel.name} (${channel.remark})`
: channel.name,
value: channel.id,
}));
setChannels(localChannelOptions);


Loading…
Откажи
Сачувај