基于Arduino Uno的简易可视化操作界面设计

        Arduino UNO是基于ATmega328P的Arduino开发板。它有14个数字输入/输出引脚(其中6个可用于PWM输出)、6个模拟输入引脚,一个16 MHz的晶体振荡器,一个USB接口,一个DC接口,一个ICSP接口,一个复位按钮。Arduino一词意味着该款开发板可以使用Arduino官方和第三方库文件,简化开发流程,可以让我们在不了解单片机底层原理下对其进行充分开发,因此Arduino获得了众多初级开发者的喜爱。

一、总体设计

        本次项目采用模块化编程的设计方式,因为在实际设计中,我们利用状态者模式隔离不同模式下的功能操作,如下:

        程序整体设计思路来自于状态者模式,对于初学者并不友好,使用C++语言设计,参考代码如下:

#include "State.h"//状态1,继承重写doThing
void StateCase1::doThing(CurState *s){//静态变量作为开关,防止重复创建对象static int count = 0;//进行开关判断,创建过就不再创建if(count == 0){s->getOled()->setLogo(new ServoP(s->getOled()));count = 1;                  }//按下1按键,滑动到2状态if(m_command == 1){delete s->getCase(); //回收状态管理者的此时指针s->setCase(new StateCase2); //new 一个新的状态,设置进去这里为2count = 0; //开关打开,方便下次跳转到这时创建对象}//按下1按键,滑动到3状态else if(m_command == 2){delete s->getCase(); //回收状态管理者的此时BaseCase指针s->setCase(new StateCase3); //new 一个新的状态,设置进去这里为3count = 0; //开关打开,方便下次跳转到这时创建对象}//5键为确定,跳转到状态5else if(m_command == 5){delete s->getCase(); //回收状态管理者的此时BaseCase指针s->setCase(new StateCase4); //new 一个新的状态,设置进去这里为3count = 0; //开关打开,方便下次跳转到这时创建对象 }
}void StateCase2::doThing(CurState *s){//静态变量作为开关,放置重复创建对象static int count = 0;//进行开关判断,创建过就不再创建if(count == 0){s->getOled()->setLogo(new MusicP(s->getOled()));count = 1;}//按下1按键,滑动到1状态else if(m_command == 2){delete s->getCase(); //回收状态管理者的此时BaseCase指针s->setCase(new StateCase1); //new 一个新的状态,设置进去这里为1count = 0; //开关打开,方便下次跳转到这时创建对象 }  else if(m_command == 5){delete s->getCase(); //回收状态管理者的此时BaseCase指针s->setCase(new StateCase5); //new 一个新的状态,设置进去这里为5count = 0; //开关打开,方便下次跳转到这时创建对象 }
}//以下状态剩余类推
void StateCase3::doThing(CurState *s){static int count = 0;if(count == 0){s->getOled()->setLogo(new ClockP(s->getOled()));count = 1;}if(m_command == 1){delete s->getCase();s->setCase(new StateCase1);count = 0;}else if(m_command == 5){delete s->getCase();s->setCase(new StateCase7);count = 0;}
}void StateCase4::doThing(CurState *s){static int count = 0;static int angle=0;if(count == 0){s->getOled()->setLogo(new Servo_fun(s->getOled()));count = 1;}s->getOled()->printW(48, 32, 2, angle);if(m_command == 3){delete s->getCase();s->setCase(new StateCase1);angle = 0;s->getServo()->write(0);count = 0;}else if(m_command == 1){angle += 30;if(angle>180){angle = 180;}s->getServo()->write(angle);}else if(m_command == 2){angle -= 30;if(angle < 0){angle = 0;}s->getServo()->write(angle);}  
}void StateCase5::doThing(CurState *s){static int count = 0;static int pos = 16;s->getOled()->printW(100, pos, 2, "*");if(count == 0){s->getOled()->setLogo(new Playlist(s->getOled()));count = 1;}  if(m_command == 3){delete s->getCase();s->setCase(new StateCase2);count = 0;}else if(m_command == 1){pos -= 16;if(pos<16){pos = 16;}}else if(m_command == 2){pos += 16;if(pos>32){pos = 32;}}else if(m_command == 5 && pos==16){delete s->getCase();s->setCase(new StateCase6);count = 0;    }
}void StateCase6::doThing(CurState *s){static int count = 0;if(count == 0){s->getOled()->setLogo(new Playing(s->getOled()));count = 1;}s->getBuzzer()->on();if(m_command == 3){delete s->getCase();s->setCase(new StateCase5);s->getBuzzer()->off();count = 0;        }
}void StateCase7::doThing(CurState *s){static int count = 0;static int Time_ms = 0, Time_s = 0;static int time_flag = 0;if(time_flag ==1){delay(10);Time_ms++;if(Time_ms >= 100){Time_ms = 0;Time_s++;}}s->getOled()->printW(48, 32, 2, Time_s);s->getOled()->printW(80, 32, 2, Time_ms);if(count == 0){s->getOled()->setLogo(new ClockCount(s->getOled()));count = 1;}  if(m_command == 3){delete s->getCase();s->setCase(new StateCase3);Time_ms = 0;Time_s = 0;time_flag = 0;count = 0;        }if(m_command == 5){time_flag = 1;}if(m_command == 2){time_flag = 0;}
}
#pragma once
#include "UiLogo.h"
#include "MyOledH.h"
#include <Servo.h>
#include "Buzzer.h"
#include <Arduino.h>//提前声明,方便下面BaseCase类的声明
class CurState;//定义基类并设置虚函数,由于setCommand都一样,这个就不重写
class BaseCase{
public://获取指令,来源于状态管理者的set方法,而状态管理者来指令源于按键virtual void setCommand(int command){m_command = command;}virtual void doThing(CurState *s) = 0;
protected:int m_command;
};//状态管理者
class CurState{
public://各种set和get方法void setOled(MyOled *oled){m_oled = oled;}void setCase(BaseCase *Case){m_case = Case;}MyOled *getOled(void){return m_oled;}BaseCase *getCase(void){return m_case;}void setCommand(int command){m_case->setCommand(command);}void setServo(Servo *servo){m_servo = servo;}Servo *getServo(void){return m_servo;}void setBuzzer(Buzzer *buzzer){m_buzzer = buzzer;}Buzzer *getBuzzer(void){return m_buzzer;}//doThing调用m_case的doThing并将自身指针传入void doThing(void){m_case->doThing(this);}
private://各种指针,方便m_case通过get方法获取进行操作。BaseCase *m_case;MyOled *m_oled;Servo *m_servo;Buzzer *m_buzzer;
};//以下是7种状态的声明
class StateCase1: public BaseCase{
public:void doThing(CurState *s); 
};class StateCase2: public BaseCase{
public:void doThing(CurState *s); 
};class StateCase3: public BaseCase{
public:void doThing(CurState *s); 
};class StateCase4: public BaseCase{
public:void doThing(CurState *s); 
};class StateCase5: public BaseCase{
public:void doThing(CurState *s); 
};class StateCase6: public BaseCase{
public:void doThing(CurState *s); 
};class StateCase7: public BaseCase{
public:void doThing(CurState *s); 
};

        本次设计所使用的图形化界面,通过取字模的方式得到,参考如下:

#pragma once
#include <Arduino.h>
#include "MyOledH.h"//各个图标获取到的16进制字模
static const unsigned char PROGMEM music_pic[] = 
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFC,0x00,0x07,0xFF,0xFF,0xFC,0x00,0x04,0x00,0x00,0x04,
0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,
0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,
0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,
0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,
0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,
0x00,0x7C,0x00,0x00,0x04,0x00,0xFC,0x00,0x00,0x7C,0x00,0xFC,0x00,0x00,0xFC,0x00,0xF8,0x00,0x00,0xFC,0x00,0x70,0x00,0x00,
0xF8,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00};/*"未命名文件",0*/static const unsigned char PROGMEM servo_pic[] = 
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFE,0x00,0x00,0x00,
0x00,0x00,0x40,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x92,0x00,0x00,0x00,
0x00,0x00,0x49,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x40,0x7C,0x02,0x00,0x00,0x00,
0x00,0x00,0x46,0xFE,0x02,0x00,0x00,0x00,0x00,0x00,0x43,0x81,0x82,0x00,0x00,0x00,0x00,0x00,0x42,0x3F,0xFF,0xFF,0xF8,0x00,
0x00,0x00,0x44,0x7F,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x48,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x49,0xFF,0xFF,0xFF,0xFF,0x00,
0x00,0x00,0x49,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x48,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x44,0x7F,0xFF,0xFF,0xFC,0x00,
0x00,0x00,0x42,0x3F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x41,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x40,0xFE,0x02,0x00,0x00,0x00,
0x00,0x00,0x40,0x7C,0x02,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x62,0x00,0x00,0x00,
0x00,0x00,0x49,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x62,0x00,0x00,0x00,
0x00,0x00,0x40,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x5F,0xFF,0xFA,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x0A,0x00,0x00,0x00,
0x00,0x00,0x50,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x0A,0x00,0x00,0x00,
0x00,0x00,0x50,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x0A,0x00,0x00,0x00,
0x00,0x00,0x50,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x0A,0x00,0x00,0x00,
0x00,0x00,0x5F,0xFF,0xFA,0x00,0x00,0x00,0x00,0x00,0x40,0x24,0x02,0x00,0x00,0x00,0x00,0x00,0x40,0x24,0x02,0x00,0x00,0x00,
0x00,0x00,0x40,0x24,0x02,0x00,0x00,0x00,0x00,0x00,0x40,0x24,0x02,0x00,0x00,0x00,0x00,0x00,0x40,0x3C,0x02,0x00,0x00,0x00,
0x00,0x00,0x46,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x92,0x00,0x00,0x00,
0x00,0x00,0x46,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFE,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/*"未命名文件",0*/static const unsigned char PROGMEM clock_pic[] = 
{0x00,0x3F,0xFF,0xC0,0x00,0x00,0x40,0x00,0x20,0x00,0x00,0x80,0x00,0x10,0x00,0x01,0x00,0x00,0x08,0x00,0x02,0x00,0x00,0x04,
0x00,0x04,0x00,0x00,0x02,0x00,0x08,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x80,0x20,0x00,0x00,0x00,0x40,0x40,0x00,0x00,
0x00,0x20,0x80,0x00,0x00,0x00,0x10,0x80,0x00,0x00,0x00,0x10,0x80,0x00,0x00,0x00,0x10,0x80,0x00,0x00,0x00,0x10,0x80,0x00,
0x00,0x00,0x10,0x80,0x00,0x00,0x00,0x10,0x80,0x00,0xF8,0x00,0x10,0x80,0x00,0xFF,0xF8,0x10,0x80,0x00,0xFF,0xF8,0x10,0x80,
0x00,0xF8,0x00,0x10,0x80,0x00,0x20,0x00,0x10,0x80,0x00,0x20,0x00,0x10,0x80,0x00,0x20,0x00,0x10,0x80,0x00,0x20,0x00,0x10,
0x80,0x00,0x20,0x00,0x10,0x80,0x00,0x20,0x00,0x10,0x40,0x00,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x40,0x10,0x00,0x20,0x00,
0x80,0x08,0x00,0x20,0x01,0x00,0x04,0x00,0x20,0x02,0x00,0x02,0x00,0x20,0x04,0x00,0x01,0x00,0x00,0x08,0x00,0x00,0x80,0x00,
0x10,0x00,0x00,0x40,0x00,0x20,0x00,0x00,0x3F,0xFF,0xC0,0x00};/*"未命名文件",0*/static const unsigned char PROGMEM cursor_u[] = 
{0x01,0x80,0x03,0xC0,0x07,0xE0,0x0F,0xF0,0x1F,0xF8,0x3F,0xFC,0x7F,0xFE,0xFF,0xFF,0x07,0xE0,0x07,0xE0,0x07,0xE0,0x07,0xE0,
0x07,0xE0,0x07,0xE0,0x07,0xE0,0x07,0xE0};/*"上箭头",0*/static const unsigned char PROGMEM cursor_d[] = 
{0x07,0xE0,0x07,0xE0,0x07,0xE0,0x07,0xE0,0x07,0xE0,0x07,0xE0,0x07,0xE0,0x07,0xE0,0xFF,0xFF,0x7F,0xFE,0x3F,0xFC,0x1F,0xF8,
0x0F,0xF0,0x07,0xE0,0x03,0xC0,0x01,0x80};/*"下箭头",0*///继承重写LogoPicture,形成很多子类,方便扩展,符合开放封闭原则//音乐图标
class MusicP: public LogoPicture{
public:MusicP(MyOled *oled);~MusicP(void);void showLogo(void);
private:MyOled *m_oled;
};class ServoP: public LogoPicture{
public:ServoP(MyOled *oled);~ServoP(void);void showLogo(void);
private:MyOled *m_oled;
};//时钟图标
class ClockP: public LogoPicture{
public:ClockP(MyOled *oled);~ClockP(void);void showLogo(void);
private:MyOled *m_oled;
};//舵机图标
class Servo_fun: public LogoPicture{
public:Servo_fun(MyOled *oled);~Servo_fun(void);void showLogo(void);
private:MyOled *m_oled;
};//音乐播放界面
class Playlist: public LogoPicture{
public:Playlist(MyOled *oled);~Playlist(void);void showLogo(void);
private:MyOled *m_oled;
};//演奏中
class Playing: public LogoPicture{
public:Playing(MyOled *oled);~Playing(void);void showLogo(void);
private:MyOled *m_oled;
};//时钟计时界面
class ClockCount: public LogoPicture{
public:ClockCount(MyOled *oled);~ClockCount(void);void showLogo(void);
private:MyOled *m_oled;
};

二、功能演示

        程序运行,我们可以看到图形化界面如下,可按上下进行功能切换:

      点击进入音乐界面,按上下按键可以调节舵机旋转角度,并且舵机跟着转动,如图:

        点击英语界面,选择第一个音乐,蜂鸣器鸣叫模拟音乐

        点击进入时钟界面,此时可以进行计时操作,如下:

三、设计总结

        本次设计使用Arduino IDE开发Arduino UNO,利用oled模块显示可视化界面,对应操作不同器件了,本次设计利用状态者模式进行设计,为程序的可扩展性提供了很大便利。

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

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

相关文章

C++速通LeetCode简单第16题-买卖股票的最佳时机

思路要点&#xff1a;假设当天卖&#xff0c;动态更新最低价格和最大利益 class Solution { public://要点&#xff1a;假设当天卖&#xff0c;动态更新最低价格和最大利益int maxProfit(vector<int>& prices) {int ans 0;int lowest prices[0];for(int i 1; i &…

COMP 6714-Info Retrieval and Web Search笔记week1

哭了哭了&#xff0c;这周唯一能听懂的就这门 目录 IR&#xff08;Information Retrieval)是什么&#xff1f;IR的基本假设Unstructured (text) vs. structuredDocuments vs. Database Records比较文本&#xff08;Comparing Text&#xff09;IR的范围(Dimensions of IR)IR的任…

多线程1(游戏逆向)

#include<iostream> #include<windows.h> #include<tchar.h> #include<stdio.h> #include <process.h> #pragma warning(disable:4996) //exe应用程序 VOID PrintUI(CONST CHAR* ExeName, CONST CHAR* UIName, CONST CHAR* color, SHORT X坐标, …

基于SSM的银发在线教育云平台的设计与实现

需要项目源码请联系我&#xff0c;目前有各类成品 毕设 javaweb ssh ssm springboot等等项目框架&#xff0c;源码丰富。 专业团队&#xff0c;咨询就送开题报告&#xff0c;活动限时免费&#xff0c;有需要的朋友可以来留言咨询。 一、摘要 现在的科技进步使得人们的学习不仅…

C++面试常见手撕题目

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 分享常见的面试手撕…

CC2530实现按键控制LED

实现按钮控制LED1开启和关闭 1配置环境 2扩展资料 通用io和外设io 设置输入输出 设置输入模式 3实例代码 #include "ioCC2530.h"void delay(int n){int i,j;for(i0;i<n;i){for(j0;j<240;j){asm("NOP");asm("NOP");asm("NOP")…

在 Python 画图中同时设置中英文字体

前言 在使用matplotlib.pyplot画图时&#xff0c;默认情况下都是黑体字&#xff0c;很不美观。如果含有中文&#xff0c;可能无法显示&#xff1b;显示了中文之后英文字体就不能使用。本文针对这些问题逐一给出解决方案。 同时设置中英文字体 我们都知道&#xff0c;按照下面的…

8路模拟量采集模块,4~20mA 0~10V电流电压高速采集——DAM-3054P

阿尔泰科技 DAM-3054P为8路差分模拟量采集模块&#xff0c;高速采集&#xff0c;每通道采集速率为500sps&#xff0c;16位AD&#xff0c;支持RS485通讯接口&#xff0c;带有标准ModbusRTU协议。配备良好的人机交互界面&#xff0c;使用方便&#xff0c;性能稳定。 指标参数&…

Spring Boot母婴商城:安全、便捷、高效

2 相关技术 2.1 SSM框架介绍 本课题程序开发使用到的框架技术&#xff0c;英文名称缩写是SSM&#xff0c;在JavaWeb开发中使用的流行框架有SSH、SSM、SpringMVC等&#xff0c;作为一个课题程序采用SSH框架也可以&#xff0c;SSM框架也可以&#xff0c;SpringMVC也可以。SSH框架…

PSINS工具箱函数介绍——kfplot

关于工具箱 kfplot是图像绘制的函数,用于绘制关于滤波(前/后)的误差图像。 本文所述的代码需要基于PSINS工具箱,工具箱的讲解: PSINS初学指导:https://blog.csdn.net/callmeup/article/details/137087932使用方法 函数形式为: k f p l o t ( x k p k , v a r a r g i…

利用AI增强现实开发:基于CoreML的深度学习图像场景识别实战教程

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

指针求函数的最大值,传递的只有一个参数如何比较两个整数的最大值

指针求函数的最大值&#xff0c;传递的只有一个参数如何比较两个整数的最大值 指针求函数的最大值&#xff0c;传递的只有一个参数如何比较两个整数的最大值 文章目录 指针求函数的最大值&#xff0c;传递的只有一个参数如何比较两个整数的最大值指针求函数的最大值&#xff0…

【硬件模块】SHT20温湿度传感器

SHT20是一个用IIC通信的温湿度传感器。我们知道这个就可以了。 它支持的电压范围是2.1~3.6V&#xff0c;推荐是3V&#xff0c;所以如果我们的MCU是5V的&#xff0c;那么就得转个电压才能用了。 IIC常见的速率有100k&#xff0c;400k&#xff0c;而SHT20是支持400k的&#xff08…

yolo-word复现

github下载代码&#xff1a;https://github.com/AILab-CVC/YOLO-World 配置环境&#xff1a; 官方的方式 当然也可以按照官方给的配置方式去安装库&#xff0c;我也试了&#xff0c;出现小问题了。 我这边是从我本身的yolov8的环境克隆过来的&#xff0c;然后安装我环境里没有…

MyBatis 数据处理:主键获取、批量删除与动态表名

MyBatis 数据处理&#xff1a;主键获取、批量删除与动态表名 1.主键获取 XML配置中使用了useGeneratedKeys"true"和keyProperty"id"来自动获取并设置插入后的自增主键。这是一个标准的做法。 1&#xff09;mapper接口 /*** 添加数据时获取自增id*/ int a…

大数据处理技术:MapReduce综合实训

目录 1 实验名称 2 实验目的 3 实验内容 4 实验原理 5 实验过程或源代码 5.1 WordCount词频统计 5.2 HDFS文件读写 5.3 倒排索引 5.4 网页排序——PageRank算法 6 实验结果 6.1 WordCount词频统计 6.2 HDFS文件读写 6.3 倒排索引 6.4 网页排序——PageRank算法 1…

Spring Event 业务解耦神器(泛型喔!)

一.前言 又与我一直负责Cocos Creator的开发,我发现在TS领域,是可以自定义事件(有兴趣的大宝可以坐飞机直达:[CocosCreator]自定义事件(订阅/发布)管理器),这样做有什么好处呢?回答:解耦! 于是乎,我就觉得前端能干的事,后端也一样能干!当然,如果后端是TS或JS写的,比如nodeJS,…

『功能项目』切换职业面板【48】

我们打开上一篇47技能冷却蒙版的项目&#xff0c; 本章要做的事情是切换职业UI面板的功能 首先双击打开Canvas预制体在左上主角面板信息中新建一个button按钮 重命名&#xff08;父物体是按钮Button&#xff0c;子物体Image即可&#xff09; 创建一个Image 设计一下布局 复制三…

[进阶]面向对象之 包 final

文章目录 包什么是包包名的规则:什么时候需要导包 final常量 包 什么是包 包就是文件夹。用来管理各种不同功能的Java类&#xff0c;方便后期代码维护。 包名的规则: 公司域名反写包的作用&#xff0c;需要全部英文小写&#xff0c;见名知意。使用其他类时&#xff0c;需要…