# 前言
编程规范使得我们的项目在一定程度上是可维护的。本文定义了代码规范,旨在提高代码质量和协作效率
# SiteServer
# 项目目录规范
┌─css # 存放页面样式文件
│ ├── reset.css # 存放初始化浏览器样式
│ ├── common.css # 存放公共模块的样式
│ ├── xxx-index.css # 存放页面css
├─js # 存放页面 JS 脚本,`xxx.service.js` 为调用 API 的脚本
│ ├── api.js # 存放api地址
│ ├── constant.js # 存放js的常量
│ ├── xxxIndex.js # 存放页面js
├─img # 存放页面图片素材,按网页分文件夹存放
├─library # 第三方库,如vue.js、axios.js、elementui
├─component # 存放自己编写的 UI 组件
├─include # 包含文件
├─Template # 栏目模板页
│ ├─Content # 内容模板页
├─upload # siteserver上传的文件,包括文档、图片、视频等
├─channels # siteserver生成的栏目页,站点导出时不用包含该目录
├─contents # siteserver生成的内容页,站点导出时不用包含该目录
├─single-pages # siteserver生成的单页模板页,站点导出时不用包含该目录
└─T_系统首页模板 # 首页模板页面
# HTML
- HTML只关注内容,HTML只显示展示内容信息,不要引入一些特定的 HTML 结构来解决一些视觉设计问题
- 不将img元素当做专门用来做视觉设计的元素 样式上的问题应该使用css解决
# HTML标签
# 链接
- 给
<a>
标签加上title属性,<a>
标签的href
属性必须写上链接地址,暂无链接的加上javascript:alert('敬请期待!')
- 非本专题的页面间跳转,采用打开新窗口模式:
target="_blank"
# 静态资源
- 静态资源文件名必须小写,禁止使用除 “-” 以外的特殊字符及中文
- 单词使用 “-”,如:btn-start.png
- 文件名应体现资源内容,例如:
bg.jpg 背景图片
mod-bg.jpg 模块背景
sprites.png 精灵图
btn-start.png 开始按钮
ico-play.png 修饰性图片
# https协议自适应
去掉协议http:、https:部分。采用自适应的写法。具体方法如下:
<style>
.bg{background: url(//www.choicelink.cn/img/logo.png) no-repeat;}
</style>
<a href="//z.choicelink.cn/cdc/">疾控平台</a>
<img src="//z.choicelink.cn/CDC/img/banner_01.png">
<script src="//www.choicelink.cn/plugins/element-ui-2.9.1/index.js"></script>
# CSS
- 颜色:统一使用十六进制,大小写约定统一(建议统一小写),可缩写就缩写例如
#fff
代替#ffffff
- 除去某些极特殊的情况,尽量不要使用 !important
- class、id 全部小写,单词使用短横线分隔
- 命名使用英文,禁止使用特殊字符
- 样式名不能包含ad、guanggao、ads、gg是广告含义的关键词,避免元素被网页拓展、插件屏蔽
- 名称间隔使用-符号
- 涉及数据、交互等需要联调的部分,禁止通过id选择器定义样式,以免开发过程中id名变化,引起页局错乱
- 类名命名需要语义化,参考下面的示例:
建议:
.wrap{} // 外层容器
.mod-box{} // 模块容器
.btn-start{} // 开始
.btn-news-more{} // 更多新闻
.btn-play{} // 播放视频
.side-nav{} // 侧栏导航
.btn-more{} // 更多
不使用行内样式(<style>.no-good {}</style>)
不在元素上使用 style 属性(<hr style="border-top: 5px solid black">)
不使用行内脚本(<script>alert('no good')</script>)
不使用表象元素(i.e. <b>, <u>, <center>, <font>, <b>)
不使用表象 class 名(i.e. red, left, center)
::: 提示 命名词穷了怎么办?试下这个工具 codelf :::
# 样式重置
HTML中绝大部分标签元素在网页显示中都有一个默认属性值,通常为了避免重复定义元素样式,需要进行重置默认样式(CSS Reset)
点击查看样式代码
html,body,div,span,applet,object,iframe,caption,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,h1,h2,h3,h4,h5,h6,blockquote,pre,a,abbr,acronym,address,big,cite,code,dl,dt,dd,ol,ul,li,fieldset,form,label,legend{vertical-align:baseline;font-weight:inherit;font-style:inherit;outline:0;padding:0;margin:0;font-family:"Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif}
:focus{outline:0}
body{background:white;color:black}
ol,ul,li{list-style:none;font-size:14px}
blockquote:before,blockquote:after,q:before,q:after{content:""}
blockquote,q{quotes:"" ""}
a{text-decoration:none}
.clearfix:after,.clearfix:before{content:"";display:table}
.clearfix:after{clear:both;overflow:hidden}
.clearfix{zoom:1}
.clear{clear:both;display:block;font-size:0;height:0;line-height:0;overflow:hidden}
.hide{display:none}
.block{display:block}
.fl,.fr{display:inline}
.fl{float:left}
.fr{float:right}
body{min-width:1200px}
# Javascript
文字教程:https://www.liaoxuefeng.com/wiki/1022910821149312
# 函数
函数使用驼峰标识法,以动宾结构命名,函数名应体现函数作用。
动词 | 含义 | 返回值 |
---|---|---|
can | 判断是否可执行某个动作 ( 权限 ) | 函数返回一个布尔值。true:可执行;false:不可执行 |
has | 判断是否含有某个值 | 函数返回一个布尔值。true:含有此值;false:不含有此值 |
is | 判断是否为某个值 | 函数返回一个布尔值。true:为某个值;false:不为某个值 |
get | 获取某个值 | 函数返回一个非布尔值 |
set | 设置某个值 | 无返回值、返回是否设置成功或者返回链式对象 |
... | ... | ... |
function canRead(){ // 是否可阅读
return true;
}
function getName(){ // 获取姓名
return this.name
}
let loadData = function () {}
let loadData = () => {}
# 变量命名
严格控制变量作用域,
# 常量
使用 const
声明,常量名全部大写,使用下划线分割单词。如:
const SITE_ID = 9323;
const SECRET_KEY = 'dc28fbeb-0a0d-4934-bc79-522c6382c187';
# 局部变量
使用 let
声明,常量名使用驼峰标识法
let userName = 'lytine';
# Vue
- 不要在 HTML 中引入复杂的代码逻辑(例如一个巨长表达式),复杂的逻辑应提取到 JS
- 使用 v-for 渲染列表元素时请加上 key 属性,以便维护内部组件及其子树的状态(如果没加会在浏览器报warning)
- 避免 v-if 和 v-for 用在一起,因为当 Vue 处理指令时,v-for 比 v-if 具有更高的优先级
# service
- 为提高代码复用性,页面渲染脚本中一般不直接发送 API 请求,而是集中在
service
目录,并分模块编写 - service 负责发送 API 请求,并作初步数据处理
- API 的 URL 声明为全局常量,声明在
js/api.js
中 - API 函数在 service 中编写
- 声明 API 函数需写文档注释,说明每个参数的作用。
- 有多个参数时,尽量不要为了方便只声明一个 JSON 对象,请尽可能把接口参数描述清楚,以提高代码可读性
- 如有需要,可设置参数默认值
- 当同一个接口可能会被多个地方调用,请尽可能地提高接口函数的兼容性,以适应不同场景的接口调用
- 如果需要使用自定义的 axios 实例,可在函数列表中传递,例如:
/**
* 保存采购清单
* @param {*} userId 用户 ID
* @param {*} purchaseNumbers 商品编号数组
* @param {*} axiosInstance 自定义的 axios 实例(可选)
*/
async function savePurchaseList(userId, purchaseNumbers, selectedPurchaseNumbers, axiosInstance) {
const _axios = axiosInstance || axios;
let purchaseNumbersStr = purchaseNumbers.join(',');
let selectedPurchaseNumbersStr = selectedPurchaseNumbers.join(',');
let res = await _axios({
url: ADD_PURCHASE_LIST,
method: 'post',
data: {
purchaserProduct: {
userId,
productNumbers: purchaseNumbersStr,
productUsedNumbers: selectedPurchaseNumbersStr
}
}
});
return res.data;
}
# 组件抽取
- 建议对常用组件进行抽取 ,如:文件上传组件、倒计时组件,以便在不同页面中引用。参考: vue 组件
- 在SiteServer开发中,若要配合STL标签完成的功能,不建议封装成组件,而应以包含文件的形式完成该功能,如:页脚,导航菜单等
# Git
视频教程:https://www.bilibili.com/video/BV1KD4y1S7FL
文字教程:https://www.liaoxuefeng.com/wiki/896043488029600
# 格式化commit的好处
- 提供更多的历史信息,方便快速浏览
- 可以过滤某些文档,方便快速查找
- 可以直接从commit生成change log
- feat:新功能
- fix:修补
- docs:文档
- style:格式
- refactor:重构(既不是新增,也不是代码变动)
- test:增加测试
- chore:构建过程中或辅助工具的变动
例如:
fix: 修复了倒计时时差问题
feat: 首页增加通知公告弹窗