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

news2025/6/6 22:44:40

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》
创作者: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-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) {}
    
    // 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😊)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2402199.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

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

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

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

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…

接口安全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;要求餐饮单位操作可视化并具备风险预警能力…

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

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

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

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

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

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

[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…

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

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

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

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

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

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

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; 这是一个非…

PARADISE:用于新生儿缺氧缺血性脑病(HIE)疾病识别与分割的个性化和区域适应性方法|文献速递-深度学习医疗AI最新文献

Title 题目 PARADISE: Personalized and regional adaptation for HIE disease identification and segmentation PARADISE&#xff1a;用于新生儿缺氧缺血性脑病&#xff08;HIE&#xff09;疾病识别与分割的个性化和区域适应性方法 1 文献速递介绍 缺氧缺血性脑病&…

WordPress子主题RiPro-V5van无授权全开源版(源码下载)

WordPress子主题RiPro-V5van无授权全开源版&#xff0c;直接上使用方法:WordPress后台上传就行 这个主题是1.0版本开源的&#xff0c;有能力的可以二次开发一下加一些自己喜欢的功能。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/90952148 更多资…

StoreView SQL,让数据分析不受地域限制

作者&#xff1a;章建&#xff08;处知&#xff09; 引言 日志服务 SLS 是云原生观测和分析平台&#xff0c;为 Log、Metric、Trace 等数据提供大规模、低成本、实时的平台化服务。SLS 提供了多地域支持【1】&#xff0c;方便用户可以根据数据源就近接入 SLS 服务&#xff0c…

UCRT 和 MSVC 的区别(Windows 平台上 C/C++ 开发相关)

UCRT 和 MSVC 是与 Windows 平台上 C/C 开发相关的两个重要概念&#xff0c;它们都属于 Microsoft 的开发工具链的一部分。下面详细解释它们的含义、区别以及用途。 一、UCRT&#xff08;Universal C Runtime&#xff09; 1. 含义&#xff1a; UCRT&#xff08;Universal C …

rabbitmq Fanout交换机简介

给每个服务创建一个队列&#xff0c;然后每个业务订阅一个队列&#xff0c;进行消费。 如订单服务起个多个服务&#xff0c;代码是一样的&#xff0c;消费的也是同一个队列。加快了队列中的消息的消费速度。 可以看到两个消费者已经在消费了