2 次代码提交

作者 SHA1 备注 提交日期
  qdjjx 8ac0a4326f 学习linux脚本 4 年前
  qdjjx cb607ce6e5 some changes 4 年前

培训/办公楼版后端处理.md → 产品/办公楼版/办公楼版后端处理.md 查看文件


+ 81
- 0
产品/开放平台/开放平台接口文档(内部版).md 查看文件

@@ -12,6 +12,9 @@
12 12
 | 1.0.3 | `UDP`协议电量查询,实现按月、按天、按小时查询。              | 季建新 | 2021.2.21 |
13 13
 | 1.0.4 | 获取`HTTP`协议模块是否在线; 模块和项目绑定;模块和项目解除绑定;获取60分钟内负荷; 获取任意多开关任意时间段内的电量。 | 季建新 | 2021.3.19 |
14 14
 | 1.0.5 | 获取项目下的模块;获取项目下的所有模块及线路;获取任意多个线路的累积负荷;获取任意多开关任意时间段内的按小时、按天、按月电量;获取任意多开关任意时间段内的电量。 | 季建新 | 2021.3.22 |
15
+| 1.0.5 | 获取任意多模块任意线路任意时间段内的电压或负荷;获取任意多模块任意线路最近24小时内的电压或负荷 | 季建新 | 2021.4.1  |
16
+
17
+
15 18
 
16 19
 
17 20
 
@@ -1317,3 +1320,81 @@ DD-Open-Key: bde2d876-993d-440d-aba1-3a06007a25a3
1317 1320
 }
1318 1321
 ```
1319 1322
 
1323
+
1324
+
1325
+## 获取任意多模块任意线路任意时间段内的电压或负荷
1326
+
1327
+请求
1328
+
1329
+```
1330
+POST http://47.103.61.198:5008/api/breaker/real/random
1331
+
1332
+Headers:
1333
+
1334
+Content-Type: application/json
1335
+DD-Open-Key: bde2d876-993d-440d-aba1-3a06007a25a3
1336
+
1337
+{
1338
+	"StartYear":2021,
1339
+	"StartMonth":3,
1340
+	"StartDay":1,
1341
+	"StartHour":2,
1342
+	"EndYear":2021,
1343
+	"EndMonth":3,
1344
+	"EndDay":5,
1345
+	"EndHour":2,
1346
+	"MacAddrs":["187ED5311111_1", "187ED5322222_2"],
1347
+	"Type":1 //Type为0表示请求负荷,为1表示请求电压
1348
+}
1349
+```
1350
+
1351
+
1352
+
1353
+响应
1354
+
1355
+```
1356
+{
1357
+    "data": {
1358
+        "total": "221.495"
1359
+    },
1360
+    "isError": false,
1361
+    "message": "success",
1362
+    "code": 200
1363
+}
1364
+```
1365
+
1366
+
1367
+
1368
+## 获取任意多模块任意线路最近24小时内的电压或负荷
1369
+
1370
+
1371
+
1372
+请求
1373
+
1374
+```
1375
+POST http://47.103.61.198:5008/api/breaker/real/latest
1376
+
1377
+Headers:
1378
+
1379
+Content-Type: application/json
1380
+DD-Open-Key: bde2d876-993d-440d-aba1-3a06007a25a3
1381
+
1382
+{
1383
+	"MacAddrs":["187ED5311111_1", "187ED5322222_2"],
1384
+	"Type":0 //Type为0表示请求负荷,为1表示请求电压
1385
+}
1386
+```
1387
+
1388
+响应
1389
+
1390
+```
1391
+{
1392
+    "data": {
1393
+        "total": "1.162"
1394
+    },
1395
+    "isError": false,
1396
+    "message": "success",
1397
+    "code": 200
1398
+}
1399
+```
1400
+

培训/总部运营后台后端处理.md → 产品/总部运营后台/总部运营后台后端处理.md 查看文件


培训/总部运营后台运作原理.md → 产品/总部运营后台/总部运营后台运作原理.md 查看文件


+ 73
- 0
产品/智能照明版/智能照明2.0.0模块化.md 查看文件

@@ -0,0 +1,73 @@
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
+  ![架构依赖](F:\SourceCodes\DDWiki\产品\智能照明版\架构依赖.png)
29
+
30
+  
31
+
32
+# 模块化实践步骤
33
+
34
+
35
+
36
+- 开发:开发模块的`Domain`, `Infra`,`Application`,`API`层
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
+- 收益

+ 515
- 0
产品/智能照明版/智能照明2.0.0版后端.md 查看文件

@@ -0,0 +1,515 @@
1
+> 后端讨论希望达成的目标:1、走通所有细节;2、表设计;3、任务分配;4、开始工作 
2
+
3
+# 1、前提 
4
+
5
+## 1.1 质量要求
6
+
7
+高可用
8
+
9
+```
10
+程序Down掉能重启:https://www.yuque.com/smartstone/nx/agent
11
+```
12
+
13
+高性能
14
+
15
+```
16
+响应时间:1秒以内
17
+吞吐量:200个模块、5000个开关、5秒一次的上传频率
18
+```
19
+
20
+高扩展
21
+
22
+```
23
+不同设备,不同协议
24
+```
25
+
26
+## 1.2 相关系统
27
+
28
+```
29
+--智能照明版:局域网,前后端分离,后端提供接口
30
+--总部运营版:云端,提供给智能照明版相关接口
31
+--电工端:云端,后端提供接口
32
+--局域网开放平台:局域网,提供给智能照明版有关设备和数据的接口
33
+--局域网调度平台:管理背景作业
34
+```
35
+
36
+## 1.3 安装
37
+
38
+实际需要安装部署方案,安装手册等。
39
+
40
+```
41
+--安装成服务:https://www.yuque.com/smartstone/nx/agent 
42
+--容器:先放一下,以后再说。
43
+```
44
+
45
+
46
+
47
+## 1.4 功能模块化
48
+
49
+```
50
+--所有功能在一个应用程序内,一次性加载,通过总部运营后台配置(一定可以做)
51
+--一个接口一个组件,动态加载,通过总部运营后台配置(决定做,对后期多项目开发影响巨大)
52
+```
53
+
54
+
55
+
56
+## 1.5 架构
57
+
58
+```
59
+DC.DDD.Domain
60
+DC.DDD.Infrastructure
61
+DD.Infra
62
+DD.Libs
63
+DD.ZNZM.Infra
64
+DD.ZNZM.Application
65
+DD.ZNZMP.API
66
+```
67
+
68
+
69
+
70
+## 1.6 脚手架
71
+
72
+```
73
+为各个版本打下基础
74
+
75
+--办公楼版
76
+--智能照明版:目前2.0,未来对单灯的控制
77
+--能耗版:接入三相,电量是重点
78
+--物流版:接入利群物流产业园内的各种设备数据
79
+--学生公寓版:对负荷的控制
80
+--工地版:管理工地用电
81
+--铁塔版:5G基站远程用电管理,电量计量
82
+```
83
+
84
+
85
+
86
+## 1.7 采用`Endpoint`模式
87
+
88
+```
89
+弃用Controller,采用Endpoint模式
90
+```
91
+
92
+
93
+
94
+## 1.8 外网接通性
95
+
96
+在智能照明版中,认定外网安装系统时是可以接通的,可以保证平常没有外网的情况下,系统也可以工作。
97
+
98
+
99
+
100
+
101
+
102
+# 2、总部运营版
103
+
104
+
105
+
106
+总部运营后台。销售员创建项目。
107
+
108
+```
109
+IsProject=1, IsProject=1表示这个组织有其数据库相关配置
110
+Name
111
+
112
+备注:如果不是具有数据库相关组织,IsProject=1;如果是调用开放平台接口的第三方,那么IsProject=0, IsThirdPaty=1;
113
+```
114
+
115
+财务审核项目,最终`CEO`审核通过。意味着可以对项目进行后续安装施工运维了。
116
+
117
+
118
+
119
+总部运营后台。管理员为项目设置基本信息。
120
+
121
+```
122
+NSpace: 用来表示在Redis缓存中的命名空间,当需要查询模块的实时数据,就会到这个命名空间中去找。项目的命名空间需要同步给开放平台,因为只有开放平台才收到模块的数据,并把数据根据命名空间存入Redis缓存。开放平台在什么时候知道项目的命名空间呢?是在总部运营后台,当把模块和项目进行绑定的时候,把该项目的命名空间同步给开放平台。
123
+
124
+APIKey: 给调用开放平台的第三方使用。如果组织是第三方合作公司,需要为项目设置APIKey。也是在模块和项目进行绑定的时候,把APIKey同步给开放平台。然后第三方方,才可以吧APIKey放在Header中调用开放平台接口。
125
+
126
+Version: 这个字段在总部运营后台的数据库hd_new中,暂时还没有,需要加上,用来表示项目属于哪个版本。
127
+```
128
+
129
+
130
+
131
+总部运营后台。管理员为项目配置数据库相关。
132
+
133
+```
134
+包括关系数据库、时序数据库、Redis数据库等。
135
+
136
+这些配置会在项目现场安装的时候,在控制台上依次选择执行,默认从云端获取这些配置,分别创建生成各种数据库。
137
+```
138
+
139
+
140
+
141
+总部运营后台。管理员为项目设置授权。
142
+
143
+```
144
+-- 使用Key
145
+-- 把Key保存在硬盘上,不保存在Cookie
146
+```
147
+
148
+
149
+
150
+总部运营后台。管理员为项目设置功能模块。
151
+
152
+```
153
+--基础模块:为所有项目版本可以共用的功能模块
154
+--版本模块:为某个项目版本特定开发的功能模块
155
+```
156
+
157
+
158
+
159
+总部运营后台。管理员为项目设置位置。
160
+
161
+```
162
+位置信息、配电间信息、电箱信息会在工程部的CAD图纸上预先标明。
163
+
164
+--设置无限级位置:大楼、楼层、区域....一版最多设置五级就够了
165
+--设置配电间
166
+--设置配电间内的电箱:电箱编号
167
+```
168
+
169
+
170
+
171
+总部运营后台。管理员输入模块。
172
+
173
+```
174
+-- 模块号:目前手动录入。以后通过批量导入,或者扫描枪扫码入库。
175
+-- 模块通讯方式:HTTP, UDP等等
176
+-- 模块软件版本
177
+```
178
+
179
+
180
+
181
+总部运营后台。管理员把模块和项目进行绑定。
182
+
183
+```
184
+--总部运营后台的projectmac记录关系
185
+--需要调用开放平台接口,把模块的NSpace, APIKey, 通讯方式同步给开放平台
186
+
187
+1、总部projectmacs表如下:
188
+Mac
189
+OrganizationId
190
+BindTime
191
+UnBindTime
192
+Protocol
193
+
194
+
195
+2、开放平台的projects表记录项目信息:
196
+NSpace
197
+APIKey
198
+
199
+3、开放平台的macs表记录如下:
200
+Mac
201
+ProjectId
202
+ProtocolType
203
+```
204
+
205
+
206
+
207
+
208
+
209
+总部运营后台。管理员创建电工。
210
+
211
+```
212
+首先会创建一个名称为总部的Organization, 然后为总部添加一个员工Employee, 并分别在User和UserRole中增加一条记录。
213
+```
214
+
215
+
216
+
217
+总部运营后台。管理员设置电工和项目的绑定。
218
+
219
+```
220
+相当于电工和某个版本的项目进行了绑定。
221
+```
222
+
223
+# 3、电工版
224
+
225
+
226
+
227
+电工版。电工登录后,选择项目。点击"位置上传",  扫描模块的二维码或者选择手动输入,点击确定。位置和模块信息存入总部。
228
+
229
+# 4、智能照明版
230
+
231
+
232
+
233
+智能照明版。电工点击可执行文件,自动安装时序数据库、`MySQL`、`Redis`, 初次使用默认用户名和密码,数据库信息放配置文件中,使用加密字符串。
234
+
235
+
236
+
237
+智能照明版。电工登录,如果还没有授权,进入授权页,电工输入`Key`, 系统内部会把`Key`存入硬盘,调用总部验证接口验证通过(总部记录操作记录,启用时间,操作人,等等),然后跳转到登录页。
238
+
239
+
240
+
241
+智能照明版。电工登录,最终点击位置管理中的开关管理。
242
+
243
+```
244
+--电工点击下载按钮
245
+--电工在excel表格中输入开关的名称、第几行、第几列
246
+--电工上传表格
247
+
248
+在Breaker领域中:
249
+Row
250
+Column
251
+Addr
252
+
253
+
254
+```
255
+
256
+
257
+
258
+智能照明版。电工手动创建或者批量导入员工。默认员工的角色是游客。
259
+
260
+
261
+
262
+智能照明版。电工在权限管理中,把某个游客设置为管理员,管理员只有一个。电工完成工作。
263
+
264
+
265
+
266
+智能照明版。管理员登录,在权限管理中,把某个游客设置为操作员或电工。
267
+
268
+
269
+
270
+智能照明版。管理员为操作员或电工分配开关。
271
+
272
+
273
+
274
+智能照明版。管理员或电工创建场景。如果电工创建了某个场景,这个场景自动归属于这个电工。当然,同样的场景可以指定给不同的电工或操作员。
275
+
276
+```
277
+--关于同一个开关,在同一时间有多个合闸、分断怎么办?
278
+
279
+原则:同一个开关,如果在1分钟之内有多个指令冲突,就在场景编辑的开关列表中文字备注说明或者图标说明该开关有冲突。鼠标移动上备注说明文字或图标上时,气泡显示冲突细节,包括:和哪个场景的哪个开关时间冲突,然后建议修改开关场景触发时间或者把开关从该场景中删除。
280
+
281
+--开关状态
282
+
283
+判断场景执行情况时的开关状态,是从实时数据中取出来的状态。
284
+
285
+--场景历史执行
286
+
287
+记录执行失败的情况。记录每次场景的开关总数,未执行原因,等等。
288
+
289
+--场景执行结果
290
+对某个开关来说,10:00执行场景,这个场景中的最后一个开关10:02执行完毕,在QUartz中保存两条记录,一条是10:00,表示开始执行场景;另一条是10:02,表示开始判断执行结果,从实时数据中获取,并且把失败执行结果保存起来。
291
+
292
+```
293
+
294
+
295
+
296
+
297
+
298
+首页
299
+
300
+```
301
+--场景:当日哪些执行的
302
+
303
+--总负荷如何计算?
304
+每个开关的最大负荷=linetype * specification
305
+
306
+--首页数据
307
+首先背景作业每隔一段时间把首页数据统计到某个专属表或缓存里,这样首页打开的速度就会快;另外,再有一个背景作业,不断地把首页的变化数据通过长连接(推荐使用SignalR)推送到首页。
308
+
309
+--场景监测
310
+在判断场景执行结果时,通过SignalR往首页主动推送场景的执行结果。
311
+
312
+```
313
+
314
+
315
+
316
+首页点击进入的报警详情
317
+
318
+```
319
+同一开关的报警记录是从时序数据库的历史报警中获取
320
+```
321
+
322
+
323
+
324
+首页点击进入,场景执行详情
325
+
326
+| 重新执行次数 | 场景未执行原因 | 建议方案                     |
327
+| ------------ | -------------- | ---------------------------- |
328
+| 1, 2         | 模块离线       | 已上报,正在处理             |
329
+| 1, 2         | 开关离线       | 已上报,正在处理             |
330
+| 1,2          | 线下手动分断   | 已上报,正在处理             |
331
+| 1            | 未知原因       | 重新执行按钮                 |
332
+| 2            | 未知原因       | 重新执行按钮                 |
333
+| 3            | 未知原因       | 已重试两次,已上报,正在处理 |
334
+
335
+```
336
+--点击重新执行按钮
337
+
338
+点击的这行有一个加载按钮,这一行不允许再次点击,大概5-10秒,通过SignalR反馈结果。
339
+```
340
+
341
+
342
+
343
+首页设置
344
+
345
+```
346
+授权成功后,把总部有关的设置信息保存到局域网数据库
347
+```
348
+
349
+
350
+
351
+位置管理
352
+
353
+```
354
+--加载第一级位置信息,如果没有
355
+
356
+提醒电工登录电工端上传位置信息。
357
+
358
+--修改
359
+
360
+修改的时候调用总部接口。
361
+
362
+--无限级
363
+
364
+支持无限级,但实际级数不会太多。
365
+```
366
+
367
+
368
+
369
+开关健康管理
370
+
371
+```
372
+
373
+判断是否有外网的解决办法
374
+--把没有上传成功的攒下来到某个时间点批量上传
375
+--如果长时间没有上传,外网异常报警
376
+
377
+如何上报?
378
+
379
+前提是必须网络正常
380
+--自动上报
381
+--手动上报
382
+
383
+
384
+所有局域网开关健康数据汇总之总部云端数据库。
385
+
386
+开关健康指标定义策略:包括什么才算频繁跳闸次数、什么才叫多长时间不动作、什么叫异常负荷、什么叫高负荷(多长时间内)。
387
+
388
+--频繁跳闸次数
389
+
390
+从跳闸历史报警中获取。
391
+
392
+--长时间没有动作
393
+
394
+每一个开关都有一个动作记录表,记录所有的合闸和分断。开关动作记录表大致包括:
395
+时间
396
+操作人
397
+合闸或分断:合闸或分断分很多种,比如线下合闸、可视化合闸、场景自动触发合闸、场景手动触发合闸,等等。
398
+电流值:把动作之前最近一次实时数据的电流取到并保存
399
+电压值:
400
+负荷值
401
+
402
+--线上线下合闸分断次数
403
+
404
+从开关动作记录表获取。如果没有一次高负载,显示否;如果有多次高负载,记录高负载次数。开关动作还要记录每次动作当下的电流、电压、负荷等。
405
+
406
+--负荷异常次数
407
+
408
+--报警次数
409
+
410
+--预警次数
411
+
412
+--更换记录
413
+
414
+电工端来操作,包括模块或开关的更换。
415
+
416
+--高负载记录
417
+
418
+在时序数据库层面,实时数据中加一个合闸或分断的标签,求平均值时把分断状态的负荷排除出去。
419
+负载率=平均负载/额定负载
420
+```
421
+
422
+
423
+
424
+模块健康管理
425
+
426
+```
427
+--模块更换记录
428
+
429
+从总部获取。
430
+
431
+--离线记录
432
+
433
+从总部历史报警获取。
434
+
435
+
436
+```
437
+
438
+
439
+
440
+数据查询
441
+
442
+```
443
+--开关数据查询
444
+
445
+从时序数据库历史实时数据获取
446
+
447
+--报警数据查询
448
+
449
+从时序数据库历史报警获取。
450
+
451
+--负载数据查询
452
+
453
+从时序数据库历史实时数据获取
454
+
455
+--电费数据查询 
456
+
457
+一个小时两个时间点的电量。
458
+```
459
+
460
+
461
+
462
+# 5、开放平台
463
+
464
+- 合闸分断接口
465
+- 频繁跳闸次数判断
466
+- 历史实时数据
467
+- 报警查询
468
+
469
+
470
+
471
+# 6、系统监测
472
+
473
+```
474
+CPU
475
+内存
476
+网络
477
+应用程序挂掉
478
+```
479
+
480
+
481
+
482
+# 7、关于场景细节
483
+
484
+```
485
+--如果一个开关当前状态为线下手动分断(Control=false),如果场景下的开关为合闸,如何处理这种情况?如何告知用户?
486
+
487
+原则:只要Control=false就不能控制。场景执行结果或可视化界面显示黄色按钮告知。
488
+
489
+--如果一个开关在多个场景中设置的时间点靠得很近怎么办?
490
+
491
+原则:
492
+-- 如果两个场景中的时间同一秒,后设置的这个不允许,并给提示。
493
+-- 如果两个场景中的时间相差几秒,允许。
494
+-- 根据开关场景设置的时间线判断
495
+-- 如果第一个场景执行失败, 重试根据时间线
496
+
497
+```
498
+
499
+
500
+
501
+# 调光灯设置负荷
502
+
503
+```
504
+需求:如果开关下的负载包括调光灯,在报警策略中设置功率限定,设置一个最小值和最大值,不在限定范围内就报警
505
+
506
+--如何实现?
507
+
508
+谁来设置开关是否是调光灯?电工在Excel中填写是否是调光灯。
509
+Breaker下应该有有一个字段表示是否包含调光灯
510
+在功率限定报警详情中包含两条记录,一个是上限,一个是下限
511
+
512
+
513
+
514
+```
515
+

二进制
产品/智能照明版/架构依赖.png 查看文件


+ 87
- 2
运维/安装/2020淮安安装.md 查看文件

@@ -24,7 +24,7 @@ ctl+alt+t
24 24
 - 确认当前目录:pwd(/home/dingding)
25 25
 - 创建目录:sudo mkdir tmp
26 26
 - 进入目录:cd tmp
27
-- sudo apt install curl
27
+- sudo apt-get install curl
28 28
 - 下载deb文件: sudo curl -OL https://dev.mysql.com/get/mysql-apt-config_0.8.15-1_all.deb 
29 29
 - 查看是否下载:ls
30 30
 - 安装:sudo dpkg -i mysql-apt-config_0.8.15-1_all.deb
@@ -33,18 +33,49 @@ Warning: apt-key should not be used in scripts (called from postinst maintainers
33 33
 不理会
34 34
 ```
35 35
 - sudo apt-get update
36
+
36 37
 - sudo apt-get install mysql-server,输入root密码:teche123
38
+
37 39
 - mysql -u root -p
40
+
38 41
 - 创建用户:CREATE USER 'dd'@'%' IDENTIFIED BY 'dd@123';
42
+
39 43
 - 授权用户:GRANT ALL PRIVILEGES ON *.* TO 'dd'@'%';
44
+
40 45
 - 让授权生效:FLUSH PRIVILEGES;
46
+
41 47
 - 退出MySQL: exit;
48
+
42 49
 - 来到根目录: cd ~
50
+
43 51
 - 来到配置文件目录: /etc/mysql/mysql.d
52
+
44 53
 - 修改文件的权限:sudo chmod 666 mysqld.cnf
54
+
45 55
 - 修改配置文件:bind-address=0.0.0.0
56
+
57
+  ```
58
+  sudo apt-get intall nano
59
+  cd /etc/mysql/mysql.conf.d
60
+  nano mysqld.cnf
61
+  
62
+  mysql -u root -p
63
+  [Warning] World-writable config file '/etc/mysql/my.cnf' is ignored.
64
+  cd /etc/mysql
65
+  sudo chmod 775 my.cnf
66
+  mysql -u root -p
67
+  
68
+  
69
+  GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
70
+  UPDATE mysql.user SET host='%' WHERE user='root';
71
+  ```
72
+
73
+  
74
+
46 75
 - 查看状态:sudo systemctl status mysql
76
+
47 77
 - 重启服务:sudo systemctl restart mysql
78
+
48 79
 - 测试是否可以连接到服务器上的MySQL
49 80
 ```
50 81
 ping 192.168.8.116
@@ -55,9 +86,38 @@ sudo ufw status verbose
55 86
 其实用dd登录即可
56 87
 ```
57 88
 
89
+
90
+
91
+# 安装`MySQL`之二
92
+
93
+```
94
+https://www.fosstechnix.com/install-mysql-5-7-on-ubuntu-18-04/
95
+
96
+sudo mkdir tmp
97
+cd tmp
98
+sudo apt-get install curl
99
+sudo curl -OL https://dev.mysql.com/get/mysql-apt-config_0.8.15-1_all.deb 
100
+sudo dpkg -i mysql-apt-config_0.8.15-1_all.deb
101
+sudo apt-get update
102
+sudo apt-get install mysql-server
103
+mysql_secure_installation
104
+mysql -u root -p
105
+CREATE USER 'xx'@'%' IDENTIFIED BY 'xx@123'
106
+GRANT ALL PRIVILEGES ON *.* TO 'xx'@'%';
107
+FLUSH PRIVILEGES;
108
+sudo apt-get install nano
109
+sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
110
+bind-address = 0.0.0.0
111
+sudo systemctl restart mysql.service
112
+```
113
+
114
+
115
+
116
+
117
+
58 118
 # 安装Redis
59 119
 
60
-- 更新软件:suo apt update
120
+- 更新软件:sudo apt-get update
61 121
 - sudo apt install redis-server
62 122
 - 来到目录:/etc/redis
63 123
 ```
@@ -89,6 +149,31 @@ exit
89 149
 teche123
90 150
 ```
91 151
 
152
+# 安装`Redis`之二
153
+
154
+```
155
+sudo apt-get update
156
+sudo apt-get install redis-server 注意安装版本
157
+cd /etc/redis
158
+ls
159
+sudo chmod 777 redis.conf
160
+
161
+
162
+protected-mode:no
163
+# bind 127.0.0.1
164
+requirepass teche123
165
+
166
+sudo systemctl restart redis
167
+
168
+reids-cli -p 6000
169
+auth xx@123
170
+ping
171
+```
172
+
173
+
174
+
175
+
176
+
92 177
 # 准备
93 178
 
94 179
 - 连接MySQL数据库:192.168.8.109 3306 dd dd@123

+ 35
- 0
运维/安装/2021.1.14Ubuntu配置固定IP方法.md 查看文件

@@ -0,0 +1,35 @@
1
+```
2
+cd /etc/netplan
3
+ls
4
+ifconfig
5
+sudo apt install net-tools
6
+ifconfig
7
+	eno1
8
+sudo apt install nano
9
+sudo chmod 777 01-network-manager-all.yaml
10
+nano 01-network-manager-all.yaml
11
+```
12
+
13
+
14
+
15
+修改配置文件
16
+
17
+```
18
+network:
19
+  version: 2
20
+  renderer: NetworkManager
21
+  ethernets:
22
+    eno1:
23
+      dhcp4: no
24
+      addresses: [192.168.8.141/24]
25
+      gateway4: 192.168.8.1
26
+      nameservers:
27
+      	addresses: [192.168.8.1]
28
+```
29
+
30
+让生效
31
+
32
+```
33
+sudo netplan apply
34
+```
35
+

+ 81
- 0
运维/安装/2021.4.18使用Nginx部署网站.md 查看文件

@@ -0,0 +1,81 @@
1
+```
2
+sudo apt-get update
3
+sudo apt-get install apt-transport-https
4
+sudo apt-get update
5
+cd tmp
6
+wget https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb
7
+sudo dpkg -i packages-microsoft-prod.deb
8
+sudo apt-get update
9
+sudo apt install dotnet-sdk-3.1
10
+```
11
+
12
+
13
+
14
+```
15
+sudo apt update
16
+sudo apt install nginx
17
+sudo systemctl status nginx
18
+```
19
+
20
+
21
+
22
+```
23
+sudo apt update
24
+sudo apt install nano
25
+nano demo2.txt
26
+```
27
+
28
+
29
+
30
+```
31
+cd /
32
+cd etc/nginx/sites-available
33
+nano default
34
+
35
+server {
36
+    listen        80;
37
+    server_name   {api.your-domain-name.com};
38
+    root /home/ubuntu/apps/{your-folder-name};
39
+    location / {
40
+        proxy_pass         http://localhost:5000;
41
+        proxy_http_version 1.1;
42
+        proxy_set_header   Upgrade $http_upgrade;
43
+        proxy_set_header   Connection keep-alive;
44
+        proxy_set_header   Host $host;
45
+        proxy_cache_bypass $http_upgrade;
46
+        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
47
+        proxy_set_header   X-Forwarded-Proto $scheme;
48
+    }
49
+}
50
+
51
+sudo service nginx restart
52
+cd /etc/systemd/system
53
+nano demo.service
54
+
55
+[Unit]
56
+Description=This is a sample application for my tutorial
57
+[Service]
58
+WorkingDirectory=/home/ubuntu/apps/sample
59
+ExecStart=/usr/bin/dotnet /home/ubuntu/apps/sample/Harrys.Sample.ddl
60
+Restart=always
61
+# Restart service after 10 seconds if the dotnet service crashes:
62
+RestartSec=10
63
+KillSignal=SIGINT
64
+SyslogIdentifier=dotnet-example
65
+User=www-data
66
+Environment=ASPNETCORE_ENVIRONMENT=Production
67
+Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
68
+# If you need to run multiple services on different ports set
69
+# the ports environment variable here:
70
+# Environment=ASPNETCORE_URLS=http://localhost:6000
71
+[Install]
72
+WantedBy=multi-user.target
73
+
74
+
75
+sudo systemctl enable demo.service
76
+sudo systemctl status demo.service
77
+```
78
+
79
+
80
+
81
+> https://hbhhathorn.medium.com/install-an-asp-net-core-web-api-on-linux-ubuntu-18-04-and-host-with-nginx-and-ssl-2ed9df7371fb

+ 552
- 0
运维/安装/2021.4.20学习Linux脚本.md 查看文件

@@ -0,0 +1,552 @@
1
+# 跑通第一个在`Ubuntu`上的`Shell Script`
2
+
3
+
4
+
5
+## 什么是Shell Script?
6
+
7
+通常以`.sh`结尾,该文件中包含了`UNIX`的命令。在`Ubuntu`中,默认的`Shell`是`Bash`。
8
+
9
+
10
+
11
+可以在文件的开头注明是否以`shell script`运行。
12
+
13
+```
14
+#!/bin/bash 头一行也被称为shebang, 用来告诉Ubuntu kernel使用哪个解释器,这里表示使用Bash
15
+
16
+#!/bin/sh 表示使用Dash解释器
17
+```
18
+
19
+
20
+
21
+什么是`Bash`?
22
+
23
+默认的命令行解释器。
24
+
25
+```
26
+查看Bash: echo $SHELL
27
+```
28
+
29
+
30
+
31
+
32
+
33
+什么是`Shell`?
34
+
35
+用来执行命令的宏处理器`macro processor`。当打`Linux`控制台,默认就包含`Shell`。输入一些简单的命令,`Shell`默认借助`Bash`解释器,解释并执行命令。
36
+
37
+```
38
+date
39
+cal
40
+pwd
41
+ls
42
+```
43
+
44
+
45
+
46
+什么是`Script`或`Scripting`?
47
+
48
+其实可以理解成批处理命令。用来执行多个命令。
49
+
50
+
51
+
52
+## 第一个批处理命令脚本
53
+
54
+```
55
+创建批处理文件:nano task.sh
56
+#!/bin/bash
57
+
58
+date
59
+cal
60
+pwd
61
+ls
62
+
63
+给予该文件权限:sudo chmod +x task.sh
64
+
65
+执行批处理:./task.sh
66
+```
67
+
68
+
69
+
70
+# 文件名和权限
71
+
72
+
73
+
74
+```
75
+查看文件类型:file task.sh
76
+复制脚本文件:cp task.sh 0_xyz
77
+查看复制文件:file 0_xyz
78
+查看复制文件内容:nano 0_xyz
79
+```
80
+
81
+
82
+
83
+# 脚本执行方式
84
+
85
+
86
+
87
+```
88
+创建脚本文件:echo date > date.sh
89
+
90
+打印脚本文件内容:cat date.sh
91
+
92
+尝试执行脚本文件:./date.sh(执行不成功)
93
+
94
+尝试另外一种执行脚本文件的方式:bash date.sh(执行成功)
95
+
96
+编辑脚本文件:nano date.sh
97
+#!/bin/bash
98
+date
99
+
100
+更改脚本文件的权限:chmod +x date.sh
101
+
102
+使用第一种方式执行脚本文件:./date.sh
103
+```
104
+
105
+
106
+
107
+
108
+
109
+# 相对位置和绝对位置
110
+
111
+
112
+
113
+```
114
+来到根目录:cd /
115
+
116
+查看根目录:pwd
117
+
118
+进入home目录:cd home
119
+
120
+返回上一级: cd ..
121
+
122
+查看根目录内容:ls
123
+目录结构为:
124
+	home/lenovo
125
+	etc
126
+	
127
+进入etc目录:cd etc
128
+
129
+从etc目录进入home/lenovo目录:cd ../home/lenovo
130
+
131
+返回上一个目录:cd -
132
+
133
+再返回上一个目录:cd -
134
+
135
+后退两级返回根目录:cd ../../
136
+
137
+返回linux开机默认目录:cd
138
+```
139
+
140
+
141
+
142
+
143
+
144
+# `Hello World`脚本
145
+
146
+```
147
+创建并打开文件:nano hello-world.sh
148
+
149
+#!/bin/bash
150
+echo "Hello World"
151
+
152
+赋予权限:chmod +x hello-world.sh
153
+
154
+执行脚本:bash hello-world.sh
155
+```
156
+
157
+
158
+
159
+# 查看帮助文件
160
+
161
+
162
+
163
+```
164
+man ls
165
+q 
166
+
167
+ls --help
168
+ls -l
169
+ls -l hello-world.sh
170
+```
171
+
172
+
173
+
174
+# 备份脚本
175
+
176
+```
177
+创建tmp目录:mkdir tmp
178
+
179
+把home/lenovo目录备份:tar -czf /tmp/myhome_directory.tar.gz /home/lenovo
180
+
181
+列出刚刚创建的备份文件:ls -l /tmp/myhome_directory.tar.gz
182
+
183
+删除备份文件:rm /tmp/myhome_directory.tar.gz
184
+
185
+使用which bash创建批处理文件:which bash > back.sh
186
+
187
+在back.sh文件中输入另外一行内容:echo 'tar -czf /tmp/myhome_directory.tar.gz /home/lenovo/' >> backup.sh
188
+
189
+打开并编辑:nano backup.sh
190
+
191
+赋予权限:chmod +x bakcup.sh
192
+
193
+运行:bash backup.sh
194
+```
195
+
196
+
197
+
198
+
199
+
200
+# 变量
201
+
202
+
203
+
204
+```
205
+创建脚本文件:nano welcome.sh
206
+#!/bin/bash
207
+
208
+greeting="Welcome"
209
+user=$(whoami)
210
+day=$(date +%A)
211
+
212
+echo "$greeting back $user! Today is $day, which is the best day of the entire week!"
213
+echo "Your Bash shell version is: $BASH_VERSION. Enjoy!"
214
+
215
+赋予权限:chmod +x welcome.sh
216
+
217
+执行:bash welcome.sh
218
+```
219
+
220
+
221
+
222
+备份文件使用变量:
223
+
224
+```
225
+#!/bin/bash
226
+
227
+# This bash script is used to backup a user's home directory to /tmp/.
228
+
229
+user=$(whoami)
230
+input=/home/$user
231
+output=/tmp/${user}_home_$(date +%Y-%m-%d_%H%M%S).tar.gz
232
+
233
+tar -czf $output $input
234
+echo "Backup of $input completed! Details about the output backup file:"
235
+ls -l $output
236
+
237
+运行:bash backup.sh
238
+```
239
+
240
+
241
+
242
+
243
+
244
+# 输入、输出、错误导向
245
+
246
+
247
+
248
+```
249
+标准错误输出stderr: ls -l foobar 
250
+创建文件:touch foobar
251
+标准输出stdout:ls -l foobar
252
+把信息输出到一个文件:ls barfoo > stdout.txt
253
+把错误信息输出到一个文件:ls barfoo 2> stdout.txt
254
+把信息和错误信息输出到一个文件:ls barfoo &> stdoutandstderr.txt
255
+控制台打印文件内容:cat stdout
256
+```
257
+
258
+
259
+
260
+使用错误导向忽略错误提示。/dev/null可以看作是一个保存错误信息的容器、
261
+
262
+```
263
+nano backup.sh
264
+
265
+#!/bin/bash
266
+
267
+# This bash script is used to backup a user's home directory to /tmp/.
268
+
269
+user=$(whoami)
270
+input=/home/$user
271
+output=/tmp/${user}_home_$(date +%Y-%m-%d_%H%M%S).tar.gz
272
+
273
+tar -czf $output $input 2> /dev/null
274
+echo "Backup of $input completed! Details about the output backup file:"
275
+ls -l $output
276
+
277
+执行脚本:bash backup.sh
278
+```
279
+
280
+
281
+
282
+输入文件,从一个文件中获取信息。
283
+
284
+```
285
+在控制台打开并编辑内容:cat > file1.txt
286
+按ctrl+d完成编辑
287
+从file1.txt中读取文件内容:cat < file1.txt
288
+```
289
+
290
+
291
+
292
+
293
+
294
+# 功能
295
+
296
+
297
+
298
+```
299
+创建脚本:nano function.sh
300
+
301
+#!/bin/bash
302
+
303
+function user_details {
304
+	echo "User Name: $(whoami)"
305
+	echo "Home Directory: $HOME"
306
+}
307
+
308
+user_details
309
+
310
+赋予权限:chmod +x function.sh
311
+执行脚本:bash function.sh
312
+```
313
+
314
+
315
+
316
+更改备份脚本
317
+
318
+```
319
+#!/bin/bash
320
+
321
+# This bash script is used to backup a user's home directory to /tmp/.
322
+
323
+user=$(whoami)
324
+input=/home/$user
325
+output=/tmp/${user}_home_$(date +%Y-%m-%d_%H%M%S).tar.gz
326
+
327
+# The function total_files reports a total number of files for a given directory. 
328
+function total_files {
329
+        find $1 -type f | wc -l
330
+}
331
+
332
+# The function total_directories reports a total number of directories
333
+# for a given directory. 
334
+function total_directories {
335
+        find $1 -type d | wc -l
336
+}
337
+
338
+tar -czf $output $input 2> /dev/null
339
+
340
+echo -n "Files to be included:"
341
+total_files $input
342
+echo -n "Directories to be included:"
343
+total_directories $input
344
+
345
+echo "Backup of $input completed!"
346
+
347
+echo "Details about the output backup file:"
348
+ls -l $output
349
+```
350
+
351
+
352
+
353
+
354
+
355
+# 数字和字符串比较
356
+
357
+
358
+
359
+| 描述     | 数字比较 | 字符串比较 |
360
+| -------- | -------- | ---------- |
361
+| 小于     | -lt      | <          |
362
+| 大于     | -gt      | >          |
363
+| 等于     | -eq      | =          |
364
+| 不等于   | -nq      | !=         |
365
+| 小于等于 | -le      | N/A        |
366
+| 大于等于 | -ge      | N/A        |
367
+
368
+比较数字
369
+
370
+```
371
+a=1
372
+b=2
373
+[ $a -lt $b ]
374
+echo $?
375
+```
376
+
377
+比较字符串
378
+
379
+```
380
+[ "apples" = "oranges" ]
381
+echo $?
382
+```
383
+
384
+
385
+
386
+放在脚本中比较
387
+
388
+```
389
+nano comparison.sh
390
+
391
+#!/bin/bash
392
+
393
+string_a="UNIX"
394
+string_b="GNU"
395
+
396
+echo "Are $string_a and $string_b strings equal?"
397
+[ $string_a = $string_b ]
398
+echo $?
399
+
400
+num_a=100
401
+num_b=100
402
+
403
+echo "Is $num_a equal to $num_b ?" 
404
+[ $num_a -eq $num_b ]
405
+echo $?
406
+
407
+赋予权限:chmod +x comparison.sh
408
+执行脚本:bash comparison.sh
409
+```
410
+
411
+
412
+
413
+# 条件语句
414
+
415
+`if/then/else`语句
416
+
417
+```
418
+创建脚本:nano if_else.sh
419
+#!/bin/bash
420
+
421
+num_a=100
422
+num_b=200
423
+
424
+if [ $num_a -lt $num_b ]; then
425
+    echo "$num_a is less than $num_b!"
426
+fi
427
+
428
+赋予权限:chmod +x if_else.sh
429
+执行脚本:bash if_else.sh
430
+
431
+更改脚本:
432
+
433
+#!/bin/bash
434
+
435
+num_a=400
436
+num_b=200
437
+
438
+if [ $num_a -lt $num_b ]; then
439
+    echo "$num_a is less than $num_b!"
440
+else
441
+    echo "$num_a is greater than $num_b!"
442
+fi
443
+
444
+执行脚本:bash less_than.sh
445
+```
446
+
447
+
448
+
449
+# 占位符参数
450
+
451
+
452
+
453
+```
454
+创建脚本文件:nano param.sh
455
+
456
+#!/bin/bash
457
+
458
+echo $1 $2 $4
459
+echo $#
460
+echo $*
461
+
462
+赋予权限:chmod +x param.sh
463
+执行脚本:bash param.sh hello bash scripting world
464
+```
465
+
466
+
467
+
468
+# 循环
469
+
470
+
471
+
472
+`for`循环
473
+
474
+```
475
+创建文件:nano items.txt
476
+
477
+hello
478
+hi
479
+world
480
+
481
+在控制台打印文件内容:cat items.txt
482
+
483
+创建脚本文件:nano for.sh
484
+
485
+#!/bin/bash
486
+
487
+for i in $( cat items.txt ); do
488
+	echo -n $i | wc -c;
489
+done
490
+
491
+赋予权限:chmod +x for.sh
492
+执行脚本:bash for.sh
493
+```
494
+
495
+
496
+
497
+`while`循环
498
+
499
+```
500
+创建脚本:nano while.sh
501
+
502
+#!/bin/bash
503
+
504
+counter=0
505
+while [ $counter -lt 3 ]; do
506
+	let counter+=1;
507
+	echo $counter
508
+done;
509
+
510
+赋予权限:chmod +x while.sh
511
+执行脚本:bash while.sh
512
+```
513
+
514
+
515
+
516
+
517
+
518
+`until`循环
519
+
520
+```
521
+创建脚本文件:nano until.sh
522
+
523
+#!/bin/bash
524
+
525
+counter=6
526
+until [ $counter -lt 3 ]; do
527
+	let counter-=1
528
+	echo $counter
529
+done
530
+
531
+赋予权限:chmod +x until.sh
532
+运行脚本:bash until.sh
533
+```
534
+
535
+
536
+
537
+
538
+
539
+# 算术
540
+
541
+```
542
+a=$(( 12 + 5 ))
543
+echo a
544
+
545
+expr 2 + 2
546
+
547
+let a=2+2
548
+echo $a
549
+
550
+echo '8.5 / 2.3' | bc
551
+```
552
+

+ 157
- 0
运维/安装/安装禅道.md 查看文件

@@ -0,0 +1,157 @@
1
+# 安装
2
+
3
+- 解压缩到`/opt`目录下
4
+
5
+  ```
6
+  sudo tar -zxvf ZenTaoPMS.12.5.2.zbox_64.tar.gz -C /opt
7
+  ```
8
+
9
+- 一些命令
10
+
11
+  ```
12
+  /opt/zbox/zbox start
13
+  /opt/zbox/zbox stop
14
+  /opt/zbox/zbox  restart
15
+  /opt/zbox/zbox restart
16
+  ```
17
+
18
+- 打开网址
19
+
20
+  ```
21
+  192.168.8.141
22
+  ```
23
+
24
+- 管理员
25
+
26
+```
27
+admin
28
+Teche7208
29
+
30
+coder1
31
+Teche7208
32
+```
33
+
34
+- 修改`Apache`或`Mysql`端口
35
+
36
+```
37
+/opt/zbox/zbox stop
38
+/opt/zbox/zbox -ap 8080 -my 3307
39
+/opt/zbox/zbox start
40
+```
41
+
42
+- 访问数据库
43
+
44
+  ```
45
+  --设置用户名和密码
46
+  
47
+  cd /opt/zbox/auth
48
+  ./adduser.sh
49
+  root
50
+  123456
51
+  
52
+  --网页登录数据库
53
+  
54
+  服务器:127.0.0.1:3306
55
+  用户名:root
56
+  密码:123456
57
+  数据库:zentao
58
+  
59
+  -- 命令行连接数据库
60
+  
61
+  /opt/zbox/bin/mysql -u root -P 3306 -p
62
+  123456
63
+  show databases;
64
+  select version();
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
+- 领取任务和`Bug`
100
+- 更新状态
101
+- 完成任务和`Bug`
102
+
103
+
104
+
105
+测试人员
106
+
107
+- 撰写用例
108
+- 执行用例
109
+- 提交`Bug`
110
+- 验证`Bug`
111
+- 关闭`Bug`
112
+
113
+
114
+
115
+# 账号
116
+
117
+```
118
+
119
+禅道登录网址:http://192.168.8.141/zentao/my/
120
+
121
+
122
+用户名:congxiaolei
123
+密码:CongXiaoLei521
124
+
125
+
126
+用户名:maomin
127
+密码:MaoMin2020
128
+
129
+
130
+用户名:dadong
131
+密码:DaDong2020
132
+
133
+用户名:ChongChong
134
+密码:ChongChong
135
+
136
+
137
+用户名:XiaoMeng
138
+密码:XiaoMeng2020
139
+
140
+
141
+用户名:LvLiang
142
+密码:LvLiang2020
143
+
144
+
145
+用户名:LengJian
146
+密码:LengJian2020
147
+
148
+
149
+用户名:LingLuBing
150
+密码:LingLuBing2020
151
+
152
+
153
+用户名:LingPeng
154
+密码:LingPeng2020
155
+
156
+```
157
+

正在加载...
取消
保存