__init__.py 36 KB

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