23. 【.NET 8 实战--孢子记账--从单体到微服务】--记账模块--预算
在每个月发工资后很多人会对未来一个月的花销进行大致的计划,这个行为叫做预算。那么在这篇文章中我们将一起开发预算服务。
一、需求
预算需求就是简单的增删改查,虽然比较简单,但是也有几点需要注意。
编号 | 需求 | 说明 |
---|---|---|
1 | 新增预算 | 1. 针对每种支出类型设置预算;2. 每个用户每种支出类型只能有一条预算 |
2 | 删除预算 | |
3 | 修改预算 | 1. 不能修改预算的支出类型 |
4 | 查询预算 | |
5 | 预算周期设置 | 1. 用户可设置预算的周期,按照年、季度、月设置;2. 设置预算的适用范围 |
根据上面的分析,我们可以得出预算表Budget
的核心字段:支出类型的Id、预算金额、预算周期、预算开始时间、预算结束时间。这里要着重说一下为什么有了预算的周期还要有预算的开始时间和结束时间。这是因为用户在设置预算的时候有可能设置的是未来某个时间段内的预算。
二、功能编写
下面我们以新增预算为例,来看一下如何实现新增预算的功能呢。
2.1 编写数据库映射类
根据前面分析的结果,我们编写出了数据库预算表的映射类Budget
:
using System.ComponentModel.DataAnnotations;
using SporeAccounting.BaseModels;
using System.ComponentModel.DataAnnotations.Schema;namespace SporeAccounting.Models;/// <summary>
/// 预算表
/// </summary>
[Table(name: "Budget")]
public class Budget : BaseModel
{/// <summary>/// 收支类型/// </summary>[Required][Column(TypeName = "nvarchar(36)")]public string IncomeExpenditureClassificationId { get; set; }/// <summary>/// 预算金额/// </summary>[Required][Column(TypeName = "decimal(18,2)")]public decimal Amount { get; set; }/// <summary>/// 预算周期/// </summary>[Column(TypeName = "int")][Required]public PeriodEnum Period { get; set; }/// <summary>/// 剩余预算/// </summary>[Required][Column(TypeName = "decimal(18,2)")]public decimal Remaining { get; set; }/// <summary>/// 备注/// </summary>[MaxLength(200)]public string? Remark { get; set; }/// <summary>/// 开始时间/// </summary>[Required][Column(TypeName = "datetime")]public DateTime StartTime { get; set; }/// <summary>/// 结束时间/// </summary>[Required][Column(TypeName = "datetime")]public DateTime EndTime { get; set; }/// <summary>/// 用户Id/// </summary>[Required][Column(TypeName = "nvarchar(36)")][ForeignKey("FK_Budget_SysUser")]public string UserId { get; set; }/// <summary>/// 导航属性/// </summary>public SysUser SysUser { get; set; }/// <summary>/// 导航属性/// </summary>public IncomeExpenditureClassification Classification { get; set; }= new IncomeExpenditureClassification();
}
Budget
类我就不做过多的讲解了,大家在编写玩Budget
类后一定要记得将这个类添加到数据库连接上下文类SporeAccountingDBContext
中,然后执行数据库迁移命令。
2.2 编写Server服务
我们在Server文件夹下的Interface文件夹中新建预算Server接口IBudgetServer
,在这个接口中增加新增预算的方法Add
,以及判断当前用户是否存在指定支出类型预算的方法IsExistByClassificationId
,代码如下“
using SporeAccounting.Models;namespace SporeAccounting.Server.Interface;/// <summary>
/// 预算服务
/// </summary>
public interface IBudgetServer
{/// <summary>/// 添加预算/// </summary>/// <param name="budget"></param>void Add(Budget budget);/// <summary>/// 用户是否存在该类型预算/// </summary>/// <param name="classificationId"></param>/// <param name="userId"></param>/// <returns></returns>bool IsExistByClassificationId(string classificationId, string userId);
}
接着,我们实现IBudgetServer
接口,在Server文件夹下创建实现类BudgetImp
,代码如下:
using SporeAccounting.Models;
using SporeAccounting.Server.Interface;namespace SporeAccounting.Server;/// <summary>
/// 预算服务
/// </summary>
public class BudgetImp : IBudgetServer
{/// <summary>/// 数据库上下文/// </summary>private readonly SporeAccountingDBContext _sporeAccountingDbContext;/// <summary>/// 构造函数/// </summary>/// <param name="sporeAccountingDbContext"></param>public BudgetImp(SporeAccountingDBContext sporeAccountingDbContext){_sporeAccountingDbContext = sporeAccountingDbContext;}/// <summary>/// 添加预算/// </summary>/// <param name="budget"></param>public void Add(Budget budget){try{_sporeAccountingDbContext.Budgets.Add(budget);_sporeAccountingDbContext.SaveChanges();}catch (Exception e){throw;}}/// <summary>/// 用户是否存在该类型预算/// </summary>/// <param name="classificationId"></param>/// <param name="userId"></param>/// <returns></returns>public bool IsExistByClassificationId(string classificationId, string userId){try{return _sporeAccountingDbContext.Budgets.Any(b =>b.IncomeExpenditureClassificationId == classificationId && b.UserId == userId);}catch (Exception e){throw;}}
}
类中的Add
方法用于将一个Budget
对象添加到数据库中。该方法调用了数据库上下文的Budgets.Add
方法将预算对象添加到数据库的追踪列表中,然后通过SaveChanges
方法将更改保存到数据库中。IsExistByClassificationId
方法的作用是判断某个用户是否已经存在特定分类的预算记录。它接受两个参数:预算分类的IDclassificationId
和用户IDuserId
,通过_sporeAccountingDbContext.Budgets.Any
方法执行数据库查询,返回布尔值。
Server编写完成后别忘了将Budget服务注入到我们的项目中。
2.3 编写新增预算服务接口
最后,我们来编写新增预算的服务接口。我们需要先定义新增预算的视图模型,这个视图模型不需要预算Id,其他的和Budget
类一样。
using System.ComponentModel.DataAnnotations;namespace SporeAccounting.Models.ViewModels;/// <summary>
/// 预算添加视图模型
/// </summary>
public class BudgetAddViewModel
{/// <summary>/// 预算金额/// </summary>[Required(ErrorMessage = "预算金额不能为空")]public decimal Amount { get; set; }/// <summary>/// 周期/// </summary>[Required(ErrorMessage = "周期不能为空")]public PeriodEnum Period { get; set; }/// <summary>/// 开始时间/// </summary>[Required(ErrorMessage = "开始时间不能为空")]public DateTime StartTime { get; set; }/// <summary>/// 结束时间/// </summary>[Required(ErrorMessage = "结束时间不能为空")]public DateTime EndTime { get; set; }/// <summary>/// 收支分类/// </summary>[Required(ErrorMessage = "收支分类不能为空")]public string ClassificationId { get; set; }/// <summary>/// 备注/// </summary>[MaxLength(200)]public string? Remark { get; set; }
}
接着,我们新建BudgetController
,并在增加Add
Action。代码如下:
using System.Net;
using AutoMapper;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using SporeAccounting.BaseModels;
using SporeAccounting.Models;
using SporeAccounting.Models.ViewModels;
using SporeAccounting.Server.Interface;namespace SporeAccounting.Controllers
{/// <summary>/// 预算控制器/// </summary>[Route("api/[controller]")][ApiController]public class BudgetController : BaseController{/// <summary>/// 预算服务/// </summary>private IBudgetServer _budgetServer;private IMapper _mapper;/// <summary>/// 构造函数/// </summary>/// <param name="budgetServer"></param>/// <param name="mapper"></param>public BudgetController(IBudgetServer budgetServer, IMapper mapper){_budgetServer = budgetServer;_mapper = mapper;}/// <summary>/// 添加预算/// </summary>/// <param name="budget"></param>/// <returns></returns>[HttpPost][Route("Add")]public ActionResult<ResponseData<bool>> Add([FromBody] BudgetAddViewModel budget){try{string userId = GetUserId();// 用户是否存在该类型预算bool isExist = _budgetServer.IsExistByClassificationId(budget.ClassificationId, userId);if (isExist){return Ok(new ResponseData<bool>(HttpStatusCode.Found, "用户已存在该类型预算", false));}Budget budgetDb = _mapper.Map<Budget>(budget);budgetDb.UserId = userId;budgetDb.CreateDateTime = DateTime.Now;_budgetServer.Add(budgetDb);return Ok(new ResponseData<bool>(HttpStatusCode.OK, "添加成功", true));}catch (Exception e){return Ok(new ResponseData<bool>(HttpStatusCode.InternalServerError, "添加失败", false));}}}
}
这段代码通过_budgetServer.IsExistByClassificationId
调用检查该用户是否已经存在相同分类的预算。如果存在,方法立即返回一个状态码为HttpStatusCode.Found
的响应,并提示用户预算已存在,同时返回false
以指示操作失败。如果预算不存在,代码通过_mapper.Map<Budget>(budget)
将前端传递的BudgetAddViewModel
对象映射为Budget
实体对象。这种映射通常通过AutoMapper等工具完成,简化了DTO(数据传输对象)与实体之间的转换。随后,给新预算实体赋值当前用户的ID以及创建时间,确保数据完整性。在完成数据准备后,调用_budgetServer.Add
方法将预算添加到数据库中。
在使用_mapper.Map<Budget>(budget)
进行数据转换时我们需要先在SporeAccountingProfile
类中配置好转换关系,这里就不多讲了,不清楚的同学请参考专栏一开始的几篇文章,或者上AutoMapper官网学习。
三、总结
这篇文章我们一起编写的预算服务的新增功能,剩余的功能大家自己动手实现,然后下载我的代码来对比一下哪里不一样。
下一篇文章,我们将结合预算和记账功能来完成一个稍微复杂的业务:预算的回退和扣除。
相关文章:
23. 【.NET 8 实战--孢子记账--从单体到微服务】--记账模块--预算
在每个月发工资后很多人会对未来一个月的花销进行大致的计划,这个行为叫做预算。那么在这篇文章中我们将一起开发预算服务。 一、需求 预算需求就是简单的增删改查,虽然比较简单,但是也有几点需要注意。 编号需求说明1新增预算1. 针对每种…...
DOS攻击的原理和实现 (网络安全)hping3和Slowloris的运用
DoS攻击的原理和实现 DoS攻击(Denial of Service Attack,拒绝服务攻击)是指通过恶意手段使目标服务器、服务或网络资源无法正常提供服务,从而影响正常用户的访问。DoS攻击通常通过消耗目标系统的资源(如带宽、内存、处…...
十三、Vue 过渡和动画
文章目录 一、Vue过渡和动画概述1. 过渡的基本原理2. 动画的基本原理二、使用 CSS 过渡1. 单元素过渡2. 过渡模式in - out 模式out - in 模式三、使用 CSS 动画1. 单元素动画2. 动画结合过渡四、JavaScript 钩子函数实现过渡和动画1. 基本概念2. 示例五、列表过渡1. 基本原理2.…...
Dubbo 关键知识点解析:负载均衡、容错、代理及相关框架对比
1.Dubbo 负载均衡策略? Dubbo 是一个分布式服务框架,它提供了多种负载均衡策略来分发服务调用。在 Dubbo 中,负载均衡的实现是基于客户端的,即由服务消费者(Consumer)端决定如何选择服务提供者(…...
仿生的群体智能算法总结之三(十种)
群体智能算法是一类通过模拟自然界中的群体行为来解决复杂优化问题的方法。以下是30种常见的群体智能算法,本文汇总第21-30种。接上文 : 编号 算法名称(英文) 算法名称(中文) 年份 作者 1 Ant Colony Optimization (ACO) 蚁群优化算法 1991 Marco Dorigo 2 Particle Swar…...
《量子比特大阅兵:不同类型量子比特在人工智能领域的优劣势剖析》
在科技的前沿,量子比特与人工智能的融合正开启一扇全新的大门。不同类型的量子比特,如超导、离子阱、光量子等,在与人工智能结合时展现出独特的优势与劣势。 超导量子比特 超导量子比特是目前应用较为广泛且研究相对成熟的量子比特类型。它…...
el-input输入框需要支持多输入,最后传输给后台的字段值以逗号分割
需求:一个输入框字段需要支持多次输入,最后传输给后台的字段值以逗号分割 解决方案:结合了el-tag组件的动态编辑标签 那块的代码 //子组件 <template><div class"input-multiple-box" idinputMultipleBox><div>…...
机器人领域的一些仿真器
模拟工具和环境对于开发、测试和验证可变形物体操作策略至关重要。这些工具提供了一个受控的虚拟环境,用于评估各种算法和模型的性能,并生成用于训练和测试数据驱动模型的合成数据。 Bullet Physics Library 用于可变形物体模拟的一个流行的物理引擎是 B…...
前端-动画库Lottie 3分钟学会使用
目录 1. Lottie地址 2. 使用html实操 3. 也可以选择其他的语言 1. Lottie地址 LottieFiles: Download Free lightweight animations for website & apps.Effortlessly bring the smallest, free, ready-to-use motion graphics for the web, app, social, and designs.…...
腾讯云智能结构化 OCR:驱动多行业数字化转型的核心引擎
在当今数字化时代的汹涌浪潮中,数据已跃升为企业发展的关键要素,其高效、精准的处理成为企业在激烈市场竞争中脱颖而出的核心竞争力。腾讯云智能结构化 OCR 技术凭借其前沿的科技架构与卓越的功能特性,宛如一颗璀璨的明星,在交通、…...
【开源免费】基于SpringBoot+Vue.JS精品在线试题库系统(JAVA毕业设计)
本文项目编号 T 115 ,文末自助获取源码 \color{red}{T115,文末自助获取源码} T115,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
c# CodeFirst生成表字段加注释
前置:ORM框架工具使用的FreeSql 背景:开发环境中运行接口,所有的表字段以及备注会自动加上,但是在测试环境时运行就只生成了表,没有把每个字段的注释加上 问题检查: FreeSql CodeFirst 支持将 c# 代码内的注…...
MySQL8.0复制原理和部署配置步骤
1. mysql 主从复制原理 在从库上执行change master to;会将主库的信息保存到从库中的master.info文件中在从库执行start slave;开启io_thread, sql_thread线程;io_thread工作;io_thread通过master.info文件中主库的连接信息去连接主库;连接成…...
Unity热更新文件修改后缀并拷贝到指定路径的工具类
最近在学习Hybrid热更新。每次编译完,需要修改后缀名和拷贝到特定路径覆盖旧文件,就叫AI写了个工具类。现在记录一下,毕竟ai写完还需要修改。 代码如下,放到Assets/Editor/路径下即可。 可根据需求自行改变路径和文件名。 using…...
前端vue+el-input实现输入框中文字高亮标红效果(学习自掘金博主文章)
学习自掘金文章https://juejin.cn/post/7295169886177918985 该博主的代码基于原生textarea控件和js实现,基于该博主的代码和思路,在vue下实现了相应功能 思路 生成html字符串来实现文字高亮标红效果,但是input输入控件不能渲染html字符串…...
SAP系统中的标准价、移动平均价是什么?有何区别?物料分类账的优点
文章目录 前言一、SAP系统中的价格控制二、移动平均价、标准价是什么?三、S价(标准价)的优势四、S价(标准价)的劣势五、V价(移动平均价)的优势六、V价(移动平均价)的劣势…...
通往O1开源之路
“Scaling of Search and Learning: A Roadmap to Reproduce o1 from Reinforcement Learning Perspective”由复旦大学和上海人工智能实验室的研究者撰写。该论文从强化学习视角出发,深入分析了实现类似OpenAI o1模型性能的路线图,聚焦于策略初始化、奖…...
【QT】实现RestFul接口
在这个教程中,我们将介绍如何在 Qt 中使用 QHttpServer 类来创建一个简单的 HTTP 服务器。QHttpServer 是 Qt 6 引入的新类,用于提供 HTTP 服务。这个类非常适合快速开发restful接口。 准备工作 确保你的 Qt 版本是 Qt 6 或更高版本,因为 Q…...
ARP攻击的原理和实现 (网络安全)
ARP攻击的原理和实现 ARP(Address Resolution Protocol,地址解析协议)是一种网络协议,用于在局域网内将IP地址映射到MAC地址。在以太网中,设备通过广播ARP请求来查询目标IP地址对应的MAC地址,从而建立通信…...
大脑特训,自信 “满格”
编辑:念小艺 在追求自信的漫漫长路上,诸多因素如同闪耀的星光,为人们指引着方向。保持良好的饮食习惯,让身体摄取充足且均衡的营养,为精神的饱满提供坚实后盾;持续投身于锻炼之中,在挥洒汗水的…...
如何备份和恢复 PostgreSQL 数据库 ?
对于数据库管理员和开发人员来说,在 PostgreSQL 中创建数据库副本是一项至关重要的任务。此过程对于测试、备份、数据分析等都是必不可少的。在本指南中,我们将深入研究创建 PostgreSQL 数据库副本的步骤,以确保数据完整性和系统性能。 必要…...
逆向入门(6)汇编篇-外挂初体验
代码分析部分 游戏里面还是体验了不少自己CV来的外挂的,自己编写的程序还是头一次体验,程序源码如下 void startAcctack() {printf("开始攻击\n");// 获取当前系统时间time_t now time(0); // 获取当前时间的时间戳struct tm *local_time …...
HTML——77.网页编码及乱码处理
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>网页编码及乱码处理</title></head><body><!--网页编码:指网页中特定的字符编码,通过解析编码成为我们知道的文字--><!-…...
(leetcode算法题)382. 链表随机节点
如果给你一个 智能记录 k行内容的小笔记本,从一本你也不知道有多少行的 C Primer 中进行摘抄,你应该怎么做才能让抄写的时候能让书中的每一行都等概率的出现在小笔记本中? 答:准备好一个公平的轮盘和一个巨大的摇奖机,…...
Git 如何在IDEA中进行使用
1. 2. 3....
【Pytorch报错】AttributeError: cannot assign module before Module.__init__() call
代码: import torch.nn as nnclass Model(nn.Module):def __init__(self, input_dim, output_dim):self.linear nn.Linear(input_dim, output_dim) def forward(self, x):out self.linear(x)return outmodel Model(1, 1)报错: --------------------…...
深入理解计算机系统—虚拟内存(一)
一个系统中的进程是与其他进程共享 CPU 和主存资源的。然而,共享主存会形成特殊的挑战。随着对 CPU 需求的增长,进程以某种合理的平滑方式慢了下来。但是如果太多的进程需要太多的内存,那么它们中的一些就根本无法运行。 为了更加有效地管理内…...
[Qt] 输入控件 | Line | Text | Combo | Spin | Date | Dial | Slider
目录 输入类控件 1、Line Edit 录入个人信息 使用正则表达式验证输入框的数据 验证两次输入的密码一致 切换显示密码 2、Text Edit 获取多行输入框的内容 验证输入框的各种信号 3、Combo Box 使用下拉框模拟麦当劳点餐 从文件中加载下拉框的选项 4、Spin Box 调整…...
【信息系统项目管理师】高分论文:论信息系统项目的风险管理(数字化联合审查管理系统)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文一、全盘考虑,编制项目风险管理计划二、务实高效,做好项目的风险识别三、客观严谨,进行定性风险分析四、客观严谨,进行定量风险分析五、未雨绸缪,做好规划风险应对六、控制执行,实施风险应对七、做好…...
设计模式 结构型 外观模式(Facade Pattern)与 常见技术框架应用 解析
外观模式(Facade Pattern)是一种结构型设计模式,它的核心思想是将一个复杂的子系统封装在一个外观类中,为子系统提供一个统一的接口。通过这个接口,客户端可以简化对子系统的访问,而无需直接与子系统中的各…...
《learn_the_architecture_-_generic_interrupt_controller_v3_and_v4__lpisn》学习笔记
1.LPI(Locality-specific Peripheral Interrupts)是一种基于消息的中断(Message Signaled Interrupt,MSI),由中断翻译服务(ITS)提供翻译。这是因为LPI的设计目标是为系统中大量的设备提供高效的中断管理&am…...
java 常量池详解
目录 java 常量池详解一 静态常量池(Static Constant Pool)1.1 概述1.2 存储内容1.3 特点1.4 示例 二 运行时常量池(Runtime Constant Pool)2.1 概述2.2 存储内容2.3 特点2.4 示例 三 基础类型常量池(Primitive Type C…...
aardio —— 虚表 —— 模拟属性框
写了个简单的属性框例程,抛砖引玉,期待你做出更丰富强大的功能。 可折叠行、可输入文本、可下拉选择、支持下拉选择图片、颜色等功能。 只有想不到,没有做不到,发挥你的想象力吧。 import win.ui; import godking.comboboxEx im…...
企业微信——智能表格学习
智能表格 应用限制条件 获取 token https://developer.work.weixin.qq.com/document/10013#%E5%BC%80%E5%8F%91%E6%AD%A5%E9%AA%A4 开发步骤 你可以通过以下步骤,使用access_token来访问企业微信的接口。需要注意的是,所有的接口需使用Https协议、Js…...
2501d,jingo优化
原文 大家好,我重构和优化了一下jin.go这里: 我去掉了vibe.d依赖,因为它又慢又大,而且我无法与2版本交朋友.当仅运行1000个vibe纤程时,不仅应用崩溃,甚至图形系统驱动也崩溃一次,这需要重启笔记本电脑. 当前,我用小栈大小的本地流(4kb)解决. 我真很期待photon的稳定性,以恢复支…...
实景三维点云处理专业软件ArcGIS根据DSM生成地表点云集
常见的实景三维处理软件及其特色功能如下: 一、专业实景三维建模软件 Agisoft Metashape 高精度建模:能够生成高精度的三维模型,精度可以达到厘米级甚至毫米级,适用于需要详细测量和分析的项目,如文物保护和建筑测量。…...
山东大学人工智能导论期末复习概念汇总
人工智能概念汇总V2 —Nevertheless 简介 [!NOTE] 本文是在原版的基础上,面向期末而进行的删减版本 建议使用pdf版本,排版和图片显示完全。如有需要,可私信发送邮箱地址 PDF版本: 山东大学人工智能导论概念汇总pdf版 山东大学软…...
Ubuntu下安装Android Sdk
下载android sdk命令行工具 https://developer.android.com/studio?hlzh-cn#command-tools mkdir android-sdk cd android-sdk unzip commandlinetools-linux-11076708_latest.zip 添加环境变量到~/.bashrc export ANDROID_HOME$HOME/android-sdk export PATH$PATH:$ANDRO…...
c语言中GHashTable的使用
前言:最近在c代码中需要用到键值对的存储,由于没有map,需要自己实现或者使用库函数,g_hash_table_new是GLib中的库函数,但使用起来会有很多坑,记录一下 构建hash表g_hash_table_new GHashTable* g_hash_table_new(GH…...
Conda清理缓存
参考:1、2...
【每日学点鸿蒙知识】导入cardEmulation、自定义装饰器、CallState状态码顺序、kv配置、签名文件配置
1、HarmonyOS 无法导入cardEmulation? 在工程entry mudule里的index.ets文件里导入cardEmulation失败 可以按照下面方式添加SystemCapability;在src/main/syscap.json(此文件需要手动创建)中添加如下内容 {"devices": {"gen…...
【从零开始入门unity游戏开发之——C#篇42】C#补充知识——随机数(Random)、多种方法实现string字符串拼接、语句的简写
文章目录 一、随机数1、Random.Next()生成随机整数示例:生成一个随机整数生成指定范围内的随机整数 2、Random.NextSingle生成随机浮点数示例:生成随机浮点数 3、 生成随机字母或字符示例:生成随机字母示例:生成随机小写字母 二、…...
深入解析 Conda 安装的默认依赖包及其作用:conda create安装了哪些包(中英双语)
深入解析 Conda 安装的默认依赖包及其作用 当我们使用 Conda 创建新环境时,例如执行命令: conda create -n olmes python3.10Conda 会自动为我们安装一系列基础依赖包,保证 Python 环境能够正常运行。这些包不仅是我们开发的基础工具&#…...
《Vue3实战教程》35:Vue3测试
如果您有疑问,请观看视频教程《Vue3实战教程》 测试 为什么需要测试 自动化测试能够预防无意引入的 bug,并鼓励开发者将应用分解为可测试、可维护的函数、模块、类和组件。这能够帮助你和你的团队更快速、自信地构建复杂的 Vue 应用。与任何应用一…...
Mysql监视器搭建
Mysql监视器搭建 资源下载在:Mysql监视器资源包 查询问题:CPU、连接数、慢查询 --> 暴增 1、exporter进行Mysql信息采集 修改my.cnf [client] userroot password数据库密码 host:数据库URL port3306启动命令 mysqld_exporter.exe --config.my-c…...
Linux(centos)安装 MySQL 8 数据库(图文详细教程)
前言 前几天写了个window系统下安装Mysql的博客,收到很多小伙伴私信需要Linux下安装Mysql的教程,今天这边和大家分享一下,话不多说,看教程。 一、删除以前安装的MySQL服务 一般安装程序第一步都需要清除之前的安装痕迹ÿ…...
软件工程大作业——图书管理系统/图书个性化推荐与实现系统
目录 1 绪论 1.1研究背景 1.2研究现状 1.3研究内容 2 系统关键技术 2.1 Spring Boot框架 2.2 JAVA技术 2.3 MYSQL数据库 2.4 B/S结构 3 系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2经济可行性 3.1.3操作可行性 3.2 系统性能分析 3.3 系统功能分析 3.4系统流程分析 3.4.1登…...
Linux下编译安装PETSc
本文记录在Linux下编译安装PETSc的流程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1oneAPI2024.2.1 一、安装依赖 1.1 安装oneAPI 参见:Get the Intel oneAPI Base Toolkit , Get the Intel oneAPI HPC Toolkit 1.2 安…...
检索增强生成
概述 检索增强生成(Retrieval-Augmented Generation,RAG)是一种将信息检索与语言模型相结合的技术。由Facebook AI Research于2020年提出,它把数据库的优势与语言模型的优势相结合。它能让模型从外部知识库中检索信息,…...
九、Vue 事件处理器
文章目录 前言一、基础事件绑定:v-on 指令二、方法调用:组织有序的交互逻辑三、事件修饰符阻止冒泡与默认事件捕获与自身触发单次触发与鼠标按键区分四、按键修饰符前言 在 Vue.js 的交互世界里,事件处理器起着举足轻重的作用,它让页面从静态展示迈向动态交互,精准捕捉用户…...