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

鸿蒙OSUniApp 实现一个精致的日历组件#三方框架 #Uniapp

使用 UniApp 实现一个精致的日历组件

前言

最近在开发一个约会小程序时,需要实现一个既美观又实用的日历组件。市面上虽然有不少现成的组件库,但都不太符合我们的设计需求。于是,我决定从零开始,基于 UniApp 自己实现一个功能完善、UI精致的日历组件。本文将分享我的实现思路和过程,希望对你有所帮助。

需求分析

首先,让我们明确一下这个日历组件需要满足的需求:

  1. 日历展示:能够清晰展示年、月、日信息
  2. 日期选择:支持单选、范围选择功能
  3. 样式定制:支持自定义主题颜色、特殊日期标记
  4. 事件标记:能够在特定日期显示事件标记或小红点
  5. 手势操作:支持左右滑动切换月份
  6. 农历展示:可选择性展示农历信息

基于以上需求,我们开始设计和编码。

实现思路

1. 数据结构设计

日历组件的核心是对日期数据的管理。我们需要设计一个合理的数据结构来存储和操作日期信息。

{year: 2023,          // 当前显示的年份month: 5,            // 当前显示的月份(1-12)day: 15,             // 当前选中的日期weeks: [             // 按周分组的日期数据[                  // 第一周{day: 30,       // 日期month: 4,      // 所属月份isCurrentMonth: false,  // 是否属于当前月isToday: false,         // 是否是今天isSelected: false,      // 是否被选中hasEvent: false,        // 是否有事件lunar: '四月初一',      // 农历信息disable: false          // 是否禁用},// ... 其他日期数据],// ... 其他周数据]
}

2. 核心功能实现

首先,我们需要计算出日历网格中的所有日期数据。这包括当前月的所有日期,以及为了填满网格而需要显示的上个月和下个月的部分日期。

以下是生成日历数据的核心函数:

/*** 生成日历数据* @param {Number} year 年份* @param {Number} month 月份(1-12)* @return {Array} 日历数据数组*/
function generateCalendarData(year, month) {// 获取当前月第一天是星期几const firstDayOfMonth = new Date(year, month - 1, 1).getDay();// 获取当前月的天数const daysInMonth = new Date(year, month, 0).getDate();// 获取上个月的天数const daysInPrevMonth = new Date(year, month - 1, 0).getDate();// 获取今天的日期信息const today = new Date();const isToday = (date) => {return date.getFullYear() === today.getFullYear() && date.getMonth() === today.getMonth() && date.getDate() === today.getDate();};// 日历数据数组let days = [];// 添加上个月的日期for (let i = 0; i < firstDayOfMonth; i++) {const prevDay = daysInPrevMonth - firstDayOfMonth + i + 1;const prevMonth = month - 1 > 0 ? month - 1 : 12;const prevYear = prevMonth === 12 ? year - 1 : year;days.push({day: prevDay,month: prevMonth,year: prevYear,isCurrentMonth: false,isToday: isToday(new Date(prevYear, prevMonth - 1, prevDay)),isSelected: false,hasEvent: false,  // 根据实际情况设置lunar: getLunarDate(prevYear, prevMonth, prevDay),  // 获取农历日期disable: false});}// 添加当前月的日期for (let i = 1; i <= daysInMonth; i++) {days.push({day: i,month,year,isCurrentMonth: true,isToday: isToday(new Date(year, month - 1, i)),isSelected: false,hasEvent: false,  // 根据实际情况设置lunar: getLunarDate(year, month, i),  // 获取农历日期disable: false});}// 添加下个月的日期,补满 6 行const totalDays = 42;  // 6行7列const remainingDays = totalDays - days.length;for (let i = 1; i <= remainingDays; i++) {const nextMonth = month + 1 <= 12 ? month + 1 : 1;const nextYear = nextMonth === 1 ? year + 1 : year;days.push({day: i,month: nextMonth,year: nextYear,isCurrentMonth: false,isToday: isToday(new Date(nextYear, nextMonth - 1, i)),isSelected: false,hasEvent: false,  // 根据实际情况设置lunar: getLunarDate(nextYear, nextMonth, i),  // 获取农历日期disable: false});}// 将日期按周分组const weeks = [];for (let i = 0; i < days.length; i += 7) {weeks.push(days.slice(i, i + 7));}return weeks;
}

3. 组件开发

接下来,让我们使用 UniApp 开发这个日历组件。我们将创建一个独立的组件,以便在不同项目中复用。

<!-- calendar.vue -->
<template><view class="calendar"><!-- 日历头部 --><view class="calendar-header"><view class="calendar-title"><text>{{ year }}年{{ month }}月</text></view><view class="calendar-controls"><view class="prev-month" @click="changeMonth(-1)"><text class="iconfont icon-left"></text></view><view class="next-month" @click="changeMonth(1)"><text class="iconfont icon-right"></text></view></view></view><!-- 星期栏 --><view class="calendar-weeks"><view class="week-item" v-for="(item, index) in weekDays" :key="index"><text :class="{'weekend': index === 0 || index === 6}">{{ item }}</text></view></view><!-- 日期网格 --><view class="calendar-days"><view class="calendar-week" v-for="(week, weekIndex) in weeks" :key="weekIndex"><viewclass="day-item"v-for="(day, dayIndex) in week":key="dayIndex":class="{'current-month': day.isCurrentMonth,'other-month': !day.isCurrentMonth,'today': day.isToday,'selected': day.isSelected,'disabled': day.disable}"@click="selectDay(day)"><view class="day-number">{{ day.day }}</view><view class="lunar-date" v-if="showLunar">{{ day.lunar }}</view><view class="event-dot" v-if="day.hasEvent"></view></view></view></view><!-- 底部操作栏 --><view class="calendar-footer" v-if="showFooter"><view class="btn-today" @click="goToToday">今天</view><view class="btn-clear" @click="clearSelection">清除</view></view></view>
</template><script>
export default {name: 'Calendar',props: {// 默认选中日期value: {type: [Date, Array],default: null},// 是否多选multiple: {type: Boolean,default: false},// 是否显示农历showLunar: {type: Boolean,default: true},// 是否显示底部操作栏showFooter: {type: Boolean,default: true},// 特殊日期,包含事件的日期events: {type: Array,default: () => []},// 主题色themeColor: {type: String,default: '#2979ff'}},data() {return {year: new Date().getFullYear(),month: new Date().getMonth() + 1,weeks: [],weekDays: ['日', '一', '二', '三', '四', '五', '六'],selectedDays: []};},watch: {value: {handler(val) {this.initSelection(val);},immediate: true},events: {handler() {this.updateCalendar();}}},created() {this.updateCalendar();},methods: {// 更新日历数据updateCalendar() {this.weeks = this.generateCalendarData(this.year, this.month);this.markEvents();this.initSelection(this.value);},// 生成日历数据generateCalendarData(year, month) {// 实现与上文相同的函数// ...},// 切换月份changeMonth(offset) {let newMonth = this.month + offset;let newYear = this.year;if (newMonth < 1) {newMonth = 12;newYear--;} else if (newMonth > 12) {newMonth = 1;newYear++;}this.year = newYear;this.month = newMonth;this.updateCalendar();},// 选择日期selectDay(day) {if (day.disable) return;if (this.multiple) {const index = this.selectedDays.findIndex(d => d.year === day.year && d.month === day.month && d.day === day.day);if (index === -1) {// 添加选中日期this.selectedDays.push({year: day.year,month: day.month,day: day.day});} else {// 取消选中this.selectedDays.splice(index, 1);}} else {// 单选模式this.selectedDays = [{year: day.year,month: day.month,day: day.day}];}// 更新选中状态this.updateSelectedStatus();// 触发事件this.$emit('input', this.getSelectedDates());this.$emit('change', this.getSelectedDates());},// 初始化选中状态initSelection(value) {if (!value) {this.selectedDays = [];} else if (Array.isArray(value)) {this.selectedDays = value.map(date => ({year: date.getFullYear(),month: date.getMonth() + 1,day: date.getDate()}));} else if (value instanceof Date) {this.selectedDays = [{year: value.getFullYear(),month: value.getMonth() + 1,day: value.getDate()}];}this.updateSelectedStatus();},// 更新选中状态updateSelectedStatus() {this.weeks = this.weeks.map(week => {return week.map(day => {const isSelected = this.selectedDays.some(d => d.year === day.year && d.month === day.month && d.day === day.day);return { ...day, isSelected };});});},// 标记事件markEvents() {if (!this.events || !this.events.length) return;this.weeks = this.weeks.map(week => {return week.map(day => {const hasEvent = this.events.some(event => {const eventDate = new Date(event.date);return eventDate.getFullYear() === day.year &&eventDate.getMonth() + 1 === day.month &&eventDate.getDate() === day.day;});return { ...day, hasEvent };});});},// 返回选中的日期对象getSelectedDates() {const dates = this.selectedDays.map(d => {return new Date(d.year, d.month - 1, d.day);});return this.multiple ? dates : dates[0] || null;},// 跳转到今天goToToday() {const today = new Date();this.year = today.getFullYear();this.month = today.getMonth() + 1;this.updateCalendar();},// 清除选择clearSelection() {this.selectedDays = [];this.updateSelectedStatus();this.$emit('input', this.multiple ? [] : null);this.$emit('change', this.multiple ? [] : null);}}
};
</script><style lang="scss">
.calendar {background-color: #fff;border-radius: 12rpx;box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.1);padding: 20rpx;.calendar-header {display: flex;justify-content: space-between;align-items: center;margin-bottom: 20rpx;.calendar-title {font-size: 32rpx;font-weight: bold;}.calendar-controls {display: flex;.prev-month, .next-month {width: 60rpx;height: 60rpx;display: flex;justify-content: center;align-items: center;.iconfont {font-size: 28rpx;color: #666;}}}}.calendar-weeks {display: flex;border-bottom: 1px solid #f0f0f0;padding-bottom: 10rpx;.week-item {flex: 1;text-align: center;font-size: 28rpx;color: #999;.weekend {color: #ff5252;}}}.calendar-days {.calendar-week {display: flex;margin-top: 10rpx;.day-item {flex: 1;height: 80rpx;display: flex;flex-direction: column;justify-content: center;align-items: center;position: relative;border-radius: 8rpx;&.current-month {color: #333;}&.other-month {color: #ccc;}&.today {background-color: rgba(41, 121, 255, 0.1);.day-number {font-weight: bold;}}&.selected {background-color: v-bind(themeColor);color: #fff;.lunar-date {color: rgba(255, 255, 255, 0.8);}}&.disabled {color: #ddd;cursor: not-allowed;}.day-number {font-size: 28rpx;}.lunar-date {font-size: 20rpx;color: #999;margin-top: 4rpx;}.event-dot {position: absolute;width: 8rpx;height: 8rpx;border-radius: 50%;background-color: #ff5252;bottom: 6rpx;}}}}.calendar-footer {display: flex;justify-content: flex-end;margin-top: 20rpx;.btn-today, .btn-clear {padding: 6rpx 20rpx;font-size: 24rpx;border-radius: 4rpx;margin-left: 20rpx;}.btn-today {background-color: v-bind(themeColor);color: #fff;}.btn-clear {border: 1px solid #ddd;color: #666;}}
}
</style>

农历计算

对于农历的计算,我们可以使用第三方库,比如 lunar-calendar,也可以自己实现。以下是一个简化版的农历计算函数:

function getLunarDate(year, month, day) {// 实际项目中建议使用成熟的农历库// 这里只做简单演示const lunarInfo = [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,// ... 更多农历数据];// 简化版的农历计算,实际项目中请使用完整实现const lunarDay = ['初一', '初二', '初三', '初四', '初五', '初六', '初七', '初八', '初九', '初十','十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十','廿一', '廿二', '廿三', '廿四', '廿五', '廿六', '廿七', '廿八', '廿九', '三十'];// 模拟计算农历日期,实际使用中请使用准确算法const dayIndex = (year * 10000 + month * 100 + day) % 30;return lunarDay[dayIndex];
}

实际使用示例

下面是在实际项目中使用这个日历组件的示例:

<template><view class="container"><view class="header"><text class="title">我的日程</text></view><view class="calendar-wrapper"><Calendarv-model="selectedDate":events="eventList"themeColor="#42b983"@change="onDateChange"/></view><view class="event-list"><view class="list-title"><text>{{ formatDate(selectedDate) }}的日程</text></view><view class="empty-tip" v-if="!todayEvents.length"><text>暂无日程安排</text></view><view class="event-item" v-for="(event, index) in todayEvents" :key="index"><view class="event-time">{{ event.time }}</view><view class="event-content"><text class="event-title">{{ event.title }}</text><text class="event-desc">{{ event.description }}</text></view></view></view></view>
</template><script>
import Calendar from '@/components/calendar/calendar.vue';export default {components: {Calendar},data() {return {selectedDate: new Date(),eventList: [{date: '2023-05-15',title: '项目会议',time: '10:00',description: '讨论新功能开发计划'},{date: '2023-05-18',title: '团队建设',time: '14:00',description: '外出活动'},{date: '2023-05-22',title: '产品发布',time: '09:30',description: '新版本上线'}]};},computed: {todayEvents() {if (!this.selectedDate) return [];const dateStr = this.formatDate(this.selectedDate);return this.eventList.filter(event => event.date === dateStr);}},methods: {onDateChange(date) {console.log('选中日期变化:', date);},formatDate(date) {if (!date) return '';const year = date.getFullYear();const month = (date.getMonth() + 1).toString().padStart(2, '0');const day = date.getDate().toString().padStart(2, '0');return `${year}-${month}-${day}`;}}
};
</script><style lang="scss">
.container {padding: 30rpx;.header {margin-bottom: 30rpx;.title {font-size: 36rpx;font-weight: bold;}}.calendar-wrapper {margin-bottom: 40rpx;}.event-list {background-color: #fff;border-radius: 12rpx;padding: 20rpx;box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.1);.list-title {font-size: 30rpx;font-weight: bold;margin-bottom: 20rpx;color: #333;}.empty-tip {text-align: center;padding: 40rpx 0;color: #999;}.event-item {display: flex;padding: 20rpx 0;border-bottom: 1px solid #f5f5f5;&:last-child {border-bottom: none;}.event-time {width: 120rpx;color: #666;}.event-content {flex: 1;.event-title {font-size: 28rpx;color: #333;margin-bottom: 6rpx;}.event-desc {font-size: 24rpx;color: #999;}}}}
}
</style>

适配鸿蒙系统

随着华为鸿蒙系统的普及,我们也需要考虑在鸿蒙系统上的兼容性。好消息是,UniApp已经开始支持鸿蒙系统的开发。要让我们的日历组件更好地适配鸿蒙系统,可以考虑以下几点:

  1. 遵循鸿蒙设计规范:鸿蒙系统有自己的设计语言和规范,包括字体、颜色、圆角等。我们可以根据鸿蒙的设计规范调整组件样式。

  2. 性能优化:鸿蒙系统注重流畅性和低功耗,我们可以减少不必要的渲染和计算,优化日历组件的性能。

  3. 手势适配:确保日历组件的滑动等手势操作在鸿蒙系统上响应流畅。

  4. 分辨率适配:鸿蒙设备的分辨率可能有所不同,确保组件在各种分辨率下都能正常显示。

  5. 权限处理:如果日历组件需要访问系统日历数据,需要适配鸿蒙的权限管理机制。

总结与思考

通过本文,我们从零开始实现了一个功能丰富、外观精致的日历组件。这个组件具有以下特点:

  1. 灵活的日期选择:支持单选和多选模式
  2. 农历显示:可选择性显示农历信息
  3. 事件标记:能够在特定日期显示事件标记
  4. 自定义主题:支持自定义主题颜色
  5. 手势操作:支持左右滑动切换月份

当然,这个日历组件还可以进一步优化和扩展,比如:

  • 添加周视图、月视图、年视图切换功能
  • 支持日程管理,添加、编辑、删除日程
  • 增加日程提醒功能
  • 支持农历节日、法定节假日标记
  • 优化性能,减少不必要的重新渲染

希望这篇文章对你在 UniApp 开发中实现日历组件有所帮助。如果有任何问题或建议,欢迎在评论区交流讨论!

参考资料

  1. UniApp 官方文档:https://uniapp.dcloud.io/
  2. Vue.js 文档:https://cn.vuejs.org/
  3. 农历计算算法:https://github.com/jjonline/calendar.js
  4. 鸿蒙开发文档:https://developer.harmonyos.com/

相关文章:

鸿蒙OSUniApp 实现一个精致的日历组件#三方框架 #Uniapp

使用 UniApp 实现一个精致的日历组件 前言 最近在开发一个约会小程序时&#xff0c;需要实现一个既美观又实用的日历组件。市面上虽然有不少现成的组件库&#xff0c;但都不太符合我们的设计需求。于是&#xff0c;我决定从零开始&#xff0c;基于 UniApp 自己实现一个功能完…...

Kotlin 协程实战:实现异步值加载委托,对值进行异步懒初始化

在实际开发中&#xff0c;我们经常遇到这样的场景。 需要立即初始化但计算成本高昂的值 val expensiveValue calculateExpensiveValue() 可能引发阻塞的初始化操作 val resource loadResourceFromNetwork()这些场景通常需要满足以下需求&#xff1a; 异步加载&#xff1a…...

MySQL增删查改进阶

文章目录 一、数据库备份二、数据库约束2.1 NOT NULL2.2 UNIQUE&#xff1a;唯一约束2.3 DEFAULT&#xff1a;默认值约束 一、数据库备份 在MySQL当中&#xff0c;数据库是如何备份的呢&#xff1f;主要通过三种方式进行备份&#xff1a; 数据库最终都是存储在硬盘上&#xf…...

Tensorflow2保存和加载模型

1、model.save() and model.load() 此种方法可保存模型的结构、参数等内容。加载模型后无需设置即可使用&#xff01; 保存模型&#xff1a; model.save(my_model.h5) 加载模型&#xff1a; # 加载整个模型 loaded_model tf.keras.models.load_model(my_model.h5) 注意&…...

通过泛域名解析把二级域名批量绑定到wordpress的指定页面

通过泛域名解析将二级域名批量绑定到WordPress的指定页面&#xff0c;需要完成两个主要步骤&#xff1a;一是设置泛域名解析&#xff0c;二是配置服务器和WordPress以实现二级域名到指定页面的映射。以下是详细的操作方法&#xff1a; 1. 设置泛域名解析 在域名注册商的管理后…...

BGP联邦+反射器实验

一、实验拓扑 二、IP规划 骨干&#xff1a; 172.16.0.0/30 ---- R2-R3 172.16.0.4/30 ---- R3-R4 172.16.0.8/30 ---- R4-R7 172.16.0.12/30 ---- R6-R7 172.16.0.16/30 ---- R5-R6 172.16.0.20/30 ---- R2-R5 非骨干&#xff1a; 172.16.2.0/24 ---- R2的环回 2.2.2.2/32 17…...

3天云南旅游规划

云南的主要旅游城市和景点。昆明作为云南的省会&#xff0c;拥有丰富的自然景观和适合短途游玩的地方。 第一天可以安排在昆明市内和周边&#xff0c;方便游玩。 第二天&#xff0c;可以考虑去大理&#xff0c;这是云南的著名旅游城市&#xff0c;距离昆明大约2小时的车程。大理…...

SCDN能够运用在物联网加速当中吗?

在当今的科技化时代当中&#xff0c;物联网已经广泛渗透在各个领域行业当中&#xff0c;随着物联网规模的不断扩大&#xff0c;数据信息的传输速度和网络稳定性成为企业需要重视的两点因素&#xff0c;而SCDN也成为安全内容分发网络作为一种融合了内容加速和安全防护的技术&…...

Go语言八股之Mysql基础详解

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...

计算机视觉----基础概念、卷积

一、概述 1.计算机视觉的定义 计算机视觉(Computer Vision)是一个跨学科的研究领域,主要涉及如何使计算机能够通过处理和理解数字图像或视频来自动进行有意义的分析和决策。其目标是使计算机能够从视觉数据中获取高层次的理解,类似于人类的视觉处理能力。 具体来说,计算机…...

Problem E: List练习

1.题目描述 运用List完成下面的要求: 1) 创建一个List&#xff0c;在List中增加三个工人&#xff0c;基本信息如下&#xff1a; 姓名 年龄 工资 Tom 18 3000 Peter 25 3500 Mark 22 3200 2) 插入一个工人&#xff0c;信息为&#xff1a;姓名&#xff1a;Robert&#xff0…...

12-串口外设

一、串口外设的基本概述 1、基本定义 串口通信&#xff0c;通过在通信双方之间以比特位&#xff08;bit&#xff09;的形式逐一发送或接收数据&#xff0c;实现了信息的有效传递。其通信方式不仅简单可靠&#xff0c;而且成本很低。 2、stm32的串口 下面是两个MCU的数据交互&…...

C++(2)

二、面向对象基础 1. 类与对象 1.1 核心概念 类&#xff08;Class&#xff09; ​​定义​​&#xff1a;抽象描述具有共同特征和行为的对象模板​​本质​​&#xff1a;代码复用的蓝图&#xff0c;定义数据&#xff08;属性&#xff09;与操作&#xff08;行为&#xff0…...

GMT之Bash语言使用

GMT的操作有自己的逻辑和“命令”&#xff0c;但GMT是可以用Bash语言控制的&#xff0c;所以常常以.sh为后缀写GMT程序。 GMT程序运行步骤如下&#xff1a; 采用cd &#xff0c;定位到指定文件夹&#xff1b;以sh ***.sh运行GMT&#xff0c;得到结果。 另外&#xff0c;遇到…...

半成品的开源双系统VLA模型,OpenHelix-发表于2025.5.6

半成品的开源双系统VLA模型&#xff0c;OpenHelix https://openhelix-robot.github.io/ 0. 摘要 随着OpenVLA的开源&#xff0c;VLA如何部署到真实的机器人上获得了越来越多的关注&#xff0c;各界人士也都开始尝试解决OpenVLA的效率问题&#xff0c;双系统方案是其中一个非…...

fiftyone-dataset使用基础

1.创建dataset 将dataset写入数据库时&#xff0c;对于已有的dataset name会报错&#xff1a; 解决方法&#xff1a;指定覆盖写 添加参数overwriteTrue, 默认为False # 在写入数据集时&#xff0c;指定overwriteTrue&#xff0c;表示当dataset_name在数据库中已存在时&#…...

(1-4)Java Object类、Final、注解、设计模式、抽象类、接口、内部类

目录 1. Object类 1.1 equals 1.2 toString&#xff08;&#xff09; 2.final关键字 3.注解 4. 设计模式 4.1 单例模式 4.1.1 饿汉式 4.1.3 饿汉式 VS 懒汉式 5. 抽象类&抽象方法 6. 接口 1. Object类 1.1 equals 重写Object 的equals方法&#xff0c;两种实现方式…...

强力巨彩谷亚推出专业智慧显示屏,满足多元场景需求

LED显示屏作为信息传播与视觉展示的关键载体&#xff0c;其性能和品质的提升备受关注。为响应市场对高品质显示的迫切需求&#xff0c;强力巨彩旗下专业智慧显示高端品牌谷亚G-ART&#xff0c;携多款行业领先水平的LED显示屏产品亮相&#xff0c;为用户带来专业、高效且节能的显…...

基于Spring AI与Hugging Face TGI构建高效聊天应用:从配置到实践全解析

基于Spring AI与Hugging Face TGI构建高效聊天应用&#xff1a;从配置到实践全解析 前言 在人工智能技术蓬勃发展的当下&#xff0c;大语言模型&#xff08;LLM&#xff09;的应用场景日益丰富。如何快速将 Hugging Face 生态中的强大模型部署为可通过 API 访问的服务&#x…...

MySQL视图:虚拟表的强大功能与应用实践

在数据库管理系统中&#xff0c;视图(View)是一种极其重要却常被忽视的功能。作为MySQL数据库的核心特性之一&#xff0c;视图为开发者和数据库管理员提供了数据抽象、安全控制和查询简化的强大工具。本文将全面探讨MySQL视图的概念、工作原理、创建与管理方法&#xff0c;以及…...

matlab插值方法(简短)

在MATLAB中&#xff0c;可以使用interp1函数快速实现插值。以下代码展示了如何使用spline插值方法对给定数据进行插值&#xff1a; x1 [23,56]; y1 [23,56]; X 23:1:56*4; Y interp1(x1,y1,X,spline);% linear、 spline其中&#xff0c;x1和y1是已知数据点&#xff0c;X是…...

【拥抱AI】Deer-Flow字节跳动开源的多智能体深度研究框架

最近发现一款可以对标甚至可能超越GPT-Researcher的AI深度研究应用&#xff0c;Deer-Flow&#xff08;Deep Exploration and Efficient Research Flow&#xff09;作为字节跳动近期开源的重量级项目&#xff0c;正以其模块化、灵活性和人机协同能力引发广泛关注。该项目基于 La…...

基于开源AI大模型与S2B2C生态的个人品牌优势挖掘与标签重构研究

摘要&#xff1a;在数字文明时代&#xff0c;个人品牌塑造已从传统经验驱动转向数据智能驱动。本文以开源AI大模型、AI智能名片与S2B2C商城小程序源码为技术载体&#xff0c;提出"社会评价-数据验证-标签重构"的三维分析框架。通过实证研究发现&#xff0c;结合第三方…...

2025年PMP 学习十二 第9章 项目资源管理

2025年PMP 学习十二 第9章 项目资源管理 序号过程过程组1规划资源管理规划2估算活动资源规划3获取资源执行4建设团队执行5管理团队执行6控制资源监控 项目资源管理&#xff0c;包括实物资源和团队资源。 文章目录 2025年PMP 学习十二 第9章 项目资源管理项目团队和 项目管理团…...

AI生成功能测试文档|测试文档

AI生成功能测试文档&#xff1a;链接直达 计算机功能测试文档撰写教程 链接直达&#xff1a;生成功能测试文档工具 一、文档概述 &#xff08;一&#xff09;文档目的 明确计算机功能测试的流程、方法和标准&#xff0c;确保测试的有效性和可靠性&#xff0c;为软件的质量评…...

Python 常用模块(八):logging模块

目录 一、引言&#xff1a;日志模块在项目开发中的重要性二、从 Django 日志配置看 Logging 模块的核心组成三、logging模块核心组件详解3.1 记录器Logger3.2 级别Level3.3 根记录器使用3.4 处理器Handler3.5 格式化器Formatter3.6 日志流3.7 日志示例 四、日志模块总结 一、引…...

入门OpenTelemetry——可观测性与链路追踪介绍

可观测性 什么是可观测性 可观察性&#xff08;Observability&#xff09;是从外部输出知识中推断所获得&#xff0c;可理解为衡量一个系统内部状态的方法。可观测性是一种能力&#xff0c;它能帮助你回答系统内部发生了什么——无需事先定义每种可能的故障或状态。系统的可观…...

c#队列及其操作

可以用数组、链表实现队列&#xff0c;大致与栈相似&#xff0c;简要介绍下队列实现吧。值得注意的是循环队列判空判满操作&#xff0c;在用链表实现时需要额外思考下出入队列条件。 设计头文件 #ifndef ARRAY_QUEUE_H #define ARRAY_QUEUE_H#include <stdbool.h> #incl…...

【Linux C/C++开发】轻量级关系型数据库SQLite开发(包含性能测试代码)

前言 之前的文件分享过基于内存的STL缓存、环形缓冲区&#xff0c;以及基于文件的队列缓存mqueue、hash存储、向量库annoy存储&#xff0c;这两种属于比较原始且高效的方式。 那么&#xff0c;有没有高级且高效的方式呢。有的&#xff0c;从数据角度上看&#xff0c;&#xff0…...

77. 组合【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 77. 组合 一、题目描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 二、测试用例 示例 1&#xff1a; 输入&…...

GpuGeek全栈AI开发实战:从零构建企业级大模型生产管线(附完整案例)

目录 背景一、算力困境&#xff1a;AI开发者的「三重诅咒」1.1 硬件成本黑洞‌1.2 资源调度失衡‌1.3 环境部署陷阱‌ 二、三大核心技术突破GpuGeek的破局方案2.1 ‌分时切片调度引擎&#xff08;Time-Slicing Scheduler&#xff09;‌2.2 ‌异构计算融合架构2.3 ‌AI资产自动化…...

LeetCode 热题 100_颜色分类(98_75_中等_C++)(技巧)(计数;双指针)

LeetCode 热题 100_颜色分类&#xff08;98_75_中等_C&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;计数&#xff09;&#xff1a;思路二&#xff08;双指针&#xff09;&#xff1a; 代码实现代码实现&a…...

【前端】:单 HTML 去除 Word 批注

在现代办公中&#xff0c;.docx 文件常用于文档编辑&#xff0c;但其中的批注&#xff08;注释&#xff09;有时需要在分享或归档前被去除。本文将从原理出发&#xff0c;深入剖析如何在纯前端环境下实现对 .docx 文件注释的移除&#xff0c;并提供完整的实现源码。最后&#x…...

TTS-Web-Vue系列:Vue3实现内嵌iframe文档显示功能

&#x1f5bc;️ 本文是TTS-Web-Vue系列的新篇章&#xff0c;重点介绍如何在Vue3项目中优雅地实现内嵌iframe功能&#xff0c;用于加载外部文档内容。通过Vue3的响应式系统和组件化设计&#xff0c;我们实现了一个功能完善、用户体验友好的文档嵌入方案&#xff0c;包括加载状态…...

AWS CloudTrail日志跟踪启用

问题 启用日志管理。 步骤 审计界面&#xff0c;如下图&#xff1a; 点击创建跟踪&#xff0c;AWS云就会记录AWS账号在云中的操作。...

PHP 编程:现代 Web 开发的基石与演进

引言 PHP&#xff08;Hypertext Preprocessor&#xff09;自1995年诞生以来&#xff0c;已成为全球最流行的服务器端脚本语言之一。尽管近年来Node.js、Python等语言在特定领域崭露头角&#xff0c;但PHP仍占据着超过78%的网站市场份额&#xff08;W3Techs数据&#xff09;。本…...

NAT/代理服务器/内网穿透

目录 一 NAT技术 二 内网穿透/内网打洞 三 代理服务器 一 NAT技术 跨网络传输的时候&#xff0c;私网不能直接访问公网&#xff0c;就引入了NAT能讲私网转换为公网进行访问&#xff0c;主要解决IPv4(2^32)地址不足的问题。 1. NAT原理 当某个内网想访问公网&#xff0c;就必…...

[已解决] VS Code / Cursor / Trae 的 PowerShell 终端 conda activate 进不去环境的常见问题

背景 PS C:\Users\Lenovo\WPSDrive\669715199_3\WPS云盘\课程\研一\ROAS5700 Robot Motion Planning and Control\Final\LaTex报告\final-v1> conda activate mpPS C:\Users\Lenovo\WPSDrive\669715199_3\WPS云盘\课程\研一\ROAS5700 Robot Motion Planning and Control\Fin…...

Kuka AI音乐AI音乐开发「人声伴奏分离」 —— 「Kuka Api系列|中文咬字清晰|AI音乐API」第6篇

导读 今天我们来了解一下 Kuka API 的人声与伴奏分离功能。 所谓“人声伴奏分离”&#xff0c;顾名思义&#xff0c;就是将一段完整的音频拆分为两个独立的轨道&#xff1a;一个是人声部分&#xff0c;另一个是伴奏&#xff08;乐器&#xff09;部分。 这个功能在音乐创作和…...

深度伪造对知识产权保护的新挑战与应对之策

首席数据官高鹏律师团队 在科技的飞速发展带来了诸多便利的同时&#xff0c;也引发了一系列复杂的法律问题&#xff0c;其中深度伪造技术对知识产权保护的冲击尤为显著&#xff0c;亟待引起广泛关注与深入探讨。 深度伪造&#xff0c;简单来说&#xff0c;是借助先进的人工智…...

【嵌入式开发-软件定时器】

嵌入式开发-软件定时器 ■ 1.■ 2.■ 3.■ 4. ■ 1. ■ 2. ■ 3. ■ 4....

3天重庆和成都旅游规划

重庆和成都都是大城市&#xff0c;各自都有丰富的旅游资源。如果要在三天内两头都游览&#xff0c;可能需要合理安排时间&#xff0c;确保既能体验到重庆的特色&#xff0c;又能在成都游览主要景点。然而&#xff0c;考虑到交通时间&#xff0c;如果从重庆到成都需要一定的时间…...

JAVA中的文件操作

文章目录 一、文件认识&#xff08;一&#xff09;文件的分类&#xff08;二&#xff09;目录结构 二、文件操作&#xff08;一&#xff09;File类1.属性2.构造方法3.方法 &#xff08;二&#xff09;File类的具体使用1.文件路径的查看2.文件的基本操作&#xff08;1&#xff0…...

深度解析网闸策略:构建坚固的网络安全防线

深度解析网闸策略&#xff1a;构建坚固的网络安全防线 在数字化浪潮中&#xff0c;网络安全已成为企业、机构乃至国家稳定发展的关键要素。随着网络攻击手段日益复杂多样&#xff0c;传统的网络安全防护措施难以满足日益增长的安全需求。网闸作为一种先进的网络安全设备&#x…...

【Rust trait特质】如何在Rust中使用trait特质,全面解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

滑动窗口算法笔记

力扣209 题目分析&#xff1a;想象一个窗口遍历着这个数组&#xff0c;不断扩大右边界&#xff0c;让r。往窗口中添加数字&#xff1a; 此时我们找到了这个窗口&#xff0c;它的和满足了大于等于target的条件&#xff0c;题目让我求最短的&#xff0c;那么我们就尝试来缩短它&…...

Problem A: 歌手打分

1.题目描述 在歌唱比赛中&#xff0c;共有10位评委进行打分&#xff0c;在计算歌手得分时&#xff0c;去掉一个最高分&#xff0c;去掉一个最低分&#xff0c;然后剩余的8位评委的分数进行平均&#xff0c;就是该选手的最终得分。输入每个评委的评分&#xff0c;求某选手的得分…...

容器安全-核心概述

文章摘要 本文探讨了容器安全的四个核心类别&#xff0c;包括环境基础设施安全、镜像安全、运行时安全和生态安全。尽管 EDR 能提供主机安全层面的部分防护&#xff0c;但无法覆盖容器的镜像安全和生态安全。容器的镜像安全和生态安全问题&#xff0c;如镜像漏洞、恶意镜像、容…...

Golang实践录:在go中使用curl实现https请求

之前曾经在一个 golang 工程调用 libcur 实现 https的请求&#xff0c;当前自测是通过的。后来迁移到另一个小系统出现段错误&#xff0c;于是对该模块代码改造&#xff0c;并再次自测。 问题提出 大约2年前&#xff0c;在某golang项目使用libcurl进行https请求&#xff08;参…...

nvrtc环境依赖

一 下载 1.1 添加nvidia的源&#xff08;不同于pypi&#xff09; pip install nvidia-pyindex 1.2 pip dowload 执行 pip download nvidia-cuda-runtime nvidia-cuda-python 会发现文件夹多了以下几个文件 而需要安装的则只有红框的三个文件&#xff0c; 二 安装 对红框的…...