2d游戏开发工具链分析

前言

博客内容为自身经验总结,并非调查分析结论

美术设计

  1. ps: 使用广泛,基本每个美术都会使用
  2. fgui: 用于游戏素材转化为游戏 ui,支持 cocos unity 甚至网页,如未来有迁移引擎需求优先选用
  3. spine: 用于设计人物动作和一些技能特效,支持 cocos unity 等, 使用容易

游戏配置表工具

  1. 简单 json: 简单基本所有语言都支持解析和生成
  2. luban: 功能强大,配置自定义模版和 tag 功能可以很方便的进行改造, 并支持常见多种编程语言和二进制格式配置

客户端

  1. cocos creator2.x
    优点: 使用简单,容易掌握,但可能教程零散初学者不容易进阶, 只能开发 2d 项目, 适合开发微信小游戏,字节小游戏等, 开源
    缺点: 自带功能不足, 初学者可能不容易找齐需要等东西

  2. cocos creator3.x
    优点: 具有 2 的优点, 同时有官方不断维护添加新特性, 具有更多和批的 api 等, 支持较中轻度 3d 游戏开发, 开源
    缺点: 和 2 代开发模式和 api 上有变化,需要重新上手

  3. unity
    优点: 功能齐全, 插件丰富, 教程丰富, 可开发的游戏范围广, api 稳定预料之外的情况少
    缺点: 上手比 cocos 困难, 思维模式偏程序有些功能不符合直觉, 需要账号许可证, 个人账号公司使用会被封等

服务端

  1. php
    优点: 语法简单,对于有 web 经验的人可以把公告,账号登陆,后台管理,活动页面等功能全部包办,成本低
    缺点: 对象内存占用较大, 处理大量对象或者大数组时容易瓶颈, 需要借助 workerman swooole 等扩展库实现常驻服务才能有足够性能

  2. nodejs
    优点: 可用库极多,并且生态庞大, 全异步编程网络性能高, 调试容易, 有内存分析工具, 可以和客户端复用代码,例如普洱 ts 开发 unity, 此时两边都是 ts 执行环境
    缺点: 弱类型,不熟悉时进行数值计算容易产生类似 NaN Infinite 等奇怪结果, 各种 js ts 配置纷飞 es6 esNext tsconfig 等等, 打包调试需要一定实践

  3. go
    优点: 一般情况性能比脚本高,并发编程轻松, 强类型心智负担会小点, 打包发布容易,也比较容易打包成库供客户端复用逻辑, 包隔离解耦彻底
    缺点: 处理循环引用的方式太暴力导致编写业务代码速度慢, 不太适合快速迭代的业务需求

游戏框架

  1. Pinus: 历史悠长的一个框架
  2. Colyseus: 有房间管理, 状态缓存, 状态同步客户端等功能, 适合有大厅有匹配的游戏类型, ts 编写容易和客户端集成
  3. Nakama: 社区庞大, go 为开发语言,支持 js lua 等作为脚本语言
  4. tsrpc: ts 语言,可能很好的很全 ts 的前后端协作,自带类似 proto 的运行时类型检查

数据存储

  1. mysql
    优点: 功能齐全, 拥有事物处理功能, 程序开发和运维方便
    缺点: 开发人员流动大或设计水平不足时,会导致表关系难以维护扩展和性能问题, 一般总读写超过 5k/s 已经容易出现性能问题, 可能结算奖励的一波写入就卡顿了, 集群需要改动

  2. redis
    优点: 速度极快, 除非出现循环嵌套遍历, 一般没有性能问题, 总读写 20w/s 以上, 阻塞读写也有 5k/s 以上, 集群简便
    缺点: 不支持范围查询和临时调整索引,涉及条件查询时需要将相关数据全部取出在程序里筛选, 全内存化用户流失后数据不好迁移到硬盘上成本较高

  3. mongodb(了解不多)
    优点: 功能丰富,集群容易, 速度够用
    缺点: 数据较少时(少于 50g)价格较贵,机器配置要求高, 市场上掌握的人员相对较少

  4. 其他 NoSql 数据库(了解不多)
    360pika: 使用历史和范围较大的国内开源项目, 支持 redis 协议,数据冷热分离,比 redis 有更多的运维命令
    rocksdb: c++写成,是很多其他 NoSql 的底层实现, 业务使用需要理解的细节较多,不太推荐
    kvrocks: rocksdb 的一种封装实现,支持 redis 协议, 有基金会维护
    Tendis: rocksdb 的一种封装实现, 支持 redis 协议, 已经不活跃
    ScyllaDB: 新星数据库, 被知名公司例如 discord 使用,类 sql 的语法

phpdbg实践笔记

前言

  • 为了寻找在php发生死循环和内存泄漏的时候能够定位问题的方案,而尝试了phpdbg

安装

window下通过phpstudy安装好php7.4.23后,phpdbg已经自带了

命令使用, 网上的资料很不齐, 开两个控制台一个操作一个翻help说明,也算用得过去

排查cpu死循环

1
2
3
4
5
6
7
8
9
10
11
<?php

function test(){
$a = 123;
return 1 + $a;
}

while (true)
{
$b = 5 + test();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
> phpdbg -e debug.php

[Welcome to phpdbg, the interactive PHP debugger, v7.4.3]
To get help using phpdbg type "help" and press enter
[Please report bugs to <http://bugs.php.net/report.php>]
prompt>

// 这一步需要前面启动phpdbg时 参数带上 -e debug.php run 才能正常执行
prompt> run

// 然后按 ctrl+c 表示开始断点,此时断在哪是随机的,因为还没开始添加断点
[Program received signal SIGINT]
prompt>

// 打印当前堆栈的opcodes
prompt> p
[Stack in C:\Users\Administrator\AppData\Roaming\JetBrains\IntelliJIdea2022.1\scratches\debug.php (7 ops)]
L1-12 {main}() C:\Users\Administrator\AppData\Roaming\JetBrains\IntelliJIdea2022.1\scratches\debug.php - 0x262fc860
500 + 7 ops
L8 #0 JMP J5
L10 #1 INIT_FCALL 128 "test"
L10 #2 DO_FCALL @0
L10 #3 ADD 5 @0 ~1
L10 #4 ASSIGN $b ~1
L8 #5 JMPNZ true J1
L12 #6 RETURN<-1> 1

// 打印当前所处的位置
prompt> back
frame #0: {main} at C:\Users\Administrator\AppData\Roaming\JetBrains\IntelliJIdea2022.1\scratches\debug.php:10
prompt>

发现死循环在 debug.php:10 的第十行

排查内存泄漏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
ini_set('memory_limit', "10M");


class T1
{
public T1 $t1;
}

function test()
{
$n = 10000000;
$arr = [];
while ($n--) {
$t1 = new T1();
$arr[] = $t1;
}
}

while (true){
echo PHP_EOL;
test();
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
> phpdbg -e debug.php

[Welcome to phpdbg, the interactive PHP debugger, v7.4.3]
To get help using phpdbg type "help" and press enter
[Please report bugs to <http://bugs.php.net/report.php>]
prompt>

// 这一步需要前面启动phpdbg时 参数带上 -e debug.php run 才能正常执行
prompt> run
[PHP Fatal error: Allowed memory size of 10485760 bytes exhausted (tried to allocate 4194312 bytes) in C:\Users\Administrator\AppData\Roaming\JetBrains\IntelliJIdea2022.1\scratches\debug.php on line 16]

// 打印当前堆栈的opcodes
prompt> p
[Stack in test() (20 ops)]
L10-18 test() C:\Users\Administrator\AppData\Roaming\JetBrains\IntelliJIdea2022.1\scratches\debug.php - 0x2459c282000 + 20 ops
L10 #0 EXT_NOP
L12 #1 EXT_STMT
L12 #2 ASSIGN $n 10000000
L13 #3 EXT_STMT
L13 #4 ASSIGN $arr array(0)
L14 #5 EXT_STMT
L14 #6 JMP J16
L15 #7 EXT_STMT
L15 #8 NEW "T1" @2
L15 #9 EXT_FCALL_BEGIN
L15 #10 DO_FCALL
L15 #11 EXT_FCALL_END
L15 #12 ASSIGN $t1 @2
L16 #13 EXT_STMT
L16 #14 ASSIGN_DIM $arr NEXT
L16 #15 OP_DATA $t1
L14 #16 POST_DEC $n ~6
L14 #17 JMPNZ ~6 J7
L18 #18 EXT_STMT
L18 #19 RETURN<-1> null

// 打印打印当前的堆栈信息
prompt> back
frame #0: test() at C:\Users\Administrator\AppData\Roaming\JetBrains\IntelliJIdea2022.1\scratches\debug.php:16
frame #1: {main} at C:\Users\Administrator\AppData\Roaming\JetBrains\IntelliJIdea2022.1\scratches\debug.php:22

// 检查$t1 变量
prompt> ev $t1
T1 Object
(
)

// 检查$arr 变量
prompt> ev print_r(count($arr))
655361

发现是$arr这个变量太大了,问题解决

总结

因为phpdbg好像可以不受 memory_limit 的限制并且进程崩溃后还能继续调试崩溃前的内存信息所以可以尝试用来处理内存泄漏问题,
或者通过get_declared_classes() get_defined_vars() 查找所有类的静态变量以及所有声明变量来dump数据慢慢分析.
如果是死循环问题, 一旦遇到, 可以结合上面的back p n等命令快速定位死循环的位置,快速定位.
但是phpdbg有个缺点,不能attach运行中的程序,是个遗憾.

  • 命令n 执行到下一行
  • 命令s 步入函数
  • b 数字 添加断点到php源码的第几行
  • c 继续运行
  • ctrl+c 暂停运行
  • ev php表达式, 不能空格,有时需要分号

php备份文件脚本

前言

为了备份手机里的生活照片和一些有趣的短视频而写,可以统一备份指定文件夹到机械硬盘里,可重复允许,以存在文件会跳过

php script.php --from 文件夹 --to 文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<?php

$str = fread(STDIN, 1000);


// php index.php -f xxx -t xxx
$shortopts = "";
$shortopts .= "f:";
$shortopts .= "t:";

$longopts = array(
"from:", // Required value
"to:", // Required value
"group_by_month:", // Required value
);

$options = getopt($shortopts, $longopts);

$path = $options['f'] ?? $options['from'] ?? "";
$target = $options['t'] ?? $options['to'] ?? "";
$group_by_month = $options['group_by_month'] ?? true;
//var_dump($options, $group_by_month);
//exit();
//$path = 'e:\\life';
//$target = "e:\\life2";
//$group_by_month = true;

$path = str_replace(['/', '\\'], DIRECTORY_SEPARATOR, $path);;
$target = str_replace(['/', '\\'], DIRECTORY_SEPARATOR, $target);;

@mkdir($target);
if (!$path || !$target || !file_exists($path) || !file_exists($target)) {
exit("参数不可用");
}

//echo "使用参数 from=$path to=$target group_by_month=$group_by_month" . PHP_EOL;
echo "使用参数 from=$path to=$target " . PHP_EOL;

function read_all($dir, &$res)
{
if (!is_dir($dir)) return false;

$handle = opendir($dir);

if ($handle) {
while (($fl = readdir($handle)) !== false) {
$temp = $dir . DIRECTORY_SEPARATOR . $fl;
if (strpos($temp, 'RECYCLE') > -1 || strpos($temp, 'System Volume Information') > -1) {
continue;
}
//如果不加 $fl!='.' && $fl != '..' 则会造成把$dir的父级目录也读取出来
if (is_dir($temp) && $fl != '.' && $fl != '..') {
read_all($temp, $res);
} else {
if ($fl != '.' && $fl != '..') {
$res[] = $temp;
}
}
}
}
}

function rm_empty_dir($path)
{
if (is_dir($path) && ($handle = opendir($path)) !== false) {
while (($file = readdir($handle)) !== false) {// 遍历文件夹
if ($file != '.' && $file != '..') {
$curfile = $path . '/' . $file;// 当前目录
if (is_dir($curfile)) {// 目录
if (strpos($curfile, 'RECYCLE') > -1 || strpos($curfile, 'System Volume Information') > -1) {
continue;
}
rm_empty_dir($curfile);// 如果是目录则继续遍历
if (count(scandir($curfile)) == 2) {//目录为空,=2是因为.和..存在
rmdir($curfile);// 删除空目录
}
}
}
}
closedir($handle);
}
}


function Directory($dir)
{
echo "创建文件夹: $dir" . PHP_EOL;
return is_dir($dir) or Directory(dirname($dir)) and mkdir($dir, 0777);

}

function sbasename($filename)
{
return preg_replace('/^.+[\\\\\\/]/', '', $filename);
}

$arr = [];
read_all($path, $arr);

$info = date("Y-m", filemtime($arr[0]));
echo "开始复制" . PHP_EOL;
// 检查复制源位置的数据
foreach ($arr as $item) {
$fileName = sbasename($item);
$mtime = filemtime($item);
if($group_by_month){
$dirName = $target . DIRECTORY_SEPARATOR . date('Y-m', $mtime);
}else{
$dirName = dirname(str_replace($path, $target, $item));
}

if (!is_dir($dirName)) {
Directory($dirName);
}
$tmpTarget = $dirName . DIRECTORY_SEPARATOR . $fileName;
if (!file_exists($tmpTarget)) {
// $item = iconv('utf-8', 'gbk', $item);
// $tmpTarget = iconv('utf-8', 'gbk', $tmpTarget);
copy($item, $tmpTarget);
touch($tmpTarget, $mtime);
echo "复制: $item => $tmpTarget" . PHP_EOL;
} else {
echo "跳过: $item" . PHP_EOL;
}
// break;
}
echo "结束复制" . PHP_EOL;



希腊字母读法

相关链接

链接内容里有读音

序号 大写 小写 英语音标注音 英文 汉语名称 常用指代意义
1 Α α /‘ælfə/ alpha 阿尔法 角度、系数、角加速度、第一个、电离度、转化率
2 Β β /‘bi:tə/ 或 /‘beɪtə/ beta 贝塔 角度、系数、磁通系数
3 Γ γ /‘gæmə/ gamma 伽玛 电导系数、角度、比热容比
4 Δ δ /‘deltə/ delta 得尔塔/德尔塔 变化量、焓变熵变屈光度、一元二次方程中的判别式化学位移
5 Ε ε,ϵ /‘epsɪlɒn/ epsilon 艾普西隆/厄普西隆 对数之基数、介电常数电容率应变
6 Ζ ζ /‘zi:tə/ zeta 泽塔 系数、方位角阻抗相对黏度
7 Η η /‘i:tə/ eta 伊塔 迟滞系数、机械效率
8 Θ θ /‘θi:tə/ theta 西塔 温度、角度
9 Ι ι /aɪ’əʊtə/ iota 约(yāo)塔 微小、一点
10 Κ κ /‘kæpə/ kappa 卡帕 介质常数、绝热指数
11 Λ λ /‘læmdə/ lambda 拉姆达 波长、体积、导热系数
12 Μ μ /mju:/ mu 磁导率、微、动摩擦系(因)数、流体动力黏度、货币单位、莫比乌斯函数
13 Ν ν /nju:/ nu 磁阻系数、流体运动粘度、光波频率、化学计量数
14 Ξ ξ 希腊 /ksi/英美 /ˈzaɪ/ 或 /ˈsaɪ/ xi 克西 随机变量、(小)区间内的一个未知特定值
15 Ο ο /əuˈmaikrən/或 /ˈɑmɪˌkrɑn/ omicron 奥米克戎 高阶无穷小函数
16 π /paɪ/ pi 圆周率、π(n)表示不大于n的质数个数、连乘
17 Ρ ρ /rəʊ/ rho 电阻率、柱坐标和极坐标中的极径、密度曲率半径
18 σ,ς /‘sɪɡmə/ sigma 西格马 总和、表面密度、跨导应力电导率
19 Τ τ /tɔ:/ 或 /taʊ/ tau 时间常数切应力、2π(两倍圆周率)
20 Υ υ /ˈipsɪlon/或 /ˈʌpsɪlɒn/ upsilon 宇普西隆 [3] 位移
21 Φ φ,ϕ /faɪ/ phi 磁通量电通量、角、透镜焦度热流量电势、直径、欧拉函数空集、相位、孔隙度
22 Χ χ /kaɪ/ chi 希 [3] /恺 统计学中有卡方(χ^2)分布
23 Ψ ψ /psaɪ/ psi 普西 角速、介质电通量、ψ函数、磁链
24 Ω ω /‘əʊmɪɡə/或 /oʊ’meɡə/ omega 奥米伽/欧米伽 欧姆、角速度角频率、交流电的电角度、化学中的质量分数、有机物的不饱和度

编译原理-有穷自动机-实践

前言

  • 真的喜欢代码的人,有谁不期望有一天自己创造一门语音或者编译器呢,哪怕只是学习下程序是怎么跑起来的.
  • 入门老师 HowdyAI他的视频

实现 & | ( ) 表达式运算的程序, 有穷自动机, 人生第一段语法分析代码, 这种开心花钱真的只能通过学习获得

运行结果
输入: true |(false &true )
输出: 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
<?php


$s = [
function () {
return true;
},
'|',
'(',
function () {
return false;
},
'&',
function () {
return true;
},
')'
];

$echo = "";
foreach ($s as $item) {
if(is_callable($item)){
$echo .= $item() ? "true " : "false ";
}else{
$echo .= $item;
}
}
echo $echo . PHP_EOL;

$index = 0;

// 终结符为 A1
class StateA
{
const A0 = 0; // 初始
const A1 = 1; // 计算了计算式
const A2 = 2; // 匹配了符号
}

function A($word, $isReset)
{
static $state = StateA::A0;
static $expr = null;
static $and = null;

if ($isReset) {
$state = StateA::A0;
$expr = null;
$and = null;
return [];
}

switch ($state) {
case StateA::A0:
switch ($word) {
case is_callable($word):
$tmp = $word();
$expr = function () use ($tmp) {
return $tmp;
};
$state = StateA::A1;
break;
default:
print_r($word);
throw new Exception($word);
}
break;
case StateA::A1:
switch ($word) {
case "&":
$and = true;
$state = StateA::A2;
break;
case "|":
$or = true;
$state = StateA::A2;
break;
default:
throw new Exception();
}
break;
case StateA::A2:
switch ($word) {
case is_callable($word):
if ($and) {
$tmp = $expr() && $word();
} else {
$tmp = $expr() || $word();
}
$and = null;
$expr = function () use ($tmp) {
return $tmp;
};
$state = StateA::A1;
break;
default:
throw new Exception();
}
break;
default:
throw new Exception();
}
return [$state, $expr];
}


function B($word, $isEnd)
{
static $exprList = [
[]
];
if ($isEnd) {
if(count($exprList) !== 1){
print_r($exprList);
throw new Exception();
}
$tmp = reset($exprList);
A(null, true);
foreach ($tmp as $item) {
[$tmpState, $tmpR] = A($item, false);
}
if (!isset($tmpState) || !isset($tmpR)) {
throw new Exception();
}
return $tmpR();
}

switch ($word) {
case "(";
$exprList[] = [];
break;
case ")":
$tmp = array_pop($exprList);
$tmpState = null;
A(null, true);
foreach ($tmp as $item) {
[$tmpState, $tmpR] = A($item, false);
}
if (!isset($tmpState) || !isset($tmpR)) {
throw new Exception();
}
$exprList[count($exprList) - 1][] = $tmpR;
break;
default:
$exprList[count($exprList) - 1][] = $word;
}
return null;
}

foreach ($s as $word) {
B($word, false);
}

$r = B(null, true);

print_r($r);



有穷自动机 第二弹 2022年8月5号

  • 可以解析array() 的数据结构,例如 array(1,1,2) 能解析为数组变量
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    <?php
    $valueRaw = "array(1,1,2)";
    $tokens = token_get_all("<?php $valueRaw");
    array_shift($tokens);
    $array = getArray($tokens);

    var_dump($array);

    function getArray($tokens)
    {
    $res = null;
    $arrays = [

    ];

    $k = null;
    $v = null;
    $minus = false;

    foreach ($tokens as $token) {
    if (!is_array($token)) {
    switch ($token) {
    case ")":
    if (!is_null($v)) {
    if (count($arrays)) {
    if (is_null($k)) {
    $arrays[count($arrays) - 1][] = $v;
    } else {
    $arrays[count($arrays) - 1][$k] = $v;
    }
    } else {
    throw new Exception();
    }
    $k = null;
    $v = null;
    }
    $tmp = array_pop($arrays);
    if (count($arrays)) {
    $v = $tmp;
    } else {
    if (is_null($res)) {
    $res = $tmp;
    } else {
    throw new Exception();
    }
    }
    break;
    case ",":
    if (!is_null($v)) {
    if (count($arrays)) {
    if (is_null($k)) {
    $arrays[count($arrays) - 1][] = $v;
    } else {
    $arrays[count($arrays) - 1][$k] = $v;
    }
    } else {
    throw new Exception();
    }
    $k = null;
    $v = null;
    }
    break;
    case "-":
    $minus = true;
    break;
    }
    } else {
    switch ($token[0]) {
    case T_ARRAY:
    $arrays[] = [];
    break;
    case T_LNUMBER:
    $v = intval($token[1]);
    if($minus){
    $minus = false;
    $v = -$v;
    }
    break;
    case T_STRING:
    case T_CONSTANT_ENCAPSED_STRING:
    $v = substr($token[1], 1, (strlen($token[1]) - 2));
    break;
    case T_DNUMBER:
    $v = floatval($token[1]);
    if($minus){
    $minus = false;
    $v = -$v;
    }
    break;
    case T_WHITESPACE:
    break;
    case T_DOUBLE_ARROW:
    $k = $v;
    $v = null;
    break;
    default:
    throw new Exception();
    }
    }
    }
    return $res;
    }

uniapp兼容手机网页的图片预览代码-双击放大

1. 前因

uniapp官方api的图片预览器,不支持在web端进行双指放大操作, 手机端是可以的

2. 这个代码哪来的,有啥用

网上抄的,但是改了兼容uniapp,只能预览单张图片,多张滑动查看没有,纯css js 兼容性好点

3. 代码如下

imgOver.vue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
<template>
<div class="img-vuer" v-transform v-finger:tap="mTab" v-finger:pinch="handlePinch" v-finger:doubleTap="handleDoubleTap" v-finger:multipointStart="handleMultipointStart" v-finger:pressMove="handlePressMove" v-finger:touchEnd="handleTouchEnd">
<img style="position:absolute;" v-transform :src="src">
</div>
</template>

<script>
/* eslint-disable */
import To from './to';
export default {
props: {
src: {
type: String,
default() {
return '';
}
},
// isScale: {
// type: Boolean,
// default() {
// return false;
// }
// },
minZoom: {
type: [Number, String],
default: 1
},
maxZoom: {
type: [Number, String],
default: 6
}
},
data() {
return {
imgEl: null,
initialScale: 1,
currentScale: 1,
clickTimer:null,
isScale:false,
};
},
mounted() {
if (!this.src) return false;
let self = this;
this.imgPositionAdjust(function(w, h) {
self.imgEl = this;
self.imgHeight = h;
self.imgWidth = w;
this.style.left = (window.innerWidth - w) / 2 + 'px';
this.style.top = (window.innerHeight - h) / 2 + 'px';
this.parentNode.style.display = 'block';
if (w < window.innerWidth && h < window.innerHeight) {
self.isScale = true;
} else if (window.innerWidth / window.innerHeight < w / h) {
self.initialScale = window.innerWidth / w;
this.scaleX = this.scaleY = self.initialScale;
} else {
self.initialScale = window.innerHeight / h;
this.scaleX = this.scaleY = self.initialScale;
}
});
},
methods: {
mTab(){
if(this.clickTimer)
return
this.clickTimer = setTimeout(()=>{
this.$emit("mclick", 0);
},300);
},
clear(){
if(this.clickTimer){
clearTimeout(this.clickTimer);
this.clickTimer = null;
}
},
imgPositionAdjust(onload) {
let img = new Image();
let imgEl = this.$el.lastChild;
img.onload = function() {
onload.call(imgEl, this.width, this.height);
img.onload = null;
img = null;
};
img.src = this.src;
},
getCriticalX(scale) {
// 获取横向临界值
return (this.imgWidth * scale - window.innerWidth) / 2;
},
getCriticalY(scale) {
// 获取纵向临界值
return (this.imgHeight * scale - window.innerHeight) / 2;
},
handleMultipointStart(e) {
this.clear();
this.currentScale = this.imgEl.scaleX;
},
handlePressMove(e) {
this.clear();
let el = this.imgEl;
e.preventDefault();
if (this.isScale) {
el.translateX += e.deltaX / 3;
el.translateY += e.deltaY / 3;
this.$emit('enableSwipe');
return;
}

if (
el.scaleX / this.initialScale < 1.2 &&
el.scaleX / this.initialScale > 0.8
) {
this.$emit('enableSwipe');
el.translateX += e.deltaX / 3;
return;
}

let criticalX = this.getCriticalX(el.scaleX);
let criticalY = this.getCriticalY(el.scaleY);

// 实现超过临界值移动速度减缓
let slowX = el.translateX > criticalX || el.translateX < -criticalX;
let slowY = el.translateY > criticalY || el.translateY < -criticalY;

if (slowX) {
el.translateX += e.deltaX / 3;
this.$emit('enableSwipe');
} else el.translateX += e.deltaX;
if (slowY) {
el.translateY += e.deltaY / 3;
} else el.translateY += e.deltaY;
},
handleTouchEnd(e) {
this.clear();
let el = this.imgEl;
if (this.isScale || el.scaleX / this.initialScale < this.minZoom) {
this.reset();
return;
}

if (el.scaleX / this.initialScale > this.maxZoom) {
new To(
el,
'scaleX',
this.initialScale * this.maxZoom,
500,
this.ease
);
new To(
el,
'scaleY',
this.initialScale * this.maxZoom,
500,
this.ease
);
}
let criticalX = this.getCriticalX(el.scaleX);
let criticalY = this.getCriticalY(el.scaleY);

if (window.innerHeight >= this.imgHeight * el.scaleX) {
new To(el, 'translateY', 0, 500, this.ease);
} else {
if (el.translateY > criticalY) {
new To(el, 'translateY', criticalY, 500, this.ease);
} else if (el.translateY < -criticalY) {
new To(el, 'translateY', -criticalY, 500, this.ease);
}
}

if (window.innerWidth >= this.imgWidth * el.scaleY) {
new To(el, 'translateX', 0, 500, this.ease);
} else {
if (el.translateX > criticalX) {
new To(el, 'translateX', criticalX, 500, this.ease);
} else if (el.translateX < -criticalX) {
new To(el, 'translateX', -criticalX, 500, this.ease);
}
}
},
handleDoubleTap(e) {
this.clear();
let el = this.imgEl;
if (this.isScale) return;

if (this.imgEl.scaleX !== this.initialScale) {
this.reset();
} else {
let box = el.getBoundingClientRect();
let y = window.innerHeight / 2 - e.changedTouches[0].pageY;
let x = window.innerWidth / 2 - e.changedTouches[0].pageX;
new To(el, 'scaleX', this.initialScale * 2, 500, this.ease);
new To(el, 'scaleY', this.initialScale * 2, 500, this.ease);
new To(el, 'translateX', x, 500, this.ease);
new To(el, 'translateY', y, 500, this.ease);
}
},
handlePinch(e, el) {
this.clear();
this.imgEl.scaleX = this.imgEl.scaleY = this.currentScale * e.zoom;
},
reset() {
if (!this.imgEl) return;
new To(this.imgEl, 'scaleX', this.initialScale, 500, this.ease);
new To(this.imgEl, 'scaleY', this.initialScale, 500, this.ease);
new To(this.imgEl, 'translateX', 0, 500, this.ease);
new To(this.imgEl, 'translateY', 0, 500, this.ease);
},
ease(x) {
return Math.sqrt(1 - Math.pow(x - 1, 2));
}
}
};
</script>

<style>
.img-vuer {
position: relative;
width: 100%;
height: 100%;
display: none;
}
</style>

to.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// alloy 的补间函数
var To = function(el, property, value, time, ease, onEnd, onChange) {
var current = el[property];
var dv = value - current;
var beginTime = new Date();
var self = this;
var currentEase =
ease ||
function(a) {
return a;
};
this.tickID = null;
var toTick = function() {
var dt = new Date() - beginTime;
if (dt >= time) {
el[property] = value;
onChange && onChange(value);
onEnd && onEnd(value);
cancelAnimationFrame(self.tickID);
self.toTick = null;
return;
}
el[property] = dv * currentEase(dt / time) + current;
self.tickID = requestAnimationFrame(toTick);
onChange && onChange(el[property]);
};
toTick();
To.List.push(this);
};

To.List = [];

To.stopAll = function() {
for (var i = 0, len = To.List.length; i < len; i++) {
cancelAnimationFrame(To.List[i].tickID);
}
To.List.length = 0;
};

To.stop = function(to) {
cancelAnimationFrame(to.tickID);
};

export default To;

使用时调用方法, activeSrc 自己起的图片地址变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<template>
<view v-if="activeSrc" style="height: 100vh; background-color: #000;">
<img-over :src="activeSrc" :minZoom="0" :maxZoom="120"></img-over>
</view>
</template>

<script >
import ImgOver from '@/components/img-over/img-over';
export default {
components:{
commonnavigatepage,ImgOver
},
}
</script>

graphql后缀文件在express中使用

  1. 安装
    npm i graphql

  2. 创建graphql后缀文件(主流编辑器都有带高亮提示了现在)
    编写内容如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    type itemRe {
    key:String
    value:String
    }

    type Query {
    q_test:String
    q_api_login(account:String!, password:String!):Boolean
    q_check_user(account:String!):String
    q_get_item(key:String!, account:String!):[itemRe]
    }


    type Mutation{
    m_test:String
    m_register(account:String!, password:String!):Boolean
    m_modify_password(account:String!, password:String!):Boolean

    # 输入账号密码发送邮件,当前只支持@qq.com, @foxmail.com 的邮箱
    m_send_email(fromemail:String!, password:String!, toemail:String!,
    title:String, txt:String, html:String):Boolean

    # value 最大不超过255个字符
    m_set_item(key:String!, value:String!, account:String!):Boolean,
    m_remove_item(key:String!, account:String!):Boolean,
    }

    schema {
    query: Query
    mutation: Mutation
    }
  3. 在express框架中使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    import * as express from "express";
    import * as MApi from "./api_define/apilist";
    import graphqlHTTP = require("express-graphql");
    import {buildSchema,} from "graphql";
    let path = require("path");
    let app = express();
    let fs = require("fs");
    let data = fs.readFileSync(path.resolve("src/api_define/apidef.graphql"));
    data = data.toString();
    let schema = buildSchema(data);

    let root = {
    q_test: () => "Query test ok",
    m_test: () => "Mutation test ok",

    // Query api
    q_api_login: async ({account, password}) => await MApi.api_login(account, password),
    q_check_user: async ({account}) => await MApi.check_user(account),
    q_get_item: async ({key, account}) => await MApi.api_get_item(key, account),

    // Mutation api
    m_register: async ({account, password}) => await MApi.api_register(account, password),
    m_modify_password: async ({account, password}) => await MApi.api_modify_password(account, password),
    m_send_email: async ({fromemail, password, toemail, title, txt, html}) => await MApi.api_send_email(fromemail, password, toemail, title, txt, html),
    m_set_item: async ({key, value, account}) => await MApi.api_set_item(key, value, account),
    m_remove_item: async ({key, account}) => await MApi.api_remove_item(key, account),
    };
    app.use('/g', graphqlHTTP({
    schema: schema,
    rootValue: root,
    graphiql: true, //控制显示控制台
    }));


    let server = app.listen(8877, function () {
    // @ts-ignore
    let port = server.address().port;
    console.log("管理后台,访问地址为 http://127.0.0.1:%s", port)
    });


中国传统颜色

转载链接
另外一个人的网站

RGB HEX   完美色谱

红色系
rgb(255, 179, 167) #ffb3a7        ████  粉红,即浅红色。别称:妃色 杨妃色 湘妃色 妃红色
rgb(237, 87, 54) #ed5736        ████  妃色 妃红色:古同"绯",粉红色。杨妃色 湘妃色 粉红皆同义。
rgb(240, 0, 86) #f00056        ████  品红:比大红浅的红色(quester注:这里的"品红"估计是指的"一品红",是基于大红色系的,和现在我们印刷用色的"品红M100"不是一个概念)
rgb(244, 121, 131) #f47983        ████  桃红,桃花的颜色,比粉红略鲜润的颜色。(quester注:不大于M70的色彩,有时可加入适量黄色)
rgb(219, 90, 107) #db5a6b        ████  海棠红,淡紫红色、较桃红色深一些,是非常妩媚娇艳的颜色。
rgb(242, 12, 0) #f20c00        ████  石榴红:石榴花的颜色,高色度和纯度的红色。
rgb(201, 55, 86) #c93756        ████  樱桃色:鲜红色
rgb(240, 86, 84) #f05654        ████  银红:银朱和粉红色颜料配成的颜色。多用来形容有光泽的各种红色,尤指有光泽浅红。
rgb(255, 33, 33) #ff2121        ████  大红:正红色,三原色中的红,传统的中国红,又称绛色(quester注:RGB 色中的 R255 系列明度)
rgb(140, 67, 86) #8c4356        ████  绛紫:紫中略带红的颜色
rgb(200, 60, 35) #c83c23        ████  绯红:艳丽的深红
rgb(157, 41, 51) #9d2933        ████  胭脂:1,女子装扮时用的胭脂的颜色。2,国画暗红色颜料
rgb(255, 76, 0) #ff4c00        ████  朱红:朱砂的颜色,比大红活泼,也称铅朱 朱色 丹色(quester注:在YM对等的情况下,适量减少红色的成分就是该色的色彩系列感觉)
rgb(255, 78, 32) #ff4e20        ████  丹:丹砂的鲜艳红色
rgb(243, 83, 54) #f35336        ████  彤:赤色
rgb(203, 58, 86) #cb3a56        ████  茜色:茜草染的色彩,呈深红色
rgb(255, 45, 81) #ff2d51        ████  火红:火焰的红色,赤色
rgb(201, 31, 55) #c91f37        ████  赫赤:深红,火红。泛指赤色、火红色。
rgb(239, 122, 130) #ef7a82        ████  嫣红:鲜艳的红色
rgb(255, 0, 151) #ff0097        ████  洋红:色橘红(quester注:这个色彩方向不太对,通常洋红指的是倾向于M100系列的红色,应该削弱黄色成分。)
rgb(255, 51, 0) #ff3300        ████  炎:引申为红色。
rgb(195, 39, 43) #c3272b        ████  赤:本义火的颜色,即红色
rgb(169, 129, 117) #a98175        ████  绾:绛色;浅绛色。
rgb(195, 33, 54) #c32136        ████  枣红:即深红(quester注:色相不变,是深浅变化)
rgb(179, 109, 97) #b36d61        ████  檀:浅红色,浅绛色。
rgb(190, 0, 47) #be002f        ████  殷红:发黑的红色。
rgb(220, 48, 35) #dc3023        ████  酡红:像饮酒后脸上泛现的红色,泛指脸红
rgb(249, 144, 111) #f9906f        ████  酡颜:饮酒脸红的样子。亦泛指脸红色

黄色系
rgb(255, 241, 67) #fff143       ████  鹅黄:淡黄色(quester注:鹅嘴的颜色,高明度微偏红黄色)
rgb(250, 255, 114) #faff72        ████  鸭黄:小鸭毛的黄色
rgb(234, 255, 86) #eaff56        ████  樱草色:淡黄色
rgb(255, 166, 49) #ffa631        ████  杏黄:成熟杏子的黄色(quester注:Y100 M20~30 感觉的色彩,比较常用且有浓郁中国味道)
rgb(255, 140, 49) #ff8c31        ████  杏红:成熟杏子偏红色的一种颜色
rgb(255, 137, 54) #ff8936        ████  橘黄:柑橘的黄色。
rgb(255, 164, 0) #ffa400        ████  橙黄:同上。(quester注:Y100 M50 感觉的色彩,现代感比较强。广告上用得较多)
rgb(255, 117, 0) #ff7500        ████  橘红:柑橘皮所呈现的红色。
rgb(255, 199, 115) #ffc773        ████  姜黄:中药名。别名黄姜。为姜科植物姜黄的根茎。又指人脸色不正,呈黄白色
rgb(240, 194, 57) #f0c239        ████  缃色:浅黄色。
rgb(250, 140, 53) #fa8c35        ████  橙色:界于红色和黄色之间的混合色。
rgb(179, 92, 68) #b35c44        ████  茶色:一种比栗色稍红的棕橙色至浅棕色
rgb(168, 132, 98) #a88462        ████  驼色:一种比咔叽色稍红而微淡、比肉桂色黄而稍淡和比核桃棕色黄而暗的浅黄棕色
rgb(200, 155, 64) #c89b40        ████  昏黄:形容天色、灯光等呈幽暗的黄色
rgb(96, 40, 30) #60281e        ████  栗色:栗壳的颜色。即紫黑色
rgb(178, 93, 37) #b25d25        ████  棕色:棕毛的颜色,即褐色。1,在红色和黄色之间的任何一种颜色2,适中的暗淡和适度的浅黑。
rgb(130, 113, 0) #827100        ████  棕绿:绿中泛棕色的一种颜色。
rgb(124, 75, 0) #7c4b00        ████  棕黑:深棕色。
rgb(155, 68, 0) #9b4400        ████  棕红:红褐色。
rgb(174, 112, 0) #ae7000        ████  棕黄:浅褐色。
rgb(156, 83, 51) #9c5333        ████  赭:赤红如赭土的颜料,古人用以饰面
rgb(149, 85, 57) #955539        ████  赭色:红色、赤红色。
rgb(202, 105, 36) #ca6924        ████  琥珀:
rgb(110, 81, 30) #6e511e        ████  褐色: 黄黑色
rgb(211, 177, 125) #d3b17d        ████  枯黄:干枯焦黄
rgb(226, 156, 69) #e29c45        ████  黄栌:一种落叶灌木,花黄绿色,叶子秋天变成红色。木材黄色可做染料。
rgb(137, 108, 57) #896c39        ████  秋色:1,中常橄榄棕色,它比一般橄榄棕色稍暗,且稍稍绿些。2,古以秋为金,其色白,故代指白色。
rgb(217, 182, 17) #d9b611        ████  秋香色:浅橄榄色 浅黄绿色。(quester注:直接在Y中掺入k10~30可得到不同浓淡的该类色彩)

绿色系
rgb(189, 221, 34) #bddd22        ████  嫩绿:像刚长出的嫩叶的浅绿色
rgb(201, 221, 34) #c9dd22        ████  柳黄:像柳树芽那样的浅黄色
rgb(175, 221, 34) #afdd22        ████  柳绿:柳叶的青绿色
rgb(120, 146, 98) #789262        ████  竹青:竹子的绿色
rgb(163, 217, 0) #a3d900        ████  葱黄:黄绿色,嫩黄色
rgb(158, 217, 0) #9ed900        ████  葱绿:1,浅绿又略显微黄的颜色2,草木青翠的样子
rgb(14, 184, 58) #0eb83a        ████  葱青:淡淡的青绿色
rgb(14, 184, 58) #0eb83a        ████  葱倩:青绿色
rgb(10, 163, 68) #0aa344        ████  青葱:翠绿色,形容植物浓绿
rgb(0, 188, 18) #00bc12        ████  油绿:光润而浓绿的颜色。以上几种绿色都是明亮可爱的色彩。
rgb(12, 137, 24) #0c8918        ████  绿沈(沉):深绿
rgb(27, 209, 165) #1bd1a5        ████  碧色:1,青绿色。2,青白色,浅蓝色。
rgb(42, 221, 156) #2add9c        ████  碧绿:鲜艳的青绿色
rgb(72, 192, 163) #48c0a3        ████  青碧:鲜艳的青蓝色
rgb(61, 225, 173) #3de1ad        ████  翡翠色:1,翡翠鸟羽毛的青绿色。2,翡翠宝石的颜色。(quester注:C-Y≥30 的系列色彩,多与白色配合以体现清新明丽感觉,与黑色配合效果不好:该色个性柔弱,会被黑色牵制)
rgb(64, 222, 90) #40de5a        ████  草绿:绿而略黄的颜色。
rgb(0, 224, 158) #00e09e        ████  青色:1,一类带绿的蓝色,中等深浅,高度饱和。3,本义是蓝色。4,一般指深绿色。5,也指黑色。6,四色印刷中的一色。2,特指三补色中的一色。
rgb(0, 224, 121) #00e079        ████  青翠:鲜绿
rgb(192, 235, 215) #c0ebd7        ████  青白:白而发青,尤指脸没有血色
rgb(224, 238, 232) #e0eee8        ████  鸭卵青:淡青灰色,极淡的青绿色
rgb(187, 205, 197) #bbcdc5        ████  蟹壳青:深灰绿色
rgb(66, 76, 80) #424c50        ████  鸦青:鸦羽的颜色。即黑而带有紫绿光的颜色。
rgb(0, 229, 0) #00e500        ████  绿色:1,在光谱中介于蓝与黄之间的那种颜色。2,本义:青中带黄的颜色。3,引申为黑色,如绿鬓:乌黑而光亮的鬓发。代指为青春年少的容颜。(quester注:现代色彩研究中,把绿色提高到了一个重要的位置,和其它红黄兰三原色并列研究,称做"心理原色"之一)
rgb(158, 208, 72) #9ed048        ████  豆绿:浅黄绿色
rgb(150, 206, 84) #96ce54        ████  豆青:浅青绿色
rgb(123, 207, 166) #7bcfa6        ████  石青:淡灰绿色
rgb(46, 223, 163) #2edfa3        ████  玉色:玉的颜色,高雅的淡绿、淡青色
rgb(127, 236, 173) #7fecad        ████  缥:绿色而微白
rgb(164, 226, 198) #a4e2c6        ████  艾绿:艾草的颜色。偏苍白的绿色。
rgb(33, 166, 117) #21a675        ████  松柏绿:经冬松柏叶的深绿
rgb(5, 119, 72) #057748        ████  松花绿:亦作"松花"、"松绿"。偏黑的深绿色,墨绿。
rgb(188, 230, 114) #bce672        ████  松花色:浅黄绿色。(松树花粉的颜色)《红楼梦》中提及松花配桃红为娇艳

蓝色系
rgb(68, 206, 246) #44cef6        ████  蓝:三原色的一种。像晴天天空的颜色(quester注:这里的蓝色指的不是RGB色彩中的B,而是CMY色彩中的C)
rgb(23, 124, 176) #177cb0        ████  靛青:也叫"蓝靛"。用蓼蓝叶泡水调和与石灰沉淀所得的蓝色染料。呈深蓝绿色(quester注:靛,发音dian四声,有些地方将蓝墨水称为"靛水"或者"兰靛水")
rgb(6, 82, 121) #065279        ████  靛蓝:由植物(例如靛蓝或菘蓝属植物)得到的蓝色染料
rgb(62, 237, 231) #3eede7        ████  碧蓝:青蓝色
rgb(112, 243, 255) #70f3ff        ████  蔚蓝:类似晴朗天空的颜色的一种蓝色
rgb(75, 92, 196) #4b5cc4        ████  宝蓝:鲜艳明亮的蓝色(quester注:英文中为 RoyalBlue 即皇家蓝色,是皇室选用的色彩,多和小面积纯黄色(金色)配合使用。)
rgb(161, 175, 201) #a1afc9        ████  蓝灰色:一种近于灰略带蓝的深灰色
rgb(46, 78, 126) #2e4e7e        ████  藏青:蓝而近黑
rgb(59, 46, 126) #3b2e7e        ████  藏蓝:蓝里略透红色
rgb(74, 66, 102) #4a4266        ████  黛:青黑色的颜料。古代女子用以画眉。
rgb(74, 66, 102) #4a4266        ████  黛螺:绘画或画眉所使用的青黑色颜料,代指女子眉妩。
rgb(74, 66, 102) #4a4266        ████  黛色:青黑色。
rgb(66, 102, 102) #426666        ████  黛绿:墨绿。
rgb(66, 80, 102) #425066        ████  黛蓝:深蓝色
rgb(87, 66, 102) #574266        ████  黛紫:深紫色
rgb(141, 75, 187) #8d4bbb        ████  紫色:蓝和红组成的颜色。古人以紫为祥瑞的颜色。代指与帝王、皇宫有关的事物。
rgb(129, 84, 99) #815463        ████  紫酱:浑浊的紫色
rgb(129, 84, 118) #815476        ████  酱紫:紫中略带红的颜色
rgb(76, 34, 27) #4c221b        ████  紫檀:檀木的颜色,也称乌檀色 乌木色
rgb(0, 51, 113) #003371        ████  绀青 绀紫:纯度较低的深紫色
rgb(86, 0, 79) #56004f        ████  紫棠:黑红色
rgb(128, 29, 174) #801dae        ████  青莲:偏蓝的紫色
rgb(76, 141, 174) #4c8dae        ████  群青:深蓝色
rgb(176, 164, 227) #b0a4e3        ████  雪青:浅蓝紫色
rgb(204, 164, 227) #cca4e3        ████  丁香色:紫丁香的颜色,浅浅的紫色,很娇柔淡雅的色彩
rgb(237, 209, 216) #edd1d8        ████  藕色:浅灰而略带红的颜色
rgb(228, 198, 208) #e4c6d0        ████  藕荷色:浅紫而略带红的颜色

苍色
rgb(117, 135, 138) #75878a        ████  苍色:即各种颜色掺入黑色后的颜色,如
rgb(81, 154, 115) #519a73        ████  苍翠
rgb(162, 155, 124) #a29b7c        ████  苍黄
rgb(115, 151, 171) #7397ab        ████  苍青
rgb(57, 82, 96) #395260        ████  苍黑
rgb(209, 217, 224) #d1d9e0        ████  苍白(quester注:准确的说是掺入不同灰度级别的灰色)

水色
rgb(136, 173, 166) #88ada6        ████  水色
rgb(243, 211, 231) #f3d3e7        ████  水红
rgb(212, 242, 231) #d4f2e7        ████  水绿
rgb(210, 240, 244) #d2f0f4        ████  水蓝
rgb(211, 224, 243) #d3e0f3        ████  淡青
rgb(48, 223, 243) #30dff3        ████  湖蓝
rgb(37, 248, 203) #25f8cb        ████  湖绿,皆是浅色。 深色淡色:颜色深的或浅的,不再一一列出。

灰白色系
rgb(255, 255, 255) #ffffff       ████  精白:纯白,洁白,净白,粉白。
rgb(255, 251, 240) #fffbf0       ████  象牙白:乳白色
rgb(240, 252, 255) #f2fdff       ████  雪白:如雪般洁白
rgb(214, 236, 240) #d6ecf0       ████  月白:淡蓝色
rgb(242, 236, 222) #f2ecde       ████  缟:白色
rgb(224, 240, 233) #e0f0e9       ████  素:白色,无色
rgb(243, 249, 241) #f3f9f1       ████  荼白:如荼之白色
rgb(233, 241, 246) #e9f1f6       ████  霜色:白霜的颜色。
rgb(194, 204, 208) #c2ccd0       ▓▓▓▓  花白:白色和黑色混杂的。斑白的 夹杂有灰色的白
rgb(252, 239, 232) #fcefe8       ████  鱼肚白:似鱼腹部的颜色,多指黎明时东方的天色颜色(quester注:M5 Y5)
rgb(227, 249, 253) #e3f9fd       ████  莹白:晶莹洁白
rgb(128, 128, 128) #808080       ████  灰色:黑色和白色混和成的一种颜色
rgb(238, 222, 176) #eedeb0       ████  牙色:与象牙相似的淡黄色(quester注:暖白)
rgb(240, 240, 244) #f0f0f4       ████  铅白:铅粉的白色。铅粉,国画颜料,日久易氧化"返铅"变黑。铅粉在古时用以搽脸的化妆品。(quester注:冷白)

黑色系
rgb(98, 42, 29) #622a1d       ████  玄色:赤黑色,黑中带红的颜色,又泛指黑色
rgb(61, 59, 79) #3d3b4f       ████  玄青:深黑色
rgb(114, 94, 130) #725e82       ████  乌色:暗而呈黑的颜色
rgb(57, 47, 65) #392f41       ████  乌黑:深黑;漆黑
rgb(22, 24, 35) #161823       ████  漆黑:非常黑的
rgb(80, 97, 109) #50616d       ████  墨色:即黑色
rgb(117, 138, 153) #758a99       ████  墨灰:即黑灰
rgb(0, 0, 0) #000000       ████  黑色:亮度最低的非彩色的或消色差的物体的颜色;最暗的灰色;与白色截然不同的消色差的颜色;被认为特别属于那些既不能反射、又不能透过能使人感觉到的微小入射光的物体,任何亮度很低的物体颜色。
rgb(73, 49, 49) #493131       ████  缁色:帛黑色
rgb(49, 37, 32) #312520       ████   煤黑、象牙黑:都是黑,不过有冷暖之分。
rgb(93, 81, 60) #5d513c       ████  黧:黑中带黄的颜色
rgb(117, 102, 77) #75664d       ████  黎:黑中带黄似黎草色
rgb(107, 104, 130) #6b6882       ████  黝:本义为淡黑色或微青黑色。
rgb(102, 87, 87) #665757       ████  黝黑:(皮肤暴露在太阳光下而晒成的)青黑色
rgb(65, 85, 93) #41555d       ████  黯:深黑色、泛指黑色

金银色
rgb(242, 190, 69) ████  赤金:足金的颜色 rgb(234, 205, 118) ████  金色:平均为深黄色带光泽的颜色 rgb(233, 231, 239) ████  银白:带银光的白色
#f2be45 #eacd76 #e9e7ef
rgb(84, 150, 136) ████  铜绿 rgb(167, 142, 68) ████  乌金 rgb(186, 202, 198) ████  老银:金属氧化后的色彩
#549688 #a78e44 #bacac6