From 0db9ee6a980860edb1ec4d4b3ef37fc5ba5cff91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E7=81=BF=E4=BC=9F?= <1445484116@qq.com> Date: Mon, 8 Jun 2026 00:03:57 +0800 Subject: [PATCH 1/2] feat:zy --- ...47\250\213\345\205\245\351\227\250.md.txt" | 73 +++++++++ ...\252WebApi\351\241\271\347\233\256.md.txt" | 70 ++++++++ .../20260604-EFCore\344\270\216SQLite.md.txt" | 60 +++++++ ...47\232\204\350\247\204\350\214\203.md.txt" | 149 ++++++++++++++++++ 4 files changed, 352 insertions(+) create mode 100644 "\351\273\204\347\201\277\344\274\237/20260601-\347\216\257\345\242\203\346\220\255\345\273\272\345\222\214AI\347\274\226\347\250\213\345\205\245\351\227\250.md.txt" create mode 100644 "\351\273\204\347\201\277\344\274\237/20260603-\347\254\254\344\270\200\344\270\252WebApi\351\241\271\347\233\256.md.txt" create mode 100644 "\351\273\204\347\201\277\344\274\237/20260604-EFCore\344\270\216SQLite.md.txt" create mode 100644 "\351\273\204\347\201\277\344\274\237/20260605-CRUD\346\224\271\351\200\240\345\222\214RESTful\347\232\204\350\247\204\350\214\203.md.txt" diff --git "a/\351\273\204\347\201\277\344\274\237/20260601-\347\216\257\345\242\203\346\220\255\345\273\272\345\222\214AI\347\274\226\347\250\213\345\205\245\351\227\250.md.txt" "b/\351\273\204\347\201\277\344\274\237/20260601-\347\216\257\345\242\203\346\220\255\345\273\272\345\222\214AI\347\274\226\347\250\213\345\205\245\351\227\250.md.txt" new file mode 100644 index 0000000..b68a7c1 --- /dev/null +++ "b/\351\273\204\347\201\277\344\274\237/20260601-\347\216\257\345\242\203\346\220\255\345\273\272\345\222\214AI\347\274\226\347\250\213\345\205\245\351\227\250.md.txt" @@ -0,0 +1,73 @@ +WebAPI环境搭建 + AI编程入门 +一、WebAPI 基础认知 +定义:基于HTTP协议的轻量接口服务,用于前后端、系统之间数据交互,无页面、只传数据。 +入门技术栈:Python + FastAPI(轻量、快速、自动生成接口文档,适配AI接口开发) +二、环境搭建(极简步骤) +1. 基础环境安装 +- Python:安装3.9+版本,务必勾选「Add Python to PATH」 +- 验证命令:cmd输入 python --version +- 编辑器:VS Code,安装Python、Code Runner插件 +2. 安装FastAPI运行依赖 +cmd全局安装命令: +pip install fastapi uvicorn +作用:fastapi(接口框架)、uvicorn(本地运行服务器) +三、首个WebAPI项目(可直接运行) +1. 新建项目文件 +新建 main.py,写入核心代码: +from fastapi import FastAPI + +# 实例化接口应用 +app = FastAPI() + +# 根路径GET接口 +@app.get("/") +def root(): + return {"msg": "WebAPI搭建成功"} + +# 自定义测试接口 +@app.get("/api/test") +def test(): + return {"code": 200, "data": "入门成功"} + +2. 运行项目 +终端执行命令: +uvicorn main:app --reload +访问地址: +- 接口首页:http://127.0.0.1:8000 +- 自动接口文档:http://127.0.0.1:8000/docs +--reload:热更新,修改代码无需重启服务(开发必备) +四、WebAPI 核心基础 +- 请求方式:GET(查数据)、POST(提数据/传参数)最常用 +- 接口返回:默认返回JSON格式,前后端通用 +- 调试方式:浏览器直接访问、docs文档在线调试、Postman测试 +五、AI编程入门(极简核心) +1. AI编程核心逻辑 +AI编程 = 清晰需求描述 + 代码生成 + 调试优化,无需手写全部代码,重点在精准提需求。 +2. 新手必备AI编程Prompt模板 +通用模板:技术栈 + 功能需求 + 运行环境 + 输出要求 +示例(WebAPI场景): +使用Python FastAPI编写一个GET接口,路径为/api/hello,接收name参数,返回自定义问候JSON数据,代码简洁带注释。 +3. AI辅助WebAPI开发常用场景 +- 快速生成接口模板(增删改查) +- 批量生成参数校验、数据返回格式 +- 排查代码报错、优化冗余代码 +- 将普通函数快速改造成Web接口 +4. 新手AI编程避坑要点 +- 禁止模糊需求:不说清楚技术栈、功能,代码无法直接运行 +- AI代码必须校验:检查依赖、路径、参数是否匹配本地环境 +- 优先精简代码:新手不使用复杂封装,保证可运行、好理解 +六、综合入门小案例 +AI生成「带参数的WebAPI接口」完整可运行代码: +from fastapi import FastAPI + +app = FastAPI() + +# 带参数GET接口 +@app.get("/api/ai") +def ai_demo(name: str = "AI编程新手"): + return { + "code": 200, + "message": f"{name},WebAPI+AI编程入门成功" + } + +访问:http://127.0.0.1:8000/api/ai?name=同学 \ No newline at end of file diff --git "a/\351\273\204\347\201\277\344\274\237/20260603-\347\254\254\344\270\200\344\270\252WebApi\351\241\271\347\233\256.md.txt" "b/\351\273\204\347\201\277\344\274\237/20260603-\347\254\254\344\270\200\344\270\252WebApi\351\241\271\347\233\256.md.txt" new file mode 100644 index 0000000..5482431 --- /dev/null +++ "b/\351\273\204\347\201\277\344\274\237/20260603-\347\254\254\344\270\200\344\270\252WebApi\351\241\271\347\233\256.md.txt" @@ -0,0 +1,70 @@ +# 第一个 WebAPI 项目(FastAPI) +## 一、前置准备 +1. 已安装 Python 3.9+,配置好环境变量 +2. 执行依赖安装命令: +``` +pip install fastapi uvicorn +``` +3. 新建文件夹,在文件夹内创建 `main.py` 文件 + +## 二、编写代码 +打开 `main.py`,写入以下代码: +```python +from fastapi import FastAPI + +app = FastAPI() + +# 根接口 +@app.get("/") +def home(): + return {"message": "第一个WebAPI项目启动成功"} + +# 测试接口 +@app.get("/api/test") +def test_api(): + return {"code": 200, "data": "接口访问正常"} +``` + +## 三、启动项目 +1. 在 `main.py` 所在文件夹打开终端 +2. 运行启动命令: +``` +uvicorn main:app --reload +``` +3. 终端出现 `Uvicorn running on http://127.0.0.1:8000` 即启动成功 + +## 四、访问接口 +1. 根地址:http://127.0.0.1:8000 +2. 测试接口:http://127.0.0.1:8000/api/test +3. 在线接口文档:http://127.0.0.1:8000/docs + +## 五、常见问题处理 +1. 命令不存在:重新执行依赖安装指令 +2. 端口被占用:更换端口启动 +``` +uvicorn main:app --reload --port 8080 +``` +访问地址端口同步改为 8080 +3. 页面无法打开:检查终端是否在代码所在目录、服务是否正常启动 + +## 六、拓展:带参数接口(可选) +修改代码,新增带参数接口: +```python +from fastapi import FastAPI + +app = FastAPI() + +@app.get("/") +def home(): + return {"message": "第一个WebAPI项目启动成功"} + +@app.get("/api/test") +def test_api(): + return {"code": 200, "data": "接口访问正常"} + +# 带传参接口 +@app.get("/api/hello") +def say_hello(name: str = "访客"): + return {"code": 200, "msg": f"你好,{name}"} +``` +重启服务后访问:http://127.0.0.1:8000/api/hello?name=小明 \ No newline at end of file diff --git "a/\351\273\204\347\201\277\344\274\237/20260604-EFCore\344\270\216SQLite.md.txt" "b/\351\273\204\347\201\277\344\274\237/20260604-EFCore\344\270\216SQLite.md.txt" new file mode 100644 index 0000000..60d763e --- /dev/null +++ "b/\351\273\204\347\201\277\344\274\237/20260604-EFCore\344\270\216SQLite.md.txt" @@ -0,0 +1,60 @@ +# EFCore + SQLite 极简笔记 +## 一、核心概念 +- EFCore:.NET 轻量级 ORM 框架,不用写 SQL,用 C# 操作数据库 +- SQLite:轻量级文件型数据库,无需安装服务,直接生成 .db 文件 + +## 二、安装依赖包 +在项目中安装 2 个 NuGet 包 +- Microsoft.EntityFrameworkCore +- Microsoft.EntityFrameworkCore.Sqlite + +## 三、连接字符串 +appsettings.json +"ConnectionStrings": { + "DefaultConnection": "DataBase=MyDb.db" +} + +## 四、创建实体类 +public class Product +{ + public int Id { get; set; } + public string Name { get; set; } + public decimal Price { get; set; } +} + +## 五、创建 DbContext +public class AppDbContext : DbContext +{ + public DbSet Products { get; set; } + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + optionsBuilder.UseSqlite("DataBase=MyDb.db"); + } +} + +## 六、数据库初始化 +在 Program.cs 或入口处 +using var db = new AppDbContext(); +db.Database.EnsureCreated(); // 不存在则创建数据库 + +## 七、基础增删改查 +// 新增 +db.Products.Add(new Product { Name = "商品1", Price = 10 }); +db.SaveChanges(); + +// 查询 +var list = db.Products.ToList(); + +// 修改 +var item = db.Products.First(); +item.Price = 20; +db.SaveChanges(); + +// 删除 +db.Products.Remove(item); +db.SaveChanges(); + +## 八、特点 +- 无需安装数据库,直接生成 .db 文件 +- 适合桌面应用、小型项目、测试项目 +- 轻量、跨平台、无服务依赖 diff --git "a/\351\273\204\347\201\277\344\274\237/20260605-CRUD\346\224\271\351\200\240\345\222\214RESTful\347\232\204\350\247\204\350\214\203.md.txt" "b/\351\273\204\347\201\277\344\274\237/20260605-CRUD\346\224\271\351\200\240\345\222\214RESTful\347\232\204\350\247\204\350\214\203.md.txt" new file mode 100644 index 0000000..3d99adb --- /dev/null +++ "b/\351\273\204\347\201\277\344\274\237/20260605-CRUD\346\224\271\351\200\240\345\222\214RESTful\347\232\204\350\247\204\350\214\203.md.txt" @@ -0,0 +1,149 @@ +# EFCore+SQLite + WebAPI CRUD 改造 & RESTful 规范 +## 一、RESTful API 基础规范 +### 1. 核心规则 +1. **用HTTP方法区分操作** +- GET:查询(查单条/列表) +- POST:新增数据 +- PUT:全量更新整条数据 +- DELETE:删除数据 +2. **URL使用名词复数**,不出现动词 +- 正确:`/api/products` +- 错误:`/api/getProducts`、`/api/addProduct` +3. **路径传参用ID**:`/api/products/1`(操作指定资源) +4. **统一返回格式**,状态码语义化 +- 200:成功(查询/修改/删除) +- 201:新增成功 +- 404:资源不存在 +- 400:参数错误 + +### 2. 标准路由对照表 +| 功能 | 请求方式 | 路由地址 | +| ---- | ---- | ---- | +| 查询全部商品 | GET | `/api/products` | +| 查询单个商品 | GET | `/api/products/{id}` | +| 新增商品 | POST | `/api/products` | +| 修改商品 | PUT | `/api/products/{id}` | +| 删除商品 | DELETE | `/api/products/{id}` | + +--- + +## 二、CRUD 整体改造思路(EFCore+SQLite + WebAPI) +1. 基于现有**实体类 + DbContext** 不变 +2. 新建控制器 `ProductsController` +3. 按照 RESTful 规则,对应实现 5 组接口 +4. 所有数据操作通过 EFCore 完成,统一异常与返回结果 + +--- + +## 三、完整代码实现 +### 1. 实体类(沿用) +```csharp +public class Product +{ + public int Id { get; set; } + public string Name { get; set; } + public decimal Price { get; set; } +} +``` + +### 2. 数据库上下文(沿用) +```csharp +public class AppDbContext : DbContext +{ + public DbSet Products { get; set; } + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + optionsBuilder.UseSqlite("Data Source=MyDb.db"); + } +} +``` + +### 3. RESTful 标准 CRUD 控制器 +```csharp +[ApiController] +[Route("api/[controller]")] +public class ProductsController : ControllerBase +{ + private readonly AppDbContext _db; + + public ProductsController() + { + _db = new AppDbContext(); + _db.Database.EnsureCreated(); + } + + // 1. 查询全部 GET /api/products + [HttpGet] + public async Task GetAll() + { + var data = await _db.Products.ToListAsync(); + return Ok(data); + } + + // 2. 查询单条 GET /api/products/{id} + [HttpGet("{id}")] + public async Task GetById(int id) + { + var item = await _db.Products.FindAsync(id); + if (item == null) return NotFound(); + return Ok(item); + } + + // 3. 新增 POST /api/products + [HttpPost] + public async Task Create(Product model) + { + _db.Products.Add(model); + await _db.SaveChangesAsync(); + return CreatedAtAction(nameof(GetById), new { id = model.Id }, model); + } + + // 4. 修改 PUT /api/products/{id} + [HttpPut("{id}")] + public async Task Update(int id, Product model) + { + if (id != model.Id) return BadRequest(); + _db.Products.Update(model); + await _db.SaveChangesAsync(); + return NoContent(); + } + + // 5. 删除 DELETE /api/products/{id} + [HttpDelete("{id}")] + public async Task Delete(int id) + { + var item = await _db.Products.FindAsync(id); + if (item == null) return NotFound(); + _db.Products.Remove(item); + await _db.SaveChangesAsync(); + return NoContent(); + } +} +``` + +--- + +## 四、关键改造要点说明 +1. **路由规范** +- 控制器路由固定 `api/[controller]`,自动匹配 `api/products` +- 动作方法不再自定义路由,依靠 `[HttpGet]/[HttpPost]` 区分 + +2. **EFCore 异步写法** +- 统一使用 `ToListAsync`、`FindAsync`、`SaveChangesAsync`,WebAPI 推荐异步操作 + +3. **返回值规范** +- `Ok()`:返回200状态码+数据 +- `NotFound()`:返回404,资源不存在 +- `BadRequest()`:返回400,参数非法 +- `CreatedAtAction()`:新增成功返回201,并附带新资源地址 +- `NoContent()`:修改/删除成功返回204,无返回数据 + +4. **数据库** +- `EnsureCreated()` 启动时自动检测并创建 SQLite 库与表,无需手动执行SQL + +--- + +## 五、测试方式 +1. 启动项目,访问接口文档:`/swagger` +2. 依次测试5个接口,完成完整 CRUD +3. 所有请求严格遵循 **请求方式+路由**,不混用动词路由 \ No newline at end of file -- Gitee From 8494d32289b583da5485710cbb974da450926297 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E7=81=BF=E4=BC=9F?= <1445484116@qq.com> Date: Sun, 14 Jun 2026 20:14:20 +0800 Subject: [PATCH 2/2] feat:zy --- ...50\210\252\345\261\236\346\200\247.md.txt" | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 "\351\273\204\347\201\277\344\274\237/20260608-\344\270\200\345\257\271\345\244\232\345\257\274\350\210\252\345\261\236\346\200\247.md.txt" diff --git "a/\351\273\204\347\201\277\344\274\237/20260608-\344\270\200\345\257\271\345\244\232\345\257\274\350\210\252\345\261\236\346\200\247.md.txt" "b/\351\273\204\347\201\277\344\274\237/20260608-\344\270\200\345\257\271\345\244\232\345\257\274\350\210\252\345\261\236\346\200\247.md.txt" new file mode 100644 index 0000000..5b74f26 --- /dev/null +++ "b/\351\273\204\347\201\277\344\274\237/20260608-\344\270\200\345\257\271\345\244\232\345\257\274\350\210\252\345\261\236\346\200\247.md.txt" @@ -0,0 +1,87 @@ +# WebAPI 一对多导航属性 极简笔记 +## 一、核心概念 +**一对多**:主实体(一) → 子实体(多),通过**外键**关联,导航属性用来在实体间互相查询。 +例:班级(一) ↔ 学生(多) + +## 二、实体定义(EF Core) +### 1. 主实体(一) +```csharp +public class Class +{ + public int Id { get; set; } + public string Name { get; set; } + // 导航属性:一个班级包含多个学生 + public List Students { get; set; } +} +``` + +### 2. 子实体(多) +```csharp +public class Student +{ + public int Id { get; set; } + public string StuName { get; set; } + // 外键 + public int ClassId { get; set; } + // 导航属性:一个学生归属一个班级 + public Class Class { get; set; } +} +``` + +## 三、数据上下文配置 +```csharp +public DbSet Classes { get; set; } +public DbSet Students { get; set; } + +// 可选:显式配置关系(也可依赖EF自动识别) +modelBuilder.Entity() + .HasOne(s => s.Class) + .WithMany(c => c.Students) + .HasForeignKey(s => s.ClassId); +``` + +## 四、WebAPI 控制器查询(重点) +### 1. 查询主表 + 带出所有子数据(Include 关联导航) +```csharp +// 查班级,连带旗下所有学生 +[HttpGet] +public async Task GetClasses() +{ + var data = await _db.Classes + .Include(c => c.Students) // 加载导航属性 + .ToListAsync(); + return Ok(data); +} +``` + +### 2. 查询子表 + 带出主表数据 +```csharp +[HttpGet] +public async Task GetStudents() +{ + var data = await _db.Students + .Include(s => s.Class) + .ToListAsync(); + return Ok(data); +} +``` + +## 五、关键注意点 +1. **必须用 `Include()`**:EF 默认**延迟加载**,不加查不到导航数据。 +2. 循环引用问题:返回JSON时出现**互相嵌套死循环** + - 解决1:实体/属性加 `[JsonIgnore]` 忽略一侧导航 + - 解决2:全局配置禁用循环引用 + ```csharp + builder.Services.AddControllers() + .AddNewtonsoftJson(opt => + { + opt.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; + }); + ``` +3. 新增数据:**先存主表,再存子表**,赋值外键 `ClassId`。 +4. 深层关联:多层导航用 `ThenInclude()`。 + +## 六、常用简写口诀 +- 一对多:**主集合,子单对象** +- 查关联:**必写 Include** +- 循环报错:**忽略引用 / JsonIgnore** \ No newline at end of file -- Gitee