diff --git a/.idea/serv.iml b/.idea/serv.iml
index 44ad227..6db59ba 100644
--- a/.idea/serv.iml
+++ b/.idea/serv.iml
@@ -6,6 +6,8 @@
+
+
diff --git a/Cargo.toml b/Cargo.toml
index 8d7246f..32688da 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,7 +1,7 @@
[workspace]
resolver = "2"
-members = ["packages/gotify-ws", "packages/serv"]
-default-members = ["packages/gotify-ws"]
+members = ["packages/gotify-ws", "packages/model", "packages/serv"]
+#default-members = ["packages/gotify-ws"]
[workspace.dependencies]
gotify-ws = { path = "./packages/gotify-ws" }
diff --git a/packages/model/Cargo.toml b/packages/model/Cargo.toml
new file mode 100644
index 0000000..62b5f88
--- /dev/null
+++ b/packages/model/Cargo.toml
@@ -0,0 +1,13 @@
+[package]
+name = "model"
+version = "0.1.0"
+edition = "2024"
+
+[lib]
+name = "model"
+path = "lib/mod.rs"
+
+[dependencies]
+serde.workspace = true
+sea-orm.workspace = true
+chrono.workspace = true
\ No newline at end of file
diff --git a/packages/model/lib/id_card/mod.rs b/packages/model/lib/id_card/mod.rs
new file mode 100644
index 0000000..c81e906
--- /dev/null
+++ b/packages/model/lib/id_card/mod.rs
@@ -0,0 +1,31 @@
+use sea_orm::entity::prelude::*;
+use sea_orm::{ActiveModelBehavior, DeriveActiveEnum, DeriveEntityModel, DerivePrimaryKey, DeriveRelation, EnumIter};
+use serde::{Deserialize, Serialize};
+
+#[derive(DeriveEntityModel, Clone, Debug, PartialEq, Serialize, Deserialize)]
+#[sea_orm(table_name = "id_card")]
+pub struct Model {
+ #[sea_orm(primary_key)]
+ pub id: String,
+ pub name: String,
+ pub gender: Gender,
+ pub birth: String,
+ pub address: Option,
+ pub nation: String,
+ pub create_at: DateTime,
+}
+pub type IDCardModel = Model;
+
+#[derive(Debug, DeriveRelation, EnumIter)]
+pub enum Relation {}
+
+#[derive(Serialize, Deserialize, Debug, Clone, EnumIter, PartialEq, DeriveActiveEnum)]
+#[sea_orm(rs_type = "String", db_type = "Enum", enum_name = "gender")]
+pub enum Gender {
+ #[sea_orm(string_value = "female")]
+ Female,
+ #[sea_orm(string_value = "male")]
+ Male,
+}
+
+impl ActiveModelBehavior for ActiveModel {}
diff --git a/packages/model/lib/mod.rs b/packages/model/lib/mod.rs
new file mode 100644
index 0000000..942f2cb
--- /dev/null
+++ b/packages/model/lib/mod.rs
@@ -0,0 +1 @@
+pub mod id_card;
diff --git a/packages/serv/Cargo.toml b/packages/serv/Cargo.toml
index 98732bb..db65d60 100644
--- a/packages/serv/Cargo.toml
+++ b/packages/serv/Cargo.toml
@@ -6,5 +6,6 @@ edition = "2024"
[dependencies]
tokio.workspace = true
gotify-ws.workspace = true
-log = "0.4.27"
-env_logger = "0.11.8"
\ No newline at end of file
+log.workspace = true
+sea-orm.workspace = true
+regex.workspace = true
diff --git a/packages/serv/src/test/id_card.rs b/packages/serv/src/test/id_card.rs
new file mode 100644
index 0000000..302baf7
--- /dev/null
+++ b/packages/serv/src/test/id_card.rs
@@ -0,0 +1,74 @@
+use regex::Regex;
+use std::env;
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+use std::path::Path;
+use std::sync::OnceLock;
+
+static ID_REG: OnceLock = OnceLock::new();
+#[test]
+fn test_split() {
+ let str = "朱春艳----320681197904304224";
+ if let Some((name, id)) = split_str(str) {
+ println!("name: {}, id: {}", name, id);
+ get_id_info(id)
+ }
+}
+
+fn split_str(str: &str) -> Option<(&str, &str)> {
+ let regex = ID_REG.get_or_init(|| Regex::new(r"(.*?)-+(\d+)").expect("正则创建失败"));
+ let mut value = None;
+
+ if let Some(res) = regex.captures(str) {
+ value = Some((res.get(1)?.as_str(), res.get(2)?.as_str()));
+ }
+
+ value
+}
+
+fn get_id_info(id: &str) {
+ let location = &id[0..6];
+ println!("location: {}", location);
+ let born = &id[6..14];
+ println!("born: {}", born);
+ let born_year = &id[6..10];
+ println!("born: {}", born_year);
+ let born_month = &id[10..12];
+ println!("born month: {}", born_month);
+ let born_day = &id[12..14];
+ println!("born day: {}", born_day);
+ let count = &id[14..18];
+ println!("born count: {}", count);
+ let validate = &id[18..19];
+ println!("validate number: {validate}")
+}
+
+#[test]
+fn test_get_file() {
+ get_id_file();
+}
+
+fn get_id_file() {
+ let _ = env::current_dir().unwrap();
+ println!("当前的路径 {:#?}", env::current_dir().unwrap());
+ let path = Path::new("resources/ID/id.txt");
+ // let path = Path::new("resources/id.txt");
+ let file = File::open(path).expect("打开文件失败");
+ let buffer = BufReader::new(file);
+
+ for line in buffer.lines() {
+ // println!("line {}", line.unwrap());
+ if let Some((name, id)) = split_str(line.unwrap().as_str()) {
+ // println!("name: {}, id: {}", name, id);
+
+ if id.len() != 18 {
+ // println!("name: {}, id: {}", name, id);
+ continue;
+ // if id.len() != 17 {
+ // println!("name: {}, id: {}", name, id);
+ // continue;
+ // }
+ }
+ }
+ }
+}
diff --git a/packages/serv/src/test/mod.rs b/packages/serv/src/test/mod.rs
index 065ab4c..f03cd08 100644
--- a/packages/serv/src/test/mod.rs
+++ b/packages/serv/src/test/mod.rs
@@ -1,2 +1,3 @@
#[cfg(test)]
mod base_api;
+mod id_card;