Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions controller/group_cluster.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package controller

import (
"net/http"

"github.com/QuantumNous/new-api/common"
"github.com/QuantumNous/new-api/model"
"github.com/gin-gonic/gin"
)

// GetGroupClusters 返回所有类型为 'group_cluster' 的预填充分组,供用户端令牌创建时快捷选择。
func GetGroupClusters(c *gin.Context) {
groups, err := model.GetAllPrefillGroups("group_cluster")
if err != nil {
common.SysError("failed to get group clusters: " + err.Error())
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "获取分组群失败,请稍后重试",
})
return
}
c.JSON(http.StatusOK, gin.H{
"success": true,
"message": "",
"data": groups,
})
}
1 change: 1 addition & 0 deletions router/api-router.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ func SetApiRouter(router *gin.Engine) {
selfRoute.Use(middleware.UserAuth())
{
selfRoute.GET("/self/groups", controller.GetUserGroups)
selfRoute.GET("/self/group_clusters", controller.GetGroupClusters)
selfRoute.GET("/self", controller.GetSelf)
selfRoute.GET("/models", controller.GetUserModels)
selfRoute.PUT("/self", controller.UpdateSelf)
Expand Down
64 changes: 64 additions & 0 deletions web/src/components/table/tokens/modals/EditTokenModal.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import {
Form,
Col,
Row,
Tooltip,
} from '@douyinfe/semi-ui';
import {
IconCreditCard,
Expand All @@ -62,6 +63,7 @@ const EditTokenModal = (props) => {
const formApiRef = useRef(null);
const [models, setModels] = useState([]);
const [groups, setGroups] = useState([]);
const [groupClusters, setGroupClusters] = useState([]);
const isEdit = props.editingToken.id !== undefined;

const getInitValues = () => ({
Expand Down Expand Up @@ -149,6 +151,17 @@ const EditTokenModal = (props) => {
}
};

const loadGroupClusters = async () => {
try {
const res = await API.get('/api/user/self/group_clusters');
if (res.data.success) {
setGroupClusters(res.data.data || []);
}
} catch {
// ignore
}
};

const loadToken = async () => {
setLoading(true);
let res = await API.get(`/api/token/${props.editingToken.id}`);
Expand Down Expand Up @@ -179,6 +192,7 @@ const EditTokenModal = (props) => {
}
loadModels();
loadGroups();
loadGroupClusters();
}, [props.editingToken.id]);

useEffect(() => {
Expand Down Expand Up @@ -378,6 +392,56 @@ const EditTokenModal = (props) => {
/>
)}
</Col>
{groupClusters.length > 0 && (
<Col span={24}>
<Form.Slot label={t('分组群快捷填充')}>
<Space wrap>
{groupClusters
.filter((cluster) => {
try {
const items = cluster.items
? JSON.parse(cluster.items)
: [];
return (
Array.isArray(items) && items.length === 1
);
} catch {
return false;
}
})
.map((cluster) => {
let groupName = '';
try {
groupName = JSON.parse(cluster.items)[0];
} catch {
// ignore
}
return (
<Tooltip
key={cluster.id}
content={groupName}
>
<Button
size='small'
theme='light'
onClick={() => {
if (groupName && formApiRef.current) {
formApiRef.current.setValue(
'group',
groupName,
);
}
}}
>
{cluster.name}
</Button>
</Tooltip>
);
})}
</Space>
</Form.Slot>
</Col>
)}
<Col
span={24}
style={{
Expand Down