瀏覽代碼

no message

libushang 1 月之前
父節點
當前提交
3f2c793eba

+ 5 - 5
common/TassApi.py

@@ -8,25 +8,25 @@ API_ROOT = "http://127.0.0.1:8052/tass"
 # 隐私信息加密
 def CipherEncrypt(data: str) -> str:
     resp = __post_data(API_ROOT + "/CipherEncrypt", data)
-    print("隐私信息加密 >>>", data, resp)
+    # print("隐私信息加密 >>>", data, resp)
     return resp
 
 # 隐私信息解密
 def CipherDecrypt(data: str) -> str:
     resp = __post_data(API_ROOT + "/CipherDecrypt", data)
-    print("隐私信息解密 >>>", data, resp)
+    # print("隐私信息解密 >>>", data, resp)
     return resp
 
 # 敏感信息数据加密
 def TransparentEnc(data: str) -> str:
     resp = __post_data(API_ROOT + "/TransparentEnc", data)
-    print("敏感信息数据加密 >>>", data, resp)
+    # print("敏感信息数据加密 >>>", data, resp)
     return resp
 
 # 敏感信息数据解密
 def TransparentDec(data: str) -> str:
     resp = __post_data(API_ROOT + "/TransparentDec", data)
-    print("敏感信息数据解密 >>>", data, resp)
+    # print("敏感信息数据解密 >>>", data, resp)
     return resp
 
 # 计算HMAC
@@ -69,7 +69,7 @@ def __post_data(api_url: str, data: str):
     response = requests.post(url=api_url, headers=headers, data=data.encode('UTF-8'), timeout=600)
     if response.status_code == 200:
         result = response.json()
-        print(result)
+        # print(result)
         if result['errcode'] == 0:
             return result['data']
     return ""

+ 20 - 1
common/auth_user.py

@@ -3,8 +3,13 @@
 from exceptions import AuthException
 import urllib
 import hashlib
-from fastapi import Request
+from fastapi import Depends, Request
+from .security import valid_access_token
+from .enc import mpfun
 from extensions import * 
+from database import get_db
+from sqlalchemy.orm import Session
+from utils.ry_system_util import user_id_get_user_info
 
 class AuthUser:
     user_id: int
@@ -33,4 +38,18 @@ def get_auth_user(request: Request):
                 return authUser
     except Exception as e:
         raise AuthException(str(e))
+    return None
+
+def find_auth_user(user_id: int = Depends(valid_access_token), db: Session = Depends(get_db)):
+    try:
+        user_info = user_id_get_user_info(db, user_id)
+        if user_info is not None:
+            authUser = AuthUser()
+            authUser.user_id = str(user_info.user_id)
+            authUser.user_name = mpfun.dec_data(user_info.user_name)
+            authUser.nick_name = user_info.nick_name
+            authUser.is_yzy_user = 0
+            return authUser
+    except Exception as e:
+        raise AuthException(str(e))
     return None

+ 41 - 0
common/db/db_czrz.py

@@ -0,0 +1,41 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+from sqlalchemy.orm import Session
+from sqlalchemy import text, exists, and_, or_, not_
+from sqlalchemy.sql import func
+from database import get_db
+from models import *
+from extensions import logger
+from utils import *
+from common.auth_user import AuthUser
+from common.enc import sys_czrz_data
+
+def log(db: Session, user: AuthUser, action: str, czrz: str, ip: str = ''):
+    db_entity = CzrzEntity()
+    db_entity.user_id = user.user_id
+    db_entity.user_name = user.user_name
+    db_entity.nick_name = user.nick_name
+    db_entity.czrz = czrz
+    db_entity.gxsj = datetime.now()
+    db_entity.ip = ip
+    db_entity.action = action
+    db.add(db_entity)
+    db.commit()
+    db.refresh(db_entity)
+
+    sys_czrz_data.sign_row(db, db_entity)
+
+def log_username(db: Session, user_id: int, user_name: str, nick_name: str, action: str, czrz: str, ip: str = ''):
+    db_entity = CzrzEntity()
+    db_entity.user_id = user_id
+    db_entity.user_name = user_name
+    db_entity.nick_name = nick_name
+    db_entity.czrz = czrz
+    db_entity.gxsj = datetime.now()
+    db_entity.ip = ip
+    db_entity.action = action
+    db.add(db_entity)
+    db.commit()
+    db.refresh(db_entity)
+
+    sys_czrz_data.sign_row(db, db_entity)

+ 66 - 0
common/enc/sys_czrz_data.py

@@ -0,0 +1,66 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+from . import mpfun
+from models import *
+from utils import *
+from sqlalchemy.orm import Session
+
+# 操作日志表
+
+# 加密和HMAC签名
+def sign_row(db: Session, row: CzrzEntity) -> None:
+    if row.sign != '':
+        return
+    
+    user_id = str(row.user_id) # 用户ID
+    user_name = mpfun.enc_data(row.user_name) # 用户账号
+    nick_name = mpfun.base64_data(row.nick_name) # 用户昵称
+    czrz = mpfun.base64_data(row.czrz) # 操作日志
+    gxsj = get_datetime_str(row.gxsj) # 更新时间
+    ip = str(row.ip) # IP地址
+    action = mpfun.base64_data(row.action) # 动作
+
+    sign_data = ",".join([user_id, user_name, nick_name, czrz, gxsj, ip, action])
+    sign_hmac = mpfun.sign_data(sign_data)
+    # print('sign_tbl_czrz sign_data:', sign_data)
+    # print('sign_tbl_czrz sign_hmac:', sign_hmac)
+
+    row.user_name = user_name
+    row.sign = sign_hmac
+    
+    db.commit()
+    
+# 比较字段合并字符串是否和MAC值匹配上,调用密码服务器[验证HMAC]接口
+def sign_valid_row(row: CzrzEntity) -> bool:
+    if row.sign == '':
+        return True
+
+    # 关键字段合并字符串
+    sign_data = get_sign_str(row)
+    # print('sys_user sign_data:', sign_data)
+    
+    # 原HMACSM3数值
+    sign_hmac = row.sign
+    # print('sign_hmac:', sign_hmac)
+
+    return mpfun.hmac_verify(sign_data, sign_hmac)
+
+# 生成待签名的字符串
+def get_sign_str(row: CzrzEntity) -> str:
+    user_id = str(row.user_id) # 用户ID
+    user_name = row.user_name # 用户账号
+    nick_name = mpfun.base64_data(row.nick_name) # 用户昵称
+    czrz = mpfun.base64_data(row.czrz) # 操作日志
+    gxsj = get_datetime_str(row.gxsj) # 更新时间
+    ip = str(row.ip) # IP地址
+    action = mpfun.base64_data(row.action) # 动作
+
+    # 关键字段合并字符串
+    sign_data = ",".join([user_id, user_name, nick_name, czrz, gxsj, ip, action])
+    return sign_data
+
+# 生成HAMC签名值
+def get_sign_hmac(row: CzrzEntity) -> str:
+    sign_data = get_sign_str(row)
+    return mpfun.sign_data(sign_data) 

+ 42 - 31
common/enc/sys_user_data.py

@@ -7,26 +7,27 @@ from sqlalchemy.orm import Session
 
 # 系统用户表
 
+# 加密和HMAC签名
 def sign_row(db: Session, row: SysUser) -> None:
     if row.sign != '':
         return
     
-    user_id = str(row.user_id)
-    user_name = mpfun.enc_data(row.user_name)
-    password = mpfun.enc_data(row.password)
-    nick_name = mpfun.base64_data(row.nick_name)
-    dept_id = str(row.dept_id)
-    dept_name = mpfun.base64_data(row.dept_name)
-    email = mpfun.enc_data(row.email)
-    phonenumber = mpfun.enc_data(row.phonenumber)
-    status = str(row.status)
-    del_flag = row.del_flag
-    yzy_account = mpfun.enc_data(row.yzy_account)
+    user_id = str(row.user_id) # 用户ID
+    user_name = mpfun.enc_data(row.user_name) # 用户账号
+    password = mpfun.enc_data(row.password) # 密码
+    nick_name = mpfun.base64_data(row.nick_name) # 用户昵称
+    dept_id = str(row.dept_id) # 部门ID
+    dept_name = mpfun.base64_data(row.dept_name) # 部门名称
+    email = mpfun.enc_data(row.email) # 电子邮箱
+    phonenumber = mpfun.enc_data(row.phonenumber) # 手机号码
+    status = str(row.status) # 用户状态
+    del_flag = row.del_flag # 是否已删除
+    yzy_account = mpfun.enc_data(row.yzy_account) # 粤政易账号
 
     sign_data = ",".join([user_id, user_name, password, nick_name, dept_id, dept_name, email, phonenumber, status, del_flag, yzy_account])
     sign_hmac = mpfun.sign_data(sign_data)
-    print('sign_tbl_user sign_data:', sign_data)
-    print('sign_tbl_user sign_hmac:', sign_hmac)
+    # print('sign_tbl_user sign_data:', sign_data)
+    # print('sign_tbl_user sign_hmac:', sign_hmac)
 
     row.user_name = user_name
     row.password = password
@@ -38,29 +39,39 @@ def sign_row(db: Session, row: SysUser) -> None:
     db.commit()
 
 # 比较字段合并字符串是否和MAC值匹配上,调用密码服务器[验证HMAC]接口
-def sign_valid_sign_row(row: SysUser) -> bool:
+def sign_valid_row(row: SysUser) -> bool:
     if row.sign == '':
         return True
-    
-    user_id = str(row.user_id)
-    user_name = row.user_name
-    password = row.password
-    nick_name = mpfun.base64_data(row.nick_name)
-    dept_id = str(row.dept_id)
-    dept_name = mpfun.base64_data(row.dept_name)
-    email = row.email
-    phonenumber = row.phonenumber
-    status = str(row.status)
-    del_flag = row.del_flag
-    yzy_account = row.yzy_account
 
+    # 关键字段合并字符串
+    sign_data = get_sign_str(row)
+    # print('sys_user sign_data:', sign_data)
+    
     # 原HMACSM3数值
     sign_hmac = row.sign
-    print('sign_hmac:', sign_hmac)
+    # print('sign_hmac:', sign_hmac)
+
+    return mpfun.hmac_verify(sign_data, sign_hmac)
+
+# 生成待签名的字符串
+def get_sign_str(row: SysUser) -> str:
+    user_id = str(row.user_id) # 用户ID
+    user_name = row.user_name # 用户账号
+    password = row.password # 密码
+    nick_name = mpfun.base64_data(row.nick_name) # 用户昵称
+    dept_id = str(row.dept_id) # 部门ID
+    dept_name = mpfun.base64_data(row.dept_name) # 部门名称
+    email = row.email # 电子邮箱
+    phonenumber = row.phonenumber # 手机号码
+    status = str(row.status) # 用户状态
+    del_flag = row.del_flag # 是否已删除
+    yzy_account = row.yzy_account # 粤政易账号
 
     # 关键字段合并字符串
     sign_data = ",".join([user_id, user_name, password, nick_name, dept_id, dept_name, email, phonenumber, status, del_flag, yzy_account])
-    print('sys_user resign_data:', sign_data)
-    
-    # 比较字段合并字符串是否和MAC值匹配上,调用密码服务器[验证HMAC]接口
-    return mpfun.hmac_verify(sign_data, sign_hmac)
+    return sign_data
+
+# 生成HAMC签名值
+def get_sign_hmac(row: SysUser) -> str:
+    sign_data = get_sign_str(row)
+    return mpfun.sign_data(sign_data) 

+ 18 - 7
main.py

@@ -23,6 +23,16 @@ app = FastAPI(docs_url=None, redoc_url=None)
 app.include_router(api.router, prefix="/api")
 app.include_router(prod_api.router, prefix="")
 
+app.add_middleware(SessionMiddleware, secret_key='MM-ZHCS-YJ-API', max_age=36000 * 24)
+app.add_middleware(CORSMiddleware,allow_origins=['*'],allow_credentials=False,allow_methods=['*'],allow_headers=['*'])
+
+app.mount('/static', StaticFiles(directory='static'), name='static')
+
+@app.middleware("http")
+async def process_authorization(request: Request, call_next):
+    response = await call_next(request)
+    return response
+    
 @app.get("/", response_class=PlainTextResponse)
 async def main():
     return "应急后端接口9988"
@@ -31,10 +41,6 @@ async def main():
 async def favicon():
     return FileResponse("./static/favicon.ico")
 
-app.add_middleware(SessionMiddleware, secret_key='MM-ZHCS-YJ-API', max_age=36000 * 24)
-app.add_middleware(CORSMiddleware,allow_origins=['*'],allow_credentials=False,allow_methods=['*'],allow_headers=['*'])
-
-app.mount('/static', StaticFiles(directory='static'), name='static')
 
 @app.on_event('startup')
 def app_startup():
@@ -45,7 +51,7 @@ def app_startup():
 
     try:
         from common.enc import mpfun
-        print(mpfun.enc_data('admin123'))
+        print(mpfun.enc_data('test2'))
     except Exception as e:
         print(str(e))
 
@@ -82,10 +88,15 @@ async def exception_handler(request: Request, exc: TokenException):
     )
 @app.exception_handler(RoleException)
 async def role_exception_handler(request: Request, exc: RoleException):
+    # 这样界面才有文字提示
     return JSONResponse(
-        status_code=403,  # 使用 403 Forbidden 表示权限不足
-        content={"errcode": exc.errcode, "errmsg": exc.errmsg}
+        status_code=200,
+        content={"code": 403, "msg":"表示权限不足"}
     )
+    # return JSONResponse(
+    #     status_code=403,  # 使用 403 Forbidden 表示权限不足
+    #     content={"errcode": exc.errcode, "errmsg": exc.errmsg}
+    # )
 @app.exception_handler(OperationalError)
 async def exception_handler(request: Request, exc: OperationalError):
     return JSONResponse(

+ 14 - 0
models/base.py

@@ -121,4 +121,18 @@ class MsgCenter(Base):
     class Config:
         orm_mode = True
 
+class CzrzEntity(Base):
+    __tablename__ = 'tp_czrz'
+
+    id = Column(Integer, autoincrement=True, primary_key=True,  index=True)
+    user_id = Column(Integer, default=0, server_default="0")
+    user_name = Column(String, default='', server_default='')
+    nick_name = Column(String, default='', server_default='')
+    czrz = Column(String, default='', server_default='')
+    gxsj = Column(DateTime, default=0, server_default="0")
+    ip = Column(String, default='', server_default='')
+    action = Column(String, default='', server_default='')
+    sign = Column(String, default='', server_default='')
 
+    class Config:
+        orm_mode = True

+ 2 - 2
models/ry_sys_base.py

@@ -137,13 +137,13 @@ class SysUser(Base):
     email = Column(String(50), default='', comment='用户邮箱')
     phonenumber = Column(String(11), default='', comment='手机号码')
     sex = Column(String(1), default='0', comment='用户性别(0男 1女 2未知)')
-    avatar = Column(BigInteger, comment='头像地址')
+    avatar = Column(BigInteger, default='0', comment='头像地址')
     password = Column(String(100), default='', comment='密码')
     status = Column(String(1), default='0', comment='帐号状态(0正常 1停用)')
     del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)')
     login = Column(Integer, default=0, comment='登录次数')
     login_ip = Column(String(128), default='', comment='最后登录IP')
-    login_date = Column(DateTime, comment='最后登录时间')
+    login_date = Column(DateTime, default=datetime.now, comment='最后登录时间')
     create_dept = Column(BigInteger, default=None, comment='创建部门')
     create_by = Column(BigInteger, default=None, comment='创建者')
     create_time = Column(DateTime, default=datetime.now, comment='创建时间')

+ 33 - 24
routers/prod_api/auth.py

@@ -22,7 +22,8 @@ from models import *
 from urllib.parse import quote
 from exceptions import *
 import traceback
-from common.enc import mpfun
+from common.db import db_czrz
+from common.enc import mpfun, sys_user_data
 
 router = APIRouter()
 
@@ -104,7 +105,7 @@ async def login(
         else:
             login_error_times = int(login_error_times)
 
-        if login_error_times >= 50:
+        if login_error_times >= 5:
             raise AppException(500, "登录错误多,请5分钟后再尝试!")
         
         # 对用户账号进行密码机接口加密处理
@@ -114,6 +115,8 @@ async def login(
         logger.info('userpass: {}', password)
 
         row = db.query(SysUser).filter(SysUser.user_name == username).first()
+        if sys_user_data.sign_valid_row(row) == False:
+            raise AppException(500, "系统用户表验证异常,已被非法篡改")
 
         if row is None:
             login_error_times = login_error_times + 1
@@ -158,13 +161,16 @@ async def login(
             "is_yzy_user": "0"
         }
 
-        request.session['user_auth'] = auth
-        request.session['user_auth_sign'] = data_auth_sign(auth)
-        request.session['user_name'] = username
+        request.session.update({
+            'user_auth': auth,
+            'user_auth_sign': data_auth_sign(auth),
+            'user_name': username
+        })
 
-        # db_czrz_serv.log_username(db, row.uid, row.username, "登录", "后台管理账号+密码登录成功", request.client.host)
+        db_czrz.log_username(db, row.user_id, auth['user_name'], row.nick_name, "登录", "后台管理账号+密码登录成功", request.client.host)
         row.login_date = datetime.now()
         row.login_ip = request.client.host
+        row.login = row.login + 1
         db.commit()
 
         access_token_expires = timedelta(days = 5)
@@ -208,18 +214,21 @@ async def login(
 async def logout(
     request: Request, 
     db: Session = Depends(get_db),
-    user: AuthUser = Depends(get_auth_user)
+    user: AuthUser = Depends(find_auth_user)
 ):
     logger.info("logout ok")
     request.session.clear()
 
     try:
+        db_czrz.log(db, user, "退出", "后台管理退出成功", request.client.host)
+
         if user.is_yzy_user == 1:
             logout_url = settings.TYRZ_LOGOUT.format(settings.TYRZ_CLIENT_ID) + quote(settings.HOME_URL+"/yjzp/")
             logger.info(logout_url)
         else:
             logout_url = settings.HOME_URL + "/yjzp/"
-    except:
+    except Exception as e:
+        traceback.print_exc()
         logout_url = settings.HOME_URL+"/yjzp/"
     return {
         "code": 200,
@@ -320,14 +329,16 @@ async def login(
         "is_yzy_user": "1"
     }
 
+    logger.info('auth {}', auth)
+
     request.session['user_auth'] = auth
     request.session['user_auth_sign'] = data_auth_sign(auth)
     request.session['user_name'] = row.user_name
 
-    # db_czrz_serv.log_username(db, row.uid, row.username, "登录", "后台管理账号+密码登录成功", request.client.host)
+    db_czrz.log_username(db, row.user_id, auth['user_name'], row.nick_name, "登录", "粤政易登录登录成功", request.client.host)
     row.login_date = datetime.now()
     row.login_ip = request.client.host
-    # row.login = row.login + 1
+    row.login = row.login + 1
     db.commit()
 
     access_token_expires = timedelta(days = 5)
@@ -335,7 +346,7 @@ async def login(
         data={"sub": user_id}, expires_delta = access_token_expires
     )
 
-    refresh_token_expires = timedelta(days = 5)
+    refresh_token_expires = timedelta(days = 10)
     refresh_token = security.create_access_token(
         data={"sub": user_id}, expires_delta = refresh_token_expires
     )
@@ -374,7 +385,8 @@ def login_with_usbkey(
     logger.info('keyID: {}', keyID)    
     logger.info('verifyP7Sign: {}', result)
     
-    # username = TassApi.TransparentEnc(username)
+    # 对用户账号进行密码机接口加密处理
+    username = mpfun.enc_data(username)
     
     redis_login_key = "login_user_" + username
     login_error_times = redis_get(redis_login_key)
@@ -384,27 +396,23 @@ def login_with_usbkey(
         login_error_times = int(login_error_times)
 
     if login_error_times >= 5:
-        return {
-            "code": 500, 
-            "msg": "登录错误多,请5分钟后再尝试!",
-        }
+        raise AppException(500, "登录错误多,请5分钟后再尝试!")
 
     row = db.query(SysUser).filter(SysUser.user_name == username).first()
     if row is None:
         login_error_times = login_error_times + 1
         redis_set_with_time(redis_login_key, str(login_error_times), 300)
 
-        if row is None:
-            return {
-                "code": 500, 
-                "msg": "账号或者密码错误",
-            }
+        raise AppException(500, "帐号或者密码错误")
+    
+    if sys_user_data.sign_valid_row(row) == False:
+        raise AppException(500, "系统用户表验证异常,已被非法篡改")
 
     user_id = str(row.user_id)
 
     auth = {
         "user_id": user_id,
-        "user_name": row.user_name,  
+        "user_name": mpfun.dec_data(row.user_name), 
         "nick_name": row.nick_name,
         "is_yzy_user": "0"
     }
@@ -415,9 +423,10 @@ def login_with_usbkey(
     request.session['user_auth_sign'] = data_auth_sign(auth)
     request.session['username'] = username
 
-    # db_czrz_serv.log_username(db, row.uid, row.username, "登录", "后台管理账号+密码登录成功", request.client.host)
+    db_czrz.log_username(db, row.user_id, auth['user_name'], row.nick_name, "登录", "后台USBKEY登录成功", request.client.host)
     row.login_date = datetime.now()
     row.login_ip = request.client.host
+    row.login = row.login + 1
     db.commit()
 
     access_token_expires = timedelta(days = 5)
@@ -425,7 +434,7 @@ def login_with_usbkey(
         data={"sub": user_id}, expires_delta = access_token_expires
     )
 
-    refresh_token_expires = timedelta(days = 5)
+    refresh_token_expires = timedelta(days = 10)
     refresh_token = security.create_access_token(
         data={"sub": user_id}, expires_delta = refresh_token_expires
     )

+ 2 - 0
routers/prod_api/system/__init__.py

@@ -12,6 +12,7 @@ from . import dept
 from . import config
 from . import role
 from . import area
+from . import post
 
 import json
 
@@ -26,6 +27,7 @@ router.include_router(dept.router, prefix="/dept")
 router.include_router(role.router, prefix="/role")
 router.include_router(area.router, prefix="/area")
 router.include_router(config.router, prefix="/config")
+router.include_router(post.router, prefix="/post")
 
 
 

+ 228 - 0
routers/prod_api/system/post/__init__.py

@@ -0,0 +1,228 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+from fastapi import APIRouter, Request, Depends, Query, HTTPException, status
+from database import get_db
+from sqlalchemy.orm import Session
+from sqlalchemy import not_
+from fastapi.responses import JSONResponse
+from models import *
+from utils import *
+from utils.ry_system_util import *
+from common.security import valid_access_token
+from common.db import db_user
+import traceback
+
+router = APIRouter()
+
+@router.post('')
+async def postcreate(
+    db: Session = Depends(get_db),
+    user_id: int = Depends(valid_access_token),
+    body = Depends(remove_xss_json)
+):
+    try:
+        deptId = body['deptId']
+        postCategory = body['postCategory']
+        postCode = body['postCode']
+        postName = body['postName']
+        postSort = body['postSort']
+        status = body['status']
+        remark = body['remark']
+
+        new_post = SysPost(
+            dept_id=deptId,
+            post_category=postCategory,
+            post_code=postCode,
+            post_name=postName,
+            post_sort=postSort,
+            status=status,
+            remark=remark,
+            create_by=user_id,
+            create_dept=0
+        )
+        db.add(new_post)
+        db.commit()
+        db.refresh(new_post)
+
+        db.commit()
+        return {"code": 200, "msg": "创建成功", "data": None}
+
+
+    except Exception as e:
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
+
+@router.get('/list')
+async def get_list(
+    request: Request,
+    belongDeptId: str = Query(None, max_length=100),
+    postCode: str = Query(None, max_length=100),
+    postName:str = Query(None, max_length=100),
+    postCategory:str = Query(None, max_length=100),
+    deptId:str = Query(None, max_length=100),
+    status: str =  Query(None, max_length=100),
+    db: Session = Depends(get_db),
+    body = Depends(remove_xss_json),
+    user_id = Depends(valid_access_token)
+):
+    query = db.query(SysPost)
+    if belongDeptId:
+        query = query.filter(SysPost.dept_id == int(belongDeptId))
+    if deptId:
+        query = query.filter(SysPost.dept_id == int(deptId))
+    if postCode:
+        query = query.filter(SysPost.post_code.like(f'%{postCode}%'))
+    if postName:
+        query = query.filter(SysPost.post_name.like(f'%{postName}%'))
+    if postCategory:
+        query = query.filter(SysPost.post_category.like(f'%{postCategory}%'))
+    if status:
+        query = query.filter(SysPost.status.like(f'%{status}%'))
+
+    def get_det_name(dept_id):
+        dept_info = dept_id_get_dept_info(db, dept_id)
+        return dept_info.dept_name if dept_info is not None else ''
+     
+    post_list = query.all()
+    # 将模型实例转换为字典
+    dept_list_dict = [{
+            "postId": post.post_id,
+            "postName": post.post_name,
+            "postCode": post.post_code,
+            "postCategory": post.post_category,
+            "postSort": post.post_sort,
+            "deptId": post.dept_id,
+            "deptName": get_det_name(post.dept_id),
+            "createDept": post.create_dept,
+            "createBy": post.create_by,
+            "status": post.status,
+            "remark": post.remark,
+            "createTime": post.create_time.strftime('%Y-%m-%d %H:%M:%S') if post.create_time else '',
+        } for post in post_list]
+
+
+    return {
+        "code": 200,
+        "rows": dept_list_dict,
+        "msg": "操作成功"
+    }
+
+
+@router.get('/optionselect')
+async def get_optionselect(
+    deptId: int = Query(0),
+    db: Session = Depends(get_db),
+):
+    try:
+        # 构建查询
+        query = db.query(SysPost)
+        query = query.filter(SysPost.status == 0)
+
+        # 计算总记录数
+        posts = query.all()
+
+        # 转换为字典
+        posts = dept_id_get_dept_post(db, deptId)
+
+        # 构建返回结果
+        result = {
+            "data": posts,
+            "code": 200,
+            "msg": "查询成功"
+        }
+        return result
+    except Exception as e:
+        # 处理异常
+        raise HTTPException(status_code=500, detail=str(e))
+
+
+
+@router.put('')
+async def postupdate(
+    db: Session = Depends(get_db),
+    user_id: int = Depends(valid_access_token),
+    body = Depends(remove_xss_json)
+):
+    try:
+        postId = body['postId']
+
+        query = db.query(SysPost)
+        query = query.filter(SysPost.post_id == postId)
+        post = query.first()
+        if not post :
+            return JSONResponse(status_code=410, content={
+            'code': 410,
+            'msg': f'岗位{postId}不存在'
+        })
+
+        post.dept_id = body['deptId']
+        post.post_category = body['postCategory']
+        post.post_code = body['postCode']
+        post.post_name = body['postName']
+        post.post_sort = body['postSort']
+        post.status = body['status']
+        post.remark = body['remark']
+
+        db.commit()
+        return {"code": 200, "msg": "更新成功", "data": None}
+
+    except Exception as e:
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
+
+
+
+@router.get('/{postId}')
+async def postId( postId:int,
+    db: Session = Depends(get_db),
+    user_id: int = Depends(valid_access_token)):
+
+    try:
+        # 构建查询
+        query = db.query(SysPost)
+        # 应用查询条件
+        query = query.filter(SysPost.post_id==postId)
+
+        posts = query.all()
+
+        # 将查询结果转换为列表形式的字典
+        post_list = post_list_to_dict(posts, db)
+
+        # 返回结果
+        return {
+            "code": 200,
+            "msg": "成功",
+            "data": post_list[0]
+        }
+
+    except Exception as e:
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
+    
+@router.delete('/{post_id}')
+async def delete(
+    post_id: int,
+    db: Session = Depends(get_db),
+    body = Depends(remove_xss_json),
+    user_id = Depends(valid_access_token)
+):
+    try:
+        query = db.query(SysPost)
+        query = query.filter(SysPost.post_id == post_id)
+
+        post_to_delete = query.first()
+        if not post_to_delete:
+            detail = "岗位不存在"
+            raise HTTPException(status_code=404, detail="岗位不存在")
+        db.delete(post_to_delete)
+        db.commit()
+        return {
+            "code": 200,
+            "msg": "岗位删除成功"
+        }
+    except Exception as e:
+        db.rollback()
+        if str(e)=='':
+            e = detail
+        raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e))
+

+ 282 - 312
routers/prod_api/system/user/__init__.py

@@ -11,6 +11,9 @@ from models import *
 from utils import *
 from utils.ry_system_util import *
 from common.security import valid_access_token
+from common.enc import mpfun, sys_user_data
+from common.db import db_czrz
+from common.auth_user import *
 import traceback
 
 router = APIRouter()
@@ -39,15 +42,23 @@ async def usercreate01(
 
 @router.post('')
 async def usercreate(
-                    db: Session = Depends(get_db),
-                    user_id: int = Depends(valid_access_token),
-                    body = Depends(remove_xss_json)
+    request: Request, 
+    auth_user: AuthUser = Depends(find_auth_user),
+    db: Session = Depends(get_db),
+    user_id: int = Depends(valid_access_token),
+    body = Depends(remove_xss_json)
 ):
     try:
+        user_info = user_id_get_user_info(db, user_id)
+        create_dept = user_info.dept_id
+
         if 'deptId' in body:
             deptId = body['deptId']
+            dept_info = dept_id_get_dept_info(db, deptId)
+            deptName = dept_info.dept_name if dept_info is not None else None
         else:
             deptId = None
+            deptName = None
         if 'phonenumber' in body:
             phonenumber = body['phonenumber']
         else:
@@ -60,37 +71,52 @@ async def usercreate(
             sex = body['sex']
         else:
             sex = None
+        if 'yzyAccount' in body:
+            yzyAccount = body['yzyAccount']
+        else:
+            yzyAccount = None
 
         userName = body['userName']
-        user = user_name_get_user_info(db,userName)
-        if user:
-            return JSONResponse(status_code=404, content={"code": 404, "msg": "用户名称已存在"})
+        user_info = user_name_get_user_info(db, userName)
+        if user_info:
+            return {"code": 500, "msg": "用户名称已存在"}
+        
         pattern = r'^[a-zA-Z0-9_]+$'
         if re.match(pattern, userName) == False:
-            return JSONResponse(status_code=404, content={"code": 404, "msg": "用户名称又字母大小写、阿拉伯数字和下划线组成"})
+            return {"code": 404, "msg": "用户名称又字母大小写、阿拉伯数字和下划线组成"}
 
         nickName = body['nickName']
         roleIds = body['roleIds']
         postIds = body['postIds']
         remark = body['remark']
         status = body['status']
-        password = '$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne'
+        password = body['password']
 
         new_user = SysUser(
             user_name = userName,
             nick_name=nickName,
             dept_id=deptId,
+            dept_name=deptName,
             phonenumber=phonenumber,
             email=email,
             sex=sex,
             remark=remark,
             status=status,
-            password=password
+            password=password,
+            yzy_account=yzyAccount,
+            create_dept=create_dept,
+            create_by=user_id,
+            update_time=datetime.now,
+            update_id=user_id,
+            login=0,
+            login_date=datetime.now(),
+            sign = ''
         )
         db.add(new_user)
         db.commit()
         db.refresh(new_user)
-
+        sys_user_data.sign_row(db, new_user)
+        
         # 创建新的用户角色关联
         new_roles = [SysUserRole(user_id=new_user.user_id, role_id=role_id) for role_id in roleIds]
         db.add_all(new_roles)
@@ -100,6 +126,9 @@ async def usercreate(
         db.add_all(new_posts)
 
         db.commit()
+
+        db_czrz.log(db, auth_user, "系统管理", f"后台管理创建用户【{nickName}】成功", request.client.host)
+
         return {"code": 200, "msg": "创建成功", "data": None}
 
 
@@ -109,9 +138,11 @@ async def usercreate(
 
 @router.put('')
 async def userupdate(
-                    db: Session = Depends(get_db),
-                    user_id: int = Depends(valid_access_token),
-                    body = Depends(remove_xss_json)
+    request: Request, 
+    auth_user: AuthUser = Depends(find_auth_user),
+    db: Session = Depends(get_db),
+    user_id: int = Depends(valid_access_token),
+    body = Depends(remove_xss_json)
 ):
     try:
         user_id_1 = body['userId']
@@ -124,34 +155,49 @@ async def userupdate(
         roleIds = body['roleIds']
         postIds = body['postIds']
         remark = body['remark']
+        yzyAccount = body['yzyAccount']
+        status = body['status']
 
-        user.nick_name=nickName
-        user.dept_id=deptId
-        user.phonenumber=phonenumber
-        user.email=email
-        user.sex=sex
-        user.remark=remark
-        # 解析角色ID列表
-        # role_ids_list = [int(id) for id in roleIds.split(',')]
+        dept_info = dept_id_get_dept_info(db, deptId)
+        deptName = dept_info.dept_name
+
+        # 还原界面不用改的加密字段
+        user.user_name = mpfun.dec_data(user.user_name)
+        user.password = mpfun.dec_data(user.password)
+
+        user.nick_name = nickName
+        user.dept_id = deptId
+        user.dept_name = deptName
+        user.phonenumber = phonenumber
+        user.email = email
+        user.sex = sex
+        user.remark = remark
+        user.yzy_account = yzyAccount
+        user.status = status
+        user.sign = ''
+        db.commit()
+        db.refresh(user)
+        sys_user_data.sign_row(db, user)
 
-        # 清除当前用户的所有角色关联
+        # 解析角色ID列表
+        # 1.清除当前用户的所有角色关联
         db.query(SysUserRole).filter(SysUserRole.user_id == user_id_1).delete()
 
-        # 创建新的用户角色关联
+        # 2.创建新的用户角色关联
         new_roles = [SysUserRole(user_id=user_id_1, role_id=role_id) for role_id in roleIds]
         db.add_all(new_roles)
 
-        # 解析角色ID列表
-        # post_ids_list = [int(id) for id in postIds.split(',')]
-
-        # 清除当前用户的所有角色关联
+        # 解析岗位ID列表
+        # 1.清除当前用户的所有岗位关联
         db.query(SysUserPost).filter(SysUserPost.user_id == user_id_1).delete()
 
-        # 创建新的用户角色关联
+        # 2.创建新的用户角色关联
         new_posts = [SysUserPost(user_id=user_id_1, post_id=post_id) for post_id in postIds]
         db.add_all(new_posts)
 
         db.commit()
+
+        db_czrz.log(db, auth_user, "系统管理", f"后台管理更新用户【{nickName}】成功", request.client.host)
         return {"code": 200, "msg": "更新成功", "data": None}
 
 
@@ -161,20 +207,26 @@ async def userupdate(
 
 @router.put('/resetPwd')
 async def userupdate(
-                    db: Session = Depends(get_db),
-                    user_id: int = Depends(valid_access_token),
-                    body = Depends(remove_xss_json)
+    request: Request, 
+    auth_user: AuthUser = Depends(find_auth_user),
+    db: Session = Depends(get_db),
+    user_id: int = Depends(valid_access_token),
+    body = Depends(remove_xss_json)
 ):
     try:
         user_id_1 = body['userId']
         user = user_id_get_user_info(db,user_id_1)
         password = body['password']
 
-        user.password=password
-        user.update_by=user_id
+        user.password = mpfun.enc_data(password)
+        user.sign = sys_user_data.get_sign_hmac(user)
+        user.update_by = user_id
+        user.update_time = datetime.now()
 
         db.commit()
-        return {"code": 200, "msg": "更新成功", "data": None}
+
+        db_czrz.log(db, auth_user, "系统管理", f"后台管理重置用户密码【{user.nick_ame}】成功", request.client.host)
+        return {"code": 200, "msg": "重置用户密码成功", "data": None}
 
 
     except Exception as e:
@@ -184,6 +236,8 @@ async def userupdate(
 
 @router.post("/export")
 async def export_to_excel(
+    request: Request, 
+    auth_user: AuthUser = Depends(find_auth_user),
     db: Session = Depends(get_db),
     user_id: str = Depends(valid_access_token)
 ):
@@ -225,13 +279,11 @@ async def export_to_excel(
         'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
     }
 
+    db_czrz.log(db, auth_user, "系统管理", f"后台管理导出用户数据成功", request.client.host)
+
     # 返回文件流
     return StreamingResponse(output, headers=headers)
 
-
-
-
-
 @router.get('/getInfo')
 async def getInfo(request: Request,db: Session = Depends(get_db), user_id: int = Depends(valid_access_token)):
     try:
@@ -283,11 +335,11 @@ async def getInfo(request: Request,db: Session = Depends(get_db), user_id: int =
                     "userId": info.user_id,
                     "tenantId": info.tenant_id,
                     "deptId": info.dept_id,
-                    "userName": info.user_name,
+                    "userName": mpfun.dec_data(info.user_name),
                     "nickName": info.nick_name,
                     "userType": info.user_type,
-                    "email": info.email,
-                    "phonenumber": info.phonenumber,
+                    "email": mpfun.dec_data(info.email),
+                    "phonenumber": mpfun.dec_data(info.phonenumber),
                     "sex": info.sex,
                     "avatar": info.avatar,
                     "status": info.status,
@@ -404,132 +456,6 @@ async def deptTree(request: Request,label: str = Query(None, description='部门
         "data": result
     }
 
-"""
-本接口已废弃
-"""
-@router.get('/avcon/deptUserTree_____________')
-async def deptTree(request: Request,label: str = Query(None, description='部门名称'),db: Session = Depends(get_db), user_id: int = Depends(valid_access_token)):
-    def build_dept_tree(depts, parent_dept):
-        dept_tree = []
-        for dept_info in depts:
-            dept = {
-                "id": dept_info.dept_id,
-                "label": dept_info.dept_name,
-                # "parentId": dept_info.parent_id,
-                # "weight": dept_info.order_num
-            }
-            # print(dept_info.dept_id)
-            children = parent_id_get_dept_info(db, dept_info.dept_id)
-            if len(children) > 0:
-                children_depts = build_dept_tree(children, dept)
-                dept["children"] = children_depts
-                userlist=dept_id_get_user_info(db,dept_info.dept_id)
-                if userlist:
-                    for user_info in userlist:
-                        dept["children"].append({"id":user_info.user_id,"label":user_info.nick_name,"isUser":True,"isLeaf":True})
-            else:
-                dept['isLeaf']=True
-                userlist = dept_id_get_user_info(db, dept_info.dept_id)
-                if userlist:
-                    for user_info in userlist:
-                        dept["children"].append({"id": user_info.user_id, "label": user_info.nick_name,"isUser":True, "isLeaf": True})
-            dept_tree.append(dept)
-        return dept_tree
-
-    # result = []
-    if label:
-        query = db.query(SysDept)
-        query = query.filter(SysDept.del_flag != '2')
-        query = query.filter(SysDept.dept_name.like(f'%{label}%'))
-        # for dept_info in :
-        result=build_dept_tree(query.all(), None)
-    else:
-        result=build_dept_tree(parent_id_get_dept_info(db, 0),None)
-    return {
-        "code": 200,
-        "msg": "操作成功",
-        "data": result
-    }
-
-"""
-本接口已废弃
-"""
-@router.get('/avcon/list/dept_____________/{dept_id}')
-async def get_dept_user_list(
-    # request: Request,
-    dept_id: str,
-    name: str = Query(None, description='昵称'),
-    db: Session = Depends(get_db),
-    body = Depends(remove_xss_json),
-    user_id = Depends(valid_access_token)
-):
-    def get_avcon_type_text(type: str) -> str:
-        if type == '001':
-            return '指挥视频终端'
-        elif type == '060':
-            return '营区监控'
-        elif type == '085':
-            return '监控网关服务器'
-        elif type == '100':
-            return 'H.323终端'
-        
-        return "未知终端"
-    """
-    query = db.query(SysUser)
-    query = query.filter(SysUser.del_flag != '2')
-
-    def get_dept_chli(dept_list: list, parent_id: int):
-
-        depts = parent_id_get_dept_info(db, parent_id)
-        if depts:
-            for dept in depts:
-                dept_list.append(dept.dept_id)
-                get_dept_chli(dept_list, dept.dept_id)
-        return dept_list
-
-    if dept_id:
-        query = query.filter(SysUser.dept_id.in_(get_dept_chli([], dept_id)))
-
-    if name:
-        query = query.filter(SysUser.nick_name.like(f'%{name}%'))
-
-    user_list = query.all()
-    user_list_dict = []
-    # 将模型实例转换为字典
-    for user in user_list:
-        dept = dept_id_get_ancestors_names(db,dept_id_get_dept_info(db,user.dept_id))
-        roleIds = user_id_get_user_roleIds(db, user_id)
-        user_roles = role_id_list_get_user_role(db,roleIds)
-        dev_id = user_id_get_avcon_dev_id(db,  user.user_id)
-        user_list_dict.append({
-            "id": user.user_id,
-            "dept": dept,
-            "name": user.nick_name,
-            "mobile": dev_id,
-            "duty": '/'.join([i["roleName"] for i in user_roles])
-        } )
-    """
-    user_list_dict = []
-    query = db.query(AvconDevice).filter(AvconDevice.group_id == dept_id)
-    query = query.filter(AvconDevice.dev_type == '001')
-    # query = query.filter(AvconDevice.status == 1) # 上线状态
-    query = query.order_by(AvconDevice.group_id.asc(), AvconDevice.dev_id.asc())
-    rows = query.all()
-    for row in rows:
-        user_list_dict.append({
-            "id": row.dev_id,
-            "dept": get_avcon_type_text(row.dev_type),
-            "name": row.dev_name,
-            "mobile": row.dev_id
-        })
-
-    return {
-        "code": 200,
-        "data": user_list_dict,
-
-        "msg": "操作成功"
-    }
-
 # def get_query_params(params: dict):
 #     return params
 # def get_time_params(params: dict = Depends(get_query_params)):
@@ -545,9 +471,6 @@ async def userlist( deptId: int = Query(None ,description='部门id'),
                     userName: str = Query(None, description='用户名'),
                     status: int = Query(None, description='用户状态'),
                     phonenumber : str = Query(None, description='手机号'),
-                    # params:dict  = Query(None, description='创建日期'),
-                    # beginTime: str = Depends(get_time_params),
-                    # endTime: str = Depends(get_time_params),
                     page: int = Query(1, gt=0, description='页码'),
                     pageSize: int = Query(10, gt=0, description='每页条目数量'),
                     db: Session = Depends(get_db),
@@ -557,20 +480,12 @@ async def userlist( deptId: int = Query(None ,description='部门id'),
         query = db.query(SysUser)
         query = query.filter(SysUser.del_flag != '2')
         # 应用查询条件
-
-        # if beginTime:
-        #     query = query.filter(SysUser.create_time >= beginTime)
-        # if endTime:
-        #     query = query.filter(SysUser.create_time <= endTime)
-        # if params:
-        #     query = query.filter(SysUser.create_time >= params.get("beginTime"))
-        #     query = query.filter(SysUser.create_time <= params.get("endTime"))
         if userName:
-            query =query.filter(SysUser.user_name.like(f'%{userName}%'))
+            query =query.filter(SysUser.user_name == mpfun.enc_data(userName))
         if status:
-            query =query.filter(SysUser.status==status)
+            query =query.filter(SysUser.status == status)
         if phonenumber:
-            query =query.filter(SysUser.phonenumber.like(f'%{phonenumber}%'))
+            query =query.filter(SysUser.phonenumber == mpfun.enc_data(phonenumber))
 
         def get_dept_chli(dept_list : list,parent_id : int):
 
@@ -588,7 +503,6 @@ async def userlist( deptId: int = Query(None ,description='部门id'),
         total_items = query.count()
 
         # 排序
-
         query = query.order_by(SysUser.create_time.desc())
         # 执行分页查询
         users = query.offset((page - 1) * pageSize).limit(pageSize).all()
@@ -596,18 +510,18 @@ async def userlist( deptId: int = Query(None ,description='部门id'),
         # 将查询结果转换为列表形式的字典
         user_list = []
         for user in users:
-            roleIds = user_id_get_user_roleIds(db, user.user_id)
-            user_roles = role_id_list_get_user_role(db,roleIds)
+            # roleIds = user_id_get_user_roleIds(db, user.user_id)
+            # user_roles = role_id_list_get_user_role(db,roleIds)
 
             user_info = {
                 "userId": user.user_id,
                 "tenantId": user.tenant_id,
                 "deptId": user.dept_id,
-                "userName": user.user_name,
+                "userName": mpfun.dec_data(user.user_name),
                 "nickName": user.nick_name,
                 "userType": user.user_type,
-                "email": user.email,
-                "phonenumber": user.phonenumber,
+                "email": mpfun.dec_data(user.email),
+                "phonenumber": mpfun.dec_data(user.phonenumber),
                 "sex": user.sex,
                 "avatar": user.avatar,
                 "status": user.status,
@@ -616,10 +530,10 @@ async def userlist( deptId: int = Query(None ,description='部门id'),
                 "remark": user.remark,
                 "createTime": user.create_time.strftime('%Y-%m-%d %H:%M:%S') if user.create_time else '',
                 "deptName": user.dept_name,
-                "roles": user_roles,
-                "roleIds": None,
-                "postIds": None,
-                "roleId": None
+                # "roles": user_roles,
+                # "roleIds": None,
+                # "postIds": None,
+                # "roleId": None
             }
             user_list.append(user_info)
 
@@ -657,27 +571,27 @@ async def get_dept_user_list(
     user_list = query.all()
     # 将模型实例转换为字典
     user_list_dict = [{
-            "userId": user.user_id,
-            "tenantId": user.tenant_id,
-            "deptId": user.dept_id,
-            "userName": user.user_name,
-            "nickName": user.nick_name,
-            "userType": user.user_type,
-            "email": user.email,
-            "phonenumber": user.phonenumber,
-            "sex": user.sex,
-            "avatar": user.avatar,
-            "status": user.status,
-            "loginIp": user.login_ip,
-            "loginDate": user.login_date.strftime('%Y-%m-%d %H:%M:%S') if user.login_date else '',
-            "remark": user.remark,
-            "createTime": user.create_time.strftime('%Y-%m-%d %H:%M:%S') if user.create_time else '',
-            "deptName": user.dept_name,
-            "roles": None,
-            "roleIds": None,
-            "postIds": None,
-            "roleId": None
-        } for user in user_list]
+        "userId": user.user_id,
+        "tenantId": user.tenant_id,
+        "deptId": user.dept_id,
+        "userName": mpfun.dec_data(user.user_name),
+        "nickName": user.nick_name,
+        "userType": user.user_type,
+        "email": mpfun.dec_data(user.email),
+        "phonenumber": mpfun.dec_data(user.phonenumber),
+        "sex": user.sex,
+        "avatar": user.avatar,
+        "status": user.status,
+        "loginIp": user.login_ip,
+        "loginDate": user.login_date.strftime('%Y-%m-%d %H:%M:%S') if user.login_date else '',
+        "remark": user.remark,
+        "createTime": user.create_time.strftime('%Y-%m-%d %H:%M:%S') if user.create_time else '',
+        "deptName": user.dept_name,
+        "roles": None,
+        "roleIds": None,
+        "postIds": None,
+        "roleId": None
+    } for user in user_list]
 
 
     return {
@@ -690,46 +604,60 @@ async def get_dept_user_list(
 
 @router.put('/changeStatus')
 async def change_user_status(
-        db: Session = Depends(get_db),
-        body=Depends(remove_xss_json),
-        user_id=Depends(valid_access_token)
+    request: Request, 
+    auth_user: AuthUser = Depends(find_auth_user),
+    db: Session = Depends(get_db),
+    body=Depends(remove_xss_json),
+    user_id=Depends(valid_access_token)
 ):
     try:
         userId = body['userId']
         status = body['status']
+
         query = db.query(SysUser)
         query = query.filter(SysUser.del_flag != '2')
         query = query.filter(SysUser.user_id == userId)
 
         user = query.first()
-        user.status= status
-        user.update_by=user_id
+        user.status = status
+        user.sign = sys_user_data.get_sign_hmac(user)
+        user.update_by = user_id
+        user.update_time = datetime.now()
         db.commit()
+
+        db_czrz.log(db, auth_user, "系统管理", f"后台管理变更用户状态成功", request.client.host)
         return {
             "code": 200,
             "msg": "操作成功"
         }
     except Exception as e:
         # 处理异常
-        db.rollback()
         traceback.print_exc()
         raise HTTPException(status_code=500, detail=str(e))
 
 
 @router.delete('/{user_id1}')
-async def delete_dept(
-    user_id1:int,
+async def delete_user(
+    user_id1: str,
+    request: Request, 
+    auth_user: AuthUser = Depends(find_auth_user),
     db: Session = Depends(get_db),
     body = Depends(remove_xss_json),
     user_id = Depends(valid_access_token)
 ):
+    userIdList=user_id1.split(',')
+    for user_id1 in userIdList:
+        user = user_id_get_user_info(db,user_id1)
+        # 将模型实例转换为字典
+        print(user)
+
+        user.del_flag = '2'
+        user.sign = sys_user_data.get_sign_hmac(user)
+        user.update_by = user_id
+        user.update_time = datetime.now()
+        db.commit()
 
-    user = user_id_get_user_info(db,user_id1)
-    # 将模型实例转换为字典
-    print(user)
-    user.del_flag = '2'
-    user.update_by = user_id
-    db.commit()
+        db_czrz.log(db, auth_user, "系统管理", f"后台管理删除用户{user.nick_name}记录成功", request.client.host)
 
     return {
         "code": 200,
@@ -785,11 +713,15 @@ async def get_user_video_points(
         raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
 
 @router.put('/authRole')
-async def authRoleUpdate( userId: int = Query(None ,description='用户id'),
-                    roleIds: str = Query(None ,description='权限id'),
-                    db: Session = Depends(get_db),
-                    user_id: int = Depends(valid_access_token)):
+async def authRoleUpdate(
+    request: Request, 
+    userId: int = Query(None ,description='用户id'),
+    roleIds: str = Query(None ,description='权限id'),
+    auth_user: AuthUser = Depends(find_auth_user),
+    db: Session = Depends(get_db),
+    user_id: int = Depends(valid_access_token)):
     try:
+        user = user_id_get_user_info(db, userId)
 
         # 解析角色ID列表
         role_ids_list = [int(id) for id in roleIds.split(',')]
@@ -801,6 +733,9 @@ async def authRoleUpdate( userId: int = Query(None ,description='用户id'),
         new_roles = [SysUserRole(user_id=userId, role_id=role_id) for role_id in role_ids_list]
         db.add_all(new_roles)
         db.commit()
+
+        db_czrz.log(db, auth_user, "系统管理", f"后台管理分配用户{user.nick_name}角色成功", request.client.host)
+
         return {"code": 200, "msg": "更新成功", "data": None}
 
 
@@ -819,62 +754,65 @@ async def userlist( #user_id_1: int = Query(None ,description='用户id'),
         roleIds = user_id_get_user_roleIds(db, user_id)
         user_roles = role_id_list_get_user_role(db,roleIds)
         dept = dept_id_get_dept_info(db,user.dept_id)
-        user_list = {
-                "admin":1 in roleIds,
-                "avatar": user.avatar,
-                "createBy":user_id_get_user_info(db,user.create_by).user_name,
-                "createTime": user.create_time.strftime('%Y-%m-%d %H:%M:%S') if user.create_time else '',
-                "delFlag":user.del_flag,
-                "dept":{
-                        "createBy": user_id_get_user_info(db,dept.create_by).user_name if dept.create_by else  None,
-                        "createTime": dept.create_time.strftime('%Y-%m-%d %H:%M:%S') if dept.create_time else None,
-                        "updateBy": user_id_get_user_info(db,dept.update_by).user_name if dept.update_by else  None,
-                        "updateTime": dept.create_time.strftime('%Y-%m-%d %H:%M:%S') if dept.create_time else None,
-                        "remark": '',#dept.remark,
-                        "deptId": dept.dept_id,
-                        "parentId": dept.parent_id,
-                        "ancestors": dept.ancestors,
-                        "deptName": dept.dept_name,
-                        "orderNum": dept.order_num,
-                        "leader": dept.leader_name,
-                        "phone": dept.phone,
-                        "email": dept.email,
-                        "status": dept.status,
-                        "delFlag": dept.del_flag,
-                        "parentName": dept.parent_name,
-                        "children": []
-                    },
-                "deptId": user.dept_id,
-                "email": user.email,
-                "loginDate": user.login_date.strftime('%Y-%m-%d %H:%M:%S') if user.login_date else '',
-                "loginIp": user.login_ip,
-                "nickName": user.nick_name,
-                "password":"",
-                "phonenumber": user.phonenumber,
-                "postIds": None,
-                "remark": user.remark,
-                "roleId": None,
-                "roleIds": roleIds,
-                "roles": user_roles,
-                "sex": user.sex,
-                "status": user.status,
-                "updateBy":user.update_by,
-                "updateTime": user.create_time.strftime('%Y-%m-%d %H:%M:%S') if user.create_time else None,
-                "userId": user.user_id,
-                "userName": user.user_name,
-                "tenantId": user.tenant_id,
-                "userType": user.user_type,
-                "deptName": dept.dept_name,
-            }
+        user_info = {
+            "admin":1 in roleIds,
+            "avatar": user.avatar,
+            "createBy":mpfun.dec_data(user_id_get_user_info(db,user.create_by).user_name),
+            "createTime": user.create_time.strftime('%Y-%m-%d %H:%M:%S') if user.create_time else '',
+            "delFlag":user.del_flag,
+            "dept":{
+                    "createBy": user_id_get_user_info(db,dept.create_by).user_name if dept.create_by else  None,
+                    "createTime": dept.create_time.strftime('%Y-%m-%d %H:%M:%S') if dept.create_time else None,
+                    "updateBy": user_id_get_user_info(db,dept.update_by).user_name if dept.update_by else  None,
+                    "updateTime": dept.create_time.strftime('%Y-%m-%d %H:%M:%S') if dept.create_time else None,
+                    "remark": '',#dept.remark,
+                    "deptId": dept.dept_id,
+                    "parentId": dept.parent_id,
+                    "ancestors": dept.ancestors,
+                    "deptName": dept.dept_name,
+                    "orderNum": dept.order_num,
+                    "leader": dept.leader_name,
+                    "phone": dept.phone,
+                    "email": dept.email,
+                    "status": dept.status,
+                    "delFlag": dept.del_flag,
+                    "parentName": dept.parent_name,
+                    "children": []
+                },
+            "deptId": user.dept_id,
+            "email": mpfun.dec_data(user.email),
+            "loginDate": user.login_date.strftime('%Y-%m-%d %H:%M:%S') if user.login_date else '',
+            "loginIp": user.login_ip,
+            "nickName": user.nick_name,
+            "password":"",
+            "phonenumber": mpfun.dec_data(user.phonenumber),
+            "postIds": None,
+            "remark": user.remark,
+            "roleId": None,
+            "roleIds": roleIds,
+            "roles": user_roles,
+            "sex": user.sex,
+            "status": user.status,
+            "updateBy":user.update_by,
+            "updateTime": user.create_time.strftime('%Y-%m-%d %H:%M:%S') if user.create_time else None,
+            "userId": user.user_id,
+            "userName": mpfun.dec_data(user.user_name),
+            "tenantId": user.tenant_id,
+            "userType": user.user_type,
+            "deptName": dept.dept_name,
 
-        roles = get_role(db,roleIds)
+            "postGroup":"工作人员",
+            "roleGroup":'/'.join([i["roleName"] for i in user_roles])
+        }
+
+        # roles = get_role(db,roleIds)
 
 
         # 返回结果
         return {
             "code": 200,
             "msg": "成功用户列表",
-            "data": user_list,
+            "data": user_info,
                 # {
                 # "user":user_list,
                 # "roleIds":roleIds,
@@ -882,55 +820,85 @@ async def userlist( #user_id_1: int = Query(None ,description='用户id'),
                 # "postIds":[],
                 # "posts":[]
             # }
-            "postGroup":"工作人员",
-            "roleGroup":'/'.join([i["roleName"] for i in user_roles])
+            
         }
 
 
     except Exception as e:
         traceback.print_exc()
         raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
+
+@router.post('/profile/avatar')
+async def updateAvatar(
+    request: Request, 
+    auth_user: AuthUser = Depends(find_auth_user),
+    db: Session = Depends(get_db),
+    user_id: int = Depends(valid_access_token)):
+
+    db_czrz.log(db, auth_user, "系统管理", f"后台管理更新用户头像成功", request.client.host)
+
+    return {
+        "code": 200,
+        "msg": "更新头像成功"
+    }
+        
 @router.put('/profile')
-async def userlist( #user_id_1: int = Query(None ,description='用户id'),
-                    db: Session = Depends(get_db),
-                    body = Depends(remove_xss_json),
-                    user_id: int = Depends(valid_access_token)):
+async def userlist(
+    request: Request, 
+    auth_user: AuthUser = Depends(find_auth_user),
+    db: Session = Depends(get_db),
+    body = Depends(remove_xss_json),
+    user_id: int = Depends(valid_access_token)):
     try:
 
         user = user_id_get_user_info(db,user_id)
         if "email" in body:
-            user.email=body['email']
-            user.update_by=user_id
+            user.email = mpfun.enc_data(body['email'])
         if "nickName" in body:
             user.nick_name = body['nickName']
-            user.update_by=user_id
         if "phonenumber" in body:
-            user.phonenumber = body['phonenumber']
-            user.update_by=user_id
+            user.phonenumber = mpfun.enc_data(body['phonenumber'])
         if "sex" in body:
-            user.nick_name = body['sex']
-            user.update_by=user_id
+            user.sex = body['sex']
+            
+        user.sign = sys_user_data.get_sign_hmac(user)
+        user.update_by = user_id
+        user.update_time = datetime.now()
         db.commit()
+
+        print('auth_user', auth_user)
+        db_czrz.log(db, auth_user, "系统管理", f"后台管理更新用户【{user.nick_name}】个人信息成功", request.client.host)
+
         return {"code":200,"msg":"成功","data":None}
+    
     except Exception as e:
         traceback.print_exc()
         raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
+    
 @router.put('/profile/updatePwd')
-async def userlist( #user_id_1: int = Query(None ,description='用户id'),
-                    db: Session = Depends(get_db),
-                    body = Depends(remove_xss_json),
-                    user_id: int = Depends(valid_access_token)):
+async def userlist(
+    request: Request, 
+    auth_user: AuthUser = Depends(find_auth_user),
+    db: Session = Depends(get_db),
+    body = Depends(remove_xss_json),
+    user_id: int = Depends(valid_access_token)):
     try:
 
         user = user_id_get_user_info(db,user_id)
-        if user.password!=body['oldPassword']:
-            return JSONResponse(status_code=404,content={"code":404,"msg":"密码错误"})
+        if user.password != mpfun.enc_data(body['oldPassword']):
+            return {"code": 500, "msg":"旧密码错误"}
+        
         if "newPassword" in body:
-            user.nick_name = body['newPassword']
-            user.update_by=user_id
+            user.password = mpfun.enc_data(body['newPassword'])
+            user.sign = sys_user_data.get_sign_hmac(user)
+            user.update_by = user_id
+            user.update_time = datetime.now()
+            db.commit()
 
-        db.commit()
-        return {"code":200,"msg":"成功","data":None}
+            db_czrz.log(db, auth_user, "系统管理", f"后台管理更新用户【{user.nick_name}】个人中心密码成功", request.client.host)
+
+        return {"code":200,"msg":"修改密码成功","data":None}
+    
     except Exception as e:
         traceback.print_exc()
         raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
@@ -953,11 +921,11 @@ async def userlist( user_id_1: int = Query(None ,description='用户id'),
                 "userId": user.user_id,
                 "tenantId": user.tenant_id,
                 "deptId": user.dept_id,
-                "userName": user.user_name,
+                "userName": mpfun.dec_data(user.user_name),
                 "nickName": user.nick_name,
                 "userType": user.user_type,
-                "email": user.email,
-                "phonenumber": user.phonenumber,
+                "email": mpfun.dec_data(user.email),
+                "phonenumber": mpfun.dec_data(user.phonenumber),
                 "sex": user.sex,
                 "avatar": user.avatar,
                 "status": user.status,
@@ -966,14 +934,12 @@ async def userlist( user_id_1: int = Query(None ,description='用户id'),
                 "remark": user.remark,
                 "createTime": user.create_time.strftime('%Y-%m-%d %H:%M:%S') if user.create_time else '',
                 "deptName": user.dept_name,
-                "roles": user_roles,
-                "roleIds": roleIds,
-                "postIds": None,
-                "roleId": None
+                "yzyAccount": mpfun.dec_data(user.yzy_account),
             }
 
         roles = get_role(db,roleIds)
-
+        postIds = user_id_get_user_postIds(db, user_id_1)
+        posts = dept_id_get_dept_post(db, user.dept_id)
 
         # 返回结果
         return {
@@ -981,10 +947,14 @@ async def userlist( user_id_1: int = Query(None ,description='用户id'),
             "msg": "成功用户列表",
             "data": {
                 "user":user_list,
+                # 用户当前的所属角色ID列表
                 "roleIds":roleIds,
+                # 用户当前所属部门岗位ID列表
+                "postIds": postIds,
+                # 可供选择的角色列表
                 "roles":roles,
-                "postIds":[],
-                "posts":[]
+                # 可供选择的部门岗位列表
+                "posts": posts
             }
         }
 

+ 40 - 1
utils/ry_system_util.py

@@ -61,6 +61,21 @@ def user_id_get_avcon_dev_id(db,user_id):
         return resutl.dev_id
     return ''
 
+def user_id_get_user_postIds(db, user_id):
+    query = db.query(SysUserPost)
+    query = query.filter(SysUserPost.user_id == user_id)
+    resutl = query.all()
+    return [i.post_id for i in resutl]
+
+def dept_id_get_dept_post(db, dept_id):
+    # print('dept_id_get_dept_post:', dept_id)
+    query = db.query(SysPost)
+    query = query.filter(SysPost.status == 0)
+    query = query.filter(SysPost.dept_id == dept_id)
+    resutl = query.all()
+    return post_list_to_dict(resutl, db)
+
+
 def role_list_to_dict(roles,role_id_list):
     return [
         {
@@ -150,4 +165,28 @@ def dept_id_get_ancestors_names(db,dept, ancestors_name=''):
     if dept.parent_id == 0:
         return ancestors_name
     else:
-        return dept_id_get_ancestors_names(db,dept_id_get_dept_info(db,dept.parent_id), ancestors_name)
+        return dept_id_get_ancestors_names(db,dept_id_get_dept_info(db,dept.parent_id), ancestors_name)
+
+
+def post_list_to_dict(posts, db):
+    def get_det_name(dept_id):
+        dept_info = dept_id_get_dept_info(db, dept_id)
+        return dept_info.dept_name if dept_info is not None else ''
+    
+    return [
+        {
+            "postId": post.post_id,
+            "postName": post.post_name,
+            "postCode": post.post_code,
+            "postCategory": post.post_category,
+            "postSort": post.post_sort,
+            "deptId": post.dept_id,
+            "deptName": get_det_name(post.dept_id),
+            "createDept": post.create_dept,
+            "createBy": post.create_by,
+            "status": post.status,
+            "remark": post.remark,
+            "createTime": post.create_time.strftime('%Y-%m-%d %H:%M:%S') if post.create_time else '',
+        }
+        for post in posts
+    ]