From 94a6d9f97a64d437305c4a22d9842af162ceac8e Mon Sep 17 00:00:00 2001 From: zhaohe Date: Mon, 12 Aug 2024 14:26:44 +0800 Subject: [PATCH] add userMgrService --- README.md | 11 + app_protocols/apperrorcode/apperrorcode.hpp | 40 +- app_protocols/appexception/appexception.hpp | 20 +- app_protocols/zscanprotocol | 2 +- appdep/components/uart_printer/uart_printer.hpp | 1 + .../zservice_container/zservice_container.hpp | 3 +- appdep/iflytop/core/error/error_code.cpp | 58 -- appdep/iflytop/core/error/error_code.hpp | 79 +-- appsrc/appbase/dep.hpp | 5 +- .../app_errorcode_mgr/app_errorcode_mgr.hpp | 4 +- .../canchannel/com/zscanprotocol_com.cpp | 4 +- appsrc/baseservice/baseservice.hpp | 9 + appsrc/baseservice/db/db_service.cpp | 664 ++++++++++++++++++++ appsrc/baseservice/db/db_service.hpp | 179 ++++++ appsrc/baseservice/db/user_behavior_des.cpp | 54 ++ appsrc/baseservice/db/user_behavior_des.hpp | 41 ++ .../devicestate/device_state_service.hpp | 59 ++ .../front_msg_processer/front_msg_processer.cpp | 58 ++ .../front_msg_processer/front_msg_processer.hpp | 85 +++ .../iflytop_front_end_service.cpp | 171 ++++++ .../iflytop_front_end_service.hpp | 60 ++ .../iflytop_front_end_service/protocol.md | 13 + appsrc/main.cpp | 2 - appsrc/service/db/db_service.cpp | 682 --------------------- appsrc/service/db/db_service.hpp | 180 ------ appsrc/service/db/user_behavior_des.cpp | 54 -- appsrc/service/db/user_behavior_des.hpp | 41 -- appsrc/service/extapi/extapi_dep.hpp | 4 - appsrc/service/extapi/user_mgr_service.cpp | 0 appsrc/service/extapi/user_mgr_service.hpp | 29 - .../front_msg_processer/front_msg_processer.cpp | 22 - .../front_msg_processer/front_msg_processer.hpp | 68 -- .../iflytop_front_end_service.cpp | 136 ---- .../iflytop_front_end_service.hpp | 60 -- .../service/iflytop_front_end_service/protocol.md | 13 - appsrc/service/main_control_service.cpp | 31 +- appsrc/service/user_mgr_service.cpp | 82 +++ appsrc/service/user_mgr_service.hpp | 34 + 38 files changed, 1603 insertions(+), 1455 deletions(-) delete mode 100644 appdep/iflytop/core/error/error_code.cpp create mode 100644 appsrc/baseservice/baseservice.hpp create mode 100644 appsrc/baseservice/db/db_service.cpp create mode 100644 appsrc/baseservice/db/db_service.hpp create mode 100644 appsrc/baseservice/db/user_behavior_des.cpp create mode 100644 appsrc/baseservice/db/user_behavior_des.hpp create mode 100644 appsrc/baseservice/devicestate/device_state_service.hpp create mode 100644 appsrc/baseservice/front_msg_processer/front_msg_processer.cpp create mode 100644 appsrc/baseservice/front_msg_processer/front_msg_processer.hpp create mode 100644 appsrc/baseservice/iflytop_front_end_service/iflytop_front_end_service.cpp create mode 100644 appsrc/baseservice/iflytop_front_end_service/iflytop_front_end_service.hpp create mode 100644 appsrc/baseservice/iflytop_front_end_service/protocol.md delete mode 100644 appsrc/service/db/db_service.cpp delete mode 100644 appsrc/service/db/db_service.hpp delete mode 100644 appsrc/service/db/user_behavior_des.cpp delete mode 100644 appsrc/service/db/user_behavior_des.hpp delete mode 100644 appsrc/service/extapi/extapi_dep.hpp delete mode 100644 appsrc/service/extapi/user_mgr_service.cpp delete mode 100644 appsrc/service/extapi/user_mgr_service.hpp delete mode 100644 appsrc/service/front_msg_processer/front_msg_processer.cpp delete mode 100644 appsrc/service/front_msg_processer/front_msg_processer.hpp delete mode 100644 appsrc/service/iflytop_front_end_service/iflytop_front_end_service.cpp delete mode 100644 appsrc/service/iflytop_front_end_service/iflytop_front_end_service.hpp delete mode 100644 appsrc/service/iflytop_front_end_service/protocol.md create mode 100644 appsrc/service/user_mgr_service.cpp create mode 100644 appsrc/service/user_mgr_service.hpp diff --git a/README.md b/README.md index 210d070..9914c48 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,17 @@ libwebsocket can/ uart logger ... +``` + +``` +错误码划分: + + +APP_ERROR_CODE +10000 + +SYS_ERROR_CODE +20000 ``` \ No newline at end of file diff --git a/app_protocols/apperrorcode/apperrorcode.hpp b/app_protocols/apperrorcode/apperrorcode.hpp index ad027e4..64c8e6d 100644 --- a/app_protocols/apperrorcode/apperrorcode.hpp +++ b/app_protocols/apperrorcode/apperrorcode.hpp @@ -13,15 +13,45 @@ namespace iflytop { using namespace std; +// // 驱动器错误 +// kerr_motor_reset_error = 100, +// kerr_motor_subdevice_offline = 101, +// kerr_motor_driver_error = 102, +// kerr_motor_undervoltage_error = 103, +// kerr_motor_unkown_error = 104, + +// kerr_AirBlowerError = 200, // 空压机异常 +// kerr_HeaterError = 201, // 加热片异常 +// kerr_BlowerError = 202, // 鼓风机异常 +// kerr_ProportionalValveError = 203, // 气密性测试专用空压机异常 + +// kerr_noerror = 0, +// kerr_overtime = 1, +// kerr_invalid_param = 2, +// kerr_invalid_param_num = 3, +// kerr_subdevice_offline = 4, +// kerr_function_not_support = 5, + +namespace err { typedef enum { ksucc = 0, - kappe_disinfectant_insufficient = 1, // 消毒液不足 - kappe_the_bottom_of_the_device_has_water = 2, // 设备底部有水 - kappe_the_evaporation_bin_has_water = 3, // 蒸发仓有水 - kappe_the_sensor_is_prehearting = 4, // 传感器正在预热 - kappe_code_error = 5, // 代码错误 + kappe_begin = 10000, + + kappe_disinfectant_insufficient = 10001, // 消毒液不足 + kappe_the_bottom_of_the_device_has_water = 10002, // 设备底部有水 + kappe_the_evaporation_bin_has_water = 10003, // 蒸发仓有水 + kappe_the_sensor_is_prehearting = 10004, // 传感器正在预热 + kappe_code_error = 10005, // 代码错误 + + kappe_user_not_exist = 10006, + kappe_operate_error = 10007, + kappe_passwd_error = 10008, + kappe_cmd_not_support = 10009, + kappe_parse_json_err = 10010, + kappe_std_exception = 10011, } apperror_t; +} } // namespace iflytop \ No newline at end of file diff --git a/app_protocols/appexception/appexception.hpp b/app_protocols/appexception/appexception.hpp index 8fa5a8a..5a1e76d 100644 --- a/app_protocols/appexception/appexception.hpp +++ b/app_protocols/appexception/appexception.hpp @@ -26,7 +26,12 @@ class appexception : public std::exception { public: string description; string whatstr; - int32_t ecode; + int32_t m_ecode; + appexception(int32_t ecode, const string &description) { + this->description = description; + this->m_ecode = ecode; + this->whatstr = description; + } appexception(int32_t ecode, const char *fmt, ...) { va_list args; @@ -35,13 +40,16 @@ class appexception : public std::exception { vsnprintf(buffer, sizeof(buffer), fmt, args); this->description = buffer; - - this->description = description; - this->ecode = ecode; - - this->whatstr = buffer; + this->m_ecode = ecode; + this->whatstr = buffer; } virtual ~appexception() {} + int ecode() const { return m_ecode; } const char *what() const _GLIBCXX_USE_NOEXCEPT { return whatstr.c_str(); } }; + +#define APPCHECK(expr, ecode, fmt, ...) \ + if (!(expr)) { \ + throw appexception(ecode, fmt, ##__VA_ARGS__); \ + } } // namespace iflytop \ No newline at end of file diff --git a/app_protocols/zscanprotocol b/app_protocols/zscanprotocol index 94c49f6..d11d41c 160000 --- a/app_protocols/zscanprotocol +++ b/app_protocols/zscanprotocol @@ -1 +1 @@ -Subproject commit 94c49f650f508e64b9e30e733dbb161c72ae2559 +Subproject commit d11d41c1062568f629d5ec2bc6435319b7ea83e3 diff --git a/appdep/components/uart_printer/uart_printer.hpp b/appdep/components/uart_printer/uart_printer.hpp index 1520e3c..1a087e5 100644 --- a/appdep/components/uart_printer/uart_printer.hpp +++ b/appdep/components/uart_printer/uart_printer.hpp @@ -30,6 +30,7 @@ class UartPrinter { public: UartPrinter(); ~UartPrinter(); + void initialize() {} void initialize(string path, string rate); void print(string str); }; diff --git a/appdep/components/zservice_container/zservice_container.hpp b/appdep/components/zservice_container/zservice_container.hpp index 6846ea3..a74fb9a 100644 --- a/appdep/components/zservice_container/zservice_container.hpp +++ b/appdep/components/zservice_container/zservice_container.hpp @@ -190,7 +190,8 @@ class ServiceContrainer { #define BUILD_AND_REG_SERRVICE(type, ...) \ logger->info("build {}.....", #type); \ shared_ptr type##_val(new type(__VA_ARGS__)); \ - ServiceContrainer::get().regService(type##_val); + ServiceContrainer::get().regService(type##_val);\ + GET_SERVICE(type)->initialize(); #define REG_SERRVICE(type,object) \ shared_ptr type##_val(object); \ diff --git a/appdep/iflytop/core/error/error_code.cpp b/appdep/iflytop/core/error/error_code.cpp deleted file mode 100644 index f5cd528..0000000 --- a/appdep/iflytop/core/error/error_code.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include "error_code.hpp" - -namespace iflytop { -namespace err { - -using namespace std; - -typedef struct { - string errordesc; -} error_desc_t; - -static map errormap = { - // {kovertime, {.errordesc = "overtime"}}, - - {ksucc, {.errordesc = "ksucc"}}, - {kfail, {.errordesc = "kfail"}}, - {kce_subboard_error_overtime, {.errordesc = "kce_subboard_error_overtime"}}, - {kce_subboard_error_invalid_param, {.errordesc = "kce_subboard_error_invalid_param"}}, - {kce_subboard_error_invalid_param_num, {.errordesc = "kce_subboard_error_invalid_param_num"}}, - {kce_subboard_error_subdevice_offline, {.errordesc = "kce_subboard_error_subdevice_offline"}}, - {kce_subboard_error_function_not_support, {.errordesc = "kce_subboard_error_function_not_support"}}, - {kce_overtime, {.errordesc = "kce_overtime"}}, - {kce_noack, {.errordesc = "kce_noack"}}, - {kce_errorack, {.errordesc = "kce_errorack"}}, - {kce_device_offline, {.errordesc = "kce_device_offline"}}, - {kce_parse_json_err, {.errordesc = "kce_parse_json_err"}}, - {kdbe_user_not_exist, {.errordesc = "kdbe_user_not_exist"}}, - {kdbe_catch_exception, {.errordesc = "kdbe_catch_exception"}}, - {kharde_unfound, {.errordesc = "kharde_unfound"}}, - {kre_catch_exception, {.errordesc = "kre_catch_exception"}}, - {kinteraction_error_passwd_error, {.errordesc = "kinteraction_error_passwd_error"}}, - {kinteraction_error_user_not_exist, {.errordesc = "kinteraction_error_user_not_exist"}}, - {ksys_error, {.errordesc = "ksys_error"}}, - {ksys_create_file_error, {.errordesc = "ksys_create_file_error"}}, - {ksys_create_dir_error, {.errordesc = "ksys_create_dir_error"}}, - {ksys_open_file_error, {.errordesc = "ksys_open_file_error"}}, - {ksys_open_dir_error, {.errordesc = "ksys_open_dir_error"}}, - {ksys_read_file_error, {.errordesc = "ksys_read_file_error"}}, - {ksys_write_file_error, {.errordesc = "ksys_write_file_error"}}, - {ksys_close_file_error, {.errordesc = "ksys_close_file_error"}}, - {ksys_close_dir_error, {.errordesc = "ksys_close_dir_error"}}, - {ksys_delete_file_error, {.errordesc = "ksys_delete_file_error"}}, - {ksys_delete_dir_error, {.errordesc = "ksys_delete_dir_error"}}, - {ksys_copy_file_error, {.errordesc = "ksys_copy_file_error"}}, - - -}; - -std::string zecode2str(err::error_t error_type, string extdes) { - string ret = "unkown"; - if (errormap.find(error_type) != errormap.end()) { - ret = errormap[error_type].errordesc; - } - return fmt::format("{},{}", ret, extdes); -} - -} // namespace err -} // namespace iflytop diff --git a/appdep/iflytop/core/error/error_code.hpp b/appdep/iflytop/core/error/error_code.hpp index 1a9252c..fccd5d9 100644 --- a/appdep/iflytop/core/error/error_code.hpp +++ b/appdep/iflytop/core/error/error_code.hpp @@ -14,85 +14,12 @@ #include "iflytop/core/spdlogfactory/logger.hpp" // #include "transmit_disinfection_protocol_v1/transmit_disinfection_protocol_v1.hpp" namespace iflytop { -namespace err { +namespace syserr { using namespace std; typedef enum { ksucc = 0, - kfail = 1, - - kce_subboard_error_overtime = 500 + 1, - kce_subboard_error_invalid_param = 500 + 2, - kce_subboard_error_invalid_param_num = 500 + 3, - kce_subboard_error_subdevice_offline = 500 + 4, - kce_subboard_error_function_not_support = 500 + 5, - - kce_disinfectant_insufficient = 600, // 消毒液不足 - kce_the_bottom_of_the_device_has_water = 601, // 设备底部有水 - kcd_the_evaporation_bin_has_water = 602, // 蒸发仓有水 - kcd_the_sensor_is_prehearting = 603, // 传感器正在预热 - - /** - * @brief 通信错误 - */ - kce_overtime = 1000, - kce_noack = 1001, - kce_errorack = 1002, - kce_device_offline = 1003, - kce_parse_json_err = 1004, - - /** - * @brief 数据库错误 - */ - kdbe_user_not_exist = 2000, - kdbe_catch_exception = 2001, - - /** - * @brief 硬件错误 - */ - kharde_unfound = 3000, - - /** - * @brief 程序运行错误 - * runntime error - */ - kre_catch_exception = 4000, - /** - * @brief 应用交互基本错误 - */ - kinteraction_error_passwd_error = 5000, - kinteraction_error_user_not_exist = 50001, - - /** - * @brief 系统错误 - */ - ksys_error = 6000, - ksys_create_file_error = 6001, - ksys_create_dir_error = 6002, - ksys_open_file_error = 6003, - ksys_open_dir_error = 6004, - ksys_read_file_error = 6005, - ksys_write_file_error = 6006, - ksys_close_file_error = 6007, - ksys_close_dir_error = 6008, - ksys_delete_file_error = 6009, - ksys_delete_dir_error = 6010, - ksys_copy_file_error = 6011, + ksyserrbegin = 20000, } error_t; - -#define kovertime kce_overtime -#define knoack kce_noack -#define kerrorack kce_errorack -#define kdevice_offline kce_device_offline -#define kparse_json_err kce_parse_json_err -#define kcatch_exception kre_catch_exception -#define kpasswd_error kinteraction_error_passwd_error -#define kuser_not_exist kinteraction_error_user_not_exist -#define kdb_operate_error kdbe_catch_exception - -static inline int32_t zecode(error_t error_type) { return (int32_t)error_type; } - -std::string zecode2str(err::error_t error_type, std::string extdes = ""); - -} // namespace err +} // namespace syserr } // namespace iflytop \ No newline at end of file diff --git a/appsrc/appbase/dep.hpp b/appsrc/appbase/dep.hpp index 3ee85a5..499ed79 100644 --- a/appsrc/appbase/dep.hpp +++ b/appsrc/appbase/dep.hpp @@ -8,4 +8,7 @@ #include "gconfig.hpp" #include "iflytop/core/components/jobs/work_queue.hpp" #include "iflytop/core/components/stringutils.hpp" -#include "project_setting.hpp" \ No newline at end of file +#include "project_setting.hpp" +// +#include "app_protocols/apperrorcode/apperrorcode.hpp" +#include "app_protocols/appexception/appexception.hpp" \ No newline at end of file diff --git a/appsrc/appcomponents/app_errorcode_mgr/app_errorcode_mgr.hpp b/appsrc/appcomponents/app_errorcode_mgr/app_errorcode_mgr.hpp index 85cee5d..28cae92 100644 --- a/appsrc/appcomponents/app_errorcode_mgr/app_errorcode_mgr.hpp +++ b/appsrc/appcomponents/app_errorcode_mgr/app_errorcode_mgr.hpp @@ -25,7 +25,7 @@ class AppEcodeInfoMgr { public: static AppEcodeInfoMgr& ins() { static AppEcodeInfoMgr instance; - static bool inited = false; + static bool inited = false; if (!inited) { inited = true; } @@ -43,4 +43,6 @@ class AppEcodeInfoMgr { } }; +static inline string ecode2str(int32_t ecode) { return AppEcodeInfoMgr::ins().getEcodeInfo(ecode); } + } // namespace iflytop \ No newline at end of file diff --git a/appsrc/appcomponents/canchannel/com/zscanprotocol_com.cpp b/appsrc/appcomponents/canchannel/com/zscanprotocol_com.cpp index ce377d3..bc4d300 100644 --- a/appsrc/appcomponents/canchannel/com/zscanprotocol_com.cpp +++ b/appsrc/appcomponents/canchannel/com/zscanprotocol_com.cpp @@ -74,7 +74,7 @@ void ZSCanProtocolCom::sendframe(int32_t from, int32_t to, uint8_t *frame, size_ int npacket = len / 8 + (len % 8 == 0 ? 0 : 1); if (npacket > 255) { - throw appexception(kappe_code_error, "param error: packet too long"); + throw appexception(err::kerr_invalid_param, "param error: packet too long"); } int finalpacketlen = len % 8 == 0 ? 8 : len % 8; @@ -181,7 +181,7 @@ shared_ptr ZSCanProtocolCom::callcmd(int32_t to, int32_t cmdid, uint8_t } if (!rxreceipt) { - throw appexception(kerr_overtime, "overtime"); + throw appexception(err::kerr_overtime, "overtime"); } if (m_receipt_frame->ptype == kerror_receipt) { diff --git a/appsrc/baseservice/baseservice.hpp b/appsrc/baseservice/baseservice.hpp new file mode 100644 index 0000000..ef90c7d --- /dev/null +++ b/appsrc/baseservice/baseservice.hpp @@ -0,0 +1,9 @@ +#pragma once +#include "appbase/dep.hpp" +// +#include "db/db_service.hpp" +#include "devicestate/device_state_service.hpp" +#include "front_msg_processer/front_msg_processer.hpp" +#include "iflytop_front_end_service/iflytop_front_end_service.hpp" +#include "appcomponents/app_errorcode_mgr/app_errorcode_mgr.hpp" +#include "appcomponents/canchannel/transmit_disinfection_can_master.hpp" diff --git a/appsrc/baseservice/db/db_service.cpp b/appsrc/baseservice/db/db_service.cpp new file mode 100644 index 0000000..b20310b --- /dev/null +++ b/appsrc/baseservice/db/db_service.cpp @@ -0,0 +1,664 @@ +#include + +// +#include +#include + +#include "db_service.hpp" +// + +using namespace std; +using namespace iflytop; +using namespace iflytop::db; +using namespace sqlite_orm; +using namespace nlohmann; + +// 数据库工具使用手册 +// auto notJohn = storage.get_all(where(c(&User::firstName) != "John")); +// 主键必须是int,或者不要主键 + +#define USER_DB_STRUCT \ + USER_DB, /**/ \ + make_table("users", /**/ \ + make_column("id", &User::id, primary_key().autoincrement()), /**/ \ + make_column("uid", &User::uid), /**/ \ + make_column("passwd", &User::passwd), /**/ \ + make_column("is_admin", &User::is_admin) /**/ \ + ) + +#define SETTING_DB_STRUCT \ + make_table("settings", /**/ \ + make_column("id", &Setting::id, primary_key()), /**/ \ + make_column("name", &Setting::name), /**/ \ + make_column("name_ch", &Setting::name_ch), /**/ \ + make_column("val_lower_limit", &Setting::val_lower_limit), /**/ \ + make_column("val_upper_limit", &Setting::val_upper_limit), /**/ \ + make_column("permission_level", &Setting::permission_level), /**/ \ + make_column("val", &Setting::val), /**/ \ + make_column("default_val", &Setting::default_val) /**/ \ + ) + +#define FORMULA_DB_STRUCT \ + make_table("formulas", /**/ \ + make_column("id", &Formula::id, primary_key()), /**/ \ + make_column("loglevel", &Formula::loglevel), /**/ \ + make_column("formula_id", &Formula::formula_id), /**/ \ + make_column("stoped_gs", &Formula::stoped_gs), /**/ \ + make_column("continued_gs", &Formula::continued_gs), /**/ \ + make_column("stoped_satur", &Formula::stoped_satur), /**/ \ + make_column("continued_satur", &Formula::continued_satur), /**/ \ + make_column("stoped_humi", &Formula::stoped_humi), /**/ \ + make_column("continued_humi", &Formula::continued_humi), /**/ \ + make_column("injection_pump_speed", &Formula::injection_pump_speed)) + +#define USER_BEHAVIOR_RECORD_STRUCT \ + make_table("user_behavior_records", /**/ \ + make_column("id", &UserBehaviorRecord::id, primary_key().autoincrement()), /**/ \ + make_column("uid", &UserBehaviorRecord::uid), /**/ \ + make_column("date", &UserBehaviorRecord::date), /**/ \ + make_column("behavior", &UserBehaviorRecord::behavior), /**/ \ + make_column("behaviorinfo", &UserBehaviorRecord::behaviorinfo)) + +/******************************************************************************* + * 配置列表 * + *******************************************************************************/ + +#define SETTING_ITEM(_id, _name, _name_ch, _val_lower_limit, _val_upper_limit, _val) \ + {.id = _id, .name = _name, .name_ch = _name_ch, .val_lower_limit = _val_lower_limit, .val_upper_limit = _val_upper_limit, .permission_level = 0, .val = _val, .default_val = _val} + +static Setting config_settings_table[] = { + SETTING_ITEM(1, "stoped_gs", /*************/ "消毒停止过氧化氢溶度", /**********/ 0, 2000, 300), // + SETTING_ITEM(2, "continued_gs", /**********/ "消毒继续过氧化氢溶度", /**********/ 0, 2000, 200), // + SETTING_ITEM(3, "stoped_satur", /**********/ "消毒停止过氧化氢相对饱和度", /*****/ 0, 100, 85), // + SETTING_ITEM(4, "continued_satur", /*******/ "消毒继续过氧化氢相对饱和度", /*****/ 0, 100, 60), // + SETTING_ITEM(5, "max_humidity", /**********/ "允许消毒最大湿度", /*************/ 0, 100, 90), // + SETTING_ITEM(6, "drainage_pump_speed", /***/ "排液蠕动泵最大转速", /************/ 0, 400, 400), // + SETTING_ITEM(7, "injection_pump_speed", /**/ "喷射蠕动泵转速", /***************/ 0, INJECTION_PUMP_SPEED_LIMIT_VAL, INJECTION_PUMP_SPEED_DEFAULT), // + SETTING_ITEM(8, "pre_heat_time_s", /*******/ "预热时间", /*******************/ 0, 1200, 120), // + SETTING_ITEM(9, "stoped_humi", /***********/ "消毒停止相对湿度", /************/ 0, 100, 85), // + SETTING_ITEM(10, "continued_humi", /*******/ "消毒继续相对湿度", /************/ 0, 100, 60), // + SETTING_ITEM(11, "proportional_valve_default_value", "正负压默认开合比例", 0, 100, 10), // + SETTING_ITEM(12, "record_period_min", "消毒日志记录间隔", 1, 10, 1), // + SETTING_ITEM(13, "record_printer_period_min", "消毒日志打印间隔", 1, 10, 3), // + +}; + +#define ZARRARY_SIZE(val) (sizeof(val) / sizeof(val[0])) + +DBService::DBService(/* args */) {} + +void DBService::initialize() { + /** + * @brief 初始化用户表 + */ + + // + init_usr_db(); + init_setting_db(); + + json settings = getAllSettingJson(); + logger->info("settings: {}", settings.dump()); +} + +void DBService::init_usr_db() { + bool suc = false; + do { + try { + logger->info("init user db"); + auto storage = make_storage(USER_DB_STRUCT); + storage.sync_schema(); + auto admin = storage.get_all(where(c(&User::uid) == "admin")); + if (admin.size() == 0) { + storage.insert({-1, "管理员", "9973", true}); // 管理员 + } + auto user = storage.get_all(where(c(&User::uid) == "user")); + if (user.size() == 0) { + storage.insert({-1, "用户0", "0000", false}); // 普通用户 + } + suc = true; + } catch (const std::exception& e) { + logger->error("init user db failed: {}", e.what()); + system("rm -rf user.db"); + sleep(1); + } + } while (!suc); +} +void DBService::init_setting_db() { + bool suc = false; +#if 0 +id setting_name setting_name_ch val_upper_limit val_lower_limit permission_level val +0 stoped_gs 消毒停止过氧化氢溶度 0 2000 1 1000 +1 continued_gs 消毒继续过氧化氢溶度 0 2000 1 800 +2 stoped_satur 消毒停止过氧化氢相对饱和度 0 100 1 80 +3 continued_satur 消毒继续过氧化氢相对饱和度 0 100 1 60 +4 max_humidity 允许消毒最大湿度 0 100 1 90 +5 drainage_pump_speed 排液蠕动泵转速 0 2000 2 500 +6 injection_pump_speed 喷射蠕动泵转速 0 2000 2 500 +#endif + + do { + try { + logger->info("init setting db"); + auto storage = make_storage(SETTING_DB, SETTING_DB_STRUCT); + storage.sync_schema(); + + for (size_t i = 0; i < ZARRARY_SIZE(config_settings_table); i++) { + if (storage.get_all(where(c(&Setting::id) == config_settings_table[i].id)).size() == 0) { + if (config_settings_table[i].id == 7) { + auto cfg = GET_SERVICE(GConfig); + if (cfg->get_projectType() == PROJECT_DRAW_BAR_DM) { + config_settings_table[i].default_val = DRAW_BAR_DM_INJECTION_PUMP_SPEED_DEFAULT; + config_settings_table[i].val_upper_limit = DRAW_BAR_DM_INJECTION_PUMP_SPEED_LIMIT_VAL; + } else { + config_settings_table[i].default_val = INJECTION_PUMP_SPEED_DEFAULT; + config_settings_table[i].val_upper_limit = INJECTION_PUMP_SPEED_LIMIT_VAL; + } + } + storage.insert(config_settings_table[i]); + } + } + + suc = true; + } catch (const std::exception& e) { + logger->error("init setting db failed: {}", e.what()); + system("rm -rf setting.db"); + sleep(1); + } + } while (!suc); +} + +void DBService::init_formula_db() { + bool suc = false; + + do { + try { + logger->info("init formula db"); + auto storage = make_storage(FORMULA_DB, FORMULA_DB_STRUCT); + storage.sync_schema(); + + suc = true; + } catch (const std::exception& e) { + logger->error("init setting db failed: {}", e.what()); + system("rm -rf setting.db"); + sleep(1); + } + } while (!suc); +} + +list> DBService::getAllUser() { + lock_guard lock(lock_); + + list> users; + auto usertable = make_storage(USER_DB_STRUCT); + usertable.sync_schema(); + auto all = usertable.get_all(); + for (auto& u : all) { + users.push_back(make_shared(u)); + } + return users; +} +void DBService::addUser(string uid, string passwd) { + lock_guard lock(lock_); + + auto usertable = make_storage(USER_DB_STRUCT); + usertable.sync_schema(); + logger->info("add user: {} {} {}", uid, passwd, false); + usertable.insert(User{-1, uid, passwd, false}); +} +shared_ptr DBService::delUser(int id) { + lock_guard lock(lock_); + + auto usertable = make_storage(USER_DB_STRUCT); + usertable.sync_schema(); + /** + * @brief find admin user + */ + auto admin = usertable.get_all(where(c(&User::uid) == "admin")); + ZCHECK(admin.size() == 1, "admin user not found"); + if (admin[0].id == id) { + logger->error("can not delete admin user"); + 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 nullptr; + } + logger->info("delete user: {}:{}", id, remove_user[0].uid); + usertable.remove_all(where(c(&User::id) == id)); + return make_shared(remove_user[0]); +} + +shared_ptr DBService::changePasswd(string uid, string passwd) { + lock_guard lock(lock_); + + auto usertable = make_storage(USER_DB_STRUCT); + usertable.sync_schema(); + auto user = usertable.get_all(where(c(&User::uid) == uid)); + if (user.size() == 0) { + logger->error("change passwd fail, user not found"); + 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() { + lock_guard lock(lock_); + + json j_users; + auto usertable = make_storage(USER_DB_STRUCT); + usertable.sync_schema(); + auto all = usertable.get_all(); + for (auto& u : all) { + json j_user; + j_user["id"] = u.id; + j_user["uid"] = u.uid; + j_user["passwd"] = u.passwd; + j_user["is_admin"] = u.is_admin; + j_users.push_back(j_user); + } + return j_users; +} + +shared_ptr DBService::getUser(string uid) { + lock_guard lock(lock_); + + auto usertable = make_storage(USER_DB_STRUCT); + usertable.sync_schema(); + auto user = usertable.get_all(where(c(&User::uid) == uid)); + if (user.size() == 0) { + return nullptr; + } + return make_shared(user[0]); +} + +list> DBService::getAllSetting() { + lock_guard lock(lock_); + + list> settings; + auto settingtable = make_storage(SETTING_DB, SETTING_DB_STRUCT); + settingtable.sync_schema(); + auto all = settingtable.get_all(); + for (auto& s : all) { + settings.push_back(make_shared(s)); + } + return settings; +} +json DBService::getAllSettingJson() { + lock_guard lock(lock_); + + json j_settings; + auto settingtable = make_storage(SETTING_DB, SETTING_DB_STRUCT); + settingtable.sync_schema(); + auto all = settingtable.get_all(); + for (auto& s : all) { + json j_setting; + j_setting["id"] = s.id; + j_setting["name"] = s.name; + j_setting["name_ch"] = s.name_ch; + j_setting["val"] = s.val; + j_setting["val_lower_limit"] = s.val_lower_limit; + j_setting["val_upper_limit"] = s.val_upper_limit; + j_setting["permission_level"] = s.permission_level; + j_setting["val"] = s.val; + j_setting["default_val"] = s.default_val; + j_settings.push_back(j_setting); + } + return j_settings; +} + +void DBService::settingfactoryReset() { + auto settings = getAllSetting(); + for (auto& s : settings) { + setSettingVal(s->id, s->default_val); + } +} + +bool DBService::isUserExist(string uid) { + lock_guard lock(lock_); + + auto usertable = make_storage(USER_DB_STRUCT); + usertable.sync_schema(); + auto user = usertable.get_all(where(c(&User::uid) == uid)); + if (user.size() == 0) { + return false; + } + return true; +} +bool DBService::ispasswdCorrect(string uid, string passwd) { + lock_guard lock(lock_); + + auto usertable = make_storage(USER_DB_STRUCT); + usertable.sync_schema(); + auto user = usertable.get_all(where(c(&User::uid) == uid)); + if (user.size() == 0) { + return false; + } + if (user[0].passwd == passwd) { + return true; + } + return false; +} + +bool DBService::setSettingVal(int id, int val) { + lock_guard lock(lock_); + + auto settingtable = make_storage(SETTING_DB, SETTING_DB_STRUCT); + settingtable.sync_schema(); + auto setting = settingtable.get_all(where(c(&Setting::id) == id)); + if (setting.size() == 0) { + return false; + } + if (setting[0].val < setting[0].val_lower_limit || setting[0].val > setting[0].val_upper_limit) { + return false; + } + setting[0].val = val; + settingtable.update(setting[0]); + return true; +} +bool DBService::setSettingVal(string setting_name, int val) { + lock_guard lock(lock_); + + logger->info("set setting val: {} {}", setting_name, val); + auto settingtable = make_storage(SETTING_DB, SETTING_DB_STRUCT); + settingtable.sync_schema(); + auto setting = settingtable.get_all(where(c(&Setting::name) == setting_name)); + if (setting.size() == 0) { + logger->error("set setting val failed: {} not found", setting_name); + return false; + } + if (setting[0].val < setting[0].val_lower_limit || setting[0].val > setting[0].val_upper_limit) { + logger->error("set setting val failed: {} out of range", setting_name); + return false; + } + setting[0].val = val; + Setting s = setting[0]; + settingtable.update(s); + settingtable.sync_schema(); + return true; +} + +int DBService::getSettingVal(string name) { + lock_guard lock(lock_); + + auto settingtable = make_storage(SETTING_DB, SETTING_DB_STRUCT); + settingtable.sync_schema(); + auto setting = settingtable.get_all(where(c(&Setting::name) == name)); + if (setting.size() == 0) { + return -1; + } + return setting[0].val; +} + +list> DBService::getAllFormula() { + lock_guard lock(lock_); + + list> formulas; + auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT); + formulatable.sync_schema(); + auto all = formulatable.get_all(); + for (auto& f : all) { + formulas.push_back(make_shared(f)); + } + return formulas; +} +shared_ptr DBService::getFormula(int id) { + 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 nullptr; + } + return make_shared(formula[0]); +} + +json DBService::getAllFormulaJson() { + lock_guard lock(lock_); + + json j_formulas; + auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT); + formulatable.sync_schema(); + auto all = formulatable.get_all(); + for (auto& f : all) { + json j_formula; + j_formula["id"] = f.id; + j_formula["loglevel"] = f.loglevel; + j_formula["formula_id"] = f.formula_id; + j_formula["stoped_gs"] = f.stoped_gs; + j_formula["continued_gs"] = f.continued_gs; + j_formula["stoped_satur"] = f.stoped_satur; + j_formula["continued_satur"] = f.continued_satur; + j_formula["stoped_humi"] = f.stoped_humi; + j_formula["continued_humi"] = f.continued_humi; + j_formula["injection_pump_speed"] = f.injection_pump_speed; + j_formulas.push_back(j_formula); + } + + json jret; + jret["formulas"] = j_formulas; + jret["settings"] = getAllSettingJson(); + + return jret; +} +void DBService::addFormula(string formula_id, string loglevel, string stoped_gs, string continued_gs, string stoped_satur, string continued_satur, string stoped_humi, string continued_humi, string injection_pump_speed) { + lock_guard lock(lock_); + + auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT); + formulatable.sync_schema(); + Formula f; + f.loglevel = loglevel; + f.formula_id = formula_id; + f.stoped_gs = stoped_gs; + f.continued_gs = continued_gs; + f.stoped_satur = stoped_satur; + f.continued_satur = continued_satur; + f.stoped_humi = stoped_humi; + f.continued_humi = continued_humi; + f.injection_pump_speed = injection_pump_speed; + formulatable.insert(f); + + formulatable.sync_schema(); +} + +void DBService::addFormula(string formula_id, int loglevel, int stoped_gs, int continued_gs, int stoped_satur, int continued_satur, int stoped_humi, int continued_humi, int injection_pump_speed) { + addFormula(formula_id, to_string(loglevel), 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)); +} +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]); +} + +shared_ptr DBService::updateFormula(shared_ptr var_formula) { + lock_guard lock(lock_); + if (var_formula == nullptr) { + return nullptr; + } + auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT); + formulatable.sync_schema(); + auto formula = formulatable.get_all(where(c(&Formula::id) == var_formula->id)); + if (formula.size() == 0) { + return nullptr; + } + formulatable.update(*var_formula); + formulatable.sync_schema(); + return var_formula; +} + +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 nullptr; + } + if (column == "formula_id") { + formula[0].formula_id = val; + } else if (column == "loglevel") { + formula[0].loglevel = val; + } else if (column == "stoped_gs") { + formula[0].stoped_gs = val; + } else if (column == "continued_gs") { + formula[0].continued_gs = val; + } else if (column == "stoped_satur") { + formula[0].stoped_satur = val; + } else if (column == "continued_satur") { + formula[0].continued_satur = val; + } else if (column == "stoped_humi") { + formula[0].stoped_humi = val; + } else if (column == "continued_humi") { + formula[0].continued_humi = val; + } else if (column == "injection_pump_speed") { + formula[0].injection_pump_speed = val; + } + formulatable.update(formula[0]); + formulatable.sync_schema(); + return make_shared(formula[0]); +} + +int DBService::getUserBehaviorRecordCount() { + lock_guard lock(lock_); + + auto user_behavior_record_table = make_storage(USER_BEHAVIOR_RECORD_DB, USER_BEHAVIOR_RECORD_STRUCT); + user_behavior_record_table.sync_schema(); + return user_behavior_record_table.count(where(c(&UserBehaviorRecord::id) > 0)); +} +int DBService::getUserBehaviorRecordTheFirstId() { + lock_guard lock(lock_); + + auto user_behavior_record_table = make_storage(USER_BEHAVIOR_RECORD_DB, USER_BEHAVIOR_RECORD_STRUCT); + user_behavior_record_table.sync_schema(); + auto all = user_behavior_record_table.get_all(order_by(&UserBehaviorRecord::id).asc()); + if (all.size() == 0) { + return -1; + } + return all[0].id; +} + +list> DBService::getAllUserBehaviorRecord() { + lock_guard lock(lock_); + + auto user_behavior_record_table = make_storage(USER_BEHAVIOR_RECORD_DB, USER_BEHAVIOR_RECORD_STRUCT); + user_behavior_record_table.sync_schema(); + + auto all = user_behavior_record_table.get_all(order_by(&UserBehaviorRecord::id).desc()); + + list> user_behavior_records; + for (auto& u : all) { + user_behavior_records.push_back(make_shared(u)); + } + return user_behavior_records; +} + +json DBService::getUserBehaviorRecordDescJson(int page, int page_size) { + lock_guard lock(lock_); + + json j_user_behavior_records; + + auto user_behavior_record_table = make_storage(USER_BEHAVIOR_RECORD_DB, USER_BEHAVIOR_RECORD_STRUCT); + user_behavior_record_table.sync_schema(); + + auto all = user_behavior_record_table.get_all(order_by(&UserBehaviorRecord::id).desc()); + + int i = 0; + + int from = page * page_size; + int to = (page + 1) * page_size; + + for (auto& u : all) { + if (i >= from && i < to) { + json j_user_behavior_record; + j_user_behavior_record["id"] = u.id; + j_user_behavior_record["uid"] = u.uid; + j_user_behavior_record["behavior"] = u.behavior; + j_user_behavior_record["behaviorZH"] = user_behavior_to_str((user_behavior_t)u.behavior); + j_user_behavior_record["behaviorinfo"] = u.behaviorinfo; + j_user_behavior_record["date"] = u.date; + j_user_behavior_records["iterms"].push_back(j_user_behavior_record); + } else if (i >= to) { + break; + } + i++; + } + + j_user_behavior_records["total"] = all.size(); + j_user_behavior_records["page"] = page; + j_user_behavior_records["totalpage"] = all.size() / page_size + (all.size() % page_size == 0 ? 0 : 1); + + return j_user_behavior_records; +} + +static string getTime() { + struct tm tm = {0}; + + time_t t = ::time(nullptr); + struct tm* tmp = localtime_r(&t, &tm); + return fmt::format("{:0>4}-{:0>2}-{:0>2} {:0>2}:{:0>2}:{:0>2}", tm.tm_year + 1900, // + tm.tm_mon + 1, // + tm.tm_mday, // + tm.tm_hour, // + tm.tm_min, tm.tm_sec); +} + +void DBService::addUserBehaviorRecord(string uid, int behavior, string behaviorinfo) { + lock_guard lock(lock_); + + auto user_behavior_record_table = make_storage(USER_BEHAVIOR_RECORD_DB, USER_BEHAVIOR_RECORD_STRUCT); + user_behavior_record_table.sync_schema(); + UserBehaviorRecord u; + u.uid = uid; + u.behavior = behavior; + u.behaviorinfo = behaviorinfo; + u.date = getTime(); + user_behavior_record_table.insert(u); + user_behavior_record_table.sync_schema(); + + auto all = user_behavior_record_table.get_all(order_by(&UserBehaviorRecord::id).asc()); + /** + * @brief 如果记录总数量大于5000条,删除第一条 + */ + if (all.size() > USER_BEHAVIOR_RECORD_DB_MAX_RECORDS) { + user_behavior_record_table.remove_all(where(c(&UserBehaviorRecord::id) == all[0].id)); + user_behavior_record_table.sync_schema(); + } + return; +} +void DBService::cleanUserBehaviorRecord() { + lock_guard lock(lock_); + system(fmt::format("rm -rf {}", USER_BEHAVIOR_RECORD_DB).c_str()); +} \ No newline at end of file diff --git a/appsrc/baseservice/db/db_service.hpp b/appsrc/baseservice/db/db_service.hpp new file mode 100644 index 0000000..cfc50c8 --- /dev/null +++ b/appsrc/baseservice/db/db_service.hpp @@ -0,0 +1,179 @@ +#pragma once + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "appbase/dep.hpp" +#include "user_behavior_des.hpp" + +#define USER_DB "user.db" +#define SETTING_DB "setting.db" +#define DISINFECTION_RECORD_DB "disinfection_record.db" +#define FORMULA_DB "formula.db" +#define USER_BEHAVIOR_RECORD_DB "user_behavior_record.db" + +/** + * @brief + * + * USER_DB + * table: user + * id uid passwd permission_level + * + * + * SETTING_DB + * table: setting + * id setting_name setting_name_ch val_upper_limit val_lower_limit permission_level val + * + * DISINFECTION_RECORD_DB + * table: disinfection_record + * id uuid uid date loglevel duration + * + * + * table: sensor_record + * id disinfection_id date heating_strip air_compressor sprinkler_pump disinfectant_volume h2o2_1 temp_1 humid_1 saturation_1 h2o2_2 temp_2 humid_2 + * saturation_2 h2o2_3 temp_3 humid_3 saturation_3 + * + */ + +namespace iflytop { +using namespace std; +using namespace std; +using namespace core; +using namespace nlohmann; +namespace db { + +struct User { + public: + int id; + string uid; + string passwd; + bool is_admin; +}; + +struct Setting { + public: + int id; + string name; + string name_ch; + int val_lower_limit; + int val_upper_limit; + int permission_level; + int val; + int default_val; +}; + +struct Formula { + public: + int id; + string loglevel; + string formula_id; + string stoped_gs; + string continued_gs; + string stoped_satur; + string continued_satur; + string stoped_humi; + string continued_humi; + string injection_pump_speed; +}; + +struct UserBehaviorRecord { + int id; + string uid; + string date; + int behavior; + string behaviorinfo; +}; + +} // namespace db +using namespace db; +class DBService : public enable_shared_from_this { + ENABLE_LOGGER(DBService); + recursive_mutex lock_; + + public: + DBService(); + void initialize(); + + public: + /******************************************************************************* + * USER_DB * + *******************************************************************************/ + list> getAllUser(); + json getAllUserJson(); + shared_ptr getUser(string uid); + vector getUserNames(); + bool isUserExist(string uid); + bool ispasswdCorrect(string uid, string passwd); + + /** + * @brief 添加用户 + * + * @param uid 用户名 + * @param passwd 密码 + * @param permission_level 许可等级,0超级管理员 3普通用户 + */ + void addUser(string uid, string passwd); + shared_ptr delUser(int id); + shared_ptr changePasswd(string uid, string passwd); + shared_ptr updateUserUid(int id, string uid, string& olduid); + + public: + /******************************************************************************* + * SETTING_DB * + *******************************************************************************/ + list> getAllSetting(); + json getAllSettingJson(); + bool setSettingVal(int id, int val); + bool setSettingVal(string name, int val); + int getSettingVal(string name); + void settingfactoryReset(); + + public: + /******************************************************************************* + * Formula * + *******************************************************************************/ + + list> getAllFormula(); + json getAllFormulaJson(); + void addFormula(string formula_id, string loglevel, string stoped_gs, string continued_gs, string stoped_satur, string continued_satur, string stoped_humi, string continued_humi, string injection_pump_speed); + void addFormula(string formula_id, int loglevel, int stoped_gs, int continued_gs, int stoped_satur, int continued_satur, int stoped_humi, int continued_humi, int injection_pump_speed); + shared_ptr delFormula(int id); + shared_ptr updateFormula(int id, string column, string val); + shared_ptr updateFormula(shared_ptr formula); + + shared_ptr getFormula(int id); + + /******************************************************************************* + * UserBehaviorRecord * + *******************************************************************************/ + + list> getAllUserBehaviorRecord(); + + int getUserBehaviorRecordCount(); + int getUserBehaviorRecordTheFirstId(); + + json getUserBehaviorRecordDescJson(int page, int page_size); + void addUserBehaviorRecord(string uid, int behavior, string behaviorinfo); + void cleanUserBehaviorRecord(); + + private: + void init_usr_db(); + void init_setting_db(); + void init_formula_db(); +}; + +}; // namespace iflytop + +#define ADD_USER_BEHAVIOR(uid, behavior, behaviorinfo) GET_SERVICE(DBService)->addUserBehaviorRecord(uid, behavior, behaviorinfo) \ No newline at end of file diff --git a/appsrc/baseservice/db/user_behavior_des.cpp b/appsrc/baseservice/db/user_behavior_des.cpp new file mode 100644 index 0000000..eb171a3 --- /dev/null +++ b/appsrc/baseservice/db/user_behavior_des.cpp @@ -0,0 +1,54 @@ +#include "user_behavior_des.hpp" + +using namespace iflytop; +using namespace iflytop::db; + +namespace iflytop { +namespace db { + +string user_behavior_to_str(user_behavior_t behavior) { + switch (behavior) { + case kbehavior_login: + return "登陆"; + case kbehavior_logout: + return "登出"; + case kbehavior_add_user: + return "添加用户"; + case kbehavior_del_user: + return "删除用户"; + case kbehavior_update_user_permission_level: + return "更新用户权限"; + case kbehavior_update_user_passwd: + return "更新用户密码"; + case kbehavior_update_user_uid: + return "更新用户ID"; + case kbehavior_set_setting_val: + return "设置参数"; + case kbehavior_add_formula: + return "添加配方"; + case kbehavior_del_formula: + return "删除配方"; + case kbehavior_update_formula: + return "更新配方"; + case kbehavior_update_formula_name: + return "更新配方名称"; + case kbehavior_do_disinfection: + return "开始消毒"; + case kbehavior_stop_disinfection: + return "停止消毒"; + case kbehavior_do_formula: + return "执行配方"; + case kbehavior_update_setting_val_on_disinfection: + return "消毒中更新参数"; + case kbehavior_export_disinfection_data: + return "导出消毒数据"; + case kbehavior_export_user_action_data: + return "导出用户操作数据"; + default: + break; + } + return "未知行为"; +} + +} // namespace db +} // namespace iflytop diff --git a/appsrc/baseservice/db/user_behavior_des.hpp b/appsrc/baseservice/db/user_behavior_des.hpp new file mode 100644 index 0000000..e71c5db --- /dev/null +++ b/appsrc/baseservice/db/user_behavior_des.hpp @@ -0,0 +1,41 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +namespace iflytop { +using namespace std; + +namespace db { +typedef enum { + kbehavior_login = 0, + kbehavior_logout = 1, + kbehavior_add_user = 2, + kbehavior_del_user = 3, + 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, + kbehavior_update_formula_name = 18, +} user_behavior_t; + +string user_behavior_to_str(user_behavior_t behavior); + +} // namespace db + +} // namespace iflytop \ No newline at end of file diff --git a/appsrc/baseservice/devicestate/device_state_service.hpp b/appsrc/baseservice/devicestate/device_state_service.hpp new file mode 100644 index 0000000..0f35f01 --- /dev/null +++ b/appsrc/baseservice/devicestate/device_state_service.hpp @@ -0,0 +1,59 @@ +// +// Created by zwsd +// + +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "appbase/dep.hpp" + +/** + * @brief + * + * service: DeviceStateService + * + * 监听事件: + * 依赖状态: + * 依赖服务: + * 作用: + * + */ + +namespace iflytop { +using namespace std; +using namespace core; +class DeviceStateService : public enable_shared_from_this { + ENABLE_LOGGER(DeviceStateService); + + bool loginFlag = false; + bool m_isLoginAdmin = false; + string loginUid; + + public: + DeviceStateService() {}; + + void setLoginState(string uid, bool isadmin) { + loginFlag = true; + loginUid = uid; + m_isLoginAdmin = isadmin; + } + + void unlogin() { + loginFlag = false; + loginUid = ""; + } + bool isLogin() { return loginFlag; } + string getLoginUid() { return loginUid; } + bool isLoginAdmin() { return m_isLoginAdmin; } + + void initialize() {}; +}; +} // namespace iflytop \ No newline at end of file diff --git a/appsrc/baseservice/front_msg_processer/front_msg_processer.cpp b/appsrc/baseservice/front_msg_processer/front_msg_processer.cpp new file mode 100644 index 0000000..38d1557 --- /dev/null +++ b/appsrc/baseservice/front_msg_processer/front_msg_processer.cpp @@ -0,0 +1,58 @@ +#include "front_msg_processer.hpp" + +#include "appcomponents/app_errorcode_mgr/app_errorcode_mgr.hpp" +#include "iflytop/core/error/error_code.hpp" + +using namespace iflytop; + +// { +// "messageId":"1234", +// "timeStamp":1112312, +// "messageType":"Command", +// "className":"UserMgrService", +// "fnName":"readAll", +// "param":{ +// } +// } + +void FrontMsgProcesser::initialize() {} + +void FrontMsgProcesser::processMsg(shared_ptr cxt) { + string className = cxt->cmd["className"]; + string fnName = cxt->cmd["fnName"]; + string key = className + "." + fnName; + + string fn = className+ "." + fnName; + string param = cxt->cmd["param"].dump(); + + logger->info("call: {}->({})", fn, param); + + if (m_msgProcesserMap.find(key) != m_msgProcesserMap.end()) { + try { + m_msgProcesserMap[key]->fn(cxt); + if (int(cxt->receipt["ackcode"]) != 0) { + cxt->receipt["message"] = fmt::format("[{}],{}", ecode2str(cxt->receipt["ackcode"]), cxt->ackcodeExtMessage); + } + } catch (const appexception& e) { + logger->error("process {} error: {}", key, e.what()); + cxt->receipt["ackcode"] = e.ecode(); + cxt->receipt["message"] = fmt::format("[{}],{}", ecode2str(cxt->receipt["ackcode"]), e.what()); + } + } else { + logger->error("unknown command: {}", key); + cxt->receipt["ackcode"] = err::kappe_cmd_not_support; + cxt->receipt["message"] = fmt::format("[{}],未找到指令 {}", ecode2str(cxt->receipt["ackcode"]), key); + } +} +void FrontMsgProcesser::registerMsgProcesser(const string& className, const string fnName, MsgProcesserFn_t fn) { + string key = className + "." + fnName; + if (m_msgProcesserMap.find(key) != m_msgProcesserMap.end()) { + logger->warn("cmd {} already registered", key); + return; + } + shared_ptr processer = make_shared(); + processer->className = className; + processer->fnName = fnName; + processer->fn = fn; + m_msgProcesserMap[key] = processer; +} \ No newline at end of file diff --git a/appsrc/baseservice/front_msg_processer/front_msg_processer.hpp b/appsrc/baseservice/front_msg_processer/front_msg_processer.hpp new file mode 100644 index 0000000..ab9dc91 --- /dev/null +++ b/appsrc/baseservice/front_msg_processer/front_msg_processer.hpp @@ -0,0 +1,85 @@ +// +// Created by zwsd +// + +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "appbase/dep.hpp" + +/** + * @brief + * + * service: FrontMsgProcesser + * + * 监听事件: + * 依赖状态: + * 依赖服务: + * 作用: + * + */ + +namespace iflytop { +using namespace std; +using namespace core; + +class MsgProcessContext { + public: + json cmd; + json receipt; + int ackcode = 0; + string ackcodeExtMessage; +}; + +typedef std::function cxt)> MsgProcesserFn_t; + +class MsgProcesser { + public: + string className; + string fnName; + MsgProcesserFn_t fn; +}; + +class FrontMsgProcesser : public enable_shared_from_this { + ENABLE_LOGGER(FrontMsgProcesser); + + public: + private: + map > m_msgProcesserMap; + + public: + FrontMsgProcesser() {}; + void initialize(); + void processMsg(shared_ptr cxt); + void registerMsgProcesser(const string& className, const string fnName, MsgProcesserFn_t fn); +}; + +static inline void getJsonValFromJson(json j, int& val) { + if (j.is_string()) { + string valstr = j; + val = atoi(valstr.c_str()); + } else if (j.is_number()) { + val = j; + } else { + throw std::runtime_error("getJsonValFromJson(int) error"); + } +} + +template +static inline T jsonGet(json j) { + T val; + getJsonValFromJson(j, val); + return val; +} +#define BIND(func) bind(&func, shared_from_this(), placeholders::_1) + +} // namespace iflytop +#define REGFN(className, fn) GET_SERVICE(FrontMsgProcesser)->registerMsgProcesser(#className, #fn, BIND(className::fn)) diff --git a/appsrc/baseservice/iflytop_front_end_service/iflytop_front_end_service.cpp b/appsrc/baseservice/iflytop_front_end_service/iflytop_front_end_service.cpp new file mode 100644 index 0000000..c73a2ec --- /dev/null +++ b/appsrc/baseservice/iflytop_front_end_service/iflytop_front_end_service.cpp @@ -0,0 +1,171 @@ +#include "iflytop_front_end_service.hpp" + +#include "appcomponents/app_errorcode_mgr/app_errorcode_mgr.hpp" +using namespace nlohmann; +using namespace iflytop; +using namespace std; +using namespace core; +using namespace ix; + +void IflytopFrontEndService::initialize(string ip) { + logger->info("IflytopFrontEndService initialize {}:{}", ip, 19001); + logger->info("IflytopFrontEndService initialize {}:{}", ip, 19002); + + m_workQueue.reset(new WorkQueue("IflytopFrontEndService-WQ")); + m_workQueue->startWork(); + + m_server.reset(new WebSocketServer(19001, ip)); + m_server->setOnConnectionCallback([this](weak_ptr webSocket, shared_ptr connectionState) { + logger->info("Remote ip: {}", connectionState->getRemoteIp()); + auto ws = webSocket.lock(); + if (!ws) return; + ws->setOnMessageCallback([this, webSocket, connectionState](const ix::WebSocketMessagePtr& msg) { + // shared_ptr messageSPtr = make_shared(*msg); + try { + onMessageCallback(webSocket, connectionState, msg); + } catch (const std::exception& e) { + logger->error("catch exception,onMessageCallback error: {}", e.what()); + } + }); + }); + + m_reportServer.reset(new WebSocketServer(19002, ip)); + m_reportServer->setOnConnectionCallback([this](weak_ptr webSocket, shared_ptr connectionState) { + logger->info("Remote ip: {}", connectionState->getRemoteIp()); + auto ws = webSocket.lock(); + if (!ws) return; + ws->setOnMessageCallback([this, webSocket, connectionState](const ix::WebSocketMessagePtr& msg) {}); + }); + + m_initialized = true; +} +void IflytopFrontEndService::startListen() { + if (!m_server->listen().first) { + logger->error("listen error!!!!"); + return; + } + + if (!m_reportServer->listen().first) { + logger->error("listen error!!!!"); + return; + } + + m_server->disablePerMessageDeflate(); + m_server->start(); + + m_reportServer->disablePerMessageDeflate(); + m_reportServer->start(); + + logger->info("IflytopFrontEndService startListen"); +} + +void IflytopFrontEndService::sendReport(json& report) { + if (!m_initialized) { + logger->error("IflytopFrontEndService not initialized"); + return; + } + /** + * @brief 广播消息给所有连接的客户端 + */ + + report["timeStamp"] = duration_cast(system_clock::now().time_since_epoch()).count(); + logger->debug("uplink msg: {}", report.dump()); + + auto clients = m_reportServer->getClients(); + for (auto& each : clients) { + if (each) { + each->sendText(report.dump()); + } + } +} + +void IflytopFrontEndService::onMessageCallback(weak_ptr webSocket, shared_ptr connectionState, const ix::WebSocketMessagePtr& msg) { + if (msg->type == ix::WebSocketMessageType::Open) { + logger->info("New connection"); + logger->info("id : {}", connectionState->getId()); + logger->info("Uri : {}", msg->openInfo.uri); + logger->info("Headers:"); + for (auto it : msg->openInfo.headers) { + logger->info(" {}: {}", it.first, it.second); + } + + m_workQueue->enQueue([this, webSocket]() { onConnect(webSocket); }); + + } else if (msg->type == ix::WebSocketMessageType::Message) { + logger->debug("downlink msg: {}", msg->str); + string msgtext = msg->str; + m_workQueue->enQueue([this, webSocket, msgtext]() { + try { + processRxMessage(webSocket, msgtext); + } catch (const std::exception& e) { + logger->error("catch exception,processRxMessage error: {}", e.what()); + } + }); + + } else if (msg->type == ix::WebSocketMessageType::Close) { + logger->info("{} Closed connection", msg->closeInfo.remote); + m_workQueue->enQueue([this, webSocket]() { onDisconnect(webSocket); }); + } +} +void IflytopFrontEndService::processRxMessage(weak_ptr webSocket, string rxmsg) { + string msgtext = rxmsg; + json message; + + try { + shared_ptr ws = webSocket.lock(); + if (!ws) { + logger->error("process msg fail,webSocket is null"); + return; + } + + json command = json::parse(msgtext); + json receipt; + receipt["messageId"] = command["messageId"]; + receipt["ackcode"] = 0; + receipt["timeStamp"] = duration_cast(system_clock::now().time_since_epoch()).count(); + try { + onMessage(webSocket, command, receipt); + ws->sendText(receipt.dump(1)); + } catch (const detail::parse_error& e) { + // json parse error + logger->error("process rx json failed,exception:{},{}", e.what(), msgtext); + receipt["ackcode"] = err::kappe_parse_json_err; + receipt["ackcodeInfo"] = ecode2str(err::kappe_parse_json_err) + "," + e.what(); + ws->sendText(receipt.dump(1)); + } catch (const detail::invalid_iterator& e) { + // json parse error + logger->error("process rx json failed,exception:{},{}", e.what(), msgtext); + receipt["ackcode"] = err::kappe_parse_json_err; + receipt["ackcodeInfo"] = ecode2str(err::kappe_parse_json_err) + "," + e.what(); + ws->sendText(receipt.dump(1)); + } catch (const detail::type_error& e) { + // json parse error + logger->error("process rx json failed,exception:{},{}", e.what(), msgtext); + receipt["ackcode"] = err::kappe_parse_json_err; + receipt["ackcodeInfo"] = ecode2str(err::kappe_parse_json_err) + "," + e.what(); + ws->sendText(receipt.dump(1)); + } catch (const detail::out_of_range& e) { + // json parse error + logger->error("process rx json failed,exception:{},{}", e.what(), msgtext); + receipt["ackcode"] = err::kappe_parse_json_err; + receipt["ackcodeInfo"] = ecode2str(err::kappe_parse_json_err) + "," + e.what(); + ws->sendText(receipt.dump(1)); + } catch (const detail::other_error& e) { + // json parse error + logger->error("process rx json failed,exception:{},{}", e.what(), msgtext); + receipt["ackcode"] = err::kappe_parse_json_err; + receipt["ackcodeInfo"] = ecode2str(err::kappe_parse_json_err); + ws->sendText(receipt.dump(1)); + } catch (const std::exception& e) { + logger->error("process rx json failed,exception:{},{}", e.what(), msgtext); + receipt["ackcode"] = err::kappe_std_exception; + receipt["ackcodeInfo"] = ecode2str(err::kappe_std_exception) + "," + e.what(); + ws->sendText(receipt.dump(1)); + } + + + } catch (const std::exception& e) { + logger->error("m_iflytopWSService:onMessag,parse json failed,exception:{},{}", e.what(), msgtext); + return; + } +} diff --git a/appsrc/baseservice/iflytop_front_end_service/iflytop_front_end_service.hpp b/appsrc/baseservice/iflytop_front_end_service/iflytop_front_end_service.hpp new file mode 100644 index 0000000..2dd311d --- /dev/null +++ b/appsrc/baseservice/iflytop_front_end_service/iflytop_front_end_service.hpp @@ -0,0 +1,60 @@ +// +// Created by iflytop +// + +#pragma once +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "appbase/dep.hpp" +/** + * @brief + * + * service: IflytopHardwareWSService + * + */ + +namespace iflytop { +using namespace std; +using namespace iflytop; +using namespace core; +using namespace ix; +using namespace nlohmann; + +class IflytopFrontEndService : public enable_shared_from_this { + ENABLE_LOGGER(IflytopFrontEndService); + + public: + // nod::signal webSocket, const ix::WebSocketMessagePtr& msg)> onMessage; + nod::signal webSocket)> onConnect; + nod::signal webSocket)> onDisconnect; + nod::signal webSocket, json& cmd, json& receipt)> onMessage; + + private: + // + // WebSocketServer的使用参考:http://192.168.1.3:3000/z3rd_lib/IXWebSocket/src/branch/master/docs/usage.md + // + shared_ptr m_server; + shared_ptr m_reportServer; + unique_ptr m_workQueue; + bool m_initialized = false; + + public: + void initialize(string ip = "0.0.0.0"); + void startListen(); + void sendReport(json& report); + + private: + void onMessageCallback(weak_ptr webSocket, shared_ptr connectionState, const ix::WebSocketMessagePtr& msg); + void processRxMessage(weak_ptr webSocket, string rxmsg); +}; +} // namespace iflytop \ No newline at end of file diff --git a/appsrc/baseservice/iflytop_front_end_service/protocol.md b/appsrc/baseservice/iflytop_front_end_service/protocol.md new file mode 100644 index 0000000..072360c --- /dev/null +++ b/appsrc/baseservice/iflytop_front_end_service/protocol.md @@ -0,0 +1,13 @@ +``` +cmd: + +messageId +timeStamp + +className:"" +fnName:"" +param:{ +} + + +``` \ No newline at end of file diff --git a/appsrc/main.cpp b/appsrc/main.cpp index 1866b41..b9608e0 100644 --- a/appsrc/main.cpp +++ b/appsrc/main.cpp @@ -73,9 +73,7 @@ int Main::main(int argc, char *argv[]) { BUILD_AND_REG_SERRVICE(GConfig); GET_SERVICE(GConfig)->initialize(); - BUILD_AND_REG_SERRVICE(UartPrinter); - GET_SERVICE(UartPrinter)->initialize(GET_SERVICE(GConfig)->get_printerUart(), "9600"); /** * @brief diff --git a/appsrc/service/db/db_service.cpp b/appsrc/service/db/db_service.cpp deleted file mode 100644 index 2a6a877..0000000 --- a/appsrc/service/db/db_service.cpp +++ /dev/null @@ -1,682 +0,0 @@ -#include - -// -#include -#include - -#include "db_service.hpp" -// - -using namespace std; -using namespace iflytop; -using namespace iflytop::db; -using namespace sqlite_orm; -using namespace nlohmann; - -// 数据库工具使用手册 -// auto notJohn = storage.get_all(where(c(&User::firstName) != "John")); -// 主键必须是int,或者不要主键 - -#define USER_DB_STRUCT \ - USER_DB, /**/ \ - make_table("users", /**/ \ - make_column("id", &User::id, primary_key().autoincrement()), /**/ \ - make_column("uid", &User::uid), /**/ \ - make_column("passwd", &User::passwd), /**/ \ - make_column("permission_level", &User::permission_level), /**/ \ - make_column("visible", &User::visible)) - -#define SETTING_DB_STRUCT \ - make_table("settings", /**/ \ - make_column("id", &Setting::id, primary_key()), /**/ \ - make_column("name", &Setting::name), /**/ \ - make_column("name_ch", &Setting::name_ch), /**/ \ - make_column("val_lower_limit", &Setting::val_lower_limit), /**/ \ - make_column("val_upper_limit", &Setting::val_upper_limit), /**/ \ - make_column("permission_level", &Setting::permission_level), /**/ \ - make_column("val", &Setting::val), /**/ \ - make_column("default_val", &Setting::default_val) /**/ \ - ) - -#define FORMULA_DB_STRUCT \ - make_table("formulas", /**/ \ - make_column("id", &Formula::id, primary_key()), /**/ \ - make_column("loglevel", &Formula::loglevel), /**/ \ - make_column("formula_id", &Formula::formula_id), /**/ \ - make_column("stoped_gs", &Formula::stoped_gs), /**/ \ - make_column("continued_gs", &Formula::continued_gs), /**/ \ - make_column("stoped_satur", &Formula::stoped_satur), /**/ \ - make_column("continued_satur", &Formula::continued_satur), /**/ \ - make_column("stoped_humi", &Formula::stoped_humi), /**/ \ - make_column("continued_humi", &Formula::continued_humi), /**/ \ - make_column("injection_pump_speed", &Formula::injection_pump_speed)) - -#define USER_BEHAVIOR_RECORD_STRUCT \ - make_table("user_behavior_records", /**/ \ - make_column("id", &UserBehaviorRecord::id, primary_key().autoincrement()), /**/ \ - make_column("uid", &UserBehaviorRecord::uid), /**/ \ - make_column("date", &UserBehaviorRecord::date), /**/ \ - make_column("behavior", &UserBehaviorRecord::behavior), /**/ \ - make_column("behaviorinfo", &UserBehaviorRecord::behaviorinfo)) - -/******************************************************************************* - * 配置列表 * - *******************************************************************************/ - -#define SETTING_ITEM(_id, _name, _name_ch, _val_lower_limit, _val_upper_limit, _val) \ - {.id = _id, .name = _name, .name_ch = _name_ch, .val_lower_limit = _val_lower_limit, .val_upper_limit = _val_upper_limit, .permission_level = 0, .val = _val, .default_val = _val} - -static Setting config_settings_table[] = { - SETTING_ITEM(1, "stoped_gs", /*************/ "消毒停止过氧化氢溶度", /**********/ 0, 2000, 300), // - SETTING_ITEM(2, "continued_gs", /**********/ "消毒继续过氧化氢溶度", /**********/ 0, 2000, 200), // - SETTING_ITEM(3, "stoped_satur", /**********/ "消毒停止过氧化氢相对饱和度", /*****/ 0, 100, 85), // - SETTING_ITEM(4, "continued_satur", /*******/ "消毒继续过氧化氢相对饱和度", /*****/ 0, 100, 60), // - SETTING_ITEM(5, "max_humidity", /**********/ "允许消毒最大湿度", /*************/ 0, 100, 90), // - SETTING_ITEM(6, "drainage_pump_speed", /***/ "排液蠕动泵最大转速", /************/ 0, 400, 400), // - SETTING_ITEM(7, "injection_pump_speed", /**/ "喷射蠕动泵转速", /***************/ 0, INJECTION_PUMP_SPEED_LIMIT_VAL, INJECTION_PUMP_SPEED_DEFAULT), // - SETTING_ITEM(8, "pre_heat_time_s", /*******/ "预热时间", /*******************/ 0, 1200, 120), // - SETTING_ITEM(9, "stoped_humi", /***********/ "消毒停止相对湿度", /************/ 0, 100, 85), // - SETTING_ITEM(10, "continued_humi", /*******/ "消毒继续相对湿度", /************/ 0, 100, 60), // - SETTING_ITEM(11, "proportional_valve_default_value", "正负压默认开合比例", 0, 100, 10), // - SETTING_ITEM(12, "record_period_min", "消毒日志记录间隔", 1, 10, 1), // - SETTING_ITEM(13, "record_printer_period_min", "消毒日志打印间隔", 1, 10, 3), // - -}; - -#define ZARRARY_SIZE(val) (sizeof(val) / sizeof(val[0])) - -DBService::DBService(/* args */) {} - -void DBService::initialize() { - /** - * @brief 初始化用户表 - */ - - // - init_usr_db(); - init_setting_db(); - - json settings = getAllSettingJson(); - logger->info("settings: {}", settings.dump()); -} - -void DBService::init_usr_db() { - bool suc = false; - do { - try { - logger->info("init user db"); - auto storage = make_storage(USER_DB_STRUCT); - storage.sync_schema(); - auto admin = storage.get_all(where(c(&User::uid) == "admin")); - if (admin.size() == 0) { - storage.insert({-1, "admin", "9973", 1, true}); // 管理员 - } - auto user = storage.get_all(where(c(&User::uid) == "user")); - if (user.size() == 0) { - storage.insert({-1, "user", "0000", 3, true}); // 普通用户 - } - suc = true; - } catch (const std::exception& e) { - logger->error("init user db failed: {}", e.what()); - system("rm -rf user.db"); - sleep(1); - } - } while (!suc); -} -void DBService::init_setting_db() { - bool suc = false; -#if 0 -id setting_name setting_name_ch val_upper_limit val_lower_limit permission_level val -0 stoped_gs 消毒停止过氧化氢溶度 0 2000 1 1000 -1 continued_gs 消毒继续过氧化氢溶度 0 2000 1 800 -2 stoped_satur 消毒停止过氧化氢相对饱和度 0 100 1 80 -3 continued_satur 消毒继续过氧化氢相对饱和度 0 100 1 60 -4 max_humidity 允许消毒最大湿度 0 100 1 90 -5 drainage_pump_speed 排液蠕动泵转速 0 2000 2 500 -6 injection_pump_speed 喷射蠕动泵转速 0 2000 2 500 -#endif - - do { - try { - logger->info("init setting db"); - auto storage = make_storage(SETTING_DB, SETTING_DB_STRUCT); - storage.sync_schema(); - - for (size_t i = 0; i < ZARRARY_SIZE(config_settings_table); i++) { - if (storage.get_all(where(c(&Setting::id) == config_settings_table[i].id)).size() == 0) { - if (config_settings_table[i].id == 7) { - auto cfg = GET_SERVICE(GConfig); - if (cfg->get_projectType() == PROJECT_DRAW_BAR_DM) { - config_settings_table[i].default_val = DRAW_BAR_DM_INJECTION_PUMP_SPEED_DEFAULT; - config_settings_table[i].val_upper_limit = DRAW_BAR_DM_INJECTION_PUMP_SPEED_LIMIT_VAL; - } else { - config_settings_table[i].default_val = INJECTION_PUMP_SPEED_DEFAULT; - config_settings_table[i].val_upper_limit = INJECTION_PUMP_SPEED_LIMIT_VAL; - } - } - storage.insert(config_settings_table[i]); - } - } - - suc = true; - } catch (const std::exception& e) { - logger->error("init setting db failed: {}", e.what()); - system("rm -rf setting.db"); - sleep(1); - } - } while (!suc); -} - -void DBService::init_formula_db() { - bool suc = false; - - do { - try { - logger->info("init formula db"); - auto storage = make_storage(FORMULA_DB, FORMULA_DB_STRUCT); - storage.sync_schema(); - - suc = true; - } catch (const std::exception& e) { - logger->error("init setting db failed: {}", e.what()); - system("rm -rf setting.db"); - sleep(1); - } - } while (!suc); -} - -list> DBService::getAllUser() { - lock_guard lock(lock_); - - list> users; - auto usertable = make_storage(USER_DB_STRUCT); - usertable.sync_schema(); - auto all = usertable.get_all(); - for (auto& u : all) { - users.push_back(make_shared(u)); - } - return users; -} -void DBService::addUser(string uid, string passwd, int permission_level) { - lock_guard lock(lock_); - - auto usertable = make_storage(USER_DB_STRUCT); - usertable.sync_schema(); - logger->info("add user: {} {} {}", uid, passwd, permission_level); - usertable.insert(User{-1, uid, passwd, permission_level, true}); -} -shared_ptr DBService::delUser(int id) { - lock_guard lock(lock_); - - auto usertable = make_storage(USER_DB_STRUCT); - usertable.sync_schema(); - /** - * @brief find admin user - */ - auto admin = usertable.get_all(where(c(&User::uid) == "admin")); - ZCHECK(admin.size() == 1, "admin user not found"); - if (admin[0].id == id) { - logger->error("can not delete admin user"); - 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 nullptr; - } - logger->info("delete user: {}:{}", id, remove_user[0].uid); - usertable.remove_all(where(c(&User::id) == id)); - return make_shared(remove_user[0]); -} - -shared_ptr DBService::updateUserPermissionLevel(int id, int permission_level) { - 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("update user permission level fail, user not found"); - 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]); -} - -shared_ptr DBService::changePasswd(string uid, string passwd) { - lock_guard lock(lock_); - - auto usertable = make_storage(USER_DB_STRUCT); - usertable.sync_schema(); - auto user = usertable.get_all(where(c(&User::uid) == uid)); - if (user.size() == 0) { - logger->error("change passwd fail, user not found"); - 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() { - lock_guard lock(lock_); - - json j_users; - auto usertable = make_storage(USER_DB_STRUCT); - usertable.sync_schema(); - auto all = usertable.get_all(); - for (auto& u : all) { - json j_user; - j_user["id"] = u.id; - j_user["uid"] = u.uid; - j_user["passwd"] = u.passwd; - j_user["permission_level"] = u.permission_level; - j_user["visible"] = u.visible; - j_users.push_back(j_user); - } - return j_users; -} - -shared_ptr DBService::getUser(string uid) { - lock_guard lock(lock_); - - auto usertable = make_storage(USER_DB_STRUCT); - usertable.sync_schema(); - auto user = usertable.get_all(where(c(&User::uid) == uid)); - if (user.size() == 0) { - return nullptr; - } - return make_shared(user[0]); -} - -list> DBService::getAllSetting() { - lock_guard lock(lock_); - - list> settings; - auto settingtable = make_storage(SETTING_DB, SETTING_DB_STRUCT); - settingtable.sync_schema(); - auto all = settingtable.get_all(); - for (auto& s : all) { - settings.push_back(make_shared(s)); - } - return settings; -} -json DBService::getAllSettingJson() { - lock_guard lock(lock_); - - json j_settings; - auto settingtable = make_storage(SETTING_DB, SETTING_DB_STRUCT); - settingtable.sync_schema(); - auto all = settingtable.get_all(); - for (auto& s : all) { - json j_setting; - j_setting["id"] = s.id; - j_setting["name"] = s.name; - j_setting["name_ch"] = s.name_ch; - j_setting["val"] = s.val; - j_setting["val_lower_limit"] = s.val_lower_limit; - j_setting["val_upper_limit"] = s.val_upper_limit; - j_setting["permission_level"] = s.permission_level; - j_setting["val"] = s.val; - j_setting["default_val"] = s.default_val; - j_settings.push_back(j_setting); - } - return j_settings; -} - -void DBService::settingfactoryReset() { - auto settings = getAllSetting(); - for (auto& s : settings) { - setSettingVal(s->id, s->default_val); - } -} - -bool DBService::isUserExist(string uid) { - lock_guard lock(lock_); - - auto usertable = make_storage(USER_DB_STRUCT); - usertable.sync_schema(); - auto user = usertable.get_all(where(c(&User::uid) == uid)); - if (user.size() == 0) { - return false; - } - return true; -} -bool DBService::ispasswdCorrect(string uid, string passwd) { - lock_guard lock(lock_); - - auto usertable = make_storage(USER_DB_STRUCT); - usertable.sync_schema(); - auto user = usertable.get_all(where(c(&User::uid) == uid)); - if (user.size() == 0) { - return false; - } - if (user[0].passwd == passwd) { - return true; - } - return false; -} - -bool DBService::setSettingVal(int id, int val) { - lock_guard lock(lock_); - - auto settingtable = make_storage(SETTING_DB, SETTING_DB_STRUCT); - settingtable.sync_schema(); - auto setting = settingtable.get_all(where(c(&Setting::id) == id)); - if (setting.size() == 0) { - return false; - } - if (setting[0].val < setting[0].val_lower_limit || setting[0].val > setting[0].val_upper_limit) { - return false; - } - setting[0].val = val; - settingtable.update(setting[0]); - return true; -} -bool DBService::setSettingVal(string setting_name, int val) { - lock_guard lock(lock_); - - logger->info("set setting val: {} {}", setting_name, val); - auto settingtable = make_storage(SETTING_DB, SETTING_DB_STRUCT); - settingtable.sync_schema(); - auto setting = settingtable.get_all(where(c(&Setting::name) == setting_name)); - if (setting.size() == 0) { - logger->error("set setting val failed: {} not found", setting_name); - return false; - } - if (setting[0].val < setting[0].val_lower_limit || setting[0].val > setting[0].val_upper_limit) { - logger->error("set setting val failed: {} out of range", setting_name); - return false; - } - setting[0].val = val; - Setting s = setting[0]; - settingtable.update(s); - settingtable.sync_schema(); - return true; -} - -int DBService::getSettingVal(string name) { - lock_guard lock(lock_); - - auto settingtable = make_storage(SETTING_DB, SETTING_DB_STRUCT); - settingtable.sync_schema(); - auto setting = settingtable.get_all(where(c(&Setting::name) == name)); - if (setting.size() == 0) { - return -1; - } - return setting[0].val; -} - -list> DBService::getAllFormula() { - lock_guard lock(lock_); - - list> formulas; - auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT); - formulatable.sync_schema(); - auto all = formulatable.get_all(); - for (auto& f : all) { - formulas.push_back(make_shared(f)); - } - return formulas; -} -shared_ptr DBService::getFormula(int id) { - 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 nullptr; - } - return make_shared(formula[0]); -} - -json DBService::getAllFormulaJson() { - lock_guard lock(lock_); - - json j_formulas; - auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT); - formulatable.sync_schema(); - auto all = formulatable.get_all(); - for (auto& f : all) { - json j_formula; - j_formula["id"] = f.id; - j_formula["loglevel"] = f.loglevel; - j_formula["formula_id"] = f.formula_id; - j_formula["stoped_gs"] = f.stoped_gs; - j_formula["continued_gs"] = f.continued_gs; - j_formula["stoped_satur"] = f.stoped_satur; - j_formula["continued_satur"] = f.continued_satur; - j_formula["stoped_humi"] = f.stoped_humi; - j_formula["continued_humi"] = f.continued_humi; - j_formula["injection_pump_speed"] = f.injection_pump_speed; - j_formulas.push_back(j_formula); - } - - json jret; - jret["formulas"] = j_formulas; - jret["settings"] = getAllSettingJson(); - - return jret; -} -void DBService::addFormula(string formula_id, string loglevel, string stoped_gs, string continued_gs, string stoped_satur, string continued_satur, string stoped_humi, string continued_humi, string injection_pump_speed) { - lock_guard lock(lock_); - - auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT); - formulatable.sync_schema(); - Formula f; - f.loglevel = loglevel; - f.formula_id = formula_id; - f.stoped_gs = stoped_gs; - f.continued_gs = continued_gs; - f.stoped_satur = stoped_satur; - f.continued_satur = continued_satur; - f.stoped_humi = stoped_humi; - f.continued_humi = continued_humi; - f.injection_pump_speed = injection_pump_speed; - formulatable.insert(f); - - formulatable.sync_schema(); -} - -void DBService::addFormula(string formula_id, int loglevel, int stoped_gs, int continued_gs, int stoped_satur, int continued_satur, int stoped_humi, int continued_humi, int injection_pump_speed) { - addFormula(formula_id, to_string(loglevel), 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)); -} -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]); -} - -shared_ptr DBService::updateFormula(shared_ptr var_formula) { - lock_guard lock(lock_); - if (var_formula == nullptr) { - return nullptr; - } - auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT); - formulatable.sync_schema(); - auto formula = formulatable.get_all(where(c(&Formula::id) == var_formula->id)); - if (formula.size() == 0) { - return nullptr; - } - formulatable.update(*var_formula); - formulatable.sync_schema(); - return var_formula; -} - -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 nullptr; - } - if (column == "formula_id") { - formula[0].formula_id = val; - } else if (column == "loglevel") { - formula[0].loglevel = val; - } else if (column == "stoped_gs") { - formula[0].stoped_gs = val; - } else if (column == "continued_gs") { - formula[0].continued_gs = val; - } else if (column == "stoped_satur") { - formula[0].stoped_satur = val; - } else if (column == "continued_satur") { - formula[0].continued_satur = val; - } else if (column == "stoped_humi") { - formula[0].stoped_humi = val; - } else if (column == "continued_humi") { - formula[0].continued_humi = val; - } else if (column == "injection_pump_speed") { - formula[0].injection_pump_speed = val; - } - formulatable.update(formula[0]); - formulatable.sync_schema(); - return make_shared(formula[0]); -} - -int DBService::getUserBehaviorRecordCount() { - lock_guard lock(lock_); - - auto user_behavior_record_table = make_storage(USER_BEHAVIOR_RECORD_DB, USER_BEHAVIOR_RECORD_STRUCT); - user_behavior_record_table.sync_schema(); - return user_behavior_record_table.count(where(c(&UserBehaviorRecord::id) > 0)); -} -int DBService::getUserBehaviorRecordTheFirstId() { - lock_guard lock(lock_); - - auto user_behavior_record_table = make_storage(USER_BEHAVIOR_RECORD_DB, USER_BEHAVIOR_RECORD_STRUCT); - user_behavior_record_table.sync_schema(); - auto all = user_behavior_record_table.get_all(order_by(&UserBehaviorRecord::id).asc()); - if (all.size() == 0) { - return -1; - } - return all[0].id; -} - -list> DBService::getAllUserBehaviorRecord() { - lock_guard lock(lock_); - - auto user_behavior_record_table = make_storage(USER_BEHAVIOR_RECORD_DB, USER_BEHAVIOR_RECORD_STRUCT); - user_behavior_record_table.sync_schema(); - - auto all = user_behavior_record_table.get_all(order_by(&UserBehaviorRecord::id).desc()); - - list> user_behavior_records; - for (auto& u : all) { - user_behavior_records.push_back(make_shared(u)); - } - return user_behavior_records; -} - -json DBService::getUserBehaviorRecordDescJson(int page, int page_size) { - lock_guard lock(lock_); - - json j_user_behavior_records; - - auto user_behavior_record_table = make_storage(USER_BEHAVIOR_RECORD_DB, USER_BEHAVIOR_RECORD_STRUCT); - user_behavior_record_table.sync_schema(); - - auto all = user_behavior_record_table.get_all(order_by(&UserBehaviorRecord::id).desc()); - - int i = 0; - - int from = page * page_size; - int to = (page + 1) * page_size; - - for (auto& u : all) { - if (i >= from && i < to) { - json j_user_behavior_record; - j_user_behavior_record["id"] = u.id; - j_user_behavior_record["uid"] = u.uid; - j_user_behavior_record["behavior"] = u.behavior; - j_user_behavior_record["behaviorZH"] = user_behavior_to_str((user_behavior_t)u.behavior); - j_user_behavior_record["behaviorinfo"] = u.behaviorinfo; - j_user_behavior_record["date"] = u.date; - j_user_behavior_records["iterms"].push_back(j_user_behavior_record); - } else if (i >= to) { - break; - } - i++; - } - - j_user_behavior_records["total"] = all.size(); - j_user_behavior_records["page"] = page; - j_user_behavior_records["totalpage"] = all.size() / page_size + (all.size() % page_size == 0 ? 0 : 1); - - return j_user_behavior_records; -} - -static string getTime() { - struct tm tm = {0}; - - time_t t = ::time(nullptr); - struct tm* tmp = localtime_r(&t, &tm); - return fmt::format("{:0>4}-{:0>2}-{:0>2} {:0>2}:{:0>2}:{:0>2}", tm.tm_year + 1900, // - tm.tm_mon + 1, // - tm.tm_mday, // - tm.tm_hour, // - tm.tm_min, tm.tm_sec); -} - -void DBService::addUserBehaviorRecord(string uid, int behavior, string behaviorinfo) { - lock_guard lock(lock_); - - auto user_behavior_record_table = make_storage(USER_BEHAVIOR_RECORD_DB, USER_BEHAVIOR_RECORD_STRUCT); - user_behavior_record_table.sync_schema(); - UserBehaviorRecord u; - u.uid = uid; - u.behavior = behavior; - u.behaviorinfo = behaviorinfo; - u.date = getTime(); - user_behavior_record_table.insert(u); - user_behavior_record_table.sync_schema(); - - auto all = user_behavior_record_table.get_all(order_by(&UserBehaviorRecord::id).asc()); - /** - * @brief 如果记录总数量大于5000条,删除第一条 - */ - if (all.size() > USER_BEHAVIOR_RECORD_DB_MAX_RECORDS) { - user_behavior_record_table.remove_all(where(c(&UserBehaviorRecord::id) == all[0].id)); - user_behavior_record_table.sync_schema(); - } - return; -} -void DBService::cleanUserBehaviorRecord() { - lock_guard lock(lock_); - system(fmt::format("rm -rf {}", USER_BEHAVIOR_RECORD_DB).c_str()); -} \ No newline at end of file diff --git a/appsrc/service/db/db_service.hpp b/appsrc/service/db/db_service.hpp deleted file mode 100644 index 1d217cd..0000000 --- a/appsrc/service/db/db_service.hpp +++ /dev/null @@ -1,180 +0,0 @@ -#pragma once - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "appbase/dep.hpp" - -#include "user_behavior_des.hpp" - -#define USER_DB "user.db" -#define SETTING_DB "setting.db" -#define DISINFECTION_RECORD_DB "disinfection_record.db" -#define FORMULA_DB "formula.db" -#define USER_BEHAVIOR_RECORD_DB "user_behavior_record.db" - -/** - * @brief - * - * USER_DB - * table: user - * id uid passwd permission_level - * - * - * SETTING_DB - * table: setting - * id setting_name setting_name_ch val_upper_limit val_lower_limit permission_level val - * - * DISINFECTION_RECORD_DB - * table: disinfection_record - * id uuid uid date loglevel duration - * - * - * table: sensor_record - * id disinfection_id date heating_strip air_compressor sprinkler_pump disinfectant_volume h2o2_1 temp_1 humid_1 saturation_1 h2o2_2 temp_2 humid_2 - * saturation_2 h2o2_3 temp_3 humid_3 saturation_3 - * - */ - -namespace iflytop { -using namespace std; -using namespace std; -using namespace core; -using namespace nlohmann; -namespace db { - -struct User { - public: - int id; - string uid; - string passwd; - int permission_level; - int visible; -}; - -struct Setting { - public: - int id; - string name; - string name_ch; - int val_lower_limit; - int val_upper_limit; - int permission_level; - int val; - int default_val; -}; - -struct Formula { - public: - int id; - string loglevel; - string formula_id; - string stoped_gs; - string continued_gs; - string stoped_satur; - string continued_satur; - string stoped_humi; - string continued_humi; - string injection_pump_speed; -}; - -struct UserBehaviorRecord { - int id; - string uid; - string date; - int behavior; - string behaviorinfo; -}; - -} // namespace db -using namespace db; -class DBService : public enable_shared_from_this { - ENABLE_LOGGER(DBService); - recursive_mutex lock_; - - public: - DBService(); - void initialize(); - - public: - /******************************************************************************* - * USER_DB * - *******************************************************************************/ - list> getAllUser(); - json getAllUserJson(); - shared_ptr getUser(string uid); - vector getUserNames(); - bool isUserExist(string uid); - bool ispasswdCorrect(string uid, string passwd); - - /** - * @brief 添加用户 - * - * @param uid 用户名 - * @param passwd 密码 - * @param permission_level 许可等级,0超级管理员 3普通用户 - */ - 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: - /******************************************************************************* - * SETTING_DB * - *******************************************************************************/ - list> getAllSetting(); - json getAllSettingJson(); - bool setSettingVal(int id, int val); - bool setSettingVal(string name, int val); - int getSettingVal(string name); - void settingfactoryReset(); - - public: - /******************************************************************************* - * Formula * - *******************************************************************************/ - - list> getAllFormula(); - json getAllFormulaJson(); - void addFormula(string formula_id, string loglevel, string stoped_gs, string continued_gs, string stoped_satur, string continued_satur, string stoped_humi, string continued_humi, string injection_pump_speed); - void addFormula(string formula_id, int loglevel, int stoped_gs, int continued_gs, int stoped_satur, int continued_satur, int stoped_humi, int continued_humi, int injection_pump_speed); - shared_ptr delFormula(int id); - shared_ptr updateFormula(int id, string column, string val); - shared_ptr updateFormula(shared_ptr formula); - - shared_ptr getFormula(int id); - - /******************************************************************************* - * UserBehaviorRecord * - *******************************************************************************/ - - list> getAllUserBehaviorRecord(); - - int getUserBehaviorRecordCount(); - int getUserBehaviorRecordTheFirstId(); - - json getUserBehaviorRecordDescJson(int page, int page_size); - void addUserBehaviorRecord(string uid, int behavior, string behaviorinfo); - void cleanUserBehaviorRecord(); - - private: - void init_usr_db(); - void init_setting_db(); - void init_formula_db(); -}; - -}; // namespace iflytop diff --git a/appsrc/service/db/user_behavior_des.cpp b/appsrc/service/db/user_behavior_des.cpp deleted file mode 100644 index eb171a3..0000000 --- a/appsrc/service/db/user_behavior_des.cpp +++ /dev/null @@ -1,54 +0,0 @@ -#include "user_behavior_des.hpp" - -using namespace iflytop; -using namespace iflytop::db; - -namespace iflytop { -namespace db { - -string user_behavior_to_str(user_behavior_t behavior) { - switch (behavior) { - case kbehavior_login: - return "登陆"; - case kbehavior_logout: - return "登出"; - case kbehavior_add_user: - return "添加用户"; - case kbehavior_del_user: - return "删除用户"; - case kbehavior_update_user_permission_level: - return "更新用户权限"; - case kbehavior_update_user_passwd: - return "更新用户密码"; - case kbehavior_update_user_uid: - return "更新用户ID"; - case kbehavior_set_setting_val: - return "设置参数"; - case kbehavior_add_formula: - return "添加配方"; - case kbehavior_del_formula: - return "删除配方"; - case kbehavior_update_formula: - return "更新配方"; - case kbehavior_update_formula_name: - return "更新配方名称"; - case kbehavior_do_disinfection: - return "开始消毒"; - case kbehavior_stop_disinfection: - return "停止消毒"; - case kbehavior_do_formula: - return "执行配方"; - case kbehavior_update_setting_val_on_disinfection: - return "消毒中更新参数"; - case kbehavior_export_disinfection_data: - return "导出消毒数据"; - case kbehavior_export_user_action_data: - return "导出用户操作数据"; - default: - break; - } - return "未知行为"; -} - -} // namespace db -} // namespace iflytop diff --git a/appsrc/service/db/user_behavior_des.hpp b/appsrc/service/db/user_behavior_des.hpp deleted file mode 100644 index e71c5db..0000000 --- a/appsrc/service/db/user_behavior_des.hpp +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -namespace iflytop { -using namespace std; - -namespace db { -typedef enum { - kbehavior_login = 0, - kbehavior_logout = 1, - kbehavior_add_user = 2, - kbehavior_del_user = 3, - 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, - kbehavior_update_formula_name = 18, -} user_behavior_t; - -string user_behavior_to_str(user_behavior_t behavior); - -} // namespace db - -} // namespace iflytop \ No newline at end of file diff --git a/appsrc/service/extapi/extapi_dep.hpp b/appsrc/service/extapi/extapi_dep.hpp deleted file mode 100644 index 9f42f44..0000000 --- a/appsrc/service/extapi/extapi_dep.hpp +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once -#include "service/db/db_service.hpp" -#include "service/iflytop_front_end_service/iflytop_front_end_service.hpp" -#include "service/front_msg_processer/front_msg_processer.hpp" \ No newline at end of file diff --git a/appsrc/service/extapi/user_mgr_service.cpp b/appsrc/service/extapi/user_mgr_service.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/appsrc/service/extapi/user_mgr_service.hpp b/appsrc/service/extapi/user_mgr_service.hpp deleted file mode 100644 index d60ced7..0000000 --- a/appsrc/service/extapi/user_mgr_service.hpp +++ /dev/null @@ -1,29 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -// -#include "service/iflytop_front_end_service/iflytop_front_end_service.hpp" -#include "service/front_msg_processer/front_msg_processer.hpp" -#include "service/device_alert_dectector_service.hpp" -namespace iflytop { - -class UserMgrService : public enable_shared_from_this { - ENABLE_LOGGER(UserMgrService); - - - - public: - UserMgrService(){}; - void initialize(){}; - - private: - -}; - -} // namespace iflytop diff --git a/appsrc/service/front_msg_processer/front_msg_processer.cpp b/appsrc/service/front_msg_processer/front_msg_processer.cpp deleted file mode 100644 index e8e4e3a..0000000 --- a/appsrc/service/front_msg_processer/front_msg_processer.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "front_msg_processer.hpp" -#include "iflytop/core/error/error_code.hpp" - -using namespace iflytop; - -void FrontMsgProcesser::initialize() {} -void FrontMsgProcesser::processMsg(json& cmd, json& receipt) { - string cmdstr = cmd["command"]; - if (m_msgProcesserMap.find(cmdstr) != m_msgProcesserMap.end()) { - m_msgProcesserMap[cmdstr](cmd, receipt); - } else { - logger->error("unknown command: {}", cmdstr); - receipt["ackcode"] = err::kfail; - } -} -void FrontMsgProcesser::registerMsgProcesser(const string& cmdName, MsgProcesserFn_t fn) { - if (m_msgProcesserMap.find(cmdName) != m_msgProcesserMap.end()) { - logger->warn("cmd {} already registered", cmdName); - return; - } - m_msgProcesserMap[cmdName] = fn; -} \ No newline at end of file diff --git a/appsrc/service/front_msg_processer/front_msg_processer.hpp b/appsrc/service/front_msg_processer/front_msg_processer.hpp deleted file mode 100644 index 1dcd440..0000000 --- a/appsrc/service/front_msg_processer/front_msg_processer.hpp +++ /dev/null @@ -1,68 +0,0 @@ -// -// Created by zwsd -// - -#pragma once -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "appbase/dep.hpp" - -/** - * @brief - * - * service: FrontMsgProcesser - * - * 监听事件: - * 依赖状态: - * 依赖服务: - * 作用: - * - */ - -namespace iflytop { -using namespace std; -using namespace core; -class FrontMsgProcesser : public enable_shared_from_this { - ENABLE_LOGGER(FrontMsgProcesser); - - public: - typedef std::function MsgProcesserFn_t; - - private: - map m_msgProcesserMap; - - public: - FrontMsgProcesser(){}; - void initialize(); - void processMsg(json& cmd, json& receipt); - void registerMsgProcesser(const string& cmdName, MsgProcesserFn_t fn); -}; - -static inline void getJsonValFromJson(json j, int& val) { - if (j.is_string()) { - string valstr = j; - val = atoi(valstr.c_str()); - } else if (j.is_number()) { - val = j; - } else { - throw std::runtime_error("getJsonValFromJson(int) error"); - } -} - -template -static inline T jsonGet(json j) { - T val; - getJsonValFromJson(j, val); - return val; -} -#define BIND(func) bind(&func, shared_from_this(), placeholders::_1, placeholders::_2) - -} // namespace iflytop \ No newline at end of file diff --git a/appsrc/service/iflytop_front_end_service/iflytop_front_end_service.cpp b/appsrc/service/iflytop_front_end_service/iflytop_front_end_service.cpp deleted file mode 100644 index 76df142..0000000 --- a/appsrc/service/iflytop_front_end_service/iflytop_front_end_service.cpp +++ /dev/null @@ -1,136 +0,0 @@ -#include "iflytop_front_end_service.hpp" -using namespace nlohmann; -using namespace iflytop; -using namespace std; -using namespace core; -using namespace ix; - -void IflytopFrontEndService::initialize(string ip) { - logger->info("IflytopFrontEndService initialize {}:{}", ip, 19001); - logger->info("IflytopFrontEndService initialize {}:{}", ip, 19002); - - m_workQueue.reset(new WorkQueue("IflytopFrontEndService-WQ")); - m_workQueue->startWork(); - - m_server.reset(new WebSocketServer(19001, ip)); - m_server->setOnConnectionCallback([this](weak_ptr webSocket, shared_ptr connectionState) { - logger->info("Remote ip: {}", connectionState->getRemoteIp()); - auto ws = webSocket.lock(); - if (!ws) return; - ws->setOnMessageCallback([this, webSocket, connectionState](const ix::WebSocketMessagePtr& msg) { - // shared_ptr messageSPtr = make_shared(*msg); - try { - onMessageCallback(webSocket, connectionState, msg); - } catch (const std::exception& e) { - logger->error("catch exception,onMessageCallback error: {}", e.what()); - } - }); - }); - - m_reportServer.reset(new WebSocketServer(19002, ip)); - m_reportServer->setOnConnectionCallback([this](weak_ptr webSocket, shared_ptr connectionState) { - logger->info("Remote ip: {}", connectionState->getRemoteIp()); - auto ws = webSocket.lock(); - if (!ws) return; - ws->setOnMessageCallback([this, webSocket, connectionState](const ix::WebSocketMessagePtr& msg) {}); - }); - - m_initialized = true; -} -void IflytopFrontEndService::startListen() { - if (!m_server->listen().first) { - logger->error("listen error!!!!"); - return; - } - - if (!m_reportServer->listen().first) { - logger->error("listen error!!!!"); - return; - } - - m_server->disablePerMessageDeflate(); - m_server->start(); - - m_reportServer->disablePerMessageDeflate(); - m_reportServer->start(); - - logger->info("IflytopFrontEndService startListen"); -} - -void IflytopFrontEndService::sendReport(json& report) { - if (!m_initialized) { - logger->error("IflytopFrontEndService not initialized"); - return; - } - /** - * @brief 广播消息给所有连接的客户端 - */ - - report["timeStamp"] = duration_cast(system_clock::now().time_since_epoch()).count(); - logger->debug("uplink msg: {}", report.dump()); - - auto clients = m_reportServer->getClients(); - for (auto& each : clients) { - if (each) { - each->sendText(report.dump()); - } - } -} - -void IflytopFrontEndService::onMessageCallback(weak_ptr webSocket, shared_ptr connectionState, const ix::WebSocketMessagePtr& msg) { - if (msg->type == ix::WebSocketMessageType::Open) { - logger->info("New connection"); - logger->info("id : {}", connectionState->getId()); - logger->info("Uri : {}", msg->openInfo.uri); - logger->info("Headers:"); - for (auto it : msg->openInfo.headers) { - logger->info(" {}: {}", it.first, it.second); - } - - m_workQueue->enQueue([this, webSocket]() { onConnect(webSocket); }); - - } else if (msg->type == ix::WebSocketMessageType::Message) { - logger->debug("downlink msg: {}", msg->str); - string msgtext = msg->str; - m_workQueue->enQueue([this, webSocket, msgtext]() { - try { - processRxMessage(webSocket, msgtext); - } catch (const std::exception& e) { - logger->error("catch exception,processRxMessage error: {}", e.what()); - } - }); - - } else if (msg->type == ix::WebSocketMessageType::Close) { - logger->info("{} Closed connection", msg->closeInfo.remote); - m_workQueue->enQueue([this, webSocket]() { onDisconnect(webSocket); }); - } -} -void IflytopFrontEndService::processRxMessage(weak_ptr webSocket, string rxmsg) { - string msgtext = rxmsg; - json message; - - try { - json command = json::parse(msgtext); - json receipt; - receipt["messageId"] = command["messageId"]; - receipt["ackcode"] = 0; - receipt["timeStamp"] = duration_cast(system_clock::now().time_since_epoch()).count(); - try { - onMessage(webSocket, command, receipt); - shared_ptr ws = webSocket.lock(); - if (ws) ws->sendText(receipt.dump(1)); - } catch (const std::exception& e) { - logger->error("m_iflytopWSService:onMessag,process rx json failed,exception:{},{}", e.what(), msgtext); - if (command.find("need_receipt") == command.end() || command["need_receipt"]) { - shared_ptr ws = webSocket.lock(); - receipt["ackcode"] = err::zecode(err::kparse_json_err); - receipt["ackcodeInfo"] = err::zecode2str(err::kparse_json_err, e.what()); - if (ws) ws->sendText(receipt.dump(1)); - } - } - - } catch (const std::exception& e) { - logger->error("m_iflytopWSService:onMessag,parse json failed,exception:{},{}", e.what(), msgtext); - return; - } -} diff --git a/appsrc/service/iflytop_front_end_service/iflytop_front_end_service.hpp b/appsrc/service/iflytop_front_end_service/iflytop_front_end_service.hpp deleted file mode 100644 index 2dd311d..0000000 --- a/appsrc/service/iflytop_front_end_service/iflytop_front_end_service.hpp +++ /dev/null @@ -1,60 +0,0 @@ -// -// Created by iflytop -// - -#pragma once -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "appbase/dep.hpp" -/** - * @brief - * - * service: IflytopHardwareWSService - * - */ - -namespace iflytop { -using namespace std; -using namespace iflytop; -using namespace core; -using namespace ix; -using namespace nlohmann; - -class IflytopFrontEndService : public enable_shared_from_this { - ENABLE_LOGGER(IflytopFrontEndService); - - public: - // nod::signal webSocket, const ix::WebSocketMessagePtr& msg)> onMessage; - nod::signal webSocket)> onConnect; - nod::signal webSocket)> onDisconnect; - nod::signal webSocket, json& cmd, json& receipt)> onMessage; - - private: - // - // WebSocketServer的使用参考:http://192.168.1.3:3000/z3rd_lib/IXWebSocket/src/branch/master/docs/usage.md - // - shared_ptr m_server; - shared_ptr m_reportServer; - unique_ptr m_workQueue; - bool m_initialized = false; - - public: - void initialize(string ip = "0.0.0.0"); - void startListen(); - void sendReport(json& report); - - private: - void onMessageCallback(weak_ptr webSocket, shared_ptr connectionState, const ix::WebSocketMessagePtr& msg); - void processRxMessage(weak_ptr webSocket, string rxmsg); -}; -} // namespace iflytop \ No newline at end of file diff --git a/appsrc/service/iflytop_front_end_service/protocol.md b/appsrc/service/iflytop_front_end_service/protocol.md deleted file mode 100644 index 072360c..0000000 --- a/appsrc/service/iflytop_front_end_service/protocol.md +++ /dev/null @@ -1,13 +0,0 @@ -``` -cmd: - -messageId -timeStamp - -className:"" -fnName:"" -param:{ -} - - -``` \ No newline at end of file diff --git a/appsrc/service/main_control_service.cpp b/appsrc/service/main_control_service.cpp index d323002..7a4e54a 100644 --- a/appsrc/service/main_control_service.cpp +++ b/appsrc/service/main_control_service.cpp @@ -1,7 +1,7 @@ #include "main_control_service.hpp" -#include "service/front_msg_processer/front_msg_processer.hpp" -#include "service/iflytop_front_end_service/iflytop_front_end_service.hpp" +#include "baseservice/baseservice.hpp" +#include "service/user_mgr_service.hpp" using namespace iflytop; using namespace core; @@ -14,19 +14,24 @@ void MainControlService::dosystem(string order, bool dump) { } void MainControlService::initialize() { - // + // Base + BUILD_AND_REG_SERRVICE(DBService); + BUILD_AND_REG_SERRVICE(DeviceStateService); BUILD_AND_REG_SERRVICE(IflytopFrontEndService); - GET_SERVICE(IflytopFrontEndService)->initialize(); - GET_SERVICE(IflytopFrontEndService)->startListen(); - BUILD_AND_REG_SERRVICE(FrontMsgProcesser); - GET_SERVICE(FrontMsgProcesser)->initialize(); - + // Device + BUILD_AND_REG_SERRVICE(UartPrinter); + GET_SERVICE(UartPrinter)->initialize(GET_SERVICE(GConfig)->get_printerUart(), "9600"); + // ExtApi + BUILD_AND_REG_SERRVICE(UserMgrService); + // + GET_SERVICE(IflytopFrontEndService)->startListen(); GET_SERVICE(IflytopFrontEndService)->onMessage.connect([this](weak_ptr webSocket, json& cmd, json& receipt) { - string cmdstr = cmd["command"]; - logger->info("rx:{}", cmd.dump()); - GET_SERVICE(FrontMsgProcesser)->processMsg(cmd, receipt); + shared_ptr cxt = make_shared(); + cxt->cmd = cmd; + cxt->receipt = receipt; + GET_SERVICE(FrontMsgProcesser)->processMsg(cxt); + cmd = cxt->cmd; + receipt = cxt->receipt; }); - - }; diff --git a/appsrc/service/user_mgr_service.cpp b/appsrc/service/user_mgr_service.cpp new file mode 100644 index 0000000..cb50a21 --- /dev/null +++ b/appsrc/service/user_mgr_service.cpp @@ -0,0 +1,82 @@ +#include "user_mgr_service.hpp" + +using namespace iflytop; +using namespace std; +using namespace core; + +void UserMgrService::initialize() { + GET_TO_SERVICE(m_db); + GET_TO_SERVICE(m_deviceStateService); + + REGFN(UserMgrService, login); + REGFN(UserMgrService, unlogin); + REGFN(UserMgrService, chpasswd); + REGFN(UserMgrService, addUser); + REGFN(UserMgrService, delUser); + REGFN(UserMgrService, updateUserUid); + REGFN(UserMgrService, getAllUser); +}; + +void UserMgrService::login(shared_ptr cxt) { + string uid = cxt->cmd["param"]["uid"]; + string pwd = cxt->cmd["param"]["passwd"]; + + // 超超级用户 + if (uid == "admin" && pwd == "iflytop9973") { + m_deviceStateService->setLoginState("admin", true); + logger->info("user {} login success", "admin"); + return; + } + + if (!m_db->isUserExist(uid)) // + throw appexception(err::kappe_user_not_exist, fmt::format("user {} not exist", uid)); + if (!m_db->ispasswdCorrect(uid, pwd)) // + throw appexception(err::kappe_passwd_error, fmt::format("user {} passwd error", uid)); + + m_deviceStateService->setLoginState(uid, m_db->getUser(uid)->is_admin); + logger->info("user {} login success", uid); + ADD_USER_BEHAVIOR(uid, kbehavior_login, ""); + return; +} +void UserMgrService::unlogin(shared_ptr cxt) { + string loginuid = m_deviceStateService->getLoginUid(); + m_deviceStateService->unlogin(); + logger->info("user unlogin success"); + ADD_USER_BEHAVIOR(loginuid, kbehavior_logout, ""); + return; +} +void UserMgrService::chpasswd(shared_ptr cxt) { + string uid = cxt->cmd["param"]["uid"]; + string newpasswd = cxt->cmd["param"]["newpasswd"]; + string passwd = cxt->cmd["param"]["passwd"]; + + if (!m_deviceStateService->isLoginAdmin()) { + APPCHECK(!m_db->ispasswdCorrect(uid, passwd), err::kappe_passwd_error, fmt::format("user {} passwd error", uid)); + } + + logger->info("changet passwd {} {}", uid, passwd); + auto user = m_db->changePasswd(uid, newpasswd); +} +void UserMgrService::addUser(shared_ptr cxt) { + string uid = cxt->cmd["param"]["uid"]; + string passwd = cxt->cmd["param"]["passwd"]; + m_db->addUser(uid, passwd); +} +void UserMgrService::delUser(shared_ptr cxt) { + int id = jsonGet(cxt->cmd["param"]["id"]); + auto user = m_db->delUser(id); + APPCHECK(!user, err::kappe_user_not_exist, fmt::format("user {} not exist", id)); +} + +void UserMgrService::updateUserUid(shared_ptr cxt) { + int id = jsonGet(cxt->cmd["param"]["id"]); + string uid = cxt->cmd["param"]["uid"]; + string olduid; + auto user = m_db->updateUserUid(id, uid, olduid); + APPCHECK(!user, err::kappe_user_not_exist, fmt::format("user {} not exist", id)); +} +void UserMgrService::getAllUser(shared_ptr cxt) { + auto users = m_db->getAllUserJson(); + cxt->receipt["content"] = users; + return; +} \ No newline at end of file diff --git a/appsrc/service/user_mgr_service.hpp b/appsrc/service/user_mgr_service.hpp new file mode 100644 index 0000000..ee9a119 --- /dev/null +++ b/appsrc/service/user_mgr_service.hpp @@ -0,0 +1,34 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include +// +#include "baseservice/baseservice.hpp" +namespace iflytop { +class UserMgrService : public enable_shared_from_this { + ENABLE_LOGGER(UserMgrService); + + shared_ptr m_db; + shared_ptr m_deviceStateService; + + public: + UserMgrService() {} + void initialize(); + + private: + void login(shared_ptr cxt); + void unlogin(shared_ptr cxt); + void chpasswd(shared_ptr cxt); + void addUser(shared_ptr cxt); + void delUser(shared_ptr cxt); + void updateUserUid(shared_ptr cxt); + void getAllUser(shared_ptr cxt); +}; + +} // namespace iflytop