# fe-sims
**Repository Path**: bingyu123/fe-sims
## Basic Information
- **Project Name**: fe-sims
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2022-05-16
- **Last Updated**: 2025-07-09
## Categories & Tags
**Categories**: Uncategorized
**Tags**: sims
## README
# 振涛学生信息管理(sims)系统前端开发文档
1. 后端
1. nest + ts + log + redis + MR + devOps(待定) + webhooks + swagger enum
2. 前端
1. vue2 + eslint + standard + svg + sass + vue-router + auth2token(待处理) +crypto-js
2. 权限
1. 菜单级别权限
2. 按钮级别权限
2. 数据权限
3. 鉴权
1. 401 : token
2. 403 : 角色权限
```mermaid
%% 语法示例
gantt
dateFormat YYYY-MM-DD
title 振涛SIMS开发甘特图
section 设计
需求 :done, des1, 2022-05-19,2022-05-20
原型 :active, des2, 2022-05-20, 13d
UI设计 :done des3, after des2, 7d
未来任务 :active des4, 2022-06-08, 5d
section 开发
理解需求 :crit, done,resolve, 2022-05-19,30h
设计框架 :crit, done,kuangjia, after resolve, 10d
开发 : crit ,kaifa, after kuangjia,15d
修改bug和新功能 : weilai,after kaifa, 5d
section 测试
功能测试 :active, a1, after kaifa, 7d
压力测试 :after a1 , 4d
测试报告 : 48h
```
## 1. 目录结构
本项目已经为你生成了一个完整的开发框架,下面是整个项目的目录结构。
```bash
├── public # 静态资源会被复制到打包目录
├── src # 源代码
│ ├── api # 所有请求
│ ├── assets # 主题 字体等静态资源
│ ├── components # 全局公用组件
│ ├── directive # 全局指令
│ ├── filters # 全局 filter(如果有加在这)
│ ├── icons # 项目所有 svg icons svg-icon className=''
│ ├── layout # 全局 layout
│ ├── router # 路由
│ ├── store # 全局 store管理 getters : 缓存
│ ├── styles # 全局样式
│ ├── utils # 全局公用方法
│ ├── views # views 所有页面
│ ├── App.vue # 入口页面
│ ├── main.js # 入口文件 加载组件 初始化等
│ └── permission.js # 权限管理
├── .postcssrc.js # postcss 配置
└── package.json # package.json
└── vue.config.js # 配置文件
```
## 安装
```bash
# 克隆项目
git clone 地址
# 进入项目目录
cd ztjy-sims
# 拉取分支
git pull origin bao
# 安装依赖
npm install
# 建议不要用 cnpm 安装 会有各种诡异的bug 可以通过如下操作解决 npm 下载速度慢的问题
npm install --registry=https://registry.npm.taobao.org
# 这里推荐使用nrm
# 本地开发 启动项目
npm run dev
```
## 2. 用到的技术and why
- crypto-js **前端md5加密**
- element-ui **UI库**
- normalize.css **全局样式**
- nprogress **路由跳转加载的进度**
- vuex **状态管理**
- vue-router **路由**
## 3. 布局
> 最外层是Layout组件
>
> 里面嵌套3个大组件

> 对应代码
>
> @/layout
## 4. 请求拦截
> @/utils/request
设计思想和后端restful-api对应,针对每个错误的状态码都进行处理
> @/api
所有的请求都在这里处理
## 5. 状态管理
- 多用getters https://github.com/vuejs/vuex/issues/1629
- `namespaced` 模块化管理
## 6. 权限
关于权限处理,需要结合后台返回权限
该项目中权限的实现方式是:通过获取当前用户的`权限路由id`去比对路由表,生成当前用户具的权限可访问的路由表,通过 `router.addRoutes` 动态挂载到 `router` 上。
现在路由层面权限的控制代码都在 `@/permission.js` 中
实现思路:在路由配置文件中需要携带权限的`id`
### 6.1权限流程
```mermaid
graph TB
login--点击登录-->beforeEach(路由拦截)
跳转页面--404-->重定向到404
beforeEach-->hasToken{是否存在token}
hasToken--yes-->isLogin{是否跳转到/login}
hasToken--no-->isWhite{是否是白名单}
跳转页面-->beforeEach
isWhite--yes-->next(next)
isWhite--no:重定向到登录页-->login
isLogin--yes-->toBase(重定向到主页面)
isLogin--no-->hasRouterId{仓库是否有视图id}
hasRouterId--yes-->next
hasRouterId--no-->request(请求userinfo将返回的视图权限id存储到仓库)
request-->addRoutes发送请求动态生成路由-->next
axios发送请求-->error{发生错误}
error--路由不存在-->重定向到404
error--401未授权-->login
```
### 6.2 指令权限
封装了一个指令权限,能简单快速的实现按钮级别的权限判断。
```html
adminBtn
editorBtn
```
## 7. development
开发环境中在before中mock数据
## 8. 路由和侧边栏规则(必看)
> 该项目侧边栏和路由是绑定在一起的,所以你只有在 `@/router/index.js` 下面配置对应的路由,侧边栏就能动态的生成了。大大减轻了手动重复编辑侧边栏的工作量。当然这样就需要在配置路由的时候遵循一些约定的规则。
### 8.1 配置项
```js
// 当设置 true 的时候该路由不会在侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1
hidden: true // (默认 false)
//当设置 noRedirect 的时候该路由在面包屑导航中不可被点击
redirect: 'noRedirect'
// 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面
// 只有一个时,会将那个子路由当做根路由显示在侧边栏--如引导页面
// 若你想不管路由下面的 children 声明的个数都显示你的根路由
// 你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则,一直显示根路由
alwaysShow: true
name: 'router-name' // 设定路由的名字,一定要填写不然使用时会出现各种问题
meta: {
id: 'path' // 设置该路由进入的权限id 使用路径保证唯一性
title: 'title' // 设置该路由在侧边栏和面包屑中展示的名字
icon: 'svg-name' // 设置该路由的图标
// noCache: true // 如果设置为true,则不会被 缓存(默认 false)
breadcrumb: false // 如果设置为false,则不会在breadcrumb面包屑中显示(默认 true)
// 当路由设置了该属性,则会高亮相对应的侧边栏。
// 这在某些场景非常有用,比如:一个文章的列表页路由为:/article/list
// 点击文章进入文章详情页,这时候路由为/article/1,但你想在侧边栏高亮文章列表的路由,就可以进行如下设置
activeMenu: '/article/list'
}
```
### 8.2 示例
```js
{
path: '/permission',
component: Layout,
redirect: '/permission/index', //重定向地址,在面包屑中点击会重定向去的地址
hidden: true, // 不在侧边栏线上
alwaysShow: true, //一直显示根路由
children: [{
path: 'index',
component: ()=>import('permission/index'),
name: 'permission',
meta: {
title: 'permission',
icon: 'lock', //图标
id: 'permission/index', //或者你可以给每一个子路由设置自己的权限
// noCache: true // 不会被 缓存
}
}]
}
```
### 8.3 路由
这里的路由分为两种,`constantRoutes` 和 `asyncRoutes`。
**constantRoutes:** 代表那些不需要动态判断权限的路由,如登录页、404、等通用页面。
**asyncRoutes:** 代表那些需求动态判断权限并通过 `addRoutes` 动态添加的页面。
具体看权限验证。
### 8.4 侧边栏
本项目侧边栏主要基于 `element-ui` 的 `el-menu` 改造。
前面也介绍了,侧边栏是通过读取路由并结合权限判断而动态生成的,而且还需要支持路由无限嵌套,所以这里还使用到了递归组件。
代码:
`@/views/layout/components/Sidebar`
之所以封装是方便修改侧边栏样式 并且添加我们自己的图标
### 8.5 面包屑
本项目中也封装了一个面包屑导航,它也是通过 `watch $route` 变化动态生成的。它和 menu 也一样,也可以通过之前那些配置项控制一些路由在面包屑中的展现。大家也可以结合自己的业务需求增改这些自定义属性。比如可以在路由中声明`breadcrumb:false`,让其不在 `breadcrumb` 面包屑显示。
> 代码地址 `@/components/Breadcrumb`
### 8.6 侧边栏滚动问题
传统方案中
```css
overflow-y: scroll;
::-webkit-scrollbar {
display: none;
}
```
首先这样写会有兼容性问题,在火狐或者其它低版本浏览器中都会比较不美观。其次在侧边栏收起的情况下,受限于 `element-ui`的 `menu` 组件的实现方式,不能使用该方式来处理。
所以 本项目中使用了 `el-scrollbar` 来处理侧边栏滚动问题
### 8.7 侧边栏配置项
```html
```
## 9. 公共组件的使用(必看)
### 9.1 `svg-icon`(矢量图组件)
全局 `Svg Icon` 图标组件。
默认在 `@/icons`中注册到全局中,可以在项目中任意地方使用。所以图标均可在 `@/icons/svg`。可自行添加或者删除图标,所以图标都会被自动导入,无需手动操作。
#### 9.1.1 使用方式
```html
```
#### 9.1.2 改变颜色
```
svg-icon 默认会读取其父级的 color fill: currentColor;
```
你可以改变父级的`color`或者直接改变`fill`的颜色即可。
#### 9.1.3 使用外链
支持使用外链的形式引入 `svg`。例如:
```vue
## 这是一个前端项目的测试文件要上线
## 这是一个前端项目的测试文件要上线
## 这是一个前端项目的测试文件要上线