FastGPT如何增减用户

背景

开源版本的FastGPT默认只有一个超级用户root,为了更好地管理应用和知识库,可以通过操作MongoDB数据库来增加新的用户和团队。

所需环境
  • 已安装并运行的FastGPT实例
  • MongoDB客户端工具(如Mongo Shell或Robo 3T等)
操作步骤
  1. 启动MongoDB客户端
    在命令行中启动MongoDB客户端,并连接到FastGPT使用的数据库。

  2. 增加新用户
    users集合中插入一条新记录,这条记录包含新用户的详细信息,包括用户名、密码等字段。

    db.getCollection("users").insert({username: "demo",password: "756bc47cb5215dc3329ca7e1f7be33a2dad68990bb94b76d90aa07f4e44a233a", // 请使用安全的方式加密密码status: "active",avatar: "/icon/human.svg",balance: NumberInt("100000"),promotionRate: NumberInt("10"),timezone: "Asia/Shanghai",createTime: new ISODate()
    });
    
  3. 创建新团队
    teams集合中插入一条新记录,这条记录包含团队的基本信息。

    db.getCollection("teams").insert({name: "New Team",ownerId: ObjectId("65916f1a52ac39c5d10bb505"), // 新创建用户的ObjectIdavatar: "/icon/newteam.svg",createTime: new ISODate(),balance: NumberInt("100000"),maxSize: NumberInt("10"),__v: NumberInt("0")
    });
    
  4. 将用户加入团队
    team_members集合中插入一条新记录,这条记录关联了用户和团队。

    db.getCollection("team_members").insert({teamId: ObjectId("65916f3952ac39c5d10bb506"), // 团队的ObjectIduserId: ObjectId("65916f1a52ac39c5d10bb505"), // 用户的ObjectIdname: "Owner",role: "owner",status: "active",createTime: new ISODate(),defaultTeam: true
    });
    
更方便的方式

有了这么多AI,当然可以直接增加管理页面
在这里插入图片描述

  • user.tsx
import React, { useState, useEffect } from 'react';
import {Box,Button,FormControl,FormLabel,Input,VStack,HStack,Table,Thead,Tbody,Tr,Th,Td,Modal,ModalOverlay,ModalContent,ModalHeader,ModalBody,ModalCloseButton,useDisclosure,useToast,Select,
} from '@chakra-ui/react';
import { serviceSideProps } from '@/web/common/utils/i18n';
const fetchUsers = async () => {const response = await fetch('/api/admin/users');if (!response.ok) throw new Error('Failed to fetch users');return response.json();
};const addUser = async (userData) => {const response = await fetch('/api/admin/users', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify(userData),});if (!response.ok) throw new Error('Failed to add user');return response.json();
};const updateUser = async (userId, userData) => {const response = await fetch(`/api/admin/users/${userId}`, {method: 'PUT',headers: { 'Content-Type': 'application/json' },body: JSON.stringify(userData),});if (!response.ok) throw new Error('Failed to update user');return response.json();
};const deleteUser = async (userId) => {const response = await fetch(`/api/admin/users/${userId}`, { method: 'DELETE' });if (!response.ok) throw new Error('Failed to delete user');return response.json();
};export default function UserManagement() {const [users, setUsers] = useState([]);const [currentUser, setCurrentUser] = useState(null);const { isOpen, onOpen, onClose } = useDisclosure();const toast = useToast();useEffect(() => {loadUsers();}, []);const loadUsers = async () => {try {const fetchedUsers = await fetchUsers();setUsers(fetchedUsers);} catch (error) {toast({title: "Failed to load users.",description: error.message,status: "error",duration: 3000,isClosable: true,});}};const handleAddUser = async (userData) => {try {const newUser = await addUser(userData);setUsers([...users, newUser.user]);onClose();toast({title: "User added.",status: "success",duration: 2000,isClosable: true,});} catch (error) {toast({title: "Failed to add user.",description: error.message,status: "error",duration: 3000,isClosable: true,});}};const handleUpdateUser = async (userData) => {try {const updatedUser = await updateUser(currentUser._id, userData);setUsers(users.map(user => user._id === updatedUser._id ? updatedUser : user));onClose();toast({title: "User updated.",status: "success",duration: 2000,isClosable: true,});} catch (error) {toast({title: "Failed to update user.",description: error.message,status: "error",duration: 3000,isClosable: true,});}};const handleDeleteUser = async (userId) => {try {await deleteUser(userId);setUsers(users.filter(user => user._id !== userId));toast({title: "User deleted.",status: "success",duration: 2000,isClosable: true,});} catch (error) {toast({title: "Failed to delete user.",description: error.message,status: "error",duration: 3000,isClosable: true,});}};const openAddModal = () => {setCurrentUser(null);onOpen();};const openEditModal = (user) => {setCurrentUser(user);onOpen();};return (<Box p={5}><Button onClick={openAddModal} colorScheme="blue" mb={4}>Add User</Button><Table variant="simple"><Thead><Tr><Th>Username</Th><Th>Status</Th><Th>Balance</Th><Th>Promotion Rate</Th><Th>Timezone</Th><Th>Actions</Th></Tr></Thead><Tbody>{users.map((user) => (<Tr key={user._id}><Td>{user.username}</Td><Td>{user.status}</Td><Td>{user.balance}</Td><Td>{user.promotionRate}%</Td><Td>{user.timezone}</Td><Td><HStack spacing={2}><Button size="sm" onClick={() => openEditModal(user)}>Edit</Button><Button size="sm" colorScheme="red" onClick={() => handleDeleteUser(user._id)}>Delete</Button></HStack></Td></Tr>))}</Tbody></Table><Modal isOpen={isOpen} onClose={onClose}><ModalOverlay /><ModalContent><ModalHeader>{currentUser ? 'Edit User' : 'Add User'}</ModalHeader><ModalCloseButton /><ModalBody><UserForm user={currentUser} onSubmit={currentUser ? handleUpdateUser : handleAddUser} /></ModalBody></ModalContent></Modal></Box>);
}function UserForm({ user, onSubmit }) {const [formData, setFormData] = useState(user || {username: '',password: '',status: 'active',balance: 100000,promotionRate: 10,timezone: 'Asia/Shanghai'});const handleChange = (e) => {const { name, value } = e.target;setFormData({ ...formData, [name]: value });};const handleSubmit = (e) => {e.preventDefault();onSubmit(formData);};return (<form onSubmit={handleSubmit}><VStack spacing={4}><FormControl isRequired><FormLabel>Username</FormLabel><Input name="username" value={formData.username} onChange={handleChange} /></FormControl>{!user && (<FormControl isRequired><FormLabel>Password</FormLabel><Input name="password" type="password" value={formData.password} onChange={handleChange} /></FormControl>)}<FormControl><FormLabel>Status</FormLabel><Select name="status" value={formData.status} onChange={handleChange}><option value="active">Active</option><option value="inactive">Inactive</option></Select></FormControl><FormControl><FormLabel>Balance</FormLabel><Input name="balance" type="number" value={formData.balance} onChange={handleChange} /></FormControl><FormControl><FormLabel>Promotion Rate (%)</FormLabel><Input name="promotionRate" type="number" value={formData.promotionRate} onChange={handleChange} /></FormControl><FormControl><FormLabel>Timezone</FormLabel><Input name="timezone" value={formData.timezone} onChange={handleChange} /></FormControl><Button type="submit" colorScheme="blue">{user ? 'Update' : 'Add'} User</Button></VStack></form>);
}export async function getServerSideProps(content: any) {return {props: {...(await serviceSideProps(content, ['publish', 'user']))}};
}
  • [id].js
import { connectToDatabase } from '@/service/mongo';
import { hashStr } from '@fastgpt/global/common/string/tools';
import { MongoUser } from '@fastgpt/service/support/user/schema';
import { MongoTeam } from '@fastgpt/service/support/user/team/teamSchema';
import { MongoTeamMember } from '@fastgpt/service/support/user/team/teamMemberSchema';export default async function handler(req, res) {const {query: { id },method,} = req;await connectToDatabase();switch (method) {case 'GET':try {const user = await MongoUser.findById(id).select('-password');if (!user) {return res.status(404).json({ error: 'User not found' });}res.status(200).json(user);} catch (error) {res.status(500).json({ error: 'Error fetching user' });}break;case 'PUT':try {const { username, status, avatar, balance, promotionRate, timezone, password } = req.body;const updateDoc = {username,status,avatar,balance,promotionRate,timezone,};if (password) {updateDoc.password = hashStr(password);}const user = await MongoUser.findByIdAndUpdate(id, updateDoc, {new: true,runValidators: true,}).select('-password');if (!user) {return res.status(404).json({ error: 'User not found' });}res.status(200).json(user);} catch (error) {res.status(500).json({ error: 'Error updating user' });}break;case 'DELETE':try {const deletedUser = await MongoUser.findByIdAndDelete(id);if (!deletedUser) {return res.status(404).json({ error: 'User not found' });}// Remove user from teamsawait MongoTeamMember.deleteMany({ userId: id });// Delete teams owned by this userconst ownedTeams = await MongoTeam.find({ ownerId: id });for (const team of ownedTeams) {await MongoTeamMember.deleteMany({ teamId: team._id });await MongoTeam.findByIdAndDelete(team._id);}res.status(200).json({ success: true });} catch (error) {res.status(500).json({ error: 'Error deleting user' });}break;default:res.setHeader('Allow', ['GET', 'PUT', 'DELETE']);res.status(405).end(`Method ${method} Not Allowed`);}
}
  • index.js
// pages/api/users/index.js
import { connectToDatabase } from '@/service/mongo';
import { MongoUser } from '@fastgpt/service/support/user/schema';
import { MongoTeam } from '@fastgpt/service/support/user/team/teamSchema';
import { MongoTeamMember } from '@fastgpt/service/support/user/team/teamMemberSchema';
import { hashStr } from '@fastgpt/global/common/string/tools';
import { authCert } from '@fastgpt/service/support/permission/auth/common';export default async function handler(req, res) {const { method } = req;await connectToDatabase();const { userId } = await authCert({ req, authToken: true });const curUser = await MongoUser.findById(userId).select('-password');if (curUser.username !== 'root') {return res.status(200).json([]);}switch (method) {case 'GET':try {console.log('GET /api/users', MongoUser);const users = await MongoUser.find({ username: { $ne: 'root' } }).select('-password');res.status(200).json(users);} catch (error) {console.log(error);res.status(500).json({ error: 'Error fetching users' });}break;case 'POST':try {const { username, password, status, avatar, balance, promotionRate, timezone } = req.body;// Check if user already existsconst existingUser = await MongoUser.findOne({ username });if (existingUser) {return res.status(400).json({ error: 'Username already exists' });}console.log('POST /api/users', password, hashStr(password), hashStr(hashStr(password)));// Hash passwordconst hashedPassword = hashStr(password);const newUser = new MongoUser({username,password: hashedPassword,status,avatar,balance,promotionRate,timezone,});const savedUser = await newUser.save();// Create a new team for the userconst team = new MongoTeam({name: `${username}'s Team`,ownerId: savedUser._id,});const savedTeam = await team.save();// Add user to team_membersconst teamMember = new MongoTeamMember({teamId: savedTeam._id,userId: savedUser._id,name: 'Owner',role: 'owner',defaultTeam: true,});await teamMember.save();res.status(201).json({ success: true, user: savedUser.toObject({ versionKey: false, transform: (doc, ret) => { delete ret.password; return ret; } }) });} catch (error) {console.log(error);res.status(500).json({ error: 'Error creating user' });}break;default:res.setHeader('Allow', ['GET', 'POST']);res.status(405).end(`Method ${method} Not Allowed`);}
}// pages/api/users/[id].js
  • 访问/admin/user
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/410402.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库三大范式

三大范式 一种数据库设计理念&#xff0c;意义在于降低耦合 写代码 高内聚 低耦合 一个表只有一个主键 一个主键可以是多列 ‌第一范式&#xff08;1NF&#xff09;‌&#xff1a;要求数据库表的每一列都是不可分割的原子数据项&#xff0c;即列中存储的数据是最小的数据单元&…

并发服务器

一、服务器 1.单循环服务器&#xff1a;同一时刻&#xff0c;只能处理一个客户端的任务&#xff1b; 2.并发服务器&#xff1a;同一时刻&#xff0c;可以处理多个客户端的任务&#xff1b; 3.TCP并发服务器&#xff1a; &#xff08;1&#xff09;多进程: &#xff08;2&a…

搭建面向切面编程项目

此项目在整合Mybatis基础上修改&#xff0c;可参考主页的整合Mybatis文章 注解版本 第一步 引入maven坐标 <!-- 切面编程所需jar包--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId>…

Windows 11系统 Eclipse 2024版本安装教程和环境搭建

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 Eclipse 是一个开源的集成开发环境 (IDE)&#xff0c;主要用于 Java 开发&#xff0c;但也支持其他编程语言如 C、Python 和 PHP。它提供了丰富的工具和插件&#xff0c;用于编写、调试和管理代码&#x…

安卓13 背光反向 亮度反向 android13 backlight reverse

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.代码分析 4.代码修改 5.彩蛋 1.前言 有些设备,在调整背光的时候,会发现,背光调大,显示亮度反而变暗,背光调小,亮度变亮。这是由于PWM背光本身并没有一个标准去决定怎么样算是高亮度,怎么算是低亮度。因…

《黑神话·悟空》是用什么编程语言开发的?

最近火爆全球的国产 3A 大作《黑神话悟空》&#xff0c;你玩了吗&#xff1f;没玩没关系&#xff0c;有人就是对游戏不感冒&#xff0c;我找了个宣发片&#xff0c;一起感受下3A大作的视觉冲击&#xff0c;而且还是我们从小听到大&#xff0c;那猴子&#x1f412;的故事。 ‌‌…

Onnx使用预训练的 ResNet18 模型对输入图像进行分类,并将分类结果显示在图像上

目录 一、整体功能概述 二、函数分析 2.1 resnet() 函数&#xff1a; 2.2 pre_process(img_path) 函数&#xff1a; 2.3 loadOnnx(img_path) 函数&#xff1a; 三、代码执行流程 一、整体功能概述 这段代码实现了一个图像分类系统&#xff0c;使用预训练的 ResNet18 模型对…

设计模式26-解析器模式

设计模式26-解析器模式 动机定义与结构定义结构 C代码推导代码说明 优缺点应用总结 动机 在软件构建过程中&#xff0c;如果某一特定领域的问题比较复杂&#xff0c;类似结构会不断重复的出现。如果使用普通的编程方式来实现&#xff0c;将面临非常频繁的变化。 在这种情况下&…

无人机 PX4 飞控 | ROS应用层开发:指令(字符串)订阅功能

无人机 PX4 飞控 | ROS应用层开发&#xff1a;指令&#xff08;字符串&#xff09;订阅功能 指令&#xff08;字符串&#xff09;订阅功能代码测试 指令&#xff08;字符串&#xff09;订阅功能 为了通过键盘触发mavros 的不同功能&#xff0c;需要实现一个订阅字符串的功能 该…

【国外比较权威的免费的卫星数据网站】

国外比较权威的免费卫星数据网站有多个&#xff0c;它们各自在数据覆盖范围、分辨率、以及数据种类等方面具有不同的特点和优势。以下是一些推荐的网站&#xff1a; NASA Worldview 网址&#xff1a;https://worldview.earthdata.nasa.gov/简介&#xff1a;NASA Worldview显示…

p10 容器的基本命令

首先先拉取一个centos的镜像 命令&#xff1a;docker pull centos 新建容器并且启动 这里直接参考老师的命令吧 接下来是启动并且进入到容器当中去输入docker run -it centos /bin/bash这里是以交互的方式进入到容器中可以看到接下来的ls命令输出的东西就是一个Linux系统最…

Python和MATLAB和R对比敏感度函数导图

&#x1f3af;要点 深度学习网络两种选择的强制选择对比度检测贝叶斯自适应估计对比敏感度函数空间观察对比目标量化视觉皮质感知差异亮度、红/绿值、蓝/黄值色彩空间改变OpenCV图像对比度对比敏感度函数模型空间对比敏感度估计眼球运动医学研究空间时间颜色偏心率对比敏感度函…

mysql 不同版本安装不同端口

安装版本为Mysql8.0.11 先解压&#xff0c;解压后&#xff0c;包下创建my.ini文件内容如下&#xff1a; 注意&#xff1a;端口不能给别的mysql一样 [mysqld]# 设置3306端口port3307 # 自定义设置mysql的安装目录&#xff0c;即解压mysql压缩包的目录basedirD:\\rj\\mysql8.0.…

模型 SPIN销售法

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。探需挖痛&#xff0c;引导成交。 1 SPIN销售法的应用 1.1 提升工作效率的软件销售应用SPIN模型 一家制造企业正在寻求提升工作效率的解决方案。他们注意到员工在处理文件和任务时存在效率问题&#…

【Docker】Linux系统以及威联通QNAP部署思源笔记的通用教程

本文首发于 ❄️慕雪的寒舍 本文测试的是旧版本v2.11.4的部署方式&#xff0c;实测当前&#xff08;2024.08.15&#xff09;最新的v3.1.3版本也可以用相同的方式部署。本文的部署方式共写了三种&#xff0c;非qnap的linux系统也可以参考本文部署思源笔记。 阅读本文之前&#…

新审视零阶优化在内存高效大模型微调中的应用

人工智能咨询培训老师叶梓 转载标明出处 随着大模型模型规模的增大&#xff0c;反向传播&#xff08;BP&#xff09;所需的内存开销也日益增加&#xff0c;这对内存效率提出了挑战。尤其是在设备上训练等内存效率至关重要的应用场景中&#xff0c;解决这一问题变得尤为迫切。 …

【Linux】07.Linux 下的项目自动化构建工具——make/makefile

前言 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的规则来指定&#xff0c;哪些文件需要先编译&#xff0c;哪些文件需要…

【Datawhale X 李宏毅苹果书 AI夏令营】Task1笔记

第三章&#xff1a;深度学习基础 3.1 局部极小值与鞍点 临界点&#xff0c;即梯度为零的点&#xff0c;包含局部极小值&#xff08;local minimum&#xff09;和鞍点&#xff08;saddle point&#xff09;。 梯度下降算法在接近鞍点的时候会变得非常慢&#xff0c;阻碍了继续…

机器学习:K-means算法(内有精彩动图)

目录 前言 一、K-means算法 1.K-means算法概念 2.具体步骤 3.精彩动图 4.算法效果评价 二、代码实现 1.完整代码 2.结果展示 3.步骤解析 1.数据预处理 2.建立并训练模型 3.打印图像 四、算法优缺点 1.优点 2.缺点 总结 前言 机器学习里除了分类算法&#xff0…

如何使用ssm实现计算机科学与技术学习网站的设计与开发

TOC ssm248计算机科学与技术学习网站的设计与开发jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&…