diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..5ff6309
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,38 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..ae43c91
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,143 @@
+
+
+
+ 4.0.0
+
+ com.smart
+ Smart-Parking
+ 1.0-SNAPSHOT
+ war
+
+
+ UTF-8
+ 1.8
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.6.RELEASE
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-tomcat
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+ net.sourceforge.nekohtml
+ nekohtml
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ mysql
+ mysql-connector-java
+
+
+ cn.hutool
+ hutool-all
+ 4.6.10
+
+
+ org.apache.shiro
+ shiro-spring-boot-web-starter
+ 1.7.1
+
+
+ org.apache.commons
+ commons-lang3
+ 3.11
+
+
+ com.github.theborakompanioni
+ thymeleaf-extras-shiro
+ 2.0.0
+
+
+ org.projectlombok
+ lombok
+ 1.16.18
+
+
+
+ com.google.guava
+ guava
+ 25.1-jre
+
+
+ com.github.whvcse
+ easy-captcha
+ 1.6.2
+
+
+
+
+
+ org.apache.poi
+ poi
+ 4.0.1
+
+
+ org.apache.poi
+ poi-ooxml
+ 4.0.1
+
+
+ org.apache.poi
+ poi-ooxml-schemas
+ 4.0.1
+
+
+
+ org.springframework.boot
+ spring-boot-starter-integration
+
+
+ org.springframework.integration
+ spring-integration-stream
+
+
+ org.springframework.integration
+ spring-integration-mqtt
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ runtime
+
+
+ org.projectlombok
+ lombok
+ 1.18.20
+ provided
+
+
+
+ Smart-Parking
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ org.springframework
+ springloaded
+ 1.2.7.RELEASE
+
+
+
+
+
+
diff --git a/src/main/java/com/smart/Application.java b/src/main/java/com/smart/Application.java
new file mode 100644
index 0000000..ca4dbf1
--- /dev/null
+++ b/src/main/java/com/smart/Application.java
@@ -0,0 +1,35 @@
+package com.smart;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+/**
+ * 启动类
+ * 支付申请地址:https://dwz.cn/mPQmSPss
+ * 国内领先的支付管理平台:https://paycloud.vip
+ */
+@EnableAsync // 启用异步方法执行
+@EnableCaching // 启用缓存
+@EnableScheduling // 启用定时任务
+@SpringBootApplication // Spring Boot应用程序注解
+public class Application extends SpringBootServletInitializer {
+
+ private static final Logger logger = LoggerFactory.getLogger(Application.class);
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args); // 启动Spring Boot应用程序
+ logger.info("智能停车场管理平台"); // 打印日志信息
+ }
+
+ @Override
+ protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
+ return application.sources(Application.class);
+ }
+}
diff --git a/src/main/java/com/smart/common/config/AbstractController.java b/src/main/java/com/smart/common/config/AbstractController.java
new file mode 100644
index 0000000..ad65180
--- /dev/null
+++ b/src/main/java/com/smart/common/config/AbstractController.java
@@ -0,0 +1,16 @@
+package com.smart.common.config;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 通用Controller
+ */
+@RestController
+public class AbstractController {
+
+ //定义了一个受保护的日志记录器 logger,用于在子类中记录日志信息
+ protected Logger logger = LoggerFactory.getLogger(getClass());
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/smart/common/config/BigDecimalSerialize.java b/src/main/java/com/smart/common/config/BigDecimalSerialize.java
new file mode 100644
index 0000000..ba09247
--- /dev/null
+++ b/src/main/java/com/smart/common/config/BigDecimalSerialize.java
@@ -0,0 +1,33 @@
+package com.smart.common.config;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+
+/**
+ * 金额格式化
+ */
+public class BigDecimalSerialize extends JsonSerializer {
+ // 继承自 Jackson 库中的 JsonSerializer 类,并指定了序列化的数据类型为 BigDecimal
+
+ /**
+ * 对传入的 BigDecimal 值进行判断和处理
+ * @param value 要序列化的 BigDecimal 值
+ * @param gen JsonGenerator对象,用于生成JSON数据
+ * @param serializerProvider 序列化提供者
+ * @throws IOException 当发生I/O异常时抛出
+ */
+ @Override
+ public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException {
+ if (value != null && !"".equals(value)) {
+ // 如果输入的值不为null且不为空字符串,则进行格式化处理,保留两位小数,并转换为字符串
+ gen.writeString(value.setScale(2, BigDecimal.ROUND_HALF_DOWN) + "");
+ } else {
+ // 否则直接将输入的值转换为字符串
+ gen.writeString(value + "");
+ }
+ }
+}
diff --git a/src/main/java/com/smart/common/config/FileConfig.java b/src/main/java/com/smart/common/config/FileConfig.java
new file mode 100644
index 0000000..ea72b36
--- /dev/null
+++ b/src/main/java/com/smart/common/config/FileConfig.java
@@ -0,0 +1,24 @@
+package com.smart.common.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * file映射项目外文件夹
+ */
+@Configuration //定义配置信息
+public class FileConfig implements WebMvcConfigurer {//继承,配置Web MVC的相关设置
+
+ // 从配置文件中读取文件路径
+ @Value("${file.path}")
+ private String filePath;
+
+ // 重写addResourceHandlers方法,用于添加资源处理器
+ @Override
+ public void addResourceHandlers(ResourceHandlerRegistry registry) {
+ // 注册一个资源处理器,将/file/**的URL请求映射到指定的文件路径下
+ registry.addResourceHandler("/file/**").addResourceLocations("file:" + filePath + "/");
+ }
+}
diff --git a/src/main/java/com/smart/common/config/IndexController.java b/src/main/java/com/smart/common/config/IndexController.java
new file mode 100644
index 0000000..c8c82cc
--- /dev/null
+++ b/src/main/java/com/smart/common/config/IndexController.java
@@ -0,0 +1,100 @@
+package com.smart.common.config;
+
+import com.smart.module.sys.service.SysConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+/**
+ * 通用访问拦截匹配
+ */
+@Controller//控制器,处理请求
+public class IndexController {
+
+ @Autowired
+ private SysConfigService sysConfigService;
+
+ /**
+ * 登录页面的请求映射方法
+ * @param map 存储数据的ModelMap对象
+ * @return 返回登录页面的视图名称
+ * 处理GET方式请求的/login.html路径,返回登录页面的视图名称
+ */
+ @GetMapping("login.html")
+ public String login(ModelMap map) {
+ Object value = sysConfigService.getByKey("login_title");
+ // 如果获取到的值为null,则使用默认值"智能停车场管理平台"
+ map.addAttribute("login_title", value == null ? "智能停车场管理平台" : value);
+
+ value = sysConfigService.getByKey("smart_name");
+ // 如果获取到的值为null,则使用默认值"智能停车场管理平台"
+ map.addAttribute("smart_name", value == null ? "智能停车场管理平台" : value);
+
+ return "login";
+ }
+
+ /**
+ * 首页的请求映射方法
+ * @param map 存储数据的ModelMap对象
+ * @return 返回首页的视图名称
+ * 处理GET方式请求的/index.html路径,返回首页的视图名称。
+ */
+ @GetMapping("index.html")
+ public String index(ModelMap map) {
+ Object value = sysConfigService.getByKey("smart_name");
+ // 如果获取到的值为null,则使用默认值"智能停车场管理平台"
+ map.addAttribute("smart_name", value == null ? "智能停车场管理平台" : value);
+
+ return "index";
+ }
+
+ /**
+ * 控制台页面的请求映射方法
+ * @return 返回控制台页面的视图名称
+ * 处理GET方式请求的/console.html路径,返回控制台页面的视图名称。
+ */
+ @GetMapping("console.html")
+ public String page() {
+ return "console";
+ }
+
+ /**
+ * 根据模块、URL路径动态生成页面的请求映射方法
+ * @param module 模块名称
+ * @param url URL路径
+ * @return 返回对应的视图名称
+ * 处理GET方式请求的/module/url.html路径,根据模块和URL动态生成页面的视图名称。
+ */
+ @GetMapping("{module}/{url}.html")
+ public String page(@PathVariable("module") String module, @PathVariable("url") String url) {
+ return module + "/" + url;
+ }
+
+ /**
+ * 根据模块、子模块、URL路径动态生成页面的请求映射方法
+ * @param module 模块名称
+ * @param url URL路径
+ * @param sub 子模块名称
+ * @return 返回对应的视图名称
+ * 处理GET方式请求的/module/sub/url.html路径,根据模块、子模块和URL动态生成页面的视图名称。
+ */
+ @GetMapping("{module}/{sub}/{url}.html")
+ public String page(@PathVariable("module") String module, @PathVariable("url") String url, @PathVariable("sub") String sub) {
+ return module + "/" + sub + "/" + url;
+ }
+
+ /**
+ * 根据模块、子模块、小子模块、URL路径动态生成页面的请求映射方法
+ * @param module 模块名称
+ * @param url URL路径
+ * @param sub 子模块名称
+ * @param smallSub 小子模块名称
+ * @return 返回对应的视图名称
+ * 处理GET方式请求的/module/sub/smallSub/url.html路径,根据模块、子模块、小子模块和URL动态生成页面的视图名称。
+ */
+ @GetMapping("{module}/{sub}/{smallSub}/{url}.html")
+ public String page(@PathVariable("module") String module, @PathVariable("url") String url, @PathVariable("sub") String sub, @PathVariable("smallSub") String smallSub) {
+ return module + "/" + sub + "/" + smallSub + "/" + url;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/smart/common/constant/ExcelDataType.java b/src/main/java/com/smart/common/constant/ExcelDataType.java
new file mode 100644
index 0000000..5038a0f
--- /dev/null
+++ b/src/main/java/com/smart/common/constant/ExcelDataType.java
@@ -0,0 +1,33 @@
+package com.smart.common.constant;
+
+/**
+ * Excel导入导出数据类型枚举
+ */
+public enum ExcelDataType {
+ // 字符串类型
+ STRING("String"),
+ // 数值类型
+ INTEGER("Integer"),
+ // Long类型
+ LONG("Long"),
+ // Double类型
+ DOUBLE("Double"),
+ // BigDecimal类型
+ BIG_DECIMAL("BigDecimal"),
+ // Float类型
+ FLOAT("Float"),
+ // Date类型
+ DATE("Date"),
+ // Timestamp
+ TIMESTAMP("Timestamp"),
+ // Macro类型
+ MACRO("Macro"),
+ // Money类型
+ MONEY("Money");
+
+ public String dataType;
+
+ ExcelDataType(String dataType) {
+ this.dataType = dataType;
+ }
+}
diff --git a/src/main/java/com/smart/common/constant/MsgConstant.java b/src/main/java/com/smart/common/constant/MsgConstant.java
new file mode 100644
index 0000000..15fc5bb
--- /dev/null
+++ b/src/main/java/com/smart/common/constant/MsgConstant.java
@@ -0,0 +1,22 @@
+package com.smart.common.constant;
+/**
+ * 系统提示静态变量
+ */
+public class MsgConstant {
+
+ /**
+ * 操作成功
+ */
+ public static final String MSG_OPERATION_SUCCESS = "操作成功!";
+
+ /**
+ * 操作失败
+ */
+ public static final String MSG_OPERATION_FAILED = "操作失败!";
+
+ /**
+ * 加载表单数据错误提示
+ */
+ public static final String MSG_INIT_FORM = "初始化表单数据失败,请重试!";
+
+}
diff --git a/src/main/java/com/smart/common/constant/SystemConstant.java b/src/main/java/com/smart/common/constant/SystemConstant.java
new file mode 100644
index 0000000..b62d0b2
--- /dev/null
+++ b/src/main/java/com/smart/common/constant/SystemConstant.java
@@ -0,0 +1,199 @@
+package com.smart.common.constant;
+
+/**
+ * 系统级静态变量
+ */
+public class SystemConstant {
+
+ /**
+ * 文件分隔符
+ */
+ public static final String SF_FILE_SEPARATOR = System.getProperty("file.separator");
+
+ /**
+ * 数据标识
+ */
+ public static final String DATA_ROWS = "rows";
+
+ /**
+ * 成功
+ */
+ public static final String SUCCESS = "success";
+ /**
+ * 失败
+ */
+ public static final String ERROR = "error";
+
+ /**
+ * 真
+ */
+ public static final String TRUE = "true";
+ /**
+ * 假
+ */
+ public static final String FALSE = "false";
+
+
+ public static final String FILE = "file";
+
+ /**
+ * 删除
+ */
+ public static final Short DELETE_STATUS_YES = 0;
+
+ public static final Short DELETE_STATUS_NO = 1;
+
+
+ /**
+ * 头像:0 默认 1 上传
+ */
+ public static final Short AVATAR_STATUS_YES = 1;
+
+ public static final Short AVATAR_STATUS_NO = 0;
+
+ /**
+ * 支付状态 1 :支付 0:未支付
+ */
+ public static final Short PAY_STATUS_NO = 0;
+
+ public static final Short PAY_STATUS_YES = 1;
+
+
+ /**
+ * 支付类型 0:微信 1:支付宝
+ */
+ public static final Short PAY_TYPE_WX = 0;
+
+ public static final Short PAY_TYPE_ALI = 1;
+
+
+ /**
+ * 管理员-角色
+ */
+ public static final String ROLE_ADMIN = "admin";
+
+ /**
+ * 机构管理员-角色
+ */
+ public static final String ROLE_ORG_ADMIN = "orgAdmin";
+
+ /**
+ * 是
+ */
+ public static final String Y = "Y";
+
+ /**
+ * 文件存放路径 HTTP
+ */
+ public static final String FILE_PATH = "/file/";
+
+ /**
+ * 类型 0:包月车 1:VIP免费车 2:临时
+ */
+ public static final Short CAR_TYPE_MONTH = 0;
+
+ public static final Short CAR_TYPE_VIP = 1;
+
+ public static final Short CAR_TYPE_TEMP = 2;
+
+ /**
+ * 菜单类型
+ */
+ public enum MenuType {
+ /**
+ * 目录
+ */
+ CATALOG(0),
+ /**
+ * 菜单
+ */
+ MENU(1),
+ /**
+ * 按钮
+ */
+ BUTTON(2);
+
+ private final int value;
+
+ MenuType(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+ }
+
+ /**
+ * 通用字典
+ */
+ public enum MacroType {
+
+ /**
+ * 类型
+ */
+ TYPE(0),
+
+ /**
+ * 参数
+ */
+ PARAM(1);
+
+ private final int value;
+
+ MacroType(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ }
+
+ /**
+ * 通用变量,表示可用、禁用、显示、隐藏、是、否
+ */
+ public enum StatusType {
+
+ /**
+ * 禁用,隐藏
+ */
+ DISABLE((short)0),
+
+ /**
+ * 可用,显示
+ */
+ ENABLE((short)1),
+
+ /**
+ * 显示
+ */
+ SHOW((short)1),
+
+ /**
+ * 隐藏
+ */
+ HIDDEN((short)0),
+
+ /**
+ * 是
+ */
+ YES((short)1),
+
+ /**
+ * 否
+ */
+ NO((short)0);
+
+ private final short value;
+
+ StatusType(short value) {
+ this.value = value;
+ }
+
+ public short getValue() {
+ return value;
+ }
+ }
+}
diff --git a/src/main/java/com/smart/common/dynamicquery/DynamicQuery.java b/src/main/java/com/smart/common/dynamicquery/DynamicQuery.java
new file mode 100644
index 0000000..e6ac860
--- /dev/null
+++ b/src/main/java/com/smart/common/dynamicquery/DynamicQuery.java
@@ -0,0 +1,137 @@
+package com.smart.common.dynamicquery;
+
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+
+import java.util.List;
+
+/**
+ * 动态查询
+ */
+public interface DynamicQuery {
+ /**
+ * 保存
+ * @param entity
+ */
+ void save(Object entity);
+
+ /**
+ * 更新
+ * @param entity
+ */
+ void update(Object entity);
+
+ /**
+ * 执行原生nativeSql的update,delete操作
+ * 传入SQL语句和参数进行占位符替换
+ * @param nativeSql
+ * @param params
+ * @return
+ */
+ int nativeExecuteUpdate(String nativeSql, Object... params);
+
+ /**
+ * 执行nativeSql统计查询
+ * @param nativeSql
+ * @param params 占位符参数(例如?1)绑定的参数值
+ * @return 查询结果的条数
+ */
+ Long nativeQueryCount(String nativeSql, Object... params);
+
+ /**
+ * 执行nativeSql查询一行
+ * @param resultClass 指定查询结果的类型
+ * @param nativeSql
+ * @param params 占位符参数(例如?1)绑定的参数值
+ * @return
+ */
+ T nativeQuerySingleResult(Class resultClass, String nativeSql, Object... params);
+
+ /**
+ * 执行nativeSql查询 List