# vue-element-template **Repository Path**: Xbaiss/vue-element-template ## Basic Information - **Project Name**: vue-element-template - **Description**: 基于vue-admin-template框架完善操作,如:菜单权限、按钮权限 - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: master - **Homepage**: https://github.com/PanJiaChen/vue-admin-template - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-04-03 - **Last Updated**: 2020-12-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # vue-admin-template #### 介绍 基于vue-admin-template-master框架完善操作,如:菜单权限、按钮权限 https://panjiachen.gitee.io/vue-element-admin-site/zh/guide/#功能 #### 目录结构 ├── build # 构建相关 ├── mock # 项目mock 模拟数据 ├── node_modules npm install 生成 ├── public 打包所需静态资源 ├── index.html 模板文件 └── favicon.ico 浏览器图标 ├── src ├── api AJAX请求 ├── assets 项目静态资源 ├── fonts 自定义图标资源 ├── 404_images图片资源 └── images 图片资源 ├── components 公共组件 ├── common 页面公共组件() ├── Breadcrumb 面包屑组件(框架定的) ├── Hamburger 菜单折叠的组件(框架定的) ├── SvgIcon svg图标组件(框架定的,左菜单中) ├── busines 业务组件(日期组件) ├── directive 自定义指令 ├── icons # 项目所有 svg icons ├── layout # 全局 layout ├── router 路由配置 ├── index.js └── routers.js ├── store Vuex配置 ├── modules 不同模块vuex └── index.js vuex统一入口(存储LocalStorage) ├── styles 公共样式文件 ├── uitls 封装工具函数 ├── jsonStore HIS13壳本地存储工具(挂载到VUE) ├── tools 所有自定义工具集合 ├── util.js 工具引入文件(挂载到VUE) └── request.js axios AJAX请求工具 ├── views 页面文件 ├── App.vue 入口页面 └── main.js 入口文件 加载组件 初始化等 └── permission.js 路由拦截 权限控制 └── settings.js 框架一些设置 ├── tests # 测试 ├── .env.xxx # 环境变量配置 ├── .eslintrc.js # eslint 配置项 ├── .babelrc # babel-loader 配置 ├── .travis.yml # 自动化CI配置 ├── vue.config.js # vue-cli 配置 ├── postcss.config.js # postcss 配置 ├── babel.config.js # babel配置 └── package.json # package.json #### 安装 # 进入项目目录 cd backoffice # 安装依赖 npm install # 建议不要用 cnpm 安装 会有各种诡异的bug 可以通过如下操作解决 npm 下载速度慢的问题 npm install --registry=https://registry.npm.taobao.org # 本地开发 启动项目 npm run dev #### 开发规范 1). 开发工具使用 A.建议使用统一开发工具vscode B.vscode 使用插件建议 1 Chinese (Simplified) Language Pack for Visual Studio Code 2 formate: CSS/LESS/SCSS formatter 3 Vetur 4 Vue Peek 5 Vue VSCode Snippets 6 vue-definition 7 vue-format C.使用统一缩进,以tab缩进,一个tab大小为4个空格 2). 框架 / Vue 1.项目目录结构规范 2.路由名与组件名 为多个英文单词,并且用连接线(-)连接,避免与 HTML 标签冲突,并且结构更加清晰。 示例: // 反例export default {name: 'item'} // 正例export default {name: 'page-article-item'} 3.组件文件 4.Prop 定义 Prop 的时候应该始终以驼峰格式(camelCase)命名。这里遵循每个语言的特性,因为在 HTML 标记中对大小写是不敏感的,使用连接线更加友好;而在 JavaScript 中更自然的是驼峰命名。 示例: // 反例 props: {article-status: Boolean} // 正例 props: {articleStatus: Boolean} Prop 的定义应该尽量详细的指定其类型、默认值和验证。 示例: // 反例 props: ['attrM', 'attrA', 'attrZ'] // 正例 props: { attrM: Number, attrA: { type: String, required: true }, attrZ: { type: Object, // 数组/对象的默认值应该由一个工厂函数返回 default: function () { return { msg: '成就你我' } } }, attrE: { type: String, validator: function (v) { return !(['success', 'fail'].indexOf(v) === -1) } }} 5.v-for 在执行 v-for 遍历的时候,总是应该带上 key 值使更新 DOM 时渲染效率更高。 示例: // 反例 // 正例 v-for 应该避免与 v-if 在同一个元素(例如:
  • )上使用,因为 v-for 的优先级比 v-if 更高,为了避免无效计算和渲染,应该尽量将 v-if 放到容器的父元素之上。 示例: // 反例 // 正例 6.指令缩写 为了统一规范始终使用指令缩写,使用v-bind,v-on并没有什么不好,这里仅为了统一规范。 示例: 7.样式 为了避免样式冲突,整个项目要么全都使用 scoped 特性,要么使用 BEM 约定。 8.单文件组件的元素顺序 9.VUEX使用规范 (1)模板使用vuex-persistedstate默认localStorage来固化数据 (2)基于1最好不要使用 Vuex,目前只是来管理APP和用户信息状态 import createPersistedState from "vuex-persistedstate"; const store = new Vuex.Store({ state: { // }, mutations: { // }, actions: { }, modules: { app, user }, plugins: [createPersistedState()] }); export default store; 10.所有涉及AJAX接口的区域和按钮都要加上 Loading状态 11.封装组件: 11.1 有包含子组件的 要把子组件的方法和参数暴露出来供调用者使用(this.$refs.xxx()),切误使用Bus. 11.2 减少耦合性 11.2.1 所谓低耦合,就是一个组件在多个环境,复杂的项目下,都可以运行,而不会出现不可用的情况 11.2.2 应尽量减少使用全局变量 11.2.3 不推荐在Js里修改样式,这样所有样式依然回归到css样式中 11.2.4 尽量父组件处理事件 11.2.5 不要依赖 Vuex,在写入数据庞大的 state 的时候,就会产生内存泄露 11.2.6 不要在公共组件里写太多的业务逻辑 11.3 尽量使用具名插槽 12. 注释规范 12.1 methods //是否可阅读 function canRead(){ return true; } //获取姓名 function getName{ return this.name } 12.2 data 变量名(尽量注释或者语义化) return { lazyCurrent: 1, //懒加载当前页 lazyCount: 0, //懒加载总计 loading: false //是否加载中 }; 12.3 common组件在本地文件目录写个README.md(包含API,方法,事件,插槽) 12.4 utils工具 @param 参数名{类型}{描述信息} 示例:@param name{String}{传入名称} @return 返回类型{描述信息} 示例:@return Boolean{true 可执行,false 不可执行} @author 作者{日期} 示例:@author 张三{2020.02.06} 完整示例: /** * 合并Grid的行 * @param grid {Ext.Grid.Panel} 需要合并的Grid * @param cols {Array} 需要合并列的Index(序号)数组;从0开始计数,序号也包含。 * @param isAllSome {Boolean} :是否2个tr的cols必须完成一样才能进行合并。true:完成一样;false(默认):不完全一样 * @return void * @author polk6 2015/07/21 */ 12.5 AJAX接口,写明当前接口作用 12.6 template 代码块做好注释以方便查找 12.7 当前页面公共方法参考12.4 13. 公共接口放在api/common(如:动态字典,系统参数) 14. 父组件不允许直接修改子组件data的值,如果一定要改可定义方法供父组件调用 3). JavaScript 1.var / let / const 建议不再使用 var,而使用 let / const,优先使用 const。任何一个变量的使用都要提前申明,除了 function 定义的函数可以随便放在任何位置。 2.对象 --- 建议使用扩展运算符拷贝对象而不是 Object.assign(target, ...sources)。 示例: // 错误const foo = {a: 0, b: 1}const bar = Object.assign(foo, {c: 2}) // 反例const foo = {a: 0, b: 1}const bar = Object.assign({}, foo) // 正例const foo = {a: 0, b: 1}const bar = JSON.parse(JSON.stringify(foo)) // 极好const foo = {a: 0, b: 1}const bar = {...foo, c: 2} // 更好const foo = {a: 0, b: 1}const bar = _.merge({}, foo, {a:2,c:{a:1}}); 对象尽量静态化,添加新属性使用 Object.assign(target, ...sources)。 示例: // 反例const foo = {a: 3} foo.b = 4 // 正例const foo = {a: 3} Object.assign(foo, {b: 4}) 若有遍历对象的需求,优先使用 Map 结构。 示例: // 反例const myMap = { foo: 0, bar: 1}for (let key in myMap) { // ...} // 正例const myMap = new Map([])for (let [key, value] of myMap.entries()) { // ...} 3.模块 统一使用 import / export 的方式管理项目的模块。 示例: // lib.jsexport default {} // app.jsimport app from './lib' import 统一放在文件顶部。 如果模块只有一个输出值,使用 export default,否则不用。 4.循环 for (var i = 0; i < arr.length; i++) {} >这样的方式遍历不是很好,尤其当 arr 是 Dom 对象的时候,这样就会一直在访问 Dom 层, 访问 Dom 层的代价是很大的。for (var i = 0, j=arr.length; i < j; i++) {} >这样的方式去用循环是比较好的, 只会访问一次 Dom 层(不适用于 Dom 节点会动态更新的场景)。 5.eval 避免使用 eval,如要进行字符串转化为对象,最好使用浏览器的内置方法来解析 JSON 数据,以确保代码的安全性和数据的合法性。 如果浏览器不支持 JSON.parse(),你可以使用 JSON.org 所提供的库。如果不得不使用 eval(),可以尝试用 new Function() 来代替, 在 new Function() 中运行的代码会在一个局部函数作用域内执行,因此源码中定义的变量不会自动变成全局变量。 6.函数/方法,要添加功能注释 7.函数/方法要保持功能单一,一个方法只做一件事情,复杂的功能要进行拆分 8.来自于接口返回的数据,和来自于本地存储的数据使用之前要做容错处理,保证程序健壮性 9.该用switch 的时候用switch,滥用if/else会使程序的可读性变差 10.在一票否决的情况下,可以采用写法如if(x)return 减少代码块嵌套深度 #### 指令使用说明 1.v-hotkey 快捷键指令 eg:
    请尝试: F4; ALT+Enter
    优先级: 1. 在vuex中建一个modules(app) state变量是 hotkeyPriority,提供一个mutations(updateHotkeyPriority) 2. 人工判断是否存在冲突,目前主框架快捷键(F1~F9), 配置文件(保存 CTRL+S,打印 CTRL+P,查询/刷新 CTRL+R,全选 CTRL+A)存在被修改可能 3. 引用的子组件或弹窗内容在不显示直接销毁(v-if="false") 4. 默认加上 data-hotkey-enable="true" 2.v-defaultval 控制下拉框 禁止默认数据删除 defaultValSet 的数据必须是 { // options 下拉选项 // defaultValue 默认值判断值 } :disabled="item.optKey ==defaultValSet.defaultValue" //让这个选项 的值不能有任何操作 eg: data() { return { hospitalValue:[]//选中的值 hospitalOptions:[]//下拉框的所有值 } } 3.v-permissionBtn 按钮权限控制 (当前用户没有权限时,组件上使用了该指令则会被隐藏) v-permissionBtn="['account_btn']" 这个值是跟后端定好的,在获取路由的时候就有了 eg: 一键审核