__init__.py 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import APIRouter, Request, Depends,Query,HTTPException
  4. from fastapi.responses import StreamingResponse
  5. from database import get_db
  6. from sqlalchemy.orm import Session
  7. from sqlalchemy import inspect,text
  8. from fastapi.responses import JSONResponse
  9. from models import *
  10. from utils import *
  11. from utils.ry_system_util import *
  12. from common.security import valid_access_token
  13. from common.enc import mpfun, sys_user_data, sys_user_role_data, sys_user_post_data
  14. from common.db import db_czrz
  15. from common.auth_user import *
  16. import traceback
  17. import re
  18. router = APIRouter()
  19. @router.get('/')
  20. async def usercreate01(
  21. db: Session = Depends(get_db),
  22. user_id: int = Depends(valid_access_token)):
  23. try:
  24. return {
  25. "code": 200,
  26. "msg": "成功",
  27. "data": {
  28. "postIds":None,
  29. "posts":None,
  30. "roleIds":None,
  31. "roles":get_role(db),
  32. "user":None
  33. }
  34. }
  35. except Exception as e:
  36. traceback.print_exc()
  37. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  38. @router.post('')
  39. async def usercreate(
  40. request: Request,
  41. auth_user: AuthUser = Depends(find_auth_user),
  42. db: Session = Depends(get_db),
  43. user_id: int = Depends(valid_access_token),
  44. body = Depends(remove_xss_json)
  45. ):
  46. try:
  47. user_info = user_id_get_user_info(db, user_id)
  48. create_dept = user_info.dept_id
  49. if 'deptId' in body:
  50. deptId = body['deptId']
  51. dept_info = dept_id_get_dept_info(db, deptId)
  52. deptName = dept_info.dept_name if dept_info is not None else None
  53. else:
  54. deptId = None
  55. deptName = None
  56. if 'phonenumber' in body:
  57. phonenumber = body['phonenumber']
  58. else:
  59. phonenumber = None
  60. if 'email' in body:
  61. email = body['email']
  62. else:
  63. email = None
  64. if 'sex' in body:
  65. sex = body['sex']
  66. else:
  67. sex = None
  68. if 'yzyAccount' in body:
  69. yzyAccount = body['yzyAccount']
  70. else:
  71. yzyAccount = None
  72. if 'expireTime' in body:
  73. expireTime = body['expireTime']
  74. else:
  75. expireTime = None
  76. userName = body['userName']
  77. user_info = user_name_get_user_info(db, mpfun.enc_data(userName))
  78. if user_info:
  79. return {"code": 500, "msg": "用户名称已存在"}
  80. pattern = r'^[a-zA-Z0-9_]+$'
  81. if re.match(pattern, userName) == False:
  82. return {"code": 404, "msg": "用户名称又字母大小写、阿拉伯数字和下划线组成"}
  83. try:
  84. check_password_base(body['password'])
  85. except Exception as e:
  86. return {
  87. 'code': 500,
  88. 'msg': str(e)
  89. }
  90. nickName = body['nickName']
  91. roleIds = body['roleIds']
  92. postIds = body['postIds']
  93. remark = body['remark']
  94. status = body['status']
  95. password = body['password']
  96. new_user = SysUser(
  97. user_name = userName,
  98. nick_name=nickName,
  99. dept_id=deptId,
  100. dept_name=deptName,
  101. phonenumber=phonenumber,
  102. email=email,
  103. sex=sex,
  104. remark=remark,
  105. status=status,
  106. password=password,
  107. yzy_account=yzyAccount,
  108. expire_time=expireTime,
  109. create_dept=create_dept,
  110. create_by=user_id,
  111. update_time=datetime.now(),
  112. update_by=user_id,
  113. login=0,
  114. login_date=datetime.now(),
  115. sign = ''
  116. )
  117. db.add(new_user)
  118. db.commit()
  119. db.refresh(new_user)
  120. sys_user_data.sign_row(db, new_user)
  121. # 创建新的用户角色关联
  122. new_roles = [SysUserRole(user_id=new_user.user_id, role_id=role_id) for role_id in roleIds]
  123. db.add_all(new_roles)
  124. # 创建新的用户角色关联
  125. new_posts = [SysUserPost(user_id=new_user.user_id, post_id=post_id) for post_id in postIds]
  126. db.add_all(new_posts)
  127. sys_user_role_data.sign_table()
  128. sys_user_post_data.sign_table()
  129. db.commit()
  130. db_czrz.log(db, auth_user, "系统管理", f"后台管理创建用户【{nickName}】成功", request.client.host)
  131. return {"code": 200, "msg": "创建成功", "data": None}
  132. except Exception as e:
  133. traceback.print_exc()
  134. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  135. @router.put('')
  136. async def userupdate(
  137. request: Request,
  138. auth_user: AuthUser = Depends(find_auth_user),
  139. db: Session = Depends(get_db),
  140. user_id: int = Depends(valid_access_token),
  141. body = Depends(remove_xss_json)
  142. ):
  143. try:
  144. user_id_1 = body['userId']
  145. user = user_id_get_user_info(db,user_id_1)
  146. nickName = body['nickName']
  147. deptId = body['deptId']
  148. phonenumber = body['phonenumber']
  149. email = body['email']
  150. sex = body['sex']
  151. roleIds = body['roleIds']
  152. postIds = body['postIds']
  153. remark = body['remark']
  154. yzyAccount = body['yzyAccount']
  155. status = body['status']
  156. if 'expireTime' in body:
  157. expire_time = body['expireTime']
  158. else:
  159. expire_time = None
  160. dept_info = dept_id_get_dept_info(db, deptId)
  161. deptName = dept_info.dept_name
  162. # 还原界面不用改的加密字段
  163. user.user_name = mpfun.dec_data(user.user_name)
  164. user.password = mpfun.dec_data(user.password)
  165. user.nick_name = nickName
  166. user.dept_id = deptId
  167. user.dept_name = deptName
  168. user.phonenumber = phonenumber
  169. user.email = email
  170. user.sex = sex
  171. user.remark = remark
  172. user.yzy_account = yzyAccount
  173. user.status = status
  174. user.expire_time = expire_time
  175. user.sign = ''
  176. db.commit()
  177. db.refresh(user)
  178. sys_user_data.sign_row(db, user)
  179. # 解析角色ID列表
  180. # 1.清除当前用户的所有角色关联
  181. db.query(SysUserRole).filter(SysUserRole.user_id == user_id_1).delete()
  182. # 2.创建新的用户角色关联
  183. new_roles = [SysUserRole(user_id=user_id_1, role_id=role_id) for role_id in roleIds]
  184. db.add_all(new_roles)
  185. # 解析岗位ID列表
  186. # 1.清除当前用户的所有岗位关联
  187. db.query(SysUserPost).filter(SysUserPost.user_id == user_id_1).delete()
  188. # 2.创建新的用户角色关联
  189. new_posts = [SysUserPost(user_id=user_id_1, post_id=post_id) for post_id in postIds]
  190. db.add_all(new_posts)
  191. sys_user_role_data.sign_table()
  192. sys_user_post_data.sign_table()
  193. db.commit()
  194. db_czrz.log(db, auth_user, "系统管理", f"后台管理更新用户【{nickName}】成功", request.client.host)
  195. return {"code": 200, "msg": "更新成功", "data": None}
  196. except Exception as e:
  197. traceback.print_exc()
  198. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  199. @router.put('/resetPwd')
  200. async def userupdate(
  201. request: Request,
  202. auth_user: AuthUser = Depends(find_auth_user),
  203. db: Session = Depends(get_db),
  204. user_id: int = Depends(valid_access_token),
  205. body = Depends(remove_xss_json)
  206. ):
  207. try:
  208. user_id_1 = body['userId']
  209. user = user_id_get_user_info(db,user_id_1)
  210. password = body['password']
  211. try:
  212. check_password_base(body['password'])
  213. except Exception as e:
  214. return {
  215. 'code': 500,
  216. 'msg': str(e)
  217. }
  218. user.password = mpfun.enc_data(password)
  219. user.sign = sys_user_data.get_sign_hmac(user)
  220. user.update_by = user_id
  221. user.update_time = datetime.now()
  222. db.commit()
  223. db_czrz.log(db, auth_user, "系统管理", f"后台管理重置用户密码【{user.nick_name}】成功", request.client.host)
  224. return {"code": 200, "msg": "重置用户密码成功", "data": None}
  225. except Exception as e:
  226. traceback.print_exc()
  227. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  228. @router.post("/export")
  229. async def export_to_excel(
  230. request: Request,
  231. auth_user: AuthUser = Depends(find_auth_user),
  232. db: Session = Depends(get_db),
  233. user_id: str = Depends(valid_access_token)
  234. ):
  235. # 获取对应填报ID的数据表名称
  236. data_table_name = 'sys_user'
  237. # 获取表结构(用户填报的字段)
  238. inspector = inspect(db.bind)
  239. columns = inspector.get_columns(data_table_name)
  240. # 提取用户填报的字段注释
  241. user_report_columns = [col for col in columns if col['name'] in ['user_id', 'dept_id', 'user_name', 'nick_name', 'phonenumber']]
  242. column_comments = [col.get('comment', '') for col in user_report_columns]
  243. # 构建查询SQL,关联 sys_user 表获取 nick_name
  244. query_sql = f"""
  245. SELECT {', '.join([f'rd.{col["name"]}' for col in user_report_columns])}
  246. FROM {data_table_name} rd where del_flag<>'2'
  247. """
  248. # 使用 text 包装查询字符串
  249. result = db.execute(text(query_sql))
  250. rows = result.fetchall()
  251. import pandas as pd
  252. from io import BytesIO
  253. # 将查询结果转换为 DataFrame
  254. df = pd.DataFrame(rows, columns= column_comments)
  255. # 将 DataFrame 导出为 Excel 文件
  256. output = BytesIO()
  257. with pd.ExcelWriter(output, engine='openpyxl') as writer:
  258. df.to_excel(writer, index=False, sheet_name='用户列表')
  259. # 设置响应头
  260. output.seek(0)
  261. headers = {
  262. 'Content-Disposition': 'attachment; filename="report_data.xlsx"',
  263. 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  264. }
  265. db_czrz.log(db, auth_user, "系统管理", f"后台管理导出用户数据成功", request.client.host)
  266. # 返回文件流
  267. return StreamingResponse(output, headers=headers)
  268. @router.get('/getInfo')
  269. async def getInfo(request: Request,db: Session = Depends(get_db), user_id: int = Depends(valid_access_token)):
  270. try:
  271. # 用户信息
  272. info = db.query(SysUser).filter(SysUser.user_id == user_id).first()
  273. if info is None:
  274. return {
  275. "code": 200,
  276. "msg": "操作成功",
  277. "data": None}
  278. # 部门信息
  279. dept_name = ""
  280. dept_info = db.query(SysDept).filter(SysDept.dept_id == info.dept_id).first()
  281. if dept_name is not None:
  282. dept_name = dept_info.dept_name
  283. # 角色信息
  284. roles = []
  285. role_ids = db.query(SysUserRole).filter(SysUserRole.user_id == user_id).all()
  286. for role in role_ids:
  287. role_info = db.query(SysRole).filter(SysRole.role_id == role.role_id).first()
  288. roles.append(
  289. {
  290. "roleId": role_info.role_id,
  291. "roleName": role_info.role_name,
  292. "roleKey": role_info.role_key,
  293. "roleSort": role_info.role_sort,
  294. "dataScope": role_info.data_scope,
  295. "menuCheckStrictly": role_info.menu_check_strictly,
  296. "deptCheckStrictly": role_info.dept_check_strictly,
  297. "status": role_info.status,
  298. "remark": role_info.remark,
  299. "createTime": get_datetime_str(role_info.create_time),
  300. "flag": False,
  301. "superAdmin": True
  302. }
  303. )
  304. role_keys = [
  305. n['roleKey']
  306. for n in roles
  307. ]
  308. return {
  309. "code": 200,
  310. "msg": "操作成功",
  311. "data": {
  312. "user": {
  313. "userId": info.user_id,
  314. "tenantId": info.tenant_id,
  315. "deptId": info.dept_id,
  316. "userName": mpfun.dec_data(info.user_name),
  317. "nickName": info.nick_name,
  318. "userType": info.user_type,
  319. "email": mpfun.dec_data(info.email),
  320. "phonenumber": mpfun.dec_data(info.phonenumber),
  321. "sex": info.sex,
  322. "avatar": info.avatar,
  323. "status": info.status,
  324. "loginIp": info.login_ip,
  325. "loginDate": get_datetime_str(info.login_date),
  326. "remark": info.remark,
  327. "createTime": get_datetime_str(info.create_time),
  328. "deptName": dept_name,
  329. "roles": roles,
  330. "roleIds": None,
  331. "postIds": None,
  332. "roleId": None
  333. },
  334. "permissions": [
  335. "*:*:*"
  336. ],
  337. "roles": role_keys
  338. }
  339. }
  340. except Exception as e:
  341. traceback.print_exc()
  342. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  343. @router.get('/deptTree')
  344. async def deptTree(request: Request,db: Session = Depends(get_db), user_id: int = Depends(valid_access_token)):
  345. def build_dept_tree(depts, parent_dept):
  346. dept_tree = []
  347. for dept_info in depts:
  348. dept = {
  349. "id": dept_info.dept_id,
  350. "label": dept_info.dept_name,
  351. "parentId": dept_info.parent_id,
  352. "weight": dept_info.order_num
  353. }
  354. # print(dept_info.dept_id)
  355. children = parent_id_get_dept_info(db, dept_info.dept_id)
  356. if len(children) > 0:
  357. children_depts = build_dept_tree(children, dept)
  358. dept["children"] = children_depts
  359. dept_tree.append(dept)
  360. return dept_tree
  361. result = build_dept_tree(parent_id_get_dept_info(db, 0),None)
  362. return {
  363. "code": 200,
  364. "msg": "操作成功",
  365. "data": result
  366. }
  367. @router.get('/avcon/deptTree')
  368. async def deptTree(request: Request,label: str = Query(None, description='部门名称'),db: Session = Depends(get_db), user_id: int = Depends(valid_access_token)):
  369. """
  370. def build_dept_tree(depts, parent_dept):
  371. dept_tree = []
  372. for dept_info in depts:
  373. dept = {
  374. "id": dept_info.dept_id,
  375. "label": dept_info.dept_name,
  376. # "parentId": dept_info.parent_id,
  377. # "weight": dept_info.order_num
  378. }
  379. # print(dept_info.dept_id)
  380. children = parent_id_get_dept_info(db, dept_info.dept_id)
  381. if len(children) > 0:
  382. children_depts = build_dept_tree(children, dept)
  383. dept["children"] = children_depts
  384. # userlist=dept_id_get_user_info(db,dept_info.dept_id)
  385. # if userlist:
  386. # for user_info in userlist:
  387. # dept["children"].append({"id":user_info.user_id,"label":user_info.nick_name,"isLeaf":True})
  388. else:
  389. dept['isLeaf']=True
  390. # userlist = dept_id_get_user_info(db, dept_info.dept_id)
  391. # if userlist:
  392. # for user_info in userlist:
  393. # dept["children"].append({"id": user_info.user_id, "label": user_info.nick_name, "isLeaf": True})
  394. dept_tree.append(dept)
  395. return dept_tree
  396. # result = []
  397. if label:
  398. query = db.query(SysDept)
  399. query = query.filter(SysDept.del_flag != '2')
  400. query = query.filter(SysDept.dept_name.like(f'%{label}%'))
  401. # for dept_info in :
  402. result=build_dept_tree(query.all(), None)
  403. else:
  404. result=build_dept_tree(parent_id_get_dept_info(db, 0),None)
  405. """
  406. result = []
  407. # 暂时写死
  408. result.append({
  409. "id": "G2@mm.zw.yj",
  410. "label": "指挥终端",
  411. "isLeaf": True
  412. })
  413. result.append({
  414. "id": "G5@mm.zw.yj",
  415. "label": "移动视频",
  416. "isLeaf": True
  417. })
  418. result.append({
  419. "id": "G6@mm.zw.yj",
  420. "label": "H323会议",
  421. "isLeaf": True
  422. })
  423. return {
  424. "code": 200,
  425. "msg": "操作成功",
  426. "data": result
  427. }
  428. # def get_query_params(params: dict):
  429. # return params
  430. # def get_time_params(params: dict = Depends(get_query_params)):
  431. # try:
  432. # begin_time = params.get("beginTime")
  433. # end_time = params.get("endTime")
  434. # return begin_time, end_time
  435. # except:
  436. # return None,None
  437. @router.get('/list')
  438. async def userlist( deptId: int = Query(None ,description='部门id'),
  439. userName: str = Query(None, description='用户名'),
  440. status: int = Query(None, description='用户状态'),
  441. phonenumber : str = Query(None, description='手机号'),
  442. page: int = Query(1, gt=0, description='页码'),
  443. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  444. db: Session = Depends(get_db),
  445. user_id: int = Depends(valid_access_token)):
  446. try:
  447. # 构建查询
  448. query = db.query(SysUser)
  449. query = query.filter(SysUser.del_flag != '2')
  450. # 应用查询条件
  451. if userName:
  452. query =query.filter(SysUser.user_name == mpfun.enc_data(userName))
  453. if status:
  454. query =query.filter(SysUser.status == status)
  455. if phonenumber:
  456. query =query.filter(SysUser.phonenumber == mpfun.enc_data(phonenumber))
  457. def get_dept_chli(dept_list : list,parent_id : int):
  458. depts = parent_id_get_dept_info(db,parent_id)
  459. if depts:
  460. for dept in depts:
  461. dept_list.append(dept.dept_id)
  462. get_dept_chli(dept_list, dept.dept_id)
  463. return dept_list
  464. if deptId:
  465. query = query.filter(SysUser.dept_id.in_(get_dept_chli([deptId],deptId)))
  466. # 计算总条目数
  467. total_items = query.count()
  468. # 排序
  469. query = query.order_by(SysUser.create_time.desc())
  470. # 执行分页查询
  471. users = query.offset((page - 1) * pageSize).limit(pageSize).all()
  472. # 将查询结果转换为列表形式的字典
  473. user_list = []
  474. for user in users:
  475. # roleIds = user_id_get_user_roleIds(db, user.user_id)
  476. # user_roles = role_id_list_get_user_role(db,roleIds)
  477. user_info = {
  478. "userId": user.user_id,
  479. "tenantId": user.tenant_id,
  480. "deptId": user.dept_id,
  481. "userName": mpfun.dec_data(user.user_name),
  482. "nickName": user.nick_name,
  483. "userType": user.user_type,
  484. "email": mpfun.dec_data(user.email),
  485. "phonenumber": mpfun.dec_data(user.phonenumber),
  486. "sex": user.sex,
  487. "avatar": user.avatar,
  488. "status": user.status,
  489. "loginIp": user.login_ip,
  490. "loginDate": user.login_date.strftime('%Y-%m-%d %H:%M:%S') if user.login_date else '',
  491. "remark": user.remark,
  492. "createTime": user.create_time.strftime('%Y-%m-%d %H:%M:%S') if user.create_time else '',
  493. "deptName": user.dept_name,
  494. # "roles": user_roles,
  495. # "roleIds": None,
  496. # "postIds": None,
  497. # "roleId": None
  498. }
  499. user_list.append(user_info)
  500. # 返回结果
  501. return {
  502. "code": 200,
  503. "msg": "成功用户列表",
  504. "rows": user_list,
  505. "total": total_items,
  506. "page": page,
  507. "pageSize": pageSize,
  508. "totalPages": (total_items + pageSize - 1) // pageSize
  509. }
  510. except Exception as e:
  511. traceback.print_exc()
  512. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  513. @router.get('/list/dept/{dept_id}')
  514. async def get_dept_user_list(
  515. # request: Request,
  516. dept_id: int,
  517. db: Session = Depends(get_db),
  518. body = Depends(remove_xss_json),
  519. user_id = Depends(valid_access_token)
  520. ):
  521. query = db.query(SysUser)
  522. query = query.filter(SysUser.del_flag != '2')
  523. if dept_id:
  524. query = query.filter(SysUser.dept_id == dept_id)
  525. user_list = query.all()
  526. # 将模型实例转换为字典
  527. user_list_dict = [{
  528. "userId": user.user_id,
  529. "tenantId": user.tenant_id,
  530. "deptId": user.dept_id,
  531. "userName": mpfun.dec_data(user.user_name),
  532. "nickName": user.nick_name,
  533. "userType": user.user_type,
  534. "email": mpfun.dec_data(user.email),
  535. "phonenumber": mpfun.dec_data(user.phonenumber),
  536. "sex": user.sex,
  537. "avatar": user.avatar,
  538. "status": user.status,
  539. "loginIp": user.login_ip,
  540. "loginDate": user.login_date.strftime('%Y-%m-%d %H:%M:%S') if user.login_date else '',
  541. "remark": user.remark,
  542. "createTime": user.create_time.strftime('%Y-%m-%d %H:%M:%S') if user.create_time else '',
  543. "deptName": user.dept_name,
  544. "roles": None,
  545. "roleIds": None,
  546. "postIds": None,
  547. "roleId": None
  548. } for user in user_list]
  549. return {
  550. "code": 200,
  551. "data": user_list_dict,
  552. "msg": "操作成功"
  553. }
  554. @router.put('/changeStatus')
  555. async def change_user_status(
  556. request: Request,
  557. auth_user: AuthUser = Depends(find_auth_user),
  558. db: Session = Depends(get_db),
  559. body=Depends(remove_xss_json),
  560. user_id=Depends(valid_access_token)
  561. ):
  562. try:
  563. userId = body['userId']
  564. status = body['status']
  565. query = db.query(SysUser)
  566. query = query.filter(SysUser.del_flag != '2')
  567. query = query.filter(SysUser.user_id == userId)
  568. user = query.first()
  569. user.status = status
  570. user.sign = sys_user_data.get_sign_hmac(user)
  571. user.update_by = user_id
  572. user.update_time = datetime.now()
  573. db.commit()
  574. db_czrz.log(db, auth_user, "系统管理", f"后台管理变更用户状态成功", request.client.host)
  575. return {
  576. "code": 200,
  577. "msg": "操作成功"
  578. }
  579. except Exception as e:
  580. # 处理异常
  581. traceback.print_exc()
  582. raise HTTPException(status_code=500, detail=str(e))
  583. @router.delete('/{user_id1}')
  584. async def delete_user(
  585. user_id1: str,
  586. request: Request,
  587. auth_user: AuthUser = Depends(find_auth_user),
  588. db: Session = Depends(get_db),
  589. body = Depends(remove_xss_json),
  590. user_id = Depends(valid_access_token)
  591. ):
  592. userIdList=user_id1.split(',')
  593. for user_id1 in userIdList:
  594. user = user_id_get_user_info(db,user_id1)
  595. # 将模型实例转换为字典
  596. print(user)
  597. user.del_flag = '2'
  598. user.sign = sys_user_data.get_sign_hmac(user)
  599. user.update_by = user_id
  600. user.update_time = datetime.now()
  601. db.commit()
  602. db_czrz.log(db, auth_user, "系统管理", f"后台管理删除用户{user.nick_name}记录成功", request.client.host)
  603. return {
  604. "code": 200,
  605. "data": None,
  606. "msg": "操作成功"
  607. }
  608. @router.get('/videoPoints')
  609. async def get_user_video_points(
  610. db: Session = Depends(get_db),
  611. body = Depends(remove_xss_json),
  612. user_id = Depends(valid_access_token)):
  613. try:
  614. videoIds = user_id_get_user_videoIds(db,user_id)
  615. video_list = [i.video_code_int for i in videoIds]
  616. query = db.query(TPVideoInfo)
  617. query = query.filter(TPVideoInfo.gbIndexCode.in_(video_list))
  618. video_info = query.all()
  619. return {
  620. "code": 200,
  621. "msg": "成功",
  622. "data": {"videoIds":[i.video_code_int for i in videoIds],
  623. "videoInfos":[{"name":info.name,"video_code_int":info.gbIndexCode} for info in video_info]}
  624. }
  625. except Exception as e:
  626. traceback.print_exc()
  627. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  628. @router.put('/videoPoints')
  629. async def get_user_video_points(
  630. db: Session = Depends(get_db),
  631. body = Depends(remove_xss_json),
  632. user_id = Depends(valid_access_token)):
  633. try:
  634. query = db.query(SysUserVideo)
  635. query = query.filter(SysUserVideo.user_id == user_id)
  636. query.delete(synchronize_session=False)
  637. db.commit()
  638. for video in body:
  639. new_user_video = SysUserVideo(
  640. user_id=user_id,
  641. video_code_int = video
  642. )
  643. db.add(new_user_video)
  644. db.commit()
  645. return {
  646. "code": 200,
  647. "msg": "成功",
  648. "data":None
  649. }
  650. except Exception as e:
  651. traceback.print_exc()
  652. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  653. @router.put('/authRole')
  654. async def authRoleUpdate(
  655. request: Request,
  656. userId: int = Query(None ,description='用户id'),
  657. roleIds: str = Query(None ,description='权限id'),
  658. auth_user: AuthUser = Depends(find_auth_user),
  659. db: Session = Depends(get_db),
  660. user_id: int = Depends(valid_access_token)):
  661. try:
  662. user = user_id_get_user_info(db, userId)
  663. # 解析角色ID列表
  664. role_ids_list = [int(id) for id in roleIds.split(',')]
  665. # 清除当前用户的所有角色关联
  666. db.query(SysUserRole).filter(SysUserRole.user_id == userId).delete()
  667. # 创建新的用户角色关联
  668. new_roles = [SysUserRole(user_id=userId, role_id=role_id) for role_id in role_ids_list]
  669. db.add_all(new_roles)
  670. db.commit()
  671. sys_user_role_data.sign_table()
  672. db_czrz.log(db, auth_user, "系统管理", f"后台管理分配用户{user.nick_name}角色成功", request.client.host)
  673. return {"code": 200, "msg": "更新成功", "data": None}
  674. except Exception as e:
  675. traceback.print_exc()
  676. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  677. @router.get('/profile')
  678. async def userlist( #user_id_1: int = Query(None ,description='用户id'),
  679. db: Session = Depends(get_db),
  680. user_id: int = Depends(valid_access_token)):
  681. try:
  682. user = user_id_get_user_info(db,user_id)
  683. # 将查询结果转换为列表形式的字典
  684. roleIds = user_id_get_user_roleIds(db, user_id)
  685. user_roles = role_id_list_get_user_role(db,roleIds)
  686. dept = dept_id_get_dept_info(db,user.dept_id)
  687. user_info = {
  688. "admin":1 in roleIds,
  689. "avatar": user.avatar,
  690. "createBy":mpfun.dec_data(user_id_get_user_info(db,user.create_by).user_name),
  691. "createTime": user.create_time.strftime('%Y-%m-%d %H:%M:%S') if user.create_time else '',
  692. "delFlag":user.del_flag,
  693. "dept":{
  694. "createBy": user_id_get_user_info(db,dept.create_by).user_name if dept.create_by else None,
  695. "createTime": dept.create_time.strftime('%Y-%m-%d %H:%M:%S') if dept.create_time else None,
  696. "updateBy": user_id_get_user_info(db,dept.update_by).user_name if dept.update_by else None,
  697. "updateTime": dept.create_time.strftime('%Y-%m-%d %H:%M:%S') if dept.create_time else None,
  698. "remark": '',#dept.remark,
  699. "deptId": dept.dept_id,
  700. "parentId": dept.parent_id,
  701. "ancestors": dept.ancestors,
  702. "deptName": dept.dept_name,
  703. "orderNum": dept.order_num,
  704. "leader": dept.leader_name,
  705. "phone": dept.phone,
  706. "email": dept.email,
  707. "status": dept.status,
  708. "delFlag": dept.del_flag,
  709. "parentName": dept.parent_name,
  710. "children": []
  711. },
  712. "deptId": user.dept_id,
  713. "email": mpfun.dec_data(user.email),
  714. "loginDate": user.login_date.strftime('%Y-%m-%d %H:%M:%S') if user.login_date else '',
  715. "loginIp": user.login_ip,
  716. "nickName": user.nick_name,
  717. "password":"",
  718. "phonenumber": mpfun.dec_data(user.phonenumber),
  719. "postIds": None,
  720. "remark": user.remark,
  721. "roleId": None,
  722. "roleIds": roleIds,
  723. "roles": user_roles,
  724. "sex": user.sex,
  725. "status": user.status,
  726. "expireTime": user.expire_time,
  727. "updateBy":user.update_by,
  728. "updateTime": user.create_time.strftime('%Y-%m-%d %H:%M:%S') if user.create_time else None,
  729. "userId": user.user_id,
  730. "userName": mpfun.dec_data(user.user_name),
  731. "tenantId": user.tenant_id,
  732. "userType": user.user_type,
  733. "deptName": dept.dept_name,
  734. "postGroup":"工作人员",
  735. "roleGroup":'/'.join([i["roleName"] for i in user_roles])
  736. }
  737. # roles = get_role(db,roleIds)
  738. # 返回结果
  739. return {
  740. "code": 200,
  741. "msg": "成功用户列表",
  742. "data": user_info,
  743. # {
  744. # "user":user_list,
  745. # "roleIds":roleIds,
  746. # "roles":roles,
  747. # "postIds":[],
  748. # "posts":[]
  749. # }
  750. }
  751. except Exception as e:
  752. traceback.print_exc()
  753. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  754. @router.post('/profile/avatar')
  755. async def updateAvatar(
  756. request: Request,
  757. auth_user: AuthUser = Depends(find_auth_user),
  758. db: Session = Depends(get_db),
  759. user_id: int = Depends(valid_access_token)):
  760. db_czrz.log(db, auth_user, "系统管理", f"后台管理更新用户头像成功", request.client.host)
  761. return {
  762. "code": 200,
  763. "msg": "更新头像成功"
  764. }
  765. @router.put('/profile')
  766. async def userlist(
  767. request: Request,
  768. auth_user: AuthUser = Depends(find_auth_user),
  769. db: Session = Depends(get_db),
  770. body = Depends(remove_xss_json),
  771. user_id: int = Depends(valid_access_token)):
  772. try:
  773. user = user_id_get_user_info(db,user_id)
  774. if "email" in body:
  775. user.email = mpfun.enc_data(body['email'])
  776. if "nickName" in body:
  777. user.nick_name = body['nickName']
  778. if "phonenumber" in body:
  779. user.phonenumber = mpfun.enc_data(body['phonenumber'])
  780. if "sex" in body:
  781. user.sex = body['sex']
  782. user.sign = sys_user_data.get_sign_hmac(user)
  783. user.update_by = user_id
  784. user.update_time = datetime.now()
  785. db.commit()
  786. print('auth_user', auth_user)
  787. db_czrz.log(db, auth_user, "系统管理", f"后台管理更新用户【{user.nick_name}】个人信息成功", request.client.host)
  788. return {"code":200,"msg":"成功","data":None}
  789. except Exception as e:
  790. traceback.print_exc()
  791. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  792. @router.put('/profile/updatePwd')
  793. async def userlist(
  794. request: Request,
  795. auth_user: AuthUser = Depends(find_auth_user),
  796. db: Session = Depends(get_db),
  797. body = Depends(remove_xss_json),
  798. user_id: int = Depends(valid_access_token)):
  799. try:
  800. user = user_id_get_user_info(db,user_id)
  801. if user.password != mpfun.enc_data(body['oldPassword']):
  802. return {"code": 500, "msg":"旧密码错误"}
  803. if "newPassword" in body:
  804. try:
  805. check_password_base(body['newPassword'])
  806. except Exception as e:
  807. return {
  808. 'code': 500,
  809. 'msg': str(e)
  810. }
  811. user.password = mpfun.enc_data(body['newPassword'])
  812. user.sign = sys_user_data.get_sign_hmac(user)
  813. user.update_by = user_id
  814. user.update_time = datetime.now()
  815. db.commit()
  816. db_czrz.log(db, auth_user, "系统管理", f"后台管理更新用户【{user.nick_name}】个人中心密码成功", request.client.host)
  817. return {"code":200,"msg":"修改密码成功","data":None}
  818. except Exception as e:
  819. traceback.print_exc()
  820. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  821. @router.get('/authRole/{user_id_1}')
  822. @router.get('/{user_id_1}')
  823. async def userlist( user_id_1: int = Query(None ,description='用户id'),
  824. db: Session = Depends(get_db),
  825. user_id: int = Depends(valid_access_token)):
  826. try:
  827. user = user_id_get_user_info(db,user_id_1)
  828. # 将查询结果转换为列表形式的字典
  829. roleIds = user_id_get_user_roleIds(db, user_id_1)
  830. user_roles = role_id_list_get_user_role(db,roleIds)
  831. user_list = {
  832. "userId": user.user_id,
  833. "tenantId": user.tenant_id,
  834. "deptId": user.dept_id,
  835. "userName": mpfun.dec_data(user.user_name),
  836. "nickName": user.nick_name,
  837. "userType": user.user_type,
  838. "email": mpfun.dec_data(user.email),
  839. "phonenumber": mpfun.dec_data(user.phonenumber),
  840. "sex": user.sex,
  841. "avatar": user.avatar,
  842. "status": user.status,
  843. "loginIp": user.login_ip,
  844. "loginDate": user.login_date.strftime('%Y-%m-%d %H:%M:%S') if user.login_date else '',
  845. "remark": user.remark,
  846. "createTime": user.create_time.strftime('%Y-%m-%d %H:%M:%S') if user.create_time else '',
  847. "deptName": user.dept_name,
  848. "yzyAccount": (user.yzy_account),
  849. "expireTime": user.expire_time,
  850. }
  851. roles = get_role(db,roleIds)
  852. postIds = user_id_get_user_postIds(db, user_id_1)
  853. posts = dept_id_get_dept_post(db, user.dept_id)
  854. # 返回结果
  855. return {
  856. "code": 200,
  857. "msg": "成功用户列表",
  858. "data": {
  859. "user":user_list,
  860. # 用户当前的所属角色ID列表
  861. "roleIds":roleIds,
  862. # 用户当前所属部门岗位ID列表
  863. "postIds": postIds,
  864. # 可供选择的角色列表
  865. "roles":roles,
  866. # 可供选择的部门岗位列表
  867. "posts": posts
  868. }
  869. }
  870. except Exception as e:
  871. traceback.print_exc()
  872. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  873. # 判断是否密码是否至少12位且必须包含大小写字母和数字
  874. def check_password_base(pwd):
  875. zz_str = '^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{12,}$'
  876. re1 = re.search(zz_str, pwd)
  877. if not re1:
  878. raise Exception('密码至少12位且必须包含大小写字母和数字')
  879. else:
  880. check_password_special(pwd)
  881. # 判断是否密码包含易猜解字符
  882. def check_password_special(pwd):
  883. list_special = ['admin', 'root', 'crld', 'crland', 'test', 'hello', '147258', '147369', '258369']
  884. x=len(list_special)-1
  885. for pwd_special in list_special:
  886. if pwd_special in pwd.lower():
  887. raise Exception('密码不能包含易猜解字符:'+str(pwd_special))
  888. else:
  889. if pwd_special==list_special[x]:
  890. check_password_adv(pwd)
  891. # 判断是否是连续、重复以及易猜解
  892. def check_password_adv(pwd):
  893. str_all = '1234567890-=' \
  894. '=-0987654321' \
  895. '!@#$%^&*()_+' \
  896. '+_)(*&^%$#@!' \
  897. 'abcdefghijklmnopqrstuvwxyz' \
  898. 'zyxwvutsrqponmlkjihgfedcba' \
  899. 'qwertyuiopasdfghjklzxcvbnm' \
  900. 'mnbvcxzlkjhgfdsapoiuytrewq' \
  901. '1qaz2wsx3edc4rfv5tgb6yhn7ujm8ik,9ol.0p;/'
  902. pwd_len=len(pwd)
  903. x = -1
  904. y = x+3
  905. while y < pwd_len:
  906. x+=1
  907. y+=1
  908. pwd_cut = pwd[x:y]
  909. #print(pwd_cut)
  910. if pwd_cut.lower() in str_all and len(pwd_cut) == 3: # 无论是大写还是小写都统统转换为小写,为了匹配大写
  911. raise Exception('密码不能包含3位以上连续字符:'+str(pwd_cut))
  912. elif len(pwd_cut) == 3 and pwd_cut[0].lower() == pwd_cut[1].lower() == pwd_cut[2].lower():
  913. raise Exception('密码不能包含3位以上重复字符:'+str(pwd_cut))
  914. else:
  915. if y==pwd_len:
  916. print('密码复杂度合格')