You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

657 lines
25 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. #include <sqlite3.h>
  2. //
  3. #include <stdio.h>
  4. #include <time.h>
  5. #include "db_service.hpp"
  6. //
  7. #include "iflytop/components/sqlite_orm/sqlite_orm.hpp"
  8. using namespace std;
  9. using namespace iflytop;
  10. using namespace iflytop::db;
  11. using namespace sqlite_orm;
  12. using namespace nlohmann;
  13. // 数据库工具使用手册
  14. // auto notJohn = storage.get_all<User>(where(c(&User::firstName) != "John"));
  15. // 主键必须是int,或者不要主键
  16. #define USER_DB_STRUCT \
  17. USER_DB, /**/ \
  18. make_table("users", /**/ \
  19. make_column("id", &User::id, primary_key().autoincrement()), /**/ \
  20. make_column("uid", &User::uid), /**/ \
  21. make_column("passwd", &User::passwd), /**/ \
  22. make_column("permission_level", &User::permission_level), /**/ \
  23. make_column("visible", &User::visible))
  24. #define SETTING_DB_STRUCT \
  25. make_table("settings", /**/ \
  26. make_column("id", &Setting::id, primary_key()), /**/ \
  27. make_column("name", &Setting::name), /**/ \
  28. make_column("name_ch", &Setting::name_ch), /**/ \
  29. make_column("val_lower_limit", &Setting::val_lower_limit), /**/ \
  30. make_column("val_upper_limit", &Setting::val_upper_limit), /**/ \
  31. make_column("permission_level", &Setting::permission_level), /**/ \
  32. make_column("val", &Setting::val))
  33. #define FORMULA_DB_STRUCT \
  34. make_table("formulas", /**/ \
  35. make_column("id", &Formula::id, primary_key()), /**/ \
  36. make_column("loglevel", &Formula::loglevel), /**/ \
  37. make_column("formula_id", &Formula::formula_id), /**/ \
  38. make_column("stoped_gs", &Formula::stoped_gs), /**/ \
  39. make_column("continued_gs", &Formula::continued_gs), /**/ \
  40. make_column("stoped_satur", &Formula::stoped_satur), /**/ \
  41. make_column("continued_satur", &Formula::continued_satur), /**/ \
  42. make_column("stoped_humi", &Formula::stoped_humi), /**/ \
  43. make_column("continued_humi", &Formula::continued_humi), /**/ \
  44. make_column("injection_pump_speed", &Formula::injection_pump_speed))
  45. #define USER_BEHAVIOR_RECORD_STRUCT \
  46. make_table("user_behavior_records", /**/ \
  47. make_column("id", &UserBehaviorRecord::id, primary_key().autoincrement()), /**/ \
  48. make_column("uid", &UserBehaviorRecord::uid), /**/ \
  49. make_column("date", &UserBehaviorRecord::date), /**/ \
  50. make_column("behavior", &UserBehaviorRecord::behavior), /**/ \
  51. make_column("behaviorinfo", &UserBehaviorRecord::behaviorinfo))
  52. /*******************************************************************************
  53. * *
  54. *******************************************************************************/
  55. static Setting config_settings_table[] = {
  56. {.id = 1, .name = "stoped_gs", .name_ch = "消毒停止过氧化氢溶度", .val_lower_limit = 0, .val_upper_limit = 2000, .permission_level = 0, .val = 1800},
  57. {.id = 2, .name = "continued_gs", .name_ch = "消毒继续过氧化氢溶度", .val_lower_limit = 0, .val_upper_limit = 2000, .permission_level = 0, .val = 1500},
  58. {.id = 3, .name = "stoped_satur", .name_ch = "消毒停止过氧化氢相对饱和度", .val_lower_limit = 0, .val_upper_limit = 100, .permission_level = 0, .val = 85},
  59. {.id = 4, .name = "continued_satur", .name_ch = "消毒继续过氧化氢相对饱和度", .val_lower_limit = 0, .val_upper_limit = 100, .permission_level = 0, .val = 70},
  60. {.id = 5, .name = "max_humidity", .name_ch = "允许消毒最大湿度", .val_lower_limit = 0, .val_upper_limit = 100, .permission_level = 0, .val = 90},
  61. {.id = 6, .name = "drainage_pump_speed", .name_ch = "排液蠕动泵转速", .val_lower_limit = 0, .val_upper_limit = 90, .permission_level = 0, .val = 90},
  62. {.id = 7, .name = "injection_pump_speed", .name_ch = "喷射蠕动泵转速", .val_lower_limit = 0, .val_upper_limit = 50, .permission_level = 0, .val = 50},
  63. {.id = 8, .name = "pre_heat_time_s", .name_ch = "预热时间", .val_lower_limit = 0, .val_upper_limit = 600, .permission_level = 0, .val = 120},
  64. {.id = 9, .name = "stoped_humi", .name_ch = "消毒停止相对湿度", .val_lower_limit = 0, .val_upper_limit = 100, .permission_level = 0, .val = 85},
  65. {.id = 10, .name = "continued_humi", .name_ch = "消毒继续相对湿度", .val_lower_limit = 0, .val_upper_limit = 100, .permission_level = 0, .val = 70},
  66. {.id = 11, .name = "proportional_valve_default_value", .name_ch = "正负压默认开合比例", .val_lower_limit = 0, .val_upper_limit = 100, .permission_level = 0, .val = 10},
  67. };
  68. #define ZARRARY_SIZE(val) (sizeof(val) / sizeof(val[0]))
  69. DBService::DBService(/* args */) {}
  70. void DBService::initialize() {
  71. /**
  72. * @brief
  73. */
  74. //
  75. init_usr_db();
  76. init_setting_db();
  77. json settings = getAllSettingJson();
  78. logger->info("settings: {}", settings.dump());
  79. }
  80. void DBService::init_usr_db() {
  81. bool suc = false;
  82. do {
  83. try {
  84. logger->info("init user db");
  85. auto storage = make_storage(USER_DB_STRUCT);
  86. storage.sync_schema();
  87. auto admin = storage.get_all<User>(where(c(&User::uid) == "admin"));
  88. if (admin.size() == 0) {
  89. storage.insert<User>({-1, "admin", "9973", 1, true}); // 管理员
  90. }
  91. auto user = storage.get_all<User>(where(c(&User::uid) == "user"));
  92. if (user.size() == 0) {
  93. storage.insert<User>({-1, "user", "0000", 3, true}); // 普通用户
  94. }
  95. suc = true;
  96. } catch (const std::exception& e) {
  97. logger->error("init user db failed: {}", e.what());
  98. system("rm -rf user.db");
  99. sleep(1);
  100. }
  101. } while (!suc);
  102. }
  103. void DBService::init_setting_db() {
  104. bool suc = false;
  105. #if 0
  106. id setting_name setting_name_ch val_upper_limit val_lower_limit permission_level val
  107. 0 stoped_gs 0 2000 1 1000
  108. 1 continued_gs 0 2000 1 800
  109. 2 stoped_satur 0 100 1 80
  110. 3 continued_satur 0 100 1 60
  111. 4 max_humidity 湿 0 100 1 90
  112. 5 drainage_pump_speed 0 2000 2 500
  113. 6 injection_pump_speed 0 2000 2 500
  114. #endif
  115. do {
  116. try {
  117. logger->info("init setting db");
  118. auto storage = make_storage(SETTING_DB, SETTING_DB_STRUCT);
  119. storage.sync_schema();
  120. for (size_t i = 0; i < ZARRARY_SIZE(config_settings_table); i++) {
  121. if (storage.get_all<Setting>(where(c(&Setting::id) == config_settings_table[i].id)).size() == 0) {
  122. storage.insert(config_settings_table[i]);
  123. }
  124. }
  125. suc = true;
  126. } catch (const std::exception& e) {
  127. logger->error("init setting db failed: {}", e.what());
  128. system("rm -rf setting.db");
  129. sleep(1);
  130. }
  131. } while (!suc);
  132. }
  133. void DBService::init_formula_db() {
  134. bool suc = false;
  135. do {
  136. try {
  137. logger->info("init formula db");
  138. auto storage = make_storage(FORMULA_DB, FORMULA_DB_STRUCT);
  139. storage.sync_schema();
  140. suc = true;
  141. } catch (const std::exception& e) {
  142. logger->error("init setting db failed: {}", e.what());
  143. system("rm -rf setting.db");
  144. sleep(1);
  145. }
  146. } while (!suc);
  147. }
  148. list<shared_ptr<User>> DBService::getAllUser() {
  149. lock_guard<recursive_mutex> lock(lock_);
  150. list<shared_ptr<User>> users;
  151. auto usertable = make_storage(USER_DB_STRUCT);
  152. usertable.sync_schema();
  153. auto all = usertable.get_all<User>();
  154. for (auto& u : all) {
  155. users.push_back(make_shared<User>(u));
  156. }
  157. return users;
  158. }
  159. void DBService::addUser(string uid, string passwd, int permission_level) {
  160. lock_guard<recursive_mutex> lock(lock_);
  161. auto usertable = make_storage(USER_DB_STRUCT);
  162. usertable.sync_schema();
  163. logger->info("add user: {} {} {}", uid, passwd, permission_level);
  164. usertable.insert(User{-1, uid, passwd, permission_level, true});
  165. }
  166. shared_ptr<db::User> DBService::delUser(int id) {
  167. lock_guard<recursive_mutex> lock(lock_);
  168. auto usertable = make_storage(USER_DB_STRUCT);
  169. usertable.sync_schema();
  170. /**
  171. * @brief find admin user
  172. */
  173. auto admin = usertable.get_all<User>(where(c(&User::uid) == "admin"));
  174. ZCHECK(admin.size() == 1, "admin user not found");
  175. if (admin[0].id == id) {
  176. logger->error("can not delete admin user");
  177. return nullptr;
  178. }
  179. auto remove_user = usertable.get_all<User>(where(c(&User::id) == id));
  180. if (remove_user.size() == 0) {
  181. logger->error("remove user fail, user not found");
  182. return nullptr;
  183. }
  184. logger->info("delete user: {}:{}", id, remove_user[0].uid);
  185. usertable.remove_all<User>(where(c(&User::id) == id));
  186. return make_shared<User>(remove_user[0]);
  187. }
  188. shared_ptr<db::User> DBService::updateUserPermissionLevel(int id, int permission_level) {
  189. lock_guard<recursive_mutex> lock(lock_);
  190. auto usertable = make_storage(USER_DB_STRUCT);
  191. usertable.sync_schema();
  192. auto user = usertable.get_all<User>(where(c(&User::id) == id));
  193. if (user.size() == 0) {
  194. logger->error("update user permission level fail, user not found");
  195. return nullptr;
  196. }
  197. logger->info("update user permission level: {} {} -> {}", id, user[0].permission_level, permission_level);
  198. user[0].permission_level = permission_level;
  199. usertable.update(user[0]);
  200. return make_shared<User>(user[0]);
  201. }
  202. shared_ptr<db::User> DBService::changePasswd(string uid, string passwd) {
  203. lock_guard<recursive_mutex> lock(lock_);
  204. auto usertable = make_storage(USER_DB_STRUCT);
  205. usertable.sync_schema();
  206. auto user = usertable.get_all<User>(where(c(&User::uid) == uid));
  207. if (user.size() == 0) {
  208. logger->error("change passwd fail, user not found");
  209. return nullptr;
  210. }
  211. logger->info("change passwd: {} {} -> {}", uid, user[0].passwd, passwd);
  212. user[0].passwd = passwd;
  213. usertable.update(user[0]);
  214. return make_shared<User>(user[0]);
  215. }
  216. shared_ptr<db::User> DBService::updateUserUid(int id, string uid, string& olduid) {
  217. lock_guard<recursive_mutex> lock(lock_);
  218. auto usertable = make_storage(USER_DB_STRUCT);
  219. usertable.sync_schema();
  220. auto user = usertable.get_all<User>(where(c(&User::id) == id));
  221. if (user.size() == 0) {
  222. logger->error("change user uid fail, user not found");
  223. return nullptr;
  224. }
  225. olduid = user[0].uid;
  226. logger->info("change user uid: {} {} -> {}", id, user[0].uid, uid);
  227. user[0].uid = uid;
  228. usertable.update(user[0]);
  229. return make_shared<User>(user[0]);
  230. }
  231. json DBService::getAllUserJson() {
  232. lock_guard<recursive_mutex> lock(lock_);
  233. json j_users;
  234. auto usertable = make_storage(USER_DB_STRUCT);
  235. usertable.sync_schema();
  236. auto all = usertable.get_all<User>();
  237. for (auto& u : all) {
  238. json j_user;
  239. j_user["id"] = u.id;
  240. j_user["uid"] = u.uid;
  241. j_user["passwd"] = u.passwd;
  242. j_user["permission_level"] = u.permission_level;
  243. j_user["visible"] = u.visible;
  244. j_users.push_back(j_user);
  245. }
  246. return j_users;
  247. }
  248. shared_ptr<User> DBService::getUser(string uid) {
  249. lock_guard<recursive_mutex> lock(lock_);
  250. auto usertable = make_storage(USER_DB_STRUCT);
  251. usertable.sync_schema();
  252. auto user = usertable.get_all<User>(where(c(&User::uid) == uid));
  253. if (user.size() == 0) {
  254. return nullptr;
  255. }
  256. return make_shared<User>(user[0]);
  257. }
  258. list<shared_ptr<db::Setting>> DBService::getAllSetting() {
  259. lock_guard<recursive_mutex> lock(lock_);
  260. list<shared_ptr<db::Setting>> settings;
  261. auto settingtable = make_storage(SETTING_DB, SETTING_DB_STRUCT);
  262. settingtable.sync_schema();
  263. auto all = settingtable.get_all<Setting>();
  264. for (auto& s : all) {
  265. settings.push_back(make_shared<Setting>(s));
  266. }
  267. return settings;
  268. }
  269. json DBService::getAllSettingJson() {
  270. lock_guard<recursive_mutex> lock(lock_);
  271. json j_settings;
  272. auto settingtable = make_storage(SETTING_DB, SETTING_DB_STRUCT);
  273. settingtable.sync_schema();
  274. auto all = settingtable.get_all<Setting>();
  275. for (auto& s : all) {
  276. json j_setting;
  277. j_setting["id"] = s.id;
  278. j_setting["name"] = s.name;
  279. j_setting["name_ch"] = s.name_ch;
  280. j_setting["val"] = s.val;
  281. j_setting["val_lower_limit"] = s.val_lower_limit;
  282. j_setting["val_upper_limit"] = s.val_upper_limit;
  283. j_setting["permission_level"] = s.permission_level;
  284. j_setting["val"] = s.val;
  285. j_settings.push_back(j_setting);
  286. }
  287. return j_settings;
  288. }
  289. bool DBService::isUserExist(string uid) {
  290. lock_guard<recursive_mutex> lock(lock_);
  291. auto usertable = make_storage(USER_DB_STRUCT);
  292. usertable.sync_schema();
  293. auto user = usertable.get_all<User>(where(c(&User::uid) == uid));
  294. if (user.size() == 0) {
  295. return false;
  296. }
  297. return true;
  298. }
  299. bool DBService::ispasswdCorrect(string uid, string passwd) {
  300. lock_guard<recursive_mutex> lock(lock_);
  301. auto usertable = make_storage(USER_DB_STRUCT);
  302. usertable.sync_schema();
  303. auto user = usertable.get_all<User>(where(c(&User::uid) == uid));
  304. if (user.size() == 0) {
  305. return false;
  306. }
  307. if (user[0].passwd == passwd) {
  308. return true;
  309. }
  310. return false;
  311. }
  312. bool DBService::setSettingVal(int id, int val) {
  313. lock_guard<recursive_mutex> lock(lock_);
  314. auto settingtable = make_storage(SETTING_DB, SETTING_DB_STRUCT);
  315. settingtable.sync_schema();
  316. auto setting = settingtable.get_all<Setting>(where(c(&Setting::id) == id));
  317. if (setting.size() == 0) {
  318. return false;
  319. }
  320. if (setting[0].val < setting[0].val_lower_limit || setting[0].val > setting[0].val_upper_limit) {
  321. return false;
  322. }
  323. setting[0].val = val;
  324. settingtable.update(setting[0]);
  325. return true;
  326. }
  327. bool DBService::setSettingVal(string setting_name, int val) {
  328. lock_guard<recursive_mutex> lock(lock_);
  329. logger->info("set setting val: {} {}", setting_name, val);
  330. auto settingtable = make_storage(SETTING_DB, SETTING_DB_STRUCT);
  331. settingtable.sync_schema();
  332. auto setting = settingtable.get_all<Setting>(where(c(&Setting::name) == setting_name));
  333. if (setting.size() == 0) {
  334. logger->error("set setting val failed: {} not found", setting_name);
  335. return false;
  336. }
  337. if (setting[0].val < setting[0].val_lower_limit || setting[0].val > setting[0].val_upper_limit) {
  338. logger->error("set setting val failed: {} out of range", setting_name);
  339. return false;
  340. }
  341. setting[0].val = val;
  342. Setting s = setting[0];
  343. settingtable.update(s);
  344. settingtable.sync_schema();
  345. return true;
  346. }
  347. int DBService::getSettingVal(string name) {
  348. lock_guard<recursive_mutex> lock(lock_);
  349. auto settingtable = make_storage(SETTING_DB, SETTING_DB_STRUCT);
  350. settingtable.sync_schema();
  351. auto setting = settingtable.get_all<Setting>(where(c(&Setting::name) == name));
  352. if (setting.size() == 0) {
  353. return -1;
  354. }
  355. return setting[0].val;
  356. }
  357. list<shared_ptr<db::Formula>> DBService::getAllFormula() {
  358. lock_guard<recursive_mutex> lock(lock_);
  359. list<shared_ptr<db::Formula>> formulas;
  360. auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT);
  361. formulatable.sync_schema();
  362. auto all = formulatable.get_all<Formula>();
  363. for (auto& f : all) {
  364. formulas.push_back(make_shared<Formula>(f));
  365. }
  366. return formulas;
  367. }
  368. shared_ptr<db::Formula> DBService::getFormula(int id) {
  369. lock_guard<recursive_mutex> lock(lock_);
  370. auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT);
  371. formulatable.sync_schema();
  372. auto formula = formulatable.get_all<Formula>(where(c(&Formula::id) == id));
  373. if (formula.size() == 0) {
  374. return nullptr;
  375. }
  376. return make_shared<Formula>(formula[0]);
  377. }
  378. json DBService::getAllFormulaJson() {
  379. lock_guard<recursive_mutex> lock(lock_);
  380. json j_formulas;
  381. auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT);
  382. formulatable.sync_schema();
  383. auto all = formulatable.get_all<Formula>();
  384. for (auto& f : all) {
  385. json j_formula;
  386. j_formula["id"] = f.id;
  387. j_formula["loglevel"] = f.loglevel;
  388. j_formula["formula_id"] = f.formula_id;
  389. j_formula["stoped_gs"] = f.stoped_gs;
  390. j_formula["continued_gs"] = f.continued_gs;
  391. j_formula["stoped_satur"] = f.stoped_satur;
  392. j_formula["continued_satur"] = f.continued_satur;
  393. j_formula["stoped_humi"] = f.stoped_humi;
  394. j_formula["continued_humi"] = f.continued_humi;
  395. j_formula["injection_pump_speed"] = f.injection_pump_speed;
  396. j_formulas.push_back(j_formula);
  397. }
  398. json jret;
  399. jret["formulas"] = j_formulas;
  400. jret["settings"] = getAllSettingJson();
  401. return jret;
  402. }
  403. 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,
  404. string injection_pump_speed) {
  405. lock_guard<recursive_mutex> lock(lock_);
  406. auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT);
  407. formulatable.sync_schema();
  408. Formula f;
  409. f.loglevel = loglevel;
  410. f.formula_id = formula_id;
  411. f.stoped_gs = stoped_gs;
  412. f.continued_gs = continued_gs;
  413. f.stoped_satur = stoped_satur;
  414. f.continued_satur = continued_satur;
  415. f.stoped_humi = stoped_humi;
  416. f.continued_humi = continued_humi;
  417. f.injection_pump_speed = injection_pump_speed;
  418. formulatable.insert(f);
  419. formulatable.sync_schema();
  420. }
  421. 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) {
  422. 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),
  423. to_string(injection_pump_speed));
  424. }
  425. shared_ptr<db::Formula> DBService::delFormula(int id) {
  426. lock_guard<recursive_mutex> lock(lock_);
  427. // remove_all
  428. auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT);
  429. formulatable.sync_schema();
  430. auto formula = formulatable.get_all<Formula>(where(c(&Formula::id) == id));
  431. formulatable.remove_all<Formula>(where(c(&Formula::id) == id));
  432. formulatable.sync_schema();
  433. if (formula.size() == 0) {
  434. return nullptr;
  435. }
  436. return make_shared<Formula>(formula[0]);
  437. }
  438. shared_ptr<db::Formula> DBService::updateFormula(shared_ptr<db::Formula> var_formula) {
  439. lock_guard<recursive_mutex> lock(lock_);
  440. if (var_formula == nullptr) {
  441. return nullptr;
  442. }
  443. auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT);
  444. formulatable.sync_schema();
  445. auto formula = formulatable.get_all<Formula>(where(c(&Formula::id) == var_formula->id));
  446. if (formula.size() == 0) {
  447. return nullptr;
  448. }
  449. formulatable.update(*var_formula);
  450. formulatable.sync_schema();
  451. return var_formula;
  452. }
  453. shared_ptr<db::Formula> DBService::updateFormula(int id, string column, string val) {
  454. lock_guard<recursive_mutex> lock(lock_);
  455. auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT);
  456. formulatable.sync_schema();
  457. auto formula = formulatable.get_all<Formula>(where(c(&Formula::id) == id));
  458. if (formula.size() == 0) {
  459. return nullptr;
  460. }
  461. if (column == "formula_id") {
  462. formula[0].formula_id = val;
  463. } else if (column == "loglevel") {
  464. formula[0].loglevel = val;
  465. } else if (column == "stoped_gs") {
  466. formula[0].stoped_gs = val;
  467. } else if (column == "continued_gs") {
  468. formula[0].continued_gs = val;
  469. } else if (column == "stoped_satur") {
  470. formula[0].stoped_satur = val;
  471. } else if (column == "continued_satur") {
  472. formula[0].continued_satur = val;
  473. } else if (column == "stoped_humi") {
  474. formula[0].stoped_humi = val;
  475. } else if (column == "continued_humi") {
  476. formula[0].continued_humi = val;
  477. } else if (column == "injection_pump_speed") {
  478. formula[0].injection_pump_speed = val;
  479. }
  480. formulatable.update(formula[0]);
  481. formulatable.sync_schema();
  482. return make_shared<Formula>(formula[0]);
  483. }
  484. int DBService::getUserBehaviorRecordCount() {
  485. lock_guard<recursive_mutex> lock(lock_);
  486. auto user_behavior_record_table = make_storage(USER_BEHAVIOR_RECORD_DB, USER_BEHAVIOR_RECORD_STRUCT);
  487. user_behavior_record_table.sync_schema();
  488. return user_behavior_record_table.count<UserBehaviorRecord>(where(c(&UserBehaviorRecord::id) > 0));
  489. }
  490. int DBService::getUserBehaviorRecordTheFirstId() {
  491. lock_guard<recursive_mutex> lock(lock_);
  492. auto user_behavior_record_table = make_storage(USER_BEHAVIOR_RECORD_DB, USER_BEHAVIOR_RECORD_STRUCT);
  493. user_behavior_record_table.sync_schema();
  494. auto all = user_behavior_record_table.get_all<UserBehaviorRecord>(order_by(&UserBehaviorRecord::id).asc());
  495. if (all.size() == 0) {
  496. return -1;
  497. }
  498. return all[0].id;
  499. }
  500. list<shared_ptr<db::UserBehaviorRecord>> DBService::getAllUserBehaviorRecord() {
  501. lock_guard<recursive_mutex> lock(lock_);
  502. auto user_behavior_record_table = make_storage(USER_BEHAVIOR_RECORD_DB, USER_BEHAVIOR_RECORD_STRUCT);
  503. user_behavior_record_table.sync_schema();
  504. auto all = user_behavior_record_table.get_all<UserBehaviorRecord>(order_by(&UserBehaviorRecord::id).desc());
  505. list<shared_ptr<db::UserBehaviorRecord>> user_behavior_records;
  506. for (auto& u : all) {
  507. user_behavior_records.push_back(make_shared<UserBehaviorRecord>(u));
  508. }
  509. return user_behavior_records;
  510. }
  511. json DBService::getUserBehaviorRecordDescJson(int page, int page_size) {
  512. lock_guard<recursive_mutex> lock(lock_);
  513. json j_user_behavior_records;
  514. auto user_behavior_record_table = make_storage(USER_BEHAVIOR_RECORD_DB, USER_BEHAVIOR_RECORD_STRUCT);
  515. user_behavior_record_table.sync_schema();
  516. auto all = user_behavior_record_table.get_all<UserBehaviorRecord>(order_by(&UserBehaviorRecord::id).desc());
  517. int i = 0;
  518. int from = page * page_size;
  519. int to = (page + 1) * page_size;
  520. for (auto& u : all) {
  521. if (i >= from && i < to) {
  522. json j_user_behavior_record;
  523. j_user_behavior_record["id"] = u.id;
  524. j_user_behavior_record["uid"] = u.uid;
  525. j_user_behavior_record["behavior"] = u.behavior;
  526. j_user_behavior_record["behaviorZH"] = user_behavior_to_str((user_behavior_t)u.behavior);
  527. j_user_behavior_record["behaviorinfo"] = u.behaviorinfo;
  528. j_user_behavior_record["date"] = u.date;
  529. j_user_behavior_records["iterms"].push_back(j_user_behavior_record);
  530. } else if (i >= to) {
  531. break;
  532. }
  533. i++;
  534. }
  535. j_user_behavior_records["total"] = all.size();
  536. j_user_behavior_records["page"] = page;
  537. j_user_behavior_records["totalpage"] = all.size() / page_size + (all.size() % page_size == 0 ? 0 : 1);
  538. return j_user_behavior_records;
  539. }
  540. static string getTime() {
  541. struct tm tm = {0};
  542. time_t t = ::time(nullptr);
  543. struct tm* tmp = localtime_r(&t, &tm);
  544. return fmt::format("{:0>4}-{:0>2}-{:0>2} {:0>2}:{:0>2}:{:0>2}", tm.tm_year + 1900, //
  545. tm.tm_mon + 1, //
  546. tm.tm_mday, //
  547. tm.tm_hour, //
  548. tm.tm_min, tm.tm_sec);
  549. }
  550. void DBService::addUserBehaviorRecord(string uid, int behavior, string behaviorinfo) {
  551. lock_guard<recursive_mutex> lock(lock_);
  552. auto user_behavior_record_table = make_storage(USER_BEHAVIOR_RECORD_DB, USER_BEHAVIOR_RECORD_STRUCT);
  553. user_behavior_record_table.sync_schema();
  554. UserBehaviorRecord u;
  555. u.uid = uid;
  556. u.behavior = behavior;
  557. u.behaviorinfo = behaviorinfo;
  558. u.date = getTime();
  559. user_behavior_record_table.insert(u);
  560. user_behavior_record_table.sync_schema();
  561. auto all = user_behavior_record_table.get_all<UserBehaviorRecord>(order_by(&UserBehaviorRecord::id).asc());
  562. /**
  563. * @brief 5000
  564. */
  565. if (all.size() > USER_BEHAVIOR_RECORD_DB_MAX_RECORDS) {
  566. user_behavior_record_table.remove_all<UserBehaviorRecord>(where(c(&UserBehaviorRecord::id) == all[0].id));
  567. user_behavior_record_table.sync_schema();
  568. }
  569. return;
  570. }
  571. void DBService::cleanUserBehaviorRecord() {
  572. lock_guard<recursive_mutex> lock(lock_);
  573. system(fmt::format("rm -rf {}", USER_BEHAVIOR_RECORD_DB).c_str());
  574. }