当前位置: 首页 > article >正文

C++课设:高效的日程管理系统

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》
创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
专栏介绍:《编程项目实战》

目录

    • 一、C++日程管理系统的时代价值
      • 1. 为什么选择C++开发日程管理系统?
      • 2. 现代日程管理的核心需求
    • 二、系统功能架构全景
      • 1. 核心功能模块设计
      • 2. 数据结构设计思路
    • 三、核心代码实现揭秘
      • 1. Task类的精妙设计
      • 2. ScheduleManager类的系统控制
      • 3. 完整系统源码
    • 四、关键技术难点突破
      • 1. 数据持久化的优雅实现
      • 2. 时间处理的系统级应用
      • 3. 内存管理与异常安全
    • 五、运行效果展示
      • 1.运行效果展示
      • 2. 功能测试案例
    • 六、总结与未来展望
      • 1. 项目成果总结
      • 2. 学习价值与启发

📅 在快节奏的数字化时代,一个高效的日程管理工具就像你的私人助理,帮你合理安排时间、提升工作效率。本文将带你用C++从零开始构建一个功能完备的日程管理系统,深度解析面向对象设计思想在实际项目中的精妙应用。

一、C++日程管理系统的时代价值

在刚刚结束的2024全球C++及系统软件技术大会上,C++之父Bjarne Stroustrup指出,C++在四十余载的技术变迁中不断拓展其应用边界,近年的编程语言排行榜上,C++一骑绝尘超越Java,并在今年六月领先C语言,居编程语言排行榜第二位。这充分说明了C++在现代软件开发中的重要地位。

1. 为什么选择C++开发日程管理系统?

性能优势:C++编译后直接生成机器码,运行效率极高,非常适合开发需要频繁文件读写和数据处理的系统。

跨平台特性:标准C++库具有良好的跨平台兼容性,一次编写,多平台运行。

面向对象特性:支持封装、继承、多态等现代编程思想,代码结构清晰、易于维护。

开发工具支持:**Dev-C++**作为经典的C++开发环境,轻量级且易于上手,特别适合学习和小型项目开发。

2. 现代日程管理的核心需求

根据最新的需求分析研究,一个实用的日程管理系统应该具备:

  • 任务全生命周期管理:从创建到完成的完整追踪
  • 智能时间提醒:避免重要事项遗忘
  • 多维度查询:按日期、优先级、状态等不同维度检索
  • 数据持久化:确保数据安全可靠保存
  • 用户友好界面:简洁直观的操作体验

二、系统功能架构全景

我们的日程管理系统采用经典的三层架构设计,每一层都有其独特的职责和价值:

在这里插入图片描述

1. 核心功能模块设计

基础功能模块

  • 任务管理:新增、编辑、删除、完成任务
  • 时间提醒:智能检测当日待办事项
  • 日期查询:精确定位特定日期的安排

高级功能模块

  • 🚀 优先级管理:四级优先级分类(低、中、高、紧急)
  • 🚀 多时间维度查看:支持按周、按月统计查看
  • 🚀 数据持久化:自动保存到本地文件

2. 数据结构设计思路

我们使用枚举类型定义优先级,类封装任务属性,向量容器管理任务集合,这种设计既保证了代码的可读性,又提供了良好的扩展性。

enum Priority {LOW = 1,     // 低优先级MEDIUM = 2,  // 中等优先级  HIGH = 3,    // 高优先级URGENT = 4   // 紧急优先级
};

三、核心代码实现揭秘

1. Task类的精妙设计

Task类是整个系统的核心数据结构,采用了典型的面向对象封装思想:

class Task {
private:string title;        // 任务标题string description;  // 详细描述string date;         // 日期 (YYYY-MM-DD)string time;         // 时间 (HH:MM)Priority priority;   // 优先级bool completed;      // 完成状态public:// 构造函数 - 支持完整参数初始化Task(string t, string desc, string d, string tm, Priority p) : title(t), description(desc), date(d), time(tm), priority(p), completed(false) {}// 默认构造函数 - 支持空对象创建Task() : title(""), description(""), date(""), time(""), priority(LOW), completed(false) {}// 获取优先级的可读字符串string getPriorityString() const {switch(priority) {case LOW: return "低";case MEDIUM: return "中";case HIGH: return "高";case URGENT: return "紧急";default: return "未知";}}
};

设计亮点

  • 私有成员变量:保护数据安全,防止外部直接修改
  • 公共接口方法:提供标准化的数据访问方式
  • 默认构造函数:支持容器存储和动态创建
  • 类型安全:使用枚举类型避免魔法数字

2. ScheduleManager类的系统控制

ScheduleManager类负责整个系统的业务逻辑控制,体现了单一职责原则

class ScheduleManager {
private:vector<Task> tasks;    // 任务集合string filename;       // 数据文件名public:ScheduleManager() : filename("schedule.txt") {loadFromFile();    // 构造时自动加载数据}~ScheduleManager() {saveToFile();      // 析构时自动保存数据}// 智能时间提醒功能void checkReminders() {time_t now = time(0);struct tm* timeinfo = localtime(&now);char currentDate[20];strftime(currentDate, 20, "%Y-%m-%d", timeinfo);cout << "\n=== 时间提醒 ===" << endl;bool hasReminder = false;for(size_t i = 0; i < tasks.size(); i++) {if(!tasks[i].isCompleted() && tasks[i].getDate() == string(currentDate)) {cout << "\n【提醒】今天有任务: " << tasks[i].getTitle() << " (" << tasks[i].getTime() << ")" << endl;hasReminder = true;}}if(!hasReminder) {cout << "今天没有待办任务。" << endl;}}
};

技术特色

  • RAII设计模式:构造函数加载数据,析构函数保存数据
  • STL容器应用:使用vector动态管理任务集合
  • C标准库时间处理time()strftime()处理系统时间

3. 完整系统源码

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <ctime>
#include <iomanip>using namespace std;// 任务优先级枚举
enum Priority {LOW = 1,MEDIUM = 2,HIGH = 3,URGENT = 4
};// 任务类
class Task {
private:string title;string description;string date;        // 格式: YYYY-MM-DDstring time;        // 格式: HH:MMPriority priority;bool completed;public:// 构造函数Task(string t, string desc, string d, string tm, Priority p) : title(t), description(desc), date(d), time(tm), priority(p), completed(false) {}// 默认构造函数Task() : title(""), description(""), date(""), time(""), priority(LOW), completed(false) {}// Getter方法string getTitle() const { return title; }string getDescription() const { return description; }string getDate() const { return date; }string getTime() const { return time; }Priority getPriority() const { return priority; }bool isCompleted() const { return completed; }// Setter方法void setCompleted(bool status) { completed = status; }// 获取优先级字符串string getPriorityString() const {switch(priority) {case LOW: return "低";case MEDIUM: return "中";case HIGH: return "高";case URGENT: return "紧急";default: return "未知";}}// 获取完整的日期时间字符串string getDateTime() const {return date + " " + time;}// 转换为字符串用于文件保存string toString() const {stringstream ss;ss << title << "|" << description << "|" << date << "|" << time << "|" << priority << "|" << completed;return ss.str();}// 从字符串加载任务void fromString(const string& str) {stringstream ss(str);string item;vector<string> items;while(getline(ss, item, '|')) {items.push_back(item);}if(items.size() >= 6) {title = items[0];description = items[1];date = items[2];time = items[3];priority = (Priority)atoi(items[4].c_str());completed = (items[5] == "1");}}
};// 日程管理系统类
class ScheduleManager {
private:vector<Task> tasks;string filename;public:ScheduleManager() : filename("schedule.txt") {loadFromFile();}~ScheduleManager() {saveToFile();}// 添加新任务void addTask() {string title, description, date, time;int priorityChoice;cout << "\n=== 添加新任务 ===" << endl;cout << "任务标题: ";cin.ignore();getline(cin, title);cout << "任务描述: ";getline(cin, description);cout << "日期 (YYYY-MM-DD): ";getline(cin, date);cout << "时间 (HH:MM): ";getline(cin, time);cout << "优先级 (1-低, 2-中, 3-高, 4-紧急): ";cin >> priorityChoice;if(priorityChoice < 1 || priorityChoice > 4) {priorityChoice = 1;}Task newTask(title, description, date, time, (Priority)priorityChoice);tasks.push_back(newTask);cout << "任务添加成功!" << endl;saveToFile();}// 显示所有任务void displayAllTasks() {cout << "\n=== 所有任务 ===" << endl;if(tasks.empty()) {cout << "暂无任务。" << endl;return;}for(size_t i = 0; i < tasks.size(); i++) {displayTask(i);}}// 按日期查看任务void viewTasksByDate() {string searchDate;cout << "\n请输入日期 (YYYY-MM-DD): ";cin.ignore();getline(cin, searchDate);cout << "\n=== " << searchDate << " 的任务 ===" << endl;bool found = false;for(size_t i = 0; i < tasks.size(); i++) {if(tasks[i].getDate() == searchDate) {displayTask(i);found = true;}}if(!found) {cout << "该日期没有安排任务。" << endl;}}// 按周查看任务void viewTasksByWeek() {string startDate;cout << "\n请输入周起始日期 (YYYY-MM-DD): ";cin.ignore();getline(cin, startDate);cout << "\n=== 从 " << startDate << " 开始的一周任务 ===" << endl;// 简单实现:显示从起始日期开始的7天内的任务for(size_t i = 0; i < tasks.size(); i++) {if(tasks[i].getDate() >= startDate) {displayTask(i);}}}// 按月查看任务void viewTasksByMonth() {string yearMonth;cout << "\n请输入年月 (YYYY-MM): ";cin.ignore();getline(cin, yearMonth);cout << "\n=== " << yearMonth << " 月的任务 ===" << endl;bool found = false;for(size_t i = 0; i < tasks.size(); i++) {if(tasks[i].getDate().substr(0, 7) == yearMonth) {displayTask(i);found = true;}}if(!found) {cout << "该月份没有安排任务。" << endl;}}// 按优先级查看任务void viewTasksByPriority() {cout << "\n=== 按优先级排序的任务 ===" << endl;// 创建任务索引的副本用于排序vector<int> indices;for(size_t i = 0; i < tasks.size(); i++) {indices.push_back(i);}// 按优先级排序(优先级高的在前)for(size_t i = 0; i < indices.size(); i++) {for(size_t j = i + 1; j < indices.size(); j++) {if(tasks[indices[i]].getPriority() < tasks[indices[j]].getPriority()) {swap(indices[i], indices[j]);}}}for(size_t i = 0; i < indices.size(); i++) {displayTask(indices[i]);}}// 完成任务void completeTask() {displayAllTasks();if(tasks.empty()) return;cout << "\n请输入要完成的任务编号: ";int index;cin >> index;if(index >= 1 && index <= (int)tasks.size()) {tasks[index - 1].setCompleted(true);cout << "任务已标记为完成!" << endl;saveToFile();} else {cout << "无效的任务编号!" << endl;}}// 删除任务void deleteTask() {displayAllTasks();if(tasks.empty()) return;cout << "\n请输入要删除的任务编号: ";int index;cin >> index;if(index >= 1 && index <= (int)tasks.size()) {tasks.erase(tasks.begin() + index - 1);cout << "任务已删除!" << endl;saveToFile();} else {cout << "无效的任务编号!" << endl;}}// 时间提醒功能void checkReminders() {time_t now = time(0);struct tm* timeinfo = localtime(&now);char currentDate[20];char currentTime[10];strftime(currentDate, 20, "%Y-%m-%d", timeinfo);strftime(currentTime, 10, "%H:%M", timeinfo);cout << "\n=== 时间提醒 ===" << endl;cout << "当前时间: " << currentDate << " " << currentTime << endl;bool hasReminder = false;for(size_t i = 0; i < tasks.size(); i++) {if(!tasks[i].isCompleted() && tasks[i].getDate() == string(currentDate)) {cout << "\n【提醒】今天有任务: " << tasks[i].getTitle() << " (" << tasks[i].getTime() << ")" << endl;hasReminder = true;}}if(!hasReminder) {cout << "今天没有待办任务。" << endl;}}private:// 显示单个任务void displayTask(int index) {const Task& task = tasks[index];cout << "\n[" << (index + 1) << "] " << task.getTitle() << endl;cout << "    描述: " << task.getDescription() << endl;cout << "    时间: " << task.getDateTime() << endl;cout << "    优先级: " << task.getPriorityString() << endl;cout << "    状态: " << (task.isCompleted() ? "已完成" : "未完成") << endl;cout << "    " << string(50, '-') << endl;}// 保存到文件void saveToFile() {ofstream file(filename.c_str());if(file.is_open()) {for(size_t i = 0; i < tasks.size(); i++) {file << tasks[i].toString() << endl;}file.close();}}// 从文件加载void loadFromFile() {ifstream file(filename.c_str());if(file.is_open()) {string line;while(getline(file, line)) {if(!line.empty()) {Task task;task.fromString(line);tasks.push_back(task);}}file.close();}}
};// 显示主菜单
void showMenu() {cout << "\n" << string(50, '=') << endl;cout << "         日程安排管理系统" << endl;cout << string(50, '=') << endl;cout << "1. 添加新任务" << endl;cout << "2. 查看所有任务" << endl;cout << "3. 按日期查看任务" << endl;cout << "4. 按周查看任务" << endl;cout << "5. 按月查看任务" << endl;cout << "6. 按优先级查看任务" << endl;cout << "7. 完成任务" << endl;cout << "8. 删除任务" << endl;cout << "9. 时间提醒" << endl;cout << "0. 退出程序" << endl;cout << string(50, '=') << endl;cout << "请选择功能 (0-9): ";
}int main() {ScheduleManager scheduler;int choice;cout << "欢迎使用日程安排管理系统!" << endl;while(true) {showMenu();cin >> choice;switch(choice) {case 1:scheduler.addTask();break;case 2:scheduler.displayAllTasks();break;case 3:scheduler.viewTasksByDate();break;case 4:scheduler.viewTasksByWeek();break;case 5:scheduler.viewTasksByMonth();break;case 6:scheduler.viewTasksByPriority();break;case 7:scheduler.completeTask();break;case 8:scheduler.deleteTask();break;case 9:scheduler.checkReminders();break;case 0:cout << "\n感谢使用日程安排管理系统!再见!" << endl;return 0;default:cout << "\n无效选择,请重新输入!" << endl;break;}cout << "\n按回车键继续...";cin.ignore();cin.get();}return 0;
}

四、关键技术难点突破

1. 数据持久化的优雅实现

挑战:如何确保程序关闭后数据不丢失?

解决方案:采用管道分隔符的文本存储格式

// 数据序列化 - 将对象转换为字符串
string toString() const {stringstream ss;ss << title << "|" << description << "|" << date << "|" << time << "|" << priority << "|" << completed;return ss.str();
}// 数据反序列化 - 从字符串恢复对象
void fromString(const string& str) {stringstream ss(str);string item;vector<string> items;while(getline(ss, item, '|')) {items.push_back(item);}if(items.size() >= 6) {title = items[0];description = items[1];date = items[2];time = items[3];priority = (Priority)atoi(items[4].c_str());completed = (items[5] == "1");}
}

技术亮点

  • 使用stringstream进行字符串流处理
  • getline()函数配合自定义分隔符解析数据
  • atoi()函数实现字符串到整数的类型转换

2. 时间处理的系统级应用

挑战:如何获取系统当前时间并格式化?

解决方案:使用C标准库的时间函数

void checkReminders() {time_t now = time(0);                          // 获取当前时间戳struct tm* timeinfo = localtime(&now);         // 转换为本地时间结构char currentDate[20];strftime(currentDate, 20, "%Y-%m-%d", timeinfo);  // 格式化日期// 比较日期字符串进行提醒判断for(size_t i = 0; i < tasks.size(); i++) {if(!tasks[i].isCompleted() && tasks[i].getDate() == string(currentDate)) {// 执行提醒逻辑}}
}

3. 内存管理与异常安全

设计原则:采用RAII(Resource Acquisition Is Initialization)模式

class ScheduleManager {
public:ScheduleManager() : filename("schedule.txt") {loadFromFile();    // 构造时加载数据}~ScheduleManager() {saveToFile();      // 析构时自动保存数据}
};

优势分析

  • 自动化管理:无需手动调用保存函数
  • 异常安全:即使程序异常退出,析构函数仍会执行
  • 简化接口:用户无需关心底层数据操作

五、运行效果展示

1.运行效果展示

欢迎使用日程安排管理系统!==================================================日程安排管理系统
==================================================
1. 添加新任务
2. 查看所有任务
3. 按日期查看任务
4. 按周查看任务
5. 按月查看任务
6. 按优先级查看任务
7. 完成任务
8. 删除任务
9. 时间提醒
0. 退出程序
==================================================
请选择功能 (0-9): 

在这里插入图片描述

2. 功能测试案例

测试案例1:添加任务

=== 添加新任务 ===
任务标题: 完成C++项目报告
任务描述: 编写项目文档和代码说明
日期 (YYYY-MM-DD): 2024-12-25
时间 (HH:MM): 14:30
优先级 (1-低, 2-中, 3-高, 4-紧急): 3
任务添加成功!

在这里插入图片描述

在这里插入图片描述

测试案例2:时间提醒

=== 时间提醒 ===
当前时间: 2025-06-05 13:13
今天没有待办任务。

在这里插入图片描述

六、总结与未来展望

1. 项目成果总结

通过本项目的开发,我们成功实现了:

技术层面

  • 掌握了C++面向对象编程的核心思想
  • 实践了STL容器的实际应用
  • 学会了文件I/O操作和数据持久化
  • 理解了RAII设计模式的优雅之处

功能层面

  • 构建了完整的任务生命周期管理系统
  • 实现了多维度查询智能排序功能
  • 提供了用户友好的控制台交互界面
  • 保证了数据安全的可靠存储

2. 学习价值与启发

本项目充分体现了C++作为一门成熟的语言,在多个领域(嵌入式系统、高性能计算、图形渲染、游戏开发等)依旧占据重要地位的特点。通过实际项目的开发实践,我们不仅掌握了技术技能,更重要的是培养了系统性思维工程化思维

在2025年技术发展浪潮汹涌澎湃的背景下,C++开发者需要既要深度洞悉前沿趋势,又要将个人兴趣、行业需求、技术潜能等要素纳入考量。本项目提供的不仅是一个完整的代码示例,更是一个学习现代C++开发的实践平台。

最后的话编程之路漫漫修远,愿每一位开发者都能在实践中不断成长,在探索中发现乐趣。如果这个项目对你有帮助,欢迎在评论区分享你的想法和改进建议!

💡 项目地址:完整源码已整理完毕,可直接复制使用
🔧 开发环境:Dev-C++ / Code::Blocks / Visual Studio
📚 学习建议:建议按模块逐步理解代码,重点关注面向对象设计思想的应用

创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)

相关文章:

C++课设:高效的日程管理系统

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏介绍&#xff1a;《编程项目实战》 目录 一、C日程管理系统的时代价值1. 为什么选…...

功能测试、性能测试、安全测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、功能测试 1、单接口功能 手工测试中的单个业务模块&#xff0c;一般对应一个接口 例如&#xff1a; 登录业务------登录接口 加入购物车业务------加入购…...

提示词指南 --- 提示词的基本结构

提示词指南 --- 提示词的基本结构以及三种角色 什么是Prompt (提示词)Prompt的基本结构和三种角色提示词的三种核心“角色”&#xff08;Role&#xff09; 真实例子 什么是Prompt (提示词) 我们可以把“Prompt&#xff08;提示词&#xff09;”想象成和AI聊天时你说的“一句话…...

UI学习—cell的复用和自定义cell

前言 Nib是什么&#xff1f; Nib就是.xib文件&#xff1a;一个可视化的UI界面文件&#xff0c;它记录了一个UI组件&#xff08;例如一个表格单元格Cell&#xff09;的界面布局信息&#xff0c;可以在interfaceBuilder中创建 [UINib nibWithNibName:"CustomCell" b…...

20250605使用boot-repair来恢复WIN10和ubuntu22.04.6双系统的启动

rootrootrootroot-X99-Turbo:~$ sudo apt-get install boot-repair rootrootrootroot-X99-Turbo:~$ sudo add-apt-repository ppa:yannubuntu/boot-repair rootrootrootroot-X99-Turbo:~$ sudo apt-get install boot-repair 20250605使用boot-repair来恢复WIN10和ubuntu22.04.6…...

网络安全面试题目(无答案)

一、渗透测试与漏洞挖掘 如何绕过WAF进行SQL注入&#xff1f;列举三种技术并解释原理。 答案要点&#xff1a; 分块传输编码&#xff08;Chunked Transfer&#xff09;绕过正则检测 畸形HTTP参数&#xff08;如参数污染、Unicode编码&#xff09; 利用WAF规则盲区&#xff08…...

JavaScript性能优化实战

### 1. 减少全局变量 JavaScript里&#xff0c;全局变量就像一个大杂烩&#xff0c;啥都往里扔&#xff0c;很容易出问题&#xff0c;还会影响性能。为啥呢&#xff1f;因为全局变量会被所有函数共享&#xff0c;查找起来特别费劲&#xff0c;就像在一个大仓库里找东西&#xf…...

接口安全SOAPOpenAPIRESTful分类特征导入项目联动检测

1 、 API 分类特征 SOAP - WSDL OpenApi - Swagger RESTful - /v1/api/ 2 、 API 常见漏洞 OWASP API Security TOP 10 2023 3 、 API 检测流程 接口发现&#xff0c;遵循分类&#xff0c;依赖语言&#xff0c; V1/V2 多版本等 Method &#xff1a;请求方法 攻击方…...

视频汇聚平台EasyCVR“明厨亮灶”方案筑牢旅游景区餐饮安全品质防线

一、背景分析​ 1&#xff09;政策监管刚性需求​&#xff1a;国家食品安全战略及 2024年《关于深化智慧城市发展的指导意见》要求构建智慧餐饮场景&#xff0c;推动数字化监管。多地将“AI明厨亮灶”纳入十四五规划考核&#xff0c;要求餐饮单位操作可视化并具备风险预警能力…...

sql server如何创建表导入excel的数据

在 SQL Server 中&#xff0c;可以通过几种方式将 Excel 数据导入到数据库表中。下面是一个完整的流程&#xff0c;包括如何创建表&#xff0c;以及将 Excel 数据导入该表的方法&#xff1a; ✅ 方法一&#xff1a;使用 SQL Server Management Studio (SSMS) 的导入向导&#x…...

仓库自动化搬运:自动叉车与AGV选型要点及核心技术解析

自动叉车与AGV均可实现自主作业&#xff0c;无需人工驾驶即可搬运托盘化货物。然而&#xff0c;这两种解决方案存在一些关键差异。 自动叉车与AGV的对比 自动叉车与AGV是截然不同的车辆&#xff0c;其差异主要源于原始设计&#xff1a; 自动叉车是制造商对传统手动叉车进行改…...

java UDP 模板

UDP&#xff08;User Datagram Protocol&#xff09;是一种无连接的传输层协议&#xff0c;在 Java 中可以使用 UDP 进行网络编程。理论上没有服务器客户端之分&#xff0c;实际上算是有的&#xff0c;以下是 Java 中 UDP 编程的基本步骤和示例代码&#xff1a; 服务器端 创建…...

【亲测有效】Mybatis-Plus更新字段为null

Mybatis-Plus更新字段为null 遇到问题 Mybatis-Plus更新的默认行为如下: Mybatis-Plus默认如果某个传入参数的字段为null, 默认不更新这个字段, 例如有个Double类型的字段, 当前数据库数据为10, 然后传参时当前字段为null, 实际上Mybatis-Plus是不会覆盖该字段为null的, 仍然…...

NLP学习路线图(二十五):注意力机制

在自然语言处理领域&#xff0c;序列模型一直扮演着核心角色。从早期的循环神经网络&#xff08;RNN&#xff09;到如今一统天下的Transformer模型&#xff0c;注意力机制&#xff08;Attention Mechanism&#xff09; 的引入堪称一场革命。它彻底改变了模型处理序列信息的方式…...

05 APP 自动化- Appium 单点触控 多点触控

文章目录 一、单点触控查看指针的指针位置实现手势密码&#xff1a; 二、多点触控 一、单点触控 查看指针的指针位置 方便查看手势密码-九宫格每个点的坐标 实现手势密码&#xff1a; 执行手势操作&#xff1a; 按压起点 -> 移动到下一点 -> 依次移动 -> 释放&am…...

MyBatis-Plus LambdaQuery 高级用法:JSON 路径查询与条件拼接的全场景解析

目录 1. 查询 JSON 字段中的特定值 2. 动态查询 JSON 字段中的值 3. 查询 JSON 数组中的值 4. 查询 JSON 字段中的嵌套对象 5. 结合其他条件查询 JSON 字段 6. 使用类型处理器简化 JSON 查询 6.1 创建自定义 JSON 类型处理器 6.2 在实体类中指定自定义类型处理器 示例…...

[AI绘画]sd学习记录(一)软件安装以及文生图界面初识、提示词写法

目录 目录一、安装软件二、文生图各部分模块 1. 下载新模型 & 画出第一张图2. 提示词输入 2.1 设置2.2 扩展模型2.3 扩展模型权重调整2.4 其他提示词输入2.5 负向提示词2.6 生成参考 3. 采样方法4. 噪声调度器5. 迭代步数6. 提示词引导系数 一、安装软件 软件安装&…...

SpringBoot(八) --- SpringBoot原理

目录 一、配置优先级 二、Bean的管理 1. Bean的作用域 2. 第三方Bean 三、SpringBoot原理 1. 起步依赖 2. 自动配置 3. 自动配置原理分析 3.1 源码解析 3.2 Conditional 一、配置优先级 SpringBoot项目当中支持三类配置文件&#xff1a; application.properties a…...

SpringBoot自动化部署全攻略:CI/CD高效实践与避坑指南

SpringBoot自动化部署全攻略:CI/CD高效实践与避坑指南 🚀 一、现代化部署方案选型对比 1. 主流CI/CD工具对比 工具优势适用场景Jenkins插件丰富、可扩展性强复杂流水线、混合云环境GitHub Actions与GitHub深度集成、易用GitHub项目、中小团队GitLab CI/CD一体化平台、内置…...

idea json生成实体类

在IntelliJ IDEA中&#xff0c;可以通过安装GsonFormat或GsonFormatPlus插件快速生成Java实体类‌。具体操作流程包括安装插件、创建空类后使用快捷键调出生成界面&#xff0c;输入JSON数据即可自动生成对应字段和结构。‌‌ 一、操作流程与工具选择‌ ‌1、插件安装‌ 在ID…...

C# 类和继承(抽象成员)

抽象成员 抽象成员是指设计为被覆写的函数成员。抽象成员有以下特征。 必须是一个函数成员。也就是说&#xff0c;字段和常量不能为抽象成员。必须用abstract修饰符标记。不能有实现代码块。抽象成员的代码用分号表示。 例如&#xff0c;下面取自一个类定义的代码声明了两个抽…...

gitlab rss订阅失败

问题&#xff1a;gitlab rss订阅失败 处理&#xff1a;http://gitlab.com/dashboard/projects.atom?feed_tokenXXXXXXX 这个XXX要改成用户设置里的Feed令牌 推荐本地rss订阅器&#xff1a;GitHub - yang991178/fluent-reader: Modern desktop RSS reader built with Electro…...

鸿蒙仓颉语言开发实战教程:商城登录页

听说Pura80要来了&#xff1f;感觉华为的新品像下饺子一样&#xff0c;让人目不暇接&#xff0c;每隔几天就有发布会看&#xff0c;真不错呀。 节后第一天&#xff0c;为了缓解大家假期的疲惫&#xff0c;咱们今天做点简单的内容&#xff0c;就是商城的登录页面。 其实这一次分…...

JavaScript 数组与流程控制:从基础操作到实战应用

在 JavaScript 编程的世界里&#xff0c;数组是一种极为重要的数据结构&#xff0c;它就像是一个有序的 “收纳盒”&#xff0c;能够将多个值整齐地存储起来。而流程控制语句则像是 “指挥官”&#xff0c;能够按照特定的逻辑对数组进行遍历和操作。接下来&#xff0c;就让我们…...

STM32中自动生成Flash地址的方法

每页大小为 2KB(0x800 字节),地址间隔为 0x800 总地址空间覆盖范围:0x08000000 ~ 0x0803F800(共 256KB) 适用于 STM32 大容量 / 中容量产品(如 F103 系列) 代码如下 // 通用定义(需根据实际页大小调整) #define FLASH_BASE_ADDR 0x08000000 #define FLASH_PAGE_SIZ…...

Matlab | MATLAB 中的插值详解

MATLAB 中的插值详解 插值是数值分析中的核心技术,用于在已知数据点之间估计未知点的值。MATLAB 提供了完整的插值函数库,涵盖一维到高维数据,支持多种插值方法。以下从基础到高级全面解析: 一、插值核心概念 1. 数学本质 给定数据点 ( x i , y i ) (x_i, y_i) (<...

SkyWalking架构深度解析:分布式系统监控的利器

一、SkyWalking概述 SkyWalking是一款开源的APM(应用性能监控)系统&#xff0c;专门为微服务、云原生和容器化架构设计。它由Apache软件基金会孵化并毕业&#xff0c;已成为分布式系统监控领域的明星项目。 核心特性 ‌分布式追踪‌&#xff1a;跨服务调用链路的完整追踪‌服务…...

vue2中的render函数

<script> export default {components: {},name: "renderElems",render (h, context) {return this.$attrs.vnode;},updated() {} } </script> <style scoped> </style>分析一下上面.vue组件&#xff1a; 组件结构&#xff1a; 这是一个非…...

逆向工程开篇(连载中)

项目特点 这个专栏专门设计用于汇编逆向工程研究&#xff0c;包含&#xff1a; ✅ 18个测试模块&#xff0c;覆盖所有主要C语言特性✅ 1200行工具类代码&#xff0c;400行主程序代码✅ 完整的Visual Studio 2017项目支持✅ Debug和Release两种构建配置✅ 静态库和可执行文件分…...

this.$set() 的用法详解(Vue响应式系统相关)

1. 什么是 this.$set()&#xff1f; this.$set(target, key, value) 是 Vue 2 中提供的一个方法&#xff0c;用于向响应式对象中动态添加属性&#xff0c;确保新加的属性同样是响应式的。 2. 为什么需要它&#xff1f; Vue 2 的响应式系统基于 Object.defineProperty&#…...