parent
85f698abb9
commit
df3ebd09b2
@ -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 |
Loading…
Reference in new issue