跳至主要內容

soybean-admin 入门

鸭梨大约 3 分钟

soybean-admin 入门

1. 项目简介

Soybean Adminopen in new window 是一个基于 Vue3、Vite4、TypeScript、Naive UI、Pinia 和 UnoCSS 的清新优雅的中后台模版。

使用说明

建议使用主分支的版本,其他分支或 Gitee 上的版本更新不及时。克隆主分支并随时保持更新,可以在本地 Git 选择多个远程仓库链接来合并更新。

技术栈依赖
JS 框架Vue3
开发工具Vite4
语言TypeScript
包管理器pnpm
CSS 预处理Sass
UINaive UI
样式UnoCSS
图标Iconify
请求Axios
加密CryptoJS
时间日期dayjs
环境管理cross-env
组合式函数VueUse
图表ECharts
可视化AntV G2
存储Pinia
LintESLint
代码格式化Prettier
Markdown 编辑器Vditor
Git 提交规范Commitizen
H5 视频播放器xgplayer

2. 开发环境

2.1 系统环境依赖

本地开发基础环境:

  • VS Code
  • Git
  • Node.js 14.18+(推荐 18.x)
  • pnpm@7.x(推荐 7.30+)
Docker 配置指南

可选地,使用 Docker 容器开发:

docker run -itd --name soybean-admin \
    -p 8080:8080 \
    -p 3200:3200 \
    -v $PWD/app:/app \
    node:18.15-bullseye \
    /bin/bash

docker exec -it soybean-admin /bin/bash

虽然 pnpm@v8 已经正式发布,但我们仍然使用 pnpm@v7。在容器内安装 pnpm@v7

npm install -g pnpm@7
SHELL=bash pnpm setup
source /root/.bashrc

安装其他工具:

# 确保使用 pnpm@v7
pnpm add -g pnpm@7
# cz 提交规范
pnpm add -g commitizen
# http-server
pnpm add -g http-server

VS Code 插件可以直接安装项目内推荐的内容,也可以有选择地安装。

插件名称描述需要
Vue Language Features (Volar)Vue 服务插件必须
ESLint代码检查必须
TypeScript Vue Plugin (Volar)Vue 的 TS 服务插件推荐
Material Icon Theme图标主题,显示文件和文件多种图标推荐
Iconify IntelliSenseIconify 图标实时显示的插件推荐
UnoCSSUnoCSS 写法提示插件推荐
Vue VSCode SnippetsVue 写法提示推荐
Icônes搜索 iconify 图标的插件推荐
Prettier代码格式化插件推荐
Color Highlight颜色高亮插件可选
Auto Close Tag自动添加 HTML/XML 结束标签可选
Auto Complete Tag为 HTML/XML 添加关闭标签和自动重命名成对的标签可选
Auto Rename Tag自动重命名成对的 HTML/XML 标签可选
DotENV高亮 .env 文件可选
EditorConfig for VS Code统一不同编辑器的一些配置可选
Git GraphGit 图形化操作工具可选
GitLens显示具体某行代码的 Git 信息可选
Path Intellisense智能显示导入的路径可选

可以全部安装以使用全部功能。

2.2 项目依赖

克隆项目:

git clone https://github.com/honghuangdc/soybean-admin.git
cd soybean-admin
pnpm i

报错指南 如果不安装 TypeScript Vue Plugin 插件,在打开一些源文件时报告无法解析 Vue 文件,创建 src/env.d.ts 即可,文件名(env)可以换为任意名称,内容是:

declare module '*.vue' {
  import type { ComponentOptions } from 'vue';
  const componentOptions: ComponentOptions;
  export default componentOptions;
}

3. 项目结构

3.1 目录结构

  • .github/GitHub 相关配置
    • ISSUE_TEMPLATE/Issue 模板
      • bug-report.yaml
    • workflows/GitHub Actions 配置
      • linter.yml
      • release.yml
    • PULL_REQUEST_TEMPLATE.mdPull Request 模板
  • .vscode/VS Code 相关配置
    • extensions.jsonVS Code 推荐插件
    • launch.jsonVS Code 调试配置
    • settings.jsonVS Code 设置
  • build/构建相关
    • config/构建打包配置
      • define.ts定义的全局常量,通过 Vite 构建时注入
      • index.ts入口文件
      • proxy.ts网络请求代理
    • plugins/构建插件
      • compress.ts代码压缩插件
      • html.tsHTML 插件
      • index.ts入口文件
      • mock.tsMock 插件
      • pwa.tsPWA 插件
      • unplugin.tsUnplugin 插件
      • visualizer.ts构建的依赖大小占比分析插件
    • utils/构建工具相关函数
      • index.ts入口文件
    • index.ts入口文件
  • docker/Docker 配置
    • .dockerignoreDocker 忽略文件
    • DockerfileDocker 配置文件
    • nginx.confNginx 配置文件
  • mock/Mock 相关
    • api/Mock API 接口
      • auth.ts
      • index.ts
      • management.ts
      • route.ts
    • model/Mock 数据
      • auth.ts
      • index.ts
      • route.ts
    • index.ts
  • patches/补丁文件
    • mockjs@1.1.0.patchMock 补丁文件
  • public/公共文件
    • favicon.svg网页图标 Favicon
    • logo.png系统 Logo
  • scripts/脚本文件
    • logo.ts处理 SVG 文件,用于生成 Logo
  • src/源代码
    • assets/静态资源
      • fonts/字体文件
        • aguazyuan-bold.ttf
        • aguazyuan-light.ttf
        • aguazyuan-regular.ttf
      • svg-icon/SVG 图标
        • activity.svg
        • at-sign.svg
        • avatar.svg
        • banner.svg
        • cast.svg
        • chrome.svg
        • copy.svg
        • custom-icon.svg
        • empty-data.svg
        • heart.svg
        • logo-fill.svg
        • logo.svg
        • network-error.svg
        • no-icon.svg
        • no-permission.svg
        • not-found.svg
        • service-error.svg
        • wind.svg
    • components/组件
      • business/业务相关组件
        • loading-empty-wrapper.vue
        • login-agreement.vue
      • common/公共组件
        • app-loading.vue
        • dark-mode-container.vue
        • dark-mode-switch.vue
        • exception-base.vue
        • hover-container.vue
        • naive-provider.vue
        • system-logo.vue
      • custom/自定义组件
        • better-scroll.vue
        • count-to.vue
        • github-link.vue
        • icon-select.vue
        • image-verify.vue
        • svg-icon.vue
        • web-site-link.vue
    • composables/组合式 API
      • echarts.tsECharts
      • events.ts事件
      • icon.ts图标渲染
      • index.ts入口文件
      • layout.ts布局
      • router.ts路由
      • system.ts系统
    • config/全局常量配置
      • index.ts入口文件
      • map-sdk.ts地图插件的 SDK 配置
      • regexp.ts常用的正则表达式
      • service.ts请求相关配置
    • constants/全局常量声明
      • business.ts
      • common.ts
      • index.ts
      • system.ts
    • context/上下文状态
      • demo.ts
      • index.ts
    • directives/Vue 自定义指令
      • index.ts入口文件
      • login.ts登录指令
      • network.ts网络检测指令
      • permission.ts权限指令
    • hooks/组合式的函数钩子
      • business/业务相关钩子
        • index.ts入口文件
        • use-count-down.ts倒计时
        • use-image-verify.ts图片验证码
        • use-sms-code.ts短信验证码
        • use-table.ts表格
      • common/通用钩子
        • index.ts入口文件
        • use-boolean.ts布尔值
        • use-context.ts上下文
        • use-loading-empty.ts加载中和空状态
        • use-loading.ts加载中
        • use-reload.ts重新加载
      • index.ts入口文件
    • layouts/布局
      • basic-layout/基础布局
        • index.vue
      • blank-layout/空白布局
        • index.vue
      • common/公共布局
        • global-content/全局主体内容
          • index.vue
        • global-footer/全局底部
          • index.vue
        • global-header/全局头部
          • components/
            • full-screen.vue
            • github-site.vue
            • global-breadcrumb.vue
            • header-menu.vue
            • index.ts
            • menu-collapse.vue
            • message-list.vue
            • setting-button.vue
            • system-message.vue
            • theme-mode.vue
            • user-avatar.vue
          • index.vue
        • global-logo/全局 Logo
          • index.vue
        • global-search/全局搜索
          • components/
            • index.ts
            • search-footer.vue
            • search-modal.vue
            • search-result.vue
          • index.vue
        • global-sider/全局侧边栏
          • components/
            • vertical-mix-sider/
              • components/
                • index.ts
                • mix-menu-collapse.vue
                • mix-menu-detail.vue
                • mix-menu-drawer.vue
              • index.vue
            • vertical-sider/
              • components/
                • index.ts
                • vertical-menu.vue
              • index.vue
            • index.ts
          • index.vue
        • global-tab/全局多页签
          • components/
            • reload-button/
              • index.vue
            • tab-detail/
              • components/
                • context-menu.vue
                • index.ts
              • index.vue
            • index.ts
          • index.vue
        • setting-drawer/项目配置抽屉
          • components/
            • dark-mode/
              • index.vue
            • drawer-button/
              • index.vue
            • layout-mode/
              • components/
                • index.ts
                • layout-card.vue
                • layout-checkbox.vue
              • index.vue
            • page-func/
              • index.vue
            • page-view/
              • index.vue
            • setting-menu/
              • index.vue
            • theme-color-select/
              • components/
                • color-checkbox.vue
                • color-modal.vue
                • index.ts
              • index.vue
            • theme-config/
              • index.vue
            • index.ts
          • index.vue
        • index.ts
      • index.ts
    • locales/国际化配置
      • lang/
        • en.ts
        • index.ts
        • zh-cn.ts
      • i18n.ts
      • index.ts
    • plugins/插件
      • assets.ts静态资源导入
      • index.ts
    • router/路由
      • guard/路由守卫
        • dynamic.ts动态路由
        • index.ts入口文件
        • permission.ts权限
      • helpers/路由相关的辅助函数
        • index.ts
        • scroll.ts
      • modules/静态模式的路由数据
        • about.ts
        • auth-demo.ts
        • component.ts
        • dashboard.ts
        • document.ts
        • exception.ts
        • function.ts
        • index.ts
        • management.ts
        • multi-menu.ts
        • plugin.ts
      • routes/声明的固定路由
        • index.ts
      • index.ts
    • service/网络请求
      • api/API 接口
        • auth.ts
        • index.ts
        • management.adapter.ts
        • management.ts
      • request/封装的请求函数
        • helpers.ts
        • index.ts
        • instance.ts
        • request.ts
      • index.ts
    • settings/项目初始配置
      • color.json
      • color.ts颜色相关配置
      • index.ts
      • theme.json
      • theme.ts主题相关配置
    • store/Pinia 状态管理
      • modules/状态管理划分的模块
        • app/App 状态
          • index.ts
        • auth/Auth 状态
          • helpers.ts
          • index.ts
        • route/Route 状态
          • index.ts
        • setup-store/setup-store 示例
          • index.ts
        • tab/Tab 状态
          • helpers.ts
          • index.ts
        • theme/Theme 状态
          • helpers.ts
          • index.ts
        • index.ts
      • plugins/状态管理插件
        • index.ts
      • subscribe/订阅状态
        • app.ts订阅 App 的状态
        • index.ts入口文件
        • theme.ts订阅 Theme 的状态
      • index.ts
    • styles/样式
      • css/CSS
        • global.css
        • reset.css
        • transition.css
      • scss/SCSS
        • global.scss
        • scrollbar.scss
    • typings/TypeScript 声明文件(*.d.ts)
      • api.d.ts请求接口返回的数据的类型声明
      • business.d.ts业务相关的类型声明
      • components.d.ts(自动生成)组件相关的类型声明
      • env.d.tsVue 路由描述和请求环境相关的类型声明
      • expose.d.ts暴露给全局的类型声明
      • global.d.ts全局通用类型
      • naive-ui.d.tsNaive UI 组件的类型声明
      • package.d.ts第三方依赖包的类型声明
      • page-route.d.ts(自动生成)页面路由类型声明
      • route.d.ts路由系统的类型声明
      • router.d.tsVue 的路由描述的类型声明
      • storage.d.ts本地缓存的数据类型
      • system.d.ts系统的类型声明
      • union-key.d.ts联合类型
      • utils.d.ts类型工具合集
    • utils/工具函数(纯函数)
      • common/通用工具函数
        • color.ts
        • index.ts
        • number.ts
        • pattern.ts
        • typeof.ts
      • crypto/加密工具函数
        • index.ts
      • form/表单工具函数
        • index.ts
        • rule.ts
      • router/路由工具函数
        • auth.ts
        • breadcrumb.ts
        • cache.ts
        • component.ts
        • helpers.ts
        • index.ts
        • menu.ts
        • module.ts
        • regexp.ts
        • transform.ts
      • service/请求相关工具函数
        • error.ts
        • handler.ts
        • index.ts
        • msg.ts
        • transform.ts
      • storage/存储相关工具函数
        • index.ts
        • local.ts
        • session.ts
      • index.ts
    • views/页面组件
      • _builtin/内置页面(登录、异常页等)
        • 403/
          • index.vue
        • 404/
          • index.vue
        • 500/
          • index.vue
        • constant-page/
          • index.vue
        • login/
          • components/
            • bind-wechat/
              • index.vue
            • code-login/
              • index.vue
            • login-bg/
              • components/
                • corner-bottom.vue
                • corner-top.vue
                • index.ts
              • index.vue
            • pwd-login/
              • components/
                • index.ts
                • other-account.vue
                • other-login.vue
              • index.vue
            • register-user/
              • index.vue
            • reset-pwd/
              • index.vue
            • index.ts
          • index.vue
        • not-found/
          • index.vue
      • about/关于
        • components/
          • dev-dependency.vue
          • index.ts
          • model.ts
          • pro-dependency.vue
          • project-info.vue
          • project-introduction.vue
        • index.vue
      • auth-demo/权限示例
        • permission/
          • index.vue
        • super/
          • index.vue
      • component/组件示例
        • button/
          • index.vue
        • card/
          • index.vue
        • table/
          • index.vue
      • dashboard/仪表盘
        • analysis/
          • components/
            • bottom-part/
              • index.vue
            • data-card/
              • components/
                • gradient-bg.vue
                • index.ts
              • index.vue
            • top-chart/
              • index.vue
            • index.ts
          • index.vue
        • workbench/工作台
          • components/
            • workbench-header/
              • index.vue
            • workbench-main/
              • components/
                • index.ts
                • shortcuts-card.vue
                • technology-card.vue
              • index.vue
            • index.ts
          • index.vue
      • document/文档
        • naive/
          • index.vue
        • project/
          • index.vue
        • project-link/
          • index.vue
        • vite/
          • index.vue
        • vue/
          • index.vue
      • exception/异常页
        • 403/
          • index.vue
        • 404/
          • index.vue
        • 500/
          • index.vue
      • function/功能页
        • tab/
          • index.vue
        • tab-detail/
          • index.vue
        • tab-multi-detail/
          • index.vue
      • management/管理页
        • auth/
          • index.vue
        • role/
          • index.vue
        • route/
          • index.vue
        • user/
          • components/
            • column-setting.vue
            • table-action-modal.vue
          • index.vue
      • multi-menu/多级菜单
        • first/
          • second/
            • index.vue
          • second-new/
            • third/
              • index.vue
      • plugin/插件
        • charts/
          • antv/
            • index.vue
          • echarts/
            • index.vue
        • copy/
          • index.vue
        • editor/
          • markdown/
            • index.vue
          • quill/
            • index.vue
        • icon/
          • icons.ts
          • index.vue
        • map/
          • components/
            • baidu-map.vue
            • gaode-map.vue
            • index.ts
            • tencent-map.vue
          • index.vue
        • print/
          • index.vue
        • swiper/
          • index.vue
        • video/
          • index.vue
      • index.ts
    • App.vueVue 入口文件
    • main.ts项目入口文件
  • .editorconfig编辑器配置文件
  • .env环境变量配置文件
  • .env-config.ts环境变量配置文件
  • .env.development开发环境变量
  • .env.production生产环境变量
  • .eslintignoreESLint 忽略文件
  • .eslintrc.jsESLint 配置文件
  • .gitattributesGit 属性文件
  • .gitignoreGit 忽略文件
  • .npmrcNPM 配置文件
  • CHANGELOG.md变更日志
  • LICENSEMIT License
  • Makefile包含启动命令、Docker 命令
  • README.md项目说明文档
  • changelogithub.config.jsonchangelogithub 配置文件
  • index.htmlHTML 入口文件
  • package.jsonNPM 包配置文件
  • pnpm-lock.yamlpnpm 锁文件
  • tsconfig.jsonTypeScript 配置文件
  • uno.config.tsUnoCSS 配置文件
  • vite.config.tsVite 配置文件

3.2 路由

首先 src\router\index.ts 中从环境变量中读取 VITE_HASH_ROUTEVITE_BASE_URL 决定创建路由的属性。

  • 路由定义文件 src\router\routes\index.ts,路由使用了自定义类型

通过 createRouterGuard 创建路由守卫,此函数在路由前加载进度条,然后验证权限,路由后关闭进度条。

  • 调用了 createPermissionGuard 来验证权限
  • 通过 createDynamicRouteGuard 创建动态路由
  • 使用策略模式 StrategyAction 封装了权限验证逻辑