Vue+ElementUI+C#技巧分享:周数选择器

news2024/11/28 12:36:53

文章目录

  • 前言
  • 一、周数的计算逻辑
    • 1.1 周数的定义
    • 1.2 年初周数的确定
    • 1.3 周数的计算方法
  • 二、Vue+ElementUI代码实现
    • 2.1 计算周数
    • 2.2 获取周的日期范围
    • 2.3 根据周数获取日期范围
    • 2.4 控件引用
      • 2.4.1 控件引用代码分析
      • 2.4.2 初始化变量代码分析
    • 2.5 周数选择器完整代码
  • 三、C#后端代码实现
    • 3.1 类实现
    • 3.1 静态方法实现
  • 总结

前言

Vue.js和ElementUI的结合使用已成为创建高效、美观和用户友好的Web应用的一种流行方式。特别是在处理复杂的用户界面和交互时,这种组合展现出其独特的优势。这篇博客旨在深入探讨如何利用Vue和ElementUI来构建一个实用的周数选择器。
周数选择器
周数选择器在很多类型的应用程序中都非常重要,尤其是在需要日期管理的系统中,如日历应用、项目管理工具或报告系统。正确地理解和计算周数对于确保数据的准确性和用户界面的一致性至关重要。然而,由于不同地区和标准对周的定义存在差异,开发这样的功能可能会带来挑战。

为了克服这些挑战并提供一个有效的解决方案,本博客首先从理论出发,详细介绍了周数的计算逻辑,特别是依据国际标准ISO 8601的定义。接着,我们深入到具体的代码实现,展示了如何在Vue和ElementUI框架下实现这一功能。

通过这篇博客,无论是对Vue和ElementUI初学者还是有经验的开发者,都能学到如何实现周数选择器这一具体功能,同时也能对如何在Vue中构建和管理复杂UI组件有更深入的理解。希望这篇博客能成为在Vue和ElementUI应用开发旅程中的宝贵资源。


一、周数的计算逻辑

在本章中,我们将探讨周数的计算逻辑,特别是以周一作为每周的起始日。

1.1 周数的定义

根据国际标准ISO 8601,一年的周数通常是从周一开始计算的。一周的第一天是周一,最后一天是周日。这种计算方式在欧洲和其他一些地区非常常见。

ISO 8601标准广泛应用于国际贸易、通信和其他领域,因为它提供了一种统一的日期和时间表示方法,有助于减少跨国交流中的混淆和误解。在开发支持多国用户的应用程序时,遵循这一标准尤为重要。

1.2 年初周数的确定

年初的周数计算较为特殊。如果1月1日恰好是周一,则该日即为第一周的开始。如果1月1日是周二至周日之间的任何一天,则该周属于上一年的最后一周,新的一年的第一周将从下一个周一开始。

具体来说,基于国际标准ISO 8601,一年中的第一周必须包含该年的1月4日。这实际上意味着如果1月1日至1月4日之间的任何一天是周一至周四,则这一周被视为当年的第一周。

这种计算方式的逻辑基础如下:

  • 包含1月4日的周为第一周:由于1月4日最晚只可能是一年中第一个星期四,因此保证了这一周至少有四天属于新的一年。这样做的目的是为了确保每年的第一周至少包括四天。
  • 年初的周数处理:如果1月1日是周五、周六或周日,则该周被计为上一年的最后一周。因为在这种情况下,该周中大部分或所有天数都属于上一年。

1.3 周数的计算方法

周数的计算可以通过以下步骤实现:

  1. 确定年份的第一天:首先,确定当前年份的第一天(1月1日)是星期几。

  2. 计算首周偏移量:如果1月1日不是周一,则需要计算出距离下一个周一还有几天。这将决定第一周的长度。

  3. 累加周数:从年初开始,根据每周七天的规则,累加周数。特别注意跨年和闰年的情况,这可能会影响总周数。

  4. 处理年末的周数:在年末,最后一周可能不会完整。如果12月31日不是周日,则该周的剩余天数将计入新的一年。

二、Vue+ElementUI代码实现

2.1 计算周数

这个方法用于计算给定日期所在的周数。它是整个周数选择器功能的核心。

getWeekNumber (date) {
   var yearStart = new Date(date.getFullYear(), 0, 1)
   var januaryFirstDayOfWeek = yearStart.getDay() === 0 ? 6 : yearStart.getDay() - 1 // 将周日从0转换为7

   var firstMonday = new Date(yearStart)
   if (januaryFirstDayOfWeek <= 3) {
     // 如果1月1日至1月4日之间为周一至周四,则该周为第一周
     firstMonday.setDate(yearStart.getDate() - januaryFirstDayOfWeek)
   } else {
     // 否则,下周一为第一周的开始
     firstMonday.setDate(yearStart.getDate() + 7 - januaryFirstDayOfWeek)
   }

   var dayCount = Math.ceil((date - firstMonday) / (24 * 3600 * 1000))
   return Math.ceil(dayCount / 7)
 },
  • 参数date(Date对象,表示需要计算周数的日期)

  • 逻辑

    • 计算年份开始时的日期(1月1日)和它是周几。
    • 如果1月1日是周一至周四之间,那么该周被视为第一周。否则,第一周从下一个周一开始。
    • 根据这个逻辑,计算出给定日期所在的周数。
  • 实现细节

    • yearStart获取年份的第一天。
    • januaryFirstDayOfWeek变量调整周日的表示方法,以符合ISO 8601标准。
    • firstMonday确定第一周的周一日期。
    • 最后,计算并返回给定日期的周数。

2.2 获取周的日期范围

getWeekDateRange (date) {
  // 计算当前日期是周几,ISO周从周一开始
  var currentDay = date.getDay()
  var distanceToMonday = currentDay === 0 ? 6 : currentDay - 1
  // 计算当前周的周一和周日
  var monday = new Date(date)
  monday.setDate(date.getDate() - distanceToMonday)
  var sunday = new Date(monday)
  sunday.setDate(monday.getDate() + 6)
  // 格式化日期为 yyyy-MM-dd
  var format = (d) => d.toISOString().split('T')[0]
  return [format(monday), format(sunday)]
},

这个方法用于计算给定日期所在周的起始和结束日期。

  • 参数date(Date对象,表示当前日期)

  • 逻辑

    • 计算当前日期是周几,然后找到当前周的周一和周日。
    • 返回这一周的日期范围。
  • 实现细节

    • 使用currentDaydistanceToMonday计算周一的日期。
    • 计算出当前周的周一和周日的日期。
    • 返回格式化后的日期范围。

2.3 根据周数获取日期范围

getWeekDateRangeByWeekNumber (weekNumber, year) {
  var januaryFirst = new Date(year, 0, 1)
  var januaryFirstDayOfWeek = januaryFirst.getDay() === 0 ? 6 : januaryFirst.getDay() - 1 // 将周日从0转换为7
  var firstMonday = new Date(januaryFirst)
  if (januaryFirstDayOfWeek <= 3) {
    // 如果1月1日至1月4日之间为周一至周四,则该周为第一周
    firstMonday.setDate(januaryFirst.getDate() - januaryFirstDayOfWeek + 1)
  } else {
    // 否则,下周一为第一周的开始
    firstMonday.setDate(januaryFirst.getDate() + 8 - januaryFirstDayOfWeek)
  }

  var weekStart = new Date(firstMonday)
  weekStart.setDate(firstMonday.getDate() + (weekNumber - 1) * 7)

  var weekEnd = new Date(weekStart)
  weekEnd.setDate(weekStart.getDate() + 6)

  // 格式化日期为 yyyy-MM-dd
  var format = (d) => d.toISOString().split('T')[0]
  return [format(weekStart), format(weekEnd)]
}

这个方法根据给定的周数和年份,计算出那一周的起始和结束日期。

  • 参数weekNumber(周数),year(年份)

  • 逻辑

    • 首先确定该年份的第一周的起始日(周一)。
    • 然后根据给定的周数计算出那一周的起始和结束日期。
  • 实现细节

    • getWeekNumber类似,先确定年份的第一周的周一。
    • 使用给定的周数,计算出那一周的起始日期。
    • 计算并返回该周的起始和结束日期。

2.4 控件引用

在这个部分,我们将讨论如何在Vue应用中引入和使用一个自定义的WeekSelector组件,这是一个周数选择控件。以下是控件的引用和初始化过程的解析。

2.4.1 控件引用代码分析

  1. 组件标签引用

    <WeekSelector v-else-if="column.searchType==='weekselector'"
                  :model.sync="searchElement[column.prop]"></WeekSelector>
    
    • 这段代码演示了如何在模板中使用WeekSelector组件。
    • 使用v-else-if指令来条件渲染WeekSelector组件,条件是某个列的searchType属性为'weekselector'
    • :model.sync是一个同步属性,它将searchElement[column.prop]的值与WeekSelector组件的model属性绑定。这意味着当model属性在组件内部变化时,searchElement[column.prop]也会相应更新。
  2. 组件导入

    import WeekSelector from './WeekSelector'
    
    • 这行代码从WeekSelector文件中导入WeekSelector组件。
  3. 在Vue实例中注册组件

    components: {
      // 其他代码
      WeekSelector
    }
    
    • 这段代码在当前Vue实例的components选项中注册WeekSelector组件,使其在当前实例的模板中可用。

2.4.2 初始化变量代码分析

初始化的主要作用是抑制Vue警告

[Vue warn]: Invalid prop: type check failed for prop "model". Expected Number with value 0, got String with value "".
this.tabInfo = this.tab
this.searchElement = this.searchModel
for (let column of this.tabInfo.searchFormat) {
  if (column.searchType === 'weekselector') {
    // 使用 Vue 的 $set 方法确保响应性
    this.$set(this.searchElement, column.prop, -1)
  }
}
  • 这段代码用于初始化与WeekSelector组件相关的数据。
  • this.tabInfothis.searchElement分别是对其他对象的引用,用于设置和获取搜索条件。
  • 循环遍历this.tabInfo.searchFormat中的每一列,对于类型为weekselector的列,使用Vue的$set方法来初始化this.searchElement对象的相应属性。这里使用$set是为了确保新增的属性是响应式的,这样当属性值发生变化时,Vue能够检测到并更新视图。

以上代码段展示了如何在Vue应用中引入、注册和初始化自定义组件WeekSelector。这个组件的主要功能是作为一个周数选择器,用于提供用户界面上对周数的选择功能。通过这些步骤,可以确保WeekSelector组件能够正确地被引用并且其状态的变化能够被Vue实例正确地管理和响应。

2.5 周数选择器完整代码

文件名:WeekSelector.vue

<template>
  <div>
    <el-row>
      <el-col :span="6">
        <el-input-number v-model="weekNumber"
                         :min="0"
                         :max="52"
                         label="周数" />
      </el-col>
      <el-col :span="18">
        <el-form-item label="日期范围:">
          <el-date-picker type="daterange"
                          id="dateRange"
                          range-separator="至"
                          style="width: 100%;"
                          size="mini"
                          start-placeholder="开始日期"
                          end-placeholder="结束日期"
                          value-format="yyyy-MM-dd"
                          v-model="dateRange"
                          :readonly="true"></el-date-picker>
        </el-form-item>
      </el-col>
    </el-row>
  </div>
</template>

<script>
export default {
  create () {
    this.weekNumber = this.model
  },
  data () {
    return {
      weekNumber: this.getWeekNumber(new Date()),
      dateRange: this.getWeekDateRange(new Date())
    }
  },
  methods: {
    getWeekNumber (date) {
      var yearStart = new Date(date.getFullYear(), 0, 1)
      var januaryFirstDayOfWeek = yearStart.getDay() === 0 ? 6 : yearStart.getDay() - 1 // 将周日从0转换为7

      var firstMonday = new Date(yearStart)
      if (januaryFirstDayOfWeek <= 3) {
        // 如果1月1日至1月4日之间为周一至周四,则该周为第一周
        firstMonday.setDate(yearStart.getDate() - januaryFirstDayOfWeek)
      } else {
        // 否则,下周一为第一周的开始
        firstMonday.setDate(yearStart.getDate() + 7 - januaryFirstDayOfWeek)
      }

      var dayCount = Math.ceil((date - firstMonday) / (24 * 3600 * 1000))
      let weekNum = Math.ceil(dayCount / 7)
      // 父级控件 v-model 绑定
      this.$emit('update:model', weekNum)
      return weekNum
    },
    getWeekDateRange (date) {
      // 计算当前日期是周几,ISO周从周一开始
      var currentDay = date.getDay()
      var distanceToMonday = currentDay === 0 ? 6 : currentDay - 1
      // 计算当前周的周一和周日
      var monday = new Date(date)
      monday.setDate(date.getDate() - distanceToMonday)
      var sunday = new Date(monday)
      sunday.setDate(monday.getDate() + 6)
      // 格式化日期为 yyyy-MM-dd
      var format = (d) => d.toISOString().split('T')[0]
      return [format(monday), format(sunday)]
    },

    getWeekDateRangeByWeekNumber (weekNumber, year) {
      if (weekNumber < 1) {
        return null
      }
      var januaryFirst = new Date(year, 0, 1)
      var januaryFirstDayOfWeek = januaryFirst.getDay() === 0 ? 6 : januaryFirst.getDay() - 1 // 将周日从0转换为7
      var firstMonday = new Date(januaryFirst)
      if (januaryFirstDayOfWeek <= 3) {
        // 如果1月1日至1月4日之间为周一至周四,则该周为第一周
        firstMonday.setDate(januaryFirst.getDate() - januaryFirstDayOfWeek + 1)
      } else {
        // 否则,下周一为第一周的开始
        firstMonday.setDate(januaryFirst.getDate() + 8 - januaryFirstDayOfWeek)
      }

      var weekStart = new Date(firstMonday)
      weekStart.setDate(firstMonday.getDate() + (weekNumber - 1) * 7)

      var weekEnd = new Date(weekStart)
      weekEnd.setDate(weekStart.getDate() + 6)

      // 格式化日期为 yyyy-MM-dd
      var format = (d) => d.toISOString().split('T')[0]
      return [format(weekStart), format(weekEnd)]
    }
  },
  props: {
    model: {
      type: Number,
      required: true
    }
  },
  watch: {
    model (val) {
      if (val.length <= 1 || val < 0) {
        this.weekNumber = this.getWeekNumber(new Date())
        this.dateRange = this.getWeekDateRange(new Date())
      } else {
        // 使用val作为周数
        this.weekNumber = val
        if (val > 0) {
          this.dateRange = this.getWeekDateRangeByWeekNumber(val, new Date().getFullYear())
        } else {
          this.dateRange = null
        }
      }
    },
    weekNumber (newVal, oldVal) {
      // 当周数改变时,更新日期范围
      if (newVal !== oldVal) {
        if (newVal > 0) {
          this.dateRange = this.getWeekDateRangeByWeekNumber(newVal, new Date().getFullYear())
        } else {
          this.dateRange = null
        }
      }
      // 父级控件 v-model 绑定
      this.$emit('update:model', newVal)
    }
  }
}
</script>

<style lang="scss" scoped>
// 调整高度
.el-form-item {
  height: 10px;
}
</style>

运行效果:
周数选择器

注:以下操作可以根据实际情况可以灵活控制。

1.el-input-number的取值范围为 [ 0 , 52 ] [0,52] [0,52],当el-input-number=0时,则表示后端系统不使用周数选择器作为判断依据。也可以将el-input-number的取值范围强制设为 [ 1 , 52 ] [1,52] [1,52],用多选控件控制是否启用的判断。
2.getWeekNumber方法中添加了this.$emit('update:model', weekNum),用于将初始化后的值返回给父控件。
3.getWeekDateRangeByWeekNumber方法中添加了if (weekNumber < 1)的判断,防止意外的输入值。

三、C#后端代码实现

了解上面原理之后,依样画葫芦,我们可以通过周数计算日期范围,用于查询后数据分析。
这里我们简单实现一下代码作为应用参考。

3.1 类实现

public class ReportWeekCalculator
{
    public int ReportWeek { get; set; }
    public int Year { get; set; }

    public ReportWeekCalculator(int reportWeek, int year)
    {
        ReportWeek = reportWeek;
        Year = year;
    }

    public (DateTime, DateTime) GetWeekDateRange()
    {
        // 获取指定年份的1月1日
        DateTime januaryFirst = new DateTime(Year, 1, 1);

        // 获取1月1日是周几(将周日从0转换为7)
        int januaryFirstDayOfWeek = januaryFirst.DayOfWeek == DayOfWeek.Sunday ? 6 : (int)januaryFirst.DayOfWeek - 1;

        // 计算第一周周一的日期
        DateTime firstMonday;
        if (januaryFirstDayOfWeek <= 3) // 如果1月1日是周一至周四
        {
            firstMonday = januaryFirst.AddDays(-januaryFirstDayOfWeek);
        }
        else // 如果1月1日是周五、周六或周日
        {
            firstMonday = januaryFirst.AddDays(7 - januaryFirstDayOfWeek);
        }

        // 计算目标周的开始日期
        DateTime startOfWeek = firstMonday.AddDays((ReportWeek - 1) * 7);

        // 计算目标周的结束日期
        DateTime endOfWeek = startOfWeek.AddDays(6);

        return (startOfWeek, endOfWeek);
    }
}

使用示例

var calculator = new ReportWeekCalculator(47, 2023); // 假设需要计算2023年第47周的日期范围
var (startOfWeek, endOfWeek) = calculator.GetWeekDateRange();
Console.WriteLine($"Week {calculator.ReportWeek} of {calculator.Year} starts on {startOfWeek:yyyy-MM-dd} and ends on {endOfWeek:yyyy-MM-dd}");

3.1 静态方法实现

public class CommonFunc
{
    public static (DateTime, DateTime) GetWeekDateRange(int ReportWeek)
    {
        // 获取当前年份
        int year = DateTime.Now.Year;

        // 获取指定年份的1月1日
        DateTime januaryFirst = new DateTime(year, 1, 1);

        // 获取1月1日是周几(将周日从0转换为7)
        int januaryFirstDayOfWeek = januaryFirst.DayOfWeek == DayOfWeek.Sunday ? 6 : (int)januaryFirst.DayOfWeek - 1;

        // 计算第一周周一的日期
        DateTime firstMonday;
        if (januaryFirstDayOfWeek <= 3) // 如果1月1日是周一至周四
        {
            firstMonday = januaryFirst.AddDays(-januaryFirstDayOfWeek);
        }
        else // 如果1月1日是周五、周六或周日
        {
            firstMonday = januaryFirst.AddDays(7 - januaryFirstDayOfWeek);
        }

        // 计算目标周的开始日期
        DateTime startOfWeek = firstMonday.AddDays((ReportWeek - 1) * 7);

        // 计算目标周的结束日期
        DateTime endOfWeek = startOfWeek.AddDays(6);

        return (startOfWeek, endOfWeek);
    }
}

使用示例

(DateTime startDt, DateTime endDt) = CommonFunc.GetWeekDateRange(searchDto.ReportWeek);

注:endOfWeek取的是周日的00:00:00,如果需要日期筛选,需要加一天后用<符号或者截取到日期字段用<=符号比较。
参考代码片段:

(DateTime startDt, DateTime endDt) = CommonFunc.GetWeekDateRange(searchDto.ReportWeek);
endDt = endDt.AddDays(1); //加一天
expression = expression.And(p => p.CreateTime >= startDt);
expression = expression.And(p => p.CreateTime < endDt);

总结

本篇博客中,我们深入探讨了周数选择器的实现,从理论到实践,涵盖了周数的计算逻辑和具体的代码实现。

首先,我们讨论了周数的定义、确定年初的周数,以及周数的具体计算方法。这部分内容基于ISO 8601标准,为理解和计算周数提供了必要的理论基础。

随后,我们转向实际的代码实现,详细介绍了几个关键函数:计算周数(getWeekNumber)、获取特定日期所在周的日期范围(getWeekDateRange),以及根据周数和年份获取特定周的日期范围(getWeekDateRangeByWeekNumber)。这些函数是构建周数选择器的核心,展示了如何在Vue和ElementUI环境中处理日期和时间。

进一步,我们分析了周数选择器控件在Vue中的引用方式,包括控件的引入、注册,以及相关变量的初始化。这不仅展示了组件化开发的便捷性,也体现了Vue响应式系统的强大。

最后,我们提供了周数选择器的完整代码,这为读者提供了一个实用的参考模板,可以直接应用于项目或作为学习实践。

整体而言,本博客不仅介绍了周数选择器的实现,更提供了一种结合Vue和ElementUI开发复杂UI组件的有效途径。这对于追求高效、可维护的前端开发来说,无疑是极有价值的。

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

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

相关文章

10_7iic整体框架流程

在内核中 这边把iic整个流程分成了 4层 iic_dtiver at24_iic_eeprom 也就是我们的自己的驱动 i2c-core.c 核心层 i2c/busses/i2c-s3c2410.c 控制器层 平台总线驱动层,或者也是图中的设备树 硬件描述 我们假设 板子上有三个iic控制器 0 1 2 这里在控制器0 上挂载了gt24c02的eep…

Retrofit怎么返回一个JSON字符串?

项目用已经使用了 Retrofit&#xff0c;定义了接口方法&#xff0c;返回了 JSON 转换后的实体对象&#xff0c;炒鸡方便。但是总有意料之外的时候&#xff0c;比如我不需要返回实体对象&#xff0c;我要返回纯纯的 JSON 字符串&#xff0c;怎么办呢&#xff1f; 先看源码 通过…

ros2智能小车中STM32地盘需要用到PWM的模块

我做的地盘比较简单&#xff0c;使用了一下模块&#xff1a; 4个直流减速电机&#xff0c;&#xff08;每个模块用到了一个PWM&#xff09; 光电对射测速模块&#xff08;不用PWM) 超声波测距模块&#xff08;不用PWM&#xff0c;只需要测量时间&#xff09; sg90转向模块&…

C语言进阶-文件操作

目录 文件分类 程序文件 数据文件 文件的打开和关闭 文件指针 文件的顺序读写 文件读取结束的判定 文件缓冲区 文件版通讯录 实现代码 注意事项 ​编辑 ​编辑 实现效果 文件分类 磁盘上的文件是文件。 但是在程序设计中&#xff0c;我们一般谈的文件有两种&#xff1a;程…

【虚拟机】在VM中安装 CentOS 7

1.2.创建虚拟机 Centos7是比较常用的一个Linux发行版本&#xff0c;在国内的使用比例还是比较高的。 大家首先要下载一个Centos7的iso文件&#xff0c;我在资料中给大家准备了一个mini的版本&#xff0c;体积不到1G&#xff0c;推荐大家使用&#xff1a; 我们在VMware《主页》…

深入理解对象与垃圾回收机制

1、虚拟机中对象创建过程 1.1 对象创建过程 当我们使用 new 创建一个对象时&#xff0c;在 JVM 中进行了如下操作&#xff1a; 类加载&#xff1a;把 class 加载到 JVM 运行时数据区的过程。可以通过本地文件的形式&#xff0c;也可以通过网络加载。 检查加载&#xff1a;首…

【RTP】3: RTPSenderVideo::SendVideo 切片到发送

m98 版本。之前1 2 都是m79.RTPSenderVideo::SendVideo 负责切片,是入口 实际发送要靠: RTPSender* const rtp_sender_; 外部传递的: rtp_rtcp\source\rtp_sender.h 实现了rtp rtcp协议 ,负责实际的打包 新增了一个 TransformableFrameInterface 用的 编码线程 - RTPSend…

【数据库】缓冲区管理器结构,几种常用替换策略分析,pin钉住缓冲区块防止错误的替换,以及缓冲区管理带来的代价优化

缓冲区管理 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会定期更新&…

【Qt】判断QList链表内是否有重复数据

QList<int> listInt;listInt.push_back(1);listInt.push_back(1);listInt.push_back(2);listInt.push_back(3);qDebug().noquote() << listInt.toSet().toList();

(数据结构)顺序表的定义

#include<stdio.h> //顺序表的实现——静态分配 #define MAX 10 //定义最大长度 typedef struct List {int data[MAX]; //用静态的数组存放数据int lenth; //顺序表现在的长度 }List; //顺序表的初始化 void ChuShiHua(List L) {L.lenth 0; //将顺序表的长度初始化…

MFC居中显示文字及其应用

首先获取窗口客户区矩形,然后使用DrawText输出,设置DT_CENTER 和 DT_VCENTER标志; 输出如上图;没有实现垂直居中; 最终的代码如下; void CcenterView::OnDraw(CDC* pDC) {CcenterDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;// TODO: 在此处为…

基于python协同过滤推荐算法的电影推荐与管理系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 电影推荐与管理系统是一个基于Python的协同过滤推荐算法的应用&#xff0c;它可以帮助用户根据他们的兴趣和偏好进行…

一般将来时

一般将来时 概念 表示将要发生的动作或打算、计划准备做某事 时间 tomorrow 明天 the day after tomorrow 后天 next week 下周 next weekend 下周末 next month 下个月 next year 明年 ...句子结构 主语 be&#xff08;am/is/are&#xff09;going to do … 计划,…

手把手教会你--Hack The Box的账号注册(HTB Labs部分)

有什么问题&#xff0c;请尽情问博主&#xff0c;QQ群796141573 前言1.1 一次注册正确的注册过程1.2 讲讲我在注册过程中遇到的两个问题&#xff08;1&#xff09;点击REGISTER后无反应&#xff08;2&#xff09;提示Error! reCaptcha validation failed 前言 请务必跟着博主复…

GPT4测试 — 答题能力及文档处理能力

创建gdp.txt文件&#xff08;使用word 2013创建的文档测试了也可以&#xff0c;WPS建的不行&#xff09; 上传文件&#xff0c;输入prompt: 请帮我答题&#xff0c;把那个正确答案的选项的字母序号填在&#xff08;&#xff09;中&#xff0c;并返回文件blabla… 给我一个文件…

人工智能-优化算法和深度学习

优化和深度学习 对于深度学习问题&#xff0c;我们通常会先定义损失函数。一旦我们有了损失函数&#xff0c;我们就可以使用优化算法来尝试最小化损失。在优化中&#xff0c;损失函数通常被称为优化问题的目标函数。按照传统惯例&#xff0c;大多数优化算法都关注的是最小化。…

springboot核心原理之@SpringbootApplication

1.SpringbootApplication Configuration标志的类 在spring ioc启动的时候就会加载创建这个类对象 EnableAutoConfiguration 中有两个注解 &#xff08;1&#xff09;AutoConfigurationPackage 扫描主程序包(主程序main所在包及其子包) 可以看到这个类 &#xff1a; static c…

Echarts title标题配置项的使用 更改颜色 副标题

title配置项主要是对图表的标题进行配置 title配置项所有属性文档 title&#xff1a; { ...... }设置标题 副标题 text: 简单创建柱形图,//图表标题 subtext: 副标题,如果想对副标题设置 超链接 边框 颜色 宽度…等 比如&#xff1a;设置超链接 sublink:‘…’, 设置标题位置…

Android 虚拟机与类加载机制

1、Dalvik 虚拟机 Android 应用程序运行在 Dalvik/Art 虚拟机上&#xff0c;并且每一个应用程序都有一个单独的 Dalvik/Art 虚拟机实例。 1.1 JVM 与 Dalvik Dalvik 虚拟机也算是一个 Java 虚拟机&#xff0c;它是按照 JVM 虚拟机规范实现的&#xff0c;二者的特性差不多&am…

11【保姆级】-GO语言的struct

11【保姆级】-GO语言的struct 一、Go的面向对象1.1 说明 二、结构体2.1 结构体和结构体变量(实例)的区别和联系2.2 声明结构体 和 细节说明2.3 结构体在内存中的布局2.4 创建结构体和访问结构体的四种方式 在学习GO语言时&#xff1a; 先建立整体框架&#xff0c;然后再去抠细节…