async和await理解

1.“async”用来标记一个方法为异步方法,异步方法体内需结合“await”关键字使用,如果没有await,则该方法等同于一个普通方法。异步方法命名规则通常以Async结尾。

2.“await”关键字只能在异步方法中使用。

3.当在async异步方法中遇到await操作时,await会阻塞该异步方法不继续往下执行,并将该异步方挂起,将控制权转到该异步方法的调用者手中。

4.异步方法的调用者获得控制权之后:

1)如果调用者需要使用异步方法的返回结果,则继续等待异步方法执行完毕,再继续往下执行。

2)如果调用者不关心异步方法的返回结果,则继续往下执行。
5.异步方法什么时候使用新线程
在await之前还是主线程执行,当执行到await调用的方法内部Task时才创建新线程。
https://www.cnblogs.com/chenxf1117/p/13523533.html?utm_source=gold_browser_extension
https://www.cnblogs.com/doforfuture/p/6293926.html

sql的view,procedure,function语法复习

1.创建视图

creat view view_my
as
select *from user

2.创建存储过程(不建议使用,代码分离后,维护麻烦,同时调试也麻烦)

create procedure proc_my
(@id int,@name varchar(20))
as
begin
  ...sql
end

3.创建函数:可以理解为特殊的存储过程,带返回值

a.创建单字段函数
create function func_my
(@id int,@name varchar(20)) 
return int
as
begin
  ...sql
return @id  --必须需带参数
end
b.创建多字段函数
create function func_my
(@id int,@name varchar(20)) 
return @table table(id int,name varchar(20))
as 
begin
...sql
insert into @table ....  --为了填充值返回
return --必须关键字,不需带参数
end

创建函数时定义返回参数,在begin-end内部需要有return

其他如创建约束(不建议使用),
索引的sql

算法基础复习

1.数据结构:带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系。

a)数据的逻辑结构(常见4种):反映数据元素前后间关系的数据结构,而与他们在计算机中的存储位置无关
包括:集合,线性结构,树型结构,图型结构

集合:数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系; 
线性结构:数据结构中的元素存在一对一的相互关系; 
树形结构:数据结构中的元素存在一对多的相互关系; 
图形结构:数据结构中的元素存在多对多的相互关系。 

b)数据的物理结构(存储结构,常见4种):指数据的逻辑结构在计算机存储空间的存放形式
c)按照数据的逻辑结构对其进行简单的分类,包括线性结构和非线性结构两类
常用的存储结构有顺序存储、链式存储、索引存储和哈希存储等
d)注意:一维数组是线性结构,而二/多维数组不是线性结构
f)常用的数据结构:数组,栈,队列,链表,树,图,堆,散列(Hash)

2.算法:解决问题的方法

a)算法往往是针对数据结构的
b)算法的优劣主要从时间复杂度和空间复杂度来考虑
c)时间复杂度:时间针对问题(数据)规模的变化而变化的规律.表示法:O(fx),读Big O,会忽略常数项和低次项。如访问单个元素:数组是的O(1),单链表是O(n).

3.常见排序

微信截图_20200324000119
微信截图_20200323234741
微信截图_20200323235418
记忆法:
选泡插,
快归堆希统计基,
恩方恩老恩一三,
对恩加K恩乘K,
不稳稳稳不稳稳,
不稳不稳稳稳稳

4.如何写算法

a)由简单到复杂
b)由局部到整体
c)由精糙到精细
变更更名,语句合并,边界处理

5.选择排序:现实中人的常见思维,比如按低到高排队,但在程序中不常用,因为复杂度为N^2还不稳。

1.递归:主要是要找到公式和递归的停止点
2.双向冒泡(鸡尾酒):比较次数为原长度的一半,并且两头比较
3.冒泡:
4.约瑟夫环:

基于netcore 3.1的aspnet core发布到Docker

参考:
https://www.cnblogs.com/lonelyxmas/p/10748667.html

https://hub.docker.com/_/microsoft-dotnet-core

https://github.com/dotnet/dotnet-docker/blob/master/samples/aspnetapp/Dockerfile

https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/docker/building-net-docker-images?view=aspnetcore-3.1

1.Docker服务端环境准备

a)docker安装:略
b)拉取aspnet依赖镜像,建议先把镜像仓库改成国内服务商,比较快,这里是使用阿里。

   docker pull mcr.microsoft.com/dotnet/core/aspnet:3.1 
   //(指定tag为3.1版本,可以用其他版本)也可以使用runtime镜像,或者sdk镜像,这里建议使用专用的。https://hub.docker.com/_/microsoft-dotnet-core-aspnet/

微信截图_20200303173726

2.源码准备(手动发布)

a)编写Dockerfile文件:
通过vs项目右键添加Docker支持,会自动创建一个Dockerfile文件及内容,修改文件属性为始终复制并修改里面的内容为以下内容(因为是自己手动发布,而原文件内容是要做持续集成需要编译)

#使用专有镜像及指定netcore版本作为原始依赖镜像
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1

#在容器中的当前操作目录
WORKDIR /web 

#把服务器中的当目录 复制到 容器中的当前操作目录WORKDIR
COPY . ./ 

#暴露容器的端口
EXPOSE 80  

#使用ENTRYPOINT启动容器中的应用(也可以使用CMD,两者有区别)
ENTRYPOINT ["dotnet", "MVCProject3_1.dll"]

b)发布
点击发布到目录中,并上传到linux服务上

3.docker操作

a)创建镜像

cd publish  //进入linux中的源码目录中
docker build -t web1 .  //不要忘记最后一个点号,使用build命令创建镜像,名字为web1,点号表示在当前目录寻找Dockerfile文件。

b)生成容器,并后台运行式启动

docker run -i -t -d -p 5000:80 --name=my-web1 web1 /bin/bash   //使用服务器端口5000映射容器的端口80

c)查看容器运行状态

  docker ps //查看容器是否启动
  docker logs $container_id //查看容器的日志 
  docker exec -it my-web1 /bin/bash  //进入容器查看发布源码

d)访问部署好的容器应用

   curl 192.168.31.51:5000  //5000为docker run指定的服务器端口,映射对应容器的中EXPOSE端口

4.使用nginx作为netcore应用程序的反向代理:80端口

生成容器时注意选项:–link参数

老张的哲学–jwt

1.JWT,JSON Web Token(JWT),作用:保护API
IdentityServer4 默认支持两种类型的 Token,一种是 Reference Token,一种是 JWT Toke
2.有哪些保护方式:
a)非登录状态:自己约定加密,比如支付中常用的md5加密
b)登录状态:session+cookie:常用的方式
c)登录状态:JWT,一切源于HttpContext,重点在于Claim,移动端和SPA(单页面应用)更好。
3.核心知识点:
a)Claim:声明,就是令牌携带的数据,比如:身份证上的姓名,地址,身份证号
b)Bearer:持票人,比如:
c)组成:一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。工
c1)头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等
c2)载荷就是存放有效信息的地方
c3)一个签证信息,这个签证信息由三部分组成