pudongliang 5 سال پیش
کامیت
a3e058198d
100فایلهای تغییر یافته به همراه3107 افزوده شده و 0 حذف شده
  1. BIN
      .DS_Store
  2. 14 0
      .gitignore
  3. 71 0
      README.md
  4. 117 0
      fw-sample-admin/pom.xml
  5. 21 0
      fw-sample-admin/src/main/java/com/mokasz/sample/AdminApplication.java
  6. 39 0
      fw-sample-admin/src/main/java/com/mokasz/sample/admin/controller/AdminLogController.java
  7. 58 0
      fw-sample-admin/src/main/java/com/mokasz/sample/admin/controller/DictController.java
  8. 57 0
      fw-sample-admin/src/main/java/com/mokasz/sample/admin/controller/HomeController.java
  9. 83 0
      fw-sample-admin/src/main/java/com/mokasz/sample/admin/controller/RedisManagerController.java
  10. 7 0
      fw-sample-admin/src/main/resources/banner.txt
  11. 131 0
      fw-sample-admin/src/main/resources/bootstrap.yml
  12. 30 0
      fw-sample-admin/src/main/resources/logback-spring.xml
  13. 111 0
      fw-sample-api/pom.xml
  14. 25 0
      fw-sample-api/src/main/java/com/xc/srm/api/ApiApplication.java
  15. 44 0
      fw-sample-api/src/main/java/com/xc/srm/api/controller/LoginApiController.java
  16. 14 0
      fw-sample-api/src/main/resources/application-dev.properties
  17. 8 0
      fw-sample-api/src/main/resources/application-prod.properties
  18. 12 0
      fw-sample-api/src/main/resources/application-qa.properties
  19. 8 0
      fw-sample-api/src/main/resources/application-stage.properties
  20. 39 0
      fw-sample-api/src/main/resources/application.properties
  21. 63 0
      fw-sample-api/src/main/resources/logconfig/logback-dev.xml
  22. 66 0
      fw-sample-api/src/main/resources/logconfig/logback.xml
  23. 111 0
      fw-sample-job/pom.xml
  24. 27 0
      fw-sample-job/src/main/java/com/mokasz/sample/job/JobApplication.java
  25. 16 0
      fw-sample-job/src/main/resources/application-dev.properties
  26. 12 0
      fw-sample-job/src/main/resources/application-prod.properties
  27. 12 0
      fw-sample-job/src/main/resources/application-qa.properties
  28. 11 0
      fw-sample-job/src/main/resources/application-stage.properties
  29. 33 0
      fw-sample-job/src/main/resources/application.properties
  30. 66 0
      fw-sample-job/src/main/resources/logconfig/logback-dev.xml
  31. 63 0
      fw-sample-job/src/main/resources/logconfig/logback.xml
  32. 4 0
      fw-sample-job/src/test/java/com/mokasz/sample/job/test/JobTest.java
  33. 110 0
      fw-sample-mqc/pom.xml
  34. 30 0
      fw-sample-mqc/src/main/java/com/xc/srm/mqc/MqcApplication.java
  35. 17 0
      fw-sample-mqc/src/main/resources/application-dev.properties
  36. 11 0
      fw-sample-mqc/src/main/resources/application-prod.properties
  37. 12 0
      fw-sample-mqc/src/main/resources/application-qa.properties
  38. 11 0
      fw-sample-mqc/src/main/resources/application-stage.properties
  39. 30 0
      fw-sample-mqc/src/main/resources/application.properties
  40. 66 0
      fw-sample-mqc/src/main/resources/logconfig/logback-dev.xml
  41. 63 0
      fw-sample-mqc/src/main/resources/logconfig/logback.xml
  42. 4 0
      fw-sample-mqc/src/test/java/com/xc/srm/mqc/test/MqcTest.java
  43. BIN
      fw-sample-portal/.DS_Store
  44. 7 0
      fw-sample-portal/.env
  45. 7 0
      fw-sample-portal/.env.prod
  46. 7 0
      fw-sample-portal/.env.test
  47. 19 0
      fw-sample-portal/.gitignore
  48. 8 0
      fw-sample-portal/Dockerfile
  49. 1 0
      fw-sample-portal/README.md
  50. 5 0
      fw-sample-portal/babel.config.js
  51. 38 0
      fw-sample-portal/docs/conf/conf.d/front.conf
  52. 36 0
      fw-sample-portal/docs/conf/nginx.conf
  53. 70 0
      fw-sample-portal/package.json
  54. 89 0
      fw-sample-portal/pom.xml
  55. BIN
      fw-sample-portal/public/favicon.ico
  56. 17 0
      fw-sample-portal/public/index.html
  57. 12 0
      fw-sample-portal/src/App.vue
  58. BIN
      fw-sample-portal/src/assets/image/bg-login.png
  59. BIN
      fw-sample-portal/src/assets/image/icon/icon-account-edit.png
  60. BIN
      fw-sample-portal/src/assets/image/icon/icon-account-user.png
  61. BIN
      fw-sample-portal/src/assets/image/icon/icon-add-user-active.png
  62. BIN
      fw-sample-portal/src/assets/image/icon/icon-add-user.png
  63. BIN
      fw-sample-portal/src/assets/image/icon/icon-common-tip.png
  64. BIN
      fw-sample-portal/src/assets/image/icon/icon-default-avatar.png
  65. BIN
      fw-sample-portal/src/assets/image/icon/icon-delete-active.png
  66. BIN
      fw-sample-portal/src/assets/image/icon/icon-delete.png
  67. BIN
      fw-sample-portal/src/assets/image/icon/icon-login-ding.png
  68. BIN
      fw-sample-portal/src/assets/image/icon/icon-login-fly.png
  69. BIN
      fw-sample-portal/src/assets/image/icon/icon-login-phone-active.png
  70. BIN
      fw-sample-portal/src/assets/image/icon/icon-login-phone.png
  71. BIN
      fw-sample-portal/src/assets/image/icon/icon-login-type-active.png
  72. BIN
      fw-sample-portal/src/assets/image/icon/icon-login-type.png
  73. BIN
      fw-sample-portal/src/assets/image/icon/icon-login-veritify-active.png
  74. BIN
      fw-sample-portal/src/assets/image/icon/icon-login-veritify.png
  75. BIN
      fw-sample-portal/src/assets/image/icon/icon-material-edit-default.png
  76. BIN
      fw-sample-portal/src/assets/image/icon/icon-menu--account.png
  77. BIN
      fw-sample-portal/src/assets/image/icon/icon-nav-search-hover.png
  78. BIN
      fw-sample-portal/src/assets/image/icon/icon-nav-search-normal.png
  79. BIN
      fw-sample-portal/src/assets/image/icon/icon-reback.png
  80. BIN
      fw-sample-portal/src/assets/image/icon/icon-refresh.png
  81. BIN
      fw-sample-portal/src/assets/image/icon/icon-sort-down-active.png
  82. BIN
      fw-sample-portal/src/assets/image/icon/icon-sort-down.png
  83. BIN
      fw-sample-portal/src/assets/image/icon/icon-sort-up-active.png
  84. BIN
      fw-sample-portal/src/assets/image/icon/icon-sort-up.png
  85. BIN
      fw-sample-portal/src/assets/image/icon/icon-template-gallery-phone.png
  86. BIN
      fw-sample-portal/src/assets/image/system-book.png
  87. BIN
      fw-sample-portal/src/assets/image/system-logo.png
  88. 202 0
      fw-sample-portal/src/assets/style/common.scss
  89. 444 0
      fw-sample-portal/src/assets/style/element-variables.scss
  90. 5 0
      fw-sample-portal/src/assets/style/index.scss
  91. 119 0
      fw-sample-portal/src/assets/style/mixin.scss
  92. 48 0
      fw-sample-portal/src/assets/style/transition.scss
  93. 6 0
      fw-sample-portal/src/assets/style/variables.scss
  94. 13 0
      fw-sample-portal/src/common/directive/permission/index.js
  95. 21 0
      fw-sample-portal/src/common/directive/permission/permission.js
  96. 77 0
      fw-sample-portal/src/common/mixin/index.js
  97. 92 0
      fw-sample-portal/src/common/plugins/index.js
  98. 8 0
      fw-sample-portal/src/common/utils/auth-node.js
  99. 9 0
      fw-sample-portal/src/common/utils/constant.js
  100. 20 0
      fw-sample-portal/src/common/utils/has-permission.js

BIN
.DS_Store


+ 14 - 0
.gitignore

@@ -0,0 +1,14 @@
+### IntelliJ IDEA ###
+/.idea
+/logs
+*.iws
+*.iml
+*.ipr
+*.class
+*.log
+*.gz
+*/target/
+.idea
+*/node_modules/
+*/dist/
+

+ 71 - 0
README.md

@@ -0,0 +1,71 @@
+# fw-sample-admin 包结构描述
+    com.mokasz.fw.admin
+        controller                  //Api controller
+        ApiApplication              //Api启动类
+        resources                   //资源文件
+# fw-sample-api 包结构描述            
+    com.mokasz.fw.api               //针对小程序端,和RPC服务端
+        controller                  //Api controller
+        ApiApplication              //Api启动类
+        resources                   //资源文件
+# fw-sample-job 包结构描述
+    com.mokasz.fw.job
+        controller                  //Job controller
+        JobApplication              //Job启动类
+        resources                   //资源文件
+# fw-sample-mqc 包结构描述
+    com.mokasz.fw.job
+        MqcApplication              //Mqc启动类
+        resources                   //资源文件
+# fw-sample-rpc 包结构描述
+    com.mokasz.fw.rpc
+        query                       //rpc 请求对象
+        vo                          //rpc返回对象
+# service包结构描述
+    com.mokasz.fw
+		api                         //接口api
+			query                   //请求视图对象
+			vo                      //返回视图对象
+		admin                       //后台api & vue
+			query                   //请求视图对象
+			vo                      //返回视图对象
+		common                      //通用层
+			bean                    //spring bean
+			config                  //configruation
+			aspect                  //切面逻辑
+			context                 //上下文
+			enums                   //枚举
+			constant                //常量
+			util                    //工具类
+			ds                      //数据源
+			convert                 //map struct
+			event                   //spring application event
+			emokaszeption               //自定义异常
+			redis                   //redisson client
+			interceptor             //拦截器
+			properties              //配置项对象
+			model                   //通用模型
+			filter                  //过滤器
+			vm                      //velocity模板文件
+		lib                         //(复杂业务、领域业务处理)
+			model                   //领域层对象
+		manager                     //(二方、三方包封装)
+		mq                          //(消息消费、发送)
+			listener                //消息监听
+			producer                //消息生产
+		job                         //(任务调度相关)
+		rpc.impl                    //dubbo rpc 实现
+		service	                    //业务层
+			dto                     //业务层对象
+			impl                    //业务层实现
+		mapper	                    //持久层
+			xml                     //mybatis xml
+			entity                  //持久层对象
+        
+
+
+
+
+
+
+

+ 117 - 0
fw-sample-admin/pom.xml

@@ -0,0 +1,117 @@
+<?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>
+        <groupId>com.mokasz</groupId>
+        <artifactId>fw-sample</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <packaging>jar</packaging>
+
+    <artifactId>fw-sample-admin</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.mokasz</groupId>
+            <artifactId>fw-sample-service</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-thymeleaf</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-monitor-default</artifactId>
+            <version>${dubbo.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>fw-sample-admin</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <version>2.8.2</version>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.1.1.RELEASE</version>
+                <!-- repackage:创建一个自动可执行的jar或war文件 -->
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.0</version>
+                <configuration>
+                    <source>8</source>
+                    <target>8</target>
+                </configuration>
+            </plugin>
+        </plugins>
+        <!-- maven资源文件复制插件 -->
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <excludes>
+                    <exclude>application*.properties</exclude>
+                </excludes>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>application.properties</include>
+                    <include>application-${spring.profiles.active}.properties</include>
+                </includes>
+            </resource>
+        </resources>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>dev</id>
+            <properties>
+                <spring.profiles.active>dev</spring.profiles.active>
+            </properties>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+        </profile>
+        <profile>
+            <id>qa</id>
+            <properties>
+                <spring.profiles.active>qa</spring.profiles.active>
+            </properties>
+        </profile>
+        <profile>
+            <id>stage</id>
+            <properties>
+                <spring.profiles.active>stage</spring.profiles.active>
+            </properties>
+        </profile>
+        <profile>
+            <id>prod</id>
+            <properties>
+                <spring.profiles.active>prod</spring.profiles.active>
+            </properties>
+        </profile>
+    </profiles>
+
+</project>

+ 21 - 0
fw-sample-admin/src/main/java/com/mokasz/sample/AdminApplication.java

@@ -0,0 +1,21 @@
+package com.mokasz.sample;
+
+import com.alibaba.nacos.spring.context.annotation.config.EnableNacosConfig;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.ServletComponentScan;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+@ServletComponentScan("com.mokasz.sample")
+@EnableNacosConfig
+@SpringBootApplication
+@Slf4j
+@EnableAsync
+@EnableFeignClients(basePackages = {"com.mokasz.sample.manager"})
+public class AdminApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(AdminApplication.class, args);
+    }
+}

+ 39 - 0
fw-sample-admin/src/main/java/com/mokasz/sample/admin/controller/AdminLogController.java

@@ -0,0 +1,39 @@
+package com.mokasz.sample.admin.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mokasz.sample.admin.query.AdminLogQuery;
+import com.mokasz.sample.common.annotation.GlobalApiResponse;
+import com.mokasz.sample.mapper.entity.AdminLogENT;
+import com.mokasz.sample.service.AdminLogService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+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;
+
+
+
+@RestController
+@RequestMapping("/admin/adminLog/")
+@GlobalApiResponse
+public class AdminLogController {
+
+    @Autowired
+    private AdminLogService adminLogService;
+
+    @PostMapping("page")
+    public IPage<AdminLogENT> page(@RequestBody AdminLogQuery query) {
+        LambdaQueryWrapper<AdminLogENT> pageWrapper = Wrappers.lambdaQuery();
+        pageWrapper.eq(StringUtils.isNotBlank(query.getUserId()), AdminLogENT::getUserId, query.getUserId());
+        pageWrapper.eq(StringUtils.isNotBlank(query.getMethod()), AdminLogENT::getMethod, query.getMethod());
+        pageWrapper.like(StringUtils.isNotBlank(query.getPayload()), AdminLogENT::getPayload, query.getPayload());
+        pageWrapper.ge(query.getStartTime() != null, AdminLogENT::getCreateTime, query.getStartTime());
+        pageWrapper.ge(query.getEndTime() != null, AdminLogENT::getCreateTime, query.getEndTime());
+        pageWrapper.orderByDesc(AdminLogENT::getId);
+        return adminLogService.page(new Page<>(query.getPageIndex(), query.getPageSize()), pageWrapper);
+    }
+}

+ 58 - 0
fw-sample-admin/src/main/java/com/mokasz/sample/admin/controller/DictController.java

@@ -0,0 +1,58 @@
+package com.mokasz.sample.admin.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mokasz.sample.admin.query.DictQuery;
+import com.mokasz.sample.common.model.ApiResponse;
+import com.mokasz.sample.mapper.entity.DictENT;
+import com.mokasz.sample.service.DictService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @description: 字典
+ * @author: pdl
+ * @date: 2021-07-23 09:43:37
+ **/
+@RestController
+@RequestMapping("/admin/dict/")
+public class DictController {
+
+    @Autowired
+    private DictService dictService;
+
+    @PostMapping("page")
+    public IPage<DictENT> page(@RequestBody DictQuery query) {
+        LambdaQueryWrapper<DictENT> pageWrapper = Wrappers.lambdaQuery();
+        pageWrapper.eq(StringUtils.isNotBlank(query.getGroupCode()), DictENT::getGroupCode, query.getGroupCode());
+        pageWrapper.eq(StringUtils.isNotBlank(query.getKeyCode()), DictENT::getKeyCode, query.getKeyCode());
+        return dictService.page(new Page<>(query.getPageIndex(), query.getPageSize()), pageWrapper);
+    }
+
+    @GetMapping("queryByGroup")
+    public ApiResponse<List<DictENT>> queryByGroupCode(@RequestParam String groupCode) {
+        List<DictENT> rows = dictService.lambdaQuery().eq(DictENT::getGroupCode, groupCode).list();
+        return ApiResponse.ok(rows);
+    }
+
+
+    @PostMapping(value = "save")
+    public Boolean save(@RequestBody DictENT ent) {
+        return dictService.save(ent);
+    }
+
+    @PostMapping(value = "update")
+    public Boolean update(@RequestBody DictENT ent) {
+        return dictService.updateById(ent);
+    }
+
+    @PostMapping(value = "delete")
+    public Boolean delete(@RequestParam("id") Integer id) {
+        return dictService.removeById(id);
+    }
+}

+ 57 - 0
fw-sample-admin/src/main/java/com/mokasz/sample/admin/controller/HomeController.java

@@ -0,0 +1,57 @@
+package com.mokasz.sample.admin.controller;
+
+import com.mokasz.sample.common.exception.CommonBizException;
+import com.mokasz.sample.common.model.ApiResponse;
+import com.xxl.sso.core.conf.Conf;
+import com.xxl.sso.core.login.SsoWebLoginHelper;
+import com.xxl.sso.core.user.XxlSsoUser;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+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.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+
+/**
+ * Controller
+ *
+ * @author yyb
+ * @date 2021-06-24 09:23:35
+ */
+@Api(tags = "后台用户")
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("admin")
+public class HomeController {
+
+    @Value("${xxl.sso.server}")
+    private String ssoLoginUrl;
+
+
+    @ApiOperation(value = "获取登陆用户信息")
+    @GetMapping("getAdminInfo")
+    public ApiResponse<XxlSsoUser> getUserInfo(HttpServletRequest request) throws CommonBizException {
+        XxlSsoUser xxlSsoUser = (XxlSsoUser) request.getAttribute(Conf.SSO_USER);
+        if (null != xxlSsoUser) {
+            return ApiResponse.ok(xxlSsoUser);
+        } else {
+            throw new CommonBizException("无法获取登陆用户信息");
+        }
+    }
+
+    @ApiOperation(value = "退出登录")
+    @GetMapping(value = Conf.SSO_LOGOUT)
+    public ApiResponse<?> logout(HttpServletRequest request, HttpServletResponse response) {
+        SsoWebLoginHelper.logout(request, response);
+        return ApiResponse.OK;
+    }
+
+}

+ 83 - 0
fw-sample-admin/src/main/java/com/mokasz/sample/admin/controller/RedisManagerController.java

@@ -0,0 +1,83 @@
+package com.mokasz.sample.admin.controller;
+
+
+import com.mokasz.sample.admin.query.RedisCommandQuery;
+import com.mokasz.sample.common.context.ApiContext;
+import com.mokasz.sample.common.model.ApiContextModel;
+import com.mokasz.sample.common.model.ApiResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+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 java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.function.Function;
+
+/**
+ * @author : pdl
+ * @date : 2021/4/22 13:39
+ */
+@RestController
+@RequestMapping("/admin/redis")
+@Slf4j
+public class RedisManagerController {
+
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+
+    private final Map<String, Function<RedisCommandQuery, String>> commandFunction = new HashMap<String, Function<RedisCommandQuery, String>>() {{
+        put("get", command -> {
+            return redisTemplate.opsForValue().get(command.getKey());
+        });
+        put("set", command -> {
+            redisTemplate.opsForValue().set(command.getKey(), command.getValue());
+            return "ok";
+        });
+        put("del", command -> {
+            redisTemplate.delete(command.getKey());
+            return "ok";
+        });
+        put("hget", command -> {
+            return redisTemplate.opsForHash().get(command.getKey(), command.getHkey()).toString();
+        });
+        put("hset", command -> {
+            redisTemplate.opsForHash().put(command.getKey(), command.getHkey(), command.getValue());
+            return "ok";
+        });
+        put("hdel", command -> {
+            redisTemplate.opsForHash().delete(command.getKey(), command.getHkey());
+            return "ok";
+        });
+    }};
+
+    @PostMapping("exec")
+    public ApiResponse<String> exec(@RequestBody RedisCommandQuery commandQuery) {
+        String command = commandQuery.getCommand();
+        ApiContextModel user = ApiContext.getApiContextModel();
+        log.info("{}  exec {} key={}{}, value={}",
+                user.getUserName(),
+                command,
+                commandQuery.getKey(),
+                commandQuery.getHkey(),
+                commandQuery.getValue());
+
+        String result = "ok";
+        try {
+            Optional<Function<RedisCommandQuery, String>> function = Optional.ofNullable(commandFunction.get(command));
+            if (function.isPresent()) {
+                result = function.get().apply(commandQuery);
+            } else {
+                result = "命令不支持";
+            }
+        } catch (Exception e) {
+            result = "执行失败" + e.getMessage();
+        }
+        return ApiResponse.ok(result);
+    }
+
+}

+ 7 - 0
fw-sample-admin/src/main/resources/banner.txt

@@ -0,0 +1,7 @@
+ ________ ___       __
+|\  _____\\  \     |\  \
+\ \  \__/\ \  \    \ \  \
+ \ \   __\\ \  \  __\ \  \
+  \ \  \_| \ \  \|\__\_\  \
+   \ \__\   \ \____________\
+    \|__|    \|____________|

+ 131 - 0
fw-sample-admin/src/main/resources/bootstrap.yml

@@ -0,0 +1,131 @@
+server:
+  port: 8080
+
+spring:
+  application:
+    name: fw-sample-admin
+
+  boot:
+    admin:
+      client:
+        url: http://${hyperion-admin:127.0.0.1}:10401
+        username: ${hyperion-admin.username:hyperion}
+        password: ${hyperion-admin.password:hdzEaHHgHru5}
+        instance:
+          prefer-ip: true
+
+  cloud:
+    nacos:
+      config:
+        namespace: ${nacos.namespace:}
+        server-addr: ${nacos.url:172.18.71.46}:${nacos.port:8848}
+        group: DEFAULT_GROUP
+        prefix: hyperion-free-novel-admin
+        file-extension: yaml
+      discovery:
+        namespace: ${nacos.namespace:}
+        server-addr: ${nacos.url:172.18.71.46}:${nacos.port:8848}
+
+  datasource:
+    dynamic:
+      p6spy: true
+      hikari:
+        connection-timeout: 30000
+        max-lifetime: 1800000
+        max-pool-size: 15
+        min-idle: 5
+        connection-test-query: select 1
+        pool-name: HikariCP
+      primary: base
+      datasource:
+        base:
+          username: ${mysql.base.username:xyb}
+          password: ${mysql.base.password:xyb123}
+          driver-class-name: com.mysql.cj.jdbc.Driver
+          url: jdbc:mysql://${mysql.base.url:172.18.70.27}:${mysql.base.port:3306}/${mysql.base.db:hyperion_free_novel}?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
+
+  elasticsearch:
+    rest:
+      uris: ["http://${es.url:172.18.70.27}:9200"]
+      username: ${es.username:hyperion}
+      password: ${es.password:zsw0M4Ok5nCw}
+
+  rabbitmq:
+    host: ${mq.url:172.18.70.27}
+    username: ${mq.username:xyb}
+    password: ${mq.password:xyb123}
+    virtual-host: ${mq.virtual-host:hyperion_free_novel}
+
+  redis:
+    database: ${redis.database:15}
+    host: ${redis.url:172.18.70.27}
+    port: ${redis.port:6379}
+    password: ${redis.password:123456}
+    lettuce:
+      pool:
+        min-idle: 8
+        max-idle: 500
+        max-active: 2000
+        max-wait: 10000
+    timeout: 5000
+
+  servlet:
+    multipart:
+      max-file-size: 15MB
+      max-request-size: 15MB
+
+mybatis-plus:
+  configuration:
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+
+hyperion:
+  aspect:
+    enable-parameter-log: false
+
+  swagger:
+    enable: false
+
+#  sign-auth:
+#    enable: false
+#    public-server-names:
+#      - test.fn.mokamrp.com
+#      - fn.mokamrp.com
+#    signs:
+#      feeder:
+#        secret-key: msqAnBWYpDiCoBsIE2SvvCDQfHpGqP7Z
+
+#  data-hub:
+#    end-point: https://dh-cn-shanghai.aliyuncs.com
+#    access-id: LTAI5tEWU1j9H2poG4zWgfEP
+#    access-key: p9tVmeDeeEENKhfsBsSeYc0F0ggH5b
+
+#  rabbit-mq:
+#    type: origin
+
+management:
+  endpoints:
+    web:
+      exposure:
+        include: '*'
+  endpoint:
+    auditevents:
+      enable: true
+    health:
+      show-details: ALWAYS
+
+xxl:
+  sso:
+    server: http://sso.mokamrp.com/sso
+    logout:
+      path: /logout
+    excluded:
+      paths: /actuator/**,/swagger-ui/**,/swagger-resources/**,/v3/api-docs
+    redis:
+      # address: redis://xxl-sso:Jch9shshl@r-uf633f3f27aa2174pd.redis.rds.aliyuncs.com:6379/0
+      address: redis://xxl-sso:MokaSapce666$%25_RediS@r-uf6727zrr24ioihy72pd.redis.rds.aliyuncs.com:23563/0
+    cookie:
+      domain: mokamrp.com
+
+logging:
+  level:
+    com.alibaba.nacos.client.config.impl.ClientWorker: WARN

+ 30 - 0
fw-sample-admin/src/main/resources/logback-spring.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <springProperty scope="context" name="springAppName" source="spring.application.name"/>
+    <property name="log.path" value="log"/>
+    <property name="log.maxHistory" value="1"/>
+    <property name="log.totalSizeCap" value="1GB"/>
+    <property name="log.colorPattern"
+              value="%magenta(%d{yyyy-MM-dd HH:mm:ss}) %highlight(%-5level) %boldCyan(${springAppName:-}) %yellow(%thread) %green(%logger) %msg%n"/>
+    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5level ${springAppName:-} %thread %logger %msg%n"/>
+
+    <!--输出到控制台-->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${log.colorPattern}</pattern>
+        </encoder>
+    </appender>
+
+    <!-- 日志采集服务 -->
+<!--    <appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">-->
+<!--        <appName>${springAppName}-${plumelog.env}</appName>-->
+<!--        <redisHost>${plumelog.redis.host}:${plumelog.redis.port}</redisHost>-->
+<!--        <redisAuth>${plumelog.redis.auth}</redisAuth>-->
+<!--    </appender>-->
+
+    <root level="info">
+        <appender-ref ref="console"/>
+<!--        <appender-ref ref="plumelog" />-->
+    </root>
+
+</configuration>

+ 111 - 0
fw-sample-api/pom.xml

@@ -0,0 +1,111 @@
+<?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">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>com.mokasz</groupId>
+        <artifactId>fw-sample</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>com.mokasz</groupId>
+    <artifactId>fw-sample-api</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <packaging>jar</packaging>
+
+    <name>fw-sample-api</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.mokasz</groupId>
+            <artifactId>fw-sample-service</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>fw-sample-api</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <version>2.8.2</version>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.1.1.RELEASE</version>
+                <!-- repackage:创建一个自动可执行的jar或war文件 -->
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.0</version>
+                <configuration>
+                    <source>8</source>
+                    <target>8</target>
+                </configuration>
+            </plugin>
+        </plugins>
+        <!-- maven资源文件复制插件 -->
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <excludes>
+                    <exclude>application*.properties</exclude>
+                </excludes>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>application.properties</include>
+                    <include>application-${spring.profiles.active}.properties</include>
+                </includes>
+            </resource>
+        </resources>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>dev</id>
+            <properties>
+                <spring.profiles.active>dev</spring.profiles.active>
+            </properties>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+        </profile>
+        <profile>
+            <id>qa</id>
+            <properties>
+                <spring.profiles.active>qa</spring.profiles.active>
+            </properties>
+        </profile>
+        <profile>
+            <id>stage</id>
+            <properties>
+                <spring.profiles.active>stage</spring.profiles.active>
+            </properties>
+        </profile>
+        <profile>
+            <id>prod</id>
+            <properties>
+                <spring.profiles.active>prod</spring.profiles.active>
+            </properties>
+        </profile>
+    </profiles>
+
+</project>

+ 25 - 0
fw-sample-api/src/main/java/com/xc/srm/api/ApiApplication.java

@@ -0,0 +1,25 @@
+package com.xc.srm.api;
+
+import com.alibaba.nacos.spring.context.annotation.config.EnableNacosConfig;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.retry.annotation.EnableRetry;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+@EnableNacosConfig
+@SpringBootApplication
+@Slf4j
+@ComponentScan(basePackages = {"com.xc.srm"})
+@EnableAsync
+@EnableRetry
+@EnableDubbo(scanBasePackages = "com.xc.srm.rpc.impl")
+@EnableFeignClients(basePackages = {"com.xc.srm.manager"})
+public class ApiApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(ApiApplication.class, args);
+    }
+}

+ 44 - 0
fw-sample-api/src/main/java/com/xc/srm/api/controller/LoginApiController.java

@@ -0,0 +1,44 @@
+package com.xc.srm.api.controller;
+
+
+import com.mokasz.sample.common.annotation.GlobalApiResponse;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+@RequestMapping(method = {RequestMethod.POST, RequestMethod.GET})
+@Slf4j
+@RestController
+@Api(description = "登录接口业务", tags = "login")
+@GlobalApiResponse
+public class LoginApiController {
+
+//    @Autowired
+//    private LoginBizService loginBizService;
+//
+//    @ApiOperation(value = "获取验证码", notes = "获取验证码")
+//    @RequestMapping(value = "common/get_sms_code")
+//    public String getSmsCode(@ApiParam("mobile") String mobile) {
+//        return loginBizService.getSmsCode(mobile);
+//    }
+//
+//    @ApiOperation(value = "登录", notes = "登录")
+//    @RequestMapping(value = "common/code_login")
+//    public UserInfoVO loginWithSmsCode(@RequestBody @Validated LoginQuery loginQuery) {
+//        return loginBizService.loginWithSmsCode(loginQuery);
+//    }
+//
+//    @ApiOperation(value = "获取用户信息", notes = "获取用户信息")
+//    @RequestMapping(value = "common/check_login")
+//    @Token
+//    public UserInfoVO getUserInfo() {
+//        return loginBizService.getUserInfo();
+//    }
+//
+//    @ApiOperation(value = "企业微信授权登陆", notes = "企业微信授权登陆")
+//    @RequestMapping(value = "common/auth_login")
+//    public UserInfoVO qyWechatLogin(@RequestParam(value = "code") String authorizationCode) {
+//        return loginBizService.qyWechatLogin(authorizationCode);
+//    }
+
+}

+ 14 - 0
fw-sample-api/src/main/resources/application-dev.properties

@@ -0,0 +1,14 @@
+#注册中心
+nacos.config.server-addr=10.100.2.46:8848
+nacos.config.namespace=qa
+#
+#
+#log
+plumelog.appName=${spring.application.name}-${spring.profiles.active}
+plumelog.redisHost=10.100.2.54
+plumelog.redisAuth=plumelogredis
+plumelog.redisPort=6379
+#logback
+logging.config=classpath:logconfig/logback-dev.xml
+#mybatis plus
+mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

+ 8 - 0
fw-sample-api/src/main/resources/application-prod.properties

@@ -0,0 +1,8 @@
+##nacos配置中心
+nacos.config.server-addr=nacos.xc-inc.cn:8848
+nacos.config.namespace=7671e08b-db1c-4256-8515-b2eaa75634a8
+##plumelog
+plumelog.appName=${spring.application.name}-${spring.profiles.active}
+plumelog.redisHost=r-bp12goy2tc8hlbpi6t.redis.rds.aliyuncs.com
+plumelog.redisAuth=Plumelog666
+plumelog.redisPort=6379

+ 12 - 0
fw-sample-api/src/main/resources/application-qa.properties

@@ -0,0 +1,12 @@
+#注册中心
+nacos.config.server-addr=10.100.2.46:8848
+nacos.config.namespace=qa
+#
+#
+#log
+plumelog.appName=${spring.application.name}-${spring.profiles.active}
+plumelog.redisHost=10.100.2.54
+plumelog.redisAuth=plumelogredis
+plumelog.redisPort=6379
+#port
+dubbo.protocol.port=20888

+ 8 - 0
fw-sample-api/src/main/resources/application-stage.properties

@@ -0,0 +1,8 @@
+##nacos配置中心
+nacos.config.server-addr=nacos.xc-inc.cn:8848
+nacos.config.namespace=de149f1e-f619-460c-9d6c-5721a2da5587
+#plumelog
+plumelog.appName=${spring.application.name}-${spring.profiles.active}
+plumelog.redisHost=r-bp12goy2tc8hlbpi6t.redis.rds.aliyuncs.com
+plumelog.redisAuth=Plumelog666
+plumelog.redisPort=6379

+ 39 - 0
fw-sample-api/src/main/resources/application.properties

@@ -0,0 +1,39 @@
+server.port=9090
+#健康检查
+management.server.port=19090
+management.endpoint.shutdown.enabled=true
+management.endpoint.health.show-details=always
+management.endpoints.web.exposure.include=*
+#
+spring.application.name=fw-sample-api
+spring.profiles.active=@spring.profiles.active@
+#
+spring.servlet.multipart.max-request-size=50MB
+spring.servlet.multipart.max-file-size=50MB
+#logback
+logging.config=classpath:logconfig/logback.xml
+#解密salt
+jasypt.encryptor.password=tongchengshenghuo
+#nacos-dubbo
+nacos.maxRetry=3
+nacos.configLongPollTimeout=30000
+nacos.configRetryTime=2000
+#spring-boot-admin
+nacos.discovery.auto-register=true
+nacos.discovery.register.group-name=APPLICATION
+spring.boot.admin.client.instance.metadata.user.name=admin
+spring.boot.admin.client.instance.metadata.user.password=admin
+#dubbo provider port
+dubbo.protocol.port=20880
+dubbo.provider.timeout=3000
+dubbo.provider.retries=0
+# 服务提供方版本
+provider.service.version=1.0.0
+# 服务消费方版本
+consumer.service.version=1.0.0
+
+
+aliyun.sms.accessKeyId=LTAIBnJJGLlFrF6o
+aliyun.sms.accessSecret=thMV7ngP9KXtFjbhGlx8Sie08hMO76
+aliyun.sms.regionId=cn-hangzhou
+aliyun.sms.templateId = SMS_183246340

+ 63 - 0
fw-sample-api/src/main/resources/logconfig/logback-dev.xml

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="false">
+    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
+    <!--<property name="LOG_HOME" value="/home" />-->
+    <!-- 控制台输出 -->
+    <!-- 彩色日志 -->
+    <!-- 彩色日志依赖的渲染类 -->
+    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <!-- 彩色日志格式 -->
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
+
+
+    <!--输出到控制台-->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>info</level>
+        </filter>
+        <encoder>
+            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
+            <!-- 设置字符集 -->
+            <charset>UTF-8</charset>
+        </encoder>
+    </appender>
+
+    <!-- 如果使用kafka作为队列,启用下面配置 -->
+    <!--<appender name="plumelog_demo" class="KafkaAppender">-->
+    <!--<appName>plumelog_demo</appName>-->
+    <!--<kafkaHosts>172.16.247.143:9092,172.16.247.60:9092,172.16.247.64:9092</kafkaHosts>-->
+    <!-- runModel 1,2  1表示最高性能模式,2表示低性能模式 但是2可以获取更多信息 不配置默认为1-->
+    <!--<runModel>2</runModel>-->
+    <!-- 整合其他链路插件,启用下面配置 sleuth表示整合springcloud.sleuth-->
+    <!--<expand>sleuth</expand>-->
+    <!--</appender>-->
+
+    <springProperty scope="context" name="plumelog.appName" source="plumelog.appName"/>
+    <springProperty scope="context" name="plumelog.redisHost" source="plumelog.redisHost"/>
+    <springProperty scope="context" name="plumelog.redisAuth" source="plumelog.redisAuth"/>
+    <springProperty scope="context" name="plumelog.redisPort" source="plumelog.redisPort"/>
+    <!-- 如果使用redis作为队列,启用下面配置 -->
+    <appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
+        <appName>${plumelog.appName}</appName>
+        <redisHost>${plumelog.redisHost}</redisHost>
+        <!-- 如果使用redis有密码,启用下面配置 -->
+        <redisAuth>${plumelog.redisAuth}</redisAuth>
+        <!-- redis端口号,不配置默认6379-->
+        <redisPort>${plumelog.redisPort}</redisPort>
+        <!-- runModel 1,2  1表示最高性能模式,2表示低性能模式 但是2可以获取更多信息 不配置默认为1-->
+        <runModel>2</runModel>
+        <!-- 整合其他链路插件,启用下面配置 sleuth表示整合springcloud.sleuth-->
+        <expand>sleuth</expand>
+    </appender>
+
+    <!-- 日志输出级别 -->
+    <root level="INFO">
+        <appender-ref ref="console"/>
+    </root>
+</configuration>

+ 66 - 0
fw-sample-api/src/main/resources/logconfig/logback.xml

@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="false">
+    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
+    <!--<property name="LOG_HOME" value="/home" />-->
+    <!-- 控制台输出 -->
+    <!-- 彩色日志 -->
+    <!-- 彩色日志依赖的渲染类 -->
+    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <!-- 彩色日志格式 -->
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
+
+
+    <!--输出到控制台-->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>info</level>
+        </filter>
+        <encoder>
+            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
+            <!-- 设置字符集 -->
+            <charset>UTF-8</charset>
+        </encoder>
+    </appender>
+
+    <!-- 如果使用kafka作为队列,启用下面配置 -->
+    <!--<appender name="plumelog_demo" class="KafkaAppender">-->
+    <!--<appName>plumelog_demo</appName>-->
+    <!--<kafkaHosts>172.16.247.143:9092,172.16.247.60:9092,172.16.247.64:9092</kafkaHosts>-->
+    <!-- runModel 1,2  1表示最高性能模式,2表示低性能模式 但是2可以获取更多信息 不配置默认为1-->
+    <!--<runModel>2</runModel>-->
+    <!-- 整合其他链路插件,启用下面配置 sleuth表示整合springcloud.sleuth-->
+    <!--<expand>sleuth</expand>-->
+    <!--</appender>-->
+
+    <springProperty scope="context" name="plumelog.appName" source="plumelog.appName"/>
+    <springProperty scope="context" name="plumelog.redisHost" source="plumelog.redisHost"/>
+    <springProperty scope="context" name="plumelog.redisAuth" source="plumelog.redisAuth"/>
+    <springProperty scope="context" name="plumelog.redisPort" source="plumelog.redisPort"/>
+    <!-- 如果使用redis作为队列,启用下面配置 -->
+    <appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
+        <appName>${plumelog.appName}</appName>
+        <redisHost>${plumelog.redisHost}</redisHost>
+        <!-- 如果使用redis有密码,启用下面配置 -->
+        <redisAuth>${plumelog.redisAuth}</redisAuth>
+        <!-- redis端口号,不配置默认6379-->
+        <redisPort>${plumelog.redisPort}</redisPort>
+        <!-- runModel 1,2  1表示最高性能模式,2表示低性能模式 但是2可以获取更多信息 不配置默认为1-->
+        <runModel>2</runModel>
+        <!-- 整合其他链路插件,启用下面配置 sleuth表示整合springcloud.sleuth-->
+        <expand>sleuth</expand>
+    </appender>
+
+    <!-- 打开看debug -->
+    <!--    <logger name="com.xc.srm.mapper" level="debug"></logger>-->
+
+    <!-- 日志输出级别 -->
+    <root level="INFO">
+        <appender-ref ref="plumelog"/>
+    </root>
+</configuration>

+ 111 - 0
fw-sample-job/pom.xml

@@ -0,0 +1,111 @@
+<?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">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>com.mokasz</groupId>
+        <artifactId>fw-sample</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>com.mokasz</groupId>
+    <artifactId>fw-sample-job</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <packaging>jar</packaging>
+
+    <name>fw-sample-job</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.mokasz</groupId>
+            <artifactId>fw-sample-service</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>fw-sample-job</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <version>2.8.2</version>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.1.1.RELEASE</version>
+                <!-- repackage:创建一个自动可执行的jar或war文件 -->
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.0</version>
+                <configuration>
+                    <source>8</source>
+                    <target>8</target>
+                </configuration>
+            </plugin>
+        </plugins>
+        <!-- maven资源文件复制插件 -->
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <excludes>
+                    <exclude>application*.properties</exclude>
+                </excludes>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>application.properties</include>
+                    <include>application-${spring.profiles.active}.properties</include>
+                </includes>
+            </resource>
+        </resources>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>dev</id>
+            <properties>
+                <spring.profiles.active>dev</spring.profiles.active>
+            </properties>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+        </profile>
+        <profile>
+            <id>qa</id>
+            <properties>
+                <spring.profiles.active>qa</spring.profiles.active>
+            </properties>
+        </profile>
+        <profile>
+            <id>stage</id>
+            <properties>
+                <spring.profiles.active>stage</spring.profiles.active>
+            </properties>
+        </profile>
+        <profile>
+            <id>prod</id>
+            <properties>
+                <spring.profiles.active>prod</spring.profiles.active>
+            </properties>
+        </profile>
+    </profiles>
+
+</project>

+ 27 - 0
fw-sample-job/src/main/java/com/mokasz/sample/job/JobApplication.java

@@ -0,0 +1,27 @@
+package com.mokasz.sample.job;
+
+import com.alibaba.nacos.spring.context.annotation.config.EnableNacosConfig;
+import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+@EnableNacosConfig
+@SpringBootApplication
+@Slf4j
+@ComponentScan(basePackages = {"com.mokasz.sample"})
+@EnableAsync
+@EnableDubbo
+@EnableFeignClients(basePackages = {"com.mokasz.sample.manager"})
+@NacosPropertySource(dataId = "fw-sample-db", groupId = "fw-sample", autoRefreshed = true)
+public class JobApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(JobApplication.class, args);
+    }
+}

+ 16 - 0
fw-sample-job/src/main/resources/application-dev.properties

@@ -0,0 +1,16 @@
+#注册中心
+nacos.config.server-addr=10.100.2.46:8848
+nacos.config.namespace=dev
+#
+#
+#log
+plumelog.appName=${spring.application.name}-${spring.profiles.active}
+plumelog.redisHost=10.100.2.54
+plumelog.redisAuth=plumelogredis
+plumelog.redisPort=6379
+#logback
+logging.config=classpath:logconfig/logback-dev.xml
+#开启所有端点
+management.endpoints.web.exposure.include=*
+#mybatis plus
+mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

+ 12 - 0
fw-sample-job/src/main/resources/application-prod.properties

@@ -0,0 +1,12 @@
+server.port=9092
+
+
+##nacos配置中心
+nacos.config.server-addr=nacos.xc-inc.cn:8848
+nacos.config.namespace=7671e08b-db1c-4256-8515-b2eaa75634a8
+
+##plumelog
+plumelog.appName=${spring.application.name}-${spring.profiles.active}
+plumelog.redisHost=r-bp12goy2tc8hlbpi6t.redis.rds.aliyuncs.com
+plumelog.redisAuth=Plumelog666
+plumelog.redisPort=6379

+ 12 - 0
fw-sample-job/src/main/resources/application-qa.properties

@@ -0,0 +1,12 @@
+#注册中心
+nacos.config.server-addr=10.100.2.46:8848
+nacos.config.namespace=qa
+#
+#
+#log
+plumelog.appName=${spring.application.name}-${spring.profiles.active}
+plumelog.redisHost=10.100.2.54
+plumelog.redisAuth=plumelogredis
+plumelog.redisPort=6379
+#开启所有端点
+management.endpoints.web.exposure.include=*

+ 11 - 0
fw-sample-job/src/main/resources/application-stage.properties

@@ -0,0 +1,11 @@
+server.port=9092
+
+##nacos配置中心
+nacos.config.server-addr=nacos.xc-inc.cn:8848
+nacos.config.namespace=de149f1e-f619-460c-9d6c-5721a2da5587
+
+#plumelog
+plumelog.appName=${spring.application.name}-${spring.profiles.active}
+plumelog.redisHost=r-bp12goy2tc8hlbpi6t.redis.rds.aliyuncs.com
+plumelog.redisAuth=Plumelog666
+plumelog.redisPort=6379

+ 33 - 0
fw-sample-job/src/main/resources/application.properties

@@ -0,0 +1,33 @@
+server.port=9091
+spring.application.name=fw-sample-job
+spring.profiles.active=@spring.profiles.active@
+#健康检查
+management.server.port=19091
+management.endpoint.shutdown.enabled=true
+management.endpoint.health.show-details=always
+management.endpoints.web.exposure.include=*
+#
+spring.servlet.multipart.max-request-size=50MB
+spring.servlet.multipart.max-file-size=50MB
+#logback
+logging.config=classpath:logconfig/logback.xml
+#解密salt
+jasypt.encryptor.password=tongchengshenghuo
+#nacos-dubbo
+nacos.maxRetry=3
+nacos.configLongPollTimeout=30000
+nacos.configRetryTime=2000
+#spring-boot-admin
+nacos.discovery.auto-register=true
+nacos.discovery.register.group-name=APPLICATION
+spring.boot.admin.client.instance.metadata.user.name=admin
+spring.boot.admin.client.instance.metadata.user.password=admin
+# 服务提供方版本
+provider.service.version=1.0.0
+# 服务消费方版本
+consumer.service.version=1.0.0
+
+aliyun.sms.accessKeyId=LTAIBnJJGLlFrF6o
+aliyun.sms.accessSecret=thMV7ngP9KXtFjbhGlx8Sie08hMO76
+aliyun.sms.regionId=cn-hangzhou
+aliyun.sms.templateId = SMS_183246340

+ 66 - 0
fw-sample-job/src/main/resources/logconfig/logback-dev.xml

@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="false">
+    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
+    <!--<property name="LOG_HOME" value="/home" />-->
+    <!-- 控制台输出 -->
+    <!-- 彩色日志 -->
+    <!-- 彩色日志依赖的渲染类 -->
+    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <!-- 彩色日志格式 -->
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
+
+
+    <!--输出到控制台-->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>info</level>
+        </filter>
+        <encoder>
+            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
+            <!-- 设置字符集 -->
+            <charset>UTF-8</charset>
+        </encoder>
+    </appender>
+
+    <!-- 如果使用kafka作为队列,启用下面配置 -->
+    <!--<appender name="plumelog_demo" class="KafkaAppender">-->
+    <!--<appName>plumelog_demo</appName>-->
+    <!--<kafkaHosts>172.16.247.143:9092,172.16.247.60:9092,172.16.247.64:9092</kafkaHosts>-->
+    <!-- runModel 1,2  1表示最高性能模式,2表示低性能模式 但是2可以获取更多信息 不配置默认为1-->
+    <!--<runModel>2</runModel>-->
+    <!-- 整合其他链路插件,启用下面配置 sleuth表示整合springcloud.sleuth-->
+    <!--<expand>sleuth</expand>-->
+    <!--</appender>-->
+
+    <springProperty scope="context" name="plumelog.appName" source="plumelog.appName"/>
+    <springProperty scope="context" name="plumelog.redisHost" source="plumelog.redisHost"/>
+    <springProperty scope="context" name="plumelog.redisAuth" source="plumelog.redisAuth"/>
+    <springProperty scope="context" name="plumelog.redisPort" source="plumelog.redisPort"/>
+    <!-- 如果使用redis作为队列,启用下面配置 -->
+    <appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
+        <appName>${plumelog.appName}</appName>
+        <redisHost>${plumelog.redisHost}</redisHost>
+        <!-- 如果使用redis有密码,启用下面配置 -->
+        <redisAuth>${plumelog.redisAuth}</redisAuth>
+        <!-- redis端口号,不配置默认6379-->
+        <redisPort>${plumelog.redisPort}</redisPort>
+        <!-- runModel 1,2  1表示最高性能模式,2表示低性能模式 但是2可以获取更多信息 不配置默认为1-->
+        <runModel>2</runModel>
+        <!-- 整合其他链路插件,启用下面配置 sleuth表示整合springcloud.sleuth-->
+        <expand>sleuth</expand>
+    </appender>
+
+    <!-- 打开看debug -->
+    <logger name="com.xc.srm.mapper" level="debug"></logger>
+
+    <!-- 日志输出级别 -->
+    <root level="INFO">
+        <appender-ref ref="console"/>
+    </root>
+</configuration>

+ 63 - 0
fw-sample-job/src/main/resources/logconfig/logback.xml

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="false">
+    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
+    <!--<property name="LOG_HOME" value="/home" />-->
+    <!-- 控制台输出 -->
+    <!-- 彩色日志 -->
+    <!-- 彩色日志依赖的渲染类 -->
+    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <!-- 彩色日志格式 -->
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
+
+
+    <!--输出到控制台-->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>info</level>
+        </filter>
+        <encoder>
+            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
+            <!-- 设置字符集 -->
+            <charset>UTF-8</charset>
+        </encoder>
+    </appender>
+
+    <!-- 如果使用kafka作为队列,启用下面配置 -->
+    <!--<appender name="plumelog_demo" class="KafkaAppender">-->
+    <!--<appName>plumelog_demo</appName>-->
+    <!--<kafkaHosts>172.16.247.143:9092,172.16.247.60:9092,172.16.247.64:9092</kafkaHosts>-->
+    <!-- runModel 1,2  1表示最高性能模式,2表示低性能模式 但是2可以获取更多信息 不配置默认为1-->
+    <!--<runModel>2</runModel>-->
+    <!-- 整合其他链路插件,启用下面配置 sleuth表示整合springcloud.sleuth-->
+    <!--<expand>sleuth</expand>-->
+    <!--</appender>-->
+
+    <springProperty scope="context" name="plumelog.appName" source="plumelog.appName"/>
+    <springProperty scope="context" name="plumelog.redisHost" source="plumelog.redisHost"/>
+    <springProperty scope="context" name="plumelog.redisAuth" source="plumelog.redisAuth"/>
+    <springProperty scope="context" name="plumelog.redisPort" source="plumelog.redisPort"/>
+    <!-- 如果使用redis作为队列,启用下面配置 -->
+    <appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
+        <appName>${plumelog.appName}</appName>
+        <redisHost>${plumelog.redisHost}</redisHost>
+        <!-- 如果使用redis有密码,启用下面配置 -->
+        <redisAuth>${plumelog.redisAuth}</redisAuth>
+        <!-- redis端口号,不配置默认6379-->
+        <redisPort>${plumelog.redisPort}</redisPort>
+        <!-- runModel 1,2  1表示最高性能模式,2表示低性能模式 但是2可以获取更多信息 不配置默认为1-->
+        <runModel>2</runModel>
+        <!-- 整合其他链路插件,启用下面配置 sleuth表示整合springcloud.sleuth-->
+        <expand>sleuth</expand>
+    </appender>
+
+    <!-- 日志输出级别 -->
+    <root level="INFO">
+        <appender-ref ref="plumelog"/>
+    </root>
+</configuration>

+ 4 - 0
fw-sample-job/src/test/java/com/mokasz/sample/job/test/JobTest.java

@@ -0,0 +1,4 @@
+package com.mokasz.sample.job.test;
+
+public class JobTest {
+}

+ 110 - 0
fw-sample-mqc/pom.xml

@@ -0,0 +1,110 @@
+<?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">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.mokasz</groupId>
+        <artifactId>fw-sample</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>com.mokasz</groupId>
+    <artifactId>fw-sample-mqc</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <packaging>jar</packaging>
+
+    <name>fw-sample-mqc</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.mokasz</groupId>
+            <artifactId>fw-sample-service</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>fw-sample-mqc</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <version>2.8.2</version>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.1.1.RELEASE</version>
+                <!-- repackage:创建一个自动可执行的jar或war文件 -->
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.0</version>
+                <configuration>
+                    <source>8</source>
+                    <target>8</target>
+                </configuration>
+            </plugin>
+        </plugins>
+        <!-- maven资源文件复制插件 -->
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <excludes>
+                    <exclude>application*.properties</exclude>
+                </excludes>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>application.properties</include>
+                    <include>application-${spring.profiles.active}.properties</include>
+                </includes>
+            </resource>
+        </resources>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>qa</id>
+            <properties>
+                <spring.profiles.active>qa</spring.profiles.active>
+            </properties>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+        </profile>
+        <profile>
+            <id>dev</id>
+            <properties>
+                <spring.profiles.active>dev</spring.profiles.active>
+            </properties>
+        </profile>
+        <profile>
+            <id>stage</id>
+            <properties>
+                <spring.profiles.active>stage</spring.profiles.active>
+            </properties>
+        </profile>
+        <profile>
+            <id>prod</id>
+            <properties>
+                <spring.profiles.active>prod</spring.profiles.active>
+            </properties>
+        </profile>
+    </profiles>
+
+</project>

+ 30 - 0
fw-sample-mqc/src/main/java/com/xc/srm/mqc/MqcApplication.java

@@ -0,0 +1,30 @@
+package com.xc.srm.mqc;
+
+import com.alibaba.nacos.spring.context.annotation.config.EnableNacosConfig;
+import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.retry.annotation.EnableRetry;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+
+@EnableNacosConfig
+@SpringBootApplication
+@Slf4j
+@ComponentScan(basePackages = {"com.mokasz.sample"})
+@EnableAsync
+@EnableDubbo
+@EnableFeignClients(basePackages = {"com.mokasz.sample.manager"})
+@NacosPropertySource(dataId = "sample-db", groupId = "fw-sample", autoRefreshed = true)
+@EnableRetry
+public class MqcApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(MqcApplication.class, args);
+    }
+}

+ 17 - 0
fw-sample-mqc/src/main/resources/application-dev.properties

@@ -0,0 +1,17 @@
+server.port=9094
+#注册中心
+nacos.config.server-addr=10.100.2.46:8848
+nacos.config.namespace=qa
+#
+#
+#log
+plumelog.appName=${spring.application.name}-${spring.profiles.active}
+plumelog.redisHost=10.100.2.54
+plumelog.redisAuth=plumelogredis
+plumelog.redisPort=6379
+#logback
+logging.config=classpath:logconfig/logback-dev.xml
+#开启所有端点
+management.endpoints.web.exposure.include=*
+#mybatis plus
+mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

+ 11 - 0
fw-sample-mqc/src/main/resources/application-prod.properties

@@ -0,0 +1,11 @@
+server.port=9094
+
+##nacos配置中心
+nacos.config.server-addr=nacos.xc-inc.cn:8848
+nacos.config.namespace=7671e08b-db1c-4256-8515-b2eaa75634a8
+
+##plumelog
+plumelog.appName=${spring.application.name}-${spring.profiles.active}
+plumelog.redisHost=r-bp12goy2tc8hlbpi6t.redis.rds.aliyuncs.com
+plumelog.redisAuth=Plumelog666
+plumelog.redisPort=6379

+ 12 - 0
fw-sample-mqc/src/main/resources/application-qa.properties

@@ -0,0 +1,12 @@
+#注册中心
+nacos.config.server-addr=10.100.2.46:8848
+nacos.config.namespace=qa
+#
+#
+#log
+plumelog.appName=${spring.application.name}-${spring.profiles.active}
+plumelog.redisHost=10.100.2.54
+plumelog.redisAuth=plumelogredis
+plumelog.redisPort=6379
+#开启所有端点
+management.endpoints.web.exposure.include=*

+ 11 - 0
fw-sample-mqc/src/main/resources/application-stage.properties

@@ -0,0 +1,11 @@
+server.port=9094
+
+##nacos配置中心
+nacos.config.server-addr=nacos.xc-inc.cn:8848
+nacos.config.namespace=de149f1e-f619-460c-9d6c-5721a2da5587
+
+#plumelog
+plumelog.appName=${spring.application.name}-${spring.profiles.active}
+plumelog.redisHost=r-bp12goy2tc8hlbpi6t.redis.rds.aliyuncs.com
+plumelog.redisAuth=Plumelog666
+plumelog.redisPort=6379

+ 30 - 0
fw-sample-mqc/src/main/resources/application.properties

@@ -0,0 +1,30 @@
+server.port=9094
+#健康检查
+management.server.port=19094
+management.endpoint.shutdown.enabled=true
+management.endpoint.health.show-details=always
+management.endpoints.web.exposure.include=*
+#
+spring.application.name=xc-srm-mqc
+spring.profiles.active=@spring.profiles.active@
+#
+spring.servlet.multipart.max-request-size=50MB
+spring.servlet.multipart.max-file-size=50MB
+#logback
+logging.config=classpath:logconfig/logback.xml
+#解密salt
+jasypt.encryptor.password=tongchengshenghuo
+#nacos-dubbo
+nacos.maxRetry=3
+nacos.configLongPollTimeout=30000
+nacos.configRetryTime=2000
+#spring-boot-admin
+nacos.discovery.auto-register=true
+nacos.discovery.register.group-name=APPLICATION
+spring.boot.admin.client.instance.metadata.user.name=admin
+spring.boot.admin.client.instance.metadata.user.password=admin
+
+aliyun.sms.accessKeyId=LTAIBnJJGLlFrF6o
+aliyun.sms.accessSecret=thMV7ngP9KXtFjbhGlx8Sie08hMO76
+aliyun.sms.regionId=cn-hangzhou
+aliyun.sms.templateId = SMS_183246340

+ 66 - 0
fw-sample-mqc/src/main/resources/logconfig/logback-dev.xml

@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="false">
+    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
+    <!--<property name="LOG_HOME" value="/home" />-->
+    <!-- 控制台输出 -->
+    <!-- 彩色日志 -->
+    <!-- 彩色日志依赖的渲染类 -->
+    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <!-- 彩色日志格式 -->
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
+
+
+    <!--输出到控制台-->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>info</level>
+        </filter>
+        <encoder>
+            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
+            <!-- 设置字符集 -->
+            <charset>UTF-8</charset>
+        </encoder>
+    </appender>
+
+    <!-- 如果使用kafka作为队列,启用下面配置 -->
+    <!--<appender name="plumelog_demo" class="KafkaAppender">-->
+    <!--<appName>plumelog_demo</appName>-->
+    <!--<kafkaHosts>172.16.247.143:9092,172.16.247.60:9092,172.16.247.64:9092</kafkaHosts>-->
+    <!-- runModel 1,2  1表示最高性能模式,2表示低性能模式 但是2可以获取更多信息 不配置默认为1-->
+    <!--<runModel>2</runModel>-->
+    <!-- 整合其他链路插件,启用下面配置 sleuth表示整合springcloud.sleuth-->
+    <!--<expand>sleuth</expand>-->
+    <!--</appender>-->
+
+    <springProperty scope="context" name="plumelog.appName" source="plumelog.appName"/>
+    <springProperty scope="context" name="plumelog.redisHost" source="plumelog.redisHost"/>
+    <springProperty scope="context" name="plumelog.redisAuth" source="plumelog.redisAuth"/>
+    <springProperty scope="context" name="plumelog.redisPort" source="plumelog.redisPort"/>
+    <!-- 如果使用redis作为队列,启用下面配置 -->
+    <appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
+        <appName>${plumelog.appName}</appName>
+        <redisHost>${plumelog.redisHost}</redisHost>
+        <!-- 如果使用redis有密码,启用下面配置 -->
+        <redisAuth>${plumelog.redisAuth}</redisAuth>
+        <!-- redis端口号,不配置默认6379-->
+        <redisPort>${plumelog.redisPort}</redisPort>
+        <!-- runModel 1,2  1表示最高性能模式,2表示低性能模式 但是2可以获取更多信息 不配置默认为1-->
+        <runModel>2</runModel>
+        <!-- 整合其他链路插件,启用下面配置 sleuth表示整合springcloud.sleuth-->
+        <expand>sleuth</expand>
+    </appender>
+
+    <!-- 打开看debug -->
+    <logger name="com.xc.srm.mapper" level="debug"></logger>
+
+    <!-- 日志输出级别 -->
+    <root level="INFO">
+        <appender-ref ref="console"/>
+    </root>
+</configuration>

+ 63 - 0
fw-sample-mqc/src/main/resources/logconfig/logback.xml

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="false">
+    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
+    <!--<property name="LOG_HOME" value="/home" />-->
+    <!-- 控制台输出 -->
+    <!-- 彩色日志 -->
+    <!-- 彩色日志依赖的渲染类 -->
+    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <!-- 彩色日志格式 -->
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
+
+
+    <!--输出到控制台-->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>info</level>
+        </filter>
+        <encoder>
+            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
+            <!-- 设置字符集 -->
+            <charset>UTF-8</charset>
+        </encoder>
+    </appender>
+
+    <!-- 如果使用kafka作为队列,启用下面配置 -->
+    <!--<appender name="plumelog_demo" class="KafkaAppender">-->
+    <!--<appName>plumelog_demo</appName>-->
+    <!--<kafkaHosts>172.16.247.143:9092,172.16.247.60:9092,172.16.247.64:9092</kafkaHosts>-->
+    <!-- runModel 1,2  1表示最高性能模式,2表示低性能模式 但是2可以获取更多信息 不配置默认为1-->
+    <!--<runModel>2</runModel>-->
+    <!-- 整合其他链路插件,启用下面配置 sleuth表示整合springcloud.sleuth-->
+    <!--<expand>sleuth</expand>-->
+    <!--</appender>-->
+
+    <springProperty scope="context" name="plumelog.appName" source="plumelog.appName"/>
+    <springProperty scope="context" name="plumelog.redisHost" source="plumelog.redisHost"/>
+    <springProperty scope="context" name="plumelog.redisAuth" source="plumelog.redisAuth"/>
+    <springProperty scope="context" name="plumelog.redisPort" source="plumelog.redisPort"/>
+    <!-- 如果使用redis作为队列,启用下面配置 -->
+    <appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
+        <appName>${plumelog.appName}</appName>
+        <redisHost>${plumelog.redisHost}</redisHost>
+        <!-- 如果使用redis有密码,启用下面配置 -->
+        <redisAuth>${plumelog.redisAuth}</redisAuth>
+        <!-- redis端口号,不配置默认6379-->
+        <redisPort>${plumelog.redisPort}</redisPort>
+        <!-- runModel 1,2  1表示最高性能模式,2表示低性能模式 但是2可以获取更多信息 不配置默认为1-->
+        <runModel>2</runModel>
+        <!-- 整合其他链路插件,启用下面配置 sleuth表示整合springcloud.sleuth-->
+        <expand>sleuth</expand>
+    </appender>
+
+    <!-- 日志输出级别 -->
+    <root level="INFO">
+        <appender-ref ref="plumelog"/>
+    </root>
+</configuration>

+ 4 - 0
fw-sample-mqc/src/test/java/com/xc/srm/mqc/test/MqcTest.java

@@ -0,0 +1,4 @@
+package com.xc.srm.mqc.test;
+
+public class MqcTest {
+}

BIN
fw-sample-portal/.DS_Store


+ 7 - 0
fw-sample-portal/.env

@@ -0,0 +1,7 @@
+# 开发环境
+
+NODE_ENV=development
+
+VUE_APP_UPLOAD_URL = /api/msg-lib-app/message/library/upload
+
+VUE_APP_API_URL = http://localhost.mokamrp.com:8080/

+ 7 - 0
fw-sample-portal/.env.prod

@@ -0,0 +1,7 @@
+# 生产环境
+
+NODE_ENV=production
+
+VUE_APP_UPLOAD_URL = /api/free-novel/file/upload
+
+VUE_APP_API_URL = https://mokamrp.com

+ 7 - 0
fw-sample-portal/.env.test

@@ -0,0 +1,7 @@
+# 测试环境
+
+NODE_ENV=testing
+
+VUE_APP_UPLOAD_URL = /api/free-novel/file/upload
+
+VUE_APP_API_URL = https://test.mokamrp.com/

+ 19 - 0
fw-sample-portal/.gitignore

@@ -0,0 +1,19 @@
+node_modules/
+.history
+dist/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+**/*.log
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.local
+
+package-lock.json
+yarn.lock

+ 8 - 0
fw-sample-portal/Dockerfile

@@ -0,0 +1,8 @@
+FROM  shanbumin/nginx:1.14-alpine3.8
+
+#ADD
+ADD ./dist /usr/share/nginx/html/public/
+ADD ./docs/conf/nginx.conf /etc/nginx/nginx.conf
+ADD ./docs/conf/conf.d/front.conf /etc/nginx/conf.d/default.conf
+
+ENTRYPOINT ["nginx","-g","daemon off;"]

+ 1 - 0
fw-sample-portal/README.md

@@ -0,0 +1 @@
+# fw-sample-portal

+ 5 - 0
fw-sample-portal/babel.config.js

@@ -0,0 +1,5 @@
+module.exports = {
+  presets: [
+    '@vue/cli-plugin-babel/preset'
+  ]
+}

+ 38 - 0
fw-sample-portal/docs/conf/conf.d/front.conf

@@ -0,0 +1,38 @@
+server{
+    listen 80;
+    server_name  localhost;
+    client_max_body_size 1020M;
+    root /usr/share/nginx/html/public;
+    index  index.html index.htm;
+
+    location /  {
+              proxy_set_header    Host             $host;
+              proxy_set_header    X-Real-IP        $remote_addr;
+              proxy_set_header    X-Forwarded-For  $proxy_add_x_forwarded_for;
+              proxy_set_header    X-Client-Verify  SUCCESS;
+              proxy_set_header    X-Client-DN      $ssl_client_s_dn;
+              proxy_set_header    X-SSL-Subject    $ssl_client_s_dn;
+              proxy_set_header    X-SSL-Issuer     $ssl_client_i_dn;
+              proxy_read_timeout 1800;
+              proxy_connect_timeout 1800;
+             try_files $uri $uri/ /index.html;
+
+
+                add_header Access-Control-Allow-Origin $http_origin;
+                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
+                add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
+
+               if ($request_method = 'OPTIONS') {
+                    return 204;
+                 }
+             }
+
+
+    location /yg/ {
+        proxy_pass http://hyperion-free-novel-yangguang-admin-svc/;
+    }
+
+    location /api/ {
+        proxy_pass http://hyperion-gateway-svc/;
+    }
+}

+ 36 - 0
fw-sample-portal/docs/conf/nginx.conf

@@ -0,0 +1,36 @@
+user  nginx;
+worker_processes  auto;
+
+error_log  /var/log/nginx/error.log warn;
+pid        /var/run/nginx.pid;
+
+
+events {
+    worker_connections  20480;
+}
+
+
+http {
+    include       /etc/nginx/mime.types;
+    default_type  application/octet-stream;
+
+    fastcgi_buffer_size 128k;
+    fastcgi_buffers 256 16k;
+    client_body_buffer_size 1024k;
+
+    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
+                      '$status $body_bytes_sent "$http_referer" '
+                      '"$http_user_agent" "$http_x_forwarded_for"';
+
+    access_log  /var/log/nginx/access.log  main;
+
+    sendfile        on;
+    #tcp_nopush     on;
+
+    keepalive_timeout  65;
+
+    gzip  on;
+
+    include /etc/nginx/conf.d/*.conf;
+
+}

+ 70 - 0
fw-sample-portal/package.json

@@ -0,0 +1,70 @@
+{
+  "name": "moka_free_novel_front",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "dev": "vue-cli-service serve",
+    "test": "vue-cli-service build --mode test",
+    "build": "vue-cli-service build --mode prod",
+    "lint": "vue-cli-service lint"
+  },
+  "dependencies": {
+    "core-js": "^3.6.5",
+    "element-ui": "^2.15.1",
+    "vue": "^2.6.11",
+    "vue-router": "^3.0.3",
+    "vuex": "^3.6.2",
+    "vue-video-player": "^5.0.2"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "~4.5.0",
+    "@vue/cli-plugin-eslint": "~4.5.0",
+    "@vue/cli-service": "~4.5.0",
+    "axios": "^0.21.1",
+    "babel-eslint": "^10.1.0",
+    "eslint": "^6.7.2",
+    "eslint-plugin-vue": "^6.2.2",
+    "node-sass": "^4.9.2",
+    "sass": "^1.18.0",
+    "sass-loader": "^7.1.0",
+    "compression-webpack-plugin": "^6.1.1",
+    "vue-template-compiler": "^2.6.11"
+  },
+  "eslintConfig": {
+    "root": true,
+    "env": {
+      "node": true
+    },
+    "extends": [
+      "plugin:vue/essential",
+      "eslint:recommended"
+    ],
+    "parserOptions": {
+      "parser": "babel-eslint"
+    },
+    "rules": {
+      "vue/no-unused-components": 2,
+      "indent": "off",
+      "semi": "off",
+      "no-trailing-spaces": "off",
+      "comma-dangle": "off",
+      "no-useless-return": "off",
+      "eqeqeq": "error",
+      "no-undef": "off",
+      "new-cap": [
+        "off"
+      ],
+      "generator-star-spacing": "off",
+      "no-tabs": "off",
+      "no-unused-vars": "off",
+      "no-console": "off",
+      "no-irregular-whitespace": "off",
+      "no-debugger": "off"
+    }
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not dead"
+  ]
+}

+ 89 - 0
fw-sample-portal/pom.xml

@@ -0,0 +1,89 @@
+<?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>
+    <groupId>com.mokasz</groupId>
+    <artifactId>fw-sample</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <packaging>pom</packaging>
+
+  <artifactId>fw-sample-portal</artifactId>
+
+  <properties>
+    <maven.compiler.source>8</maven.compiler.source>
+    <maven.compiler.target>8</maven.compiler.target>
+  </properties>
+
+
+<!--  <build>-->
+<!--    <plugins>-->
+<!--      <plugin>-->
+<!--        <groupId>org.codehaus.mojo</groupId>-->
+<!--        <artifactId>exec-maven-plugin</artifactId>-->
+<!--        <version>1.6.0</version>-->
+<!--        <executions>-->
+<!--          <execution>-->
+<!--            <id>exec-npm-run-install</id>-->
+<!--            <phase>prepare-package</phase>-->
+<!--            <goals>-->
+<!--              <goal>exec</goal>-->
+<!--            </goals>-->
+<!--            <configuration>-->
+<!--              <executable>npm</executable>-->
+<!--              <arguments>-->
+<!--                <argument>install</argument>-->
+<!--              </arguments>-->
+<!--            </configuration>-->
+<!--          </execution>-->
+<!--          <execution>-->
+<!--            <id>exec-npm-run-build</id>-->
+<!--            <phase>prepare-package</phase>-->
+<!--            <goals>-->
+<!--              <goal>exec</goal>-->
+<!--            </goals>-->
+<!--            <configuration>-->
+<!--              <executable>npm</executable>-->
+<!--              <arguments>-->
+<!--                <argument>run</argument>-->
+<!--                <argument>build:${spring.profiles.active}</argument>-->
+<!--              </arguments>-->
+<!--            </configuration>-->
+<!--          </execution>-->
+<!--        </executions>-->
+<!--      </plugin>-->
+<!--    </plugins>-->
+<!--  </build>-->
+
+  <profiles>
+    <profile>
+      <id>dev</id>
+      <properties>
+        <spring.profiles.active>dev</spring.profiles.active>
+      </properties>
+      <activation>
+        <activeByDefault>true</activeByDefault>
+      </activation>
+    </profile>
+    <profile>
+      <id>qa</id>
+      <properties>
+        <spring.profiles.active>qa</spring.profiles.active>
+      </properties>
+    </profile>
+    <profile>
+      <id>stage</id>
+      <properties>
+        <spring.profiles.active>stage</spring.profiles.active>
+      </properties>
+    </profile>
+    <profile>
+      <id>prod</id>
+      <properties>
+        <spring.profiles.active>prod</spring.profiles.active>
+      </properties>
+    </profile>
+  </profiles>
+</project>

BIN
fw-sample-portal/public/favicon.ico


+ 17 - 0
fw-sample-portal/public/index.html

@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html lang="">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
+    <title>FW sample</title>
+  </head>
+  <body>
+    <noscript>
+      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
+    </noscript>
+    <div id="app"></div>
+    <!-- built files will be auto injected -->
+  </body>
+</html>

+ 12 - 0
fw-sample-portal/src/App.vue

@@ -0,0 +1,12 @@
+<template>
+  <div id="app">
+    <router-view />
+  </div>
+</template>
+
+<script>
+
+export default {
+  name: 'App'
+}
+</script>

BIN
fw-sample-portal/src/assets/image/bg-login.png


BIN
fw-sample-portal/src/assets/image/icon/icon-account-edit.png


BIN
fw-sample-portal/src/assets/image/icon/icon-account-user.png


BIN
fw-sample-portal/src/assets/image/icon/icon-add-user-active.png


BIN
fw-sample-portal/src/assets/image/icon/icon-add-user.png


BIN
fw-sample-portal/src/assets/image/icon/icon-common-tip.png


BIN
fw-sample-portal/src/assets/image/icon/icon-default-avatar.png


BIN
fw-sample-portal/src/assets/image/icon/icon-delete-active.png


BIN
fw-sample-portal/src/assets/image/icon/icon-delete.png


BIN
fw-sample-portal/src/assets/image/icon/icon-login-ding.png


BIN
fw-sample-portal/src/assets/image/icon/icon-login-fly.png


BIN
fw-sample-portal/src/assets/image/icon/icon-login-phone-active.png


BIN
fw-sample-portal/src/assets/image/icon/icon-login-phone.png


BIN
fw-sample-portal/src/assets/image/icon/icon-login-type-active.png


BIN
fw-sample-portal/src/assets/image/icon/icon-login-type.png


BIN
fw-sample-portal/src/assets/image/icon/icon-login-veritify-active.png


BIN
fw-sample-portal/src/assets/image/icon/icon-login-veritify.png


BIN
fw-sample-portal/src/assets/image/icon/icon-material-edit-default.png


BIN
fw-sample-portal/src/assets/image/icon/icon-menu--account.png


BIN
fw-sample-portal/src/assets/image/icon/icon-nav-search-hover.png


BIN
fw-sample-portal/src/assets/image/icon/icon-nav-search-normal.png


BIN
fw-sample-portal/src/assets/image/icon/icon-reback.png


BIN
fw-sample-portal/src/assets/image/icon/icon-refresh.png


BIN
fw-sample-portal/src/assets/image/icon/icon-sort-down-active.png


BIN
fw-sample-portal/src/assets/image/icon/icon-sort-down.png


BIN
fw-sample-portal/src/assets/image/icon/icon-sort-up-active.png


BIN
fw-sample-portal/src/assets/image/icon/icon-sort-up.png


BIN
fw-sample-portal/src/assets/image/icon/icon-template-gallery-phone.png


BIN
fw-sample-portal/src/assets/image/system-book.png


BIN
fw-sample-portal/src/assets/image/system-logo.png


+ 202 - 0
fw-sample-portal/src/assets/style/common.scss

@@ -0,0 +1,202 @@
+body {
+  padding: 0;
+  margin: 0;
+  background-color: #EFEFF4;
+  font-family: "PingFang SC","Helvetica Neue",Helvetica,"Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif;
+}
+
+#app {
+  //overflow: hidden;
+}
+
+.scroll {
+  &.el-scrollbar {
+    height: 100%;
+  }
+
+  .el-scrollbar__wrap {
+    overflow-x: hidden;
+  }
+}
+
+.flr {
+  float: right;
+}
+
+.fll {
+  float: left;
+}
+
+.clearfix {
+  &:after {
+    visibility: hidden;
+    display: block;
+    font-size: 0;
+    content: " ";
+    clear: both;
+    height: 0;
+  }
+}
+
+.list-table-delete {
+  white-space: nowrap;
+  .icon-delete-warning {
+    color: #FF8023;
+  }
+}
+
+
+// 表格状态样式
+.status-text {
+  color: #d9d9d9;
+  font-size: 14px;
+  cursor: pointer;
+  &:before {
+    content: '';
+    width: 4px;
+    height: 4px;
+    margin-right: 8px;
+    display: inline-block;
+    border-radius: 50%;
+    background-color: #d9d9d9;
+    position: relative;
+    top: -2px;
+  }
+  &.status-progress {
+    color: #4C88F6;
+    &:before {
+      background-color: #4C88F6;
+    }
+  }
+  &.status-success {
+    color: #67c23a;
+    &:before {
+      background-color: #67c23a;
+    }
+  }
+  &.status-danger {
+    color: #FB4444;
+    &:before {
+      background-color: #FB4444;
+    }
+  }
+}
+
+.single-page-container {
+  .page-course-section {
+    //background: #FFFFFF;
+    //box-shadow: 0px 2px 2px 0px rgba(174, 175, 175, 0.2);
+    //border-radius: 2px;
+    .el-input-number__increase, .el-input-number__decrease {
+      background: transparent;
+    }
+    margin-bottom: 20px;
+    position: relative;
+
+    .title {
+      height: 56px;
+      line-height: 56px;
+      border-bottom: solid 1px #EBEBEB;
+      box-sizing: border-box;
+      color: #333A3F;
+      font-size: 18px;
+      font-weight: 600;
+      &:before {
+        content: '';
+        display: inline-block;
+        width: 3px;
+        height: 16px;
+        background-color: $themeColor;
+        margin-right: 5px;
+        position: relative;
+        top: 2px;
+      }
+    }
+
+    .page-course-content {
+      padding: 18px 40px 18px 37px;
+      & > .el-form-item {
+        .el-input:not(.el-transfer-panel__filter), .el-textarea, .el-select{
+          width: 400px;
+        }
+        .el-input-number .el-input {
+          width: auto;
+        }
+      }
+
+      .section-transfer-container {
+        .el-transfer-panel .el-transfer-panel__header {
+          background: #fff;
+        }
+        .el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label {
+          font-size: 12px;
+          color: #1A1414;
+        }
+      }
+    }
+
+    .item-tips {
+      width: 400px;
+      color: #666;
+      font-size: 12px;
+
+      i {
+        color: #FFB567;
+      }
+
+      span {
+        color: $themeColor;
+      }
+    }
+  }
+
+  .page-course-operate {
+    text-align: center;
+    margin-bottom: 50px;
+  }
+
+  .reback-btn {
+    position: absolute;
+    right: 0;
+    top: 5px;
+
+    a {
+      display: inline-block;
+      width: 70px;
+      height: 36px;
+      line-height: 36px;
+      border: solid 1px #E5E9EC;
+      box-sizing: border-box;
+      color: #333;
+      font-size: 14px;
+      background-color: #fff;
+      text-align: center;
+      text-decoration: none;
+      transition: all 0.1s;
+      border-radius: 2px;
+
+      i {
+        display: inline-block;
+        width: 16px;
+        height: 16px;
+        position: relative;
+        top: 5px;
+        background-image: url("~@/assets/image/icon/icon-reback.png");
+        background-repeat: no-repeat;
+        background-position: 0 0;
+        background-size: 42px 80%;
+        margin-right: 5px;
+      }
+
+      &:hover {
+        color: $themeColor;
+        border-color: $themeColor;
+        background-color: #ECF1FE;
+
+        i {
+          background-position: -28px 0;
+        }
+      }
+    }
+  }
+}

+ 444 - 0
fw-sample-portal/src/assets/style/element-variables.scss

@@ -0,0 +1,444 @@
+/*
+Write your variables here. All available variables can be
+found in element-ui/packages/theme-chalk/src/common/var.scss.
+For example, to overwrite the theme color:
+*/
+$--color-primary: $themeColor;
+
+/* icon font path, required */
+$--font-path: '~element-ui/lib/theme-chalk/fonts';
+
+@import "../../../node_modules/element-ui/packages/theme-chalk/src/index";
+
+// el-dialog
+
+.el-dialog__wrapper {
+  .el-dialog {
+    border-radius: 8px;
+
+    .el-dialog__header {
+      border-bottom: 1px solid rgba(235, 235, 235, 1);
+      padding-top: 15px;
+      padding-bottom: 15px;
+      padding-left: 24px;
+    }
+
+    .el-dialog__body {
+      .el-form {
+        width: 90%;
+        margin: auto;
+      }
+    }
+
+    // title 样式设置
+    .dialog-title {
+      font-size: 14px;
+      font-family: 'Microsoft YaHei';
+      font-weight: 400;
+      color: #7D7D7D;
+      line-height: 24px;
+    }
+
+    // footer 中按钮的布局样式
+    .dialog-footer {
+      @include flex-center;
+      padding-bottom: 10px;
+
+      .btn {
+        margin-left: 20px;
+
+        &:first-child {
+          margin-left: 0;
+        }
+
+        &.el-button.is-round {
+          border-radius: 18px;
+          padding: 10px 18px;
+        }
+
+        &.el-button.el-button--default {
+          color: #1E1E1E;
+          background: #fff;
+          border: 1px solid #F2F2F5;
+        }
+      }
+    }
+  }
+}
+
+
+// 弹窗组件样式修改
+.dialog-form {
+  .el-select {
+    width: 100%;
+  }
+
+  .el-input__inner {
+    border: 1px solid #EDECF2;
+    border-radius: 3px;
+    height: 32px;
+    line-height: 32px;
+    font-size: 14px;
+
+    &:focus {
+      border-color: $themeColor;
+    }
+
+    &::-webkit-input-placeholder {
+      color: rgba(212, 212, 212, 1);
+    }
+
+    // 日期范围选择(el-date-picker)图标 line-height
+    &.el-date-editor.el-date-editor--daterange, &.el-date-editor.el-date-editor--datetimerange, &.el-date-editor.el-date-editor--timerange {
+      .el-input__icon.el-range__icon {
+        line-height: 22px;
+      }
+
+      .el-input__icon.el-range__close-icon {
+        line-height: 22px;
+      }
+
+      .el-range-separator {
+        line-height: 22px;
+      }
+    }
+  }
+
+  .el-input__icon {
+    line-height: 32px;
+  }
+
+  .el-range-input { // 时间范围选取时输入框的字体设置
+    font-size: 14px;
+
+    &::-webkit-input-placeholder {
+      color: rgba(212, 212, 212, 1);
+    }
+  }
+
+  // 选择框 focus 和 hover 时边框的颜色
+  .el-select .el-input__inner:focus {
+    border-color: $themeColor;
+  }
+
+  .el-select:hover .el-input__inner {
+    border-color: $themeColor;
+  }
+
+  .el-textarea {
+    .el-textarea__inner {
+      border: 1px solid #EDECF2;
+      border-radius: 2px;
+
+      &::-webkit-input-placeholder {
+        color: rgba(212, 212, 212, 1);
+      }
+    }
+  }
+
+  .el-radio {
+    color: #1E1E1E;
+    font-weight: 400;
+  }
+
+  .el-input-number__increase, .el-input-number__decrease {
+    background: transparent;
+  }
+
+  // el-form-item 中 label 的字体、颜色设置
+  .el-form-item.title-label {
+    //margin-bottom: 12px;
+
+    .el-form-item__label {
+      height: 32px;
+      line-height: 32px;
+      font-size: 14px;
+      font-weight: 400;
+      color: #474747;
+      position: relative;
+    }
+
+    .el-form-item__content {
+      line-height: 32px;
+    }
+  }
+
+  // el-cascader 输入框样式
+  .el-cascader.el-cascader--small {
+    line-height: 30px;
+    margin-top: -1px;
+
+    & .el-input__inner:focus {
+      border-color: $themeColor;
+    }
+
+    &:hover .el-input__inner {
+      border-color: #31C37B;
+    }
+
+    .el-input__inner {
+      border: 1px solid rgba(220, 223, 230, 1);
+      border-radius: 3px;
+      height: 30px;
+      line-height: 30px;
+      font-size: 14px;
+      box-sizing: border-box;
+
+      &::-webkit-input-placeholder {
+        color: rgba(212, 212, 212, 1);
+      }
+    }
+  }
+}
+
+.search-form {
+  .el-input__inner {
+    border: 1px solid #EDECF2;
+    border-radius: 18px;
+
+    &:focus {
+      border-color: $themeColor;
+    }
+
+    &::-webkit-input-placeholder {
+      color: #A8ACB4;
+    }
+  }
+
+  .el-button {
+    border-radius: 18px;
+  }
+
+  .el-form-item {
+    position: relative;
+    .el-form-item__label {
+      position: absolute;
+      top: -18px;
+      left: 22px;
+      color: #A8ACB4;
+      font-size: 10px;
+      z-index: 1;
+      background-color: #fff;
+      height: 25px;
+      padding-left: 5px;
+      text-align: center;
+    }
+  }
+}
+
+.round-select {
+  .el-input__inner {
+    border: 1px solid #EDECF2;
+    border-radius: 18px;
+
+    &:focus {
+      border-color: $themeColor;
+    }
+
+    &::-webkit-input-placeholder {
+      color: #A8ACB4;
+    }
+  }
+}
+
+.operate-box {
+  margin: 19px 0 13px 0;
+
+  .el-button {
+    padding: 10px 8px;
+    font-weight: 400;
+    .el-icon-plus {
+      font-weight: bold;
+    }
+  }
+}
+
+.list-table {
+
+  &::before, .el-table__fixed::before, .el-table__fixed-right::before { // 去掉表格下方的线
+    height: 0;
+  }
+
+  &.el-table th.is-leaf, &.el-table td {
+    border-bottom: none;
+  }
+
+  &.el-table thead {
+    color: #1E1E1E;
+    font-weight: 400;
+  }
+
+  &.el-table th {
+    background-color: #FBFAFD;
+  }
+
+  &.el-table th > .cell {
+    font-weight: 400;
+  }
+
+  &.el-table--striped .el-table__body tr.el-table__row--striped td {
+    background: #FBFAFD;
+  }
+
+  // 鼠标移上时,当前行背景色(固定了列的 el-table,鼠标移上时,tr 标签上会多一个 .hover-row )
+  .el-table__body tr.el-table__row.hover-row {
+    > td {
+      background-color: #F2F7FF;
+
+      //&:first-child { // 鼠标移上时,在表格最左侧显示一个标记
+      //  &::before {
+      //    content: '';
+      //    position: absolute;
+      //    width: 4px;
+      //    left: 0;
+      //    top: 0;
+      //    bottom: 0;
+      //    background-color: $themeColor;
+      //    z-index: 10;
+      //  }
+      //}
+    }
+  }
+
+  // 鼠标移上时,当前行背景色(正常 el-table)
+  &.el-table--enable-row-hover .el-table__body tr.el-table__row {
+    &:hover {
+      > td {
+        background-color: #F2F7FF;
+
+        //&:first-child { // 鼠标移上时,在表格最左侧显示一个标记
+        //  &::before {
+        //    content: '';
+        //    position: absolute;
+        //    width: 4px;
+        //    left: 0;
+        //    top: 0;
+        //    bottom: 0;
+        //    background-color: $themeColor;
+        //    z-index: 10;
+        //  }
+        //}
+      }
+    }
+  }
+
+  .el-table__body .cell {
+    color: rgba(71, 71, 71, 0.8);
+    line-height: 25px;
+  }
+
+  .el-table__header .cell {
+    line-height: 25px;
+  }
+
+  .el-button {
+    .underline {
+      display: inline-block;
+      border-bottom: solid 1px rgba(40, 66, 200, 0.7);
+      color: rgba(40, 66, 200, 0.7);
+    }
+
+    &:hover {
+      .underline {
+        color: $themeColor;
+        border-bottom: solid 1px $themeColor;
+      }
+    }
+  }
+
+  &.el-table--scrollable-x .el-table__body-wrapper {
+    @include scrollBar;
+  }
+
+  &.el-table--scrollable-y .el-table__body-wrapper {
+    @include scrollBar;
+  }
+
+  .el-image__error {
+    font-size: 12px;
+  }
+
+}
+
+// tab panel
+.el-tabs {
+  &.el-tabs--card > .el-tabs__header .el-tabs__nav {
+    border-left-color: transparent;
+    border-right-color: transparent;
+    border-top-color: transparent;
+    border-radius: 0;
+  }
+
+  &.el-tabs--card > .el-tabs__header .el-tabs__item {
+    border-left-color: transparent;
+  }
+
+  &.el-tabs--card > .el-tabs__header {
+    border-bottom: solid 1px #F7F7F7;
+  }
+
+  .el-tabs__item {
+    font-size: 16px;
+    font-weight: 300;
+    color: #B0B0B0;
+    transition: all 0.3s;
+    user-select: none;
+    border-right: solid 1px transparent;
+
+    &.is-active {
+      border-top: solid 4px $themeColor;
+      box-sizing: content-box;
+      color: $themeColor;
+      font-weight: 400;
+
+      &:first-child {
+        border-right-color: #F7F7F7;
+      }
+
+      &:not(:first-child) {
+        border-left-color: #F7F7F7;
+        border-right-color: #F7F7F7;
+      }
+    }
+  }
+
+  .el-tabs__content {
+    padding: 0 18px;
+  }
+}
+
+.noborder-input {
+  .el-input__inner {
+    border: none;
+  }
+}
+
+.tab-menu-container {
+  padding-left: 20px;
+
+  .el-menu-item {
+    font-size: 16px;
+    font-weight: bold;
+    cursor: pointer;
+  }
+
+  &.el-menu--horizontal > .el-menu-item.is-active {
+    border-width: 4px;
+    color: $themeColor;
+    position: relative;
+
+    &:before {
+      content: '';
+      display: inline-block;
+      width: 6px;
+      height: 6px;
+      background-color: $themeColor;
+      border-radius: 50%;
+      position: absolute;
+      left: 6px;
+      top: 50%;
+      margin-right: 5px;
+    }
+  }
+}
+

+ 5 - 0
fw-sample-portal/src/assets/style/index.scss

@@ -0,0 +1,5 @@
+@import "variables";
+@import "mixin";
+@import "common";
+@import "element-variables";
+@import "transition";

+ 119 - 0
fw-sample-portal/src/assets/style/mixin.scss

@@ -0,0 +1,119 @@
+// flex 方式居中
+@mixin flex-center {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+}
+
+// flex 方式水平布局居中
+@mixin flex-horizontal-center {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+}
+
+// flex 方式垂直布局居中
+@mixin flex-vertical-center {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+
+// 鼠标移上时显示白色蒙层
+@mixin mouse-hover-mask {
+  &:hover {
+    &::after {
+      content: '';
+      position: absolute;
+      width: 100%;
+      height: 100%;
+      left: 0;
+      top: 0;
+      background-color: rgba(255, 255, 255, 0.3);
+    }
+  }
+}
+
+// 滚动条设置
+@mixin scrollBar {
+  /*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/
+  &::-webkit-scrollbar {
+    width: 10px;
+    height: 10px;
+    background-color: #F6F6F6;
+  }
+  /*定义滚动条轨道*/
+  &::-webkit-scrollbar-track {
+    -webkit-box-shadow: inset 0 0 6px transparent;
+    border-radius: 0;
+    background-color: #F5F5F5;
+  }
+  /*定义滑块*/
+  &::-webkit-scrollbar-thumb {
+    background-color: #D4D4D4;
+  }
+  /*定义滚动条两端按钮*/
+  &::-webkit-scrollbar-button {
+    display: block;
+    width: 10px;
+  }
+  &::-webkit-scrollbar-track:horizontal {
+    padding: 0;
+    margin: 0;
+  }
+  //&::-webkit-scrollbar-button:horizontal:single-button:start {
+  //  background: url(~@/assets/img/icon/icon-scroll-left.png) 0 0 no-repeat;
+  //  cursor: pointer;
+  //}
+  //&::-webkit-scrollbar-button:horizontal:single-button:end {
+  //  text-align: right;
+  //  background: url(~@/assets/img/icon/icon-scroll-right.png) 0 0 no-repeat;
+  //  cursor: pointer;
+  //}
+}
+
+// 页面内容 div 使用,设置了圆角和阴影
+@mixin page-content-wrapper {
+  background-color: #fff;
+  box-shadow: 1px 2px 8px 0 rgba(223, 227, 235, 0.66);
+  border-radius: 4px;
+  box-sizing: border-box;
+  padding: 18px;
+}
+
+// 弹框内容布局(样式为左边标题,右边输入框/文字)
+@mixin dialog-content-layout {
+  box-sizing: border-box;
+
+  .row {
+    @include flex-horizontal-center;
+    margin-bottom: 24px;
+
+    &:last-child {
+      margin-bottom: 0;
+    }
+
+    .label {
+      width: 80px;
+      flex-basis: 80px;
+      flex-shrink: 0;
+      text-align: right;
+      font-size: 12px;
+      font-family: "Microsoft YaHei";
+      color: rgba(125, 125, 125, 1);
+      line-height: 24px;
+    }
+
+    span {
+      font-size: 12px;
+    }
+  }
+}
+
+// label 字体设置(左名称,右内容布局时,左边的都称为 label)
+@mixin label-font {
+  font-size: 12px;
+  font-weight: 300;
+  color: #7D7D7D;
+}

+ 48 - 0
fw-sample-portal/src/assets/style/transition.scss

@@ -0,0 +1,48 @@
+// global transition css
+
+/* fade */
+.fade-enter-active,
+.fade-leave-active {
+  transition: opacity 0.28s;
+}
+
+.fade-enter,
+.fade-leave-active {
+  opacity: 0;
+}
+
+/* fade-transform */
+.fade-transform-leave-active,
+.fade-transform-enter-active {
+  transition: all .5s;
+}
+
+.fade-transform-enter {
+  opacity: 0;
+  transform: translateX(-30px);
+}
+
+.fade-transform-leave-to {
+  opacity: 0;
+  transform: translateX(30px);
+}
+
+/* breadcrumb transition */
+.breadcrumb-enter-active,
+.breadcrumb-leave-active {
+  transition: all .5s;
+}
+
+.breadcrumb-enter,
+.breadcrumb-leave-active {
+  opacity: 0;
+  transform: translateX(20px);
+}
+
+.breadcrumb-move {
+  transition: all .5s;
+}
+
+.breadcrumb-leave-active {
+  position: absolute;
+}

+ 6 - 0
fw-sample-portal/src/assets/style/variables.scss

@@ -0,0 +1,6 @@
+// 此文件中定义的都是全局常量
+
+// theme color
+//$themeColor: #2842C8;
+$themeColor: #409EFF;
+$sub-theme-color: #3D68DD;

+ 13 - 0
fw-sample-portal/src/common/directive/permission/index.js

@@ -0,0 +1,13 @@
+import permission from './permission'
+
+const install = function (Vue) {
+  Vue.directive('has', permission)
+}
+
+if (window.Vue) {
+  window.permission = permission
+  Vue.use(install) // eslint-disable-line
+}
+
+permission.install = install
+export default permission

+ 21 - 0
fw-sample-portal/src/common/directive/permission/permission.js

@@ -0,0 +1,21 @@
+export default {
+  inserted (el, binding, vnode) {
+    const { value } = binding
+    const permission = vnode.context.$store.state.user.permission
+    if (value) {
+      if (value instanceof Array) {
+        let check = value.every(v => !permission.includes(v))
+        if (check) {
+          el.parentNode && el.parentNode.removeChild(el)
+        }
+      } else {
+        if (!permission.includes(value)) {
+          // console.log('not included-------', value)
+          el.parentNode && el.parentNode.removeChild(el)
+        }
+      }
+    } else {
+      throw new Error(`need permission! Like v-has="'admin'"`)
+    }
+  }
+}

+ 77 - 0
fw-sample-portal/src/common/mixin/index.js

@@ -0,0 +1,77 @@
+/**
+ * 页面公用的组件,定义在这个 mixin 中,组件中导入,减少导入代码的编写
+ */
+
+import Pagination from '@/components/Pagination'
+
+export const PageCommonComponent = {
+  components: {
+    'c-pagination': Pagination
+  },
+  data () {
+    return {
+      isSearch: false,
+      isLoading: false, // 是否正在加载数据
+      totalCount: 0, // 数据总条数
+      pageNo: 1, // 当前显示的页码
+      pageSize: 10, // 每页显示条数
+    }
+  },
+  methods: {
+    // 时间格式化
+    parseTime (time, cFormat) {
+      if (arguments.length === 0) {
+        return null
+      }
+      const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
+      let date
+      if (typeof time === 'object') {
+        date = time
+      } else {
+        if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
+          time = parseInt(time)
+        }
+        if ((typeof time === 'number') && (time.toString().length === 10)) {
+          time = time * 1000
+        }
+        date = new Date(time)
+      }
+      const formatObj = {
+        y: date.getFullYear(),
+        m: date.getMonth() + 1,
+        d: date.getDate(),
+        h: date.getHours(),
+        i: date.getMinutes(),
+        s: date.getSeconds(),
+        a: date.getDay()
+      }
+      const timeStr = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
+        let value = formatObj[key]
+        if (key === 'a') {
+          return ['一', '二', '三', '四', '五', '六', '日'][value - 1]
+        }
+        if (result.length > 0 && value < 10) {
+          value = '0' + value
+        }
+        return value || 0
+      })
+      return timeStr
+    },
+
+    // 搜索
+    onClickSearch () {
+      if (this.pageNo === 1) {
+        this._loadData()
+      } else {
+        this.pageNo = 1
+      }
+    },
+
+    // utc时间格式修改
+    _getFormatTime (time) {
+      var d = new Date(time)
+      var times = d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate() + ' ' + d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds()
+      return times
+    }
+  }
+}

+ 92 - 0
fw-sample-portal/src/common/plugins/index.js

@@ -0,0 +1,92 @@
+/**
+ * 全局插件,包括一些方法、组件等
+ */
+
+import DataEmpty from '@/components/DataEmpty'
+import Icon from "@/components/Icon";
+
+const GlobalPlugin = {
+  install (Vue, options) {
+    /**
+     * message 成功提示
+     * @param message 信息内容
+     * @param duration 显示时间,默认 2000 毫秒,0 为一直显示
+     * @param showClose 是否显示关闭按钮,默认不显示
+     * @param offset 距离窗口顶部的距离
+     */
+    Vue.prototype.$SuccessMessage = function (message = '', duration = 2000, showClose = false, offset = 200, dangerouslyUseHTMLString = true) {
+      let finalOpt = {
+        dangerouslyUseHTMLString: dangerouslyUseHTMLString,
+        message: message,
+        duration: duration,
+        type: 'success',
+        showClose: showClose,
+        offset: offset
+      }
+      Vue.prototype.$message(finalOpt)
+    }
+
+    /**
+     * message 错误提示
+     * @param message 信息内容
+     * @param duration 显示时间,默认 3000 毫秒,0 为一直显示
+     * @param showClose 是否显示关闭按钮,默认不显示
+     * @param offset 距离窗口顶部的距离
+     */
+    Vue.prototype.$ErrorMessage = function (message = '', duration = 3000, showClose = false, offset = 200, dangerouslyUseHTMLString = true) {
+      let finalOpt = {
+        dangerouslyUseHTMLString: dangerouslyUseHTMLString,
+        message: message,
+        duration: duration,
+        type: 'error',
+        showClose: showClose,
+        offset: offset
+      }
+      Vue.prototype.$message(finalOpt)
+    }
+
+    /**
+     * message 警告提示
+     * @param message 信息内容
+     * @param duration 显示时间,默认 3000 毫秒,0 为一直显示
+     * @param showClose 是否显示关闭按钮,默认不显示
+     * @param offset 距离窗口顶部的距离
+     */
+    Vue.prototype.$WarningMessage = function (message = '', duration = 3000, showClose = false, offset = 200, dangerouslyUseHTMLString = true) {
+      let finalOpt = {
+        dangerouslyUseHTMLString: dangerouslyUseHTMLString,
+        message: message,
+        duration: duration,
+        type: 'warning',
+        showClose: showClose,
+        offset: offset
+      }
+      Vue.prototype.$message(finalOpt)
+    }
+
+    /**
+     * message 信息提示
+     * @param message 信息内容
+     * @param duration 显示时间,默认 2000 毫秒,0 为一直显示
+     * @param showClose 是否显示关闭按钮,默认不显示
+     * @param offset 距离窗口顶部的距离
+     */
+    Vue.prototype.$InfoMessage = function (message = '', duration = 2000, showClose = false, offset = 200, dangerouslyUseHTMLString = true) {
+      let finalOpt = {
+        dangerouslyUseHTMLString: dangerouslyUseHTMLString,
+        message: message,
+        duration: duration,
+        type: 'info',
+        showClose: showClose,
+        offset: offset
+      }
+      Vue.prototype.$message(finalOpt)
+    }
+
+    /* --------------------------- 全局组件 --------------------------- */
+    Vue.component('c-data-empty', DataEmpty)
+    Vue.component('c-icon', Icon)
+  }
+}
+
+export default GlobalPlugin

+ 8 - 0
fw-sample-portal/src/common/utils/auth-node.js

@@ -0,0 +1,8 @@
+/**
+ * 各模块权限节点配置文件
+ */
+module.exports = {
+  novelManage: {
+    
+  }
+}

+ 9 - 0
fw-sample-portal/src/common/utils/constant.js

@@ -0,0 +1,9 @@
+export const ProductTypeList = [{label: 'VIP', value: 1},{label: '阅读劵', value: 2},
+    {label: 'VIP券', value: 3},{label: '书币', value: 4}]
+
+export  const ProductTypeMapping = {
+    "1": "VIP",
+    "2": "阅读劵",
+    "3": "VIP券",
+    "4": "书币",
+}

+ 20 - 0
fw-sample-portal/src/common/utils/has-permission.js

@@ -0,0 +1,20 @@
+import store from '@/store'
+
+/**
+ * @description 全局函数,table列权限无法使用v-has指令显示隐藏,只能通过v-if条件判断显示隐藏
+ * @param value
+ * @returns {boolean}
+ */
+export function hasPerm (value) {
+  const permission = store.state.user.permission
+  if (value) {
+    if (value instanceof Array) {
+      let check = value.every(v => !permission.includes(v))
+      return !check
+    } else {
+      return permission.includes(value)
+    }
+  } else {
+    return true
+  }
+}

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است