0%

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1.安装 MySQL 5.7 官方源
sudo rpm -Uvh https://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm
2.安装 MySQL 5.7
sudo yum install -y mysql-community-server
兜底:
sudo yum install -y mysql-community-server --nogpgcheck 跳过签名验证
3.启动
sudo systemctl start mysqld
sudo systemctl enable mysqld
4.查初始密码(5.7 也有)
grep 'temporary password' /var/log/mysqld.log
5.登录
mysql -uroot -p
输入密码
5.修改密码(5.7)
SET PASSWORD = PASSWORD('NewPass123!');
6.创建或修改业务用户,允许远程访问
CREATE USER 'app_user'@'%' IDENTIFIED BY 'App@123456';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'%';
FLUSH PRIVILEGES;

在服务器安全规则里 放行3306端口

1
2
3
4
5
6
1.先在本地创建仓库  vcs/creat git
2.在添加进仓库 git add
3.提交 commond and push
4.在远程端创建仓库,获得url
5.把url填写到提交过程中的弹框

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
# AI 工程师常用名词速查表


| 序号 | 名词 | 一句话解释 | 工程视角关键点 |
|----|----|----|----|
| 1 | **LLM**(Large Language Model) | 能理解和生成自然语言的超大模型 | 本质:token → 预测下一个 token;无记忆、不主动执行 |
| 2 | **Prompt** | 给 LLM 的“指令 / 程序” | System 定规则,User 提需求,Output 控格式 |
| 3 | **Token** | 模型处理文本的最小单位 | 决定上下文长度、推理成本;中文 ≠ 一字一 token |
| 4 | **Context Length** | 模型一次能记住的 token 上限 | 影响 RAG 文档量、Agent 长流程能力 |
| 5 | **Fine-tuning** | 用数据改变模型行为 | 常用 LoRA / QLoRA,低成本、不动底座 |
| 6 | **SFT**(Supervised Fine-Tuning) | 用标准问答教模型 | 数据格式:指令 → 输入 → 正确输出 |
| 7 | **RAG**(Retrieval-Augmented Generation) | 先查资料再回答 | LLM + 外部知识库,减少幻觉 |
| 8 | **Agent(智能体)** | 能自主完成任务的 LLM 系统 | = LLM + 规划 + 工具 + 记忆 |
| 9 | **Tool / Function Calling** | 让模型调用代码 / API | 模型负责“想”,程序负责“干” |
|10 | **Planner** | 把复杂任务拆成步骤 | 常用于 Agent 流程拆解 |
|11 | **Multi-Agent** | 多 Agent 协同工作 | 查资料 / 分析 / 审核 分工 |
|12 | **MCP** |通过引入合适的 MCP Server,智能体可以更深度地参与到日常开发流程中,协助完成项目文件读取、官方文档获取、浏览器自动化、代码仓库管理,以及跨会话的上下文维护等任务。 |
---

## 📌 速记理解版

- **LLM**:会说话、会推理的引擎 ,但它本身没有记忆、不会主动干活
- **Prompt**:提示词,给模型写程序 例子 你是一个金融分析师,请用表格输出风险点
- **Token / Context**:模型的记忆与成本边界
- **Fine-tuning / SFT**:改变模型行为和规则 LoRA / QLoRA 一种低成本微调技术 给大模型加“外挂”,不动原模型
- **RAG**:给模型接外部知识 先查资料,再让模型回答。 给 LLM 接“外部知识库”
- **Agent**:让模型能自己干活 Agent = LLM + 规划 + 工具 + 记忆
- **Tool**:模型指挥,代码执行 让模型调用代码 / API
- **Planner(规划器)**: 把复杂任务拆成步骤。
- **Multi-Agent(多智能体)**:多个模型协作,比如 一个查资料,一个分析,一个审核




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
一.
每次连接时候 clientID需要不一样,不然会被服务端认为没有离线,会发送之前的消息。
可以在消费端通过设置QoS和cleanSession两个参数来决定客户端是否需要获取离线消息。
表 1. QoS和cleanSession的组合关系

| QoS 级别 | cleanSession = true | cleanSession = false |
|----------|-------------------|--------------------|
| QoS 0 | 无离线消息,在线消息只尝试推一次 | 有离线消息,在线消息只尝试推一次 |
| QoS 1 | 无离线消息,在线消息保证可达 | 有离线消息,所有消息保证可达 |
| QoS 2 | 无离线消息,在线消息保证可达且只接收一次 | 暂不支持 |

## 说明

1. **QoS 0**
- 最低的服务质量。消息最多发送一次,不会重试。
- 不保证消息到达,不适合重要消息。

2. **QoS 1**
- 消息至少到达一次。在线时保证投递成功。
- cleanSession=false 时,客户端离线期间的消息也会被服务器保留并投递。

3. **QoS 2**
- 消息确保只到达一次。适合需要严格唯一性的消息。
- cleanSession=false 时,部分平台暂不支持 QoS2 离线消息。

4. **CleanSession**
- true:每次连接会创建新的会话,断开连接时不会保留订阅和未发送的消息。
- false:服务器保留会话信息,离线消息会被存储并在客户端下次连接时发送。

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
一、鸿蒙的“官方推荐”架构

鸿蒙官方在 ArkUI/ArkTS 和 Java HarmonyOS Ability 开发里,推荐用:

1.MVVM(官方最推)

ArkUI/ArkTS 天然支持 数据驱动,也就是 MVVM 核心思想:

Model:数据实体,普通类或 JS 对象

ViewModel:@Observed, @State, @Computed 等管理状态

View:ArkUI Column, Row, Stack 等 UI 组件

数据变化 → UI 自动刷新(无需手动 findView/updateView)

典型标志:

@Observed
class DeviceData {
batteryPercent: number;
online: boolean;
}

@Component
struct DeviceItem {
@ObjectLink data: DeviceData;
build() {
Column() {
Text("电量: " + this.data.batteryPercent + "%")
}
}
}


这个就是 ArkUI 的 MVVM 核心方式。

2.MVP / MVI(非官方也可用)

MVP:

Model: 数据实体

View: ArkUI 页面

Presenter: 普通 TypeScript / Java 类负责业务逻辑

这种方式在鸿蒙 Java 端和 ArkUI 前端都可以实现,但不如 MVVM 官方支持好。

使用场景:你想完全分离逻辑和 UI,类似 Android 老项目迁移。

MVI:

也是数据驱动,但强调 状态不可变 + 单向数据流

对于复杂页面(设备列表、巡检表格、地图轨迹)非常适合

二、鸿蒙开发特点与 Android 不同点
# Android 与 鸿蒙 ArkUI/ArkTS 特性对比

| 特性 | Android | 鸿蒙 ArkUI / ArkTS |
|------|---------|------------------|
| **数据绑定** | LiveData / ViewModel | `@State`, `@Observed` |
| **UI 组件** | XML / Jetpack Compose | Column, Row, Stack, Text, Image |
| **事件绑定** | `setOnClickListener` | `onClick={() => {...}}` |
| **生命周期** | Activity / Fragment | Ability + Component |
| **官方推荐架构** | MVVM + Jetpack | MVVM + ArkUI |

总结:鸿蒙官方就是 ArkUI + MVVM,几乎天然支持,直接用 @Observed/@State 就能做双向绑定。

三、鸿蒙项目常用 MVVM 模式结构
project/

├─ model/ # 数据模型
│ └─ Device.ts

├─ view/ # 页面组件
│ └─ DevicePage.ts

├─ viewmodel/ # 管理状态、提供数据
│ └─ DeviceViewModel.ts

├─ service/ # 网络/设备/数据库服务
│ └─ DeviceService.ts
└─ utils/


使用方法:

ViewModel 中保存状态

View 使用 @Observed 或 @State 绑定 ViewModel 数据

数据变化 → UI 自动刷新,无需手动更新

四、安卓开发经验迁移到鸿蒙

LiveData → @Observed/@State

ViewModel → ArkTS/Java 对应 ViewModel 类

DataBinding / Jetpack Compose → Column/Row/Stack + build()

MVP 的 Presenter → ArkTS 类 + 自己调用更新函数

核心区别:鸿蒙更偏 声明式 + 数据驱动,MVVM 天然支持,MVP 只能自己写。

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
1.在module.json5中
"requestPermissions": [
{"name": "ohos.permission.INTERNET"},
{"name": "ohos.permission.GET_BUNDLE_INFO"},
{"name": "ohos.permission.KEEP_BACKGROUND_RUNNING"}
],

"pages": "$profile:main_pages",
"abilities": [
{
"name": "EntryAbility",
"backgroundModes": [
"dataTransfer" // 对应 BackgroundMode.DATA_TRANSFER
],



2.在EntryAblility中
async onForeground(): Promise<void> {
// Ability has brought to foreground
hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onForeground');
try {
const wantAgentInfo: wantAgent.WantAgentInfo = {
wants: [{ bundleName: 'com.ht.cotton', abilityName: 'EntryAbility' }],
actionType: wantAgent.OperationType.START_ABILITY,
requestCode: 0,
actionFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG]
};

const wantAgentObj = await wantAgent.getWantAgent(wantAgentInfo);
const taskTypes = ['dataTransfer']; // 或 ['audioPlayback'], ['audioRecording'] 等
const res = await backgroundTaskManager.startBackgroundRunning(this.context, backgroundTaskManager.BackgroundMode.DATA_TRANSFER, wantAgentObj);
// console.info('后台长时任务已申请, notificationId:', res.notificationId);
} catch (e) {
console.error('申请后台长时任务失败:', JSON.stringify(e));
}
}

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
{
"app": {
"bundleName": "com.ht.cotton",
"bundleType": "app",
"versionCode": 1000000,
"versionName": "1.0.0",
"label": "Htconnn",
"deployDomain": "codehelps.online",
"icons": {
"normal": "https://codehelps.online/logo.png",
"large": "https://codehelps.online/logo2.png"
},
"minAPIVersion": "5.0.5(17)",
"targetAPIVersion": "5.0.5(17)",
"modules": [
{
"name": "entry",
"type": "entry",
"deviceTypes": [
"tablet",
"2in1",
"phone"
],
"packageUrl": "https://codehelps.online/a.hap",
"packageHash": "56c1438593fc5f3d6e49196b2751a4bb99d3a83da744cbe8deecad27d07bda8e"
}
]
},
"sign": "描述文件签名"
}

1.打出包对应的packageHash
certutil -hashfile "D:\homyspace\htcotton\entry\build\default\outputs\default\entry-default-signed.hap" SHA256

2.描述文件签名
https://gitee.com/arkin-internal-testing/internal-testing
下载后运行manifest-sign.bat

-operation sign -mode localjks -inputFile D:\file\hmmswj\htcotton.json5 -outputFile D:\file\hmmswj\adhocnew.json5 -keystore D:\homyspace\htcotton\csr\htcotton.p12 -keystorepasswd htnova1003 -keyaliaspasswd htnova1003 -privatekey htcotto

3.生成的前json5文件上传到自己的服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
在 ArkTS(ArkUI)里,ForEach 的第三个参数是 key,用来标识每个列表项的唯一性。它有个“复用组件”的机制:

key 不变 → 组件复用,不会重新渲染

key 变化 → 组件重建,UI 才会刷新

ForEach(this.yardList, (item: DataBean, index: number) => {
ListItem() {
this.BuildYardItemPage(item, index)
}
}, (item: DataBean) => item.sn)


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
先在oh-package.json5中引用库
"@ohos/crypto-js": "2.0.5"



在创建工具类,供外部调用

// CryptoUtils.ts
import { CryptoJS } from '@ohos/crypto-js';

export class DesEncryptorJS {

/**
* DES 加密(ECB + PKCS7)
* @param data 明文
* @param keyStr 密钥(会自动补齐 8 位)
* @returns Base64 加密结果
*/
static desEncrypt(data: string, keyStr: string): string {
// DES key 必须 8 字节
let key = keyStr.padEnd(8, '0');
let parsedKey = CryptoJS.enc.Utf8.parse(key);

let encrypted = CryptoJS.DES.encrypt(data, parsedKey, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7,
});

return encrypted.toString();
}

/**
* DES 解密(ECB + PKCS7)
* @param encryptedData Base64 密文
* @param keyStr 密钥
* @returns 明文
*/
static desDecrypt(encryptedData: string, keyStr: string): string {
let key = keyStr.padEnd(8, '0');
let parsedKey = CryptoJS.enc.Utf8.parse(key);

let decrypted = CryptoJS.DES.decrypt(encryptedData, parsedKey, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7,
});

return decrypted.toString(CryptoJS.enc.Utf8);
}

/**
* AES 加密(默认 ECB + PKCS7)
* @param data 明文
* @param keyStr 密钥(16/24/32 字节)
* @returns Base64 密文
*/
static aesEncrypt(data: string, keyStr: string): string {
let key = CryptoJS.enc.Utf8.parse(keyStr);
let encrypted = CryptoJS.AES.encrypt(data, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7,
});

return encrypted.toString();
}

/**
* AES 解密
* @param encryptedData Base64 密文
* @param keyStr 密钥
* @returns 明文
*/
static aesDecrypt(encryptedData: string, keyStr: string): string {
let key = CryptoJS.enc.Utf8.parse(keyStr);
let decrypted = CryptoJS.AES.decrypt(encryptedData, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7,
});

return decrypted.toString(CryptoJS.enc.Utf8);
}

/**
* MD5 加密
* @param data 明文
* @returns MD5 十六进制字符串
*/
static md5(data: string): string {
return CryptoJS.MD5(data).toString(CryptoJS.enc.Hex);
}
}



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
Step 1️⃣ 安装 Certbot(CentOS / Rocky / Alma)
sudo yum install -y epel-release
sudo yum install -y certbot python3-certbot-nginx

Step 2️⃣ 一条命令申请 HTTPS(⭐ 核心)
sudo certbot --nginx -d example.com -d www.example.com

Step 3️⃣ 立刻生效(不用重启)

Certbot 会自动:

申请证书

配置 Nginx

打开 443

加 SSL 配置

现在直接访问:

https://example.com


🔒 浏览器出现小锁 = 成功



如果是自己解压安装的nginx,建立软连接,指向安装目录,
sudo ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx
sudo certbot --nginx --nginx-server-root /usr/local/nginx/conf -d codehelps.online -d www.codehelps.online