Selaa lähdekoodia

md文件提交

fuyuhchuan 1 vuosi sitten
commit
0345d7cd5f

+ 9 - 0
11.20 学习计划.md

@@ -0,0 +1,9 @@
+# 11.20计划
+
+![image-20231117174407887](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20231117174407887.png)
+
+**继续熟悉若依框架**	**Jenkins**	**nacos**	
+
+
+
+分支管理

+ 186 - 0
11.21 判断设备在线.md

@@ -0,0 +1,186 @@
+# java怎么判断一个设备是否在线状态
+
+Java是一种广泛应用于网络编程的编程语言,我们经常需要判断设备的在线状态来进行相应的处理。在Java中,可以通过多种方法来判断设备是否在线。下面我将介绍两种常用的方法:通过Ping命令和通过Socket连接。
+
+### 方法一:通过Ping命令判断设备在线状态
+
+Ping命令是一种常用的网络工具,可以用于测试网络连接和判断设备是否在线。在Java中,我们可以使用`Runtime.getRuntime().exec()`方法来执行Ping命令,并通过解析Ping结果来判断设备的在线状态。
+
+首先,我们需要定义一个方法来执行Ping命令并返回Ping结果,代码如下所示:
+
+```java
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class PingUtils {
+    public static boolean isDeviceOnline(String ipAddress) {
+        try {
+            String command = "ping " + ipAddress;
+            Process process = Runtime.getRuntime().exec(command);
+        
+            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+            String line;
+            StringBuilder result = new StringBuilder();
+            while ((line = reader.readLine()) != null) {
+                result.append(line);
+            }
+        
+            reader.close();
+        
+            // 判断Ping结果中是否包含关键词
+            if (result.toString().contains("TTL=")) {
+                return true;  // 设备在线
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    
+        return false;  // 设备离线
+    }
+}
+```
+
+在上述代码中,我们首先执行Ping命令并将结果存储在StringBuilder对象`result`中。然后,我们判断Ping结果中是否包含关键词`TTL=`,如果包含,则表示设备在线;否则,表示设备离线。
+
+使用上述方法判断设备在线状态的示例代码如下所示:
+
+```java
+public class Main {
+    public static void main(String[] args) {
+        String ipAddress = "192.168.0.1";  // 设备的IP地址
+        
+        boolean isOnline = PingUtils.isDeviceOnline(ipAddress);
+        
+        if (isOnline) {
+            System.out.println("设备在线");
+        } else {
+            System.out.println("设备离线");
+        }
+    }
+}
+```
+
+在上述示例代码中,我们首先定义了设备的IP地址`ipAddress`,然后调用`PingUtils.isDeviceOnline()`方法判断设备的在线状态。最后,根据返回的结果输出设备在线或离线。
+
+### 方法二:通过Socket连接判断设备在线状态
+
+除了使用Ping命令,我们还可以通过建立Socket连接来判断设备的在线状态。在Java中,可以使用`InetAddress.isReachable()`方法来实现。
+
+下面是使用Socket连接判断设备在线状态的示例代码:
+
+```java
+import java.io.IOException;
+import java.net.InetAddress;
+
+public class SocketUtils {
+    public static boolean isDeviceOnline(String ipAddress) {
+        try {
+            InetAddress address = InetAddress.getByName(ipAddress);
+            boolean reachable = address.isReachable(5000);  // 设置超时时间为5秒
+            
+            if (reachable) {
+                return true;  // 设备在线
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        
+        return false;  // 设备离线
+    }
+}
+```
+
+在上述代码中,我们首先通过`InetAddress.getByName()`方法获取设备的InetAddress对象,然后调用`isReachable()`方法判断设备是否在线。方法的参数5000表示超时时间为5秒,即在5秒内无法建立Socket连接,则判断设备离线。
+
+使用上述方法判断设备在线状态的示例代码如下所示:
+
+```java
+public class Main {
+    public static void main(String[] args) {
+        String ipAddress = "192.168.0.1";  // 设备的IP地址
+        
+        boolean isOnline = SocketUtils.isDeviceOnline(ipAddress);
+        
+        if (isOnline) {
+            System.out.println("设备在线");
+        } else {
+            System.out.println("设备离线");
+        }
+    }
+}
+```
+
+在上述示例代码中,我们同样定义了设备的IP地址`ipAddress`,然后调用`SocketUtils.isDeviceOnline()`方法判断设备的在线状态。最后,根据返回的结果输出设备在线或离线。
+
+综上所述,通过Ping命令和Socket连接是常用的方法来判断设备是否在线的。可以根据具体需求选择合适的方法来判断设备的在线状态。
+
+
+
+### 方法三
+
+设计数据库表结构,存储设备信息和最后在线时间。
+创建Java实体类,映射数据库中的设备信息。
+使用JDBC或JPA等框架操作数据库,查询离线设备。
+设定离线判定逻辑,比如一个设备超过特定时间没有更新状态,则认为它离线。
+下面是一个使用JDBC和简单的SQL语句来查询离线设备的例子:
+
+首先,假设有一个名为 Device 的简单Java实体类,用于映射数据库表:
+
+java
+public class Device {
+    private int id;
+    private String name;
+    private Timestamp lastOnline;
+
+    // 构造器、getter和setter省略
+}
+然后,创建一个名为 DeviceDao 的数据访问对象类,用于执行数据库查询操作:
+
+java
+import java.sql.*;
+import java.util.ArrayList;
+import java.util.List;
+
+public class DeviceDao {
+    private String jdbcURL = "jdbc:mysql://localhost:3306/your_db";
+    private String jdbcUsername = "username";
+    private String jdbcPassword = "password";
+
+    private static final String SELECT_OFFLINE_DEVICES_SQL = "SELECT * FROM devices WHERE last_online <= ?";
+    
+    public List<Device> findOfflineDevices(long offlineThresholdMinutes) {
+        List<Device> offlineDevices = new ArrayList<>();
+        Timestamp thresholdTime = new Timestamp(System.currentTimeMillis() - offlineThresholdMinutes * 60 * 1000);
+    
+        try (Connection connection = DriverManager.getConnection(jdbcURL, jdbcUsername, jdbcPassword);
+             PreparedStatement preparedStatement = connection.prepareStatement(SELECT_OFFLINE_DEVICES_SQL)) {
+            
+            preparedStatement.setTimestamp(1, thresholdTime);
+            
+            ResultSet rs = preparedStatement.executeQuery();
+    
+            while (rs.next()) {
+                int id = rs.getInt("id");
+                String name = rs.getString("name");
+                Timestamp lastOnline = rs.getTimestamp("last_online");
+    
+                Device device = new Device();
+                // 设定device的属性
+                device.setId(id);
+                device.setName(name);
+                device.setLastOnline(lastOnline);
+    
+                offlineDevices.add(device);
+            }
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+        return offlineDevices;
+    }
+}
+在上面的代码中,我们创建了一个DeviceDao类,里面有一个findOfflineDevices方法,此方法接受一个时间阈值参数,用来确定什么样的设备应该被认为是离线的。
+
+在实际的应用程序中,你可能会使用Spring框架来简化数据库操作,以及使用诸如JPA和Hibernate等ORM框架来进一步简化数据库的CRUD操作。此外,为了应对不同环境的需求,通常会通过外部配置文件来配置数据库连接参数。
+
+请注意,实际的生产代码还需要考虑很多其他的因素,如异常处理、事务管理、安全性和性能优化等。上述代码仅提供了一个基本的示例。

+ 14 - 0
11.27分页操作.md

@@ -0,0 +1,14 @@
+```Java
+// 对记录进行分页操作
+List<YtDeviceStatus> records = list.stream()
+        .skip(startIndex)//跳过startIndex个元素,从startIndex+1开始
+        .limit(pageSize)//限制显示大小,只处理pageSize个元素
+        .collect(Collectors.toList());//将流中的元素收集到List<YtDeviceStatus> == 获取当前页记录
+```
+
+# 分页操作
+
+
+
+
+

+ 56 - 0
Cloudflare WARP搭建.md

@@ -0,0 +1,56 @@
+# Cloudflare WARP搭建过程
+
+## Cloudflare WARP搭建过程
+
+`1、下载Cloudflare WARP安装包,这个需要外网,在谷歌浏览器访问 “https://1.1.1.1”,点击windward下载。(如不能访问外网,以下是安装包链接:https://cowtransfer.com/s/4f36dd04256b4b 点击链接查看 [ Cloudflare_WARP_Release-x64.msi ] ,或访问奶牛快传 cowtransfer.com 输入传输口令 af8i04 查看;)`
+![在这里插入图片描述](https://img-blog.csdnimg.cn/dad85498a4d145fd92a0d7326713b789.jpeg)
+
+`2、下载完成以后默认安装就行`
+![在这里插入图片描述](https://img-blog.csdnimg.cn/95119df6e927468c9344cb54361e8ca8.png)
+
+`3、安装好以后直接在搜索栏搜索“warp”,固定到任务栏方便使用。`
+![在这里插入图片描述](https://img-blog.csdnimg.cn/2de09289640d481c835e7fb953631eef.png)
+
+`4、右下角直接打开使用,注意这里是私密连接是流量限制的,想永久流量免费使用需要使用“Cloudflare Zero Trust”登录使用`
+![在这里插入图片描述](https://img-blog.csdnimg.cn/bb67bd8d63a144c8a6c72fadc4e42e8b.png)
+
+`5、点击设置--偏好设置--账号--Zero Trust登录,输入团队名称`
+![在这里插入图片描述](https://img-blog.csdnimg.cn/62d1126b46e144c8b1c5e950b8c1bbb2.png)
+![在这里插入图片描述](https://img-blog.csdnimg.cn/0ec5b148fc3442baa13020ffe7fc58dd.png)
+
+`6、团体名称获取,浏览器输入:https://www.cloudflare-cn.com/ 点击注册`
+![在这里插入图片描述](https://img-blog.csdnimg.cn/dd8b3e3131b1455eb782716320290bdd.png)
+
+```
+7、随便创建一个邮箱和密码,为了简单使用我创建一个qq邮箱
+```
+
+![在这里插入图片描述](https://img-blog.csdnimg.cn/b44f6a7e7a98441aa6e0a94dc1dcaa41.png)
+![在这里插入图片描述](https://img-blog.csdnimg.cn/711012deca854d8695dc4399ec029287.png)
+
+`8,创建团队名称,选择0美元的团队套餐,下面需要绑定信用卡,这个直接刷新页面再次进入Zero Trust,即可跳过这一步`
+![在这里插入图片描述](https://img-blog.csdnimg.cn/94e8ef3f237a45329677790a135b6e43.png)
+![在这里插入图片描述](https://img-blog.csdnimg.cn/82b5c9a0ade7428cacd1fc429c927328.png)
+![在这里插入图片描述](https://img-blog.csdnimg.cn/3cefc26bf8214644b2952fa78c1d99db.png)
+
+`9、选择My team--Devices,如果第一次选择Devices没有创建选项,就点击一下users,在点击Devices查看是否由创建设备选项`
+![在这里插入图片描述](https://img-blog.csdnimg.cn/288d136dcc3f46db835d8641583cd23a.png)
+
+`10,选择你刚才创建邮箱的后缀,我这边选的是qq邮箱,直接输入@qq.com,创建成功以后会让你下载对应的软件,这个刚才我们已经下载好了,就不需要下载了,直接去"Cloudflare WAPR"vpn界面输入团队名称`
+![在这里插入图片描述](https://img-blog.csdnimg.cn/936071c387ab45a98ed5e2d1a66990e5.png)
+![在这里插入图片描述](https://img-blog.csdnimg.cn/caabbb6eab5f48b6a812af464bba0fbf.png)
+![在这里插入图片描述](https://img-blog.csdnimg.cn/593b5054c7e94abf83df951af4447b75.png)
+
+```
+11、 直接输入创建的团队名称,会调出一个网页,需要输入你刚才创建的邮箱,然后会让输入一个验证码,然后进入你自己的邮箱找到验证码,输入验证即可
+```
+
+![在这里插入图片描述](https://img-blog.csdnimg.cn/3ae979ffb7304592b0f42750f197de42.png)
+![在这里插入图片描述](https://img-blog.csdnimg.cn/1bcf1c42fea440f280593df6a241d902.png)
+![在这里插入图片描述](https://img-blog.csdnimg.cn/bc13cb10c46640fdaca5067087f81118.png)
+
+`12、验证成功以后点击"Open Cloudflare WARP"`
+![在这里插入图片描述](https://img-blog.csdnimg.cn/4087b0c507794d6e91781ad187a4e269.png)
+
+`13、再次查看vpn,就会发现已经变成"Zero Trust"用户了`
+![在这里插入图片描述](https://img-blog.csdnimg.cn/2d072e2fb9d84ff9a0d8ac2cfbf8581d.png)

+ 15 - 0
DM.md

@@ -0,0 +1,15 @@
+# DM
+
+## 移124.71.140.20
+
+usky-fire:DmServiceDMSERVERusky_fire.service  5237  SYSDBA
+
+./disql SYSDBA/'"Yt#75Usky"'@localhost:5237
+
+
+
+
+
+测试:
+
+CREATE USER usky_cloud IDENTIFIED BY "usky666"

+ 951 - 0
git和其它命令.md

@@ -0,0 +1,951 @@
+# git命令
+
+![image-20231120094757873](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20231120094757873.png)
+
+​															连接远程仓库
+
+![image-20231120095505383](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20231120095505383.png)
+
+​															       推到master分支
+
+
+
+
+
+在本地创建分支dev并切换到该分支
+git checkout -b dev(本地分支名称) origin/dev(远程分支名称)
+
+把远程分支拉到本地
+git fetch origin dev(master)(dev/master为远程仓库的分支名)
+
+把某个分支上的内容都拉取到本地
+git pull origin dev(远程分支名称)
+
+
+
+创建远程与本地同名的分支
+
+git push --set-upstream origin branch_name  
+
+删除本地分支
+
+```git
+git branch --delete dev
+```
+
+删除远程分支
+
+```git
+git push origin --delete branch_name
+```
+
+
+
+#1.使用git status查看当前还有多少个commit未推送
+git status
+
+#2.查看具体是哪些commit未推送
+git log 分支名称 ^origin/分支名称
+
+1、git add .  	# 先add至工作区
+
+1.1 使用git reset命令可以撤销之前的git add操作,从而移除某个add的文件。具体命令如下:
+
+```git
+git reset file_path
+```
+
+1.2 使用git rm命令移除已经add的文件。具体命令如下:
+
+```git
+git rm --cached file_path
+```
+
+1.3 使用git restore命令恢复之前的版本,可以将暂存区的修改撤销掉。具体命令如下:
+
+```git
+git restore --staged file_path
+```
+
+2、git commit -m "注释"  	# 添加至本地版本库
+
+3、设置用户名和邮箱
+    git config user.name 作者 
+    git config user.email 邮箱
+    
+4、将代码push至远程仓库
+	git push origin <u>master</u>
+
+
+
+git config --global --list
+
+查看全局配置信息:用户名、邮箱
+
+
+
+![image-20231120095314273](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20231120095314273.png)
+
+![image-20231120095358556](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20231120095358556.png)
+
+
+
+### 查看提交历史
+
+1. **查看所有提交记录**: 使用 `git log` 命令查看当前分支的完整提交历史,包括每次提交的哈希值、作者、日期以及提交信息。
+
+   Bash
+
+   ```bash
+   1git log
+   ```
+
+   若要以更友好的格式展示(如oneline格式),可使用:
+
+   Bash
+
+   ```bash
+   1git log --oneline
+   ```
+
+2. **查找特定提交**: 为了找到你要回退到的版本,可以通过多种方式过滤日志,例如根据提交消息、作者、日期等。若要查找包含特定关键词的提交,可以这样操作:
+
+   Bash
+
+   ```bash
+   1git log --grep="搜索关键词"
+   ```
+
+   若要找到最近的一次提交,可以在命令行浏览日志找到对应的提交哈希。
+
+### 回退到指定版本
+
+1. **通过哈希值回退**: 确定要回退到的目标提交哈希后,可以使用 `git reset` 命令将HEAD指针指向该提交,有三种主要模式可以选择:
+
+   - **软重置(soft reset)**:仅移动HEAD指针,不更改工作目录或暂存区。
+
+     Bash
+
+     ```bash
+     1git reset --soft <提交哈希>
+     ```
+
+   - **混合重置(mixed reset)**:移动HEAD指针,并清空暂存区内容,使它们与所选择的提交一致,但保留工作目录中的改动。
+
+     Bash
+
+     ```bash
+     1git reset --mixed <提交哈希>
+     ```
+
+   - **硬重置(hard reset)**:移动HEAD指针并重置工作目录,使得工作目录与所选择的提交完全一致,任何未提交的本地改动都会丢失。
+
+     Bash
+
+     ```bash
+     1git reset --hard <提交哈希>
+     ```
+
+   其中,`<提交哈希>` 是你想要回退到的那个提交的完整哈希值,通常从 `git log` 中获取。
+
+2. **回到某个标签或分支点**: 如果目标是回到一个标签或者之前的某个分支点,可以用类似的方式:
+
+   Bash
+
+   ```bash
+   1git reset --hard <标签名> # 或者
+   2git reset --hard <分支名>
+   ```
+
+3. **撤销最近一次提交**: 如果你想撤销最近一次提交且不保留任何修改,可以直接执行:
+
+   Bash
+
+   ```bash
+   1git reset --hard HEAD~1
+   ```
+
+4. **切分支并创建新提交**: 如果你想保留当前分支的历史而是在一个新的分支上开始(比如开发团队经常采用这种做法来解决合并问题),你可以先创建一个新分支然后切换过去:
+
+   Bash
+
+   ```bash
+   1git checkout -b new_branch_name <提交哈希>
+   ```
+
+请谨慎操作,特别是涉及到`--hard`选项时,因为它会改变你的工作目录状态,可能会丢失未提交的更改。在执行前确保已备份重要的未提交变更。如果你正在多人协作的项目中,请在推送更改前与团队沟通,以免影响他人。
+
+
+
+
+
+startup.cmd -m standalone
+
+nacos 单机启动(非集群模式)
+
+
+
+debug模式运行程序
+
+mvn spring-boot:run -Dspring-boot.run.arguments=--debug
+
+idea控制台Terminal命令
+
+netstat -aon|findstr "提示的端口"
+
+
+
+# navicat 快捷键
+
+ 1.ctrl+q      打开查询窗口
+2.ctrl+/       注释sql语句
+3.ctrl+shift +/ 解除注释
+4.ctrl+r      运行查询窗口的sql语句
+5.ctrl+shift+r  只运行选中的sql语句
+6.F6        打开一个mysql命令行窗口
+7.ctrl+l      删除一行
+8.ctrl+n      打开一个新的查询窗口
+9.ctrl+w     关闭一个查询窗口
+
+
+
+
+
+# SQLyog快捷键列表
+
+\##连接
+Ctrl+M 创建一个新的连接
+Ctrl+N 使用当前设置新建连接
+Ctrl+F4 断开当前连接
+
+\##对象浏览器
+F5 刷新对象浏览器(默认)
+Ctrl+B 设置焦点于对象浏览器
+SQL 窗口
+Ctrl+T 新建查询编辑器
+Ctrl+E 设置焦点于 SQL 窗口
+Ctrl+Y 重做
+Ctrl+Z 撤销
+Ctrl+X 剪切
+Ctrl+V 粘贴
+Ctrl+H 替换
+Ctrl+G 转到
+Ctrl+O 在 SQL 窗口打开一个 SQL 文档
+Ctrl+Shift+U 使选择内容大写
+Ctrl+Shift+L 使选择内容小写
+Ctrl+Shift+C 注释 SQL 窗口选择内容
+Ctrl+Shift+R 从选择内容删除注释
+Ctrl+Shift+T 插入模板
+Ctrl+Enter 列出所有的标签
+Ctrl+Space 列出匹配的标签
+
+\##执行查询
+F8 执行当前查询并编辑结果集
+F9 执行当前查询(默认)
+Ctrl+F9 执行选定查询(默认)
+Shift+F9 执行全部查询(默认)
+
+\##粘贴 SQL 语句
+Alt+Shift+I 插入语句
+Alt+Shift+U 更新语句
+Alt+Shift+D 删除语句
+Alt+Shift+S 选择语句
+
+\##结果
+F11 插入更新对话框
+Ctrl+R 设置焦点于结果面板中的活动标签
+Ctrl+L 切换结果窗口/表数据以表格/文本方式显示
+Ctrl+Alt+C 以 CSV, SQL, Excel 等导出表数据
+Ctrl+Alt+E 以 SQL 转储文件备份数据
+Ctrl+Shift+M 从 CSV 导入数据
+Ctrl+Shift+E 导出结果集
+Alt+1…n 在结果窗口中选择第n个标签
+
+\##显示/隐藏
+Ctrl+1 显示/隐藏 对象浏览器
+Ctrl+2 显示/隐藏 结果面板
+Ctrl+3 显示/隐藏 查询窗口
+
+\##数据库/数据表
+Ctrl+D 创建数据库
+F6 更改 数据库/数据表的结构/索引/视图/存储过程/函数/触发器/事件
+F2 重命名 数据表/视图/触发器/事件
+Shift+Del 截断 数据库/数据表
+F7 管理索引窗口
+F10 关联/外键
+Ctrl+Alt+R 重新排序字段
+Ctrl+Alt+T 数据表诊断
+Ctrl+Alt+F 刷新对话框
+Ctrl+Shift+Alt+S 以 HTML 格式创建数据库架构
+Ctrl+Shift+Q 从 SQL 转储文件恢复数据库
+
+\##增强工具
+Ctrl+W 数据库同步向导
+Ctrl+Q 架构同步工具
+Ctrl+Alt+O 数据迁移工具包
+Ctrl+Alt+N 通知服务向导
+Ctrl+Alt+S 计划备份
+Ctrl+K 查询创建器
+Ctrl+Alt+D 架构设计器
+
+\##用户管理
+Ctrl+U 添加用户
+Ctrl+Alt+U 编辑用户
+Ctrl+Shift+W 管理用户权限
+
+\##个人文件夹
+Ctrl+Shift+F 添加当前 SQL 语句到个人文件夹
+
+\##其它
+F1 帮助
+F12 快捷键窗口
+Ctrl+C 复制
+Ctrl+A 全选
+Ctrl+F/F3 查找 (SQL 窗口/以文本方式显示的结果窗口和表数据)
+Ctrl+S 保存
+Ctrl+PgUp 切换到上一标签
+Ctrl+PgDown 切换到下一标签
+DEL 删除选定
+Alt+L 关闭标签
+Alt+F4 退出程序
+
+
+
+# shell:达梦数据库
+
+## 1、启动数据库服务
+
+```shell
+服务注册成功后,启动数据库,如下所示:
+systemctl start DmServicedm.service
+停止数据库,如下所示:
+systemctl stop DmServicedm.service
+重启数据库,如下所示:
+systemctl restart DmServicedm.service
+查看数据库服务状态,如下所示:
+systemctl status DmServicedm.service
+```
+
+
+
+## 2、登录达梦数据库
+
+切换目录到大梦数据库的bin目录下
+
+![img](https://img-blog.csdnimg.cn/fa97b45ae9a8440abcd54fcdd94fd951.png)
+
+
+
+登录数据库
+
+```shell
+
+[root@localhost bin]# ./disql SYSDBA/SYSDBA@localhost:5236
+```
+
+
+
+## 3、创建数据库实例
+
+### 创建服务
+
+```shell
+./dminit PATH=/home/dm8/data PAGE_SIZE=32 EXTENT_SIZE=32 CASE_SENSITIVE=N CHARSET=1 LENGTH_IN_CHAR=Y DB_NAME=usky_fire BLANK_PAD_MODE=1 LOG_SIZE=2048 INSTANCE_NAME=usky_fire PORT_NUM=5236
+```
+
+#### 注册服务
+
+```shell
+./dm_service_installer.sh -t dmserver -p DMSERVERusky_fire -dm_ini /home/dm8/data/usky_fire/dm.ini
+
+```
+
+#### 删除服务
+
+```shell
+./dm_service_uninstaller.sh -n 实例/服务名(例如:DmServiceSP)
+```
+
+### 创建表空间
+
+```sql
+CREATE TABLESPACE alarm_electrical_fire
+DATAFILE '/home/dm8/data/usky_fire/alarm_electrical_fire.dbf' SIZE 1M AUTOEXTEND ON NEXT 10M;
+```
+
+```sql
+create tablespace alarm_spray_water datafile '/home/dm8/data/usky_fire/alarm_spray_water.dbf' size 128 autoextend on next 5 cache=normal;
+```
+
+#### 查看所有表
+
+```sql
+SELECT TABLE_NAME FROM USER_TABLES;
+```
+
+#### 将表指定给表空间
+
+```sql
+TABLESPACE alarm_electrical_fire;
+```
+
+#### 查看所有表空间
+
+```sql
+SELECT TABLESPACE_NAME, TABLESPACE_TYPE, TABLESPACE_SIZE
+FROM SYS_ALL_TABLESPACES;
+
+SELECT * FROM V$TABLESPACE;
+```
+
+#### 查看指定表空间内的表名
+
+```sql
+SELECT TABLE_NAME, COLUMN_COUNT, ROW_COUNT
+FROM SYS_TABLES
+WHERE TABLESPACE_NAME = 'alarm_hydrant_water';
+
+SELECT * FROM ALL_TABLES WHERE TABLESPACE_NAME = '表空间名称';
+
+SELECT * FROM DBA_TABLES WHERE TABLESPACE_NAME = 'alarm_spray_water';
+```
+
+#### 查看表属于哪个模式
+
+```sql
+SELECT OWNER AS SCHEMA_NAME  
+FROM ALL_TABLES  
+WHERE TABLE_NAME = 'bsc_enterprise_screen';
+```
+
+
+
+#### 删除表空间(同时删除数据)
+
+```sql
+DROP TABLESPACE tablespace_name INCLUDING CONTENTS;
+```
+
+#### 只删除表空间而保留其中的数据:
+
+1. 首先,确保没有任何活动会话或事务正在使用要删除的表空间。
+2. 在达梦数据库中创建一个新的表空间,用于迁移表和数据。可以使用以下语句创建新表空间:
+
+```sql
+CREATE TABLESPACE new_tablespace_name DATAFILE 'path_to_datafile' SIZE 100M;
+```
+
+在上述语句中,`new_tablespace_name`是新表空间的名称,`path_to_datafile`是数据文件的路径和名称,`SIZE 100M`是指定表空间的大小。
+
+3. 将要保留的表和数据迁移到新的表空间中。可以使用以下语句将表移动到新表空间:
+
+```sql
+ALTER TABLE table_name MOVE TABLESPACE new_tablespace_name;
+```
+
+在上述语句中,`table_name`是要移动的表的名称,`new_tablespace_name`是目标表空间的名称。
+
+4. 确保所有表都已成功迁移到新表空间后,可以将旧表空间删除。使用以下语句删除表空间:
+
+```sql
+DROP TABLESPACE old_tablespace_name INCLUDING CONTENTS;
+```
+
+在上述语句中,`old_tablespace_name`是要删除的旧表空间的名称。`INCLUDING CONTENTS`参数可以选择是否删除表空间中的所有对象和数据。
+
+
+
+## 4、执行`SQL`脚本
+
+两种操作,当然需要登录到数据库中才能操作(导出`dexp、dmp`文件不需要登录数据库)
+
+```shell
+1 # start + 脚本的绝对路径
+2 SQL> start /home/dm8/data/usky_fire/alarm_hydrant_water(DM).sql
+
+run /path/to/sql/file.sql;
+@/path/to/sql/file.sql;
+```
+
+```shell
+1 # ` + 脚本的绝对路径
+2 SQL> `start /home/dm8/data/usky_fire/alarm_hydrant_water(DM).sql
+```
+
+
+
+##  5、导出`dmp`文件
+
+使用`dexp`进行导出,切换到达梦的bin目录下,可以看到有一个`dexp`文件,使用它进行导出的操作
+
+```shell
+1 ./dexp 用户id/密码@ip:5236 file=导出的文件 directory=导出文件所在的目录 导出的模式
+```
+
+ 
+
+导出模式:`FULL、OWNER、SCHEMAS、TABLES` ;全部导出、根据用户导出、根据模式导出和表导出。
+
+ 
+
+```shell
+1 # 全部导出
+2 [root@localhost bin]# ./dexp SYSDBA/SYSDBA@localhost:5236 file=imp_exp.dmp directory=/dm7/data FULL=y
+3 # 根据模式导出
+4 [root@localhost bin]# ./dexp SYSDBA/SYSDBA@localhost:5236 file=imp_exp.dmp directory=/dm7/data SCHEMAS=NINGDATABASE
+```
+
+ 
+
+## 6、导入`dmp`文件
+
+使用`dimp`进行导入,依旧需要切换到达梦的bin目录下,同样也会有一个`dimp`文件,使用这个文件进行导入操作
+
+```shell
+1 ./dimp 用户id/密码@ip:5236 file=导入的文件 directory=导入文件所在的目录 导入的模式
+```
+
+和导出一样,导入也是同样的四个模式
+
+```shell
+1 #根据模式进行导入
+2 [root@localhost bin]# ./dimp SYSDBA/SYSDBA@localhost:5236 file=imp_exp.dmp directory=/dm7/data SCHEMAS=NINGDATABASE
+```
+
+
+
+## 7、执行`SQL`脚本和`dmp`文件
+
+- 修改操作较少或者修改的东西比较集中的情况下可以直接使用导出SQL脚本然后登录数据库执行SQL脚本进行同步操作;SQL脚本的执行默认是直接commit(直接执行SQL需要手动进行commit)
+- 其他比较复杂的操作或者数据量大可以使用导出dmp文件,具体的导出导入模式根据自己的需要进行选择
+- dmp文件或者dexp文件进行操作时,导出和导入模式要一致
+
+
+
+## SQL命令
+
+### 查询数据库版本
+
+```sql
+select * from v$version;
+```
+
+### 查看授权信息
+
+```sql
+select * from  v$license;
+```
+
+### 查看达梦数据库库名
+
+```sql
+select name,create_time from v$database;
+```
+
+### 查看大小写配置是否敏感
+
+--大小敏感(1为大小写敏感,0为大小写不敏感)
+
+```sql
+SELECT SF_GET_CASE_SENSITIVE_FLAG();
+或
+SELECT CASE_SENSITIVE();
+SELECT SF_GET_CASE_SENSITIVE_FLAG();
+```
+
+### 查询数据库最大连接
+
+```sql
+select SF_GET_PARA_VALUE(2,'MAX_SESSIONS');
+```
+
+### 查看达梦数据库当前状态
+
+```sql
+select status$ from v$instance;
+```
+
+### 查询授权截止有效期
+
+```sql
+select EXPIRED_DATE  from v$license;
+```
+
+### 查询数据文件位置
+
+```sql
+select GROUP_ID , ID ,path,STATUS$ from v$datafile;
+```
+
+### 查询表空间大小
+
+```sql
+select FILE_NAME,FILE_ID,TABLESPACE_NAME,BYTES/1024/1024||'M'  from dba_data_files;
+```
+
+### 查询表空间使用情况
+
+```sql
+select t1.NAME tablespace_name,
+
+t2.FREE_SIZE*SF_GET_PAGE_SIZE()/1024/1024 ||'M' free_space,
+
+t2.TOTAL_SIZE*SF_GET_PAGE_SIZE()/1024/1024 ||'M' total_space,
+
+t2.FREE_SIZE*100/t2.total_size "% FREE" 
+
+from V$TABLESPACE t1, V$DATAFILE t2 
+
+where t1.ID=t2.GROUP_ID;
+```
+
+### 查询所有SCHEMA
+
+```sql
+ select * from dba_objects where object_type='SCH';
+```
+
+### 查询所有用户
+
+```sql
+select username from dba_users;
+```
+
+### 切换SCHEMA
+
+```sql
+set schema "testSchema";
+```
+
+### 创建SCHEMA
+
+```sql
+CREATE SCHEMA "testSchema";
+```
+
+### 查询模式下全量表名称
+
+```sql
+select TABLE_NAME from all_tables WHERE OWNER='testSchema';
+```
+
+### 删除SCHEMA
+
+```sql
+drop schema "testSchema";
+```
+
+### 列注释
+
+```sql
+COMMENT ON COLUMN testSchema.peoples.role_id is '角色Id';
+```
+
+### 查询列注释
+
+```sql
+select * from SYSCOLUMNCOMMENTS 
+
+where SCHNAME='testSchema' and TVNAME='peoples' and COLNAME='role_id';
+```
+
+### 表注释
+
+```sql
+comment on table testSchema.peoples is '这是一个表注释';
+```
+
+### 查询表注释
+
+```sql
+select * from SYSTABLECOMMENTS where SCHNAME='testSchema' and TVNAME='peoples';
+```
+
+```sql
+SELECT COMMENTS
+FROM USER_TAB_COMMENTS
+WHERE TABLE_NAME = 'alarm_electrical_fire';
+```
+
+### 创建表空间
+
+```sql
+CREATE TABLESPACE MANAGEMENT DATAFILE 'MANAGEMENT.DBF' SIZE 128;
+```
+
+### 查看表空间
+
+```sql
+select * from dba_data_files;
+
+select * from dba_tablespaces;
+
+select * from v$tablespace;
+```
+
+### 创建用户
+
+```sql
+CREATE USER usky_cloud IDENTIFIED BY "usky666" DEFAULT TABLESPACE MANAGEMENT;
+
+GRANT DBA TO testSchema;
+GRANT DBA TO usky_cloud;
+```
+
+### 查看当前实例的连接数
+
+```sql
+select clnt_ip,user_name,state,count(*) from v$sessions group by clnt_ip,user_name,state;
+```
+
+
+查询 dba_segments 需要Dba权限,用户没有Dba权限时查询 all_tables 或 user_tables
+
+某模式下所有表名  需要DBA权限          AND SEGMENT_NAME LIKE 'CD_%' 
+
+```sql
+select owner,SEGMENT_NAME as tbName from dba_segments  where segment_type='TABLE' and OWNER ='模式名' 
+```
+
+查看模式下所有表  不需要DBA权限       and TABLE_NAME LIKE 'CD_%'
+
+```sql
+select TABLE_NAME as tbName from all_tables where OWNER ='模式名' 
+```
+
+用户下所有表  		where  table_name like 'CD_%' 
+
+```sql
+select table_name as tbName from user_tables group by TABLE_NAME
+```
+
+## 1.1 启动数据库
+
+```sql
+cd /home/dmdba/dmdbms/bin
+./dmserver /home/dmdba/dmdbms/DAMENG/dm.ini
+```
+
+### 1.2 连接数据库
+
+```sql
+./disql SYSDBA/SYSDBA@localhost:5236
+```
+
+### 1.3 使用DISQL直接执行命令
+
+```sql
+cd /home/dmdba/dmdbms/bin
+./disql SYSDBA/SYSDBA -E "select * from t1"
+```
+
+### 1.4 数据库版本
+
+```sql
+select *,id_code from v$version;
+
+SQL> select * from v$version;
+```
+
+### 1.4 数据库信息
+
+```sql
+select * from v$database;
+```
+
+## 2 数据库对象
+
+### 2.1 表
+
+```sql
+// 查看表结构
+SQL > describe table
+// 查看表的模式名
+select owner from dba_tables where table_name='T1';
+// 查看数据库中的表
+select * from dba_tables;
+// 查看建表语句
+sp_tabledef('SYSDBA','T1');   -- 模式名,表名,注意都要大写。
+SELECT DBMS_METADATA.GET_DDL('TABLE',表名,模式名);       // 参考 DBMS_METADATA 系统包
+SELECT DBMS_METADATA.GET_DDL('TABLE','T1','SYSDBA');    // 例句
+```
+
+### 2.2 LICENSE
+
+```sql
+SQL > SELECT * FROM V$LICENSE;
+```
+
+## 3 数据库操作
+
+### 3.1 开启归档日志
+
+```sql
+//修改数据库为MOUNT状态
+ALTER DATABASE MOUNT;
+
+//配置本地归档
+ALTER DATABASE ADD ARCHIVELOG 'DEST = /dmdata/dameng/arch_dsc0, TYPE = local, FILE_SIZE = 1024, SPACE_LIMIT = 2048, ARCH_FLUSH_BUF_SIZE=16,HANG_FLAG=1';
+
+//配置远程归档
+ALTER DATABASE ADD ARCHIVELOG 'DEST = DSC1, TYPE = REMOTE, FILE_SIZE = 1024, SPACE_LIMIT = 2048, ARCH_FLUSH_BUF_SIZE=16, INCOMING_PATH = /dmdata/dameng/arch_dsc1';
+
+//开启归档模式
+ALTER DATABASE ARCHIVELOG;
+
+//修改数据库为OPEN状态
+ALTER DATABASE OPEN;
+```
+
+### 脱机完全备份(RMAN)
+
+```sql
+// 必须开启归档并已生成归档日志
+dmdba@else-virtual-machine:~/dmdbms/bin$ ./dmrman
+dmrman V8
+RMAN> BACKUP DATABASE '/home/dmdba/dmdbms/DAMENG/dm.ini' FULL BACKUPSET '/else/bakup_dm'; 
+```
+
+### 3.3 联机完全备份(disql)
+
+```sql
+SQL> BACKUP DATABASE TO WEEKLY_FULL_BAK BACKUPSET '/backup/dmdb/online';
+SQL> BACKUP  DATABASE  FULL  BACKUPSET '/backup/dmdb/online';
+```
+
+### 数据库表备份
+
+```sql
+SQL> BACKUP TABLE t1 BACKUPSET '/backup/dmdb/t1_bak_01';
+```
+
+### 数据库表恢复
+
+```sql
+// 前提: 表必须存在
+SQL> RESTORE TABLE t1 FROM BACKUPSET '/backup/dmdb/t1_bak_01';
+```
+
+## 4 主从复制
+
+### 4.1 查看数据库模式
+
+```sql
+// 数据库状态查看
+SQL> select status$ from v$instance;
+// 数据库模式查看
+SQL> select MODE$ from v$instance;
+```
+
+### 4.2 查看主备运行情况
+
+```sql
+ SQL> select * from V$ARCH_STATUS
+ SQL> select * from V$RLOG_RAFT_INFO 
+```
+
+# nginx
+
+```shell
+重启服务:cd /usr/local/nginx/sbin
+./nginx -s reload
+
+添加环境变量:
+export PATH=$PATH:/usr/local/nginx
+
+启动:
+sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
+
+查看服务:
+
+sudo systemctl status nginx 
+
+ps -ef | grep nginx
+
+sudo lsof -i :8083
+
+ps aux | grep nginx
+
+查看监听端口:
+sudo netstat -tulnp | grep nginx
+sudo ss -tulpn | grep nginx
+
+检查配置文件是否正确:
+sudo /usr/local/nginx/sbin/nginx -t
+看行号
+:set number
+
+如果配置文件检查无误,则应用新的配置(平滑重启):
+sudo /usr/local/nginx/sbin/nginx -s reload
+```
+
+# Linux
+
+```shell
+查看操作系统信息
+uname -a
+cat /proc/version
+lsb_release -a
+cat /etc/.kyinfo
+
+查看服务进程
+(旧 netstat)
+netstat -tuln
+sudo netstat -anp | grep 端口号
+
+(新 ss)
+ss -tuln
+ss -plunt '( sport = :端口号 | dport = :端口号 )'
+
+lsof 命令:
+查看指定端口被哪个进程占用:
+lsof -i :端口号
+fuser 命令:
+
+杀掉占用指定端口的进程(同时也可以用于查询):
+fuser -kuv 端口号/tcp
+nmap 工具(主要用于远程扫描):
+
+在本地主机上快速检查一个端口是否开放:
+nmap -sT localhost -p 端口号
+
+
+```
+
+# Redis
+
+```shell
+# 开机自动启动
+systemctl enable redis.service
+# 取消开机自动启动(卸载服务)
+systemctl disabled redis.service
+# 启动redis服务
+systemctl start redis.service
+# 查看服务状态
+systemctl status redis.service
+# 停止服务
+systemctl stop redis.service
+
+# 重新加载服务
+systemctl daemon-reload
+
+#启动redis
+./bin/redis-server /usr/local/redis/redis-6.2.14/redis.conf
+#查看进程
+ps -aux | grep redis
+
+
+
+[Unit]
+Description=Redis Server
+After=network.target
+
+[Service]
+ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/redis-6.2.14/redis.conf
+ExecStop=/usr/local/redis/bin/redis-cli shutdown
+Restart=always
+
+[Install]
+WantedBy=multi-user.target
+```
+

+ 436 - 0
lambda 表达式的理论基础.md

@@ -0,0 +1,436 @@
+## lambda 表达式的理论基础
+
+Java中的 lambda 表达式实质上是一个匿名方法,但该方法并非独立执行,而是用于实现由函数式接口定义的唯一抽象方法。
+
+使用 lambda 表达式时,会创建实现了函数式接口的一个匿名类实例,如 Java8 中的线程 Runnable 类实现了函数接口:@FunctionalInterface。
+
+```java
+@FunctionalInterface
+public interface Runnable {
+    public abstract void run();
+}
+```
+
+平常我们执行一个 Thread 线程:
+
+```java
+new Thread(new Runnable() {
+  @Override
+  public void run() {
+      System.out.println("xxxx");
+  }
+}).start();
+```
+
+如果用 lambda 会非常简洁,一行代码搞定。
+
+```java
+new Thread(()-> System.out.println("xxx")).start();
+```
+
+所以在某些场景下使用 lambda 表达式真的能减少 java 中一些冗长的代码,增加代码的优雅性。
+
+## lambda 条件构造器基础类:包装器模式(装饰模式)之 AbstractWrapper AbstractWrapper 条件构造器说明
+
+1. 出现的第一个入参 boolean condition 表示该条件是否加入最后生成的 sql 中,例如:query.like(StringUtils.isNotBlank(name), Entity::getName, name) .eq(age!=null && age >= 0, Entity::getAge, age)
+2. 代码块内的多个方法均为从上往下补全个别 boolean 类型的入参,默认为 true
+3. 出现的泛型 Param 均为 Wrapper 的子类实例(均具有 AbstractWrapper 的所有方法)
+4. 方法在入参中出现的 R 为泛型,在普通 wrapper 中是 String ,在 LambdaWrapper 中是函数(例:Entity::getId,Entity 为实体类,getId为字段id的getMethod)
+5. 方法入参中的 R column 均表示数据库字段,当 R 具体类型为 String 时则为数据库字段名(字段名是数据库关键字的自己用转义符包裹!)!而不是实体类数据字段名!!!,另当 R 具体类型为 SFunction 时项目 runtime 不支持 eclipse 自家的编译器!
+6. 使用普通 wrapper,入参为 Map 和 List 的均以 json 形式表现!
+7. 使用中如果入参的 Map 或者 List为空,则不会加入最后生成的 sql 中!
+
+**警告:**
+
+不支持以及不赞成在 RPC 调用中把 Wrapper 进行传输。
+
+> “
+> Wrapper 很重 传输 Wrapper 可以类比为你的 controller 用 map 接收值(开发一时爽,维护火葬场) 正确的 RPC 调用姿势是写一个 DTO 进行传输,被调用方再根据 DTO 执行相应的操作 我们拒绝接受任何关于 RPC 传输 Wrapper 报错相关的 issue 甚至 pr。
+
+## AbstractWrapper 内部结构
+
+
+
+![img](https://pic2.zhimg.com/v2-19d6e5063ced2ab3b746be8cdae10995_r.jpg)
+
+
+
+从上图,我们了解到 AbstractWrapper 的实际上实现了五大接口:
+
+
+
+![img](https://pic3.zhimg.com/v2-6edde709c07008a267fc9b4bcafce216_r.jpg)
+
+
+
+- SQL 片段函数接口:ISqlSegment
+
+```java
+@FunctionalInterface
+public interface ISqlSegment extends Serializable {
+    /**
+     * SQL 片段
+     */
+    String getSqlSegment();
+}
+```
+
+- 比较值接口 Compare<Children, R>,如 等值 eq、不等于:ne、大于 gt、大于等于:ge、小于 lt、小于等于 le、between、模糊查询:like 等等
+- 嵌套接口 Nested<Param, Children> ,如 and、or
+- 拼接接口 Join<Children>,如 or 、exists
+- 函数接口 Func<Children, R>,如 in 查询、groupby 分组、having、order by排序等
+
+常用的 where 条件表达式 eq、like、in、ne、gt、ge、lt、le。
+
+```java
+@Override
+public Children in(boolean condition, R column, Collection<?> coll) {
+    return doIt(condition, () -> columnToString(column), IN, inExpression(coll));
+}
+
+public Children notIn(boolean condition, R column, Collection<?> coll)
+
+public Children inSql(boolean condition, R column, String inValue)
+
+public Children notInSql(boolean condition, R column, String inValue)
+
+public Children groupBy(boolean condition, R... columns)
+
+public Children orderBy(boolean condition, boolean isAsc, R... columns)
+    
+public Children eq(boolean condition, R column, Object val)
+
+public Children ne(boolean condition, R column, Object val)
+
+public Children gt(boolean condition, R column, Object val)
+
+public Children ge(boolean condition, R column, Object val)
+
+public Children lt(boolean condition, R column, Object val)
+
+public Children le(boolean condition, R column, Object val)
+
+...
+
+/**
+ * 普通查询条件
+ *
+ * @param condition  是否执行
+ * @param column     属性
+ * @param sqlKeyword SQL 关键词
+ * @param val        条件值
+ */
+protected Children addCondition(boolean condition, R column, SqlKeyword sqlKeyword, Object val) {
+    return doIt(condition, () -> columnToString(column), sqlKeyword, () -> formatSql("{0}", val));
+}
+```
+
+## SQL 片段函数接口
+
+lambda 这么好用的秘诀在于 **SQL 片段函数接口:ISqlSegment**,我们在 doIt 方法找到 ISqlSegment 对象参数,翻开 ISqlSegment 源码,发现它真实的庐山真面目,原来是基于 Java 8 的函数接口 @FunctionalInterface 实现!
+
+ISqlSegment 就是对 where 中的每个条件片段进行组装。
+
+```java
+/**
+ * 对sql片段进行组装
+ *
+ * @param condition   是否执行
+ * @param sqlSegments sql片段数组
+ * @return children
+ */
+protected Children doIt(boolean condition, ISqlSegment... sqlSegments) {
+    if (condition) {
+        expression.add(sqlSegments);
+    }
+    return typedThis;
+}
+   
+@FunctionalInterface
+public interface ISqlSegment extends Serializable {
+
+    /**
+     * SQL 片段
+     */
+    String getSqlSegment();
+}
+```
+
+从 MergeSegments 类中,我们找到 getSqlSegment 方法,其中代码片段
+
+```java
+sqlSegment = normal.getSqlSegment() + groupBy.getSqlSegment() + having.getSqlSegment() + orderBy.getSqlSegment()
+```
+
+这段代码表明,一条完整的 where 条件 SQL 语句,最终由 normal SQL 片段,groupBy SQL 片段,having SQL 片段,orderBy SQL 片段拼接而成。
+
+```java
+@Getter
+@SuppressWarnings("serial")
+public class MergeSegments implements ISqlSegment {
+
+    private final NormalSegmentList normal = new NormalSegmentList();
+    private final GroupBySegmentList groupBy = new GroupBySegmentList();
+    private final HavingSegmentList having = new HavingSegmentList();
+    private final OrderBySegmentList orderBy = new OrderBySegmentList();
+
+    @Getter(AccessLevel.NONE)
+    private String sqlSegment = StringPool.EMPTY;
+    @Getter(AccessLevel.NONE)
+    private boolean cacheSqlSegment = true;
+
+    public void add(ISqlSegment... iSqlSegments) {
+        List<ISqlSegment> list = Arrays.asList(iSqlSegments);
+        ISqlSegment firstSqlSegment = list.get(0);
+        if (MatchSegment.ORDER_BY.match(firstSqlSegment)) {
+            orderBy.addAll(list);
+        } else if (MatchSegment.GROUP_BY.match(firstSqlSegment)) {
+            groupBy.addAll(list);
+        } else if (MatchSegment.HAVING.match(firstSqlSegment)) {
+            having.addAll(list);
+        } else {
+            normal.addAll(list);
+        }
+        cacheSqlSegment = false;
+    }
+
+    @Override
+    public String getSqlSegment() {
+        if (cacheSqlSegment) {
+            return sqlSegment;
+        }
+        cacheSqlSegment = true;
+        if (normal.isEmpty()) {
+            if (!groupBy.isEmpty() || !orderBy.isEmpty()) {
+                sqlSegment = groupBy.getSqlSegment() + having.getSqlSegment() + orderBy.getSqlSegment();
+            }
+        } else {
+            sqlSegment = normal.getSqlSegment() + groupBy.getSqlSegment() + having.getSqlSegment() + orderBy.getSqlSegment();
+        }
+        return sqlSegment;
+    }
+}
+```
+
+## lambda 构建复杂的查询条件构造器:LambdaQueryWrapper
+
+**LambdaQueryWrapper 四种不同的 lambda 构造方法**
+
+- 方式一 使用 QueryWrapper 的成员方法方法 lambda 构建 LambdaQueryWrapper
+
+```java
+LambdaQueryWrapper<UserEntity> lambda = new QueryWrapper<UserEntity>().lambda();
+```
+
+- 方式二 直接 new 出 LambdaQueryWrapper
+
+```java
+LambdaQueryWrapper<UserEntity> lambda = new  LambdaQueryWrapper<>();
+```
+
+- 方式三 使用 Wrappers 的静态方法 lambdaQuery 构建 LambdaQueryWrapper 推荐
+
+```java
+LambdaQueryWrapper<UserEntity> lambda = Wrappers.lambdaQuery();
+```
+
+- 方式四:链式查询
+
+```java
+List<UserEntity> users = new LambdaQueryChainWrapper<UserEntity>(userMapper)
+            .like(User::getName, "雨").ge(User::getAge, 20).list();
+```
+
+笔者推荐使用 Wrappers 的静态方法 lambdaQuery 构建 LambdaQueryWrapper 条件构造器。
+
+## 1 等值查询:eq
+
+```java
+@Test
+public void testLambdaQueryOfEq() {
+    //eq查询
+    //相当于 select * from sys_user where user_id = 1
+    LambdaQueryWrapper<UserEntity> lqw = Wrappers.lambdaQuery();
+    lqw.eq(UserEntity::getUserId, 1L);
+    UserEntity user = userMapper.selectOne(lqw);
+    System.out.println("eq查询::" + user.getUserName());
+}
+```
+
+eq 查询等价于原生 sql 的等值查询。
+
+```java
+select * from sys_user where user_id = 1
+```
+
+## 2 范围查询 :in
+
+```java
+@Test
+public void testLambdaQueryOfIn() {  
+    List<Long> ids = Arrays.asList(1L, 2L);
+    LambdaQueryWrapper<UserEntity> lqw = Wrappers.lambdaQuery();  
+    lqw.in(UserEntity::getUserId, ids);
+    List<UserEntity> userList = userMapper.selectList(lqw);
+    userList.forEach(u -> System.out.println("in查询::" + u.getUserName()));
+}
+```
+
+in 查询等价于原生 sql 的 in 查询
+
+```java
+select * from sys_user where user_id in (1,2)
+```
+
+## 3 通配符模糊查询:like
+
+```java
+@Test
+public void testLambdaQueryOfLikeAll() {
+    LambdaQueryWrapper<UserEntity> lqw = Wrappers.lambdaQuery();
+    lqw.eq(UserEntity::getSex, 0L)
+            .like(UserEntity::getUserName, "dun");
+    List<UserEntity> userList = userMapper.selectList(lqw);
+    userList.forEach(u -> System.out.println("like全包含关键字查询::" + u.getUserName()));
+}
+```
+
+like 查询等价于原生 sql 的 like 全通配符模糊查询。
+
+```text
+select * from sys_user where sex = 0 and user_name like '%dun%'
+```
+
+## 4 右通配符模糊查询:likeRight
+
+```java
+@Test
+public void testLambdaQueryOfLikeRight() { 
+    LambdaQueryWrapper<UserEntity> lqw = Wrappers.lambdaQuery();
+    lqw.eq(UserEntity::getSex, 0L)
+            .likeRight(UserEntity::getUserName, "dun");
+    List<UserEntity> userList = userMapper.selectList(lqw);
+    userList.forEach(u -> System.out.println("like Right含关键字查询::" + u.getUserName()));
+}
+```
+
+likeRight 查询相当于原生 sql 的 like 右通配符模糊查询。
+
+```java
+select * from sys_user where sex = 0 and user_name like 'dun%'
+```
+
+## 5 左通配符模糊查询:likeLeft
+
+```java
+@Test
+public void testLambdaQueryOfLikeLeft() {  
+    LambdaQueryWrapper<UserEntity> lqw = Wrappers.lambdaQuery();
+    lqw.eq(UserEntity::getSex, 0L)
+            .likeLeft(UserEntity::getUserName, "zung");
+    List<UserEntity> userList = userMapper.selectList(lqw);
+    userList.forEach(u -> System.out.println("like Left含关键字查询::" + u.getUserName()));
+}
+```
+
+likeLeft 查询相当于原生 sql 的 like 左通配符模糊查询。
+
+```java
+select * from sys_user where sex = 0 and user_name like '%zung'
+```
+
+## 6 条件判断查询
+
+条件判断查询类似于 Mybatis 的 if 标签,第一个入参 boolean condition 表示该条件是否加入最后生成的 sql 中。
+
+```java
+@Test
+public void testLambdaQueryOfBoolCondition() {
+    UserEntity condition = UserEntity.builder()
+            .sex(1)
+            .build();
+    //eq 或 like 条件判断查询
+    LambdaQueryWrapper<UserEntity> lqw = Wrappers.lambdaQuery();
+    lqw.eq(condition.getSex() != null, UserEntity::getSex, 0L)
+            // 满足 bool 判断,是否进查询按字段 userName 查询
+            .like(condition.getUserName() != null, UserEntity::getUserName, "dun");
+    List<UserEntity> userList = userMapper.selectList(lqw);
+    userList.forEach(u -> System.out.println("like查询::" + u.getUserName()));
+}
+```
+
+## 7 利用 or 和 and 构建复杂的查询条件
+
+```java
+@Test
+public void testLambdaQueryOfOr_And() {  
+    LambdaQueryWrapper<UserEntity> lqw = Wrappers.lambdaQuery();
+    lqw.eq(UserEntity::getSex, 0L)
+            .and(wrapper->wrapper.eq(UserEntity::getUserName,"dunzung")
+                    .or().ge(UserEntity::getAge, 50));
+    List<UserEntity> userList = userMapper.selectList(lqw);
+    userList.forEach(u -> System.out.println("like查询::" + u.getUserName()));
+}
+```
+
+上面实例查询等价于原生 sql 查询:
+
+```java
+select * from sys_user where sex = 0 and (use_name = 'dunzung' or age >=50)
+```
+
+## 8 善于利用分页利器 PageHelpler
+
+```java
+@Test
+public void testLambdaPage() {
+    //PageHelper分页查询
+    //相当于 select * from sys_user limit 0,2
+    int pageNumber = 0;
+    int pageSize = 2;
+    PageHelper.startPage(pageNumber + 1, pageSize);
+    LambdaQueryWrapper<UserEntity> lqw = Wrappers.lambdaQuery();
+    lqw.orderByAsc(UserEntity::getAge)
+          .orderByDesc(UserEntity::getMobile);
+    List<UserEntity> userList = userMapper.selectList(lqw); 
+    userList.forEach(u -> System.out.println("page分页查询::" + u.getUserName()));
+}
+```
+
+上面实例查询等价于原生 sql 分页查询:
+
+```java
+select * from sys_user order by age desc,mobile desc limit 0,2
+```
+
+另外,Mybatis-Plus 自带分页组件,BaseMapper 接口提供两种分页方法来实现物理分页。
+
+- 第一个返回实体对象允许 null
+- 第二个人返回 map 对象多用于在指定放回字段时使用,避免为指定字段 null 值出现
+
+```java
+IPage<T> selectPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);
+IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);
+```
+
+注意,Mybatis-Plus 自带分页组件时,需要配置 PaginationInterceptor 分页插件。
+
+```java
+@Bean
+public PaginationInterceptor paginationInterceptor() {
+    return new PaginationInterceptor();
+}
+```
+
+## 9 更新条件构造器:LambdaUpdateWrapper
+
+```java
+@Test
+public void testLambdaUpdate() {
+    LambdaUpdateWrapper<UserEntity> luw = Wrappers.lambdaUpdate();
+    luw.set(UserEntity::getUserName, "dunzung01")
+            .set(UserEntity::getSex, 1);
+    luw.eq(UserEntity::getUserId, 1);
+    userMapper.update(null, luw);
+}
+```

+ 56 - 0
事件状态统计-接口文档v1.0.md

@@ -0,0 +1,56 @@
+# 事件状态统计
+
+> v1.0.0
+
+### **请求方式**
+
+**Content-Type**:
+
+application/json
+
+**POST**
+
+**请求URL**:http://120.26.164.249:9892/spHj2017/listCount
+
+> Body 请求参数
+
+```json
+{
+  "companyCode": "10067",
+  "startTime": "2023-12-07 19:00:00",
+  "endTime": "2023-12-12 19:00:00"
+}
+```
+
+### 请求参数说明
+
+| 名称        | 位置 | 类型   | 必选 | 说明                         |
+| ----------- | ---- | ------ | ---- | ---------------------------- |
+| companyCode | body | String | 是   | 单位编号                     |
+| startTime   | body | String | 否   | 开始时间(数据查询开始时间) |
+| endTime     | body | String | 否   | 结束时间(数据查询结束时间) |
+
+> 返回示例
+
+```json
+{
+    "status": "SUCCESS",
+    "code": "0",
+    "msg": null,
+    "data": {
+        "processed": 280,
+        "unprocess": 0,
+        "processing": 0
+    },
+    "exception": null
+}
+```
+
+### 返回参数说明
+
+| 名称       | 位置 | 类型 | 说明                   |
+| ---------- | ---- | ---- | ---------------------- |
+| unprocess  | data | Long | 未处理(事件状态为 0) |
+| processing | data | Long | 事件正在处理中         |
+| processed  | data | Long | 已处理(事件状态为 1) |
+

+ 85 - 0
事件类型列表信息-接口文档v1.0.md

@@ -0,0 +1,85 @@
+# 事件类型列表信息-接口文档v1.0
+
+> v1.0.0
+
+### **请求方式**
+
+**Content-Type**:
+
+application/json
+
+**POST**
+
+**请求URL**:http://120.26.164.249:9892/spHj2017/eventList
+
+> Body 请求参数
+
+```json
+{
+    "companyCode": "10117",
+    "current": 1,
+    "size": 1,
+    "startTime": "2023-01-07 19:00:00",
+    "endTime": "2023-12-12 19:00:00"
+}
+```
+
+### 请求参数说明
+
+|名称|位置|类型|必选|说明|
+|---|---|---|---|---|
+|companyCode|body|String| 是 |单位编号|
+|current|body|String| 是 |页数(要查看第几页数据)|
+|size|body|String| 是 |页大小|
+|startTime|body|String| 否 |开始时间(数据查询开始时间)|
+|endTime|body|String| 否 |结束时间(数据查询结束时间)|
+
+> 返回示例
+
+```json
+{
+    "status": "SUCCESS",
+    "code": "0",
+    "msg": null,
+    "data": {
+        "waterAlarm": [
+            {
+                "alarm_type": "WP1",
+                "alarm_time": "2023-03-07 12:45:07",
+                "device_code": "648136056010000",
+                "alarm_point": "0.0059"
+            }
+        ],
+        "rtuAlarm": [
+            {
+                "alarm_type": "离线",
+                "alarm_time": "2023-09-06 05:32:35",
+                "device_code": "4023363030303435",
+                "alarm_point": "1楼消防水泵房"
+            }
+        ],
+        "firaAlarm": [
+            {
+                "alarm_type": "监测连线故障",
+                "alarm_time": "2023-11-07 16:18:00",
+                "device_code": "90049",
+                "alarm_point": ""
+            }
+        ]
+    },
+    "exception": null
+}
+```
+
+### 返回参数说明
+
+| 名称        | 位置 | 类型   | 说明                                                         |
+| ----------- | ---- | ------ | ------------------------------------------------------------ |
+| waterAlarm  | data | String | 水报警(水系统事件)                                         |
+| rtuAlarm    | data | String | rtu报警(rtu系统事件)                                       |
+| firaAlarm   | data | String | 火报警(火系统事件)                                         |
+| alarm_type  | data | String | 事件类型                                                     |
+| alarm_time  | data | String | 事件时间                                                     |
+| device_code | data | String | 设备编号                                                     |
+| alarm_point | data | String | 压力值 mpa(waterAlarm)、名称(rtuAlarm)、端口号(firaAlarm) |
+

+ 51 - 0
创建巡检计划,选择的结束时间与开始时间跨度较大时,无法添加成功---方案.md

@@ -0,0 +1,51 @@
+针对你遇到的同步执行导致超时的问题,以下是几个从多个角度进行优化的建议:
+
+1. 使用异步操作:将数据库数据操作改为异步执行可以提高并发性能。通过使用异步非阻塞的方式,可以在操作数据库时不需要等待返回结果,而是继续处理其他请求,从而提高系统的吞吐量。可以使用异步框架、线程池或者消息队列等技术来实现异步操作。
+
+2. 批量操作:将大量的数据操作转变为批量操作可以显著提高性能。数据库的操作通常是比较耗时的,通过将多个操作合并为一个批量操作,可以减少数据库的访问次数,从而减少了网络开销和数据库的压力。
+
+3. 调整数据库事务隔离级别:如果你的数据库事务隔离级别设置为较高的级别(如Serializable),可以考虑调整为较低的级别(如Read Committed)。较高的事务隔离级别会导致锁竞争和冲突增加,从而影响性能。
+
+4. 数据库索引优化:确保你的数据库表结构中有适当的索引。索引能够提高数据检索和更新的速度,特别是在大数据量情况下,能够明显提高查询性能。分析你的查询语句,并根据实际情况添加或优化索引。
+
+5. 数据库连接池优化:检查你的数据库连接池配置,确保连接池的最大连接数和超时时间设置合理。增加连接池的最大连接数和调整超时时间可以提高并发性能。
+
+6. 数据分片:如果可能的话,可以考虑将数据分片存储到不同的数据库实例或表中。将数据分散存储可以提高并发性能和减少锁竞争。
+
+7. 数据库性能调优:进行数据库的性能调优,例如优化查询语句、配置适当的缓存和缓冲区大小、调整数据库的参数等,可以提高数据库的响应速度和处理能力。
+
+8. 异常处理和重试机制:在数据操作时,有适当的异常处理和重试机制是必要的。例如,当数据库连接超时或失败时,可以尝试重新连接或者回退操作,保证数据的一致性。
+
+通过综合考虑以上优化策略,你应该能够改善数据库数据操作的性能,避免超时和失败的问题。根据实际情况,你可以选择其中的一些策略或结合使用。同时,还应该根据具体的业务场景和需求进行适当的调整和优化。
+
+
+
+针对你描述的问题,可以从以下几个角度进行优化:
+
+1. **数据库角度**:
+
+
+	* **索引优化**:确保经常查询的字段都有合适的索引,但避免过度索引,因为这会减慢写入速度。
+	* **使用批量插入**:如果你的插入操作是逐条进行的,可以考虑使用批量插入来提高性能。
+	* **调整数据库参数**:如MySQL的`innodb_buffer_pool_size`,或者Oracle的SGA大小等,根据数据库类型进行适当调整。
+	* **考虑分表或分区**:如果数据量巨大,可以考虑分表或分区来减轻单表压力。
+2. **代码角度**:
+
+
+	* **使用连接池**:确保使用数据库连接池,并合理配置连接池的大小、超时时间等参数。
+	* **事务管理**:确保事务的使用得当,避免长时间持有数据库连接。对于大批量操作,可以考虑分批处理。
+	* **错误处理**:对于“Connection is closed”这种错误,增加重试机制,确保在连接关闭后能够重新获取连接并继续操作。
+3. **系统角度**:
+
+
+	* **硬件升级**:如果数据库服务器的硬件资源不足,如CPU、内存、磁盘I/O等,考虑进行硬件升级。
+	* **网络优化**:确保应用服务器与数据库服务器之间的网络连接稳定、带宽足够。
+	* **负载均衡**:如果有多个数据库服务器,可以考虑使用负载均衡来分散请求压力。
+4. **其他考虑**:
+
+
+	* **监控与日志**:增加对数据库和接口的监控,确保在出现问题时能够及时发现并处理。同时,完善日志记录,方便排查问题。
+	* **数据清理**:定期清理旧数据,确保数据库中存储的都是活跃数据,减少不必要的查询压力。
+	* **考虑使用缓存**:对于一些经常查询但不经常变更的数据,可以考虑使用缓存来减少对数据库的访问。
+
+综上所述,针对你描述的问题,可以从数据库、代码、系统和其他多个角度进行优化。希望这些建议能够帮助你解决问题。

+ 278 - 0
在、离线设备查询-接口文档 v1.0.md

@@ -0,0 +1,278 @@
+# 在、离线设备查询
+
+接口说明:根据appKey查询出对应单位编号下各类型设备在、离线数量
+
+### **请求方式**
+
+**Content-Type**:
+
+application/json
+
+**POST**
+
+**请求URL**:http://120.26.164.249:9892/ytDeviceStatus/deviceList
+
+### **请求参数**
+
+**header**:
+
+```json
+{
+  "appKey": "66ae33ee352490c55e78cde13cb14985"
+}
+```
+
+### **header参数说明**
+
+| 名称   | 位置   | 类型   | 必选 | 说明              |
+| ------ | ------ | ------ | ---- | ----------------- |
+| appKey | header | String | 是   | appKey(MD5加密) |
+
+**body**:
+
+```json
+{
+  "timestamp": "1702358542",
+  "sign": "be3ce401cbb046be2eecb278a250ddcc"
+}
+```
+
+**sign说明**	
+sign = secretKey+#+timestamp+#+appKey
+
+### **请求参数说明**
+
+|名称|位置|类型|必选|说明|
+|---|---|---|---|---|
+|timestamp|body|String| 是 |时间戳(秒级)|
+|sign|body|String| 是 |签名(MD5加密)|
+
+### **返回结果**
+
+> 返回示例
+
+```json
+{
+    "status": "SUCCESS",
+    "code": "0",
+    "msg": null,
+    "data": [
+        {
+            "deviceType": "rtu",
+            "deviceTypeCounts": 1,
+            "onlineCount": 1,
+            "offlineCount": 0
+        },
+        {
+            "deviceType": "水系统",
+            "deviceTypeCounts": 10,
+            "onlineCount": 6,
+            "offlineCount": 4
+        },
+        {
+            "deviceType": "液位",
+            "deviceTypeCounts": 1,
+            "onlineCount": 1,
+            "offlineCount": 0
+        },
+    ],
+    "exception": null
+}
+```
+
+### **返回参数说明**
+
+| 名称             | 位置 | 类型    | 说明         |
+| ---------------- | ---- | ------- | ------------ |
+| deviceType       | data | String  | 设备类型     |
+| deviceTypeCounts | data | Integer | 设备总数     |
+| onlineCount      | data | Integer | 在线设备数量 |
+| offlineCount     | data | Integer | 离线设备数量 |
+| alarmDeviceSum   | data | Long    | 告警设备总数 |
+
+
+
+
+
+# 事件类型列表信息
+
+接口说明:根据companyCode查询出对应单位编号下各类型在指定时间段内的事件信息列表
+
+### **请求方式**
+
+**Content-Type**:
+
+application/json
+
+**POST**
+
+**请求URL**:http://120.26.164.249:9892/spHj2017/eventList
+
+**header**:
+
+```json
+{
+  "appKey": "66ae33ee352490c55e78cde13cb14985"
+}
+```
+
+### **header参数说明**
+
+| 名称   | 位置   | 类型   | 必选 | 说明              |
+| ------ | ------ | ------ | ---- | ----------------- |
+| appKey | header | String | 是   | appKey(MD5加密) |
+
+**body**:
+
+```json
+{
+  	"timestamp": "1702358542",
+  	"sign": "be3ce401cbb046be2eecb278a250ddcc",
+    "current": 1,
+    "size": 1,
+    "startTime": "2023-01-07 19:00:00",
+    "endTime": "2023-12-12 19:00:00"
+}
+```
+
+### 请求参数说明
+
+**sign说明**	
+sign = secretKey+#+timestamp+#+appKey
+
+| 名称      | 位置 | 类型   | 必选 | 说明                         |
+| --------- | ---- | ------ | ---- | ---------------------------- |
+| timestamp | body | String | 是   | 时间戳(秒级)               |
+| sign      | body | String | 是   | 签名(MD5加密)              |
+| current   | body | String | 是   | 页数(要查看第几页数据)     |
+| size      | body | String | 是   | 页大小                       |
+| startTime | body | String | 否   | 开始时间(数据查询开始时间) |
+| endTime   | body | String | 否   | 结束时间(数据查询结束时间) |
+
+> 返回示例
+
+```json
+{
+    "status": "SUCCESS",
+    "code": "0",
+    "msg": null,
+    "data": {
+        "waterAlarm": [
+            {
+                "alarm_type": "WP1",
+                "alarm_time": "2023-03-07 12:45:07",
+                "device_code": "648136056010000",
+                "alarm_point": "0.0059"
+            }
+        ],
+        "rtuAlarm": [
+            {
+                "alarm_type": "离线",
+                "alarm_time": "2023-09-06 05:32:35",
+                "device_code": "4023363030303435",
+                "alarm_point": "1楼消防水泵房"
+            }
+        ],
+        "firaAlarm": [
+            {
+                "alarm_type": "监测连线故障",
+                "alarm_time": "2023-11-07 16:18:00",
+                "device_code": "90049",
+                "alarm_point": ""
+            }
+        ]
+    },
+    "exception": null
+}
+```
+
+### 返回参数说明
+
+| 名称        | 位置 | 类型   | 说明                                                         |
+| ----------- | ---- | ------ | ------------------------------------------------------------ |
+| waterAlarm  | data | String | 水报警(水系统事件)(LL1:液位;WP1:水压)                   |
+| rtuAlarm    | data | String | rtu报警(rtu系统事件)                                       |
+| firaAlarm   | data | String | 火报警(火系统事件)                                         |
+| alarm_type  | data | String | 事件类型                                                     |
+| alarm_time  | data | String | 事件时间                                                     |
+| device_code | data | String | 设备编号                                                     |
+| alarm_point | data | String | 压力值 mpa(waterAlarm)、名称(rtuAlarm)、端口号(firaAlarm) |
+
+
+
+
+
+# 事件状态统计
+
+接口说明:根据companyCode查询出对应单位编号下各类型在指定时间段内的事件状态统计
+
+### **请求方式**
+
+**Content-Type**:
+
+application/json
+
+**POST**
+
+**请求URL**:http://120.26.164.249:9892/spHj2017/listCount
+
+**header**:
+
+```json
+{
+  "appKey": "66ae33ee352490c55e78cde13cb14985"
+}
+```
+
+### **header参数说明**
+
+| 名称   | 位置   | 类型   | 必选 | 说明              |
+| ------ | ------ | ------ | ---- | ----------------- |
+| appKey | header | String | 是   | appKey(MD5加密) |
+
+**body**:
+
+```json
+{
+  "timestamp": "1702358542",
+  "sign": "be3ce401cbb046be2eecb278a250ddcc",
+  "startTime": "2023-12-07 19:00:00",
+  "endTime": "2023-12-12 19:00:00"
+}
+```
+
+### 请求参数说明
+
+**sign说明**	
+sign = secretKey+#+timestamp+#+appKey
+
+| 名称        | 位置 | 类型   | 必选 | 说明                         |
+| ----------- | ---- | ------ | ---- | ---------------------------- |
+| companyCode | body | String | 是   | 单位编号                     |
+| startTime   | body | String | 否   | 开始时间(数据查询开始时间) |
+| endTime     | body | String | 否   | 结束时间(数据查询结束时间) |
+
+> 返回示例
+
+```json
+{
+    "status": "SUCCESS",
+    "code": "0",
+    "msg": null,
+    "data": {
+        "processed": 280,
+        "unprocess": 0,
+        "processing": 0
+    },
+    "exception": null
+}
+```
+
+### 返回参数说明
+
+| 名称       | 位置 | 类型 | 说明                   |
+| ---------- | ---- | ---- | ---------------------- |
+| unprocess  | data | Long | 未处理(事件状态为 0) |
+| processing | data | Long | 事件正在处理中         |
+| processed  | data | Long | 已处理(事件状态为 1) |
+

+ 149 - 0
密码.md

@@ -0,0 +1,149 @@
+# 永天综合智慧云
+
+http://172.16.120.165:13200/
+admin
+SAAS_admin123
+
+fyc
+fyc981216$
+
+
+
+# 数据库
+
+47.98.201.187_3306
+fuYuChuan
+fuYuChuan@123
+
+
+
+124.71.140.20
+
+mysql账号:usky
+mysql密码:Yt#75Usky
+172.16.120.165
+
+线上:
+120.26.164.249
+
+```java
+usky-cloud-nacos
+```
+
+
+
+32.0.15.104数据库
+root
+xfzdadmin#2021
+
+
+
+uskycloud001.mysql.rds.aliyuncs.com	
+
+usky
+Yt#75Usky
+
+# 闵行
+
+10.236.244.108
+user
+108%admin%Xfjyzd
+dmdba
+108%admin%Xfjyzd
+root	**尽量不用**
+5fd%Xfjyzd236244
+
+107
+
+user
+107%admin%Xfjyzd
+
+xfzdadmin 107#admin#Xfzd#d15
+
+vpn账号:VPN_yangqiang
+vpn密码:Yangqiang!6V2#
+
+堡垒机账号:yangq
+堡垒机密码:Shmhxxzx@1234(旧 Shmhxxzx@12345)
+
+username: usky
+password: Yt#75Usky
+
+
+
+# 服务器
+
+172.16.120.151  22
+
+root
+
+usky@2018
+
+dm:
+
+usky-cloud:usky666888
+
+# 单位平台
+
+YT_admin
+YT_admin
+
+
+
+# 手机端
+
+http://manager.usky.cn/mobile
+
+16621197124
+
+123456
+
+
+
+# nacos
+
+http://172.16.120.165:8848/nacos/#/
+
+```java
+usky-cloud-nacos
+```
+
+nacos
+naoc@Usky2022
+
+
+
+# Gogs
+
+http://47.111.81.118:3000/
+
+fuyuchuan
+fuyuchuan123@
+
+
+
+# Jenkins
+
+usky
+Usky@208
+
+
+
+# apifox API访问令牌
+
+APS-sgpcAo1fqGVfub5N5eFssLJjWcGrJEnX
+
+
+
+
+
+# secretKey
+
+05abbe4e91002334ddf79b451b79be5a
+
+
+
+1	上药	b0b06f6d511d3e925d343e29d51e4ef9	10377
+2	共和国际	66ae33ee352490c55e78cde13cb14985	10067
+
+

+ 502 - 0
报错集合.md

@@ -0,0 +1,502 @@
+# 报错集合
+
+![image-20231121111617698](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20231121111617698.png)
+
+无法解析值“${file.path}”中的占位符“file.path”
+
+## Could not resolve placeholder 'file.path' in value "${file.path}"
+
+SpringBoot启动项目时报错:
+
+```java
+Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: 
+
+Error creating bean with name 'msgReceiver': 
+
+Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: 
+
+Could not resolve placeholder 'file.post-url' in value "${file.post-url}"
+```
+
+还是一样,遇到SpringBoot启动报错,从最后看起,很明显这里是在msgReceiver中因为找不到file.post-url的定义。
+
+查看MsgReceiver的代码:
+
+```java
+    @Value("${file.post-url}")
+
+	private String postUrl; 
+```
+
+问题就出在这里,这里将配置文件里的file.post-url的值赋给了postUrl,但是SpringBoot启动时,没有在配置文件application.yml(application.properties)中找到关于file:post-url:(file.post-url=)的定义。
+
+可以去查看一下,有没有这个定义,没有加上即可。
+
+笔者遇到的问题是,配置文件中有相关定义,但是启动依然报错。这是因为生成的Class文件中配置没有及时被更新,可以右键项目,找到Maven—>Reload Project、右键项目->Reload From Disk以及Build标签下的Build Project来刷新项目代码和重新build来解决。这三个操作是解决代码和生成的class文件不匹配的三板斧,遇到此类问题都可以这样操作。
+
+
+
+## 找不到注册的bean
+
+```java
+@Repository
+```
+
+用@mapper注解也行,推荐上面这个
+
+
+
+
+
+## Java中与MySQL中的DATETIME类型相对应的是java.sql.Timestamp类
+
+ java.sql.Timestamp是从java.util.Date继承的,它精确到毫秒,并且可以存储MySQL DATETIME类型所表示的日期和时间信息。
+
+
+
+
+
+## `baseMapper.insert` 能够直接插入数据到数据库中,是因为它是基于某个 ORM(对象关系映射)框架---MyBatis Plus
+
+```Java
+baseMapper.insert();
+```
+
+这些框架在内部使用了 JDBC(Java 数据库连接)来与数据库进行交互,它们提供了更高级别的抽象,使得开发者可以使用对象模型来操作数据库,而不需要编写繁琐的 SQL 语句。
+
+具体来说,当你在代码中使用 `baseMapper.insert` 方法时,ORM 框架会根据你提供的对象自动生成相应的 SQL 插入语句,并执行该语句来将数据插入到数据库中。这个过程是自动的,你不需要手动编写 SQL 语句或连接数据库。
+
+此外,`baseMapper` 类通常是由框架根据数据库表和 Java 类的映射关系自动生成的。在映射关系中,你可以定义表名、列名和 Java 类属性之间的对应关系,这样框架就可以根据这些映射关系来生成正确的 SQL 语句。
+
+
+
+## 错误提示是在尝试将一个字符串(String)类型的值转换为`HttpServletRequest`类型时出现的。由于字符串类型和`HttpServletRequest`类型之间没有直接的转换方法
+
+ERROR:Failed to convert value of type 'java.lang.String' to required type 'javax.servlet.http.HttpServletRequest'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'javax.servlet.http.HttpServletRequest': no matching editors or conversion strategy found
+
+解决:
+
+```Java
+@RequestHeader("appKey") String appKey)
+```
+
+
+
+
+
+## 保证字段唯一性
+
+```java
+@Column(unique = true)
+```
+
+作用实体类上,可以保证数据库层面字段的唯一性
+
+1. 在后端控制器(Controller)中,接收前端传入的参数。 
+2. 利用参数查询数据库,检查该字段的值是否已经存在。可以使用JPA、MyBatis等ORM框架进行数据库操作,或使用JDBC进行原生SQL查询。 
+3. 如果查询结果返回了已存在的记录,表示该字段的值已经存在,可以做出相应的处理,例如返回错误提示信息给前端。 
+4. 如果查询结果为空,表示该字段的值是唯一的,可以继续进行后续操作。
+
+直接通过前端传过来的数据进行对比:
+
+```java
+if ((dataStHistoryMapper.checkPackNo(dataStHistory.getPackNo())).size() > 0) {
+    throw new BusinessException("订单编号已存在!请再次核对");
+```
+
+xml中SQL语句:
+
+```xml
+<select id="checkPackNo" resultType="com.usky.park.domain.DataStHistory">
+    <if test="packNo != null">
+        SELECT *
+        FROM data_st_history
+        WHERE pack_no = #{packNo}
+    </if>
+</select>
+```
+
+## idea删除了xxx.iml文件
+
+import提示cannot resolve symbol‘xxx‘
+
+所有引用都爆红,pom文件不报错
+
+没用:刷新一下Maven Project就会自动生成.iml文件
+
+解决:在缺少.iml文件项目下运行`mvn idea:module`;然后再重启
+
+![image-20231204174512707](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20231204174512707.png)
+
+![image-20231204174552588](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20231204174552588.png)
+
+再不行就手动粘贴到本地
+
+
+
+## 提示:SpringBoot Configuration Annotation Processor not configured
+
+
+
+**`方案1`**
+
+```java
+如果您正在使用Maven,请确保在您的pom.xml文件中添加以下依赖项:
+<dependency>
+    <groupId>org.springframework.boot</groupId>
+    <artifactId>spring-boot-configuration-processor</artifactId>
+    <optional>true</optional>
+</dependency>
+这将会启用Spring Boot的配置处理器。
+```
+
+**`方案2`**
+
+```java
+在您的IDE中,确保您的项目的Annotation Processor已经被启用。
+对于IntelliJ IDEA,
+请转到"Settings > Build, Execution, Deployment > Compiler > Annotation Processors",
+并确保"Enable annotation processing"选项已经被勾选。
+```
+
+**`方案3`**
+
+```java
+如果您正在使用Gradle,请确保在您的build.gradle文件中添加以下依赖项:
+dependencies {
+    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
+}
+这将会启用Spring Boot的配置处理器。
+```
+
+**`方案4`**
+
+```java
+如果您的IDE中没有默认启用Annotation Processor,您可以手动配置它。
+对于IntelliJ IDEA,请在"Settings > Build, Execution, 
+Deployment > Compiler > Annotation Processors"中,
+添加一个新的Annotation Processor配置,
+将"-proc:only"添加到"Command line arguments"中,
+并在"Processor path"中添加Spring Boot的配置处理器
+(即spring-boot-configuration-processor)。
+```
+
+**`方案5`**
+
+清除并重新构建
+
+对于**Maven**项目,您可以运行mvn clean install命令;
+
+对于**Gradle**项目,您可以运行gradle clean build命令。
+
+
+
+## 项目idea运行正常,jar包运行报错
+
+```
+java -jar -Dfile.encoding=UTF-8 service-fire-biz.jar
+```
+
+
+
+# Zero date value prohibited
+
+Caused by: org.springframework.dao.TransientDataAccessResourceException: Error attempting to get column 'clsj' from result set.  Cause: java.sql.SQLException: Zero date value prohibited
+; Zero date value prohibited; nested exception is java.sql.SQLException: Zero date value prohibited
+
+
+
+在数据库URL后面添加参数`zeroDateTimeBehavior=convertToNull`来处理零日期时间
+
+```code
+1jdbc:mysql://your_host:port/your_database?serverTimezone=UTC&zeroDateTimeBehavior=convertToNull
+```
+
+# 导入数据保持旧表id
+
+![image-20240201175319356](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20240201175319356.png)
+
+```java 
+@TableId(value = "id", type = IdType.AUTO)
+改成
+@TableId(value = "id", type = IdType.INPUT)
+```
+
+
+
+
+
+# usky
+
+## Internal system error-NullPointerException-null:空指针异常
+
+![image-20231205095900754](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20231205095900754.png)
+
+![image-20231205100217105](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20231205100217105.png)
+
+
+
+![image-20231205095925813](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20231205095925813.png)
+
+定位问题在fire模块里的PatrolInspectionAreaServiceImpl中的add、update
+
+
+
+![image-20231205100527569](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20231205100527569.png)
+
+
+
+![image-20231205100538224](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20231205100538224.png)
+
+
+
+![image-20231205100543806](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20231205100543806.png)
+
+
+
+![image-20231205100549879](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20231205100549879.png)
+
+
+
+![](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20231205100604003.png)
+
+
+
+![image-20231205100616941](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20231205100616941.png)
+
+
+
+![image-20231205100626384](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20231205100626384.png)
+
+
+
+
+
+## 返回时间格式有误:2023-12-09T13:20:20
+
+![image-20231214141349359](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20231214141349359.png)
+
+正确格式:2023-12-09 13:20:20
+
+![image-20231214141410241](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20231214141410241.png)
+
+在实体类属性上添加注解:
+
+```java
+@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+```
+
+sql函数格式化
+
+![image-20231215154054534](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20231215154054534.png)
+
+直接转为格式化字符串
+
+```java
+DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+for (Map<String, Object> deviceStatus : deviceStatusList) {
+    LocalDateTime alarmTime = (LocalDateTime) deviceStatus.get("alarm_time");
+    String formattedTime = alarmTime.format(formatter);
+    deviceStatus.put("alarm_time", formattedTime);
+}
+```
+
+
+
+## 插入以后直接获取id
+
+xml文件添加:
+
+```xml
+<insert id="insertOperlog" parameterType="com.usky.system.domain.SysOperLog"
+			useGeneratedKeys="true" keyProperty="operId">
+```
+
+
+
+# **达梦数据库**
+
+要使用命令行方式启动和初始化达梦数据库,您可以按照以下步骤进行操作:
+
+1. 打开终端或SSH会话,登录到Linux系统中的用户账户(具有足够权限的用户)。
+
+2. 进入达梦数据库的安装目录。默认情况下,达梦数据库安装在`/opt/dmdbms`目录下。您可以使用以下命令进入该目录:
+
+   ```shell
+   cd /opt/dmdbms
+   ```
+
+3. 使用以下命令启动达梦数据库:
+
+   ```shell
+   ./bin/dmdbms
+   ```
+
+   如果需要以后台模式启动,可以使用以下命令:
+
+   ```shell
+   ./bin/dmdbms -b
+   ```
+
+   注意:启动数据库可能需要一些时间,请耐心等待。
+
+4. 接下来,您需要初始化达梦数据库。使用以下命令进行初始化:
+
+   ```shell
+   ./bin/dminit
+   ```
+
+   初始化过程中,系统会提示您输入管理员密码和确认密码。请根据提示进行操作。
+
+5. 初始化完成后,您可以使用达梦数据库的命令行工具(dm命令)进行进一步的操作。例如,使用以下命令登录到达梦数据库:
+
+   ```shell
+   ./bin/dm -U用户名 -P密码 -D数据库名
+   ```
+
+   替换"用户名"、"密码"和"数据库名"为您的实际信息。
+
+以上就是在Linux系统中使用命令行方式启动和初始化达梦数据库的步骤。请确保您已经正确安装了达梦数据库并具有足够的权限来执行这些操作。
+
+[dmdba@xfjyzd-xfglyjjy-app dmdbms]$ ./bin/dminit
+
+## ./bin/dminit: error while loading shared libraries: libdmnsort.so: cannot open shared object file: No such file or directory
+
+这个错误提示表明在运行`./bin/dminit`命令时,系统无法找到所需的共享库文件`libdmnsort.so`。共享库文件是一些可重用的代码和功能库,用于程序的运行。
+
+解决此错误的方法是确保`libdmnsort.so`库文件存在,并且可以被正确地加载。您可以按照以下步骤进行操作:
+
+1. 检查库文件路径:确认`libdmnsort.so`库文件是否存在于所需的路径中。您可以通过使用`ls`命令来查看库文件是否存在,例如:
+   ```
+   ls /path/to/libdmnsort.so
+   ```
+   如果文件不存在,请确保您具有适当的权限,并根据您的安装情况,可能需要重新安装或配置达梦数据库软件。
+
+2. 配置库文件路径:如果库文件存在于其他位置,您可以尝试将其路径添加到系统的库文件搜索路径中。可以通过`export`命令来设置`LD_LIBRARY_PATH`环境变量,并将库文件路径添加到其中,例如:
+   ```
+   export LD_LIBRARY_PATH=/path/to/library:$LD_LIBRARY_PATH
+   ```
+   然后再次运行`./bin/dminit`命令。
+
+如果以上步骤无法解决问题,建议您参考达梦数据库的官方文档或联系他们的技术支持团队以获取更详细的帮助。
+
+执行数据库实例配置(新进入到达梦数据库的命令行目录/home/dmdba/dmdbms/bin):
+[dmdba@test bin]$ ./dminit
+initdb V8
+db version: 0x7000c
+file dm.key not found, use default license!
+License will expire on 2022-07-09
+input system dir: /home/dmdba/dmdbms/data/
+input db name: DMOA
+input port num: 5234
+input page size(4, 8, 16, 32): 32
+input extent size(16, 32, 64): 64
+input sec priv mode(0, 1, 2): 0
+input time zone(-12:59,+14:00): +08:00
+string case sensitive? ([Y]es, [N]o): 0
+which charset to use? (0[GB18030], 1[UTF-8], 2[EUC-KR]): 1
+length in char? ([Y]es, [N]o): 0
+enable database encrypt? ([Y]es, [N]o): 0
+input slice size(0, 512, 4096): 4096
+page check mode? (0/1/2): 0
+input elog path:
+only create huge table with delta? (0/1): 0
+rlog generate for huge? (0/1): 0
+pseg_mgr_flag (0/1): 0
+auto_overwrite mode? (0/1/2): 2
+CHARACTER type fixed storage ? ([Y]es/1, [N]o/0): 0
+SQL log forbid ? ([Y]es/1, [N]o/0): 0
+Normal of FAST
+Normal of DEFAULT
+Normal of RECYCLE
+Normal of KEEP
+Normal of ROLL
+
+ log file path: /home/dmdba/dmdbms/data/DMOA/DMOA01.log
+
+
+ log file path: /home/dmdba/dmdbms/data/DMOA/DMOA02.log
+
+write to dir [/home/dmdba/dmdbms/data/DMOA].
+create dm database success. 2021-12-25 23:54:27
+
+3、启动数据库实例:
+[dmdba@test bin]$ ./DmServiceDMSERVER start
+Starting DmServiceDMSERVER:                                [ OK ]
+[dmdba@test bin]$
+[dmdba@test bin]$
+
+
+
+initdb V8
+
+db version: 0x7000c
+
+file dm.key not found, use default license!
+
+License will expire on 2022-07-09
+
+input system dir: /usr/local/DM8/data/
+
+input db name: ceweidb
+
+input port num: 5236
+
+input page size(4, 8, 16, 32): 32
+
+input extent size(16, 32, 64): 64
+
+input sec priv mode(0, 1, 2): 0
+
+input time zone(-12:59,+14:00): +08:00
+
+string case sensitive? ([Y]es, [N]o): n
+
+which charset to use? (0[GB18030], 1[UTF-8], 2[EUC-KR]): 1
+
+length in char? ([Y]es, [N]o): y
+
+enable database encrypt? ([Y]es, [N]o): n
+
+input slice size(0, 512, 4096): 0
+
+page check mode? (0/1/2): 0
+
+input elog path: /usr/local/DM8/logs
+
+only create huge table with delta? (0/1): 0
+
+rlog generate for huge? (0/1): 0
+
+pseg_mgr_flag (0/1): 0
+
+auto_overwrite mode? (0/1/2): 0
+
+CHARACTER type fixed storage ? ([Y]es/1, [N]o/0): 0
+
+SQL log forbid ? ([Y]es/1, [N]o/0): 0
+
+Normal of FAST
+
+Normal of DEFAULT
+
+Normal of RECYCLE
+
+Normal of KEEP
+
+Normal of ROLL
+
+log file path: /usr/local/DM8/data/ceweidb/ceweidb01.log
+
+log file path: /usr/local/DM8/data/ceweidb/ceweidb02.log
+
+write to dir [/usr/local/DM8/data/ceweidb].
+
+create dm database success. 2021-12-25 23:54:27
+
+
+
+```shell
+ls /home/dm8/data/DMDB/dm.ini
+```
+

+ 70 - 0
无人驿站历史数据-接口文档 v1.0.md

@@ -0,0 +1,70 @@
+# 无人驿站历史数据-接口文档 v1.0
+
+**川北大厦告警查询 接口文档** **v1.0**
+
+接口说明: 历史数据录入
+
+
+
+### **请求方式**
+
+**Content-Type**:
+
+application/json
+
+**POST**
+
+**请求URL**:http://localhost:9889/dataStHistory/add
+
+
+
+### **请求参数**
+
+**header**:	
+
+appKey:6C57702BB93E9BA136B9337F0C1BA1BC
+
+**body**:
+
+```json
+{
+  "packNo": "109001311",
+  "expressName": "SF",
+  "receiverPhone": "13411076285",
+  "contactPhone": "18651076367",
+  "pickupAddress": "取件地址",
+  "pickupCode": "94000",
+  "content": "666"
+}
+```
+
+### **data说明**
+
+|名称|位置|类型|必选|说明|
+|---|---|---|---|---|
+|appKey|header|string| 是 |驿站标识|
+|packNo|body|string| 否 |订单编号|
+|expressName|body|string| 否 |快递名称|
+|receiverPhone|body|string| 否 |接收人电话|
+|contactPhone|body|string| 否 |联系电话|
+|pickupAddress|body|string| 否 |取件地址|
+|pickupCode|body|string| 否 |取件编号|
+|content|body|string| 否 |描述内容|
+
+> 返回示例
+
+```json
+{
+  "status": "SUCCESS",
+  "code": "0",
+  "msg": null,
+  "data": null,
+  "exception": null
+}
+```
+
+### 返回结果
+
+|状态码|状态码含义|说明|数据模型|
+|---|---|---|---|
+|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline|

+ 42 - 0
每日需做.md

@@ -0,0 +1,42 @@
+每天git提交代码(fu-dev),先到165上,到时候再合并
+
+
+
+mvn clean spring-boot:run -P dev
+
+开发模式跑通项目命令(maven)
+
+
+
+参考  iot模块的 BaseBuildFacility
+
+
+
+# 报错
+
+先看报错原因定位位置,能找到改完再测;
+
+不行再打断点找;
+
+检查SQL、XML;
+
+
+
+
+
+
+
+```sql
+INSERT INTO data_st_history (pack_no, express_name, receiver_phone, contact_phone, pickup_address, pickup_code, content, app_key, data_time, pack_status, pickup_status)
+VALUES 
+  ('JT5248116538982', '极兔快递', '15575941811', '13576528708', '上海市长宁区伊犁路97号新虹桥中心花园', '09-11-4238', '生鲜', '6C57702BB93E9BA136B9337F0C1BA1BC', '2023-12-24 10:25:14', 1, 0),
+  ('9857267863402', '邮政快递', '15575941811', '18770579721', '上海市长宁区伊犁路97号新虹桥中心花园', '12-03-1597', '食品', '6C57702BB93E9BA136B9337F0C1BA1BC', '2023-12-18 11:26:23', 1, 1),
+  ('YT8943862168611', '圆通速递', '15575941811', '13879533069', '上海市长宁区伊犁路97号新虹桥中心花园', '07-01-3578', '日用品', '6C57702BB93E9BA136B9337F0C1BA1BC', '2023-12-26 09:12:50', 0, 0),
+  ('463275681461918', '韵达快递', '15575941811', '18007095632', '上海市长宁区伊犁路97号新虹桥中心花园', '02-08-1782', '', '6C57702BB93E9BA136B9337F0C1BA1BC', '2023-12-11 13:02:15', 1, 1);
+
+INSERT INTO data_st_history ( pack_no, express_name, receiver_phone, contact_phone, pickup_address, pickup_code, content, app_key, data_time, pack_status, pickup_status) VALUES  
+('SF1658583365256', '顺丰速运', '15575941811', '13908061235', '上海市长宁区伊犁路97号新虹桥中心花园', '01-06-1023', '计生用品', '6C57702BB93E9BA136B9337F0C1BA1BC', '2023-12-24 10:31:46', 0, 0),  
+('78396342708506', '中通快递', '15575941811', '13756128878', '上海市长宁区伊犁路97号新虹桥中心花园', '05-04-4232', '日用品', '6C57702BB93E9BA136B9337F0C1BA1BC', '2023-12-23 15:42:35', 1, 0),  
+('YT8943862152933', '圆通速递', '15575941811', '13452834456', '上海市长宁区伊犁路97号新虹桥中心花园', '03-12-6788', '电器', '6C57702BB93E9BA136B9337F0C1BA1BC', '2023-12-25 12:17:01', 0, 1);
+```
+

+ 535 - 0
达梦数据库.md

@@ -0,0 +1,535 @@
+# 达梦数据库
+
+## 1、启动数据库服务
+
+```shell
+服务注册成功后,启动数据库,如下所示:
+systemctl start DmServicedm.service
+停止数据库,如下所示:
+systemctl stop DmServicedm.service
+重启数据库,如下所示:
+systemctl restart DmServicedm.service
+查看数据库服务状态,如下所示:
+systemctl status DmServicedm.service
+```
+
+
+
+## 2、登录达梦数据库
+
+切换目录到大梦数据库的bin目录下
+
+![img](F:\windows\桌面\分享\fa97b45ae9a8440abcd54fcdd94fd951.png)
+
+
+
+登录数据库
+
+```shell
+[root@localhost bin]# ./disql SYSDBA/SYSDBA@localhost:5236
+```
+
+连接项目
+
+```maven
+mvn install:install-file -Dfile=F:\DMDb\drivers\jdbc\DmJdbcDriver18.jar -DgroupId=com.dm -DartifactId=DmJdbcDriver -Dversion=1.8.0 -Dpackaging=jar 
+```
+
+
+
+## 3、创建数据库实例
+
+### 创建服务
+
+```shell
+./dminit PATH=/home/dm8/data PAGE_SIZE=32 EXTENT_SIZE=32 CASE_SENSITIVE=N CHARSET=1 LENGTH_IN_CHAR=Y DB_NAME=usky_fire BLANK_PAD_MODE=1 LOG_SIZE=2048 INSTANCE_NAME=usky_fire PORT_NUM=5236
+```
+
+#### 注册服务
+
+```shell
+./dm_service_installer.sh -t dmserver -p DMSERVERusky_fire -dm_ini /home/dm8/data/usky_fire/dm.ini
+
+```
+
+#### 删除服务
+
+```shell
+./dm_service_uninstaller.sh -n 实例/服务名(例如:DmServiceSP)
+```
+
+### 创建表空间
+
+```sql
+CREATE TABLESPACE alarm_electrical_fire
+DATAFILE '/home/dm8/data/usky_fire/alarm_electrical_fire.dbf' SIZE 1M AUTOEXTEND ON NEXT 10M;
+```
+
+```sql
+create tablespace alarm_spray_water datafile '/home/dm8/data/usky_fire/alarm_spray_water.dbf' size 128 autoextend on next 5 cache=normal;
+```
+
+#### 查看所有表
+
+```sql
+SELECT TABLE_NAME FROM USER_TABLES;
+```
+
+#### 将表指定给表空间
+
+```sql
+TABLESPACE alarm_electrical_fire;
+```
+
+#### 查看所有表空间
+
+```sql
+SELECT TABLESPACE_NAME, TABLESPACE_TYPE, TABLESPACE_SIZE
+FROM SYS_ALL_TABLESPACES;
+
+SELECT * FROM V$TABLESPACE;
+```
+
+#### 查看指定表空间内的表名
+
+```sql
+SELECT TABLE_NAME, COLUMN_COUNT, ROW_COUNT
+FROM SYS_TABLES
+WHERE TABLESPACE_NAME = 'alarm_hydrant_water';
+
+SELECT * FROM ALL_TABLES WHERE TABLESPACE_NAME = '表空间名称';
+
+SELECT * FROM DBA_TABLES WHERE TABLESPACE_NAME = 'alarm_spray_water';
+```
+
+#### 查看表属于哪个模式
+
+```sql
+SELECT OWNER AS SCHEMA_NAME  
+FROM ALL_TABLES  
+WHERE TABLE_NAME = 'bsc_enterprise_screen';
+```
+
+
+
+#### 删除表空间(同时删除数据)
+
+```sql
+DROP TABLESPACE tablespace_name INCLUDING CONTENTS;
+```
+
+#### 只删除表空间而保留其中的数据:
+
+1. 首先,确保没有任何活动会话或事务正在使用要删除的表空间。
+2. 在达梦数据库中创建一个新的表空间,用于迁移表和数据。可以使用以下语句创建新表空间:
+
+```sql
+CREATE TABLESPACE new_tablespace_name DATAFILE 'path_to_datafile' SIZE 100M;
+```
+
+在上述语句中,`new_tablespace_name`是新表空间的名称,`path_to_datafile`是数据文件的路径和名称,`SIZE 100M`是指定表空间的大小。
+
+3. 将要保留的表和数据迁移到新的表空间中。可以使用以下语句将表移动到新表空间:
+
+```sql
+ALTER TABLE table_name MOVE TABLESPACE new_tablespace_name;
+```
+
+在上述语句中,`table_name`是要移动的表的名称,`new_tablespace_name`是目标表空间的名称。
+
+4. 确保所有表都已成功迁移到新表空间后,可以将旧表空间删除。使用以下语句删除表空间:
+
+```sql
+DROP TABLESPACE old_tablespace_name INCLUDING CONTENTS;
+```
+
+在上述语句中,`old_tablespace_name`是要删除的旧表空间的名称。`INCLUDING CONTENTS`参数可以选择是否删除表空间中的所有对象和数据。
+
+
+
+## 4、执行`SQL`脚本
+
+两种操作,当然需要登录到数据库中才能操作(导出`dexp、dmp`文件不需要登录数据库)
+
+```shell
+1 # start + 脚本的绝对路径
+2 SQL> start /home/dm8/data/usky_fire/alarm_hydrant_water(DM).sql
+
+run /path/to/sql/file.sql;
+@/path/to/sql/file.sql;
+```
+
+```shell
+1 # ` + 脚本的绝对路径
+2 SQL> `start /home/dm8/data/usky_fire/alarm_hydrant_water(DM).sql
+```
+
+
+
+##  5、导出`dmp`文件
+
+使用`dexp`进行导出,切换到达梦的bin目录下,可以看到有一个`dexp`文件,使用它进行导出的操作
+
+```shell
+1 ./dexp 用户id/密码@ip:5236 file=导出的文件 directory=导出文件所在的目录 导出的模式
+```
+
+ 
+
+导出模式:`FULL、OWNER、SCHEMAS、TABLES` ;全部导出、根据用户导出、根据模式导出和表导出。
+
+ 
+
+```shell
+1 # 全部导出
+2 [root@localhost bin]# ./dexp SYSDBA/SYSDBA@localhost:5236 file=imp_exp.dmp directory=/dm7/data FULL=y
+3 # 根据模式导出
+4 [root@localhost bin]# ./dexp SYSDBA/SYSDBA@localhost:5236 file=imp_exp.dmp directory=/dm7/data SCHEMAS=NINGDATABASE
+```
+
+ 
+
+## 6、导入`dmp`文件
+
+使用`dimp`进行导入,依旧需要切换到达梦的bin目录下,同样也会有一个`dimp`文件,使用这个文件进行导入操作
+
+```shell
+1 ./dimp 用户id/密码@ip:5236 file=导入的文件 directory=导入文件所在的目录 导入的模式
+```
+
+和导出一样,导入也是同样的四个模式
+
+```shell
+1 #根据模式进行导入
+2 [root@localhost bin]# ./dimp SYSDBA/SYSDBA@localhost:5236 file=imp_exp.dmp directory=/dm7/data SCHEMAS=NINGDATABASE
+```
+
+
+
+## 7、执行`SQL`脚本和`dmp`文件
+
+- 修改操作较少或者修改的东西比较集中的情况下可以直接使用导出SQL脚本然后登录数据库执行SQL脚本进行同步操作;SQL脚本的执行默认是直接commit(直接执行SQL需要手动进行commit)
+- 其他比较复杂的操作或者数据量大可以使用导出dmp文件,具体的导出导入模式根据自己的需要进行选择
+- dmp文件或者dexp文件进行操作时,导出和导入模式要一致
+
+
+
+## SQL命令
+
+### 查询数据库版本
+
+```sql
+select * from v$version;
+```
+
+### 查看授权信息
+
+```sql
+select * from  v$license;
+```
+
+### 查看达梦数据库库名
+
+```sql
+select name,create_time from v$database;
+```
+
+### 查看大小写配置是否敏感
+
+--大小敏感(1为大小写敏感,0为大小写不敏感)
+
+```sql
+SELECT SF_GET_CASE_SENSITIVE_FLAG();
+或
+SELECT CASE_SENSITIVE();
+SELECT SF_GET_CASE_SENSITIVE_FLAG();
+```
+
+### 查询数据库最大连接
+
+```sql
+select SF_GET_PARA_VALUE(2,'MAX_SESSIONS');
+```
+
+### 查看达梦数据库当前状态
+
+```sql
+select status$ from v$instance;
+```
+
+### 查询授权截止有效期
+
+```sql
+select EXPIRED_DATE  from v$license;
+```
+
+### 查询数据文件位置
+
+```sql
+select GROUP_ID , ID ,path,STATUS$ from v$datafile;
+```
+
+### 查询表空间大小
+
+```sql
+select FILE_NAME,FILE_ID,TABLESPACE_NAME,BYTES/1024/1024||'M'  from dba_data_files;
+```
+
+### 查询表空间使用情况
+
+```sql
+select t1.NAME tablespace_name,
+
+t2.FREE_SIZE*SF_GET_PAGE_SIZE()/1024/1024 ||'M' free_space,
+
+t2.TOTAL_SIZE*SF_GET_PAGE_SIZE()/1024/1024 ||'M' total_space,
+
+t2.FREE_SIZE*100/t2.total_size "% FREE" 
+
+from V$TABLESPACE t1, V$DATAFILE t2 
+
+where t1.ID=t2.GROUP_ID;
+```
+
+### 查询所有SCHEMA
+
+```sql
+ select * from dba_objects where object_type='SCH';
+```
+
+### 查询所有用户
+
+```sql
+select username from dba_users;
+```
+
+### 切换SCHEMA
+
+```sql
+set schema "testSchema";
+```
+
+### 创建SCHEMA
+
+```sql
+CREATE SCHEMA "testSchema";
+```
+
+### 查询模式下全量表名称
+
+```sql
+select TABLE_NAME from all_tables WHERE OWNER='testSchema';
+```
+
+### 删除SCHEMA
+
+```sql
+drop schema "testSchema";
+```
+
+### 列注释
+
+```sql
+COMMENT ON COLUMN testSchema.peoples.role_id is '角色Id';
+```
+
+### 查询列注释
+
+```sql
+select * from SYSCOLUMNCOMMENTS 
+
+where SCHNAME='testSchema' and TVNAME='peoples' and COLNAME='role_id';
+```
+
+### 表注释
+
+```sql
+comment on table testSchema.peoples is '这是一个表注释';
+```
+
+### 查询表注释
+
+```sql
+select * from SYSTABLECOMMENTS where SCHNAME='testSchema' and TVNAME='peoples';
+```
+
+```sql
+SELECT COMMENTS
+FROM USER_TAB_COMMENTS
+WHERE TABLE_NAME = 'alarm_electrical_fire';
+```
+
+### 创建表空间
+
+```sql
+CREATE TABLESPACE MANAGEMENT DATAFILE 'MANAGEMENT.DBF' SIZE 128;
+```
+
+### 查看表空间
+
+```sql
+select * from dba_data_files;
+
+select * from dba_tablespaces;
+
+select * from v$tablespace;
+```
+
+### 创建用户
+
+```sql
+CREATE USER usky_cloud IDENTIFIED BY "usky666" DEFAULT TABLESPACE MANAGEMENT;
+
+GRANT DBA TO testSchema;
+GRANT DBA TO usky_cloud;
+```
+
+### 查看当前实例的连接数
+
+```sql
+select clnt_ip,user_name,state,count(*) from v$sessions group by clnt_ip,user_name,state;
+```
+
+
+查询 dba_segments 需要Dba权限,用户没有Dba权限时查询 all_tables 或 user_tables
+
+某模式下所有表名  需要DBA权限          AND SEGMENT_NAME LIKE 'CD_%' 
+
+```sql
+select owner,SEGMENT_NAME as tbName from dba_segments  where segment_type='TABLE' and OWNER ='模式名' 
+```
+
+查看模式下所有表  不需要DBA权限       and TABLE_NAME LIKE 'CD_%'
+
+```sql
+select TABLE_NAME as tbName from all_tables where OWNER ='模式名' 
+```
+
+用户下所有表  		where  table_name like 'CD_%' 
+
+```sql
+select table_name as tbName from user_tables group by TABLE_NAME
+```
+
+## 1.1 启动数据库
+
+```sql
+cd /home/dmdba/dmdbms/bin
+./dmserver /home/dmdba/dmdbms/DAMENG/dm.ini
+```
+
+### 1.2 连接数据库
+
+```sql
+./disql SYSDBA/SYSDBA@localhost:5236
+```
+
+### 1.3 使用DISQL直接执行命令
+
+```sql
+cd /home/dmdba/dmdbms/bin
+./disql SYSDBA/SYSDBA -E "select * from t1"
+```
+
+### 1.4 数据库版本
+
+```sql
+select *,id_code from v$version;
+```
+
+### 1.4 数据库信息
+
+```sql
+select * from v$database;
+```
+
+## 2 数据库对象
+
+### 2.1 表
+
+```sql
+// 查看表结构
+SQL > describe table
+// 查看表的模式名
+select owner from dba_tables where table_name='T1';
+// 查看数据库中的表
+select * from dba_tables;
+// 查看建表语句
+sp_tabledef('SYSDBA','T1');   -- 模式名,表名,注意都要大写。
+SELECT DBMS_METADATA.GET_DDL('TABLE',表名,模式名);       // 参考 DBMS_METADATA 系统包
+SELECT DBMS_METADATA.GET_DDL('TABLE','T1','SYSDBA');    // 例句
+```
+
+### 2.2 LICENSE
+
+```sql
+SQL > SELECT * FROM V$LICENSE;
+```
+
+## 3 数据库操作
+
+### 3.1 开启归档日志
+
+```sql
+//修改数据库为MOUNT状态
+ALTER DATABASE MOUNT;
+
+//配置本地归档
+ALTER DATABASE ADD ARCHIVELOG 'DEST = /dmdata/dameng/arch_dsc0, TYPE = local, FILE_SIZE = 1024, SPACE_LIMIT = 2048, ARCH_FLUSH_BUF_SIZE=16,HANG_FLAG=1';
+
+//配置远程归档
+ALTER DATABASE ADD ARCHIVELOG 'DEST = DSC1, TYPE = REMOTE, FILE_SIZE = 1024, SPACE_LIMIT = 2048, ARCH_FLUSH_BUF_SIZE=16, INCOMING_PATH = /dmdata/dameng/arch_dsc1';
+
+//开启归档模式
+ALTER DATABASE ARCHIVELOG;
+
+//修改数据库为OPEN状态
+ALTER DATABASE OPEN;
+```
+
+### 脱机完全备份(RMAN)
+
+```sql
+// 必须开启归档并已生成归档日志
+dmdba@else-virtual-machine:~/dmdbms/bin$ ./dmrman
+dmrman V8
+RMAN> BACKUP DATABASE '/home/dmdba/dmdbms/DAMENG/dm.ini' FULL BACKUPSET '/else/bakup_dm'; 
+```
+
+### 3.3 联机完全备份(disql)
+
+```sql
+SQL> BACKUP DATABASE TO WEEKLY_FULL_BAK BACKUPSET '/backup/dmdb/online';
+SQL> BACKUP  DATABASE  FULL  BACKUPSET '/backup/dmdb/online';
+```
+
+### 数据库表备份
+
+```sql
+SQL> BACKUP TABLE t1 BACKUPSET '/backup/dmdb/t1_bak_01';
+```
+
+### 数据库表恢复
+
+```sql
+// 前提: 表必须存在
+SQL> RESTORE TABLE t1 FROM BACKUPSET '/backup/dmdb/t1_bak_01';
+```
+
+## 4 主从复制
+
+### 4.1 查看数据库模式
+
+```sql
+// 数据库状态查看
+SQL> select status$ from v$instance;
+// 数据库模式查看
+SQL> select MODE$ from v$instance;
+```
+
+### 4.2 查看主备运行情况
+
+```sql
+ SQL> select * from V$ARCH_STATUS
+ SQL> select * from V$RLOG_RAFT_INFO 
+```

+ 169 - 0
迁移.md

@@ -0,0 +1,169 @@
+```shell
+[root@localhost bin]# ./disql SYSDBA/SYSDBA@localhost:5236
+./disql SYSDBA/Yt#75Usky@localhost:5237
+./disql SYSDBA/'"Yt#75Usky"'@localhost:5237
+./disql usky_cloud/'"Yt#75Usky"'@localhost:5237
+
+151:
+./disql usky-cloud/usky666888@localhost:5236
+./disql usky-fire/usky888666@localhost:5236
+./dbca.sh
+```
+
+```shell
+cd dmdbms/bin
+```
+
+```sql
+CREATE TABLESPACE dem_enforce_project_all
+DATAFILE '/home/dm8/data/usky_fire/dem_enforce_project_all.dbf' SIZE 256 AUTOEXTEND ON NEXT 10;
+
+start /home/dm8/data/usky_fire/110/111/chunk37.sql
+start /home/dm8/data/usky_fire/110/66/sys_user_role_202402021054.sql
+
+SELECT * FROM DBA_TABLES WHERE TABLESPACE_NAME = 'data_rt';
+
+select count(*) from hce_article;
+
+SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, NULLABLE 
+   FROM USER_TAB_COLUMNS 
+   WHERE TABLE_NAME = 'sys_menu';
+
+快速删除表中的所有数据,但保留表的结构、索引和其他相关的数据库对象:
+TRUNCATE TABLE table_name;
+
+
+ALTER TABLE sys_tenant DROP PRIMARY KEY;
+ALTER TABLE sys_tenant MODIFY id INT IDENTITY (1045, 1);
+
+赋予管理员权限:
+GRANT SYSDBA TO usky_cloud;
+
+查看大小写是否敏感
+select PARA_VALUE from v$dm_ini where "V$DM_INI".PARA_NAME like '%CASE_SENSITIVE';
+
+double:
+decimal
+
+重置密码:
+alter user SYSDBA identified by Yt#75Usky;
+
+查看注释:
+SELECT table_name, comments FROM all_tab_comments WHERE owner = 'USKY-CLOUD' AND table_name = 'sys_check_code';
+```
+
+触发器:更新时间设置为实时时间
+
+```sql
+CREATE TRIGGER trg_update_time
+BEFORE UPDATE ON base_company
+REFERENCING NEW AS new
+FOR EACH ROW
+BEGIN
+  SET new.update_time = CURRENT_TIMESTAMP;
+END;
+
+
+
+CREATE OR REPLACE TRIGGER base_company_tmp_1
+BEFORE INSERT ON base_company_tmp
+FOR EACH ROW  
+BEGIN  
+IF :NEW.update_time IS NULL THEN  
+:NEW.update_time:= SYSDATE;  
+END IF;  
+END;
+
+
+SELECT * FROM DBA_TRIGGERS;
+```
+
+添加索引:
+
+```sql
+CREATE INDEX build_num_index ON base_build(build_num);
+```
+
+
+
+统计当前目录下的文件个数(包括子目录):
+
+```bash
+bash复制代码
+
+ls -Rl | grep "^-" | wc -l
+```
+
+
+
+执行shell脚本
+
+先转换再执行:
+
+```shell
+dos2unix 777.sh
+
+chmod +x 777.sh
+#命令为脚本添加执行权限
+
+bash usky_cloud.sh
+```
+
+
+
+```shell
+#!/bin/bash
+
+# 数据库连接信息
+DB_HOST="localhost"
+DB_PORT="5237"
+DB_NAME=""
+DB_USER="your_username"
+DB_PASSWORD="your_password"
+
+# SQL文件目录
+SQL_DIR="/path/to/sql/files"
+
+# 获取SQL文件列表
+SQL_FILES=$(ls $SQL_DIR/*.sql)
+
+# 登录数据库并执行SQL文件
+for SQL_FILE in $SQL_FILES; do
+  echo "Executing SQL file: $SQL_FILE"
+  dmcli -h $DB_HOST -p $DB_PORT -n $DB_NAME -u $DB_USER -pw $DB_PASSWORD -s "source $SQL_FILE"
+  echo "SQL file executed."
+done
+
+```
+
+```shell
+#!/bin/bash  
+  
+# 定义达梦数据库的连接信息  
+DB_HOST="your_host"  
+DB_PORT="your_port"  
+DB_NAME="your_database"  
+DB_USER="your_username"  
+DB_PASS="your_password"  
+  
+# 定义要执行的SQL文件列表  
+SQL_FILES=(  
+  "path/to/sql_file1.sql"  
+  "path/to/sql_file2.sql"  
+  # ... 其他SQL文件路径  
+)  
+  
+# 循环执行SQL文件  
+for file in "${SQL_FILES[@]}"  
+do  
+  echo "正在执行: $file"  
+  # 使用达梦提供的命令行工具执行SQL文件  
+  dsql -S $DB_HOST:$DB_PORT -U $DB_NAME -P $DB_USER -W -f $file  
+  if [ $? -eq 0 ]; then  
+    echo "执行完成: $file"  
+  else  
+    echo "执行失败: $file"  
+  fi  
+done
+```
+