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

网站建设中 页面/开封网站seo

网站建设中 页面,开封网站seo,做我女朋友的表白句的网站,长沙哪里有做网站的公司HC-08蓝牙模块: 蓝牙 -- 最好用的 串口透传 模块 透传 -- 透明传送,指的是在数据传输的过程中,通过无线的方式这组数据不发生任何形式的改变, 仿佛传输过程是透明的,同时保证传输质量,最终原封不动的传送到接收者手…

HC-08蓝牙模块: 

蓝牙 -- 最好用的 串口透传 模块


透传 -- 透明传送,指的是在数据传输的过程中,通过无线的方式这组数据不发生任何形式的改变,
仿佛传输过程是透明的,同时保证传输质量,最终原封不动的传送到接收者手里

只要通过串口编程 获得数据即可

波特率: 9600 MHZ

// 学会串口 就能使用蓝牙模块 
 -- 就能通过蓝牙 模块进行交互-- 比如通过蓝牙在串口上发送指令让单片机执行
================================================

通过USB转TTL 来插入电脑,就可以实现手机和电脑的串口数据传输

AT命令修改蓝牙名称: 
AT + NAME = 新的名字


 

wifi模块:

基本概念

通过wifi模块 让 51单片机上网:

使用的wifi模块 -- ESP-8266  -- 高度基础的wifi MCU -- 支持RTOS(实时系统) 和 wifi协议栈
基于AT指令设计:

AT指令 --是从终端设备 or 数据终端设备 or 数据电路终端设备发送的

每条AT命令行,只能包含一条AT指令,对于由终端设备主动向PC段报告的URC or response响应,也要求一行最多有一个,
不允许上限的一行有多条指令 or 响应 
-- AT指令以回车作为结尾, 响应 or 上报 以回车 换行作为结尾
===================================
 ESP-8266   -- 一般 默认波特率 -- 115200
因为都是AT指令去驱动,so玩wifi模块都是 通过 串口调试助手
接下来玩以下 AT指令:

通过命令 配置 9600 的波特率:

AT + UART =9600,8,1,0,0
//8 个 数据位 , 1 个停止位
=======================

常用AT指令:


1.设置3种工作模式: 


AT+CWMODE=3
//1.是station(设备模式)  2.AP(路由模式) 3.双模


2. 以设备模式接入家中的路由器配置:


AT+CWJAP="CU_a2ry","c5m66yaa" 
 // 第一个“”填wifi名字,第二个“”填 wifi密码

//连接成功 弹出:
WIFI CONNECTED
WIFI GOT IP

==================


3.查询IP地址:


AT+CIFSR

+CIFSR:APIP,"192.168.4.1"
+CIFSR:APMAC,"ce:50:e3:77:dd:4e"
+CIFSR:STAIP,"192.168.1.17"
+CIFSR:STAMAC,"cc:50:e3:77:dd:4e"
=============================

4.接收发送数据


1.先通过网络调试助手创建服务器


2.在通过AT指令连接服务器:
 AT+CIPSTART="TCP","192.168.1.9",8880
//连接成功:
CONNECT

OK

3. 发送数据:
AT+CIPSEND=4 //设置即将发送数据的长度--4个字节

发出上面AT指令后出现 > 
就可以在发送框里面传输 后面传输(注意不能添加新行)

---------------------------------------
这种模式效率太低:  每次都 AT+CIPSEND=4 

5.透传:


我们就可以设置为透传:

1. AT+CIPMODE=1 //开启透传模式
2. AT+CIPSEND    //带回车 -- 开始发送接收数据
3. 随便怎么 发送,接收
4.退出透传模式 发送 +++ 不带换新行

程序:

========================================


代码实现 51 和wifi模块的连接


code 关键字 -- 单独空间存储数据

#include"reg52.h"
#include<string.h>

#define SIZE 12

sfr AUXR = 0x8E;
sbit D5 = P3^7;

char cmd[SIZE];
code char LJWL[]="AT+CWJAP=\"CU_a2ry\",\"c5m66yaa\"\r\n";  //通过\r\n输出新行 -- 连接网络
code char LJFWQ[] ="AT+CIPSTART=\"TCP\",\"192.168.1.9\",8880\r\n"; // 链接服务器
char TCMS[]="AT+CIPMODE=1\r\n"; //开启透传模式
char SJCS[]="AT+CIPSEND\r\n"; //数据接收

void Delay1000ms()        //@11.0592MHz
{
    unsigned char i, j, k;

    
    i = 43;
    j = 6;
    k = 203;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

void UartInit(void)        //9600bps@11.0592MHz
{
    AUXR=0x01; //减少定时器辐射 -- 抗干扰
    SCON =0x50; //配置 串口口工作方式1,REN 使能接收
    //不配 PCON  -- 不设置倍数关系
    //配置定时器1为 8位自动重装
    TMOD &=0xF0; //高位清零
  TMOD |=0x20;  //00 10  -- 配置为定时器1为: 1 0 模式 -- 8位自动重装
  
    //定义初值
  TL1=0xFD;
    TH1=0xFD; // 9600 波特率的初值
  TR1= 1; // 定时器 -- 启动
    
    EA =1; // 开启总中断
    ES=1;  // 开启串口中断
    
}


void sendByte(char a)
{
SBUF = a;
while(!TI);
TI=0;    
}


void sendString(char *str)
{

 while(*str!='\0')
 {
 sendByte(*str);
 str++;
 } 

}


void main()
{
    
    D5=1;

    //配置C51串口的 通信方式:
    UartInit();
while(1){
   //Delay1000ms();
  //往发送缓冲区 写入数据-- 就完成数据的发送
  //sendString("mengxianggiegie\r\n");
    
    sendString(LJWL); // 链接网络 Delay1000ms();
    Delay1000ms();
    Delay1000ms();
    Delay1000ms();
     Delay1000ms();
  sendString(LJFWQ); //连接服务器
     Delay1000ms();
    Delay1000ms();
    Delay1000ms();
    Delay1000ms();
     Delay1000ms();
    sendString(TCMS); //开启透传
     Delay1000ms();
    Delay1000ms();
    Delay1000ms();
    Delay1000ms();
     Delay1000ms();
    sendString(SJCS); //接收数据
     Delay1000ms();
    Delay1000ms();
    Delay1000ms();
    Delay1000ms();
     Delay1000ms();
 }
}

void uartHandler() interrupt 4
{
    static i = 0;
 if(RI) // 中断处理函数中,对于接收中断的响应
 {
    RI=0; //清楚接收中断标志位
      cmd[i] = SBUF;
      i++;
      if(i==SIZE) 
            i=0;
     
    if(strstr(cmd,"en")){//收到 o-pen 开灯
     D5=0;
         i=0;    
         memset(cmd,'\0',SIZE);
    }
        else if(strstr(cmd,"se")){//收到c-lose 关灯
     D5=1;
         i=0;    
         memset(cmd,'\0',SIZE);
    }
            


 }
  
    
}

=============================


优化 上面代码 通过TCP 通信点灯: 

#include"reg52.h"
#include<string.h>

#define SIZE 12

sfr AUXR = 0x8E;
sbit D5 = P3^7;

char cmd[SIZE];
code char LJWL[]="AT+CWJAP=\"CU_a2ry\",\"c5m66yaa\"\r\n";  //通过\r\n输出新行 -- 连接网络
code char LJFWQ[] ="AT+CIPSTART=\"TCP\",\"192.168.1.9\",8880\r\n"; // 链接服务器
char TCMS[]="AT+CIPMODE=1\r\n"; //开启透传模式
char SJCS[]="AT+CIPSEND\r\n"; //数据接收

void Delay1000ms()        //@11.0592MHz
{
    unsigned char i, j, k;

    
    i = 43;
    j = 6;
    k = 203;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

void UartInit(void)        //9600bps@11.0592MHz
{
    AUXR=0x01; //减少定时器辐射 -- 抗干扰
    SCON =0x50; //配置 串口口工作方式1,REN 使能接收
    //不配 PCON  -- 不设置倍数关系
    //配置定时器1为 8位自动重装
    TMOD &=0xF0; //高位清零
  TMOD |=0x20;  //00 10  -- 配置为定时器1为: 1 0 模式 -- 8位自动重装
  
    //定义初值
  TL1=0xFD;
    TH1=0xFD; // 9600 波特率的初值
  TR1= 1; // 定时器 -- 启动
    
    EA =1; // 开启总中断
    ES=1;  // 开启串口中断
    
}


void sendByte(char a)
{
SBUF = a;
while(!TI);
TI=0;    
}


void sendString(char *str)
{

 while(*str!='\0')
 {
 sendByte(*str);
 str++;
 } 

}


void main()
{
    int mark = 0;
    D5=1;

    //配置C51串口的 通信方式:
    UartInit();
while(1){
   //Delay1000ms();
  //往发送缓冲区 写入数据-- 就完成数据的发送
  //sendString("mengxianggiegie\r\n");
    if(!mark){ //第一次打开链接服务器 和网络
    sendString(LJWL); // 链接网络 Delay1000ms();
    Delay1000ms();
    Delay1000ms();
    Delay1000ms();

  sendString(LJFWQ); //连接服务器
     Delay1000ms();
     Delay1000ms();
     Delay1000ms();
        
    sendString(TCMS); //开启透传
     Delay1000ms();
     Delay1000ms();
     Delay1000ms();
        
    sendString(SJCS); //接收数据
     Delay1000ms();
     Delay1000ms();    
     Delay1000ms();
        
     mark=1;
  }
    else{
   sendString("mengxianggiegie\r\n");
     Delay1000ms();
  }
 }
}

void uartHandler() interrupt 4
{
    static i = 0;
 if(RI) // 中断处理函数中,对于接收中断的响应
 {
    RI=0; //清楚接收中断标志位
      cmd[0] = SBUF;
     

     
    if(cmd[0] == '1'){//收到 o-pen 开灯
     D5=0;
         i=0;    
        
    }
        else if(cmd[0] == '0' ){//收到c-lose 关灯
     D5=1;
         i=0;    
        
    }
            


 }
  
    
}

========================


上方代码优化 -- 读取返回 结果以便 观察进度


#include"reg52.h"
#include<string.h>

#define SIZE 12

sfr AUXR = 0x8E;
sbit D5 = P3^7;
sbit D6 = P3^6;

char buffer[SIZE];
code char LJWL[]="AT+CWJAP=\"CU_a2ry\",\"c5m66yaa\"\r\n";  //通过\r\n输出新行 -- 连接网络
code char LJFWQ[] ="AT+CIPSTART=\"TCP\",\"192.168.1.9\",8880\r\n"; // 链接服务器
char TCMS[]="AT+CIPMODE=1\r\n"; //开启透传模式
char SJCS[]="AT+CIPSEND\r\n"; //数据接收


char AT_OK_Flag = 0; 
char AT_Connect_Net_Flag = 0;


void Delay1000ms()        //@11.0592MHz
{
    unsigned char i, j, k;

    
    i = 43;
    j = 6;
    k = 203;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

void UartInit(void)        //9600bps@11.0592MHz
{
    AUXR=0x01; //减少定时器辐射 -- 抗干扰
    SCON =0x50; //配置 串口口工作方式1,REN 使能接收
    //不配 PCON  -- 不设置倍数关系
    //配置定时器1为 8位自动重装
    TMOD &=0xF0; //高位清零
  TMOD |=0x20;  //00 10  -- 配置为定时器1为: 1 0 模式 -- 8位自动重装
  
    //定义初值
  TL1=0xFD;
    TH1=0xFD; // 9600 波特率的初值
  TR1= 1; // 定时器 -- 启动
    
    EA =1; // 开启总中断
    ES=1;  // 开启串口中断
    
}


void sendByte(char a)
{
SBUF = a;
while(!TI);
TI=0;    
}


void sendString(char *str)
{

 while(*str!='\0')
 {
 sendByte(*str);
 str++;
 } 

}


void main()
{
    int mark = 0;
    D5=1; //状态灯一开始是熄灭状态

    //配置C51串口的 通信方式:
     UartInit();
     Delay1000ms(); //给esp wifi 模块上电时间
    
    sendString(LJWL); // 链接网络 Delay1000ms();
  while(!AT_Connect_Net_Flag); // 等到有效才去执行下面的代码
    while(!AT_OK_Flag);
    AT_OK_Flag=0;
    
  sendString(LJFWQ); //连接服务器
    while(!AT_OK_Flag);
    AT_OK_Flag=0;  //用完清零, 方便下次做判断
    
    sendString(TCMS); //开启透传
    while(!AT_OK_Flag);
    AT_OK_Flag=0;
    
    sendString(SJCS); //接收数据
    while(!AT_OK_Flag);
    
    if(AT_Connect_Net_Flag){
    D5=0; // 通过灯判断是否联网成功  -- 点亮表示成功
   }
     if(AT_OK_Flag){
   D6=0; //代表连接服务器,并且打开 透传 成功 
  }
    
while(1){
   Delay1000ms();
  //往发送缓冲区 写入数据-- 就完成数据的发送
  //sendString("mengxianggiegie\r\n");
   sendString("mengxianggiegie\r\n");
  
 }
}

void uartHandler() interrupt 4
{
    static i = 0;
    char tmp;
    
 if(RI) // 中断处理函数中,对于接收中断的响应
 {
    RI=0; //清楚接收中断标志位
     
      tmp = SBUF;
      if(tmp == 'W' || tmp == 'O'|| tmp == 'L' ){ //匹配到W开头的时候,把下标定义为0,方便后面的[0] [5]的位置比较
     i=0;
    }
      buffer[i++]=tmp;
        
      if(buffer[0]=='W' && buffer[5]=='G'){//联网成功 WIFI GOT 
     AT_Connect_Net_Flag=1; //标志修改为联网状态
         memset(buffer,'\0',SIZE);
    }

        if(buffer[0]=='O' && buffer[1]=='K'){//联网成功 WIFI GOT 
     AT_OK_Flag=1;
         memset(buffer,'\0',SIZE);
    }
        /*
          if(buffer[0]=='F' && buffer[1]=='A'){//联网失败 FAIL 
     for(i=0;i<3;++i){
     D5=0;
         Delay1000ms();
         D5=1;
         Delay1000ms();
    }        
         sendString(LJWL);
         memset(buffer,'\0',SIZE);
    }
        */
        
    if(buffer[0] == 'L'&& buffer[2] == '1'){//收到 o-pen 开灯
     D5=0;
         memset(buffer,'\0',SIZE);
    }
        else if(buffer[0] == 'L'&& buffer[2] == '0'){//收到c-lose 关灯
     D5=1;
         memset(buffer,'\0',SIZE);
        
    }
        if(i==12)
            i=0;


 }
  
    
}

注释部分为进一步优化,没能连接成功就 AT+RET -- 重启 or 重新连接
==============================

相关文章:

C51-- 蓝牙,WIFI模块

HC-08蓝牙模块: 蓝牙 -- 最好用的 串口透传 模块 透传 -- 透明传送&#xff0c;指的是在数据传输的过程中&#xff0c;通过无线的方式这组数据不发生任何形式的改变&#xff0c; 仿佛传输过程是透明的&#xff0c;同时保证传输质量&#xff0c;最终原封不动的传送到接收者手…...

HN热帖|替换Redis的一场赛跑

3 月 21 日&#xff0c; Redis Ltd. 宣布了一项重大决定&#xff1a;Redis “内存数据存储”项目从 Redis 7.4 版本开始将以非自由的、源代码可用的许可证发布。这一消息并不受欢迎&#xff0c;但也并非完全意外。这次的变化的不同寻常之处是市面上已经有了多个 Redis 替代品可…...

Kubernetes(k8s):网络插件之Calico安装与详解

Kubernetes&#xff08;k8s&#xff09;&#xff1a;网络插件之Calico安装与详解 1、什么是Calico&#xff1f;2、安装和配置Calico&#xff08;控制节点-master执行&#xff09;3、配置网络策略4、 Calico 的 yaml 文件部分详解1、ConfigMap配置2、DaemonSet 配置 5、calico-k…...

Chrome base 库详解:工具类和常用类库

Chrome浏览器使用了一个强大的库名为base&#xff0c;它包括了许多工具类和常用类库&#xff0c;以支持Chrome的底层功能和性能优化。在本文中&#xff0c;我们将详细阐述base库中的每个子项&#xff0c;并提供示例代码来展示其用法。 base 库的基本结构 Chrome的base库是一个…...

Nginx开发实战三:替换请求资源中的固定数据

文章目录 1.效果预览2.下载Nginx解压并初始化3.字符串替换模块安装4.修改nginx配置文件并重启 1.效果预览 页面初始效果 页面替换后效果 说明:页面是内网的一个地址&#xff0c;我们通过nginx可以很便捷的将其改为外网访问&#xff0c;但是在外网访问这个地址后&#xff0c…...

如何在Python中实现多线程和多进程?

如何在Python中实现多线程和多进程&#xff1f; 在Python中&#xff0c;多线程和多进程是实现并发编程的两种主要方式。它们各自有其特点和适用场景。下面将分别介绍如何在Python中实现多线程和多进程&#xff0c;并探讨它们的优缺点。 一、多线程 Python的标准库提供了thre…...

Redis面试题10道

1、什么是 Redis&#xff1f;简述它的优缺点&#xff1f; Redis 的全称是&#xff1a;Remote Dictionary.Server&#xff0c;本质上是一个 Key-Value 类型的内存数据库&#xff0c;很像 memcached&#xff0c;整个数据库统统加载在内存当中进行操作&#xff0c;定期通过异步操作…...

vue3从精通到入门6:v-memo指令

v-memo是一个用于优化组件渲染性能的指令。它允许你根据某个条件来缓存组件的虚拟 DOM 树&#xff0c;从而在条件没有变化时避免不必要的重新渲染。这对于那些接收大量 props 且渲染成本较高的组件来说非常有用。 用法 v-memo 指令接受一个表达式或一个数组作为参数&#xff0…...

【算法集训】基础算法:双指针

344. 反转字符串 // 双指针思路 void reverseString(char* s, int sSize) {int i 0,j sSize - 1;while(i < j) {char tmp s[i];s[i] s[j];s[j] tmp;i , j --;} }392. 判断子序列 // 双指针 bool isSubsequence(char* s, char* t) {// 定义s和t的下标指针int i 0, j …...

李白打酒加强版(c++实现)

题目 话说大诗人李白&#xff0c;一生好饮。 幸好他从不开车。 一天&#xff0c;他提着酒壶&#xff0c;从家里出来&#xff0c;酒壶中有酒 2 斗。 他边走边唱&#xff1a; 无事街上走&#xff0c;提壶去打酒。 逢店加一倍&#xff0c;遇花喝一斗。 这一路上&#xff0c;…...

平价运动蓝牙耳机哪个品牌好?必选的5个爆款品牌,超高性价比!

蓝牙耳机&#xff0c;作为连接我们与音乐的桥梁&#xff0c;其重要性不言而喻&#xff0c;特别是平价运动蓝牙耳机&#xff0c;更是广大消费者的心头好&#xff0c;作为一位长期关注数码产品&#xff0c;特别是对蓝牙耳机有深入研究的爱好者&#xff0c;我深知在琳琅满目的市场…...

Android ImageView以及实现截图

实现效果 截图前 截图后 代码 package cn.jj.huaweiad;import android.annotation.SuppressLint; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.View; import android.view.ViewGro…...

剑指offer--数组中重复的数字

一.题目描述 在一个长度为 n 的数组 nums 里的所有数字都在 0&#xff5e;n-1 的范围内。数组中某些数字是重复的&#xff0c;但不知道有几个数字重复了&#xff0c;也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 算法1.排序,然后遍历,时间复杂度O(nlogn),空…...

【THM】SQL Injection(SQL注入)-初级渗透测试

简介 SQL(结构化查询语言)注入,通常称为 SQLi,是对 Web 应用程序数据库服务器的攻击,导致执行恶意查询。当 Web 应用程序使用未经正确验证的用户输入与数据库进行通信时,攻击者有可能窃取、删除或更改私人数据和客户数据,并攻击 Web 应用程序身份验证方法以获取私有数据…...

数码论坛系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…...

vue3性能提升主要通过哪几方面?

&#x1f4dd;个人主页&#xff1a;爱吃炫迈 &#x1f48c;系列专栏&#xff1a;Vue &#x1f9d1;‍&#x1f4bb;座右铭&#xff1a;道阻且长&#xff0c;行则将至&#x1f497; 文章目录 编译优化diff算法优化提取动态节点 静态提升预字符串化缓存内联事件处理函数SSR优化 源…...

跨境电商IP防关联是什么?有什么作用?

做跨境电商的朋友应该都知道IP防关联这个词,那么为何IP需要防关联呢&#xff1f;今天为大家来解答这个问题。 跨境电商IP防关联是指在跨境电商运营中&#xff0c;通过采取一系列技术手段&#xff0c;确保每个跨境电商账号使用独立的IP地址&#xff0c;以避免账号之间因为IP地址…...

git仓库太大只下载单个文件或文件夹

有没有这样的苦恼&#xff1a;仓库太大&#xff0c;只想下载其中某些文件(夹)&#xff1f; 一招解决&#xff1a; ./down_folder_from_git.sh https://github.com/facebook/infer main Makefile FILES.md scripts examples ./down_folder_from_git.sh https://github.com/Ten…...

OpenHarmony实战:RK3568 开发板镜像烧录指南

前言 烧录开发板是每个开发者的必修课&#xff0c;每次对系统的修改务必进行烧录测试&#xff0c;确保修改正确和不会引入新问题。 本文基于 Windows10&#xff0c;以 RK3568 开发板为例&#xff0c;指导如何烧录 OpenHarmony 镜像&#xff0c;镜像也叫固件。Hihoop&#xff…...

Asp.net Core 中一键注入接口

Asp.net Core 中一键注入接口 前言准备开始使用 前言 在之前开发Asp.Net Core程序时遇到接口需要一个一个的注入到Services中,当有非常多的接口需要注入时会显得代码成为了一座山,这里记录一下如何通过接口的命名一键自动注入. 准备 IDE: Visual studio 2022 .Net版本:.Net …...

怎么让ChatGPT批量写作原创文章

随着人工智能技术的不断发展&#xff0c;自然语言处理模型在文本生成领域的应用也日益广泛。ChatGPT作为其中的佼佼者之一&#xff0c;凭借其强大的文本生成能力和智能对话特性&#xff0c;为用户提供了一种高效、便捷的批量产出内容的解决方案。以下将就ChatGPT批量写作内容进…...

【SqlServer】Alwayson收缩日志

Alwayson收缩日志 压缩失败直接压缩压缩失败 直接压缩 加入高可用组之后,不能设置成简单模式。 USE [databasename] CHECKPOINT DECLARE @bakfile nvarchar(100) SET @bakfile=D:\data...

视觉里程计之对极几何

视觉里程计之对极几何 前言 上一个章节介绍了视觉里程计关于特征点的一些内容&#xff0c;相信大家对视觉里程计关于特征的描述已经有了一定的认识。本章节给大家介绍视觉里程计另外一个概念&#xff0c;对极几何。 对极几何 对极几何是立体视觉中的几何关系&#xff0c;描…...

数据可视化高级技术(Echarts)

目录 &#xff08;一&#xff09;数据可视化概念及Echarts基础知识 数据可视化的好处&#xff1a; 数据可视化的目标 数据可视化的基本流程 &#xff08;二&#xff09;数据图表 类别比较图表&#xff1a; 数据关系图表&#xff1a; 数据分布图表&#xff1a; 时间序列…...

设计模式——行为型——责任链模式Chain Of Responsibility

请求类 public class ApproverRequest {private int type;//请求批准的类型private float price;//请求的金额private int id;//请求的编号 } 审批人抽象类 public abstract class ApproverPerson {protected ApproverPerson next;protected String name;//审批过程public a…...

设计模式之工厂方法模式精讲

工厂方法模式又叫虚拟构造函数&#xff08;Virtual Constructor&#xff09;模式或者多态性工厂&#xff08;Polymorphic Factory&#xff09;模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口&#xff0c;将实际创建性工作推迟到子类中。 工厂模式可以分为简单工厂…...

JS实现省市区三级联动(json假数据)

省市级三级联动通常指的是在用户界面上&#xff0c;用户可以通过选择省份&#xff0c;然后基于所选择的省份选择对应的城市&#xff0c;最后基于所选择的城市选择对应的区县。这种联动效果在很多应用中都有出现&#xff0c;例如电商平台的收货地址选择、政务服务的地区选择等。…...

Fastjson配置消息转换器(时间格式问题)

问题&#xff1a; 我们可以看见&#xff0c;日期的格式有点问题。 由于ArticleListVO类的createTime成员变量是Date类型&#xff0c;默认是由java的Jackson来处理&#xff0c;使用 ISO-8601 规范来处理日期时间格式。ISO-8601 是一种国际标准的日期时间表示法&#xff0c;例如&…...

安卓Android 架构模式及UI布局设计

文章目录 一、Android UI 简介1.1 在手机UI设计中&#xff0c;坚持的原则是什么1.2 安卓中的架构模式1.2.1 MVC (Model-View-Controller)设计模式优缺点 1.2.2 MVP(Model-View-Presenter)设计模式MVP与MVC关系&#xff1a; 1.2.3 MVVM(Model—View—ViewModel ) 设计模式1.2.4 …...

基于Spring Boot的在线学习系统的设计与实现

基于Spring Boot的在线学习系统的设计与实现 摘 要 在线学习系统是以大学传统线下教学方式不适应信息技术的迅速发展为背景&#xff0c;提高学习效率&#xff0c;解决传统教学问题&#xff0c;并且高效的实现教学信息化的一款软件系统。为了更好的实现对于教学和学生的管理&a…...