From 3654746f6a874f54c2a5b14d0857320a811432c8 Mon Sep 17 00:00:00 2001 From: abearxiong Date: Thu, 25 Dec 2025 17:28:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=9B=B8=E5=85=B3=E9=85=8D=E7=BD=AE=E5=92=8C?= =?UTF-8?q?=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astro.config.mjs | 13 ++- package.json | 4 +- src/apps/config/firstLogin.tsx | 164 +++++++++++++++++++++++++++++++++ src/apps/config/store.ts | 108 ++++++++++++++++++++++ src/apps/nav/store.ts | 7 ++ src/assets/user-name-bg.jpg | Bin 0 -> 41223 bytes src/modules/basename.ts | 11 ++- src/pages/first.astro | 10 ++ 8 files changed, 307 insertions(+), 10 deletions(-) create mode 100644 src/apps/config/firstLogin.tsx create mode 100644 src/apps/config/store.ts create mode 100644 src/assets/user-name-bg.jpg create mode 100644 src/pages/first.astro diff --git a/astro.config.mjs b/astro.config.mjs index e03e766..d2a6226 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -7,12 +7,10 @@ import pkgs from './package.json'; import tailwindcss from '@tailwindcss/vite'; const isDev = process.env.NODE_ENV === 'development'; -let target = process.env.VITE_API_URL || 'http://localhost:51015'; +let target = process.env.VITE_API_URL || 'http://localhost:51515'; const apiProxy = { target: target, changeOrigin: true, ws: true, rewriteWsOrigin: true, secure: false, cookieDomainRewrite: 'localhost' }; let proxy = { - '/root/': { - target: `${target}/root/`, - }, + '/root/': apiProxy, '/api': apiProxy, '/client': apiProxy, }; @@ -25,14 +23,15 @@ export default defineConfig({ react(), // // sitemap(), // sitemap must be site has a domain ], - + server: { + port: 7008, + }, vite: { plugins: [tailwindcss()], define: { - basename: JSON.stringify(basename || ''), + BASE_NAME: JSON.stringify(basename || ''), }, server: { - port: 7008, host: '0.0.0.0', allowedHosts: true, proxy, diff --git a/package.json b/package.json index 8df293d..53a8d8f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kevisual/kevisual-home", - "version": "0.0.7", + "version": "0.0.8", "description": "", "main": "index.js", "basename": "/root/home", @@ -10,7 +10,7 @@ "preview": "astro preview", "ui": "pnpm dlx shadcn@latest add ", "prepub": "pnpm run build", - "pub": "envision deploy ./dist -k home -v 0.0.7 -u -y yes" + "pub": "envision deploy ./dist -k home -v 0.0.8 -u -y yes" }, "keywords": [], "author": "abearxiong (https://www.xiongxiao.me)", diff --git a/src/apps/config/firstLogin.tsx b/src/apps/config/firstLogin.tsx new file mode 100644 index 0000000..26957c5 --- /dev/null +++ b/src/apps/config/firstLogin.tsx @@ -0,0 +1,164 @@ +import { useEffect, useState } from "react"; +import { AuthProvider } from "../auth"; +import { useFirstStore } from "./store"; +// @ts-ignore +import UserNameBg from '../../assets/user-name-bg.jpg' +import { ToastContainer } from "react-toastify"; +console.log(UserNameBg); +const src = UserNameBg.src; + +// 炫光边框卡片组件 - 黑白色系 +const GlowingCard = ({ children, className = "" }: { children: React.ReactNode; className?: string }) => { + return ( +
+ {/* 炫光边框 - 外层发光(黑白色系) */} +
+
+
+ + {/* 边框渐变层(半透明白色) */} +
+ + {/* 内容层 - 更透明 */} +
+ {children} +
+
+ ); +}; +export const App = () => { + const firstStore = useFirstStore(); + const [username, setUsername] = useState(""); + const [nickname, setNickname] = useState(""); + const [isLoading, setIsLoading] = useState(true); + + useEffect(() => { + firstStore.getMe().finally(() => setIsLoading(false)); + }, []); + + useEffect(() => { + if (firstStore.userInfo) { + setUsername(firstStore.userInfo.username); + setNickname(firstStore.userInfo.nickname); + } + }, [firstStore.userInfo]); + + const canChange = firstStore.userInfo?.canChangeUsername ?? false; + + const handleSubmit = async () => { + // TODO: 实现更新用户名和昵称的逻辑 + // console.log("Update username to:", username, "nickname to:", nickname); + const res = await firstStore.updateUserInfo({ + username, + nickname, + }); + + }; + + if (isLoading) { + return ( +
+ {/* 背景图层 */} +
+ {/* 模糊和遮罩层 */} +
+ {/* 内容层 */} +
+
加载中...
+
+
+ ); + } + + return ( +
+ {/* 背景图层 */} +
+ {/* 模糊和遮罩层 */} +
+ + {/* 内容层 */} +
+
+ {/* 头像 */} +
+
+
+ {firstStore.userInfo?.nickname +
+
+ + {/* 用户信息卡片 - 炫光边框效果 */} + +

+ {nickname || firstStore.userInfo?.username} +

+

+ {'只有第一次可以修改用户名哦~'} +

+ + + {/* 用户名输入表单 */} +
+
+ + setNickname(e.target.value)} + disabled={!canChange} + className="w-full px-5 py-3 rounded-xl border-2 focus:outline-none focus:ring-2 focus:ring-white/50 focus:border-white/50 backdrop-blur-sm bg-white/5 text-white placeholder-white/40 border-white/20 disabled:bg-white/5 disabled:cursor-not-allowed disabled:border-white/10 disabled:text-white/40 transition-all duration-200" + placeholder="输入昵称" + /> +
+ +
+ + setUsername(e.target.value)} + disabled={!canChange} + className="w-full px-5 py-3 rounded-xl border-2 focus:outline-none focus:ring-2 focus:ring-white/50 focus:border-white/50 backdrop-blur-sm bg-white/5 text-white placeholder-white/40 border-white/20 disabled:bg-white/5 disabled:cursor-not-allowed disabled:border-white/10 disabled:text-white/40 transition-all duration-200" + placeholder="输入用户名" + /> +
+ + +
+
+
+
+
+ ); +}; + +export const AppProvider = () => { + return + + + ; +} \ No newline at end of file diff --git a/src/apps/config/store.ts b/src/apps/config/store.ts new file mode 100644 index 0000000..357d240 --- /dev/null +++ b/src/apps/config/store.ts @@ -0,0 +1,108 @@ +import { create } from 'zustand'; +import { queryLogin } from '@/modules/query'; +import { toast } from 'react-toastify'; + +type UserInfo = { + avatar: string | null; + canChangeUsername: boolean; + description: string; + id: string; + needChangePassword: boolean; + nickname: string; + orgs: string[]; + type: string; + username: string; +} +interface FirstState { + userInfo?: UserInfo; + getMe(): Promise; + getAvatar(): string; + updateUserInfo: (opts?: { username: string; nickname: string }) => Promise; +} + +export const useFirstStore = create((set, get) => ({ + userInfo: undefined, + getMe: async () => { + const res = await queryLogin.getMe(); + console.log('User info:', res); + set({ userInfo: res.data }); + }, + getAvatar: () => { + const { userInfo } = get(); + + if (!userInfo) { + return ''; + } + + // 如果已有 avatar,直接返回 + if (userInfo.avatar) { + return userInfo.avatar; + } + + // 使用 nickname 或 username 的第一个字符 + const firstChar = (userInfo.nickname || userInfo.username || 'U') + .trim() + .charAt(0) + .toUpperCase(); + + // 根据用户名生成稳定的颜色 + const stringToColor = (str: string): string => { + let hash = 0; + for (let i = 0; i < str.length; i++) { + hash = str.charCodeAt(i) + ((hash << 5) - hash); + } + const hue = Math.abs(hash % 360); + return `hsl(${hue}, 65%, 55%)`; + }; + + const backgroundColor = stringToColor(userInfo.username + userInfo.id); + + // 创建 SVG 头像 + const svg = ` + + + ${firstChar} + + `; + + // 转换为 data URL(现代方法,不使用已弃用的 unescape) + const svgBase64 = btoa( + encodeURIComponent(svg) + .replace(/%([0-9A-F]{2})/g, (_, p1) => + String.fromCharCode(parseInt(p1, 16)) + ) + ); + return `data:image/svg+xml;base64,${svgBase64}`; + }, + updateUserInfo: async (opts?: { username: string; nickname: string }) => { + if (!opts) return; + const newUsername = opts.username; + const newNickname = opts.nickname; + const update = { + username: newUsername, + nickname: newNickname + } + const res = await queryLogin.post({ + path: 'user', + key: 'updateSelf', + data: update, + }) + if (res.code === 200) { + const currentInfo = get().userInfo; + if (currentInfo) { + set({ + userInfo: { + ...currentInfo, + username: newUsername, + nickname: newNickname + } + }); + toast.success('更新用户信息成功, 请手动关闭页面'); + } else { + toast.error(res.message || '更新用户信息失败'); + } + } + } +})); diff --git a/src/apps/nav/store.ts b/src/apps/nav/store.ts index 9eebadc..86a9bdf 100644 --- a/src/apps/nav/store.ts +++ b/src/apps/nav/store.ts @@ -1,3 +1,4 @@ +import { basename, wrapBasename } from '@/modules/basename'; import { queryLogin } from '@/modules/query'; import { create } from 'zustand'; @@ -10,6 +11,7 @@ interface UserState { orgs?: string[]; type?: string; username?: string; + canChangeUsername?: boolean; } | null; open: boolean; setOpen: (open: boolean) => void; @@ -46,6 +48,11 @@ export const useUserStore = create((set, get) => ({ console.log('获取到的用户信息:', res); if (res.code === 200) { set({ user: res.data || null }); + const canChangeUsername = res.data?.canChangeUsername ?? false; + if (canChangeUsername) { + // 打开修改用户名的页面 + window.open(wrapBasename('/first'), '_blank'); + } } }, init: () => { diff --git a/src/assets/user-name-bg.jpg b/src/assets/user-name-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..24574560be91b0ed7aeda5f7961f1e0a63ae170f GIT binary patch literal 41223 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 { + const hasEnd = path.endsWith('/') + if (basename) { + return `${basename}${path}` + (hasEnd ? '' : '/'); + } else { + return path; + } +} \ No newline at end of file diff --git a/src/pages/first.astro b/src/pages/first.astro new file mode 100644 index 0000000..ef559e0 --- /dev/null +++ b/src/pages/first.astro @@ -0,0 +1,10 @@ +--- +import Html from '@/components/html.astro'; +import { AppProvider } from '@/apps/config/firstLogin'; +--- + + +
+ +
+