Merge pull request #2 from PlayEdu/dev

Dev
This commit is contained in:
Teng 2023-04-20 17:38:22 +08:00 committed by GitHub
commit 8023ce2a69
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 125 additions and 63 deletions

3
.dockerignore Normal file
View File

@ -0,0 +1,3 @@
/node_modules
/build
/dist

View File

@ -1,5 +1,13 @@
FROM node:lts-slim as builder
WORKDIR /app
COPY . /app
RUN yarn config set registry https://registry.npm.taobao.org && yarn && yarn build
FROM nginx:1.23.4-alpine-slim
COPY dist /usr/share/nginx/html
COPY --from=builder /app/dist /usr/share/nginx/html
COPY docker/nginx.conf /etc/nginx/nginx.conf
COPY --from=builder /app/docker/nginx.conf /etc/nginx/nginx.conf

View File

@ -4,10 +4,6 @@ import { useLocation, useRoutes } from "react-router-dom";
import routes from "./routes";
import "./App.scss";
import LoadingPage from "./pages/loading";
import { user } from "./api/index";
import { getToken } from "./utils/index";
import { useDispatch } from "react-redux";
import { loginAction } from "./store/user/loginUserSlice";
const G_ID = import.meta.env.VITE_G_ID || "";
if (G_ID) {
@ -15,16 +11,8 @@ if (G_ID) {
}
const App = () => {
const dispatch = useDispatch();
const Views = () => useRoutes(routes);
if (getToken()) {
user.detail().then((res: any) => {
const data = res.data;
dispatch(loginAction(data));
});
}
const location = useLocation();
useEffect(() => {
if (!G_ID) {

13
src/AutoTop.ts Normal file
View File

@ -0,0 +1,13 @@
import React from "react";
import { useLayoutEffect } from "react";
import { useLocation } from "react-router-dom";
const AutoScorllTop: React.FC<{ children: any }> = ({ children }) => {
const location = useLocation();
useLayoutEffect(() => {
document.documentElement.scrollTo(0, 0);
}, [location.pathname]);
return children;
};
export default AutoScorllTop;

View File

@ -8,6 +8,12 @@ import {
logoutAction,
saveCurrentDepId,
} from "../../store/user/loginUserSlice";
import {
setDepKey,
setDepName,
getDepName,
clearToken,
} from "../../utils/index";
import { ChangePasswordModel } from "../change-password";
import { UserInfoModel } from "../user-info";
import { ExclamationCircleFilled } from "@ant-design/icons";
@ -32,7 +38,7 @@ export const Header: React.FC = () => {
useEffect(() => {
if (departments.length > 0) {
setCurrentDepartment(departments[0].name);
setCurrentDepartment(getDepName() || departments[0].name);
const arr: any = [
{
key: "1",
@ -67,6 +73,7 @@ export const Header: React.FC = () => {
cancelText: "取消",
onOk() {
dispatch(logoutAction());
clearToken();
navigate("/login");
},
onCancel() {
@ -129,6 +136,8 @@ export const Header: React.FC = () => {
onOk() {
setCurrentDepartment(name);
dispatch(saveCurrentDepId(Number(key)));
setDepKey(key);
setDepName(name);
const box = [...departments];
const arr: any = [
{

View File

@ -6,6 +6,7 @@ import { ConfigProvider } from "antd";
import zhCN from "antd/locale/zh_CN";
import App from "./App";
import "./index.scss"; //全局样式
import AutoScorllTop from "./AutoTop";
ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
<Provider store={store}>
@ -14,7 +15,9 @@ ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
theme={{ token: { colorPrimary: "#ff4d4f" } }}
>
<BrowserRouter>
<AutoScorllTop>
<App />
</AutoScorllTop>
</BrowserRouter>
</ConfigProvider>
</Provider>

View File

@ -12,6 +12,7 @@ import iconRoute from "../../assets/images/commen/icon-route.png";
import { studyTimeFormat } from "../../utils/index";
const IndexPage = () => {
document.title = "首页";
const systemConfig = useSelector((state: any) => state.systemConfig.value);
const [loading, setLoading] = useState<boolean>(false);
const [tabKey, setTabKey] = useState(0);

View File

@ -1,17 +1,48 @@
import { useDispatch } from "react-redux";
import { Outlet } from "react-router-dom";
// import styles from "./index.module.scss";
import { saveConfigAction } from "../../store/system/systemConfigSlice";
import {
SystemConfigStoreInterface,
saveConfigAction,
} from "../../store/system/systemConfigSlice";
import { loginAction } from "../../store/user/loginUserSlice";
import { Header, NoHeader, Footer } from "../../compenents";
import { useLocation } from "react-router-dom";
interface Props {
config: Map<string, string>;
loginData?: any;
configData?: any;
}
export const InitPage = (props: Props) => {
const dispatch = useDispatch();
dispatch(saveConfigAction(props.config));
if (props.loginData) {
dispatch(loginAction(props.loginData));
}
if (props.configData) {
let config: SystemConfigStoreInterface = {
//系统配置
systemApiUrl: props.configData["system-api-url"],
systemH5Url: props.configData["system-h5-url"],
systemLogo: props.configData["system-logo"],
systemName: props.configData["system-name"],
systemPcUrl: props.configData["system-pc-url"],
pcIndexFooterMsg: props.configData["system-pc-index-footer-msg"],
//播放器配置
playerPoster: props.configData["player-poster"],
playerIsEnabledBulletSecret:
props.configData["player-is-enabled-bullet-secret"] &&
props.configData["player-is-enabled-bullet-secret"] === "1"
? true
: false,
playerBulletSecretText: props.configData["player-bullet-secret-text"],
playerBulletSecretColor: props.configData["player-bullet-secret-color"],
playerBulletSecretOpacity:
props.configData["player-bullet-secret-opacity"],
};
dispatch(saveConfigAction(config));
}
const pathname = useLocation().pathname;
return (

View File

@ -8,6 +8,7 @@ import { useNavigate } from "react-router-dom";
import { useSelector } from "react-redux";
const LatestLearnPage = () => {
document.title = "最近学习";
const navigate = useNavigate();
const systemConfig = useSelector((state: any) => state.systemConfig.value);
const [loading, setLoading] = useState<boolean>(false);

View File

@ -1,57 +1,38 @@
import { lazy } from "react";
import { RouteObject } from "react-router-dom";
import { system } from "../api";
import { system, user } from "../api";
import { SystemConfigStoreInterface } from "../store/system/systemConfigSlice";
import { getToken } from "../utils";
import { InitPage } from "../pages/init";
import CoursePage from "../pages/course";
import IndexPage from "../pages/index";
import LatestLearnPage from "../pages/latest-learn";
import LoginPage from "../pages/login";
let config: SystemConfigStoreInterface = {
systemApiUrl: "",
systemPcUrl: "",
systemH5Url: "",
systemLogo: "",
systemName: "",
pcIndexFooterMsg: "",
playerPoster: "",
playerIsEnabledBulletSecret: false,
playerBulletSecretText: "",
playerBulletSecretColor: "",
playerBulletSecretOpacity: "",
};
const Init = lazy(async () => {
return new Promise<any>((resolve) => {
system.config().then((res: any) => {
//系统配置
config.systemApiUrl = res.data["system-api-url"];
config.systemH5Url = res.data["system-h5-url"];
config.systemLogo = res.data["system-logo"];
config.systemName = res.data["system-name"];
config.systemPcUrl = res.data["system-pc-url"];
config.pcIndexFooterMsg = res.data["system-pc-index-footer-msg"];
//播放器配置
config.playerPoster = res.data["player-poster"];
config.playerIsEnabledBulletSecret =
res.data["player-is-enabled-bullet-secret"] &&
res.data["player-is-enabled-bullet-secret"] === "1"
? true
: false;
config.playerBulletSecretText = res.data["player-bullet-secret-text"];
config.playerBulletSecretColor = res.data["player-bullet-secret-color"];
config.playerBulletSecretOpacity =
res.data["player-bullet-secret-opacity"];
let RootPage: any = null;
if (getToken()) {
RootPage = lazy(async () => {
return new Promise<any>(async (resolve) => {
try {
let configRes: any = await system.config();
let userRes: any = await user.detail();
resolve({
default: InitPage,
default: (
<InitPage configData={configRes.data} loginData={userRes.data} />
),
});
} catch (e) {
console.error("系统初始化失败", e);
}
});
});
});
});
} else {
if (window.location.pathname !== "/login") {
window.location.href = "/login";
}
RootPage = <InitPage />;
}
// 懒加载
// const LoginPage = lazy(() => import("../pages/login"));
@ -62,7 +43,7 @@ const Init = lazy(async () => {
const routes: RouteObject[] = [
{
path: "/",
element: <Init config={config} />,
element: RootPage,
children: [
{
path: "/",

View File

@ -1,4 +1,5 @@
import { createSlice } from "@reduxjs/toolkit";
import { getDepKey } from "../../utils/index";
type UserStoreInterface = {
user: null;
@ -10,7 +11,7 @@ type UserStoreInterface = {
let defaultValue: UserStoreInterface = {
user: null,
departments: [],
currentDepId: 0,
currentDepId: Number(getDepKey()) || 0,
isLogin: false,
};

View File

@ -72,3 +72,26 @@ export function inStrArray(array: string[], value: string): boolean {
}
return false;
}
export function getDepKey(): string {
return window.localStorage.getItem("playedu-frontend-depatmentKey") || "";
}
export function setDepKey(token: string) {
window.localStorage.setItem("playedu-frontend-depatmentKey", token);
}
export function clearDepKey() {
window.localStorage.removeItem("playedu-frontend-depatmentKey");
}
export function getDepName(): string {
return window.localStorage.getItem("playedu-frontend-depatmentName") || "";
}
export function setDepName(token: string) {
window.localStorage.setItem("playedu-frontend-depatmentName", token);
}
export function clearDepName() {
window.localStorage.removeItem("playedu-frontend-depatmentName");
}