ai-course/PlayEdu前端开发手册/1RNcPYW63q6FKAbxMHSwcL/PlayEdu前端开发手册.html
2025-11-18 13:32:46 +08:00

604 lines
125 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-Hans-CN"><head><meta charset="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=Edge"/><link rel="stylesheet" type="text/css" href="css/modern-norm.min.css"/><link rel="stylesheet" type="text/css" href="css/prism.min.css"/><link rel="stylesheet" type="text/css" href="css/katex.min.css"/><link rel="stylesheet" type="text/css" href="css/wolai.css"/><title>PlayEdu前端开发手册 - wolai 笔记</title><link rel="shortcut icon" href="data:image/svg+xml,%3Csvg xmlns=&apos;http://www.w3.org/2000/svg&apos; viewBox=&apos;0 0 800 800&apos;%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill:%23fff;%7D%3C/style%3E%3C/defs%3E%3Cg%3E%3Cpath class=&apos;cls-1&apos; d=&apos;M610.08,0c66,0,90,6.88,114.13,19.79a134.62,134.62,0,0,1,56,56l2.28,4.4C793.93,103,800,127.88,800,189.92V610.08l-.08,11.56c-.78,57.38-7.58,79.89-19.71,102.57a134.62,134.62,0,0,1-56,56l-4.4,2.28C697,793.93,672.12,800,610.08,800H189.92l-11.56-.08c-57.38-.78-79.89-7.58-102.57-19.71a134.62,134.62,0,0,1-56-56l-2.28-4.4C6.44,697.75.4,673.72,0,616L0,189.92c0-66,6.88-90,19.79-114.13a134.62,134.62,0,0,1,56-56l4.4-2.28C102.25,6.44,126.28.4,184,0Z&apos;/%3E%3Cpath d=&apos;M610.08,0c66,0,90,6.88,114.13,19.79a134.62,134.62,0,0,1,56,56l2.28,4.4C793.93,103,800,127.88,800,189.92V610.08l-.08,11.56c-.78,57.38-7.58,79.89-19.71,102.57a134.62,134.62,0,0,1-56,56l-4.4,2.28C697,793.93,672.12,800,610.08,800H189.92l-11.56-.08c-57.38-.78-79.89-7.58-102.57-19.71a134.62,134.62,0,0,1-56-56l-2.28-4.4C6.44,697.75.4,673.72,0,616L0,189.92c0-66,6.88-90,19.79-114.13a134.62,134.62,0,0,1,56-56l4.4-2.28C102.25,6.44,126.28.4,184,0Zm4.72,88.9H185.2L172.42,89c-32.78.62-43.68,3.24-54.71,9.14a45.84,45.84,0,0,0-19.54,19.54c-6.61,12.36-9.11,24.55-9.27,67.49V614.8L89,627.58c.62,32.78,3.24,43.68,9.14,54.71a45.84,45.84,0,0,0,19.54,19.54c12.36,6.61,24.55,9.11,67.49,9.27H610.08c46.79,0,59.41-2.44,72.21-9.28a45.84,45.84,0,0,0,19.54-19.54c6.61-12.36,9.11-24.55,9.27-67.49V189.92c0-46.79-2.44-59.41-9.28-72.21a45.84,45.84,0,0,0-19.54-19.54C669.93,91.56,657.74,89.06,614.8,88.9ZM233.33,493.33A73.34,73.34,0,1,1,160,566.67,73.35,73.35,0,0,1,233.33,493.33Z&apos;/%3E%3C/g%3E%3C/svg%3E"></link></head><body><header><div class="image"></div><div class="title"><div class="banner"><div data-symbol="🍕" class="icon"></div></div><div data-title="PlayEdu前端开发手册" class="main-title"></div></div></header><article><h2 id="6dL6hxqwRuqj4VPB46E8A8" class="wolai-block"><span class="inline-wrap">一、背景</span></h2><div id="7U5bjRJSpz9EjtbzTJRyfm" class="wolai-block wolai-text"><div><span class="inline-wrap">Playedu<span class="jill"></span>的前端是基于<span class="jill"></span>React18 + TypeScript<span class="jill"></span>开发。主要包括PC<span class="jill"></span>学员界面、H5<span class="jill"></span>学员界面、后台管理界面三个界面程序。它们都是相同的技术架构,因此只要您懂得其中一个项目的开发,那么另外<span class="jill"></span>2<span class="jill"></span>个项目可以无缝上手。</span></div></div><h2 id="obT3CAJsK2AoYfC3DDB7na" class="wolai-block"><span class="inline-wrap">二、开发运行快速上手</span></h2><h3 id="pKcvzLKYU1aVQkgs4FekT" class="wolai-block"><span class="inline-wrap"><b>2.1</b></span><span class="inline-wrap">环境要求</span></h3><ul class="wolai-block"><li id="9sWMxKpcTdmHXVpSCj2D2j"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">操作系统Window,Mac,Linux<span class="jill"></span>均可以</span></li><li id="kp5mY8V3Er4ujNwsVSJWoy"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">nodejs ≥ v18</span></li><li id="42ASedz1KNjhCTYvQHUW29"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">pnpm</span><span class="inline-wrap"> ≥ v 8.15.4</span></li></ul><h3 id="n6rtUn8mV6CqGwQXnMNWA3" class="wolai-block"><span class="inline-wrap">2.2 运行系统</span></h3><blockquote id="4LDb7Yc9mCLQYajnxyCVgU" class="wolai-block"><span class="inline-wrap">下面我们将以后台管理界面为例,给您演示如何将系统跑起来。</span></blockquote><h4 id="gxPyu4Qdt5ir9q6XjpGy6" class="wolai-block"><span class="inline-wrap">2.2.1 安装依赖</span></h4><div id="ffksSLEAeTSZBzb3KeDyNH" class="wolai-block wolai-text"><div><span class="inline-wrap">首先,进入到后台管理界面程序的根目录,然后执下面命令安装依赖:</span></div></div><code-block id="d2N9JvR7k8dLyq6XZMtmAf" class="wolai-block"><div class="wolai-pre"><div data-lang="Bash" class="marker"></div><pre><span class="token function">pnpm</span> <span class="token function">install</span></pre></div></code-block><h4 id="tywgSUn9fZk59Xs56aXQFL" class="wolai-block"><span class="inline-wrap">2.2.2 配置文件</span></h4><div id="jbzS7byRitibkgB9peWwSC" class="wolai-block wolai-text"><div><span class="inline-wrap">依赖安装完成之后,执行下面命令创建本地开发配置文件:</span></div></div><code-block id="3u5hCKCKoeZGYvkarFdvck" class="wolai-block"><div class="wolai-pre"><div data-lang="Bash" class="marker"></div><pre><span class="token function">cp</span> .env.example .env.local</pre></div></code-block><blockquote id="uBi2E7b6rj3hPxwD2RcXUH" class="wolai-block"><span class="inline-wrap">注意,上述命令仅适用于<span class="jill"></span>mac<span class="jill"></span>或者<span class="jill"></span>linux<span class="jill"></span>系统,如果您是<span class="jill"></span>window<span class="jill"></span>系统的话,这一步请手动复制 </span><span class="inline-wrap"><code>.env.example</code></span><span class="inline-wrap"> 文件并重命名为</span><span class="inline-wrap"><code>.env.local</code></span></blockquote><div id="5BoyodfFfdwb5bvL24ntTq" class="wolai-block wolai-text"><div><span class="inline-wrap">修改</span><span class="inline-wrap"><code>.env.local</code></span><span class="inline-wrap">中的</span><span class="inline-wrap"><code>VITE_APP_URL</code></span><span class="inline-wrap">的值为您的<span class="jill"></span>PlayEdu API<span class="jill"></span>服务的地址,示例如下:</span></div></div><code-block id="23EUCX8CLEQmL1J3szgufQ" class="wolai-block"><div class="wolai-pre"><div data-lang="Bash" class="marker"></div><pre><span class="token assign-left variable">VITE_APP_URL</span><span class="token operator">=</span>http://127.0.0.1:9898</pre></div></code-block><h4 id="72xPWVyZy28swT8pbQuAdL" class="wolai-block"><span class="inline-wrap">2.2.3 程序跑起来</span></h4><div id="vyWwmALj9Hg9ozcYNoicCH" class="wolai-block wolai-text"><div><span class="inline-wrap">执行下面命令将程序跑起来:</span></div></div><code-block id="g5rkHeMbBN6Bk9SjpYEoBZ" class="wolai-block"><div class="wolai-pre"><div data-lang="Bash" class="marker"></div><pre><span class="token function">pnpm</span> dev</pre></div></code-block><div id="adcDnexasgi3GB9VQHE31B" class="wolai-block wolai-text"><div><span class="inline-wrap">跑起来之后可以看到:</span></div></div><code-block id="6DXPZq6AiFWTFUNHcPoAHm" class="wolai-block"><div class="wolai-pre"><div data-lang="Bash" class="marker"></div><pre> VITE v4.4.9 ready <span class="token keyword">in</span> <span class="token number">515</span> ms
➜ Local: http://localhost:4000/
➜ Network: http://192.168.3.14:4000/
➜ Network: http://192.168.64.1:4000/
➜ press h to show <span class="token builtin class-name">help</span></pre></div></code-block><div id="7iCZcmhbrsrw7cKCDzn6q6" class="wolai-block wolai-text"><div><span class="inline-wrap">我们在浏览器就可以打开上述地址访问。</span></div></div><h2 id="gtb4G9ibPP9UwGHXam1gxp" class="wolai-block"><span class="inline-wrap">三、生产部署快速上手</span></h2><div id="j3n2yiR793NfbDs7sYGdLZ" class="wolai-block wolai-text"><div><span class="inline-wrap">当我们程序二开完成之后,需要将程序部署更新到生产服务器,在部署之前,我们需要编译程序。下面将是编译的流程。</span></div></div><h4 id="r9GRXfMK7JYarYYGyv2dyf" class="wolai-block"><span class="inline-wrap">3.1 生产环境配置文件</span></h4><div id="eNsbntA4aTfEn6zRLWyUFA" class="wolai-block wolai-text"><div><span class="inline-wrap">执行下面命令创建生产环境配置文件:</span></div></div><code-block id="gewammrcLeoYCt63VQzmF7" class="wolai-block"><div class="wolai-pre"><div data-lang="Bash" class="marker"></div><pre><span class="token function">cp</span> .env.example .env.production</pre></div></code-block><blockquote id="qjwi8eZDDXM6LAS8abtSH3" class="wolai-block"><span class="inline-wrap">注意,上述命令仅适用于<span class="jill"></span>mac<span class="jill"></span>或者<span class="jill"></span>linux<span class="jill"></span>系统,如果您是<span class="jill"></span>window<span class="jill"></span>系统的话,这一步请手动复制 </span><span class="inline-wrap"><code>.env.example</code></span><span class="inline-wrap"> 文件并重命名为</span><span class="inline-wrap"><code>.env.production</code></span></blockquote><div id="p1BgiQtb4QssJGFt36ewDe" class="wolai-block wolai-text"><div><span class="inline-wrap">修改</span><span class="inline-wrap"><code>.env.production</code></span><span class="inline-wrap">中的</span><span class="inline-wrap"><code>VITE_APP_URL</code></span><span class="inline-wrap">的值为您的<span class="jill"></span>PlayEdu API<span class="jill"></span>服务生产环境的地址,示例如下:</span></div></div><code-block id="cN9rsQhAqLpptztcDHvCfc" class="wolai-block"><div class="wolai-pre"><div data-lang="Bash" class="marker"></div><pre><span class="token assign-left variable">VITE_APP_URL</span><span class="token operator">=</span>https://demo-api.playedu.xyz</pre></div></code-block><h4 id="cu6nwp2fxuXhm3czWTFrxj" class="wolai-block"><span class="inline-wrap">3.2 编译程序</span></h4><div id="fW1C9JghXnvf5SiczKvn4g" class="wolai-block wolai-text"><div><span class="inline-wrap">执行下面命令编译程序:</span></div></div><code-block id="uxEqMCzoXy3VnndXDjDkE2" class="wolai-block"><div class="wolai-pre"><div data-lang="Bash" class="marker"></div><pre><span class="token function">pnpm</span> build</pre></div></code-block><div id="dWaAfW8nbFPjsVcmBVqNjc" class="wolai-block wolai-text"><div><span class="inline-wrap">上述命令执行成功之后,可以看到类似下面的输出信息:</span></div></div><code-block id="eaHfihDsBdJd7EYqJ5H8Sq" class="wolai-block"><div class="wolai-pre"><div data-lang="Bash" class="marker"></div><pre>dist/assets/index-c61b50c7.js <span class="token number">100.60</span> kB │ gzip: <span class="token number">30.06</span> kB
dist/assets/xlsx-4f9172c7.js <span class="token number">424.92</span> kB │ gzip: <span class="token number">140.79</span> kB
dist/assets/index-e0333ef0.js <span class="token number">1,029</span>.09 kB │ gzip: <span class="token number">341.34</span> kB
dist/assets/index-3c2cf1a6.js <span class="token number">1,347</span>.42 kB │ gzip: <span class="token number">442.01</span> kB
<span class="token punctuation">(</span><span class="token operator">!</span><span class="token punctuation">)</span> Some chunks are larger than <span class="token number">500</span> kBs after minification. Consider:
- Using dynamic import<span class="token punctuation">(</span><span class="token punctuation">)</span> to code-split the application
- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/<span class="token comment">#output-manualchunks</span>
- Adjust chunk size limit <span class="token keyword">for</span> this warning via build.chunkSizeWarningLimit.
✓ built <span class="token keyword">in</span> <span class="token number">7</span>.46s
✨ Done <span class="token keyword">in</span> <span class="token number">14</span>.22s.</pre></div></code-block><div id="si8QS355iAHSybG6KroSt2" class="wolai-block wolai-text"><div><span class="inline-wrap">这就是编译完成了。编译后的程序文件在 </span><span class="inline-wrap"><code>dist</code></span><span class="inline-wrap"> 目录。到这里,我们就可以将 </span><span class="inline-wrap"><code>dist</code></span><span class="inline-wrap"> 目录的程序文件部署到生产环境服务器了。</span></div></div><h2 id="44PQ2XVYgfmBzk3AcW3tEU" class="wolai-block"><span class="inline-wrap">四、项目介绍</span></h2><h3 id="2PcXTpKDJfo2gtpWJteZSB" class="wolai-block"><span class="inline-wrap">4.1</span><span class="inline-wrap"><b>后台管理</b></span><span class="inline-wrap">界面</span></h3><h4 id="p1CxZtmzi2yFydWB4qt2hs" class="wolai-block"><span class="inline-wrap">4.1.1<span class="jill"></span>文件目录结构</span></h4><code-block id="vVY2V9EAzpui8gHa7x3zDs" class="wolai-block"><div class="wolai-pre"><div data-lang="Text" class="marker"></div><pre>playedu
├── public // 公共资源
│ └── js // 公共JS
│ └── template // 公共下载、导入模板
│ └── favicon.ico // 网站ICO
├── scripts // 脚本
├── src // 资源
│ └── api // 各页面API
│ └── internal // 全局API配置
│ └──... // 各模块API配置
│ └── compenents // 全局组件
│ └── assets // 全局外部资源
│ └── i18n // 国际化配置
│ └── cn.json // 简中语言JSON
│ └── config.ts // 国际化配置
│ └── tc.json // 繁中语言JSON
│ └── js // 通用JS
│ └── pages // 页面资源
│ └── cert // 证书模块
│ └── change-password // 修改密码模块
│ └── course // 线上课模块
│ └── dashboard // 主页模块
│ └── department // 部门模块
│ └── error // 错误模块
│ └── exam // 考试模块
│ └── papers // 试卷模块
│ └── questions // 试题模块
│ └── task // 考试任务模块
│ └── init // 初始化
│ └── layouts // 页面布局
│ └── loading // 公用loading模块
│ └── login // 登录模块
│ └── member // 学员模块
│ └── paper-show // 试卷阅览模块
│ └── resource // 资源模块
│ └── attachment // 课件模块
│ └── audio // 音频模块
│ └── courseware // 文档模块
│ └── images // 图片模块
│ └── resource-category // 分类模块
│ └── videos // 视频模块
│ └── study // 学习任务模块
│ └── system // 系统模块
│ └── administrator // 管理人员模块
│ └── adminlog // 管理日志模块
│ └── adminroles // 管理角色模块
│ └── config // 系统配置模块
│ └── teacher // 讲师模块
│ └── test // 测试页面(仅用于测试环境)
│ └── routes // 路由
│ └── store // 中间件及store
│ └── system // 系统store
│ └── user // 用户store
│ └── index.ts // store配置
│ └── types // 全局静态类型
│ └── utils // 工具类
│ └── playedu.d.ts // 全局类型
│ └── AutoTop.ts // 全局页面自动滚动到最上方
│ └── custom.d.ts // 全局css、less、scss配置
│ └── index.less // 全局样式
│ └── main.tsx // 主要模块
│ └── App.module.less // 系统样式
│ └── App.tsx // 系统模块
├── .env.example // Env配置模版
├── .env.local // Env配置
├── .env可用 // Env配置
├── vite.config.ts // VITE配置
├── ...
</pre></div></code-block><h4 id="v3CzFeKp7vztuCeDXXifwK" class="wolai-block"><span class="inline-wrap">4.1.2 依赖库
</span></h4><div id="9S5ZJbiz2DsLFjrvpvczA6" class="wolai-block wolai-simple-table"><table><tbody><tr><td style="width: 151px"><span class="inline-wrap">依赖库</span></td><td style="width: 259px"><span class="inline-wrap">地址</span></td><td style="width: 164px"><span class="inline-wrap">说明</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>antd</code></span></td><td style="width: 259px"><span class="inline-wrap"><a href="https://ant.design/"><span>https://ant.design</span></a></span></td><td style="width: 164px"><span class="inline-wrap">UI<span class="jill"></span>框架</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>axios</code></span></td><td style="width: 259px"><span class="inline-wrap"><a href="https://axios-http.com/docs/intro"><span>https://axios-http.com/docs/intro</span></a></span></td><td style="width: 164px"><span class="inline-wrap">HTTP<span class="jill"></span>请求库</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>echarts</code></span></td><td style="width: 259px"><span class="inline-wrap"><a href="https://echarts.apache.org/zh/index.html"><span>https://echarts.apache.org/zh/index.html</span></a></span></td><td style="width: 164px"><span class="inline-wrap">图表渲染库</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>i18next</code></span></td><td style="width: 259px"><span class="inline-wrap"><a href="https://www.i18next.com/"><span>https://www.i18next.com</span></a></span></td><td style="width: 164px"><span class="inline-wrap">国际化</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>moment</code></span></td><td style="width: 259px"><span class="inline-wrap"><a href="https://momentjs.cn/"><span>https://momentjs.cn</span></a></span></td><td style="width: 164px"><span class="inline-wrap">时间解析库</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>ahooks</code></span></td><td style="width: 259px"><span class="inline-wrap"><a href="https://ahooks.js.org/zh-CN/"><span>https://ahooks.js.org/zh-CN/</span></a></span></td><td style="width: 164px"><span class="inline-wrap">React Hooks<span class="jill"></span></span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>localforage</code></span></td><td style="width: 259px"><span class="inline-wrap"><a href="https://localforage.docschina.org/"><span>https://localforage.docschina.org</span></a></span></td><td style="width: 164px"><span class="inline-wrap">LocalStorage<span class="jill"></span>的封装</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>match-sorter</code></span></td><td style="width: 259px"><span class="inline-wrap"><a href="https://github.com/kentcdodds/match-sorter"><span>https://github.com/kentcdodds/match-sorter</span></a></span></td><td style="width: 164px"><span class="inline-wrap">数组处理库</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>react-router-dom</code></span></td><td style="width: 259px"><span class="inline-wrap"><a href="https://reactrouter.com/en/main"><span>https://reactrouter.com/en/main</span></a></span></td><td style="width: 164px"><span class="inline-wrap">路由库</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>redux</code></span></td><td style="width: 259px"><span class="inline-wrap"><a href="https://cn.redux.js.org/"><span>https://cn.redux.js.org</span></a></span></td><td style="width: 164px"><span class="inline-wrap">全局状态</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>sort-by</code></span></td><td style="width: 259px"><span class="inline-wrap"><a href="https://github.com/kvnneff/sort-by"><span>https://github.com/kvnneff/sort-by</span></a></span></td><td style="width: 164px"><span class="inline-wrap">数组加强库</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>xlsx</code></span></td><td style="width: 259px"><span class="inline-wrap"><a href="https://github.com/SheetJS/sheetjs"><span>https://github.com/SheetJS/sheetjs</span></a></span></td><td style="width: 164px"><span class="inline-wrap">Excel<span class="jill"></span>操作</span></td></tr></tbody></table></div><h4 id="5srFW2uiLSRYNpzTbRnGTK" class="wolai-block"><span class="inline-wrap">4.1.3 页面架构图</span></h4><div id="xvHTE19eA6cwchkyrSuD89" class="wolai-block"><figure class="wolai-center" style="width: 100%; flex-direction: column"><img src="media/image.png" style="width: 100%"/></figure></div><h4 id="5VJ7hU7drYNTZF1yrHUdDf" class="wolai-block"><span class="inline-wrap">4.1.4 全局状态</span></h4><h5 id="dXpRUpPGi2PyMiQNsqSQkv" class="wolai-block"><span class="inline-wrap">4.1.4.1 全局状态一、登录用户</span></h5><ul class="wolai-block"><li id="4f9YLEpgVPykz5U7bbP7cN"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">路径</span></li></ul><div id="qmKvWvetbBsd3Mi1L75ZQM" class="wolai-block wolai-text"><div><span class="inline-wrap"><code>src/store/user/loginUserSlice.ts</code></span></div></div><ul class="wolai-block"><li id="hrPkDAzbxTdTyeDhH92TUu"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">存储变量结构</span></li></ul><code-block id="4CMxhBiLhoYp9SUPKmREQ2" class="wolai-block"><div class="wolai-pre"><div data-lang="TypeScript" class="marker"></div><pre style="white-space: pre-wrap; word-break: break-all"><span class="token keyword">type</span> <span class="token class-name">UserInterface</span> <span class="token operator">=</span> <span class="token punctuation">{</span>
id<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span>
name<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
email<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">type</span> <span class="token class-name">UserStoreInterface</span> <span class="token operator">=</span> <span class="token punctuation">{</span>
user<span class="token operator">:</span> UserInterface <span class="token operator">|</span> <span class="token keyword">null</span><span class="token punctuation">;</span>
isLogin<span class="token operator">:</span> <span class="token builtin">boolean</span><span class="token punctuation">;</span>
permissions<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
uploadStatus<span class="token operator">:</span> <span class="token builtin">boolean</span><span class="token punctuation">;</span>
uploadCateIds<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span></pre></div></code-block><ul class="wolai-block"><li id="vCcqV5UdYaz6aixsye9LA6"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">demo<span class="jill"></span>一、读取信息</span></li></ul><code-block id="eEN7v1STDWtmnpWJHVaiX7" class="wolai-block"><div class="wolai-pre"><div data-lang="TypeScript" class="marker"></div><pre style="white-space: pre-wrap; word-break: break-all"><span class="token keyword">import</span> <span class="token punctuation">{</span> useSelector <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"react-redux"</span><span class="token punctuation">;</span>
<span class="token comment">// 读取登录用户信息</span>
<span class="token keyword">const</span> user <span class="token operator">=</span> <span class="token function">useSelector</span><span class="token punctuation">(</span><span class="token punctuation">(</span>state<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span> <span class="token operator">=></span> state<span class="token punctuation">.</span>loginUser<span class="token punctuation">.</span>value<span class="token punctuation">.</span>user<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 读取登录用户的关联权限</span>
<span class="token keyword">const</span> user <span class="token operator">=</span> <span class="token function">useSelector</span><span class="token punctuation">(</span><span class="token punctuation">(</span>state<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span> <span class="token operator">=></span> state<span class="token punctuation">.</span>loginUser<span class="token punctuation">.</span>value<span class="token punctuation">.</span>permissions<span class="token punctuation">)</span><span class="token punctuation">;</span>
</pre></div></code-block><ul class="wolai-block"><li id="9orkq9g2r7ZN138sxaMVF9"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">demo<span class="jill"></span>二、存储信息</span></li></ul><code-block id="2tD4sPh9Mdf83Dyru5AeAv" class="wolai-block"><div class="wolai-pre"><div data-lang="TypeScript" class="marker"></div><pre style="white-space: pre-wrap; word-break: break-all"><span class="token keyword">import</span> <span class="token punctuation">{</span> useDispatch <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"react-redux"</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> loginAction <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"./store/user/loginUserSlice"</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> dispatch <span class="token operator">=</span> <span class="token function">useDispatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 获取用户数据</span>
<span class="token keyword">let</span> res<span class="token operator">:</span> <span class="token builtin">any</span> <span class="token operator">=</span> <span class="token keyword">await</span> loginApi<span class="token punctuation">.</span><span class="token function">getUser</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 将用户数据存储到全局状态</span>
<span class="token function">dispatch</span><span class="token punctuation">(</span><span class="token function">loginAction</span><span class="token punctuation">(</span>res<span class="token punctuation">.</span>data<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</pre></div></code-block><h4 id="pb1w1fvkB1JH7ra2Hv2h9r" class="wolai-block"><span class="inline-wrap">4.1.4.2 全局状态二、全局配置</span></h4><ul class="wolai-block"><li id="kwWHMevfZoXgTAfEKg8KxZ"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">路径</span></li></ul><div id="3v1ZkGWBadd1EE3jRxQNJe" class="wolai-block wolai-text"><div><span class="inline-wrap"><code>src/store/system/systemConfigSlice.ts</code></span></div></div><ul class="wolai-block"><li id="6hdF6PtEaHnCA8cAp41qLd"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">存储变量结构</span></li></ul><code-block id="n18FVTwGPY5ArS5r7yrRiK" class="wolai-block"><div class="wolai-pre"><div data-lang="TypeScript" class="marker"></div><pre style="white-space: pre-wrap; word-break: break-all"><span class="token keyword">type</span> <span class="token class-name">SystemConfigStoreInterface</span> <span class="token operator">=</span> <span class="token punctuation">{</span>
synchEnabled<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">boolean</span><span class="token punctuation">;</span>
synchScene<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span>
systemLanguage<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
systemApiUrl<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
systemPcUrl<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
systemH5Url<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
systemLogo<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
systemName<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
memberDefaultAvatar<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
resourceUrl<span class="token operator">?</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token punctuation">[</span>key<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">]</span><span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span></pre></div></code-block><ul class="wolai-block"><li id="uj1NDijpDP58FRpgKnoW2g"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">demo<span class="jill"></span>一、读取信息</span></li></ul><code-block id="gGbYoVFdV3SRayY5sbGiiz" class="wolai-block"><div class="wolai-pre"><div data-lang="TypeScript" class="marker"></div><pre style="white-space: pre-wrap; word-break: break-all"><span class="token keyword">import</span> <span class="token punctuation">{</span> useSelector <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"react-redux"</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> systemConfig <span class="token operator">=</span> <span class="token function">useSelector</span><span class="token punctuation">(</span><span class="token punctuation">(</span>state<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span> <span class="token operator">=></span> state<span class="token punctuation">.</span>systemConfig<span class="token punctuation">.</span>value<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></div></code-block><ul class="wolai-block"><li id="6h9atq5qn2Vo7oRwdJMfhD"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">demo<span class="jill"></span>二、存储信息</span></li></ul><code-block id="gx2rA8QVt53q1Xz6k7f37K" class="wolai-block"><div class="wolai-pre"><div data-lang="TypeScript" class="marker"></div><pre style="white-space: pre-wrap; word-break: break-all"><span class="token keyword">import</span> <span class="token punctuation">{</span> useDispatch <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"react-redux"</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span>
SystemConfigStoreInterface<span class="token punctuation">,</span>
saveConfigAction<span class="token punctuation">,</span>
<span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"../../store/system/systemConfigSlice"</span><span class="token punctuation">;</span>
<span class="token keyword">let</span> config<span class="token operator">:</span> SystemConfigStoreInterface <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token operator">...</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token function">dispatch</span><span class="token punctuation">(</span><span class="token function">saveConfigAction</span><span class="token punctuation">(</span>config<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</pre></div></code-block><h4 id="7KvMyTx5rHaZgh96L4yRdR" class="wolai-block"><span class="inline-wrap">4.1.5 后台权限概述</span></h4><h5 id="sxA78KQZnUqcuAdRZEeacv" class="wolai-block"><span class="inline-wrap">4.1.5.1<span class="jill"></span>按钮权限组件 </span></h5><div id="ds8GhjhpQV5Z4gnYBzZjST" class="wolai-block wolai-text"><div><span class="inline-wrap">文件:</span><span class="inline-wrap"><code>src/components/permission-button</code></span></div></div><div id="7ru5m1afRfzVF8zaNMk366" class="wolai-block wolai-text"><div><span class="inline-wrap">使用权限按钮组件(</span><span class="inline-wrap">demo</span><span class="inline-wrap"></span></div></div><code-block id="bG6h4Qfe66DkJ4Y58KHVuZ" class="wolai-block"><div class="wolai-pre"><div data-lang="TypeScript" class="marker"></div><pre style="white-space: pre-wrap; word-break: break-all"><span class="token keyword">import</span> <span class="token punctuation">{</span> PerButton <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"@/components/permission-button"</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> PlusOutlined <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"@ant-design/icons"</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span>
<span class="token operator">&lt;</span><span class="token operator">></span>
<span class="token operator">&lt;</span>PerButton
type<span class="token operator">=</span><span class="token string">"primary"</span>
text<span class="token operator">=</span><span class="token punctuation">{</span><span class="token string">"测试按钮"</span><span class="token punctuation">}</span>
<span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"demo-button"</span>
icon<span class="token operator">=</span><span class="token punctuation">{</span><span class="token operator">&lt;</span>PlusOutlined <span class="token operator">/</span><span class="token operator">></span><span class="token punctuation">}</span><span class="token comment">//或者null</span>
p<span class="token operator">=</span><span class="token string">"upload-word"</span> <span class="token comment">//该按钮权限 </span>
onClick<span class="token operator">=</span><span class="token punctuation">{</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token keyword">void</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">}</span>
disabled<span class="token operator">=</span><span class="token punctuation">{</span><span class="token boolean">true</span><span class="token operator">|</span><span class="token boolean">false</span><span class="token punctuation">}</span><span class="token comment">//或者null</span>
<span class="token operator">/</span><span class="token operator">></span>
<span class="token operator">&lt;</span><span class="token operator">/</span><span class="token operator">></span>
<span class="token punctuation">)</span></pre></div></code-block><h5 id="bz3ps4Q1h1LZQTWgcNjEWb" class="wolai-block"><span class="inline-wrap">4.1.5.2 左侧菜单组件 </span></h5><div id="3zN6RDi92ZS5LPUm8PPfFG" class="wolai-block wolai-text"><div><span class="inline-wrap">文件:</span><span class="inline-wrap"><code>src/components/left-menu</code></span></div></div><code-block id="2fRiUxAPhWPcJci8NXnaUR" class="wolai-block"><div class="wolai-pre"><div data-lang="TypeScript" class="marker"></div><pre style="white-space: pre-wrap; word-break: break-all"><span class="token keyword">import</span> React<span class="token punctuation">,</span> <span class="token punctuation">{</span> useEffect<span class="token punctuation">,</span> useState <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"react"</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> Menu <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"antd"</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> useSelector <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"react-redux"</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> useNavigate<span class="token punctuation">,</span> useLocation <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"react-router-dom"</span><span class="token punctuation">;</span>
<span class="token keyword">export</span> <span class="token keyword">const</span> LeftMenu<span class="token operator">:</span> React<span class="token punctuation">.</span><span class="token function-variable function">FC</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
<span class="token keyword">const</span> location <span class="token operator">=</span> <span class="token function">useLocation</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 全局权限</span>
<span class="token keyword">const</span> permissions <span class="token operator">=</span> <span class="token function">useSelector</span><span class="token punctuation">(</span>
<span class="token punctuation">(</span>state<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span> <span class="token operator">=></span> state<span class="token punctuation">.</span>loginUser<span class="token punctuation">.</span>value<span class="token punctuation">.</span>permissions
<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 选中的菜单</span>
<span class="token keyword">const</span> <span class="token punctuation">[</span>selectedKeys<span class="token punctuation">,</span> setSelectedKeys<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token generic-function"><span class="token function">useState</span><span class="token generic class-name"><span class="token operator">&lt;</span><span class="token builtin">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token operator">></span></span></span><span class="token punctuation">(</span><span class="token punctuation">[</span>
location<span class="token punctuation">.</span>pathname<span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 展开菜单</span>
<span class="token keyword">const</span> hit <span class="token operator">=</span> <span class="token punctuation">(</span>pathname<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> p <span class="token keyword">in</span> children2Parent<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>pathname<span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span>p<span class="token punctuation">)</span> <span class="token operator">>=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> children2Parent<span class="token punctuation">[</span>p<span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> <span class="token punctuation">[</span>openKeys<span class="token punctuation">,</span> setOpenKeys<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token generic-function"><span class="token function">useState</span><span class="token generic class-name"><span class="token operator">&lt;</span><span class="token builtin">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token operator">></span></span></span><span class="token punctuation">(</span><span class="token function">hit</span><span class="token punctuation">(</span>location<span class="token punctuation">.</span>pathname<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> items <span class="token operator">=</span> <span class="token punctuation">[</span>
<span class="token function">getItem</span><span class="token punctuation">(</span>
<span class="token string">"主页"</span><span class="token punctuation">,</span>
<span class="token string">"/"</span><span class="token punctuation">,</span>
<span class="token operator">&lt;</span>i className<span class="token operator">=</span><span class="token punctuation">{</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">iconfont icon-icon-home</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">}</span> <span class="token operator">/</span><span class="token operator">></span><span class="token punctuation">,</span>
<span class="token keyword">null</span><span class="token punctuation">,</span>
<span class="token keyword">null</span><span class="token punctuation">,</span>
<span class="token string">"menu-index"</span> <span class="token comment">//该菜单权限 </span>
<span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token function">getItem</span><span class="token punctuation">(</span>
<span class="token string">"分类"</span><span class="token punctuation">,</span>
<span class="token string">"/resource-category"</span><span class="token punctuation">,</span>
<span class="token operator">&lt;</span>i className<span class="token operator">=</span><span class="token string">"iconfont icon-icon-category"</span> <span class="token operator">/</span><span class="token operator">></span><span class="token punctuation">,</span>
<span class="token keyword">null</span><span class="token punctuation">,</span>
<span class="token keyword">null</span><span class="token punctuation">,</span>
<span class="token string">"menu-category"</span> <span class="token comment">//该菜单权限 </span>
<span class="token punctuation">)</span>
<span class="token comment">// ...</span>
<span class="token punctuation">]</span>
<span class="token comment">// ...省略代码</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span>
<span class="token operator">&lt;</span>div className<span class="token operator">=</span><span class="token punctuation">{</span>styles<span class="token punctuation">[</span><span class="token string">"menu-box"</span><span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token operator">></span>
<span class="token operator">&lt;</span>Menu
onClick<span class="token operator">=</span><span class="token punctuation">{</span>onClick<span class="token punctuation">}</span>
style<span class="token operator">=</span><span class="token punctuation">{</span><span class="token punctuation">{</span>
width<span class="token operator">:</span> <span class="token number">200</span><span class="token punctuation">,</span>
background<span class="token operator">:</span> <span class="token string">"#ffffff"</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">}</span>
selectedKeys<span class="token operator">=</span><span class="token punctuation">{</span>selectedKeys<span class="token punctuation">}</span>
openKeys<span class="token operator">=</span><span class="token punctuation">{</span>openKeys<span class="token punctuation">}</span>
mode<span class="token operator">=</span><span class="token string">"inline"</span>
items<span class="token operator">=</span><span class="token punctuation">{</span>activeMenus<span class="token punctuation">}</span>
onSelect<span class="token operator">=</span><span class="token punctuation">{</span><span class="token punctuation">(</span>data<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
<span class="token function">setSelectedKeys</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>selectedKeys<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">}</span>
onOpenChange<span class="token operator">=</span><span class="token punctuation">{</span><span class="token punctuation">(</span>keys<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
<span class="token function">setOpenKeys</span><span class="token punctuation">(</span>keys<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">}</span>
<span class="token operator">/</span><span class="token operator">></span>
<span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">></span>
<span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</pre></div></code-block><h3 id="3Gkqnn4R7o9B64PJfAuRbU" class="wolai-block"><span class="inline-wrap">4.2 </span><span class="inline-wrap"><b>PC</b></span><span class="inline-wrap">学员界面</span></h3><h4 id="oBH5eBrSzGAho5a1Cd1Vgy" class="wolai-block"><span class="inline-wrap">4.2.1<span class="jill"></span>文件目录结构</span></h4><code-block id="99f3aWzt5ekvuiRN9zR8vK" class="wolai-block"><div class="wolai-pre"><div data-lang="Text" class="marker"></div><pre>playedu
├── public // 公共资源
│ └── js // 公共JS
│ └── favicon.ico // 网站ICO
├── src // 资源
│ └── api // 各页面API
│ └── internal // 全局API配置
│ └──... // 各模块API配置
│ └── compenents // 全局组件
│ └── assets // 全局外部资源
│ └── i18n // 国际化配置
│ └── cn.json // 简中语言JSON
│ └── config.ts // 国际化配置
│ └── tc.json // 繁中语言JSON
│ └── js // 通用JS
│ └── pages // 页面资源
│ └── cert // 证书模块
│ └── course // 线上课模块
│ └── index // 首页模块
│ └── error // 错误模块
│ └── init // 初始化
│ └── layouts // 页面布局
│ └── loading // 公用loading模块
│ └── login // 登录模块
│ └── task // 任务模块
│ └── index.tsx // 学习任务模块
│ └── exam.tsx // 考试任务模块
│ └── ... // 任务相关模块
│ └── latest-learn // 最近学习模块
│ └── routes // 路由
│ └── store // 中间件及store
│ └── system // 系统store
│ └── user // 用户store
│ └── index.ts // store配置
│ └── utils // 工具类
│ └── global.d.ts // 全局变量
│ └── playedu.d.ts // 全局类型
│ └── AutoTop.ts // 全局页面自动滚动到最上方
│ └── custom.d.ts // 全局css、less、scss配置
│ └── index.scss // 全局样式
│ └── main.tsx // 主要模块
│ └── App.scss // 系统样式
│ └── App.tsx // 系统模块
├── .env.example // Env配置模版
├── .env.local // Env配置
├── .env可用 // Env配置
├── vite.config.ts // VITE配置
├── ...
</pre></div></code-block><h4 id="e8RrUjZJaD3zBmmmaKNASM" class="wolai-block"><span class="inline-wrap">4.2.2 依赖库</span></h4><div id="qkcSZVB7sUm6NRyS7tyz6G" class="wolai-block wolai-simple-table"><table><tbody><tr><td style="width: 151px"><span class="inline-wrap">依赖库</span></td><td style="width: 235px"><span class="inline-wrap">地址</span></td><td style="width: 168px"><span class="inline-wrap">说明</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>antd</code></span></td><td style="width: 235px"><span class="inline-wrap"><a href="https://ant.design/"><span>https://ant.design</span></a></span></td><td style="width: 168px"><span class="inline-wrap">UI<span class="jill"></span>框架</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>axios</code></span></td><td style="width: 235px"><span class="inline-wrap"><a href="https://axios-http.com/docs/intro"><span>https://axios-http.com/docs/intro</span></a></span></td><td style="width: 168px"><span class="inline-wrap">HTTP<span class="jill"></span>请求库</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>jspdf</code></span></td><td style="width: 235px"><span class="inline-wrap"><a href="https://github.com/parallax/jsPDF"><span>https://github.com/parallax/jsPDF</span></a></span></td><td style="width: 168px"><span class="inline-wrap">生成<span class="jill"></span>PDF<span class="jill"></span>文档</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>html2canvas</code></span></td><td style="width: 235px"><span class="inline-wrap"><a href="https://html2canvas.hertzen.com/"><span>https://html2canvas.hertzen.com/</span></a></span></td><td style="width: 168px"><span class="inline-wrap">html<span class="jill"></span>内容写入<span class="jill"></span>canvas<span class="jill"></span>生成图片</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>lodash</code></span></td><td style="width: 235px"><span class="inline-wrap"><a href="https://www.lodashjs.com/"><span>https://www.lodashjs.com/</span></a></span></td><td style="width: 168px"><span class="inline-wrap">Lodash</span><span class="inline-wrap"></span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>i18next</code></span></td><td style="width: 235px"><span class="inline-wrap"><a href="https://www.i18next.com/"><span>https://www.i18next.com</span></a></span></td><td style="width: 168px"><span class="inline-wrap">国际化</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>moment</code></span></td><td style="width: 235px"><span class="inline-wrap"><a href="https://momentjs.cn/"><span>https://momentjs.cn</span></a></span></td><td style="width: 168px"><span class="inline-wrap">时间解析库</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>localforage</code></span></td><td style="width: 235px"><span class="inline-wrap"><a href="https://localforage.docschina.org/"><span>https://localforage.docschina.org</span></a></span></td><td style="width: 168px"><span class="inline-wrap">LocalStorage<span class="jill"></span>的封装</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>match-sorter</code></span></td><td style="width: 235px"><span class="inline-wrap"><a href="https://github.com/kentcdodds/match-sorter"><span>https://github.com/kentcdodds/match-sorter</span></a></span></td><td style="width: 168px"><span class="inline-wrap">数组处理库</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>react-router-dom</code></span></td><td style="width: 235px"><span class="inline-wrap"><a href="https://reactrouter.com/en/main"><span>https://reactrouter.com/en/main</span></a></span></td><td style="width: 168px"><span class="inline-wrap">路由库</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>redux</code></span></td><td style="width: 235px"><span class="inline-wrap"><a href="https://cn.redux.js.org/"><span>https://cn.redux.js.org</span></a></span></td><td style="width: 168px"><span class="inline-wrap">全局状态</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>sort-by</code></span></td><td style="width: 235px"><span class="inline-wrap"><a href="https://github.com/kvnneff/sort-by"><span>https://github.com/kvnneff/sort-by</span></a></span></td><td style="width: 168px"><span class="inline-wrap">数组加强库</span></td></tr><tr><td style="width: 151px"><span class="inline-wrap"><code>react-ga</code></span></td><td style="width: 235px"><span class="inline-wrap"><a href="https://github.com/react-ga/react-ga"><span>https://github.com/react-ga/react-ga</span></a></span></td><td style="width: 168px"><span class="inline-wrap">反应谷歌分析模块</span></td></tr></tbody></table></div><h4 id="o6a7pm2UKSHnsSuqVSEwWv" class="wolai-block"><span class="inline-wrap">4.2.3 页面架构图</span></h4><div id="w577VPcUFPHeAkWeC5t2qA" class="wolai-block"><figure class="wolai-center" style="width: 100%; flex-direction: column"><img src="media/image_1.png" style="width: 100%"/></figure></div><h4 id="2gZ1nNwpoSggD2S3EfZkgp" class="wolai-block"><span class="inline-wrap">4.2.4 全局状态</span></h4><h5 id="4vn3icMANCtpRAh2XXVCGY" class="wolai-block"><span class="inline-wrap">4.2.4.1 全局状态一、登录用户</span></h5><ul class="wolai-block"><li id="uUHTrMND9tXft1FZ58GXhs"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">路径</span></li></ul><div id="2HwNZSpVRnWM1VyQojJVAr" class="wolai-block wolai-text"><div><span class="inline-wrap"><code>src/store/user/loginUserSlice.ts</code></span></div></div><ul class="wolai-block"><li id="7ayvQjBkw5XNWkhGDiYTor"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">存储变量结构</span></li></ul><code-block id="rax6kx7afMUxAdn2gPtg67" class="wolai-block"><div class="wolai-pre"><div data-lang="TypeScript" class="marker"></div><pre style="white-space: pre-wrap; word-break: break-all"><span class="token keyword">type</span> <span class="token class-name">ResourceUrlModel</span> <span class="token operator">=</span> <span class="token punctuation">{</span>
<span class="token punctuation">[</span>key<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">]</span><span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">type</span> <span class="token class-name">UserModel</span> <span class="token operator">=</span> <span class="token punctuation">{</span>
id<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span>
name<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
avatar<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
credit1<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span>
email<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
create_city<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
create_ip<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
id_card<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
is_active<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span>
is_lock<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span>
from_scene<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span>
is_set_password<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span>
is_verify<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span>
created_at<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
updated_at<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
login_at<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
verify_at<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">type</span> <span class="token class-name">UserStoreInterface</span> <span class="token operator">=</span> <span class="token punctuation">{</span>
user<span class="token operator">:</span> UserModel <span class="token operator">|</span> <span class="token keyword">null</span><span class="token punctuation">;</span>
departments<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
currentDepId<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span>
resourceUrl<span class="token operator">:</span> ResourceUrlModel<span class="token punctuation">;</span>
isLogin<span class="token operator">:</span> <span class="token builtin">boolean</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span></pre></div></code-block><ul class="wolai-block"><li id="mbJJQJyjyzEvQrffDFKf3N"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">demo<span class="jill"></span>一、读取信息</span></li></ul><code-block id="wGkgLdxfSpcwU8u2mjn86R" class="wolai-block"><div class="wolai-pre"><div data-lang="TypeScript" class="marker"></div><pre style="white-space: pre-wrap; word-break: break-all"><span class="token keyword">import</span> <span class="token punctuation">{</span> useSelector <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"react-redux"</span><span class="token punctuation">;</span>
<span class="token comment">// 读取登录用户信息</span>
<span class="token keyword">const</span> user <span class="token operator">=</span> <span class="token function">useSelector</span><span class="token punctuation">(</span><span class="token punctuation">(</span>state<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span> <span class="token operator">=></span> state<span class="token punctuation">.</span>loginUser<span class="token punctuation">.</span>value<span class="token punctuation">.</span>user<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 读取登录用户的部门</span>
<span class="token keyword">const</span> departments <span class="token operator">=</span> <span class="token function">useSelector</span><span class="token punctuation">(</span><span class="token punctuation">(</span>state<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span> <span class="token operator">=></span> state<span class="token punctuation">.</span>loginUser<span class="token punctuation">.</span>value<span class="token punctuation">.</span>departments<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 读取登录用户的资源地址</span>
<span class="token keyword">const</span> resourceUrl <span class="token operator">=</span> <span class="token function">useSelector</span><span class="token punctuation">(</span><span class="token punctuation">(</span>state<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span> <span class="token operator">=></span> state<span class="token punctuation">.</span>loginUser<span class="token punctuation">.</span>value<span class="token punctuation">.</span>resourceUrl<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 读取登录用户的登录状态</span>
<span class="token keyword">const</span> isLogin <span class="token operator">=</span> <span class="token function">useSelector</span><span class="token punctuation">(</span><span class="token punctuation">(</span>state<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span> <span class="token operator">=></span> state<span class="token punctuation">.</span>loginUser<span class="token punctuation">.</span>value<span class="token punctuation">.</span>isLogin<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 读取登录用户的默认当前部门ID</span>
<span class="token keyword">const</span> currentDepId <span class="token operator">=</span> <span class="token function">useSelector</span><span class="token punctuation">(</span><span class="token punctuation">(</span>state<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span> <span class="token operator">=></span> state<span class="token punctuation">.</span>loginUser<span class="token punctuation">.</span>value<span class="token punctuation">.</span>currentDepId<span class="token punctuation">)</span><span class="token punctuation">;</span>
</pre></div></code-block><ul class="wolai-block"><li id="oXV7NwyC189Y48XMZSsrWW"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">demo<span class="jill"></span>二、存储信息</span></li></ul><code-block id="rTA6K478fKRNVzmkJ6F9X7" class="wolai-block"><div class="wolai-pre"><div data-lang="TypeScript" class="marker"></div><pre style="white-space: pre-wrap; word-break: break-all"><span class="token keyword">import</span> <span class="token punctuation">{</span> useDispatch <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"react-redux"</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> loginAction <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"./store/user/loginUserSlice"</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> dispatch <span class="token operator">=</span> <span class="token function">useDispatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 获取用户数据</span>
<span class="token keyword">let</span> userRes<span class="token operator">:</span> <span class="token builtin">any</span> <span class="token operator">=</span> <span class="token keyword">await</span> user<span class="token punctuation">.</span><span class="token function">detail</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 将用户数据存储到全局状态</span>
<span class="token function">dispatch</span><span class="token punctuation">(</span><span class="token function">loginAction</span><span class="token punctuation">(</span>userRes<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</pre></div></code-block><h4 id="mxYHe3oHgZb94iVVoP932v" class="wolai-block"><span class="inline-wrap">4.2.4.2 全局状态二、全局配置</span></h4><ul class="wolai-block"><li id="2f9xoX5HuW4tF27t6R7uaw"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">路径</span></li></ul><div id="safEuE8eD71itcysG6PL3k" class="wolai-block wolai-text"><div><span class="inline-wrap"><code>src/store/system/systemConfigSlice.ts</code></span></div></div><ul class="wolai-block"><li id="8Vdxboi166DGwJyehv75Tz"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">存储变量结构</span></li></ul><code-block id="qopcdehowg7cTwdThTw8Ja" class="wolai-block"><div class="wolai-pre"><div data-lang="TypeScript" class="marker"></div><pre style="white-space: pre-wrap; word-break: break-all"><span class="token keyword">type</span> <span class="token class-name">SystemConfigStoreInterface</span> <span class="token operator">=</span> <span class="token punctuation">{</span>
synchEnabled<span class="token operator">:</span> <span class="token builtin">boolean</span><span class="token punctuation">;</span>
synchScene<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span>
synchWorkAgentId<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
synchWorkCorpId<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
synchWorkCorpSecret<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
synchWorkUrl<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
systemApiUrl<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
systemLanguage<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
systemPcUrl<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
systemH5Url<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
systemLogo<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
systemName<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
pcIndexFooterMsg<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
playerPoster<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
playerIsEnabledBulletSecret<span class="token operator">:</span> <span class="token builtin">boolean</span><span class="token punctuation">;</span>
playerIsDisabledDrag<span class="token operator">:</span> <span class="token builtin">boolean</span><span class="token punctuation">;</span>
playerBulletSecretText<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
playerBulletSecretColor<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
playerBulletSecretOpacity<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
resourceUrl<span class="token operator">?</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token punctuation">[</span>key<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">]</span><span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span></pre></div></code-block><ul class="wolai-block"><li id="eC4mF7gxhWdwrkXk8ExDjS"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">demo<span class="jill"></span>一、读取信息</span></li></ul><code-block id="3V9dymD4Pt4oPjx4pnNNJv" class="wolai-block"><div class="wolai-pre"><div data-lang="TypeScript" class="marker"></div><pre style="white-space: pre-wrap; word-break: break-all"><span class="token keyword">import</span> <span class="token punctuation">{</span> useSelector <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"react-redux"</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> systemConfig <span class="token operator">=</span> <span class="token function">useSelector</span><span class="token punctuation">(</span><span class="token punctuation">(</span>state<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span> <span class="token operator">=></span> state<span class="token punctuation">.</span>systemConfig<span class="token punctuation">.</span>value<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></div></code-block><ul class="wolai-block"><li id="cdxB3uVJonzdCafDJXSJCf"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">demo<span class="jill"></span>二、存储信息</span></li></ul><code-block id="39nRfRwzLxqQA2Gf2pcgwg" class="wolai-block"><div class="wolai-pre"><div data-lang="TypeScript" class="marker"></div><pre style="white-space: pre-wrap; word-break: break-all"><span class="token keyword">import</span> <span class="token punctuation">{</span> useDispatch <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"react-redux"</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span>
SystemConfigStoreInterface<span class="token punctuation">,</span>
saveConfigAction<span class="token punctuation">,</span>
<span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"../../store/system/systemConfigSlice"</span><span class="token punctuation">;</span>
<span class="token keyword">let</span> configRes<span class="token operator">:</span> <span class="token builtin">any</span> <span class="token operator">=</span> <span class="token keyword">await</span> system<span class="token punctuation">.</span><span class="token function">config</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">let</span> config<span class="token operator">:</span> SystemConfigStoreInterface <span class="token operator">=</span> <span class="token punctuation">{</span>
<span class="token comment">//系统配置</span>
synchEnabled<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"synch.enabled"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
synchScene<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"synch.scene"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
synchWorkAgentId<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"synch.agentid"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
synchWorkCorpId<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"synch.corpid"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
synchWorkCorpSecret<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"synch.corpsecret"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
synchWorkUrl<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"synch.url"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
systemApiUrl<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"system-api-url"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
systemLanguage<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"system.language"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
systemH5Url<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"system-h5-url"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
systemLogo<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"resource_url"</span><span class="token punctuation">]</span><span class="token punctuation">[</span>
<span class="token function">Number</span><span class="token punctuation">(</span>configRes<span class="token punctuation">[</span><span class="token string">"system-logo"</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token punctuation">]</span>
<span class="token operator">?</span> configRe<span class="token punctuation">[</span><span class="token string">"resource_url"</span><span class="token punctuation">]</span><span class="token punctuation">[</span>
<span class="token function">Number</span><span class="token punctuation">(</span>configRes<span class="token punctuation">[</span><span class="token string">"system-logo"</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token punctuation">]</span>
<span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span>
systemName<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"system-name"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
systemPcUrl<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"system-pc-url"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
pcIndexFooterMsg<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"system-pc-index-footer-msg"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token comment">//播放器配置</span>
playerPoster<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"resource_url"</span><span class="token punctuation">]</span><span class="token punctuation">[</span>
<span class="token function">Number</span><span class="token punctuation">(</span>configRes<span class="token punctuation">[</span><span class="token string">"player-poster"</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token punctuation">]</span>
<span class="token operator">?</span> configRes<span class="token punctuation">[</span><span class="token string">"resource_url"</span><span class="token punctuation">]</span><span class="token punctuation">[</span>
<span class="token function">Number</span><span class="token punctuation">(</span>configRes<span class="token punctuation">[</span><span class="token string">"player-poster"</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token punctuation">]</span>
<span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span>
playerIsEnabledBulletSecret<span class="token operator">:</span>
configRes<span class="token punctuation">[</span><span class="token string">"player-is-enabled-bullet-secret"</span><span class="token punctuation">]</span> <span class="token operator">&amp;&amp;</span>
configRes<span class="token punctuation">[</span><span class="token string">"player-is-enabled-bullet-secret"</span><span class="token punctuation">]</span> <span class="token operator">===</span> <span class="token string">"1"</span>
<span class="token operator">?</span> <span class="token boolean">true</span>
<span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>
playerIsDisabledDrag<span class="token operator">:</span>
configRes<span class="token punctuation">[</span><span class="token string">"player-disabled-drag"</span><span class="token punctuation">]</span> <span class="token operator">&amp;&amp;</span>
configRes<span class="token punctuation">[</span><span class="token string">"player-disabled-drag"</span><span class="token punctuation">]</span> <span class="token operator">===</span> <span class="token string">"1"</span>
<span class="token operator">?</span> <span class="token boolean">true</span>
<span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>
playerBulletSecretText<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"player-bullet-secret-text"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
playerBulletSecretColor<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"player-bullet-secret-color"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
playerBulletSecretOpacity<span class="token operator">:</span>
configRes<span class="token punctuation">[</span><span class="token string">"player-bullet-secret-opacity"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
resourceUrl<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"resource_url"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
i18n<span class="token punctuation">.</span><span class="token function">changeLanguage</span><span class="token punctuation">(</span>configRes<span class="token punctuation">[</span><span class="token string">"system.language"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 将系统数据存储到全局状态</span>
<span class="token function">dispatch</span><span class="token punctuation">(</span><span class="token function">saveConfigAction</span><span class="token punctuation">(</span>config<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</pre></div></code-block><h3 id="qv8hULiRFQCU2NUw28nn7P" class="wolai-block"><span class="inline-wrap">4.3 H5<span class="jill"></span>学员界面</span></h3><h4 id="rLCTHLbrCQBAspVVxwgYNL" class="wolai-block"><span class="inline-wrap">4.3.1<span class="jill"></span>文件目录结构</span></h4><code-block id="f1tVVcawByg7nXhY2BqotK" class="wolai-block"><div class="wolai-pre"><div data-lang="Text" class="marker"></div><pre>playedu
├── public // 公共资源
│ └── js // 公共JS
│ └── favicon.ico // 网站ICO
├── src // 资源
│ └── api // 各页面API
│ └── internal // 全局API配置
│ └──... // 各模块API配置
│ └── compenents // 全局组件
│ └── assets // 全局外部资源
│ └── i18n // 国际化配置
│ └── cn.json // 简中语言JSON
│ └── config.ts // 国际化配置
│ └── tc.json // 繁中语言JSON
│ └── js // 通用JS
│ └── pages // 页面资源
│ └── cert // 证书模块
│ └── change-department // 切换部门模块
│ └── change-password // 修改密码模块
│ └── course // 线上课模块
│ └── index // 首页模块
│ └── error // 错误模块
│ └── init // 初始化
│ └── layouts // 页面布局
│ └── loading // 公用loading模块
│ └── login // 登录模块
│ └── member // 学员中心模块
│ └── task // 任务模块
│ └── index.tsx // 学习任务模块
│ └── exam.tsx // 考试任务模块
│ └── ... // 任务相关模块
│ └── study // 最近学习模块
│ └── upload // PC扫码、H5的考试上传模块
│ └── routes // 路由
│ └── store // 中间件及store
│ └── system // 系统store
│ └── user // 用户store
│ └── index.ts // store配置
│ └── utils // 工具类
│ └── global.d.ts // 全局变量
│ └── playedu.d.ts // 全局类型
│ └── AutoTop.ts // 全局页面自动滚动到最上方
│ └── custom.d.ts // 全局css、less、scss配置
│ └── main.scss // 全局样式
│ └── main.tsx // 主要模块
│ └── App.scss // 系统样式
│ └── App.tsx // 系统模块
├── .env.example // Env配置模版
├── .env.local // Env配置
├── .env可用 // Env配置
├── vite.config.ts // VITE配置
├── ...
</pre></div></code-block><h4 id="iwWwAkWzyvJRJunqYxvz7V" class="wolai-block"><span class="inline-wrap">4.3.2 依赖库</span></h4><div id="hSZaihMXEiTY9eM16T8JQu" class="wolai-block wolai-simple-table"><table><tbody><tr><td style="width: 186px"><span class="inline-wrap">依赖库</span></td><td style="width: 207px"><span class="inline-wrap">地址</span></td><td style="width: 158px"><span class="inline-wrap">说明</span></td></tr><tr><td style="width: 186px"><span class="inline-wrap"><code>antd-mobile</code></span></td><td style="width: 207px"><span class="inline-wrap"><a href="https://ant-design-mobile.antgroup.com/zh"><span>https://ant-design-mobile.antgroup.com/zh</span></a></span></td><td style="width: 158px"><span class="inline-wrap">UI<span class="jill"></span>框架</span></td></tr><tr><td style="width: 186px"><span class="inline-wrap"><code>axios</code></span></td><td style="width: 207px"><span class="inline-wrap"><a href="https://axios-http.com/docs/intro"><span>https://axios-http.com/docs/intro</span></a></span></td><td style="width: 158px"><span class="inline-wrap">HTTP<span class="jill"></span>请求库</span></td></tr><tr><td style="width: 186px"><span class="inline-wrap"><code>jspdf</code></span></td><td style="width: 207px"><span class="inline-wrap"><a href="https://github.com/parallax/jsPDF"><span>https://github.com/parallax/jsPDF</span></a></span></td><td style="width: 158px"><span class="inline-wrap">生成<span class="jill"></span>PDF<span class="jill"></span>文档</span></td></tr><tr><td style="width: 186px"><span class="inline-wrap"><code>html2canvas</code></span></td><td style="width: 207px"><span class="inline-wrap"><a href="https://html2canvas.hertzen.com/"><span>https://html2canvas.hertzen.com/</span></a></span></td><td style="width: 158px"><span class="inline-wrap">html<span class="jill"></span>内容写入<span class="jill"></span>canvas<span class="jill"></span>生成图片</span></td></tr><tr><td style="width: 186px"><span class="inline-wrap"><code>@types/lodash</code></span></td><td style="width: 207px"><span class="inline-wrap"><a href="https://www.lodashjs.com/"><span>https://www.lodashjs.com/</span></a></span></td><td style="width: 158px"><span class="inline-wrap">Lodash</span><span class="inline-wrap"></span></td></tr><tr><td style="width: 186px"><span class="inline-wrap"><code>i18next</code></span></td><td style="width: 207px"><span class="inline-wrap"><a href="https://www.i18next.com/"><span>https://www.i18next.com</span></a></span></td><td style="width: 158px"><span class="inline-wrap">国际化</span></td></tr><tr><td style="width: 186px"><span class="inline-wrap"><code>moment</code></span></td><td style="width: 207px"><span class="inline-wrap"><a href="https://momentjs.cn/"><span>https://momentjs.cn</span></a></span></td><td style="width: 158px"><span class="inline-wrap">时间解析库</span></td></tr><tr><td style="width: 186px"><span class="inline-wrap"><code>xgplayer</code></span></td><td style="width: 207px"><span class="inline-wrap"><a href="https://h5player.bytedance.com/"><span>https://h5player.bytedance.com</span></a></span></td><td style="width: 158px"><span class="inline-wrap">播放器</span></td></tr><tr><td style="width: 186px"><span class="inline-wrap"><code>xgplayer-hls</code></span></td><td style="width: 207px"><span class="inline-wrap">-</span></td><td style="width: 158px"><span class="inline-wrap">播放器<span class="jill"></span>HLS<span class="jill"></span></span></td></tr><tr><td style="width: 186px"><span class="inline-wrap"><code>localforage</code></span></td><td style="width: 207px"><span class="inline-wrap"><a href="https://localforage.docschina.org/"><span>https://localforage.docschina.org</span></a></span></td><td style="width: 158px"><span class="inline-wrap">LocalStorage<span class="jill"></span>的封装</span></td></tr><tr><td style="width: 186px"><span class="inline-wrap"><code>match-sorter</code></span></td><td style="width: 207px"><span class="inline-wrap"><a href="https://github.com/developit/mitt"><span>https://github.com/developit/mitt</span></a></span></td><td style="width: 158px"><span class="inline-wrap">数组处理库</span></td></tr><tr><td style="width: 186px"><span class="inline-wrap"><code>mitt</code></span></td><td style="width: 207px"><span class="inline-wrap"><a href="https://github.com/kentcdodds/match-sorter"><span>https://github.com/kentcdodds/match-sorter</span></a></span></td><td style="width: 158px"><span class="inline-wrap">Mitt<span class="jill"></span>事件库</span></td></tr><tr><td style="width: 186px"><span class="inline-wrap"><code>react-router-dom</code></span></td><td style="width: 207px"><span class="inline-wrap"><a href="https://reactrouter.com/en/main"><span>https://reactrouter.com/en/main</span></a></span></td><td style="width: 158px"><span class="inline-wrap">路由库</span></td></tr><tr><td style="width: 186px"><span class="inline-wrap"><code>redux</code></span></td><td style="width: 207px"><span class="inline-wrap"><a href="https://cn.redux.js.org/"><span>https://cn.redux.js.org</span></a></span></td><td style="width: 158px"><span class="inline-wrap">全局状态</span></td></tr><tr><td style="width: 186px"><span class="inline-wrap"><code>sort-by</code></span></td><td style="width: 207px"><span class="inline-wrap"><a href="https://github.com/kvnneff/sort-by"><span>https://github.com/kvnneff/sort-by</span></a></span></td><td style="width: 158px"><span class="inline-wrap">数组加强库</span></td></tr><tr><td style="width: 186px"><span class="inline-wrap"><code>react-ga</code></span></td><td style="width: 207px"><span class="inline-wrap"><a href="https://github.com/react-ga/react-ga"><span>https://github.com/react-ga/react-ga</span></a></span></td><td style="width: 158px"><span class="inline-wrap">反应谷歌分析模块</span></td></tr></tbody></table></div><h4 id="kvWbSH5hyeHnRtKg2WnigA" class="wolai-block"><span class="inline-wrap">4.3.3 页面架构图</span></h4><div id="hbdEaGb9ifPDXTPXrJgN48" class="wolai-block"><figure class="wolai-center" style="width: 100%; flex-direction: column"><img src="media/image_2.png" style="width: 100%"/></figure></div><div id="u8XKJmNMzgupow1RRUKX6g" class="wolai-block wolai-text"><div><span class="inline-wrap"></span><br/></div></div><h4 id="3BmVCEtdgKiTJC64kxsbZr" class="wolai-block"><span class="inline-wrap">4.3.4 全局状态</span></h4><h5 id="2NNj6rEE6taMdnsTDb5CtJ" class="wolai-block"><span class="inline-wrap">4.3.4.1 全局状态一、登录用户</span></h5><ul class="wolai-block"><li id="jUZNCFNgPsj12TB8Jidfxt"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">路径</span></li></ul><div id="27FsnmWR7SSrev3bQ1AQyL" class="wolai-block wolai-text"><div><span class="inline-wrap"><code>src/store/user/loginUserSlice.ts</code></span></div></div><ul class="wolai-block"><li id="26sn4A729BdUZPmRnPgKef"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">存储变量结构</span></li></ul><code-block id="mD3aEgjmqUJTkL4Ec8xnJM" class="wolai-block"><div class="wolai-pre"><div data-lang="TypeScript" class="marker"></div><pre style="white-space: pre-wrap; word-break: break-all"><span class="token keyword">type</span> <span class="token class-name">ResourceUrlModel</span> <span class="token operator">=</span> <span class="token punctuation">{</span>
<span class="token punctuation">[</span>key<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">]</span><span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">type</span> <span class="token class-name">UserModel</span> <span class="token operator">=</span> <span class="token punctuation">{</span>
id<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span>
name<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
avatar<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
credit1<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span>
email<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
create_city<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
create_ip<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
id_card<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
is_active<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span>
is_lock<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span>
from_scene<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span>
is_set_password<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span>
is_verify<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span>
created_at<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
updated_at<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
login_at<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
verify_at<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">type</span> <span class="token class-name">UserStoreInterface</span> <span class="token operator">=</span> <span class="token punctuation">{</span>
user<span class="token operator">:</span> UserModel <span class="token operator">|</span> <span class="token keyword">null</span><span class="token punctuation">;</span>
departments<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
currentDepId<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span>
resourceUrl<span class="token operator">:</span> ResourceUrlModel<span class="token punctuation">;</span>
isLogin<span class="token operator">:</span> <span class="token builtin">boolean</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span></pre></div></code-block><ul class="wolai-block"><li id="vjBmjQzpP5BMYPB8DBrxLn"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">demo<span class="jill"></span>一、读取信息</span></li></ul><code-block id="tMmb7BTky4hd9r2Vg4vVWr" class="wolai-block"><div class="wolai-pre"><div data-lang="TypeScript" class="marker"></div><pre style="white-space: pre-wrap; word-break: break-all"><span class="token keyword">import</span> <span class="token punctuation">{</span> useSelector <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"react-redux"</span><span class="token punctuation">;</span>
<span class="token comment">// 读取登录用户信息</span>
<span class="token keyword">const</span> user <span class="token operator">=</span> <span class="token function">useSelector</span><span class="token punctuation">(</span><span class="token punctuation">(</span>state<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span> <span class="token operator">=></span> state<span class="token punctuation">.</span>loginUser<span class="token punctuation">.</span>value<span class="token punctuation">.</span>user<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 读取登录用户的部门</span>
<span class="token keyword">const</span> departments <span class="token operator">=</span> <span class="token function">useSelector</span><span class="token punctuation">(</span><span class="token punctuation">(</span>state<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span> <span class="token operator">=></span> state<span class="token punctuation">.</span>loginUser<span class="token punctuation">.</span>value<span class="token punctuation">.</span>departments<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 读取登录用户的资源地址</span>
<span class="token keyword">const</span> resourceUrl <span class="token operator">=</span> <span class="token function">useSelector</span><span class="token punctuation">(</span><span class="token punctuation">(</span>state<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span> <span class="token operator">=></span> state<span class="token punctuation">.</span>loginUser<span class="token punctuation">.</span>value<span class="token punctuation">.</span>resourceUrl<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 读取登录用户的登录状态</span>
<span class="token keyword">const</span> isLogin <span class="token operator">=</span> <span class="token function">useSelector</span><span class="token punctuation">(</span><span class="token punctuation">(</span>state<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span> <span class="token operator">=></span> state<span class="token punctuation">.</span>loginUser<span class="token punctuation">.</span>value<span class="token punctuation">.</span>isLogin<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 读取登录用户的默认当前部门ID</span>
<span class="token keyword">const</span> currentDepId <span class="token operator">=</span> <span class="token function">useSelector</span><span class="token punctuation">(</span><span class="token punctuation">(</span>state<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span> <span class="token operator">=></span> state<span class="token punctuation">.</span>loginUser<span class="token punctuation">.</span>value<span class="token punctuation">.</span>currentDepId<span class="token punctuation">)</span><span class="token punctuation">;</span>
</pre></div></code-block><ul class="wolai-block"><li id="2Wn5yti55rQPNNYiABhd9w"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">demo<span class="jill"></span>二、存储信息</span></li></ul><code-block id="tL2jSw6fXh9FpGsKLkzh3Z" class="wolai-block"><div class="wolai-pre"><div data-lang="TypeScript" class="marker"></div><pre style="white-space: pre-wrap; word-break: break-all"><span class="token keyword">import</span> <span class="token punctuation">{</span> useDispatch <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"react-redux"</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> loginAction <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"./store/user/loginUserSlice"</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> dispatch <span class="token operator">=</span> <span class="token function">useDispatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 获取用户数据</span>
<span class="token keyword">let</span> userRes<span class="token operator">:</span> <span class="token builtin">any</span> <span class="token operator">=</span> <span class="token keyword">await</span> user<span class="token punctuation">.</span><span class="token function">detail</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 将用户数据存储到全局状态</span>
<span class="token function">dispatch</span><span class="token punctuation">(</span><span class="token function">loginAction</span><span class="token punctuation">(</span>userRes<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</pre></div></code-block><h4 id="6ELebnzfn6mpPUugwFMZqe" class="wolai-block"><span class="inline-wrap">4.3.4.2 全局状态二、全局配置</span></h4><ul class="wolai-block"><li id="inbHXxNGj9S2pZgXM5siBs"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">路径</span></li></ul><div id="cEpVVZXwbTV7iG9AuT1j9T" class="wolai-block wolai-text"><div><span class="inline-wrap"><code>src/store/system/systemConfigSlice.ts</code></span></div></div><ul class="wolai-block"><li id="x1mtsGVZMwMdp7twfXRjKw"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">存储变量结构</span></li></ul><code-block id="tnRxHz12Lg8R3jqw3wHBia" class="wolai-block"><div class="wolai-pre"><div data-lang="TypeScript" class="marker"></div><pre style="white-space: pre-wrap; word-break: break-all"><span class="token keyword">type</span> <span class="token class-name">SystemConfigStoreInterface</span> <span class="token operator">=</span> <span class="token punctuation">{</span>
synchEnabled<span class="token operator">:</span> <span class="token builtin">boolean</span><span class="token punctuation">;</span>
synchScene<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span>
synchWorkAgentId<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
synchWorkCorpId<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
synchWorkCorpSecret<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
synchWorkUrl<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
systemApiUrl<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
systemLanguage<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
systemPcUrl<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
systemH5Url<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
systemLogo<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
systemName<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
pcIndexFooterMsg<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
playerPoster<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
playerIsEnabledBulletSecret<span class="token operator">:</span> <span class="token builtin">boolean</span><span class="token punctuation">;</span>
playerIsDisabledDrag<span class="token operator">:</span> <span class="token builtin">boolean</span><span class="token punctuation">;</span>
playerBulletSecretText<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
playerBulletSecretColor<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
playerBulletSecretOpacity<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
resourceUrl<span class="token operator">?</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token punctuation">[</span>key<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">]</span><span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span></pre></div></code-block><ul class="wolai-block"><li id="bvrAx2eApL6RYfDKo9DGCX"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">demo<span class="jill"></span>一、读取信息</span></li></ul><code-block id="edw6DefLrRZRB8bUwQEyzb" class="wolai-block"><div class="wolai-pre"><div data-lang="TypeScript" class="marker"></div><pre style="white-space: pre-wrap; word-break: break-all"><span class="token keyword">import</span> <span class="token punctuation">{</span> useSelector <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"react-redux"</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> systemConfig <span class="token operator">=</span> <span class="token function">useSelector</span><span class="token punctuation">(</span><span class="token punctuation">(</span>state<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span> <span class="token operator">=></span> state<span class="token punctuation">.</span>systemConfig<span class="token punctuation">.</span>value<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></div></code-block><ul class="wolai-block"><li id="wh1VgMt9vv2LJNJ8W9ao7S"><div class="marker"><svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M12 14.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"></path></svg></div><span class="inline-wrap">demo<span class="jill"></span>二、存储信息</span></li></ul><code-block id="8JfWR7cUunMoZvMvW7MoMX" class="wolai-block"><div class="wolai-pre"><div data-lang="TypeScript" class="marker"></div><pre style="white-space: pre-wrap; word-break: break-all"><span class="token keyword">import</span> <span class="token punctuation">{</span> useDispatch <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"react-redux"</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span>
SystemConfigStoreInterface<span class="token punctuation">,</span>
saveConfigAction<span class="token punctuation">,</span>
<span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"../../store/system/systemConfigSlice"</span><span class="token punctuation">;</span>
<span class="token keyword">let</span> configRes<span class="token operator">:</span> <span class="token builtin">any</span> <span class="token operator">=</span> <span class="token keyword">await</span> system<span class="token punctuation">.</span><span class="token function">config</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">let</span> config<span class="token operator">:</span> SystemConfigStoreInterface <span class="token operator">=</span> <span class="token punctuation">{</span>
<span class="token comment">//系统配置</span>
synchEnabled<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"synch.enabled"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
synchScene<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"synch.scene"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
synchWorkAgentId<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"synch.agentid"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
synchWorkCorpId<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"synch.corpid"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
synchWorkCorpSecret<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"synch.corpsecret"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
synchWorkUrl<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"synch.url"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
systemApiUrl<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"system-api-url"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
systemLanguage<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"system.language"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
systemH5Url<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"system-h5-url"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
systemLogo<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"resource_url"</span><span class="token punctuation">]</span><span class="token punctuation">[</span>
<span class="token function">Number</span><span class="token punctuation">(</span>configRes<span class="token punctuation">[</span><span class="token string">"system-logo"</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token punctuation">]</span>
<span class="token operator">?</span> configRe<span class="token punctuation">[</span><span class="token string">"resource_url"</span><span class="token punctuation">]</span><span class="token punctuation">[</span>
<span class="token function">Number</span><span class="token punctuation">(</span>configRes<span class="token punctuation">[</span><span class="token string">"system-logo"</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token punctuation">]</span>
<span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span>
systemName<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"system-name"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
systemPcUrl<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"system-pc-url"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
pcIndexFooterMsg<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"system-pc-index-footer-msg"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token comment">//播放器配置</span>
playerPoster<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"resource_url"</span><span class="token punctuation">]</span><span class="token punctuation">[</span>
<span class="token function">Number</span><span class="token punctuation">(</span>configRes<span class="token punctuation">[</span><span class="token string">"player-poster"</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token punctuation">]</span>
<span class="token operator">?</span> configRes<span class="token punctuation">[</span><span class="token string">"resource_url"</span><span class="token punctuation">]</span><span class="token punctuation">[</span>
<span class="token function">Number</span><span class="token punctuation">(</span>configRes<span class="token punctuation">[</span><span class="token string">"player-poster"</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token punctuation">]</span>
<span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span>
playerIsEnabledBulletSecret<span class="token operator">:</span>
configRes<span class="token punctuation">[</span><span class="token string">"player-is-enabled-bullet-secret"</span><span class="token punctuation">]</span> <span class="token operator">&amp;&amp;</span>
configRes<span class="token punctuation">[</span><span class="token string">"player-is-enabled-bullet-secret"</span><span class="token punctuation">]</span> <span class="token operator">===</span> <span class="token string">"1"</span>
<span class="token operator">?</span> <span class="token boolean">true</span>
<span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>
playerIsDisabledDrag<span class="token operator">:</span>
configRes<span class="token punctuation">[</span><span class="token string">"player-disabled-drag"</span><span class="token punctuation">]</span> <span class="token operator">&amp;&amp;</span>
configRes<span class="token punctuation">[</span><span class="token string">"player-disabled-drag"</span><span class="token punctuation">]</span> <span class="token operator">===</span> <span class="token string">"1"</span>
<span class="token operator">?</span> <span class="token boolean">true</span>
<span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>
playerBulletSecretText<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"player-bullet-secret-text"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
playerBulletSecretColor<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"player-bullet-secret-color"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
playerBulletSecretOpacity<span class="token operator">:</span>
configRes<span class="token punctuation">[</span><span class="token string">"player-bullet-secret-opacity"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
resourceUrl<span class="token operator">:</span> configRes<span class="token punctuation">[</span><span class="token string">"resource_url"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
i18n<span class="token punctuation">.</span><span class="token function">changeLanguage</span><span class="token punctuation">(</span>configRes<span class="token punctuation">[</span><span class="token string">"system.language"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 将系统数据存储到全局状态</span>
<span class="token function">dispatch</span><span class="token punctuation">(</span><span class="token function">saveConfigAction</span><span class="token punctuation">(</span>config<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</pre></div></code-block><div id="smpPHghrjqPbQqxCRVqBMj" class="wolai-block wolai-text"><div></div></div></article><footer></footer></body></html>