推荐一款第三方的日历框架------CalendarView

简介

Android上一个优雅、高度自定义、性能高效的日历控件,完美支持周视图,支持标记、自定义颜色、农历等,任意控制月视图显示、任意日期拦截条件、自定义周起始等。Canvas绘制,极速性能、占用内存低,支持简单定制即可实现任意自定义布局、自定义UI,支持收缩展开、性能非常高效, 这个控件内存和效率优势相当明显,而且真正做到收缩+展开,适配多种场景,支持同时多种颜色标记日历事务,支持多点触控,你真的想不到日历还可以如此优雅!

与其他日历框架对比

日历控件定制是移动开发平台上比较常见的而且比较难的需求,一般会遇到以下问题:

  • 性能差,加载速度慢,原因是各种基于GridView或RecyclerView等ViewGroup实现的日历,控件数太多,假设一个月视图界面有42个item,每个item里面分别就有2个子TextView:天数、农历数和本身3个控件,这样一个月视图就有42 * 3+1(RecyclerView or GridView),清楚ViewPager特性的开发者就会明白,一般ViewPager持有3个item,那么一个日历控件持有的View控件数的数量将达到 1(ViewPager)+ 3(RecyclerView or GridView) + 3 * 42 * 3 = 382,如果用1个View来代替RecyclerView等,用Canvas来代替各种TextView,那View的数量瞬间将下降360+,内存和性能优势将相当明显了
  • 难定制 一般日历框架发布的同时也将UI风格确定下来了,假如人人都使用这个日历框架,那么将会千篇一律,难以突出自己的风格,要么就得改源码,成本太大,不太实际
  • 功能性不足 例如无法自定义周起始、无法更改选择模式、动态设置UI等等
  • 无法满足产品经理提出的变态需求 今天产品经历说我们要这样的实现、明天跟你说这里得改、后天说我们得限制一些日期…

但现在有了全新的 CalendarView 控件,它解锁了各种姿势,而且你可以任意定制,直到你满足为止…

插拔式设计

插拔式设计:好比插座一样,插上灯泡就会亮,插上风扇就会转,看用户需求什么而不是看插座有什么,只要是电器即可。此框架使用插拔式,既可以在编译时指定年月日视图,如:app:month_view=“xxx.xxx.MonthView.class”,也可在运行时动态更换年月日视图,如:CalendarView.setMonthViewClass(MonthView.Class),从而达到UI即插即用的效果,相当于框架不提供UI实现,让UI都由客户端实现,不至于日历UI都千篇一律,只需遵守插拔式接口即可随意定制,自由化程度非常高。

CalendarView 的特性

  • 基于Canvas绘制,极速性能
  • 热插拔思想,任意定制周视图、月视图,即插即用!
  • 支持单选、多选、范围选择、国内手机日历默认自动选择等选择模式
  • 支持静态、动态设置周起始,一行代码搞定
  • 支持静态、动态设置日历项高度、日历填充模式
  • 支持设置任意日期范围、任意拦截日期
  • 支持多点触控、手指平滑切换过渡,拒绝界面抖动
  • 类NestedScrolling特性,嵌套滚动
  • 既然这么多支持,那一定支持英语、繁体、简体,任意定制实现

注意: 框架本身只是实现各自逻辑,不实现UI,UI如同一张白纸,任凭客户端自行通过Canvas绘制实现,如果不熟悉Canvas的,请自行了解各自Canvas.drawXXX方法,UI都靠Canvas实现,坐标都已经计算好了,因此怎么隐藏农历,怎么换某些日期的字,这些都不属于框架范畴,只要你想换,都能随便换。

引用依赖

AndroidStudio v3.5+

support版本使用

implementation 'com.haibin:calendarview:3.6.8

Androidx版本使用

implementation 'com.haibin:calendarview:3.7.1'
<dependency><groupId>com.haibin</groupId><artifactId>calendarview</artifactId><version>3.7.0</version><type>pom</type>
</dependency>

混淆proguard-rules

-keepclasseswithmembers class * {public <init>(android.content.Context);
}

或者针对性的使用混淆,请自行配置测试!

-keep class your project path.MonthView {public <init>(android.content.Context);
}
-keep class your project path.WeekBar {public <init>(android.content.Context);
}
-keep class your project path.WeekView {public <init>(android.content.Context);
}
-keep class your project path.YearView {public <init>(android.content.Context);
}

使用方法

特别的,请注意不要复制这三个路径,自行替换您自己的自定义路径

app:month_view="com.haibin.calendarviewproject.simple.SimpleMonthView"
app:week_view="com.haibin.calendarviewproject.simple.SimpleWeekView"
app:week_bar_view="com.haibin.calendarviewproject.EnglishWeekBar"
 <com.haibin.calendarview.CalendarLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"app:default_status="shrink"app:calendar_show_mode="only_week_view"app:calendar_content_view_id="@+id/recyclerView"><com.haibin.calendarview.CalendarViewandroid:id="@+id/calendarView"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#fff"app:month_view="com.haibin.calendarviewproject.simple.SimpleCalendarCardView"app:week_view="com.haibin.calendarviewproject.simple.SimpleWeekView"app:week_bar_view="com.haibin.calendarviewproject.EnglishWeekBar"app:calendar_height="50dp"app:current_month_text_color="#333333"app:current_month_lunar_text_color="#CFCFCF"app:min_year="2004"app:other_month_text_color="#e1e1e1"app:scheme_text="假"app:scheme_text_color="#333"app:scheme_theme_color="#333"app:selected_text_color="#fff"app:selected_theme_color="#333"app:week_start_with="mon"app:week_background="#fff"app:month_view_show_mode="mode_only_current"app:week_text_color="#111" /><android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#d4d4d4" /></com.haibin.calendarview.CalendarLayout>

CalendarView 的全部xml特性

特性如下

<declare-styleable name="CalendarView"><attr name="calendar_padding" format="dimension" /><!--日历内部左右padding--><attr name="month_view" format="color" /> <!--自定义类日历月视图路径--><attr name="week_view" format="string" /> <!--自定义类周视图路径--><attr name="week_bar_height" format="dimension" /> <!--星期栏的高度--><attr name="week_bar_view" format="color" /> <!--自定义类周栏路径,通过自定义则 week_text_color week_background xml设置无效,当仍可java api设置--><attr name="week_line_margin" format="dimension" /><!--线条margin--><attr name="week_line_background" format="color" /><!--线条颜色--><attr name="week_background" format="color" /> <!--星期栏的背景--><attr name="week_text_color" format="color" /> <!--星期栏文本颜色--><attr name="week_text_size" format="dimension" /><!--星期栏文本大小--><attr name="current_day_text_color" format="color" /> <!--今天的文本颜色--><attr name="current_day_lunar_text_color" format="color" /><!--今天的农历文本颜色--><attr name="calendar_height" format="string" /> <!--日历每项的高度,56dp--><attr name="day_text_size" format="string" /> <!--天数文本大小--><attr name="lunar_text_size" format="string" /> <!--农历文本大小--><attr name="scheme_text" format="string" /> <!--标记文本--><attr name="scheme_text_color" format="color" /> <!--标记文本颜色--><attr name="scheme_month_text_color" format="color" /> <!--标记天数文本颜色--><attr name="scheme_lunar_text_color" format="color" /> <!--标记农历文本颜色--><attr name="scheme_theme_color" format="color" /> <!--标记的颜色--><attr name="selected_theme_color" format="color" /> <!--选中颜色--><attr name="selected_text_color" format="color" /> <!--选中文本颜色--><attr name="selected_lunar_text_color" format="color" /> <!--选中农历文本颜色--><attr name="current_month_text_color" format="color" /> <!--当前月份的字体颜色--><attr name="other_month_text_color" format="color" /> <!--其它月份的字体颜色--><attr name="current_month_lunar_text_color" format="color" /> <!--当前月份农历节假日颜色--><attr name="other_month_lunar_text_color" format="color" /> <!--其它月份农历节假日颜色--><!-- 年视图相关 --><attr name="year_view_month_text_size" format="dimension" /> <!-- 年视图月份字体大小 --><attr name="year_view_day_text_size" format="dimension" /> <!-- 年视图月份日期字体大小 --><attr name="year_view_month_text_color" format="color" /> <!-- 年视图月份字体颜色 --><attr name="year_view_day_text_color" format="color" /> <!-- 年视图日期字体颜色 --><attr name="year_view_scheme_color" format="color" /> <!-- 年视图标记颜色 --><attr name="min_year" format="integer" />  <!--最小年份1900--><attr name="max_year" format="integer" />  <!--最大年份2099--><attr name="min_year_month" format="integer" /> <!--最小年份对应月份--><attr name="max_year_month" format="integer" /> <!--最大年份对应月份--><!--月视图是否可滚动--><attr name="month_view_scrollable" format="boolean" /><!--周视图是否可滚动--><attr name="week_view_scrollable" format="boolean" /><!--年视图是否可滚动--><attr name="year_view_scrollable" format="boolean" /><!--配置你喜欢的月视图显示模式模式--><attr name="month_view_show_mode"><enum name="mode_all" value="0" /> <!--全部显示--><enum name="mode_only_current" value="1" /> <!--仅显示当前月份--><enum name="mode_fix" value="2" /> <!--自适应显示,不会多出一行,但是会自动填充--></attr><!-- 自定义周起始 --><attr name="week_start_with"><enum name="sun" value="1" /><enum name="mon" value="2" /><enum name="sat" value="7" /></attr><!-- 自定义选择模式 --><attr name="select_mode"><enum name="default_mode" value="0" /><enum name="single_mode" value="1" /><enum name="range_mode" value="2" /><enum name="multi_mode" value="3" /></attr><!-- when select_mode = multi_mode --><attr name="max_multi_select_size" format="integer" /><!-- 当 select_mode=range_mode --><attr name="min_select_range" format="integer" /><attr name="max_select_range" format="integer" /><!-- auto select day --><attr name="month_view_auto_select_day"><enum name="first_day_of_month" value="0" /><enum name="last_select_day" value="1" /><enum name="last_select_day_ignore_current" value="2" /></attr>
</declare-styleable>

CalendarView api

public void setRange(int minYear, int minYearMonth, int minYearDay,int maxYear, int maxYearMonth, int maxYearDay) ;//置日期范围public int getCurDay(); //今天
public int getCurMonth(); //当前的月份
public int getCurYear(); //今年public boolean isYearSelectLayoutVisible();//年月份选择视图是否打开
public void closeYearSelectLayout();//关闭年月视图选择布局
public void showYearSelectLayout(final int year); //快速弹出年份选择月份public void setOnMonthChangeListener(OnMonthChangeListener listener);//月份改变事件public void setOnYearChangeListener(OnYearChangeListener listener);//年份切换事件public void setOnCalendarSelectListener(OnCalendarSelectListener listener)//日期选择事件public void setOnCalendarLongClickListener(OnCalendarLongClickListener listener);//日期长按事件public void setOnCalendarLongClickListener(OnCalendarLongClickListener listener, boolean preventLongPressedSelect);//日期长按事件public void setOnCalendarInterceptListener(OnCalendarInterceptListener listener);//日期拦截和日期有效性绘制public void setSchemeDate(Map<String, Calendar> mSchemeDates);//标记日期public void update();//动态更新public Calendar getSelectedCalendar(); //获取选择的日期/*** 特别的,如果你需要自定义或者使用其它选择器,可以用以下方法进行和日历联动*/
public void scrollToCurrent();//滚动到当前日期public void scrollToCurrent(boolean smoothScroll);//滚动到当前日期public void scrollToYear(int year);//滚动到某一年public void scrollToPre();//滚动到上一个月public void scrollToNext();//滚动到下一个月public void scrollToCalendar(int year, int month, int day);//滚动到指定日期public Calendar getMinRangeCalendar();//获得最小范围日期public Calendar getMaxRangeCalendar();//获得最大范围日期/*** 设置背景色** @param monthLayoutBackground 月份卡片的背景色* @param weekBackground        星期栏背景色* @param lineBg                线的颜色*/
public void setBackground(int monthLayoutBackground, int weekBackground, int lineBg)/*** 设置文本颜色** @param curMonthTextColor 当前月份字体颜色* @param otherMonthColor   其它月份字体颜色* @param lunarTextColor    农历字体颜色*/
public void setTextColor(int curMonthTextColor,int otherMonthColor,int lunarTextColor)/*** 设置选择的效果** @param style              选中的style CalendarCardView.STYLE_FILL or CalendarCardView.STYLE_STROKE* @param selectedThemeColor 选中的标记颜色* @param selectedTextColor  选中的字体颜色*/
public void setSelectedColor(int style, int selectedThemeColor, int selectedTextColor)/*** 设置标记的色** @param style           标记的style CalendarCardView.STYLE_FILL or CalendarCardView.STYLE_STROKE* @param schemeColor     标记背景色* @param schemeTextColor 标记字体颜色*/
public void setSchemeColor(int style, int schemeColor, int schemeTextColor)/*** 设置星期栏的背景和字体颜色** @param weekBackground 背景色* @param weekTextColor  字体颜色*/
public void setWeeColor(int weekBackground, int weekTextColor)

CalendarLayout api

public void expand(); //展开public void shrink(); //收缩public boolean isExpand();//是否展开了

CalendarLayout attrs

<!-- 日历显示模式 -->
<attr name="calendar_show_mode"><enum name="both_month_week_view" value="0" /><!-- 默认都有 --><enum name="only_week_view" value="1" /><!-- 仅周视图 --><enum name="only_month_view" value="2" /><!-- 仅月视图 -->
</attr><attr name="default_status"><enum name="expand" value="0" /> <!--默认展开--><enum name="shrink" value="1" /><!--默认搜索-->
</attr><attr name="calendar_content_view_id" format="integer" /><!--内容布局id-->

日历类 Calendar 提供了许多十分有用的API

boolean isWeekend();//判断是不是周末,可以用不同的画笔绘制周末的样式int getWeek();//获取星期String getSolarTerm();//获取24节气,可以用不同颜色标记不同节日String getGregorianFestival();//获取公历节日,自由判断,把节日换上喜欢的颜色String getTraditionFestival();//获取传统节日boolean isLeapYear();//是否是闰年int getLeapMonth();//获取闰月boolean isSameMonth(Calendar calendar);//是否相同月int compareTo(Calendar calendar);//比较日期大小 -1 0 1long getTimeInMillis();//获取时间戳int differ(Calendar calendar);//日期运算,相差多少天

*如何自定义月视图和周视图

继承自己的月视图和周视图,只需要依次实现

绘制选中:onDrawSelected

绘制事务:onDrawScheme

绘制文本:onDrawText 这三个回调即可,参数和坐标都已经在回调函数上实现好,周视图也是一样的逻辑,只是不需要y参数

/*** 定制高仿魅族日历界面,按你的想象力绘制出各种各样的界面**/
public class MeiZuMonthView extends MonthView {/*** 绘制选中的日子** @param canvas    canvas* @param calendar  日历日历calendar* @param x         日历Card x起点坐标* @param y         日历Card y起点坐标* @param hasScheme hasScheme 非标记的日期* @return 返回true 则绘制onDrawScheme,因为这里背景色不是是互斥的,所以返回true*/@Overrideprotected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) {//这里绘制选中的日子样式,看需求需不需要继续调用onDrawSchemereturn true;}/*** 绘制标记的事件日子** @param canvas   canvas* @param calendar 日历calendar* @param x        日历Card x起点坐标* @param y        日历Card y起点坐标*/@Overrideprotected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) {//这里绘制标记的日期样式,想怎么操作就怎么操作}/*** 绘制文本** @param canvas     canvas* @param calendar   日历calendar* @param x          日历Card x起点坐标* @param y          日历Card y起点坐标* @param hasScheme  是否是标记的日期* @param isSelected 是否选中*/@Overrideprotected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) {//这里绘制文本,不要再问我怎么隐藏农历了,不要再问我怎么把某个日期换成特殊字符串了,要怎么显示你就在这里怎么画,你不画就不显示,是看你想怎么显示日历的,而不是看框架}
}
  • 当你实现好之后,直接在xml界面上添加特性,编译后可以即时预览效果:
<attr name="month_view" format="string" /><!--自定义月视图路径-->
<attr name="week_view" format="string" /> <!--自定义周视图路径-->app:month_view="com.haibin.calendarviewproject.MeiZuMonthView"
app:week_view="com.haibin.calendarviewproject.MeiZuWeekView"
  • 视图有多种模式可供选择,几乎涵盖了各种需求,看各自的需求自行继承
如果继承这2个,MonthView、WeekView,即select_mode="default_mode",这是默认的手机自带的日历模式,会自动选择月的第一天,不支持拦截器,
也可以设置select_mode="single_mode",即单选模式,支持拦截器如果继承这2个,RangeMonthView、RangeWeekView,即select_mode="range_mode",这是范围选择模式,支持拦截器如果继承这2个,MultiMonthView、MultiWeekView,即select_mode="multi_mode",这是多选模式,支持拦截器

如果静态模式无法满足你的需求,你可能需要动态变换定制的视图界面,你可以使用热插拔特性

mCalendarView.setWeekView(MeiZuWeekView.class);
mCalendarView.setMonthView(MeiZuMonthView.class);

如果你需要可收缩的日历,你可以在 CalendarView 父布局添加 CalendarLayout,当然你不需要周视图也可以不用,例如原生日历,使用如下:

<com.haibin.calendarview.CalendarLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"app:default_status="shrink"app:calendar_show_mode="only_week_view"app:calendar_content_view_id="@+id/recyclerView"><com.haibin.calendarview.CalendarViewandroid:id="@+id/calendarView"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#fff"app:month_view="com.haibin.calendarviewproject.simple.SimpleMonthView"app:week_view="com.haibin.calendarviewproject.simple.SimpleWeekView"app:week_bar_view="com.haibin.calendarviewproject.EnglishWeekBar"app:calendar_height="50dp"app:current_month_text_color="#333333"app:current_month_lunar_text_color="#CFCFCF"app:min_year="2004"app:other_month_text_color="#e1e1e1"app:scheme_text="假"app:scheme_text_color="#333"app:scheme_theme_color="#333"app:selected_text_color="#fff"app:selected_theme_color="#333"app:week_start_with="mon"app:week_background="#fff"app:month_view_show_mode="mode_only_current"app:week_text_color="#111" /><android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#ffffff" /></com.haibin.calendarview.CalendarLayout>
  • 使用可收缩的日历你可以使用监听器,监听视图变换
public void setOnViewChangeListener(OnViewChangeListener listener);

CalendarLayout 有很多特性可提供周月视图无缝切换,而且,平滑手势不抖动!使用 CalendarLayout,你需要指定 calendar_content_view_id,用他来平移收缩月视图

  • CalendarView 可以设置全屏,只需设置 app:calendar_match_parent="true"即可,全屏CalendarView是不需要周视图的,不必嵌套CalendarLayout

在这里插入图片描述

  • CalendarView 也提供了高效便利的年视图,可以快速切换年份、月份,十分便利

在这里插入图片描述

  • 但年视图也不一定就适合你的胃口,如果你希望像弹出 DatePickerView,通过它来跳转日期,你可以使用以下的API来让日历与其它控件联动
CalendarView.scrollToCalendar();CalendarView.scrollToNext();CalendarView.scrollToPre();CalendarView.scrollToXXX();
  • 你也许需要像魅族日历一样,可以静态、动态更换周起始
app:week_start_with="mon、sun、sat"CalendarView.setWeekStarWithSun();CalendarView.setWeekStarWithMon();CalendarView.setWeekStarWithSat();
  • 假如你是做酒店、旅游等应用场景的APP的,那么需要可选范围的日历,你可以这样继承,和普通视图实现完全一样
public class CustomRangeMonthView extends RangeMonthView{}public class CustomRangeWeekView extends RangeWeekView{}
  • 然后你需要设置选择模式为范围模式:select_mode=“range_mode”
  • 酒店式日历场景当然是不能从昨天开始订房的,也不能无限期订房,所以你需要静态或动态设置日历范围、精确到具体某一天!!!
<attr name="min_year" format="integer" />
<attr name="max_year" format="integer" />
<attr name="min_year_month" format="integer" />
<attr name="max_year_month" format="integer" />
<attr name="min_year_day" format="integer" />
<attr name="max_year_day" format="integer" />CalendarView.setRange(int minYear, int minYearMonth, int minYearDay,int maxYear, int maxYearMonth, int maxYearDay)
  • 当然还有更特殊的日子也是不能选择的,例如:某月某号起这N天时间内因为超强台风来袭,酒店需停止营业N天,这段期间不可订房,这时日期拦截器就排上用场了
//设置日期拦截事件
mCalendarView.setOnCalendarInterceptListener(new CalendarView.OnCalendarInterceptListener() {@Overridepublic boolean onCalendarIntercept(Calendar calendar) {//这里写拦截条件,返回true代表拦截,尽量以最高效的代码执行return calendar.isWeekend();}@Overridepublic void onCalendarInterceptClick(Calendar calendar, boolean isClick) {//todo 点击拦截的日期回调}
});
  • 添加日期拦截器和范围设置后,你可以在周月视图按需求获得他们的结果
boolean isInRange = isInRange(calendar);//日期是否在范围内,超出范围的可以置灰boolean isEnable = !onCalendarIntercept(calendar);//日期是否可用,没有被拦截,被拦截的可以置灰

在这里插入图片描述

  • 假如你是做清单类、任务类APP的,可能会有这样的需求:标记某天事务的进度,这也很简单,因为:日历界面长什么样,你自己说了算!!!

在这里插入图片描述

  • 也许你只需要像原生日历那样就够了,但原生日历那奇怪且十分不友好的style,受到theme的影响,各种头疼,使用此控件,你只需要简简单单定制月视图就够了,CalendarView 能非常简单就高仿各种日历UI
  • CalendarView 提供了 setSchemeDate(Map<String, Calendar> mSchemeDates) 这个十分高效的API用来动态标记事务,即时你的数据量达到数千、数万、数十万,都不会对UI渲染造成影响

githup

gitee

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

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

相关文章

STL容器大总结区分(上)

如图所示 ,按大小说明其重要性 那就先说两个最重要的: vector---数组 list-----链表 vector 基本概念 功能&#xff1a; vector 数据结构和 数组非常 相似 &#xff0c;也称为 单端数组 vector 与普通数组区别&#xff1a; 不同之处在于数组是静态空间&…

HarmonyOS漫谈---套壳安卓还是套壳苹果?HarmonyOS更像谁?

2020年以前华为手机的操作系统是EMUI,这个是在Android基础上扩展而来的,版本和android几乎一致,和市面上其它android手机厂家搭载的系统并无本质不同 2019年5月16日,美国针对华为发起了第一轮制裁。8月华为发布了HarmonyOS1.0,此时还只是主要在IOT设备上使用,智慧屏成为…

贝叶斯增量式跨域适应:少样本 + 跨模态学习 + 知识保留和推断【fundus + OCT】,做视网膜病变

贝叶斯深度学习&#xff1a;增量式少样本学习跨域适应 贝叶斯多目标函数 跨模态学习 fundus OCT&#xff0c;做视网膜病变 核心思想设计网络&#xff1a;寻找分类模型、损失函数实验结果混淆矩阵与注意力图评估 总结 核心思想 论文&#xff1a;https://arxiv.org/pdf/2110.…

paddlepaddle在执行loss.item()的时候,报错an illegal memory access was encountered.

遇到的问题是“an illegal memory access was encountered”&#xff0c;这是一个常见的内存错误。 首先&#xff0c;要确保你的代码中没有其他明显的内存错误&#xff0c;例如&#xff1a; 确保你没有试图访问超出数组边界的元素。确保你没有试图释放已经释放的内存。确保你没…

尚无忧球馆助教系统源码,助教小程序源码,助教源码,陪练系统源码

特色功能&#xff1a; 不同助教服务类型选择 助教申请&#xff0c;接单&#xff0c;陪练师入住&#xff0c;赚取外快 线下场馆入住 设置自己服务 城市代理 分销商入住 优惠券 技术栈&#xff1a;前端uniapp后端thinkphp 独立全开源

C#学习(十一)——Array和Collection

一、集合 集合重要且常用 孤立的数据是没有意义的&#xff0c;集合可以作为大量数据的处理&#xff0c;可进行数据的搜索、迭代、添加、删除。 C#中&#xff0c;所有集合都必须实现ICollection接口&#xff08;数组Array除外&#xff09; 集合说明Array数组&#xff0c;固定长…

网络安全02--负载均衡下的webshell连接

目录 一、环境准备 1.1ubentu虚拟机一台&#xff0c;docker环境&#xff0c;蚁剑 1.2环境压缩包&#xff08;文件已上传资源&#xff09;&#xff1a; 二、开始复原 2.1上传ubentu&#xff1a; 2.2解压缩 2.3版本20没有docker-compose手动下载&#xff0c;包已上传资源 …

第2章-神经网络的数学基础——python深度学习

第2章 神经网络的数学基础 2.1 初识神经网络 我们来看一个具体的神经网络示例&#xff0c;使用 Python 的 Keras 库 来学习手写数字分类。 我们这里要解决的问题是&#xff0c; 将手写数字的灰度图像&#xff08;28 像素28 像素&#xff09;划分到 10 个类别 中&#xff08;0…

32GPIO输入LED闪烁蜂鸣器

一.GPIO简介 所有的GPIO都挂载到APB2上&#xff0c;每个GPIO有&#xff11;&#xff16;个引脚 内核可以通过APB&#xff12;对寄存器进行读写&#xff0c;寄存器都是32位的&#xff0c;但每个引脚端口只有&#xff11;&#xff16;位 驱动器用于增加信号的驱动能力 二.具体…

数据结构-线性表

文章目录 数据结构—线性表1.线性表的定义和基本操作线性表的定义线性表的特点线性表的基本操作 2.线性表的顺序存储和链式存储表示顺序存储链式存储单链表循环链表双向链表 数据结构—线性表 1.线性表的定义和基本操作 线性表的定义 定义&#xff1a;线性表是具有相同数据类…

SpringSecurity(16)——OAuth2客户端授权模式

工作流程 基本使用 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId><version>2.3.12.RELEASE</version> </dependency> <dependency><groupId>…

Android发展历程及安装

目录 发展历程 下载网址 安装过程 发展历程 安卓基于Linux内核&#xff0c;Linux内核相当于房屋的地基 开源不等于免费&#xff0c;不能商用 安卓一般每半年小更新&#xff0c;一年大更新 对应API相当于别名 现在安卓安全性越来越高&#xff0c;性能越来越快&#xff0c…