__init__.py 36 KB

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