zii 3 недель назад
Родитель
Сommit
04e658c10d
7 измененных файлов с 146 добавлено и 56 удалено
  1. 39 8
      src/api/ability.rs
  2. 24 9
      src/api/area.rs
  3. 3 0
      src/api/device.rs
  4. 1 1
      src/api/flow_task.rs
  5. 0 1
      src/api/mod.rs
  6. 78 37
      src/api/user.rs
  7. 1 0
      src/main.rs

+ 39 - 8
src/api/ability.rs

@@ -154,8 +154,9 @@ pub async fn get_mqtt(
 
 #[derive(serde::Deserialize)]
 pub struct DropD{
-    token: String,
-    device: u64
+    token: Option<String>,
+    device: Option<u64>,
+    sn: Option<String>
 }
 
 // #[derive(serde::Deserialize)]
@@ -166,18 +167,48 @@ pub struct DropD{
 
 // }
 
+// pub async fn token_for_device(
+//     State(state): State<AppState>,
+//     Json(d): axum::extract::Json<DropD>
+// ) -> Json<JsonBack> {
+//     let sn = if let Some(sn) = d.sn{sn}else
+//     if let Ok(sn)=state.db_lite.query(
+//         "select sn from device where id=? or sn=?", 
+//         [
+//             if let Some(dev ) = d.device{dev}else{
+//                 return Json(JsonBack{errcode: 3000, errmsg: Some("参数异常: 获取设备sn失败".to_string())});
+//             }
+//             ], |r|{r.get::<usize,String>(0)}).await{
+//         sn
+//     }else{
+//         return Json(JsonBack{errcode: 3000, errmsg: Some("数据库异常: 获取设备sn失败".to_string())});
+//     };
+//     let token = format!("drop_{}", super::token(8));
+//     return Json(JsonBack{errcode: 0, errmsg: None});
+// }
 
 pub async fn drop_device(
     State(state): State<AppState>,
     Json(d): axum::extract::Json<DropD>
 ) -> Json<JsonBack> {
-    if let Err(e)=state.db_lite.query("select true from user where token=? and id=1", [d.token], |r|{r.get::<usize,bool>(0)}).await{
-        log(Warning, format!("error: {e}"));
-        return super::token_fail();
+    let token = if let Some(t) = d.token{t}else{
+        return Json(JsonBack{errcode: 2000, errmsg: Some("鉴权失败: token无效".to_string())});
+    };
+    if token != "KxdQwApDDFg".to_string(){
+        return Json(JsonBack{errcode: 2000, errmsg: Some("鉴权失败: token无效".to_string())});
     }
-    let sn = if let Ok(sn)=state.db_lite.query(
-        "select sn from device where id=?", 
-        [d.device], |r|{r.get::<usize,String>(0)}).await{
+    // if let Err(e)=state.db_lite.query("select true from user where token=? and id=0", [d.token], |r|{r.get::<usize,bool>(0)}).await{
+    //     log(Warning, format!("error: {e}"));
+    //     return super::token_fail();
+    // }
+    let sn = if let Some(sn) = d.sn{sn}else
+    if let Ok(sn)=state.db_lite.query(
+        "select sn from device where id=? or sn=?", 
+        [
+            if let Some(dev ) = d.device{dev}else{
+                return Json(JsonBack{errcode: 3000, errmsg: Some("参数异常: 获取设备sn失败".to_string())});
+            }
+            ], |r|{r.get::<usize,String>(0)}).await{
         sn
     }else{
         return Json(JsonBack{errcode: 3000, errmsg: Some("数据库异常: 获取设备sn失败".to_string())});

+ 24 - 9
src/api/area.rs

@@ -62,6 +62,7 @@ pub struct EditIdName{
     token: String,
     id: u64,
     name: Option<String>,
+    uid: Option<i64>,
 }
 
 pub async fn a_edit(
@@ -106,20 +107,34 @@ pub async fn a_remove(
             return token_fail();
         }
     };
-    match state.db_lite.execute("delete from map_user_area where (aid=? or aid in(select id from area where sup=?)) and uid=?", (a.id,a.id,uid)).await{
-        Ok(_) => {},
-        Err(e) => {
-            return Json(JsonBack{errcode: 3000, errmsg: Some(format!("删除区域关系失败: {e}"))});
+    if let Some(uid) = a.uid{
+        match state.db_lite.execute("delete from map_user_area where aid=? and uid=?", (a.id,uid)).await{
+            Ok(n) => {
+                if n == 0{
+                    return Json(JsonBack{errcode: 3000, errmsg: Some(format!("区域关系不存在"))});
+                }
+            },
+            Err(e) => {
+                return Json(JsonBack{errcode: 3000, errmsg: Some(format!("删除区域关系失败: {e}"))});
+            }
         }
-    }
-    match state.db_lite.execute("delete from map_user_device where uid=? and did in(select id from device where area in (select id from area where sup=? or id=?))", (uid,a.id,a.id)).await{
-        Ok(_) => {},
-        Err(e) => {
-            return Json(JsonBack{errcode: 3000, errmsg: Some(format!("删除区域关系失败: {e}"))});
+    } else {
+        match state.db_lite.execute("delete from map_user_area where (aid=? or aid in(select id from area where sup=?)) and uid=?", (a.id,a.id,uid)).await{
+            Ok(_) => {},
+            Err(e) => {
+                return Json(JsonBack{errcode: 3000, errmsg: Some(format!("删除区域关系失败: {e}"))});
+            }
+        }
+        match state.db_lite.execute("delete from map_user_device where uid=? and did in(select id from device where area in (select id from area where sup=? or id=?))", (uid,a.id,a.id)).await{
+            Ok(_) => {},
+            Err(e) => {
+                return Json(JsonBack{errcode: 3000, errmsg: Some(format!("删除区域关系失败: {e}"))});
+            }
         }
     }
     errcode0()
 }
+
 pub async fn a_del(
     State(state): State<AppState>,
     Json(a): axum::extract::Json<EditIdName>

+ 3 - 0
src/api/device.rs

@@ -370,6 +370,8 @@ pub struct UTokenBack{
 pub struct UInfo{
     errcode: u32,
     #[serde(skip_serializing_if = "Option::is_none")]
+    id: Option<u64>,
+    #[serde(skip_serializing_if = "Option::is_none")]
     errmsg: Option<String>,
     #[serde(skip_serializing_if = "Option::is_none")]
     nickname: Option<String>,
@@ -395,6 +397,7 @@ pub async fn d_all(
         uinfo: match state.db_lite.query("select nickname, headimgurl from user where id=?", [uid], |r| {
                 Ok(
                     UInfo{
+                        id: Some(uid),
                         errcode: 0,
                         errmsg: None,
                         nickname: Some(r.get(0)?),

+ 1 - 1
src/api/flow_task.rs

@@ -173,7 +173,7 @@ pub async fn checkout_flow_task_of_share_device(
         if effected!=1{
             return Json(JsonBack { errcode: 3000, errmsg: Some(format!("该设备被分享状态占用,目前有{effected}条分享")) });
         }
-        match state.db_lite.execute("update device set belongto=? where id=?", [uid, the_id]).await{
+        match state.db_lite.execute("update device set belongto=?, area=0 where id=?", [uid, the_id]).await{
             Ok(_) => {},
             Err(e) => return Json(JsonBack{errcode: 3000, errmsg: Some(format!("更新设备分享关系失败: {e}"))}),
         }

+ 0 - 1
src/api/mod.rs

@@ -9,7 +9,6 @@ pub mod ability;
 mod code_helper;
 
 use rand::Rng;
-use reqwest::header::WARNING;
 use crate::{datasource::Datasource, log, LogLevel::*};
 
 #[derive(serde::Deserialize)]

+ 78 - 37
src/api/user.rs

@@ -137,8 +137,8 @@ pub struct Uedit{
     uname: Option<String>,
     #[serde(skip_serializing_if = "Option::is_none")]
     passwd: Option<String>,
-    #[serde(skip_serializing_if = "Option::is_none")]
-    group: Option<String>,
+    // #[serde(skip_serializing_if = "Option::is_none")]
+    // group: Option<String>,
     #[serde(skip_serializing_if = "Option::is_none")]
     nickname: Option<String>,
     lastlogin: Option<u64>,
@@ -170,10 +170,10 @@ pub async fn u_edit(
         
     let mut param:SqliteParams = vec![];
     
-    if let Err(e) = state.db_lite.execute(format!("update user set isdelete=0{}{}{}{} where id=?",
+    if let Err(e) = state.db_lite.execute(format!("update user set isdelete=0{}{}{} where id=?",
         if let Some(filter)=u.uname {param.push(Box::new (filter.clone()));",uname=?"} else {""},
         if let Some(filter)=u.passwd {param.push(Box::new (filter.clone()));",passwd=?"} else {""},
-        if let Some(filter)=u.group {param.push(Box::new (filter.clone()));",group=?"} else {""},
+        // if let Some(filter)=u.group {param.push(Box::new (filter.clone()));",group=?"} else {""},
         if let Some(filter)=u.nickname {param.push(Box::new (filter.clone()));",group=?"} else {""},
     ).as_str(), rusqlite::params_from_iter({param.push(Box::new(uid));param})).await{
         return  Json(JsonBack{
@@ -199,7 +199,9 @@ pub struct Ulist{
     #[serde(skip_serializing_if = "Option::is_none")]
     nickname: Option<String>,
     #[serde(skip_serializing_if = "Option::is_none")]
-    group: Option<String>
+    did: Option<i64>,
+    #[serde(skip_serializing_if = "Option::is_none")]
+    area: Option<i64>
 }
 
 
@@ -218,41 +220,80 @@ pub async fn u_list(
     // }
     let (page,size) = if let Some(p)=u.page {(p.page,p.size)} else {(1,20)};
     let mut params: SqliteParams = vec![];
-    
-    match state.db_lite.query_rows(
-        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 ?",
-        if let Some(ref filter) = u.nickname {params.push(Box::new(filter.clone())); " and u.nickname like ?"} else {""},
-        if let Some(ref filter) = u.group {params.push(Box::new(filter.clone())); " and u.group like ?"} else {""},
-        if let Some(ref filter) = u.ids {
-            if filter.is_empty(){String::new()}
-            else{let mut uids=Vec::new();for i in filter{ uids.push("?");params.push(Box::new(*i));};format!( " and u.id in ({})",uids.join(","))}
-        } else {String::new()}
-    ).as_str(),
-     rusqlite::params_from_iter({params.push(Box::new(size));params.push(Box::new(size*(page-1)));params}) , |r| {
-            Ok(Uedit{
-                token: None,
-                id: r.get(0)?,
-                uname: r.get(1)?,
-                passwd: None,
-                group: None,
-                nickname: r.get(2)?,
-                lastlogin: r.get(3)?,
-                createtime: r.get(4)?
-            })
-        }).await{
-            Ok(ans) => Json(DataBack{
-                errcode: 0,
-                errmsg:None,
-                data: Some(ans)
-            }),
-            Err(e) => {
-                Json(DataBack { 
+    if let Some(did) = u.did{
+        params.push(Box::new(did));
+        match state.db_lite.query_rows(
+            format!("select u.id, u.nickname  from user u left join map_user_device m on u.id=m.uid where u.isdelete=0 and m.did=?{}{}{} limit ? offset ?",
+            if let Some(ref filter) = u.nickname {params.push(Box::new(filter.clone())); " and u.nickname like ?"} else {""},
+            // if let Some(ref filter) = u.group {params.push(Box::new(filter.clone())); " and u.group like ?"} else {""},
+            if let Some(ref filter) = u.ids {
+                if filter.is_empty(){String::new()}
+                else{let mut uids=Vec::new();for i in filter{ uids.push("?");params.push(Box::new(*i));};format!( " and u.id in ({})",uids.join(","))}
+            } else {String::new()},
+            if let Some(ref filter) = u.area {params.push(Box::new(filter.clone())); " and u.id in (select uid from map_user_area where aid=?)"} else {""},
+        ).as_str(),
+        rusqlite::params_from_iter({params.push(Box::new(size));params.push(Box::new(size*(page-1)));params}) , |r| {
+                Ok(Uedit{
+                    token: None,
+                    id: r.get(0)?,
+                    uname: None,
+                    passwd: None,
+                    // group: None,
+                    nickname: r.get(1)?,
+                    lastlogin: None,
+                    createtime: None
+                })
+            }).await{
+                Ok(ans) => Json(DataBack{
                     errcode: 0,
-                    errmsg: Some(format!("查询失败: {e}")),
-                    data: None
+                    errmsg:None,
+                    data: Some(ans)
+                }),
+                Err(e) => {
+                    Json(DataBack { 
+                        errcode: 0,
+                        errmsg: Some(format!("查询失败: {e}")),
+                        data: None
+                    })
+                }
+            }
+    }else{
+        match state.db_lite.query_rows(
+            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 ?",
+            if let Some(ref filter) = u.nickname {params.push(Box::new(filter.clone())); " and u.nickname like ?"} else {""},
+            // if let Some(ref filter) = u.group {params.push(Box::new(filter.clone())); " and u.group like ?"} else {""},
+            if let Some(ref filter) = u.ids {
+                if filter.is_empty(){String::new()}
+                else{let mut uids=Vec::new();for i in filter{ uids.push("?");params.push(Box::new(*i));};format!( " and u.id in ({})",uids.join(","))}
+            } else {String::new()},
+            if let Some(ref filter) = u.area {params.push(Box::new(filter.clone())); " and u.id in (select uid from map_user_area where aid=?)"} else {""},
+        ).as_str(),
+        rusqlite::params_from_iter({params.push(Box::new(size));params.push(Box::new(size*(page-1)));params}) , |r| {
+                Ok(Uedit{
+                    token: None,
+                    id: r.get(0)?,
+                    uname: r.get(1)?,
+                    passwd: None,
+                    // group: None,
+                    nickname: r.get(2)?,
+                    lastlogin: r.get(3)?,
+                    createtime: r.get(4)?
                 })
+            }).await{
+                Ok(ans) => Json(DataBack{
+                    errcode: 0,
+                    errmsg:None,
+                    data: Some(ans)
+                }),
+                Err(e) => {
+                    Json(DataBack { 
+                        errcode: 0,
+                        errmsg: Some(format!("查询失败: {e}")),
+                        data: None
+                    })
+                }
             }
-        }
+    }
 }
 
 

+ 1 - 0
src/main.rs

@@ -134,6 +134,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
     use axum::routing::{post,get};
     let app =  axum::Router::new()
         .route("/api/wx/auth", get(api::auth::auth))
+        .route("/api/drop", post(api::ability::drop_device))
         .with_state(appstat.clone())
          // 应用完整的CORS配置
         .nest("/apilite", axum::Router::new()