user.rs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. use crate::{AppState, api::{JsonBack, DataBack, Page}, datasource::{Datasource,SqliteParams}};
  2. use crate::api::{check_login,token,md5,token_fail};
  3. use serde::{Deserialize,Serialize};
  4. use axum::{Json, extract::State};
  5. #[derive(Deserialize)]
  6. pub struct Uloggin{
  7. uname: String,
  8. passwd: String,
  9. }
  10. #[derive(serde::Serialize)]
  11. pub struct UTokenBack{
  12. pub errcode: i16,
  13. #[serde(skip_serializing_if = "Option::is_none")]
  14. pub errmsg: Option<String>,
  15. #[serde(skip_serializing_if = "Option::is_none")]
  16. pub token: Option<String>
  17. }
  18. pub async fn u_loggin(
  19. State(state): State<AppState>,
  20. Json(u): axum::extract::Json<Uloggin>
  21. ) -> Json<UTokenBack> {
  22. let uid = match state.db_lite.query(
  23. "select id from user where uname=? and passwd=? and isdelete=0",
  24. [u.uname,md5(u.passwd)],
  25. |r| {r.get::<usize,i64>(0)}).await{
  26. Ok(ans) => ans,
  27. Err(e) => {
  28. if e != ""{
  29. println!("error when loggin {e}");
  30. }
  31. return Json(UTokenBack{
  32. errcode: 2000,
  33. errmsg: Some(format!("登录失败")),
  34. token: None,
  35. })
  36. }
  37. };
  38. let token = token();
  39. if let Err(e) = state.db_lite.execute("update user set lastlogin=current_timestamp,token=? where id=?", (token.clone(), uid)).await{
  40. println!("error when loggin {e}")
  41. }
  42. Json(UTokenBack{
  43. errcode: 0,
  44. errmsg: None,
  45. token: Some(token),
  46. })
  47. }
  48. #[derive(Deserialize, Serialize)]
  49. pub struct Uedit{
  50. token: Option<String>, // 为空时判断uname-passwd创建账户
  51. id: Option<u64>, // 不为空时为编辑该用户的uname-passwd,若uname-passwd为空则删除用户
  52. // 以下为可编辑项
  53. uname: Option<String>,
  54. #[serde(skip_serializing_if = "Option::is_none")]
  55. passwd: Option<String>,
  56. #[serde(skip_serializing_if = "Option::is_none")]
  57. group: Option<String>,
  58. #[serde(skip_serializing_if = "Option::is_none")]
  59. nickname: Option<String>,
  60. lastlogin: Option<u64>,
  61. createtime: Option<u64>
  62. }
  63. pub async fn u_edit(
  64. State(state): State<AppState>,
  65. Json(u): axum::extract::Json<Uedit>
  66. ) -> Json<JsonBack> {
  67. if u.token.is_none() {
  68. // 新建用户
  69. return axum::Json(JsonBack{
  70. errcode: 3000,
  71. errmsg: Some(format!("不允许创建用户"))
  72. });
  73. }
  74. let uid = match check_login(&state, u.token.unwrap()).await{
  75. Ok(uid)=> uid,
  76. Err(()) => return token_fail()
  77. };
  78. if let Some(_) = u.id {
  79. // 删除对应uid的用户
  80. return Json(JsonBack{
  81. errcode: 0,
  82. errmsg: Some(format!("无效的操作"))
  83. })
  84. }
  85. let mut param:SqliteParams = vec![];
  86. if let Err(e) = state.db_lite.execute(format!("update user set isdelete=0{}{}{}{} where id=?",
  87. if let Some(filter)=u.uname {param.push(Box::new (filter.clone()));",uname=?"} else {""},
  88. if let Some(filter)=u.passwd {param.push(Box::new (filter.clone()));",passwd=?"} else {""},
  89. if let Some(filter)=u.group {param.push(Box::new (filter.clone()));",group=?"} else {""},
  90. if let Some(filter)=u.nickname {param.push(Box::new (filter.clone()));",group=?"} else {""},
  91. ).as_str(), rusqlite::params_from_iter({param.push(Box::new(uid));param})).await{
  92. return Json(JsonBack{
  93. errcode: 0,
  94. errmsg: Some(format!("数据库操作失败: {e}"))
  95. });
  96. }
  97. Json(JsonBack{
  98. errcode: 0,
  99. errmsg: None
  100. })
  101. }
  102. #[derive(Deserialize)]
  103. pub struct Ulist{
  104. token: String,
  105. #[serde(flatten)]
  106. page: Option<Page>,
  107. #[serde(skip_serializing_if = "Option::is_none")]
  108. nickname: Option<String>,
  109. #[serde(skip_serializing_if = "Option::is_none")]
  110. group: Option<String>
  111. }
  112. pub async fn u_list(
  113. State(state): State<AppState>,
  114. Json(u): axum::extract::Json<Ulist>
  115. ) -> Json<DataBack<Vec<Uedit>>> {
  116. // 在这里实现用户列表查询逻辑
  117. // 可以使用 u.page.page, u.page.size, u.nickname, u.group
  118. let _ = match check_login(&state, u.token).await{
  119. Ok(uid) => uid,
  120. Err(_) => return Json(DataBack { errcode: 2000, errmsg: Some("鉴权失败: token失效".to_string()), data: None })
  121. };
  122. let (page,size) = if let Some(p)=u.page {(p.page,p.size)} else {(1,20)};
  123. let mut params: SqliteParams = vec![];
  124. match state.db_lite.query_rows(
  125. format!("select u.id, u.uname, u.nickname, strftime('%s', u.lastlogin)*1000, strftime('%s', u.createtime)*1000 from user u where isdelete=0{}{} limit ? offset ?",
  126. if let Some(ref filter) = u.nickname {params.push(Box::new(filter.clone())); " and u.nickname like ?"} else {""},
  127. if let Some(ref filter) = u.group {params.push(Box::new(filter.clone())); " and u.group like ?"} else {""}
  128. ).as_str(),
  129. rusqlite::params_from_iter({params.push(Box::new(size));params.push(Box::new(size*(page-1)));params}) , |r| {
  130. Ok(Uedit{
  131. token: None,
  132. id: r.get(0)?,
  133. uname: r.get(1)?,
  134. passwd: None,
  135. group: None,
  136. nickname: r.get(2)?,
  137. lastlogin: r.get(3)?,
  138. createtime: r.get(4)?
  139. })
  140. }).await{
  141. Ok(ans) => Json(DataBack{
  142. errcode: 0,
  143. errmsg:None,
  144. data: Some(ans)
  145. }),
  146. Err(e) => {
  147. Json(DataBack {
  148. errcode: 0,
  149. errmsg: Some(format!("查询失败: {e}")),
  150. data: None
  151. })
  152. }
  153. }
  154. }