项目规范
项目目录介绍
[========]
├── .github # 自动化 ci 配置(可删除) ├── .vscode # vscode 配置 ├── mock # 本地 mock 数据 ├── node_modules # 项目依赖模块 ├── public │ ├── static # 静态资源 │ ├── favicon.ico # favicon │ ├── favicon_backup.ico # 备份favicon │ └── index.html # 入口 HTML ├── src │ ├── api # API 服务模块 │ ├── assets # 本地静态资源 │ ├── config # 项目配置 │ │ ├── default # 默认配置 │ │ └── config.js # 自定义配置 │ ├── extra # 封装的小工具 │ ├── i18n # 多语言 │ ├── icon # 存放自定义svg图标 ,仅在icon属性为isCustomSvg时才会调用svg图标,如无必要建议使用内置图标 │ ├── router # 路由配置 │ ├── store # vuex 状态管理配置 │ ├── utils # js 工具 │ ├── vab # 核心模块 │ │ |── components # 所有vab组件 | | | ├── VabAppMain # 内页 | | | ├── VabAvatar # 头像 | | | ├── VabBreadcrumb # 面包屑 | | | ├── VabFold # 展开合并 | | | ├── VabFullScreen # 全屏 | | | ├── VabLanguage # 国际化 | | | ├── VabLogo # logo | | | ├── VabNav # 顶部navBar | | | ├── VabNotice # 通知 | | | ├── VabRefresh # 刷新 | | | ├── VabSearch # 搜索 | | | ├── VabSideBar # 左侧菜单 | | | ├── VabTabs # 多标签页 | | | ├── VabTheme # 主题 | | | ├── VabTopBar # 横向布局头部 | | | ├── VabLink # 链接跳转封装 | | | ├── VabMenu # 菜单封装 │ │ | └── VabQueryForm # 顶部查询条件布局封装 │ │ ├── layouts # 界面布局(不需要主题可删除) | | | ├── VabLayoutColumn # 分栏布局 | | | ├── VabLayoutCommon # 常规布局 | | | ├── VabLayoutComprehensive # 综合布局 | | | ├── VabLayoutHorizontal # 横向布局 | | | └── VabLayoutVertical # 纵向布局 │ │ ├── pulgin # vab必要插件 │ │ └── styles # vab主题相关 │ ├── views # 页面组件 │ │ ├── callback # 第三方登录回调页面 │ │ ├── index # 首页 │ │ ├── login # 登录 │ │ ├── mall # 物料市场 │ │ ├── setting # 配置 │ │ ├── register # 注册 │ │ └── vab # 组件页 │ ├── App.vue # 应用入口组件 │ └── main.js # 应用入口js ├── .eslintrc.js # eslint 配置项 ├── babel.config.js # babel-loader 配置 ├── package.json # package.json ├── postcss.config.js # postcss 配置 ├── prettier.config.js # prettier 配置 ├── vab.config.js # vab 配置 └── vue.config.js # vue-cli 配置
vue/cli 配置
位置:src/config/default/cli.config.js
/**
* @description 导出vue/cli配置
*/
module.exports = {
//开发以及部署时的URL,hash模式时在不确定二级目录名称的情况下建议使用""代表相对路径或者"/二级目录/",history模式默认使用"/"或者"/二级目录/"
publicPath: "",
//生产环境构建文件的目录名
outputDir: "dist",
//放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录。
assetsDir: "static",
//开发环境每次保存时是否输出为eslint编译警告
lintOnSave: true,
//进行编译的依赖
transpileDependencies: ["vue-echarts", "resize-detector"],
//开发环境端口号
devPort: "9999",
//需要自动注入并加载的模块
providePlugin: {},
//npm run build时是否自动生成7z压缩包
build7z: false,
};
网络配置
位置:src/config/default/net.config.js
/**
* @description 导出网络配置
**/
module.exports = {
//默认的接口地址 如果是开发环境和生产环境走vab-mock-server,当然你也可以选择自己配置成需要的接口地址
baseURL:
process.env.NODE_ENV === "development" ? "mock-server" : "mock-server",
//配后端数据的接收方式application/json;charset=UTF-8 或 application/x-www-form-urlencoded;charset=UTF-8
contentType: "application/json;charset=UTF-8",
//最长请求时间
requestTimeout: 10000,
//操作正常code,支持String、Array、int多种类型
successCode: [200, 0, "200", "0"],
//数据状态的字段名称
statusName: "code",
//状态信息的字段名称
messageName: "msg",
};
路由配置项
语法与 vue-router 语法一致,具体详见src/router/index.js
{
"hidden": true, //是否显示在菜单中显示隐藏路由(默认值:false)
"menuHidden": false, //是否显示在菜单中显示隐藏一级路由(默认值:false,除分栏布局有效)
"alwaysShow": true, //当只有一级子路由时是否显示父路由是否显示在菜单中显示路由(默认值:false)
"name": "Demo", //首字母大写,一定要与vue文件的name对应起来,用于noKeepAlive缓存控制(该项特别重要)
"meta": {
"title": "title", //菜单、面包屑、多标签页显示的名称
"roles": ["admin", "..."], //当config/settings.js中rolesControl配置开启时,用于控制角色(简写)
"roles": {
//当config/settings.js中rolesControl配置开启时,用于控制角色(全写)
"role": ["admin", "..."],
"ability": ["READ", "WRITE", "DELETE"], //ability: ["READ","WRITE"],
"mode": "allOf" //allOf: 数组内所有角色都拥有,返回True oneOf: 数组内拥有任一角色,返回True(等价第1种数据) except: 不拥有数组内任一角色,返回True(取反)
},
"remixIcon": "", //旧版remix图标
"icon": "", //新版
"isCustomSvgIcon": false, //旧版,是否是自定义svg图标(默认值:false,如果设置true,那么需要把你的svg拷贝到icon/remixIcon下,然后remixIcon字段配置上你的图标名)
"isCustomSvg": false, //新版,是否是自定义svg图标(默认值:false,如果设置true,那么需要把你的svg拷贝到icon/remixIcon下,然后remixIcon字段配置上你的图标名)
"noKeepAlive": true, //当前路由是否不缓存(默认值:false)
"affix": true, //当前路由是否固定多标签页(旧版)
"noCLosable": true, //当前路由是否可关闭多标签页,同上(新版)
"badge": "New", //badge小标签(只支持子级)
"tabHidden": true, //当前路由是否不显示多标签页
"activeMenu": "", //高亮指定菜单
"dot": false, //小圆点
"dynamicNewTab": false // 动态传参路由是否新开标签页
},
"children": []
}
样式
scoped
强烈建议使用 scoped ,父组件的样式将不会渗透到子组件中。不过一个子组件的根节点会同时受其父组件的 scoped CSS 和子组件的 scoped CSS 的影响。这样设计是为了让父组件可以从布局的角度出发,调整其子组件根元素的样式。
通过深度选择器自定义子组件样式
该方法同样适用于局部某个组件自定义 element-ui 样式
<style lang="scss" scoped>
::v-deep {
.el-menu--collapse {
border-right: 0 !important;
.el-submenu__icon-arrow {
right: 10px;
margin-top: -3px;
}
.el-submenu__title {
span {
display: none;
}
}
}
}
</style>
对于常见的布局样式或者公共的一些样式,列如常见的flex 布局之类的,建议在公共样式文件中定义一个class 类, 后期需要的样式直接添加class 减少重复代码。
后端接口联调,必看!!!
方案 1:直接连接方案(记得后端配置跨域)方案 1:直接连接方案(记得后端配置跨域)
修改位置src/config/net.config.js
/**
* @description 导出网络配置
**/
module.exports = {
// 默认的接口地址,开发环境和生产环境都会走/vab-mock-server
// 正式项目可以选择自己配置成需要的接口地址,如"https://api.xxx.com"
// 问号后边代表开发环境,冒号后边代表生产环境
baseURL:
process.env.NODE_ENV === "development"
? "/vab-mock-server"
: "/vab-mock-server",
};
方案 2:代理连接方案(不推荐方案)
打开 vue.config.js 放开注释,就可以了(记住了,其他的啥都不用改,不用改动 settings.js 的 baseURL,框架会自动将 vab-mock-server 后缀代理到你的后台地址,此方式仅在开发环境临时解决跨域,建议直接后端配置,一劳永逸)
proxy: {
[baseURL]: {
target: `http://你的后端接口地址`,//所有配置不要动,只改这一个地方,改完重启项目
ws: true,
changeOrigin: true,
pathRewrite: {
["^/" + baseURL]: "",
},
},
},
开发、打包注意事项!!!
node 版本与包管理工具
node 版本请安装官网最新正式版 14,node 版本小于 12 无法运行此项目
包管理工具建议使用 cnpm 或 pnpm,使用 npm 或 yarn 安装可能导致图片压缩依赖无法正常安装
布局与主题冗余会导致项目体积较大,访问速度变慢,故建议您选定一种布局或主题后删除其余不需要的布局和主题代码,加快网站访问速度
打包时建议注释掉的功能
主要介绍下,常需要注意的一些地方,主要集中在src目录下
文件夹命名统一采用驼峰式命名始终是单词大写开头 (PascalCase),js文件,vue 文件 变量名采用小驼峰 path:’/pascalCase”,避免定义无效变量,常量命名要大写 const MAX_DECRYPT_BLOCK = 128
1:(view,api) 下页面文件夹命名:
为了方便维护,view下新建文件夹名称要与 api 下接口文件夹名称一致,文件夹命名主要以功能模块代表命名,
view 下文件夹的单个vue页面,不要写太多代码,禁止在 src/components 目录下放置业务私有组件,业务私有组件应该在业务相关文件夹下建立components目录存放。
2:vue 单页面中设置名称 name 与文件夹名称路由名称一致。
主要是命名规则的介绍
1.新建页面
2:添加路由
3:新建页面的api
4:新建store
5:配置信息
项目所有的配置信息文件在 src/config 目录下
经常修改的 请求后台baseuRL 配置如下
第一个是开发环境下的,第二个是线上的baseUrl
开发时,跳过登录验证。
项目文件夹下vue.config.js 开发环境时跨域可配置代理(不推荐),建议后台配置跨域,
打包
1:config/net.config.js 设置好baseUrl 2:注释main.js 中的mock 3:image-webpack-loader 报错 cnpm i image-webpack-loader -D 4:项目根目录.env 文件填入您购买时绑定的用户名 5:项目根目录新建.env.local 配置下您购买时根据您用户名发放的 key,注意是新建,不是把.env 复制一份改动!!!!
打包时可能遇到的常见错误
打包报错 Cannot find module 'gifsicle' 方案 1:请使用使用 cnpm 安装,一定 cnpm 安装
项目根目录
cnpm i image-webpack-loader -D
方案 2:去src/config/cli.config.js关闭图片压缩
module.exports = {
// npm run build时是否开启图片压缩,由于国内网路原因image-webpack-loader必须使用cnpm安装,如无法使用cnpm,请配置false
imageCompression: true,
};
打包提示未配置秘钥 打包提示秘钥失效请填写秘钥到 env.local 中
常见问题
vendor 过大问题
建议使用 gzip,使用之后体积会只有原先 1/3 左右,pro 默认已开启
url 去掉
第 1 步:设置src/config/cli.config.js下的配置publicPath不能为空 第 2 步:修改src/config/cli.config.js下的配置routerMode为history 第 3 步:需要后端配合
构建和发布
项目根目录
cnpm i
npm run serve
npm run build
注释
公共组件使用说明
各组件中重要函数或者类说明
复杂的业务逻辑处理说明
特殊情况的代码处理说明,对于代码中特殊用途的变量、存在临界值、函数中使用的 hack、使用了某种算法或思路等需要进行注释描述
多重 if 判断语句
注释块必须以/**(至少两个星号)开头**/
单行注释使用//
其他
1:调试信息 console.log() debugger 使用完及时删除 2:除了三目运算,if,else 等禁止简写 3:判断相等时统一使用 === 而不是 ==; 4:后台返回的数据,接受后做必要的检验,数据是否合理,给出相应异常弹出框提示信息。 5:统一使用es6语法,let const … Array.form() 箭头函数 等等, 6:DOM 元素的 隐藏显示 使用 v-if v-show 而不是 通过 :class=”{}” 生成不同的类名 定义 display:none, 7:对element ui 组件进行二次封装时合理使用 $attrs $listeners 8:this.$nextclick(()=>{}) 正确使用 9:写代码时,尽可能的精简代码,能封装的就尽量抽离出来。 10:减少代码内设置行内样式,尽量定义语义化的class 11:页面中没有使用到的变量,方法等。上传svn前及时删除。