diff --git a/app/db_cross_delay.py b/app/db_cross_delay.py index f4bbc90..3217c47 100644 --- a/app/db_cross_delay.py +++ b/app/db_cross_delay.py @@ -54,3 +54,20 @@ class CrossDbHelper(TableDbHelperBase): update cross_doctor_matedata.cross_phase_problems_record set final_state = '%s', end_date = '%s' where crossid = '%s' and first_date = '%s' and start_hm = %s """ % (state, end_date, crossid, first_date, start_hm) return self.do_execute(sql) + + def query_monitor_task_dates(self, nodeid, area_id): + day_sql = f"select distinct day from traffic_{nodeid}.cross_inspect where citycode = {nodeid} and area_id = {area_id} and type = 'day'" + week_sql = f"select distinct day from traffic_{nodeid}.cross_inspect where citycode = {nodeid} and area_id = {area_id} and type = 'week'" + day_date_list = self.do_select(day_sql) + week_date_list = self.do_select(week_sql) + day_list = [item['day'] for item in day_date_list] + week_list = [item['day'] for item in week_date_list] + return day_list, week_list + + def query_monitor_data(self, nodeid, area_id, date_type, query_date): + if date_type in ['week', 'workday', 'weekend']: + date_type = 'week' + sql = f""" + select * from traffic_{nodeid}.cross_inspect where citycode = {nodeid} and area_id = {area_id} and type = '{date_type}' and day = '{query_date}' + """ + return self.do_select(sql) \ No newline at end of file diff --git a/app/global_source.py b/app/global_source.py index b7b6c42..746a584 100644 --- a/app/global_source.py +++ b/app/global_source.py @@ -53,10 +53,10 @@ g_redisinfo = { } g_user_db = { - 'host': '120.53.125.169', + 'host': '82.157.173.20', 'port': 3306, 'user': 'root', - 'password': 'pmenJIn7EaK40oThn~~~', + 'password': 'pmenJIn7EaK40oThn~~', 'db': 'user' } diff --git a/app/user_db_func.py b/app/user_db_func.py index 6c814c2..6a6065a 100644 --- a/app/user_db_func.py +++ b/app/user_db_func.py @@ -25,7 +25,7 @@ class UserDbHelper(TableDbHelperBase): return md5.hexdigest() # 返回十六进制的哈希值 def login(self, userno, password_md5): - sql_query = "select password,token, last_modify_pwd_time from `user` where userno='%s'" % (userno) + sql_query = "select password,token, last_modify_pwd_time, role from `user` where userno='%s'" % (userno) users = self.do_select(sql_query) if len(users) != 1: logging.error('query_ledger error! %s' % (sql_query)) @@ -34,9 +34,9 @@ class UserDbHelper(TableDbHelperBase): str_md5 = self.generate_md5(users[0]['password']) if str_md5==password_md5: - return users[0]['token'], users[0]['last_modify_pwd_time'] + return users[0]['token'], users[0]['last_modify_pwd_time'], users[0]['role'] else: - return '', '' + return '', '', '' def authentication(self, token): sql_query = "select author.resource ,author.author from `user`,`author` where user.role=author.role and user.token='%s'" % (token) @@ -139,4 +139,99 @@ class UserDbHelper(TableDbHelperBase): def modify_password(self, userid, new_password): sql = "update user set password = '%s' where userno = '%s'" % (new_password, userid) - return self.do_execute(sql) \ No newline at end of file + return self.do_execute(sql) + + def query_users(self): + sql = """ + select t1.*, t2.area_ids, t2.nodeids from + (select userno, user_name, role, password, last_modify_pwd_time from user where state != 1) t1 + left join + (select userno, GROUP_CONCAT(area_id SEPARATOR ',') as area_ids, GROUP_CONCAT(nodeid SEPARATOR ',') as nodeids from area_user group by userno) t2 + on t1.userno = t2.userno + """ + return self.do_select(sql) + + def query_user_info_sql(self, userid): + sql = "select * from user where userno = '%s'" % (userid) + res = self.do_select(sql) + if res: + return res[0] + return None + + def update_user_info(self, modify_sql, userid, area_id_list, new_userid, all_area_info_dict): + conn, cursor = self.connect() + conn.begin() + sql1 = "update user %s where userno = '%s'" % (modify_sql, userid) + sql2 = "delete from area_user where userno = '%s'" % (userid) + values = [] + if not new_userid: + for area_id in area_id_list: + values.append((userid, area_id, all_area_info_dict[int(area_id)]['nodeid'])) + else: + for area_id in area_id_list: + values.append((new_userid, area_id, all_area_info_dict[int(area_id)]['nodeid'])) + sql3 = "insert into area_user(userno, area_id, nodeid) values(%s, %s, %s)" + try: + if modify_sql != '': + ret = cursor.execute(sql1) + else: + ret = 1 + cursor.execute(sql2) + if len(area_id_list) > 0: + ret2 = cursor.executemany(sql3, values) + else: + ret2 = 0 + if ret != 1 or ret2 != len(area_id_list): + conn.rollback() + return False, ret2 + else: + conn.commit() + return True, ret2 + except Exception as e: + logging.error(e) + conn.rollback() + return False, 0 + + def insert_login_log(self, userid, op_type, ip, ip_city, op_user=None): + sql = """ + insert into login_log (userid, op_type, ip, ip_city) values ('%s', '%s', '%s', '%s') + """ % (userid, op_type, ip, ip_city) + if op_user: + sql = """ + insert into login_log (userid, op_type, ip, ip_city,op_user) values ('%s', '%s', '%s', '%s', '%s') + """ % (userid, op_type, ip, ip_city, op_user) + return self.do_execute(sql) + + def del_user_sql(self, userid): + sql = """ + update user set state = 1 where userno = '%s' + """ % (userid) + return self.do_execute(sql) + + def insert_user(self, userid, password, user_name, area_id_list, all_area_info_dict): + values = [] + for area_id in area_id_list: + values.append((userid, area_id, all_area_info_dict[int(area_id)]['nodeid'])) + tmp_token = 'iuqwefhjdbcsajhdshcgaiudncjadhajn_' + userid + sql1 = """ + insert into user(userno, user_name, password, token, department, role) values('%s', '%s', '%s', '%s', '信号调优团队', 'engineer') + """ % (userid, user_name, password, tmp_token) + sql2 = "insert into area_user(userno, area_id, nodeid) values(%s, %s, %s)" + conn, cursor = self.connect() + conn.begin() + try: + ret = self.do_execute(sql1) + if len(area_id_list) > 0: + ret2 = cursor.executemany(sql2, values) + else: + ret2 = 0 + if ret != 1 or ret2 != len(area_id_list): + conn.rollback() + return False + else: + conn.commit() + return True + except Exception as e: + logging.error(e) + conn.rollback() + return False diff --git a/app/user_views.py b/app/user_views.py index 197ab1e..5fd5660 100644 --- a/app/user_views.py +++ b/app/user_views.py @@ -2,10 +2,13 @@ # @Author: Owl # @Date: 2025/11/10 18:12 # @Description: +import json +import logging + +import requests from flask import Flask, request from app.cross_eva_views import app -from app.user_worker import query_host_by_nodeid, do_login, do_authentication, do_get_user_info, set_rerun_dates, \ - clear_rerun_dates, get_rerun_dates, do_modify_password +from app.user_worker import * @app.route('/api/route', methods=['GET']) @@ -16,9 +19,14 @@ def query_route(): #输入userno #输入password(MD5) #返回token -@app.route('/api/login', methods=['GET']) +@app.route('/api/login', methods=['POST']) def login(): - return do_login(dict(request.args)) + ip = request.remote_addr + params = request.get_json() + city_name = get_province_by_ip(ip) + params['ip'] = ip + params['city_name'] = city_name + return do_login(params) #输入token #返回有操作权限的资源列表 @@ -61,4 +69,57 @@ def get_rerun(): @app.route('/api/modify_password', methods=['POST']) def modify_password(): - return do_modify_password(request.get_json()) \ No newline at end of file + ip = request.remote_addr + params = request.get_json() + city_name = get_province_by_ip(ip) + params['ip'] = ip + params['city_name'] = city_name + return do_modify_password(params) + + +@app.route('/api/query_all_users', methods=['GET']) +def query_all_users_controller(): + return query_user_list(dict(request.args)) + + +def get_province_by_ip(ip): + try: + response = requests.get(f'http://whois.pconline.com.cn/ipJson.jsp?ip={ip}&json=true') + ip_info = json.loads(response.content.strip().decode('gbk')) + addr = ip_info['addr'] + if addr == ' 本机地址': + addr = '本机' + return addr.split(' ')[0] + except Exception as e: + logging.error(e) + return '未知' + + +@app.route('/api/modify_user', methods=['POST']) +def modify_user_controller(): + params = request.get_json() + ip = request.remote_addr + city_name = get_province_by_ip(ip) + params['ip'] = ip + params['city_name'] = city_name + return modify_user(params) + + +@app.route('/api/delete_user', methods=['GET']) +def delete_user_controller(): + params = dict(request.args) + ip = request.remote_addr + city_name = get_province_by_ip(ip) + params['ip'] = ip + params['city_name'] = city_name + return del_user(params) + + +@app.route('/api/add_user', methods=['POST']) +def add_user_controller(): + params = request.get_json() + ip = request.remote_addr + city_name = get_province_by_ip(ip) + params['ip'] = ip + params['city_name'] = city_name + return create_user(params) \ No newline at end of file diff --git a/app/user_worker.py b/app/user_worker.py index e4b8a82..01aa32a 100644 --- a/app/user_worker.py +++ b/app/user_worker.py @@ -1,7 +1,10 @@ import configparser import json + +from pypinyin import lazy_pinyin + from app.common_worker import check_param -from app.global_source import db_user +from app.global_source import db_user, g_config from app.user_db_func import * @@ -21,13 +24,19 @@ def query_host_by_nodeid(params): def do_login(params): userno = params.get('userno') password = params.get('password') - - token, last_modify_pdw_time = db_user.login(userno, password) - + ip = check_param(params, 'ip') + city_name = check_param(params, 'city_name') + token, last_modify_pdw_time, role = db_user.login(userno, password) + area_infos = db_user.query_all_area_infos() if token is not None and len(token) > 0: res = make_res(0, 'ok', '登录成功。') res['token'] = token areaid_list = db_user.query_areaid_list(userno) + if not areaid_list: + if role != 'manager': + return json.dumps(make_common_res(3, '无可用城市信息,请联系管理员添加城市权限')) + else: + areaid_list = list(area_infos.keys()) areaid_list = [x for x in set(areaid_list)] area_infos = db_user.query_all_area_infos() area_info_list = [] @@ -49,6 +58,9 @@ def do_login(params): return json.dumps(make_common_res(5, '密码已过期,请修改密码后重试')) res['node_list'] = area_info_list res['usable_date'] = abs(time_diff.days - 30) + ret = db_user.insert_login_log(userno, 0, ip, city_name) + if ret != 1: + return json.dumps(make_common_res(6, '登录失败,请检查是否已经登录。')) else: res = make_res(-1, '登录失败,请检查用户名或者密码是否正确。', 'error') res['token'] = '' @@ -82,8 +94,11 @@ def do_get_user_info(params, token): all_area_info = db_user.query_all_area_infos() user = db_user.query_user(token) if user is not None: + super_user = 0 + if user['userno'] in g_config['executives']: + super_user = 1 user_t = {'userno': user['userno'], 'user_name': user['user_name'], 'role': user['role'], - 'department': user['department']} + 'department': user['department'], 's': super_user} if user['role'] == 'manager': all_areas = db_user.query_all_area_infos() user_area_info = list(all_areas.values()) @@ -150,11 +165,17 @@ def do_modify_password(params): new_password = params.get('new_password') if not new_password: return json.dumps(make_common_res(3, '新密码信息缺失,请刷新后重试')) - + if len(new_password) < 6: + return json.dumps(make_common_res(4, '新密码长度不能小于6位')) + ip = check_param(params, 'ip') + city_name = check_param(params, 'city_name') check_res, role, last_modify_pwd_time = db_user.check_user_info(userid, password) if check_res == 0: ret = db_user.modify_password(userid, new_password) if ret == 1: + insert_log_ret = db_user.insert_login_log(userid, 1, ip, city_name) + if insert_log_ret != 1: + return json.dumps(make_common_res(5, '登录失败,请检查是否已经登录。')) return json.dumps(make_common_res(0, 'ok')) else: return json.dumps(make_common_res(4, '修改密码失败,请稍后重试')) @@ -162,3 +183,211 @@ def do_modify_password(params): return json.dumps(make_common_res(3, '用户名不存在,请检查后重试')) else: return json.dumps(make_common_res(4, '用户名或密码错误,请检查后重试')) + + +def query_user_list(params): + userid = check_param(params, 'userid') + if not userid: + return json.dumps(make_common_res(1, '用户id信息异常,请检查后重试')) + if userid not in g_config['executives']: + return json.dumps(make_common_res(2, '用户无权限')) + keyword = check_param(params, 'keyword') + if not keyword: + keyword = '' + role = check_param(params, 'role') + if not role: + role = 0 + role = int(role) + start_date = check_param(params, 'start_date') + end_date = check_param(params, 'end_date') + if not start_date: + start_date = '' + if not end_date: + end_date = '' + page = check_param(params, 'page') + if not page: + page = 1 + page_size = check_param(params, 'page_size') + if not page_size: + page_size = 10 + start_index = (int(page) - 1) * int(page_size) + end_index = start_index + int(page_size) + + user_list = db_user.query_users() + all_area_info = db_user.query_all_area_infos() + res_list = user_list.copy() + + if keyword != '': + if any(char.isdigit() for char in keyword): + # 说明是手机号的某个子集 + res_list = [item for item in user_list if keyword in item['userno']] + else: + res_list = find_user_info(keyword, user_list) + if role != 0: + if role == 1: + role_str = 'engineer' + res_list = [item for item in res_list if item['role'] == role_str] + else: + role_str = 'manager' + res_list = [item for item in res_list if item['role'] == role_str] + if start_date != '' and end_date != '': + res_list = [item for item in res_list if start_date <= item['last_modify_pwd_time'].strftime("%Y%m%d") <= end_date] + + for item in res_list: + item['last_modify_pwd_time'] = item['last_modify_pwd_time'].strftime("%Y年%m月%d日 %H:%M:%S") + if item['role'] != 'manager': + item['role'] = '工程师' + area_id_list = item['area_ids'].split(',') if item['area_ids'] else [] + nodeid_list = item['nodeids'].split(',') if item['nodeids'] else [] + area_name = '' if len(area_id_list) < 1 else ','.join([all_area_info[int(o)]['area_name'] for o in area_id_list]) + city_names = '' if len(nodeid_list) < 1 else ','.join([all_area_info[int(o)]['city_name'] for o in area_id_list]) + item['city_names'] = city_names + item['area_names'] = area_name + else: + item['role'] = '超级管理员' + item['city_names'] = '全部' + item['area_names'] = '全部' + + res = make_common_res(0, 'ok') + res['data'] = { + 'user_list': res_list[start_index:end_index], + 'area_list': list(all_area_info.values()), + 'total': len(res_list) + } + return json.dumps(res) + + +def modify_user(params): + userid = check_param(params, 'userid') + if not userid: + return json.dumps(make_common_res(1, '用户id信息异常,请检查后重试')) + if userid not in g_config['executives']: + return json.dumps(make_common_res(2, '用户无权限')) + modify_userid = check_param(params, 'modify_userid') + if not modify_userid: + return json.dumps(make_common_res(3, '缺少修改用户id信息,请检查后重试')) + ip = check_param(params, 'ip') + city_name = check_param(params, 'city_name') + user_name = check_param(params, 'user_name') + user_info = db_user.query_user_info_sql(modify_userid) + if not user_info: + return json.dumps(make_common_res(5, '该用户不存在')) + if user_info['role'] == 'manager': + return json.dumps(make_common_res(4, '所选用户为超级管理员,暂不支持修改超级管理员信息')) + if not user_name: + user_name = '' + new_userid = check_param(params, 'new_userid') + if not new_userid: + new_userid = '' + password = check_param(params, 'password') + if not password: + password = '' + area_id_list = check_param(params, 'area_id_list') + if not area_id_list or len(area_id_list) < 1: + area_id_list = [] + for area_id in area_id_list: + if not str(area_id).lstrip('-').isdigit(): + return json.dumps(make_common_res(6, '区域id信息异常,请检查后重试')) + modify_sql = '' + if user_name != '' and user_name != user_info['user_name']: + modify_sql += "set user_name='%s'" % user_name + if new_userid != '' and new_userid != user_info['userno']: + if modify_sql == '': + modify_sql += "set userno='%s'" % new_userid + else: + modify_sql += ",userno='%s'" % new_userid + if password != '' and password != user_info['password']: + if modify_sql == '': + modify_sql += "set password='%s'" % password + else: + modify_sql += ",password='%s'" % password + all_area_info = db_user.query_all_area_infos() + res, ret = db_user.update_user_info(modify_sql, modify_userid, area_id_list, new_userid, all_area_info) + if res and ret == len(area_id_list): + insert_log_ret = db_user.insert_login_log(modify_userid, 2, ip, city_name, userid) + if insert_log_ret == 1: + return json.dumps(make_common_res(0, 'ok')) + else: + return json.dumps(make_common_res(5, '用户信息修改日志记录失败,请检查后重试')) + return json.dumps(make_common_res(5, '修改失败,请检查后重试')) + + +def del_user(params): + userid = check_param(params, 'userid') + if not userid: + return json.dumps(make_common_res(1, '用户id信息异常,请检查后重试')) + if userid not in g_config['executives']: + return json.dumps(make_common_res(2, '用户无权限')) + modify_userid = check_param(params, 'modify_userid') + if not modify_userid: + return json.dumps(make_common_res(3, '缺少修改用户id信息,请检查后重试')) + ip = check_param(params, 'ip') + city_name = check_param(params, 'city_name') + user_info = db_user.query_user_info_sql(modify_userid) + if user_info['role'] == 'manager': + return json.dumps(make_common_res(4, '所选用户为超级管理员,暂不支持删除超级管理员')) + ret = db_user.del_user_sql(modify_userid) + if ret == 1: + insert_log_ret = db_user.insert_login_log(modify_userid, 3, ip, city_name, userid) + if insert_log_ret == 1: + return json.dumps(make_common_res(0, 'ok')) + else: + return json.dumps(make_common_res(5, '用户信息修改日志记录失败,请检查后重试')) + else: + return json.dumps(make_common_res(5, '删除失败,请检查后重试')) + + +def create_user(params): + userid = check_param(params, 'userid') + if not userid: + return json.dumps(make_common_res(1, '用户id信息异常,请检查后重试')) + if userid not in g_config['executives']: + return json.dumps(make_common_res(2, '用户无权限')) + modify_userid = check_param(params, 'modify_userid') + if not modify_userid: + return json.dumps(make_common_res(3, '缺少修改用户id信息,请检查后重试')) + user_name = check_param(params, 'user_name') + if not user_name: + return json.dumps(make_common_res(4, '缺少用户名信息,请检查后重试')) + password = check_param(params, 'password') + if not password: + return json.dumps(make_common_res(5, '缺少密码信息,请检查后重试')) + if len(password) < 6: + return json.dumps(make_common_res(6, '密码长度不能小于6位,请检查后重试')) + area_id_list = check_param(params, 'area_id_list') + if not area_id_list or len(area_id_list) < 1: + area_id_list = [] + for area_id in area_id_list: + if not str(area_id).lstrip('-').isdigit(): + return json.dumps(make_common_res(6, '区域id信息异常,请检查后重试')) + ip = check_param(params, 'ip') + city_name = check_param(params, 'city_name') + all_area_info = db_user.query_all_area_infos() + ret = db_user.insert_user(modify_userid, password, user_name, area_id_list, all_area_info) + if ret: + insert_log_ret = db_user.insert_login_log(modify_userid, 4, ip, city_name, userid) + if insert_log_ret == 1: + return json.dumps(make_common_res(0, 'ok')) + else: + return json.dumps(make_common_res(7, '用户信息修改日志记录失败,请检查后重试')) + return json.dumps(make_common_res(7, '创建失败,请检查后重试')) + + +def find_user_info(key, value_list): + result = [] + # 遍历名字列表 + for value in value_list: + # 检查是否完全匹配 + if key in value['user_name']: + result.append(value) + # 检查是否是首字母缩写匹配 + elif len(key) >= 2 and len(value['user_name']) >= 2: + # 将名字转换为拼音并提取首字母 + first_pinyin = lazy_pinyin(value['user_name'][0])[0] + second_pinyin = lazy_pinyin(value['user_name'][1])[0] + if key[0].lower() == first_pinyin[0].lower() and key[1].lower() == second_pinyin[0].lower(): + result.append(value) + # # 检查是否包含关键字 + # elif key in value['name']: + # result.append(value) + return result \ No newline at end of file