From e2dc55b80c5fc6fdc0f61a4e446f8acbcbd08745 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Fri, 8 Sep 2023 21:48:09 +0800 Subject: [PATCH] update --- README.md | 4 ++- src/db/db_service.cpp | 47 ++++++++++++++++++++++------ src/db/db_service.hpp | 15 ++++----- src/db/user_behavior_des.cpp | 8 +++-- src/db/user_behavior_des.hpp | 24 ++++++++------- src/main_control_service.cpp | 73 ++++++++++++++++++++++++++++++++++++++------ 6 files changed, 130 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index a2086d8..e05e1e6 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,8 @@ 通过getState可以获得到log,小数 OK 数据库操作加锁 OK + + -------------------------------- 记录用户操作 (TODO) 添加U盘数据导出 @@ -31,7 +33,7 @@ 排液自动停止 水禁传感器测试 - +磁盘管理(磁盘容量不足时,弹出提示,且停止记录数据) ``` diff --git a/src/db/db_service.cpp b/src/db/db_service.cpp index c73f205..b9a1320 100644 --- a/src/db/db_service.cpp +++ b/src/db/db_service.cpp @@ -191,7 +191,7 @@ void DBService::addUser(string uid, string passwd, int permission_level) { logger->info("add user: {} {} {}", uid, passwd, permission_level); usertable.insert(User{-1, uid, passwd, permission_level, true}); } -void DBService::delUser(int id) { +shared_ptr DBService::delUser(int id) { lock_guard lock(lock_); auto usertable = make_storage(USER_DB_STRUCT); @@ -203,18 +203,19 @@ void DBService::delUser(int id) { ZCHECK(admin.size() == 1, "admin user not found"); if (admin[0].id == id) { logger->error("can not delete admin user"); - return; + return nullptr; } auto remove_user = usertable.get_all(where(c(&User::id) == id)); if (remove_user.size() == 0) { logger->error("remove user fail, user not found"); - return; + return nullptr; } logger->info("delete user: {}:{}", id, remove_user[0].uid); usertable.remove_all(where(c(&User::id) == id)); + return make_shared(remove_user[0]); } -void DBService::updateUserPermissionLevel(int id, int permission_level) { +shared_ptr DBService::updateUserPermissionLevel(int id, int permission_level) { lock_guard lock(lock_); auto usertable = make_storage(USER_DB_STRUCT); @@ -223,14 +224,15 @@ void DBService::updateUserPermissionLevel(int id, int permission_level) { auto user = usertable.get_all(where(c(&User::id) == id)); if (user.size() == 0) { logger->error("update user permission level fail, user not found"); - return; + return nullptr; } logger->info("update user permission level: {} {} -> {}", id, user[0].permission_level, permission_level); user[0].permission_level = permission_level; usertable.update(user[0]); + return make_shared(user[0]); } -void DBService::changePasswd(string uid, string passwd) { +shared_ptr DBService::changePasswd(string uid, string passwd) { lock_guard lock(lock_); auto usertable = make_storage(USER_DB_STRUCT); @@ -238,11 +240,28 @@ void DBService::changePasswd(string uid, string passwd) { auto user = usertable.get_all(where(c(&User::uid) == uid)); if (user.size() == 0) { logger->error("change passwd fail, user not found"); - return; + return nullptr; } logger->info("change passwd: {} {} -> {}", uid, user[0].passwd, passwd); user[0].passwd = passwd; usertable.update(user[0]); + return make_shared(user[0]); +} +shared_ptr DBService::updateUserUid(int id, string uid, string& olduid) { + lock_guard lock(lock_); + + auto usertable = make_storage(USER_DB_STRUCT); + usertable.sync_schema(); + auto user = usertable.get_all(where(c(&User::id) == id)); + if (user.size() == 0) { + logger->error("change user uid fail, user not found"); + return nullptr; + } + olduid = user[0].uid; + logger->info("change user uid: {} {} -> {}", id, user[0].uid, uid); + user[0].uid = uid; + usertable.update(user[0]); + return make_shared(user[0]); } json DBService::getAllUserJson() { @@ -457,23 +476,30 @@ void DBService::addFormula(string formula_id, int stoped_gs, int continued_gs, i addFormula(formula_id, to_string(stoped_gs), to_string(continued_gs), to_string(stoped_satur), to_string(continued_satur), to_string(stoped_humi), to_string(continued_humi), to_string(injection_pump_speed)); } -void DBService::delFormula(int id) { +shared_ptr DBService::delFormula(int id) { lock_guard lock(lock_); // remove_all auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT); formulatable.sync_schema(); + auto formula = formulatable.get_all(where(c(&Formula::id) == id)); formulatable.remove_all(where(c(&Formula::id) == id)); formulatable.sync_schema(); + + if (formula.size() == 0) { + return nullptr; + } + + return make_shared(formula[0]); } -void DBService::updateFormula(int id, string column, string val) { +shared_ptr DBService::updateFormula(int id, string column, string val) { lock_guard lock(lock_); auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT); formulatable.sync_schema(); auto formula = formulatable.get_all(where(c(&Formula::id) == id)); if (formula.size() == 0) { - return; + return nullptr; } if (column == "formula_id") { formula[0].formula_id = val; @@ -494,6 +520,7 @@ void DBService::updateFormula(int id, string column, string val) { } formulatable.update(formula[0]); formulatable.sync_schema(); + return make_shared(formula[0]); } int DBService::getUserBehaviorRecordCount() { diff --git a/src/db/db_service.hpp b/src/db/db_service.hpp index 3ba310b..d37905a 100644 --- a/src/db/db_service.hpp +++ b/src/db/db_service.hpp @@ -102,7 +102,7 @@ struct UserBehaviorRecord { using namespace db; class DBService : public enable_shared_from_this { ENABLE_LOGGER(DBService); - recursive_mutex lock_; + recursive_mutex lock_; public: DBService(); @@ -126,10 +126,11 @@ class DBService : public enable_shared_from_this { * @param passwd 密码 * @param permission_level 许可等级,0超级管理员 3普通用户 */ - void addUser(string uid, string passwd, int permission_level); - void delUser(int id); - void updateUserPermissionLevel(int id, int permission_level); - void changePasswd(string uid, string passwd); + void addUser(string uid, string passwd, int permission_level); + shared_ptr delUser(int id); + shared_ptr updateUserPermissionLevel(int id, int permission_level); + shared_ptr changePasswd(string uid, string passwd); + shared_ptr updateUserUid(int id, string uid, string& olduid); public: /******************************************************************************* @@ -152,8 +153,8 @@ class DBService : public enable_shared_from_this { string continued_humi, string injection_pump_speed); void addFormula(string formula_id, int stoped_gs, int continued_gs, int stoped_satur, int continued_satur, int stoped_humi, int continued_humi, int injection_pump_speed); - void delFormula(int id); - void updateFormula(int id, string column, string val); + shared_ptr delFormula(int id); + shared_ptr updateFormula(int id, string column, string val); shared_ptr getFormula(int id); diff --git a/src/db/user_behavior_des.cpp b/src/db/user_behavior_des.cpp index 6f8631e..63239df 100644 --- a/src/db/user_behavior_des.cpp +++ b/src/db/user_behavior_des.cpp @@ -20,6 +20,8 @@ string user_behavior_to_str(user_behavior_t behavior) { return "更新用户权限"; case kbehavior_update_user_passwd: return "更新用户密码"; + case kbehavior_update_user_uid: + return "更新用户ID"; case kbehavior_set_setting_val: return "设置参数"; case kbehavior_add_formula: @@ -36,8 +38,10 @@ string user_behavior_to_str(user_behavior_t behavior) { return "执行配方"; case kbehavior_update_setting_val_on_disinfection: return "消毒中更新参数"; - case kbehavior_export_data: - return "导出数据"; + case kbehavior_export_disinfection_data: + return "导出消毒数据"; + case kbehavior_export_user_action_data: + return "导出用户操作数据"; default: break; } diff --git a/src/db/user_behavior_des.hpp b/src/db/user_behavior_des.hpp index c91c01a..5d3c5ef 100644 --- a/src/db/user_behavior_des.hpp +++ b/src/db/user_behavior_des.hpp @@ -18,17 +18,19 @@ typedef enum { kbehavior_logout = 1, kbehavior_add_user = 2, kbehavior_del_user = 3, - kbehavior_update_user_permission_level = 4, - kbehavior_update_user_passwd = 5, - kbehavior_set_setting_val = 6, - kbehavior_add_formula = 7, - kbehavior_del_formula = 8, - kbehavior_update_formula = 9, - kbehavior_do_disinfection = 10, - kbehavior_stop_disinfection = 11, - kbehavior_do_formula = 12, - kbehavior_update_setting_val_on_disinfection = 13, - kbehavior_export_data = 14, + kbehavior_update_user_uid = 5, + kbehavior_update_user_permission_level = 6, + kbehavior_update_user_passwd = 7, + kbehavior_set_setting_val = 8, + kbehavior_add_formula = 9, + kbehavior_del_formula = 10, + kbehavior_update_formula = 11, + kbehavior_do_disinfection = 12, + kbehavior_stop_disinfection = 13, + kbehavior_do_formula = 14, + kbehavior_update_setting_val_on_disinfection = 15, + kbehavior_export_disinfection_data = 16, + kbehavior_export_user_action_data = 17, } user_behavior_t; string user_behavior_to_str(user_behavior_t behavior); diff --git a/src/main_control_service.cpp b/src/main_control_service.cpp index 8ab8185..52710c8 100644 --- a/src/main_control_service.cpp +++ b/src/main_control_service.cpp @@ -199,6 +199,7 @@ void MainControlService::processFrontEndMessage_userOperate(weak_ptr return; } m_deviceStateService->setLoginState(uid, m_dbService->getUser(uid)->permission_level, m_dbService->getUser(uid)->visible); + m_dbService->addUserBehaviorRecord(uid, kbehavior_login, ""); logger->info("user {} login success", uid); } @@ -211,6 +212,7 @@ void MainControlService::processFrontEndMessage_userOperate(weak_ptr if (cmdstr == "unlogin") { m_deviceStateService->unlogin(); logger->info("user unlogin success"); + m_dbService->addUserBehaviorRecord(m_deviceStateService->getLoginUid(), kbehavior_logout, ""); return; } @@ -232,7 +234,10 @@ void MainControlService::processFrontEndMessage_userOperate(weak_ptr receipt["ackcodeInfo"] = err::error_code_get_desc(err::kce, err::kpasswd_error, ""); return; } - m_dbService->changePasswd(uid, newpasswd); + auto user = m_dbService->changePasswd(uid, newpasswd); + // kbehavior_update_user_passwd + m_dbService->addUserBehaviorRecord(m_deviceStateService->getLoginUid(), kbehavior_update_user_passwd, fmt::format("({})", uid)); + return; } @@ -241,19 +246,45 @@ void MainControlService::processFrontEndMessage_userOperate(weak_ptr string passwd = cmd["passwd"]; int permission_level = jsonGet(cmd["permission_level"]); m_dbService->addUser(uid, passwd, permission_level); + m_dbService->addUserBehaviorRecord(m_deviceStateService->getLoginUid(), kbehavior_add_user, fmt::format("({})", uid)); return; } if (cmdstr == "delUser") { - int id = jsonGet(cmd["id"]); - m_dbService->delUser(id); + int id = jsonGet(cmd["id"]); + auto user = m_dbService->delUser(id); + if (!user) { + receipt["ackcode"] = err::error_code_get_get_ecode(err::kce, err::kuser_not_exist); + receipt["ackcodeInfo"] = err::error_code_get_desc(err::kce, err::kuser_not_exist, ""); + return; + } + m_dbService->addUserBehaviorRecord(m_deviceStateService->getLoginUid(), kbehavior_del_user, fmt::format("({})", user->uid)); return; } if (cmdstr == "updateUserPermissionLevel") { - int id = jsonGet(cmd["id"]); - int permission_level = jsonGet(cmd["permission_level"]); - m_dbService->updateUserPermissionLevel(id, permission_level); + int id = jsonGet(cmd["id"]); + int permission_level = jsonGet(cmd["permission_level"]); + auto user = m_dbService->updateUserPermissionLevel(id, permission_level); + if (!user) { + receipt["ackcode"] = err::error_code_get_get_ecode(err::kce, err::kuser_not_exist); + receipt["ackcodeInfo"] = err::error_code_get_desc(err::kce, err::kuser_not_exist, ""); + return; + } + m_dbService->addUserBehaviorRecord(m_deviceStateService->getLoginUid(), kbehavior_update_user_permission_level, + fmt::format("({},{})", user->uid, permission_level)); return; } + if (cmdstr == "updateUserUid") { + int id = jsonGet(cmd["id"]); + string uid = cmd["uid"]; + string olduid; + auto user = m_dbService->updateUserUid(id, uid, olduid); + if (!user) { + receipt["ackcode"] = err::error_code_get_get_ecode(err::kce, err::kuser_not_exist); + receipt["ackcodeInfo"] = err::error_code_get_desc(err::kce, err::kuser_not_exist, ""); + return; + } + m_dbService->addUserBehaviorRecord(m_deviceStateService->getLoginUid(), kbehavior_update_user_uid, fmt::format("({}->{})", olduid, uid)); + } if (cmdstr == "getAllUser") { auto users = m_dbService->getAllUserJson(); receipt["dbval"] = users; @@ -334,6 +365,8 @@ void MainControlService::processFrontEndMessage_Disinfection(weak_ptr m_dbService->getSettingVal("continued_satur"), // m_dbService->getSettingVal("stoped_humi"), // m_dbService->getSettingVal("continued_humi")); + // kbehavior_do_disinfection + m_dbService->addUserBehaviorRecord(m_deviceStateService->getLoginUid(), kbehavior_do_disinfection, fmt::format("({})", jsonGet(cmd["loglevel"]))); return; } if (cmdstr == "changeDisinfectionParameter") { @@ -349,6 +382,7 @@ void MainControlService::processFrontEndMessage_Disinfection(weak_ptr if (cmdstr == "stopDisinfection") { m_disinfectionCtrlService->stopDisinfection(); + m_dbService->addUserBehaviorRecord(m_deviceStateService->getLoginUid(), kbehavior_stop_disinfection, ""); return; } @@ -436,11 +470,13 @@ void MainControlService::processFrontEndMessage_setting(weak_ptr webS string settingName = cmd["settingName"]; int settingVal = jsonGet(cmd["settingVal"]); bool suc = m_dbService->setSettingVal(settingName, settingVal); + if (!suc) { receipt["ackcode"] = err::error_code_get_get_ecode(err::kce, err::kdb_operate_error); receipt["ackcodeInfo"] = err::error_code_get_desc(err::kce, err::kdb_operate_error, "setSettingVal fail"); + return; } - return; + m_dbService->addUserBehaviorRecord(m_deviceStateService->getLoginUid(), kbehavior_set_setting_val, fmt::format("({},{})", settingName, settingVal)); } } @@ -466,6 +502,9 @@ void MainControlService::processFrontEndMessage_processFormulaCmd(weak_ptrcontinued_satur.c_str()), // atoi(formul->stoped_humi.c_str()), // atoi(formul->continued_humi.c_str())); // + + m_dbService->addUserBehaviorRecord(m_deviceStateService->getLoginUid(), kbehavior_do_formula, fmt::format("({})", formul->formula_id)); + return; } if (cmdstr == "getAllFormula") { @@ -474,6 +513,7 @@ void MainControlService::processFrontEndMessage_processFormulaCmd(weak_ptraddFormula(cmd["formula_id"], // jsonGet(cmd["stoped_gs"]), // jsonGet(cmd["continued_gs"]), // @@ -482,11 +522,16 @@ void MainControlService::processFrontEndMessage_processFormulaCmd(weak_ptr(cmd["stoped_humi"]), // jsonGet(cmd["continued_humi"]), // jsonGet(cmd["injection_pump_speed"])); + // kbehavior_add_formula + m_dbService->addUserBehaviorRecord(m_deviceStateService->getLoginUid(), kbehavior_add_formula, fmt::format("({})", formula_id)); return; } if (cmdstr == "delFormula") { - m_dbService->delFormula(jsonGet(cmd["id"])); + auto formula = m_dbService->delFormula(jsonGet(cmd["id"])); + if (formula) { + m_dbService->addUserBehaviorRecord(m_deviceStateService->getLoginUid(), kbehavior_del_formula, fmt::format("({})", formula->formula_id)); + } return; } @@ -497,7 +542,11 @@ void MainControlService::processFrontEndMessage_processFormulaCmd(weak_ptr()); } - m_dbService->updateFormula(jsonGet(cmd["id"]), cmd["column"], val_str); + auto formula = m_dbService->updateFormula(jsonGet(cmd["id"]), cmd["column"], val_str); + if (formula) { + m_dbService->addUserBehaviorRecord(m_deviceStateService->getLoginUid(), kbehavior_update_formula, + fmt::format("({},{},{})", formula->formula_id, cmd["column"], val_str)); + } return; } } @@ -521,16 +570,20 @@ void MainControlService::processFrontEndMessage_processBehaviorRecordCmd(weak_pt m_dbService->addUserBehaviorRecord("admin", kbehavior_add_user, "(zhaohe)"); m_dbService->addUserBehaviorRecord("admin", kbehavior_del_user, "(zhaohe)"); m_dbService->addUserBehaviorRecord("admin", kbehavior_update_user_permission_level, "(zhaohe,3)"); + // kbehavior_update_user_uid m_dbService->addUserBehaviorRecord("admin", kbehavior_update_user_passwd, "()"); + m_dbService->addUserBehaviorRecord("admin", kbehavior_set_setting_val, "(....)"); m_dbService->addUserBehaviorRecord("admin", kbehavior_add_formula, "(....)"); m_dbService->addUserBehaviorRecord("admin", kbehavior_del_formula, "(....)"); m_dbService->addUserBehaviorRecord("admin", kbehavior_update_formula, "(....)"); + m_dbService->addUserBehaviorRecord("admin", kbehavior_do_disinfection, "(....)"); m_dbService->addUserBehaviorRecord("admin", kbehavior_stop_disinfection, "(....)"); m_dbService->addUserBehaviorRecord("admin", kbehavior_do_formula, "(....)"); m_dbService->addUserBehaviorRecord("admin", kbehavior_update_setting_val_on_disinfection, "(....)"); - m_dbService->addUserBehaviorRecord("admin", kbehavior_export_data, "(....)"); + m_dbService->addUserBehaviorRecord("admin", kbehavior_export_disinfection_data, "(....)"); + m_dbService->addUserBehaviorRecord("admin", kbehavior_export_user_action_data, "(....)"); } return; }