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.

640 lines
24 KiB

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