文档规范说明

不管有多少人共同参与同一项目,一定要确保每一行代码都像是同一个人编写的。

本文档参考了

如果发现错误敬请指正,如果有想法随时提出

命名规则

目录命名

有复数结构时采用复数命名法,如styles

JS文件命名

文件统一全部小写命名,且不应再包含上级文件夹或其他无用标识

  1. scripts/pha/in/v3/xxx.js为例
  2. 反例:pha.in.v3.disp.jsv3disp.js
  3. 正例:disp.js

CSS文件命名

同理JS,简短小写

CSP文件命名

文件统一放于csp目录下,全部小写,单词间通过点分隔,且文件名同JS目录下的全称

  1. scripts/pha/in/v3/xxx.js对应的CSP为例
  2. 反例:phainv3xxx.cspdhcst.ingdrec.csp
  3. 正例:pha.in.v3.xxx.csp

JavaScript

简介

考虑当前系统主要依托HISUI以及旧版逻辑代码等,如下大部分暂并未遵循ES6相关新增内容,如const、let、class等,当后续开发涉及时会进行相关变更

变量命名

  1. 第一个字母必须是字母、下划线、美元符号,具体应遵循如下2、3。
  2. 参数、成员变量、局部变量都统一使用lowerCamelCase风格

反例:

  1. var inicdesc=4;
  2. var INCIDesc=30;

正例:

  1. var inciDesc=30;
  1. 全局变量、常量统一使用UpperCamelCase风格

反例:

  1. var maxage=30;
  2. var max_age=30;

正例:

  1. var MAX_AGE=30;
  1. 数组、对象等集合变量,应通过后缀标识

反例:

  1. var inci = {
  2. inciDesc: '阿昔洛韦滴眼液',
  3. inciCode: 'HXY01001'
  4. };
  5. var inciData = ['阿昔洛韦滴眼液', '阿普唑仑片'];

正例:

  1. var inciObj = {
  2. inciDesc: '阿昔洛韦滴眼液',
  3. inciCode: 'HXY01001'
  4. };
  5. var inciArr = ['阿昔洛韦滴眼液', '阿普唑仑片'];
  1. 一切声明的内容都应该有实际意义,变量、局部变量、全局变量等,且应使用英文描述,禁止出现无意义的、拼音、甚至中文
  2. 对象内避免无意义的前缀

反例:

  1. var car = {
  2. carMake: 'Honda',
  3. carModel: 'Accord',
  4. carColor: 'Blue'
  5. };

正例:

  1. var car = {
  2. make: 'Honda',
  3. model: 'Accord',
  4. color: 'Blue'
  5. };
  1. 静态字符串推荐使用单引号,不推荐双引号
  2. jQuery获取到的对象使用美元符号标识

反例:

  1. var body = $('body');

正例:

  1. var $body = $('body');
  1. 变量声明,应统一提到函数顶部
  2. 关于部分无法确定大小写的变量
  1. var userID; // ID大写
  2. var testURL; // URL大写

函数

  1. 函数采用动宾结构,描述函数的行为,且动词应采用对仗词,对仗词见附录

反例:

  1. function notif(user) {
  2. // ...
  3. }

正例:

  1. function notifyUser(user) {
  2. // ...
  3. }
  1. 避免使用大量参数,一般控制在2个,如果再多则需要考虑使用对象

反例:

  1. function getUsers(fields, fromDate, toDate) {
  2. // ...
  3. }

正例:

  1. function getUsers({ fields, fromDate, toDate }) {
  2. // ...
  3. }
  4. getUsers({
  5. fields: ['name', 'surname', 'email'],
  6. fromDate: '2019-01-01',
  7. toDate: '2019-01-18'
  8. });
  1. 函数应使用默认参数,而非if语句(ES6)

反例:

  1. function createShape(type) {
  2. var shapeType = type || "cube";
  3. // ...
  4. }

正例:

  1. function createShape(type = "cube") {
  2. // ...
  3. }
  1. 坚持单一原则,函数内仅做该函数应该做的,尽量避免通过传入标记控制不同行为
  2. 禁止直接在JS内置对象扩展,应单独建立公用函数统一处理

反例:

  1. Array.prototype.myFunc = function myFunc() {
  2. // ...
  3. };

正例:

  1. 待定,函数尚不考虑es6
  1. 条件语句避免负面条件,特指调用某一函数

反例:

  1. function isUserNotBlocked(user) {
  2. // ...
  3. }
  4. if (!isUserNotBlocked(user)) {
  5. // ...
  6. }

正例:

  1. function isUserBlocked(user) {
  2. // ...
  3. }
  4. if (isUserBlocked(user)) {
  5. // ...
  6. }
  1. 函数之间应空行区分

对象与数组

  1. 对象属性名不需要加引号
  2. 对象以缩进的形式书写,不要写在一行
  3. 数组、对象最后不要有逗号

反例:

  1. var a = {
  2. 'b': 1
  3. };
  4. var a = {b: 1};
  5. var a = {
  6. b: 1,
  7. c: 2,
  8. };

正例:

  1. var a = {
  2. b: 1,
  3. c: 2
  4. };

括号

如下关键字必须使用花括号,即使仅有一行代码

if, else,for, while, do, switch, try, catch, finally, with

反例:

  1. if (condition)
  2. doSomething();

正例:

  1. if (condition) {
  2. doSomething();
  3. }

引号

  1. 最外层统一使用单引号

反例:

  1. var x = "test";

正例:

  1. var x = 'test';

代码风格

  1. 四空格缩进
  2. 使用分号作为结束
  3. 将左花括号放在第一行的结尾,且应空格,右花括号独立一行
  4. 单行长度建议控制与80个字符,但无具体标准

注释

  1. 单行注释:双斜线后应跟空格,且缩进与上下文的代码保持一致;或在行尾注释,在行尾依然需要左右空格

反例:

  1. // 一些说明...
  2. var userID = 13;
  3. var userID = 13; //一些说明

正例:

  1. // 一些说明...
  2. var userID = 13;
  3. var userID = 13; // 一些说明
  1. 多行注释:一般用于注释难以理解的、可能存在错误的、逻辑强的代码,且缩进一致
  1. /*
  2. * 针对下方代码的说明
  3. * 第一行太长写第二行
  4. */
  5. var a = 1*2*3*4
  1. 文件注释
  1. /**
  2. * 名称: 住院移动药房-备药规则维护
  3. * 编写人: yunhaibao
  4. * 编写日期: 2020-03-14
  5. */
  1. 函数注释:简单函数或可通过代码直观理解的函数可不做注释,但公共函数都应完整注释,详细课件附录
    更多其他关键字参考http://yuri4ever.github.io/jsdoc/,
  1. /**
  2. * 描述函数功能
  3. * @param {string} userID - 描述入参
  4. * @param {string} [userName] - userName是一个可选参数
  5. * @param {object} chkObj
  6. * @param {string} chkObj.userID - 参数chkObj对象中的userID说明
  7. * @param {object[]} g - 参数g为一个对象数组
  8. * @return
  9. */
  10. function Test(userID, userName, chkObj, g) {
  11. ...
  12. }

undefined

禁止直接使用undefined判断变量,应使用typeof

反例:

  1. if (person === undefined) {
  2. ...
  3. }

正例:

  1. if (typeof person === 'undefined') {
  2. ...
  3. }

语法

  1. 用’=’, ‘!’代替’==’, ‘!=’;

反例:

  1. if (a == 1) {
  2. a++;
  3. }

正例:

  1. if (a === 1) {
  2. a++;
  3. }
  1. for-in里一定要有hasOwnProperty的判断
  2. 禁止在内置对象的原型上添加方法,如Array, Date
  3. 禁止在内层作用域的代码里声明了变量,之后却访问到了外层作用域的同名变量,即局部与全局同名的问题
  4. 禁止debugger、console出现在提交的代码里
  5. 禁止在循环内部再声明函数
  6. 禁止数组内出现空元素
  7. 禁止出现空函数

杂项

  1. 禁止代码缩进tab、空格混合使用

CSS

简介

说明基础CSS相关规范

Class命名

  1. 全部小写,单词间通过中横线间隔
  2. 涉及ID的,使用驼峰规则
  3. 尽可能简短,但避免过度简写,如button可简写为btn,但不能为bnbbt
  4. 为避免冲突,所有本组的css应以pha开头

反例:

  1. .header{
  2. ...
  3. }

正例:

  1. /* class */
  2. .pha-header {
  3. ...
  4. }
  5. /* id */
  6. #conUser {
  7. ...
  8. }

语法

  1. 四空格缩进
  2. 每个属性末尾以分号结束
  3. 颜色应统一使用16进制
  4. 避免0值使用单位,如用 margin: 0; 代替 margin: 0px;
  5. 为选择器分组时,将单独的选择器单独放在一行
  6. 为了代码的易读性,在每个声明块的左花括号前添加一个空格,且右括号应另起一行(即使仅有一行样式)
  7. 每条声明语句的 : 后应该插入一个空格
  8. 为了获得更准确的错误报告,每条声明都应该独占一行
  9. 样式之间应空行间隔
  10. 属性之间应适当空行,以确保同类型的在一起,提高易读

反例:

  1. .selector, .selector-secondary, .selector[type=text] {
  2. padding:15px;
  3. margin:0px 0px 15px;
  4. background-color:rgba(0, 0, 0, 0.5);
  5. box-shadow:0px 1px 2px #CCC,inset 0 1px 0 #FFFFFF
  6. }
  7. span{
  8. color: #fff;
  9. }

正例:

  1. .selector,
  2. .selector-secondary,
  3. .selector[type="text"] {
  4. padding: 15px;
  5. margin-bottom: 15px;
  6. background-color: rgba(0,0,0,.5);
  7. box-shadow: 0 1px 2px #ccc, inset 0 1px 0 #fff;
  8. }
  9. span{
  10. color: #fff;
  11. }

注释

  1. 以/ 注释内容 /格式注释,前后空格
  1. /* 注释内容 */
  2. .pha-element {
  3. width: 20px;
  4. }

引号

  1. 最外层统一使用双引号
  2. url的内容要用引号
  3. 属性选择器中的属性值需要引号
  1. .pha-element:after {
  2. content: "";
  3. background-image: url("page.png");
  4. }
  5. li[name="second"] {
  6. ...
  7. }

选择器

  1. 样式尽量使用class形式
  2. 对于频繁出现的样式,不应使用选择器筛选(如[class^="..."]),浏览器性能会受此影响,应建立直接的class引用,或使用更直接的选择
  3. 选择器要尽可能短,并且尽量限制组成选择器的元素个数,建议不要超过 4个

反例:

  1. span {
  2. ...
  3. }
  4. .page-container #stream .stream-item .tweet .tweet-header .username {
  5. ...
  6. }
  7. .avatar {
  8. ...
  9. }

正例:

  1. .avatar {
  2. ...
  3. }
  4. .tweet-header .username {
  5. ...
  6. }
  7. .tweet .avatar {
  8. ...
  9. }

属性声明顺序

相关属性声明应归为一组,并且按照如下顺序

  1. Positioning:定位
  2. Box model:盒模型
  3. Typographic:排版,字体行号等
  4. Visual:视觉样式,边框背景色等
  5. Misc:其他各种
  1. .pha-content {
  2. /* Positioning */
  3. position: absolute;
  4. top: 0;
  5. right: 0;
  6. bottom: 0;
  7. left: 0;
  8. z-index: 100;
  9. /* Box-model */
  10. display: block;
  11. float: right;
  12. width: 100px;
  13. height: 100px;
  14. /* Typography */
  15. font: normal 13px "Helvetica Neue", sans-serif;
  16. line-height: 1.5;
  17. color: #333;
  18. text-align: center;
  19. /* Visual */
  20. background-color: #f5f5f5;
  21. border: 1px solid #e5e5e5;
  22. border-radius: 3px;
  23. /* Misc */
  24. opacity: 1;
  25. }

前缀属性

因浏览器不同,部分语法存在差异,在使用特定厂商的带有前缀的属性时,通过缩进的方式,让每个属性的值在垂直方向对齐,这样便于多行编辑

反例:

  1. .pha-ele {
  2. -moz-border-radius: 3px;
  3. border-radius: 3px;
  4. -webkit-border-radius: 3px;
  5. }

正例:

  1. .pha-ele {
  2. -webkit-border-radius: 3px;
  3. -moz-border-radius: 3px;
  4. border-radius: 3px;
  5. }

@import

禁止使用,应使用link标签引入,@import指令较慢且容易导致不可预知问题

媒体查询

媒体查询放在尽可能相关规则的附近。不要将他们打包放在一个单一样式文件中或者放在文档底部。如果你把他们分开了,将来只会被大家遗忘。

  1. @media (min-width: 480px) {
  2. .element {
  3. ...;
  4. }
  5. .element-avatar {
  6. ...;
  7. }
  8. .element-selected {
  9. ...;
  10. }
  11. }

杂项

  1. 已发布CSS避免出现空规则
  2. 禁止在同个规则里出现重复的属性
  3. 禁止在同一个CSS文件出现两个相同规则

HTML与CSP

简介

CSP规范遵循HTML,但存在少许差别

标签命名

  1. 使用驼峰命名规则,首字母小写
  2. 作为查询条件的表单元素,不需要使用前缀标识(如combobox、textbox),按钮除外
  3. 作为查询条件的表单元素的,需要前缀标识(如grid、tree等),且为固定标识符
  4. 作为存储数据的元素(如药品信息维护的明细信息),不加con前缀

反例:

  1. <!-- 查询条件 -->
  2. <input id="inci">
  3. <input id="highPriceFlag">
  4. <!-- 表格 -->
  5. <table id="GridSendLoc"></table>
  6. <table id="tblSendLoc"></table>
  7. <!-- 数据 -->
  8. <input id="InciDesc">

正例:

  1. <!-- 查询条件 -->
  2. <input id="conInci">
  3. <input id="conHighPriceFlag">
  4. <!-- 表格 -->
  5. <table id="gridSendLoc"></table>
  6. <!-- 数据 -->
  7. <input id="inciDesc">

语法

  1. 四空格缩进,嵌套节点缩进
  2. 属性使用双引号,不要使用单引号
  3. 属性名统一小写
  4. 不需要在自动闭合的标签上使用斜线(如 )
  5. 不要忽略可选的关闭标签,如(
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Page title</title>
  5. </head>
  6. <body>
  7. <img src="images/company-logo.png" alt="Company">
  8. <h1 class="hello-world">Hello, world!</h1>
  9. </body>
  10. </html>

HTML5 doctype

页面开头使用这DOCTYPE来启用标准模式,使其在每个浏览器中尽可能一致的展现

  1. <!DOCTYPE html>
  2. <html>
  3. ...
  4. </html>

lang属性

根据HTML5规范,强烈建议html标签上加上lang属性。这会给语音工具和翻译工具帮助,告诉它们应当怎么去发音和翻译。因此固定为中文

  1. <!DOCTYPE html>
  2. <html lang="zh-cn">
  3. ...
  4. </html>

字符编码

通过声明一个明确的字符编码,让浏览器轻松、快速的确定适合网页内容的渲染方式,通常指定为’UTF-8’,但通常在studio的格式为GBK,故此处暂不需要声明

IE兼容模式

meta 标签可以指定页面应该用什么版本的IE来渲染,本组开发固定写法

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="X-UA-Compatible" content="IE=Edge">
  5. </head>
  6. ...
  7. </html>

引入JS、CSS的规范链接

html5通常不需要指定type

  1. <!-- 引入 CSS -->
  2. <link rel="stylesheet" href="ui.css">
  3. <!-- 页面内 CSS -->
  4. <style>
  5. ...
  6. </style>
  7. <!-- 引入 JS -->
  8. <script src="../scripts/pha/ip/v4/sendloc.js">
  9. <!-- In-document JS -->
  10. <script>
  11. ...
  12. </script>

属性顺序

属性应按照固定顺序出现,以保证易读性

  • class
  • id
  • name
  • data-*
  • src, for, type, href, value , max-length, max, min, pattern
  • placeholder, title, alt
  • aria-*, role
  • required, readonly, disabled

减少标签数量

尽量减少多余无用的父节点

反例:

  1. <span class="avatar">
  2. <img src="...">
  3. </span>

正例:

  1. <img class="avatar" src="...">

针对CSP

  1. 文档开头应统一增加验证登录代码
  2. 所有页面在加载时都应有遮罩,避免用户看到解析前的错乱布局
  3. DOCTYPE后需紧跟文件说明,主csp与js,且路径应写全
  1. <!DOCTYPE html>
  2. <!--住院移动药房-送药科室维护
  3. csp:csp/pha.ip.v4.sendloc.csp
  4. js: scripts/pha/ip/v4/sendloc.js
  5. -->
  6. <html lang="zh-cn">
  7. <!-- 验证session过期 -->
  8. <csp:method name=OnPreHTTP arguments="" returntype=%Boolean>
  9. d ##Class(websys.SessionEvents).SessionExpired() q 1
  10. </csp:method>
  11. <head>
  12. <meta http-equiv="X-UA-Compatible" content="IE=Edge">
  13. <!-- iMedical版本标题 -->
  14. <title>
  15. <TRAK:TRANSLATE id=title>##(%session.Get("TITLE"))##</TRAK:TRANSLATE>
  16. </title>
  17. <TRAK:HEAD>
  18. </TRAK:HEAD>
  19. </head>

编辑器设置

简介

仅做对VSCode的说明,其他编辑器亦有相关设置,请自行查阅相关资料

插件

  1. 使用格式化代码工具Prettier,可在VSCode应用商店下载
  2. 点击菜单【查看】-【命令面板】,输入setting,选择【打开设置】,注意不是【打开默认设置】,而后可将如下内容增加的设置的json文件中,重启VSCode测试无误即可

如下为一种设置方式,仅供参考,注意设置标注与最后的prettier

  1. // 将设置放入此文件中以覆盖默认设置
  2. {
  3. // 编辑器字体
  4. "editor.fontFamily": "consolas",
  5. // 文件默认编码
  6. "files.encoding": "gbk",
  7. // 编辑器字号
  8. "editor.fontSize": 15,
  9. "vsicons.dontShowNewVersionMessage": true,
  10. "git.ignoreMissingGitWarning": true,
  11. "workbench.statusBar.visible": true,
  12. // csp视为html
  13. "files.associations": {
  14. "*.csp": "html"
  15. },
  16. "explorer.confirmDelete": false,
  17. "editor.renderWhitespace": "none",
  18. "editor.renderControlCharacters": false,
  19. "breadcrumbs.enabled": true,
  20. "workbench.activityBar.visible": false,
  21. "workbench.settings.settingsSearchTocBehavior": "hide",
  22. // 主题
  23. "workbench.colorTheme": "Monokai",
  24. "editor.detectIndentation": false,
  25. // 如下几个为默认格式化的插件
  26. "[html]": {
  27. "editor.defaultFormatter": "vscode.html-language-features"
  28. },
  29. "[javascript]": {
  30. "editor.defaultFormatter": "esbenp.prettier-vscode"
  31. },
  32. "[css]": {
  33. "editor.defaultFormatter": "esbenp.prettier-vscode"
  34. },
  35. "[csp]": {
  36. "editor.defaultFormatter": "esbenp.prettier-vscode"
  37. },
  38. "[json]": {
  39. "editor.defaultFormatter": "vscode.json-language-features"
  40. },
  41. // 是否使用编辑器设置,否
  42. "prettier.useEditorConfig": false,
  43. "prettier.htmlWhitespaceSensitivity": "ignore",
  44. // 单行代码字符数
  45. "prettier.printWidth": 500,
  46. // Tab键转为4空格
  47. "prettier.tabWidth": 4,
  48. // 使用单引号
  49. "prettier.singleQuote": true
  50. }

附录

JS常用动词

简写 说明
get\set 取值\给值
add\remove 增加\移除
show\hide 显示\隐藏
view 查看
browse 浏览
edit 修改
save 保存
delete 删除
find 查询
undo 撤销
redo 重做
clean 清除
index 索引
observe 观察
send\receive 发送\接收
refresh\synchronize 刷新\同步

JS变量缩写

数据类型 简写后缀
object obj
array arr
json json
function fn
message msg

HTML标签缩写

组件 简写前缀 说明 举例
a btn 作为按钮 btnFind
button btn 按钮
datagrid grid 数据表格 gridDisp
datagrid-toolbar gridId+Bar 表格工具栏 gridDispBar
tree tree
treegrid treeGrid 树形表格
window win 窗口
tab tab 页签
dialog dialog 模态框