update login cache

master
masong 5 months ago
parent 85f698abb9
commit df3ebd09b2
  1. 17
      configs/dbgpt-proxy-deepseek.toml
  2. 2
      packages/dbgpt-app/src/dbgpt_app/dbgpt_server.py
  3. 0
      packages/dbgpt-core/src/dbgpt/redis/__init__.py
  4. 13
      packages/dbgpt-core/src/dbgpt/redis/redis.py
  5. 0
      packages/dbgpt-system/src/dbgpt_system/__init__.py
  6. 73
      packages/dbgpt-system/src/dbgpt_system/login.py
  7. 0
      packages/dbgpt-system/src/dbgpt_system/system_user/__init__.py
  8. 66
      packages/dbgpt-system/src/dbgpt_system/system_user/controller.py
  9. 166
      packages/dbgpt-system/src/dbgpt_system/system_user/user.py
  10. 191
      packages/dbgpt-system/src/dbgpt_system/system_user/user_db.py
  11. 5
      pyproject.toml
  12. 10508
      uv.lock

@ -7,13 +7,20 @@ encrypt_key = "your_secret_key"
# Server Configurations
[service.web]
host = "0.0.0.0"
port = 5670
port = 5678
[service.web.database]
type = "sqlite"
path = "pilot/meta_data/dbgpt.db"
[service.model.worker]
type = "mysql"
host = "127.0.0.1"
port = 3306
user = "root"
database = "cjy_agent"
password = "root"
[[service.web.redis]]
host = "127.0.0.1"
port = 6379
password = "123"
database = 0
[rag.storage]
[rag.storage.vector]
@ -26,7 +33,7 @@ persist_path = "pilot/data"
name = "deepseek-reasoner"
# name = "deepseek-chat"
provider = "proxy/deepseek"
api_key = "your_deepseek_api_key"
api_key = "sk-dd044fbc9f1643d4983fa00df562fd23"
[[models.embeddings]]
name = "BAAI/bge-large-zh-v1.5"

@ -279,7 +279,7 @@ def load_config(config_file: str = None) -> ApplicationConfig:
from dbgpt.configs.model_config import ROOT_PATH as DBGPT_ROOT_PATH
if config_file is None:
config_file = os.path.join(DBGPT_ROOT_PATH, "configs", "dbgpt-siliconflow.toml")
config_file = os.path.join(DBGPT_ROOT_PATH, "configs", "dbgpt-proxy-deepseek.toml")
elif not os.path.isabs(config_file):
# If config_file is a relative path, make it relative to DBGPT_ROOT_PATH
config_file = os.path.join(DBGPT_ROOT_PATH, config_file)

@ -0,0 +1,13 @@
from redis import Redis
from fastapi import FastAPI
app = FastAPI()
# 初始化 redis 连接(带密码)
redis_client = Redis(
host= "192.168.130.154",
port = 6379,
password = "cjy@123",
db=9,
decode_responses=True
)

@ -0,0 +1,73 @@
import re
import uuid
import json
from dbgpt_app.openapi.api_view_model import Result
from dbgpt._private.pydantic import BaseModel, Field,field_validator
from dbgpt_system.system_user.user_db import UserDao
from dbgpt.redis.redis import redis_client
from dbgpt_serve.utils.auth import UserRequest, get_user_from_headers
from fastapi import APIRouter, Depends
router = APIRouter()
userDao = UserDao()
class AuthLogin(BaseModel):
username: str
password: str
verificationCode: str | None = None
# 验证用户名
@field_validator('username')
def validate_username(cls,v):
if not v:
raise ValueError('用户名不能为空')
#只允许英文、数据和特殊字符 !@#$%^&*
pattern = r'^[a-zA-Z0-9!@#$%^&*()]{5,20}$'
if not re.fullmatch(pattern,v):
raise ValueError('用户名必须为5-20个字符')
return v
# 验证密码
@field_validator('password')
def validate_password(cls,v):
if not v:
raise ValueError('密码不能为空')
# 只允许英文、数字和特殊字符
pattern = r'^[a-zA-Z0-9!@#$%^&*()]{5,100}$'
if not re.fullmatch(pattern, v):
raise ValueError('密码必须为5-20个字符,只能包含英文、数字或!@#$%^&*()')
return v
@router.post("/doLogin")
async def dologin( authLogin :AuthLogin):
rt = userDao.select_user(authLogin)
if rt is not None:
loginUser = {
"id": rt.id,
"username": rt.username,
"password": rt.password,
"nick_name": rt.nick_name,
"sex": rt.sex,
"phone": rt.phone,
"dept_id": rt.dept_id,
"status": rt.status,
"avatar": rt.avatar,
"email": rt.email,
}
print(json.dumps(loginUser))
random_str = uuid.uuid4().hex
uuids_str = random_str[:24]
redis_client.set("oauth_access_token:"+ uuids_str,json.dumps(loginUser, ensure_ascii=False), ex=36000)
return Result.succ(uuids_str)
else:
return Result.failed(code="301", msg=f"账号或密码错误,请重新输入")
@router.put("/loginOut")
async def loginOut(
Authorization: Optional[str] = Header(None)):
if Authorization is None:
return Result.succ("账号已退出")
redis_client.delete("oauth_access_token:"+Authorization.replace("Bearer ", ""))
return Result.succ("账号已退出")

@ -0,0 +1,66 @@
from typing import Optional
from dbgpt_app.openapi.api_view_model import Result
from fastapi import APIRouter, Depends,Header
from dbgpt_system.system_user.user_db import UserDao
from dbgpt_system.system_user.user import UserQuery,UserSave,UserUpdate,UserPassword
router = APIRouter()
userDao = UserDao()
@router.get("/list",response_model=Result)
async def select_user_list(
user_query: UserQuery = Depends()
):
res = userDao.select_user_page(user_query)
return Result.succ(res)
@router.get("/{user_id}")
async def select_user_details(user_id: int):
try:
return Result.succ(userDao.select_user_details(user_id))
except Exception as ex:
return Result.failed( msg=f"query user error: {ex}")
@router.post("/create")
async def create_user( user:UserSave):
try:
# 验证账号是否已存在
isok = userDao.select_user_by_username(user.username)
if isok:
return Result.failed( msg="账户名称已经存在,请更换其他账号")
return Result.succ(userDao.create(user))
except Exception as ex:
print(ex)
return Result.failed(msg=f"create user error: {ex}")
@router.put("/update")
async def update_user(user:UserUpdate):
try:
return Result.succ( userDao.update(user))
except Exception as ex:
print(ex)
return Result.failed(msg=f"update user error: {ex}")
@router.put("/update/{user_id}/{status}")
async def update_user_status(user_id: int,status: str):
try:
return Result.succ(userDao.update_status(user_id, status))
except Exception as ex:
print(ex)
return Result.failed(msg=f"update user error: {ex}")
@router.put("/update-pwd")
async def update_user_password(user_password: UserPassword):
try:
return Result.succ(userDao.update_user_password(user_password.id, user_password.password))
except Exception as ex:
print(ex)
return Result.failed(msg=f"update user error: {ex}")
@router.delete("/delete/{user_id}")
async def delete_user(user_id:int):
try:
return Result.succ(userDao.delete_user(user_id))
except Exception as ex:
print(ex)
return Result.failed(msg=f"update user error: {ex}")

@ -0,0 +1,166 @@
import re
from dbgpt._private.pydantic import BaseModel,ConfigDict,Field,field_validator
from typing import Any, Dict, List, Optional
from dbgpt.storage.metadata import Model
from datetime import datetime
from sqlalchemy import (
Column,
DateTime,
Integer,
String,
)
class User(BaseModel):
model_config = ConfigDict(arbitrary_types_allowed=True)
id: Optional[int] = None
username: Optional[str] = None
nick_name: Optional[str] = None
sex: Optional[str] = None
phone: Optional[str] = None
dept_id: Optional[int] = 0
status: Optional[str] = '0'
avatar: Optional[str] = None
email: Optional[str] = None
remark: Optional[str] = None
create_time: Optional[datetime] = None
creator: Optional[str] = None
post_ids: Optional[str] = ''
def to_dict(self):
return {k: self._serialize(v) for k, v in self.__dict__.items()}
def _serialize(self, value):
if isinstance(value, BaseModel):
return value.to_dict()
elif isinstance(value, list):
return [self._serialize(item) for item in value]
elif isinstance(value, dict):
return {k: self._serialize(v) for k, v in value.items()}
else:
return value
@classmethod
def from_dict(cls,d:Dict[str,Any]):
return cls(
id = d.get("id",None),
username = d.get("username",None),
nick_name = d.get("nick_name",None),
sex = d.get("sex",None),
phone = d.get("phone",None),
dept_id = d.get("dept_id",None),
status = d.get("status",None),
avatar = d.get("avatar",None),
email = d.get("email",None),
remark = d.get("remark",None),
create_time=d.get("create_time", None),
creator=d.get("creator", None),
post_ids=d.get("post_ids",None)
)
class UserSave(BaseModel):
username: Optional[str] = None
nick_name: Optional[str] = None
password: Optional[str] = None
sex: Optional[str] = None
phone: Optional[str] = None
dept_id: Optional[int] = 0
status: Optional[str] = '0'
avatar: Optional[str] = None
email: Optional[str] = None
remark: Optional[str] = None
create_time: Optional[datetime] = None
creator: Optional[str] = None
post_ids: Optional[str] = ''
@field_validator('username')
def validate_username(cls, v):
if not v:
raise ValueError("用户账号不能为空")
pattern = r'^[a-zA-Z0-9!@#$%^&*()]{5,20}$'
if not re.fullmatch(pattern, v):
raise ValueError('用户名必须为5-20个字符')
return v
@field_validator('nick_name')
def validate_nickname(cls, v):
if not v:
raise ValueError("用户昵称不能为空")
pattern = r'^.{1,20}$'
if not re.fullmatch(pattern, v):
raise ValueError('昵称长度必须为1-20个字符')
return v
@field_validator('password')
def validate_password(cls, v):
if not v:
raise ValueError("密码不能为空")
pattern = r'^[a-zA-Z0-9!@#$%^&*()]{5,100}$'
if not re.fullmatch(pattern, v):
raise ValueError('密码必须为5-20个字符,只能包含英文、数字或!@#$%^&*()')
return v
class UserUpdate(BaseModel):
id: Optional[int] = None
nick_name: Optional[str] = None
sex: Optional[str] = None
phone: Optional[str] = None
dept_id: Optional[int] = 0
status: Optional[str] = '0'
avatar: Optional[str] = None
email: Optional[str] = None
remark: Optional[str] = None
post_ids: Optional[str] = ''
@field_validator('nick_name')
def validate_nickname(cls, v):
if not v:
raise ValueError("用户昵称不能为空")
pattern = r'^.{1,20}$'
if not re.fullmatch(pattern, v):
raise ValueError('昵称长度必须为1-20个字符')
return v
class UserPassword(BaseModel):
id: Optional[int] = None
password: Optional[str] = None
@field_validator('password')
def validate_password(cls, v):
if not v:
raise ValueError("密码不能为空")
pattern = r'^[a-zA-Z0-9!@#$%^&*()]{5,100}$'
if not re.fullmatch(pattern, v):
raise ValueError('密码必须为5-100个字符,只能包含英文、数字或!@#$%^&*()')
return v
class UserEntity(Model):
__tablename__ ="sys_user"
id=Column(Integer,primary_key=True)
username=Column(String(255))
password=Column(String(255))
nick_name=Column(String(255))
sex= Column(String(1))
phone= Column(String(20))
dept_id=Column(Integer)
status=Column(String(1))
avatar= Column(String(255))
email=Column(String(255))
remark=Column(String(255))
login_ip=Column(String(255))
login_date=Column(DateTime)
create_time=Column(DateTime)
creator=Column(String(255))
deleted=Column(Integer)
post_ids=Column(String(255))
update_by=Column(String(50))
update_time=Column(DateTime)
class UserQuery(User):
page_size: int = 100
page: int = 1
class UserResponse(BaseModel):
total_count: Optional[int] = 0
total_page: Optional[int] = 0
current_page: Optional[int] = 0
user_list: Optional[List[User]] = Field(
default_factory=list,description="user list"
)

@ -0,0 +1,191 @@
from dbgpt.storage.metadata import BaseDao
from dbgpt_system.user.user import UserEntity,UserQuery,UserResponse,User,UserSave,UserUpdate
from datetime import datetime
userEntity =UserEntity
class UserDao(BaseDao):
def select_user(self, user: UserEntity):
session = self.get_raw_session()
result = (
session.query(userEntity)
.filter(userEntity.username == user.username)
.filter(userEntity.password == user.password)
.filter(userEntity.status == '0')
.filter(userEntity.deleted == 0)
.first()
)
session.close()
return result
def select_user_page(self,user_query: UserQuery):
session = self.get_raw_session()
try:
user_qry = session.query(UserEntity).filter(UserEntity.deleted == '0')
if(user_query.username):
user_qry = user_qry.filter(
UserEntity.username.like(f"%{user_query.username}%")
)
if(user_query.nick_name):
user_qry = user_qry.filter(
UserEntity.nick_name.like(f"%{user_query.nick_name}%")
)
if(user_query.phone):
user_qry = user_qry.filter(
UserEntity.phone.like(f"%{user_query.phone}%")
)
if(user_query.status):
user_qry = user_qry.filter(
UserEntity.status == user_query.status
)
if (user_query.dept_id):
user_qry = user_qry.filter(
UserEntity.dept_id == user_query.dept_id
)
total_count = user_qry.count()
user_qry = user_qry.order_by(UserEntity.id.desc())
user_qry = user_qry.offset((user_query.page - 1) * user_query.page_size).limit(
user_query.page_size
)
results = user_qry.all()
finally:
session.close()
if results is not None:
users = []
user_resp = UserResponse()
for user in results:
users.append(
User.from_dict(
{
"id": user.id,
"username": user.username,
"nick_name": user.nick_name,
"sex": user.sex,
"phone": user.phone,
"dept_id": user.dept_id,
"status": user.status,
"remark": user.remark,
"create_time": user.create_time,
"post_ids": user.post_ids,
}
)
)
user_resp.total_count = total_count
user_resp.user_list = users
user_resp.current_page = user_query.page
user_resp.total_page = (total_count + user_query.page_size - 1) // user_query.page_size
return user_resp
def select_user_details(self,user_id: int):
session = self.get_raw_session()
try:
user_qry = session.query(UserEntity).filter(UserEntity.deleted == '0',UserEntity.id == user_id)
user_details = user_qry.first()
finally:
session.close()
return User.from_dict(
{
"id": user_details.id,
"username": user_details.username,
"nick_name": user_details.nick_name,
"sex": user_details.sex,
"phone": user_details.phone,
"dept_id": user_details.dept_id,
"status": user_details.status,
"remark": user_details.remark,
"create_time": user_details.create_time,
"post_ids": user_details.post_ids,
}
)
def create(self, user: UserSave):
try:
with self.session() as session:
user_entity = UserEntity(
username= user.username,
password= user.password,
nick_name= user.nick_name,
sex = user.sex,
phone = user.phone,
dept_id= user.dept_id,
status= '0',
avatar= user.avatar,
email= user.email,
remark= user.remark,
post_ids=user.post_ids,
creator= '1',
deleted = 0,
create_time= datetime.now()
)
session.add(user_entity)
session.commit()
session.close()
return True
except Exception as e:
session.rollback()
raise RuntimeError(f"创建用户失败: {str(e)}")
def select_user_by_username(self,username: str):
session = self.get_raw_session()
try:
user_qry = session.query(UserEntity).filter(UserEntity.deleted == '0', UserEntity.username == username)
user_details = user_qry.first()
finally:
session.close()
if user_details is not None:
return True
else:
return False
def update(self,user: UserUpdate):
session = self.get_raw_session()
with self.session() as session:
user_entity = session.query(UserEntity).filter_by(id=user.id,deleted=0).first()
if user_entity:
user_entity.nick_name = user.nick_name
user_entity.sex = user.sex
user_entity.phone = user.phone
user_entity.dept_id = user.dept_id
user_entity.avatar = user.avatar
user_entity.email = user.email
user_entity.remark = user.remark
user_entity.post_ids = user.post_ids
user_entity.updater = '1'
user_entity.update_time = datetime.now()
session.commit()
else:
raise ValueError("用户不存在或已被删除")
session.close()
return True
def update_status(self,user_id:int,status:str):
with self.session() as session:
user_entity = session.query(UserEntity).filter_by(id=user_id, deleted=0).first()
if user_entity:
user_entity.status = status
else:
raise ValueError("用户不存在或已被删除")
session.close()
return True
def update_user_password(self,user_id: int, password:str):
with self.session() as session:
user_entity = session.query(UserEntity).filter_by(id=user_id, deleted=0).first()
if user_entity:
user_entity.password = password
else:
raise ValueError("用户不存在或已被删除")
session.close()
return True
def delete_user(self,user_id:int):
with self.session() as session:
user_entity = session.query(UserEntity).filter_by(id=user_id, deleted=0).first()
if user_entity:
user_entity.deleted = "1"
else:
raise ValueError("用户不存在或已被删除")
session.close()
return True

@ -8,7 +8,10 @@ large models to interact with your data and environment. With this solution, you
authors = [
{ name = "csunny", email = "cfqcsunny@gmail.com" }
]
dependencies = []
dependencies = [
"redis>=6.1.0",
"sentence-transformers>=4.1.0",
]
readme = "README.md"
requires-python = ">= 3.10"

10508
uv.lock

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save