Compare commits

2 Commits
main ... dev

Author SHA1 Message Date
60b809a59d feat: 🎸 add application update signature configuration
新增程序更新签名配置,用于保证更新包的完整性与安全性
2025-11-21 23:40:38 +08:00
3302421371 feat: 🎸 complete layout for home, login and register pages
- 完成首页整体布局:顶栏(标题、主题切换、头像)、主区(侧边栏与内容区域)、底部  - 完成登录页与注册页的界面搭建  -
本次仅实现界面,功能逻辑尚未接入
2025-11-21 23:12:21 +08:00
22 changed files with 732 additions and 13 deletions

4
.gitignore vendored
View File

@@ -1,2 +1,4 @@
node_modules
dist
dist
.tauri
.env

View File

@@ -12,9 +12,11 @@
},
"license": "MIT",
"dependencies": {
"@solidjs/router": "^0.15.4",
"@tailwindcss/vite": "^4.1.17",
"@tauri-apps/api": "^2",
"@tauri-apps/plugin-opener": "^2",
"@tauri-apps/plugin-updater": "~2.9.0",
"solid-js": "^1.9.3",
"tailwindcss": "^4.1.17"
},

22
pnpm-lock.yaml generated
View File

@@ -8,6 +8,9 @@ importers:
.:
dependencies:
'@solidjs/router':
specifier: ^0.15.4
version: 0.15.4(solid-js@1.9.10)
'@tailwindcss/vite':
specifier: ^4.1.17
version: 4.1.17(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2))
@@ -17,6 +20,9 @@ importers:
'@tauri-apps/plugin-opener':
specifier: ^2
version: 2.5.2
'@tauri-apps/plugin-updater':
specifier: ~2.9.0
version: 2.9.0
solid-js:
specifier: ^1.9.3
version: 1.9.10
@@ -425,6 +431,11 @@ packages:
cpu: [x64]
os: [win32]
'@solidjs/router@0.15.4':
resolution: {integrity: sha512-WOpgg9a9T638cR+5FGbFi/IV4l2FpmBs1GpIMSPa0Ce9vyJN7Wts+X2PqMf9IYn0zUj2MlSJtm1gp7/HI/n5TQ==}
peerDependencies:
solid-js: ^1.8.6
'@tailwindcss/node@4.1.17':
resolution: {integrity: sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==}
@@ -601,6 +612,9 @@ packages:
'@tauri-apps/plugin-opener@2.5.2':
resolution: {integrity: sha512-ei/yRRoCklWHImwpCcDK3VhNXx+QXM9793aQ64YxpqVF0BDuuIlXhZgiAkc15wnPVav+IbkYhmDJIv5R326Mew==}
'@tauri-apps/plugin-updater@2.9.0':
resolution: {integrity: sha512-j++sgY8XpeDvzImTrzWA08OqqGqgkNyxczLD7FjNJJx/uXxMZFz5nDcfkyoI/rCjYuj2101Tci/r/HFmOmoxCg==}
'@types/babel__core@7.20.5':
resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
@@ -1294,6 +1308,10 @@ snapshots:
'@rollup/rollup-win32-x64-msvc@4.53.3':
optional: true
'@solidjs/router@0.15.4(solid-js@1.9.10)':
dependencies:
solid-js: 1.9.10
'@tailwindcss/node@4.1.17':
dependencies:
'@jridgewell/remapping': 2.3.5
@@ -1415,6 +1433,10 @@ snapshots:
dependencies:
'@tauri-apps/api': 2.9.0
'@tauri-apps/plugin-updater@2.9.0':
dependencies:
'@tauri-apps/api': 2.9.0
'@types/babel__core@7.20.5':
dependencies:
'@babel/parser': 7.28.5

390
src-tauri/Cargo.lock generated
View File

@@ -47,6 +47,15 @@ version = "1.0.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
[[package]]
name = "arbitrary"
version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1"
dependencies = [
"derive_arbitrary",
]
[[package]]
name = "async-broadcast"
version = "0.7.2"
@@ -656,6 +665,17 @@ dependencies = [
"serde_core",
]
[[package]]
name = "derive_arbitrary"
version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.110",
]
[[package]]
name = "derive_more"
version = "0.99.20"
@@ -906,6 +926,18 @@ dependencies = [
"rustc_version",
]
[[package]]
name = "filetime"
version = "0.2.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed"
dependencies = [
"cfg-if",
"libc",
"libredox",
"windows-sys 0.60.2",
]
[[package]]
name = "find-msvc-tools"
version = "0.1.5"
@@ -1195,8 +1227,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
dependencies = [
"cfg-if",
"js-sys",
"libc",
"wasi 0.11.1+wasi-snapshot-preview1",
"wasm-bindgen",
]
[[package]]
@@ -1206,9 +1240,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
dependencies = [
"cfg-if",
"js-sys",
"libc",
"r-efi",
"wasip2",
"wasm-bindgen",
]
[[package]]
@@ -1468,6 +1504,23 @@ dependencies = [
"want",
]
[[package]]
name = "hyper-rustls"
version = "0.27.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58"
dependencies = [
"http",
"hyper",
"hyper-util",
"rustls",
"rustls-pki-types",
"tokio",
"tokio-rustls",
"tower-service",
"webpki-roots",
]
[[package]]
name = "hyper-util"
version = "0.1.18"
@@ -1861,6 +1914,7 @@ checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb"
dependencies = [
"bitflags 2.10.0",
"libc",
"redox_syscall",
]
[[package]]
@@ -1890,6 +1944,12 @@ version = "0.4.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
[[package]]
name = "lru-slab"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154"
[[package]]
name = "mac"
version = "0.1.1"
@@ -1948,6 +2008,12 @@ version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
[[package]]
name = "minisign-verify"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e856fdd13623a2f5f2f54676a4ee49502a96a80ef4a62bcedd23d52427c44d43"
[[package]]
name = "miniz_oxide"
version = "0.8.9"
@@ -2283,6 +2349,18 @@ dependencies = [
"objc2-foundation 0.2.2",
]
[[package]]
name = "objc2-osa-kit"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f112d1746737b0da274ef79a23aac283376f335f4095a083a267a082f21db0c0"
dependencies = [
"bitflags 2.10.0",
"objc2 0.6.3",
"objc2-app-kit",
"objc2-foundation 0.3.2",
]
[[package]]
name = "objc2-quartz-core"
version = "0.2.2"
@@ -2380,6 +2458,20 @@ dependencies = [
"pin-project-lite",
]
[[package]]
name = "osakit"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "732c71caeaa72c065bb69d7ea08717bd3f4863a4f451402fc9513e29dbd5261b"
dependencies = [
"objc2 0.6.3",
"objc2-foundation 0.3.2",
"objc2-osa-kit",
"serde",
"serde_json",
"thiserror 2.0.17",
]
[[package]]
name = "pango"
version = "0.18.3"
@@ -2756,6 +2848,61 @@ dependencies = [
"memchr",
]
[[package]]
name = "quinn"
version = "0.11.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20"
dependencies = [
"bytes",
"cfg_aliases",
"pin-project-lite",
"quinn-proto",
"quinn-udp",
"rustc-hash",
"rustls",
"socket2",
"thiserror 2.0.17",
"tokio",
"tracing",
"web-time",
]
[[package]]
name = "quinn-proto"
version = "0.11.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31"
dependencies = [
"bytes",
"getrandom 0.3.4",
"lru-slab",
"rand 0.9.2",
"ring",
"rustc-hash",
"rustls",
"rustls-pki-types",
"slab",
"thiserror 2.0.17",
"tinyvec",
"tracing",
"web-time",
]
[[package]]
name = "quinn-udp"
version = "0.5.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd"
dependencies = [
"cfg_aliases",
"libc",
"once_cell",
"socket2",
"tracing",
"windows-sys 0.60.2",
]
[[package]]
name = "quote"
version = "1.0.42"
@@ -2796,6 +2943,16 @@ dependencies = [
"rand_core 0.6.4",
]
[[package]]
name = "rand"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
dependencies = [
"rand_chacha 0.9.0",
"rand_core 0.9.3",
]
[[package]]
name = "rand_chacha"
version = "0.2.2"
@@ -2816,6 +2973,16 @@ dependencies = [
"rand_core 0.6.4",
]
[[package]]
name = "rand_chacha"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
dependencies = [
"ppv-lite86",
"rand_core 0.9.3",
]
[[package]]
name = "rand_core"
version = "0.5.1"
@@ -2834,6 +3001,15 @@ dependencies = [
"getrandom 0.2.16",
]
[[package]]
name = "rand_core"
version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
dependencies = [
"getrandom 0.3.4",
]
[[package]]
name = "rand_hc"
version = "0.2.0"
@@ -2941,16 +3117,21 @@ dependencies = [
"http-body",
"http-body-util",
"hyper",
"hyper-rustls",
"hyper-util",
"js-sys",
"log",
"percent-encoding",
"pin-project-lite",
"quinn",
"rustls",
"rustls-pki-types",
"serde",
"serde_json",
"serde_urlencoded",
"sync_wrapper",
"tokio",
"tokio-rustls",
"tokio-util",
"tower",
"tower-http",
@@ -2960,8 +3141,29 @@ dependencies = [
"wasm-bindgen-futures",
"wasm-streams",
"web-sys",
"webpki-roots",
]
[[package]]
name = "ring"
version = "0.17.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
dependencies = [
"cc",
"cfg-if",
"getrandom 0.2.16",
"libc",
"untrusted",
"windows-sys 0.52.0",
]
[[package]]
name = "rustc-hash"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
[[package]]
name = "rustc_version"
version = "0.4.1"
@@ -2984,6 +3186,41 @@ dependencies = [
"windows-sys 0.61.2",
]
[[package]]
name = "rustls"
version = "0.23.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f"
dependencies = [
"once_cell",
"ring",
"rustls-pki-types",
"rustls-webpki",
"subtle",
"zeroize",
]
[[package]]
name = "rustls-pki-types"
version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a"
dependencies = [
"web-time",
"zeroize",
]
[[package]]
name = "rustls-webpki"
version = "0.103.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52"
dependencies = [
"ring",
"rustls-pki-types",
"untrusted",
]
[[package]]
name = "rustversion"
version = "1.0.22"
@@ -3417,6 +3654,12 @@ version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
name = "subtle"
version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
[[package]]
name = "swift-rs"
version = "1.0.7"
@@ -3534,6 +3777,17 @@ dependencies = [
"syn 2.0.110",
]
[[package]]
name = "tar"
version = "0.4.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a"
dependencies = [
"filetime",
"libc",
"xattr",
]
[[package]]
name = "target-lexicon"
version = "0.12.16"
@@ -3693,6 +3947,53 @@ dependencies = [
"zbus",
]
[[package]]
name = "tauri-plugin-single-instance"
version = "2.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd707f8c86b4e3004e2c141fa24351f1909ba40ce1b8437e30d5ed5277dd3710"
dependencies = [
"serde",
"serde_json",
"tauri",
"thiserror 2.0.17",
"tracing",
"windows-sys 0.60.2",
"zbus",
]
[[package]]
name = "tauri-plugin-updater"
version = "2.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "27cbc31740f4d507712550694749572ec0e43bdd66992db7599b89fbfd6b167b"
dependencies = [
"base64 0.22.1",
"dirs",
"flate2",
"futures-util",
"http",
"infer",
"log",
"minisign-verify",
"osakit",
"percent-encoding",
"reqwest",
"semver",
"serde",
"serde_json",
"tar",
"tauri",
"tauri-plugin",
"tempfile",
"thiserror 2.0.17",
"time",
"tokio",
"url",
"windows-sys 0.60.2",
"zip",
]
[[package]]
name = "tauri-runtime"
version = "2.9.1"
@@ -3899,6 +4200,21 @@ dependencies = [
"zerovec",
]
[[package]]
name = "tinyvec"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa"
dependencies = [
"tinyvec_macros",
]
[[package]]
name = "tinyvec_macros"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
version = "1.48.0"
@@ -3913,6 +4229,16 @@ dependencies = [
"windows-sys 0.61.2",
]
[[package]]
name = "tokio-rustls"
version = "0.26.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61"
dependencies = [
"rustls",
"tokio",
]
[[package]]
name = "tokio-util"
version = "0.7.17"
@@ -4031,6 +4357,8 @@ dependencies = [
"tauri",
"tauri-build",
"tauri-plugin-opener",
"tauri-plugin-single-instance",
"tauri-plugin-updater",
]
[[package]]
@@ -4213,6 +4541,12 @@ version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
[[package]]
name = "untrusted"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
[[package]]
name = "url"
version = "2.5.7"
@@ -4414,6 +4748,16 @@ dependencies = [
"wasm-bindgen",
]
[[package]]
name = "web-time"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
dependencies = [
"js-sys",
"wasm-bindgen",
]
[[package]]
name = "webkit2gtk"
version = "2.0.1"
@@ -4458,6 +4802,15 @@ dependencies = [
"system-deps",
]
[[package]]
name = "webpki-roots"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e"
dependencies = [
"rustls-pki-types",
]
[[package]]
name = "webview2-com"
version = "0.38.0"
@@ -4688,6 +5041,15 @@ dependencies = [
"windows-targets 0.42.2",
]
[[package]]
name = "windows-sys"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
dependencies = [
"windows-targets 0.52.6",
]
[[package]]
name = "windows-sys"
version = "0.59.0"
@@ -5025,6 +5387,16 @@ dependencies = [
"pkg-config",
]
[[package]]
name = "xattr"
version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156"
dependencies = [
"libc",
"rustix",
]
[[package]]
name = "yoke"
version = "0.8.1"
@@ -5150,6 +5522,12 @@ dependencies = [
"synstructure",
]
[[package]]
name = "zeroize"
version = "1.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"
[[package]]
name = "zerotrie"
version = "0.2.3"
@@ -5183,6 +5561,18 @@ dependencies = [
"syn 2.0.110",
]
[[package]]
name = "zip"
version = "4.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "caa8cd6af31c3b31c6631b8f483848b91589021b28fffe50adada48d4f4d2ed1"
dependencies = [
"arbitrary",
"crc32fast",
"indexmap 2.12.1",
"memchr",
]
[[package]]
name = "zvariant"
version = "5.8.0"

View File

@@ -23,3 +23,7 @@ tauri-plugin-opener = "2"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies]
tauri-plugin-single-instance = "2"
tauri-plugin-updater = "2"

View File

@@ -0,0 +1,14 @@
{
"identifier": "desktop-capability",
"platforms": [
"macOS",
"windows",
"linux"
],
"windows": [
"main"
],
"permissions": [
"updater:default"
]
}

View File

@@ -1,3 +1,5 @@
use tauri::Manager;
// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/
#[tauri::command]
fn greet(name: &str) -> String {
@@ -7,6 +9,13 @@ fn greet(name: &str) -> String {
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
tauri::Builder::default()
.plugin(tauri_plugin_updater::Builder::new().build())
.plugin(tauri_plugin_single_instance::init(|_app, _args, _cwd| {}))
.setup(|app| {
let webview_window = app.get_webview_window("main").unwrap();
webview_window.open_devtools();
Ok(())
})
.plugin(tauri_plugin_opener::init())
.invoke_handler(tauri::generate_handler![greet])
.run(tauri::generate_context!())

View File

@@ -22,11 +22,24 @@
}
},
"bundle": {
"createUpdaterArtifacts": true,
"active": true,
"targets": "all",
"icon": [
"icons/icon.icns",
"icons/icon.ico"
]
},
"plugins": {
"updater": {
"pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IEQwMzFGN0RGMjhCQkE5MUUKUldRZXFic28zL2N4MERSMlZGdDdKS0Z2ZkRRME9pVnVaamJjclhJcWFrQi8wMUE4VHJVSmpzVC8K",
"endpoints": [
"https://releases.myapp.com/{{target}}/{{arch}}/{{current_version}}",
"https://github.com/user/repo/releases/latest/download/latest.json"
],
"windows": {
"installMode": "passive"
}
}
}
}

View File

@@ -1,2 +1,20 @@
@import "tailwindcss";
@plugin "daisyui";
@import 'tailwindcss';
@plugin 'daisyui';
html,
body,
#root {
padding: 0;
margin: 0;
width: 100vw;
height: 100vh;
justify-items: center;
box-sizing: border-box;
overflow: hidden;
}
*,
*::before,
*::after {
box-sizing: inherit;
}

View File

@@ -1,12 +1,8 @@
import "./App.css";
import './App.css';
import { Home } from '~/pages';
function App() {
return (
<main class='container'>
</main>
);
return <Home />;
}
export default App;

BIN
src/assets/avatar.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -0,0 +1,14 @@
const Footer = () => {
return (
<footer class="flex h-10 w-full items-center justify-between border-t border-gray-400 bg-gray-300 px-5">
<span>Copyright &copy 2025 Zhilv</span>
<span class="text-blue-400 dark:text-blue-600">
<a href="https://www.kmux.cn" target="_blank">
</a>
</span>
</footer>
);
};
export default Footer;

View File

@@ -0,0 +1,68 @@
import { Component, Show } from 'solid-js';
import avatarSvg from '~/assets/avatar.jpg';
interface HeaderProps {
isAvatar?: boolean;
}
const Header: Component<HeaderProps> = ({ isAvatar = true }) => {
return (
<header class="flex h-16 w-screen flex-row items-center justify-center space-x-5 border-b border-gray-400 bg-pink-100 px-5">
<span class="flex flex-1 justify-center text-4xl"></span>
<label class="toggle text-base-content toggle-xl rounded-full">
<input type="checkbox" value="synthwave" class="theme-controller" />
<svg
aria-label="sun"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
>
<g
stroke-linejoin="round"
stroke-linecap="round"
stroke-width="2"
fill="none"
stroke="currentColor"
>
<circle cx="12" cy="12" r="4"></circle>
<path d="M12 2v2"></path>
<path d="M12 20v2"></path>
<path d="m4.93 4.93 1.41 1.41"></path>
<path d="m17.66 17.66 1.41 1.41"></path>
<path d="M2 12h2"></path>
<path d="M20 12h2"></path>
<path d="m6.34 17.66-1.41 1.41"></path>
<path d="m19.07 4.93-1.41 1.41"></path>
</g>
</svg>
<svg
aria-label="moon"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
>
<g
stroke-linejoin="round"
stroke-linecap="round"
stroke-width="2"
fill="none"
stroke="currentColor"
>
<path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"></path>
</g>
</svg>
</label>
<Show when={isAvatar}>
<details class="dropdown dropdown-end">
<summary class="avatar">
<img src={avatarSvg} alt="" class="w-13 rounded-xl" />
</summary>
<ul class="menu dropdown-content bg-base-100 rounded-box z-1 w-16 space-y-1 p-2 text-center">
<li></li>
<li>退</li>
</ul>
</details>
</Show>
</header>
);
};
export default Header;

View File

@@ -0,0 +1,17 @@
import { A } from '@solidjs/router';
const Main = () => {
return (
<main class="flex w-full flex-1 items-center bg-red-100">
<nav class="menu h-full w-25 space-y-2 border-r border-gray-300 bg-red-200/30 text-center text-lg shadow-lg shadow-gray-400">
<span class="text-2xl"></span>
<div class="divider"></div>
<A href="/"></A>
<A href="/auth/login"></A>
<A href="/auth/register"></A>
</nav>
</main>
);
};
export default Main;

View File

@@ -0,0 +1,5 @@
import Header from './Header';
import Main from './Main';
import Footer from './Footer';
export { Header, Main, Footer };

View File

@@ -0,0 +1,19 @@
import { Component, JSX } from 'solid-js';
interface CardProps {
title: string;
children?: JSX.Element;
}
const Card: Component<CardProps> = ({ title, children }) => {
return (
<div class="card h-100 w-150 items-center justify-center rounded-xl border border-pink-300 bg-red-200/30 shadow-xl shadow-red-300/50">
<span class="card-title text-3xl">{title}</span>
<div class="mt-10 flex-col justify-center space-y-5 text-center">
{children}
</div>
</div>
);
};
export default Card;

View File

@@ -0,0 +1,3 @@
import Card from './Card';
export { Card };

View File

@@ -1,5 +1,32 @@
/* @refresh reload */
import { render } from "solid-js/web";
import App from "./App";
import { render } from 'solid-js/web';
import { Router } from '@solidjs/router';
import { children, lazy } from 'solid-js';
render(() => <App />, document.getElementById("root") as HTMLElement);
const wrapper = document.getElementById('root');
if (!wrapper) {
throw new Error('Wrapper div not found');
}
const routes = [
{
path: '/',
component: lazy(() => import('~/App')),
},
{
path: '/auth',
children: [
{
path: '/login',
component: lazy(() => import('~/pages/Login')),
},
{
path: '/register',
component: lazy(() => import('~/pages/Register')),
},
],
},
];
render(() => <Router>{routes}</Router>, wrapper);

13
src/pages/Home.tsx Normal file
View File

@@ -0,0 +1,13 @@
import { Header, Main, Footer } from '~/components/layout';
const Home = () => {
return (
<div class="flex h-full w-full flex-col rounded-lg bg-gray-100">
<Header />
<Main />
<Footer />
</div>
);
};
export default Home;

39
src/pages/Login.tsx Normal file
View File

@@ -0,0 +1,39 @@
import { A } from '@solidjs/router';
import { Header, Footer } from '~/components/layout';
import { Card } from '~/components/ui';
const Login = () => {
return (
<div class="flex h-full w-full flex-col">
<Header isAvatar={false} />
<div class="flex w-full flex-1 items-center justify-center rounded-xl bg-red-100">
<Card title="登录界面">
<input
type="text"
class="input w-full rounded-xl"
placeholder="请输入用户名"
/>
<input
type="password"
class="input w-full"
placeholder="请输入密码"
/>
<div class="flex justify-center">
<button class="btn w-full"></button>
</div>
<div class="m-2">
<span class="text-sm font-bold">
<A href="/auth/register" class="text-blue-400">
</A>
</span>
</div>
</Card>
</div>
<Footer />
</div>
);
};
export default Login;

39
src/pages/Register.tsx Normal file
View File

@@ -0,0 +1,39 @@
import { A } from '@solidjs/router';
import { Header, Footer } from '~/components/layout';
import { Card } from '~/components/ui';
const Register = () => {
return (
<div class="flex h-full w-full flex-col">
<Header isAvatar={false} />
<div class="flex w-full flex-1 items-center justify-center rounded-xl bg-red-100">
<Card title="注册界面">
<input
type="text"
class="input w-full rounded-xl"
placeholder="请输入用户名"
/>
<input
type="password"
class="input w-full"
placeholder="请输入密码"
/>
<div class="flex justify-center">
<button class="btn w-full"></button>
</div>
<div class="m-2">
<span class="text-sm font-bold">
<A href="/auth/login" class="text-blue-400">
</A>
</span>
</div>
</Card>
</div>
<Footer />
</div>
);
};
export default Register;

5
src/pages/index.ts Normal file
View File

@@ -0,0 +1,5 @@
import Home from './Home';
import Login from './Login';
import Register from './Register';
export { Home, Login, Register };