调试修改HTTP接口

This commit is contained in:
lixiaoyuan
2025-09-05 19:44:26 +08:00
parent c1cce63c85
commit aca9a8f0ae
34 changed files with 2142 additions and 179 deletions

View File

@@ -15,6 +15,40 @@ static void FieldsToJson(Fields& fields, NJsonNode& json)
json[item.first] = item.second;
}
}
static void JsonToFields(NJsonNode& json, std::vector<std::string> vecKeys, Fields& fields)
{
if (vecKeys.empty())
{
for (auto& item: json.items())
{
auto key = item.key();
auto& val = json[key];
}
}
for (auto& key : vecKeys)
{
if (json.contains(key)) {
switch (json[key].type())
{
case NJsonNode::value_t::string: { fields.set(key, json[key].get<std::string>()); } break;
case NJsonNode::value_t::boolean: { fields.set(key, json[key].get<bool>()); } break;
case NJsonNode::value_t::number_integer: { fields.set(key, json[key].get<int>()); } break;
case NJsonNode::value_t::number_unsigned: { fields.set(key, json[key].get<int>()); } break;
case NJsonNode::value_t::number_float: { fields.set(key, json[key].get<float>()); } break;
case NJsonNode::value_t::null: {} break;
case NJsonNode::value_t::object: {} break;
case NJsonNode::value_t::array: {} break;
case NJsonNode::value_t::binary: {} break;
case NJsonNode::value_t::discarded: {} break;
default:
break;
}
}
}
}
static NJsonNode FieldsToJsonArray(std::vector<Fields>& vecFields)
{
@@ -33,7 +67,6 @@ static NJsonNode FieldsToJsonArray(std::vector<Fields>& vecFields)
static void GetRequestParam(const httplib::Request& req, const std::vector<std::string>& vecKeys, Fields& fields)
{
if (req.method == "GET")
{
for (auto& key : vecKeys)
@@ -48,30 +81,8 @@ static void GetRequestParam(const httplib::Request& req, const std::vector<std::
{
NJsonNode json;
NJson::parse(req.body, json);
for (auto& key : vecKeys)
{
if (json.contains(key)) {
switch (json[key].type())
{
case NJsonNode::value_t::string: { fields.set(key, json[key].get<std::string>()); } break;
case NJsonNode::value_t::boolean: { fields.set(key, json[key].get<bool>()); } break;
case NJsonNode::value_t::number_integer: { fields.set(key, json[key].get<int>()); } break;
case NJsonNode::value_t::number_unsigned: { fields.set(key, json[key].get<int>()); } break;
case NJsonNode::value_t::number_float: { fields.set(key, json[key].get<float>()); } break;
case NJsonNode::value_t::null: {} break;
case NJsonNode::value_t::object: {} break;
case NJsonNode::value_t::array: {} break;
case NJsonNode::value_t::binary: {} break;
case NJsonNode::value_t::discarded: {} break;
default:
break;
}
}
}
}
}
class HttpHelper
@@ -82,7 +93,16 @@ public:
errmsg = "";
for (auto& key : vecKeys)
{
if (!req.has_param(key))
bool hasParam = false;
if (req.method == "GET")
{
hasParam = req.has_param(key);
}
else
{
hasParam = (req.body.find("\"" + key + "\"") != std::string::npos);
}
if (!hasParam)
{
if (!errmsg.empty()) { errmsg += ","; }
errmsg += "缺少参数[" + key + "]";
@@ -103,20 +123,7 @@ public:
}
};
using HandlerFunc = Errcode(HttpEntity::*)(const httplib::Request& req, httplib::Response& resp, NJsonNode& jnode);
struct HandlerOptions
{
HandlerFunc func;
std::vector<std::string> requiredKeys;
std::vector<std::string> keys;
HandlerOptions(HandlerFunc func, const std::vector<std::string>& requiredKeys)
: func(func), requiredKeys(requiredKeys)
{
}
};
static std::map<std::string, HandlerOptions> g_mapHttpHandlerGet =
{
@@ -134,7 +141,7 @@ static std::map<std::string, HandlerOptions> g_mapHttpHandlerGet =
{"/deleteStation", HandlerOptions(&HttpEntity::deleteStation, { DMStation::STATION_ID})},
{"/queryStationInfo", HandlerOptions(&HttpEntity::queryStationInfo, { DMStation::STATION_ID})},
{"/queryStationRuntime", HandlerOptions(&HttpEntity::queryStationRuntime, { DMStation::STATION_ID})},
{"/queryStationData", HandlerOptions(&HttpEntity::queryStationData, { DMStation::STATION_ID})},
{"/queryDeviceList", HandlerOptions(&HttpEntity::queryDeviceList, {})},
{"/deleteDevice", HandlerOptions(&HttpEntity::deleteDevice, { DMDevice::DEVICE_ID})},
@@ -142,7 +149,6 @@ static std::map<std::string, HandlerOptions> g_mapHttpHandlerGet =
{"/queryPolicyList", HandlerOptions(&HttpEntity::queryPolicyList, {})},
{"/deletePolicy", HandlerOptions(&HttpEntity::deletePolicy, { DMPolicy::POLICY_ID})},
{"/querySystemLogList", HandlerOptions(&HttpEntity::querySystemLogList, {})},
@@ -202,70 +208,22 @@ bool CheckHttpToken(const httplib::Request& req)
HttpEntity::HttpEntity()
{
bool useToken = Config::option.http.useToken;
for (auto& item : g_mapHttpHandlerGet)
{
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);
Errcode errcode = Errcode::OK;
if (name != "/login" && useToken)
{
bool ret = CheckHttpToken(req);
errcode = ret ? Errcode::OK : Errcode::ERR_TOKEN;
}
NJsonNode json;
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;
this->runHandler(name, handler, req, resp);
});
}
for (auto& item : g_mapHttpHandlerPost)
{
std::string name = item.first;
HandlerOptions& handler = item.second;
this->httpsvr.Post(name, [=](const httplib::Request& req, httplib::Response& resp)
{
Errcode errcode = Errcode::OK;
std::string errmsg;
if (name != "/login" && useToken)
{
bool ret = CheckHttpToken(req);
errcode = ret ? Errcode::OK : Errcode::ERR_TOKEN;
}
if (errcode == Errcode::OK)
{
NJsonNode jsonparam;
bool ret = NJson::parse(req.body, jsonparam);
if (ret)
{
errcode = (this->*(handler.func))(req, resp, jsonparam);
}
}
NJsonNode json;
json["errcode"] = errcode;
json["errmsg"] = ErrcodeStr(errcode) + (errmsg.empty() ? "" : (":"+errmsg));
resp.set_content(json.dump(), "text/plain; charset=utf-8");
resp.status = 200;
this->runHandler(name, handler, req, resp);
});
}
}
@@ -277,6 +235,37 @@ void HttpEntity::listen(std::string addr, int port)
httpsvr.listen(addr, port); // 阻塞
}
void HttpEntity::runHandler(std::string name, const HandlerOptions& handler, const httplib::Request& req, httplib::Response& resp)
{
spdlog::info("[http] request: {}", name);
bool useToken = Config::option.http.useToken;
Errcode errcode = Errcode::OK;
std::string errmsg;
if (name != "/login" && useToken)
{
bool ret = CheckHttpToken(req);
errcode = ret ? Errcode::OK : Errcode::ERR_TOKEN;
}
NJsonNode jsonresp;
if (errcode == Errcode::OK)
{
if (!HttpHelper::CheckRequestParam(req, resp, handler.requiredKeys, errmsg))
{
errcode = Errcode::ERR_PARAM;
}
else
{
errcode = (this->*(handler.func))(req, resp, jsonresp);
}
}
jsonresp["errcode"] = errcode;
jsonresp["errmsg"] = ErrcodeStr(errcode) + (errmsg.empty() ? "" : (":"+errmsg));
resp.set_content(jsonresp.dump(), "text/plain; charset=utf-8");
resp.status = 200;
}
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));
@@ -302,9 +291,14 @@ Errcode HttpEntity::login(const httplib::Request& req, httplib::Response& resp,
int roleId = fields.get<int>(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;
NJsonNode nodePermission = NJsonNode::array();
for (auto& item : vecPermission)
{
NJsonNode node;
FieldsToJson(item, node);
nodePermission.push_back(node);
}
json["permission"] = nodePermission;
}
DAO::insertSystemLogUser(token, "用户登录:" + ErrcodeStr(err), (err==Errcode::OK) ? 0: 1);
@@ -338,7 +332,7 @@ Errcode HttpEntity::insertUser(const httplib::Request& req, httplib::Response& r
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);
GetRequestParam(req, {"user_id", "account", "name", "gender", "age", "phone", "email", "role_id"}, params);
return DAO::updateUserById(params);
}
@@ -401,14 +395,13 @@ Errcode HttpEntity::queryRoleList(const httplib::Request& req, httplib::Response
}
std::map<std::string, std::vector<NJsonNode>> mapPermission;
for (auto& item: vecPermission)
for (auto& fields: vecPermission)
{
std::string roleId = item.value("role_id");
std::string roleId = fields.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);
NJsonNode node;
FieldsToJson(fields, node);
v.push_back(node);
}
HttpHelper::setPagination(pageinfo, result, json);
@@ -433,8 +426,38 @@ Errcode HttpEntity::insertRole(const httplib::Request& req, httplib::Response& r
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);
//GetRequestParam(req, {"role_id", "name", "describe", "is_open", "permission"}, params);
NJsonNode jsonparam;
if (!NJson::parse(req.body, jsonparam))
{
return Errcode::ERR_PARAM;
}
JsonToFields(jsonparam, {"role_id", "name", "describe", "is_open"}, params);
auto roleId = params.value("role_id");
auto dao = DaoEntity::create("");
auto err = DAO::updateRoleById(dao, params);
if (err == Errcode::OK && jsonparam.contains("permission"))
{
if (jsonparam["permission"].is_array())
{
auto& jsonPermission = jsonparam["permission"];
std::vector<Fields> vecFields(jsonPermission.size());
int i = 0;
for (auto& item: jsonPermission)
{
auto& fields = vecFields[i];
i++;
JsonToFields(item, {"permission_id", "is_add", "is_del", "is_edit", "is_view"}, fields);
fields.set("role_id", roleId);
}
err = DAO::updateRolePermission(dao, roleId, vecFields);
}
}
return err;
};
Errcode HttpEntity::deleteRole(const httplib::Request& req, httplib::Response& resp, NJsonNode& json)
{
@@ -594,7 +617,9 @@ Errcode HttpEntity::updatePolicy(const httplib::Request& req, httplib::Response&
};
Errcode HttpEntity::deletePolicy(const httplib::Request& req, httplib::Response& resp, NJsonNode& json)
{
return DAO::deletePolicyById(req.get_param_value("prolicy_id"));
Fields params;
GetRequestParam(req, {"policy_id"}, params);
return DAO::deletePolicyById(params.value("policy_id"));
};
Errcode HttpEntity::querySystemLogList(const httplib::Request& req, httplib::Response& resp, NJsonNode& json)
@@ -695,8 +720,8 @@ Errcode HttpEntity::queryStatTotal(const httplib::Request& req, httplib::Respons
jsondata["charge_elect"] = "123.123"; //充电设备充电电量kWh精度0.001
jsondata["charge_num"] = "1"; //充电设备充电次数
jsondata["charge_num_err"] = "1"; //充电设备故障次数
jsondata["income_elect"] = "123.123"; //发电收益精度0.01
jsondata["income_charge"] = "123.123"; //充电收益精度0.01
jsondata["income_elect"] = "123.123"; //发电收益精度0.01
jsondata["income_charge"] = "123.123"; //充电收益精度0.01
json["data"] = jsondata;
return Errcode::OK;