baolei před 1 měsícem
rodič
revize
8c651f8e70
79 změnil soubory, kde provedl 6301 přidání a 1882 odebrání
  1. 2 1
      .gitignore
  2. 0 76
      README.md
  3. 21 0
      pom.xml
  4. 3 11
      src/main/java/com/hzy/RuoYiApplication.java
  5. 30 0
      src/main/java/com/hzy/common/enums/EDelFlag.java
  6. 59 0
      src/main/java/com/hzy/common/utils/AliUtils.java
  7. 28 0
      src/main/java/com/hzy/common/utils/EvalUtil.java
  8. 68 0
      src/main/java/com/hzy/common/utils/RMBUtil.java
  9. 24 0
      src/main/java/com/hzy/framework/config/OssConfig.java
  10. 31 3
      src/main/java/com/hzy/framework/web/domain/BaseEntity.java
  11. 128 0
      src/main/java/com/hzy/project/business/balance/controller/UserBalanceController.java
  12. 54 0
      src/main/java/com/hzy/project/business/balance/domain/UserBalance.java
  13. 61 0
      src/main/java/com/hzy/project/business/balance/mapper/UserBalanceMapper.java
  14. 61 0
      src/main/java/com/hzy/project/business/balance/service/IUserBalanceService.java
  15. 97 0
      src/main/java/com/hzy/project/business/balance/service/impl/UserBalanceServiceImpl.java
  16. 133 0
      src/main/java/com/hzy/project/business/customer/controller/CustomerController.java
  17. 32 0
      src/main/java/com/hzy/project/business/customer/domain/Customer.java
  18. 61 0
      src/main/java/com/hzy/project/business/customer/mapper/CustomerMapper.java
  19. 62 0
      src/main/java/com/hzy/project/business/customer/service/ICustomerService.java
  20. 124 0
      src/main/java/com/hzy/project/business/customer/service/impl/CustomerServiceImpl.java
  21. 128 0
      src/main/java/com/hzy/project/business/income/controller/IncomeController.java
  22. 60 0
      src/main/java/com/hzy/project/business/income/domain/Income.java
  23. 61 0
      src/main/java/com/hzy/project/business/income/mapper/IncomeMapper.java
  24. 61 0
      src/main/java/com/hzy/project/business/income/service/IIncomeService.java
  25. 97 0
      src/main/java/com/hzy/project/business/income/service/impl/IncomeServiceImpl.java
  26. 128 0
      src/main/java/com/hzy/project/business/invoice/controller/InvoiceController.java
  27. 65 0
      src/main/java/com/hzy/project/business/invoice/domain/Invoice.java
  28. 61 0
      src/main/java/com/hzy/project/business/invoice/mapper/InvoiceMapper.java
  29. 61 0
      src/main/java/com/hzy/project/business/invoice/service/IInvoiceService.java
  30. 97 0
      src/main/java/com/hzy/project/business/invoice/service/impl/InvoiceServiceImpl.java
  31. 128 0
      src/main/java/com/hzy/project/business/payment/controller/PaymentController.java
  32. 49 0
      src/main/java/com/hzy/project/business/payment/domain/Payment.java
  33. 61 0
      src/main/java/com/hzy/project/business/payment/mapper/PaymentMapper.java
  34. 61 0
      src/main/java/com/hzy/project/business/payment/service/IPaymentService.java
  35. 97 0
      src/main/java/com/hzy/project/business/payment/service/impl/PaymentServiceImpl.java
  36. 128 0
      src/main/java/com/hzy/project/business/salary/controller/SalaryController.java
  37. 48 0
      src/main/java/com/hzy/project/business/salary/domain/Salary.java
  38. 46 0
      src/main/java/com/hzy/project/business/salary/domain/SalaryDetail.java
  39. 87 0
      src/main/java/com/hzy/project/business/salary/mapper/SalaryMapper.java
  40. 61 0
      src/main/java/com/hzy/project/business/salary/service/ISalaryService.java
  41. 135 0
      src/main/java/com/hzy/project/business/salary/service/impl/SalaryServiceImpl.java
  42. 152 0
      src/main/java/com/hzy/project/business/subject/controller/SalarySubjectController.java
  43. 54 0
      src/main/java/com/hzy/project/business/subject/domain/SalarySubject.java
  44. 61 0
      src/main/java/com/hzy/project/business/subject/mapper/SalarySubjectMapper.java
  45. 64 0
      src/main/java/com/hzy/project/business/subject/service/ISalarySubjectService.java
  46. 150 0
      src/main/java/com/hzy/project/business/subject/service/impl/SalarySubjectServiceImpl.java
  47. 11 3
      src/main/resources/application-druid.yml
  48. 5 5
      src/main/resources/application.yml
  49. 78 0
      src/main/resources/mybatis/business/CustomerMapper.xml
  50. 111 0
      src/main/resources/mybatis/business/IncomeMapper.xml
  51. 116 0
      src/main/resources/mybatis/business/InvoiceMapper.xml
  52. 97 0
      src/main/resources/mybatis/business/PaymentMapper.xml
  53. 132 0
      src/main/resources/mybatis/business/SalaryMapper.xml
  54. 102 0
      src/main/resources/mybatis/business/SalarySubjectMapper.xml
  55. 102 0
      src/main/resources/mybatis/business/UserBalanceMapper.xml
  56. 65 0
      src/main/resources/templates/business/balance/add.html
  57. 122 0
      src/main/resources/templates/business/balance/balance.html
  58. 66 0
      src/main/resources/templates/business/balance/edit.html
  59. 33 0
      src/main/resources/templates/business/customer/add.html
  60. 86 0
      src/main/resources/templates/business/customer/customer.html
  61. 34 0
      src/main/resources/templates/business/customer/edit.html
  62. 102 0
      src/main/resources/templates/business/income/add.html
  63. 103 0
      src/main/resources/templates/business/income/edit.html
  64. 145 0
      src/main/resources/templates/business/income/income.html
  65. 137 0
      src/main/resources/templates/business/invoice/add.html
  66. 144 0
      src/main/resources/templates/business/invoice/edit.html
  67. 158 0
      src/main/resources/templates/business/invoice/invoice.html
  68. 76 0
      src/main/resources/templates/business/payment/add.html
  69. 77 0
      src/main/resources/templates/business/payment/edit.html
  70. 118 0
      src/main/resources/templates/business/payment/payment.html
  71. 191 0
      src/main/resources/templates/business/salary/add.html
  72. 201 0
      src/main/resources/templates/business/salary/edit.html
  73. 100 0
      src/main/resources/templates/business/salary/salary.html
  74. 71 0
      src/main/resources/templates/business/subject/add.html
  75. 72 0
      src/main/resources/templates/business/subject/edit.html
  76. 162 0
      src/main/resources/templates/business/subject/subject.html
  77. 1 1
      src/main/resources/templates/index.html
  78. 2 2
      src/main/resources/templates/login.html
  79. 1 1780
      src/main/resources/templates/main.html

+ 2 - 1
.gitignore

@@ -43,4 +43,5 @@ nbdist/
 
 !*/build/*.java
 !*/build/*.html
-!*/build/*.xml
+!*/build/*.xml
+/bin/

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 76
README.md


+ 21 - 0
pom.xml

@@ -36,10 +36,13 @@
         <swagger.version>3.0.0</swagger.version>
         <poi.version>4.1.2</poi.version>
         <oshi.version>6.8.3</oshi.version>
+        <lombok.version>1.18.26</lombok.version>
         <!-- override dependency version -->
         <tomcat.version>9.0.108</tomcat.version>
         <logback.version>1.2.13</logback.version>
         <spring-framework.version>5.3.39</spring-framework.version>
+        <oss-client.version>3.17.4</oss-client.version>
+        <ocrapi.version>3.0.4</ocrapi.version>
     </properties>
 
     <dependencies>
@@ -235,6 +238,24 @@
             <version>${poi.version}</version>
         </dependency>
 
+        <!-- lombok -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>${lombok.version}</version>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>alibabacloud-ocr_api20210707</artifactId>
+            <version>${ocrapi.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-jexl</artifactId>
+            <version>2.1.1</version> <!-- 稳定版,Java8 兼容 -->
+        </dependency>
     </dependencies>
 
     <build>

+ 3 - 11
src/main/java/com/hzy/RuoYiApplication.java

@@ -14,17 +14,9 @@ public class RuoYiApplication
 {
     public static void main(String[] args)
     {
-        // System.setProperty("spring.devtools.restart.enabled", "false");
+
+
         SpringApplication.run(RuoYiApplication.class, args);
-        System.out.println("(♥◠‿◠)ノ゙  若依启动成功   ლ(´ڡ`ლ)゙  \n" +
-                " .-------.       ____     __        \n" +
-                " |  _ _   \\      \\   \\   /  /    \n" +
-                " | ( ' )  |       \\  _. /  '       \n" +
-                " |(_ o _) /        _( )_ .'         \n" +
-                " | (_,_).' __  ___(_ o _)'          \n" +
-                " |  |\\ \\  |  ||   |(_,_)'         \n" +
-                " |  | \\ `'   /|   `-'  /           \n" +
-                " |  |  \\    /  \\      /           \n" +
-                " ''-'   `'-'    `-..-'              ");
+
     }
 }

+ 30 - 0
src/main/java/com/hzy/common/enums/EDelFlag.java

@@ -0,0 +1,30 @@
+package com.hzy.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @program: gululuq
+ * @description: 删除标志
+ * @author: 金
+ * @create: 2025-03-16
+ */
+@AllArgsConstructor
+@Getter
+public enum EDelFlag {
+    YES("1", "已删除"),
+    NO("0", "未删除");
+
+    private String val;
+    private String desc;
+
+    // 解析
+    public static EDelFlag parseByVal(String val) {
+        for (EDelFlag type : EDelFlag.values()) {
+            if (type.getVal().equalsIgnoreCase(val)) {
+                return type;
+            }
+        }
+        return EDelFlag.NO;
+    }
+}

+ 59 - 0
src/main/java/com/hzy/common/utils/AliUtils.java

@@ -0,0 +1,59 @@
+package com.hzy.common.utils;
+
+import com.aliyun.auth.credentials.provider.DefaultCredentialProvider;
+import com.aliyun.sdk.service.ocr_api20210707.AsyncClient;
+import com.aliyun.sdk.service.ocr_api20210707.models.RecognizeInvoiceRequest;
+import com.aliyun.sdk.service.ocr_api20210707.models.RecognizeInvoiceResponse;
+import com.google.gson.Gson;
+import darabonba.core.client.ClientOverrideConfiguration;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+
+public class AliUtils {
+
+    public static RecognizeInvoiceResponse RecognizeInvoice(RecognizeInvoiceRequest recognizeInvoiceRequest) throws ExecutionException, InterruptedException {
+
+        // Configure Credentials authentication information
+        DefaultCredentialProvider provider = DefaultCredentialProvider.builder().build();
+
+        // Configure the Client
+        AsyncClient client = AsyncClient.builder()
+                .region("cn-hangzhou") // Region ID
+                //.httpClient(httpClient) // Use the configured HttpClient, otherwise use the default HttpClient (Apache HttpClient)
+                .credentialsProvider(provider)
+                //.serviceConfiguration(Configuration.create()) // Service-level configuration
+                // Client-level configuration rewrite, can set Endpoint, Http request parameters, etc.
+                .overrideConfiguration(
+                        ClientOverrideConfiguration.create()
+                                // Endpoint 请参考 https://api.aliyun.com/product/ocr-api
+                                .setEndpointOverride("ocr-api.cn-hangzhou.aliyuncs.com")
+                        //.setConnectTimeout(Duration.ofSeconds(30))
+                )
+                .build();
+
+        // Parameter settings for API request
+//        RecognizeInvoiceRequest recognizeInvoiceRequest = RecognizeInvoiceRequest.builder()
+//                // Request-level configuration rewrite, can set Http request parameters, etc.
+//                // .requestConfiguration(RequestConfiguration.create().setHttpHeaders(new HttpHeaders()))
+//                .build();
+
+        // Asynchronously get the return value of the API request
+        CompletableFuture<RecognizeInvoiceResponse> response = client.recognizeInvoice(recognizeInvoiceRequest);
+        // Synchronously get the return value of the API request
+        RecognizeInvoiceResponse resp = response.get();
+        System.out.println(new Gson().toJson(resp));
+        client.close();
+
+        return resp;
+        // Asynchronous processing of return values
+        /*response.thenAccept(resp -> {
+            System.out.println(new Gson().toJson(resp));
+        }).exceptionally(throwable -> { // Handling exceptions
+            System.out.println(throwable.getMessage());
+            return null;
+        });*/
+
+        // Finally, close the client
+    }
+}

+ 28 - 0
src/main/java/com/hzy/common/utils/EvalUtil.java

@@ -0,0 +1,28 @@
+package com.hzy.common.utils;
+
+import org.apache.commons.jexl2.Expression;
+import org.apache.commons.jexl2.JexlContext;
+import org.apache.commons.jexl2.JexlEngine;
+import org.apache.commons.jexl2.MapContext;
+
+import java.math.BigDecimal;
+
+public final class EvalUtil {
+
+    public static BigDecimal evalFormula(String formula,BigDecimal base) {
+
+        // 1. 初始化引擎
+        JexlEngine jexl = new JexlEngine();
+        // 3. 编译表达式
+        Expression jexlExpr = jexl.createExpression(formula);
+        // 4. 绑定变量
+        JexlContext context = new MapContext();
+        context.set("base", base);
+        // 5. 执行计算
+        Object result = jexlExpr.evaluate(context);
+        System.out.println("结果:" + result); // 输出 ~10.8584
+
+        return new BigDecimal((String) result);
+    }
+
+}

+ 68 - 0
src/main/java/com/hzy/common/utils/RMBUtil.java

@@ -0,0 +1,68 @@
+package com.hzy.common.utils;
+
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.util.Locale;
+
+public final class RMBUtil {
+
+    static final BigDecimal BASE = new BigDecimal("100");
+    static final NumberFormat FORMAT = NumberFormat.getCurrencyInstance(Locale.CHINA);
+
+    private RMBUtil() {
+        throw new RuntimeException("工具类");
+    }
+
+    public static BigDecimal yuanToFen(BigDecimal yuan) {
+        if (yuan == null) {
+            return null;
+        } else {
+            return yuan.multiply(BASE);
+        }
+    }
+
+    public static BigDecimal fenToYuan(BigDecimal fen) {
+        return fenToYuan(fen, 2);
+    }
+
+    public static BigDecimal fenToYuan(BigDecimal fen, int scale) {
+        if (fen == null) {
+            return null;
+        } else {
+            return fen.divide(BASE, scale, BigDecimal.ROUND_HALF_UP);
+        }
+    }
+
+    /**
+     * 人民币格式化
+     * @param amount 原金额
+     * @param digits 几位小数
+     * @return
+     */
+    public static String format(BigDecimal amount, int digits){
+        FORMAT.setMinimumFractionDigits(digits);
+        return FORMAT.format(amount);
+    }
+
+    public static String formatComma(BigDecimal amount) {
+        DecimalFormat df = new DecimalFormat("#,##0.00");
+        return df.format(amount);
+    }
+//
+//    public static void main(String[] args) {
+//        System.out.println(formatComma(new BigDecimal("1123344.789")));
+//        System.out.println(formatComma(new BigDecimal("0.789")));
+//        System.out.println(format(new BigDecimal("123344.45"), 0));
+//        System.out.println(format(new BigDecimal("123344.00"), 0));
+//        System.out.println(format(new BigDecimal("123344"), 0));
+//
+////        ¥123,344.99
+////        ¥123,344.45
+////        ¥123,344
+////        ¥123,344
+//
+//
+//    }
+
+}

+ 24 - 0
src/main/java/com/hzy/framework/config/OssConfig.java

@@ -0,0 +1,24 @@
+package com.hzy.framework.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * 读取项目相关配置
+ * 
+ * @author ruoyi
+ */
+@Component
+@ConfigurationProperties(prefix = "aliyun.oss")
+@Data
+public class OssConfig
+{
+
+    private String endPoint;
+    private String accessKeyId;
+    private String accessKeySecret;
+    private String bucketName;
+    private String customDomain;
+
+}

+ 31 - 3
src/main/java/com/hzy/framework/web/domain/BaseEntity.java

@@ -1,12 +1,14 @@
 package com.hzy.framework.web.domain;
 
 import java.io.Serializable;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
+
+import com.alibaba.fastjson.JSON;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.hzy.common.utils.text.Convert;
+import org.apache.commons.compress.utils.Lists;
 
 /**
  * Entity基类
@@ -115,4 +117,30 @@ public class BaseEntity implements Serializable
     {
         this.params = params;
     }
+
+    /**
+     * 只接受分号分隔和JSON数据
+     * @param name
+     * @param tClass
+     * @param <T>
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public <T> List<T> getPramsByName(String name, Class<T> tClass){
+        List<T> list = Lists.newArrayList();
+        if (getParams().containsKey(name)) {
+            Object obj = getParams().get(name);
+            if (obj != null) {
+                try {
+                    list = JSON.parseArray((String) obj, tClass);
+                } catch (Exception ex) {
+                    String str = (String) obj;
+                    if(!str.isEmpty()) {
+                        list = (List<T>) Arrays.asList(Convert.toStrArray((String) obj));
+                    }
+                }
+            }
+        }
+        return list;
+    }
 }

+ 128 - 0
src/main/java/com/hzy/project/business/balance/controller/UserBalanceController.java

@@ -0,0 +1,128 @@
+package com.hzy.project.business.balance.controller;
+
+import java.util.List;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.hzy.framework.aspectj.lang.annotation.Log;
+import com.hzy.framework.aspectj.lang.enums.BusinessType;
+import com.hzy.project.business.balance.domain.UserBalance;
+import com.hzy.project.business.balance.service.IUserBalanceService;
+import com.hzy.framework.web.controller.BaseController;
+import com.hzy.framework.web.domain.AjaxResult;
+import com.hzy.common.utils.poi.ExcelUtil;
+import com.hzy.framework.web.page.TableDataInfo;
+
+/**
+ * 用户结余Controller
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@Controller
+@RequestMapping("/business/balance")
+public class UserBalanceController extends BaseController
+{
+    private String prefix = "business/balance";
+
+    @Autowired
+    private IUserBalanceService userBalanceService;
+
+    @RequiresPermissions("business:balance:view")
+    @GetMapping()
+    public String balance()
+    {
+        return prefix + "/balance";
+    }
+
+    /**
+     * 查询用户结余列表
+     */
+    @RequiresPermissions("business:balance:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(UserBalance userBalance)
+    {
+        startPage();
+        List<UserBalance> list = userBalanceService.selectUserBalanceList(userBalance);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出用户结余列表
+     */
+    @RequiresPermissions("business:balance:export")
+    @Log(title = "用户结余", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(UserBalance userBalance)
+    {
+        List<UserBalance> list = userBalanceService.selectUserBalanceList(userBalance);
+        ExcelUtil<UserBalance> util = new ExcelUtil<UserBalance>(UserBalance.class);
+        return util.exportExcel(list, "用户结余数据");
+    }
+
+    /**
+     * 新增用户结余
+     */
+    @RequiresPermissions("business:balance:add")
+    @GetMapping("/add")
+    public String add()
+    {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存用户结余
+     */
+    @RequiresPermissions("business:balance:add")
+    @Log(title = "用户结余", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(UserBalance userBalance)
+    {
+        return toAjax(userBalanceService.insertUserBalance(userBalance));
+    }
+
+    /**
+     * 修改用户结余
+     */
+    @RequiresPermissions("business:balance:edit")
+    @GetMapping("/edit/{balanceId}")
+    public String edit(@PathVariable("balanceId") Long balanceId, ModelMap mmap)
+    {
+        UserBalance userBalance = userBalanceService.selectUserBalanceByBalanceId(balanceId);
+        mmap.put("userBalance", userBalance);
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存用户结余
+     */
+    @RequiresPermissions("business:balance:edit")
+    @Log(title = "用户结余", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(UserBalance userBalance)
+    {
+        return toAjax(userBalanceService.updateUserBalance(userBalance));
+    }
+
+    /**
+     * 删除用户结余
+     */
+    @RequiresPermissions("business:balance:remove")
+    @Log(title = "用户结余", businessType = BusinessType.DELETE)
+    @PostMapping( "/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        return toAjax(userBalanceService.deleteUserBalanceByBalanceIds(ids));
+    }
+}

+ 54 - 0
src/main/java/com/hzy/project/business/balance/domain/UserBalance.java

@@ -0,0 +1,54 @@
+package com.hzy.project.business.balance.domain;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.hzy.framework.aspectj.lang.annotation.Excel;
+import com.hzy.framework.web.domain.BaseEntity;
+
+import java.math.BigDecimal;
+
+/**
+ * 用户结余对象 m_user_balance
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class UserBalance extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long balanceId;
+
+    /** 用户ID */
+    @Excel(name = "用户ID")
+    private Long userId;
+
+    /** 结余周期 */
+    @Excel(name = "结余周期")
+    private String duration;
+
+    /** 期初数 */
+    @Excel(name = "期初数")
+    private BigDecimal openingBalance;
+
+    /** 收入 */
+    @Excel(name = "收入")
+    private BigDecimal income;
+
+    /** 支出 */
+    @Excel(name = "支出")
+    private BigDecimal payment;
+
+    /** 期末数 */
+    @Excel(name = "期末数")
+    private BigDecimal closingBalance;
+
+    /** 删除标志 */
+    private String delFlag;
+
+}

+ 61 - 0
src/main/java/com/hzy/project/business/balance/mapper/UserBalanceMapper.java

@@ -0,0 +1,61 @@
+package com.hzy.project.business.balance.mapper;
+
+import java.util.List;
+import com.hzy.project.business.balance.domain.UserBalance;
+
+/**
+ * 用户结余Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+public interface UserBalanceMapper 
+{
+    /**
+     * 查询用户结余
+     * 
+     * @param balanceId 用户结余主键
+     * @return 用户结余
+     */
+    public UserBalance selectUserBalanceByBalanceId(Long balanceId);
+
+    /**
+     * 查询用户结余列表
+     * 
+     * @param userBalance 用户结余
+     * @return 用户结余集合
+     */
+    public List<UserBalance> selectUserBalanceList(UserBalance userBalance);
+
+    /**
+     * 新增用户结余
+     * 
+     * @param userBalance 用户结余
+     * @return 结果
+     */
+    public int insertUserBalance(UserBalance userBalance);
+
+    /**
+     * 修改用户结余
+     * 
+     * @param userBalance 用户结余
+     * @return 结果
+     */
+    public int updateUserBalance(UserBalance userBalance);
+
+    /**
+     * 删除用户结余
+     * 
+     * @param balanceId 用户结余主键
+     * @return 结果
+     */
+    public int deleteUserBalanceByBalanceId(Long balanceId);
+
+    /**
+     * 批量删除用户结余
+     * 
+     * @param balanceIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteUserBalanceByBalanceIds(String[] balanceIds);
+}

+ 61 - 0
src/main/java/com/hzy/project/business/balance/service/IUserBalanceService.java

@@ -0,0 +1,61 @@
+package com.hzy.project.business.balance.service;
+
+import java.util.List;
+import com.hzy.project.business.balance.domain.UserBalance;
+
+/**
+ * 用户结余Service接口
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+public interface IUserBalanceService 
+{
+    /**
+     * 查询用户结余
+     * 
+     * @param balanceId 用户结余主键
+     * @return 用户结余
+     */
+    public UserBalance selectUserBalanceByBalanceId(Long balanceId);
+
+    /**
+     * 查询用户结余列表
+     * 
+     * @param userBalance 用户结余
+     * @return 用户结余集合
+     */
+    public List<UserBalance> selectUserBalanceList(UserBalance userBalance);
+
+    /**
+     * 新增用户结余
+     * 
+     * @param userBalance 用户结余
+     * @return 结果
+     */
+    public int insertUserBalance(UserBalance userBalance);
+
+    /**
+     * 修改用户结余
+     * 
+     * @param userBalance 用户结余
+     * @return 结果
+     */
+    public int updateUserBalance(UserBalance userBalance);
+
+    /**
+     * 批量删除用户结余
+     * 
+     * @param balanceIds 需要删除的用户结余主键集合
+     * @return 结果
+     */
+    public int deleteUserBalanceByBalanceIds(String balanceIds);
+
+    /**
+     * 删除用户结余信息
+     * 
+     * @param balanceId 用户结余主键
+     * @return 结果
+     */
+    public int deleteUserBalanceByBalanceId(Long balanceId);
+}

+ 97 - 0
src/main/java/com/hzy/project/business/balance/service/impl/UserBalanceServiceImpl.java

@@ -0,0 +1,97 @@
+package com.hzy.project.business.balance.service.impl;
+
+import java.util.List;
+import com.hzy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.hzy.project.business.balance.mapper.UserBalanceMapper;
+import com.hzy.project.business.balance.domain.UserBalance;
+import com.hzy.project.business.balance.service.IUserBalanceService;
+import com.hzy.common.utils.text.Convert;
+
+/**
+ * 用户结余Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@Service
+public class UserBalanceServiceImpl implements IUserBalanceService 
+{
+    @Autowired
+    private UserBalanceMapper userBalanceMapper;
+
+    /**
+     * 查询用户结余
+     * 
+     * @param balanceId 用户结余主键
+     * @return 用户结余
+     */
+    @Override
+    public UserBalance selectUserBalanceByBalanceId(Long balanceId)
+    {
+        return userBalanceMapper.selectUserBalanceByBalanceId(balanceId);
+    }
+
+    /**
+     * 查询用户结余列表
+     * 
+     * @param userBalance 用户结余
+     * @return 用户结余
+     */
+    @Override
+    public List<UserBalance> selectUserBalanceList(UserBalance userBalance)
+    {
+        return userBalanceMapper.selectUserBalanceList(userBalance);
+    }
+
+    /**
+     * 新增用户结余
+     * 
+     * @param userBalance 用户结余
+     * @return 结果
+     */
+    @Override
+    public int insertUserBalance(UserBalance userBalance)
+    {
+        userBalance.setCreateTime(DateUtils.getNowDate());
+        return userBalanceMapper.insertUserBalance(userBalance);
+    }
+
+    /**
+     * 修改用户结余
+     * 
+     * @param userBalance 用户结余
+     * @return 结果
+     */
+    @Override
+    public int updateUserBalance(UserBalance userBalance)
+    {
+        userBalance.setUpdateTime(DateUtils.getNowDate());
+        return userBalanceMapper.updateUserBalance(userBalance);
+    }
+
+    /**
+     * 批量删除用户结余
+     * 
+     * @param balanceIds 需要删除的用户结余主键
+     * @return 结果
+     */
+    @Override
+    public int deleteUserBalanceByBalanceIds(String balanceIds)
+    {
+        return userBalanceMapper.deleteUserBalanceByBalanceIds(Convert.toStrArray(balanceIds));
+    }
+
+    /**
+     * 删除用户结余信息
+     * 
+     * @param balanceId 用户结余主键
+     * @return 结果
+     */
+    @Override
+    public int deleteUserBalanceByBalanceId(Long balanceId)
+    {
+        return userBalanceMapper.deleteUserBalanceByBalanceId(balanceId);
+    }
+}

+ 133 - 0
src/main/java/com/hzy/project/business/customer/controller/CustomerController.java

@@ -0,0 +1,133 @@
+package com.hzy.project.business.customer.controller;
+
+import java.util.List;
+
+import com.hzy.common.enums.EDelFlag;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.hzy.framework.aspectj.lang.annotation.Log;
+import com.hzy.framework.aspectj.lang.enums.BusinessType;
+import com.hzy.project.business.customer.domain.Customer;
+import com.hzy.project.business.customer.service.ICustomerService;
+import com.hzy.framework.web.controller.BaseController;
+import com.hzy.framework.web.domain.AjaxResult;
+import com.hzy.common.utils.poi.ExcelUtil;
+import com.hzy.framework.web.page.TableDataInfo;
+
+/**
+ * 客户Controller
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@Controller
+@RequestMapping("/business/customer")
+public class CustomerController extends BaseController
+{
+    private String prefix = "business/customer";
+
+    @Autowired
+    private ICustomerService customerService;
+
+    @RequiresPermissions("business:customer:view")
+    @GetMapping()
+    public String customer()
+    {
+        return prefix + "/customer";
+    }
+
+    /**
+     * 查询客户列表
+     */
+    @RequiresPermissions("business:customer:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(Customer customer)
+    {
+        customer.setDelFlag(EDelFlag.NO.getVal());
+        startPage();
+        List<Customer> list = customerService.selectCustomerList(customer);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出客户列表
+     */
+    @RequiresPermissions("business:customer:export")
+    @Log(title = "客户", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(Customer customer)
+    {
+        customer.setDelFlag(EDelFlag.NO.getVal());
+        List<Customer> list = customerService.selectCustomerList(customer);
+        ExcelUtil<Customer> util = new ExcelUtil<Customer>(Customer.class);
+        return util.exportExcel(list, "客户数据");
+    }
+
+    /**
+     * 新增客户
+     */
+    @RequiresPermissions("business:customer:add")
+    @GetMapping("/add")
+    public String add()
+    {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存客户
+     */
+    @RequiresPermissions("business:customer:add")
+    @Log(title = "客户", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(Customer customer)
+    {
+        customer.setDelFlag(EDelFlag.NO.getVal());
+        return toAjax(customerService.insertCustomer(customer));
+    }
+
+    /**
+     * 修改客户
+     */
+    @RequiresPermissions("business:customer:edit")
+    @GetMapping("/edit/{customerId}")
+    public String edit(@PathVariable("customerId") Long customerId, ModelMap mmap)
+    {
+        Customer customer = customerService.selectCustomerByCustomerId(customerId);
+        mmap.put("customer", customer);
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存客户
+     */
+    @RequiresPermissions("business:customer:edit")
+    @Log(title = "客户", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(Customer customer)
+    {
+        return toAjax(customerService.updateCustomer(customer));
+    }
+
+    /**
+     * 删除客户
+     */
+    @RequiresPermissions("business:customer:remove")
+    @Log(title = "客户", businessType = BusinessType.DELETE)
+    @PostMapping( "/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        return toAjax(customerService.logicDelCustomerByCustomerIds(ids));
+    }
+}

+ 32 - 0
src/main/java/com/hzy/project/business/customer/domain/Customer.java

@@ -0,0 +1,32 @@
+package com.hzy.project.business.customer.domain;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.hzy.framework.aspectj.lang.annotation.Excel;
+import com.hzy.framework.web.domain.BaseEntity;
+
+/**
+ * 客户对象 m_customer
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class Customer extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 客户主键 */
+    private Long customerId;
+
+    /** 客户名 */
+    @Excel(name = "客户名")
+    private String customerName;
+
+    /** 删除标志 */
+    private String delFlag;
+
+}

+ 61 - 0
src/main/java/com/hzy/project/business/customer/mapper/CustomerMapper.java

@@ -0,0 +1,61 @@
+package com.hzy.project.business.customer.mapper;
+
+import java.util.List;
+import com.hzy.project.business.customer.domain.Customer;
+
+/**
+ * 客户Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+public interface CustomerMapper 
+{
+    /**
+     * 查询客户
+     * 
+     * @param customerId 客户主键
+     * @return 客户
+     */
+    public Customer selectCustomerByCustomerId(Long customerId);
+
+    /**
+     * 查询客户列表
+     * 
+     * @param customer 客户
+     * @return 客户集合
+     */
+    public List<Customer> selectCustomerList(Customer customer);
+
+    /**
+     * 新增客户
+     * 
+     * @param customer 客户
+     * @return 结果
+     */
+    public int insertCustomer(Customer customer);
+
+    /**
+     * 修改客户
+     * 
+     * @param customer 客户
+     * @return 结果
+     */
+    public int updateCustomer(Customer customer);
+
+    /**
+     * 删除客户
+     * 
+     * @param customerId 客户主键
+     * @return 结果
+     */
+    public int deleteCustomerByCustomerId(Long customerId);
+
+    /**
+     * 批量删除客户
+     * 
+     * @param customerIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteCustomerByCustomerIds(String[] customerIds);
+}

+ 62 - 0
src/main/java/com/hzy/project/business/customer/service/ICustomerService.java

@@ -0,0 +1,62 @@
+package com.hzy.project.business.customer.service;
+
+import java.util.List;
+import com.hzy.project.business.customer.domain.Customer;
+
+/**
+ * 客户Service接口
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+public interface ICustomerService 
+{
+    /**
+     * 查询客户
+     * 
+     * @param customerId 客户主键
+     * @return 客户
+     */
+    public Customer selectCustomerByCustomerId(Long customerId);
+
+    /**
+     * 查询客户列表
+     * 
+     * @param customer 客户
+     * @return 客户集合
+     */
+    public List<Customer> selectCustomerList(Customer customer);
+
+    /**
+     * 新增客户
+     * 
+     * @param customer 客户
+     * @return 结果
+     */
+    public int insertCustomer(Customer customer);
+
+    /**
+     * 修改客户
+     * 
+     * @param customer 客户
+     * @return 结果
+     */
+    public int updateCustomer(Customer customer);
+
+    /**
+     * 批量删除客户
+     * 
+     * @param customerIds 需要删除的客户主键集合
+     * @return 结果
+     */
+    public int deleteCustomerByCustomerIds(String customerIds);
+    public int logicDelCustomerByCustomerIds(String customerIds);
+
+    /**
+     * 删除客户信息
+     * 
+     * @param customerId 客户主键
+     * @return 结果
+     */
+    public int deleteCustomerByCustomerId(Long customerId);
+}

+ 124 - 0
src/main/java/com/hzy/project/business/customer/service/impl/CustomerServiceImpl.java

@@ -0,0 +1,124 @@
+package com.hzy.project.business.customer.service.impl;
+
+import java.util.List;
+
+import com.hzy.common.enums.EDelFlag;
+import com.hzy.common.utils.DateUtils;
+import com.hzy.common.utils.security.ShiroUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.hzy.project.business.customer.mapper.CustomerMapper;
+import com.hzy.project.business.customer.domain.Customer;
+import com.hzy.project.business.customer.service.ICustomerService;
+import com.hzy.common.utils.text.Convert;
+
+/**
+ * 客户Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@Service
+public class CustomerServiceImpl implements ICustomerService 
+{
+    @Autowired
+    private CustomerMapper customerMapper;
+
+    /**
+     * 查询客户
+     * 
+     * @param customerId 客户主键
+     * @return 客户
+     */
+    @Override
+    public Customer selectCustomerByCustomerId(Long customerId)
+    {
+        return customerMapper.selectCustomerByCustomerId(customerId);
+    }
+
+    /**
+     * 查询客户列表
+     * 
+     * @param customer 客户
+     * @return 客户
+     */
+    @Override
+    public List<Customer> selectCustomerList(Customer customer)
+    {
+        return customerMapper.selectCustomerList(customer);
+    }
+
+    /**
+     * 新增客户
+     * 
+     * @param customer 客户
+     * @return 结果
+     */
+    @Override
+    public int insertCustomer(Customer customer)
+    {
+        customer.setCreateBy(ShiroUtils.getLoginName());
+        customer.setCreateTime(DateUtils.getNowDate());
+        return customerMapper.insertCustomer(customer);
+    }
+
+    /**
+     * 修改客户
+     * 
+     * @param customer 客户
+     * @return 结果
+     */
+    @Override
+    public int updateCustomer(Customer customer)
+    {
+        customer.setUpdateBy(ShiroUtils.getLoginName());
+        customer.setUpdateTime(DateUtils.getNowDate());
+        return customerMapper.updateCustomer(customer);
+    }
+
+    /**
+     * 批量删除客户
+     *
+     * @param customerIds 需要删除的客户主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCustomerByCustomerIds(String customerIds)
+    {
+        return customerMapper.deleteCustomerByCustomerIds(Convert.toStrArray(customerIds));
+    }
+
+    /**
+     * 批量逻辑删除客户
+     *
+     * @param customerIds 需要删除的客户主键
+     * @return 结果
+     */
+    @Override
+    public int logicDelCustomerByCustomerIds(String customerIds)
+    {
+        String[] customerIdList = Convert.toStrArray(customerIds);
+        int rtn = 0;
+        for (String customerId : customerIdList) {
+            Customer customer = new Customer();
+            customer.setCustomerId(Long.valueOf(customerId));
+            customer.setDelFlag(EDelFlag.YES.getVal());
+            customer.setUpdateBy(ShiroUtils.getLoginName());
+            customer.setUpdateTime(DateUtils.getNowDate());
+            rtn += customerMapper.updateCustomer(customer);
+        }
+        return rtn;
+    }
+
+    /**
+     * 删除客户信息
+     * 
+     * @param customerId 客户主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCustomerByCustomerId(Long customerId)
+    {
+        return customerMapper.deleteCustomerByCustomerId(customerId);
+    }
+}

+ 128 - 0
src/main/java/com/hzy/project/business/income/controller/IncomeController.java

@@ -0,0 +1,128 @@
+package com.hzy.project.business.income.controller;
+
+import java.util.List;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.hzy.framework.aspectj.lang.annotation.Log;
+import com.hzy.framework.aspectj.lang.enums.BusinessType;
+import com.hzy.project.business.income.domain.Income;
+import com.hzy.project.business.income.service.IIncomeService;
+import com.hzy.framework.web.controller.BaseController;
+import com.hzy.framework.web.domain.AjaxResult;
+import com.hzy.common.utils.poi.ExcelUtil;
+import com.hzy.framework.web.page.TableDataInfo;
+
+/**
+ * 收入Controller
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@Controller
+@RequestMapping("/business/income")
+public class IncomeController extends BaseController
+{
+    private String prefix = "business/income";
+
+    @Autowired
+    private IIncomeService incomeService;
+
+    @RequiresPermissions("business:income:view")
+    @GetMapping()
+    public String income()
+    {
+        return prefix + "/income";
+    }
+
+    /**
+     * 查询收入列表
+     */
+    @RequiresPermissions("business:income:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(Income income)
+    {
+        startPage();
+        List<Income> list = incomeService.selectIncomeList(income);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出收入列表
+     */
+    @RequiresPermissions("business:income:export")
+    @Log(title = "收入", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(Income income)
+    {
+        List<Income> list = incomeService.selectIncomeList(income);
+        ExcelUtil<Income> util = new ExcelUtil<Income>(Income.class);
+        return util.exportExcel(list, "收入数据");
+    }
+
+    /**
+     * 新增收入
+     */
+    @RequiresPermissions("business:income:add")
+    @GetMapping("/add")
+    public String add()
+    {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存收入
+     */
+    @RequiresPermissions("business:income:add")
+    @Log(title = "收入", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(Income income)
+    {
+        return toAjax(incomeService.insertIncome(income));
+    }
+
+    /**
+     * 修改收入
+     */
+    @RequiresPermissions("business:income:edit")
+    @GetMapping("/edit/{incomeId}")
+    public String edit(@PathVariable("incomeId") Long incomeId, ModelMap mmap)
+    {
+        Income income = incomeService.selectIncomeByIncomeId(incomeId);
+        mmap.put("income", income);
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存收入
+     */
+    @RequiresPermissions("business:income:edit")
+    @Log(title = "收入", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(Income income)
+    {
+        return toAjax(incomeService.updateIncome(income));
+    }
+
+    /**
+     * 删除收入
+     */
+    @RequiresPermissions("business:income:remove")
+    @Log(title = "收入", businessType = BusinessType.DELETE)
+    @PostMapping( "/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        return toAjax(incomeService.deleteIncomeByIncomeIds(ids));
+    }
+}

+ 60 - 0
src/main/java/com/hzy/project/business/income/domain/Income.java

@@ -0,0 +1,60 @@
+package com.hzy.project.business.income.domain;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.hzy.framework.aspectj.lang.annotation.Excel;
+import com.hzy.framework.web.domain.BaseEntity;
+
+/**
+ * 收入对象 t_income
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class Income extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long incomeId;
+
+    /** 客户 */
+    @Excel(name = "客户")
+    private Long customerId;
+
+    /** 收入日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @Excel(name = "收入日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date incomeDate;
+
+    /** 收入类目 */
+    @Excel(name = "收入类目")
+    private String incomeType;
+
+    /** 收入总金额 */
+    @Excel(name = "收入总金额")
+    private BigDecimal grossAmount;
+
+    /** 净收入 */
+    @Excel(name = "净收入")
+    private BigDecimal netAmount;
+
+    /** 税额 */
+    @Excel(name = "税额")
+    private BigDecimal taxAmount;
+
+    /** 税率 */
+    @Excel(name = "税率")
+    private BigDecimal rate;
+
+    /** 删除标志 */
+    private String delFlag;
+
+}

+ 61 - 0
src/main/java/com/hzy/project/business/income/mapper/IncomeMapper.java

@@ -0,0 +1,61 @@
+package com.hzy.project.business.income.mapper;
+
+import java.util.List;
+import com.hzy.project.business.income.domain.Income;
+
+/**
+ * 收入Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+public interface IncomeMapper 
+{
+    /**
+     * 查询收入
+     * 
+     * @param incomeId 收入主键
+     * @return 收入
+     */
+    public Income selectIncomeByIncomeId(Long incomeId);
+
+    /**
+     * 查询收入列表
+     * 
+     * @param income 收入
+     * @return 收入集合
+     */
+    public List<Income> selectIncomeList(Income income);
+
+    /**
+     * 新增收入
+     * 
+     * @param income 收入
+     * @return 结果
+     */
+    public int insertIncome(Income income);
+
+    /**
+     * 修改收入
+     * 
+     * @param income 收入
+     * @return 结果
+     */
+    public int updateIncome(Income income);
+
+    /**
+     * 删除收入
+     * 
+     * @param incomeId 收入主键
+     * @return 结果
+     */
+    public int deleteIncomeByIncomeId(Long incomeId);
+
+    /**
+     * 批量删除收入
+     * 
+     * @param incomeIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteIncomeByIncomeIds(String[] incomeIds);
+}

+ 61 - 0
src/main/java/com/hzy/project/business/income/service/IIncomeService.java

@@ -0,0 +1,61 @@
+package com.hzy.project.business.income.service;
+
+import java.util.List;
+import com.hzy.project.business.income.domain.Income;
+
+/**
+ * 收入Service接口
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+public interface IIncomeService 
+{
+    /**
+     * 查询收入
+     * 
+     * @param incomeId 收入主键
+     * @return 收入
+     */
+    public Income selectIncomeByIncomeId(Long incomeId);
+
+    /**
+     * 查询收入列表
+     * 
+     * @param income 收入
+     * @return 收入集合
+     */
+    public List<Income> selectIncomeList(Income income);
+
+    /**
+     * 新增收入
+     * 
+     * @param income 收入
+     * @return 结果
+     */
+    public int insertIncome(Income income);
+
+    /**
+     * 修改收入
+     * 
+     * @param income 收入
+     * @return 结果
+     */
+    public int updateIncome(Income income);
+
+    /**
+     * 批量删除收入
+     * 
+     * @param incomeIds 需要删除的收入主键集合
+     * @return 结果
+     */
+    public int deleteIncomeByIncomeIds(String incomeIds);
+
+    /**
+     * 删除收入信息
+     * 
+     * @param incomeId 收入主键
+     * @return 结果
+     */
+    public int deleteIncomeByIncomeId(Long incomeId);
+}

+ 97 - 0
src/main/java/com/hzy/project/business/income/service/impl/IncomeServiceImpl.java

@@ -0,0 +1,97 @@
+package com.hzy.project.business.income.service.impl;
+
+import java.util.List;
+import com.hzy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.hzy.project.business.income.mapper.IncomeMapper;
+import com.hzy.project.business.income.domain.Income;
+import com.hzy.project.business.income.service.IIncomeService;
+import com.hzy.common.utils.text.Convert;
+
+/**
+ * 收入Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@Service
+public class IncomeServiceImpl implements IIncomeService 
+{
+    @Autowired
+    private IncomeMapper incomeMapper;
+
+    /**
+     * 查询收入
+     * 
+     * @param incomeId 收入主键
+     * @return 收入
+     */
+    @Override
+    public Income selectIncomeByIncomeId(Long incomeId)
+    {
+        return incomeMapper.selectIncomeByIncomeId(incomeId);
+    }
+
+    /**
+     * 查询收入列表
+     * 
+     * @param income 收入
+     * @return 收入
+     */
+    @Override
+    public List<Income> selectIncomeList(Income income)
+    {
+        return incomeMapper.selectIncomeList(income);
+    }
+
+    /**
+     * 新增收入
+     * 
+     * @param income 收入
+     * @return 结果
+     */
+    @Override
+    public int insertIncome(Income income)
+    {
+        income.setCreateTime(DateUtils.getNowDate());
+        return incomeMapper.insertIncome(income);
+    }
+
+    /**
+     * 修改收入
+     * 
+     * @param income 收入
+     * @return 结果
+     */
+    @Override
+    public int updateIncome(Income income)
+    {
+        income.setUpdateTime(DateUtils.getNowDate());
+        return incomeMapper.updateIncome(income);
+    }
+
+    /**
+     * 批量删除收入
+     * 
+     * @param incomeIds 需要删除的收入主键
+     * @return 结果
+     */
+    @Override
+    public int deleteIncomeByIncomeIds(String incomeIds)
+    {
+        return incomeMapper.deleteIncomeByIncomeIds(Convert.toStrArray(incomeIds));
+    }
+
+    /**
+     * 删除收入信息
+     * 
+     * @param incomeId 收入主键
+     * @return 结果
+     */
+    @Override
+    public int deleteIncomeByIncomeId(Long incomeId)
+    {
+        return incomeMapper.deleteIncomeByIncomeId(incomeId);
+    }
+}

+ 128 - 0
src/main/java/com/hzy/project/business/invoice/controller/InvoiceController.java

@@ -0,0 +1,128 @@
+package com.hzy.project.business.invoice.controller;
+
+import java.util.List;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.hzy.framework.aspectj.lang.annotation.Log;
+import com.hzy.framework.aspectj.lang.enums.BusinessType;
+import com.hzy.project.business.invoice.domain.Invoice;
+import com.hzy.project.business.invoice.service.IInvoiceService;
+import com.hzy.framework.web.controller.BaseController;
+import com.hzy.framework.web.domain.AjaxResult;
+import com.hzy.common.utils.poi.ExcelUtil;
+import com.hzy.framework.web.page.TableDataInfo;
+
+/**
+ * 发票Controller
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@Controller
+@RequestMapping("/business/invoice")
+public class InvoiceController extends BaseController
+{
+    private String prefix = "business/invoice";
+
+    @Autowired
+    private IInvoiceService invoiceService;
+
+    @RequiresPermissions("business:invoice:view")
+    @GetMapping()
+    public String invoice()
+    {
+        return prefix + "/invoice";
+    }
+
+    /**
+     * 查询发票列表
+     */
+    @RequiresPermissions("business:invoice:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(Invoice invoice)
+    {
+        startPage();
+        List<Invoice> list = invoiceService.selectInvoiceList(invoice);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出发票列表
+     */
+    @RequiresPermissions("business:invoice:export")
+    @Log(title = "发票", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(Invoice invoice)
+    {
+        List<Invoice> list = invoiceService.selectInvoiceList(invoice);
+        ExcelUtil<Invoice> util = new ExcelUtil<Invoice>(Invoice.class);
+        return util.exportExcel(list, "发票数据");
+    }
+
+    /**
+     * 新增发票
+     */
+    @RequiresPermissions("business:invoice:add")
+    @GetMapping("/add")
+    public String add()
+    {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存发票
+     */
+    @RequiresPermissions("business:invoice:add")
+    @Log(title = "发票", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(Invoice invoice)
+    {
+        return toAjax(invoiceService.insertInvoice(invoice));
+    }
+
+    /**
+     * 修改发票
+     */
+    @RequiresPermissions("business:invoice:edit")
+    @GetMapping("/edit/{invoiceId}")
+    public String edit(@PathVariable("invoiceId") Long invoiceId, ModelMap mmap)
+    {
+        Invoice invoice = invoiceService.selectInvoiceByInvoiceId(invoiceId);
+        mmap.put("invoice", invoice);
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存发票
+     */
+    @RequiresPermissions("business:invoice:edit")
+    @Log(title = "发票", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(Invoice invoice)
+    {
+        return toAjax(invoiceService.updateInvoice(invoice));
+    }
+
+    /**
+     * 删除发票
+     */
+    @RequiresPermissions("business:invoice:remove")
+    @Log(title = "发票", businessType = BusinessType.DELETE)
+    @PostMapping( "/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        return toAjax(invoiceService.deleteInvoiceByInvoiceIds(ids));
+    }
+}

+ 65 - 0
src/main/java/com/hzy/project/business/invoice/domain/Invoice.java

@@ -0,0 +1,65 @@
+package com.hzy.project.business.invoice.domain;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.hzy.framework.aspectj.lang.annotation.Excel;
+import com.hzy.framework.web.domain.BaseEntity;
+
+/**
+ * 发票对象 t_invoice
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class Invoice extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long invoiceId;
+
+    /** 用户ID */
+    @Excel(name = "用户ID")
+    private Long userId;
+
+    /** 发票日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @Excel(name = "发票日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date invoiceDate;
+
+    /** 发票文件路径 */
+    @Excel(name = "发票文件路径")
+    private String invoiceUrl;
+
+    /** 发票金额 */
+    @Excel(name = "发票金额")
+    private BigDecimal grossAmount;
+
+    /** 发票状态 */
+    @Excel(name = "发票状态")
+    private String invoiceStatus;
+
+    /** 所得税标记 */
+    @Excel(name = "所得税标记")
+    private String incomeTaxFlag;
+
+    /** 所得税税率 */
+    @Excel(name = "所得税税率")
+    private BigDecimal incomeTaxRate;
+
+    /** 报销日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @Excel(name = "报销日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date reimbursementDate;
+
+    /** 删除标志 */
+    private String delFlag;
+
+}

+ 61 - 0
src/main/java/com/hzy/project/business/invoice/mapper/InvoiceMapper.java

@@ -0,0 +1,61 @@
+package com.hzy.project.business.invoice.mapper;
+
+import java.util.List;
+import com.hzy.project.business.invoice.domain.Invoice;
+
+/**
+ * 发票Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+public interface InvoiceMapper 
+{
+    /**
+     * 查询发票
+     * 
+     * @param invoiceId 发票主键
+     * @return 发票
+     */
+    public Invoice selectInvoiceByInvoiceId(Long invoiceId);
+
+    /**
+     * 查询发票列表
+     * 
+     * @param invoice 发票
+     * @return 发票集合
+     */
+    public List<Invoice> selectInvoiceList(Invoice invoice);
+
+    /**
+     * 新增发票
+     * 
+     * @param invoice 发票
+     * @return 结果
+     */
+    public int insertInvoice(Invoice invoice);
+
+    /**
+     * 修改发票
+     * 
+     * @param invoice 发票
+     * @return 结果
+     */
+    public int updateInvoice(Invoice invoice);
+
+    /**
+     * 删除发票
+     * 
+     * @param invoiceId 发票主键
+     * @return 结果
+     */
+    public int deleteInvoiceByInvoiceId(Long invoiceId);
+
+    /**
+     * 批量删除发票
+     * 
+     * @param invoiceIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteInvoiceByInvoiceIds(String[] invoiceIds);
+}

+ 61 - 0
src/main/java/com/hzy/project/business/invoice/service/IInvoiceService.java

@@ -0,0 +1,61 @@
+package com.hzy.project.business.invoice.service;
+
+import java.util.List;
+import com.hzy.project.business.invoice.domain.Invoice;
+
+/**
+ * 发票Service接口
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+public interface IInvoiceService 
+{
+    /**
+     * 查询发票
+     * 
+     * @param invoiceId 发票主键
+     * @return 发票
+     */
+    public Invoice selectInvoiceByInvoiceId(Long invoiceId);
+
+    /**
+     * 查询发票列表
+     * 
+     * @param invoice 发票
+     * @return 发票集合
+     */
+    public List<Invoice> selectInvoiceList(Invoice invoice);
+
+    /**
+     * 新增发票
+     * 
+     * @param invoice 发票
+     * @return 结果
+     */
+    public int insertInvoice(Invoice invoice);
+
+    /**
+     * 修改发票
+     * 
+     * @param invoice 发票
+     * @return 结果
+     */
+    public int updateInvoice(Invoice invoice);
+
+    /**
+     * 批量删除发票
+     * 
+     * @param invoiceIds 需要删除的发票主键集合
+     * @return 结果
+     */
+    public int deleteInvoiceByInvoiceIds(String invoiceIds);
+
+    /**
+     * 删除发票信息
+     * 
+     * @param invoiceId 发票主键
+     * @return 结果
+     */
+    public int deleteInvoiceByInvoiceId(Long invoiceId);
+}

+ 97 - 0
src/main/java/com/hzy/project/business/invoice/service/impl/InvoiceServiceImpl.java

@@ -0,0 +1,97 @@
+package com.hzy.project.business.invoice.service.impl;
+
+import java.util.List;
+import com.hzy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.hzy.project.business.invoice.mapper.InvoiceMapper;
+import com.hzy.project.business.invoice.domain.Invoice;
+import com.hzy.project.business.invoice.service.IInvoiceService;
+import com.hzy.common.utils.text.Convert;
+
+/**
+ * 发票Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@Service
+public class InvoiceServiceImpl implements IInvoiceService 
+{
+    @Autowired
+    private InvoiceMapper invoiceMapper;
+
+    /**
+     * 查询发票
+     * 
+     * @param invoiceId 发票主键
+     * @return 发票
+     */
+    @Override
+    public Invoice selectInvoiceByInvoiceId(Long invoiceId)
+    {
+        return invoiceMapper.selectInvoiceByInvoiceId(invoiceId);
+    }
+
+    /**
+     * 查询发票列表
+     * 
+     * @param invoice 发票
+     * @return 发票
+     */
+    @Override
+    public List<Invoice> selectInvoiceList(Invoice invoice)
+    {
+        return invoiceMapper.selectInvoiceList(invoice);
+    }
+
+    /**
+     * 新增发票
+     * 
+     * @param invoice 发票
+     * @return 结果
+     */
+    @Override
+    public int insertInvoice(Invoice invoice)
+    {
+        invoice.setCreateTime(DateUtils.getNowDate());
+        return invoiceMapper.insertInvoice(invoice);
+    }
+
+    /**
+     * 修改发票
+     * 
+     * @param invoice 发票
+     * @return 结果
+     */
+    @Override
+    public int updateInvoice(Invoice invoice)
+    {
+        invoice.setUpdateTime(DateUtils.getNowDate());
+        return invoiceMapper.updateInvoice(invoice);
+    }
+
+    /**
+     * 批量删除发票
+     * 
+     * @param invoiceIds 需要删除的发票主键
+     * @return 结果
+     */
+    @Override
+    public int deleteInvoiceByInvoiceIds(String invoiceIds)
+    {
+        return invoiceMapper.deleteInvoiceByInvoiceIds(Convert.toStrArray(invoiceIds));
+    }
+
+    /**
+     * 删除发票信息
+     * 
+     * @param invoiceId 发票主键
+     * @return 结果
+     */
+    @Override
+    public int deleteInvoiceByInvoiceId(Long invoiceId)
+    {
+        return invoiceMapper.deleteInvoiceByInvoiceId(invoiceId);
+    }
+}

+ 128 - 0
src/main/java/com/hzy/project/business/payment/controller/PaymentController.java

@@ -0,0 +1,128 @@
+package com.hzy.project.business.payment.controller;
+
+import java.util.List;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.hzy.framework.aspectj.lang.annotation.Log;
+import com.hzy.framework.aspectj.lang.enums.BusinessType;
+import com.hzy.project.business.payment.domain.Payment;
+import com.hzy.project.business.payment.service.IPaymentService;
+import com.hzy.framework.web.controller.BaseController;
+import com.hzy.framework.web.domain.AjaxResult;
+import com.hzy.common.utils.poi.ExcelUtil;
+import com.hzy.framework.web.page.TableDataInfo;
+
+/**
+ * 支出Controller
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@Controller
+@RequestMapping("/business/payment")
+public class PaymentController extends BaseController
+{
+    private String prefix = "business/payment";
+
+    @Autowired
+    private IPaymentService paymentService;
+
+    @RequiresPermissions("business:payment:view")
+    @GetMapping()
+    public String payment()
+    {
+        return prefix + "/payment";
+    }
+
+    /**
+     * 查询支出列表
+     */
+    @RequiresPermissions("business:payment:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(Payment payment)
+    {
+        startPage();
+        List<Payment> list = paymentService.selectPaymentList(payment);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出支出列表
+     */
+    @RequiresPermissions("business:payment:export")
+    @Log(title = "支出", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(Payment payment)
+    {
+        List<Payment> list = paymentService.selectPaymentList(payment);
+        ExcelUtil<Payment> util = new ExcelUtil<Payment>(Payment.class);
+        return util.exportExcel(list, "支出数据");
+    }
+
+    /**
+     * 新增支出
+     */
+    @RequiresPermissions("business:payment:add")
+    @GetMapping("/add")
+    public String add()
+    {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存支出
+     */
+    @RequiresPermissions("business:payment:add")
+    @Log(title = "支出", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(Payment payment)
+    {
+        return toAjax(paymentService.insertPayment(payment));
+    }
+
+    /**
+     * 修改支出
+     */
+    @RequiresPermissions("business:payment:edit")
+    @GetMapping("/edit/{paymentId}")
+    public String edit(@PathVariable("paymentId") Long paymentId, ModelMap mmap)
+    {
+        Payment payment = paymentService.selectPaymentByPaymentId(paymentId);
+        mmap.put("payment", payment);
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存支出
+     */
+    @RequiresPermissions("business:payment:edit")
+    @Log(title = "支出", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(Payment payment)
+    {
+        return toAjax(paymentService.updatePayment(payment));
+    }
+
+    /**
+     * 删除支出
+     */
+    @RequiresPermissions("business:payment:remove")
+    @Log(title = "支出", businessType = BusinessType.DELETE)
+    @PostMapping( "/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        return toAjax(paymentService.deletePaymentByPaymentIds(ids));
+    }
+}

+ 49 - 0
src/main/java/com/hzy/project/business/payment/domain/Payment.java

@@ -0,0 +1,49 @@
+package com.hzy.project.business.payment.domain;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.hzy.framework.aspectj.lang.annotation.Excel;
+import com.hzy.framework.web.domain.BaseEntity;
+
+/**
+ * 支出对象 t_payment
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class Payment extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long paymentId;
+
+    /** 支付时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @Excel(name = "支付时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date payDate;
+
+    /** 支付金额 */
+    @Excel(name = "支付金额")
+    private BigDecimal payAmount;
+
+    /** 支付原因 */
+    @Excel(name = "支付原因")
+    private String payType;
+
+    /** 支付对象ID */
+    @Excel(name = "支付对象ID")
+    private Long userId;
+
+    /** 删除标志 */
+    @Excel(name = "删除标志")
+    private String delFlag;
+
+}

+ 61 - 0
src/main/java/com/hzy/project/business/payment/mapper/PaymentMapper.java

@@ -0,0 +1,61 @@
+package com.hzy.project.business.payment.mapper;
+
+import java.util.List;
+import com.hzy.project.business.payment.domain.Payment;
+
+/**
+ * 支出Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+public interface PaymentMapper 
+{
+    /**
+     * 查询支出
+     * 
+     * @param paymentId 支出主键
+     * @return 支出
+     */
+    public Payment selectPaymentByPaymentId(Long paymentId);
+
+    /**
+     * 查询支出列表
+     * 
+     * @param payment 支出
+     * @return 支出集合
+     */
+    public List<Payment> selectPaymentList(Payment payment);
+
+    /**
+     * 新增支出
+     * 
+     * @param payment 支出
+     * @return 结果
+     */
+    public int insertPayment(Payment payment);
+
+    /**
+     * 修改支出
+     * 
+     * @param payment 支出
+     * @return 结果
+     */
+    public int updatePayment(Payment payment);
+
+    /**
+     * 删除支出
+     * 
+     * @param paymentId 支出主键
+     * @return 结果
+     */
+    public int deletePaymentByPaymentId(Long paymentId);
+
+    /**
+     * 批量删除支出
+     * 
+     * @param paymentIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deletePaymentByPaymentIds(String[] paymentIds);
+}

+ 61 - 0
src/main/java/com/hzy/project/business/payment/service/IPaymentService.java

@@ -0,0 +1,61 @@
+package com.hzy.project.business.payment.service;
+
+import java.util.List;
+import com.hzy.project.business.payment.domain.Payment;
+
+/**
+ * 支出Service接口
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+public interface IPaymentService 
+{
+    /**
+     * 查询支出
+     * 
+     * @param paymentId 支出主键
+     * @return 支出
+     */
+    public Payment selectPaymentByPaymentId(Long paymentId);
+
+    /**
+     * 查询支出列表
+     * 
+     * @param payment 支出
+     * @return 支出集合
+     */
+    public List<Payment> selectPaymentList(Payment payment);
+
+    /**
+     * 新增支出
+     * 
+     * @param payment 支出
+     * @return 结果
+     */
+    public int insertPayment(Payment payment);
+
+    /**
+     * 修改支出
+     * 
+     * @param payment 支出
+     * @return 结果
+     */
+    public int updatePayment(Payment payment);
+
+    /**
+     * 批量删除支出
+     * 
+     * @param paymentIds 需要删除的支出主键集合
+     * @return 结果
+     */
+    public int deletePaymentByPaymentIds(String paymentIds);
+
+    /**
+     * 删除支出信息
+     * 
+     * @param paymentId 支出主键
+     * @return 结果
+     */
+    public int deletePaymentByPaymentId(Long paymentId);
+}

+ 97 - 0
src/main/java/com/hzy/project/business/payment/service/impl/PaymentServiceImpl.java

@@ -0,0 +1,97 @@
+package com.hzy.project.business.payment.service.impl;
+
+import java.util.List;
+import com.hzy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.hzy.project.business.payment.mapper.PaymentMapper;
+import com.hzy.project.business.payment.domain.Payment;
+import com.hzy.project.business.payment.service.IPaymentService;
+import com.hzy.common.utils.text.Convert;
+
+/**
+ * 支出Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@Service
+public class PaymentServiceImpl implements IPaymentService 
+{
+    @Autowired
+    private PaymentMapper paymentMapper;
+
+    /**
+     * 查询支出
+     * 
+     * @param paymentId 支出主键
+     * @return 支出
+     */
+    @Override
+    public Payment selectPaymentByPaymentId(Long paymentId)
+    {
+        return paymentMapper.selectPaymentByPaymentId(paymentId);
+    }
+
+    /**
+     * 查询支出列表
+     * 
+     * @param payment 支出
+     * @return 支出
+     */
+    @Override
+    public List<Payment> selectPaymentList(Payment payment)
+    {
+        return paymentMapper.selectPaymentList(payment);
+    }
+
+    /**
+     * 新增支出
+     * 
+     * @param payment 支出
+     * @return 结果
+     */
+    @Override
+    public int insertPayment(Payment payment)
+    {
+        payment.setCreateTime(DateUtils.getNowDate());
+        return paymentMapper.insertPayment(payment);
+    }
+
+    /**
+     * 修改支出
+     * 
+     * @param payment 支出
+     * @return 结果
+     */
+    @Override
+    public int updatePayment(Payment payment)
+    {
+        payment.setUpdateTime(DateUtils.getNowDate());
+        return paymentMapper.updatePayment(payment);
+    }
+
+    /**
+     * 批量删除支出
+     * 
+     * @param paymentIds 需要删除的支出主键
+     * @return 结果
+     */
+    @Override
+    public int deletePaymentByPaymentIds(String paymentIds)
+    {
+        return paymentMapper.deletePaymentByPaymentIds(Convert.toStrArray(paymentIds));
+    }
+
+    /**
+     * 删除支出信息
+     * 
+     * @param paymentId 支出主键
+     * @return 结果
+     */
+    @Override
+    public int deletePaymentByPaymentId(Long paymentId)
+    {
+        return paymentMapper.deletePaymentByPaymentId(paymentId);
+    }
+}

+ 128 - 0
src/main/java/com/hzy/project/business/salary/controller/SalaryController.java

@@ -0,0 +1,128 @@
+package com.hzy.project.business.salary.controller;
+
+import java.util.List;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.hzy.framework.aspectj.lang.annotation.Log;
+import com.hzy.framework.aspectj.lang.enums.BusinessType;
+import com.hzy.project.business.salary.domain.Salary;
+import com.hzy.project.business.salary.service.ISalaryService;
+import com.hzy.framework.web.controller.BaseController;
+import com.hzy.framework.web.domain.AjaxResult;
+import com.hzy.common.utils.poi.ExcelUtil;
+import com.hzy.framework.web.page.TableDataInfo;
+
+/**
+ * 工资Controller
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@Controller
+@RequestMapping("/business/salary")
+public class SalaryController extends BaseController
+{
+    private String prefix = "business/salary";
+
+    @Autowired
+    private ISalaryService salaryService;
+
+    @RequiresPermissions("business:salary:view")
+    @GetMapping()
+    public String salary()
+    {
+        return prefix + "/salary";
+    }
+
+    /**
+     * 查询工资列表
+     */
+    @RequiresPermissions("business:salary:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(Salary salary)
+    {
+        startPage();
+        List<Salary> list = salaryService.selectSalaryList(salary);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出工资列表
+     */
+    @RequiresPermissions("business:salary:export")
+    @Log(title = "工资", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(Salary salary)
+    {
+        List<Salary> list = salaryService.selectSalaryList(salary);
+        ExcelUtil<Salary> util = new ExcelUtil<Salary>(Salary.class);
+        return util.exportExcel(list, "工资数据");
+    }
+
+    /**
+     * 新增工资
+     */
+    @RequiresPermissions("business:salary:add")
+    @GetMapping("/add")
+    public String add()
+    {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存工资
+     */
+    @RequiresPermissions("business:salary:add")
+    @Log(title = "工资", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(Salary salary)
+    {
+        return toAjax(salaryService.insertSalary(salary));
+    }
+
+    /**
+     * 修改工资
+     */
+    @RequiresPermissions("business:salary:edit")
+    @GetMapping("/edit/{salaryId}")
+    public String edit(@PathVariable("salaryId") Long salaryId, ModelMap mmap)
+    {
+        Salary salary = salaryService.selectSalaryBySalaryId(salaryId);
+        mmap.put("salary", salary);
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存工资
+     */
+    @RequiresPermissions("business:salary:edit")
+    @Log(title = "工资", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(Salary salary)
+    {
+        return toAjax(salaryService.updateSalary(salary));
+    }
+
+    /**
+     * 删除工资
+     */
+    @RequiresPermissions("business:salary:remove")
+    @Log(title = "工资", businessType = BusinessType.DELETE)
+    @PostMapping( "/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        return toAjax(salaryService.deleteSalaryBySalaryIds(ids));
+    }
+}

+ 48 - 0
src/main/java/com/hzy/project/business/salary/domain/Salary.java

@@ -0,0 +1,48 @@
+package com.hzy.project.business.salary.domain;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.hzy.framework.aspectj.lang.annotation.Excel;
+import com.hzy.framework.web.domain.BaseEntity;
+
+/**
+ * 工资对象 t_salary
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class Salary extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long salaryId;
+
+    /** 用户 */
+    @Excel(name = "用户")
+    private Long userId;
+
+    /** 工资日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @Excel(name = "工资日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date salaryDate;
+
+    /** 工资总金额 */
+    @Excel(name = "工资总金额")
+    private BigDecimal sumAmount;
+
+    /** 删除标志 */
+    private String delFlag;
+
+    /** 工资明细信息 */
+    private List<SalaryDetail> salaryDetailList;
+
+}

+ 46 - 0
src/main/java/com/hzy/project/business/salary/domain/SalaryDetail.java

@@ -0,0 +1,46 @@
+package com.hzy.project.business.salary.domain;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.hzy.framework.aspectj.lang.annotation.Excel;
+import com.hzy.framework.web.domain.BaseEntity;
+
+import java.math.BigDecimal;
+
+/**
+ * 工资明细对象 t_salary_detail
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class SalaryDetail extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long id;
+
+    /** 工资ID */
+    @Excel(name = "工资ID")
+    private Long salaryId;
+
+    /** 工资科目 */
+    @Excel(name = "工资科目")
+    private Long salarySubjectId;
+
+    /** 科目名 */
+    @Excel(name = "科目名")
+    private String subjectName;
+
+    /** 金额 */
+    @Excel(name = "金额")
+    private BigDecimal amount;
+
+    /** 删除标志 */
+    private String delFlag;
+
+}

+ 87 - 0
src/main/java/com/hzy/project/business/salary/mapper/SalaryMapper.java

@@ -0,0 +1,87 @@
+package com.hzy.project.business.salary.mapper;
+
+import java.util.List;
+import com.hzy.project.business.salary.domain.Salary;
+import com.hzy.project.business.salary.domain.SalaryDetail;
+
+/**
+ * 工资Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+public interface SalaryMapper 
+{
+    /**
+     * 查询工资
+     * 
+     * @param salaryId 工资主键
+     * @return 工资
+     */
+    public Salary selectSalaryBySalaryId(Long salaryId);
+
+    /**
+     * 查询工资列表
+     * 
+     * @param salary 工资
+     * @return 工资集合
+     */
+    public List<Salary> selectSalaryList(Salary salary);
+
+    /**
+     * 新增工资
+     * 
+     * @param salary 工资
+     * @return 结果
+     */
+    public int insertSalary(Salary salary);
+
+    /**
+     * 修改工资
+     * 
+     * @param salary 工资
+     * @return 结果
+     */
+    public int updateSalary(Salary salary);
+
+    /**
+     * 删除工资
+     * 
+     * @param salaryId 工资主键
+     * @return 结果
+     */
+    public int deleteSalaryBySalaryId(Long salaryId);
+
+    /**
+     * 批量删除工资
+     * 
+     * @param salaryIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteSalaryBySalaryIds(String[] salaryIds);
+
+    /**
+     * 批量删除工资明细
+     * 
+     * @param salaryIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteSalaryDetailBySalaryIds(String[] salaryIds);
+    
+    /**
+     * 批量新增工资明细
+     * 
+     * @param salaryDetailList 工资明细列表
+     * @return 结果
+     */
+    public int batchSalaryDetail(List<SalaryDetail> salaryDetailList);
+    
+
+    /**
+     * 通过工资主键删除工资明细信息
+     * 
+     * @param salaryId 工资ID
+     * @return 结果
+     */
+    public int deleteSalaryDetailBySalaryId(Long salaryId);
+}

+ 61 - 0
src/main/java/com/hzy/project/business/salary/service/ISalaryService.java

@@ -0,0 +1,61 @@
+package com.hzy.project.business.salary.service;
+
+import java.util.List;
+import com.hzy.project.business.salary.domain.Salary;
+
+/**
+ * 工资Service接口
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+public interface ISalaryService 
+{
+    /**
+     * 查询工资
+     * 
+     * @param salaryId 工资主键
+     * @return 工资
+     */
+    public Salary selectSalaryBySalaryId(Long salaryId);
+
+    /**
+     * 查询工资列表
+     * 
+     * @param salary 工资
+     * @return 工资集合
+     */
+    public List<Salary> selectSalaryList(Salary salary);
+
+    /**
+     * 新增工资
+     * 
+     * @param salary 工资
+     * @return 结果
+     */
+    public int insertSalary(Salary salary);
+
+    /**
+     * 修改工资
+     * 
+     * @param salary 工资
+     * @return 结果
+     */
+    public int updateSalary(Salary salary);
+
+    /**
+     * 批量删除工资
+     * 
+     * @param salaryIds 需要删除的工资主键集合
+     * @return 结果
+     */
+    public int deleteSalaryBySalaryIds(String salaryIds);
+
+    /**
+     * 删除工资信息
+     * 
+     * @param salaryId 工资主键
+     * @return 结果
+     */
+    public int deleteSalaryBySalaryId(Long salaryId);
+}

+ 135 - 0
src/main/java/com/hzy/project/business/salary/service/impl/SalaryServiceImpl.java

@@ -0,0 +1,135 @@
+package com.hzy.project.business.salary.service.impl;
+
+import java.util.List;
+import com.hzy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import java.util.ArrayList;
+import com.hzy.common.utils.StringUtils;
+import org.springframework.transaction.annotation.Transactional;
+import com.hzy.project.business.salary.domain.SalaryDetail;
+import com.hzy.project.business.salary.mapper.SalaryMapper;
+import com.hzy.project.business.salary.domain.Salary;
+import com.hzy.project.business.salary.service.ISalaryService;
+import com.hzy.common.utils.text.Convert;
+
+/**
+ * 工资Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@Service
+public class SalaryServiceImpl implements ISalaryService 
+{
+    @Autowired
+    private SalaryMapper salaryMapper;
+
+    /**
+     * 查询工资
+     * 
+     * @param salaryId 工资主键
+     * @return 工资
+     */
+    @Override
+    public Salary selectSalaryBySalaryId(Long salaryId)
+    {
+        return salaryMapper.selectSalaryBySalaryId(salaryId);
+    }
+
+    /**
+     * 查询工资列表
+     * 
+     * @param salary 工资
+     * @return 工资
+     */
+    @Override
+    public List<Salary> selectSalaryList(Salary salary)
+    {
+        return salaryMapper.selectSalaryList(salary);
+    }
+
+    /**
+     * 新增工资
+     * 
+     * @param salary 工资
+     * @return 结果
+     */
+    @Transactional
+    @Override
+    public int insertSalary(Salary salary)
+    {
+        salary.setCreateTime(DateUtils.getNowDate());
+        int rows = salaryMapper.insertSalary(salary);
+        insertSalaryDetail(salary);
+        return rows;
+    }
+
+    /**
+     * 修改工资
+     * 
+     * @param salary 工资
+     * @return 结果
+     */
+    @Transactional
+    @Override
+    public int updateSalary(Salary salary)
+    {
+        salary.setUpdateTime(DateUtils.getNowDate());
+        salaryMapper.deleteSalaryDetailBySalaryId(salary.getSalaryId());
+        insertSalaryDetail(salary);
+        return salaryMapper.updateSalary(salary);
+    }
+
+    /**
+     * 批量删除工资
+     * 
+     * @param salaryIds 需要删除的工资主键
+     * @return 结果
+     */
+    @Transactional
+    @Override
+    public int deleteSalaryBySalaryIds(String salaryIds)
+    {
+        salaryMapper.deleteSalaryDetailBySalaryIds(Convert.toStrArray(salaryIds));
+        return salaryMapper.deleteSalaryBySalaryIds(Convert.toStrArray(salaryIds));
+    }
+
+    /**
+     * 删除工资信息
+     * 
+     * @param salaryId 工资主键
+     * @return 结果
+     */
+    @Transactional
+    @Override
+    public int deleteSalaryBySalaryId(Long salaryId)
+    {
+        salaryMapper.deleteSalaryDetailBySalaryId(salaryId);
+        return salaryMapper.deleteSalaryBySalaryId(salaryId);
+    }
+
+    /**
+     * 新增工资明细信息
+     * 
+     * @param salary 工资对象
+     */
+    public void insertSalaryDetail(Salary salary)
+    {
+        List<SalaryDetail> salaryDetailList = salary.getSalaryDetailList();
+        Long salaryId = salary.getSalaryId();
+        if (StringUtils.isNotNull(salaryDetailList))
+        {
+            List<SalaryDetail> list = new ArrayList<SalaryDetail>();
+            for (SalaryDetail salaryDetail : salaryDetailList)
+            {
+                salaryDetail.setSalaryId(salaryId);
+                list.add(salaryDetail);
+            }
+            if (list.size() > 0)
+            {
+                salaryMapper.batchSalaryDetail(list);
+            }
+        }
+    }
+}

+ 152 - 0
src/main/java/com/hzy/project/business/subject/controller/SalarySubjectController.java

@@ -0,0 +1,152 @@
+package com.hzy.project.business.subject.controller;
+
+import java.util.List;
+
+import com.hzy.common.enums.EDelFlag;
+import com.hzy.common.utils.RMBUtil;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.hzy.framework.aspectj.lang.annotation.Log;
+import com.hzy.framework.aspectj.lang.enums.BusinessType;
+import com.hzy.project.business.subject.domain.SalarySubject;
+import com.hzy.project.business.subject.service.ISalarySubjectService;
+import com.hzy.framework.web.controller.BaseController;
+import com.hzy.framework.web.domain.AjaxResult;
+import com.hzy.common.utils.poi.ExcelUtil;
+import com.hzy.framework.web.page.TableDataInfo;
+
+/**
+ * 工资科目Controller
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@Controller
+@RequestMapping("/business/subject")
+public class SalarySubjectController extends BaseController
+{
+    private String prefix = "business/subject";
+
+    @Autowired
+    private ISalarySubjectService salarySubjectService;
+
+    @RequiresPermissions("business:subject:view")
+    @GetMapping()
+    public String subject()
+    {
+        return prefix + "/subject";
+    }
+
+    /**
+     * 查询工资科目列表
+     */
+    @RequiresPermissions("business:subject:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(SalarySubject salarySubject)
+    {
+        salarySubject.setDelFlag(EDelFlag.NO.getVal());
+        startPage();
+        List<SalarySubject> list = salarySubjectService.selectSalarySubjectList(salarySubject);
+        list.forEach(e->{
+            e.setPercent(RMBUtil.fenToYuan(e.getPercent()));
+        });
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出工资科目列表
+     */
+    @RequiresPermissions("business:subject:export")
+    @Log(title = "工资科目", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(SalarySubject salarySubject)
+    {
+        salarySubject.setDelFlag(EDelFlag.NO.getVal());
+        List<SalarySubject> list = salarySubjectService.selectSalarySubjectList(salarySubject);
+        list.forEach(e->{
+            e.setPercent(RMBUtil.fenToYuan(e.getPercent()));
+        });
+        ExcelUtil<SalarySubject> util = new ExcelUtil<SalarySubject>(SalarySubject.class);
+        return util.exportExcel(list, "工资科目数据");
+    }
+
+    /**
+     * 新增工资科目
+     */
+    @RequiresPermissions("business:subject:add")
+    @GetMapping("/add")
+    public String add()
+    {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存工资科目
+     */
+    @RequiresPermissions("business:subject:add")
+    @Log(title = "工资科目", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(SalarySubject salarySubject)
+    {
+        salarySubject.setPercent(RMBUtil.yuanToFen(salarySubject.getPercent()));
+        salarySubject.setSort(999L);
+        salarySubject.setDelFlag(EDelFlag.NO.getVal());
+        return toAjax(salarySubjectService.insertSalarySubject(salarySubject));
+    }
+
+    /**
+     * 修改工资科目
+     */
+    @RequiresPermissions("business:subject:edit")
+    @GetMapping("/edit/{salarySubjectId}")
+    public String edit(@PathVariable("salarySubjectId") Long salarySubjectId, ModelMap mmap)
+    {
+        SalarySubject salarySubject = salarySubjectService.selectSalarySubjectBySalarySubjectId(salarySubjectId);
+        salarySubject.setPercent(RMBUtil.fenToYuan(salarySubject.getPercent()));
+        mmap.put("salarySubject", salarySubject);
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存工资科目
+     */
+    @RequiresPermissions("business:subject:edit")
+    @Log(title = "工资科目", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(SalarySubject salarySubject)
+    {
+        salarySubject.setPercent(RMBUtil.yuanToFen(salarySubject.getPercent()));
+        return toAjax(salarySubjectService.updateSalarySubject(salarySubject));
+    }
+
+    /**
+     * 删除工资科目
+     */
+    @RequiresPermissions("business:subject:remove")
+    @Log(title = "工资科目", businessType = BusinessType.DELETE)
+    @PostMapping( "/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        return toAjax(salarySubjectService.deleteSalarySubjectBySalarySubjectIds(ids));
+    }
+
+    @RequiresPermissions("master:subject:edit")
+    @Log(title = "工资科目拖动排序", businessType = BusinessType.UPDATE)
+    @PostMapping("/sorted")
+    @ResponseBody
+    public AjaxResult saveSorted(SalarySubject salarySubject) {
+        return toAjax(salarySubjectService.dragSorted(salarySubject));
+    }
+}

+ 54 - 0
src/main/java/com/hzy/project/business/subject/domain/SalarySubject.java

@@ -0,0 +1,54 @@
+package com.hzy.project.business.subject.domain;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.hzy.framework.aspectj.lang.annotation.Excel;
+import com.hzy.framework.web.domain.BaseEntity;
+
+import java.math.BigDecimal;
+
+/**
+ * 工资科目对象 m_salary_subject
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class SalarySubject extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long salarySubjectId;
+
+    /** 科目种类 */
+    @Excel(name = "科目种类")
+    private String subjectType;
+
+    /** 科目名 */
+    @Excel(name = "科目名")
+    private String subjectName;
+
+    /** 基准标记 */
+    @Excel(name = "基准标记")
+    private String baseFlag;
+
+    /** 占比 */
+    @Excel(name = "占比")
+    private BigDecimal percent;
+
+    /** 公式 */
+    @Excel(name = "公式")
+    private String formula;
+
+    /** 顺序 */
+    @Excel(name = "顺序")
+    private Long sort;
+
+    /** 删除标志 */
+    private String delFlag;
+
+}

+ 61 - 0
src/main/java/com/hzy/project/business/subject/mapper/SalarySubjectMapper.java

@@ -0,0 +1,61 @@
+package com.hzy.project.business.subject.mapper;
+
+import java.util.List;
+import com.hzy.project.business.subject.domain.SalarySubject;
+
+/**
+ * 工资科目Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+public interface SalarySubjectMapper 
+{
+    /**
+     * 查询工资科目
+     * 
+     * @param salarySubjectId 工资科目主键
+     * @return 工资科目
+     */
+    public SalarySubject selectSalarySubjectBySalarySubjectId(Long salarySubjectId);
+
+    /**
+     * 查询工资科目列表
+     * 
+     * @param salarySubject 工资科目
+     * @return 工资科目集合
+     */
+    public List<SalarySubject> selectSalarySubjectList(SalarySubject salarySubject);
+
+    /**
+     * 新增工资科目
+     * 
+     * @param salarySubject 工资科目
+     * @return 结果
+     */
+    public int insertSalarySubject(SalarySubject salarySubject);
+
+    /**
+     * 修改工资科目
+     * 
+     * @param salarySubject 工资科目
+     * @return 结果
+     */
+    public int updateSalarySubject(SalarySubject salarySubject);
+
+    /**
+     * 删除工资科目
+     * 
+     * @param salarySubjectId 工资科目主键
+     * @return 结果
+     */
+    public int deleteSalarySubjectBySalarySubjectId(Long salarySubjectId);
+
+    /**
+     * 批量删除工资科目
+     * 
+     * @param salarySubjectIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteSalarySubjectBySalarySubjectIds(String[] salarySubjectIds);
+}

+ 64 - 0
src/main/java/com/hzy/project/business/subject/service/ISalarySubjectService.java

@@ -0,0 +1,64 @@
+package com.hzy.project.business.subject.service;
+
+import java.util.List;
+import com.hzy.project.business.subject.domain.SalarySubject;
+
+/**
+ * 工资科目Service接口
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+public interface ISalarySubjectService 
+{
+    /**
+     * 查询工资科目
+     * 
+     * @param salarySubjectId 工资科目主键
+     * @return 工资科目
+     */
+    public SalarySubject selectSalarySubjectBySalarySubjectId(Long salarySubjectId);
+
+    /**
+     * 查询工资科目列表
+     * 
+     * @param salarySubject 工资科目
+     * @return 工资科目集合
+     */
+    public List<SalarySubject> selectSalarySubjectList(SalarySubject salarySubject);
+
+    /**
+     * 新增工资科目
+     * 
+     * @param salarySubject 工资科目
+     * @return 结果
+     */
+    public int insertSalarySubject(SalarySubject salarySubject);
+
+    /**
+     * 修改工资科目
+     * 
+     * @param salarySubject 工资科目
+     * @return 结果
+     */
+    public int updateSalarySubject(SalarySubject salarySubject);
+
+    /**
+     * 批量删除工资科目
+     * 
+     * @param salarySubjectIds 需要删除的工资科目主键集合
+     * @return 结果
+     */
+    public int deleteSalarySubjectBySalarySubjectIds(String salarySubjectIds);
+
+    /**
+     * 删除工资科目信息
+     * 
+     * @param salarySubjectId 工资科目主键
+     * @return 结果
+     */
+    public int deleteSalarySubjectBySalarySubjectId(Long salarySubjectId);
+    public int logicDelSalarySubjectBySalarySubjectId(String salarySubjectId);
+
+    int dragSorted(SalarySubject salarySubject);
+}

+ 150 - 0
src/main/java/com/hzy/project/business/subject/service/impl/SalarySubjectServiceImpl.java

@@ -0,0 +1,150 @@
+package com.hzy.project.business.subject.service.impl;
+
+import java.util.Date;
+import java.util.List;
+
+import com.hzy.common.enums.EDelFlag;
+import com.hzy.common.utils.DateUtils;
+import com.hzy.common.utils.security.ShiroUtils;
+import com.hzy.project.business.customer.domain.Customer;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.hzy.project.business.subject.mapper.SalarySubjectMapper;
+import com.hzy.project.business.subject.domain.SalarySubject;
+import com.hzy.project.business.subject.service.ISalarySubjectService;
+import com.hzy.common.utils.text.Convert;
+
+/**
+ * 工资科目Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@Service
+public class SalarySubjectServiceImpl implements ISalarySubjectService 
+{
+    @Autowired
+    private SalarySubjectMapper salarySubjectMapper;
+
+    /**
+     * 查询工资科目
+     * 
+     * @param salarySubjectId 工资科目主键
+     * @return 工资科目
+     */
+    @Override
+    public SalarySubject selectSalarySubjectBySalarySubjectId(Long salarySubjectId)
+    {
+        return salarySubjectMapper.selectSalarySubjectBySalarySubjectId(salarySubjectId);
+    }
+
+    /**
+     * 查询工资科目列表
+     * 
+     * @param salarySubject 工资科目
+     * @return 工资科目
+     */
+    @Override
+    public List<SalarySubject> selectSalarySubjectList(SalarySubject salarySubject)
+    {
+        return salarySubjectMapper.selectSalarySubjectList(salarySubject);
+    }
+
+    /**
+     * 新增工资科目
+     * 
+     * @param salarySubject 工资科目
+     * @return 结果
+     */
+    @Override
+    public int insertSalarySubject(SalarySubject salarySubject)
+    {
+        salarySubject.setCreateBy(ShiroUtils.getLoginName());
+        salarySubject.setCreateTime(DateUtils.getNowDate());
+        return salarySubjectMapper.insertSalarySubject(salarySubject);
+    }
+
+    /**
+     * 修改工资科目
+     * 
+     * @param salarySubject 工资科目
+     * @return 结果
+     */
+    @Override
+    public int updateSalarySubject(SalarySubject salarySubject)
+    {
+        salarySubject.setUpdateBy(ShiroUtils.getLoginName());
+        salarySubject.setUpdateTime(DateUtils.getNowDate());
+        return salarySubjectMapper.updateSalarySubject(salarySubject);
+    }
+
+    /**
+     * 批量删除工资科目
+     * 
+     * @param salarySubjectIds 需要删除的工资科目主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSalarySubjectBySalarySubjectIds(String salarySubjectIds)
+    {
+        return salarySubjectMapper.deleteSalarySubjectBySalarySubjectIds(Convert.toStrArray(salarySubjectIds));
+    }
+
+    /**
+     * 删除工资科目信息
+     * 
+     * @param salarySubjectId 工资科目主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSalarySubjectBySalarySubjectId(Long salarySubjectId)
+    {
+        return salarySubjectMapper.deleteSalarySubjectBySalarySubjectId(salarySubjectId);
+    }
+
+    /**
+     * 批量逻辑删除工资科目
+     *
+     * @param salarySubjectIds 需要删除的工资科目主键
+     * @return 结果
+     */
+    @Override
+    public int logicDelSalarySubjectBySalarySubjectId(String salarySubjectIds)
+    {
+        String[] salarySubjectIdList = Convert.toStrArray(salarySubjectIds);
+
+        int rtn = 0;
+        for (String salarySubjectId : salarySubjectIdList) {
+
+            SalarySubject salarySubject = new SalarySubject();
+            salarySubject.setSalarySubjectId(Long.valueOf(salarySubjectId));
+            salarySubject.setDelFlag(EDelFlag.YES.getVal());
+            salarySubject.setUpdateBy(ShiroUtils.getLoginName());
+            salarySubject.setUpdateTime(DateUtils.getNowDate());
+
+            rtn += salarySubjectMapper.updateSalarySubject(salarySubject);
+        }
+        return rtn;
+    }
+
+    @Override
+    public int dragSorted(SalarySubject salarySubject) {
+        Date now = DateUtils.getNowDate();
+        int result = 0;
+        Object pz = salarySubject.getParams().get("pageSize");
+        int pageSize = Convert.toInt(pz, 10);
+        Object pn = salarySubject.getParams().get("pageNumber");
+        int pageNumber = Convert.toInt(pn, 1);
+        List<SalarySubject> sorteds = salarySubject.getPramsByName("sorted", SalarySubject.class);
+        if (!sorteds.isEmpty()) {
+            int sort = pageSize * (pageNumber - 1) + 1;
+            for (SalarySubject entity : sorteds) {
+                entity.setUpdateBy(ShiroUtils.getLoginName());
+                entity.setUpdateTime(now);
+                entity.setSort(Long.valueOf(sort++));
+                result = result + salarySubjectMapper.updateSalarySubject(entity);
+            }
+        }
+        return result;
+    }
+}

+ 11 - 3
src/main/resources/application-druid.yml

@@ -6,9 +6,9 @@ spring:
         druid:
             # 主库数据源
             master:
-                url: jdbc:mysql://localhost:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                url: jdbc:mysql://47.98.241.144:3306/hzy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
                 username: root
-                password: password
+                password: $TyH69i4EEG^om!!
             # 从库数据源
             slave:
                 # 从数据源开关/默认关闭
@@ -58,4 +58,12 @@ spring:
                     merge-sql: true
                 wall:
                     config:
-                        multi-statement-allow: true
+                        multi-statement-allow: true
+aliyun:
+    oss:
+        endPoint: oss-cn-beijing.aliyuncs.com
+        accessKeyID: LTAI4FgWZoKoPu77uHQ426kV
+        accessKeySecret: JIY8eAuxB8WaC01WG1tHCZ5Nc3is6q
+        bucketName: biandan-default
+        # 如果有自定义域名
+        customDomain: res.njnet.vip

+ 5 - 5
src/main/resources/application.yml

@@ -16,7 +16,7 @@ ruoyi:
 # 开发环境配置
 server:
   # 服务器的HTTP端口,默认为80
-  port: 80
+  port: 7800
   servlet:
     # 应用的访问路径
     context-path: /
@@ -98,7 +98,7 @@ shiro:
     # 首页地址
     indexUrl: /index
     # 验证码开关
-    captchaEnabled: true
+    captchaEnabled: false
     # 验证码类型 math 数字计算 char 字符验证
     captchaType: math
   cookie:
@@ -114,7 +114,7 @@ shiro:
     cipherKey:
   session:
     # Session超时时间,-1代表永不过期(默认30分钟)
-    expireTime: 30
+    expireTime: -1
     # 同步session到数据库的周期(默认1分钟)
     dbSyncPeriod: 1
     # 相隔多久检查一次session的有效性,默认就是10分钟
@@ -153,10 +153,10 @@ gen:
   # 作者
   author: ruoyi
   # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
-  packageName: com.hzy.project.system
+  packageName: com.hzy.project.business
   # 自动去除表前缀,默认是true
   autoRemovePre: true
   # 表前缀(生成类名不会包含表前缀,多个用逗号分隔)
-  tablePrefix: sys_
+  tablePrefix: sys_,m_,t_
   # 是否允许生成文件覆盖到本地(自定义路径),默认不允许
   allowOverwrite: false

+ 78 - 0
src/main/resources/mybatis/business/CustomerMapper.xml

@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.hzy.project.business.customer.mapper.CustomerMapper">
+    
+    <resultMap type="Customer" id="CustomerResult">
+        <result property="customerId"    column="customerId"    />
+        <result property="customerName"    column="customerName"    />
+        <result property="delFlag"    column="delFlag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectCustomerVo">
+        select customerId, customerName, delFlag, create_by, create_time, update_by, update_time from m_customer
+    </sql>
+
+    <select id="selectCustomerList" parameterType="Customer" resultMap="CustomerResult">
+        <include refid="selectCustomerVo"/>
+        <where>  
+            <if test="customerName != null  and customerName != ''"> and customerName like concat('%', #{customerName}, '%')</if>
+            <if test="delFlag != null"> and delFlag = #{delFlag}</if>
+        </where>
+    </select>
+    
+    <select id="selectCustomerByCustomerId" parameterType="Long" resultMap="CustomerResult">
+        <include refid="selectCustomerVo"/>
+        where customerId = #{customerId}
+    </select>
+
+    <insert id="insertCustomer" parameterType="Customer" useGeneratedKeys="true" keyProperty="customerId">
+        insert into m_customer
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="customerName != null">customerName,</if>
+            <if test="delFlag != null">delFlag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="customerName != null">#{customerName},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateCustomer" parameterType="Customer">
+        update m_customer
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="customerName != null">customerName = #{customerName},</if>
+            <if test="delFlag != null">delFlag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where customerId = #{customerId}
+    </update>
+
+    <delete id="deleteCustomerByCustomerId" parameterType="Long">
+        delete from m_customer where customerId = #{customerId}
+    </delete>
+
+    <delete id="deleteCustomerByCustomerIds" parameterType="String">
+        delete from m_customer where customerId in 
+        <foreach item="customerId" collection="array" open="(" separator="," close=")">
+            #{customerId}
+        </foreach>
+    </delete>
+
+</mapper>

+ 111 - 0
src/main/resources/mybatis/business/IncomeMapper.xml

@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.hzy.project.business.income.mapper.IncomeMapper">
+    
+    <resultMap type="Income" id="IncomeResult">
+        <result property="incomeId"    column="incomeId"    />
+        <result property="customerId"    column="customerId"    />
+        <result property="incomeDate"    column="incomeDate"    />
+        <result property="incomeType"    column="incomeType"    />
+        <result property="grossAmount"    column="grossAmount"    />
+        <result property="netAmount"    column="netAmount"    />
+        <result property="taxAmount"    column="taxAmount"    />
+        <result property="rate"    column="rate"    />
+        <result property="remark"    column="remark"    />
+        <result property="delFlag"    column="delFlag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectIncomeVo">
+        select incomeId, customerId, incomeDate, incomeType, grossAmount, netAmount, taxAmount, rate, remark, delFlag, create_by, create_time, update_by, update_time from t_income
+    </sql>
+
+    <select id="selectIncomeList" parameterType="Income" resultMap="IncomeResult">
+        <include refid="selectIncomeVo"/>
+        <where>  
+            <if test="customerId != null "> and customerId = #{customerId}</if>
+            <if test="incomeDate != null "> and incomeDate = #{incomeDate}</if>
+            <if test="incomeType != null  and incomeType != ''"> and incomeType = #{incomeType}</if>
+            <if test="grossAmount != null "> and grossAmount = #{grossAmount}</if>
+            <if test="netAmount != null "> and netAmount = #{netAmount}</if>
+            <if test="taxAmount != null "> and taxAmount = #{taxAmount}</if>
+            <if test="rate != null "> and rate = #{rate}</if>
+        </where>
+    </select>
+    
+    <select id="selectIncomeByIncomeId" parameterType="Long" resultMap="IncomeResult">
+        <include refid="selectIncomeVo"/>
+        where incomeId = #{incomeId}
+    </select>
+
+    <insert id="insertIncome" parameterType="Income" useGeneratedKeys="true" keyProperty="incomeId">
+        insert into t_income
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="customerId != null">customerId,</if>
+            <if test="incomeDate != null">incomeDate,</if>
+            <if test="incomeType != null">incomeType,</if>
+            <if test="grossAmount != null">grossAmount,</if>
+            <if test="netAmount != null">netAmount,</if>
+            <if test="taxAmount != null">taxAmount,</if>
+            <if test="rate != null">rate,</if>
+            <if test="remark != null">remark,</if>
+            <if test="delFlag != null">delFlag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="customerId != null">#{customerId},</if>
+            <if test="incomeDate != null">#{incomeDate},</if>
+            <if test="incomeType != null">#{incomeType},</if>
+            <if test="grossAmount != null">#{grossAmount},</if>
+            <if test="netAmount != null">#{netAmount},</if>
+            <if test="taxAmount != null">#{taxAmount},</if>
+            <if test="rate != null">#{rate},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateIncome" parameterType="Income">
+        update t_income
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="customerId != null">customerId = #{customerId},</if>
+            <if test="incomeDate != null">incomeDate = #{incomeDate},</if>
+            <if test="incomeType != null">incomeType = #{incomeType},</if>
+            <if test="grossAmount != null">grossAmount = #{grossAmount},</if>
+            <if test="netAmount != null">netAmount = #{netAmount},</if>
+            <if test="taxAmount != null">taxAmount = #{taxAmount},</if>
+            <if test="rate != null">rate = #{rate},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="delFlag != null">delFlag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where incomeId = #{incomeId}
+    </update>
+
+    <delete id="deleteIncomeByIncomeId" parameterType="Long">
+        delete from t_income where incomeId = #{incomeId}
+    </delete>
+
+    <delete id="deleteIncomeByIncomeIds" parameterType="String">
+        delete from t_income where incomeId in 
+        <foreach item="incomeId" collection="array" open="(" separator="," close=")">
+            #{incomeId}
+        </foreach>
+    </delete>
+
+</mapper>

+ 116 - 0
src/main/resources/mybatis/business/InvoiceMapper.xml

@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.hzy.project.business.invoice.mapper.InvoiceMapper">
+    
+    <resultMap type="Invoice" id="InvoiceResult">
+        <result property="invoiceId"    column="invoiceId"    />
+        <result property="userId"    column="user_id"    />
+        <result property="invoiceDate"    column="invoiceDate"    />
+        <result property="invoiceUrl"    column="invoiceUrl"    />
+        <result property="grossAmount"    column="grossAmount"    />
+        <result property="invoiceStatus"    column="invoiceStatus"    />
+        <result property="incomeTaxFlag"    column="incomeTaxFlag"    />
+        <result property="incomeTaxRate"    column="incomeTaxRate"    />
+        <result property="reimbursementDate"    column="reimbursementDate"    />
+        <result property="remark"    column="remark"    />
+        <result property="delFlag"    column="delFlag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectInvoiceVo">
+        select invoiceId, user_id, invoiceDate, invoiceUrl, grossAmount, invoiceStatus, incomeTaxFlag, incomeTaxRate, reimbursementDate, remark, delFlag, create_by, create_time, update_by, update_time from t_invoice
+    </sql>
+
+    <select id="selectInvoiceList" parameterType="Invoice" resultMap="InvoiceResult">
+        <include refid="selectInvoiceVo"/>
+        <where>  
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="invoiceDate != null "> and invoiceDate = #{invoiceDate}</if>
+            <if test="invoiceUrl != null  and invoiceUrl != ''"> and invoiceUrl = #{invoiceUrl}</if>
+            <if test="grossAmount != null "> and grossAmount = #{grossAmount}</if>
+            <if test="invoiceStatus != null  and invoiceStatus != ''"> and invoiceStatus = #{invoiceStatus}</if>
+            <if test="incomeTaxFlag != null  and incomeTaxFlag != ''"> and incomeTaxFlag = #{incomeTaxFlag}</if>
+            <if test="incomeTaxRate != null "> and incomeTaxRate = #{incomeTaxRate}</if>
+            <if test="params.beginReimbursementDate != null and params.beginReimbursementDate != '' and params.endReimbursementDate != null and params.endReimbursementDate != ''"> and reimbursementDate between #{params.beginReimbursementDate} and #{params.endReimbursementDate}</if>
+        </where>
+    </select>
+    
+    <select id="selectInvoiceByInvoiceId" parameterType="Long" resultMap="InvoiceResult">
+        <include refid="selectInvoiceVo"/>
+        where invoiceId = #{invoiceId}
+    </select>
+
+    <insert id="insertInvoice" parameterType="Invoice" useGeneratedKeys="true" keyProperty="invoiceId">
+        insert into t_invoice
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId != null">user_id,</if>
+            <if test="invoiceDate != null">invoiceDate,</if>
+            <if test="invoiceUrl != null">invoiceUrl,</if>
+            <if test="grossAmount != null">grossAmount,</if>
+            <if test="invoiceStatus != null">invoiceStatus,</if>
+            <if test="incomeTaxFlag != null">incomeTaxFlag,</if>
+            <if test="incomeTaxRate != null">incomeTaxRate,</if>
+            <if test="reimbursementDate != null">reimbursementDate,</if>
+            <if test="remark != null">remark,</if>
+            <if test="delFlag != null">delFlag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userId != null">#{userId},</if>
+            <if test="invoiceDate != null">#{invoiceDate},</if>
+            <if test="invoiceUrl != null">#{invoiceUrl},</if>
+            <if test="grossAmount != null">#{grossAmount},</if>
+            <if test="invoiceStatus != null">#{invoiceStatus},</if>
+            <if test="incomeTaxFlag != null">#{incomeTaxFlag},</if>
+            <if test="incomeTaxRate != null">#{incomeTaxRate},</if>
+            <if test="reimbursementDate != null">#{reimbursementDate},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateInvoice" parameterType="Invoice">
+        update t_invoice
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="invoiceDate != null">invoiceDate = #{invoiceDate},</if>
+            <if test="invoiceUrl != null">invoiceUrl = #{invoiceUrl},</if>
+            <if test="grossAmount != null">grossAmount = #{grossAmount},</if>
+            <if test="invoiceStatus != null">invoiceStatus = #{invoiceStatus},</if>
+            <if test="incomeTaxFlag != null">incomeTaxFlag = #{incomeTaxFlag},</if>
+            <if test="incomeTaxRate != null">incomeTaxRate = #{incomeTaxRate},</if>
+            <if test="reimbursementDate != null">reimbursementDate = #{reimbursementDate},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="delFlag != null">delFlag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where invoiceId = #{invoiceId}
+    </update>
+
+    <delete id="deleteInvoiceByInvoiceId" parameterType="Long">
+        delete from t_invoice where invoiceId = #{invoiceId}
+    </delete>
+
+    <delete id="deleteInvoiceByInvoiceIds" parameterType="String">
+        delete from t_invoice where invoiceId in 
+        <foreach item="invoiceId" collection="array" open="(" separator="," close=")">
+            #{invoiceId}
+        </foreach>
+    </delete>
+
+</mapper>

+ 97 - 0
src/main/resources/mybatis/business/PaymentMapper.xml

@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.hzy.project.business.payment.mapper.PaymentMapper">
+    
+    <resultMap type="Payment" id="PaymentResult">
+        <result property="paymentId"    column="paymentId"    />
+        <result property="payDate"    column="payDate"    />
+        <result property="payAmount"    column="payAmount"    />
+        <result property="payType"    column="payType"    />
+        <result property="userId"    column="user_id"    />
+        <result property="remark"    column="remark"    />
+        <result property="delFlag"    column="delFlag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectPaymentVo">
+        select paymentId, payDate, payAmount, payType, user_id, remark, delFlag, create_by, create_time, update_by, update_time from t_payment
+    </sql>
+
+    <select id="selectPaymentList" parameterType="Payment" resultMap="PaymentResult">
+        <include refid="selectPaymentVo"/>
+        <where>  
+            <if test="payDate != null "> and payDate = #{payDate}</if>
+            <if test="payAmount != null "> and payAmount = #{payAmount}</if>
+            <if test="payType != null  and payType != ''"> and payType = #{payType}</if>
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="delFlag != null  and delFlag != ''"> and delFlag = #{delFlag}</if>
+        </where>
+    </select>
+    
+    <select id="selectPaymentByPaymentId" parameterType="Long" resultMap="PaymentResult">
+        <include refid="selectPaymentVo"/>
+        where paymentId = #{paymentId}
+    </select>
+
+    <insert id="insertPayment" parameterType="Payment" useGeneratedKeys="true" keyProperty="paymentId">
+        insert into t_payment
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="payDate != null">payDate,</if>
+            <if test="payAmount != null">payAmount,</if>
+            <if test="payType != null">payType,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="remark != null">remark,</if>
+            <if test="delFlag != null">delFlag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="payDate != null">#{payDate},</if>
+            <if test="payAmount != null">#{payAmount},</if>
+            <if test="payType != null">#{payType},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updatePayment" parameterType="Payment">
+        update t_payment
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="payDate != null">payDate = #{payDate},</if>
+            <if test="payAmount != null">payAmount = #{payAmount},</if>
+            <if test="payType != null">payType = #{payType},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="delFlag != null">delFlag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where paymentId = #{paymentId}
+    </update>
+
+    <delete id="deletePaymentByPaymentId" parameterType="Long">
+        delete from t_payment where paymentId = #{paymentId}
+    </delete>
+
+    <delete id="deletePaymentByPaymentIds" parameterType="String">
+        delete from t_payment where paymentId in 
+        <foreach item="paymentId" collection="array" open="(" separator="," close=")">
+            #{paymentId}
+        </foreach>
+    </delete>
+
+</mapper>

+ 132 - 0
src/main/resources/mybatis/business/SalaryMapper.xml

@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.hzy.project.business.salary.mapper.SalaryMapper">
+    
+    <resultMap type="Salary" id="SalaryResult">
+        <result property="salaryId"    column="salaryId"    />
+        <result property="userId"    column="user_id"    />
+        <result property="salaryDate"    column="salaryDate"    />
+        <result property="sumAmount"    column="sumAmount"    />
+        <result property="delFlag"    column="delFlag"    />
+        <result property="remark"    column="remark"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <resultMap id="SalarySalaryDetailResult" type="Salary" extends="SalaryResult">
+        <collection property="salaryDetailList" ofType="SalaryDetail" column="salaryId" select="selectSalaryDetailList" />
+    </resultMap>
+
+    <resultMap type="SalaryDetail" id="SalaryDetailResult">
+        <result property="id"    column="id"    />
+        <result property="salaryId"    column="salaryId"    />
+        <result property="salarySubjectId"    column="salarySubjectId"    />
+        <result property="subjectName"    column="subjectName"    />
+        <result property="amount"    column="amount"    />
+        <result property="delFlag"    column="delFlag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectSalaryVo">
+        select salaryId, user_id, salaryDate, sumAmount, delFlag, remark, create_by, create_time, update_by, update_time from t_salary
+    </sql>
+
+    <select id="selectSalaryList" parameterType="Salary" resultMap="SalaryResult">
+        <include refid="selectSalaryVo"/>
+        <where>  
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="params.beginSalaryDate != null and params.beginSalaryDate != '' and params.endSalaryDate != null and params.endSalaryDate != ''"> and salaryDate between #{params.beginSalaryDate} and #{params.endSalaryDate}</if>
+        </where>
+    </select>
+    
+    <select id="selectSalaryBySalaryId" parameterType="Long" resultMap="SalarySalaryDetailResult">
+        select salaryId, user_id, salaryDate, sumAmount, delFlag, remark, create_by, create_time, update_by, update_time
+        from t_salary
+        where salaryId = #{salaryId}
+    </select>
+
+    <select id="selectSalaryDetailList" resultMap="SalaryDetailResult">
+        select id, salaryId, salarySubjectId, subjectName, amount, delFlag, create_by, create_time, update_by, update_time
+        from t_salary_detail
+        where salaryId = #{salaryId}
+    </select>
+
+    <insert id="insertSalary" parameterType="Salary" useGeneratedKeys="true" keyProperty="salaryId">
+        insert into t_salary
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId != null">user_id,</if>
+            <if test="salaryDate != null">salaryDate,</if>
+            <if test="sumAmount != null">sumAmount,</if>
+            <if test="delFlag != null">delFlag,</if>
+            <if test="remark != null">remark,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userId != null">#{userId},</if>
+            <if test="salaryDate != null">#{salaryDate},</if>
+            <if test="sumAmount != null">#{sumAmount},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateSalary" parameterType="Salary">
+        update t_salary
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="salaryDate != null">salaryDate = #{salaryDate},</if>
+            <if test="sumAmount != null">sumAmount = #{sumAmount},</if>
+            <if test="delFlag != null">delFlag = #{delFlag},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where salaryId = #{salaryId}
+    </update>
+
+    <delete id="deleteSalaryBySalaryId" parameterType="Long">
+        delete from t_salary where salaryId = #{salaryId}
+    </delete>
+
+    <delete id="deleteSalaryBySalaryIds" parameterType="String">
+        delete from t_salary where salaryId in 
+        <foreach item="salaryId" collection="array" open="(" separator="," close=")">
+            #{salaryId}
+        </foreach>
+    </delete>
+    
+    <delete id="deleteSalaryDetailBySalaryIds" parameterType="String">
+        delete from t_salary_detail where salaryId in 
+        <foreach item="salaryId" collection="array" open="(" separator="," close=")">
+            #{salaryId}
+        </foreach>
+    </delete>
+
+    <delete id="deleteSalaryDetailBySalaryId" parameterType="Long">
+        delete from t_salary_detail where salaryId = #{salaryId}
+    </delete>
+
+    <insert id="batchSalaryDetail">
+        insert into t_salary_detail( id, salaryId, salarySubjectId, subjectName, amount, delFlag, create_by, create_time, update_by, update_time) values
+        <foreach item="item" index="index" collection="list" separator=",">
+            ( #{item.id}, #{item.salaryId}, #{item.salarySubjectId}, #{item.subjectName}, #{item.amount}, #{item.delFlag}, #{item.createBy}, #{item.createTime}, #{item.updateBy}, #{item.updateTime})
+        </foreach>
+    </insert>
+
+</mapper>

+ 102 - 0
src/main/resources/mybatis/business/SalarySubjectMapper.xml

@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.hzy.project.business.subject.mapper.SalarySubjectMapper">
+    
+    <resultMap type="SalarySubject" id="SalarySubjectResult">
+        <result property="salarySubjectId"    column="salarySubjectId"    />
+        <result property="subjectType"    column="subjectType"    />
+        <result property="subjectName"    column="subjectName"    />
+        <result property="baseFlag"    column="baseFlag"    />
+        <result property="percent"    column="percent"    />
+        <result property="formula"    column="formula"    />
+        <result property="sort"    column="sort"    />
+        <result property="delFlag"    column="delFlag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectSalarySubjectVo">
+        select salarySubjectId, subjectType, subjectName, baseFlag, percent, formula, sort, delFlag, create_by, create_time, update_by, update_time from m_salary_subject
+    </sql>
+
+    <select id="selectSalarySubjectList" parameterType="SalarySubject" resultMap="SalarySubjectResult">
+        <include refid="selectSalarySubjectVo"/>
+        <where>  
+            <if test="subjectType != null  and subjectType != ''"> and subjectType = #{subjectType}</if>
+            <if test="subjectName != null  and subjectName != ''"> and subjectName like concat('%', #{subjectName}, '%')</if>
+            <if test="baseFlag != null  and baseFlag != ''"> and baseFlag = #{baseFlag}</if>
+            <if test="percent != null "> and percent = #{percent}</if>
+            <if test="formula != null "> and formula = #{formula}</if>
+            <if test="delFlag != null"> and delFlag = #{delFlag}</if>
+        </where>
+    </select>
+    
+    <select id="selectSalarySubjectBySalarySubjectId" parameterType="Long" resultMap="SalarySubjectResult">
+        <include refid="selectSalarySubjectVo"/>
+        where salarySubjectId = #{salarySubjectId}
+    </select>
+
+    <insert id="insertSalarySubject" parameterType="SalarySubject" useGeneratedKeys="true" keyProperty="salarySubjectId">
+        insert into m_salary_subject
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="subjectType != null">subjectType,</if>
+            <if test="subjectName != null">subjectName,</if>
+            <if test="baseFlag != null">baseFlag,</if>
+            <if test="percent != null">percent,</if>
+            <if test="formula != null">formula,</if>
+            <if test="sort != null">sort,</if>
+            <if test="delFlag != null">delFlag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="subjectType != null">#{subjectType},</if>
+            <if test="subjectName != null">#{subjectName},</if>
+            <if test="baseFlag != null">#{baseFlag},</if>
+            <if test="percent != null">#{percent},</if>
+            <if test="formula != null">#{formula},</if>
+            <if test="sort != null">#{sort},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateSalarySubject" parameterType="SalarySubject">
+        update m_salary_subject
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="subjectType != null">subjectType = #{subjectType},</if>
+            <if test="subjectName != null">subjectName = #{subjectName},</if>
+            <if test="baseFlag != null">baseFlag = #{baseFlag},</if>
+            <if test="percent != null">percent = #{percent},</if>
+            <if test="formula != null">formula = #{formula},</if>
+            <if test="sort != null">sort = #{sort},</if>
+            <if test="delFlag != null">delFlag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where salarySubjectId = #{salarySubjectId}
+    </update>
+
+    <delete id="deleteSalarySubjectBySalarySubjectId" parameterType="Long">
+        delete from m_salary_subject where salarySubjectId = #{salarySubjectId}
+    </delete>
+
+    <delete id="deleteSalarySubjectBySalarySubjectIds" parameterType="String">
+        delete from m_salary_subject where salarySubjectId in 
+        <foreach item="salarySubjectId" collection="array" open="(" separator="," close=")">
+            #{salarySubjectId}
+        </foreach>
+    </delete>
+
+</mapper>

+ 102 - 0
src/main/resources/mybatis/business/UserBalanceMapper.xml

@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.hzy.project.business.balance.mapper.UserBalanceMapper">
+    
+    <resultMap type="UserBalance" id="UserBalanceResult">
+        <result property="balanceId"    column="balanceId"    />
+        <result property="userId"    column="user_id"    />
+        <result property="duration"    column="duration"    />
+        <result property="openingBalance"    column="openingBalance"    />
+        <result property="income"    column="income"    />
+        <result property="payment"    column="payment"    />
+        <result property="closingBalance"    column="closingBalance"    />
+        <result property="delFlag"    column="delFlag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectUserBalanceVo">
+        select balanceId, user_id, duration, openingBalance, income, payment, closingBalance, delFlag, create_by, create_time, update_by, update_time from m_user_balance
+    </sql>
+
+    <select id="selectUserBalanceList" parameterType="UserBalance" resultMap="UserBalanceResult">
+        <include refid="selectUserBalanceVo"/>
+        <where>  
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="duration != null  and duration != ''"> and duration = #{duration}</if>
+            <if test="openingBalance != null "> and openingBalance = #{openingBalance}</if>
+            <if test="income != null "> and income = #{income}</if>
+            <if test="payment != null "> and payment = #{payment}</if>
+            <if test="closingBalance != null "> and closingBalance = #{closingBalance}</if>
+        </where>
+    </select>
+    
+    <select id="selectUserBalanceByBalanceId" parameterType="Long" resultMap="UserBalanceResult">
+        <include refid="selectUserBalanceVo"/>
+        where balanceId = #{balanceId}
+    </select>
+
+    <insert id="insertUserBalance" parameterType="UserBalance" useGeneratedKeys="true" keyProperty="balanceId">
+        insert into m_user_balance
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId != null">user_id,</if>
+            <if test="duration != null">duration,</if>
+            <if test="openingBalance != null">openingBalance,</if>
+            <if test="income != null">income,</if>
+            <if test="payment != null">payment,</if>
+            <if test="closingBalance != null">closingBalance,</if>
+            <if test="delFlag != null">delFlag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userId != null">#{userId},</if>
+            <if test="duration != null">#{duration},</if>
+            <if test="openingBalance != null">#{openingBalance},</if>
+            <if test="income != null">#{income},</if>
+            <if test="payment != null">#{payment},</if>
+            <if test="closingBalance != null">#{closingBalance},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateUserBalance" parameterType="UserBalance">
+        update m_user_balance
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="duration != null">duration = #{duration},</if>
+            <if test="openingBalance != null">openingBalance = #{openingBalance},</if>
+            <if test="income != null">income = #{income},</if>
+            <if test="payment != null">payment = #{payment},</if>
+            <if test="closingBalance != null">closingBalance = #{closingBalance},</if>
+            <if test="delFlag != null">delFlag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where balanceId = #{balanceId}
+    </update>
+
+    <delete id="deleteUserBalanceByBalanceId" parameterType="Long">
+        delete from m_user_balance where balanceId = #{balanceId}
+    </delete>
+
+    <delete id="deleteUserBalanceByBalanceIds" parameterType="String">
+        delete from m_user_balance where balanceId in 
+        <foreach item="balanceId" collection="array" open="(" separator="," close=")">
+            #{balanceId}
+        </foreach>
+    </delete>
+
+</mapper>

+ 65 - 0
src/main/resources/templates/business/balance/add.html

@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('新增用户结余')" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-balance-add">
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">用户ID:</label>
+                    <div class="col-sm-8">
+                        <input name="userId" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">期初数:</label>
+                    <div class="col-sm-8">
+                        <input name="openingBalance" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">收入:</label>
+                    <div class="col-sm-8">
+                        <input name="income" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">支出:</label>
+                    <div class="col-sm-8">
+                        <input name="payment" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">期末数:</label>
+                    <div class="col-sm-8">
+                        <input name="closingBalance" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var prefix = ctx + "business/balance"
+        $("#form-balance-add").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/add", $('#form-balance-add').serialize());
+            }
+        }
+    </script>
+</body>
+</html>

+ 122 - 0
src/main/resources/templates/business/balance/balance.html

@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+    <th:block th:include="include :: header('用户结余列表')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="formId">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+                                <label>用户ID:</label>
+                                <input type="text" name="userId"/>
+                            </li>
+                            <li>
+                                <label>期初数:</label>
+                                <input type="text" name="openingBalance"/>
+                            </li>
+                            <li>
+                                <label>收入:</label>
+                                <input type="text" name="income"/>
+                            </li>
+                            <li>
+                                <label>支出:</label>
+                                <input type="text" name="payment"/>
+                            </li>
+                            <li>
+                                <label>期末数:</label>
+                                <input type="text" name="closingBalance"/>
+                            </li>
+                            <li>
+                                <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+                                <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+                            </li>
+                        </ul>
+                    </div>
+                </form>
+            </div>
+
+            <div class="btn-group-sm" id="toolbar" role="group">
+                <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="business:balance:add">
+                    <i class="fa fa-plus"></i> 添加
+                </a>
+                <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="business:balance:edit">
+                    <i class="fa fa-edit"></i> 修改
+                </a>
+                <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="business:balance:remove">
+                    <i class="fa fa-remove"></i> 删除
+                </a>
+                <a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="business:balance:export">
+                    <i class="fa fa-download"></i> 导出
+                </a>
+            </div>
+            <div class="col-sm-12 select-table table-striped">
+                <table id="bootstrap-table"></table>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var editFlag = [[${@permission.hasPermi('business:balance:edit')}]];
+        var removeFlag = [[${@permission.hasPermi('business:balance:remove')}]];
+        var prefix = ctx + "business/balance";
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                updateUrl: prefix + "/edit/{id}",
+                removeUrl: prefix + "/remove",
+                exportUrl: prefix + "/export",
+                modalName: "用户结余",
+                columns: [{
+                    checkbox: true
+                },
+                {
+                    field: 'balanceId',
+                    title: '主键',
+                    visible: false
+                },
+                {
+                    field: 'userId',
+                    title: '用户ID'
+                },
+                {
+                    field: 'duration',
+                    title: '结余周期'
+                },
+                {
+                    field: 'openingBalance',
+                    title: '期初数'
+                },
+                {
+                    field: 'income',
+                    title: '收入'
+                },
+                {
+                    field: 'payment',
+                    title: '支出'
+                },
+                {
+                    field: 'closingBalance',
+                    title: '期末数'
+                },
+                {
+                    title: '操作',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        var actions = [];
+                        actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.balanceId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.balanceId + '\')"><i class="fa fa-remove"></i>删除</a>');
+                        return actions.join('');
+                    }
+                }]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>

+ 66 - 0
src/main/resources/templates/business/balance/edit.html

@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('修改用户结余')" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-balance-edit" th:object="${userBalance}">
+            <input name="balanceId" th:field="*{balanceId}" type="hidden">
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">用户ID:</label>
+                    <div class="col-sm-8">
+                        <input name="userId" th:field="*{userId}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">期初数:</label>
+                    <div class="col-sm-8">
+                        <input name="openingBalance" th:field="*{openingBalance}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">收入:</label>
+                    <div class="col-sm-8">
+                        <input name="income" th:field="*{income}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">支出:</label>
+                    <div class="col-sm-8">
+                        <input name="payment" th:field="*{payment}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">期末数:</label>
+                    <div class="col-sm-8">
+                        <input name="closingBalance" th:field="*{closingBalance}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var prefix = ctx + "business/balance";
+        $("#form-balance-edit").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/edit", $('#form-balance-edit').serialize());
+            }
+        }
+    </script>
+</body>
+</html>

+ 33 - 0
src/main/resources/templates/business/customer/add.html

@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('新增客户')" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-customer-add">
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">客户名:</label>
+                    <div class="col-sm-8">
+                        <input name="customerName" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var prefix = ctx + "business/customer"
+        $("#form-customer-add").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/add", $('#form-customer-add').serialize());
+            }
+        }
+    </script>
+</body>
+</html>

+ 86 - 0
src/main/resources/templates/business/customer/customer.html

@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+    <th:block th:include="include :: header('客户列表')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="formId">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+                                <label>客户名:</label>
+                                <input type="text" name="customerName"/>
+                            </li>
+                            <li>
+                                <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+                                <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+                            </li>
+                        </ul>
+                    </div>
+                </form>
+            </div>
+
+            <div class="btn-group-sm" id="toolbar" role="group">
+                <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="business:customer:add">
+                    <i class="fa fa-plus"></i> 添加
+                </a>
+                <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="business:customer:edit">
+                    <i class="fa fa-edit"></i> 修改
+                </a>
+                <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="business:customer:remove">
+                    <i class="fa fa-remove"></i> 删除
+                </a>
+                <a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="business:customer:export">
+                    <i class="fa fa-download"></i> 导出
+                </a>
+            </div>
+            <div class="col-sm-12 select-table table-striped">
+                <table id="bootstrap-table"></table>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var editFlag = [[${@permission.hasPermi('business:customer:edit')}]];
+        var removeFlag = [[${@permission.hasPermi('business:customer:remove')}]];
+        var prefix = ctx + "business/customer";
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                updateUrl: prefix + "/edit/{id}",
+                removeUrl: prefix + "/remove",
+                exportUrl: prefix + "/export",
+                modalName: "客户",
+                columns: [{
+                    checkbox: true
+                },
+                {
+                    field: 'customerId',
+                    title: '客户主键',
+                    visible: false
+                },
+                {
+                    field: 'customerName',
+                    title: '客户名'
+                },
+                {
+                    title: '操作',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        var actions = [];
+                        actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.customerId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.customerId + '\')"><i class="fa fa-remove"></i>删除</a>');
+                        return actions.join('');
+                    }
+                }]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>

+ 34 - 0
src/main/resources/templates/business/customer/edit.html

@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('修改客户')" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-customer-edit" th:object="${customer}">
+            <input name="customerId" th:field="*{customerId}" type="hidden">
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">客户名:</label>
+                    <div class="col-sm-8">
+                        <input name="customerName" th:field="*{customerName}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var prefix = ctx + "business/customer";
+        $("#form-customer-edit").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/edit", $('#form-customer-edit').serialize());
+            }
+        }
+    </script>
+</body>
+</html>

+ 102 - 0
src/main/resources/templates/business/income/add.html

@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('新增收入')" />
+    <th:block th:include="include :: datetimepicker-css" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-income-add">
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">客户:</label>
+                    <div class="col-sm-8">
+                        <input name="customerId" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">收入日期:</label>
+                    <div class="col-sm-8">
+                        <div class="input-group date">
+                            <input name="incomeDate" class="form-control" placeholder="yyyy-MM-dd" type="text">
+                            <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">收入类目:</label>
+                    <div class="col-sm-8">
+                        <select name="incomeType" class="form-control" th:with="type=${@dict.getType('income_type')}">
+                            <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">收入总金额:</label>
+                    <div class="col-sm-8">
+                        <input name="grossAmount" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">净收入:</label>
+                    <div class="col-sm-8">
+                        <input name="netAmount" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">税额:</label>
+                    <div class="col-sm-8">
+                        <input name="taxAmount" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">税率:</label>
+                    <div class="col-sm-8">
+                        <input name="rate" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">备注:</label>
+                    <div class="col-sm-8">
+                        <textarea name="remark" class="form-control"></textarea>
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: datetimepicker-js" />
+    <script th:inline="javascript">
+        var prefix = ctx + "business/income"
+        $("#form-income-add").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/add", $('#form-income-add').serialize());
+            }
+        }
+
+        $("input[name='incomeDate']").datetimepicker({
+            format: "yyyy-mm-dd",
+            minView: "month",
+            autoclose: true
+        });
+    </script>
+</body>
+</html>

+ 103 - 0
src/main/resources/templates/business/income/edit.html

@@ -0,0 +1,103 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('修改收入')" />
+    <th:block th:include="include :: datetimepicker-css" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-income-edit" th:object="${income}">
+            <input name="incomeId" th:field="*{incomeId}" type="hidden">
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">客户:</label>
+                    <div class="col-sm-8">
+                        <input name="customerId" th:field="*{customerId}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">收入日期:</label>
+                    <div class="col-sm-8">
+                        <div class="input-group date">
+                            <input name="incomeDate" th:value="${#dates.format(income.incomeDate, 'yyyy-MM-dd')}" class="form-control" placeholder="yyyy-MM-dd" type="text">
+                            <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">收入类目:</label>
+                    <div class="col-sm-8">
+                        <select name="incomeType" class="form-control" th:with="type=${@dict.getType('income_type')}">
+                            <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{incomeType}"></option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">收入总金额:</label>
+                    <div class="col-sm-8">
+                        <input name="grossAmount" th:field="*{grossAmount}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">净收入:</label>
+                    <div class="col-sm-8">
+                        <input name="netAmount" th:field="*{netAmount}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">税额:</label>
+                    <div class="col-sm-8">
+                        <input name="taxAmount" th:field="*{taxAmount}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">税率:</label>
+                    <div class="col-sm-8">
+                        <input name="rate" th:field="*{rate}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">备注:</label>
+                    <div class="col-sm-8">
+                        <textarea name="remark" class="form-control">[[*{remark}]]</textarea>
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: datetimepicker-js" />
+    <script th:inline="javascript">
+        var prefix = ctx + "business/income";
+        $("#form-income-edit").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/edit", $('#form-income-edit').serialize());
+            }
+        }
+
+        $("input[name='incomeDate']").datetimepicker({
+            format: "yyyy-mm-dd",
+            minView: "month",
+            autoclose: true
+        });
+    </script>
+</body>
+</html>

+ 145 - 0
src/main/resources/templates/business/income/income.html

@@ -0,0 +1,145 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+    <th:block th:include="include :: header('收入列表')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="formId">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+                                <label>客户:</label>
+                                <input type="text" name="customerId"/>
+                            </li>
+                            <li>
+                                <label>收入日期:</label>
+                                <input type="text" class="time-input" placeholder="请选择收入日期" name="incomeDate"/>
+                            </li>
+                            <li>
+                                <label>收入类目:</label>
+                                <select name="incomeType" th:with="type=${@dict.getType('income_type')}">
+                                    <option value="">所有</option>
+                                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                                </select>
+                            </li>
+                            <li>
+                                <label>收入总金额:</label>
+                                <input type="text" name="grossAmount"/>
+                            </li>
+                            <li>
+                                <label>净收入:</label>
+                                <input type="text" name="netAmount"/>
+                            </li>
+                            <li>
+                                <label>税额:</label>
+                                <input type="text" name="taxAmount"/>
+                            </li>
+                            <li>
+                                <label>税率:</label>
+                                <input type="text" name="rate"/>
+                            </li>
+                            <li>
+                                <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+                                <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+                            </li>
+                        </ul>
+                    </div>
+                </form>
+            </div>
+
+            <div class="btn-group-sm" id="toolbar" role="group">
+                <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="business:income:add">
+                    <i class="fa fa-plus"></i> 添加
+                </a>
+                <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="business:income:edit">
+                    <i class="fa fa-edit"></i> 修改
+                </a>
+                <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="business:income:remove">
+                    <i class="fa fa-remove"></i> 删除
+                </a>
+                <a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="business:income:export">
+                    <i class="fa fa-download"></i> 导出
+                </a>
+            </div>
+            <div class="col-sm-12 select-table table-striped">
+                <table id="bootstrap-table"></table>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var editFlag = [[${@permission.hasPermi('business:income:edit')}]];
+        var removeFlag = [[${@permission.hasPermi('business:income:remove')}]];
+        var incomeTypeDatas = [[${@dict.getType('income_type')}]];
+        var prefix = ctx + "business/income";
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                updateUrl: prefix + "/edit/{id}",
+                removeUrl: prefix + "/remove",
+                exportUrl: prefix + "/export",
+                modalName: "收入",
+                columns: [{
+                    checkbox: true
+                },
+                {
+                    field: 'incomeId',
+                    title: '主键',
+                    visible: false
+                },
+                {
+                    field: 'customerId',
+                    title: '客户'
+                },
+                {
+                    field: 'incomeDate',
+                    title: '收入日期'
+                },
+                {
+                    field: 'incomeType',
+                    title: '收入类目',
+                    formatter: function(value, row, index) {
+                       return $.table.selectDictLabel(incomeTypeDatas, value);
+                    }
+                },
+                {
+                    field: 'grossAmount',
+                    title: '收入总金额'
+                },
+                {
+                    field: 'netAmount',
+                    title: '净收入'
+                },
+                {
+                    field: 'taxAmount',
+                    title: '税额'
+                },
+                {
+                    field: 'rate',
+                    title: '税率'
+                },
+                {
+                    field: 'remark',
+                    title: '备注'
+                },
+                {
+                    title: '操作',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        var actions = [];
+                        actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.incomeId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.incomeId + '\')"><i class="fa fa-remove"></i>删除</a>');
+                        return actions.join('');
+                    }
+                }]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>

+ 137 - 0
src/main/resources/templates/business/invoice/add.html

@@ -0,0 +1,137 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('新增发票')" />
+    <th:block th:include="include :: datetimepicker-css" />
+    <th:block th:include="include :: bootstrap-fileinput-css"/>
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-invoice-add">
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">用户ID:</label>
+                    <div class="col-sm-8">
+                        <input name="userId" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">发票日期:</label>
+                    <div class="col-sm-8">
+                        <div class="input-group date">
+                            <input name="invoiceDate" class="form-control" placeholder="yyyy-MM-dd" type="text">
+                            <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">发票文件路径:</label>
+                    <div class="col-sm-8">
+                        <input type="hidden" name="invoiceUrl">
+                        <div class="file-loading">
+                            <input class="form-control file-upload" id="invoiceUrl" name="file" type="file">
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">发票金额:</label>
+                    <div class="col-sm-8">
+                        <input name="grossAmount" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">发票状态:</label>
+                    <div class="col-sm-8">
+                        <div class="radio-box" th:each="dict : ${@dict.getType('invoice_status')}">
+                            <input type="radio" th:id="${'invoiceStatus_' + dict.dictCode}" name="invoiceStatus" th:value="${dict.dictValue}" th:checked="${dict.default}">
+                            <label th:for="${'invoiceStatus_' + dict.dictCode}" th:text="${dict.dictLabel}"></label>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">所得税标记:</label>
+                    <div class="col-sm-8">
+                        <select name="incomeTaxFlag" class="form-control" th:with="type=${@dict.getType('sys_yes_no')}">
+                            <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">所得税税率:</label>
+                    <div class="col-sm-8">
+                        <input name="incomeTaxRate" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">报销日期:</label>
+                    <div class="col-sm-8">
+                        <div class="input-group date">
+                            <input name="reimbursementDate" class="form-control" placeholder="yyyy-MM-dd" type="text">
+                            <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">备注:</label>
+                    <div class="col-sm-8">
+                        <textarea name="remark" class="form-control"></textarea>
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: datetimepicker-js" />
+    <th:block th:include="include :: bootstrap-fileinput-js"/>
+    <script th:inline="javascript">
+        var prefix = ctx + "business/invoice"
+        $("#form-invoice-add").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/add", $('#form-invoice-add').serialize());
+            }
+        }
+
+        $("input[name='invoiceDate']").datetimepicker({
+            format: "yyyy-mm-dd",
+            minView: "month",
+            autoclose: true
+        });
+
+        $("input[name='reimbursementDate']").datetimepicker({
+            format: "yyyy-mm-dd",
+            minView: "month",
+            autoclose: true
+        });
+
+        $(".file-upload").fileinput({
+            uploadUrl: ctx + 'common/upload',
+            maxFileCount: 1,
+            autoReplace: true
+        }).on('fileuploaded', function (event, data, previewId, index) {
+            $("input[name='" + event.currentTarget.id + "']").val(data.response.url)
+        }).on('fileremoved', function (event, id, index) {
+            $("input[name='" + event.currentTarget.id + "']").val('')
+        })
+    </script>
+</body>
+</html>

+ 144 - 0
src/main/resources/templates/business/invoice/edit.html

@@ -0,0 +1,144 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('修改发票')" />
+    <th:block th:include="include :: datetimepicker-css" />
+    <th:block th:include="include :: bootstrap-fileinput-css"/>
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-invoice-edit" th:object="${invoice}">
+            <input name="invoiceId" th:field="*{invoiceId}" type="hidden">
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">用户ID:</label>
+                    <div class="col-sm-8">
+                        <input name="userId" th:field="*{userId}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">发票日期:</label>
+                    <div class="col-sm-8">
+                        <div class="input-group date">
+                            <input name="invoiceDate" th:value="${#dates.format(invoice.invoiceDate, 'yyyy-MM-dd')}" class="form-control" placeholder="yyyy-MM-dd" type="text">
+                            <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">发票文件路径:</label>
+                    <div class="col-sm-8">
+                        <input type="hidden" name="invoiceUrl" th:field="*{invoiceUrl}">
+                       <div class="file-loading">
+                            <input class="form-control file-upload" id="invoiceUrl" name="file" type="file">
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">发票金额:</label>
+                    <div class="col-sm-8">
+                        <input name="grossAmount" th:field="*{grossAmount}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">发票状态:</label>
+                    <div class="col-sm-8">
+                        <div class="radio-box" th:each="dict : ${@dict.getType('invoice_status')}">
+                            <input type="radio" th:id="${'invoiceStatus_' + dict.dictCode}" name="invoiceStatus" th:value="${dict.dictValue}" th:field="*{invoiceStatus}">
+                            <label th:for="${'invoiceStatus_' + dict.dictCode}" th:text="${dict.dictLabel}"></label>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">所得税标记:</label>
+                    <div class="col-sm-8">
+                        <select name="incomeTaxFlag" class="form-control" th:with="type=${@dict.getType('sys_yes_no')}">
+                            <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{incomeTaxFlag}"></option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">所得税税率:</label>
+                    <div class="col-sm-8">
+                        <input name="incomeTaxRate" th:field="*{incomeTaxRate}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">报销日期:</label>
+                    <div class="col-sm-8">
+                        <div class="input-group date">
+                            <input name="reimbursementDate" th:value="${#dates.format(invoice.reimbursementDate, 'yyyy-MM-dd')}" class="form-control" placeholder="yyyy-MM-dd" type="text">
+                            <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">备注:</label>
+                    <div class="col-sm-8">
+                        <textarea name="remark" class="form-control">[[*{remark}]]</textarea>
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: datetimepicker-js" />
+    <th:block th:include="include :: bootstrap-fileinput-js"/>
+    <script th:inline="javascript">
+        var prefix = ctx + "business/invoice";
+        $("#form-invoice-edit").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/edit", $('#form-invoice-edit').serialize());
+            }
+        }
+
+        $("input[name='invoiceDate']").datetimepicker({
+            format: "yyyy-mm-dd",
+            minView: "month",
+            autoclose: true
+        });
+
+        $("input[name='reimbursementDate']").datetimepicker({
+            format: "yyyy-mm-dd",
+            minView: "month",
+            autoclose: true
+        });
+
+        $(".file-upload").each(function (i) {
+            var val = $("input[name='" + this.id + "']").val()
+            $(this).fileinput({
+                'uploadUrl': ctx + 'common/upload',
+                initialPreviewAsData: true,
+                initialPreview: [val],
+                maxFileCount: 1,
+                autoReplace: true
+            }).on('fileuploaded', function (event, data, previewId, index) {
+                $("input[name='" + event.currentTarget.id + "']").val(data.response.url)
+            }).on('fileremoved', function (event, id, index) {
+                $("input[name='" + event.currentTarget.id + "']").val('')
+            })
+            $(this).fileinput('_initFileActions');
+        });
+    </script>
+</body>
+</html>

+ 158 - 0
src/main/resources/templates/business/invoice/invoice.html

@@ -0,0 +1,158 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+    <th:block th:include="include :: header('发票列表')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="formId">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+                                <label>用户ID:</label>
+                                <input type="text" name="userId"/>
+                            </li>
+                            <li>
+                                <label>发票日期:</label>
+                                <input type="text" class="time-input" placeholder="请选择发票日期" name="invoiceDate"/>
+                            </li>
+                            <li>
+                                <label>发票金额:</label>
+                                <input type="text" name="grossAmount"/>
+                            </li>
+                            <li>
+                                <label>发票状态:</label>
+                                <select name="invoiceStatus" th:with="type=${@dict.getType('invoice_status')}">
+                                    <option value="">所有</option>
+                                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                                </select>
+                            </li>
+                            <li>
+                                <label>所得税标记:</label>
+                                <select name="incomeTaxFlag" th:with="type=${@dict.getType('sys_yes_no')}">
+                                    <option value="">所有</option>
+                                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                                </select>
+                            </li>
+                            <li>
+                                <label>所得税税率:</label>
+                                <input type="text" name="incomeTaxRate"/>
+                            </li>
+                            <li class="select-time">
+                                <label>报销日期:</label>
+                                <input type="text" class="time-input" id="startTime" placeholder="开始时间" name="params[beginReimbursementDate]"/>
+                                <span>-</span>
+                                <input type="text" class="time-input" id="endTime" placeholder="结束时间" name="params[endReimbursementDate]"/>
+                            </li>
+                            <li>
+                                <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+                                <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+                            </li>
+                        </ul>
+                    </div>
+                </form>
+            </div>
+
+            <div class="btn-group-sm" id="toolbar" role="group">
+                <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="business:invoice:add">
+                    <i class="fa fa-plus"></i> 添加
+                </a>
+                <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="business:invoice:edit">
+                    <i class="fa fa-edit"></i> 修改
+                </a>
+                <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="business:invoice:remove">
+                    <i class="fa fa-remove"></i> 删除
+                </a>
+                <a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="business:invoice:export">
+                    <i class="fa fa-download"></i> 导出
+                </a>
+            </div>
+            <div class="col-sm-12 select-table table-striped">
+                <table id="bootstrap-table"></table>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var editFlag = [[${@permission.hasPermi('business:invoice:edit')}]];
+        var removeFlag = [[${@permission.hasPermi('business:invoice:remove')}]];
+        var invoiceStatusDatas = [[${@dict.getType('invoice_status')}]];
+        var incomeTaxFlagDatas = [[${@dict.getType('sys_yes_no')}]];
+        var prefix = ctx + "business/invoice";
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                updateUrl: prefix + "/edit/{id}",
+                removeUrl: prefix + "/remove",
+                exportUrl: prefix + "/export",
+                modalName: "发票",
+                columns: [{
+                    checkbox: true
+                },
+                {
+                    field: 'invoiceId',
+                    title: '主键',
+                    visible: false
+                },
+                {
+                    field: 'userId',
+                    title: '用户ID'
+                },
+                {
+                    field: 'invoiceDate',
+                    title: '发票日期'
+                },
+                {
+                    field: 'invoiceUrl',
+                    title: '发票文件路径'
+                },
+                {
+                    field: 'grossAmount',
+                    title: '发票金额'
+                },
+                {
+                    field: 'invoiceStatus',
+                    title: '发票状态',
+                    formatter: function(value, row, index) {
+                       return $.table.selectDictLabel(invoiceStatusDatas, value);
+                    }
+                },
+                {
+                    field: 'incomeTaxFlag',
+                    title: '所得税标记',
+                    formatter: function(value, row, index) {
+                       return $.table.selectDictLabel(incomeTaxFlagDatas, value);
+                    }
+                },
+                {
+                    field: 'incomeTaxRate',
+                    title: '所得税税率'
+                },
+                {
+                    field: 'reimbursementDate',
+                    title: '报销日期'
+                },
+                {
+                    field: 'remark',
+                    title: '备注'
+                },
+                {
+                    title: '操作',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        var actions = [];
+                        actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.invoiceId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.invoiceId + '\')"><i class="fa fa-remove"></i>删除</a>');
+                        return actions.join('');
+                    }
+                }]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>

+ 76 - 0
src/main/resources/templates/business/payment/add.html

@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('新增支出')" />
+    <th:block th:include="include :: datetimepicker-css" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-payment-add">
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">支付时间:</label>
+                    <div class="col-sm-8">
+                        <div class="input-group date">
+                            <input name="payDate" class="form-control" placeholder="yyyy-MM-dd" type="text">
+                            <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">支付金额:</label>
+                    <div class="col-sm-8">
+                        <input name="payAmount" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">支付对象ID:</label>
+                    <div class="col-sm-8">
+                        <input name="userId" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">备注:</label>
+                    <div class="col-sm-8">
+                        <textarea name="remark" class="form-control"></textarea>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">删除标志:</label>
+                    <div class="col-sm-8">
+                        <input name="delFlag" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: datetimepicker-js" />
+    <script th:inline="javascript">
+        var prefix = ctx + "business/payment"
+        $("#form-payment-add").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/add", $('#form-payment-add').serialize());
+            }
+        }
+
+        $("input[name='payDate']").datetimepicker({
+            format: "yyyy-mm-dd",
+            minView: "month",
+            autoclose: true
+        });
+    </script>
+</body>
+</html>

+ 77 - 0
src/main/resources/templates/business/payment/edit.html

@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('修改支出')" />
+    <th:block th:include="include :: datetimepicker-css" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-payment-edit" th:object="${payment}">
+            <input name="paymentId" th:field="*{paymentId}" type="hidden">
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">支付时间:</label>
+                    <div class="col-sm-8">
+                        <div class="input-group date">
+                            <input name="payDate" th:value="${#dates.format(payment.payDate, 'yyyy-MM-dd')}" class="form-control" placeholder="yyyy-MM-dd" type="text">
+                            <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">支付金额:</label>
+                    <div class="col-sm-8">
+                        <input name="payAmount" th:field="*{payAmount}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">支付对象ID:</label>
+                    <div class="col-sm-8">
+                        <input name="userId" th:field="*{userId}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">备注:</label>
+                    <div class="col-sm-8">
+                        <textarea name="remark" class="form-control">[[*{remark}]]</textarea>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">删除标志:</label>
+                    <div class="col-sm-8">
+                        <input name="delFlag" th:field="*{delFlag}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: datetimepicker-js" />
+    <script th:inline="javascript">
+        var prefix = ctx + "business/payment";
+        $("#form-payment-edit").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/edit", $('#form-payment-edit').serialize());
+            }
+        }
+
+        $("input[name='payDate']").datetimepicker({
+            format: "yyyy-mm-dd",
+            minView: "month",
+            autoclose: true
+        });
+    </script>
+</body>
+</html>

+ 118 - 0
src/main/resources/templates/business/payment/payment.html

@@ -0,0 +1,118 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+    <th:block th:include="include :: header('支出列表')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="formId">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+                                <label>支付时间:</label>
+                                <input type="text" class="time-input" placeholder="请选择支付时间" name="payDate"/>
+                            </li>
+                            <li>
+                                <label>支付金额:</label>
+                                <input type="text" name="payAmount"/>
+                            </li>
+                            <li>
+                                <label>支付对象ID:</label>
+                                <input type="text" name="userId"/>
+                            </li>
+                            <li>
+                                <label>删除标志:</label>
+                                <input type="text" name="delFlag"/>
+                            </li>
+                            <li>
+                                <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+                                <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+                            </li>
+                        </ul>
+                    </div>
+                </form>
+            </div>
+
+            <div class="btn-group-sm" id="toolbar" role="group">
+                <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="business:payment:add">
+                    <i class="fa fa-plus"></i> 添加
+                </a>
+                <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="business:payment:edit">
+                    <i class="fa fa-edit"></i> 修改
+                </a>
+                <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="business:payment:remove">
+                    <i class="fa fa-remove"></i> 删除
+                </a>
+                <a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="business:payment:export">
+                    <i class="fa fa-download"></i> 导出
+                </a>
+            </div>
+            <div class="col-sm-12 select-table table-striped">
+                <table id="bootstrap-table"></table>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var editFlag = [[${@permission.hasPermi('business:payment:edit')}]];
+        var removeFlag = [[${@permission.hasPermi('business:payment:remove')}]];
+        var prefix = ctx + "business/payment";
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                updateUrl: prefix + "/edit/{id}",
+                removeUrl: prefix + "/remove",
+                exportUrl: prefix + "/export",
+                modalName: "支出",
+                columns: [{
+                    checkbox: true
+                },
+                {
+                    field: 'paymentId',
+                    title: '主键',
+                    visible: false
+                },
+                {
+                    field: 'payDate',
+                    title: '支付时间'
+                },
+                {
+                    field: 'payAmount',
+                    title: '支付金额'
+                },
+                {
+                    field: 'payType',
+                    title: '支付原因'
+                },
+                {
+                    field: 'userId',
+                    title: '支付对象ID'
+                },
+                {
+                    field: 'remark',
+                    title: '备注'
+                },
+                {
+                    field: 'delFlag',
+                    title: '删除标志'
+                },
+                {
+                    title: '操作',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        var actions = [];
+                        actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.paymentId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.paymentId + '\')"><i class="fa fa-remove"></i>删除</a>');
+                        return actions.join('');
+                    }
+                }]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>

+ 191 - 0
src/main/resources/templates/business/salary/add.html

@@ -0,0 +1,191 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('新增工资')" />
+    <th:block th:include="include :: datetimepicker-css" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-salary-add">
+            <h4 class="form-header h4">工资信息</h4>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">用户:</label>
+                    <div class="col-sm-8">
+                        <input name="userId" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">工资日期:</label>
+                    <div class="col-sm-8">
+                        <div class="input-group date">
+                            <input name="salaryDate" class="form-control" placeholder="yyyy-MM-dd" type="text">
+                            <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">工资总金额:</label>
+                    <div class="col-sm-8">
+                        <input name="sumAmount" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <h4 class="form-header h4">工资明细信息</h4>
+            <div class="row">
+                <div class="col-xs-12">
+                    <button type="button" class="btn btn-white btn-sm" onclick="addRow()"><i class="fa fa-plus"> 增加</i></button>
+                    <button type="button" class="btn btn-white btn-sm" onclick="sub.delRow()"><i class="fa fa-minus"> 删除</i></button>
+                    <div class="col-sm-12 select-table table-striped">
+                        <table id="bootstrap-table"></table>
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: datetimepicker-js" />
+    <script th:inline="javascript">
+        var prefix = ctx + "business/salary"
+        $("#form-salary-add").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/add", $('#form-salary-add').serialize());
+            }
+        }
+
+        $("input[name='salaryDate']").datetimepicker({
+            format: "yyyy-mm-dd",
+            minView: "month",
+            autoclose: true
+        });
+
+        $(function() {
+            var options = {
+                pagination: false,
+                showSearch: false,
+                showRefresh: false,
+                showToggle: false,
+                showColumns: false,
+                sidePagination: "client",
+                columns: [{
+                    checkbox: true
+                },
+                {
+                    field: 'index',
+                    align: 'center',
+                    title: "序号",
+                    formatter: function (value, row, index) {
+                    	var columnIndex = $.common.sprintf("<input type='hidden' name='index' value='%s'>", $.table.serialNumber(index));
+                    	return columnIndex + $.table.serialNumber(index);
+                    }
+                },
+                {
+                    field: 'salarySubjectId',
+                    align: 'center',
+                    title: '工资科目',
+                    formatter: function(value, row, index) {
+                        var html = $.common.sprintf("<input class='form-control' type='text' name='salaryDetailList[%s].salarySubjectId' value='%s'>", index, value);
+                        return html;
+                    }
+                },
+                {
+                    field: 'subjectName',
+                    align: 'center',
+                    title: '科目名',
+                    formatter: function(value, row, index) {
+                        var html = $.common.sprintf("<input class='form-control' type='text' name='salaryDetailList[%s].subjectName' value='%s'>", index, value);
+                        return html;
+                    }
+                },
+                {
+                    field: 'amount',
+                    align: 'center',
+                    title: '金额',
+                    formatter: function(value, row, index) {
+                        var html = $.common.sprintf("<input class='form-control' type='text' name='salaryDetailList[%s].amount' value='%s'>", index, value);
+                        return html;
+                    }
+                },
+                {
+                    field: 'delFlag',
+                    align: 'center',
+                    title: '删除标志',
+                    formatter: function(value, row, index) {
+                        var html = $.common.sprintf("<input class='form-control' type='text' name='salaryDetailList[%s].delFlag' value='%s'>", index, value);
+                        return html;
+                    }
+                },
+                {
+                    field: 'createBy',
+                    align: 'center',
+                    title: '创建者',
+                    formatter: function(value, row, index) {
+                        var html = $.common.sprintf("<input class='form-control' type='text' name='salaryDetailList[%s].createBy' value='%s'>", index, value);
+                        return html;
+                    }
+                },
+                {
+                    field: 'createTime',
+                    align: 'center',
+                    title: '创建时间',
+                    formatter: function(value, row, index) {
+                        var html = $.common.sprintf("<input class='form-control' type='text' name='salaryDetailList[%s].createTime' value='%s'>", index, value);
+                        return html;
+                    }
+                },
+                {
+                    field: 'updateBy',
+                    align: 'center',
+                    title: '更新者',
+                    formatter: function(value, row, index) {
+                        var html = $.common.sprintf("<input class='form-control' type='text' name='salaryDetailList[%s].updateBy' value='%s'>", index, value);
+                        return html;
+                    }
+                },
+                {
+                    field: 'updateTime',
+                    align: 'center',
+                    title: '更新时间',
+                    formatter: function(value, row, index) {
+                        var html = $.common.sprintf("<input class='form-control' type='text' name='salaryDetailList[%s].updateTime' value='%s'>", index, value);
+                        return html;
+                    }
+                },
+                {
+                    title: '操作',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        var value = $.common.isNotEmpty(row.index) ? row.index : $.table.serialNumber(index);
+                        return '<a class="btn btn-danger btn-xs" href="javascript:void(0)" onclick="sub.delRowByIndex(\'' + value + '\')"><i class="fa fa-remove"></i>删除</a>';
+                    }
+                }]
+            };
+            $.table.init(options);
+        });
+
+        function addRow() {
+            var count = $("#" + table.options.id).bootstrapTable('getData').length;
+            var row = {
+                index: $.table.serialNumber(count),
+                salarySubjectId: "",
+                subjectName: "",
+                amount: "",
+                delFlag: "",
+                createBy: "",
+                createTime: "",
+                updateBy: "",
+                updateTime: "",
+            }
+            sub.addRow(row);
+        }
+    </script>
+</body>
+</html>

+ 201 - 0
src/main/resources/templates/business/salary/edit.html

@@ -0,0 +1,201 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('修改工资')" />
+    <th:block th:include="include :: datetimepicker-css" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-salary-edit" th:object="${salary}">
+            <h4 class="form-header h4">工资信息</h4>
+            <input name="salaryId" th:field="*{salaryId}" type="hidden">
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">用户:</label>
+                    <div class="col-sm-8">
+                        <input name="userId" th:field="*{userId}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">工资日期:</label>
+                    <div class="col-sm-8">
+                        <div class="input-group date">
+                            <input name="salaryDate" th:value="${#dates.format(salary.salaryDate, 'yyyy-MM-dd')}" class="form-control" placeholder="yyyy-MM-dd" type="text">
+                            <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">工资总金额:</label>
+                    <div class="col-sm-8">
+                        <input name="sumAmount" th:field="*{sumAmount}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <h4 class="form-header h4">工资明细信息</h4>
+            <div class="row">
+                <div class="col-sm-12">
+                    <button type="button" class="btn btn-white btn-sm" onclick="addRow()"><i class="fa fa-plus"> 增加</i></button>
+                    <button type="button" class="btn btn-white btn-sm" onclick="sub.delRow()"><i class="fa fa-minus"> 删除</i></button>
+                    <div class="col-sm-12 select-table table-striped">
+                        <table id="bootstrap-table"></table>
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: datetimepicker-js" />
+    <script th:inline="javascript">
+        var prefix = ctx + "business/salary";
+        $("#form-salary-edit").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/edit", $('#form-salary-edit').serialize());
+            }
+        }
+
+        $("input[name='salaryDate']").datetimepicker({
+            format: "yyyy-mm-dd",
+            minView: "month",
+            autoclose: true
+        });
+
+        $(function() {
+            var options = {
+                data: [[${salary.salaryDetailList}]],
+                pagination: false,
+                showSearch: false,
+                showRefresh: false,
+                showToggle: false,
+                showColumns: false,
+                sidePagination: "client",
+                columns: [{
+                    checkbox: true
+                },
+                {
+                    field: 'index',
+                    align: 'center',
+                    title: "序号",
+                    formatter: function (value, row, index) {
+                    	var columnIndex = $.common.sprintf("<input type='hidden' name='index' value='%s'>", $.table.serialNumber(index));
+                    	return columnIndex + $.table.serialNumber(index);
+                    }
+                },
+                {
+                    field: 'salarySubjectId',
+                    align: 'center',
+                    title: '工资科目',
+                    formatter: function(value, row, index) {
+                        var html = $.common.sprintf("<input class='form-control' type='text' name='salaryDetailList[%s].salarySubjectId' value='%s'>", index, value);
+                        return html;
+                    }
+                },
+
+                {
+                    field: 'subjectName',
+                    align: 'center',
+                    title: '科目名',
+                    formatter: function(value, row, index) {
+                        var html = $.common.sprintf("<input class='form-control' type='text' name='salaryDetailList[%s].subjectName' value='%s'>", index, value);
+                        return html;
+                    }
+                },
+
+                {
+                    field: 'amount',
+                    align: 'center',
+                    title: '金额',
+                    formatter: function(value, row, index) {
+                        var html = $.common.sprintf("<input class='form-control' type='text' name='salaryDetailList[%s].amount' value='%s'>", index, value);
+                        return html;
+                    }
+                },
+
+                {
+                    field: 'delFlag',
+                    align: 'center',
+                    title: '删除标志',
+                    formatter: function(value, row, index) {
+                        var html = $.common.sprintf("<input class='form-control' type='text' name='salaryDetailList[%s].delFlag' value='%s'>", index, value);
+                        return html;
+                    }
+                },
+
+                {
+                    field: 'createBy',
+                    align: 'center',
+                    title: '创建者',
+                    formatter: function(value, row, index) {
+                        var html = $.common.sprintf("<input class='form-control' type='text' name='salaryDetailList[%s].createBy' value='%s'>", index, value);
+                        return html;
+                    }
+                },
+
+                {
+                    field: 'createTime',
+                    align: 'center',
+                    title: '创建时间',
+                    formatter: function(value, row, index) {
+                        var html = $.common.sprintf("<input class='form-control' type='text' name='salaryDetailList[%s].createTime' value='%s'>", index, value);
+                        return html;
+                    }
+                },
+
+                {
+                    field: 'updateBy',
+                    align: 'center',
+                    title: '更新者',
+                    formatter: function(value, row, index) {
+                        var html = $.common.sprintf("<input class='form-control' type='text' name='salaryDetailList[%s].updateBy' value='%s'>", index, value);
+                        return html;
+                    }
+                },
+
+                {
+                    field: 'updateTime',
+                    align: 'center',
+                    title: '更新时间',
+                    formatter: function(value, row, index) {
+                        var html = $.common.sprintf("<input class='form-control' type='text' name='salaryDetailList[%s].updateTime' value='%s'>", index, value);
+                        return html;
+                    }
+                },
+
+                {
+                    title: '操作',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        var value = $.common.isNotEmpty(row.index) ? row.index : $.table.serialNumber(index);
+                        return '<a class="btn btn-danger btn-xs" href="javascript:void(0)" onclick="sub.delRowByIndex(\'' + value + '\')"><i class="fa fa-remove"></i>删除</a>';
+                    }
+                }]
+            };
+            $.table.init(options);
+        });
+
+        function addRow() {
+            var count = $("#" + table.options.id).bootstrapTable('getData').length;
+            var row = {
+                index: $.table.serialNumber(count),
+                salarySubjectId: "",
+                subjectName: "",
+                amount: "",
+                delFlag: "",
+                createBy: "",
+                createTime: "",
+                updateBy: "",
+                updateTime: "",
+            }
+            sub.addRow(row);
+        }
+    </script>
+</body>
+</html>

+ 100 - 0
src/main/resources/templates/business/salary/salary.html

@@ -0,0 +1,100 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+    <th:block th:include="include :: header('工资列表')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="formId">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+                                <label>用户:</label>
+                                <input type="text" name="userId"/>
+                            </li>
+                            <li class="select-time">
+                                <label>工资日期:</label>
+                                <input type="text" class="time-input" id="startTime" placeholder="开始时间" name="params[beginSalaryDate]"/>
+                                <span>-</span>
+                                <input type="text" class="time-input" id="endTime" placeholder="结束时间" name="params[endSalaryDate]"/>
+                            </li>
+                            <li>
+                                <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+                                <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+                            </li>
+                        </ul>
+                    </div>
+                </form>
+            </div>
+
+            <div class="btn-group-sm" id="toolbar" role="group">
+                <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="business:salary:add">
+                    <i class="fa fa-plus"></i> 添加
+                </a>
+                <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="business:salary:edit">
+                    <i class="fa fa-edit"></i> 修改
+                </a>
+                <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="business:salary:remove">
+                    <i class="fa fa-remove"></i> 删除
+                </a>
+                <a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="business:salary:export">
+                    <i class="fa fa-download"></i> 导出
+                </a>
+            </div>
+            <div class="col-sm-12 select-table table-striped">
+                <table id="bootstrap-table"></table>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var editFlag = [[${@permission.hasPermi('business:salary:edit')}]];
+        var removeFlag = [[${@permission.hasPermi('business:salary:remove')}]];
+        var prefix = ctx + "business/salary";
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                updateUrl: prefix + "/edit/{id}",
+                removeUrl: prefix + "/remove",
+                exportUrl: prefix + "/export",
+                modalName: "工资",
+                columns: [{
+                    checkbox: true
+                },
+                {
+                    field: 'salaryId',
+                    title: '主键',
+                    visible: false
+                },
+                {
+                    field: 'userId',
+                    title: '用户'
+                },
+                {
+                    field: 'salaryDate',
+                    title: '工资日期'
+                },
+                {
+                    field: 'sumAmount',
+                    title: '工资总金额'
+                },
+                {
+                    title: '操作',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        var actions = [];
+                        actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.salaryId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.salaryId + '\')"><i class="fa fa-remove"></i>删除</a>');
+                        return actions.join('');
+                    }
+                }]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>

+ 71 - 0
src/main/resources/templates/business/subject/add.html

@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('新增工资科目')" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-subject-add">
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">科目种类:</label>
+                    <div class="col-sm-8">
+                        <select name="subjectType" class="form-control" th:with="type=${@dict.getType('subject_type')}">
+                            <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">科目名:</label>
+                    <div class="col-sm-8">
+                        <input name="subjectName" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">基准标记:</label>
+                    <div class="col-sm-8">
+                        <div class="radio-box" th:each="dict : ${@dict.getType('sys_yes_no')}">
+                            <input type="radio" th:id="${'baseFlag_' + dict.dictCode}" name="baseFlag" th:value="${dict.dictValue}" th:checked="${dict.default}">
+                            <label th:for="${'baseFlag_' + dict.dictCode}" th:text="${dict.dictLabel}"></label>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">占比:</label>
+                    <div class="col-sm-8">
+                        <input name="percent" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">公式:</label>
+                    <div class="col-sm-8">
+                        <textarea name="formula" class="form-control"></textarea>
+                    </div>
+                </div>
+            </div>
+
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var prefix = ctx + "business/subject"
+        $("#form-subject-add").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/add", $('#form-subject-add').serialize());
+            }
+        }
+    </script>
+</body>
+</html>

+ 72 - 0
src/main/resources/templates/business/subject/edit.html

@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('修改工资科目')" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-subject-edit" th:object="${salarySubject}">
+            <input name="salarySubjectId" th:field="*{salarySubjectId}" type="hidden">
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">科目种类:</label>
+                    <div class="col-sm-8">
+                        <select name="subjectType" class="form-control" th:with="type=${@dict.getType('subject_type')}">
+                            <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{subjectType}"></option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">科目名:</label>
+                    <div class="col-sm-8">
+                        <input name="subjectName" th:field="*{subjectName}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">基准标记:</label>
+                    <div class="col-sm-8">
+                        <div class="radio-box" th:each="dict : ${@dict.getType('sys_yes_no')}">
+                            <input type="radio" th:id="${'baseFlag_' + dict.dictCode}" name="baseFlag" th:value="${dict.dictValue}" th:field="*{baseFlag}">
+                            <label th:for="${'baseFlag_' + dict.dictCode}" th:text="${dict.dictLabel}"></label>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">占比:</label>
+                    <div class="col-sm-8">
+                        <input name="percent" th:field="*{percent}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">公式:</label>
+                    <div class="col-sm-8">
+                        <textarea name="formula" class="form-control">[[*{formula}]]</textarea>
+                    </div>
+                </div>
+            </div>
+
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var prefix = ctx + "business/subject";
+        $("#form-subject-edit").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/edit", $('#form-subject-edit').serialize());
+            }
+        }
+    </script>
+</body>
+</html>

+ 162 - 0
src/main/resources/templates/business/subject/subject.html

@@ -0,0 +1,162 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+    <th:block th:include="include :: header('工资科目列表')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="formId">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+                                <label>科目种类:</label>
+                                <select name="subjectType" th:with="type=${@dict.getType('subject_type')}">
+                                    <option value="">所有</option>
+                                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                                </select>
+                            </li>
+                            <li>
+                                <label>科目名:</label>
+                                <input type="text" name="subjectName"/>
+                            </li>
+                            <li>
+                                <label>基准标记:</label>
+                                <select name="baseFlag" th:with="type=${@dict.getType('sys_yes_no')}">
+                                    <option value="">所有</option>
+                                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                                </select>
+                            </li>
+                            <li>
+                                <label>占比:</label>
+                                <input type="text" name="percent"/>
+                            </li>
+                            <li>
+                                <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+                                <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+                            </li>
+                        </ul>
+                    </div>
+                </form>
+            </div>
+
+            <div class="btn-group-sm" id="toolbar" role="group">
+                <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="business:subject:add">
+                    <i class="fa fa-plus"></i> 添加
+                </a>
+                <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="business:subject:edit">
+                    <i class="fa fa-edit"></i> 修改
+                </a>
+                <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="business:subject:remove">
+                    <i class="fa fa-remove"></i> 删除
+                </a>
+                <a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="business:subject:export">
+                    <i class="fa fa-download"></i> 导出
+                </a>
+            </div>
+            <div class="col-sm-12 select-table table-striped">
+                <table id="bootstrap-table"></table>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var editFlag = [[${@permission.hasPermi('business:subject:edit')}]];
+        var removeFlag = [[${@permission.hasPermi('business:subject:remove')}]];
+        var subjectTypeDatas = [[${@dict.getType('subject_type')}]];
+        var baseFlagDatas = [[${@dict.getType('sys_yes_no')}]];
+        var prefix = ctx + "business/subject";
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                updateUrl: prefix + "/edit/{id}",
+                removeUrl: prefix + "/remove",
+                exportUrl: prefix + "/export",
+                modalName: "工资科目",
+                onReorderRow: function (data) {
+                    saveSorted(JSON.stringify(data))
+                    return true;
+                },
+                columns: [{
+                    checkbox: true
+                },
+                {
+                    field: 'salarySubjectId',
+                    title: '主键',
+                    visible: false
+                },
+                {
+                    field: 'subjectType',
+                    title: '科目种类',
+                    formatter: function(value, row, index) {
+                       return $.table.selectDictLabel(subjectTypeDatas, value);
+                    }
+                },
+                {
+                    field: 'subjectName',
+                    title: '科目名'
+                },
+                {
+                    field: 'baseFlag',
+                    title: '基准标记',
+                    formatter: function(value, row, index) {
+                       return $.table.selectDictLabel(baseFlagDatas, value);
+                    }
+                },
+                {
+                    field: 'percent',
+                    title: '占比'
+                },
+                {
+                    field: 'sort',
+                    title: '顺序'
+                },
+                {
+                    title: '操作',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        var actions = [];
+                        actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.salarySubjectId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.salarySubjectId + '\')"><i class="fa fa-remove"></i>删除</a>');
+                        return actions.join('');
+                    }
+                }]
+            };
+            $.table.init(options);
+        });
+
+        function saveSorted(data) {
+
+            var table = $("#bootstrap-table").bootstrapTable('getOptions');
+            var pageSize = table.pageSize;
+            var pageNumber = table.pageNumber;
+            var sortParams = {
+                "pageSize": pageSize,
+                "pageNumber": pageNumber,
+                "sorted": data
+            };
+
+            $.ajax({
+                url: prefix + "/sorted",
+                type: "post",
+                dataType: "json",
+                data: {
+                    params: sortParams
+                },
+                beforeSend: function () {
+                    $.modal.loading("正在处理中,请稍后...");
+                    $.modal.disable();
+                },
+                success: function (result) {
+                    $.table.refresh();
+                    $.modal.closeLoading();
+                    $.modal.enable();
+                }
+            })
+        }
+    </script>
+</body>
+</html>

+ 1 - 1
src/main/resources/templates/index.html

@@ -26,7 +26,7 @@
         </div>
         <a th:href="@{/index}">
             <li class="logo hidden-xs">
-                <span class="logo-lg">RuoYi</span>
+                <span class="logo-lg">HZY</span>
             </li>
          </a>
         <div class="sidebar-collapse">

+ 2 - 2
src/main/resources/templates/login.html

@@ -26,7 +26,7 @@
             <div class="col-sm-7">
                 <div class="signin-info">
                     <div class="logopanel m-b">
-                        <h1><img alt="[ 若依 ]" src="../static/ruoyi.png" th:src="@{/ruoyi.png}"></h1>
+                        <h1><img alt="[ 华智昀 ]" src="../static/ruoyi.png" th:src="@{/ruoyi.png}"></h1>
                     </div>
                     <div class="m-b"></div>
                     <h4>欢迎使用 <strong>华智昀账目</strong></h4>
@@ -43,7 +43,7 @@
             <div class="col-sm-5">
                 <form id="signupForm" autocomplete="off">
                     <h4 class="no-margins">登录:</h4>
-                    <p class="m-t-md">你若不离不弃,我必生死相依</p>
+<!--                    <p class="m-t-md">你若不离不弃,我必生死相依</p>-->
                     <input type="text"     name="username" class="form-control uname"     placeholder="用户名" value="admin"    />
                     <input type="password" name="password" class="form-control pword"     placeholder="密码"   value="admin123" />
 					<div class="row m-t" th:if="${captchaEnabled==true}">

+ 1 - 1780
src/main/resources/templates/main.html

@@ -13,33 +13,6 @@
 
 <body class="gray-bg">
     <div class="row border-bottom white-bg dashboard-header">
-        <div class="col-sm-3">
-            <h2>Hello,Guest</h2>
-            <small>移动设备访问请扫描以下二维码:</small>
-            <br>
-            <br>
-            <img th:src="@{/img/qr_code.png}" width="100%" style="max-width:264px;">
-            <br>
-        </div>
-        <div class="col-sm-5">
-            <h2>若依后台管理框架</h2>
-            <p>一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了若依管理系统。,她可以用于所有的Web应用程序,如<b>网站管理后台</b>,<b>网站会员中心</b>,<b>CMS</b>,<b>CRM</b>,<b>OA</b>等等,当然,您也可以对她进行深度定制,以做出更强系统。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。</p>
-            <p>
-                <b>当前版本:</b><span>v[[${version}]]</span>
-            </p>
-            <p>
-                <span class="label label-warning">&yen;免费开源</span>
-            </p>
-            <br>
-            <p>
-                <a class="btn btn-success btn-outline" href="https://gitee.com/y_project/RuoYi" target="_blank">
-                    <i class="fa fa-cloud"> </i> 访问码云
-                </a>
-                <a class="btn btn-white btn-bitbucket" href="http://ruoyi.vip" target="_blank">
-                    <i class="fa fa-home"></i> 访问主页
-                </a>
-            </p>
-        </div>
         <div class="col-sm-4">
             <h4>技术选型:</h4>
             <ol>
@@ -57,1766 +30,14 @@
     </div>
     <div class="wrapper wrapper-content">
         <div class="row">
-            <div class="col-sm-4">
-
-                <div class="ibox float-e-margins">
-                    <div class="ibox-title">
-                        <h5>联系信息</h5>
 
-                    </div>
-                    <div class="ibox-content">
-                        <p><i class="fa fa-send-o"></i> 官网:<a href="http://www.ruoyi.vip" target="_blank">http://www.ruoyi.vip</a>
-                        </p>
-                        <p><i class="fa fa-qq"></i> QQ群:<s>满1389287</s> <s>满1679294</s> <s>满1529866</s> <s>满1772718</s> <s>满1366522</s> <s>满1382251</s> <s>满1145125</s> <s>满86752435</s> <s>满134072510</s> <s>满210336300</s> <s>满339522636</s> <s>满130035985</s> <s>满143151071</s> <s>满158781320</s> <s>满201531282</s> <s>满101526938</s> <s>满264355400</s> <s>满298522656</s> <s>满139845794</s>  <s>满185760789</s> <s>满175104288</s> <s>满174942938</s> <s>满287843737</s> <s>满232896766</s> <s>满180208928</s> <a href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=WqsGDxpGkqOPeWGOf3I32f_rXxdhqYNr&authKey=kvdF5df7PO9bzWxmixKhZN6ShsECBiuGUmmzTZBWVr2MVOfJ8%2F4oD0Gws0rbgYfz&noverify=0&group_code=140284548" target="_blank">140284548</a>
-                        </p>
-                        <p><i class="fa fa-weixin"></i> 微信:<a href="javascript:;">/ *若依</a>
-                        </p>
-                        <p><i class="fa fa-credit-card"></i> 支付宝:<a href="javascript:;" class="支付宝信息">/ *若依</a>
-                        </p>
-                    </div>
-                </div>
-            </div>
-            <div class="col-sm-4">
-                <div class="ibox float-e-margins">
-                    <div class="ibox-title">
-                        <h5>更新日志</h5>
-                    </div>
-                    <div class="ibox-content no-padding">
-                        <div class="panel-body">
-                            <div class="panel-group" id="version">
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v481">v4.8.1</a><code class="pull-right">2025.05.20</code>
-								   </h5>
-								</div>
-								<div id="v481" class="panel-collapse collapse in">
-									<div class="panel-body">
-									   <ol>
-									        <li>新增CSRF防护功能</li>
-									        <li>Excel导入导出支持多图片</li>
-									        <li>菜单管理支持批量保存排序</li>
-									        <li>用户分配角色页禁用不允许分配</li>
-									        <li>优化Tab页签跟随主题样式效果</li>
-									        <li>优化浅色主题下菜单右边框同步主题色</li>
-									        <li>优化空指针异常时日志无法记录错误信息问题</li>
-									        <li>新增表格参数(自定义radio/checkbox的name值)</li>
-									        <li>升级oshi到最新版本6.8.1</li>
-									        <li>升级tomcat到最新版本9.0.105</li>
-									        <li>升级commons.io到最新版本2.19.0</li>
-									        <li>升级bootstrap-table到最新版本1.24.1</li>
-									        <li>升级bootstrap-fileinput到最新版本5.5.4</li>
-									        <li>用户更新方法移除login_name更新字段</li>
-									        <li>修复定时任务参数值带括号时异常问题</li>
-									        <li>进入新增页面前方法校验数据权限</li>
-									        <li>进入授权角色&重置密码页校验数据权限</li>
-									        <li>优化Excel匹配数值型.0结尾</li>
-									        <li>优化HttpUtils加入请求类型传参</li>
-									        <li>优化管理员登录不设置权限permissions属性</li>
-									        <li>优化successCallback方法对于非特定表格类型无响应问题</li>
-									        <li>优化导出Excel日期格式双击离开后与设定的格式不一致问题</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v480">v4.8.0</a><code class="pull-right">2024.12.26</code>
-								   </h5>
-								</div>
-								<div id="v480" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>支持自定义显示Excel属性列</li>
-									        <li>表格默认转义HTML字符串</li>
-									        <li>新增列宽拖动长内容自适应显示示例</li>
-									        <li>Excel注解支持wrapText是否允许内容换行</li>
-									        <li>代码生成新增配置是否允许文件覆盖到本地</li>
-									        <li>升级oshi到最新版本6.6.5</li>
-									        <li>升级tomcat到最新版本9.0.96</li>
-									        <li>升级logback到最新版本1.2.13</li>
-									        <li>升级commons.io到最新版本2.16.1</li>
-									        <li>升级spring-framework到最新版本5.3.39</li>
-									        <li>升级jquery.validate到最新版本v1.21.0</li>
-									        <li>优化导入带标题文件关闭清理</li>
-									        <li>代码生成创建表屏蔽违规的字符</li>
-									        <li>修复主子表数据显示问题</li>
-									        <li>修复记住我请求头过大的问题</li>
-									        <li>修复角色禁用权限不失效问题</li>
-									        <li>修复类匿名注解访问失效问题</li>
-									        <li>修复导出子列表对象只能在最后的问题</li>
-									        <li>修复多选下拉框open导致页签空白问题</li>
-									        <li>优化身份证脱敏正则</li>
-									        <li>优化查询时间范围日期格式</li>
-									        <li>优化异步树表格折叠同步子状态</li>
-									        <li>优化时间控件清除按钮样式问题</li>
-									        <li>优化表格图片预览动态路径显示问题</li>
-									        <li>优化select2下拉框必填背景色无法清空问题</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v479">v4.7.9</a><code class="pull-right">2024.06.06</code>
-								   </h5>
-								</div>
-								<div id="v479" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>通知公告新增详细显示</li>
-									        <li>新增数据脱敏过滤注解</li>
-									        <li>新增表格示例(虚拟滚动)</li>
-									        <li>新增表格示例(全文检索)</li>
-									        <li>新增表格示例(保存状态)</li>
-									        <li>代码生成支持表单布局选项</li>
-									        <li>限制用户操作数据权限范围</li>
-									        <li>用户密码新增非法字符验证</li>
-									        <li>默认加载layer扩展皮肤</li>
-									        <li>未修改初始密码弹框提醒</li>
-									        <li>定时任务白名单配置范围缩小</li>
-									        <li>操作日志列表重置回第一页</li>
-									        <li>定时任务日志默认按时间排序</li>
-									        <li>Excel注解ColumnType类型新增文本</li>
-									        <li>Excel注解新增属性comboReadDict</li>
-									        <li>新增Anonymous匿名访问不鉴权注解</li>
-									        <li>升级oshi到最新版本6.6.1</li>
-									        <li>升级druid到最新版本1.2.23</li>
-									        <li>升级commons.io到最新版本2.13.0</li>
-									        <li>升级spring-framework到安全版本</li>
-									        <li>升级bootstrap-table到最新版本1.22.6</li>
-									        <li>修复重置日期时出现的异常问题</li>
-									        <li>修复页签关闭后存在的跳转问题</li>
-									        <li>修复tooltip单击复制文本不生效的问题</li>
-									        <li>更新缓存管理键名排序方式</li>
-									        <li>更新HttpUtils中的User-Agent</li>
-									        <li>优化自定义XSS注解匹配方式</li>
-									        <li>优化登录注册页面验证码验证</li>
-									        <li>优化数据权限自定义匹配方式</li>
-									        <li>优化高频率定时任务不执行问题</li>
-									        <li>优化树表格align属性在标题生效</li>
-									        <li>优化代码生成主子表关联查询方式</li>
-									        <li>优化导入Excel时设置dictType属性重复查缓存问题</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v478">v4.7.8</a><code class="pull-right">2023.11.23</code>
-								   </h5>
-								</div>
-								<div id="v478" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>用户列表新增抽屉效果详细信息</li>
-									        <li>操作日志列表新增IP地址查询</li>
-									        <li>定时任务新增页去除状态选项</li>
-									        <li>系统管理角色列表显示数据权限</li>
-									        <li>通用排序属性orderBy参数限制长度</li>
-									        <li>新增isScrollToTop页签切换滚动到顶部</li>
-									        <li>Excel自定义数据处理器增加单元格/工作簿对象</li>
-									        <li>新增表格参数(数据值为空时显示的内容undefinedText)</li>
-									        <li>升级oshi到最新版本6.4.7</li>
-									        <li>升级shiro到最新版本1.13.0</li>
-									        <li>升级druid到最新版本1.2.20</li>
-									        <li>升级pagehelper到最新版1.4.7</li>
-									        <li>升级spring-boot到最新版本2.5.15</li>
-									        <li>升级jquery到最新版v3.7.1</li>
-									        <li>升级layer到最新版本v3.7.0</li>
-									        <li>升级layui到最新版本v2.8.18</li>
-									        <li>升级x-editable到最新版本1.5.3</li>
-									        <li>修复自定义字典样式不生效的问题</li>
-									        <li>修复弹窗按钮启用禁用方法无效问题</li>
-									        <li>修复横向菜单关闭最后一个页签状态问题</li>
-									        <li>修复Excel导入数据临时文件无法删除问题</li>
-									        <li>修复表格行内编辑启用翻页记住选择无效问题</li>
-									        <li>修复Excels导入时无法获取到dictType字典值问题</li>
-									        <li>优化重置密码鼠标按下显示密码</li>
-									        <li>优化参数键值文本框改为文本域</li>
-									        <li>优化表格重置默认返回到第一页</li>
-									        <li>优化菜单管理类型为按钮状态可选</li>
-									        <li>优化数字金额大写转换精度丢失问题</li>
-									        <li>优化树表查询无数据时清除分页信息</li>
-									        <li>优化通用detail详细信息弹窗不显示按钮</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v477">v4.7.7</a><code class="pull-right">2023.04.14</code>
-								   </h5>
-								</div>
-								<div id="v477" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>操作日志新增消耗时间属性</li>
-									        <li>日志管理使用索引提升查询性能</li>
-									        <li>日志注解支持排除指定的请求参数</li>
-									        <li>新增监控页面图标显示</li>
-									        <li>新增支持登录IP黑名单限制</li>
-									        <li>更新fontawesome图标示例</li>
-									        <li>屏蔽定时任务bean违规的字符</li>
-									        <li>支持自定义隐藏属性列过滤子对象</li>
-									        <li>连接池Druid支持新的配置connectTimeout和socketTimeout</li>
-									        <li>升级jquery到最新版v3.6.3</li>
-									        <li>升级layui到最新版本2.7.6</li>
-									        <li>升级jasny-bootstrap到最新版4.0.0</li>
-									        <li>升级oshi到最新版本6.4.1</li>
-									        <li>升级druid到最新版本1.2.16</li>
-									        <li>修复异步表格树子项排序问题</li>
-									        <li>修复冻结列不支持IE浏览器的问题</li>
-									        <li>修复主子表使用suggest插件无法新增问题</li>
-									        <li>修复菜单栏快速点击导致展开折叠样式问题</li>
-									        <li>修复用户多角色数据权限可能出现权限抬升的情况</li>
-									        <li>修复异步加载表格树重置列表父节点展开异常问题</li>
-									        <li>修复页签属性refresh为undefined时页面被刷新问题</li>
-									        <li>移除apache/commons-fileupload依赖</li>
-									        <li>优化前端属性提醒说明</li>
-									        <li>优化用户导入更新时需获取用户编号问题</li>
-									        <li>优化主子表根据序号删除方法加入表格ID参数</li>
-									        <li>优化导出Excel时设置dictType属性重复查缓存问题</li>
-									        <li>优化在线用户服务缓存改为从Bean容器获取不使用自动装配</li>
-									        <li>优化表格示例行拖拽后列表底部总记录条数变成了undefined问题</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v476">v4.7.6</a><code class="pull-right">2022.12.16</code>
-								   </h5>
-								</div>
-								<div id="v476" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>定时任务违规的字符</li>
-									        <li>忽略不必要的属性数据返回</li>
-									        <li>导入更新用户数据前校验数据权限</li>
-									        <li>修改参数键名时移除前缓存配置</li>
-									        <li>修改用户登录账号进行重复验证</li>
-									        <li>兼容Excel下拉框内容过多无法显示</li>
-									        <li>升级oshi到最新版本6.4.0</li>
-									        <li>升级kaptcha到最新版2.3.3</li>
-									        <li>升级druid到最新版本1.2.15</li>
-									        <li>升级shiro到最新版本1.10.1</li>
-									        <li>升级pagehelper到最新版1.4.6</li>
-									        <li>升级bootstrap-fileinput到最新版本5.5.2</li>
-									        <li>修复sheet超出最大行数异常问题</li>
-									        <li>修复关闭父页签后提交无法跳转的问题</li>
-									        <li>修复操作日志类型多选导出不生效问题</li>
-									        <li>修复导出包含空子列表数据异常的问题</li>
-									        <li>优化树形表格层级显示</li>
-									        <li>优化SQL关键字检查防止注入</li>
-									        <li>优化用户管理重置时取消部门选择</li>
-									        <li>优化代码生成同步后字典值NULL问题</li>
-									        <li>优化导出对象的子列表为空会出现[]问题</li>
-									        <li>优化select2搜索下拉后校验必填样式问题</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v475">v4.7.5</a><code class="pull-right">2022.09.05</code>
-								   </h5>
-								</div>
-								<div id="v475" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>Excel支持导出对象的子列表方法</li>
-									        <li>数据逻辑删除不进行唯一验证</li>
-									        <li>优化多角色数据权限匹配规则</li>
-									        <li>新增主子表提交校验示例</li>
-									        <li>支持自定义隐藏Excel属性列</li>
-									        <li>Excel注解支持backgroundColor属性设置背景颜色</li>
-									        <li>菜单配置刷新时Tab页签切换时刷新</li>
-									        <li>增加对AjaxResult消息结果类型的判断</li>
-									        <li>新增示例(进度条)</li>
-									        <li>新增内容编码/解码方便插件集成使用</li>
-									        <li>升级jquery到最新版3.6.1</li>
-									        <li>升级layui到最新版本2.7.5</li>
-									        <li>升级shiro到最新版本1.9.1</li>
-									        <li>升级druid到最新版本1.2.11</li>
-									        <li>升级pagehelper到最新版1.4.3</li>
-									        <li>升级oshi到最新版本6.2.2</li>
-									        <li>修复树表onLoadSuccess不生效的问题</li>
-											<li>修复用户分配角色大于默认页数丢失问题</li>
-									        <li>定时任务支持执行父类方法</li>
-									        <li>自动设置切换多个树表格实例配置</li>
-									        <li>页签创建标题优先data-title属性</li>
-									        <li>优化任务过期不执行调度</li>
-									        <li>优化横向菜单下激活菜单样式</li>
-									        <li>优化按钮打开窗口后按回车反复弹出</li>
-									        <li>优化excel/scale属性导出单元格数值类型</li>
-									        <li>优化druid开启wall过滤器出现的异常问题</li>
-									        <li>优化多个相同角色数据导致权限SQL重复问题</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v474">v4.7.4</a><code class="pull-right">2022.06.01</code>
-								   </h5>
-								</div>
-								<div id="v474" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>用户头像上传图片格式限制</li>
-									        <li>Excel注解支持color属性设置字体颜色</li>
-									        <li>设置分页参数默认值</li>
-									        <li>主子表操作列新增单个删除</li>
-									        <li>定时任务检查Bean包名是否为白名单配置</li>
-									        <li>升级spring-boot到最新版本2.5.14</li>
-									        <li>升级shiro到最新版本1.9.0</li>
-									        <li>升级oshi到最新版本6.1.6</li>
-									        <li>升级fastjson到最新版1.2.83 安全修复版本</li>
-									        <li>文件上传兼容Weblogic环境</li>
-									        <li>新增清理分页的线程变量方法</li>
-									        <li>新增获取不带后缀文件名称方法</li>
-									        <li>用户缓存信息添加部门ancestors祖级列表</li>
-									        <li>自定义ShiroFilterFactoryBean防止中文请求被拦截</li>
-									        <li>字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)</li>
-									        <li>优化IP地址获取到多个的问题</li>
-									        <li>优化表格冻结列阴影效果显示</li>
-									        <li>优化菜单侧边栏滚动条尺寸及颜色</li>
-									        <li>优化显示顺序orderNum类型为整型</li>
-									        <li>优化接口使用泛型使其看到响应属性字段</li>
-									        <li>优化导出数据LocalDateTime类型无数据问题</li>
-									        <li>修复导入Excel时字典字段类型为Long转义为空问题</li>
-									        <li>优化导出excel单元格验证,包含变更为开头.防止正常内容被替换</li>
-									        <li>修复URL类型回退键被禁止问题</li>
-									        <li>修复表格客户端分页序号显示错误问题</li>
-									        <li>修复代码生成拖拽多次出现的排序不正确问题</li>
-									        <li>修复表格打印组件不识别多层对象属性值问题</li>
-									        <li>修复操作日志查询类型条件为0时会查到所有数据</li>
-									        <li>修复Excel注解prompt/combo同时使用不生效问题</li>
-									        <li>修复初始化多表格处理回调函数时获取的表格配置不一致问题</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v473">v4.7.3</a><code class="pull-right">2022.03.01</code>
-								   </h5>
-								</div>
-								<div id="v473" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>表格树支持分页/异步加载</li>
-									        <li>代码生成预览支持复制内容</li>
-									        <li>定时任务默认保存到内存中执行</li>
-									        <li>代码生成同步保留必填/类型选项</li>
-									        <li>页面若未匹配到字典标签则返回原字典值</li>
-									        <li>用户访问控制时校验数据权限,防止越权</li>
-									        <li>导出Excel时屏蔽公式,防止CSV注入风险</li>
-									        <li>升级spring-boot到最新版本2.5.10</li>
-									        <li>升级spring-boot-mybatis到最新版2.2.2</li>
-									        <li>升级pagehelper到最新版1.4.1</li>
-									        <li>升级oshi到最新版本6.1.2</li>
-									        <li>升级bootstrap-table到最新版本1.19.1</li>
-									        <li>服务监控新增运行参数信息显示</li>
-									        <li>定时任务目标字符串验证包名白名单</li>
-									        <li>文件上传接口新增原/新文件名返回参数</li>
-									        <li>定时任务屏蔽违规的字符</li>
-									        <li>分页数据新增分页参数合理化参数</li>
-									        <li>表格父子视图添加点击事件打开示例</li>
-									        <li>优化上传文件名称命名规则</li>
-									        <li>优化加载字典缓存数据</li>
-									        <li>优化任务队列满时任务拒绝策略</li>
-									        <li>优化IE11上传预览不显示的问题</li>
-									        <li>优化Excel格式化不同类型的日期对象</li>
-									        <li>优化国际化配置多余的zh请求问题</li>
-									        <li>优化新版Chrome浏览器回退出现的遮罩层</li>
-									        <li>修复EMAIL类型回退键被禁止问题</li>
-									        <li>修复Xss注解字段值为空时的异常问题</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v472">v4.7.2</a><code class="pull-right">2021.12.23</code>
-								   </h5>
-								</div>
-								<div id="v472" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>自定义xss校验注解实现</li>
-									        <li>进入修改页面方法添加权限标识</li>
-									        <li>代码生成创建按钮添加超级管理员权限</li>
-									        <li>代码生成创建表检查关键字,防止注入风险</li>
-									        <li>修复定时任务多参数逗号分隔的问题</li>
-									        <li>修复表格插件一起使用出现的声明报错问题</li>
-									        <li>修复代码生成主子表模板删除方法缺少事务</li>
-									        <li>升级oshi到最新版本v5.8.6</li>
-									        <li>升级velocity到最新版本2.3</li>
-									        <li>升级fastjson到最新版1.2.79</li>
-									        <li>升级log4j2到最新版2.17.0 防止漏洞风险</li>
-									        <li>升级thymeleaf到最新版3.0.14 阻止远程代码执行漏洞</li>
-									        <li>优化修改/授权角色实时生效</li>
-									        <li>修整tomcat配置参数已过期问题</li>
-									        <li>前端添加单独的二代身份证校验</li>
-									        <li>优化新增部门时验证用户所属部门</li>
-									        <li>优化查询用户的角色组&岗位组代码</li>
-									        <li>请求分页方法设置成通用方便灵活调用</li>
-									        <li>优化日期类型错误提示与图标重叠问题</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v471">v4.7.1</a><code class="pull-right">2021.11.10</code>
-								   </h5>
-								</div>
-								<div id="v471" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>新增是否开启页签功能</li>
-									        <li>代码生成的模块增加创建表功能</li>
-									        <li>Excel导入支持@Excels注解</li>
-									        <li>Excel注解支持导入导出标题信息</li>
-									        <li>Excel注解支持自定义数据处理器</li>
-									        <li>日志注解新增是否保存响应参数</li>
-									        <li>防重提交注解支持配置间隔时间/提示消息</li>
-									        <li>网页部分操作禁止使用后退键(Backspace)</li>
-									        <li>实例演示中增加多层窗口获取值</li>
-									        <li>弹出层openOptions增加动画属性</li>
-									        <li>升级spring-boot到最新版本2.5.6</li>
-									        <li>升级spring-boot-mybatis到最新版2.2.0</li>
-									        <li>升级pagehelper到最新版1.4.0</li>
-									        <li>升级oshi到最新版本v5.8.2</li>
-									        <li>升级druid到最新版1.2.8</li>
-									        <li>升级fastjson到最新版1.2.78</li>
-									        <li>升级thymeleaf-extras-shiro到最新版本v2.1.0</li>
-									        <li>升级bootstrap-fileinput到最新版本v5.2.4</li>
-									        <li>修改阿里云maven仓库地址为新版地址</li>
-									        <li>定时任务屏蔽违规字符</li>
-									        <li>增加sendGet无参请求方法</li>
-									        <li>代码生成去掉多余的排序字段</li>
-									        <li>优化启动脚本参数优化</li>
-									        <li>优化页签关闭右侧清除iframe元素</li>
-									        <li>优化多表格切换表单查询参数</li>
-									        <li>优化表格实例切换event不能为空</li>
-									        <li>优化mybatis全局默认的执行器</li>
-									        <li>优化导入Excel数据关闭时清理file</li>
-									        <li>优化Excel导入图片可能出现的异常</li>
-									        <li>优化记录登录信息,防止不必要的修改</li>
-									        <li>优化aop语法,使用spring自动注入注解</li>
-									        <li>修复无法被反转义问题</li>
-									        <li>修复拖拽行数据错位问题</li>
-									        <li>修复新窗口打开页面关闭弹窗报错</li>
-									        <li>修复富文本回退键被禁止&控制台报错问题</li>
-									        <li>修复自定义弹出层全屏参数无效问题</li>
-									        <li>修复树表代码生成短字段无法识别问题</li>
-									        <li>修复apple/webkit浏览器时间无法格式化</li>
-									        <li>修复后端主子表代码模板方法名生成错误问题</li>
-									        <li>修复swagger没有指定dataTypeClass导致启动出现warn日志</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v470">v4.7.0</a><code class="pull-right">2021.09.01</code>
-								   </h5>
-								</div>
-								<div id="v470" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>优化弹出层显示在顶层窗口</li>
-									        <li>定时任务支持在线生成cron表达式</li>
-									        <li>Excel注解支持Image图片导入</li>
-									        <li>支持配置是否开启记住我功能</li>
-									        <li>修改时检查用户数据权限范围</li>
-									        <li>表单重置开始/结束时间控件</li>
-									        <li>新增多图上传示例</li>
-									        <li>启用父部门状态排除顶级节点</li>
-									        <li>富文本默认dialogsInBody属性</li>
-									        <li>去除默认分页合理化参数</li>
-									        <li>顶部菜单跳转添加绝对路径</li>
-									        <li>升级oshi到最新版本v5.8.0</li>
-									        <li>升级shiro到最新版本v1.8.0</li>
-									        <li>升级commons.io到最新版本v2.11.0</li>
-									        <li>升级jquery到最新版v3.6.0</li>
-									        <li>升级icheck到最新版v1.0.3</li>
-									        <li>升级layer到最新版本v3.5.1</li>
-									        <li>升级layui到最新版本v2.6.8</li>
-									        <li>升级laydate到最新版本v5.3.1</li>
-									        <li>升级select2到最新版v4.0.13</li>
-									        <li>升级cropper到最新版本v1.5.12</li>
-									        <li>升级summernote到最新版本v0.8.18</li>
-									        <li>升级duallistbox到最新版本v3.0.9</li>
-									        <li>升级jquery.validate到最新版本v1.19.3</li>
-									        <li>升级bootstrap-suggest到最新版本v0.1.29</li>
-									        <li>升级bootstrap-select到最新版本v1.13.18</li>
-									        <li>升级bootstrap-fileinput到最新版本v5.2.3</li>
-									        <li>查询表格指定列值增加是否去重属性</li>
-									        <li>删除sourceMappingURL源映射</li>
-									        <li>去除多余的favicon.ico引入</li>
-									        <li>优化代码生成模板</li>
-									        <li>优化XSS跨站脚本过滤</li>
-									        <li>补充定时任务表字段注释</li>
-									        <li>定时任务屏蔽ldap远程调用</li>
-									        <li>定时任务屏蔽http(s)远程调用</li>
-									        <li>定时任务对检查异常进行事务回滚</li>
-									        <li>调度日志详细页添加关闭按钮</li>
-									        <li>优化异常打印输出信息</li>
-									        <li>优化移动端进入首页样式</li>
-									        <li>优化用户操作不能删除自己</li>
-									        <li>默认开始/结束时间绑定控件选择类型</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v462">v4.6.2</a><code class="pull-right">2021.07.01</code>
-								   </h5>
-								</div>
-								<div id="v462" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>优化参数&字典缓存操作</li>
-									        <li>新增表格参数(导出方式&导出文件类型)</li>
-									        <li>新增表格示例(自定义视图分页)</li>
-									        <li>新增示例(表格列拖拽)</li>
-									        <li>集成yuicompressor实现(CSS/JS压缩)</li>
-									        <li>新增表格参数(是否支持打印页面showPrint)</li>
-									        <li>支持bat脚本执行应用</li>
-									        <li>修复存在的SQL注入漏洞问题</li>
-									        <li>定时任务屏蔽rmi远程调用</li>
-									        <li>导出Excel文件支持数据流下载方式</li>
-									        <li>实例演示弹层组件增加相册层示例</li>
-									        <li>删除操作日志记录信息</li>
-									        <li>增加表格重置分页的参数</li>
-									        <li>限制超级管理员不允许操作</li>
-									        <li>树级结构更新子节点使用replaceFirst</li>
-									        <li>支持动态生成密匙,防止默认密钥泄露</li>
-									        <li>升级pagehelper到最新版1.3.1</li>
-									        <li>升级oshi到最新版本v5.7.4</li>
-									        <li>升级swagger到最新版本v3.0.0</li>
-									        <li>升级commons.io到最新版本v2.10.0</li>
-									        <li>升级commons.fileupload到最新版本v1.4</li>
-									        <li>升级bootstrap-table到最新版本v1.18.3</li>
-									        <li>升级druid到最新版本v1.2.6</li>
-									        <li>升级fastjson到最新版1.2.76</li>
-									        <li>升级layui到最新版本v2.6.6</li>
-									        <li>升级layer到最新版本v3.5.0</li>
-									        <li>升级laydate到最新版本v5.3.0</li>
-									        <li>优化表格树移动端&边框显示</li>
-									        <li>新增表格刷新options配置方法</li>
-									        <li>优化图片工具类读取文件,防止异常</li>
-									        <li>修复表格图片预览移动端宽高无效问题</li>
-									        <li>主子表通用操作封装处理增加文本域类型</li>
-									        <li>日志注解兼容获取json类型的参数</li>
-									        <li>修复表单向导插件有滚动条时底部工具栏无法固定问题</li>
-									        <li>修复导出角色数据范围翻译缺少仅本人</li>
-									        <li>修正Velocity模板初始字符集</li>
-									        <li>升级mybatis到最新版3.5.6 阻止远程代码执行漏洞</li>
-									        <li>优化代码生成导出模板名称</li>
-									        <li>修改个人中心密码长度提醒</li>
-									        <li>实例演示中弹出表格增加以回调形式回显到父窗体</li>
-									        <li>修复登录页面弹窗文字不显示的问题</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v461">v4.6.1</a><code class="pull-right">2021.04.12</code>
-								   </h5>
-								</div>
-								<div id="v461" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>新增IE浏览器版本过低提示页面</li>
-									        <li>新增详细信息tab页签方式</li>
-									        <li>新增解锁屏幕打开上次页签</li>
-									        <li>数据监控默认账户密码防止越权访问</li>
-									        <li>新增表格示例(导出选择列)</li>
-									        <li>个人信息添加手机&邮箱重复验证</li>
-									        <li>个人中心刷新后样式问题</li>
-									        <li>操作日志返回参数添加非空验证</li>
-									        <li>velocity剔除commons-collections版本,防止3.2.1版本的反序列化漏洞</li>
-									        <li>子表模板默认日期格式化</li>
-									        <li>代码生成预览语言根据后缀名高亮显示</li>
-									        <li>代码生成主子表相同字段导致数据问题</li>
-									        <li>升级SpringBoot到最新版本2.2.13</li>
-									        <li>升级shiro到最新版1.7.1 阻止身份认证绕过漏洞</li>
-									        <li>升级bootstrapTable到最新版本v1.18.2</li>
-									        <li>升级bootstrapTable相关组件到最新版本v1.18.2</li>
-									        <li>升级fastjson到最新版1.2.75</li>
-									        <li>升级druid到最新版本v1.2.4</li>
-									        <li>升级oshi到最新版本v5.6.0</li>
-									        <li>修改ip字段长度防止ipv6地址长度不够</li>
-									        <li>搜索建议示例选择后隐藏列表</li>
-									        <li>主子表示例增加初始化数据</li>
-									        <li>优化Excel导入增加空行判断</li>
-									        <li>修复横向菜单无法打开页签问题</li>
-									        <li>修复导入数据为负浮点数时,导入结果会丢失精度问题</li>
-									        <li>优化更多操作按钮左侧移入内容闪现消失情况</li>
-									        <li>修复主子表提交中列隐藏后出现列偏移问题</li>
-									        <li>单据打印网页时通过hidden-print隐藏元素</li>
-									        <li>表格销毁清除记住选择数据</li>
-									        <li>增加表格动态列示例</li>
-									        <li>代码生成选择主子表关联元素必填</li>
-									        <li>tree根据Id和Name选中指定节点增加空判断</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v46">v4.6.0</a><code class="pull-right">2021.01.01</code>
-								   </h5>
-								</div>
-								<div id="v46" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>新增缓存监控管理</li>
-									        <li>新增锁定屏幕功能</li>
-									        <li>菜单新增是否刷新页面</li>
-									        <li>删除用户和角色解绑关联</li>
-									        <li>新增密码强度字符范围提示</li>
-									        <li>防止匿名访问进行过滤</li>
-									        <li>升级SpringBoot到最新版本2.2.12</li>
-									        <li>升级poi到最新版本4.1.2</li>
-									        <li>升级bitwalker到最新版本1.21</li>
-									        <li>升级bootstrap-fileinput到最新版本5.1.3</li>
-									        <li>升级bootstrapTable到最新版本v1.18.0</li>
-									        <li>升级bootstrapTable相关组件到最新版本v1.18.0</li>
-									        <li>升级oshi到最新版本v5.3.6</li>
-									        <li>新增示例(标签 & 提示)</li>
-									        <li>添加单据打印示例</li>
-									        <li>修改表格初始参数sortName默认值为undefined</li>
-									        <li>新增表格参数(自定义打印页面模板printPageBuilder)</li>
-									        <li>新增表格参数(是否显示行间隔色striped)</li>
-									        <li>新增表格参数(渲染完成后执行的事件onPostBody)</li>
-									        <li>Excel注解支持Image图片导出</li>
-									        <li>Excel支持注解align对齐方式</li>
-									        <li>Excel支持导入Boolean型数据</li>
-									        <li>主子表操作添加通用addColumn方法</li>
-									        <li>代码生成日期控件区分范围</li>
-									        <li>代码生成数据库文本类型生成表单文本域</li>
-									        <li>修复生成主子表外键名错误</li>
-									        <li>选项卡新增是否刷新属性</li>
-									        <li>修复树表格表头跟表格宽度不同步的问题</li>
-									        <li>表格树加载完成触发tooltip方法</li>
-									        <li>使用widthUnit定义树表格选项单位</li>
-									        <li>修复主子表editColumn序列问题</li>
-									        <li>修复添加全屏在无参数时没有替换url参数问题</li>
-									        <li>弹出层openOptions移动端自适应</li>
-									        <li>防止错误页返回主页出现嵌套问题</li>
-									        <li>设置回显数据字典验证防止空值</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v451">v4.5.1</a><code class="pull-right">2020.11.18</code>
-								   </h5>
-								</div>
-								<div id="v451" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>阻止任意文件下载漏洞</li>
-									        <li>升级shiro到最新版1.7.0 阻止权限绕过漏洞</li>
-									        <li>升级druid到最新版本v1.2.2</li>
-									        <li>新增表格行触发事件(onCheck、onUncheck、onCheckAll、onUncheckAll)</li>
-									        <li>修复多页签关闭非当前选项出现空白问题</li>
-									        <li>代码生成预览支持高亮显示</li>
-									        <li>mapperLocations配置支持分隔符</li>
-									        <li>权限信息调整</li>
-									        <li>个人中心头像和上传头像增加默认图片</li>
-									        <li>全局配置类保持和其他应用命名相同</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v45">v4.5.0</a><code class="pull-right">2020.10.20</code>
-								   </h5>
-								</div>
-								<div id="v45" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>新增菜单导航显示风格(default为左侧导航菜单,topnav为顶部导航菜单)</li>
-									        <li>菜单&数据权限新增(展开/折叠 全选/全不选 父子联动)</li>
-									        <li>账号密码支持自定义更新周期</li>
-									        <li>初始密码支持自定义修改策略</li>
-									        <li>新增校验用户修改新密码不能与旧密码相同</li>
-									        <li>添加检查密码范围支持的特殊字符包括:~!@#$%^&*()-=_+</li>
-									        <li>注册账号设置默认用户名称及密码最后更新时间</li>
-									        <li>去除用户手机邮箱部门必填验证</li>
-									        <li>新增日期格式化方法</li>
-									        <li>代码生成添加bit类型</li>
-									        <li>树结构加载添加callBack回调方法</li>
-									        <li>修复用户管理页面滚动返回顶部条失效</li>
-									        <li>修复代码生成模板文件上传组件缺少ctx的问题</li>
-									        <li>限制系统内置参数不允许删除</li>
-									        <li>新增表格列宽拖动插件</li>
-									        <li>新增Ajax局部刷新demo</li>
-									        <li>新增是否开启页脚功能</li>
-									        <li>新增表格参数(通过自定义函数设置标题样式headerStyle)</li>
-									        <li>新增表格参数(通过自定义函数设置页脚样式footerStyle)</li>
-									        <li>修复窗体大小改变后浮动提示框失效问题</li>
-									        <li>生成代码补充必填样式</li>
-									        <li>生成页面时不忽略remark属性</li>
-									        <li>字典数据列表页添加关闭按钮</li>
-									        <li>Excel注解支持自动统计数据总和</li>
-									        <li>升级springboot到2.1.17 提升安全性</li>
-									        <li>升级pagehelper到最新版1.3.0</li>
-									        <li>升级druid到最新版本v1.2.1</li>
-									        <li>升级fastjson到最新版1.2.74</li>
-									        <li>升级bootstrap-fileinput到最新版本5.1.2</li>
-									        <li>升级oshi到最新版本v5.2.5</li>
-									        <li>表单向导插件更换为jquery-smartwizard</li>
-									        <li>修改主子表提交示例代码防止渲染失效</li>
-									        <li>添加导入数据弹出窗体自定义宽高</li>
-									        <li>用户信息参数返回忽略掉密码字段</li>
-									        <li>优化关闭窗体添加index参数</li>
-									        <li>回显数据字典(字符串数组)增加空值判断</li>
-									        <li>修改前端密码长度校验和错误提示不符问题</li>
-									        <li>AjaxResult重写put方法,以方便链式调用</li>
-									        <li>增强验证码校验的语义,更易懂</li>
-									        <li>导入excel整形值校验优化</li>
-									        <li>Excel导出类型NUMERIC支持精度浮点类型</li>
-									        <li>导出Excel调整targetAttr获取值方法,防止get方法不规范</li>
-									        <li>输入框组验证错误后置图标提示颜色</li>
-									        <li>上传媒体类型添加视频格式</li>
-									        <li>数据权限判断参数类型</li>
-									        <li>修正数据库字符串类型nvarchar</li>
-									        <li>优化递归子节点</li>
-									        <li>修复多表格搜索formId无效</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v44">v4.4.0</a><code class="pull-right">2020.08.24</code>
-								   </h5>
-								</div>
-								<div id="v44" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>升级bootstrapTable到最新版本1.17.1</li>
-									        <li>升级shiro到最新版1.6.0 阻止权限绕过漏洞</li>
-									        <li>升级fastjson到最新版1.2.73</li>
-									        <li>代码生成支持同步数据库</li>
-									        <li>代码生成支持富文本控件</li>
-									        <li>用户密码支持自定义配置规则</li>
-									        <li>新增表格自动刷新插件</li>
-									        <li>新增表格打印配置插件</li>
-									        <li>更换图片裁剪工具为cropper</li>
-									        <li>Excel支持sort导出排序</li>
-									        <li>代码生成支持自定义路径</li>
-									        <li>代码生成支持选择上级菜单</li>
-									        <li>代码生成支持上传控件</li>
-									        <li>新增表格参数(自定义加载文本的字体大小loadingFontSize)</li>
-									        <li>Excel注解支持设置BigDecimal精度&舍入规则</li>
-									        <li>操作日志记录排除敏感属性字段</li>
-									        <li>修复不同浏览器附件下载中文名乱码的问题</li>
-									        <li>用户分配角色不允许选择超级管理员角色</li>
-									        <li>更换表格冻结列插件</li>
-									        <li>添加右侧冻结列示例</li>
-									        <li>升级表格行编辑&移动端适应插件</li>
-									        <li>修复更新表格插件后无法设置实例配置问题</li>
-									        <li>修复更新表格插件后导致的主子表错误</li>
-									        <li>修复页面存在多表格,回调函数res数据不正确问题</li>
-									        <li>强退&过期清理登录账号缓存会话</li>
-									        <li>表格树标题内容支持html语义化标签</li>
-									        <li>修复配置应用的访问路径首页页签重复问题</li>
-									        <li>优化openTab打开时滚动到当前页签</li>
-									        <li>表格请求方式method支持自定义配置</li>
-									        <li>菜单页签联动优化</li>
-									        <li>用户邮箱长度限制修改为50</li>
-									        <li>主子表示例添加日期格式案例</li>
-									        <li>修改表格行内编辑示例旧值参数</li>
-									        <li>操作日志查询方式调整</li>
-									        <li>唯一限制条件只返回单条数据</li>
-									        <li>修改Excel设置STRING单元格类型</li>
-									        <li>添加获取当前的环境配置方法</li>
-									        <li>截取返回参数长度,防止超出异常</li>
-									        <li>定时任务cron表达式验证</li>
-									        <li>拆分表格插件,按需引入</li>
-									        <li>多行文本框补齐必填错误提示背景</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v431">v4.3.1</a><code class="pull-right">2020.07.05</code>
-								   </h5>
-								</div>
-								<div id="v431" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>国家信息安全漏洞(请务必保持cipherKey密钥唯一性)</li>
-									        <li>升级shiro到最新版1.5.3 阻止权限绕过漏洞</li>
-									        <li>修改验证码在使用后清除,防止多次使用</li>
-									        <li>检查字符支持小数点&降级改成异常提醒</li>
-									        <li>openOptions函数中加入自定义maxmin属性</li>
-									        <li>支持openOptions方法最大化</li>
-									        <li>支持openOptions方法多个按钮回调</li>
-									        <li>新增isLinkage支持页签与菜单联动</li>
-									        <li>修改代码生成导入表结构出现异常页面不提醒问题</li>
-									        <li>优化用户头像发生错误,则显示一个默认头像</li>
-									        <li>Excel导出支持字典类型</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v43">v4.3.0</a><code class="pull-right">2020.06.22</code>
-								   </h5>
-								</div>
-								<div id="v43" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>代码生成模板支持主子表</li>
-									        <li>代码生成显示类型支持复选框</li>
-									        <li>前端表单样式修改成圆角</li>
-									        <li>新增回显数据字典(字符串数组)</li>
-									        <li>修复浏览器手动缩放比例后菜单无法自适应问题</li>
-									        <li>限制用户不允许选择系统管理员角色</li>
-									        <li>用户信息添加输入框组图标&鼠标按下显示密码</li>
-									        <li>升级fastjson到最新版1.2.70 修复高危安全漏洞</li>
-									        <li>升级Bootstrap版本到v3.3.7</li>
-									        <li>修复selectColumns方法获取子对象数据无效问题</li>
-									        <li>修改数据源类型优先级,先根据方法,再根据类</li>
-									        <li>修改上级部门(选择项排除本身和下级)</li>
-									        <li>首页菜单显示调整</li>
-									        <li>添加是否开启swagger配置</li>
-									        <li>新增示例(主子表提交)</li>
-									        <li>新增示例(多级联动下拉示例)</li>
-									        <li>新增示例(表格属性data数据加载)</li>
-									        <li>新增表格列参数(是否列选项可见ignore)</li>
-									        <li>新增表格参数(是否启用显示卡片视图cardView)</li>
-									        <li>新增表格参数(是否显示全屏按钮showFullscreen)</li>
-									        <li>新增表格参数(是否启用分页条无限循环的功能paginationLoop)</li>
-									        <li>新增表格参数(是否显示表头showHeader)</li>
-									        <li>表格添加显示/隐藏所有列方法 showAllColumns/hideAllColumns</li>
-									        <li>修复部分情况节点不展开问题</li>
-									        <li>修复关闭标签页后刷新还是上次地址问题</li>
-									        <li>修复选择菜单后刷新页面,菜单箭头显示不对问题</li>
-											<li>修复jquery表单序列化时复选框未选中不会序列化到对象中问题</li>
-											<li>Excel支持readConverterExp读取字符串组内容</li>
-									        <li>更换IP地址查询接口</li>
-									        <li>默认关闭获取ip地址</li>
-									        <li>操作处理ajaxSuccess判断修正</li>
-									        <li>HttpUtils.sendPost()方法,参数无需拼接参数到url</li>
-									        <li>通用http发送方法增加参数 contentType 编码类型</li>
-									        <li>HTML过滤器不替换&实体</li>
-									        <li>代码生成浮点型改用BigDecimal</li>
-									        <li>修复表单构建单选和多选框渲染问题</li>
-									        <li>代码生成模板调整,字段为String并且必填则加空串条件</li>
-									        <li>字典数据查询列表根据dictSort升序排序</li>
-									        <li>修复树表对imageView和tooltip方法无效问题</li>
-									        <li>修复Long类型比较相等问题调整</li>
-									        <li>示例demo页面清除html链接,防止点击后跳转出现404</li>
-									        <li>在线用户强退方法合并</li>
-									        <li>添加校验部门包含未停用的子部门</li>
-									        <li>取消回车自动提交表单</li>
-									        <li>'A','I','BUTTON' 标签忽略clickToSelect事件,防止点击操作按钮时选中</li>
-									        <li>邮箱显示截取部分字符串,防止低分辨率错位</li>
-									        <li>代码生成列属性根据sort排序</li>
-									        <li>修复更多操作部分浏览器不兼容情况</li>
-									        <li>图片预览事件属性修正</li>
-									        <li>修复冻结列排序样式无效问题</li>
-									        <li>修复context-path的情况下个人中心刷新导致样式问题</li>
-									        <li>全屏editFull打开适配表树</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v42">v4.2.0</a><code class="pull-right">2020.03.23</code>
-								   </h5>
-								</div>
-								<div id="v42" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>用户管理添加分配角色页面</li>
-									        <li>定时任务添加调度日志按钮</li>
-									        <li>新增是否开启用户注册功能</li>
-											<li>新增页面滚动显示返回顶部按钮</li>
-											<li>用户&角色&任务添加更多操作按钮</li>
-											<li>iframe框架页会话过期弹出超时提示</li>
-											<li>移动端登录不显示左侧菜单</li>
-											<li>侧边栏添加一套深蓝色主题</li>
-											<li>首页logo固定,不随菜单滚动</li>
-											<li>支持mode配置history(表示去掉地址栏的#)</li>
-											<li>任务分组字典翻译(调度日志详细)</li>
-											<li>字典管理添加缓存读取</li>
-											<li>字典数据列表标签显示样式</li>
-											<li>参数管理支持缓存操作</li>
-											<li>日期控件清空结束时间设置开始默认值为2099-12-31</li>
-											<li>表格树添加获取数据后响应回调处理</li>
-											<li>批量替换表前缀调整</li>
-											<li>支持表格导入模板的弹窗表单加入其它输入控件</li>
-											<li>表单重置刷新表格树</li>
-											<li>新增支持导出数据字段排序</li>
-											<li>新增表格参数(是否单选checkbox)</li>
-											<li>druid未授权不允许访问</li>
-											<li>表格树父节点兼容0,'0','',null</li>
-											<li>表单必填的项添加星号</li>
-											<li>修复select2不显示校验错误信息</li>
-											<li>添加自定义HTML过滤器</li>
-											<li>修复多数据源下开关关闭出现异常问题</li>
-											<li>修复翻页记住选择项数据问题</li>
-											<li>用户邮箱长度限制20</li>
-											<li>修改错误页面返回主页出现嵌套问题</li>
-											<li>表格浮动提示单双引号转义</li>
-											<li>支持配置四级菜单</li>
-											<li>升级shiro到最新版1.4.2 阻止rememberMe漏洞攻击</li>
-											<li>升级summernote到最新版本v0.8.12</li>
-											<li>导入Excel根据dateFormat属性格式处理</li>
-											<li>修复War部署无法正常shutdown,ehcache内存泄漏</li>
-											<li>修复代码生成短字段无法识别问题</li>
-											<li>修复serviceImpl模版,修改方法判断日期错误</li>
-											<li>代码生成模板增加导出功能日志记录</li>
-											<li>代码生成唯一编号调整为tableId</li>
-											<li>代码生成查询时忽略大小写</li>
-											<li>代码生成支持翻页记住选中</li>
-											<li>代码生成表注释未填写也允许导入</li>
-											<li>Global全局配置类修改为注解,防止多环境配置下读取问题</li>
-											<li>修复多表格情况下,firstLoad只对第一个表格生效</li>
-											<li>处理Maven打包出现警告问题</li>
-											<li>默认主题样式,防止网速慢情况下出现空白</li>
-											<li>修复文件上传多级目录识别问题</li>
-											<li>锚链接解码url,防止中文导致页面不能加载问题</li>
-											<li>修复右键Tab页刷新事件重复请求问题</li>
-											<li>角色禁用&菜单隐藏不查询权限</li>
-											<li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v41">v4.1.0</a><code class="pull-right">2019.10.22</code>
-								   </h5>
-								</div>
-								<div id="v41" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>支持多表格实例操作</li>
-									        <li>浮动提示方法tooltip支持弹窗</li>
-											<li>代码生成&字典数据支持模糊条件查询</li>
-											<li>增加页签全屏方法</li>
-											<li>增加清除表单验证错误信息方法</li>
-											<li>支持iframe局部刷新页面</li>
-											<li>支持在线切换主题</li>
-											<li>修改图片预览设置的高宽参数颠倒问题</li>
-											<li>操作日志新增解锁账户功能</li>
-											<li>管理员用户&角色不允许操作</li>
-											<li>去掉jsoup包调用自定义转义工具</li>
-											<li>添加时间轴示例</li>
-											<li>修复翻页记住选择时获取指定列值的问题</li>
-											<li>代码生成sql脚本添加导出按钮</li>
-											<li>添加表格父子视图示例</li>
-											<li>添加表格行内编辑示例</li>
-											<li>升级fastjson到最新版1.2.60 阻止漏洞攻击</li>
-											<li>升级echarts到最新版4.2.1</li>
-											<li>操作日志新增返回参数</li>
-											<li>支持mybatis通配符扫描任意多个包</li>
-											<li>权限验证多种情况处理</li>
-											<li>修复树形类型的代码生成的部分必要属性无法显示</li>
-											<li>修复非表格插件情况下重置出现异常</li>
-											<li>修复富文本编辑器有序列表冲突</li>
-											<li>代码生成表前缀配置支持多个</li>
-											<li>修复自动去除表前缀配置无效问题</li>
-											<li>菜单列表按钮数据可见不显示(权限标识控制)</li>
-											<li>修复设置会话超时时间无效问题</li>
-											<li>新增本地资源通用下载方法</li>
-											<li>操作日志记录新增请求方式</li>
-											<li>代码生成单选按钮属性重名修复</li>
-											<li>优化select2下拉框宽度不会随浏览器改变</li>
-											<li>修复代码生成树表异常</li>
-											<li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v40">v4.0.0</a><code class="pull-right">2019.08.08</code>
-								   </h5>
-								</div>
-								<div id="v40" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>代码生成支持预览、编辑,保存方案</li>
-									        <li>新增防止表单重复提交注解</li>
-											<li>新增后端校验(和前端保持一致)</li>
-											<li>新增同一个用户最大会话数控制</li>
-											<li>Excel导出子对象支持多个字段</li>
-											<li>定时任务支持静态调用和多参数</li>
-											<li>定时任务增加分组条件查询</li>
-											<li>字典类型增加任务分组数据</li>
-											<li>新增表格是否首次加载数据</li>
-											<li>新增parentTab选项卡可在同一页签打开</li>
-											<li>多数据源支持类注解(允许继承父类的注解)</li>
-											<li>部门及以下数据权限(调整为以下及所有子节点)</li>
-											<li>新增角色数据权限配(仅本人数据权限)</li>
-											<li>修改菜单权限显示问题</li>
-											<li>上传文件修改路径及返回名称</li>
-											<li>添加报表插件及示例</li>
-											<li>添加首页统计模板</li>
-											<li>添加表格拖拽示例</li>
-											<li>添加卡片列表示例</li>
-											<li>添加富文本编辑器示例</li>
-											<li>添加表格动态增删改查示例</li>
-											<li>添加用户页面岗位选择框提示</li>
-											<li>点击菜单操作添加背景高亮显示</li>
-											<li>表格树新增showSearch是否显示检索信息</li>
-											<li>解决表格列设置sortName无效问题</li>
-											<li>表格图片预览支持自定义设置宽高</li>
-											<li>添加表格列浮动提示(单击文本复制)</li>
-											<li>PC端收起菜单后支持浮动显示</li>
-											<li>详细操作样式调整</li>
-											<li>修改用户更新描述空串不更新问题</li>
-											<li>导入修改为模板渲染</li>
-											<li>修改菜单及部门排序规则</li>
-											<li>角色导出数据范围表达式翻译</li>
-											<li>添加summernote富文本字体大小</li>
-											<li>优化表格底部下边框防重叠&汇总像素问题</li>
-											<li>树表格支持属性多层级访问</li>
-											<li>修复IE浏览器用户管理界面右侧留白问题</li>
-											<li>重置按钮刷新表格</li>
-											<li>重置密码更新用户缓存</li>
-											<li>优化验证码属性参数</li>
-											<li>支持数据监控配置用户名和密码</li>
-											<li>文件上传修改按钮背景及加载动画</li>
-											<li>支持配置一级菜单href跳转</li>
-											<li>侧边栏添加一套浅色主题</li>
-											<li>树表格添加回调函数(校验异常状态)</li>
-											<li>用户个人中心适配手机端显示</li>
-											<li>Excel支持设置导出类型&更换样式</li>
-											<li>检查属性改变修改为克隆方式(防止热部署强转异常)</li>
-											<li>其他细节优化</li>
-										</ol>
-									</div>
-							    </div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v34">v3.4.0</a><code class="pull-right">2019.06.03</code>
-								   </h5>
-								</div>
-								<div id="v34" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>新增实例演示菜单及demo</li>
-											<li>新增页签右键操作</li>
-											<li>菜单管理新增打开方式</li>
-											<li>新增点击某行触发的事件</li>
-											<li>新增双击某行触发的事件</li>
-											<li>新增单击某格触发的事件</li>
-											<li>新增双击某格触发的事件</li>
-											<li>新增是否启用显示细节视图</li>
-											<li>支持上传任意格式文件</li>
-											<li>修复角色权限注解失效问题</li>
-											<li>左侧的菜单栏宽度调整</li>
-											<li>新增响应完成后自定义回调函数</li>
-											<li>支持前端及其他模块直接获取用户信息</li>
-											<li>升级swagger到最新版2.9.2</li>
-											<li>升级jquery.slimscroll到最新版1.3.8</li>
-											<li>升级select2到最新版4.0.7</li>
-											<li>新增角色配置本部门数据权限</li>
-											<li>新增角色配置本部门及以下数据权限</li>
-											<li>优化底部操作防止跳到页面顶端</li>
-											<li>修改冻结列选框无效及样式问题</li>
-											<li>修复部门四层级修改祖级无效问题</li>
-											<li>更换开关切换按钮样式</li>
-											<li>新增select2-bootstrap美化下拉框</li>
-											<li>添加表格内图片预览方法</li>
-											<li>修复权限校验失败跳转页面路径错误</li>
-											<li>国际化资源文件调整</li>
-											<li>通知公告布局调整</li>
-											<li>删除页签操作功能</li>
-											<li>表格树新增查询指定列值</li>
-											<li>更改系统接口扫描方式及完善测试案例</li>
-											<li>表格列浮动提示及字典回显默认去背景</li>
-											<li>修复启用翻页记住前面的选择check没选中问题</li>
-											<li>去除监控页面底部的广告</li>
-											<li>日期控件功问题修复及data功能增强</li>
-											<li>新增角色权限可见性(前端直接调用)</li>
-											<li>新增获取当前登录用户方法(前端及子模块调用)</li>
-											<li>修复热部署重启导致菜单丢失问题</li>
-											<li>优化业务校验失败普通请求跳转页面</li>
-											<li>操作日志新增状态条件查询</li>
-											<li>操作类型支持多选条件查询</li>
-											<li>通知公告防止滚动触底回弹优化</li>
-											<li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							 </div>
-                             <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v33">v3.3.0</a><code class="pull-right">2019.04.01</code>
-								   </h5>
-								</div>
-								<div id="v33" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-											<li>新增线程池统一管理</li>
-											<li>新增支持左右冻结列</li>
-											<li>新增表格字符超长浮动提示</li>
-											<li>升级datepicker拓展并汉化</li>
-											<li>升级druid到最新版本v1.1.14</li>
-											<li>修复个人头像为图片服务器跨域问题</li>
-											<li>修改上传文件按日期存储</li>
-											<li>新增表格客户端分页选项</li>
-											<li>新增表格的高度参数</li>
-											<li>新增表格销毁方法</li>
-											<li>新增表格下拉按钮切换方法</li>
-											<li>新增表格分页跳转到指定页码</li>
-											<li>新增表格启用点击选中行参数</li>
-											<li>修复表格数据重新加载未触发部分按钮禁用</li>
-											<li>使用jsonview展示操作日志参数</li>
-											<li>新增方法(addTab、editTab)</li>
-											<li>修改用户管理界面为Tab打开方式</li>
-											<li>表单验证代码优化</li>
-											<li>修复@Excel注解 prompt 属性使用报错</li>
-											<li>修复combo属性Excel兼容性问题</li>
-											<li>新增@Excel导入导出支持父类字段</li>
-											<li>修复关闭最后选项卡无法激活滚动问题</li>
-											<li>增加日期控件显示类型及回显格式扩展选项</li>
-											<li>修复定时任务执行失败后入库状态为成功状态</li>
-											<li>支持定时任务并发开关控制</li>
-											<li>优化权限校验失败普通请求跳转页面</li>
-											<li>捕获线程池执行任务抛出的异常</li>
-											<li>修复IE浏览器导出功能报错</li>
-											<li>新增角色管理分配用户功能</li>
-											<li>新增表格翻页记住前面的选择</li>
-											<li>调整用户个人中心页面</li>
-											<li>修复界面存在的一些安全问题</li>
-											<li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v32">v3.2.0</a><code class="pull-right">2019.01.18</code>
-								   </h5>
-								</div>
-								<div id="v32" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-											<li>部门修改时不允许选择最后节点</li>
-											<li>修复部门菜单排序字段无效</li>
-											<li>修复光驱磁盘导致服务监控异常</li>
-											<li>登录界面去除check插件</li>
-											<li>验证码文本字符间距修正</li>
-											<li>升级SpringBoot到最新版本2.1.1</li>
-											<li>升级MYSQL驱动</li>
-											<li>修正登录必填项位置偏移</li>
-											<li>Session会话检查优化</li>
-											<li>Excel注解支持多级获取</li>
-											<li>新增序列号生成方法</li>
-											<li>修复WAR部署tomcat退出线程异常</li>
-											<li>全屏操作增加默认确认/关闭</li>
-											<li>修复个人信息可能导致漏洞</li>
-											<li>字典数据根据下拉选择新增类型</li>
-											<li>升级Summernote到最新版本v0.8.11</li>
-											<li>新增用户数据导入</li>
-											<li>首页主题样式更换</li>
-											<li>layer扩展主题更换</li>
-											<li>用户管理移动端默认隐藏左侧布局</li>
-											<li>详细信息弹出层显示在顶层</li>
-											<li>表格支持切换状态(用户/角色/定时任务)</li>
-											<li>Druid数据源支持配置继承</li>
-											<li>修正部分iPhone手机端表格适配问题</li>
-											<li>新增防止重复提交表单方法</li>
-											<li>新增表格数据统计汇总方法</li>
-											<li>支持富文本上传图片文件</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v31">v3.1.0</a><code class="pull-right">2018.12.03</code>
-								   </h5>
-								</div>
-								<div id="v31" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-											<li>新增内网不获取IP地址</li>
-											<li>新增cron表达式有效校验</li>
-											<li>定时任务新增详细信息</li>
-											<li>定时任务默认策略修改(不触发立即执行)</li>
-											<li>定时任务显示下一个执行周期</li>
-											<li>支持前端任意日期格式处理</li>
-											<li>上传头像删除多余提交按钮</li>
-											<li>表格增加行间隔色配置项</li>
-											<li>表格增加转义HTML字符串配置项</li>
-											<li>表格增加显示/隐藏指定列</li>
-											<li>代码生成优化</li>
-											<li>操作日志参数格式化显示</li>
-											<li>页签新增新增全屏显示</li>
-											<li>新增一键打包部署</li>
-											<li>Excel注解新增多个参数</li>
-											<li>新增提交静默更新表格方法</li>
-											<li>新增服务监控菜单</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-							<div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v30">v3.0.0</a><code class="pull-right">2018.10.08</code>
-								   </h5>
-								</div>
-								<div id="v30" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-											<li>升级poi到最新版3.17</li>
-											<li>导出修改临时目录绝对路径</li>
-											<li>升级laydate到最新版5.0.9</li>
-											<li>升级SpringBoot到最新版本2.0.5</li>
-											<li>优化开始/结束时间校验限制</li>
-											<li>重置密码参数表中获取默认值</li>
-											<li>修复头像修改显示问题</li>
-											<li>新增数据权限过滤注解</li>
-											<li>新增表格检索折叠按钮</li>
-											<li>新增清空(登录、操作、调度)日志</li>
-											<li>固定按钮位置(提交/关闭)</li>
-											<li>部门/菜单支持(展开/折叠)</li>
-											<li>部分细节调整优化</li>
-											<li>项目采用分模块</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-							<div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v24">v2.4.0</a><code class="pull-right">2018.09.03</code>
-								   </h5>
-								</div>
-								<div id="v24" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-											<li>支持部门多级查询</li>
-											<li>修复菜单状态查询无效</li>
-											<li>支持IP地址开关</li>
-											<li>支持XSS开关</li>
-											<li>记录日志异步处理</li>
-											<li>字典回显样式更改为下拉框</li>
-											<li>菜单类型必填校验</li>
-											<li>修复在线用户排序报错</li>
-											<li>增加重置按钮</li>
-											<li>支持注解导入数据</li>
-											<li>支持弹层外区域关闭</li>
-											<li>备注更换为文本区域</li>
-											<li>新增角色逻辑删除</li>
-											<li>新增部门逻辑删除</li>
-											<li>支持部门数据权限</li>
-											<li>管理员默认拥有所有授权</li>
-											<li>字典数据采用分页</li>
-											<li>部分细节调整优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-									<div class="panel-heading">
-									   <h5 class="panel-title">
-										   <a data-toggle="collapse" data-parent="#version" href="#v23">v2.3.0</a><code class="pull-right">2018.08.06</code>
-									   </h5>
-									</div>
-									<div id="v23" class="panel-collapse collapse">
-										<div class="panel-body">
-										   <ol>
-										        <li>支持表格不分页开关控制</li>
-										        <li>修改字典类型同步修改字典数据</li>
-										        <li>代码生成新增修改后缀处理</li>
-										        <li>代码生成新增实体toString</li>
-										        <li>代码生成非字符串去除!=''</li>
-												<li>导出数据前加载遮罩层</li>
-												<li>部门删除校验条件修改</li>
-												<li>搜索查询下载优化</li>
-												<li>手机打开弹出层自适应</li>
-												<li>角色岗位禁用显示置灰</li>
-												<li>角色禁用不显示菜单</li>
-												<li>新增导出权限</li>
-												<li>角色权限唯一校验</li>
-												<li>岗位名称编码唯一校验</li>
-                                                <li>TreeTable优化</li>
-                                                <li>支持多数据源</li>
-												<li>其他细节优化</li>
-											</ol>
-										</div>
-									</div>
-								</div>
-                                <div class="panel panel-default">
-									<div class="panel-heading">
-									   <h5 class="panel-title">
-										   <a data-toggle="collapse" data-parent="#version" href="#v22">v2.2.0</a><code class="pull-right">2018.07.23</code>
-									   </h5>
-									</div>
-									<div id="v22" class="panel-collapse collapse">
-										<div class="panel-body">
-										   <ol>
-										        <li>修复批量生成代码异常问题</li>
-										        <li>修复定时器保存失败问题</li>
-										        <li>修复热部署转换问题</li>
-												<li>支持查询菜单管理,部门管理</li>
-												<li>大多数功能支持时间查询</li>
-												<li>自定义导出注解自动匹配column</li>
-												<li>新增任务执行策略</li>
-												<li>操作详细动态显示类型</li>
-												<li>支持动态回显字典数据</li>
-												<li>后台代码优化调整</li>
-												<li>其他细节优化</li>
-											</ol>
-										</div>
-									</div>
-								</div>
-                                <div class="panel panel-default">
-									<div class="panel-heading">
-									   <h5 class="panel-title">
-										   <a data-toggle="collapse" data-parent="#version" href="#v21">v2.1.0</a><code class="pull-right">2018.07.10</code>
-									   </h5>
-									</div>
-									<div id="v21" class="panel-collapse collapse">
-										<div class="panel-body">
-										   <ol>
-										        <li>新增登录超时提醒</li>
-										        <li>修复定时器热部署转换问题</li>
-										        <li>修复登录验证码校验无效问题</li>
-												<li>定时任务新增立即执行一次</li>
-												<li>存在字典数据不允许删除字典</li>
-												<li>字典数据支持按名称查询</li>
-												<li>代码生成增加日志注解&表格优化</li>
-												<li>修复用户逻辑删除后能登录问题</li>
-												<li>表格支持多字段动态排序</li>
-												<li>支持三级菜单显示</li>
-												<li>新增ry.sh启动程序脚本</li>
-												<li>其他细节优化</li>
-											</ol>
-										</div>
-									</div>
-								</div>
-                            	<div class="panel panel-default">
-									<div class="panel-heading">
-									   <h5 class="panel-title">
-										   <a data-toggle="collapse" data-parent="#version" href="#v20">v2.0.0</a><code class="pull-right">2018.07.02</code>
-									   </h5>
-									</div>
-									<div id="v20" class="panel-collapse collapse">
-										<div class="panel-body">
-										   <ol>
-										        <li>升级SpringBoot到最新版本2.0.3</li>
-										        <li>新增公告管理</li>
-												<li>表单校验示提体验优化</li>
-												<li>前端通用方法封装调整</li>
-												<li>前端去除js文件,合并到html</li>
-												<li>操作加载遮罩层</li>
-												<li>支持全屏模式操作</li>
-												<li>支持注解导出数据</li>
-												<li>系统支持多查询&下载</li>
-												<li>系统样式调整</li>
-											</ol>
-										</div>
-									</div>
-								</div>
-                                <div class="panel panel-default">
-									<div class="panel-heading">
-									   <h5 class="panel-title">
-										   <a data-toggle="collapse" data-parent="#version" href="#v16">v1.1.6</a><code class="pull-right">2018.06.04</code>
-									   </h5>
-									</div>
-									<div id="v16" class="panel-collapse collapse">
-										<div class="panel-body">
-										   <ol>
-												<li>新增用户列表部门列</li>
-												<li>新增登录地点</li>
-												<li>新增swagger</li>
-												<li>修复排序数字校验</li>
-												<li>优化头像上传文件类型限定为图片</li>
-												<li>新增XSS过滤</li>
-												<li>新增热部署提高开发效率</li>
-												<li>修复treegrid居中无效</li>
-												<li>角色多条件查询</li>
-											</ol>
-										</div>
-									</div>
-								</div>
-                            	<div class="panel panel-default">
-									<div class="panel-heading">
-									   <h5 class="panel-title">
-										   <a data-toggle="collapse" data-parent="#version" href="#v15">v1.1.5</a><code class="pull-right">2018.05.28</code>
-									   </h5>
-									</div>
-									<div id="v15" class="panel-collapse collapse">
-										<div class="panel-body">
-										   <ol>
-												<li>优化登录失败刷新验证码</li>
-												<li>新增用户登录地址时间</li>
-												<li>修复ajax超时退出问题</li>
-												<li>新增html调用数据字典(若依首创)</li>
-												<li>调整系统部分样式</li>
-												<li>新增用户逻辑删除</li>
-												<li>新增管理员不允许删除修改</li>
-												<li>升级bootstrapTable到最新版本1.12.1</li>
-												<li>升级layer到最新版本3.1.1</li>
-											</ol>
-										</div>
-									</div>
-								</div>
-							    <div class="panel panel-default">
-									<div class="panel-heading">
-									   <h5 class="panel-title">
-										   <a data-toggle="collapse" data-parent="#version" href="#v14">v1.1.4</a><code class="pull-right">2018.05.20</code>
-									   </h5>
-									</div>
-									<div id="v14" class="panel-collapse collapse">
-										<div class="panel-body">
-										   <ol>
-												<li>新增参数管理</li>
-												<li>修复头像上传bug</li>
-												<li>手机邮箱唯一校验</li>
-												<li>支持手机邮箱登录</li>
-												<li>代码生成优化</li>
-												<li>支持模糊查询</li>
-												<li>支持切换主题皮肤</li>
-												<li>修改权限即时生效</li>
-												<li>修复页签Tab关闭问题</li>
-											</ol>
-										</div>
-									</div>
-								</div>
-								<div class="panel panel-default">
-									<div class="panel-heading">
-									   <h5 class="panel-title">
-										   <a data-toggle="collapse" data-parent="#version" href="#v13">v1.1.3</a><code class="pull-right">2018.05.14</code>
-									   </h5>
-									</div>
-									<div id="v13" class="panel-collapse collapse">
-										<div class="panel-body">
-										   <ol>
-												<li>新增验证码(数组计算、字符验证)</li>
-												<li>新增cookie记住我</li>
-												<li>新增头像上传</li>
-												<li>用户名密码长度限制</li>
-												<li>通用字段提取</li>
-												<li>支持自定义条件查询</li>
-												<li>部门名称必填、时间格式调整</li>
-												<li>其他细节优化</li>
-											</ol>
-										</div>
-									</div>
-								</div>
-								<div class="panel panel-default">
-									<div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v12">v1.1.2</a><code class="pull-right">2018.05.07</code>
-										</h5>
-                                    </div>
-                                    <div id="v12" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>新增个人信息修改</li>
-												<li>菜单存在子菜单不允许删除</li>
-												<li>菜单分配角色不允许删除</li>
-												<li>角色分配人员不允许删除</li>
-												<li>岗位使用后不允许删除</li>
-												<li>保证用户的数据完整性加入事物</li>
-												<li>新增环境使用手册、数据建模</li>
-												<li>Thymeleaf升级到3.0</li>
-												<li>支持非ROOT部署</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-                                <div class="panel panel-default">
-									<div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v11">v1.1.1</a><code class="pull-right">2018.04.23</code>
-										</h5>
-                                    </div>
-                                    <div id="v11" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>新增表单构建器</li>
-												<li>代码生成优化</li>
-												<li>支持新增主部门</li>
-												<li>支持选择上级部门、上级菜单</li>
-												<li>新增字典管理单条删除</li>
-												<li>优化一些其他细节</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-                                <div class="panel panel-default">
-									<div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v10">v1.1.0</a><code class="pull-right">2018.04.20</code>
-										</h5>
-                                    </div>
-                                    <div id="v10" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>支持密码盐</li>
-												<li>支持新增主目录</li>
-												<li>支持批量生成代码</li>
-												<li>支持表格导出(csv、txt、doc、excel)</li>
-												<li>自动适应宽高模式窗体</li>
-												<li>重复校验(角色名、菜单名、部门名)</li>
-												<li>优化一些其他细节</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-                                <div class="panel panel-default">
-									<div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v09">v1.0.9</a><code class="pull-right">2018.04.14</code>
-										</h5>
-                                    </div>
-                                    <div id="v09" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>新增代码生成(生成包括 java、html、js、xml、sql)</li>
-												<li>新增按钮权限控制隐藏(若依首创)</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-								<div class="panel panel-default">
-									<div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v08">v1.0.8</a><code class="pull-right">2018.04.08</code>
-										</h5>
-                                    </div>
-                                    <div id="v08" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>新增定时任务(新增、修改、删除、查询、启动/暂停)</li>
-												<li>新增调度日志(查询、删除)</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-                            	<div class="panel panel-default">
-									<div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v07">v1.0.7</a><code class="pull-right">2018.04.04</code>
-										</h5>
-                                    </div>
-                                    <div id="v07" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>新增岗位管理(新增、修改、删除、查询)</li>
-												<li>优化用户管理,菜单管理部分细节</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-								<div class="panel panel-default">
-									<div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v06">v1.0.6</a><code class="pull-right">2018.03.15</code>
-										</h5>
-                                    </div>
-                                    <div id="v06" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>新增字典管理(新增、删除、修改、查询、数据选择)</li>
-												<li>新增用户密码重置</li>
-												<li>优化一些其他细节</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-								<div class="panel panel-default">
-									<div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v05">v1.0.5</a><code class="pull-right">2018.03.12</code>
-										</h5>
-                                    </div>
-                                    <div id="v05" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>新增菜单管理(新增、删除、修改、查询、图标选择)</li>
-												<li>部门管理优化(添加责任人、联系电话、邮箱、修改者)</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-								<div class="panel panel-default">
-									<div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v04">v1.0.4</a><code class="pull-right">2018.03.11</code>
-										</h5>
-                                    </div>
-                                    <div id="v04" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>新增角色管理(新增、删除、修改、查询、菜单选择)</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-								<div class="panel panel-default">
-									<div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v03">v1.0.3</a><code class="pull-right">2018.03.08</code>
-										</h5>
-                                    </div>
-                                    <div id="v03" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>新增用户管理(新增、删除、修改、查询、部门选择)</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-                            	<div class="panel panel-default">
-									<div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v02">v1.0.2</a><code class="pull-right">2018.03.04</code>
-										</h5>
-                                    </div>
-                                    <div id="v02" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>新增部门管理 (新增、删除、修改、查询)</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-                                <div class="panel panel-default">
-                                    <div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v01">v1.0.1</a><code class="pull-right">2018.03.03</code>
-										</h5>
-                                    </div>
-                                    <div id="v01" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>新增在线用户 (批量强退、单条强退、查询)</li>
-                                                <li>新增登录日志 (批量删除、查询)</li>
-												<li>新增操作日志 (批量删除、查询、详细)</li>
-												<li>新增数据监控 (监控DB池连接和SQL的执行)</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-                                <div class="panel panel-default">
-                                    <div class="panel-heading">
-                                        <h4 class="panel-title">
-                                            <a data-toggle="collapse" data-parent="#version" href="#v00">v1.0.0</a><code class="pull-right">2018.03.01</code>
-                                        </h4>
-                                    </div>
-                                    <div id="v00" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                                <li>若依管理系统正式发布。</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="col-sm-4">
-                <div class="ibox float-e-margins">
-                    <div class="ibox-title">
-                        <h5>捐赠</h5>
-                    </div>
-                    <div class="ibox-content">
-                        <div class="alert alert-warning">
-                            	请作者喝杯咖啡(点击图片放大)
-                        </div>
-                        <p id="pay-qrcode">
-                            <a href="javascript:;"><img th:src="@{/img/pay.png}" width="100%" alt="请使用手机支付宝或者微信扫码支付">
-                            </a>
-                        </p>
-
-                    </div>
-                </div>
-            </div>
         </div>
     </div>
     <script th:src="@{/js/jquery.min.js}"></script>
     <script th:src="@{/js/bootstrap.min.js}"></script>
     <script th:src="@{/ajax/libs/layer/layer.min.js}"></script>
     <script type="text/javascript">
-	    $('#pay-qrcode').click(function(){
-	        var html=$(this).html();
-	        parent.layer.open({
-	            title: false,
-	            type: 1,
-	            closeBtn:false,
-	            shadeClose:true,
-	            area: ['600px', '360px'],
-	            content: html
-	        });
-	    });
+
     </script>
 </body>
 </html>

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů