0%

直接上代码

1
2
3
4
5
6
7
8
9
public string ReadEmbeddedFile(string fileName)
{
using (var stream = this.GetType().Assembly.GetManifestResourceStream(fileName))
{
byte[] b = new byte[stream.Length];
stream.Read(b, 0, b.Length);
return Encoding.UTF8.GetString(b);
}
}

会有疑问,文件长啥样子,怎么得出来的,可以通过this.GetType().Assembly.GetManifestResourceNames()来获取当前程序集下面的嵌入式文件。多提一句嵌入式文件可以跟Nuget包一起生成。

起因

今天突发奇想,丰富一下自己的Swagger页面,给他新增上按钮,以及生成Interfaceangular servicetemplate

过程

新加一些按钮其实并不复杂,想着用浏览器的油猴插件就可以搞定对页面附加JS的效果。

本文完。

一开始想着自己用确实可以这样,但是如果让每个团队成员去配置也有些麻烦,所以我们可以直接在项目里面集成我们自己写的JS,我也百度了很久,发现似乎没有这样集成的文章。

自定义JS集成进Swagger页面

1. 编写JS

这一步也没有什么难度,可以去一些油猴可以用的脚本网站上去复制这些代码。

2. 让Swagger加载我们自定义的JS

一开始尝试,在Service.AddSwaggerGen的时候加入自己实现对的IDocumentFilter接口,通过以下方式加入:

1
2
3
4
5
builder.Services.AddSwaggerGen(c =>
{
//后来发现 c.IndexStream 这个可以直接加载主页的Index文件流。
c.DocumentFilter<MyJsFilter>();//MyJsFilter实现IDocumentFilter
})

在里面修改东西,仅可被渲染,无法加载js

查阅源代码以后,发现在SwaggerUIMiddleware类中使用嵌入式文件来生成默认的HTML文件,但是会给嵌入式文件进行传参。

这些传参的地方直接渲染在页面上没有做处理,所以我的思路是可以借助这几个配置项进行渲染JS。

通过检查SwaggerUIOptions发现只需要在配置SwaggerUI时传入JS字符串即可将原先的油猴插件代码嵌入Swagger并渲染执行。

1
2
3
4
5
app.UseSwaggerUI(c =>
{
c.HeadContent = "<script>alert('hello')</script>";
//界面上不会显示出这个字,会作为JS执行
});

备注:可以通过这样的方法来引入JS丰富Swagger的功能,并且无需对SwaggerUI改动。

重要:
后来发现通过c.IndexStream可以直接加载Index页面的文件流。

前言

为了在本地部署项目,k3sk8s可以使用相似的资源清单配置文件。执行方式不使用自带的容器执行程序使用docker作为底层的执行。

安装

1
2
3
4
#使用docker,实际配置内容在/etc/systemd/system/k3s.service,里面有个ExecStart里面配置为docker即可使用docker。也可以直接在安装的时候通过环境变量的方式设置。
export INSTALL_K3S_EXEC="--docker"
#定义安装程序使用的源 Mirror
export INSTALL_K3S_MIRROR=cn

安装k3s

1
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -

加入Work节点

1
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -

mynodetoken位于:/var/lib/rancher/k3s/server/node-token
https://myserver:6443 为服务器地址端口均为6443,需要保证端口通畅

备注

如果启动不起来,需要将docker的配置文件(/etc/docker/daemon.json)

1
2
3
4
{
"exec-opts": ["native.cgroupdriver=cgroupfs"]
//将docker驱动设置为cgroupfs
}

K1043a33bc36fdeaea1ab374da4e9747a28d53b77452e61a134ba2b0a7fde9ef22e::server:885bf488d1d72400ed8101df3db1f0f5

前言

今天遇到一个很有意思的提问,有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转换为他的实际类型。

本文关于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 系列的项目内接触到的。仅做记录。