![]() |
+ ![]() |
+ ![]() |
+
加 主任 “卓大” 微信 拉你入群,一起学习 |
+ 关注 “小镇程序员” 分享代码与生活、技术与赚钱 |
+ 请 “1024创新实验室” 喝咖啡 支持我们的开源与分享 |
+
![]() |
+
{{ normalizedFullName }}
+ + +// 复杂表达式已经移入一个计算属性 +computed: { + normalizedFullName: function () { + return this.fullName.split(' ').map(function (word) { + return word[0].toUpperCase() + word.slice(1) + }).join(' ') + } +} +``` + +反例: + +```js + ++ {{ + fullName.split(' ').map(function (word) { + return word[0].toUpperCase() + word.slice(1) + }).join(' ') + }} +
+ +``` + +### 3.5、 标签顺序 + +单文件组件应该总是让标签顺序保持为 ` 、 + +``` + +反例: + +``` +... + + +``` + + +## 四、Vue Router 规范 + +### 4.1、 页面传参 + +页面跳转,例如 A 页面跳转到 B 页面,需要将 A 页面的数据传递到 B 页面,推荐使用 路由参数进行传参,即 `{query:param}` + +正例: + +```js +let id = ' 123'; +this.$router.push({ name: 'userCenter', query: { id: id } }); +``` + + +### 4.2、 path 和 name 命名规范 +- path`kebab-case`命名规范(尽量与vue文件的目录结构保持一致,因为目录、文件名都是`kebab-case`,这样很方便找到对应的文件) +- path 必须以 / 开头,即使是children里的path也要以 / 开头。如下示例 +- 经常有这样的场景:某个页面有问题,要立刻找到这个vue文件,如果不用以/开头,path为parent和children组成的,可能经常需要在router文件里搜索多次才能找到,而如果以/开头,则能立刻搜索到对应的组件 +- name 命名规范采用`KebabCase`命名规范且和component组件名保持一致!(因为要保持keep-alive特性,keep-alive按照component的name进行缓存,所以两者必须高度保持一致) + +```js +// 动态加载 +export const reload = [ + { + path: '/reload', + name: 'reload', + component: Main, + meta: { + title: '动态加载', + icon: 'icon iconfont' + }, + + children: [ + { + path: '/reload/smart-reload-list', + name: 'SmartReloadList', + meta: { + title: 'SmartReload', + childrenPoints: [ + { + title: '查询', + name: 'smart-reload-search' + }, + { + title: '执行reload', + name: 'smart-reload-update' + }, + { + title: '查看执行结果', + name: 'smart-reload-result' + } + ] + }, + component: () => + import('@/views/reload/smart-reload/smart-reload-list.vue') + } + ] + } +]; +``` + + +## 五、 Vue 项目规范 + + +### 5.1、 目录规范 + +``` +src 源码目录 +|-- api 所有api接口 +|-- assets 静态资源,images, icons, styles等 +|-- components 公用组件 +|-- config 配置信息 +|-- constants 常量信息,项目所有Enum, 全局常量等 +|-- directives 自定义指令 +|-- i18n 国际化 +|-- lib 外部引用的插件存放及修改文件 +|-- mock 模拟接口,临时存放 +|-- plugins 插件,全局使用 +|-- router 路由,统一管理 +|-- store vuex, 统一管理 +|-- theme 自定义样式主题 +|-- utils 工具类 +|-- views 视图目录 +| |-- role role模块名 +| |-- |-- role-list.vue role列表页面 +| |-- |-- role-add.vue role新建页面 +| |-- |-- role-update.vue role更新页面 +| |-- |-- index.less role模块样式 +| |-- |-- components role模块通用组件文件夹 +| |-- employee employee模块 +``` + +### 5.2、 api 目录 + +- api文件要以api为结尾,比如 `employee-api.js`、`login-api.js`,方便查找 +- api文件必须导出对象必须以`Api`为结尾,如:`employeeApi`、`noticeApi` +- api中以一个对象将方法包裹 +- api中的注释,必须和后端 swagger 文档保持一致,同时保留后端作者 + +正例: + +前端: `department-api.js` + +```js +import { getRequest, postRequest } from '/@/lib/axios'; + +export const departmentApi = { + /** + * @description: 查询部门列表 @author 卓大 + * @param {*} + * @return {*} + */ + queryAllDepartment: () => { + return getRequest('/department/listAll'); + }, + + /** + * @description: 查询部门树形列表 @author 卓大 + * @param {*} + * @return {*} + */ + queryDepartmentTree: () => { + return getRequest('/department/treeList'); + }, + + /** + * @description: 添加部门 @author 卓大 + * @param {*} + * @return {*} + */ + addDepartment: (param) => { + return postRequest('/department/add', param); + }, + /** + * @description: 更新部门信息 @author 卓大 + * @param {*} + * @return {*} + */ + updateDepartment: (param) => { + return postRequest('/department/update', param); + } +}; + +``` + +### 5.3、 assets 目录 + +assets 为静态资源,里面存放 images, styles, icons 等静态资源,静态资源命名格式为 kebab-case + +``` +|assets +|-- icons +|-- images +| |-- background-color.png +| |-- upload-header.png +|-- styles +``` + +### 5.4、 components 目录 + +此目录应按照组件进行目录划分,目录命名为 kebab-case,一个组件必须一个单独的目录 ; +目的: +- 一个组件一个目录是为了将来组件的扩展,因为这是整个项目公用的组件 +- 组件入口必须为 index.vue,原因也是因为这是整个项目公用的组件 + +举例如下: +``` +|components +|-- error-log +| |-- index.vue +| |-- index.less +|-- markdown-editor +| |-- index.vue +| |-- index.js +|-- kebab-case + +``` + +### 5.5、 constants 目录 + +此目录存放项目所有常量和枚举,如果常量在 vue 中使用,请使用 `src/plugin/smart-enums-plugin.js`插件,也可以使用我们写的第三方库: [vue-enum 插件](https://www.npmjs.com/package/vue-enum),但是还不支持vue3,等待更新吧 + +具体要求: +- 常量文件要以 `const` 为结尾,比如`login-const.js`、`file-const.js` +- 变量要:大写下划线,比如 `LOGIN_RESULT_ENUM`、`LOGIN_SUCCESS`、`LOGIN_FAIL` +- 如果是 枚举,变量必须以 `ENUM`为结尾,如:`LOGIN_RESULT_ENUM`、`CODE_FRONT_COMPONENT_ENUM` + +目录结构: + +``` +|constants +|-- index-const.js +|-- role-const.js +|-- employee-const.js +``` + +例子: employee-const.js + +```js +export const EMPLOYEE_STATUS = { + NORMAL: { + value: 1, + desc: '正常' + }, + DISABLED: { + value: 1, + desc: '禁用' + }, + DELETED: { + value: 2, + desc: '已删除' + } +}; + +export const EMPLOYEE_ACCOUNT_TYPE = { + QQ: { + value: 1, + desc: 'QQ登录' + }, + WECHAT: { + value: 2, + desc: '微信登录' + }, + DINGDING: { + value: 3, + desc: '钉钉登录' + }, + USERNAME: { + value: 4, + desc: '用户名密码登录' + } +}; + +export default { + EMPLOYEE_STATUS, + EMPLOYEE_ACCOUNT_TYPE +}; +``` + +### 5.6、 router 与 store 目录 + +这两个目录一定要将业务进行拆分,不能放到一个 js 文件里。 + +`router` 尽量按照 views 中的结构保持一致 + +`store` 按照业务进行拆分不同的 js 文件 + +### 5.7、 views 目录 + +目录要求,按照模块划分,其中具体文件名要求如下: + +- 如果是列表页面,要以list为结尾,如`role-list.vue`、`cache-list.vue` +- 如果是 表单页面,要以 form为结尾,如 `role-form.vue`、`notice-add-form.vue` +- 如果是 modal弹窗,要以 modal为结尾,如 表单弹窗 `role-form-modal.vue`,详情 `role-detail-modal.vue` +- 如果是 drawer 抽屉页面,要同上以 `Drawer`为结尾 + + + +```js +|-- views 视图目录 +| |-- role role模块名 +| | |-- role-list.vue role列表页面 +| | |-- role-add-form.vue role新建页面 +| | |-- role-update-form-modal.vue role更新页面 +| | |-- index.less role模块样式 +| | |-- components role模块通用组件文件夹 +| | | |-- role-title-modal.vue role弹出框组件 +| |-- employee employee模块 +| |-- behavior-log 行为日志log模块 +| |-- code-generator 代码生成器模块 +``` + + + +## 联系我们 + +[1024创新实验室-主任:卓大](https://zhuoda.vip),混迹于各个技术圈,研究过计算机,熟悉点 java,略懂点前端。 +[1024创新实验室(河南·洛阳)](https://1024lab.net) 致力于成为中原领先、国内一流的技术团队,以技术创新为驱动,合作各类项目。 +![]() |
+ ![]() |
+ ![]() |
+
加 主任 “卓大” 微信 拉你入群,一起学习 |
+ 关注 “小镇程序员” 分享代码与生活、技术与赚钱 |
+ 请 “1024创新实验室” 喝咖啡 支持我们的开源与分享 |
+
![]() |
+ ![]() |
+ ![]() |
+
加 主任 “卓大” 微信 拉你入群,一起学习 |
+ 关注 “小镇程序员” 分享代码与生活、技术与赚钱 |
+ 请 “1024创新实验室” 喝咖啡 支持我们的开源与分享 |
+