# 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个大组件 ![image-20200528132723927](https://cdn.jsdelivr.net/gh/IceRain-mvc/cdn/img/image-20200528132723927.png) > 对应代码 > > @/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 ``` ## 7. development 开发环境中在before中mock数据 image-20200529215151273 ## 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` 面包屑显示。 image-20200529213655647 > 代码地址 `@/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 ## 这是一个前端项目的测试文件要上线 ## 这是一个前端项目的测试文件要上线 ## 这是一个前端项目的测试文件要上线