__init__.py 34 KB

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