Browse Source

Initial commit

tea 7 months ago
commit
01c21cf12c
100 changed files with 7810 additions and 0 deletions
  1. 50 0
      .gitignore
  2. 54 0
      like-admin/pom.xml
  3. 27 0
      like-admin/src/main/java/com/mdd/admin/LikeAdminApplication.java
  4. 153 0
      like-admin/src/main/java/com/mdd/admin/LikeAdminInterceptor.java
  5. 69 0
      like-admin/src/main/java/com/mdd/admin/LikeAdminThreadLocal.java
  6. 67 0
      like-admin/src/main/java/com/mdd/admin/config/AdminConfig.java
  7. 23 0
      like-admin/src/main/java/com/mdd/admin/config/MybatisPlusConfig.java
  8. 57 0
      like-admin/src/main/java/com/mdd/admin/config/WebMvcConfig.java
  9. 16 0
      like-admin/src/main/java/com/mdd/admin/config/aop/Log.java
  10. 137 0
      like-admin/src/main/java/com/mdd/admin/config/aop/LogAspect.java
  11. 54 0
      like-admin/src/main/java/com/mdd/admin/config/quartz/CronUtils.java
  12. 150 0
      like-admin/src/main/java/com/mdd/admin/config/quartz/InvokeUtils.java
  13. 104 0
      like-admin/src/main/java/com/mdd/admin/config/quartz/QuartzUtils.java
  14. 20 0
      like-admin/src/main/java/com/mdd/admin/config/quartz/TaskConstants.java
  15. 81 0
      like-admin/src/main/java/com/mdd/admin/config/quartz/exceution/AbstractQuartzJob.java
  16. 31 0
      like-admin/src/main/java/com/mdd/admin/config/quartz/exceution/QuartzDisExecution.java
  17. 17 0
      like-admin/src/main/java/com/mdd/admin/config/quartz/exceution/QuartzJobExecution.java
  18. 34 0
      like-admin/src/main/java/com/mdd/admin/config/swagger/SwaggerConfig.java
  19. 31 0
      like-admin/src/main/java/com/mdd/admin/config/swagger/WebSwaggerMvcConfigurer.java
  20. 156 0
      like-admin/src/main/java/com/mdd/admin/config/wxpay/WxPayConfiguration.java
  21. 31 0
      like-admin/src/main/java/com/mdd/admin/config/wxpay/WxPayProperties.java
  22. 164 0
      like-admin/src/main/java/com/mdd/admin/controller/WxPayController.java
  23. 41 0
      like-admin/src/main/java/com/mdd/admin/controller/account/AccountLogController.java
  24. 117 0
      like-admin/src/main/java/com/mdd/admin/controller/article/ArticleController.java
  25. 128 0
      like-admin/src/main/java/com/mdd/admin/controller/article/CategoryController.java
  26. 40 0
      like-admin/src/main/java/com/mdd/admin/controller/channel/ChannelOaCallBackController.java
  27. 47 0
      like-admin/src/main/java/com/mdd/admin/controller/channel/H5Controller.java
  28. 48 0
      like-admin/src/main/java/com/mdd/admin/controller/channel/MpController.java
  29. 48 0
      like-admin/src/main/java/com/mdd/admin/controller/channel/OaController.java
  30. 59 0
      like-admin/src/main/java/com/mdd/admin/controller/channel/OaMenuController.java
  31. 102 0
      like-admin/src/main/java/com/mdd/admin/controller/channel/OaReplyController.java
  32. 48 0
      like-admin/src/main/java/com/mdd/admin/controller/channel/WxController.java
  33. 149 0
      like-admin/src/main/java/com/mdd/admin/controller/common/AlbumController.java
  34. 58 0
      like-admin/src/main/java/com/mdd/admin/controller/common/IndexController.java
  35. 119 0
      like-admin/src/main/java/com/mdd/admin/controller/common/UploadController.java
  36. 77 0
      like-admin/src/main/java/com/mdd/admin/controller/coupon/CouponController.java
  37. 30 0
      like-admin/src/main/java/com/mdd/admin/controller/coupon/CouponReceiveLogController.java
  38. 103 0
      like-admin/src/main/java/com/mdd/admin/controller/crontab/CrontabController.java
  39. 37 0
      like-admin/src/main/java/com/mdd/admin/controller/decorate/DataController.java
  40. 51 0
      like-admin/src/main/java/com/mdd/admin/controller/decorate/PagesController.java
  41. 45 0
      like-admin/src/main/java/com/mdd/admin/controller/decorate/TabbarController.java
  42. 116 0
      like-admin/src/main/java/com/mdd/admin/controller/goods/GoodsCategoryController.java
  43. 104 0
      like-admin/src/main/java/com/mdd/admin/controller/goods/GoodsCommentController.java
  44. 130 0
      like-admin/src/main/java/com/mdd/admin/controller/goods/GoodsController.java
  45. 94 0
      like-admin/src/main/java/com/mdd/admin/controller/goods/GoodsUnitController.java
  46. 76 0
      like-admin/src/main/java/com/mdd/admin/controller/image/GoodsImageController.java
  47. 92 0
      like-admin/src/main/java/com/mdd/admin/controller/jobs/JobsController.java
  48. 39 0
      like-admin/src/main/java/com/mdd/admin/controller/log/OrderRefundLogController.java
  49. 92 0
      like-admin/src/main/java/com/mdd/admin/controller/log/SmsLogController.java
  50. 61 0
      like-admin/src/main/java/com/mdd/admin/controller/monitor/CacheController.java
  51. 30 0
      like-admin/src/main/java/com/mdd/admin/controller/monitor/ServerController.java
  52. 164 0
      like-admin/src/main/java/com/mdd/admin/controller/order/OrderController.java
  53. 97 0
      like-admin/src/main/java/com/mdd/admin/controller/order/OrderGoodsController.java
  54. 92 0
      like-admin/src/main/java/com/mdd/admin/controller/order/OrderLogController.java
  55. 136 0
      like-admin/src/main/java/com/mdd/admin/controller/order/OrderTimeController.java
  56. 65 0
      like-admin/src/main/java/com/mdd/admin/controller/pay/DevPayController.java
  57. 51 0
      like-admin/src/main/java/com/mdd/admin/controller/pay/DevPayWayController.java
  58. 29 0
      like-admin/src/main/java/com/mdd/admin/controller/recharge/RechargeController.java
  59. 33 0
      like-admin/src/main/java/com/mdd/admin/controller/refund/FinanceController.java
  60. 95 0
      like-admin/src/main/java/com/mdd/admin/controller/refund/OrderRefundController.java
  61. 113 0
      like-admin/src/main/java/com/mdd/admin/controller/region/DevRegionController.java
  62. 92 0
      like-admin/src/main/java/com/mdd/admin/controller/reply/OfficialAccountReplyController.java
  63. 92 0
      like-admin/src/main/java/com/mdd/admin/controller/session/AdminSessionController.java
  64. 92 0
      like-admin/src/main/java/com/mdd/admin/controller/session/UserSessionController.java
  65. 45 0
      like-admin/src/main/java/com/mdd/admin/controller/setting/CopyrightController.java
  66. 92 0
      like-admin/src/main/java/com/mdd/admin/controller/setting/DevNoticeSettingController.java
  67. 110 0
      like-admin/src/main/java/com/mdd/admin/controller/setting/DictDataController.java
  68. 106 0
      like-admin/src/main/java/com/mdd/admin/controller/setting/DictTypeController.java
  69. 42 0
      like-admin/src/main/java/com/mdd/admin/controller/setting/LoginController.java
  70. 64 0
      like-admin/src/main/java/com/mdd/admin/controller/setting/NoticeController.java
  71. 44 0
      like-admin/src/main/java/com/mdd/admin/controller/setting/ProtocolController.java
  72. 31 0
      like-admin/src/main/java/com/mdd/admin/controller/setting/RechargeConfigController.java
  73. 47 0
      like-admin/src/main/java/com/mdd/admin/controller/setting/SearchController.java
  74. 61 0
      like-admin/src/main/java/com/mdd/admin/controller/setting/SmsController.java
  75. 76 0
      like-admin/src/main/java/com/mdd/admin/controller/setting/StorageController.java
  76. 55 0
      like-admin/src/main/java/com/mdd/admin/controller/setting/TransactionController.java
  77. 45 0
      like-admin/src/main/java/com/mdd/admin/controller/setting/UserController.java
  78. 79 0
      like-admin/src/main/java/com/mdd/admin/controller/setting/WebsiteController.java
  79. 102 0
      like-admin/src/main/java/com/mdd/admin/controller/staff/StaffController.java
  80. 136 0
      like-admin/src/main/java/com/mdd/admin/controller/system/AuthAdminController.java
  81. 102 0
      like-admin/src/main/java/com/mdd/admin/controller/system/AuthDeptController.java
  82. 102 0
      like-admin/src/main/java/com/mdd/admin/controller/system/AuthMenuController.java
  83. 97 0
      like-admin/src/main/java/com/mdd/admin/controller/system/AuthPostController.java
  84. 109 0
      like-admin/src/main/java/com/mdd/admin/controller/system/AuthRoleController.java
  85. 64 0
      like-admin/src/main/java/com/mdd/admin/controller/system/LoginController.java
  86. 54 0
      like-admin/src/main/java/com/mdd/admin/controller/system/LogsController.java
  87. 81 0
      like-admin/src/main/java/com/mdd/admin/controller/user/UserController.java
  88. 23 0
      like-admin/src/main/java/com/mdd/admin/service/account/IAccountLogService.java
  89. 73 0
      like-admin/src/main/java/com/mdd/admin/service/account/impl/AccountLogServiceImpl.java
  90. 66 0
      like-admin/src/main/java/com/mdd/admin/service/article/IArticleArchivesService.java
  91. 74 0
      like-admin/src/main/java/com/mdd/admin/service/article/IArticleCategoryService.java
  92. 210 0
      like-admin/src/main/java/com/mdd/admin/service/article/impl/ArticleArchivesServiceImpl.java
  93. 229 0
      like-admin/src/main/java/com/mdd/admin/service/article/impl/ArticleCategoryServiceImpl.java
  94. 58 0
      like-admin/src/main/java/com/mdd/admin/service/category/IGoodsCategoryService.java
  95. 300 0
      like-admin/src/main/java/com/mdd/admin/service/category/impl/GoodsCategoryServiceImpl.java
  96. 25 0
      like-admin/src/main/java/com/mdd/admin/service/channel/IChannelH5Service.java
  97. 27 0
      like-admin/src/main/java/com/mdd/admin/service/channel/IChannelMpService.java
  98. 29 0
      like-admin/src/main/java/com/mdd/admin/service/channel/IChannelOaCallBackService.java
  99. 30 0
      like-admin/src/main/java/com/mdd/admin/service/channel/IChannelOaMenuService.java
  100. 64 0
      like-admin/src/main/java/com/mdd/admin/service/channel/IChannelOaReplyService.java

+ 50 - 0
.gitignore

@@ -0,0 +1,50 @@
+# Compiled class file
+*.class
+
+# Eclipse
+.project
+.classpath
+.settings/
+
+# Intellij
+*.ipr
+*.iml
+*.iws
+.idea/
+
+# Maven
+target/
+
+# Gradle
+build
+.gradle
+
+# Log file
+*.log
+
+# out
+**/out/
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar
+*.tar.gz
+*.rar
+*.pid
+*.orig
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+# Mac
+.DS_Store

+ 54 - 0
like-admin/pom.xml

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <!-- 父工程 -->
+    <parent>
+        <artifactId>likeadmin-java</artifactId>
+        <groupId>org.mdd</groupId>
+        <version>1.0.0</version>
+    </parent>
+
+    <!-- 模块信息 -->
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>like-admin</artifactId>
+    <packaging>jar</packaging>
+
+    <!-- 项目管理 -->
+    <dependencies>
+        <!-- 公共依赖 -->
+        <dependency>
+            <groupId>org.mdd</groupId>
+            <artifactId>like-common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.mdd</groupId>
+            <artifactId>like-generator</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <!-- Quartz-Scheduler -->
+        <dependency>
+            <groupId>org.quartz-scheduler</groupId>
+            <artifactId>quartz</artifactId>
+        </dependency>
+    </dependencies>
+
+    <!-- 插件管理 -->
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 27 - 0
like-admin/src/main/java/com/mdd/admin/LikeAdminApplication.java

@@ -0,0 +1,27 @@
+package com.mdd.admin;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+/**
+ * 启动器
+ */
+@Configuration
+@ComponentScan(basePackages = {"com.mdd"})
+@MapperScan(basePackages = {"com.mdd.*.mapper"})
+@EnableTransactionManagement
+@EnableScheduling
+@SpringBootApplication(exclude = {RedisRepositoriesAutoConfiguration.class})
+public class LikeAdminApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(LikeAdminApplication.class, args);
+    }
+
+}

+ 153 - 0
like-admin/src/main/java/com/mdd/admin/LikeAdminInterceptor.java

@@ -0,0 +1,153 @@
+package com.mdd.admin;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.mdd.admin.config.AdminConfig;
+import com.mdd.admin.service.system.ISystemAuthAdminService;
+import com.mdd.admin.service.system.ISystemAuthPermService;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.enums.HttpEnum;
+import com.mdd.common.utils.RedisUtil;
+import com.mdd.common.utils.ToolsUtil;
+import com.mdd.common.utils.YmlUtil;
+import org.springframework.stereotype.Component;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 拦截器
+ */
+@Component
+public class LikeAdminInterceptor implements HandlerInterceptor {
+
+    @Resource
+    ISystemAuthAdminService iSystemAuthAdminService;
+
+    @Resource
+    ISystemAuthPermService iSystemAuthPermService;
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        // 404拦截
+        response.setContentType("application/json;charset=utf-8");
+        if (response.getStatus() == 404) {
+            AjaxResult result = AjaxResult.failed(HttpEnum.REQUEST_404_ERROR.getCode(), HttpEnum.REQUEST_404_ERROR.getMsg());
+            response.getWriter().print(JSON.toJSONString(result));
+            return false;
+        }
+
+        // 判断请求接口
+        if (!(handler instanceof HandlerMethod)) {
+            return HandlerInterceptor.super.preHandle(request, response, handler);
+        }
+
+        // 路由转权限
+        String prefix = "/api/";
+        String route = request.getRequestURI().replaceFirst(prefix, "");
+        String auths = route.replace("/", ":");
+
+        // 免登录接口
+        List<String> notLoginUri = Arrays.asList(AdminConfig.notLoginUri);
+        if (notLoginUri.contains(auths)) {
+            return HandlerInterceptor.super.preHandle(request, response, handler);
+        }
+
+        // 演示环境拦截
+        String env = YmlUtil.get("like.production");
+        if (org.apache.commons.lang3.StringUtils.isNotEmpty(env) && env.equals("true")) {
+            List<String> ignoreUrl = Arrays.asList("system:login", "system:logout");
+            if (!auths.contains("list") && request.getMethod().equals("POST") && !ignoreUrl.contains(auths)) {
+                String message = "演示环境不支持修改数据,请下载源码本地部署体验";
+                AjaxResult result = AjaxResult.failed(HttpEnum.NO_PERMISSION.getCode(), message);
+                response.getWriter().print(com.alibaba.fastjson2.JSON.toJSONString(result));
+                return false;
+            }
+        }
+
+        // Token是否为空
+        String token = request.getHeader("token");
+        if (StringUtils.isBlank(token)) {
+            AjaxResult result = AjaxResult.failed(HttpEnum.TOKEN_EMPTY.getCode(), HttpEnum.TOKEN_EMPTY.getMsg());
+            response.getWriter().print(JSON.toJSONString(result));
+            return false;
+        }
+
+        // Token是否过期
+        token = AdminConfig.backstageTokenKey + token;
+        if (!RedisUtil.exists(token)) {
+            AjaxResult result = AjaxResult.failed(HttpEnum.TOKEN_INVALID.getCode(), HttpEnum.TOKEN_INVALID.getMsg());
+            response.getWriter().print(JSON.toJSONString(result));
+            return false;
+        }
+
+        // 用户信息缓存
+        String uid = RedisUtil.get(token).toString();
+        if (!RedisUtil.hExists(AdminConfig.backstageManageKey, uid)) {
+            iSystemAuthAdminService.cacheAdminUserByUid(Integer.parseInt(uid));
+        }
+
+        // 校验用户被删除
+        Map<String, String> map = ToolsUtil.jsonToMap(RedisUtil.hGet(AdminConfig.backstageManageKey, uid).toString());
+        if (map == null || map.get("isDelete").equals("1")) {
+            RedisUtil.del(token);
+            RedisUtil.hDel(AdminConfig.backstageManageKey, uid);
+            AjaxResult result = AjaxResult.failed(HttpEnum.TOKEN_INVALID.getCode(), HttpEnum.TOKEN_INVALID.getMsg());
+            response.getWriter().print(JSON.toJSONString(result));
+            return false;
+        }
+
+        // 校验用户被禁用
+        if (map.get("isDisable").equals("1")) {
+            AjaxResult result = AjaxResult.failed(HttpEnum.LOGIN_DISABLE_ERROR.getCode(), HttpEnum.LOGIN_DISABLE_ERROR.getMsg());
+            response.getWriter().print(JSON.toJSONString(result));
+            return false;
+        }
+
+        // 令牌剩余30分钟自动续签
+        if (RedisUtil.ttl(token) < 1800) {
+            RedisUtil.expire(token, 7200L);
+        }
+
+        // 写入本地线程
+        LikeAdminThreadLocal.put("adminId", uid);
+        LikeAdminThreadLocal.put("roleId", map.get("role"));
+        LikeAdminThreadLocal.put("username", map.get("username"));
+        LikeAdminThreadLocal.put("nickname", map.get("nickname"));
+
+        // 免权限验证接口
+        List<String> notAuthUri = Arrays.asList(AdminConfig.notAuthUri);
+        if (notAuthUri.contains(auths) || Integer.parseInt(uid) == 1) {
+            return HandlerInterceptor.super.preHandle(request, response, handler);
+        }
+
+        // 校验角色权限是否存在
+        String roleId = map.get("role");
+        if (!RedisUtil.hExists(AdminConfig.backstageRolesKey, roleId)) {
+            iSystemAuthPermService.cacheRoleMenusByRoleId(Integer.parseInt(roleId));
+        }
+
+        // 验证是否有权限操作
+        String menus = RedisUtil.hGet(AdminConfig.backstageRolesKey, roleId).toString();
+        if (menus.equals("") || !Arrays.asList(menus.split(",")).contains(auths)) {
+            AjaxResult result = AjaxResult.failed(HttpEnum.NO_PERMISSION.getCode(), HttpEnum.NO_PERMISSION.getMsg());
+            response.getWriter().print(JSON.toJSONString(result));
+            return false;
+        }
+
+        // 验证通过继续操作
+        return HandlerInterceptor.super.preHandle(request, response, handler);
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+        LikeAdminThreadLocal.remove();
+        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
+    }
+}

+ 69 - 0
like-admin/src/main/java/com/mdd/admin/LikeAdminThreadLocal.java

@@ -0,0 +1,69 @@
+package com.mdd.admin;
+
+import java.util.LinkedHashMap;
+
+/**
+ * 本地线程
+ */
+public class LikeAdminThreadLocal {
+
+    /**
+     * 构造方法
+     */
+    public LikeAdminThreadLocal() {}
+
+    /**
+     * 取得本地线程对象
+     */
+    private static final java.lang.ThreadLocal<LinkedHashMap<String, Object>> MY_LOCAL = new java.lang.ThreadLocal<>();
+
+    /**
+     * 写入本地线程
+     */
+    public static void put(String key, Object val) {
+        LinkedHashMap<String, Object> map = MY_LOCAL.get();
+        if (map == null) {
+            map = new LinkedHashMap<>();
+        }
+
+        map.put(key, val);
+        MY_LOCAL.set(map);
+    }
+
+    /**
+     * 获取本地线程
+     */
+    public static Object get(String key) {
+        return MY_LOCAL.get().getOrDefault(key, "");
+    }
+
+    /**
+     * 获取管理员ID
+     */
+    public static Integer getAdminId() {
+        String adminId = LikeAdminThreadLocal.get("adminId").toString();
+        if (adminId.equals("")) {
+            return 0;
+        }
+        return Integer.parseInt(adminId);
+    }
+
+    /**
+     * 获取角色ID
+     */
+    public static Integer getRoleId() {
+        String roleId = LikeAdminThreadLocal.get("roleId").toString();
+        if (roleId.equals("")) {
+            return 0;
+        }
+        return Integer.parseInt(roleId);
+    }
+
+    /**
+     * 删除本地线程
+     */
+    public static void remove() {
+        MY_LOCAL.remove();
+    }
+
+}

+ 67 - 0
like-admin/src/main/java/com/mdd/admin/config/AdminConfig.java

@@ -0,0 +1,67 @@
+package com.mdd.admin.config;
+
+/**
+ * 后台公共配置
+ */
+public class AdminConfig {
+
+    // 管理缓存键
+    public static final String backstageManageKey = "backstage:manage";
+
+    // 角色缓存键
+    public static final String backstageRolesKey = "backstage:roles";
+
+    // 令牌缓存键
+    public static final String backstageTokenKey = "backstage:token:";
+
+    // 令牌的集合
+    public static final String backstageTokenSet = "backstage:token:set:";
+
+    // 免登录验证
+    public static String[] notLoginUri = new String[]{
+            "system:login",         // 登录接口
+            "common:index:config",   // 配置接口
+            "channel:oa:callback" //微信绑定
+    };
+
+    // 免权限验证
+    public static String[] notAuthUri = new String[]{
+            "system:logout",         // 退出登录
+            "system:menu:menus",     // 系统菜单
+            "system:menu:route",     // 菜单路由
+            "system:admin:upInfo",   // 管理员更新
+            "system:admin:self",     // 管理员信息
+            "system:role:all",       // 所有角色
+            "system:post:all",       // 所有岗位
+            "system:dept:list",      // 所有部门
+            "setting:dict:type:all", // 所有字典类型
+            "setting:dict:data:all", // 所有字典数据
+            "article:cate:all",      // 所有文章分类
+            "category:commonList",
+            "goods:statistics",
+            "category:list",
+            "unit:list",
+            "common:album:cateList",
+            "common:album:albumList",
+            "order:statistics",
+            "order:list",
+            "time:getTime",
+            "time:list",
+            "user:list",
+            "staff:list",
+            "goods:list",
+            "finance:statistics",
+            "refund:list",
+            "refund:statistics:amount",
+            "refund:statistics:count",
+            "channel:oaMenu:detail",
+            "setting:website:getMapKey",
+            "way:list",
+            "pay:list",
+            "setting:transaction",
+            "setting:storage:detail",
+            "crontab:list",
+            "channel:oa:callback",
+            "recharge:config:getConfig"
+    };
+}

+ 23 - 0
like-admin/src/main/java/com/mdd/admin/config/MybatisPlusConfig.java

@@ -0,0 +1,23 @@
+package com.mdd.admin.config;
+
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * MybatisPlus配置
+ */
+@Configuration
+public class MybatisPlusConfig {
+
+    /**
+     * 分页插件集成
+     */
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
+        return interceptor;
+    }
+}

+ 57 - 0
like-admin/src/main/java/com/mdd/admin/config/WebMvcConfig.java

@@ -0,0 +1,57 @@
+package com.mdd.admin.config;
+
+import com.mdd.admin.LikeAdminInterceptor;
+import com.mdd.common.config.GlobalConfig;
+import com.mdd.common.utils.YmlUtil;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import javax.annotation.Resource;
+
+/**
+ * Web配置
+ */
+@Configuration
+public class WebMvcConfig implements WebMvcConfigurer {
+
+    @Resource
+    LikeAdminInterceptor likeAdminInterceptor;
+
+    /**
+     * 配置允许跨域
+     */
+    @Override
+    public void addCorsMappings(CorsRegistry registry) {
+        registry.addMapping("/**")
+                .allowedOrigins("*")
+                .allowedHeaders("*")
+                .allowedMethods("GET", "POST", "DELETE", "PUT")
+                .maxAge(3600);
+    }
+
+    /**
+     * 登录拦截器
+     */
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(likeAdminInterceptor).addPathPatterns("/**");
+    }
+
+    /**
+     * 资源目录映射
+     */
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        String directory = YmlUtil.get("like.upload-directory");
+        if (directory == null || directory.equals("")) {
+            directory = GlobalConfig.uploadDirectory;
+        }
+
+        registry.addResourceHandler("/"+ GlobalConfig.publicPrefix +"/**")
+                .addResourceLocations("file:" + directory);
+    }
+
+}

+ 16 - 0
like-admin/src/main/java/com/mdd/admin/config/aop/Log.java

@@ -0,0 +1,16 @@
+package com.mdd.admin.config.aop;
+
+import java.lang.annotation.*;
+
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface Log {
+
+    /**
+     * 模块
+     * @return String
+     */
+    String title() default "";
+
+}

+ 137 - 0
like-admin/src/main/java/com/mdd/admin/config/aop/LogAspect.java

@@ -0,0 +1,137 @@
+package com.mdd.admin.config.aop;
+
+import com.alibaba.fastjson.JSON;
+import com.mdd.admin.LikeAdminThreadLocal;
+import com.mdd.common.entity.system.SystemLogOperate;
+import com.mdd.common.mapper.system.SystemLogOperateMapper;
+import com.mdd.common.utils.IpUtil;
+import com.mdd.common.utils.RequestUtil;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.AfterThrowing;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Method;
+
+@Aspect
+@Component
+public class LogAspect {
+
+    @Resource
+    SystemLogOperateMapper systemLogOperateMapper;
+
+    private static final Logger log = LoggerFactory.getLogger(LogAspect.class);
+    private Long beginTime = 0L;
+
+    /**
+     * 声明切面点拦截那些类
+     */
+    @Pointcut("@annotation(com.mdd.admin.config.aop.Log)")
+    private void pointCutMethodController() {}
+
+    /**
+     * 环绕通知前后增强
+     */
+    @Around(value = "pointCutMethodController()")
+    public Object doAroundService(ProceedingJoinPoint joinPoint) throws Throwable {
+        // 开始时间
+        this.beginTime = System.currentTimeMillis();
+        // 执行方法
+        Object result = joinPoint.proceed();
+        // 保存日志
+        recordLog(joinPoint, null);
+        // 返回结果
+        return result;
+    }
+
+    /**
+     * 拦截异常操作
+     *
+     * @param joinPoint 切点
+     * @param e 异常
+     */
+    @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e")
+    public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e) {
+        recordLog(joinPoint, e);
+    }
+
+    /**
+     * 记录日志信息
+     *
+     * @param joinPointObj joinPoint
+     * @param e Exception 错误异常
+     */
+    private void recordLog(Object joinPointObj, final Exception e) {
+        try {
+            long endTime = System.currentTimeMillis();
+            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+            if (requestAttributes != null) {
+                // 取得请求对象
+                HttpServletRequest request = requestAttributes.getRequest();
+
+                // 获取当前的用户
+                Integer adminId = LikeAdminThreadLocal.getAdminId();
+
+                // 获取日志注解
+                ProceedingJoinPoint joinPoint = (ProceedingJoinPoint) joinPointObj;
+                MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+                Method method = signature.getMethod();
+                Log logAnnotation = method.getAnnotation(Log.class);
+
+                // 方法名称
+                String className = joinPoint.getTarget().getClass().getName();
+                String methodName = joinPoint.getSignature().getName();
+
+                // 获取请求参数
+                String queryString = request.getQueryString();
+                Object[] args = joinPoint.getArgs();
+                String params = "";
+                if(args.length>0){
+                    if("POST".equals(request.getMethod())){
+                        params = JSON.toJSONString(args);
+                    } else if("GET".equals(request.getMethod())){
+                        params = queryString;
+                    }
+                }
+
+                // 错误信息
+                String error = "";
+                int status = 1;
+                if (e != null) {
+                    error = e.getMessage();
+                    status = 2; // 1=成功, 2=失败
+                }
+
+                // 数据库日志
+                SystemLogOperate model = new SystemLogOperate();
+                model.setAdminId(adminId);
+                model.setTitle(logAnnotation.title());
+                model.setIp(IpUtil.getIpAddress());
+                model.setType(request.getMethod());
+                model.setMethod(className + "." + methodName + "()");
+                model.setUrl(RequestUtil.route());
+                model.setArgs(params);
+                model.setError(error);
+                model.setStatus(status);
+                model.setStartTime(this.beginTime / 1000);
+                model.setEndTime(endTime / 1000);
+                model.setTaskTime(endTime - this.beginTime);
+                model.setCreateTime(System.currentTimeMillis() / 1000);
+                systemLogOperateMapper.insert(model);
+            }
+        } catch (Exception ex) {
+            log.error("异常信息:{}", ex.getMessage());
+        }
+    }
+
+}

+ 54 - 0
like-admin/src/main/java/com/mdd/admin/config/quartz/CronUtils.java

@@ -0,0 +1,54 @@
+package com.mdd.admin.config.quartz;
+
+import org.quartz.CronExpression;
+
+import java.text.ParseException;
+import java.util.Date;
+
+/**
+ * 表达式工具
+ */
+public class CronUtils {
+
+    /**
+     * 验证表达式是否有效
+     *
+     * @param cronExpression 表达式
+     * @return true=有效,false=无效
+     */
+    public static boolean isValid(String cronExpression) {
+        return CronExpression.isValidExpression(cronExpression);
+    }
+
+    /**
+     * 验证表达式消息无效给出有效性
+     *
+     * @param cronExpression 表达式
+     * @return null=有效, 其它=无效时的错误描述
+     */
+    public static String invalidMessage(String cronExpression) {
+        try {
+            new CronExpression(cronExpression);
+            return null;
+        } catch (ParseException pe) {
+            return pe.getMessage();
+        }
+    }
+
+    /**
+     * 下一个执行时间点
+     *
+     * @param cronExpression n表达式
+     * @return Date下次表达式执行时间
+     */
+    public static Date nextExecution(String cronExpression)
+    {
+        try {
+            CronExpression cron = new CronExpression(cronExpression);
+            return cron.getNextValidTimeAfter(new Date(System.currentTimeMillis()));
+        } catch (ParseException e) {
+            throw new IllegalArgumentException(e.getMessage());
+        }
+    }
+
+}

+ 150 - 0
like-admin/src/main/java/com/mdd/admin/config/quartz/InvokeUtils.java

@@ -0,0 +1,150 @@
+package com.mdd.admin.config.quartz;
+import com.mdd.common.entity.crontab.Crontab;
+import com.mdd.common.utils.SpringUtil;
+import com.mdd.common.utils.StringUtil;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * 执行工具
+ */
+public class InvokeUtils {
+
+    /**
+     * 执行方法
+     *
+     * @param crontab 系统任务
+     */
+    public static void invokeMethod(Crontab crontab) throws Exception {
+        String invokeTarget = crontab.getCommand();
+        String beanName = getBeanName(invokeTarget);
+        String methodName = getMethodName(invokeTarget);
+        List<Object[]> methodParams = getMethodParams(invokeTarget);
+
+        if (!isValidClassName(beanName)) {
+            Object bean = SpringUtil.getBean(beanName);
+            invokeMethod(bean, methodName, methodParams);
+        } else {
+            Object bean = Class.forName(beanName).newInstance();
+            invokeMethod(bean, methodName, methodParams);
+        }
+    }
+
+    /**
+     * 调用任务方法
+     *
+     * @param bean 目标对象
+     * @param methodName 方法名称
+     * @param methodParams 方法参数
+     */
+    private static void invokeMethod(Object bean, String methodName, List<Object[]> methodParams)
+            throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException,
+            InvocationTargetException {
+        if (StringUtil.isNotNull(methodParams) && methodParams.size() > 0) {
+            Method method = bean.getClass().getMethod(methodName, getMethodParamsType(methodParams));
+            method.invoke(bean, getMethodParamsValue(methodParams));
+        } else {
+            Method method = bean.getClass().getMethod(methodName);
+            method.invoke(bean);
+        }
+    }
+
+
+    /**
+     * 校验是否为为class包名
+     *
+     * @param invokeTarget 名称
+     * @return true是 false否
+     */
+    public static boolean isValidClassName(String invokeTarget) {
+        return StringUtil.countMatches(invokeTarget, ".") > 1;
+    }
+
+    /**
+     * 获取bean名称
+     *
+     * @param invokeTarget 目标字符串
+     * @return bean名称
+     */
+    public static String getBeanName(String invokeTarget) {
+        String beanName = StringUtil.substringBefore(invokeTarget, "(");
+        return StringUtil.substringBeforeLast(beanName, ".");
+    }
+
+    /**
+     * 获取bean方法
+     *
+     * @param invokeTarget 目标字符串
+     * @return method方法
+     */
+    public static String getMethodName(String invokeTarget) {
+        String methodName = StringUtil.substringBefore(invokeTarget, "(");
+        return StringUtil.substringAfterLast(methodName, ".");
+    }
+
+    /**
+     * 获取method方法参数相关列表
+     *
+     * @param invokeTarget 目标字符串
+     * @return method方法相关参数列表
+     */
+    public static List<Object[]> getMethodParams(String invokeTarget) {
+        String methodStr = StringUtil.substringBetween(invokeTarget, "(", ")");
+        if (StringUtil.isEmpty(methodStr)) {
+            return null;
+        }
+        String[] methodParams = methodStr.split(",(?=([^\"']*[\"'][^\"']*[\"'])*[^\"']*$)");
+        List<Object[]> clazz = new LinkedList<>();
+        for (String methodParam : methodParams) {
+            String str = StringUtil.trimToEmpty(methodParam);
+            if (StringUtil.startsWithAny(str, "'", "\"")) {
+                clazz.add(new Object[]{StringUtil.substring(str, 1, str.length() - 1), String.class});
+            } else if ("true".equalsIgnoreCase(str) || "false".equalsIgnoreCase(str)) {
+                clazz.add(new Object[]{Boolean.valueOf(str), Boolean.class});
+            } else if (StringUtil.endsWith(str, "L")) {
+                clazz.add(new Object[]{Long.valueOf(StringUtil.substring(str, 0, str.length() - 1)), Long.class});
+            } else if (StringUtil.endsWith(str, "D")) {
+                clazz.add(new Object[]{Double.valueOf(StringUtil.substring(str, 0, str.length() - 1)), Double.class});
+            } else {
+                clazz.add(new Object[]{Integer.valueOf(str), Integer.class});
+            }
+        }
+        return clazz;
+    }
+
+    /**
+     * 获取参数类型
+     *
+     * @param methodParams 参数相关列表
+     * @return 参数类型列表
+     */
+    public static Class<?>[] getMethodParamsType(List<Object[]> methodParams) {
+        Class<?>[] clazz = new Class<?>[methodParams.size()];
+        int index = 0;
+        for (Object[] os : methodParams)
+        {
+            clazz[index] = (Class<?>) os[1];
+            index++;
+        }
+        return clazz;
+    }
+
+    /**
+     * 获取参数值
+     *
+     * @param methodParams 参数相关列表
+     * @return 参数值列表
+     */
+    public static Object[] getMethodParamsValue(List<Object[]> methodParams) {
+        Object[] clazz = new Object[methodParams.size()];
+        int index = 0;
+        for (Object[] os : methodParams) {
+            clazz[index] = os[0];
+            index++;
+        }
+        return clazz;
+    }
+
+}

+ 104 - 0
like-admin/src/main/java/com/mdd/admin/config/quartz/QuartzUtils.java

@@ -0,0 +1,104 @@
+package com.mdd.admin.config.quartz;
+
+import com.mdd.admin.config.quartz.exceution.QuartzDisExecution;
+import com.mdd.admin.config.quartz.exceution.QuartzJobExecution;
+import com.mdd.common.entity.crontab.Crontab;
+import com.mdd.common.utils.StringUtil;
+import org.quartz.*;
+
+/**
+ * 计划任务工具
+ */
+public class QuartzUtils {
+
+    /**
+     * 得到quartz任务类
+     *
+     * @param crontab 执行计划
+     * @return 具体执行任务类
+     */
+    private static Class<? extends Job> getQuartzJobClass(Crontab crontab) {
+        boolean isConcurrent = crontab.getConcurrent().equals(0);
+        return isConcurrent ? QuartzJobExecution.class : QuartzDisExecution.class;
+    }
+
+    /**
+     * 构建任务对象Key
+     *
+     * @param jobId (任务ID)
+     * @param jobGroup (任务分组)
+     * @return JobKey
+     */
+    public static JobKey getJobKey(Integer jobId, String jobGroup) {
+        return JobKey.jobKey(TaskConstants.TASK_CLASS_NAME + jobId, jobGroup);
+    }
+
+    /**
+     * 构建触发对象Key
+     *
+     * @param jobId (任务ID)
+     * @param jobGroup (任务分组)
+     * @return TriggerKey
+     */
+    public static TriggerKey getTriggerKey(Integer jobId, String jobGroup) {
+        return TriggerKey.triggerKey(TaskConstants.TASK_PROPERTIES + jobId, jobGroup);
+    }
+
+    /**
+     * 创建定时任务
+     *
+     * @param scheduler 调度器
+     * @param job 任务
+     * @throws SchedulerException 调度异常
+     */
+    public static void createScheduleJob(Scheduler scheduler, Crontab job) throws SchedulerException {
+        Integer jobId     = job.getId();
+        String jobGroup   = job.getTypes();
+        String expression = job.getRules();
+
+        // 构建任务
+        Class<? extends Job> jobClass = getQuartzJobClass(job);
+        JobDetail jobDetail = JobBuilder.newJob(jobClass)
+                .withIdentity(getJobKey(jobId, jobGroup))
+                .build();
+
+        // 构建时间
+        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(expression);
+        switch (job.getStrategy()) {
+            case 1: // 立即执行
+                cronScheduleBuilder = cronScheduleBuilder.withMisfireHandlingInstructionIgnoreMisfires();
+                break;
+            case 2: // 执行一次
+                cronScheduleBuilder = cronScheduleBuilder.withMisfireHandlingInstructionFireAndProceed();
+                break;
+            case 3: // 放弃执行
+                cronScheduleBuilder = cronScheduleBuilder.withMisfireHandlingInstructionDoNothing();
+                break;
+        }
+
+        // 注入参数
+        jobDetail.getJobDataMap().put(TaskConstants.TASK_PROPERTIES, job);
+
+        // 构建目标
+        CronTrigger trigger = TriggerBuilder.newTrigger()
+                .withIdentity(getTriggerKey(jobId, jobGroup))
+                .withSchedule(cronScheduleBuilder)
+                .build();
+
+        // 如果存在则删除
+        if (scheduler.checkExists(getJobKey(jobId, jobGroup))) {
+            scheduler.deleteJob(getJobKey(jobId, jobGroup));
+        }
+
+        // 如果过期则调度
+        if (StringUtil.isNotNull(CronUtils.nextExecution(job.getRules()))) {
+            scheduler.scheduleJob(jobDetail, trigger);
+        }
+
+        // 如果暂停则停止
+        if (!job.getStatus().equals(TaskConstants.STATUS_RUN)) {
+            scheduler.pauseJob(getJobKey(jobId, jobGroup));
+        }
+    }
+
+}

+ 20 - 0
like-admin/src/main/java/com/mdd/admin/config/quartz/TaskConstants.java

@@ -0,0 +1,20 @@
+package com.mdd.admin.config.quartz;
+
+/**
+ * 计划任务常量
+ */
+public class TaskConstants {
+
+    /** 执行任务名 */
+    public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME";
+
+    /** 执行目标键 */
+    public static final String TASK_PROPERTIES = "TASK_PROPERTIES";
+
+    /** 状态: 运行 */
+    public static final Integer STATUS_RUN   = 1;
+
+    /** 状态: 失败 */
+    public static final Integer STATUS_FAIL  = 2;
+
+}

+ 81 - 0
like-admin/src/main/java/com/mdd/admin/config/quartz/exceution/AbstractQuartzJob.java

@@ -0,0 +1,81 @@
+package com.mdd.admin.config.quartz.exceution;
+
+import com.mdd.admin.config.quartz.TaskConstants;
+import com.mdd.common.entity.crontab.Crontab;
+import com.mdd.common.mapper.crontab.CrontabMapper;
+import com.mdd.common.utils.SpringUtil;
+import com.mdd.common.utils.StringUtil;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+
+public abstract class AbstractQuartzJob implements Job {
+
+    private static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class);
+
+    /**
+     * 线程本地变量
+     */
+    private static final ThreadLocal<Long> threadLocal = new ThreadLocal<>();
+
+    /**
+     * 执行
+     *
+     * @param context 上下文
+     */
+    @Override
+    public void execute(JobExecutionContext context) {
+        Crontab crontab = new Crontab();
+        BeanUtils.copyProperties(context.getMergedJobDataMap().get(TaskConstants.TASK_PROPERTIES), crontab);
+        try {
+            before();
+            doExecute(context, crontab);
+            after(crontab, null);
+        } catch (Exception e) {
+            log.error("任务执行异常:", e);
+            after(crontab, e);
+        }
+    }
+
+    /**
+     * 执行前
+     */
+    protected void before() {
+        threadLocal.set(System.currentTimeMillis());
+    }
+
+    /**
+     * 执行后
+     *
+     * @param crontab 系统计划任务
+     */
+    protected void after(Crontab crontab, Exception e)
+    {
+        long startTime = threadLocal.get();
+        long endTime = System.currentTimeMillis();
+        threadLocal.remove();
+
+        crontab.setError("");
+        crontab.setStartTime(startTime / 1000);
+        crontab.setEndTime(endTime / 1000);
+        crontab.setTaskTime(endTime - startTime);
+        if (StringUtil.isNotNull(e)) {
+            crontab.setError(e.getMessage());
+            crontab.setStatus(TaskConstants.STATUS_FAIL);
+        }
+
+        SpringUtil.getBean(CrontabMapper.class).updateById(crontab);
+    }
+
+    /**
+     * 执行方法
+     *
+     * @param context 工作执行上下文对象
+     * @param sysJob 系统计划任务
+     * @throws Exception 执行过程中的异常
+     */
+    protected abstract void doExecute(JobExecutionContext context, Crontab sysJob) throws Exception;
+
+}

+ 31 - 0
like-admin/src/main/java/com/mdd/admin/config/quartz/exceution/QuartzDisExecution.java

@@ -0,0 +1,31 @@
+package com.mdd.admin.config.quartz.exceution;
+
+import com.mdd.admin.config.quartz.InvokeUtils;
+import com.mdd.common.entity.crontab.Crontab;
+import com.mdd.common.mapper.crontab.CrontabMapper;
+import org.quartz.DisallowConcurrentExecution;
+import org.quartz.JobExecutionContext;
+
+import javax.annotation.Resource;
+
+/**
+ * 禁止并发任务
+ */
+@DisallowConcurrentExecution
+public class QuartzDisExecution extends AbstractQuartzJob {
+
+    @Resource
+    private CrontabMapper crontabMapper;
+
+    @Override
+    protected void doExecute(JobExecutionContext context, Crontab crontab) throws Exception {
+        Long startTime = System.currentTimeMillis();
+        InvokeUtils.invokeMethod(crontab);
+        Long endTime = System.currentTimeMillis();
+        if (endTime - startTime > crontab.getTaskMaxTime()){
+            crontab.setTaskMaxTime(endTime - startTime);
+            crontabMapper.updateById(crontab);
+        }
+    }
+
+}

+ 17 - 0
like-admin/src/main/java/com/mdd/admin/config/quartz/exceution/QuartzJobExecution.java

@@ -0,0 +1,17 @@
+package com.mdd.admin.config.quartz.exceution;
+
+import com.mdd.admin.config.quartz.InvokeUtils;
+import com.mdd.common.entity.crontab.Crontab;
+import org.quartz.JobExecutionContext;
+
+/**
+ * 允许并发任务
+ */
+public class QuartzJobExecution extends AbstractQuartzJob {
+
+    @Override
+    protected void doExecute(JobExecutionContext context, Crontab crontab) throws Exception {
+        InvokeUtils.invokeMethod(crontab);
+    }
+
+}

+ 34 - 0
like-admin/src/main/java/com/mdd/admin/config/swagger/SwaggerConfig.java

@@ -0,0 +1,34 @@
+package com.mdd.admin.config.swagger;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * @author slien.zuo
+ */
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig {
+    @Bean
+    public Docket customDocket() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo())
+                .enable(true) //禁用swagger
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.mdd.admin.controller")) // 指定路径
+                .build();
+    }
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+                .title("上门预约")
+                .version("1.0.0")
+                .build();
+    }
+}

+ 31 - 0
like-admin/src/main/java/com/mdd/admin/config/swagger/WebSwaggerMvcConfigurer.java

@@ -0,0 +1,31 @@
+package com.mdd.admin.config.swagger;
+
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
+
+/**
+ * @Author slien
+ * @Description swagger 同步之后需要注释此配置
+ * @Date 13:39 2022/10/14
+ * @Param
+ * @return
+ **/
+//@Configuration
+public class WebSwaggerMvcConfigurer extends WebMvcConfigurationSupport {
+
+    /**
+     * 发现如果继承了WebMvcConfigurationSupport,则在yml中配置的相关内容会失效。 需要重新指定静态资源
+     *
+     * @param registry
+     */
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        registry.addResourceHandler("/**").addResourceLocations(
+                "classpath:/static/");
+        registry.addResourceHandler("swagger-ui.html").addResourceLocations(
+                "classpath:/META-INF/resources/");
+        registry.addResourceHandler("/webjars/**").addResourceLocations(
+                "classpath:/META-INF/resources/webjars/");
+        super.addResourceHandlers(registry);
+    }
+}

+ 156 - 0
like-admin/src/main/java/com/mdd/admin/config/wxpay/WxPayConfiguration.java

@@ -0,0 +1,156 @@
+package com.mdd.admin.config.wxpay;
+
+import com.alibaba.fastjson.JSON;
+import com.github.binarywang.wxpay.config.WxPayConfig;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
+import com.mdd.common.entity.pay.DevPay;
+import com.mdd.common.entity.system.SystemConfig;
+import com.mdd.common.entity.wxpay.SystemWxPayConfig;
+import com.mdd.common.enums.OrderPlayTypeEnum;
+import com.mdd.common.mapper.pay.DevPayMapper;
+import com.mdd.common.mapper.system.SystemConfigMapper;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.Resource;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author panweiliang
+ */
+@Configuration
+@ConditionalOnClass(WxPayService.class)
+@AllArgsConstructor
+public class WxPayConfiguration {
+
+    @Resource
+    private DevPayMapper devPayMapper;
+
+    @Resource
+    private SystemConfigMapper systemConfigMapper;
+
+    @Bean("mpWxPayService")
+    public WxPayService mpWxPayService() {
+        Boolean flag = Boolean.FALSE;
+        WxPayConfig payConfig = new WxPayConfig();
+        DevPay devPay = devPayMapper.getEntityByPayWay(OrderPlayTypeEnum.WECHAT_PAY.getType());
+        String config = devPay.getConfig();
+        SystemWxPayConfig systemWxPayConfig = JSON.parseObject(config, SystemWxPayConfig.class);
+        //payConfig.setAppId(StringUtils.trimToNull(systemWxPayConfig.getAppId()));
+        payConfig.setAppId(StringUtils.trimToNull(this.getAppId("mp_channel")));
+        payConfig.setMchId(StringUtils.trimToNull(systemWxPayConfig.getMchId()));
+        payConfig.setApiV3Key(StringUtils.trimToNull(systemWxPayConfig.getPaySignKey()));
+        if (StringUtils.isNotEmpty(systemWxPayConfig.getApiclientKey())) {
+            payConfig.setPrivateKeyContent(StringUtils.trimToNull(systemWxPayConfig.getApiclientKey()).getBytes());
+            flag = Boolean.TRUE;
+        }
+        if (StringUtils.isNotEmpty(systemWxPayConfig.getApiclientCert())) {
+            payConfig.setPrivateCertContent(StringUtils.trimToNull(systemWxPayConfig.getApiclientCert()).getBytes());
+            flag = Boolean.TRUE;
+        }
+        if (StringUtils.isNotEmpty(systemWxPayConfig.getWechatPublicSerial())) {
+            payConfig.setPublicKeyId(StringUtils.trimToNull(systemWxPayConfig.getWechatPublicSerial()));
+            flag = Boolean.TRUE;
+        }
+        if (StringUtils.isNotEmpty(systemWxPayConfig.getWechatPublicCert())) {
+            payConfig.setPublicKeyContent(StringUtils.trimToNull(systemWxPayConfig.getWechatPublicCert()).getBytes());
+            flag = Boolean.TRUE;
+        }
+        // 可以指定是否使用沙箱环境
+        payConfig.setUseSandboxEnv(false);
+        WxPayService wxPayService = new WxPayServiceImpl();
+        if (flag) {
+            wxPayService.setConfig(payConfig);
+        }
+        return wxPayService;
+    }
+
+    @Bean("oaWxPayService")
+    public WxPayService oaWxPayService() {
+        Boolean flag = Boolean.FALSE;
+        WxPayConfig payConfig = new WxPayConfig();
+        DevPay devPay = devPayMapper.getEntityByPayWay(OrderPlayTypeEnum.WECHAT_PAY.getType());
+        String config = devPay.getConfig();
+        SystemWxPayConfig systemWxPayConfig = JSON.parseObject(config, SystemWxPayConfig.class);
+        //payConfig.setAppId(StringUtils.trimToNull(systemWxPayConfig.getAppId()));
+        payConfig.setAppId(StringUtils.trimToNull(this.getAppId("oa_channel")));
+        payConfig.setMchId(StringUtils.trimToNull(systemWxPayConfig.getMchId()));
+        payConfig.setApiV3Key(StringUtils.trimToNull(systemWxPayConfig.getPaySignKey()));
+        if (StringUtils.isNotEmpty(systemWxPayConfig.getApiclientKey())) {
+            payConfig.setPrivateKeyContent(StringUtils.trimToNull(systemWxPayConfig.getApiclientKey()).getBytes());
+            flag = Boolean.TRUE;
+        }
+        if (StringUtils.isNotEmpty(systemWxPayConfig.getApiclientCert())) {
+            payConfig.setPrivateCertContent(StringUtils.trimToNull(systemWxPayConfig.getApiclientCert()).getBytes());
+            flag = Boolean.TRUE;
+        }
+        if (StringUtils.isNotEmpty(systemWxPayConfig.getWechatPublicSerial())) {
+            payConfig.setPublicKeyId(StringUtils.trimToNull(systemWxPayConfig.getWechatPublicSerial()));
+            flag = Boolean.TRUE;
+        }
+        if (StringUtils.isNotEmpty(systemWxPayConfig.getWechatPublicCert())) {
+            payConfig.setPublicKeyContent(StringUtils.trimToNull(systemWxPayConfig.getWechatPublicCert()).getBytes());
+            flag = Boolean.TRUE;
+        }
+        // 可以指定是否使用沙箱环境
+        payConfig.setUseSandboxEnv(false);
+        WxPayService wxPayService = new WxPayServiceImpl();
+        if (flag) {
+            wxPayService.setConfig(payConfig);
+        }
+        return wxPayService;
+    }
+
+    @Bean("h5WxPayService")
+    public WxPayService h5WxPayService() {
+        Boolean flag = Boolean.FALSE;
+        WxPayConfig payConfig = new WxPayConfig();
+        DevPay devPay = devPayMapper.getEntityByPayWay(OrderPlayTypeEnum.WECHAT_PAY.getType());
+        String config = devPay.getConfig();
+        SystemWxPayConfig systemWxPayConfig = JSON.parseObject(config, SystemWxPayConfig.class);
+        //payConfig.setAppId(StringUtils.trimToNull(systemWxPayConfig.getAppId()));
+        payConfig.setAppId(StringUtils.trimToNull(this.getAppId("h5_channel")));
+        payConfig.setMchId(StringUtils.trimToNull(systemWxPayConfig.getMchId()));
+        payConfig.setApiV3Key(StringUtils.trimToNull(systemWxPayConfig.getPaySignKey()));
+        if (StringUtils.isNotEmpty(systemWxPayConfig.getApiclientKey())) {
+            payConfig.setPrivateKeyContent(StringUtils.trimToNull(systemWxPayConfig.getApiclientKey()).getBytes());
+            flag = Boolean.TRUE;
+        }
+        if (StringUtils.isNotEmpty(systemWxPayConfig.getApiclientCert())) {
+            payConfig.setPrivateCertContent(StringUtils.trimToNull(systemWxPayConfig.getApiclientCert()).getBytes());
+            flag = Boolean.TRUE;
+        }
+        if (StringUtils.isNotEmpty(systemWxPayConfig.getWechatPublicSerial())) {
+            payConfig.setPublicKeyId(StringUtils.trimToNull(systemWxPayConfig.getWechatPublicSerial()));
+            flag = Boolean.TRUE;
+        }
+        if (StringUtils.isNotEmpty(systemWxPayConfig.getWechatPublicCert())) {
+            payConfig.setPublicKeyContent(StringUtils.trimToNull(systemWxPayConfig.getWechatPublicCert()).getBytes());
+            flag = Boolean.TRUE;
+        }
+        // 可以指定是否使用沙箱环境
+        payConfig.setUseSandboxEnv(false);
+        WxPayService wxPayService = new WxPayServiceImpl();
+        if (flag) {
+            wxPayService.setConfig(payConfig);
+        }
+        return wxPayService;
+    }
+
+    private String getAppId(String channel) {
+        List<SystemConfig> configs = systemConfigMapper.getAppId(channel);
+        Map<String, String> map = new LinkedHashMap<>();
+        for (SystemConfig config : configs) {
+            map.put(config.getName(), config.getValue());
+        }
+        return map.getOrDefault("appId", "");
+    }
+
+
+}

+ 31 - 0
like-admin/src/main/java/com/mdd/admin/config/wxpay/WxPayProperties.java

@@ -0,0 +1,31 @@
+package com.mdd.admin.config.wxpay;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * wxpay pay properties.
+ *
+ * @author panweiliang
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "wx.pay")
+public class WxPayProperties {
+  /**
+   * 订单支付后回调
+   */
+  private String orderNotifyUrl;
+
+  /**
+   *
+   */
+  private String orderRefundNotifyUrl;
+
+  /**
+   * 商品描述
+   */
+  private String description;
+
+}

+ 164 - 0
like-admin/src/main/java/com/mdd/admin/controller/WxPayController.java

@@ -0,0 +1,164 @@
+package com.mdd.admin.controller;
+
+import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
+import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
+import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyResult;
+import com.github.binarywang.wxpay.bean.notify.WxScanPayNotifyResult;
+import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryV3Result;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.mdd.admin.service.order.IOrderService;
+import com.mdd.admin.service.refund.IOrderRefundService;
+import com.mdd.common.entity.order.Order;
+import com.mdd.common.utils.WxPayServiceUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * @author panweiliang
+ */
+@Slf4j
+@RestController
+@RequestMapping("/api/pay/wx")
+public class WxPayController {
+
+    @Resource
+    private IOrderService orderService;
+
+    @Resource
+    private IOrderRefundService refundService;
+
+    /**
+     * <pre>
+     * 查询订单(详见https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2)
+     * 该接口提供所有微信支付订单的查询,商户可以通过查询订单接口主动查询订单状态,完成下一步的业务逻辑。
+     * 需要调用查询接口的情况:
+     * ◆ 当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知;
+     * ◆ 调用支付接口后,返回系统错误或未知交易状态情况;
+     * ◆ 调用被扫支付API,返回USERPAYING的状态;
+     * ◆ 调用关单或撤销接口API之前,需确认支付状态;
+     * 接口地址:https://api.mch.weixin.qq.com/pay/orderquery
+     * </pre>
+     * <p>
+     * 查询订单支付信息
+     *
+     * @param transactionId 微信订单号
+     * @param outTradeNo    商户系统内部的订单号,当没提供transactionId时需要传这个。
+     */
+    @GetMapping("/queryOrder")
+    public WxPayOrderQueryV3Result queryOrder(@RequestParam(required = false) String transactionId,
+                                              @RequestParam(required = false) String outTradeNo)
+            throws WxPayException {
+        Order order = orderService.getBySn(outTradeNo);
+        return WxPayServiceUtils.wxPayService(order.getPayChannel()).queryOrderV3(transactionId, outTradeNo);
+    }
+
+    /*@PostMapping("/queryOrder")
+    public WxPayOrderQueryV3Result queryOrder(@RequestBody WxPayOrderQueryV3Request wxPayOrderQueryV3Request) throws WxPayException {
+        return this.wxService.queryOrderV3(wxPayOrderQueryV3Request);
+    }*/
+
+    /**
+     * <pre>
+     * 关闭订单
+     * 应用场景
+     * 以下情况需要调用关单接口:
+     * 1. 商户订单支付失败需要生成新单号重新发起支付,要对原订单号调用关单,避免重复支付;
+     * 2. 系统下单后,用户支付超时,系统退出不再受理,避免用户继续,请调用关单接口。
+     * 注意:订单生成后不能马上调用关单接口,最短调用时间间隔为5分钟。
+     * 接口地址:https://api.mch.weixin.qq.com/pay/closeorder
+     * 是否需要证书:   不需要。
+     * </pre>
+     *
+     * @param outTradeNo 商户系统内部的订单号
+     *                   关闭订单
+     */
+    @GetMapping("/closeOrder")
+    public void closeOrder(@RequestParam("outTradeNo") String outTradeNo) throws Exception {
+        Order order = orderService.getBySn(outTradeNo);
+        WxPayServiceUtils.wxPayService(order.getPayChannel()).closeOrderV3(outTradeNo);
+    }
+
+   /* //关闭订单
+    @Deprecated
+    @PostMapping("/closeOrder")
+    public void closeOrder(@RequestBody WxPayOrderCloseRequest wxPayOrderCloseRequest) throws WxPayException {
+        this.wxService.closeOrder(wxPayOrderCloseRequest);
+    }*/
+
+    /* *//**
+     * <pre>
+     * 微信支付-申请退款
+     * 详见 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4
+     * 接口链接:https://api.mch.weixin.qq.com/secapi/pay/refund
+     * </pre>
+     *
+     * @param request 请求对象
+     * @return 退款操作结果
+     *//*
+    @PostMapping("/refund")
+    public WxPayRefundV3Result refund(@RequestBody WxPayRefundV3Request request) throws WxPayException {
+        return this.wxService.refundV3(request);
+    }*/
+
+    /* */
+
+    /**
+     * <pre>
+     * 微信支付-查询退款
+     * 应用场景:
+     *  提交退款申请后,通过调用该接口查询退款状态。退款有一定延时,用零钱支付的退款20分钟内到账,
+     *  银行卡支付的退款3个工作日后重新查询退款状态。
+     * 详见 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_5
+     * 接口链接:https://api.mch.weixin.qq.com/pay/refundquery
+     * </pre>
+     * 以下四个参数四选一
+     *
+     * @param outRefundNo 商户退款单号
+     * @return 退款信息
+     *//*
+    @GetMapping("/refundQuery")
+    public WxPayRefundQueryV3Result refundQuery(@RequestParam(required = false) String outRefundNo)
+            throws WxPayException {
+        return this.wxService.refundQueryV3(outRefundNo);
+    }*/
+
+   /* @PostMapping("/refundQuery")
+    public WxPayRefundQueryResult refundQuery(@RequestBody WxPayRefundQueryRequest wxPayRefundQueryRequest) throws WxPayException {
+        return this.wxService.refundQuery(wxPayRefundQueryRequest);
+    }*/
+
+    //  支付回调通知处理
+    @PostMapping("/notify/order")
+    public String parseOrderNotifyResult(@RequestBody String xmlData) throws Exception {
+        log.info("支付回调通知处理,原生xml数据,xmlData:{}", xmlData);
+
+        final WxPayOrderNotifyResult notifyResult = WxPayServiceUtils.wxPayService(null).parseOrderNotifyResult(xmlData);
+        log.info("支付回调通知处理,解析后数据,parseOrderNotifyResult:{}", notifyResult);
+        String transactionId = notifyResult.getTransactionId();
+        String outTradeNo = notifyResult.getOutTradeNo();
+        boolean flag = this.orderService.updateOrderStatusToPaid(outTradeNo, transactionId);
+        return flag ? WxPayNotifyResponse.success("成功") : WxPayNotifyResponse.fail("失败");
+    }
+
+    //  退款回调通知处理
+    @PostMapping("/notify/refund")
+    public String parseRefundNotifyResult(@RequestBody String xmlData) throws WxPayException {
+        log.info("退款回调通知处理原生数据,xmlData:{}", xmlData);
+        final WxPayRefundNotifyResult result = WxPayServiceUtils.wxPayService(null).parseRefundNotifyResult(xmlData);
+        log.info("退款回调通知处理,parseRefundNotifyResult:{}", result);
+        boolean flag = refundService.updateOrderStatusToPaid(result.getReqInfo());
+        return flag ? WxPayNotifyResponse.success("成功") : WxPayNotifyResponse.fail("失败");
+    }
+
+    //  扫码支付回调通知处理
+    @PostMapping("/notify/scanpay")
+    public String parseScanPayNotifyResult(String xmlData) throws WxPayException {
+        final WxScanPayNotifyResult result = WxPayServiceUtils.wxPayService(null).parseScanPayNotifyResult(xmlData);
+        // TODO 根据自己业务场景需要构造返回对象
+        return WxPayNotifyResponse.success("成功");
+    }
+
+}
+

+ 41 - 0
like-admin/src/main/java/com/mdd/admin/controller/account/AccountLogController.java

@@ -0,0 +1,41 @@
+package com.mdd.admin.controller.account;
+
+import com.mdd.admin.service.account.IAccountLogService;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.vo.account.AccountLogListVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * @author kn4im3
+ * @date 2023/3/7 17:30
+ */
+@RestController
+@RequestMapping("/api/account/log")
+public class AccountLogController {
+
+    @Resource
+    private IAccountLogService iAccountLogService;
+
+    /**
+     * 余额显示列表
+     *
+     * @param pageParam 分页参数
+     * @param params 参数
+     * @return Object
+     */
+    @GetMapping("/list")
+    public AjaxResult list(@Validated PageParam pageParam,
+                           @RequestParam Map<String, String> params){
+        PageResult<AccountLogListVo> list = iAccountLogService.list(pageParam, params);
+        return AjaxResult.success(list);
+    }
+}

+ 117 - 0
like-admin/src/main/java/com/mdd/admin/controller/article/ArticleController.java

@@ -0,0 +1,117 @@
+package com.mdd.admin.controller.article;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.article.IArticleArchivesService;
+import com.mdd.admin.validate.article.ArticleParam;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.vo.article.ArticleDetailVo;
+import com.mdd.admin.vo.article.ArticleListVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.validator.annotation.IDMust;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 文章管理
+ */
+@RestController("articleController")
+@RequestMapping("api/article")
+public class ArticleController {
+
+    @Resource
+    IArticleArchivesService iArticleArchivesService;
+
+    /**
+     * 文章列表
+     *
+     * @author fzr
+     * @param pageParam 分页参数
+     * @param params 搜索参数
+     * @return Object
+     */
+    @GetMapping("/list")
+    public Object list(@Validated PageParam pageParam,
+                              @RequestParam Map<String, String> params) {
+        PageResult<ArticleListVo> vos = iArticleArchivesService.list(pageParam, params);
+        return AjaxResult.success(vos);
+    }
+
+    /**
+     * 文章详情
+     *
+     * @author fzr
+     * @param id 文章ID
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        ArticleDetailVo vo = iArticleArchivesService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    /**
+     * 文章新增
+     *
+     * @author fzr
+     * @param articleParam 文章参数
+     * @return Object
+     */
+    @Log(title = "文章新增")
+    @PostMapping("/add")
+    public Object add(
+            @Validated(value = ArticleParam.create.class)
+            @RequestBody ArticleParam articleParam) {
+        iArticleArchivesService.add(articleParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 文章编辑
+     *
+     * @author fzr
+     * @param articleParam 文章参数
+     * @return Object
+     */
+    @Log(title = "文章编辑")
+    @PostMapping("/edit")
+    public Object edit(@Validated(value = ArticleParam.update.class)
+                       @RequestBody ArticleParam articleParam) {
+        iArticleArchivesService.edit(articleParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 文章删除
+     *
+     * @author fzr
+     * @param articleParam 文章参数
+     * @return Object
+     */
+    @Log(title = "文章删除")
+    @PostMapping("/del")
+    public Object del(@Validated(value = ArticleParam.delete.class)
+                      @RequestBody ArticleParam articleParam) {
+        iArticleArchivesService.del(articleParam.getId());
+        return AjaxResult.success();
+    }
+
+    /**
+     * 文章状态
+     *
+     * @author fzr
+     * @param articleParam 文章参数
+     * @return Object
+     */
+    @Log(title = "文章状态")
+    @PostMapping("/change")
+    public Object change(@Validated(value = ArticleParam.change.class)
+                         @RequestBody ArticleParam articleParam) {
+        iArticleArchivesService.change(articleParam.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 128 - 0
like-admin/src/main/java/com/mdd/admin/controller/article/CategoryController.java

@@ -0,0 +1,128 @@
+package com.mdd.admin.controller.article;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.article.IArticleCategoryService;
+import com.mdd.admin.validate.article.CategoryParam;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.vo.article.ArticleCateVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.validator.annotation.IDMust;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 文章分类管理
+ */
+@RestController("articleCategoryController")
+@RequestMapping("api/article/cate")
+public class CategoryController {
+
+    @Resource
+    IArticleCategoryService iArticleCategoryService;
+
+    /**
+     * 分类所有
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/all")
+    public Object all() {
+        List<ArticleCateVo> list = iArticleCategoryService.all();
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 分类列表
+     *
+     * @author fzr
+     * @param pageParam 分页参数
+     * @param params 搜索参数
+     * @return Object
+     */
+    @GetMapping("/list")
+    public Object list(@Validated PageParam pageParam,
+                       @RequestParam Map<String, String> params) {
+        PageResult<ArticleCateVo> list = iArticleCategoryService.list(pageParam, params);
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 分类详情
+     *
+     * @author fzr
+     * @param id 主键
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        ArticleCateVo vo = iArticleCategoryService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    /**
+     * 分类新增
+     *
+     * @author fzr
+     * @param categoryParam 分类参数
+     * @return Object
+     */
+    @Log(title = "文章分类新增")
+    @PostMapping("/add")
+    public Object add(@Validated(value = CategoryParam.create.class)
+                          @RequestBody CategoryParam categoryParam) {
+        iArticleCategoryService.add(categoryParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 分类编辑
+     *
+     * @author fzr
+     * @param categoryParam 分类编辑
+     * @return Object
+     */
+    @Log(title = "文章分类编辑")
+    @PostMapping("/edit")
+    public Object edit(@Validated(value = CategoryParam.update.class)
+                           @RequestBody CategoryParam categoryParam) {
+        iArticleCategoryService.edit(categoryParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 分类删除
+     *
+     * @author fzr
+     * @param categoryParam 分类删除
+     * @return Object
+     */
+    @Log(title = "文章分类删除")
+    @PostMapping("/del")
+    public Object del(@Validated(value = CategoryParam.delete.class)
+                          @RequestBody CategoryParam categoryParam) {
+        iArticleCategoryService.del(categoryParam.getId());
+        return AjaxResult.success();
+    }
+
+    /**
+     * 分类状态
+     *
+     * @author fzr
+     * @param categoryParam 分类参数
+     * @return Object
+     */
+    @Log(title = "文章分类状态")
+    @PostMapping("/change")
+    public Object change(@Validated(value = CategoryParam.change.class)
+                         @RequestBody CategoryParam categoryParam) {
+        iArticleCategoryService.change(categoryParam.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 40 - 0
like-admin/src/main/java/com/mdd/admin/controller/channel/ChannelOaCallBackController.java

@@ -0,0 +1,40 @@
+package com.mdd.admin.controller.channel;
+
+import com.mdd.admin.service.channel.IChannelOaCallBackService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+
+@RestController
+@RequestMapping("api/channel/oa/callback")
+@Api(tags = "公众号服务器验证及消息回复")
+public class ChannelOaCallBackController {
+
+    @Resource
+    private IChannelOaCallBackService iChannelOaCallBackService;
+
+    @GetMapping(produces = "text/plain;charset=utf-8")
+    @ApiOperation(value="公众号服务器地址验证")
+    public String authGet(@RequestParam(name = "signature", required = false) String signature,
+                          @RequestParam(name = "timestamp", required = false) String timestamp,
+                          @RequestParam(name = "nonce", required = false) String nonce,
+                          @RequestParam(name = "echostr", required = false) String echostr) {
+        String ret = iChannelOaCallBackService.checkSignature(signature, timestamp, nonce, echostr);
+        return ret;
+    }
+
+
+    @PostMapping(produces = "application/xml; charset=UTF-8")
+    @ApiOperation(value="公众号消息回复")
+    public String post(@RequestBody String requestBody,
+                       @RequestParam("signature") String signature,
+                       @RequestParam("timestamp") String timestamp,
+                       @RequestParam("nonce") String nonce,
+                       @RequestParam(name = "encrypt_type", required = false) String encType,
+                       @RequestParam(name = "msg_signature", required = false) String msgSignature) {
+        return iChannelOaCallBackService.post(requestBody, signature, timestamp, nonce, encType, msgSignature);
+    }
+}

+ 47 - 0
like-admin/src/main/java/com/mdd/admin/controller/channel/H5Controller.java

@@ -0,0 +1,47 @@
+package com.mdd.admin.controller.channel;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.channel.IChannelH5Service;
+import com.mdd.common.core.AjaxResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * H5渠道设置
+ */
+@RestController
+@RequestMapping("api/channel/h5")
+public class H5Controller {
+
+    @Resource
+    IChannelH5Service iChannelH5Service;
+
+    /**
+     * H5渠道设置详情
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail() {
+        Map<String, Object> map = iChannelH5Service.detail();
+        return AjaxResult.success(map);
+    }
+
+    /**
+     * H5渠道设置保存
+     *
+     * @author fzr
+     * @param param 参数
+     * @return Object
+     */
+    @Log(title = "H5渠道设置保存")
+    @PostMapping("/save")
+    public Object save(@RequestBody Map<String, String> param) {
+        iChannelH5Service.save(param);
+        return AjaxResult.success();
+    }
+
+}

+ 48 - 0
like-admin/src/main/java/com/mdd/admin/controller/channel/MpController.java

@@ -0,0 +1,48 @@
+package com.mdd.admin.controller.channel;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.channel.IChannelMpService;
+import com.mdd.admin.vo.channel.ChannelMpVo;
+import com.mdd.common.core.AjaxResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 微信小程序渠道设置
+ */
+@RestController
+@RequestMapping("api/channel/mp")
+public class MpController {
+
+    @Resource
+    IChannelMpService iChannelMpService;
+
+    /**
+     * 微信小程序渠道设置详情
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail() {
+        ChannelMpVo vo = iChannelMpService.detail();
+        return AjaxResult.success(vo);
+    }
+
+    /**
+     * 微信小程序渠道设置保存
+     *
+     * @author fzr
+     * @param param 参数
+     * @return Object
+     */
+    @Log(title = "微信小程序渠道设置保存")
+    @PostMapping("/save")
+    public Object save(@RequestBody Map<String, String> param) {
+        iChannelMpService.save(param);
+        return AjaxResult.success();
+    }
+
+}

+ 48 - 0
like-admin/src/main/java/com/mdd/admin/controller/channel/OaController.java

@@ -0,0 +1,48 @@
+package com.mdd.admin.controller.channel;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.channel.IChannelOaService;
+import com.mdd.admin.vo.channel.ChannelOaVo;
+import com.mdd.common.core.AjaxResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 微信公众号渠道设置
+ */
+@RestController
+@RequestMapping("api/channel/oa")
+public class OaController {
+
+    @Resource
+    IChannelOaService iChannelOaService;
+
+    /**
+     * 公众号渠道设置详情
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail() {
+        ChannelOaVo vo = iChannelOaService.detail();
+        return AjaxResult.success(vo);
+    }
+
+    /**
+     * 公众号渠道设置保存
+     *
+     * @author fzr
+     * @param param 参数
+     * @return Object
+     */
+    @Log(title = "公众号渠道设置保存")
+    @PostMapping("/save")
+    public Object save(@RequestBody Map<String, String> param) {
+        iChannelOaService.save(param);
+        return AjaxResult.success();
+    }
+
+}

+ 59 - 0
like-admin/src/main/java/com/mdd/admin/controller/channel/OaMenuController.java

@@ -0,0 +1,59 @@
+package com.mdd.admin.controller.channel;
+
+import com.alibaba.fastjson.JSONArray;
+import com.mdd.admin.service.channel.IChannelOaMenuService;
+import com.mdd.common.core.AjaxResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 公众号菜单管理
+ */
+@RestController
+@RequestMapping("api/channel/oaMenu")
+public class OaMenuController {
+
+    @Resource
+    IChannelOaMenuService iChannelOaMenuService;
+
+    /**
+     * 菜单详情
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail() {
+        JSONArray detail = iChannelOaMenuService.detail();
+        return AjaxResult.success(detail);
+    }
+
+    /**
+     * 仅是保存菜单
+     *
+     * @author fzr
+     * @param params 参数
+     * @return Object
+     */
+    @PostMapping("/save")
+    public Object save(@RequestBody List<Object> params) {
+        iChannelOaMenuService.save(params, false);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 保存并发布菜单
+     *
+     * @author fzr
+     * @param params 参数
+     * @return Object
+     */
+    @PostMapping("/publish")
+    public Object publish(@RequestBody List<Object> params) {
+        iChannelOaMenuService.save(params, true);
+        return AjaxResult.success();
+    }
+
+}

+ 102 - 0
like-admin/src/main/java/com/mdd/admin/controller/channel/OaReplyController.java

@@ -0,0 +1,102 @@
+package com.mdd.admin.controller.channel;
+
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.mdd.admin.service.channel.IChannelOaReplyService;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.validator.annotation.IDMust;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 公众号回复管理
+ */
+@RestController
+@RequestMapping("api/channel/oaReply")
+public class OaReplyController {
+
+    @Resource
+    IChannelOaReplyService iChannelOaReplyService;
+
+    /**
+     * 回复列表
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/list")
+    public Object list(@Validated PageParam pageParam,
+                       @RequestParam Map<String, String> params) {
+        List<Map<String, Object>> list = iChannelOaReplyService.list(pageParam, params);
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 回复详情
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        Map<String, Object> map = iChannelOaReplyService.detail(id);
+        return AjaxResult.success(map);
+    }
+
+    /**
+     * 回复新增
+     *
+     * @author fzr
+     * @param params 参数
+     * @return Object
+     */
+    @PostMapping("/add")
+    public Object add(@RequestBody Map<String, String> params) {
+        iChannelOaReplyService.add(params);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 回复编辑
+     *
+     * @author fzr
+     * @return Object
+     */
+    @PostMapping("/edit")
+    public Object edit(@RequestBody Map<String, String> params) {
+        iChannelOaReplyService.edit(params);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 回复删除
+     *
+     * @author fzr
+     * @return Object
+     */
+    @PostMapping("/del")
+    public Object del(@RequestBody Map<String, String> params) {
+        Assert.notNull(params.get("id"), "id参数缺失");
+        iChannelOaReplyService.del(Integer.parseInt(params.get("id")));
+        return AjaxResult.success();
+    }
+
+    /**
+     * 回复状态
+     *
+     * @author fzr
+     * @return Object
+     */
+    @PostMapping("/status")
+    public Object status(@RequestBody Map<String, String> params) {
+        Assert.notNull(params.get("id"), "id参数缺失");
+        iChannelOaReplyService.status(Integer.parseInt(params.get("id")));
+        return AjaxResult.success();
+    }
+
+
+}

+ 48 - 0
like-admin/src/main/java/com/mdd/admin/controller/channel/WxController.java

@@ -0,0 +1,48 @@
+package com.mdd.admin.controller.channel;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.channel.IChannelWxService;
+import com.mdd.admin.vo.channel.ChannelOpVo;
+import com.mdd.common.core.AjaxResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 微信开发平台渠道设置
+ */
+@RestController
+@RequestMapping("api/channel/wx")
+public class WxController {
+
+    @Resource
+    IChannelWxService iChannelWxService;
+
+    /**
+     * 开放平台渠道设置详情
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail() {
+        ChannelOpVo vo = iChannelWxService.detail();
+        return AjaxResult.success(vo);
+    }
+
+    /**
+     * 开放平台渠道设置保存
+     *
+     * @author fzr
+     * @param param 参数
+     * @return Object
+     */
+    @Log(title = "开放平台渠道设置保存")
+    @PostMapping("/save")
+    public Object save(@RequestBody Map<String, String> param) {
+        iChannelWxService.save(param);
+        return AjaxResult.success();
+    }
+
+}

+ 149 - 0
like-admin/src/main/java/com/mdd/admin/controller/common/AlbumController.java

@@ -0,0 +1,149 @@
+package com.mdd.admin.controller.common;
+
+import com.alibaba.fastjson.JSONArray;
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.common.IAlbumService;
+import com.mdd.admin.validate.common.AlbumParam;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.vo.album.AlbumVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.utils.ArrayUtil;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 相册管理
+ */
+@RestController
+@RequestMapping("api/common/album")
+public class AlbumController {
+
+    @Resource
+    IAlbumService iAlbumService;
+
+    /**
+     * 相册文件列表
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/albumList")
+    public Object albumList(@Validated PageParam pageParam,
+                            @RequestParam Map<String, String> params) {
+        PageResult<AlbumVo> voPageResult = iAlbumService.albumList(pageParam, params);
+        return AjaxResult.success(voPageResult);
+    }
+
+    /**
+     * 相册文件重命名
+     *
+     * @author fzr
+     * @return Object
+     */
+    @Log(title = "相册文件重命名")
+    @PostMapping("/albumRename")
+    public Object albumRename(@Validated(value = AlbumParam.rename.class) @RequestBody AlbumParam albumParam) {
+        iAlbumService.albumRename(albumParam.getId(), albumParam.getName());
+        return AjaxResult.success();
+    }
+
+    /**
+     * 相册文件移动
+     *
+     * @author fzr
+     * @return Object
+     */
+    @Log(title = "相册文件移动")
+    @PostMapping("/albumMove")
+    public Object albumMove(@RequestBody Map<String, Object> params) {
+        if (params.get("ids") == null) {
+            return AjaxResult.failed("缺少ids参数");
+        }
+
+        if (params.get("cid") == null) {
+            return AjaxResult.failed("缺少cid参数");
+        }
+
+        List<Integer> ids = ArrayUtil.objectToListAsInt(params.get("ids"));
+        if (ids.size() <= 0) {
+            return AjaxResult.failed("请至少选择一个文件");
+        }
+
+        iAlbumService.albumMove(ids, Integer.parseInt(params.get("cid").toString()));
+        return AjaxResult.success();
+    }
+
+    /**
+     * 相册文件删除
+     *
+     * @author fzr
+     * @return Object
+     */
+    @Log(title = "相册文件删除")
+    @PostMapping("/albumDel")
+    public Object albumDel(@RequestBody Map<String, List<Integer>> params) {
+        if (params.get("ids") == null) {
+            return AjaxResult.failed("缺少ids参数");
+        }
+
+        iAlbumService.albumDel(params.get("ids"));
+        return AjaxResult.success();
+    }
+
+    /**
+     * 相册分类列表
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/cateList")
+    public Object cateList(@RequestParam Map<String, String> params) {
+        JSONArray jsonArray = iAlbumService.cateList(params);
+        return AjaxResult.success(jsonArray);
+    }
+
+    /**
+     * 相册分类新增
+     *
+     * @author fzr
+     * @return Object
+     */
+    @Log(title = "相册分类新增")
+    @PostMapping("/cateAdd")
+    public Object cateAdd(@Validated(value = AlbumParam.cateAdd.class) @RequestBody AlbumParam albumParam) {
+        iAlbumService.cateAdd(albumParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 相册分类重命名
+     *
+     * @author fzr
+     * @return Object
+     */
+    @Log(title = "相册分类重命名")
+    @PostMapping("/cateRename")
+    public Object cateRename(@Validated(value = AlbumParam.rename.class) @RequestBody AlbumParam albumParam) {
+        iAlbumService.cateRename(albumParam.getId(), albumParam.getName());
+        return AjaxResult.success();
+    }
+
+    /**
+     * 相册分类删除
+     *
+     * @author fzr
+     * @return Object
+     */
+    @Log(title = "相册分类删除")
+    @PostMapping("/cateDel")
+    public Object cateDel(@Validated(value = AlbumParam.delete.class) @RequestBody AlbumParam albumParam) {
+        iAlbumService.cateDel(albumParam.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 58 - 0
like-admin/src/main/java/com/mdd/admin/controller/common/IndexController.java

@@ -0,0 +1,58 @@
+package com.mdd.admin.controller.common;
+
+import com.mdd.admin.service.common.IIndexService;
+import com.mdd.common.core.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 主页管理
+ */
+@Api(tags = "工作台")
+@Slf4j
+@RestController
+@RequestMapping("api/common/index")
+public class IndexController {
+
+    @Resource
+    IIndexService iIndexService;
+
+    /**
+     * 控制台
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/console")
+    public Object console() {
+        Map<String, Object> map = iIndexService.console();
+        return AjaxResult.success(map);
+    }
+
+    @ApiOperation(value = "工作台")
+    @GetMapping("/workbench")
+    public Object workbench() {
+        Map<String, Object> map = iIndexService.workbench();
+        return AjaxResult.success(map);
+    }
+
+    /**
+     * 公共配置
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/config")
+    public Object config() {
+        Map<String, Object> map = iIndexService.config();
+        return AjaxResult.success(map);
+    }
+
+}

+ 119 - 0
like-admin/src/main/java/com/mdd/admin/controller/common/UploadController.java

@@ -0,0 +1,119 @@
+package com.mdd.admin.controller.common;
+
+import com.mdd.admin.LikeAdminThreadLocal;
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.common.IAlbumService;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.enums.AlbumEnum;
+import com.mdd.common.exception.OperateException;
+import com.mdd.common.plugin.storage.StorageDriver;
+import com.mdd.common.utils.StringUtil;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartRequest;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * 上传管理
+ */
+@RestController
+@RequestMapping("api/common/upload")
+public class UploadController {
+
+    @Resource
+    IAlbumService iAlbumService;
+
+    /**
+     * 上传图片
+     *
+     * @author fzr
+     * @param request 请求对象
+     * @return Object
+     */
+    @Log(title = "上传图片")
+    @PostMapping("/image")
+    public Object image(HttpServletRequest request) {
+        MultipartFile multipartFile;
+        try {
+            multipartFile = ((MultipartRequest) request).getFile("file");
+        } catch (Exception e) {
+            return AjaxResult.failed("请正确选择上传图片");
+        }
+
+        if (multipartFile == null) {
+            return AjaxResult.failed("请选择上传图片");
+        }
+
+        try {
+            StorageDriver storageDriver = new StorageDriver();
+            Map<String, Object> map = storageDriver.upload(multipartFile, "image", AlbumEnum.IMAGE.getCode());
+            String cid = StringUtil.isNotEmpty(request.getParameter("cid")) ? request.getParameter("cid") : "0";
+
+            Map<String, String> album = new LinkedHashMap<>();
+            album.put("aid", String.valueOf(LikeAdminThreadLocal.getAdminId()));
+            album.put("cid", cid);
+            album.put("type", String.valueOf(AlbumEnum.IMAGE.getCode()));
+            album.put("size", map.get("size").toString());
+            album.put("ext", map.get("ext").toString());
+            album.put("url", map.get("url").toString());
+            album.put("name", map.get("name").toString());
+            Integer id = iAlbumService.albumAdd(album);
+
+            map.put("id", id);
+
+            return AjaxResult.success(map);
+        } catch (OperateException e) {
+            return AjaxResult.failed(e.getMsg());
+        }
+    }
+
+    /**
+     * 上传视频
+     *
+     * @author fzr
+     * @param request 请求对象
+     * @return Object
+     */
+    @Log(title = "上传视频")
+    @PostMapping("/video")
+    public Object video(HttpServletRequest request) {
+        MultipartFile multipartFile;
+        try {
+            multipartFile = ((MultipartRequest) request).getFile("file");
+        } catch (Exception e) {
+            return AjaxResult.failed("请正确选择上传视频");
+        }
+
+        if (multipartFile == null) {
+            return AjaxResult.failed("请选择上传视频");
+        }
+
+        try {
+            StorageDriver storageDriver = new StorageDriver();
+            Map<String, Object> map = storageDriver.upload(multipartFile, "video", AlbumEnum.Video.getCode());
+            String cid = StringUtil.isNotEmpty(request.getParameter("cid")) ? request.getParameter("cid") : "0";
+
+            Map<String, String> album = new LinkedHashMap<>();
+            album.put("cid", cid);
+            album.put("aid", String.valueOf(LikeAdminThreadLocal.getAdminId()));
+            album.put("type", String.valueOf(AlbumEnum.Video.getCode()));
+            album.put("ext", map.get("ext").toString());
+            album.put("size", map.get("size").toString());
+            album.put("url", map.get("url").toString());
+            Integer id = iAlbumService.albumAdd(album);
+
+            map.put("id", id);
+
+            return AjaxResult.success(map);
+        } catch (OperateException e) {
+            return AjaxResult.failed(e.getMsg());
+        }
+    }
+
+}

+ 77 - 0
like-admin/src/main/java/com/mdd/admin/controller/coupon/CouponController.java

@@ -0,0 +1,77 @@
+package com.mdd.admin.controller.coupon;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.coupon.ICouponService;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.validate.coupon.CouponValidate;
+import com.mdd.admin.vo.coupon.CouponListVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.validator.annotation.IDMust;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+@Slf4j
+@RestController
+@RequestMapping("/api/coupon")
+public class CouponController {
+
+    @Resource
+    private ICouponService iCouponService;
+
+    /**
+     * @param pageParam 分页参数
+     * @param params 搜索参数
+     * @return Object
+     */
+    @GetMapping("/list")
+    public AjaxResult list(@Validated PageParam pageParam,
+                           @RequestParam Map<String, String> params){
+        PageResult<CouponListVo> list = iCouponService.list(pageParam, params);
+        return AjaxResult.success(list);
+    }
+
+    @Log(title = "新增优惠券")
+    @PostMapping("/create")
+    public AjaxResult create(@Validated(value = CouponValidate.create.class)
+                             @RequestBody CouponValidate couponValidate){
+        iCouponService.create(couponValidate);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "编辑优惠券")
+    @PostMapping("/edit")
+    public AjaxResult edit(@Validated(value = CouponValidate.update.class)
+                             @RequestBody CouponValidate couponValidate){
+        iCouponService.edit(couponValidate);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "删除优惠券")
+    @PostMapping("/delete")
+    public AjaxResult delete(@Validated(value = CouponValidate.delete.class)
+                             @RequestBody CouponValidate couponValidate){
+        iCouponService.delete(couponValidate.getId());
+        return AjaxResult.success();
+    }
+
+    @Log(title = "开始优惠券")
+    @GetMapping("/start")
+    public AjaxResult start(@Validated @IDMust(message = "id必须存在且大于等于0")
+                            @RequestParam Integer id){
+        iCouponService.start(id);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "停止优惠券")
+    @GetMapping("/stop")
+    public AjaxResult stop(@Validated @IDMust(message = "id必须存在且大于等于0")
+                            @RequestParam Integer id){
+        iCouponService.stop(id);
+        return AjaxResult.success();
+    }
+}

+ 30 - 0
like-admin/src/main/java/com/mdd/admin/controller/coupon/CouponReceiveLogController.java

@@ -0,0 +1,30 @@
+package com.mdd.admin.controller.coupon;
+
+import com.mdd.admin.service.coupon.ICouponReceiveLogService;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.vo.coupon.CouponReceiveLogListVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api/coupon/receive/log")
+public class CouponReceiveLogController {
+
+    @Resource
+    private ICouponReceiveLogService iCouponReceiveLogService;
+
+    @GetMapping("/list")
+    public AjaxResult list(@Validated PageParam pageParam,
+                           @RequestParam Map<String, String> params){
+        PageResult<CouponReceiveLogListVo> list = iCouponReceiveLogService.list(pageParam, params);
+        return AjaxResult.success(list);
+    }
+}

+ 103 - 0
like-admin/src/main/java/com/mdd/admin/controller/crontab/CrontabController.java

@@ -0,0 +1,103 @@
+package com.mdd.admin.controller.crontab;
+
+import com.mdd.admin.service.crontab.ICrontabService;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.validate.crontab.CrontabCreateValidate;
+import com.mdd.admin.validate.crontab.CrontabUpdateValidate;
+import com.mdd.admin.vo.crontab.CrontabDetailVo;
+import com.mdd.admin.vo.crontab.CrontabListedVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.validator.annotation.IDMust;
+import org.quartz.SchedulerException;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.constraints.NotNull;
+import java.text.ParseException;
+
+@RestController
+@RequestMapping("api/crontab")
+public class CrontabController {
+
+    @Resource
+    ICrontabService iCrontabService;
+
+    /**
+     * 计划任务列表
+     *
+     * @author fzr
+     * @param pageParam 分页参数
+     * @return AjaxResult< PageResult<CrontabListedVo>>
+     */
+    @GetMapping("/list")
+    public AjaxResult list(@Validated PageParam pageParam) {
+        PageResult<CrontabListedVo> list = iCrontabService.list(pageParam);
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 计划任务详情
+     *
+     * @author fzr
+     * @param id 主键
+     * @return AjaxResult<Object>
+     */
+    @GetMapping("/detail")
+    public AjaxResult detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        CrontabDetailVo vo = iCrontabService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    /**
+     * 计划任务新增
+     *
+     * @author fzr
+     * @param createValidate 参数
+     * @return AjaxResult<Object>
+     */
+    @PostMapping("/add")
+    public AjaxResult add(@Validated @RequestBody CrontabCreateValidate createValidate) throws SchedulerException {
+        iCrontabService.add(createValidate);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 计划任务编辑
+     *
+     * @author fzr
+     * @param updateValidate 参数
+     * @return AjaxResult<Object>
+     */
+    @PostMapping("/edit")
+    public AjaxResult edit(@Validated @RequestBody CrontabUpdateValidate updateValidate) throws SchedulerException {
+        iCrontabService.edit(updateValidate);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 计划任务删除
+     *
+     * @author fzr
+     * @param idValidate 参数
+     * @return AjaxResult<Object>
+     */
+    @PostMapping("/del")
+    public AjaxResult del(@Validated @RequestBody com.mdd.admin.validate.IdValidate idValidate) throws SchedulerException {
+        iCrontabService.del(idValidate.getId());
+        return AjaxResult.success();
+    }
+
+    /**
+     * 获取定时任务执行时间
+     * @param expression 定时任务表达式
+     * @return Object
+     * @throws ParseException
+     */
+    @GetMapping("/expression")
+    public AjaxResult expression(@Validated @NotNull() @RequestParam("expression") String expression) throws ParseException {
+        return AjaxResult.success(iCrontabService.expression(expression));
+    }
+
+}

+ 37 - 0
like-admin/src/main/java/com/mdd/admin/controller/decorate/DataController.java

@@ -0,0 +1,37 @@
+package com.mdd.admin.controller.decorate;
+
+import com.mdd.admin.service.decorate.IDecorateDataService;
+import com.mdd.common.core.AjaxResult;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 装修数据管理
+ */
+@RestController("decorateDataController")
+@RequestMapping("api/decorate/data")
+public class DataController {
+
+    @Resource
+    IDecorateDataService iDecorateDataService;
+
+    /**
+     * 获取文章数据
+     *
+     * @author fzr
+     * @param limit 条数
+     * @return Object
+     */
+    @GetMapping("/article")
+    public Object article(@RequestParam(defaultValue = "10") Integer limit) {
+        List<Map<String, Object>> list = iDecorateDataService.article(limit);
+        return AjaxResult.success(list);
+    }
+
+}

+ 51 - 0
like-admin/src/main/java/com/mdd/admin/controller/decorate/PagesController.java

@@ -0,0 +1,51 @@
+package com.mdd.admin.controller.decorate;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.decorate.IDecoratePageService;
+import com.mdd.admin.validate.decorate.DecoratePageParam;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.validator.annotation.IDMust;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 页面装修管理
+ */
+@RestController("decoratePagesController")
+@RequestMapping("api/decorate/pages")
+public class PagesController {
+
+    @Resource
+    IDecoratePageService iDecoratePageService;
+
+    /**
+     * 页面装修详情
+     *
+     * @author fzr
+     * @param id 主键
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        Map<String, Object> map = iDecoratePageService.detail(id);
+        return AjaxResult.success(map);
+    }
+
+    /**
+     * 页面装修保存
+     *
+     * @author fzr
+     * @param decoratePageParam 参数
+     * @return Object
+     */
+    @Log(title = "页面装修保存")
+    @PostMapping("/save")
+    public Object save(@RequestBody DecoratePageParam decoratePageParam) {
+        iDecoratePageService.save(decoratePageParam);
+        return AjaxResult.success();
+    }
+
+}

+ 45 - 0
like-admin/src/main/java/com/mdd/admin/controller/decorate/TabbarController.java

@@ -0,0 +1,45 @@
+package com.mdd.admin.controller.decorate;
+
+import com.mdd.admin.service.decorate.IDecorateTabbarService;
+import com.mdd.common.core.AjaxResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 装修底部导航管理
+ */
+@RestController("decorateTabbarController")
+@RequestMapping("api/decorate/tabbar")
+public class TabbarController {
+
+    @Resource
+    IDecorateTabbarService iDecorateTabbarService;
+
+    /**
+     * 底部导航详情
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail() {
+        Map<String, Object> detail = iDecorateTabbarService.detail();
+        return AjaxResult.success(detail);
+    }
+
+    /**
+     * 底部导航保存
+     *
+     * @author fzr
+     * @param params 参数
+     * @return Object
+     */
+    @PostMapping("/save")
+    public Object save(@RequestBody Map<String, Object> params) {
+        iDecorateTabbarService.save(params);
+        return AjaxResult.success();
+    }
+
+}

+ 116 - 0
like-admin/src/main/java/com/mdd/admin/controller/goods/GoodsCategoryController.java

@@ -0,0 +1,116 @@
+package com.mdd.admin.controller.goods;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.category.IGoodsCategoryService;
+import com.mdd.admin.validate.category.GoodsCategoryParam;
+import com.mdd.admin.validate.category.GoodsCategoryStatus;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.vo.category.GoodsCategoryDetailVo;
+import com.mdd.admin.vo.category.GoodsCategoryListVo;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.validator.annotation.IDMust;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 服务分类管理
+ */
+@Api(tags = "服务分类管理")
+@RestController
+@RequestMapping("api/category")
+public class GoodsCategoryController {
+
+    @Resource
+    IGoodsCategoryService iGoodsCategoryService;
+
+    /**
+     * 服务分类列表
+     *
+     * @param params    搜索参数
+     * @return Object
+     */
+    @ApiOperation(value = "服务分类管理 - 分页列表")
+    @GetMapping("/list")
+    public List<GoodsCategoryListVo> list(@RequestParam Map<String, String> params) {
+        return iGoodsCategoryService.list(params);
+    }
+
+    /**
+     * 获取一级父类服务分类
+     *
+     * @return Object
+     */
+    @ApiOperation(value = "服务分类管理 - 获取一级父类服务分类")
+    @GetMapping("/commonList")
+    public List<GoodsCategoryListVo> pid() {
+        return iGoodsCategoryService.listPid();
+    }
+
+    /**
+     * 修改服务的状态
+     *
+     * @return Object
+     */
+    @ApiOperation(value = "服务分类管理 - 修改服务的状态")
+    @PostMapping("/status")
+    public void updateStatus(@RequestBody GoodsCategoryStatus goodsCategoryStatus) {
+        iGoodsCategoryService.updateStatus(goodsCategoryStatus.getId(), goodsCategoryStatus.getIsShow());
+    }
+
+    /**
+     * 服务分类详情
+     *
+     * @param id 主键ID
+     * @return Object
+     */
+    @ApiOperation(value = "服务分类管理 - 服务分类详情")
+    @GetMapping("/detail")
+    public GoodsCategoryDetailVo detail(@Validated @IDMust() @RequestParam("id") Long id) {
+        return iGoodsCategoryService.detail(id);
+    }
+
+    /**
+     * 服务分类新增
+     *
+     * @param goodsCategoryParam 参数
+     * @return Object
+     */
+    @ApiOperation(value = "服务分类管理 - 服务分类新增")
+    @Log(title = "服务分类新增")
+    @PostMapping("/add")
+    public void add(@Validated(value = GoodsCategoryParam.create.class) @RequestBody GoodsCategoryParam goodsCategoryParam) {
+        iGoodsCategoryService.add(goodsCategoryParam);
+    }
+
+    /**
+     * 服务分类编辑
+     *
+     * @param goodsCategoryParam 参数
+     * @return Object
+     */
+    @ApiOperation(value = "服务分类管理 - 服务分类编辑")
+    @Log(title = "服务分类编辑")
+    @PostMapping("/edit")
+    public void edit(@Validated(value = GoodsCategoryParam.update.class) @RequestBody GoodsCategoryParam goodsCategoryParam) {
+        iGoodsCategoryService.edit(goodsCategoryParam);
+    }
+
+    /**
+     * 服务分类删除
+     *
+     * @return Object
+     */
+    @ApiOperation(value = "服务分类管理 - 服务分类删除")
+    @Log(title = "服务分类删除")
+    @GetMapping("/del")
+    public void del(@RequestParam("id") Long id) {
+        iGoodsCategoryService.del(id);
+    }
+
+}

+ 104 - 0
like-admin/src/main/java/com/mdd/admin/controller/goods/GoodsCommentController.java

@@ -0,0 +1,104 @@
+package com.mdd.admin.controller.goods;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.comment.IGoodsCommentService;
+import com.mdd.admin.validate.comment.GoodsCommentPageParam;
+import com.mdd.admin.validate.comment.GoodsCommentReplyParam;
+import com.mdd.admin.vo.comment.GoodsCommentListVo;
+import com.mdd.common.core.PageResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * 服务评价管理
+ */
+@Api(tags = "服务评价管理")
+@RestController
+@RequestMapping("api/comment")
+public class GoodsCommentController {
+
+    @Resource
+    IGoodsCommentService iGoodsCommentService;
+
+    /**
+     * 服务评价列表
+     *
+     * @param params 搜索参数
+     * @return Object
+     */
+    @ApiOperation(value = "服务评价管理 - 分页列表")
+    @PostMapping("/list")
+    public PageResult<GoodsCommentListVo> list(@RequestBody GoodsCommentPageParam params) {
+        PageResult<GoodsCommentListVo> list = iGoodsCommentService.list(params);
+        return list;
+    }
+
+    /**
+     * 服务评价列表
+     *
+     * @param params 搜索参数
+     * @return Object
+     */
+    @ApiOperation(value = "服务评价管理 - 回复")
+    @PostMapping("/reply")
+    public void reply(@RequestBody GoodsCommentReplyParam params) {
+        iGoodsCommentService.replyComment(params);
+    }
+
+    /**
+     * 服务评价删除
+     *
+     * @return Object
+     */
+    @ApiOperation(value = "服务评价删除")
+    @Log(title = "服务评价删除")
+    @GetMapping("/del")
+    public void del(@RequestParam("id") Long id) {
+        iGoodsCommentService.del(id);
+    }
+
+   /* *//**
+     * 服务评价详情
+     *
+     * @param id 主键ID
+     * @return Object
+     *//*
+    @Deprecated
+    @ApiOperation(value = "服务评价管理 - 详情")
+    @GetMapping("/detail")
+    public GoodsCommentDetailVo detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        GoodsCommentDetailVo detail = iGoodsCommentService.detail(id);
+        return detail;
+    }
+
+    *//**
+     * 服务评价新增
+     *
+     * @param goodsCommentParam 参数
+     * @return Object
+     *//*
+    @Deprecated
+    @ApiOperation(value = "服务评价新增")
+    @Log(title = "服务评价新增")
+    @PostMapping("/add")
+    public void add(@Validated(value = GoodsCommentParam.create.class) @RequestBody GoodsCommentParam goodsCommentParam) {
+        iGoodsCommentService.add(goodsCommentParam);
+    }
+
+    *//**
+     * 服务评价编辑
+     *
+     * @param goodsCommentParam 参数
+     * @return Object
+     *//*
+    @Deprecated
+    @ApiOperation(value = "服务评价编辑")
+    @Log(title = "服务评价编辑")
+    @PostMapping("/edit")
+    public void edit(@Validated(value = GoodsCommentParam.update.class) @RequestBody GoodsCommentParam goodsCommentParam) {
+        iGoodsCommentService.edit(goodsCommentParam);
+    }*/
+}

+ 130 - 0
like-admin/src/main/java/com/mdd/admin/controller/goods/GoodsController.java

@@ -0,0 +1,130 @@
+package com.mdd.admin.controller.goods;
+
+import com.google.common.collect.Lists;
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.goods.IGoodsService;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.validate.goods.GoodsBatchParam;
+import com.mdd.admin.validate.goods.GoodsParam;
+import com.mdd.admin.vo.goods.GoodsDetailVo;
+import com.mdd.admin.vo.goods.GoodsListVo;
+import com.mdd.admin.vo.goods.StatisticsGoodsVo;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.validator.annotation.IDMust;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 服务管理
+ */
+@Api(tags = "服务管理")
+@RestController
+@RequestMapping("api/goods")
+public class GoodsController {
+
+    @Resource
+    IGoodsService iGoodsService;
+
+    /**
+     * 服务列表
+     *
+     * @param pageParam 分页参数
+     * @param params    搜索参数
+     * @return Object
+     */
+    @ApiOperation(value = "服务管理 - 分页列表")
+    @GetMapping("/list")
+    public PageResult<GoodsListVo> list(@Validated PageParam pageParam,
+                                        @RequestParam Map<String, String> params) {
+        return iGoodsService.list(pageParam, params);
+    }
+
+    /**
+     * @return java.lang.Object
+     * @Author slien
+     * @Description 统计状态数据
+     * @Date 10:17 2022/10/7
+     * @Param [pageParam, params]
+     **/
+    @ApiOperation(value = "服务管理 - 统计状态数据")
+    @GetMapping("/statistics")
+    public StatisticsGoodsVo statistics(@RequestParam Map<String, String> params) {
+        return iGoodsService.statistics(params);
+    }
+
+    /**
+     * 服务详情
+     *
+     * @param id 主键ID
+     * @return Object
+     */
+    @ApiOperation(value = "服务管理 - 服务详情")
+    @GetMapping("/detail")
+    public GoodsDetailVo detail(@Validated @IDMust() @RequestParam("id") Long id) {
+        return iGoodsService.detail(id);
+    }
+
+    /**
+     * 服务新增
+     *
+     * @param goodsParam 参数
+     * @return Object
+     */
+    @ApiOperation(value = "服务管理 - 服务新增")
+    @Log(title = "服务新增")
+    @PostMapping("/add")
+    public void add(@Validated(value = GoodsParam.create.class) @RequestBody GoodsParam goodsParam) {
+        iGoodsService.add(goodsParam);
+    }
+
+    /**
+     * 服务编辑
+     *
+     * @param goodsParam 参数
+     * @return Object
+     */
+    @ApiOperation(value = "服务管理 - 服务编辑")
+    @Log(title = "服务编辑")
+    @PostMapping("/edit")
+    public void edit(@Validated(value = GoodsParam.update.class) @RequestBody GoodsParam goodsParam) {
+        iGoodsService.edit(goodsParam);
+    }
+
+    /**
+     * 服务删除
+     *
+     * @param goodsParam 参数
+     * @return Object
+     */
+    @ApiOperation(value = "服务管理 - 服务批量删除")
+    @Log(title = "服务批量删除")
+    @PostMapping("/del")
+    public void del(@Validated @RequestBody GoodsBatchParam goodsParam) {
+        iGoodsService.del(goodsParam.getIds());
+    }
+
+    @ApiOperation(value = "服务管理 - 服务删除")
+    @Log(title = "服务删除")
+    @GetMapping("/del")
+    public void del(@Validated @RequestParam("id") Long id) {
+        iGoodsService.del(Lists.newArrayList(id));
+    }
+
+    /**
+     * 服务删除
+     *
+     * @param goodsParam 参数
+     * @return Object
+     */
+    @ApiOperation(value = "服务管理 - 服务批量状态修改")
+    @Log(title = "服务状态修改")
+    @PostMapping("/status")
+    public void updateStatus(@Validated @RequestBody GoodsBatchParam goodsParam) {
+        iGoodsService.updateStatus(goodsParam.getIds(), goodsParam.getStatus());
+    }
+}

+ 94 - 0
like-admin/src/main/java/com/mdd/admin/controller/goods/GoodsUnitController.java

@@ -0,0 +1,94 @@
+package com.mdd.admin.controller.goods;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.unit.IGoodsUnitService;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.validate.unit.GoodsUnitParam;
+import com.mdd.admin.vo.unit.GoodsUnitDetailVo;
+import com.mdd.admin.vo.unit.GoodsUnitListVo;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.validator.annotation.IDMust;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 服务单位管理
+ */
+@Api(tags = "服务单位管理")
+@RestController
+@RequestMapping("api/unit")
+public class GoodsUnitController {
+
+    @Resource
+    IGoodsUnitService iGoodsUnitService;
+
+    /**
+     * 服务单位列表
+     *
+     * @param pageParam 分页参数
+     * @param params    搜索参数
+     * @return Object
+     */
+    @ApiOperation(value = "服务单位管理 - 分页列表")
+    @GetMapping("/list")
+    public PageResult<GoodsUnitListVo> list(@Validated PageParam pageParam,
+                                            @RequestParam Map<String, String> params) {
+        return iGoodsUnitService.list(pageParam, params);
+    }
+
+    /**
+     * 服务单位详情
+     *
+     * @param id 主键ID
+     * @return Object
+     */
+    @ApiOperation(value = "服务单位管理 - 服务单位详情")
+    @GetMapping("/detail")
+    public GoodsUnitDetailVo detail(@Validated @IDMust() @RequestParam("id") Long id) {
+        return iGoodsUnitService.detail(id);
+    }
+
+    /**
+     * 服务单位新增
+     *
+     * @param goodsUnitParam 参数
+     * @return Object
+     */
+    @ApiOperation(value = "服务单位管理 - 服务单位新增")
+    @Log(title = "服务单位新增")
+    @PostMapping("/add")
+    public void add(@Validated(value = GoodsUnitParam.create.class) @RequestBody GoodsUnitParam goodsUnitParam) {
+        iGoodsUnitService.add(goodsUnitParam);
+    }
+
+    /**
+     * 服务单位编辑
+     *
+     * @param goodsUnitParam 参数
+     * @return Object
+     */
+    @ApiOperation(value = "服务单位管理 - 服务单位编辑")
+    @Log(title = "服务单位编辑")
+    @PostMapping("/edit")
+    public void edit(@Validated(value = GoodsUnitParam.update.class) @RequestBody GoodsUnitParam goodsUnitParam) {
+        iGoodsUnitService.edit(goodsUnitParam);
+    }
+
+    /**
+     * 服务单位删除
+     *
+     * @return Object
+     */
+    @ApiOperation(value = "服务单位管理 - 服务单位删除")
+    @Log(title = "服务单位删除")
+    @GetMapping("/del")
+    public void del(@RequestParam("id") Long id) {
+        iGoodsUnitService.del(id);
+    }
+
+}

+ 76 - 0
like-admin/src/main/java/com/mdd/admin/controller/image/GoodsImageController.java

@@ -0,0 +1,76 @@
+package com.mdd.admin.controller.image;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.image.IGoodsImageService;
+import com.mdd.admin.validate.image.GoodsImageParam;
+import com.mdd.admin.vo.image.GoodsImageDetailVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.validator.annotation.IDMust;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * 服务轮播图管理
+ */
+@Deprecated
+@RestController
+@RequestMapping("api/image")
+public class GoodsImageController {
+
+    @Resource
+    IGoodsImageService iGoodsImageService;
+
+    /**
+     * 服务轮播图详情
+     *
+     * @param id 主键ID
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        GoodsImageDetailVo detail = iGoodsImageService.detail(id);
+        return AjaxResult.success(detail);
+    }
+
+    /**
+     * 服务轮播图新增
+     *
+     * @param goodsImageParam 参数
+     * @return Object
+     */
+    @Log(title = "服务轮播图新增")
+    @PostMapping("/add")
+    public Object add(@Validated(value = GoodsImageParam.create.class) @RequestBody GoodsImageParam goodsImageParam) {
+        iGoodsImageService.add(goodsImageParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 服务轮播图编辑
+     *
+     * @param goodsImageParam 参数
+     * @return Object
+     */
+    @Log(title = "服务轮播图编辑")
+    @PostMapping("/edit")
+    public Object edit(@Validated(value = GoodsImageParam.update.class) @RequestBody GoodsImageParam goodsImageParam) {
+        iGoodsImageService.edit(goodsImageParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 服务轮播图删除
+     *
+     * @param goodsImageParam 参数
+     * @return Object
+     */
+    @Log(title = "服务轮播图删除")
+    @PostMapping("/del")
+    public Object del(@Validated(value = GoodsImageParam.delete.class) @RequestBody GoodsImageParam goodsImageParam) {
+        iGoodsImageService.del(goodsImageParam.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 92 - 0
like-admin/src/main/java/com/mdd/admin/controller/jobs/JobsController.java

@@ -0,0 +1,92 @@
+package com.mdd.admin.controller.jobs;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.jobs.IJobsService;
+import com.mdd.admin.validate.jobs.JobsParam;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.vo.jobs.JobsListVo;
+import com.mdd.admin.vo.jobs.JobsDetailVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.validator.annotation.IDMust;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 岗位管理
+ */
+@RestController
+@RequestMapping("api/jobs")
+public class JobsController {
+
+    @Resource
+    IJobsService iJobsService;
+
+    /**
+     * 岗位列表
+     *
+     * @param pageParam 分页参数
+     * @param params 搜索参数
+     * @return Object
+     */
+    @GetMapping("/list")
+    public Object list(@Validated PageParam pageParam,
+                       @RequestParam Map<String, String> params) {
+        PageResult<JobsListVo> list = iJobsService.list(pageParam, params);
+        return AjaxResult.success(list);
+    }
+    /**
+     * 岗位详情
+     *
+     * @param id 主键ID
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        JobsDetailVo detail = iJobsService.detail(id);
+        return AjaxResult.success(detail);
+    }
+
+    /**
+     * 岗位新增
+     *
+     * @param jobsParam 参数
+     * @return Object
+     */
+    @Log(title = "岗位新增")
+    @PostMapping("/add")
+    public Object add(@Validated(value = JobsParam.create.class) @RequestBody JobsParam jobsParam) {
+        iJobsService.add(jobsParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 岗位编辑
+     *
+     * @param jobsParam 参数
+     * @return Object
+     */
+    @Log(title = "岗位编辑")
+    @PostMapping("/edit")
+    public Object edit(@Validated(value = JobsParam.update.class) @RequestBody JobsParam jobsParam) {
+        iJobsService.edit(jobsParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 岗位删除
+     *
+     * @param jobsParam 参数
+     * @return Object
+     */
+    @Log(title = "岗位删除")
+    @PostMapping("/del")
+    public Object del(@Validated(value = JobsParam.delete.class) @RequestBody JobsParam jobsParam) {
+        //iJobsService.del(jobsParam.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 39 - 0
like-admin/src/main/java/com/mdd/admin/controller/log/OrderRefundLogController.java

@@ -0,0 +1,39 @@
+package com.mdd.admin.controller.log;
+
+import com.mdd.admin.service.log.IOrderRefundLogService;
+import com.mdd.admin.vo.log.OrderRefundLogDetailVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.validator.annotation.IDMust;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 订单退款日志管理
+ */
+@Deprecated
+@RestController
+@RequestMapping("api/refund/log")
+public class OrderRefundLogController {
+
+    @Resource
+    IOrderRefundLogService iOrderRefundLogService;
+
+    /**
+     * 订单退款日志详情
+     *
+     * @param refundId 主键ID
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("refundId") Long refundId) {
+        List<OrderRefundLogDetailVo> detail = iOrderRefundLogService.detail(refundId);
+        return AjaxResult.success(detail);
+    }
+
+}

+ 92 - 0
like-admin/src/main/java/com/mdd/admin/controller/log/SmsLogController.java

@@ -0,0 +1,92 @@
+package com.mdd.admin.controller.log;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.log.ISmsLogService;
+import com.mdd.admin.validate.log.SmsLogParam;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.vo.log.SmsLogListVo;
+import com.mdd.admin.vo.log.SmsLogDetailVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.validator.annotation.IDMust;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 短信发送记录管理
+ */
+@RestController
+@RequestMapping("api/sms/log")
+public class SmsLogController {
+
+    @Resource
+    ISmsLogService iSmsLogService;
+
+    /**
+     * 短信发送记录列表
+     *
+     * @param pageParam 分页参数
+     * @param params 搜索参数
+     * @return Object
+     */
+    @GetMapping("/list")
+    public Object list(@Validated PageParam pageParam,
+                       @RequestParam Map<String, String> params) {
+        PageResult<SmsLogListVo> list = iSmsLogService.list(pageParam, params);
+        return AjaxResult.success(list);
+    }
+    /**
+     * 短信发送记录详情
+     *
+     * @param id 主键ID
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        SmsLogDetailVo detail = iSmsLogService.detail(id);
+        return AjaxResult.success(detail);
+    }
+
+    /**
+     * 短信发送记录新增
+     *
+     * @param smsLogParam 参数
+     * @return Object
+     */
+    @Log(title = "短信发送记录新增")
+    @PostMapping("/add")
+    public Object add(@Validated(value = SmsLogParam.create.class) @RequestBody SmsLogParam smsLogParam) {
+        iSmsLogService.add(smsLogParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 短信发送记录编辑
+     *
+     * @param smsLogParam 参数
+     * @return Object
+     */
+    @Log(title = "短信发送记录编辑")
+    @PostMapping("/edit")
+    public Object edit(@Validated(value = SmsLogParam.update.class) @RequestBody SmsLogParam smsLogParam) {
+        iSmsLogService.edit(smsLogParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 短信发送记录删除
+     *
+     * @param smsLogParam 参数
+     * @return Object
+     */
+    @Log(title = "短信发送记录删除")
+    @PostMapping("/del")
+    public Object del(@Validated(value = SmsLogParam.delete.class) @RequestBody SmsLogParam smsLogParam) {
+       // iSmsLogService.del(smsLogParam.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 61 - 0
like-admin/src/main/java/com/mdd/admin/controller/monitor/CacheController.java

@@ -0,0 +1,61 @@
+package com.mdd.admin.controller.monitor;
+
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.utils.StringUtil;
+import org.springframework.data.redis.connection.RedisServerCommands;
+import org.springframework.data.redis.core.RedisCallback;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+/**
+ * 缓存监控管理
+ */
+@RestController(value = "monitorCacheController")
+@RequestMapping("api/monitor")
+public class CacheController {
+
+    @Resource
+    private RedisTemplate<String, String> redisTemplate;
+
+    /**
+     * 缓存监控
+     *
+     * @author fzr
+     * @return Object
+     */
+    @Log(title = "缓存监控")
+    @GetMapping("/cache")
+    public Object info() {
+        Properties info = (Properties) redisTemplate.execute((RedisCallback<Object>) RedisServerCommands::info);
+        Properties commandStats = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info("commandstats"));
+        Object dbSize = redisTemplate.execute((RedisCallback<Object>) RedisServerCommands::dbSize);
+
+        if (commandStats == null) {
+            return AjaxResult.failed("获取异常");
+        }
+
+        Map<String, Object> result = new HashMap<>(3);
+        result.put("info", info);
+        result.put("dbSize", dbSize);
+
+        List<Map<String, String>> pieList = new ArrayList<>();
+        commandStats.stringPropertyNames().forEach(key -> {
+            Map<String, String> data = new HashMap<>(2);
+            String property = commandStats.getProperty(key);
+            data.put("name", StringUtil.removeStart(key, "cmdstat_"));
+            data.put("value", StringUtil.substringBetween(property, "calls=", ",usec"));
+            pieList.add(data);
+        });
+
+        result.put("commandStats", pieList);
+        return AjaxResult.success(result);
+    }
+
+}

+ 30 - 0
like-admin/src/main/java/com/mdd/admin/controller/monitor/ServerController.java

@@ -0,0 +1,30 @@
+package com.mdd.admin.controller.monitor;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.ServerResult;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 服务监控管理
+ */
+@RestController(value = "monitorServerController")
+@RequestMapping("api/monitor")
+public class ServerController {
+
+    /**
+     * 服务器信息
+     *
+     * @author fzr
+     * @return Object
+     */
+    @Log(title = "服务监控")
+    @GetMapping("/server")
+    public Object info() {
+        ServerResult server = new ServerResult();
+        return AjaxResult.success(server.copyTo());
+    }
+
+}

+ 164 - 0
like-admin/src/main/java/com/mdd/admin/controller/order/OrderController.java

@@ -0,0 +1,164 @@
+package com.mdd.admin.controller.order;
+
+import com.alipay.api.AlipayApiException;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.mdd.admin.LikeAdminThreadLocal;
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.order.IOrderService;
+import com.mdd.admin.validate.order.OrderPageParam;
+import com.mdd.admin.vo.order.OrderDetailVo;
+import com.mdd.admin.vo.order.OrderListVo;
+import com.mdd.admin.vo.order.StatisticsOrderVo;
+import com.mdd.common.core.PageResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * 订单管理
+ */
+@Api(tags = "订单管理")
+@RestController
+@RequestMapping("api/order")
+public class OrderController {
+
+    @Resource
+    IOrderService iOrderService;
+
+    /**
+     * 订单列表
+     *
+     * @param params 搜索参数
+     * @return Object
+     */
+    @ApiOperation(value = "订单管理 - 列表")
+    @PostMapping("/list")
+    public PageResult<OrderListVo> list(@Validated @RequestBody OrderPageParam params) {
+        return iOrderService.list(params);
+    }
+
+    /**
+     * 订单详情
+     *
+     * @param id 主键ID
+     * @return Object
+     */
+    @ApiOperation(value = "订单管理 - 订单详情")
+    @GetMapping("/detail")
+    public OrderDetailVo detail(@Validated @RequestParam("id") Long id) {
+        return iOrderService.detail(id);
+    }
+
+    /**
+     * @return java.lang.Object
+     * @Author slien
+     * @Description 统计订单状态的数据
+     * @Date 11:47 2022/10/11
+     * @Param []
+     **/
+    @ApiOperation(value = "订单管理 - 统计订单状态的数据")
+    @GetMapping("/statistics")
+    public StatisticsOrderVo statistics() {
+        return iOrderService.statistics();
+    }
+
+    /**
+     * @return java.lang.Object
+     * @Author slien
+     * @Description 商家备注
+     * @Date 11:47 2022/10/11
+     * @Param []
+     **/
+    @ApiOperation(value = "订单管理 - 商家备注")
+    @GetMapping("/remark")
+    public void remark(@RequestParam("id") Long id, @RequestParam(value = "remark", required = false) String remark) {
+        Integer userId = LikeAdminThreadLocal.getAdminId();
+        iOrderService.remark(id, userId, remark);
+    }
+
+    /**
+     * @return java.lang.Object
+     * @Author slien
+     * @Description 后台取消订单
+     * @Date 13:57 2022/10/11
+     * @Param [id]
+     **/
+    @ApiOperation(value = "订单管理 - 后台取消订单")
+    @GetMapping("/cancel")
+    public void cancel(@RequestParam("id") Long id) throws WxPayException, AlipayApiException {
+        Integer userId = LikeAdminThreadLocal.getAdminId();
+        iOrderService.cancelOrder(id, userId);
+    }
+
+    /**
+     * @return java.lang.Object
+     * @Author slien
+     * @Description 后台指派订单给师傅
+     * @Date 14:30 2022/10/11
+     * @Param [id, staffId]
+     **/
+    @ApiOperation(value = "订单管理 - 指派订单给师傅")
+    @GetMapping("/dispatch")
+    public void dispatch(@RequestParam("id") Long id, @RequestParam("staffId") Long staffId) {
+        Integer userId = LikeAdminThreadLocal.getAdminId();
+        iOrderService.dispatchStaff(id, staffId, userId);
+    }
+
+    /**
+     * @return java.lang.Object
+     * @Author slien
+     * @Description 核销订单
+     * @Date 14:43 2022/10/11
+     * @Param [id, code]
+     **/
+    @ApiOperation(value = "订单管理 - 核销订单")
+    @GetMapping("/verification")
+    public void verification(@RequestParam("id") Long id, @RequestParam("code") String code) {
+        Integer userId = LikeAdminThreadLocal.getAdminId();
+        iOrderService.verificationOrder(id, code, userId);
+    }
+
+//    /**
+//     * 订单新增
+//     *
+//     * @param orderParam 参数
+//     * @return Object
+//     */
+//    @ApiOperation(value = "订单管理 - ")
+//    @Log(title = "订单新增")
+//    @PostMapping("/add")
+//    public Object add(@Validated(value = OrderParam.create.class) @RequestBody OrderParam orderParam) {
+//        iOrderService.add(orderParam);
+//        return AjaxResult.success();
+//    }
+//
+//    /**
+//     * 订单编辑
+//     *
+//     * @param orderParam 参数
+//     * @return Object
+//     */
+//    @ApiOperation(value = "订单管理 - ")
+//    @Log(title = "订单编辑")
+//    @PostMapping("/edit")
+//    public Object edit(@Validated(value = OrderParam.update.class) @RequestBody OrderParam orderParam) {
+//        iOrderService.edit(orderParam);
+//        return AjaxResult.success();
+//    }
+
+    /**
+     * 订单删除
+     *
+     * @return Object
+     */
+    @ApiOperation(value = "订单管理 - 订单删除")
+    @Log(title = "订单删除")
+    @GetMapping("/del")
+    public void del(@RequestParam("id") Long id) {
+        iOrderService.del(id);
+    }
+
+}

+ 97 - 0
like-admin/src/main/java/com/mdd/admin/controller/order/OrderGoodsController.java

@@ -0,0 +1,97 @@
+package com.mdd.admin.controller.order;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.goods.IOrderGoodsService;
+import com.mdd.admin.validate.goods.OrderGoodsParam;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.vo.goods.OrderGoodsListVo;
+import com.mdd.admin.vo.goods.OrderGoodsDetailVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.validator.annotation.IDMust;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 订单服务管理
+ */
+@RestController
+@RequestMapping("api/order_goods")
+public class OrderGoodsController {
+
+    @Resource
+    IOrderGoodsService iOrderGoodsService;
+
+    /**
+     * 订单服务列表
+     *
+     * @author slien
+     * @param pageParam 分页参数
+     * @param params 搜索参数
+     * @return Object
+     */
+    @GetMapping("/list")
+    public Object list(@Validated PageParam pageParam,
+                       @RequestParam Map<String, String> params) {
+        PageResult<OrderGoodsListVo> list = iOrderGoodsService.list(pageParam, params);
+        return AjaxResult.success(list);
+    }
+    /**
+     * 订单服务详情
+     *
+     * @author slien
+     * @param id 主键ID
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        OrderGoodsDetailVo detail = iOrderGoodsService.detail(id);
+        return AjaxResult.success(detail);
+    }
+
+    /**
+     * 订单服务新增
+     *
+     * @author slien
+     * @param orderGoodsParam 参数
+     * @return Object
+     */
+    @Log(title = "订单服务新增")
+    @PostMapping("/add")
+    public Object add(@Validated(value = OrderGoodsParam.create.class) @RequestBody OrderGoodsParam orderGoodsParam) {
+        iOrderGoodsService.add(orderGoodsParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 订单服务编辑
+     *
+     * @author slien
+     * @param orderGoodsParam 参数
+     * @return Object
+     */
+    @Log(title = "订单服务编辑")
+    @PostMapping("/edit")
+    public Object edit(@Validated(value = OrderGoodsParam.update.class) @RequestBody OrderGoodsParam orderGoodsParam) {
+        iOrderGoodsService.edit(orderGoodsParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 订单服务删除
+     *
+     * @author slien
+     * @param orderGoodsParam 参数
+     * @return Object
+     */
+    @Log(title = "订单服务删除")
+    @PostMapping("/del")
+    public Object del(@Validated(value = OrderGoodsParam.delete.class) @RequestBody OrderGoodsParam orderGoodsParam) {
+        //iOrderGoodsService.del(orderGoodsParam.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 92 - 0
like-admin/src/main/java/com/mdd/admin/controller/order/OrderLogController.java

@@ -0,0 +1,92 @@
+package com.mdd.admin.controller.order;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.log.IOrderLogService;
+import com.mdd.admin.validate.log.OrderLogParam;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.vo.log.OrderLogListVo;
+import com.mdd.admin.vo.log.OrderLogDetailVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.validator.annotation.IDMust;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 订单日志管理
+ */
+@RestController
+@RequestMapping("api/order/log")
+public class OrderLogController {
+
+    @Resource
+    IOrderLogService iOrderLogService;
+
+    /**
+     * 订单日志列表
+     *
+     * @param pageParam 分页参数
+     * @param params 搜索参数
+     * @return Object
+     */
+    @GetMapping("/list")
+    public Object list(@Validated PageParam pageParam,
+                       @RequestParam Map<String, String> params) {
+        PageResult<OrderLogListVo> list = iOrderLogService.list(pageParam, params);
+        return AjaxResult.success(list);
+    }
+    /**
+     * 订单日志详情
+     *
+     * @param id 主键ID
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        OrderLogDetailVo detail = iOrderLogService.detail(id);
+        return AjaxResult.success(detail);
+    }
+
+    /**
+     * 订单日志新增
+     *
+     * @param orderLogParam 参数
+     * @return Object
+     */
+    @Log(title = "订单日志新增")
+    @PostMapping("/add")
+    public Object add(@Validated(value = OrderLogParam.create.class) @RequestBody OrderLogParam orderLogParam) {
+        iOrderLogService.add(orderLogParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 订单日志编辑
+     *
+     * @param orderLogParam 参数
+     * @return Object
+     */
+    @Log(title = "订单日志编辑")
+    @PostMapping("/edit")
+    public Object edit(@Validated(value = OrderLogParam.update.class) @RequestBody OrderLogParam orderLogParam) {
+        iOrderLogService.edit(orderLogParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 订单日志删除
+     *
+     * @param orderLogParam 参数
+     * @return Object
+     */
+    @Log(title = "订单日志删除")
+    @PostMapping("/del")
+    public Object del(@Validated(value = OrderLogParam.delete.class) @RequestBody OrderLogParam orderLogParam) {
+       // iOrderLogService.del(orderLogParam.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 136 - 0
like-admin/src/main/java/com/mdd/admin/controller/order/OrderTimeController.java

@@ -0,0 +1,136 @@
+package com.mdd.admin.controller.order;
+
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.time.IOrderTimeService;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.validate.time.OrderTimeParam;
+import com.mdd.admin.validate.time.TimeParam;
+import com.mdd.admin.vo.time.OrderTimeDetailVo;
+import com.mdd.admin.vo.time.OrderTimeListVo;
+import com.mdd.common.constant.GlobalConstant;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.exception.OperateException;
+import com.mdd.common.utils.ArrayUtil;
+import com.mdd.common.utils.ConfigUtil;
+import com.mdd.common.validator.annotation.IDMust;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 订单预约时间管理
+ */
+@Api(tags = "订单预约时间管理")
+@RestController
+@RequestMapping("api/time")
+public class OrderTimeController {
+
+    @Resource
+    IOrderTimeService iOrderTimeService;
+
+    /**
+     * 订单预约时间列表
+     *
+     * @param pageParam 分页参数
+     * @param params    搜索参数
+     * @return Object
+     */
+    @ApiOperation(value = "订单预约时间管理 - 分页列表")
+    @GetMapping("/list")
+    public PageResult<OrderTimeListVo> list(@Validated PageParam pageParam,
+                                            @RequestParam Map<String, String> params) {
+        return iOrderTimeService.list(pageParam, params);
+    }
+
+    /**
+     * 订单预约时间详情
+     *
+     * @param id 主键ID
+     * @return Object
+     */
+    @ApiOperation(value = "订单预约时间管理 - 详情")
+    @GetMapping("/detail")
+    public OrderTimeDetailVo detail(@Validated @IDMust() @RequestParam("id") Long id) {
+        return iOrderTimeService.detail(id);
+    }
+
+    /**
+     * 订单预约时间新增
+     *
+     * @param orderTimeParam 参数
+     * @return Object
+     */
+    @ApiOperation(value = "订单预约时间管理 - 新增")
+    @Log(title = "订单预约时间新增")
+    @PostMapping("/add")
+    public void add(@Validated(value = OrderTimeParam.create.class) @RequestBody OrderTimeParam orderTimeParam) {
+        iOrderTimeService.add(orderTimeParam);
+    }
+
+    /**
+     * 订单预约时间编辑
+     *
+     * @param orderTimeParam 参数
+     * @return Object
+     */
+    @ApiOperation(value = "订单预约时间管理 - 编辑")
+    @Log(title = "订单预约时间编辑")
+    @PostMapping("/edit")
+    public void edit(@Validated(value = OrderTimeParam.update.class) @RequestBody OrderTimeParam orderTimeParam) {
+        iOrderTimeService.edit(orderTimeParam);
+    }
+
+    /**
+     * 订单预约时间删除
+     *
+     * @return Object
+     */
+    @ApiOperation(value = "订单预约时间管理 - 删除")
+    @Log(title = "订单预约时间删除")
+    @GetMapping("/del")
+    public void del(@RequestParam("id") Long id) {
+        iOrderTimeService.del(id);
+    }
+
+    /**
+     * 订单预约时间批量删除
+     *
+     * @param ids 时间id集合
+     */
+    @ApiOperation(value = "订单预约时间管理 - 批量删除")
+    @Log(title = "订单预约时间批量删除")
+    @GetMapping("/batchDel")
+    public void batchDel(@RequestParam Long[] ids) {
+        Assert.isFalse(ids.length <= 0,"时间id集合不能为空");
+        iOrderTimeService.batchDel(ids);
+    }
+
+    /**
+     * 获取可提前预约时间
+     *
+     * @return Object
+     */
+    @ApiOperation(value = "订单预约时间管理 - 可提前预约时长")
+    @GetMapping("/getTime")
+    public AjaxResult getTime() {
+        return AjaxResult.success(iOrderTimeService.getOrderTime());
+    }
+
+    /**
+     * 设可提前预约时间
+     *
+     * @return Object
+     */
+    @ApiOperation(value = "订单预约时间管理 - 设置提前预约时长")
+    @PostMapping("/setTime")
+    public void setTime(@Validated(value = TimeParam.create.class)
+                            @RequestBody TimeParam timeParam) {
+        iOrderTimeService.setTime(timeParam);
+    }
+}

+ 65 - 0
like-admin/src/main/java/com/mdd/admin/controller/pay/DevPayController.java

@@ -0,0 +1,65 @@
+package com.mdd.admin.controller.pay;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.pay.IDevPayService;
+import com.mdd.admin.validate.pay.DevPayParam;
+import com.mdd.admin.vo.pay.DevPayDetailVo;
+import com.mdd.admin.vo.pay.DevPayListVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 支付配置管理
+ */
+@Api(tags = "支付配置管理")
+@RestController
+@RequestMapping("api/pay")
+public class DevPayController {
+
+    @Resource
+    IDevPayService iDevPayService;
+
+    /**
+     * 支付配置列表
+     *
+     * @return Object
+     */
+    @ApiOperation(value = "支付配置管理 - 列表")
+    @GetMapping("/list")
+    public List<DevPayListVo> list() {
+        return iDevPayService.listPage();
+    }
+
+    /**
+     * 支付配置详情
+     *
+     * @param id 主键ID
+     * @return Object
+     */
+    @ApiOperation(value = "支付配置管理 - 详情")
+    @GetMapping("/detail")
+    public DevPayDetailVo detail(@Validated @RequestParam("id") Long id) {
+        return iDevPayService.detail(id);
+    }
+
+
+    /**
+     * 支付配置编辑
+     *
+     * @param devPayParam 参数
+     * @return Object
+     */
+    @ApiOperation(value = "支付配置管理 - 编辑")
+    @Log(title = "支付配置编辑")
+    @PostMapping("/edit")
+    public void edit(@Validated(value = DevPayParam.update.class) @RequestBody DevPayParam devPayParam) throws Exception {
+        iDevPayService.edit(devPayParam);
+    }
+
+
+}

+ 51 - 0
like-admin/src/main/java/com/mdd/admin/controller/pay/DevPayWayController.java

@@ -0,0 +1,51 @@
+package com.mdd.admin.controller.pay;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.way.IDevPayWayService;
+import com.mdd.admin.validate.way.DevPayWayParam;
+import com.mdd.admin.vo.way.DevPayWayListVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 支付方式管理
+ */
+@Api(tags = "支付方式管理")
+@RestController
+@RequestMapping("api/way")
+public class DevPayWayController {
+
+    @Resource
+    IDevPayWayService iDevPayWayService;
+
+    /**
+     * 支付方式列表
+     *
+     * @return Object
+     */
+    @ApiOperation(value = "支付方式管理 - 列表")
+    @GetMapping("/list")
+    public Map<Long, List<DevPayWayListVo>> list() {
+        return iDevPayWayService.listPage();
+    }
+
+    /**
+     * 支付方式编辑
+     *
+     * @param devPayWayParam 参数
+     * @return Object
+     */
+    @ApiOperation(value = "支付方式管理 - 编辑")
+    @Log(title = "支付方式编辑")
+    @PostMapping("/edit")
+    public void edit(@Validated(value = DevPayWayParam.update.class) @RequestBody List<DevPayWayParam> devPayWayParam) {
+        iDevPayWayService.edit(devPayWayParam);
+    }
+
+}

+ 29 - 0
like-admin/src/main/java/com/mdd/admin/controller/recharge/RechargeController.java

@@ -0,0 +1,29 @@
+package com.mdd.admin.controller.recharge;
+
+import com.mdd.admin.service.recharge.IRechargeOrderService;
+import com.mdd.admin.validate.common.PageValidate;
+import com.mdd.admin.validate.finance.FinanceRechargeSearchValidate;
+import com.mdd.admin.vo.finance.FinanceRechargeListVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("/api/recharge")
+public class RechargeController {
+
+    @Resource
+    private IRechargeOrderService iRechargeOrderService;
+
+    @GetMapping("/list")
+    public AjaxResult list(@Validated PageValidate pageValidate,
+                           @Validated FinanceRechargeSearchValidate searchValidate){
+        PageResult<FinanceRechargeListVo> list = iRechargeOrderService.list(pageValidate, searchValidate);
+        return AjaxResult.success(list);
+    }
+}

+ 33 - 0
like-admin/src/main/java/com/mdd/admin/controller/refund/FinanceController.java

@@ -0,0 +1,33 @@
+package com.mdd.admin.controller.refund;
+
+import com.mdd.admin.service.finance.IFinanceService;
+import com.mdd.admin.vo.finance.FinanceVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * @ClassName FinanceController
+ * @Description
+ * @Autore Slien.zuo
+ * @Date 2022/10/13 19:17
+ * @Version 1.0
+ **/
+@Api(tags = "财务中心")
+@RestController
+@RequestMapping("api/finance")
+public class FinanceController {
+
+    @Resource
+    private IFinanceService financeService;
+
+    @GetMapping("/statistics")
+    @ApiOperation(value = "财务中心 - 经营中心")
+    public FinanceVo statisticsFinance() {
+        return financeService.statisticsFinance();
+    }
+}

+ 95 - 0
like-admin/src/main/java/com/mdd/admin/controller/refund/OrderRefundController.java

@@ -0,0 +1,95 @@
+package com.mdd.admin.controller.refund;
+
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.mdd.admin.service.log.IOrderRefundLogService;
+import com.mdd.admin.service.refund.IOrderRefundService;
+import com.mdd.admin.validate.refund.OrderRefundPageParam;
+import com.mdd.admin.vo.log.OrderRefundLogDetailVo;
+import com.mdd.admin.vo.refund.OrderRefundListVo;
+import com.mdd.admin.vo.refund.StatisticsOrderRefundCountVo;
+import com.mdd.admin.vo.refund.StatisticsOrderRefundVo;
+import com.mdd.common.core.PageResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 订单退款管理
+ */
+@Api(tags = "订单退款管理")
+@RestController
+@RequestMapping("api/refund")
+public class OrderRefundController {
+
+    @Resource
+    IOrderRefundService iOrderRefundService;
+
+    @Resource
+    private IOrderRefundLogService iOrderRefundLogService;
+
+    /**
+     * 订单退款列表
+     *
+     * @param params 搜索参数
+     * @return Object
+     * @author slien
+     */
+    @ApiOperation(value = "订单退款管理 - 列表")
+    @PostMapping("/list")
+    public PageResult<OrderRefundListVo> list(@RequestBody OrderRefundPageParam params) {
+        return iOrderRefundService.list(params);
+    }
+
+    /**
+     * @return java.lang.Object
+     * @Author slien
+     * @Description 统计订单状态的数据
+     * @Date 11:47 2022/10/11
+     * @Param []
+     **/
+    @ApiOperation(value = "订单退款管理 - 统计数量")
+    @PostMapping("/statistics/count")
+    public StatisticsOrderRefundCountVo statisticsCount(@RequestBody OrderRefundPageParam params) {
+        return iOrderRefundService.statisticsCount(params);
+    }
+
+    /**
+     * @return java.lang.Object
+     * @Author slien
+     * @Description 统计订单状态的数据
+     * @Date 11:47 2022/10/11
+     * @Param []
+     **/
+    @ApiOperation(value = "订单退款管理 - 统计金额")
+    @GetMapping("/statistics/amount")
+    public StatisticsOrderRefundVo statisticsAmount() {
+        return iOrderRefundService.statisticsAmount();
+    }
+
+    /**
+     * 订单退款日志详情
+     *
+     * @param refundId 主键ID
+     * @return Object
+     */
+    @ApiOperation(value = "订单退款管理 - 退款详情")
+    @GetMapping("/detail")
+    public List<OrderRefundLogDetailVo> detail(@RequestParam("refundId") Long refundId) {
+        return iOrderRefundLogService.detail(refundId);
+    }
+
+    /**
+     * 订单重新退款
+     *
+     * @param refundId 主键ID
+     * @return Object
+     */
+    @ApiOperation(value = "订单退款管理 - 重新退款")
+    @GetMapping("/repeat")
+    public void repeatRefund(@RequestParam("refundId") Long refundId) throws WxPayException {
+        iOrderRefundService.repeatRefund(refundId);
+    }
+}

+ 113 - 0
like-admin/src/main/java/com/mdd/admin/controller/region/DevRegionController.java

@@ -0,0 +1,113 @@
+package com.mdd.admin.controller.region;
+
+import com.github.xiaoymin.map.model.MapLocation;
+import com.github.xiaoymin.map.request.tencent.AmapGenCoderRequest;
+import com.github.xiaoymin.map.response.amap.tencent.AmapGenCoderResponse;
+import com.mdd.admin.service.region.IDevRegionService;
+import com.mdd.admin.vo.region.DevRegionListVo;
+import com.mdd.common.config.map.LikeTenCentClient;
+import com.mdd.common.enums.RegionLevelEnum;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * 地区管理
+ */
+@Api(tags = "地区管理")
+@RestController
+@RequestMapping("api/region")
+public class DevRegionController {
+
+    @Resource
+    IDevRegionService iDevRegionService;
+
+    @Resource
+    private LikeTenCentClient mapClient;
+
+    /**
+     * 省市区树形结构
+     *
+     * @return Object
+     */
+    @ApiOperation(value = "省市区树形结构")
+    @GetMapping("/tree")
+    public List<DevRegionListVo> tree() {
+        // 树形结构
+        return iDevRegionService.tree();
+    }
+
+    /**
+     * 省
+     *
+     * @return Object
+     */
+    @ApiOperation(value = "获取省")
+    @GetMapping("/province")
+    public List<DevRegionListVo> province() {
+        // 国家下查省级数据
+        return iDevRegionService.province(RegionLevelEnum.PROVINCE.getCode());
+    }
+
+    /**
+     * 市
+     *
+     * @return Object
+     */
+    @ApiOperation(value = "获取城市")
+    @GetMapping("/city")
+    public List<DevRegionListVo> city(@RequestParam(value = "provinceId", required = false) Long provinceId) {
+        // 省下查市数据
+        return iDevRegionService.city(provinceId, RegionLevelEnum.CITY.getCode());
+    }
+
+    /**
+     * 区
+     *
+     * @return Object
+     */
+    @ApiOperation(value = "获取县/区")
+    @GetMapping("/district")
+    public List<DevRegionListVo> district(@RequestParam(value = "cityId", required = false) Long cityId) {
+        // 市下查县区数据
+        return iDevRegionService.district(cityId, RegionLevelEnum.DISTRICT.getCode());
+    }
+
+    /**
+     * 删除缓存
+     *
+     * @return Object
+     */
+    @ApiOperation(value = "删除缓存")
+    @GetMapping("/del/cache")
+    public void delCache() {
+        // 删除缓存
+        iDevRegionService.delCache();
+    }
+
+    /**
+     * 根据经纬度获取详细地址
+     *
+     * @return Object
+     */
+    @PostMapping("/genCoder")
+    public AmapGenCoderResponse genCoder(@RequestBody AmapGenCoderRequest request) {
+        Optional<AmapGenCoderResponse> tencentGenCoderResponse = mapClient.genCoder(request);
+        return tencentGenCoderResponse.get();
+    }
+
+    /**
+     * 根据经纬度获取详细地址
+     *
+     * @return Object
+     */
+    @GetMapping("/keyWordAddress")
+    public MapLocation genCoder(@RequestParam("keyWord") String keyWord) {
+        return mapClient.address(keyWord);
+    }
+
+}

+ 92 - 0
like-admin/src/main/java/com/mdd/admin/controller/reply/OfficialAccountReplyController.java

@@ -0,0 +1,92 @@
+package com.mdd.admin.controller.reply;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.reply.IOfficialAccountReplyService;
+import com.mdd.admin.validate.reply.OfficialAccountReplyParam;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.vo.reply.OfficialAccountReplyListVo;
+import com.mdd.admin.vo.reply.OfficialAccountReplyDetailVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.validator.annotation.IDMust;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 微信公众号自动回复管理
+ */
+@RestController
+@RequestMapping("api/reply")
+public class OfficialAccountReplyController {
+
+    @Resource
+    IOfficialAccountReplyService iOfficialAccountReplyService;
+
+    /**
+     * 微信公众号自动回复列表
+     *
+     * @param pageParam 分页参数
+     * @param params 搜索参数
+     * @return Object
+     */
+    @GetMapping("/list")
+    public Object list(@Validated PageParam pageParam,
+                       @RequestParam Map<String, String> params) {
+        PageResult<OfficialAccountReplyListVo> list = iOfficialAccountReplyService.list(pageParam, params);
+        return AjaxResult.success(list);
+    }
+    /**
+     * 微信公众号自动回复详情
+     *
+     * @param id 主键ID
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        OfficialAccountReplyDetailVo detail = iOfficialAccountReplyService.detail(id);
+        return AjaxResult.success(detail);
+    }
+
+    /**
+     * 微信公众号自动回复新增
+     *
+     * @param officialAccountReplyParam 参数
+     * @return Object
+     */
+    @Log(title = "微信公众号自动回复新增")
+    @PostMapping("/add")
+    public Object add(@Validated(value = OfficialAccountReplyParam.create.class) @RequestBody OfficialAccountReplyParam officialAccountReplyParam) {
+        iOfficialAccountReplyService.add(officialAccountReplyParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 微信公众号自动回复编辑
+     *
+     * @param officialAccountReplyParam 参数
+     * @return Object
+     */
+    @Log(title = "微信公众号自动回复编辑")
+    @PostMapping("/edit")
+    public Object edit(@Validated(value = OfficialAccountReplyParam.update.class) @RequestBody OfficialAccountReplyParam officialAccountReplyParam) {
+        iOfficialAccountReplyService.edit(officialAccountReplyParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 微信公众号自动回复删除
+     *
+     * @param officialAccountReplyParam 参数
+     * @return Object
+     */
+    @Log(title = "微信公众号自动回复删除")
+    @PostMapping("/del")
+    public Object del(@Validated(value = OfficialAccountReplyParam.delete.class) @RequestBody OfficialAccountReplyParam officialAccountReplyParam) {
+       // iOfficialAccountReplyService.del(officialAccountReplyParam.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 92 - 0
like-admin/src/main/java/com/mdd/admin/controller/session/AdminSessionController.java

@@ -0,0 +1,92 @@
+package com.mdd.admin.controller.session;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.session.IAdminSessionService;
+import com.mdd.admin.validate.session.AdminSessionParam;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.vo.session.AdminSessionListVo;
+import com.mdd.admin.vo.session.AdminSessionDetailVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.validator.annotation.IDMust;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 会话管理
+ */
+@RestController
+@RequestMapping("api/admin/session")
+public class AdminSessionController {
+
+    @Resource
+    IAdminSessionService iAdminSessionService;
+
+    /**
+     * 会话列表
+     *
+     * @param pageParam 分页参数
+     * @param params 搜索参数
+     * @return Object
+     */
+    @GetMapping("/list")
+    public Object list(@Validated PageParam pageParam,
+                       @RequestParam Map<String, String> params) {
+        PageResult<AdminSessionListVo> list = iAdminSessionService.list(pageParam, params);
+        return AjaxResult.success(list);
+    }
+    /**
+     * 会话详情
+     *
+     * @param id 主键ID
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        AdminSessionDetailVo detail = iAdminSessionService.detail(id);
+        return AjaxResult.success(detail);
+    }
+
+    /**
+     * 会话新增
+     *
+     * @param adminSessionParam 参数
+     * @return Object
+     */
+    @Log(title = "会话新增")
+    @PostMapping("/add")
+    public Object add(@Validated(value = AdminSessionParam.create.class) @RequestBody AdminSessionParam adminSessionParam) {
+        iAdminSessionService.add(adminSessionParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 会话编辑
+     *
+     * @param adminSessionParam 参数
+     * @return Object
+     */
+    @Log(title = "会话编辑")
+    @PostMapping("/edit")
+    public Object edit(@Validated(value = AdminSessionParam.update.class) @RequestBody AdminSessionParam adminSessionParam) {
+        iAdminSessionService.edit(adminSessionParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 会话删除
+     *
+     * @param adminSessionParam 参数
+     * @return Object
+     */
+    @Log(title = "会话删除")
+    @PostMapping("/del")
+    public Object del(@Validated(value = AdminSessionParam.delete.class) @RequestBody AdminSessionParam adminSessionParam) {
+       // iAdminSessionService.del(adminSessionParam.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 92 - 0
like-admin/src/main/java/com/mdd/admin/controller/session/UserSessionController.java

@@ -0,0 +1,92 @@
+package com.mdd.admin.controller.session;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.session.IUserSessionService;
+import com.mdd.admin.validate.session.UserSessionParam;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.vo.session.UserSessionListVo;
+import com.mdd.admin.vo.session.UserSessionDetailVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.validator.annotation.IDMust;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 用户会话管理
+ */
+@RestController
+@RequestMapping("api/user/session")
+public class UserSessionController {
+
+    @Resource
+    IUserSessionService iUserSessionService;
+
+    /**
+     * 用户会话列表
+     *
+     * @param pageParam 分页参数
+     * @param params 搜索参数
+     * @return Object
+     */
+    @GetMapping("/list")
+    public Object list(@Validated PageParam pageParam,
+                       @RequestParam Map<String, String> params) {
+        PageResult<UserSessionListVo> list = iUserSessionService.list(pageParam, params);
+        return AjaxResult.success(list);
+    }
+    /**
+     * 用户会话详情
+     *
+     * @param id 主键ID
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        UserSessionDetailVo detail = iUserSessionService.detail(id);
+        return AjaxResult.success(detail);
+    }
+
+    /**
+     * 用户会话新增
+     *
+     * @param userSessionParam 参数
+     * @return Object
+     */
+    @Log(title = "用户会话新增")
+    @PostMapping("/add")
+    public Object add(@Validated(value = UserSessionParam.create.class) @RequestBody UserSessionParam userSessionParam) {
+        iUserSessionService.add(userSessionParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 用户会话编辑
+     *
+     * @param userSessionParam 参数
+     * @return Object
+     */
+    @Log(title = "用户会话编辑")
+    @PostMapping("/edit")
+    public Object edit(@Validated(value = UserSessionParam.update.class) @RequestBody UserSessionParam userSessionParam) {
+        iUserSessionService.edit(userSessionParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 用户会话删除
+     *
+     * @param userSessionParam 参数
+     * @return Object
+     */
+    @Log(title = "用户会话删除")
+    @PostMapping("/del")
+    public Object del(@Validated(value = UserSessionParam.delete.class) @RequestBody UserSessionParam userSessionParam) {
+       // iUserSessionService.del(userSessionParam.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 45 - 0
like-admin/src/main/java/com/mdd/admin/controller/setting/CopyrightController.java

@@ -0,0 +1,45 @@
+package com.mdd.admin.controller.setting;
+
+import com.mdd.admin.service.setting.ISettingCopyrightService;
+import com.mdd.common.core.AjaxResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 网站版权配置管理
+ */
+@RestController("settingCopyrightController")
+@RequestMapping("api/setting/copyright")
+public class CopyrightController {
+
+    @Resource
+    ISettingCopyrightService iSettingCopyrightService;
+
+    /**
+     * 获取网站版权信息
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail() {
+        List<Map<String, String>> list = iSettingCopyrightService.detail();
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 保存网站版本信息
+     *
+     * @author fzr
+     * @return Object
+     */
+    @PostMapping("/save")
+    public Object save(@RequestBody List<Map<String, String>> params) {
+        iSettingCopyrightService.save(params);
+        return AjaxResult.success();
+    }
+
+}

+ 92 - 0
like-admin/src/main/java/com/mdd/admin/controller/setting/DevNoticeSettingController.java

@@ -0,0 +1,92 @@
+package com.mdd.admin.controller.setting;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.setting.IDevNoticeSettingService;
+import com.mdd.admin.validate.setting.DevNoticeSettingParam;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.vo.setting.DevNoticeSettingListVo;
+import com.mdd.admin.vo.setting.DevNoticeSettingDetailVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.validator.annotation.IDMust;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 通知设置管理
+ */
+@RestController
+@RequestMapping("api/setting")
+public class DevNoticeSettingController {
+
+    @Resource
+    IDevNoticeSettingService iDevNoticeSettingService;
+
+    /**
+     * 通知设置列表
+     *
+     * @param pageParam 分页参数
+     * @param params 搜索参数
+     * @return Object
+     */
+    @GetMapping("/list")
+    public Object list(@Validated PageParam pageParam,
+                       @RequestParam Map<String, String> params) {
+        PageResult<DevNoticeSettingListVo> list = iDevNoticeSettingService.list(pageParam, params);
+        return AjaxResult.success(list);
+    }
+    /**
+     * 通知设置详情
+     *
+     * @param id 主键ID
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        DevNoticeSettingDetailVo detail = iDevNoticeSettingService.detail(id);
+        return AjaxResult.success(detail);
+    }
+
+    /**
+     * 通知设置新增
+     *
+     * @param devNoticeSettingParam 参数
+     * @return Object
+     */
+    @Log(title = "通知设置新增")
+    @PostMapping("/add")
+    public Object add(@Validated(value = DevNoticeSettingParam.create.class) @RequestBody DevNoticeSettingParam devNoticeSettingParam) {
+        iDevNoticeSettingService.add(devNoticeSettingParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 通知设置编辑
+     *
+     * @param devNoticeSettingParam 参数
+     * @return Object
+     */
+    @Log(title = "通知设置编辑")
+    @PostMapping("/edit")
+    public Object edit(@Validated(value = DevNoticeSettingParam.update.class) @RequestBody DevNoticeSettingParam devNoticeSettingParam) {
+        iDevNoticeSettingService.edit(devNoticeSettingParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 通知设置删除
+     *
+     * @param devNoticeSettingParam 参数
+     * @return Object
+     */
+    @Log(title = "通知设置删除")
+    @PostMapping("/del")
+    public Object del(@Validated(value = DevNoticeSettingParam.delete.class) @RequestBody DevNoticeSettingParam devNoticeSettingParam) {
+        //iDevNoticeSettingService.del(devNoticeSettingParam.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 110 - 0
like-admin/src/main/java/com/mdd/admin/controller/setting/DictDataController.java

@@ -0,0 +1,110 @@
+package com.mdd.admin.controller.setting;
+
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.mdd.admin.service.setting.ISettingDictDataService;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.validate.setting.DictDataParam;
+import com.mdd.admin.vo.setting.DictDataVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.utils.StringUtil;
+import com.mdd.common.validator.annotation.IDMust;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 字典数据配置管理
+ */
+@RestController("settingDictDataController")
+@RequestMapping("api/setting/dict/data")
+public class DictDataController {
+
+    @Resource
+    ISettingDictDataService iSettingDictDataService;
+
+    /**
+     * 字典数据所有
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/all")
+    public Object all(@RequestParam Map<String, String> params) {
+        Assert.isFalse(StringUtil.isEmpty(params.get("dictType")), "dictType缺失");
+        List<DictDataVo> list = iSettingDictDataService.all(params);
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 字典数据列表
+     *
+     * @author fzr
+     * @param pageParam 分页参数
+     * @param params 搜索参数
+     * @return Object
+     */
+    @GetMapping("/list")
+    public Object list(@Validated PageParam pageParam,
+                       @RequestParam Map<String, String> params) {
+        Assert.isFalse(StringUtil.isEmpty(params.get("dictType")), "dictType缺失");
+        PageResult<DictDataVo> list = iSettingDictDataService.list(pageParam, params);
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 字典数据详情
+     *
+     * @author fzr
+     * @param id 主键
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        DictDataVo vo = iSettingDictDataService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    /**
+     * 字典数据新增
+     *
+     * @author fzr
+     * @param dictDataParam 参数
+     * @return Object
+     */
+    @PostMapping("/add")
+    public Object add(@Validated(value = DictDataParam.create.class) @RequestBody DictDataParam dictDataParam) {
+        iSettingDictDataService.add(dictDataParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 字典数据编辑
+     *
+     * @author fzr
+     * @param dictDataParam 参数
+     * @return Object
+     */
+    @PostMapping("/edit")
+    public Object edit(@Validated(value = DictDataParam.update.class) @RequestBody DictDataParam dictDataParam) {
+        iSettingDictDataService.edit(dictDataParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 字典数据删除
+     *
+     * @author fzr
+     * @param dictDataParam 参数
+     * @return Object
+     */
+    @PostMapping("/del")
+    public Object del(@Validated(value = DictDataParam.delete.class) @RequestBody DictDataParam dictDataParam) {
+        iSettingDictDataService.del(dictDataParam.getIds());
+        return AjaxResult.success();
+    }
+
+}

+ 106 - 0
like-admin/src/main/java/com/mdd/admin/controller/setting/DictTypeController.java

@@ -0,0 +1,106 @@
+package com.mdd.admin.controller.setting;
+
+import com.mdd.admin.service.setting.ISettingDictTypeService;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.validate.setting.DictTypeParam;
+import com.mdd.admin.vo.setting.DictTypeVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.validator.annotation.IDMust;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 字典类型配置管理
+ */
+@RestController("settingDictTypeController")
+@RequestMapping("api/setting/dict/type")
+public class DictTypeController {
+
+    @Resource
+    ISettingDictTypeService iSettingDictTypeService;
+
+    /**
+     * 字典类型所有
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/all")
+    public Object all() {
+        List<DictTypeVo> list = iSettingDictTypeService.all();
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 字典类型列表
+     *
+     * @author fzr
+     * @param pageParam 分页参数
+     * @param params 搜索参数
+     * @return Object
+     */
+    @GetMapping("/list")
+    public Object list(@Validated PageParam pageParam,
+                       @RequestParam Map<String, String> params) {
+        PageResult<DictTypeVo> list = iSettingDictTypeService.list(pageParam, params);
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 字典类型详情
+     *
+     * @author fzr
+     * @param id 主键
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        DictTypeVo vo = iSettingDictTypeService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    /**
+     * 字典类型新增
+     *
+     * @author fzr
+     * @param dictTypeParam 参数
+     * @return Object
+     */
+    @PostMapping("/add")
+    public Object add(@Validated(value = DictTypeParam.create.class) @RequestBody DictTypeParam dictTypeParam) {
+        iSettingDictTypeService.add(dictTypeParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 字典类型编辑
+     *
+     * @author fzr
+     * @param dictTypeParam 参数
+     * @return Object
+     */
+    @PostMapping("/edit")
+    public Object edit(@Validated(value = DictTypeParam.update.class) @RequestBody DictTypeParam dictTypeParam) {
+        iSettingDictTypeService.edit(dictTypeParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 字典类型删除
+     *
+     * @author fzr
+     * @param dictTypeParam 参数
+     * @return Object
+     */
+    @PostMapping("/del")
+    public Object del(@Validated(value = DictTypeParam.delete.class) @RequestBody DictTypeParam dictTypeParam) {
+        iSettingDictTypeService.del(dictTypeParam.getIds());
+        return AjaxResult.success();
+    }
+
+}

+ 42 - 0
like-admin/src/main/java/com/mdd/admin/controller/setting/LoginController.java

@@ -0,0 +1,42 @@
+package com.mdd.admin.controller.setting;
+
+import com.mdd.admin.service.setting.ISettingLoginService;
+import com.mdd.common.core.AjaxResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+@RestController("settingLoginController")
+@RequestMapping("api/setting/login")
+public class LoginController {
+
+    @Resource
+    ISettingLoginService iSettingLoginService;
+
+    /**
+     * 登录设置详情
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail() {
+        Map<String, Object> map = iSettingLoginService.detail();
+        return AjaxResult.success(map);
+    }
+
+    /**
+     * 登录设置保存
+     *
+     * @author fzr
+     * @param params 参数
+     * @return Object
+     */
+    @PostMapping("/save")
+    public Object save(@RequestBody Map<String, String> params) {
+        iSettingLoginService.save(params);
+        return AjaxResult.success();
+    }
+
+}

+ 64 - 0
like-admin/src/main/java/com/mdd/admin/controller/setting/NoticeController.java

@@ -0,0 +1,64 @@
+package com.mdd.admin.controller.setting;
+
+import com.mdd.admin.service.setting.ISettingNoticeService;
+import com.mdd.admin.vo.setting.NoticeDetailVo;
+import com.mdd.admin.vo.setting.NoticeListVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.validator.annotation.IDMust;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 通知设置管理
+ */
+@RestController("settingNoticeController")
+@RequestMapping("api/setting/notice")
+public class NoticeController {
+
+    @Resource
+    ISettingNoticeService iSettingNoticeService;
+
+    /**
+     * 通知设置列表
+     *
+     * @author fzr
+     * @param recipient 类型: 1=用户, 2=平台
+     * @return Object
+     */
+    @GetMapping("/list")
+    public Object list(@RequestParam Integer recipient) {
+        List<NoticeListVo> list = iSettingNoticeService.list(recipient);
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 通知设置详情
+     *
+     * @author fzr
+     * @param id 主键
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        NoticeDetailVo vo = iSettingNoticeService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    /**
+     * 通知设置保存
+     *
+     * @author fzr
+     * @param params 参数
+     * @return Object
+     */
+    @PostMapping("/save")
+    public Object save(@RequestBody Map<String, Object> params) {
+        iSettingNoticeService.save(params);
+        return AjaxResult.success();
+    }
+
+}

+ 44 - 0
like-admin/src/main/java/com/mdd/admin/controller/setting/ProtocolController.java

@@ -0,0 +1,44 @@
+package com.mdd.admin.controller.setting;
+
+import com.mdd.admin.service.setting.ISettingProtocolService;
+import com.mdd.common.core.AjaxResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 政策协议配置管理
+ */
+@RestController("settingProtocolController")
+@RequestMapping("api/setting/protocol")
+public class ProtocolController {
+
+    @Resource
+    ISettingProtocolService iSettingProtocolService;
+
+    /**
+     * 获取网站版权信息
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail() {
+        Map<String, Map<String, String>> detail = iSettingProtocolService.detail();
+        return AjaxResult.success(detail);
+    }
+
+    /**
+     * 保存网站版本信息
+     *
+     * @author fzr
+     * @return Object
+     */
+    @PostMapping("/save")
+    public Object save(@RequestBody Map<String, Object> params) {
+        iSettingProtocolService.save(params);
+        return AjaxResult.success();
+    }
+
+}

+ 31 - 0
like-admin/src/main/java/com/mdd/admin/controller/setting/RechargeConfigController.java

@@ -0,0 +1,31 @@
+package com.mdd.admin.controller.setting;
+
+import com.mdd.admin.service.setting.IRechargeConfigService;
+import com.mdd.admin.validate.setting.RechargeConfigValidate;
+import com.mdd.common.core.AjaxResult;
+import org.springframework.util.Assert;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api/recharge/config")
+public class RechargeConfigController {
+
+    @Resource
+    private IRechargeConfigService iRechargeConfigService;
+
+    @GetMapping("/getConfig")
+    public AjaxResult getConfig(){
+        Map<String, Object> config = iRechargeConfigService.getConfig();
+        return AjaxResult.success(config);
+    }
+
+    @PostMapping("/setConfig")
+    public AjaxResult setConfig(@RequestBody RechargeConfigValidate rechargeConfigValidate){
+        iRechargeConfigService.setConfig(rechargeConfigValidate);
+        return AjaxResult.success();
+    }
+
+}

+ 47 - 0
like-admin/src/main/java/com/mdd/admin/controller/setting/SearchController.java

@@ -0,0 +1,47 @@
+package com.mdd.admin.controller.setting;
+
+import com.mdd.admin.service.setting.ISettingSearchService;
+import com.mdd.common.core.AjaxResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 热搜设置
+ */
+@RestController("settingSearchController")
+@RequestMapping("api/setting/search")
+public class SearchController {
+
+    @Resource
+    ISettingSearchService iSettingSearchService;
+
+    /**
+     * 热门搜索详情
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail() {
+        Map<String, Object> map = iSettingSearchService.detail();
+        return AjaxResult.success(map);
+    }
+
+    /**
+     * 热门搜索保存
+     *
+     * @author fzr
+     * @param params 参数
+     * @return Object
+     */
+    @PostMapping("/save")
+    public Object save(@RequestBody Map<String, Object> params) {
+        iSettingSearchService.save(params);
+        return AjaxResult.success();
+    }
+
+
+
+}

+ 61 - 0
like-admin/src/main/java/com/mdd/admin/controller/setting/SmsController.java

@@ -0,0 +1,61 @@
+package com.mdd.admin.controller.setting;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.setting.ISettingSmsService;
+import com.mdd.common.core.AjaxResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 短信设置管理
+ */
+@RestController("settingSmsController")
+@RequestMapping("api/setting/sms")
+public class SmsController {
+
+    @Resource
+    ISettingSmsService iSettingSmsService;
+
+    /**
+     * 短信引擎列表
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/list")
+    public Object list() {
+        List<Map<String, Object>> list = iSettingSmsService.list();
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 短信引擎详情
+     *
+     * @author fzr
+     * @param alias 别名
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(String alias) {
+        Map<String, Object> map = iSettingSmsService.detail(alias);
+        return AjaxResult.success(map);
+    }
+
+    /**
+     * 短信引擎保存
+     *
+     * @author fzr
+     * @param params 参数
+     * @return Object
+     */
+    @Log(title = "短信引擎保存")
+    @PostMapping("/save")
+    public Object save(@RequestBody Map<String, String> params) {
+        iSettingSmsService.save(params);
+        return AjaxResult.success();
+    }
+
+}

+ 76 - 0
like-admin/src/main/java/com/mdd/admin/controller/setting/StorageController.java

@@ -0,0 +1,76 @@
+package com.mdd.admin.controller.setting;
+
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.mdd.admin.service.setting.ISettingStorageService;
+import com.mdd.common.core.AjaxResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 存储方式配置管理
+ */
+@RestController("settingStorageController")
+@RequestMapping("api/setting/storage")
+public class StorageController {
+
+    @Resource
+    ISettingStorageService iSettingStorageService;
+
+    /**
+     * 存储列表
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/list")
+    public Object list() {
+        List<Map<String, Object>> list = iSettingStorageService.list();
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 存储详情
+     *
+     * @param alias 引擎别名
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(String alias) {
+        Map<String, Object> map = iSettingStorageService.detail(alias);
+        return AjaxResult.success(map);
+    }
+
+    /**
+     * 存储编辑
+     *
+     * @author fzr
+     * @param params 参数
+     * @return Object
+     */
+    @PostMapping("/edit")
+    public Object edit(@RequestBody Map<String, String> params) {
+        iSettingStorageService.edit(params);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 存储切换
+     *
+     * @author fzr
+     * @param params 参数
+     * @return Object
+     */
+    @PostMapping("/change")
+    public Object change(@RequestBody Map<String, String> params) {
+        Assert.notNull(params.get("alias"), "alias参数缺失");
+        Assert.notNull(params.get("status"), "status参数缺失");
+        String alias = params.get("alias");
+        Integer status = Integer.parseInt(params.get("status"));
+        iSettingStorageService.change(alias, status);
+        return AjaxResult.success();
+    }
+
+}

+ 55 - 0
like-admin/src/main/java/com/mdd/admin/controller/setting/TransactionController.java

@@ -0,0 +1,55 @@
+package com.mdd.admin.controller.setting;
+
+import com.mdd.admin.vo.setting.TransactionSettingVo;
+import com.mdd.common.constant.GlobalConstant;
+import com.mdd.common.utils.ConfigUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ * 系统交易设置
+ */
+@Api(tags = "系统交易设置")
+@RestController("settingTransactionController")
+@RequestMapping("api/setting/transaction")
+public class TransactionController {
+
+
+    /**
+     * 查询交易设置
+     *
+     * @return Object
+     * @author fzr
+     */
+    @ApiOperation(value = "系统交易设置 - 查询交易设置")
+    @GetMapping("")
+    public TransactionSettingVo transactionDetail() {
+        Map<String, String> map = ConfigUtil.get(GlobalConstant.TRANSACTION_SETTING);
+        TransactionSettingVo vo = new TransactionSettingVo();
+        vo.setCancelUnpaidOrders(map.get(GlobalConstant.CANCEL_UNPAID_ORDERS));
+        vo.setVerificationOrders(map.get(GlobalConstant.VERIFICATION_ORDERS));
+        vo.setCancelUnpaidOrdersTimes(map.get(GlobalConstant.CANCEL_UNPAID_ORDERS_TIMES));
+        vo.setVerificationOrdersTimes(map.get(GlobalConstant.VERIFICATION_ORDERS_TIMES));
+        vo.setIsAuthDispatch(map.get(GlobalConstant.IS_AUTH_DISPATCH));
+        return vo;
+    }
+
+    /**
+     * 设置交易
+     *
+     * @return Object
+     * @author fzr
+     */
+    @ApiOperation(value = "系统交易设置 - 设置交易")
+    @PostMapping("")
+    public void setTransaction(@RequestBody TransactionSettingVo vo) {
+        ConfigUtil.set(GlobalConstant.TRANSACTION_SETTING, GlobalConstant.VERIFICATION_ORDERS, vo.getVerificationOrders());
+        ConfigUtil.set(GlobalConstant.TRANSACTION_SETTING, GlobalConstant.VERIFICATION_ORDERS_TIMES, vo.getVerificationOrdersTimes());
+        ConfigUtil.set(GlobalConstant.TRANSACTION_SETTING, GlobalConstant.CANCEL_UNPAID_ORDERS, vo.getCancelUnpaidOrders());
+        ConfigUtil.set(GlobalConstant.TRANSACTION_SETTING, GlobalConstant.CANCEL_UNPAID_ORDERS_TIMES, vo.getCancelUnpaidOrdersTimes());
+        ConfigUtil.set(GlobalConstant.TRANSACTION_SETTING, GlobalConstant.IS_AUTH_DISPATCH, vo.getIsAuthDispatch());
+    }
+}

+ 45 - 0
like-admin/src/main/java/com/mdd/admin/controller/setting/UserController.java

@@ -0,0 +1,45 @@
+package com.mdd.admin.controller.setting;
+
+import com.mdd.admin.service.setting.ISettingUserService;
+import com.mdd.common.core.AjaxResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 用户设置管理
+ */
+@RestController("settingUserController")
+@RequestMapping("api/setting/user")
+public class UserController {
+
+    @Resource
+    ISettingUserService iSettingUserService;
+
+    /**
+     * 用户设置详情
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail() {
+        Map<String, Object> map = iSettingUserService.detail();
+        return AjaxResult.success(map);
+    }
+
+    /**
+     * 用户设置保存
+     *
+     * @author fzr
+     * @param params 参数
+     * @return Object
+     */
+    @PostMapping("/save")
+    public Object save(@RequestBody Map<String, String> params) {
+        iSettingUserService.save(params);
+        return AjaxResult.success();
+    }
+
+}

+ 79 - 0
like-admin/src/main/java/com/mdd/admin/controller/setting/WebsiteController.java

@@ -0,0 +1,79 @@
+package com.mdd.admin.controller.setting;
+
+import com.mdd.admin.service.setting.ISettingWebsiteService;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.utils.ConfigUtil;
+import com.mdd.common.utils.YmlUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 网站信息配置管理
+ */
+@RestController("settingWebsiteController")
+@RequestMapping("api/setting/website")
+public class WebsiteController {
+
+    @Resource
+    ISettingWebsiteService iSettingWebsiteService;
+
+    /**
+     * 获取网站配置信息
+     *
+     * @return Object
+     * @author fzr
+     */
+    @GetMapping("/detail")
+    public Object detail() {
+        Map<String, String> detail = iSettingWebsiteService.detail();
+        return AjaxResult.success(detail);
+    }
+
+    /**
+     * 保存网站配置信息
+     *
+     * @param params 参数
+     * @return Object
+     * @author fzr
+     */
+    @PostMapping("/save")
+    public Object save(@RequestBody Map<String, String> params) {
+        iSettingWebsiteService.save(params);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 获取地图的配置
+     *
+     * @param
+     * @return Object
+     * @author fzr
+     */
+    @GetMapping("/getMapKey")
+    public Map<String, String> getMapKey() {
+        String env = YmlUtil.get("like.production");
+        boolean envStatus = StringUtils.isNotEmpty(env) && env.equals("true");
+        Map<String, String> mapKey = ConfigUtil.get("website_map_key");
+        String value = mapKey.get("tencent_map_key");
+        value = envStatus ? "******" : value;
+        mapKey.put("tencent_map_key", value);
+        return mapKey;
+    }
+
+    /**
+     * 设置地图的配置
+     *
+     * @param
+     * @return Object
+     * @author fzr
+     */
+    @PostMapping("/setMapKey")
+    public void setMapKey(@RequestBody Map<String, String> params) {
+        for (Map.Entry<String, String> entry : params.entrySet()) {
+            ConfigUtil.set("website_map_key", entry.getKey(), entry.getValue());
+        }
+    }
+}

+ 102 - 0
like-admin/src/main/java/com/mdd/admin/controller/staff/StaffController.java

@@ -0,0 +1,102 @@
+package com.mdd.admin.controller.staff;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.staff.IStaffService;
+import com.mdd.admin.validate.staff.StaffParam;
+import com.mdd.admin.validate.staff.StaffStatusParam;
+import com.mdd.admin.vo.staff.StaffDetailVo;
+import com.mdd.admin.vo.staff.StaffListVo;
+import com.mdd.admin.vo.staff.StaffPageParam;
+import com.mdd.common.core.PageResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * 师傅管理
+ */
+@Api(tags = "师傅管理")
+@RestController
+@RequestMapping("api/staff")
+public class StaffController {
+
+    @Resource
+    IStaffService iStaffService;
+
+    /**
+     * 师傅列表
+     *
+     * @param params 搜索参数
+     * @return Object
+     */
+    @ApiOperation(value = "师傅管理 - 分页列表")
+    @PostMapping("/list")
+    public PageResult<StaffListVo> list(@RequestBody StaffPageParam params) {
+        return iStaffService.list(params);
+    }
+
+    /**
+     * 师傅详情
+     *
+     * @param id 主键ID
+     * @return Object
+     */
+    @ApiOperation(value = "师傅管理 - 师傅详情")
+    @GetMapping("/detail")
+    public StaffDetailVo detail(@RequestParam("id") Long id) {
+        return iStaffService.detail(id);
+    }
+
+    /**
+     * 师傅新增
+     *
+     * @param staffParam 参数
+     * @return Object
+     */
+    @ApiOperation(value = "师傅管理 - 师傅新增")
+    @Log(title = "师傅新增")
+    @PostMapping("/add")
+    public void add(@Validated(value = StaffParam.create.class) @RequestBody StaffParam staffParam) {
+        iStaffService.add(staffParam);
+    }
+
+    /**
+     * 师傅编辑
+     *
+     * @param staffParam 参数
+     * @return Object
+     */
+    @ApiOperation(value = "师傅管理 - 师傅编辑")
+    @Log(title = "师傅编辑")
+    @PostMapping("/edit")
+    public void edit(@Validated(value = StaffParam.update.class) @RequestBody StaffParam staffParam) {
+        iStaffService.edit(staffParam);
+    }
+
+    /**
+     * 师傅删除
+     *
+     * @return Object
+     */
+    @ApiOperation(value = "师傅管理 - 师傅删除")
+    @Log(title = "师傅删除")
+    @GetMapping("/del")
+    public void del(@RequestParam("id") Long id) {
+        iStaffService.del(id);
+    }
+
+    /**
+     * 师傅删除
+     *
+     * @return Object
+     */
+    @ApiOperation(value = "师傅管理 - 师傅状态变更")
+    @Log(title = "师傅启动/禁用")
+    @PostMapping("/status")
+    public void status(@RequestBody StaffStatusParam statusParam) {
+        iStaffService.status(statusParam);
+    }
+}

+ 136 - 0
like-admin/src/main/java/com/mdd/admin/controller/system/AuthAdminController.java

@@ -0,0 +1,136 @@
+package com.mdd.admin.controller.system;
+
+import com.mdd.admin.LikeAdminThreadLocal;
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.system.ISystemAuthAdminService;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.validate.system.SystemAuthAdminParam;
+import com.mdd.admin.vo.system.SystemAuthAdminVo;
+import com.mdd.admin.vo.system.SystemAuthSelfVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.validator.annotation.IDMust;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 系统管理员管理
+ */
+@RestController
+@RequestMapping("api/system/admin")
+public class AuthAdminController {
+
+    @Resource
+    ISystemAuthAdminService iSystemAuthAdminService;
+
+    /**
+     * 管理员列表
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/list")
+    public Object list(@Validated PageParam pageParam,
+                        @RequestParam Map<String, String> params) {
+        PageResult<SystemAuthAdminVo> list = iSystemAuthAdminService.list(pageParam, params);
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 管理员信息
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/self")
+    public Object self() {
+        Integer adminId = LikeAdminThreadLocal.getAdminId();
+        SystemAuthSelfVo vo = iSystemAuthAdminService.self(adminId);
+        return AjaxResult.success(vo);
+    }
+
+    /**
+     * 管理员详情
+     *
+     * @author fzr
+     * @param id 主键ID
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        SystemAuthAdminVo vo = iSystemAuthAdminService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    /**
+     * 管理员新增
+     *
+     * @author fzr
+     * @param systemAuthAdminParam 参数
+     * @return Object
+     */
+    @Log(title = "管理员新增")
+    @PostMapping("/add")
+    public Object add(@Validated(value = SystemAuthAdminParam.create.class) @RequestBody SystemAuthAdminParam systemAuthAdminParam) {
+        iSystemAuthAdminService.add(systemAuthAdminParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 管理员编辑
+     *
+     * @author fzr
+     * @param systemAuthAdminParam 参数
+     * @return Object
+     */
+    @Log(title = "管理员编辑")
+    @PostMapping("/edit")
+    public Object edit(@Validated(value = SystemAuthAdminParam.update.class) @RequestBody SystemAuthAdminParam systemAuthAdminParam) {
+        iSystemAuthAdminService.edit(systemAuthAdminParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 当前管理员更新
+     *
+     * @author fzr
+     * @return Object
+     */
+    @Log(title = "管理员更新")
+    @PostMapping("/upInfo")
+    public Object upInfo(@Validated(value = SystemAuthAdminParam.upInfo.class) @RequestBody SystemAuthAdminParam systemAuthAdminParam) {
+        Integer adminId = LikeAdminThreadLocal.getAdminId();
+        iSystemAuthAdminService.upInfo(systemAuthAdminParam, adminId);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 管理员删除
+     *
+     * @author fzr
+     * @return Object
+     */
+    @Log(title = "管理员删除")
+    @PostMapping("/del")
+    public Object del(@Validated(value = SystemAuthAdminParam.delete.class) @RequestBody SystemAuthAdminParam systemAuthAdminParam) {
+        iSystemAuthAdminService.del(systemAuthAdminParam.getId());
+        return AjaxResult.success();
+    }
+
+    /**
+     * 管理员状态切换
+     *
+     * @author fzr
+     * @return Object
+     */
+    @Log(title = "管理员状态切换")
+    @PostMapping("/disable")
+    public Object disable(@Validated(value = SystemAuthAdminParam.delete.class) @RequestBody SystemAuthAdminParam systemAuthAdminParam) {
+        iSystemAuthAdminService.disable(systemAuthAdminParam.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 102 - 0
like-admin/src/main/java/com/mdd/admin/controller/system/AuthDeptController.java

@@ -0,0 +1,102 @@
+package com.mdd.admin.controller.system;
+
+import com.alibaba.fastjson.JSONArray;
+import com.mdd.admin.service.system.ISystemAuthDeptService;
+import com.mdd.admin.validate.system.SystemAuthDeptParam;
+import com.mdd.admin.vo.system.SystemAuthDeptVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.validator.annotation.IDMust;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 系统部门管理
+ */
+@RestController
+@RequestMapping("api/system/dept")
+public class AuthDeptController {
+
+    @Resource
+    ISystemAuthDeptService iSystemAuthDeptService;
+
+    /**
+     * 部门所有
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/all")
+    public Object all() {
+        List<SystemAuthDeptVo> vos = iSystemAuthDeptService.all();
+        return AjaxResult.success(vos);
+    }
+
+    /**
+     * 部门列表
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/list")
+    public Object list(@RequestParam Map<String, String> params) {
+        JSONArray list = iSystemAuthDeptService.list(params);
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 部门详情
+     *
+     * @author fzr
+     * @param id 主键
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        SystemAuthDeptVo vo = iSystemAuthDeptService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    /**
+     * 部门新增
+     *
+     * @author fzr
+     * @param systemAuthDeptParam 参数
+     * @return Object
+     */
+    @PostMapping("/add")
+    public Object add(@Validated(value = SystemAuthDeptParam.create.class) @RequestBody SystemAuthDeptParam systemAuthDeptParam) {
+        iSystemAuthDeptService.add(systemAuthDeptParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 部门编辑
+     *
+     * @author fzr
+     * @param systemAuthDeptParam 参数
+     * @return Object
+     */
+    @PostMapping("/edit")
+    public Object edit(@Validated(value = SystemAuthDeptParam.update.class) @RequestBody SystemAuthDeptParam systemAuthDeptParam) {
+        iSystemAuthDeptService.edit(systemAuthDeptParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 部门删除
+     *
+     * @author fzr
+     * @param systemAuthDeptParam 参数
+     * @return Object
+     */
+    @PostMapping("/del")
+    public Object del(@Validated(value = SystemAuthDeptParam.delete.class) @RequestBody SystemAuthDeptParam systemAuthDeptParam) {
+        iSystemAuthDeptService.del(systemAuthDeptParam.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 102 - 0
like-admin/src/main/java/com/mdd/admin/controller/system/AuthMenuController.java

@@ -0,0 +1,102 @@
+package com.mdd.admin.controller.system;
+
+import com.alibaba.fastjson.JSONArray;
+import com.mdd.admin.LikeAdminThreadLocal;
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.system.ISystemAuthMenuService;
+import com.mdd.admin.validate.system.SystemAuthMenuParam;
+import com.mdd.admin.vo.system.SystemAuthMenuVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.validator.annotation.IDMust;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * 系统菜单管理
+ */
+@RestController
+@RequestMapping("api/system/menu")
+public class AuthMenuController {
+
+    @Resource
+    ISystemAuthMenuService iSystemAuthMenuService;
+
+    /**
+     * 获取菜单路由
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/route")
+    public Object route() {
+        Integer roleId = LikeAdminThreadLocal.getRoleId();
+        JSONArray lists = iSystemAuthMenuService.selectMenuByRoleId(roleId);
+        return AjaxResult.success(lists);
+    }
+
+    /**
+     * 获取菜单列表
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/list")
+    public Object list() {
+        JSONArray lists = iSystemAuthMenuService.list();
+        return AjaxResult.success(lists);
+    }
+
+    /**
+     * 获取菜单详情
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        SystemAuthMenuVo vo = iSystemAuthMenuService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    /**
+     * 新增菜单
+     *
+     * @author fzr
+     * @return Object
+     */
+    @Log(title = "菜单新增")
+    @PostMapping("/add")
+    public Object add(@Validated(value = SystemAuthMenuParam.create.class) @RequestBody SystemAuthMenuParam systemAuthMenuParam) {
+        iSystemAuthMenuService.add(systemAuthMenuParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 更新菜单
+     *
+     * @author fzr
+     * @return Object
+     */
+    @Log(title = "菜单编辑")
+    @PostMapping("/edit")
+    public Object edit(@Validated(value = SystemAuthMenuParam.update.class) @RequestBody SystemAuthMenuParam systemAuthMenuParam) {
+        iSystemAuthMenuService.edit(systemAuthMenuParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 删除菜单
+     *
+     * @author fzr
+     * @return Object
+     */
+    @Log(title = "菜单删除")
+    @PostMapping("/del")
+    public Object del(@Validated(value = SystemAuthMenuParam.delete.class) @RequestBody SystemAuthMenuParam systemAuthMenuParam) {
+        iSystemAuthMenuService.del(systemAuthMenuParam.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 97 - 0
like-admin/src/main/java/com/mdd/admin/controller/system/AuthPostController.java

@@ -0,0 +1,97 @@
+package com.mdd.admin.controller.system;
+
+import com.mdd.admin.service.system.ISystemAuthPostService;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.validate.system.SystemAuthPostParam;
+import com.mdd.admin.vo.system.SystemAuthPostVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.validator.annotation.IDMust;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 系统岗位管理
+ */
+@RestController
+@RequestMapping("api/system/post")
+public class AuthPostController {
+
+    @Resource
+    ISystemAuthPostService iSystemAuthPostService;
+
+    /**
+     * 岗位所有
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/all")
+    public Object all() {
+        List<SystemAuthPostVo> vos = iSystemAuthPostService.all();
+        return AjaxResult.success(vos);
+    }
+
+    /**
+     * 岗位列表
+     * @param pageParam 分页参数
+     * @param params 搜索参数
+     * @return Object
+     */
+    @GetMapping("/list")
+    public Object list(@Validated PageParam pageParam,
+                       @RequestParam Map<String, String> params) {
+        PageResult<SystemAuthPostVo> list = iSystemAuthPostService.list(pageParam, params);
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        SystemAuthPostVo vo = iSystemAuthPostService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    /**
+     * 岗位新增
+     *
+     * @author fzr
+     * @param systemAuthPostParam 参数
+     * @return Object
+     */
+    @PostMapping("/add")
+    public Object add(@Validated(value = SystemAuthPostParam.create.class) @RequestBody SystemAuthPostParam systemAuthPostParam) {
+        iSystemAuthPostService.add(systemAuthPostParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 岗位编辑
+     *
+     * @author fzr
+     * @param systemAuthPostParam 参数
+     * @return Object
+     */
+    @PostMapping("/edit")
+    public Object edit(@Validated(value = SystemAuthPostParam.update.class) @RequestBody SystemAuthPostParam systemAuthPostParam) {
+        iSystemAuthPostService.edit(systemAuthPostParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 岗位删除
+     *
+     * @author fzr
+     * @param systemAuthPostParam 参数
+     * @return Object
+     */
+    @PostMapping("/del")
+    public Object del(@Validated(value = SystemAuthPostParam.delete.class) @RequestBody SystemAuthPostParam systemAuthPostParam) {
+        iSystemAuthPostService.del(systemAuthPostParam.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 109 - 0
like-admin/src/main/java/com/mdd/admin/controller/system/AuthRoleController.java

@@ -0,0 +1,109 @@
+package com.mdd.admin.controller.system;
+
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.system.ISystemAuthRoleService;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.validate.system.SystemAuthRoleParam;
+import com.mdd.admin.vo.system.SystemAuthRoleVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.validator.annotation.IDMust;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 系统角色管理
+ */
+@RestController
+@RequestMapping("api/system/role")
+public class AuthRoleController {
+
+    @Resource
+    ISystemAuthRoleService iSystemAuthRoleService;
+
+    /**
+     * 角色所有
+     *
+     * @author fzr
+     * @return Object
+     */
+    @GetMapping("/all")
+    public Object all() {
+        List<Map<String, Object>> list = iSystemAuthRoleService.all();
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 角色列表
+     *
+     * @author fzr
+     * @param pageParam 分页参数
+     * @return Object
+     */
+    @Log(title = "角色列表")
+    @GetMapping("/list")
+    public Object list(@Validated PageParam pageParam) {
+        PageResult<SystemAuthRoleVo> lists = iSystemAuthRoleService.list(pageParam);
+        return AjaxResult.success(lists);
+    }
+
+    /**
+     * 角色详情
+     *
+     * @author fzr
+     * @return Object
+     */
+    @Log(title = "角色详情")
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        SystemAuthRoleVo vo = iSystemAuthRoleService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    /**
+     * 新增角色
+     *
+     * @author fzr
+     * @param systemAuthRoleParam 角色参数
+     * @return Object
+     */
+    @Log(title = "角色新增")
+    @PostMapping("/add")
+    public Object add(@Validated(value = SystemAuthRoleParam.create.class) @RequestBody SystemAuthRoleParam systemAuthRoleParam) {
+        iSystemAuthRoleService.add(systemAuthRoleParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 编辑角色
+     *
+     * @author fzr
+     * @param systemAuthRoleParam 角色参数
+     * @return Object
+     */
+    @Log(title = "角色编辑")
+    @PostMapping("/edit")
+    public Object edit(@Validated(value = SystemAuthRoleParam.create.class) @RequestBody SystemAuthRoleParam systemAuthRoleParam) {
+        iSystemAuthRoleService.edit(systemAuthRoleParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 删除角色
+     *
+     * @author fzr
+     * @param systemAuthRoleParam 角色参数
+     * @return Object
+     */
+    @Log(title = "角色删除")
+    @PostMapping("/del")
+    public Object del(@Validated(value = SystemAuthRoleParam.delete.class) @RequestBody SystemAuthRoleParam systemAuthRoleParam) {
+        iSystemAuthRoleService.del(systemAuthRoleParam.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 64 - 0
like-admin/src/main/java/com/mdd/admin/controller/system/LoginController.java

@@ -0,0 +1,64 @@
+package com.mdd.admin.controller.system;
+
+import com.mdd.admin.service.system.ISystemLoginService;
+import com.mdd.admin.validate.system.SystemLoginParam;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.exception.LoginException;
+import com.mdd.common.exception.OperateException;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+/**
+ * 系统登录管理
+ */
+@RestController("systemLoginController")
+@RequestMapping("api/system")
+public class LoginController {
+
+    @Resource
+    ISystemLoginService iSystemLoginService;
+
+    /**
+     * 登录系统
+     *
+     * @author fzr
+     * @param systemLoginParam 登录参数
+     * @return Object
+     */
+    @PostMapping("/login")
+    public Object login(@Validated() @RequestBody SystemLoginParam systemLoginParam) {
+        try {
+            Map<String, Object> map = iSystemLoginService.login(systemLoginParam);
+            return AjaxResult.success(map);
+        } catch (LoginException e) {
+            return AjaxResult.failed(e.getCode(), e.getMsg());
+        } catch (OperateException e) {
+            return AjaxResult.failed(e.getMsg());
+        }
+    }
+
+    /**
+     * 退出登录
+     *
+     * @author fzr
+     * @param request 请求接口
+     * @return Object
+     */
+    @PostMapping("/logout")
+    public Object logout(HttpServletRequest request) {
+        try {
+            iSystemLoginService.logout(request.getHeader("token"));
+            return AjaxResult.success();
+        } catch (Exception e) {
+            return AjaxResult.failed(e.getMessage());
+        }
+    }
+
+}

+ 54 - 0
like-admin/src/main/java/com/mdd/admin/controller/system/LogsController.java

@@ -0,0 +1,54 @@
+package com.mdd.admin.controller.system;
+
+import com.mdd.admin.service.system.ISystemLogsServer;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.vo.system.LogLoginVo;
+import com.mdd.admin.vo.system.LogOperateVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 系统日志管理
+ */
+@RestController("systemLogController")
+@RequestMapping("api/system/log")
+public class LogsController {
+
+    @Resource
+    ISystemLogsServer iSystemLogsServer;
+
+    /**
+     * 系统操作日志
+     *
+     * @author fzr
+     * @param params 搜索参数
+     * @return Object
+     */
+    @GetMapping("/operate")
+    public Object operate(@Validated PageParam pageParam, @RequestParam Map<String, String> params) {
+        PageResult<LogOperateVo> list = iSystemLogsServer.operate(pageParam, params);
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 系统登录日志
+     *
+     * @author fzr
+     * @param params 搜索参数
+     * @return Object
+     */
+    @GetMapping("/login")
+    public Object login(@Validated PageParam pageParam, @RequestParam Map<String, String> params) {
+        PageResult<LogLoginVo> list = iSystemLogsServer.login(pageParam, params);
+        return AjaxResult.success(list);
+    }
+
+}

+ 81 - 0
like-admin/src/main/java/com/mdd/admin/controller/user/UserController.java

@@ -0,0 +1,81 @@
+package com.mdd.admin.controller.user;
+
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.mdd.admin.config.aop.Log;
+import com.mdd.admin.service.user.IUserService;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.validate.user.UserWalletValidate;
+import com.mdd.admin.vo.user.UserVo;
+import com.mdd.common.core.AjaxResult;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.validator.annotation.IDMust;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 用户管理
+ */
+@RestController
+@RequestMapping("api/user")
+public class UserController {
+
+    @Resource
+    IUserService iUserService;
+
+    /**
+     * 用户列表
+     *
+     * @author fzr
+     * @param pageParam 分页参数
+     * @param params 搜索参数
+     * @return Object
+     */
+    @GetMapping("/list")
+    public Object list(@Validated PageParam pageParam,
+                       @RequestParam Map<String, String> params) {
+        PageResult<UserVo> list = iUserService.list(pageParam, params);
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 用户详情
+     *
+     * @author fzr
+     * @param id 主键
+     * @return Object
+     */
+    @GetMapping("/detail")
+    public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        UserVo vo = iUserService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    /**
+     * 用户编辑
+     *
+     * @author fzr
+     * @param params 参数
+     * @return Object
+     */
+    @PostMapping("/edit")
+    public Object edit(@RequestBody Map<String, String> params) {
+        Assert.notNull(params.get("id"), "id参数缺失");
+        Assert.notNull(params.get("field"), "field参数缺失");
+        Assert.notNull(params.get("value"), "value参数缺失");
+        iUserService.edit(params);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "余额调整")
+    @PostMapping("/adjustWallet")
+    @ApiOperation(value="余额调整")
+    public AjaxResult adjustWallet(@Validated @RequestBody UserWalletValidate walletValidate) {
+        iUserService.adjustWallet(walletValidate);
+        return AjaxResult.success();
+    }
+
+}

+ 23 - 0
like-admin/src/main/java/com/mdd/admin/service/account/IAccountLogService.java

@@ -0,0 +1,23 @@
+package com.mdd.admin.service.account;
+
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.vo.account.AccountLogListVo;
+import com.mdd.common.core.PageResult;
+
+import java.util.Map;
+
+/**
+ * @author kn4im3
+ * @date 2023/3/8 09:28
+ */
+public interface IAccountLogService {
+
+    /**
+     * 余额明细列表
+     *
+     * @param pageParam 分页参数
+     * @param params 参数
+     * @return Object
+     */
+    PageResult<AccountLogListVo> list(PageParam pageParam, Map<String, String> params);
+}

+ 73 - 0
like-admin/src/main/java/com/mdd/admin/service/account/impl/AccountLogServiceImpl.java

@@ -0,0 +1,73 @@
+package com.mdd.admin.service.account.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.query.MPJQueryWrapper;
+import com.mdd.admin.service.account.IAccountLogService;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.vo.account.AccountLogListVo;
+import com.mdd.common.config.GlobalConfig;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.entity.account.AccountLog;
+import com.mdd.common.enums.AccountEnum;
+import com.mdd.common.mapper.account.AccountLogMapper;
+import com.mdd.common.utils.StringUtil;
+import com.mdd.common.utils.TimeUtil;
+import com.mdd.common.utils.UrlUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.LinkedList;
+import java.util.Map;
+
+/**
+ * @author kn4im3
+ * @date 2023/3/8 09:29
+ */
+@Service
+public class AccountLogServiceImpl implements IAccountLogService {
+
+    @Resource
+    private AccountLogMapper accountLogMapper;
+
+    /**
+     * 余额信息列表
+     *
+     * @param pageParam 分页参数
+     * @param params    参数
+     * @return Object
+     */
+    @Override
+    public PageResult<AccountLogListVo> list(PageParam pageParam, Map<String, String> params) {
+        Integer pageNo = pageParam.getPageNo();
+        Integer pageSize = pageParam.getPageSize();
+        MPJQueryWrapper<AccountLog> mpjQueryWrapper = new MPJQueryWrapper<>();
+        mpjQueryWrapper.selectAll(AccountLog.class)
+                .select("u.nickname as nickname", "u.avatar as avatar", "u.sn as userSn", "u.username as username")
+                .innerJoin("?_user u ON t.user_id = u.id".replace("?_", GlobalConfig.tablePrefix))
+                .orderByDesc("t.id");
+        if (StringUtil.isNotEmpty(params.get("userInfo"))) {
+            String userInfo = params.get("userInfo");
+            mpjQueryWrapper.nested(wq -> wq
+                    .like("u.username", userInfo).or()
+                    .like("u.nickname", userInfo).or()
+                    .like("u.mobile", userInfo));
+        }
+        accountLogMapper.setSearch(mpjQueryWrapper, params, new String[]{
+                "=:changeType@t.change_type:int",
+                "datetime:startTime-endTime@t.create_time:str"
+        });
+        IPage<AccountLogListVo> iPage = accountLogMapper.selectJoinPage(
+                new Page<>(pageNo, pageSize),
+                AccountLogListVo.class,
+                mpjQueryWrapper);
+        LinkedList<AccountLogListVo> list = new LinkedList<>();
+        iPage.getRecords().forEach(item -> {
+            item.setChangeTypeDesc(AccountEnum.getMsgByCode(item.getChangeType()));
+            item.setAvatar(UrlUtil.toAbsoluteUrl(item.getAvatar()));
+            item.setCreateTime(TimeUtil.timestampToDate(item.getCreateTime()));
+            list.add(item);
+        });
+        return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list);
+    }
+}

+ 66 - 0
like-admin/src/main/java/com/mdd/admin/service/article/IArticleArchivesService.java

@@ -0,0 +1,66 @@
+package com.mdd.admin.service.article;
+
+import com.mdd.admin.validate.article.ArticleParam;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.vo.article.ArticleDetailVo;
+import com.mdd.admin.vo.article.ArticleListVo;
+import com.mdd.common.core.PageResult;
+
+import java.util.Map;
+
+/**
+ * 文章服务接口类
+ */
+public interface IArticleArchivesService {
+
+    /**
+     * 文章列表
+     *
+     * @author fzr
+     * @param pageParam 分页参数
+     * @param params 搜索参数
+     * @return PageResult<ArticleListVo>
+     */
+    PageResult<ArticleListVo> list(PageParam pageParam, Map<String, String> params);
+
+    /**
+     * 文章详情
+     *
+     * @author fzr
+     * @param id 主键ID
+     */
+    ArticleDetailVo detail(Integer id);
+
+    /**
+     * 文章新增
+     *
+     * @author fzr
+     * @param articleParam 文章参数
+     */
+    void add(ArticleParam articleParam);
+
+    /**
+     * 文章编辑
+     *
+     * @author fzr
+     * @param articleParam 文章参数
+     */
+    void edit(ArticleParam articleParam);
+
+    /**
+     * 文章删除
+     *
+     * @author fzr
+     * @param id 文章主键
+     */
+    void del(Integer id);
+
+    /**
+     * 文章状态
+     *
+     * @author fzr
+     * @param id 文章主键
+     */
+    void change(Integer id);
+
+}

+ 74 - 0
like-admin/src/main/java/com/mdd/admin/service/article/IArticleCategoryService.java

@@ -0,0 +1,74 @@
+package com.mdd.admin.service.article;
+
+import com.mdd.admin.validate.article.CategoryParam;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.vo.article.ArticleCateVo;
+import com.mdd.common.core.PageResult;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 文章分类服接口务类
+ */
+public interface IArticleCategoryService {
+
+    /**
+     * 分类所有
+     *
+     * @author fzr
+     * @return List<CategoryVo>
+     */
+    List<ArticleCateVo> all();
+
+    /**
+     * 分类列表
+     *
+     * @author fzr
+     * @param pageParam 分页参数
+     * @param params 搜索参数
+     * @return PageResult<CategoryVo>
+     */
+    PageResult<ArticleCateVo> list(PageParam pageParam, Map<String, String> params);
+
+    /**
+     * 分类详情
+     *
+     * @author fzr
+     * @param id 分类ID
+     */
+    ArticleCateVo detail(Integer id);
+
+    /**
+     * 分类新增
+     *
+     * @author fzr
+     * @param categoryParam 分类参数
+     */
+    void add(CategoryParam categoryParam);
+
+    /**
+     * 分类编辑
+     *
+     * @author fzr
+     * @param categoryParam 分类参数
+     */
+    void edit(CategoryParam categoryParam);
+
+    /**
+     * 分类删除
+     *
+     * @author fzr
+     * @param id 分类ID
+     */
+    void del(Integer id);
+
+    /**
+     * 分类状态
+     *
+     * @author fzr
+     * @param id 分类ID
+     */
+    void change(Integer id);
+
+}

+ 210 - 0
like-admin/src/main/java/com/mdd/admin/service/article/impl/ArticleArchivesServiceImpl.java

@@ -0,0 +1,210 @@
+package com.mdd.admin.service.article.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.query.MPJQueryWrapper;
+import com.mdd.admin.service.article.IArticleArchivesService;
+import com.mdd.admin.validate.article.ArticleParam;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.vo.article.ArticleDetailVo;
+import com.mdd.admin.vo.article.ArticleListVo;
+import com.mdd.common.config.GlobalConfig;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.entity.article.Article;
+import com.mdd.common.entity.article.ArticleCategory;
+import com.mdd.common.mapper.article.ArticleCategoryMapper;
+import com.mdd.common.mapper.article.ArticleMapper;
+import com.mdd.common.utils.StringUtil;
+import com.mdd.common.utils.TimeUtil;
+import com.mdd.common.utils.UrlUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.util.Assert;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.Map;
+
+/**
+ * 文章服务实现类
+ */
+@Service
+public class ArticleArchivesServiceImpl implements IArticleArchivesService {
+
+    @Resource
+    ArticleMapper articleMapper;
+
+    @Resource
+    ArticleCategoryMapper articleCategoryMapper;
+
+    /**
+     * 文章列表
+     *
+     * @author fzr
+     * @param pageParam 分页参数
+     * @param params 搜索参数
+     * @return PageResult<ArticleListVo>
+     */
+    @Override
+    public PageResult<ArticleListVo> list(PageParam pageParam, Map<String, String> params) {
+        Integer pageNo   = pageParam.getPageNo();
+        Integer pageSize = pageParam.getPageSize();
+
+        MPJQueryWrapper<Article> mpjQueryWrapper = new MPJQueryWrapper<Article>()
+                .selectAll(Article.class)
+                .select("ac.name as category")
+                .innerJoin("?_article_category ac ON ac.id=t.cid".replace("?_", GlobalConfig.tablePrefix))
+                .eq("t.is_delete", 0)
+                .orderByDesc(Arrays.asList("t.sort", "t.id"));
+
+        articleMapper.setSearch(mpjQueryWrapper, params, new String[]{
+                "like:title@t.title:str",
+                "=:cid@t.cid:int",
+                "=:isShow@t.is_show:int",
+                "datetime:startTime-endTime@t.create_time:str"
+        });
+
+        IPage<ArticleListVo> iPage = articleMapper.selectJoinPage(
+                new Page<>(pageNo, pageSize),
+                ArticleListVo.class,
+                mpjQueryWrapper);
+
+        for (ArticleListVo vo : iPage.getRecords()) {
+            vo.setImage(UrlUtil.toAbsoluteUrl(vo.getImage()));
+            vo.setCreateTime(TimeUtil.timestampToDate(vo.getCreateTime()));
+            vo.setUpdateTime(TimeUtil.timestampToDate(vo.getUpdateTime()));
+        }
+
+        return PageResult.iPageHandle(iPage);
+    }
+
+    /**
+     * 文章详情
+     *
+     * @author fzr
+     * @param id 主键ID
+     */
+    @Override
+    public ArticleDetailVo detail(Integer id) {
+        Article model = articleMapper.selectOne(
+                new QueryWrapper<Article>()
+                        .select(Article.class, info->
+                          !info.getColumn().equals("is_delete") &&
+                          !info.getColumn().equals("delete_time"))
+                        .eq("id", id)
+                        .eq("is_delete", 0));
+
+        Assert.notNull(model, "文章不存在");
+
+        ArticleDetailVo vo = new ArticleDetailVo();
+        BeanUtils.copyProperties(model, vo);
+        vo.setContent(StringUtil.isNull(model.getContent()) ? "" : model.getContent());
+        vo.setImage(UrlUtil.toAbsoluteUrl(model.getImage()));
+        vo.setCreateTime(TimeUtil.timestampToDate(model.getCreateTime()));
+        vo.setUpdateTime(TimeUtil.timestampToDate(model.getUpdateTime()));
+
+        return vo;
+    }
+
+    /**
+     * 文章新增
+     *
+     * @author fzr
+     * @param articleParam 文章参数
+     */
+    @Override
+    public void add(ArticleParam articleParam) {
+        Article model = new Article();
+        model.setCid(articleParam.getCid());
+        model.setTitle(articleParam.getTitle());
+        model.setImage(UrlUtil.toRelativeUrl(articleParam.getImage()));
+        model.setIntro(articleParam.getIntro());
+        model.setContent(articleParam.getContent());
+        model.setSummary(articleParam.getSummary());
+        model.setSort(articleParam.getSort());
+        model.setIsShow(articleParam.getIsShow());
+        model.setAuthor(articleParam.getAuthor());
+        model.setVisit(articleParam.getVisit());
+        model.setCreateTime(TimeUtil.timestamp());
+        model.setUpdateTime(TimeUtil.timestamp());
+        articleMapper.insert(model);
+    }
+
+    /**
+     * 文章编辑
+     *
+     * @author fzr
+     * @param articleParam 文章参数
+     */
+    @Override
+    public void edit(ArticleParam articleParam) {
+        Article model = articleMapper.selectOne(
+                new QueryWrapper<Article>()
+                .eq("id", articleParam.getId())
+                .eq("is_delete", 0));
+
+        Assert.notNull(model, "文章不存在!");
+
+        Assert.notNull(articleCategoryMapper.selectOne(
+                new QueryWrapper<ArticleCategory>()
+                .eq("id", articleParam.getCid())
+                .eq("is_delete", 0)), "分类不存在");
+
+        model.setCid(articleParam.getCid());
+        model.setTitle(articleParam.getTitle());
+        model.setImage(UrlUtil.toRelativeUrl(articleParam.getImage()));
+        model.setIntro(articleParam.getIntro());
+        model.setContent(articleParam.getContent());
+        model.setSummary(articleParam.getSummary());
+        model.setVisit(articleParam.getVisit());
+        model.setIsShow(articleParam.getIsShow());
+        model.setAuthor(articleParam.getAuthor());
+        model.setSort(articleParam.getSort());
+        model.setUpdateTime(TimeUtil.timestamp());
+        articleMapper.updateById(model);
+    }
+
+    /**
+     * 文章删除
+     *
+     * @author fzr
+     * @param id 文章ID
+     */
+    @Override
+    public void del(Integer id) {
+        Article article = articleMapper.selectOne(
+                new QueryWrapper<Article>()
+                        .select("id,is_show")
+                        .eq("id", id)
+                        .eq("is_delete", 0));
+
+        Assert.notNull(article, "文章不存在!");
+
+        article.setIsDelete(1);
+        article.setDeleteTime(TimeUtil.timestamp());
+        articleMapper.updateById(article);
+    }
+
+    /**
+     * 文章状态
+     *
+     * @author fzr
+     * @param id 文章主键
+     */
+    @Override
+    public void change(Integer id) {
+        Article article = articleMapper.selectOne(
+                new QueryWrapper<Article>()
+                        .select("id,is_show")
+                        .eq("id", id)
+                        .eq("is_delete", 0));
+
+        Assert.notNull(article, "文章不存在!");
+
+        article.setIsShow(article.getIsShow()==0?1:0);
+        article.setUpdateTime(TimeUtil.timestamp());
+        articleMapper.updateById(article);
+    }
+
+}

+ 229 - 0
like-admin/src/main/java/com/mdd/admin/service/article/impl/ArticleCategoryServiceImpl.java

@@ -0,0 +1,229 @@
+package com.mdd.admin.service.article.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mdd.admin.service.article.IArticleCategoryService;
+import com.mdd.admin.validate.article.CategoryParam;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.vo.article.ArticleCateVo;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.entity.article.Article;
+import com.mdd.common.entity.article.ArticleCategory;
+import com.mdd.common.exception.OperateException;
+import com.mdd.common.mapper.article.ArticleCategoryMapper;
+import com.mdd.common.mapper.article.ArticleMapper;
+import com.mdd.common.utils.TimeUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.util.Assert;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 文章分类服务实现类
+ */
+@Service
+public class ArticleCategoryServiceImpl implements IArticleCategoryService {
+
+    @Resource
+    ArticleCategoryMapper articleCategoryMapper;
+
+    @Resource
+    ArticleMapper articleMapper;
+
+    /**
+     * 分类所有
+     *
+     * @author fzr
+     * @return List<CategoryVo>
+     */
+    @Override
+    public List<ArticleCateVo> all() {
+        QueryWrapper<ArticleCategory> queryWrapper = new QueryWrapper<>();
+        queryWrapper.select("id", "name", "sort", "is_show", "create_time", "update_time")
+                .eq("is_delete", 0)
+                .orderByDesc(Arrays.asList("sort", "id"));
+
+        List<ArticleCategory> lists = articleCategoryMapper.selectList(queryWrapper);
+
+        List<ArticleCateVo> vos = new ArrayList<>();
+        for (ArticleCategory category : lists) {
+            ArticleCateVo vo = new ArticleCateVo();
+            BeanUtils.copyProperties(category, vo);
+
+            vo.setCreateTime(TimeUtil.timestampToDate(vo.getCreateTime()));
+            vo.setUpdateTime(TimeUtil.timestampToDate(vo.getUpdateTime()));
+            vos.add(vo);
+        }
+
+        return vos;
+    }
+
+    /**
+     * 分类列表
+     *
+     * @param pageParam 分页参数
+     * @param params 搜索参数
+     * @return PageResult<CategoryVo>
+     */
+    @Override
+    public PageResult<ArticleCateVo> list(PageParam pageParam, Map<String, String> params) {
+        Integer pageNo   = pageParam.getPageNo();
+        Integer pageSize = pageParam.getPageSize();
+
+        QueryWrapper<ArticleCategory> queryWrapper = new QueryWrapper<>();
+        queryWrapper.select("id", "name", "sort", "is_show", "create_time", "update_time")
+                .eq("is_delete", 0)
+                .orderByDesc(Arrays.asList("sort", "id"));
+
+        articleCategoryMapper.setSearch(queryWrapper, params, new String[]{
+                "like:name:str",
+                "=:isShow@is_show:int"
+        });
+
+        IPage<ArticleCategory> iPage = articleCategoryMapper.selectPage(new Page<>(pageNo, pageSize), queryWrapper);
+
+        List<ArticleCateVo> list = new ArrayList<>();
+        for (ArticleCategory category : iPage.getRecords()) {
+            ArticleCateVo vo = new ArticleCateVo();
+            BeanUtils.copyProperties(category, vo);
+
+            Integer number = articleMapper.selectCount(new QueryWrapper<Article>()
+                    .eq("cid", category.getId())
+                    .eq("is_delete", 0));
+
+            vo.setNumber(number);
+            vo.setCreateTime(TimeUtil.timestampToDate(vo.getCreateTime()));
+            vo.setUpdateTime(TimeUtil.timestampToDate(vo.getUpdateTime()));
+            list.add(vo);
+        }
+
+        return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list);
+    }
+
+    /**
+     * 分类详情
+     *
+     * @author fzr
+     * @param id 分类ID
+     * @return CategoryVo
+     */
+    @Override
+    public ArticleCateVo detail(Integer id) {
+        ArticleCategory model = articleCategoryMapper.selectOne(
+                new QueryWrapper<ArticleCategory>()
+                        .select(ArticleCategory.class, info->
+                          !info.getColumn().equals("is_delete") &&
+                          !info.getColumn().equals("delete_time"))
+                        .eq("id", id)
+                        .eq("is_delete", 0));
+
+        Assert.notNull(model, "分类不存在");
+
+        ArticleCateVo vo = new ArticleCateVo();
+        BeanUtils.copyProperties(model, vo);
+        vo.setCreateTime(TimeUtil.timestampToDate(model.getCreateTime()));
+        vo.setUpdateTime(TimeUtil.timestampToDate(model.getUpdateTime()));
+
+        return vo;
+    }
+
+    /**
+     * 分类新增
+     *
+     * @author fzr
+     * @param categoryParam 分类参数
+     */
+    @Override
+    public void add(CategoryParam categoryParam) {
+        if (categoryParam.getName().trim().equals("")) {
+            throw new OperateException("名称不允许为空值!");
+        }
+
+        ArticleCategory model = new ArticleCategory();
+        model.setId(categoryParam.getId());
+        model.setName(categoryParam.getName());
+        model.setSort(categoryParam.getSort());
+        model.setIsShow(model.getIsShow());
+        model.setCreateTime(TimeUtil.timestamp());
+        model.setUpdateTime(TimeUtil.timestamp());
+        articleCategoryMapper.insert(model);
+    }
+
+    /**
+     * 分类编辑
+     *
+     * @author fzr
+     * @param categoryParam 分类参数
+     */
+    @Override
+    public void edit(CategoryParam categoryParam) {
+        if (categoryParam.getName().trim().equals("")) {
+            throw new OperateException("名称不允许为空值!");
+        }
+
+        ArticleCategory model = articleCategoryMapper.selectOne(
+                new QueryWrapper<ArticleCategory>()
+                        .select(ArticleCategory.class, info->
+                           !info.getColumn().equals("is_delete") &&
+                           !info.getColumn().equals("delete_time"))
+                        .eq("id", categoryParam.getId())
+                        .eq("is_delete", 0));
+
+        Assert.notNull(model, "分类不存在");
+
+        model.setName(categoryParam.getName());
+        model.setSort(categoryParam.getSort());
+        model.setIsShow(categoryParam.getIsShow());
+        model.setUpdateTime(TimeUtil.timestamp());
+        articleCategoryMapper.updateById(model);
+    }
+
+    /**
+     * 分类参数
+     *
+     * @author fzr
+     * @param id 分类ID
+     */
+    @Override
+    public void del(Integer id) {
+        ArticleCategory model = articleCategoryMapper.selectOne(
+                new QueryWrapper<ArticleCategory>()
+                        .select("id,is_show")
+                        .eq("id", id)
+                        .eq("is_delete", 0));
+
+        Assert.notNull(model, "分类不存在");
+
+        model.setIsDelete(1);
+        model.setDeleteTime(TimeUtil.timestamp());
+        articleCategoryMapper.updateById(model);
+    }
+
+    /**
+     * 分类状态
+     *
+     * @author fzr
+     * @param id 分类ID
+     */
+    @Override
+    public void change(Integer id) {
+        ArticleCategory model = articleCategoryMapper.selectOne(
+                new QueryWrapper<ArticleCategory>()
+                        .select("id,is_show")
+                        .eq("id", id)
+                        .eq("is_delete", 0));
+
+        Assert.notNull(model, "分类不存在");
+
+        model.setIsShow(model.getIsShow()==0?1:0);
+        model.setUpdateTime(TimeUtil.timestamp());
+        articleCategoryMapper.updateById(model);
+    }
+
+}

+ 58 - 0
like-admin/src/main/java/com/mdd/admin/service/category/IGoodsCategoryService.java

@@ -0,0 +1,58 @@
+package com.mdd.admin.service.category;
+
+import com.mdd.admin.validate.category.GoodsCategoryParam;
+import com.mdd.admin.vo.category.GoodsCategoryListVo;
+import com.mdd.admin.vo.category.GoodsCategoryDetailVo;
+import com.mdd.common.entity.category.GoodsCategory;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 服务分类服务接口类
+ */
+public interface IGoodsCategoryService {
+
+    /**
+     * 服务分类列表
+     *
+     * @param params 搜索参数
+     * @return PageResult<GoodsCategoryVo>
+     */
+    List<GoodsCategoryListVo> list(Map<String, String> params);
+
+    /**
+     * 服务分类详情
+     *
+     * @param id 主键ID
+     * @return GoodsCategory
+     */
+    GoodsCategoryDetailVo detail(Long id);
+
+    /**
+     * 服务分类新增
+     *
+     * @param goodsCategoryParam 参数
+     */
+    void add(GoodsCategoryParam goodsCategoryParam);
+
+    /**
+     * 服务分类编辑
+     *
+     * @param goodsCategoryParam 参数
+     */
+    void edit(GoodsCategoryParam goodsCategoryParam);
+
+    /**
+     * 服务分类删除
+     *
+     * @param id 主键ID
+     */
+    void del(Long id);
+
+    List<GoodsCategoryListVo> listPid();
+
+    void updateStatus(Long id, Integer isShow);
+
+    List<GoodsCategory> listByIds(List<Long> categoryIds);
+}

+ 300 - 0
like-admin/src/main/java/com/mdd/admin/service/category/impl/GoodsCategoryServiceImpl.java

@@ -0,0 +1,300 @@
+package com.mdd.admin.service.category.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.mdd.admin.service.category.IGoodsCategoryService;
+import com.mdd.admin.validate.category.GoodsCategoryParam;
+import com.mdd.admin.validate.common.PageParam;
+import com.mdd.admin.vo.category.GoodsCategoryDetailVo;
+import com.mdd.admin.vo.category.GoodsCategoryListVo;
+import com.mdd.common.constant.GlobalConstant;
+import com.mdd.common.core.PageResult;
+import com.mdd.common.entity.category.GoodsCategory;
+import com.mdd.common.entity.goods.Goods;
+import com.mdd.common.enums.RecommendEnum;
+import com.mdd.common.enums.ShowEnum;
+import com.mdd.common.exception.OperateException;
+import com.mdd.common.mapper.category.GoodsCategoryMapper;
+import com.mdd.common.mapper.goods.GoodsMapper;
+import com.mdd.common.utils.TimeUtil;
+import com.mdd.common.utils.UrlUtil;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.util.Assert;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 服务分类实现类
+ */
+@Service
+public class GoodsCategoryServiceImpl extends ServiceImpl<GoodsCategoryMapper, GoodsCategory> implements IGoodsCategoryService {
+
+    @Resource
+    GoodsCategoryMapper goodsCategoryMapper;
+
+    @Resource
+    private GoodsMapper goodsMapper;
+
+    /**
+     * 服务分类列表
+     *
+     * @param params    搜索参数
+     * @return PageResult<GoodsCategoryListVo>
+     */
+    @Override
+    public List<GoodsCategoryListVo> list(Map<String, String> params) {
+        QueryWrapper<GoodsCategory> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("is_delete", GlobalConstant.NOT_DELETE);
+        queryWrapper.eq("pid", 0);
+        queryWrapper.orderByDesc("sort");
+        queryWrapper.orderByDesc("create_time");
+
+        goodsCategoryMapper.setSearch(queryWrapper, params, new String[]{
+                "like:name:str",
+                "=:pid:long",
+                "=:level:int",
+                "=:image:str",
+                "=:sort:int",
+                "=:isShow@is_show:int",
+                "=:isRecommend@is_recommend:int",
+        });
+
+        List<GoodsCategory> goodsCategories = goodsCategoryMapper.selectList(queryWrapper);
+        List<GoodsCategoryListVo> list = new LinkedList<>();
+        List<Long> pidIds = goodsCategories.stream().map(GoodsCategory::getId).distinct().collect(Collectors.toList());
+        List<GoodsCategory> pidGoods = Lists.newArrayList();
+        if (CollectionUtils.isNotEmpty(pidIds)) {
+            LambdaQueryWrapper<GoodsCategory> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+            lambdaQueryWrapper.in(GoodsCategory::getPid, pidIds);
+            lambdaQueryWrapper.eq(GoodsCategory::getIsDelete, GlobalConstant.NOT_DELETE);
+            pidGoods = goodsCategoryMapper.selectList(lambdaQueryWrapper);
+        }
+        Map<Long, List<GoodsCategory>> pidGroupGoodsMap = Maps.newHashMap();
+        if (CollectionUtils.isNotEmpty(pidGoods)) {
+            pidGroupGoodsMap = pidGoods.stream().collect(Collectors.groupingBy(GoodsCategory::getPid));
+        }
+        Map<Integer, String> recommendMap = RecommendEnum.getMap();
+        Map<Integer, String> showMap = ShowEnum.getMap();
+        for (GoodsCategory item : goodsCategories) {
+            GoodsCategoryListVo vo = new GoodsCategoryListVo();
+            BeanUtils.copyProperties(item, vo);
+            vo.setImage(UrlUtil.toAbsoluteUrl(item.getImage()));
+            vo.setCreateTime(TimeUtil.timestampToDate(item.getCreateTime()));
+            vo.setUpdateTime(TimeUtil.timestampToDate(item.getUpdateTime()));
+            vo.setIsRecommendName(recommendMap.get(vo.getIsRecommend()));
+            vo.setIsShowName(showMap.get(vo.getIsShow()));
+            if (pidGroupGoodsMap.containsKey(item.getId())) {
+                List<GoodsCategory> categoryList = pidGroupGoodsMap.get(item.getId());
+                List<GoodsCategoryListVo> sons = Lists.newArrayList();
+                for (GoodsCategory category : categoryList) {
+                    GoodsCategoryListVo son = new GoodsCategoryListVo();
+                    BeanUtils.copyProperties(category, son);
+                    son.setImage(UrlUtil.toAbsoluteUrl(category.getImage()));
+                    son.setIsRecommendName(recommendMap.get(son.getIsRecommend()));
+                    son.setIsShowName(showMap.get(son.getIsShow()));
+                    son.setCreateTime(TimeUtil.timestampToDate(category.getCreateTime()));
+                    son.setUpdateTime(TimeUtil.timestampToDate(category.getUpdateTime()));
+                    sons.add(son);
+                }
+                vo.setSons(sons);
+            }
+            list.add(vo);
+        }
+        return list;
+    }
+
+    /**
+     * 服务分类详情
+     *
+     * @param id 主键参数
+     * @return GoodsCategory
+     */
+    @Override
+    public GoodsCategoryDetailVo detail(Long id) {
+        GoodsCategory model = goodsCategoryMapper.selectOne(
+                new QueryWrapper<GoodsCategory>()
+                        .eq("id", id)
+                        .last("limit 1"));
+
+        Assert.notNull(model, "数据不存在");
+        GoodsCategoryDetailVo vo = new GoodsCategoryDetailVo();
+        BeanUtils.copyProperties(model, vo);
+        vo.setIsShowName(ShowEnum.getMap().get(vo.getIsShow()));
+        vo.setIsRecommendName(RecommendEnum.getMap().get(vo.getIsRecommend()));
+        vo.setImage(UrlUtil.toAbsoluteUrl(model.getImage()));
+        return vo;
+    }
+
+    /**
+     * 服务分类新增
+     *
+     * @param goodsCategoryParam 参数
+     */
+    @Override
+    public void add(GoodsCategoryParam goodsCategoryParam) {
+        String name = goodsCategoryParam.getName();
+        LambdaQueryWrapper<GoodsCategory> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(GoodsCategory::getName, name);
+        lambdaQueryWrapper.eq(GoodsCategory::getIsDelete, 0);
+        lambdaQueryWrapper.last("limit 1");
+        GoodsCategory category = super.getOne(lambdaQueryWrapper);
+        Assert.isNull(category, "此分类名称已存在,请重新输入!");
+        GoodsCategory model = new GoodsCategory();
+        model.setName(goodsCategoryParam.getName());
+        model.setPid(goodsCategoryParam.getPid());
+        model.setLevel(goodsCategoryParam.getLevel());
+        model.setImage(UrlUtil.toRelativeUrl(goodsCategoryParam.getImage()));
+        model.setSort(goodsCategoryParam.getSort());
+        model.setIsShow(goodsCategoryParam.getIsShow());
+        model.setIsRecommend(goodsCategoryParam.getIsRecommend());
+        model.setCreateTime(TimeUtil.timestamp());
+        model.setUpdateTime(TimeUtil.timestamp());
+        goodsCategoryMapper.insert(model);
+    }
+
+    /**
+     * 服务分类编辑
+     *
+     * @param goodsCategoryParam 参数
+     */
+    @Override
+    public void edit(GoodsCategoryParam goodsCategoryParam) {
+        GoodsCategory model = goodsCategoryMapper.selectOne(
+                new QueryWrapper<GoodsCategory>()
+                        .eq("id", goodsCategoryParam.getId())
+                        .last("limit 1"));
+
+        Assert.notNull(model, "数据不存在!");
+        if (goodsCategoryParam.getId().equals(goodsCategoryParam.getPid())) {
+            throw new OperateException("不能选择自己作为父级");
+        }
+
+        model.setId(goodsCategoryParam.getId());
+        model.setName(goodsCategoryParam.getName());
+        model.setPid(goodsCategoryParam.getPid());
+        model.setLevel(goodsCategoryParam.getLevel());
+        model.setImage(UrlUtil.toRelativeUrl(goodsCategoryParam.getImage()));
+        model.setSort(goodsCategoryParam.getSort());
+        model.setIsShow(goodsCategoryParam.getIsShow());
+        model.setIsRecommend(goodsCategoryParam.getIsRecommend());
+        model.setUpdateTime(TimeUtil.timestamp());
+        goodsCategoryMapper.updateById(model);
+        if (goodsCategoryParam.getPid() == 0) {
+            List<GoodsCategory> list = goodsCategoryMapper.selectList(
+                    new QueryWrapper<GoodsCategory>()
+                            .eq("pid", goodsCategoryParam.getId()));
+            if (CollectionUtils.isEmpty(list)) {
+                return;
+            }
+            for (GoodsCategory goodsCategory : list) {
+                goodsCategory.setIsRecommend(goodsCategoryParam.getIsRecommend());
+                goodsCategory.setUpdateTime(TimeUtil.timestamp());
+                goodsCategoryMapper.updateById(goodsCategory);
+            }
+        }
+    }
+
+    /**
+     * 服务分类删除
+     *
+     * @param id 主键ID
+     */
+    @Override
+    public void del(Long id) {
+        GoodsCategory model = goodsCategoryMapper.selectOne(
+                new QueryWrapper<GoodsCategory>()
+                        .eq("id", id)
+                        .last("limit 1"));
+
+        Assert.notNull(model, "数据不存在!");
+
+        LambdaQueryWrapper<Goods> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(Goods::getCategoryId, id);
+        lambdaQueryWrapper.eq(Goods::getIsDelete, 0);
+        lambdaQueryWrapper.last("limit 1");
+        Goods goods = goodsMapper.selectOne(lambdaQueryWrapper);
+        Assert.isNull(goods, "服务分类正在使用中,无法删除");
+        model.setDeleteTime(TimeUtil.timestamp());
+        model.setIsDelete(GlobalConstant.DELETE);
+        goodsCategoryMapper.updateById(model);
+    }
+
+    @Override
+    public List<GoodsCategoryListVo> listPid() {
+        LambdaQueryWrapper<GoodsCategory> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(GoodsCategory::getPid, GlobalConstant.DEFAULT_GOODS_PID);
+        lambdaQueryWrapper.eq(GoodsCategory::getIsDelete, 0);
+        List<GoodsCategory> list = goodsCategoryMapper.selectList(lambdaQueryWrapper);
+        if (CollectionUtils.isEmpty(list)) {
+            return Lists.newArrayList();
+        }
+        List<Long> pidIds = list.stream().map(GoodsCategory::getId).distinct().collect(Collectors.toList());
+        Map<Long, List<GoodsCategory>> groupMap = Maps.newHashMap();
+        if (CollectionUtils.isNotEmpty(pidIds)) {
+            LambdaQueryWrapper<GoodsCategory> sonLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            sonLambdaQueryWrapper.in(GoodsCategory::getPid, pidIds);
+            sonLambdaQueryWrapper.eq(GoodsCategory::getIsDelete, 0);
+            List<GoodsCategory> sonList = goodsCategoryMapper.selectList(sonLambdaQueryWrapper);
+            groupMap = sonList.stream().collect(Collectors.groupingBy(GoodsCategory::getPid));
+        }
+
+        Map<Integer, String> recommendMap = RecommendEnum.getMap();
+        Map<Integer, String> showMap = ShowEnum.getMap();
+        List<GoodsCategoryListVo> targetList = Lists.newArrayList();
+        for (GoodsCategory goodsCategory : list) {
+            GoodsCategoryListVo vo = new GoodsCategoryListVo();
+            BeanUtils.copyProperties(goodsCategory, vo);
+            vo.setIsShowName(showMap.get(vo.getIsShow()));
+            vo.setIsRecommendName(recommendMap.get(vo.getIsRecommend()));
+            vo.setImage(UrlUtil.toAbsoluteUrl(goodsCategory.getImage()));
+            vo.setCreateTime(TimeUtil.timestampToDate(goodsCategory.getCreateTime()));
+            vo.setUpdateTime(TimeUtil.timestampToDate(goodsCategory.getUpdateTime()));
+            if (groupMap.containsKey(goodsCategory.getId())) {
+                List<GoodsCategoryListVo> sonList = Lists.newArrayList();
+                List<GoodsCategory> categoryList = groupMap.get(goodsCategory.getId());
+                for (GoodsCategory category : categoryList) {
+                    GoodsCategoryListVo sonVo = new GoodsCategoryListVo();
+                    BeanUtils.copyProperties(category, sonVo);
+                    sonVo.setImage(UrlUtil.toAbsoluteUrl(category.getImage()));
+                    sonVo.setIsShowName(showMap.get(sonVo.getIsShow()));
+                    sonVo.setIsRecommendName(recommendMap.get(sonVo.getIsRecommend()));
+                    sonList.add(sonVo);
+                }
+                vo.setSons(sonList);
+            }
+            targetList.add(vo);
+        }
+        return targetList;
+    }
+
+    @Override
+    public void updateStatus(Long id, Integer isShow) {
+        GoodsCategory goodsCategory = goodsCategoryMapper.selectById(id);
+        Assert.notNull(goodsCategory, "数据不存在");
+        goodsCategory.setId(id);
+        goodsCategory.setIsShow(isShow);
+        goodsCategory.setUpdateTime(TimeUtil.timestamp());
+        goodsCategoryMapper.updateById(goodsCategory);
+    }
+
+    @Override
+    public List<GoodsCategory> listByIds(List<Long> categoryIds) {
+        if (CollectionUtils.isEmpty(categoryIds)) {
+            return Lists.newArrayList();
+        }
+        return super.listByIds(categoryIds);
+    }
+
+}

+ 25 - 0
like-admin/src/main/java/com/mdd/admin/service/channel/IChannelH5Service.java

@@ -0,0 +1,25 @@
+package com.mdd.admin.service.channel;
+
+import java.util.Map;
+
+/**
+ * H5渠道设置服务接口类
+ */
+public interface IChannelH5Service {
+
+    /**
+     * H5设置详情
+     *
+     * @author fzr
+     * @return Map<String, String>
+     */
+    Map<String, Object> detail();
+
+    /**
+     * H5设置保存
+     *
+     * @author fzr
+     */
+    void save(Map<String, String> param);
+
+}

+ 27 - 0
like-admin/src/main/java/com/mdd/admin/service/channel/IChannelMpService.java

@@ -0,0 +1,27 @@
+package com.mdd.admin.service.channel;
+
+import com.mdd.admin.vo.channel.ChannelMpVo;
+
+import java.util.Map;
+
+/**
+ * 微信小程序渠道服务接口类
+ */
+public interface IChannelMpService {
+
+    /**
+     * 微信小程序设置详情
+     *
+     * @author fzr
+     * @return Map<String, String>
+     */
+    ChannelMpVo detail();
+
+    /**
+     * 微信小程序设置保存
+     *
+     * @author fzr
+     */
+    void save(Map<String, String> param);
+
+}

+ 29 - 0
like-admin/src/main/java/com/mdd/admin/service/channel/IChannelOaCallBackService.java

@@ -0,0 +1,29 @@
+package com.mdd.admin.service.channel;
+
+
+/**
+ * 公众号服务器回调
+ */
+public interface IChannelOaCallBackService {
+
+
+    /**
+     * 服务器验证
+     */
+    String checkSignature(String signature, String timestamp, String nonce, String echostr);
+
+
+    /**
+     * 消息回复
+     *
+     * @param requestBody
+     * @param signature
+     * @param timestamp
+     * @param nonce
+     * @param encType
+     * @param msgSignature
+     * @return
+     */
+    String post(String requestBody, String signature, String timestamp, String nonce, String encType, String msgSignature);
+
+}

+ 30 - 0
like-admin/src/main/java/com/mdd/admin/service/channel/IChannelOaMenuService.java

@@ -0,0 +1,30 @@
+package com.mdd.admin.service.channel;
+
+import com.alibaba.fastjson.JSONArray;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 公众号菜单服务接口类
+ */
+public interface IChannelOaMenuService {
+
+    /**
+     * 菜单详情
+     *
+     * @author fzr
+     * @return JSONArray
+     */
+    JSONArray detail();
+
+    /**
+     * 菜单保存
+     *
+     * @author fzr
+     * @param params 参数
+     * @param isPublish 是否发布
+     */
+    void save(List<Object> params, Boolean isPublish);
+
+}

+ 64 - 0
like-admin/src/main/java/com/mdd/admin/service/channel/IChannelOaReplyService.java

@@ -0,0 +1,64 @@
+package com.mdd.admin.service.channel;
+
+import com.mdd.admin.validate.common.PageParam;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 公众号回复服务接口类
+ */
+public interface IChannelOaReplyService {
+
+    /**
+     * 回复列表
+     *
+     * @author fzr
+     * @param pageParam 分页参数
+     * @param params 参数
+     * @return List<Map<String, Object>>
+     */
+    List<Map<String, Object>> list(PageParam pageParam, Map<String, String> params);
+
+    /**
+     * 回复详情
+     *
+     * @author fzr
+     * @param id 主键
+     * @return Map<String, Object>
+     */
+    Map<String, Object> detail(Integer id);
+
+    /**
+     * 回复新增
+     *
+     * @author fzr
+     * @param params 参数
+     */
+    void add(Map<String, String> params);
+
+    /**
+     * 回复编辑
+     *
+     * @author fzr
+     * @param params 参数
+     */
+    void edit(Map<String, String> params);
+
+    /**
+     * 回复删除
+     *
+     * @author fzr
+     * @param id 主键
+     */
+    void del(Integer id);
+
+    /**
+     * 回复状态
+     *
+     * @author fzr
+     * @param id 主键
+     */
+    void status(Integer id);
+
+}

Some files were not shown because too many files changed in this diff