鸿蒙next 自定义日历组件

效果图预览

20250124-113957

使用说明

1.选择日期左右箭头,实现每月日历切换,示例中超出当前月份,禁止进入下一月,可在代码更改

2.日历中显示当前选择的日期,选中的日期颜色可自定义

3.日历中可展示历史记录作为数据存储标志

4.当前页面选择的日期可在本页面保存状态

可根据自己需求,对日历组件进行更改,将代码拷贝到DevEco Studio 可直接运行使用

日历组件使用代码

@Entry
@Component
struct TEST {@State currentSelectDate: string = calendarUtils.getCurrentDay(); // 当前读取数据日期,用户数据获取private historyDateArray: string[] =[calendarUtils.getPreviousDay(calendarUtils.getCurrentDay()), calendarUtils.getCurrentDay()];private calendarController: CustomDialogController | null = new CustomDialogController({builder: CustomCalendar({currentSelectDate: this.currentSelectDate,defaultSelectDates: this.historyDateArray,colors: ["#fed2cf", "#ed553c", "#f74d33", "#fcfaff"],cancel: () => {this.calendarController?.close();},confirm: (date: Date) => {this.selectCalendarConfirm(date)}}),autoCancel: true,alignment: DialogAlignment.BottomEnd,offset: { dx: -8, dy: -20 },gridCount: 4,showInSubWindow: true,width: 359,isModal: true,customStyle: false,cornerRadius: 16,})// 选择日历确认框selectCalendarConfirm(date: Date) {let dateTime = new Date(date);let year = dateTime.getFullYear();let month = dateTime.getMonth() + 1;let day = dateTime.getDate();let strDate = `${year}-${month}-${day}`;this.currentSelectDate = strDate;let selectIndex = calendarUtils.getDaysFromDate(strDate);this.calendarController?.close();}build() {Column() {Button("日历组件").onClick(() => {this.calendarController?.open();})}.width('100%').height('100%')}
}

日历组件代码

import { calendarUtils } from "../../utlis/calendarUtils";interface monthType {defaultData: boolean,value: number
}// 日历
@CustomDialog
export struct CustomCalendar {controller?: CustomDialogController@State selectedDate: Date = new Date();@State isDateSelected: boolean = false;@State currentMonth: number = new Date().getMonth(); // 当前选择的月数@State defaultMonth: number = new Date().getMonth(); // 默认月数@State currentYear: number = new Date().getFullYear();@Prop defaultSelectDates: string[] = []; // 默认历史数据@State defaultYear: number = new Date().getFullYear();@Prop currentSelectDate: string = calendarUtils.getCurrentDay();@Prop colors: string[] = ["#fed2cf", "#ed553c", "#f74d33", "#fcfaff"]; // 0 默认背景 1 背景默认字体颜色 2 选中背景 3 选中字体颜色@State monthDays: monthType[] = []; // 月份天数cancel: () => void = () => {}confirm: (date: Date) => void = () => {}aboutToAppear() {console.log("currentSelectDate===>", this.currentSelectDate)this.onDefaultDataSelect(this.currentSelectDate);let days = this.getDaysInMonth();console.log("days===>", JSON.stringify(days))this.monthDays = [...days]}build() {Column() {Row({ space: 30 }) {Image($r('app.media.rightArrow')).width('24vp').height('24vp').padding({left: 8,right: 8,top: 4,bottom: 4}).rotate({x: 0,y: 0,z: 90,centerX: '50%',centerY: '50%',angle: 180}).onClick(() => this.onMonthChange(-1))Text(`${this.currentYear}年${this.currentMonth + 1 >= 10 ? this.currentMonth + 1 :'0' + (this.currentMonth + 1)}月`).fontSize(20).fontWeight(FontWeight.Bold).margin({ left: 15, right: 15 })if (this.defaultYear != this.currentYear || this.currentMonth != this.defaultMonth) {Image($r('app.media.rightArrow')).width('24vp').height('24vp').padding({left: 8,right: 8,top: 4,bottom: 4}).onClick(() => this.onMonthChange(1))} else {Image($r('app.media.rightArrowGray')).width('24vp').height('24vp').padding({left: 8,right: 8,top: 4,bottom: 4})}}.width('100%').justifyContent(FlexAlign.Center).margin({ top: 20, bottom: 30 })// 星期标题Row() {ForEach(['日', '一', '二', '三', '四', '五', '六'], (day: string) => {Text(day).textAlign(TextAlign.Center).fontSize(18).fontColor('#999999')}, (day: string) => day)}.width('93%').margin({ bottom: 10 }).justifyContent(FlexAlign.SpaceBetween)Grid() {ForEach(this.monthDays, (item: monthType, index: number) => {GridItem() {Column() {Text(item.value.toString()).fontSize(18).fontWeight(this.isSelectedDate(item.value) ? FontWeight.Bold : FontWeight.Normal).fontColor(this.isSelectedDate(item.value) ? this.colors[3] :item.defaultData ? this.colors[1] : this.getDateColor(item.value))}.width('100%').height('100%').borderRadius(25).backgroundColor(this.isSelectedDate(item.value) ? this.colors[2] :(item.defaultData ? this.colors[0] : Color.Transparent)).justifyContent(FlexAlign.Center)}.aspectRatio(1).onClick(() => this.onDateSelected(item.value))})}.width('100%').columnsTemplate('1fr 1fr 1fr 1fr 1fr 1fr 1fr').rowsGap(8).columnsGap(8).height('260vp')// 按钮Row() {Button('取消', { type: ButtonType.Normal }).width('140vp').height('50vp').backgroundColor("#f6f6f6").fontColor("#171d29").borderRadius(12).onClick(() => {this.cancel();})Button('确定', { type: ButtonType.Normal }).width('140vp').height('50vp').backgroundColor("#171d29").borderRadius(12).onClick(() => {console.log("this.selectedDate==>", this.selectedDate);this.confirm(this.selectedDate)console.log("this.monthDays=>", JSON.stringify(this.monthDays))})}.width('100%').height('50vp').justifyContent(FlexAlign.SpaceBetween).padding({ left: 18, right: 18 }).margin({ bottom: 10 });}.width('100%').padding({left: 16,right: 16,top: 16,bottom: 16}).backgroundColor('#ffffff')}private onMonthChange(increment: number) {let newMonth = this.currentMonth + incrementlet newYear = this.currentYearif (newMonth > 11) {newMonth = 0newYear++} else if (newMonth < 0) {newMonth = 11newYear--}this.currentMonth = newMonth;this.currentYear = newYear;let result = this.getDaysInMonth();this.monthDays = [...result];}private onDateSelected(day: number) {const newSelectedDate = new Date(this.currentYear, this.currentMonth, day);const currentDate = new Date(this.currentYear, this.currentMonth, day)const today = new Date()// 如果点击的值大于今天值,不选中if (currentDate > today) {return}if (this.isDateSelected &&this.selectedDate.getDate() === day &&this.selectedDate.getMonth() === this.currentMonth &&this.selectedDate.getFullYear() === this.currentYear) {// 如果点击的是已选中的日期,取消选中// this.isDateSelected = falsethis.isDateSelected = true} else {// 否则,选中新的日期this.selectedDate = newSelectedDatethis.isDateSelected = true}}// 默认选中private onDefaultDataSelect(value: string) {let date = value.split("-");let year = Number(date[0]); // 获取当前年let month = Number(date[1]) - 1; // 获取当前月,如果需要渲染到页面,需要+1,不渲染默认进行计算let day = Number(date[2]); // 获取当前天数this.selectedDate = new Date(year, month, day);this.isDateSelected = true;}private isSelectedDate(day: number): boolean {return this.isDateSelected &&this.selectedDate.getDate() === day &&this.selectedDate.getMonth() === this.currentMonth &&this.selectedDate.getFullYear() === this.currentYear}private getDaysInMonth(): monthType[] {const daysInMonth = new Date(this.currentYear, this.currentMonth + 1, 0).getDate();const selectMonth = new Date(this.currentYear, this.currentMonth + 1, 0).getMonth() + 1;const selectYear = new Date(this.currentYear, this.currentMonth + 1, 0).getFullYear();let array = Array.from<number, number>({ length: daysInMonth }, (_, i) => i + 1);let result: monthType[] = [];for (let i = 0; i < array.length; i++) {let obj: monthType = {value: array[i],defaultData: false,}let selectData = this.defaultSelectDates.find((item: string) => {let date = item.split("-");let year = date[0];let month = date[1];let day = date[2];if (selectYear == Number(year) && selectMonth == Number(month) && Number(day) == array[i]) {return item} else {return undefined}});if (selectData) {obj.defaultData = true;} else {obj.defaultData = false;}result.push(obj);}return result;}private getDateColor(day: number): string {const currentDate = new Date(this.currentYear, this.currentMonth, day)const today = new Date()today.setHours(0, 0, 0, 0)if (currentDate > today) {return '#CCCCCC' // 灰色显示过去的日期} else if (this.isSelectedDate(day)) {return '#ffffff' // 选中日期的文字颜色} else {return '#000000' // 未选中日期的文字颜色}}private getLunarDate(day: number): string {return LunarDate.solarToLunar(this.currentYear, this.currentMonth + 1, day);}
}class LunarDate {private static lunarInfo: number[] = [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977,0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970,0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950,0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557,0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5d0, 0x14573, 0x052d0, 0x0a9a8, 0x0e950, 0x06aa0,0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0,0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b5a0, 0x195a6,0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570,0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0,0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5,0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930,0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530,0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45,0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0];private static Gan = ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"];private static Zhi = ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"];private static Animals = ["鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"];private static lunarMonths = ["正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "冬", "腊"];private static lunarDays = ["初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十","十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十","廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十"];static solarToLunar(year: number, month: number, day: number): string {if (year < 1900 || year > 2100) {return "无效年份";}const baseDate = new Date(1900, 0, 31);const objDate = new Date(year, month - 1, day);let offset = Math.floor((objDate.getTime() - baseDate.getTime()) / 86400000);let i: number, leap = 0, temp = 0;for (i = 1900; i < 2101 && offset > 0; i++) {temp = LunarDate.getLunarYearDays(i);offset -= temp;}if (offset < 0) {offset += temp;i--;}const lunarYear = i;leap = LunarDate.getLeapMonth(i);let isLeap = false;for (i = 1; i < 13 && offset > 0; i++) {if (leap > 0 && i === (leap + 1) && isLeap === false) {--i;isLeap = true;temp = LunarDate.getLeapDays(lunarYear);} else {temp = LunarDate.getLunarMonthDays(lunarYear, i);}if (isLeap === true && i === (leap + 1)) {isLeap = false;}offset -= temp;}if (offset === 0 && leap > 0 && i === leap + 1) {if (isLeap) {isLeap = false;} else {isLeap = true;--i;}}if (offset < 0) {offset += temp;--i;}const lunarMonth = i;const lunarDay = offset + 1;const monthStr = (isLeap ? "闰" : "") + LunarDate.lunarMonths[lunarMonth - 1];const dayStr = LunarDate.lunarDays[lunarDay - 1];return dayStr === '初一' ? monthStr + "月" : dayStr;}private static getLunarYearDays(year: number): number {let i = 0, sum = 348;for (i = 0x8000; i > 0x8; i >>= 1) {sum += (LunarDate.lunarInfo[year - 1900] & i) ? 1 : 0;}return sum + LunarDate.getLeapDays(year);}private static getLeapMonth(year: number): number {return LunarDate.lunarInfo[year - 1900] & 0xf;}private static getLeapDays(year: number): number {if (LunarDate.getLeapMonth(year)) {return (LunarDate.lunarInfo[year - 1900] & 0x10000) ? 30 : 29;}return 0;}private static getLunarMonthDays(year: number, month: number): number {return (LunarDate.lunarInfo[year - 1900] & (0x10000 >> month)) ? 30 : 29;}
}

日期处理utils代码

class CalendarUtils {private totalDays: number = 0;// 获取日历全部时间列表值public getCalendarListCount() {let list: number[] = []for (let i = 1; i <= this.getDaysInLastTenYears(); i++) {list.push(i);}return list;}// 获取前10年的总共天数public getDaysInLastTenYears(): number {const now = new Date();const tenYearsAgo = new Date(now.getFullYear() - 10, now.getMonth(), now.getDate());const millisecondsInDay = 1000 * 60 * 60 * 24;const diffInMilliseconds = now.getTime() - tenYearsAgo.getTime();this.totalDays = Math.ceil(diffInMilliseconds / millisecondsInDay);return Math.ceil(diffInMilliseconds / millisecondsInDay);}// 根据当前天数获取年月日public getDateFromDaysAgo(days: number): string {const now = new Date();let dayCount = this.totalDays - days;const millisecondsPerDay = 1000 * 60 * 60 * 24;const targetDate = new Date(now.getTime() - dayCount * millisecondsPerDay);const year = targetDate.getFullYear();const month = String(targetDate.getMonth() + 1).padStart(2, '0'); // Months are zero-basedconst day = String(targetDate.getDate()).padStart(2, '0');return `${year}-${month}-${day}`;}// 根据年月日获取天数下标 反值public getDaysFromDate(dateString: string): number {const dateParts = dateString.split('-');const targetDate = new Date(Number(dateParts[0]), Number(dateParts[1]) - 1, Number(dateParts[2]));const now = new Date();const diffInMilliseconds = now.getTime() - targetDate.getTime();const millisecondsPerDay = 1000 * 60 * 60 * 24;let days = Math.floor(Math.abs(diffInMilliseconds) / millisecondsPerDay);return (this.totalDays - 1) - days;}// 获取上一天年月日public getPreviousDay(value: string | Date): string {const now = new Date(value);now.setDate(now.getDate() - 1); // 获取前一天const year = now.getFullYear();const month = String(now.getMonth() + 1).padStart(2, '0'); // 月份从0开始,所以需要+1,并补0const day = String(now.getDate()).padStart(2, '0'); // 补0return `${year}-${month}-${day}`;}// 获取下一天年月日public getNextDay(value: string | Date): string {const now = new Date(value);now.setDate(now.getDate() + 1); // 获取后一天const year = now.getFullYear();const month = String(now.getMonth() + 1).padStart(2, '0'); // 月份从0开始,所以需要+1,并补0const day = String(now.getDate()).padStart(2, '0'); // 补0return `${year}-${month}-${day}`;}// 获取当前年月日public getCurrentDay() {const now = new Date();const year = now.getFullYear();const month = String(now.getMonth() + 1).padStart(2, '0'); // 月份从0开始,加一,补0const day = String(now.getDate()).padStart(2, '0'); // 补0return `${year}-${month}-${day}`;}// 获取前10年的年月茹public getTheFirstYearsDate(value: number) {const currentDate = new Date();const currentYear = currentDate.getFullYear();// 获取前10年的日期const previousTenYearsDate = new Date(currentDate.setFullYear(currentYear - value));const Year = previousTenYearsDate.getFullYear();const Month = String(previousTenYearsDate.getMonth() + 1).padStart(2, '0');const Day = String(previousTenYearsDate.getDate()).padStart(2, '0');return `${Year}-${Month}-${Day}`;}
}// 获取数据预加载
export class MyDataSource implements IDataSource {private list: number[] = []constructor(list: number[]) {this.list = list}totalCount(): number {return this.list.length}getData(index: number): number {return this.list[index]}registerDataChangeListener(listener: DataChangeListener): void {}unregisterDataChangeListener() {}
}export const calendarUtils = new CalendarUtils();

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

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

相关文章

Linux 部署 Java 项目:Tomcat、Redis、MySQL 教程

在 Linux 服务器上部署 Java 项目通常需要配置应用服务器&#xff08;如 Tomcat&#xff09;、数据库&#xff08;如 MySQL&#xff09;和缓存服务器&#xff08;如 Redis&#xff09;。本文将详细介绍如何在 Linux 环境中部署一个 Java 项目&#xff0c;涵盖 Tomcat、Redis 和…

Python数据可视化(够用版):懂基础 + 专业的图表抛给Tableau等专业绘图工具

我先说说文章标题中的“够用版”啥意思&#xff0c;为什么这么写。 按照我个人观点&#xff0c;在使用Python进行数据分析时&#xff0c;我们有时候肯定要结合到图表去进行分析&#xff0c;去直观展现数据的规律和特定&#xff0c;那么我们肯定要做一些简单的可视化&#xff0…

【C++】特殊类设计、单例模式与类型转换

目录 一、设计一个类不能被拷贝 &#xff08;一&#xff09;C98 &#xff08;二&#xff09;C11 二、设计一个类只能在堆上创建对象 &#xff08;一&#xff09;将构造函数私有化&#xff0c;对外提供接口 &#xff08;二&#xff09;将析构函数私有化 三、设计一个类只…

Jetpack Compose 和 Compose Multiplatform 还有 KMP 的关系

今天刚好看到官方发布了一篇文章&#xff0c;用于讨论 Compose Multiplatform 和 Jetpack Compose 之间的区别&#xff0c;突然想起之前评论区经常看到说 “Flutter 和 CMP 对于 Google 来说项目重叠的问题”&#xff0c;刚好可以放一起聊一聊。 最近写的几篇内容写的太干&…

uniapp 在线更新应用

在线更新应用及进度条显示 1.比较现安装手机中的apk 与线上apk的版本 getVersion(){var newVersionuni.getStorageSync("newVersion").split(".")var versionplus.runtime.version.split(".") // 获取手机安装的版本var versionNum""…

ICSE‘25 LLM Assistance for Memory Safety

不知道从什么时候开始&#xff0c;各大技术社区&#xff0c;技术群聊流行着 “用Rust重写!” &#xff0c;放一张图(笑死… 这不, 随着大模型技术的流行&#xff0c;大家都在探索如何让大模型自动完成仓库级别(全程序)的代码重构&#xff0c;代码变换&#xff08;Refactor&…

华为 Ascend 平台 YOLOv5 目标检测推理教程

1. 背景介绍 随着人工智能技术的快速发展&#xff0c;目标检测在智能安防、自动驾驶、工业检测等领域中扮演了重要角色。YOLOv5 是一种高效的目标检测模型&#xff0c;凭借其速度和精度的平衡广受欢迎。 华为 Ascend 推理框架&#xff08;ACL&#xff09;是 Ascend CANN 软件…

Linux MySQL离线安装

一、准备工作 1. 下载MySQL安装包 访问MySQL官方网站&#xff0c;选择适合您Linux系统的MySQL版本进行下载。通常推荐下载Generic Linux (glibc 2.12)版本的.tar.gz压缩包&#xff0c;例如mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz。将下载好的安装包拷贝到Linux服务器的某…

TRTC实时对话式AI解决方案,助力人机语音交互极致体验

近年来&#xff0c;AI热度持续攀升&#xff0c;无论是融资规模还是用户热度都大幅增长。2023 年&#xff0c;中国 AI 行业融资规模达2631亿人民币&#xff0c;较2022年上升51%&#xff1b;2024年第二季度&#xff0c;全球 AI 初创企业融资规模为 240 亿美金&#xff0c;较第一季…

Android多语言开发自动化生成工具

在做 Android 开发的过程中&#xff0c;经常会遇到多语言开发的场景&#xff0c;尤其在车载项目中&#xff0c;多语言开发更为常见。对应多语言开发&#xff0c;通常都是在中文版本的基础上开发其他国家语言&#xff0c;这里我们会拿到中-外语言对照表&#xff0c;这里的工作难…

最新最详细的配置Node.js环境教程

配置Node.js环境 一、前言 &#xff08;一&#xff09;为什么要配置Node.js&#xff1f;&#xff08;二&#xff09;NPM生态是什么&#xff08;三&#xff09;Node和NPM的区别 二、如何配置Node.js环境 第一步、安装环境第二步、安装步骤第三步、验证安装第四步、修改全局模块…

Greenplum临时表未清除导致库龄过高处理

1.问题 Greenplum集群segment后台日志报错 2.回收库龄 master上执行 vacuumdb -F -d cxy vacuumdb -F -d template1 vacuumdb -F -d rptdb 3.回收完成后检查 仍然发现segment还是有库龄报警警告信息发出 4.检查 4.1 在master上检查库年龄 SELECT datname, datfrozen…

CAPL自动化测试

CAPL自动化测试 目录 CAPL自动化测试1. 引言2. 测试用例设计与实现2.1 测试用例设计2.2 测试用例实现3. 测试报告生成与分析3.1 测试报告生成3.2 测试报告分析4. 自动化测试框架搭建4.1 自动化测试框架设计4.2 自动化测试框架实现5. 案例说明5.1 案例1:测试用例设计与实现5.2 …

【go语言】map 和 list

一、map map 是一种无序的键值对的集合。 无序 &#xff1a;map[key]键值对&#xff1a;key - value map 最重要的一点是通过 key 来快速检索数据&#xff0c;key 类似于索引&#xff0c;指向数据的值。map 是一种集合&#xff0c;所以我们可以像迭代数组和切片那样迭代他。…

Python自动化运维:一键掌控服务器的高效之道

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在互联网和云计算高速发展的今天,服务器数量的指数增长使得手动运维和管理变得异常繁琐。Python凭借其强大的可读性和丰富的生态系统,成为…

数据融合的经典模型:早期融合、中期融合与后期融合的对比

在多模态数据融合中&#xff0c;如何将不同模态&#xff08;如图像、文本、语音等&#xff09;的数据整合到一个统一的表示中&#xff0c;是至关重要的环节。不同的任务需求和数据特点决定了我们应该采用哪种融合策略&#xff0c;而早期融合、中期融合和后期融合是多模态数据处…

使用python调用JIRA6 进行OAuth1认证获取AccessToken

Jira配置应用程序链接 1) 创建应用程序链接 登录 JIRA 管理后台。转到 Administration > Applications > Application Links。在输入框中输入外部应用程序的 URL&#xff08;例如 GitLab 或自定义应用&#xff09;&#xff0c;然后点击 Create new link。 2) 配置 Con…

WPF基础 | WPF 基础概念全解析:布局、控件与事件

WPF基础 | WPF 基础概念全解析&#xff1a;布局、控件与事件 一、前言二、WPF 布局系统2.1 布局的重要性与基本原理2.2 常见布局面板2.3 布局的测量与排列过程 三、WPF 控件3.1 控件概述与分类3.2 常见控件的属性、方法与事件3.3 自定义控件 四、WPF 事件4.1 路由事件概述4.2 事…

2K高刷电竞显示器推荐

2K高刷电竞显示器推荐&#xff0c;各位喜欢打游戏&#xff0c;身为电竞迷的小伙伴&#xff0c;如果你想选一款2K高刷电竞显示器&#xff0c;那么下面的内容不容错过。 1.HKC G27H4Pro - 2K高刷电竞显示器推荐 外观 - HKC G27H4Pro 2K高刷电竞显示器 初见 HKC G27H4Pro&#x…

【29】Word:李楠-学术期刊❗

目录 题目​ NO1.2.3.4.5 NO6.7.8 NO9.10.11 NO12.13.14.15 NO16 题目 NO1.2.3.4.5 另存为手动/F12Fn光标来到开头位置处→插入→封面→选择花丝→根据样例图片&#xff0c;对应位置填入对应文字 (手动调整即可&#xff09;复制样式&#xff1a;开始→样式对话框→管理…