0%

前言

今天遇到一个很有意思的提问,有Animal,Cat,ChineseCat,三个类,这三个类有继承关系(如下):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Animal:
{

}

public class Cat:Animal
{

}

public class ChineseCat:Cat
{

}

需要将一个子类的字符串通过JSON转换为他的实际类型。

2022.8.10 填坑

在json内附加类型的FullName,带程序集的那个名字,先外层序列化回对象,内层对象根据外层对象的 FullName,通过

1
Type type = Type.getType('dll FullName') //大概写一下,伪代码

下面就通过序列号去做。

本文关于DOS.ORM

1. 准备一个示例数据库

1
2
3
4
5
6
7
8
9
CREATE TABLE `order_50`  (
`ID` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`ProductName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`CreateTime` datetime(0) NULL DEFAULT NULL,
`CreateOrderUserId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`ID`) USING BTREE,
INDEX `idx`(`ProductName`) USING BTREE,
INDEX `indc`(`CreateOrderUserId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

2. 新建一个Console项目

1
2
dotnet new console #新建项目
dotnet add package DOS.ORM #安装DOS.ORM包

3. 编写代码

新建一个DB.cs

1
2
3
4
5
6
7
8
9
using Dos.ORM;

namespace ORMDemo;

public class DB
{
public static readonly DbSession Context = new DbSession(DatabaseType.MySql,
"Server=127.0.0.1;port=3307;userid=root;password=123456;database=mytestdb_5;");
}

新建一个Entity

我们这里新建一个Order实体

1
2
3
4
5
6
7
8
9
10
11
12
13
using Dos.ORM;
namespace ORMDemo;
[System.ComponentModel.DataAnnotations.Schema.Table("order_50")] //必须添加数据库实体表明
public class OrderEntity:Entity //必须继承Entity
{
public string Id { get; set; } = Guid.NewGuid().ToString();

public string CreateOrderUserId { get; set; }

public DateTime CreateTime { get; set; }

public string ProductName { get; set; }
}

这个实体对象必须指定数据库的表名,并继承Entity(位于DOS.ORM)

使用DOS.ORM进行查询数据

1. 使用FromSql进行查询

1
2
3
using ORMDemo;

var list =DB.Context.FromSql("SELECT * from order_50 LIMIT 10").ToList<OrderEntity>();

通过上面的形式就可以查询到数据,数据会自动通过ToList<T>()映射到C#对象。

2. 使用db.Context.From<T>()

1
var list = DB.Context.From<Order>().ToList();

该Order类需要标记Table、Field等。一般使用Dos.Tools对已经存在的数据库生产实体类。(选择2018年的模板)

2. 新增DB.Context.Insert<T>()/Insert()

1
2
3
4
var order = new Order(){
....此处省略
};
DB.Context.Insert<Order>(order) //插入对象

3. 更新DB.Context.Update<T>()/Update()

1
2
3
4
5
var order = new Order{
ID="CE423D3E-A1C3-40BD-9DAE-CB4C9CA11E96",
...省略其他
};
DB.Context.Update<Order>(order,c=>c.ID== order.ID); // 更新

4. 删除DB.Context.Delete()

1
DB.Context.Delete("CE423D3E-A1C3-40BD-9DAE-CB4C9CA11E96") //可以单条或者列表

后记

今天听同事说这个库好像有什么问题,具体还没跟我沟通,这个库也是在我接触的 dotnet Framework 4.x 系列的项目内接触到的。仅做记录。

1. 安装JAVA环境

1
sudo apt-get install default-jdk

2. 下载wrapper及jar包

1
2
3
4
wget http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template-1.21.zip
unzip mycat2-install-template-1.21.zip
cd mycat/lib
wget http://dl.mycat.org.cn/2.0/1.22-release/mycat2-1.22-release-jar-with-dependencies-2022-4-27.jar

3. 给文件夹写权限

1
sudo chmod 777 mycat -Rf #递归修改文件夹权限

因为创建数据库时会在对应的文件夹创建配置文件,所以需要读写权限。同时也会往logs文件夹写日志。

4. 修改配置文件

文件名 作用
e:\mycat\conf\datasources\prototypeDs.datasource.json 配置名称为prototypeDs 的数据源
e:\mycat\conf\users\root.user.json 配置root的登录用户信息
e:\mycat\conf\server.json 配置mycat服务器信息
e:\mycat\conf\simplelogger.properties 配置log级别
e:\mycat\conf\clusters\prototype.cluster.json 配置名称为prototype的集群

5. 启动MyCat

1
2
cd mycat/bin
./mycat start # 启动后即可去logs文件夹下查看日志,若日志过于简单可以修改mycat\conf\simplelogger.properties 来调整日志级别。输出更多内容。

6. 创建数据库

使用Navicat或者dbever连接到MyCat(如果连不上,可能是MYSQL 8 密码模式造成的,可以修改密码,具体提示可以查看日志)

1
2
3
4
5
6
7
8
9
10
11
12
create DATABASE myTestDb; # 创建一个数据库 myTestDb
use myTestDb;
-- 分库分表
CREATE TABLE `test` (
`ID` varchar(36) NOT NULL,
`Name` varchar(255) NULL DEFAULT NULL,
`CreateTime` datetime(0) NULL DEFAULT NULL,
`Phone` varchar(255) NULL DEFAULT NULL,
`Address` varchar(255) NULL DEFAULT NULL,
PRIMARY KEY (`ID`) USING BTREE,
INDEX `idx`(`Phone`) USING HASH
) ENGINE = InnoDB DEFAULT dbpartition by mod_hash(id) tbpartition by mod_hash(id) tbpartitions 10 dbpartitions 10;

其中 dbpartition by mod_hash(id) tbpartition by mod_hash(id) tbpartitions 10 dbpartitions 10 为分库分表的语句,意思是使用mod_hash(id)来进行分库操作,使用mod_hash(id)来进行分表操作。tbpartitions : 分库的数量。dbpartitions :分表的数量。

1
2
3
4
5
6
7
8
9
10
11
12
13
-- 为了测试多表查询,顾在插入了Test表后又新建了Order表
use myTestDb;
CREATE TABLE `order` (
`ID` varchar(36) NOT NULL,
`ProductName` varchar(255) NULL DEFAULT NULL,
`CreateTime` datetime(0) NULL DEFAULT NULL,
`CreateOrderUserId` varchar(255) NULL DEFAULT NULL,
PRIMARY KEY (`ID`) USING BTREE,
INDEX `idx`(`ProductName`) USING HASH
) ENGINE = InnoDB DEFAULT dbpartition by mod_hash(id) tbpartition by mod_hash(id) tbpartitions 10 dbpartitions 10;

-- 下方的语句为MyCat的命令,MyCat的命令通过类似注释的方式去执行。该命令执行刷新物理表的操作。
/*+ mycat:repairPhysicalTable{} */

7. 备忘:

• 不使用MyCat1.6的几点原因:
Insert操作丢失数据
不能批量更新(不支持多语句)

Ubuntu 通过Service自启动

  1. /lib/systemd/system/文件夹下创建Service,本次使用Service创建NPC自启。故将本次服务名称命名为npc.service
  2. 编写npc.service内容
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [Unit]
    Description=nps_client_service
    After=network.target #网络启动后
    Wants=
    Requires=

    [Service]
    Type=forking
    ExecStart=/bin/bash /opt/NPClient/start_npc.sh #执行的内容是脚本test.sh中的内容,其中包括它的绝对地址

    [Install]
    WantedBy=multi-user.target
  3. 将该服务设置为开机启动
    1
    systemctl enable npc.service
  4. 查看服务状态
    1
    systemctl status npc.service

    确保此时无报错

  5. 重启电脑

1. 安装OnlyOffice

1
docker run -d -p 10086:80 onlyoffice/documentserver

2. 字体路径

  1. 原版自带字体:/usr/share/fonts/
  2. 核心字体:/var/www/onlyoffice/documentserver/core-fonts/

在删除过程中/usr/share/fonts/truetype/custom该路径无法删除,忽略即可,后续将自定义的字体移动才该目录,拓展名为.otf

3. 重新生成

执行:/usr/bin/documentserver-generate-allfonts.sh等待启动即可。

4. Other

使用Nginx进行反向代理,需要设置传递真实IP。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server  {
listen 80;
server_name my.hostname;
location / {
proxy_pass http://127.0.0.1:10086;
proxy_connect_timeout 4s; #配置点1
proxy_read_timeout 60s; #配置点2,如果没效,可以考虑这个时间配置长一点
proxy_send_timeout 12s; #配置点3
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}