diff --git a/apps/admin/src/view/XCode/index.tsx b/apps/admin/src/view/XCode/index.tsx index 98f5310..52902ca 100644 --- a/apps/admin/src/view/XCode/index.tsx +++ b/apps/admin/src/view/XCode/index.tsx @@ -21,7 +21,7 @@ export default function InviteCode() { const defaultColumns = [ { - title: "字符", + title: "神秘代码", dataIndex: "code", key: "code", filters: [], diff --git a/apps/server/src/controller/user.controller.ts b/apps/server/src/controller/user.controller.ts index 830cbc0..5bb112a 100644 --- a/apps/server/src/controller/user.controller.ts +++ b/apps/server/src/controller/user.controller.ts @@ -1,4 +1,4 @@ -import { Body, Controller, Inject, Post } from '@midwayjs/core'; +import { Body, Controller, Get, Inject, Post } from '@midwayjs/core'; import { Context } from '@midwayjs/koa'; import { BizCode } from '../biz/code'; import { @@ -10,7 +10,7 @@ import { import { UserAdminAuthDTO, UserWebAuthDTO } from '../dto/user.dto'; import { XCodeService } from '../service/xcode.service'; import { UserService } from '../service/user.service'; -import { createToken, md5 } from '../util/encrypt'; +import { createToken, decodeToken, md5 } from '../util/encrypt'; @Controller('/user') export class UserController { @@ -94,4 +94,16 @@ export class UserController { return { code: BizCode.ERROR, msg: '用户名密码错误' }; } } + + @Get('/web/state') + async() { + try { + const token = this.ctx.cookies.get(webSign); + const user = decodeToken(token); + return { code: BizCode.OK, data: user }; + } catch (error) { + this.ctx.logger.error(error); + return { code: BizCode.ERROR, msg: '[error] /web/state error' }; + } + } } diff --git a/apps/web/src/api/index.ts b/apps/web/src/api/index.ts index 5148dc8..93ab0ae 100644 --- a/apps/web/src/api/index.ts +++ b/apps/web/src/api/index.ts @@ -8,3 +8,5 @@ export const getChapterGuideById = (course_id: string) => export const userLogin = (p: ILoginRequest) => R.post("/api/user/web/auth", { ...p }); + +export const userState = () => R.get("/api/user/web/state"); diff --git a/apps/web/src/components/Nav/index.tsx b/apps/web/src/components/Nav/index.tsx index 627bf79..cddd448 100644 --- a/apps/web/src/components/Nav/index.tsx +++ b/apps/web/src/components/Nav/index.tsx @@ -2,10 +2,12 @@ import "./index.less"; import { useNavigate } from "react-router-dom"; import { menuRouters } from "../../router"; import { Input } from "@arco-design/web-react"; -const InputSearch = Input.Search; +import { useUserStore } from "../../store/user.store"; function Nav() { const navigate = useNavigate(); + const user = useUserStore((s: any) => s.user); + const exit = useUserStore((s: any) => s.userExit); return (
@@ -31,10 +33,16 @@ function Nav() { ) )} -
- navigate("/login")}>登录 + {!user ? ( + navigate("/login")}>登录 + ) : ( +
+ {user.user_login} + exit()}>退出 +
+ )}
diff --git a/apps/web/src/router/Guard.tsx b/apps/web/src/router/Guard.tsx index 079dfdb..648ef73 100644 --- a/apps/web/src/router/Guard.tsx +++ b/apps/web/src/router/Guard.tsx @@ -2,6 +2,7 @@ import { Button, Result } from "@arco-design/web-react"; import { useEffect } from "react"; import { useLocation, useNavigate } from "react-router-dom"; import Cookies from "js-cookie"; +import { useUserStore } from "../store/user.store"; interface IGuardProps { children: JSX.Element; @@ -11,6 +12,8 @@ const needAuthList = ["course/detail"]; export const Guard = (props: IGuardProps) => { const navigate = useNavigate(); + const user = useUserStore((s: any) => s.user); + const fetchUser = useUserStore((s: any) => s.fetchUser); const Result403 = (
@@ -31,7 +34,9 @@ export const Guard = (props: IGuardProps) => { const needAuth = needAuthList.some((p) => location.pathname.indexOf(p) > -1); useEffect(() => { + console.log(user); console.log("location.pathname changed 拦截", location.pathname); + if (!user) fetchUser(); }, [location.pathname]); if (!sign && needAuth) return Result403; diff --git a/apps/web/src/store/user.store.ts b/apps/web/src/store/user.store.ts new file mode 100644 index 0000000..53ad76a --- /dev/null +++ b/apps/web/src/store/user.store.ts @@ -0,0 +1,25 @@ +import { create } from "zustand"; +import Cookie from "js-cookie"; +import { userState } from "../api"; +import { Message } from "@arco-design/web-react"; + +export const useUserStore = create((set) => { + return { + user: null, + setUser: (user: any) => set({ user }), + fetchUser: async () => { + const sign = Cookie.get("_sign_web"); + if (!sign) return set({ user: null }); + userState().then((res: any) => { + const { code, data } = res; + if (code === 10000) set({ user: data }); + }); + }, + userExit: () => { + set({ user: null }); + Cookie.remove("_sign_web"); + Cookie.remove("_sign_web.sig"); + Message.success("拜拜~"); + }, + }; +}); diff --git a/apps/web/src/view/CourseDetail/components/DPlayer/index.tsx b/apps/web/src/view/CourseDetail/components/DPlayer/index.tsx index e018612..cac06d9 100644 --- a/apps/web/src/view/CourseDetail/components/DPlayer/index.tsx +++ b/apps/web/src/view/CourseDetail/components/DPlayer/index.tsx @@ -11,10 +11,11 @@ interface IProps { function Player(props: IProps) { const playerRef = useRef(); + const instanceRef = useRef(); useEffect(() => { if (props.video) { - new DPlayer({ + instanceRef.current = new DPlayer({ container: playerRef.current, video: { ...props.video, type: "hls" }, preload: "auto", @@ -25,6 +26,9 @@ function Player(props: IProps) { }, }); } + return () => { + instanceRef.current.destroy(); + }; }, [props.video]); return
; diff --git a/apps/web/src/view/Login/index.tsx b/apps/web/src/view/Login/index.tsx index 8d23e99..0d5fc57 100644 --- a/apps/web/src/view/Login/index.tsx +++ b/apps/web/src/view/Login/index.tsx @@ -3,6 +3,7 @@ import { userLogin } from "../../api"; import { Message, Button } from "@arco-design/web-react"; import "./index.less"; import { useNavigate } from "react-router-dom"; +import { useUserStore } from "../../store/user.store"; const defaultForm = { user_login: "", @@ -17,6 +18,7 @@ export function Login() { let [countdown, setCountdown] = useState(DURATION); const timer = useRef(); const navigate = useNavigate(); + const setUser = useUserStore((s: any) => s.setUser); const onClickSmsBtn = () => { setTimeout(() => { @@ -31,7 +33,7 @@ export function Login() { if (code === 10000) { Message.success(msg); navigate(-1); - console.log(data); + setUser(data); } if (code === 20000) Message.error(msg); });