__init__.py 35 KB

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