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

使用 HTML + JavaScript 实现一个日历任务管理系统

在现代快节奏的生活中,有效的时间管理变得越来越重要。本项目是一个基于 HTML 和 JavaScript 开发的日历任务管理系统,旨在为用户提供一个直观、便捷的时间管理工具。系统不仅能够清晰地展示当月日期,还支持事件的添加、编辑和删除操作,并通过本地存储(localStorage)实现数据的保存。

效果演示

image-20250531215620228

image-20250531215651307

项目概述

本项目主要包含以下核心功能:

  • 日历展示:动态生成当月日期,并支持月份切换
  • 事件管理:支持添加、编辑、删除事件
  • 类型区分:支持三种类型事件

页面结构

HTML 部分定义了页面的主要布局,包含日历头部、日历主体、模态框三大部分,其中日历日期将通过JavaScript动态生成。

<div class="calendar-container"><div class="calendar-header"><h1 id="current-month"></h1><div class="calendar-nav"><button id="prev-month">上个月</button><button id="next-month">下个月</button><button id="add-event">添加事件</button></div></div><div class="calendar-grid" id="calendar-grid"><div class="calendar-day-header">周日</div><div class="calendar-day-header">周一</div><div class="calendar-day-header">周二</div><div class="calendar-day-header">周三</div><div class="calendar-day-header">周四</div><div class="calendar-day-header">周五</div><div class="calendar-day-header">周六</div><!-- 日历日期将通过JavaScript动态生成 --></div>
</div>
<div id="event-modal" class="modal"><div class="modal-content"><span class="close">&times;</span><h2 id="modal-title">添加新事件</h2><form id="event-form"><input type="hidden" id="event-id"><input type="hidden" id="event-date"><div class="form-group"><label for="event-title">标题</label><input type="text" id="event-title" required></div><div class="form-group"><label for="event-type">类型</label><select id="event-type"><option value="event">事件</option><option value="task">任务</option><option value="important">重要</option></select></div><div class="form-group"><label for="event-start">开始时间</label><input type="time" id="event-start"></div><div class="form-group"><label for="event-end">结束时间</label><input type="time" id="event-end"></div><div class="form-group"><label for="event-description">描述</label><textarea id="event-description" rows="3"></textarea></div><div class="form-actions"><button type="button" id="delete-event" style="display: none; background: #f44336; color: white; border: none;">删除</button><button type="button" id="cancel-event">取消</button><button type="submit" id="save-event" style="background: #4CAF50; color: white; border: none;">保存</button></div></form></div>
</div>

核心功能实现

定义基础数据

获取页面核心 DOM 元素,为后续操作做准备

const calendarGrid = document.getElementById('calendar-grid');
const currentMonthElement = document.getElementById('current-month');
const prevMonthButton = document.getElementById('prev-month');
const nextMonthButton = document.getElementById('next-month');
const addEventButton = document.getElementById('add-event');
const modal = document.getElementById('event-modal');
const closeButton = document.querySelector('.close');
const cancelButton = document.getElementById('cancel-event');
const deleteButton = document.getElementById('delete-event');
const eventForm = document.getElementById('event-form');

初始化当前日期信息

let currentDate = new Date();
let currentYear = currentDate.getFullYear();
let currentMonth = currentDate.getMonth();

读取或初始化事件数据

let events = JSON.parse(localStorage.getItem('calendarEvents')) || [];
渲染日历

日历渲染算法流程如下:

  1. 计算当月第一天和最后一天的日期对象

  2. 确定当月第一天是星期几,用于定位起始位置

  3. 填充上个月末尾的日期(灰色显示)

  4. 循环生成当月的所有日期单元格

  5. 计算是否需要补充下个月初的日期

  6. 为今天添加特殊样式

  7. 最后调用 renderEvents 方法渲染当月所有事件

function renderCalendar(month, year) {// 更新当前月份显示currentMonthElement.textContent = `${year}${month + 1}`;// 清除之前的日历日期while (calendarGrid.children.length > 7) {calendarGrid.removeChild(calendarGrid.lastChild);}// 获取当月第一天和最后一天const firstDay = new Date(year, month, 1);const lastDay = new Date(year, month + 1, 0);// 获取第一天是星期几 (0-6, 0是周日)const firstDayOfWeek = firstDay.getDay();// 获取上个月的最后几天const prevMonthLastDay = new Date(year, month, 0).getDate();// 添加上个月的几天for (let i = firstDayOfWeek - 1; i >= 0; i--) {const dayElement = createDayElement(prevMonthLastDay - i, true);calendarGrid.appendChild(dayElement);}// 添加当月的所有天for (let i = 1; i <= lastDay.getDate(); i++) {const dayElement = createDayElement(i, false);// 检查是否是今天const today = new Date();if (year === today.getFullYear() && month === today.getMonth() && i === today.getDate()) {dayElement.style.backgroundColor = '#e8f5e9';}calendarGrid.appendChild(dayElement);}// 计算还需要添加多少天const totalDays = firstDayOfWeek + lastDay.getDate();const remainingDays = 7 - (totalDays % 7);// 添加下个月的前几天if (remainingDays < 7) {for (let i = 1; i <= remainingDays; i++) {const dayElement = createDayElement(i, true);calendarGrid.appendChild(dayElement);}}// 渲染事件renderEvents();
}
渲染事件

每个日期单元格都可能包含多个事件标记。

function renderEvents() {// 获取所有日期元素const dayElements = document.querySelectorAll('.calendar-day:not(.inactive)');dayElements.forEach(dayElement => {// 清除之前的事件const existingEvents = dayElement.querySelectorAll('.event');existingEvents.forEach(event => event.remove());// 获取当前日期const day = parseInt(dayElement.querySelector('.day-number').textContent);const date = new Date(currentYear, currentMonth, day);// 查找当天的所有事件const dayEvents = events.filter(event => {const eventDate = new Date(event.date);return eventDate.toDateString() === date.toDateString();});// 添加事件到日期dayEvents.forEach(event => {const eventElement = document.createElement('div');eventElement.className = `event ${event.type}`;eventElement.textContent = `${event.startTime} ${event.title}`;eventElement.dataset.id = event.id;// 添加点击事件eventElement.addEventListener('click', (e) => {e.stopPropagation();openModal(null, event.id);});dayElement.appendChild(eventElement);});});
}
新增/编辑事件

打开表单的模态框,点击空白日期时打开添加事件模态框,点击已有事件时打开编辑该事件的模态框。

function openModal(date = null, eventId = null) {const modalTitle = document.getElementById('modal-title');const eventDateInput = document.getElementById('event-date');const eventIdInput = document.getElementById('event-id');const eventTitleInput = document.getElementById('event-title');const eventTypeInput = document.getElementById('event-type');const eventStartInput = document.getElementById('event-start');const eventEndInput = document.getElementById('event-end');const eventDescriptionInput = document.getElementById('event-description');// 重置表单eventForm.reset();if (eventId) {// 编辑现有事件const event = events.find(e => e.id === eventId);if (event) {modalTitle.textContent = '编辑事件';eventIdInput.value = event.id;eventDateInput.value = event.date;eventTitleInput.value = event.title;eventTypeInput.value = event.type;eventStartInput.value = event.startTime || '';eventEndInput.value = event.endTime || '';eventDescriptionInput.value = event.description || '';deleteButton.style.display = 'inline-block';}} else {// 添加新事件modalTitle.textContent = '添加新事件';eventIdInput.value = generateId();if (date) {// 设置日期为点击的日期const formattedDate = formatDate(date);eventDateInput.value = formattedDate;} else {// 默认为今天const today = new Date();const formattedDate = formatDate(today);eventDateInput.value = formattedDate;}deleteButton.style.display = 'none';}modal.style.display = 'block';
}

事件验证后把事件保存到本地,并重新渲染日历。

function saveEvent() {const eventId = document.getElementById('event-id').value;const eventDate = document.getElementById('event-date').value;const eventTitle = document.getElementById('event-title').value;const eventType = document.getElementById('event-type').value;const eventStart = document.getElementById('event-start').value;const eventEnd = document.getElementById('event-end').value;const eventDescription = document.getElementById('event-description').value;// 验证if (!eventTitle) {alert('请输入标题');return;}// 查找是否已存在该事件const existingEventIndex = events.findIndex(e => e.id === eventId);const event = {id: eventId,date: eventDate,title: eventTitle,type: eventType,startTime: eventStart,endTime: eventEnd,description: eventDescription};if (existingEventIndex !== -1) {// 更新现有事件events[existingEventIndex] = event;} else {// 添加新事件events.push(event);}// 保存到本地存储localStorage.setItem('calendarEvents', JSON.stringify(events));// 重新渲染日历renderCalendar(currentMonth, currentYear);// 关闭模态框closeModal();
}
删除事件
function deleteEvent() {const eventId = document.getElementById('event-id').value;if (confirm('确定要删除这个事件吗?')) {// 从数组中移除事件events = events.filter(e => e.id !== eventId);// 保存到本地存储localStorage.setItem('calendarEvents', JSON.stringify(events));// 重新渲染日历renderCalendar(currentMonth, currentYear);// 关闭模态框closeModal();}
}
月份切换

点击【上个月】【下个月】按钮切换月份,系统会自动更新日历显示。

prevMonthButton.addEventListener('click', () => {currentMonth--;if (currentMonth < 0) {currentMonth = 11;currentYear--;}renderCalendar(currentMonth, currentYear);
});nextMonthButton.addEventListener('click', () => {currentMonth++;if (currentMonth > 11) {currentMonth = 0;currentYear++;}renderCalendar(currentMonth, currentYear);
});

扩展建议

  • 增加事件提醒功能
  • 支持“日”、“周”、“月”视图切换功能
  • 添加拖拽排序功能
  • 添加右键菜单快速操作功能

完整代码

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>日历任务管理系统</title><style>body {margin: 0;padding: 20px;}.calendar-container {max-width: 1000px;margin: 0 auto;}.calendar-header {display: flex;justify-content: space-between;align-items: center;margin-bottom: 20px;}.calendar-nav button {background: #4CAF50;color: white;border: none;padding: 8px 16px;border-radius: 4px;cursor: pointer;}.calendar-nav button:hover {background: #45a049;}.calendar-grid {display: grid;grid-template-columns: repeat(7, 1fr);gap: 10px;}.calendar-day-header {text-align: center;font-weight: bold;padding: 10px;background: #f2f2f2;}.calendar-day {border: 1px solid #ddd;min-height: 100px;padding: 5px;position: relative;}.calendar-day.inactive {background: #f9f9f9;color: #aaa;}.day-number {font-weight: bold;margin-bottom: 5px;}.event {background: #e3f2fd;border-left: 3px solid #2196F3;padding: 2px 5px;margin: 2px 0;font-size: 12px;border-radius: 2px;cursor: pointer;}.event.task {background: #e8f5e9;border-left-color: #4CAF50;}.event.important {background: #ffebee;border-left-color: #f44336;}.modal {display: none;position: fixed;z-index: 1;left: 0;top: 0;width: 100%;height: 100%;background-color: rgba(0,0,0,0.4);}.modal-content {background-color: #fefefe;margin: 10% auto;padding: 20px;border: 1px solid #888;width: 80%;max-width: 500px;}.close {color: #aaa;float: right;font-size: 28px;font-weight: bold;cursor: pointer;}.form-group {margin-bottom: 15px;}.form-group label {display: block;margin-bottom: 5px;}.form-group input, .form-group select, .form-group textarea {width: 100%;padding: 8px;box-sizing: border-box;}.form-actions {text-align: right;}.form-actions button {padding: 8px 16px;margin-left: 10px;}</style>
</head>
<body>
<div class="calendar-container"><div class="calendar-header"><h1 id="current-month"></h1><div class="calendar-nav"><button id="prev-month">上个月</button><button id="next-month">下个月</button><button id="add-event">添加事件</button></div></div><div class="calendar-grid" id="calendar-grid"><!-- 日历头部 - 星期几 --><div class="calendar-day-header">周日</div><div class="calendar-day-header">周一</div><div class="calendar-day-header">周二</div><div class="calendar-day-header">周三</div><div class="calendar-day-header">周四</div><div class="calendar-day-header">周五</div><div class="calendar-day-header">周六</div><!-- 日历日期将通过JavaScript动态生成 --></div>
</div>
<!-- 添加/编辑事件的模态框 -->
<div id="event-modal" class="modal"><div class="modal-content"><span class="close">&times;</span><h2 id="modal-title">添加新事件</h2><form id="event-form"><input type="hidden" id="event-id"><input type="hidden" id="event-date"><div class="form-group"><label for="event-title">标题</label><input type="text" id="event-title" required></div><div class="form-group"><label for="event-type">类型</label><select id="event-type"><option value="event">事件</option><option value="task">任务</option><option value="important">重要</option></select></div><div class="form-group"><label for="event-start">开始时间</label><input type="time" id="event-start"></div><div class="form-group"><label for="event-end">结束时间</label><input type="time" id="event-end"></div><div class="form-group"><label for="event-description">描述</label><textarea id="event-description" rows="3"></textarea></div><div class="form-actions"><button type="button" id="delete-event" style="display: none; background: #f44336; color: white; border: none;">删除</button><button type="button" id="cancel-event">取消</button><button type="submit" id="save-event" style="background: #4CAF50; color: white; border: none;">保存</button></div></form></div>
</div>
<script>document.addEventListener('DOMContentLoaded', function() {const calendarGrid = document.getElementById('calendar-grid');const currentMonthElement = document.getElementById('current-month');const prevMonthButton = document.getElementById('prev-month');const nextMonthButton = document.getElementById('next-month');const addEventButton = document.getElementById('add-event');const modal = document.getElementById('event-modal');const closeButton = document.querySelector('.close');const cancelButton = document.getElementById('cancel-event');const deleteButton = document.getElementById('delete-event');const eventForm = document.getElementById('event-form');let currentDate = new Date();let currentYear = currentDate.getFullYear();let currentMonth = currentDate.getMonth();let events = JSON.parse(localStorage.getItem('calendarEvents')) || [];// 初始化日历renderCalendar(currentMonth, currentYear);// 月份切换prevMonthButton.addEventListener('click', () => {currentMonth--;if (currentMonth < 0) {currentMonth = 11;currentYear--;}renderCalendar(currentMonth, currentYear);});nextMonthButton.addEventListener('click', () => {currentMonth++;if (currentMonth > 11) {currentMonth = 0;currentYear++;}renderCalendar(currentMonth, currentYear);});addEventButton.addEventListener('click', () => {openModal();});closeButton.addEventListener('click', () => {closeModal();});cancelButton.addEventListener('click', () => {closeModal();});window.addEventListener('click', (event) => {if (event.target === modal) {closeModal();}});eventForm.addEventListener('submit', (e) => {e.preventDefault();saveEvent();});deleteButton.addEventListener('click', () => {deleteEvent();});// 渲染日历function renderCalendar(month, year) {// 更新当前月份显示currentMonthElement.textContent = `${year}${month + 1}`;// 清除之前的日历日期while (calendarGrid.children.length > 7) {calendarGrid.removeChild(calendarGrid.lastChild);}// 获取当月第一天和最后一天const firstDay = new Date(year, month, 1);const lastDay = new Date(year, month + 1, 0);// 获取第一天是星期几 (0-6, 0是周日)const firstDayOfWeek = firstDay.getDay();// 获取上个月的最后几天const prevMonthLastDay = new Date(year, month, 0).getDate();// 添加上个月的几天for (let i = firstDayOfWeek - 1; i >= 0; i--) {const dayElement = createDayElement(prevMonthLastDay - i, true);calendarGrid.appendChild(dayElement);}// 添加当月的所有天for (let i = 1; i <= lastDay.getDate(); i++) {const dayElement = createDayElement(i, false);// 检查是否是今天const today = new Date();if (year === today.getFullYear() && month === today.getMonth() && i === today.getDate()) {dayElement.style.backgroundColor = '#e8f5e9';}calendarGrid.appendChild(dayElement);}// 计算还需要添加多少天const totalDays = firstDayOfWeek + lastDay.getDate();const remainingDays = 7 - (totalDays % 7);// 添加下个月的前几天if (remainingDays < 7) {for (let i = 1; i <= remainingDays; i++) {const dayElement = createDayElement(i, true);calendarGrid.appendChild(dayElement);}}// 渲染事件renderEvents();}// 创建日期元素function createDayElement(day, inactive) {const dayElement = document.createElement('div');dayElement.className = 'calendar-day' + (inactive ? ' inactive' : '');const dayNumber = document.createElement('div');dayNumber.className = 'day-number';dayNumber.textContent = day;dayElement.appendChild(dayNumber);// 如果不是非活动日期,添加点击事件if (!inactive) {dayElement.addEventListener('click', () => {const currentDate = new Date(currentYear, currentMonth, day);openModal(currentDate);});}return dayElement;}// 渲染事件到日历function renderEvents() {// 获取所有日期元素const dayElements = document.querySelectorAll('.calendar-day:not(.inactive)');dayElements.forEach(dayElement => {// 清除之前的事件const existingEvents = dayElement.querySelectorAll('.event');existingEvents.forEach(event => event.remove());// 获取当前日期const day = parseInt(dayElement.querySelector('.day-number').textContent);const date = new Date(currentYear, currentMonth, day);// 查找当天的所有事件const dayEvents = events.filter(event => {const eventDate = new Date(event.date);return eventDate.toDateString() === date.toDateString();});// 添加事件到日期dayEvents.forEach(event => {const eventElement = document.createElement('div');eventElement.className = `event ${event.type}`;eventElement.textContent = `${event.startTime} ${event.title}`;eventElement.dataset.id = event.id;// 添加点击事件eventElement.addEventListener('click', (e) => {e.stopPropagation();openModal(null, event.id);});dayElement.appendChild(eventElement);});});}// 打开模态框function openModal(date = null, eventId = null) {const modalTitle = document.getElementById('modal-title');const eventDateInput = document.getElementById('event-date');const eventIdInput = document.getElementById('event-id');const eventTitleInput = document.getElementById('event-title');const eventTypeInput = document.getElementById('event-type');const eventStartInput = document.getElementById('event-start');const eventEndInput = document.getElementById('event-end');const eventDescriptionInput = document.getElementById('event-description');// 重置表单eventForm.reset();if (eventId) {// 编辑现有事件const event = events.find(e => e.id === eventId);if (event) {modalTitle.textContent = '编辑事件';eventIdInput.value = event.id;eventDateInput.value = event.date;eventTitleInput.value = event.title;eventTypeInput.value = event.type;eventStartInput.value = event.startTime || '';eventEndInput.value = event.endTime || '';eventDescriptionInput.value = event.description || '';deleteButton.style.display = 'inline-block';}} else {// 添加新事件modalTitle.textContent = '添加新事件';eventIdInput.value = generateId();if (date) {// 设置日期为点击的日期const formattedDate = formatDate(date);eventDateInput.value = formattedDate;} else {// 默认为今天const today = new Date();const formattedDate = formatDate(today);eventDateInput.value = formattedDate;}deleteButton.style.display = 'none';}modal.style.display = 'block';}// 关闭模态框function closeModal() {modal.style.display = 'none';}// 保存事件function saveEvent() {const eventId = document.getElementById('event-id').value;const eventDate = document.getElementById('event-date').value;const eventTitle = document.getElementById('event-title').value;const eventType = document.getElementById('event-type').value;const eventStart = document.getElementById('event-start').value;const eventEnd = document.getElementById('event-end').value;const eventDescription = document.getElementById('event-description').value;// 验证if (!eventTitle) {alert('请输入标题');return;}// 查找是否已存在该事件const existingEventIndex = events.findIndex(e => e.id === eventId);const event = {id: eventId,date: eventDate,title: eventTitle,type: eventType,startTime: eventStart,endTime: eventEnd,description: eventDescription};if (existingEventIndex !== -1) {// 更新现有事件events[existingEventIndex] = event;} else {// 添加新事件events.push(event);}// 保存到本地存储localStorage.setItem('calendarEvents', JSON.stringify(events));// 重新渲染日历renderCalendar(currentMonth, currentYear);// 关闭模态框closeModal();}// 删除事件function deleteEvent() {const eventId = document.getElementById('event-id').value;if (confirm('确定要删除这个事件吗?')) {// 从数组中移除事件events = events.filter(e => e.id !== eventId);// 保存到本地存储localStorage.setItem('calendarEvents', JSON.stringify(events));// 重新渲染日历renderCalendar(currentMonth, currentYear);// 关闭模态框closeModal();}}// 生成唯一IDfunction generateId() {return Date.now().toString(36) + Math.random().toString(36).substr(2);}// 格式化日期为YYYY-MM-DDfunction formatDate(date) {const year = date.getFullYear();const month = String(date.getMonth() + 1).padStart(2, '0');const day = String(date.getDate()).padStart(2, '0');return `${year}-${month}-${day}`;}});
</script>
</body>
</html>

相关文章:

使用 HTML + JavaScript 实现一个日历任务管理系统

在现代快节奏的生活中&#xff0c;有效的时间管理变得越来越重要。本项目是一个基于 HTML 和 JavaScript 开发的日历任务管理系统&#xff0c;旨在为用户提供一个直观、便捷的时间管理工具。系统不仅能够清晰地展示当月日期&#xff0c;还支持事件的添加、编辑和删除操作&#…...

车载诊断架构SOVD --- 车辆发现与建连

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

Notepad++找回自动暂存的文件

场景&#xff1a; 当你没有保存就退出Notepad&#xff0c;下次进来Notepad会自动把你上次编辑的内容显示出来&#xff0c;以便你继续编辑。除非你手动关掉当前页面&#xff0c;这样Notepad就会删除掉自动保存的内容。 问题&#xff1a; Notepad会将自动保存的文件地址,打开Note…...

DL00924-基于深度学习YOLOv11的工程车辆目标检测含数据集

文末有代码完整出处 &#x1f697; 基于深度学习YOLOv11的工程车辆目标检测——引领智能识别新潮流&#xff01; &#x1f680; 随着人工智能技术的飞速发展&#xff0c; 目标检测 已经在各个领域取得了显著突破&#xff0c;尤其是在 工程车辆识别 这一关键技术上。今天&#…...

Axure RP11安装、激活、汉化

一:注册码 Axure RP11.0.0.4122在2025-5-29日亲测有效: 49bb9513c40444b9bcc3ce49a7a022f9...

【PhysUnits】15.6 引入P1后的左移运算(shl.rs)

一、源码 代码实现了Rust的类型级二进制数的左移运算(<<)&#xff0c;使用类型系统在编译期进行计算。 use super::basic::{Z0, P1, N1, B0, B1, NonZero, NonOne, Unsigned}; use super::sub1::Sub1; use core::ops::Shl;// 左移运算&#xff08;<<&#xff09…...

自编码器Auto-encoder(李宏毅)

目录 编码器的概念&#xff1a; 为什么需要编码器&#xff1f; 编码器什么原理&#xff1f; 去噪自编码器: 自编码器的应用&#xff1a; 特征解耦 离散隐表征 编码器的概念&#xff1a; 重构&#xff1a;输入一张图片&#xff0c;通过编码器转化成向量&#xff0c;要求再…...

数据结构之堆(topk问题、堆排序)

一、堆的初步认识 堆虽然是用数组存储数据的数据结构&#xff0c;但是它的底层却是另一种表现形式。 堆分为大堆和小堆&#xff0c;大堆是所有父亲大于孩子&#xff0c;小堆是所有孩子大于父亲。 通过分析我们能得出父子关系的计算公式&#xff0c;parent(child-1)/2&#xff…...

SpringBoot使用ffmpeg实现视频压缩

ffmpeg简介 FFmpeg 是一个开源的跨平台多媒体处理工具集&#xff0c;用于录制、转换、编辑和流式传输音频和视频。它功能强大&#xff0c;支持几乎所有常见的音视频格式&#xff0c;是多媒体处理领域的核心工具之一。 官方文档&#xff1a;https://ffmpeg.org/documentation.h…...

【Elasticsearch】exists` 查询用于判断文档中是否存在某个指定字段。它检查字段是否存在于文档中,并且字段的值不为 `null`

在 Elasticsearch 中&#xff0c;exists 查询用于判断文档中是否存在某个指定字段。它检查字段是否存在于文档中&#xff0c;并且字段的值不为 null。如果字段存在且有值&#xff08;即使是空字符串或空数组&#xff09;&#xff0c;则 exists 查询会匹配该文档&#xff1b;如果…...

2025-05-31 Python深度学习9——网络模型的加载与保存

文章目录 1 使用现有网络2 修改网络结构2.1 添加新层2.2 替换现有层 3 保存网络模型3.1 完整保存3.2 参数保存&#xff08;推荐&#xff09; 4 加载网络模型4.1 加载完整模型文件4.2 加载参数文件 5 Checkpoint5.1 保存 Checkpoint5.2 加载 Checkpoint 本文环境&#xff1a; Py…...

长安链起链调用合约时docker ps没有容器的原因

在调用这个命令的时候&#xff0c;发现并没有出现官方预期的合约容器&#xff0c;这是因为我们在起链的时候没有选择用docker的虚拟环境&#xff0c;实际上这不影响后续的调用&#xff0c;如果想要达到官方的效果那么你只需要在起链的时候输入yes即可&#xff0c;如图三所示...

Appium+python自动化(七)- 认识Appium- 上

简介 经过前边的各项准备工作&#xff0c;终于才把appium搞定。 一、appium自我介绍 appium是一款开源的自动化测试工具&#xff0c;可以支持iOS和安卓平台上的原生的&#xff0c;基于移动浏览器的&#xff0c;混合的应用&#xff08;APP&#xff09;。 1、 使用appium进…...

数据中心双活架构解决方案

数据中心双活架构解决方案 数据中心双活架构(Active-Active Data Center)旨在实现业务高可用、负载均衡和灾难自动切换。以下是完整的解决方案,涵盖架构设计、关键技术、实施步骤及最佳实践。 1. 双活架构设计 1.1 基本架构模型 同城双活(Metro Active-Active) 两个数据…...

YOLOv5 详解:从原理到实战的全方位解析

在计算机视觉领域&#xff0c;目标检测作为核心任务之一&#xff0c;始终吸引着众多研究者和开发者的目光。YOLO&#xff08;You Only Look Once&#xff09;系列算法凭借其高效、准确的特点&#xff0c;在目标检测领域占据重要地位。而 YOLOv5 作为 YOLO 系列算法的重要成员&a…...

模块联邦:更快的微前端方式!

什么是模块联邦 在前端项目中&#xff0c;不同团队之间的业务模块可能有耦合&#xff0c;比如A团队的页面里有一个富文本模块&#xff08;组件&#xff09;&#xff0c;而B团队 的页面恰好也需要使用这个富文本模块。 传统模式下&#xff0c;B团队只能去抄A团队的代码&#x…...

前端基础学习html+css+js

HTML 区块 div标签&#xff0c;块级标签 span包装小部分文本&#xff0c;行内元素 表单 CSS css选择器 css属性 特性blockinlineinline-block是否换行✅ 换行❌ 不换行❌ 不换行可设置宽高✅ 支持❌ 不支持✅ 支持常见元素div容器 p段落 h标题span文本容器 a超链接img图片…...

手机打电话时将对方DTMF数字转为RFC2833发给局域网SIP坐席

手机打电话时将对方DTMF数字转为RFC2833发给局域网SIP坐席 --局域网SIP坐席呼叫 上一篇&#xff1a;手机打电话时由对方DTMF响应切换多级IVR语音菜单&#xff08;完结&#xff09; 下一篇&#xff1a;安卓App识别手机系统弹授权框包含某段文字-并自动点击确定按钮 一、前言 …...

TCP三次握手/四次握手-TCP/IP四层模型-SSL/TLS-HTTP-HTTPS

重要概念 seq ( Squence Number ) 序列号&#xff0c;用于数据排序、去重&#xff0c;防止数据包乱序 ack ( Acknowledgement Number ) 确认好&#xff0c;表示期望接受的下一个字节序号&#xff0c;用于确认数据包被对方接受 TCP三次握手是建立可靠连接的过程&#xff0c;确…...

SAP Business One:无锡哲讯科技助力中小企业数字化转型的智慧之选

数字化转型&#xff0c;中小企业的必经之路 在当今竞争激烈的商业环境中&#xff0c;数字化转型已不再是大型企业的专利&#xff0c;越来越多的中小企业开始寻求高效、灵活的管理系统来优化业务流程、提升运营效率。作为全球领先的企业管理软件&#xff0c;SAP Business One…...

【Ubuntu远程桌面】

Ubuntu-远程桌面 ubuntu环境rustdesk-1.4.0-aarch64.deb安装rustdesk注意事项&#xff1a;报错&#xff1a;可能会在远程连接时候显示‘No displays’解决方法1. 安装 CUDA&#xff08;如果需要&#xff09;2. 解决 XDG 桌面门户问题3. 检查 RustDesk 客户端日志 总结 kill --t…...

⚡ Linux 系统安装与配置 Vim 编辑器(包括 Vim 插件管理器)

⚡ Linux 系统安装与配置 Vim 编辑器&#xff08;包括 Vim 插件管理器&#xff09; &#x1f4cc; 1. Vim 简介 Vim&#xff08;Vi IMproved&#xff09;是一款高度可定制的文本编辑器&#xff0c;基于早期的 vi 编辑器扩展而来。 它支持语法高亮、插件扩展、多种编程语言&am…...

小型语言模型:为何“小”才是“大”?

当说到人工智能&#xff08;AI&#xff09;的时候&#xff0c;大家通常会想到那些拥有数十亿参数的超大型语言模型&#xff0c;它们能做出一些令人惊叹的事情。 厉害不厉害&#xff1f;绝对厉害&#xff01; 但对于大多数企业和开发者来说&#xff0c;实用吗&#xff1f;可能…...

雪花算法:分布式ID生成的优雅解决方案

一、雪花算法的核心机制与设计思想 雪花算法&#xff08;Snowflake&#xff09;是由Twitter开源的分布式ID生成算法&#xff0c;它通过巧妙的位运算设计&#xff0c;能够在分布式系统中快速生成全局唯一且趋势递增的ID。 1. 基本结构 雪花算法生成的是一个64位&#xff08;lo…...

针对PostgreSQL中pg_wal目录占用过大的系统性解决方案

​一、问题现象与根本原因​ 当pg_wal目录占用超过预期&#xff08;如数十GB甚至占满磁盘&#xff09;&#xff0c;通常由以下原因导致 ​长事务未提交​&#xff1a;未完成的事务会阻塞WAL日志清理。​复制槽未释放​&#xff1a;逻辑复制或流复制槽未及时清理&#xff0c;导…...

git push Git远端意外挂断

git push Git远端意外挂断 枚举对象中: 99, 完成. 对象计数中: 100% (99/99), 完成. 使用 8 个线程进行压缩 压缩对象中: 100% (78/78), 完成. send-pack: unexpected disconnect while reading sideband packet 写入对象中: 100% (82/82), 2.78 MiB | 5.56 MiB/s, 完成. 总共…...

python学习day34

GPU训练及类的call方法 知识点回归&#xff1a; CPU性能的查看&#xff1a;看架构代际、核心数、线程数GPU性能的查看&#xff1a;看显存、看级别、看架构代际GPU训练的方法&#xff1a;数据和模型移动到GPU device上类的call方法&#xff1a;为什么定义前向传播时可以直接写作…...

秋招Day12 - 计算机网络 - 网络综合

从浏览器地址栏输入URL到显示网页的过程了解吗&#xff1f; 从在浏览器地址栏输入 URL 到显示网页的完整过程&#xff0c;并不是一个单一的数据包从头到尾、一次性地完成七层封装再七层解析的过程。 而是涉及到多次、针对不同目的、与不同服务器进行的、独立的网络通信交互&a…...

QT-JSON

#include <QJsonDocument>#include <QJsonObject>#include <QJsonArray>#include <QFile>#include <QDebug>void createJsonFile() {// 创建一个JSON对象 键值对QJsonObject jsonObj;jsonObj["name"] "John Doe";jsonObj[…...

IP 风险画像技术略解

IP 风险画像的技术定义与价值 IP 风险画像通过整合 IP 查询数据与 IP 离线库信息&#xff0c;结合机器学习算法&#xff0c;为每个 IP 地址生成多维度风险评估模型。其核心价值在于将传统的静态 IP 黑名单升级为动态风险评估体系&#xff0c;可实时识别新型网络威胁&#xff0…...