From 0bdcccaf5385c9e76022eea0cecfd045c054f331 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=A3=AE?= <2022969173@qq.com> Date: Wed, 14 Jul 2021 16:00:41 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WebApi.2021-06.21.md" | 17 +- .../WebApi.2021-06.22.md" | 144 ++++++++ .../WebApi.2021-06.24.md" | 104 ++++++ .../WebApi.2021-06.26.md" | 67 ++++ .../WebApi.2021-06.28.md" | 122 +++++++ .../WebApi.2021-06.29.md" | 203 +++++++++++ .../WebApi.2021-07.01.md" | 314 ++++++++++++++++++ .../WebApi.2021-07.03.md" | 180 ++++++++++ .../WebApi.2021-07.05.md" | 33 ++ .../WebApi.2021-07.06.md" | 21 ++ "\351\231\210\346\243\256/imgs/1.png" | Bin 0 -> 19508 bytes "\351\231\210\346\243\256/imgs/3.png" | Bin 0 -> 10619 bytes 12 files changed, 1203 insertions(+), 2 deletions(-) rename "\351\231\210\346\243\256/Vue.2021-06.21.md" => "\351\231\210\346\243\256/WebApi.2021-06.21.md" (82%) create mode 100644 "\351\231\210\346\243\256/WebApi.2021-06.22.md" create mode 100644 "\351\231\210\346\243\256/WebApi.2021-06.24.md" create mode 100644 "\351\231\210\346\243\256/WebApi.2021-06.26.md" create mode 100644 "\351\231\210\346\243\256/WebApi.2021-06.28.md" create mode 100644 "\351\231\210\346\243\256/WebApi.2021-06.29.md" create mode 100644 "\351\231\210\346\243\256/WebApi.2021-07.01.md" create mode 100644 "\351\231\210\346\243\256/WebApi.2021-07.03.md" create mode 100644 "\351\231\210\346\243\256/WebApi.2021-07.05.md" create mode 100644 "\351\231\210\346\243\256/WebApi.2021-07.06.md" create mode 100644 "\351\231\210\346\243\256/imgs/1.png" create mode 100644 "\351\231\210\346\243\256/imgs/3.png" diff --git "a/\351\231\210\346\243\256/Vue.2021-06.21.md" "b/\351\231\210\346\243\256/WebApi.2021-06.21.md" similarity index 82% rename from "\351\231\210\346\243\256/Vue.2021-06.21.md" rename to "\351\231\210\346\243\256/WebApi.2021-06.21.md" index bbe96f3..fd39b97 100644 --- "a/\351\231\210\346\243\256/Vue.2021-06.21.md" +++ "b/\351\231\210\346\243\256/WebApi.2021-06.21.md" @@ -25,9 +25,22 @@ dotnet sln add Api.Domian dotnet restore 命令 还原项目包 + +搭建wqebapi项目连接数据库: +dotnet new sln -n MyTest.Api +dotnet new webapi -n MyTest.Api --no-https +dotnet sln add MyTest.Api .Api +cd MyTest.Api +dotnet add package Microsoft.EntityFrameworkCore +dotnet add package Microsoft.EntityFrameworkCore.SqlServer +dotnet tool install --global dotnet-ef +dotnet add package Microsoft.EntityFrameWorkCore.Design +(定义实体模型、定义数据库上下文,定义连接字符串) +dotnet ef migrations add XXX +dotnet ef database update + ``` -常用命令 -![](./imgs/999.png) + #### 编写批处理文件一键生成框架 diff --git "a/\351\231\210\346\243\256/WebApi.2021-06.22.md" "b/\351\231\210\346\243\256/WebApi.2021-06.22.md" new file mode 100644 index 0000000..268656b --- /dev/null +++ "b/\351\231\210\346\243\256/WebApi.2021-06.22.md" @@ -0,0 +1,144 @@ +### dotnet创建Api项目并实现restfull风格的接口和测试 +``` +在商店下载扩展:c#Extensions ,C#XML ,REST Client + +创建Entity文件夹Users.cs的属性: + + +namespace Mytest.Api.Entity +{ + public class Users{ + public int Id {get;set;} + public string Username {get;set;} + public string PassWord {get;set;} + + } +} + +创建一个新的控制器文件:UsersControllers.cs +using Microsoft.AspNetCore.Mvc; +using Mytest.Api.Entity; +using System.Collections.Generic; +namespace Mytest.Api.Controllers +{ + [ApiController] + [Route("[controller]")] + public class UsersController : ControllerBase + { + public IEnumerable Get() //接口继承 + { + var users=new List + { + new Users{ + Id=1, + Username="dog", + PassWord="113" + + }, + new Users{ + Id=2, + Username="jeck", + PassWord="116" + + },new Users{ + Id=3, + Username="mioke", + PassWord="119" + + }, + }; + return users; + } + [HttpGet("{id}")] + public string get(int id) + { + return string.Format("你的ID是:{0}", id); + } + } + +} + public dynamic Post(dynamic model) + { + + return new + { + Code = 1000, + Data = model, + Msg = "请求成功" + }; + } + [HttpPut("{id}")] + public dynamic Put(int id, dynamic model) + { + + return new + { + Code = 1000, + Data = string.Format("修改的id为:{0}", id), + + Msg = "修改成功" + }; + } + + + [HttpDelete("{id}")] + public dynamic Delete(int id) + { + return new + { + Code = 1000, + Data = string.Format("删除的id为:{0}", id), + + Msg = "删除成功" + }; + + + } + + + + +``` +### 测试下载 REST Client 进行链接测试 +``` +创建一个.http/.rest为后缀的文件进行测试 +### 为一个新的Send Request 点击测试 + +GET https://localhost:5001/WeatherForecast HTTP/1.1 + +### get请求 +GET https://localhost:5001/Users +### +GET https://localhost:5001/Users/60 + +### post请求 +Post https://localhost:5001/Users +Content-Type:application/json +//这里必须空一行 + +{ + "username":"青青草原羊", + "password":"111" +} + +### put请求,用于修改 +PUT https://localhost:5001/Users/12 +Content-Type:application/json + +{ + + "username":"狼堡小灰灰", + "password":"111" +} + +### delete用于删除 +DELETE https://localhost:5001/Users/33 + + +把项目跑起来就可以进行测试了(dotnet run Mytest.Api ) + + + +``` +![](./imgs/3.png) + diff --git "a/\351\231\210\346\243\256/WebApi.2021-06.24.md" "b/\351\231\210\346\243\256/WebApi.2021-06.24.md" new file mode 100644 index 0000000..84551c6 --- /dev/null +++ "b/\351\231\210\346\243\256/WebApi.2021-06.24.md" @@ -0,0 +1,104 @@ +### 使用dotnet连接数据库SQLite +``` +使用Navicat Premium 进行测试,使用SQLite数据库的原因是,它可在.NET Core支持的所有平台上运行. + +新建get查询: + public IEnumerable Get(string cou, int pageIndex=1,int pageSizx=5)//(关键词,分页,页面大小) + { + var users = GetUsers().Where(x=>x.Username.Contains(cou)).Skip((pageIndex-1)*pageSizx).Take(pageSizx); + return users; + + } + public dynamic Get(int id) + { + var user = GetUsers().Where(x=>x.Id==id).FirstOrDefault(); + return new + { + Code = 1000, + Data = user, + Msg = "查询成功" + + }; + } + private IEnumerable GetUsers() + { + var count = 50; + var users = new List(); + for (var i = 1; i <= count; i++) + { + var u = new Users + { + Id =i, + Username = string.Format("猪猪{0}号", i), + PassWord = string.Format("密码{0}号", i), + + }; + users.Add(u); + } + return users; + + + + } + + +``` +### EF Core +``` +安装包dotnet add package Microsoft.EntityFrameworkCore.Sqlite + +新建数据库模型: +新建Databasae文件夹UserDb.cs为数据库上下文: +using Microsoft.EntityFrameworkCore; +using Mytest.Api.Entity; + +namespace Mytest.Api.Db +{ + public class UserDb:DbContext + { + public DbSetUsers{get;set;} + public DbSetUsersRoles{get;set;} + public DbSetRoles{get;set;} + protected override void OnConfiguring(DbContextOptionsBuilder options) + => options.UseSqlite(@"Data Source=C:\blogging.db"); //生成一个数据库文件,拿来测试 + + + } +} + +创建模型类为默认表: + public class Roles + { + public int Id {get;set;} + public int RolesName {get;set;} + public DateTime CreatedTime {get;set;} + public DateTime UpdateTime {get;set;} + } + + public class UserRoles + { + public int Id { get; set; } + public int UserId{ get; set; } + public int RolesId { get; set; } + } + public class Users{ + public int Id {get;set;} + public string Username {get;set;} + public string PassWord {get;set;} + + } + +创建数据库: +dotnet tool install --global dotnet-ef +dotnet add package Microsoft.EntityFrameworkCore.Design +dotnet ef migrations add InitialCreate +dotnet ef database update + +``` +### Rest Client 测试 +``` +### get请求,用于列出指定的用户 +GET https://localhost:5001/Users?pageIndex=1&pageSize=5&cou=1 +### get请求,用于查找id +GET https://localhost:5001/Users/22 +``` \ No newline at end of file diff --git "a/\351\231\210\346\243\256/WebApi.2021-06.26.md" "b/\351\231\210\346\243\256/WebApi.2021-06.26.md" new file mode 100644 index 0000000..b213a8a --- /dev/null +++ "b/\351\231\210\346\243\256/WebApi.2021-06.26.md" @@ -0,0 +1,67 @@ +### sqlite生成User表数据,和注入依赖 +``` +开始前的准备: +dotnet restore +dotnet tool install --global dotnet-ef +dotnet ef database update + +UsersControllers.cs: +using Mytest.Api.Db;//引入数据库上下文 + + +为User创建默认数据表: + +public class UsersController : ControllerBase + { + private UserDb _db; + + + public UsersController(UserDb db) + { + _db=db; + } + public IEnumerable Get(string cou, int pageIndex=1,int pageSizx=5) + { + _db.Users.Add(new Users + { + Username="admin", + PassWord="113" + + }); + _db.AddRange( new List + { + new Users + { + Username="111", + PassWord="111" + }, + new Users + { + Username="333", + PassWord="333" + }, + new Users + { + Username="222", + PassWord="222" + }, + }); + _db.SaveChanges(); + var users = GetUsers().Where(x=>x.Username.Contains(cou)).Skip((pageIndex-1)*pageSizx).Take(pageSizx); + return users; + + } +当项目跑起来运行:GET https://localhost:5001/Users 返回表数据 +然后进行dotnet ef database update 数据更新 + +依赖注入:在Startup.cd下 + public void ConfigureServices(IServiceCollection services) + { + services.AddScoped(); + services.AddControllers(); + } + //这个方法将在程序运行时调用,方法将服务添加到容器 + +``` ++ 理解依赖注入:https://www.cnblogs.com/jesse2013/p/di-in-aspnetcore.html ++ 官方版本:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-5.0 diff --git "a/\351\231\210\346\243\256/WebApi.2021-06.28.md" "b/\351\231\210\346\243\256/WebApi.2021-06.28.md" new file mode 100644 index 0000000..3f847de --- /dev/null +++ "b/\351\231\210\346\243\256/WebApi.2021-06.28.md" @@ -0,0 +1,122 @@ +### 使用sqlserver数据库进行表生成和创建组外键关系 +``` +新建解决方法和Api: +dotnet new sln +dotnet new webapi -n Myapp-Api --no-https +dotnet sln add Myapp-Api + + +安装ef core 包: +dotnet tool install --global dotnet-ef +dotnet add package Microsoft.EntityFrameworkCore.Design +dotnet ef migrations add 数据迁移 +dotnet ef database update //数据更新 + +安装SQL server依赖包: +dotnet add package Microsoft.EntityFrameworkCore.SqlServer +dotnet add package Microsoft.EntityFrameworkCore + + +添加连接字符串 +在appsettings.json文件添加连接信息 +"ConnectionStrings": + { + "SqlServerConnection":"Server=.;Database=ApiTest;uid=sa;pwd=123456;" + } + +Startup.cs添加: + public void ConfigureServices(IServiceCollection services) + { + var sqlConnection = Configuration.GetConnectionString("SqlServerConnection"); + + services.AddDbContext(option => option.UseSqlServer(sqlConnection)); + services.AddControllers(); + + } + + + dotnet ef database drop //删库跑路 + dotnet ef migrations remove //删除迁移 + dotnet ef migrations add ... //添加迁移 + dotnet ef database update //关系数据 + + +``` +### 数据库模型类 +``` +新建数据库模型: +新建Databasae文件夹MyappDb.cs为数据库上下文: +using Microsoft.EntityFrameworkCore; +using Mytest.Api.Entity; + +namespace Myapp.Api.DataBase +{ + public class MyappDb : DbContext + { + public MyappDb(DbContextOptions options) : base(options) + { + + } + public DbSet Users { get; set; } + public DbSet Roles { get; set; } + public DbSet UserRoels { get; set; } + + protected override void OnConfiguring(DbContextOptionsBuilder options) + { + options.UseSqlServer(@"server=.;database=PPP;uid=sa;pwd=123456;"); + } + + } + + +} + +创建模型类: +新建一個抽象类:BaseEntity.cs +using System; +namespace Myapp.Api.Entity +{ + public abstract class BaseEntity + { + public int Id{get;set;} + public bool IsActived { get; set; } + public bool IsDeleted { get; set; } + public DateTime CreatedTime { get; set; } + public DateTime DeleteTime { get; set; } + public int DisplayDrder { get; set; } + public String Remarks { get; set; } + } + +} + + public class Roles:BaseEntity + { + public string RoelsName{get;set;} + public virtual IEnumerable UserRoles { get; set; } + } + + + + public class UserRoels:BaseEntity + { + public int UserId { get; set; } + public int RoleId { get; set; } + + public virtual Users User { get; set; } + public virtual Roles Roel { get; set; } + } + + + + + + + public class Users :BaseEntity + { + public string Username { get; set; } + public string Password { get; set; } + + public virtual IEnumerable UserRoels { get; set; } + } + +``` \ No newline at end of file diff --git "a/\351\231\210\346\243\256/WebApi.2021-06.29.md" "b/\351\231\210\346\243\256/WebApi.2021-06.29.md" new file mode 100644 index 0000000..d65927b --- /dev/null +++ "b/\351\231\210\346\243\256/WebApi.2021-06.29.md" @@ -0,0 +1,203 @@ +### 数据库的增删改查(CRUD) +``` +新建文件夹:IResop +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Myapp.Api.Entity; +namespace Myapp.Api.IResop +{ + //定义一个接口,用来实体类型的CRUD操作 + public interface IResopwhere T:BaseEntity + { + IQueryableTable {get;} + + T GetById(object id); + void Insert(T entity); + Task InsertAsync(T entity); + void InsertBulk(IEnumerableentities); + Task InsertBulkAsync(IEnumerableentities); + void Delete(int id); + void DeleteBulk(IEnumerableids); + void Update(T entity); + void UpdateBulk(IEnumerableentities); + + + } +} + + + + + +``` +#### 新建一个IRoesops.cs +``` +用来封装CRUD方法: + + + +using Myapp.Api.Entity; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Myapp.Api.DataBase; +using Microsoft.EntityFrameworkCore; +using System; +using Myapp.Api.IResop; + +namespace Myapp.Api.IResops +{ + public class IResops :IResop where T : BaseEntity + { + private MyappDb _db; + + public IResops(MyappDb db) + { + _db = db; + } + + + + private DbSet _entity; + + protected DbSet Entity + { + get + { + if (_entity == null) + { + _entity = _db.Set(); + } + return _entity; + } + } + + public IQueryable Table + { + get + { + return Entity.AsQueryable(); + } + } + + public void Delete(int id) + { + var t = Entity.Find(id); + if (t == null) + { + throw new ArgumentNullException(nameof(t)); + } + _db.Remove(t); + _db.SaveChanges(); + } + + void IResop.DeleteBulk(IEnumerable ids) + { + var ii = new List(); + foreach (var item in ids) + { + var tmp = (int)item; + ii.Add(tmp); + } + var ts = Entity.Where(x => ii.Contains(x.Id)).ToList(); + _db.RemoveRange(ts); + _db.SaveChanges(); + } + + public T GetById(object id) + { + return Entity.Find(id); + } + + public void Insert(T entity) + { + if (entity == null) + { + throw new ArgumentNullException(); + } + + entity.IsActived = true; + entity.IsDeleted = false; + entity.CreatedTime = DateTime.Now; + entity.UpdatedTime = DateTime.Now; + entity.DisplayDrder = 0; + + Entity.Add(entity); + _db.SaveChanges(); + } + + public async Task InsertAsync(T entity) + { + if (entity == null) + { + throw new ArgumentNullException(); + } + + entity.IsActived = true; + entity.IsDeleted = false; + entity.CreatedTime = DateTime.Now; + entity.UpdatedTime = DateTime.Now; + entity.DisplayDrder = 0; + + await Entity.AddAsync(entity); + await _db.SaveChangesAsync(); + } + + public void InsertBulk(IEnumerable entities) + { + foreach (var entity in entities) + { + entity.IsActived = true; + entity.IsDeleted = false; + entity.CreatedTime = DateTime.Now; + entity.UpdatedTime = DateTime.Now; + entity.DisplayDrder = 0; + } + Entity.AddRange(entities); + _db.SaveChanges(); + } + + public async Task InsertBulkAsync(IEnumerable entities) + { + foreach (var entity in entities) + { + entity.IsActived = true; + entity.IsDeleted = false; + entity.CreatedTime = DateTime.Now; + entity.UpdatedTime = DateTime.Now; + entity.DisplayDrder = 0; + } + await Entity.AddRangeAsync(entities); + await _db.SaveChangesAsync(); + } + + public void Update(T entity) + { + if (entity == null) + { + throw new ArgumentNullException(nameof(entity)); + } + + entity.UpdatedTime = DateTime.Now; + _db.SaveChanges(); + } + + public void UpdateBulk(IEnumerable entities) + { + foreach (var entity in entities) + { + entity.UpdatedTime = DateTime.Now; + } + + Entity.UpdateRange(entities); + _db.SaveChanges(); + } + + + + + } +} + +``` diff --git "a/\351\231\210\346\243\256/WebApi.2021-07.01.md" "b/\351\231\210\346\243\256/WebApi.2021-07.01.md" new file mode 100644 index 0000000..04388ab --- /dev/null +++ "b/\351\231\210\346\243\256/WebApi.2021-07.01.md" @@ -0,0 +1,314 @@ +### 创建UsersController.cs +``` +代码如下: + +using Microsoft.AspNetCore.Mvc; +using Admin3000.Backend.Api.Repository; +using Admin3000.Backend.Api.Entity; +using System.Linq; +using Admin3000.Backend.Api.Params; + +namespace Admin3000.Backend.Api.Controllers +{ + [ApiController] + [Route("[controller]")] + public class UsersController : ControllerBase + { + private IRepository _usersRepository; + + public UsersController(IRepository usersRepository) + { + _usersRepository=usersRepository; + } + + [HttpGet] + public dynamic Get() + { + var users = _usersRepository.Table.ToList(); + return new + { + Code = 1000, + Data = users, + Msg = "获取用户列表成功^_^" + }; + } + + [HttpGet("{id}")] + public dynamic Get(int id) + { + var user = _usersRepository.GetById(id); + return new + { + Code = 1000, + Data = user, + Msg = "获取指定用户成功^_^" + }; + } + + + [HttpPost] + public dynamic Post(CreateUser newUser) + { + var username = newUser.Username.Trim(); + var password = newUser.Password.Trim(); + + if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password)) + { + return new + { + Code = 104, + Data = "", + Msg = "用户名或密码不能为空" + }; + } + + + var user = new Users + { + Username = newUser.Username, + Password = newUser.Password + }; + + _usersRepository.Insert(user); + return new + { + Code = 1000, + Data = user, + Msg = "创建用户成功^_^" + }; + } + + [HttpPut("{id}")] + public dynamic Put(int id, CreateUser updateUser) + { + var username = updateUser.Username.Trim(); + var password = updateUser.Password.Trim(); + + if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password)) + { + return new + { + Code = 104, + Data = "", + Msg = "用户名或密码不能为空=_=" + }; + + } + + + var user = _usersRepository.GetById(id); + + if (user == null) + { + return new + { + Code = 104, + Data = "", + Msg = "要更新的用户不存在,请确认后重试=_=" + }; + } + + user.Username = updateUser.Username; + user.Password = updateUser.Password; + + _usersRepository.Update(user); + + return new + { + Code = 1000, + Data = "", + Msg = "更新成功" + }; + } + + + [HttpDelete("{id}")] + public dynamic Delete(int id) + { + _usersRepository.Delete(id); + return new + { + Code = 1000, + Data = "", + Msg = "删除用户成功^_^" + }; + } + + } +} +``` + +### 创建Params文件夹 下CreateUser.cs +``` +代码如下: + +namespace Admin3000.Backend.Api.Params +{ + public class CreateUser + { + public string Username { get; set; } + public string Password { get; set; } + } +} +``` + +### EfRepository.cs 代码: +``` +using MyTest.Api.Entity; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using MyTest.Api.Database; +using Microsoft.EntityFrameworkCore; +using System; + +namespace MyTest.Api.Repository +{ + public class EfRepository : IRepository where T : BaseEntity + { + private MyTestDb _db; + + public EfRepository(MyTestDb db) + { + _db = db; + } + + private DbSet _entity; + + protected DbSet Entity + { + get + { + if (_entity == null) + { + _entity = _db.Set(); + } + return _entity; + } + } + + public IQueryable Table + { + get + { + return Entity.AsQueryable(); + } + } + + public void Delete(object id) + { + var t = Entity.Find(id); + if (t == null) + { + throw new ArgumentNullException(nameof(t)); + } + _db.Remove(t); + _db.SaveChanges(); + } + + public void DeleteBulk(IEnumerable ids) + { + var ii = new List(); + foreach (var item in ids) + { + var tmp = (int)item; + ii.Add(tmp); + } + var ts = Entity.Where(x => ii.Contains(x.Id)).ToList(); + _db.RemoveRange(ts); + _db.SaveChanges(); + } + + public T GetById(object id) + { + return Entity.Find(id); + } + + public void Insert(T entity) + { + if (entity == null) + { + throw new ArgumentNullException(); + } + + entity.IsActived = true; + entity.IsDeleted = false; + entity.CreatedTime = DateTime.Now; + entity.UpdatedTime = DateTime.Now; + entity.DisplayOrder = 0; + + Entity.Add(entity); + _db.SaveChanges(); + } + + public async Task InsertAsync(T entity) + { + if (entity == null) + { + throw new ArgumentNullException(); + } + + entity.IsActived = true; + entity.IsDeleted = false; + entity.CreatedTime = DateTime.Now; + entity.UpdatedTime = DateTime.Now; + entity.DisplayOrder = 0; + + await Entity.AddAsync(entity); + await _db.SaveChangesAsync(); + } + + public void InsertBulk(IEnumerable entities) + { + foreach (var entity in entities) + { + entity.IsActived = true; + entity.IsDeleted = false; + entity.CreatedTime = DateTime.Now; + entity.UpdatedTime = DateTime.Now; + entity.DisplayOrder = 0; + } + Entity.AddRange(entities); + _db.SaveChanges(); + } + + public async Task InsertBulkAsync(IEnumerable entities) + { + foreach (var entity in entities) + { + entity.IsActived = true; + entity.IsDeleted = false; + entity.CreatedTime = DateTime.Now; + entity.UpdatedTime = DateTime.Now; + entity.DisplayOrder = 0; + } + await Entity.AddRangeAsync(entities); + await _db.SaveChangesAsync(); + } + + public void Update(T entity) + { + if (entity == null) + { + throw new ArgumentNullException(nameof(entity)); + } + + entity.UpdatedTime = DateTime.Now; + _db.SaveChanges(); + } + + public void UpdateBulk(IEnumerable entities) + { + foreach (var entity in entities) + { + entity.UpdatedTime = DateTime.Now; + } + + Entity.UpdateRange(entities); + _db.SaveChanges(); + } + } +} +``` ++ https://docs.microsoft.com/zh-cn/aspnet/core/data/ef-mvc/crud?view=aspnetcore-5.0 ++ https://www.cnblogs.com/zcqiand/p/14258059.html diff --git "a/\351\231\210\346\243\256/WebApi.2021-07.03.md" "b/\351\231\210\346\243\256/WebApi.2021-07.03.md" new file mode 100644 index 0000000..fe09771 --- /dev/null +++ "b/\351\231\210\346\243\256/WebApi.2021-07.03.md" @@ -0,0 +1,180 @@ +#### 今天复习了C#的基础 +用XMind做了一张思维导图: +![](./imgs/1.png) + +#### 泛型 +``` +泛型就是通过参数化类型来实现在同一份代码上操作多种数据类型,利用“参数化类型”将类型抽象化,从而实现灵活的复用。 + +例子: +using System; + +namespace ConsoleApp +{ + class Program + { + class Test + { + public T obj; + public Test(T obj) + { + this.obj = obj; + } + } + static void Main(string[] args) + { + int obj1 = 2; + var test = new Test(obj1); + Console.WriteLine("int:" + test.obj); + + string obj2 = "hello world"; + var test1 = new Test(obj2); + Console.WriteLine("String:" + test1.obj); + + Console.ReadKey(); + } + } +} + + +输出: +int:2 +String:hello world + + +分析:   + +  1、 Test是一个泛型类。T是要实例化的范型类型。如果T被实例化为int型,那么成员变量obj就是int型的,如果T被实例化为string型,那么obj就是string类型的。 + +  2、 根据不同的类型,上面的程序显示出不同的值。 + + + +泛型集合: + + +namespace Web +{ + public partial class b : System.Web.UI.Page + { + protected void Page_Load(object sender, EventArgs e) + { + ArrayList numbers = new ArrayList(); + numbers.Add(1);//装箱 + numbers.Add(2);//装箱 + + int number = (int)numbers[1];//拆箱 + Label1.Text = number.ToString(); + } + } +} + + +``` +#### 接口 +``` +接口只包含了成员的声明,成员的定义是派生类的责任,接口本身并不实现任何功能,它只是和声明实现该接口的对象订立一个必须实现哪些行为的契约 + +定义一个接口使用 interface 关键字声明: +实例: +using System; + +//声明 +interface IMyInterface +{ + // 接口成员 + void MethodToImplement(); +} + +class InterfaceImplementer : IMyInterface +{ + static void Main() + { + InterfaceImplementer iImp = new InterfaceImplementer(); + iImp.MethodToImplement(); + } + + public void MethodToImplement() + { + Console.WriteLine("MethodToImplement() called."); + } +} + +接口的继承: +实例: +using System; + +interface IParentInterface +{ + void ParentInterfaceMethod(); +} + +interface IMyInterface : IParentInterface +{ + void MethodToImplement(); +} + +class InterfaceImplementer : IMyInterface +{ + static void Main() + { + InterfaceImplementer iImp = new InterfaceImplementer(); + iImp.MethodToImplement(); + iImp.ParentInterfaceMethod(); + } + + public void MethodToImplement() + { + Console.WriteLine("MethodToImplement() called."); + } + + public void ParentInterfaceMethod() + { + Console.WriteLine("ParentInterfaceMethod() called."); + } +} + +``` +#### 类成员 +``` +类的成员的访问级别 +public:声明为公有成员,访问不受限制。公有成员提供了类的外部界面,允许类的使用者从外部进行访问。 +protected:声明为受保护成员,只能访问包含类或从包含类派生的类。受保护成员对于外界是隐藏的。 +internal:声明为内部成员,只能访问当前程序集。 +protected internal:声明为受保护的内部成员,只能访问当前程序集或从包含类派生的类。 +private:声明为私有成员,只有该类中的成员可以访问。如果在声明中没有设置成员的访问修饰符,成员会被默认为private。 + + +例子: +public class People //类名 +{ + private static string name; //字段 + + private string sex;//字段 + + public string Sex //属性 + { + get { return sex; } + set { sex = value; } + } + + public static string Name //属性 + { + get { return People.name; } + set { People.name = value; } + } + + private People(){} //构造函数 + + public static string GetName() // 函数 + { + if (string.IsNullOrEmpty(name)) + { + name = "my name"; + } + return name; + } +} + +``` ++ 附上C#傻瓜式网址:https://www.cnblogs.com/cys168/p/8053945.html diff --git "a/\351\231\210\346\243\256/WebApi.2021-07.05.md" "b/\351\231\210\346\243\256/WebApi.2021-07.05.md" new file mode 100644 index 0000000..ecaa6aa --- /dev/null +++ "b/\351\231\210\346\243\256/WebApi.2021-07.05.md" @@ -0,0 +1,33 @@ +### JWT 令牌 + +JWT结构: + +头部(Header): +>组成:令牌的类型和正在使用的签名算法 + +>签名算法常见的有 HMAC,SHA256 或 RSA;头部也用JSON描述 +例子: { + "alg": "HS256", + "typ": "JWT" + } + + + + +荷载(Payload): + +>有三种类型的claims: ++ registered claims 已注册的; ++ public claims 公开的; ++ private claims 私有的; + +签名(Signature)就是一大长串的编码 +>执行签名前准备信息: ++ 经过编码的头部 ++ 经过编码的负载 ++ 一个秘钥 ++ 在头部中指定的算法 + +附上学习网址: ++ https://www.cnblogs.com/tiger-wang/p/12892383.html ++ https://www.cnblogs.com/7tiny/archive/2019/06/13/11012035.html \ No newline at end of file diff --git "a/\351\231\210\346\243\256/WebApi.2021-07.06.md" "b/\351\231\210\346\243\256/WebApi.2021-07.06.md" new file mode 100644 index 0000000..17954a0 --- /dev/null +++ "b/\351\231\210\346\243\256/WebApi.2021-07.06.md" @@ -0,0 +1,21 @@ + +``` +解决vue/cli安装慢和下载失败的问题 +安装: +npm install -g @vue/cli + +yarn global add @vue/cli //需要配置环境变量 + +转淘宝镜像提高速度: +临时使用:npm --registry https://registry.npm.taobao.org install express +永久使用:npm config set registry https://registry.npm.taobao.org + +取消镜像:npm config set registry https://registry.npmjs.org/ + + +下载cnpm:npm i -g cnpm +cnpm install -g @vue/cli + + + +``` diff --git "a/\351\231\210\346\243\256/imgs/1.png" "b/\351\231\210\346\243\256/imgs/1.png" new file mode 100644 index 0000000000000000000000000000000000000000..718d6351e56c29f28896e0f688af2da592a78928 GIT binary patch literal 19508 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 aJzxS?{$s?q34EIpFur7dvFyT)`~L%e^6S?C literal 0 HcmV?d00001 -- Gitee