palidin 发布的文章

汉字究竟占几个字节?


英文字母和中文汉字在不同字符集编码下的字节数

| 编码 | 字母字节数(bytes) | 汉字字节数(bytes) |
|------------|---------------------|---------------------|
| GB2312 | 1 | 2 |
| GBK | 1 | 2 |
| GB18030 | 1 | 2 |
| ISO-8859-1 | 1 | 1 |
| UTF-8 | 1 | 3 |
| UTF-16 | 4 | 4 |
| UTF-16BE | 2 | 2 |
| UTF-16LE | 2 | 2 |

这是个好问题,可以当作一个笔试题。先从字符编码讲起。


后台独立模块开发文档


1.模块的目录结构

MODULE_NAME
│  hello-istio.yaml
│  tree
│  
├─nodeserver
│      Dockerfile
│      server.js
│      
└─pythonserver
        Dockerfile
        productpage.py
        requirements.txt

2.模块的添加

  • 模块的名称
  • 模块的标识(英文名)
  • 模块的路由文件路径,默认使用模块目录下的route.php
  • 路由前缀必须和模块一致
  • 需要指定一个菜单,该菜单以及其后辈菜单与之关联

3.模块的安装和更新

  • 不同的版本通过不同目录来区分
  • 模块的所有版本信息存在于模块服务上,后台只存已安装过的版本
  • 后台已安装过的版本可以一键切换
  • 安装新版本,需要从模块服务获取该版本的下载地址并解压到执行目录


后台说明文档


1.工作流程

1.1登陆后台

输入用户名和密码,保存授权信息

1.2渲染菜单

获取用户已授权的菜单和资源,根据动态数据生成菜单,并保存数据信息

1.3渲染主页面

获取主页面信息并渲染,需要注意的是资源的隐藏。以下是一个示例:
A1页面存在一个名为b2的按钮,路径为/user,请求方式为DELETE,根据1.2获取的资源信息判断:
如果按钮b2存在,则A1页面显示按钮b2;当用户点击按钮发起请求DELETE http://api.dangkou.net/user/1,并反馈结果。反之,则隐藏之。


PHP编码规范


### 一、命名规范 #### 1.1 路由和控制器 | 动词 | 路径 | 行为(方法) | 说明 | |--------|-------------|--------------|------------------| | GET | /users | index | 获取用户列表 | | POST | /users | store | 添加用户 | | GET | /users/{id} | show | 获取某个用户信息 | | PUT | /users/{id} | update | 更新用户 | | DELETE | /users/{id} | destory | 删除用户 | #### 1.2 类 严格准守驼峰式命名,首字母必须大写。 接口:以I开头,比如动物接口,参考命名IAnimal 抽象类:以A开头,比如学生抽象类,参考命名AStudent ### 二、数据库 - 使用有意义的**英文词汇**,词汇中间以下划线分隔。(不要用拼音) - 只能使用英文**字母**,**数字**,**下划线**,并以英文字母开头。 - 库、表、字段全部采用**小写**,不要使用驼峰式命名。 - 避免用ORACLE、MySQL的**保留字**,如desc,关键字如index。 - 命名禁止超过32个字符,须见名之意,建议使用名词不是动词 #### 2.1表命名 同一个模块的表尽可能使用相同的前缀,表名称尽可能表达含义。所有日志表均以 log_ 开头 #### 2.2字段命名 - 表达其实际含义的英文单词或简写。布尔意义的字段以`is_`作为前缀,后接动词过去分词。 - 各表之间相同意义的字段应同名。各表之间相同意义的字段,以去掉模块前缀的`表名_`字段名命名。 - 外键字段用`表名_字段名`表示其关联关系。 - 表的主键一般都约定成为id,自增类型,是别的表的外键均使用`xxx_id`的方式来表明。 #### 2.3表设计规范 1、表引擎取决于实际应用场景;日志及报表类表建议用myisam,与交易,审核,金额相关的表建议用innodb引擎。如无说明,建表时一律采用innodb引擎。 2、默认使用utf8mb4字符集,数据库排序规则使用utf8mb4_general_ci,(由于数据库定义使用了默认,数据表可以不再定义,但为保险起见,建议都写上) 3、所有表、字段均应用 comment 列属性来描述此表、字段所代表的真正含义,如枚举值则建议将该字段中使用的内容都定义出来。 4、如无说明,表中的第一个id字段一定是主键且为自动增长,禁止在非事务内作为上下文作为条件进行数据传递。禁止使用varchar类型作为主键语句设计。 5、如无说明,表必须包含created_at和updated_at字段,即表必须包含记录创建时间和修改时间的字段 6、如无说明,表必须包含is_deleted,用来标示数据是否被删除,原则上数据库数据不允许物理删除。 7、用尽量少的存储空间来存数一个字段的数据 - 能用int的就不用char或者varchar - 能用tinyint的就不用int - 使用UNSIGNED存储非负数值。 - 不建议使用ENUM、SET类型,使用TINYINT来代替 - 使用短数据类型,比如取值范围为0-80时,使用TINYINT UNSIGNED - 存储精确浮点数必须使用DECIMAL替代FLOAT和DOUBLE - 时间字段,除特殊情况一律采用int来记录unix_timestamp - 存储年使用YEAR类型。 - 存储日期使用DATE类型。 - 存储时间(精确到秒)建议使用TIMESTAMP类型,因为TIMESTAMP使用4字节,DATETIME使用8个字节。 - 建议使用INT UNSIGNED存储IPV4。 - 尽可能不使用TEXT、BLOB类型 - 禁止在数据库中使用VARBINARY、BLOB存储图片、文件等。建议使用其他方式存储(TFS/SFS),MySQL只保存指针信息。 - 单条记录大小禁止超过8k(列长度(中文)*3(UTF8)+列长度(英文)*1) 8、如无备注,所有字段都设置NOT NULL,并设置默认值; 9、禁止在数据库中存储明文密码 10、如无备注,所有的布尔值字段,如is_hot、is_deleted,都必须设置一个默认值,并设为0; 11、如无备注,排序字段order_id在程序中默认使用降序排列; 12、整形定义中不添加长度,比如使用INT,而不是INT[4] 13、使用VARBINARY存储大小写敏感的变长字符串 #### 2.4索引设计规范 MySQL的查询速度依赖良好的索引设计,因此索引对于高性能至关重要。合理的索引会加快查询速度(包括UPDATE和DELETE的速度,MySQL会将包含该行的page加载到内存中,然后进行UPDATE或者DELETE操作),不合理的索引会降低速度。MySQL索引查找类似于新华字典的拼音和部首查找,当拼音和部首索引不存在时,只能通过一页一页的翻页来查找。当MySQL查询不能使用索引时,MySQL会进行全表扫描,会消耗大量的IO。索引的用途:去重、加速定位、避免排序、覆盖索引。 1、索引数量控制,单张表中索引数量不超过5个,单个索引中的字段数不超过5个。 - 综合评估数据密度和分布 - 考虑查询和更新比例 2、对字符串使用前缀索引,前缀索引长度不超过8个字符,建议优先考虑前缀索引,必要时可添加伪列并建立索引。 不要索引blob/text等字段,不要索引大型字段,这样做会让索引占用太多的存储空间 3、主键准则 - 表必须有主键 - 不使用更新频繁的列 - 尽量不选择字符串列 - 不使用UUID MD5 HASH - 默认使用非空的唯一键 - 建议选择自增或发号器 4、 重要的SQL必须被索引,核心SQL优先考虑覆盖索索引 - UPDATE、DELETE语句的WHERE条件列 - ORDER BY、GROUP BY、DISTINCT的字段 - 多表JOIN的字段 5、区分度最大的字段放在前面 - 选择筛选性更优的字段放在最前面,比如单号、userid等,type,status等筛选性一般不建议放在最前面 - 索引根据左前缀原则,当建立一个联合索引(a,b,c),则查询条件里面只有包含(a)或(a,b)或(a,b,c)的时候才能走索引,(a,c)作为条件的时候只能使用到a列索引,所以这个时候要确定a的返回列一定不能太多,不然语句设计就不合理,(b,c)则不能走索引 - 合理创建联合索引(避免冗余),(a,b,c) 相当于 (a) 、(a,b) 、(a,b,c) 6、索引禁忌 - 不在低基数列上建立索引,例如“性别” - 不在索引列进行数学运算和函数运算 - 不要索引常用的小型表 7、 尽量不使用外键 - 外键用来保护参照完整性,可在业务端实现 - 对父表和子表的操作会相互影响,降低可用性 - INNODB本身对online DDL的限制