diff --git a/README.md b/README.md
index 55989dbf..2aa320cd 100644
--- a/README.md
+++ b/README.md
@@ -7,6 +7,7 @@
2. 服务端使用spring boot、数据库mysql和redis、前端vue、移动端android、硬件端ESP-IDF和Arduino等。软硬件交互基于Mqtt协议,使用EMQ代理服务器。系统架构图如下:

+

3. 硬件端提供接入文档,需要设备支持网络功能,项目里面包含ESP-IDF和Arduino的硬件代码和接入示例。同时制作了智能开关(wifi通断器)板子,可用于学习和生活中,控制2500W以下的用电设备。硬件完整示例代码采用ESP-IDF框架4.2版本,基于乐鑫ESP32S2芯片,安信可ESP-12K模组。[详情和购买方式 >> ](https://gitee.com/kerwincui/wumei-smart/wikis/pages?sort_id=4233922&doc_id=1506495)
@@ -25,7 +26,7 @@

2. Wifi控制器和LED灯板制作七彩智能灯

-3.物联网开发板 [详情和购买方式 >>](https://gitee.com/kerwincui/wumei-smart/wikis/pages?sort_id=4233922&doc_id=1506495)
+3. 物联网开发板 [详情和购买方式 >>](https://gitee.com/kerwincui/wumei-smart/wikis/pages?sort_id=4233922&doc_id=1506495)

4. 物联网入门学习套件 [详情和购买方式 >>](https://gitee.com/kerwincui/wumei-smart/wikis/pages?sort_id=4233922&doc_id=1506495)

@@ -63,7 +64,7 @@ docker run \
--publish 6379:6379 \
--restart always \
--detach \
-kerwincui/wumei-smart:1.0
+registry.cn-chengdu.aliyuncs.com/kerwincui/wumei-smart:1.0
```
#### 3. 扫码下载APP安装,打开APP,跳过登录,配置服务端地址
@@ -96,10 +97,11 @@ kerwincui/wumei-smart:1.0
* [若依文档](http://doc.ruoyi.vip/ruoyi-vue/),前端和后端基于Ruoyi-Vue,前后端分离权限管理系统
* [XUI](https://gitee.com/xuexiangjys/XUI),Android基于XUI开发,是一个简洁而优雅的原生UI框架
* [ESP-IDF编程指南](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/index.html)
+* [EMQ文档](https://docs.emqx.cn)
-### 七、加入讨论群:1073236354
+### 七、加入互助交流群:1073236354(一群) 252664672(二群)
diff --git a/android/README.md b/android/README.md
index e69de29b..4592c915 100644
--- a/android/README.md
+++ b/android/README.md
@@ -0,0 +1,5 @@
+Android项目打包
+1. 修改工程根目录的gradle.properties中的isNeedPackage=true。
+2. 添加并配置keystore,在versions.gradle中修改app_release相关参数。
+3. 如果考虑使用友盟统计的话,在local.properties中设置应用的友盟ID:APP_ID_UMENG。
+4. 使用./gradlew clean assembleReleaseChannels进行多渠道打包。
\ No newline at end of file
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 32580bb9..96048946 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -108,8 +108,9 @@ dependencies {
//屏幕适配AutoSize
implementation 'me.jessyan:autosize:1.1.2'
//umeng统计
- implementation 'com.umeng.umsdk:analytics:8.0.2'
- implementation 'com.umeng.umsdk:common:2.0.2'
+// implementation 'com.umeng.umsdk:analytics:8.0.2'
+// implementation 'com.umeng.umsdk:common:2.0.2'
+ implementation group: 'com.umeng.umsdk', name: 'common', version: '9.3.8'
//预加载占位控件
implementation 'me.samlss:broccoli:1.0.0'
diff --git a/document/sys2.png b/document/sys2.png
new file mode 100644
index 00000000..be5b734c
Binary files /dev/null and b/document/sys2.png differ
diff --git a/firmware/esp-idf/wumei-smart-firmware/main/button.c b/firmware/esp-idf/wumei-smart-firmware/main/button.c
index 93aef6c6..aa74d1fd 100644
--- a/firmware/esp-idf/wumei-smart-firmware/main/button.c
+++ b/firmware/esp-idf/wumei-smart-firmware/main/button.c
@@ -271,42 +271,47 @@ static void radar_sense(void *arg) {
ESP_LOGI(TAG, "begin radar sense");
uint16_t num=0;
while(true){
- // if(is_radar==1 && is_alarm==1){
- // if(gpio_get_level(IO_RADAR_OUT)==1){
- // if(relay_status==0) {
- // open_relay();
- // led_rgb_blink(255,0,0,100,0,0,3,1000); //红灯闪烁
- // }
- // }
- // else{
- // //超过指定时间后关闭
- // if(relay_status==1 && num >5*radar_interval){
- // close_relay();
- // light_status=0;
- // led_status();
- // num=0;
- // }
- // num++;
- // }
- // } else if(is_radar==1) {
- // if(gpio_get_level(IO_RADAR_OUT)==1){
- // if(relay_status==0) {
- // open_relay();
- // light_status=1;
- // led_status();
- // }
- // }
- // else{
- // //超过指定时间后关闭
- // if(relay_status==1 && num >5*radar_interval){
- // close_relay();
- // light_status=0;
- // led_status();
- // num=0;
- // }
- // num++;
- // }
- // }
+ if(is_radar==1 && is_alarm==1){
+ if(gpio_get_level(IO_RADAR_OUT)==1){
+ if(relay_status==0) {
+ relay_status=1;
+ open_relay();
+ light_status=1;
+ led_rgb_blink(255,0,0,100,0,0,3,500); //红灯闪烁
+ }
+ }
+ else{
+ //超过指定时间后关闭
+ if(relay_status==1 && num >5*radar_interval){
+ relay_status=0;
+ close_relay();
+ light_status=0;
+ led_status();
+ num=0;
+ }
+ num++;
+ }
+ } else if(is_radar==1) {
+ if(gpio_get_level(IO_RADAR_OUT)==1){
+ if(relay_status==0) {
+ relay_status=1;
+ open_relay();
+ light_status=1;
+ led_status();
+ }
+ }
+ else{
+ //超过指定时间后关闭
+ if(relay_status==1 && num >5*radar_interval){
+ relay_status=0;
+ close_relay();
+ light_status=0;
+ led_status();
+ num=0;
+ }
+ num++;
+ }
+ }
vTaskDelay(pdMS_TO_TICKS(200));
}
diff --git a/firmware/esp-idf/wumei-smart-firmware/main/common.c b/firmware/esp-idf/wumei-smart-firmware/main/common.c
index 99095ea2..9089e4bf 100644
--- a/firmware/esp-idf/wumei-smart-firmware/main/common.c
+++ b/firmware/esp-idf/wumei-smart-firmware/main/common.c
@@ -21,9 +21,9 @@ char ssid[33]="wifi-ssid"; // wifi的SSID
char pwd[65]="wifi-password"; // wifi的密码
char owner_id[64]="1"; // 用户ID
-char open_broken_url[128]=""; // 二次开发mqtt服务器地址
-char open_account[64]=""; // 二次开发mqtt账号
-char open_pwd[64]=""; // 二次开发mqtt密码
+// char open_broken_url[128]="wumei.live:1883"; // 二次开发mqtt服务器地址
+// char open_account[64]="admin"; // 二次开发mqtt账号
+// char open_pwd[64]="admin123"; // 二次开发mqtt密码
uint8_t relay_status=0; // 继电器状态 0-关闭,1-打开
uint8_t light_status=0; // 灯的状态 0-关闭 1-打开
diff --git a/spring-boot/ruoyi-admin/pom.xml b/spring-boot/ruoyi-admin/pom.xml
index fe370b40..ed8d8da6 100644
--- a/spring-boot/ruoyi-admin/pom.xml
+++ b/spring-boot/ruoyi-admin/pom.xml
@@ -8,6 +8,7 @@
3.4.0
4.0.0
+
jar
ruoyi-admin
diff --git a/spring-boot/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/spring-boot/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
index 9d2daa6c..51f9d2a0 100644
--- a/spring-boot/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
+++ b/spring-boot/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
@@ -124,7 +124,7 @@ public class SysUserController extends BaseController
/**
* 新增用户
*/
-// @PreAuthorize("@ss.hasPermi('system:user:add')")
+ @PreAuthorize("@ss.hasPermi('system:user:add')")
@Log(title = "用户管理", businessType = BusinessType.INSERT)
@PostMapping
@ApiOperation(value = "新增用户", notes = "新增用户")
@@ -149,6 +149,33 @@ public class SysUserController extends BaseController
return toAjax(userService.insertUser(user));
}
+ /**
+ * 用户注册
+ */
+ @Log(title = "用户管理", businessType = BusinessType.INSERT)
+ @PostMapping("/register")
+ @ApiOperation(value = "用户注册", notes = "用户注册")
+ public AjaxResult register(@Validated @RequestBody SysUser user)
+ {
+ if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName())))
+ {
+ return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
+ }
+ else if (StringUtils.isNotEmpty(user.getPhonenumber())
+ && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
+ {
+ return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
+ }
+ else if (StringUtils.isNotEmpty(user.getEmail())
+ && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
+ {
+ return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
+ }
+ user.setDelFlag("0");
+ user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+ return toAjax(userService.insertUser(user));
+ }
+
/**
* 修改用户
*/
diff --git a/spring-boot/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/spring-boot/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
index a8a61d42..e71fccb2 100644
--- a/spring-boot/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
+++ b/spring-boot/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -97,7 +97,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
// 过滤请求
.authorizeRequests()
// 对于登录login 验证码captchaImage 允许匿名访问
- .antMatchers("/login", "/captchaImage").anonymous()
+ .antMatchers("/login", "/captchaImage","/system/user/register").anonymous()
.antMatchers(
HttpMethod.GET,
"/*.html",
@@ -113,7 +113,6 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
.antMatchers("/webjars/**").anonymous()
.antMatchers("/*/api-docs").anonymous()
.antMatchers("/druid/**").anonymous()
- .antMatchers("/system/user/**").anonymous()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated()
.and()