#include "HttpEntity.h" #include "database/Dao.h" #include #include "common/Utils.h" #include "common/Snowflake.h" #include "app/Application.h" #include "app/AppData.h" #include "app/Config.h" static NJsonNode FieldsToJsonArray(std::vector vecFields) { NJsonNode jsonnode = NJsonNode::array(); for (auto& fields : vecFields) { NJsonNode jnode; for (auto& item : fields.map()) { jnode[item.first] = item.second; } jsonnode.push_back(jnode); } return jsonnode; } static void GetRequestParam(const httplib::Request& req, const std::vector& vecKeys, Fields& fields) { for (auto& key : vecKeys) { if (req.has_param(key)) { fields.set(key, req.get_param_value(key)); } } } class HttpHelper { public: static bool CheckRequestParam(const httplib::Request& req, httplib::Response& resp, const std::vector& vecKeys, std::string& errmsg) { errmsg = ""; for (auto& key : vecKeys) { if (!req.has_param(key)) { if (!errmsg.empty()) { errmsg += ","; } errmsg += "缺少参数[" + key + "]"; } } if (!errmsg.empty()) { return false; } return true; } static void setPagination(PageInfo& pageinfo, std::vector result, NJsonNode& json) { json["count"] = pageinfo.total; json["page"] = pageinfo.index; json["page_size"] = pageinfo.size; json["data"] = FieldsToJsonArray(result); } }; using HandlerFunc = Errcode(HttpEntity::*)(const httplib::Request& req, httplib::Response& resp, NJsonNode& jnode); struct HandlerOptions { HandlerFunc func; std::vector requiredKeys; std::vector keys; HandlerOptions(HandlerFunc func, const std::vector& requiredKeys) : func(func), requiredKeys(requiredKeys) { } }; static std::map g_mapHttpHandler = { {"/login", HandlerOptions(&HttpEntity::login, {DMUser::ACCOUNT, DMUser::PASSWD})}, {"/queryUserList", HandlerOptions(&HttpEntity::queryUserList, {"token"})}, {"/insertUser", HandlerOptions(&HttpEntity::insertUser, {"token", DMUser::ACCOUNT})}, {"/updateUser", HandlerOptions(&HttpEntity::updateUser, {"token", DMUser::USER_ID})}, {"/deleteUser", HandlerOptions(&HttpEntity::deleteUser, {"token", DMUser::USER_ID})}, {"/queryPermissionList", HandlerOptions(&HttpEntity::queryPermissionList, {"token"})}, {"/insertPermission", HandlerOptions(&HttpEntity::insertPermission, {"token", DMPermission::NAME})}, {"/updatePermission", HandlerOptions(&HttpEntity::updatePermission, {"token", DMPermission::PERMISSION_ID})}, {"/deletePermission", HandlerOptions(&HttpEntity::deletePermission, {"token", DMPermission::PERMISSION_ID})}, {"/queryRoleList", HandlerOptions(&HttpEntity::queryRoleList, {"token"})}, {"/insertRole", HandlerOptions(&HttpEntity::insertRole, {"token", DMRole::NAME})}, {"/updateRole", HandlerOptions(&HttpEntity::updateRole, {"token", DMRole::ROLE_ID})}, {"/deleteRole", HandlerOptions(&HttpEntity::deleteRole, {"token", DMRole::ROLE_ID})}, {"/queryStationList", HandlerOptions(&HttpEntity::queryStationList, {"token"})}, {"/insertStation", HandlerOptions(&HttpEntity::insertStation, {"token", DMStation::NAME})}, {"/updateStation", HandlerOptions(&HttpEntity::updateStation, {"token", DMStation::STATION_ID})}, {"/deleteStation", HandlerOptions(&HttpEntity::deleteStation, {"token", DMStation::STATION_ID})}, {"/queryDeviceList", HandlerOptions(&HttpEntity::queryDeviceList, {"token"})}, {"/insertDevice", HandlerOptions(&HttpEntity::insertDevice, {"token", DMDevice::NAME})}, {"/updateDevice", HandlerOptions(&HttpEntity::updateDevice, {"token", DMDevice::DEVICE_ID})}, {"/deleteDevice", HandlerOptions(&HttpEntity::deleteDevice, {"token", DMDevice::DEVICE_ID})}, {"/queryDevicTypeDef", HandlerOptions(&HttpEntity::queryDevicTypeDef, {"token"})}, {"/queryPolicyList", HandlerOptions(&HttpEntity::queryPolicyList, {"token"})}, {"/insertPolicy", HandlerOptions(&HttpEntity::insertPolicy, {"token", DMPolicy::NAME})}, {"/updatePolicy", HandlerOptions(&HttpEntity::updatePolicy, {"token", DMPolicy::POLICY_ID})}, {"/deletePolicy", HandlerOptions(&HttpEntity::deletePolicy, {"token", DMPolicy::POLICY_ID})}, {"/querySystemLogList", HandlerOptions(&HttpEntity::querySystemLogList, {"token"})}, {"/queryAlertLogList", HandlerOptions(&HttpEntity::queryAlertLogList, {"token"})}, {"/queryPredictionDetail", HandlerOptions(&HttpEntity::queryPredictionDetail, {"token"})}, {"/queryStatSystem", HandlerOptions(&HttpEntity::queryStatSystem, {"token"})}, {"/queryStatTotal", HandlerOptions(&HttpEntity::queryStatTotal, {"token"})}, {"/queryStatDayList", HandlerOptions(&HttpEntity::queryStatDayList, {"token"})}, //{"/insert", HandlerOptions(&HttpEntity::insert, {})}, //{"/update", HandlerOptions(&HttpEntity::update, {})}, //{"/delete", HandlerOptions(&HttpEntity::delete, {})}, }; HttpEntity::HttpEntity() { bool useToken = Config::option.http.useToken; for (auto& item : g_mapHttpHandler) { std::string name = item.first; HandlerOptions& handler = item.second; this->httpsvr.Get(name, [=, &handler](const httplib::Request& req, httplib::Response& resp) { spdlog::info("[http] request: {}", name); NJsonNode json; Errcode errcode = Errcode::OK; if (name != "/login" && useToken) { // 验证token std::string token = req.get_param_value("token"); if (token.empty()) { errcode = Errcode::ERR_TOKEN; } else { User user = Application::data().getUser(token); if (user.userId.empty()) { errcode = Errcode::ERR_TOKEN; } } } std::string errmsg; if (errcode == Errcode::OK) { if (!HttpHelper::CheckRequestParam(req, resp, handler.requiredKeys, errmsg)) { errcode = Errcode::ERR_PARAM; } else { errcode = (this->*(handler.func))(req, resp, json); } } json["errcode"] = errcode; json["errmsg"] = ErrcodeStr(errcode) + (errmsg.empty() ? "" : (":"+errmsg)); resp.set_content(json.dump(), "text/plain; charset=utf-8"); resp.status = 200; }); } } void HttpEntity::listen(std::string addr, int port) { if (addr.empty()) addr = "0.0.0.0"; spdlog::info("[http] start listen: addr={}:{},token={}", addr, port, Config::option.http.useToken); httpsvr.listen(addr, port); // 阻塞 } void HttpEntity::registGet(std::string name, void (HttpEntity::* func)(const httplib::Request& req, httplib::Response& resp)) { this->httpsvr.Get(name, std::bind(func, this, std::placeholders::_1, std::placeholders::_2)); } Errcode HttpEntity::login(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { std::string userId; std::string token; std::string account = req.get_param_value("account"); std::string passwd = req.get_param_value("passwd"); Fields fields; auto dao = DaoEntity::create(""); Errcode err = DAO::login(dao, account, passwd, fields); userId = fields.value(DMUser::USER_ID); token = Application::data().userLogin(userId, account); if (err == Errcode::OK) { json["token"] = token; std::vector vecPermission; int roleId = fields.get(DMRole::ROLE_ID); DAO::queryRolePermission(dao, roleId, vecPermission); NJsonNode jnode = NJsonNode::array(); for (auto& item : vecPermission) { jnode.push_back(item.value("name")); } json["permission"] = jnode; } DAO::insertSystemLogUser(token, "用户登录:" + ErrcodeStr(err), (err==Errcode::OK) ? 0: 1); return err; } Errcode HttpEntity::queryUserList(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { std::string token = req.get_param_value("token"); PageInfo pageinfo; pageinfo.index = Utils::toInt(req.get_param_value("page")); pageinfo.size = Utils::toInt(req.get_param_value("page_size")); std::vector result; auto err = DAO::queryUserList(pageinfo, result); if (err == Errcode::OK) { HttpHelper::setPagination(pageinfo, result, json); } DAO::insertSystemLogUser(token, "查询用户列表:" + ErrcodeStr(err), (err==Errcode::OK) ? 0 : 1); return err; } Errcode HttpEntity::insertUser(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { Fields params; GetRequestParam(req, {"account", "name", "gender", "age", "phone", "email", "role_id"}, params); return DAO::insertUser(params); } Errcode HttpEntity::updateUser(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { Fields params; GetRequestParam(req, {"user_id", "name", "gender", "age", "phone", "email", "role_id"}, params); return DAO::updateUserById(params); } Errcode HttpEntity::deleteUser(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { std::string userId = req.get_param_value("user_id"); return DAO::deleteUserById(userId); } Errcode HttpEntity::queryPermissionList(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { PageInfo pageinfo; pageinfo.index = Utils::toInt(req.get_param_value("page")); pageinfo.size = Utils::toInt(req.get_param_value("page_size")); std::vector result; auto err = DAO::queryPermissionList(pageinfo, result); HttpHelper::setPagination(pageinfo, result, json); return err; } Errcode HttpEntity::insertPermission(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { Fields params; GetRequestParam(req, {"name", "describe", "is_open"}, params); return DAO::insertPermission(params); } Errcode HttpEntity::updatePermission(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { Fields params; GetRequestParam(req, {"permission_id", "name", "describe", "is_open"}, params); return DAO::updatePermissionById(params); } Errcode HttpEntity::deletePermission(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { std::string permissionId = req.get_param_value("permission_id"); return DAO::deletePermissionById(permissionId); } Errcode HttpEntity::queryRoleList(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { std::string token = req.get_param_value("page"); PageInfo pageinfo; pageinfo.index = Utils::toInt(req.get_param_value("page")); pageinfo.size = Utils::toInt(req.get_param_value("page_size")); std::vector result; auto err = DAO::queryRoleList(pageinfo, result); // 查询所有的角色权限关联 if (err == Errcode::OK) { std::vector vecPermission; err = DAO::queryRolePermission(NULL, vecPermission); if (err != Errcode::OK) { return err; } std::map> mapPermission; for (auto& item: vecPermission) { std::string roleId = item.value("role_id"); auto& v = mapPermission[roleId]; NJsonNode jnode; jnode["id"] = item.value("permission_id"); jnode["name"] = item.value("permission_name"); v.push_back(jnode); } HttpHelper::setPagination(pageinfo, result, json); if (json.contains("data")) { for (auto& item : json["data"]) { std::string roleId = item["role_id"]; item["permission"] = mapPermission[roleId]; } } } return err; } Errcode HttpEntity::insertRole(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { Fields params; GetRequestParam(req, {"name", "describe", "is_open", "permission"}, params); return DAO::insertRole(params); }; Errcode HttpEntity::updateRole(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { Fields params; GetRequestParam(req, {"role_id", "name", "describe", "is_open", "permission"}, params); return DAO::updateRoleById(params); }; Errcode HttpEntity::deleteRole(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { std::string roleId = req.get_param_value(DMRole::ROLE_ID); return DAO::remove(NULL, DMRole::TABLENAME, DMRole::ROLE_ID, roleId); }; Errcode HttpEntity::queryStationList(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { PageInfo pageinfo; pageinfo.index = Utils::toInt(req.get_param_value("page")); pageinfo.size = Utils::toInt(req.get_param_value("page_size")); std::vector result; auto err = DAO::queryStationList(pageinfo, result); HttpHelper::setPagination(pageinfo, result, json); return err; }; Errcode HttpEntity::insertStation(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { Fields params; GetRequestParam(req, {"name", "address", "lon", "lat", "tel", "capacity", "status"}, params); return DAO::insertStation(params); }; Errcode HttpEntity::updateStation(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { Fields params; GetRequestParam(req, {"station_id", "name", "address", "lon", "lat", "tel", "capacity", "status"}, params); return DAO::updateStationById(params); }; Errcode HttpEntity::deleteStation(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { std::string primaryKey = DMStation::STATION_ID; return DAO::remove(NULL, DMStation::TABLENAME, primaryKey, req.get_param_value(primaryKey)); }; Errcode HttpEntity::queryDeviceList(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { PageInfo pageinfo; pageinfo.index = Utils::toInt(req.get_param_value("page")); pageinfo.size = Utils::toInt(req.get_param_value("page_size")); std::vector result; auto err = DAO::queryDeviceList(pageinfo, result); HttpHelper::setPagination(pageinfo, result, json); return err; }; Errcode HttpEntity::insertDevice(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { Fields params; GetRequestParam(req, {"station_id", "type", "name", "code", "model", "factory", "factory_tel", "is_open", "attrs"}, params); return DAO::insertDevice(params); }; Errcode HttpEntity::updateDevice(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { Fields params; GetRequestParam(req, {"device_id", "station_id", "type", "name", "code", "model", "factory", "factory_tel", "is_open", "attrs"}, params); return DAO::updateDeviceById(params); }; Errcode HttpEntity::deleteDevice(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { std::string primaryKey = DMDevice::DEVICE_ID; return DAO::remove(NULL, DMDevice::TABLENAME, primaryKey, req.get_param_value(primaryKey)); }; Errcode HttpEntity::queryDevicTypeDef(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { std::string sql = "SELECT device_type_id, name FROM def_device_type;"; std::vector result; auto err = DAO::exec(NULL, sql, result); json["data"] = FieldsToJsonArray(result); return err; } Errcode HttpEntity::queryPolicyList(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { PageInfo pageinfo; pageinfo.index = Utils::toInt(req.get_param_value("page")); pageinfo.size = Utils::toInt(req.get_param_value("page_size")); std::vector result; auto err = DAO::queryPolicyList(pageinfo, result); HttpHelper::setPagination(pageinfo, result, json); return err; }; Errcode HttpEntity::insertPolicy(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { Fields params; GetRequestParam(req, {"type", "name", "describe", "value", "is_open"}, params); return DAO::insertPolicy(params); }; Errcode HttpEntity::updatePolicy(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { Fields params; GetRequestParam(req, {"policy_id", "type", "describe", "value", "is_open"}, params); return DAO::updatePolicyById(params); }; Errcode HttpEntity::deletePolicy(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { return DAO::deletePolicyById(req.get_param_value("prolicy_id")); }; Errcode HttpEntity::querySystemLogList(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { PageInfo pageinfo; pageinfo.index = Utils::toInt(req.get_param_value("page")); pageinfo.size = Utils::toInt(req.get_param_value("page_size")); std::vector result; auto err = DAO::querySystemLogList(pageinfo, result); HttpHelper::setPagination(pageinfo, result, json); return err; } //Errcode insertSystemLog(const httplib::Request& req, httplib::Response& resp, NJsonNode& json); Errcode HttpEntity::updateSystemLog(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { Fields params; GetRequestParam(req, {"log_id", "status"}, params); return DAO::updateSystemLogById(params); } Errcode HttpEntity::queryAlertLogList(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { PageInfo pageinfo; pageinfo.index = Utils::toInt(req.get_param_value("page")); pageinfo.size = Utils::toInt(req.get_param_value("page_size")); std::vector result; auto err = DAO::queryAlertLogList(pageinfo, result); HttpHelper::setPagination(pageinfo, result, json); return err; } //Errcode insertAlertLog(const httplib::Request& req, httplib::Response& resp, NJsonNode& json); Errcode HttpEntity::updateAlertLog(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { Fields params; GetRequestParam(req, {"log_id", "status"}, params); return DAO::updateAlertLogById(params); } Errcode HttpEntity::queryPredictionDetail(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { NJsonNode jsonData = NJsonNode::array(); for (int i = 1; i<=5; i++) { NJsonNode jnode; jnode["datatype"] = i; NJsonNode jsonValues = NJsonNode::array(); for (int i = 0; i<1440; ++i) { jsonValues.push_back(float(Utils::random(50, 100))); } jnode["values"] = jsonValues; jsonData.push_back(jnode); } json["data"] = jsonData; return Errcode::OK; } Errcode HttpEntity::queryStatSystem(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { auto& appdata = Application::data(); json["launch_date"] = "2025-01-01"; //: 系统上线启用日期,格式:yyyy-mm-dd json["income_total"] = "0.00"; // : 累计收益(元),精度0.01 json["station_num"] = Utils::toStr(appdata.getStationCount()); // : 能源站数量 json["storage_device_num "] = Utils::toStr(appdata.getStationCount()); //: 储能设备数量 json["solar_device_num"] = "0"; // : 光伏设备数量 json["capacity_total"] = "0.000"; // : 储能总容量(kWh),精度0.001 json["elect_gen"] = "0.000"; // : 发电总电量(kWh),精度0.001 json["elect_grid"] = "0.000"; // : 入网种电量(kWh),精度0.001 json["storage_elect_in"] = "0.000"; // : 储能充电总电量(kWh),精度0.001 json["storage_elect_out"] = "0.000"; // : 储能放电总电量(kWh),精度0.001 return Errcode::OK; } Errcode HttpEntity::queryStatTotal(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { std::string station_id = req.get_param_value("station_id"); std::string category = req.get_param_value("category"); json["dt"] = "2025-01-01"; //日期 json["storage_elect_in"] = "123.123"; //储能充电电量(kWh),精度:0.001 json["storage_elect_out"] = "123.123"; //储能放电电量(kWh),精度:0.001 json["storage_num_in"] = "1"; //储能设备充电次数 json["storage_num_out"] = "1"; //储能设备放电次数 json["storage_num_err"] = "1"; //储能设备故障次数 json["solar_elect_gen"] = "123.123"; //光伏发电电量(kWh),精度:0.001 json["solar_elect_grid"] = "123.123"; //光伏入网电量(kWh),精度:0.001 json["solar_num_err"] = "1"; //光伏设备故障次数 json["charge_elect"] = "123.123"; //充电设备充电电量(kWh),精度:0.001 json["charge_num"] = "1"; //充电设备充电次数 json["charge_num_err"] = "1"; //充电设备故障次数 json["income_elect"] = ""; //发电收益(元),精度:0.01 json["income_charge"] = ""; //充电收益(元),精度:0.01 json["usage"] = ""; return Errcode::OK; } Errcode HttpEntity::queryStatDayList(const httplib::Request& req, httplib::Response& resp, NJsonNode& json) { std::string station_id = req.get_param_value("station_id"); std::string category = req.get_param_value("category"); std::string dt_start = req.get_param_value("dt_start"); std::string dt_end = req.get_param_value("dt_end"); if (!dt_start.empty() && dt_end.empty()) { } return Errcode::OK; }