From 5a4cefe994aaf554c4f4c5d94c325e0f3d4be358 Mon Sep 17 00:00:00 2001
From: 唐耀东 <18861537@qq.com>
Date: 星期一, 15 八月 2022 13:23:14 +0800
Subject: [PATCH] 提交代码

---
 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/BsTemplate.java                      |   53 ++
 ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/BsTemplateMapper.java                |   14 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/BsTemplateController.java |  116 ++++++
 ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/BsTemplateServiceImpl.java     |  110 ++++++
 ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/BsManualMapper.java                  |   14 
 ruoyi-oa/src/main/resources/mapper/oa/BsTemplateMapper.xml                      |   21 +
 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/BsManual.java                        |   53 ++
 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/BsTemplateVo.java                 |   70 +++
 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/BsTemplateBo.java                 |   86 ++++
 ruoyi-oa/src/main/java/com/ruoyi/oa/service/IBsManualService.java               |   56 +++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/BsManualController.java   |  116 ++++++
 ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/BsManualServiceImpl.java       |  110 ++++++
 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/BsManualVo.java                   |   70 +++
 ruoyi-oa/src/main/java/com/ruoyi/oa/service/IBsTemplateService.java             |   56 +++
 ruoyi-oa/src/main/resources/mapper/oa/BsManualMapper.xml                        |   21 +
 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/BsManualBo.java                   |   86 ++++
 16 files changed, 1,052 insertions(+), 0 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/BsManualController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/BsManualController.java
new file mode 100644
index 0000000..59f344f
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/BsManualController.java
@@ -0,0 +1,116 @@
+package com.ruoyi.web.controller.oa;
+
+import java.util.List;
+import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
+
+import lombok.RequiredArgsConstructor;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.*;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.core.validate.EditGroup;
+import com.ruoyi.common.core.validate.QueryGroup;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.oa.domain.vo.BsManualVo;
+import com.ruoyi.oa.domain.bo.BsManualBo;
+import com.ruoyi.oa.service.IBsManualService;
+import com.ruoyi.common.core.page.TableDataInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 鎵嬪唽绠$悊Controller
+ *
+ * @author ruoyi
+ * @date 2022-08-15
+ */
+@Validated
+@Api(value = "鎵嬪唽绠$悊鎺у埗鍣�", tags = {"鎵嬪唽绠$悊绠$悊"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/oa/manual")
+public class BsManualController extends BaseController {
+
+    private final IBsManualService iBsManualService;
+
+    /**
+     * 鏌ヨ鎵嬪唽绠$悊鍒楄〃
+     */
+    @ApiOperation("鏌ヨ鎵嬪唽绠$悊鍒楄〃")
+    @PreAuthorize("@ss.hasPermi('oa:manual:list')")
+    @GetMapping("/list")
+    public TableDataInfo<BsManualVo> list(@Validated(QueryGroup.class) BsManualBo bo) {
+        return iBsManualService.queryPageList(bo);
+    }
+
+    /**
+     * 瀵煎嚭鎵嬪唽绠$悊鍒楄〃
+     */
+    @ApiOperation("瀵煎嚭鎵嬪唽绠$悊鍒楄〃")
+    @PreAuthorize("@ss.hasPermi('oa:manual:export')")
+    @Log(title = "鎵嬪唽绠$悊", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public void export(@Validated BsManualBo bo, HttpServletResponse response) {
+        List<BsManualVo> list = iBsManualService.queryList(bo);
+        ExcelUtil.exportExcel(list, "鎵嬪唽绠$悊", BsManualVo.class, response);
+    }
+
+    /**
+     * 鑾峰彇鎵嬪唽绠$悊璇︾粏淇℃伅
+     */
+    @ApiOperation("鑾峰彇鎵嬪唽绠$悊璇︾粏淇℃伅")
+    @PreAuthorize("@ss.hasPermi('oa:manual:query')")
+    @GetMapping("/{id}")
+    public AjaxResult<BsManualVo> getInfo(@ApiParam("涓婚敭")
+                                                  @NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+                                                  @PathVariable("id") Long id) {
+        return AjaxResult.success(iBsManualService.queryById(id));
+    }
+
+    /**
+     * 鏂板鎵嬪唽绠$悊
+     */
+    @ApiOperation("鏂板鎵嬪唽绠$悊")
+    @PreAuthorize("@ss.hasPermi('oa:manual:add')")
+    @Log(title = "鎵嬪唽绠$悊", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public AjaxResult<Void> add(@Validated(AddGroup.class) @RequestBody BsManualBo bo) {
+        return toAjax(iBsManualService.insertByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 淇敼鎵嬪唽绠$悊
+     */
+    @ApiOperation("淇敼鎵嬪唽绠$悊")
+    @PreAuthorize("@ss.hasPermi('oa:manual:edit')")
+    @Log(title = "鎵嬪唽绠$悊", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public AjaxResult<Void> edit(@Validated(EditGroup.class) @RequestBody BsManualBo bo) {
+        return toAjax(iBsManualService.updateByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 鍒犻櫎鎵嬪唽绠$悊
+     */
+    @ApiOperation("鍒犻櫎鎵嬪唽绠$悊")
+    @PreAuthorize("@ss.hasPermi('oa:manual:remove')")
+    @Log(title = "鎵嬪唽绠$悊" , businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult<Void> remove(@ApiParam("涓婚敭涓�")
+                                       @NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+                                       @PathVariable Long[] ids) {
+        return toAjax(iBsManualService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/BsTemplateController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/BsTemplateController.java
new file mode 100644
index 0000000..03ef275
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/BsTemplateController.java
@@ -0,0 +1,116 @@
+package com.ruoyi.web.controller.oa;
+
+import java.util.List;
+import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
+
+import lombok.RequiredArgsConstructor;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.*;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.core.validate.EditGroup;
+import com.ruoyi.common.core.validate.QueryGroup;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.oa.domain.vo.BsTemplateVo;
+import com.ruoyi.oa.domain.bo.BsTemplateBo;
+import com.ruoyi.oa.service.IBsTemplateService;
+import com.ruoyi.common.core.page.TableDataInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 妯℃澘绠$悊Controller
+ *
+ * @author ruoyi
+ * @date 2022-08-15
+ */
+@Validated
+@Api(value = "妯℃澘绠$悊鎺у埗鍣�", tags = {"妯℃澘绠$悊绠$悊"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/oa/template")
+public class BsTemplateController extends BaseController {
+
+    private final IBsTemplateService iBsTemplateService;
+
+    /**
+     * 鏌ヨ妯℃澘绠$悊鍒楄〃
+     */
+    @ApiOperation("鏌ヨ妯℃澘绠$悊鍒楄〃")
+    @PreAuthorize("@ss.hasPermi('oa:template:list')")
+    @GetMapping("/list")
+    public TableDataInfo<BsTemplateVo> list(@Validated(QueryGroup.class) BsTemplateBo bo) {
+        return iBsTemplateService.queryPageList(bo);
+    }
+
+    /**
+     * 瀵煎嚭妯℃澘绠$悊鍒楄〃
+     */
+    @ApiOperation("瀵煎嚭妯℃澘绠$悊鍒楄〃")
+    @PreAuthorize("@ss.hasPermi('oa:template:export')")
+    @Log(title = "妯℃澘绠$悊", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public void export(@Validated BsTemplateBo bo, HttpServletResponse response) {
+        List<BsTemplateVo> list = iBsTemplateService.queryList(bo);
+        ExcelUtil.exportExcel(list, "妯℃澘绠$悊", BsTemplateVo.class, response);
+    }
+
+    /**
+     * 鑾峰彇妯℃澘绠$悊璇︾粏淇℃伅
+     */
+    @ApiOperation("鑾峰彇妯℃澘绠$悊璇︾粏淇℃伅")
+    @PreAuthorize("@ss.hasPermi('oa:template:query')")
+    @GetMapping("/{id}")
+    public AjaxResult<BsTemplateVo> getInfo(@ApiParam("涓婚敭")
+                                                  @NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+                                                  @PathVariable("id") Long id) {
+        return AjaxResult.success(iBsTemplateService.queryById(id));
+    }
+
+    /**
+     * 鏂板妯℃澘绠$悊
+     */
+    @ApiOperation("鏂板妯℃澘绠$悊")
+    @PreAuthorize("@ss.hasPermi('oa:template:add')")
+    @Log(title = "妯℃澘绠$悊", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public AjaxResult<Void> add(@Validated(AddGroup.class) @RequestBody BsTemplateBo bo) {
+        return toAjax(iBsTemplateService.insertByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 淇敼妯℃澘绠$悊
+     */
+    @ApiOperation("淇敼妯℃澘绠$悊")
+    @PreAuthorize("@ss.hasPermi('oa:template:edit')")
+    @Log(title = "妯℃澘绠$悊", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public AjaxResult<Void> edit(@Validated(EditGroup.class) @RequestBody BsTemplateBo bo) {
+        return toAjax(iBsTemplateService.updateByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 鍒犻櫎妯℃澘绠$悊
+     */
+    @ApiOperation("鍒犻櫎妯℃澘绠$悊")
+    @PreAuthorize("@ss.hasPermi('oa:template:remove')")
+    @Log(title = "妯℃澘绠$悊" , businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult<Void> remove(@ApiParam("涓婚敭涓�")
+                                       @NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+                                       @PathVariable Long[] ids) {
+        return toAjax(iBsTemplateService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
+    }
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/BsManual.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/BsManual.java
new file mode 100644
index 0000000..a08ce87
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/BsManual.java
@@ -0,0 +1,53 @@
+package com.ruoyi.oa.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 鎵嬪唽绠$悊瀵硅薄 bs_manual
+ *
+ * @author ruoyi
+ * @date 2022-08-15
+ */
+@Data
+@Accessors(chain = true)
+@TableName("bs_manual")
+public class BsManual extends BaseEntity {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 
+     */
+    @TableId(value = "id")
+    private Long id;
+    /**
+     * 鎵嬪唽
+     */
+    private String manual;
+    /**
+     * 鍙戝竷鐗堟湰
+     */
+    private String versionCode;
+    /**
+     * 淇鏃ユ湡
+     */
+    private String reviseTime;
+    /**
+     * 闄勪欢
+     */
+    private String fileUrl;
+    /**
+     * 鍒犻櫎鏍囪瘑
+     */
+    @TableLogic
+    private String delFlag;
+
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/BsTemplate.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/BsTemplate.java
new file mode 100644
index 0000000..8ef974b
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/BsTemplate.java
@@ -0,0 +1,53 @@
+package com.ruoyi.oa.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 妯℃澘绠$悊瀵硅薄 bs_template
+ *
+ * @author ruoyi
+ * @date 2022-08-15
+ */
+@Data
+@Accessors(chain = true)
+@TableName("bs_template")
+public class BsTemplate extends BaseEntity {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 
+     */
+    @TableId(value = "id")
+    private Long id;
+    /**
+     * 妯℃澘
+     */
+    private String templateName;
+    /**
+     * 鍙戝竷鐗堟湰
+     */
+    private String versionCode;
+    /**
+     * 淇鏃ユ湡
+     */
+    private String reviseTime;
+    /**
+     * 闄勪欢
+     */
+    private String fileUrl;
+    /**
+     * 鍒犻櫎鏍囪瘑
+     */
+    @TableLogic
+    private String delFlag;
+
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/BsManualBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/BsManualBo.java
new file mode 100644
index 0000000..ce90e7b
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/BsManualBo.java
@@ -0,0 +1,86 @@
+package com.ruoyi.oa.domain.bo;
+
+import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.core.validate.EditGroup;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+import java.util.Date;
+
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 鎵嬪唽绠$悊涓氬姟瀵硅薄 bs_manual
+ *
+ * @author ruoyi
+ * @date 2022-08-15
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("鎵嬪唽绠$悊涓氬姟瀵硅薄")
+public class BsManualBo extends BaseEntity {
+
+    /**
+     * 
+     */
+    @ApiModelProperty(value = "", required = true)
+    @NotNull(message = "涓嶈兘涓虹┖", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 鎵嬪唽
+     */
+    @ApiModelProperty(value = "鎵嬪唽", required = true)
+    @NotBlank(message = "鎵嬪唽涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String manual;
+
+    /**
+     * 鍙戝竷鐗堟湰
+     */
+    @ApiModelProperty(value = "鍙戝竷鐗堟湰", required = true)
+    @NotBlank(message = "鍙戝竷鐗堟湰涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String versionCode;
+
+    /**
+     * 淇鏃ユ湡
+     */
+    @ApiModelProperty(value = "淇鏃ユ湡", required = true)
+    @NotBlank(message = "淇鏃ユ湡涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String reviseTime;
+
+    /**
+     * 闄勪欢
+     */
+    @ApiModelProperty(value = "闄勪欢")
+    private String fileUrl;
+
+
+    /**
+     * 鍒嗛〉澶у皬
+     */
+    @ApiModelProperty("鍒嗛〉澶у皬")
+    private Integer pageSize;
+
+    /**
+     * 褰撳墠椤垫暟
+     */
+    @ApiModelProperty("褰撳墠椤垫暟")
+    private Integer pageNum;
+
+    /**
+     * 鎺掑簭鍒�
+     */
+    @ApiModelProperty("鎺掑簭鍒�")
+    private String orderByColumn;
+
+    /**
+     * 鎺掑簭鐨勬柟鍚慸esc鎴栬�卆sc
+     */
+    @ApiModelProperty(value = "鎺掑簭鐨勬柟鍚�", example = "asc,desc")
+    private String isAsc;
+
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/BsTemplateBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/BsTemplateBo.java
new file mode 100644
index 0000000..547c179
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/BsTemplateBo.java
@@ -0,0 +1,86 @@
+package com.ruoyi.oa.domain.bo;
+
+import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.core.validate.EditGroup;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+import java.util.Date;
+
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 妯℃澘绠$悊涓氬姟瀵硅薄 bs_template
+ *
+ * @author ruoyi
+ * @date 2022-08-15
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("妯℃澘绠$悊涓氬姟瀵硅薄")
+public class BsTemplateBo extends BaseEntity {
+
+    /**
+     * 
+     */
+    @ApiModelProperty(value = "", required = true)
+    @NotNull(message = "涓嶈兘涓虹┖", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 妯℃澘
+     */
+    @ApiModelProperty(value = "妯℃澘", required = true)
+    @NotBlank(message = "妯℃澘涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String templateName;
+
+    /**
+     * 鍙戝竷鐗堟湰
+     */
+    @ApiModelProperty(value = "鍙戝竷鐗堟湰", required = true)
+    @NotBlank(message = "鍙戝竷鐗堟湰涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String versionCode;
+
+    /**
+     * 淇鏃ユ湡
+     */
+    @ApiModelProperty(value = "淇鏃ユ湡", required = true)
+    @NotBlank(message = "淇鏃ユ湡涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String reviseTime;
+
+    /**
+     * 闄勪欢
+     */
+    @ApiModelProperty(value = "闄勪欢")
+    private String fileUrl;
+
+
+    /**
+     * 鍒嗛〉澶у皬
+     */
+    @ApiModelProperty("鍒嗛〉澶у皬")
+    private Integer pageSize;
+
+    /**
+     * 褰撳墠椤垫暟
+     */
+    @ApiModelProperty("褰撳墠椤垫暟")
+    private Integer pageNum;
+
+    /**
+     * 鎺掑簭鍒�
+     */
+    @ApiModelProperty("鎺掑簭鍒�")
+    private String orderByColumn;
+
+    /**
+     * 鎺掑簭鐨勬柟鍚慸esc鎴栬�卆sc
+     */
+    @ApiModelProperty(value = "鎺掑簭鐨勬柟鍚�", example = "asc,desc")
+    private String isAsc;
+
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/BsManualVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/BsManualVo.java
new file mode 100644
index 0000000..8d64a1e
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/BsManualVo.java
@@ -0,0 +1,70 @@
+package com.ruoyi.oa.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.common.annotation.ExcelDictFormat;
+import com.ruoyi.common.convert.ExcelDictConvert;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 鎵嬪唽绠$悊瑙嗗浘瀵硅薄 bs_manual
+ *
+ * @author ruoyi
+ * @date 2022-08-15
+ */
+@Data
+@ApiModel("鎵嬪唽绠$悊瑙嗗浘瀵硅薄")
+@ExcelIgnoreUnannotated
+public class BsManualVo {
+
+	private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+	@ExcelProperty(value = "")
+	@ApiModelProperty("")
+	private Long id;
+
+    /**
+     * 鎵嬪唽
+     */
+	@ExcelProperty(value = "鎵嬪唽")
+	@ApiModelProperty("鎵嬪唽")
+	private String manual;
+
+    /**
+     * 鍙戝竷鐗堟湰
+     */
+	@ExcelProperty(value = "鍙戝竷鐗堟湰")
+	@ApiModelProperty("鍙戝竷鐗堟湰")
+	private String versionCode;
+
+    /**
+     * 淇鏃ユ湡
+     */
+	@ExcelProperty(value = "淇鏃ユ湡")
+	@ApiModelProperty("淇鏃ユ湡")
+	private String reviseTime;
+
+    /**
+     * 闄勪欢
+     */
+	@ExcelProperty(value = "闄勪欢")
+	@ApiModelProperty("闄勪欢")
+	private String fileUrl;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+	@ExcelProperty(value = "鍒涘缓鏃堕棿")
+	@ApiModelProperty("鍒涘缓鏃堕棿")
+	private Date createTime;
+
+
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/BsTemplateVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/BsTemplateVo.java
new file mode 100644
index 0000000..120833e
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/BsTemplateVo.java
@@ -0,0 +1,70 @@
+package com.ruoyi.oa.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.common.annotation.ExcelDictFormat;
+import com.ruoyi.common.convert.ExcelDictConvert;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 妯℃澘绠$悊瑙嗗浘瀵硅薄 bs_template
+ *
+ * @author ruoyi
+ * @date 2022-08-15
+ */
+@Data
+@ApiModel("妯℃澘绠$悊瑙嗗浘瀵硅薄")
+@ExcelIgnoreUnannotated
+public class BsTemplateVo {
+
+	private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+	@ExcelProperty(value = "")
+	@ApiModelProperty("")
+	private Long id;
+
+    /**
+     * 妯℃澘
+     */
+	@ExcelProperty(value = "妯℃澘")
+	@ApiModelProperty("妯℃澘")
+	private String templateName;
+
+    /**
+     * 鍙戝竷鐗堟湰
+     */
+	@ExcelProperty(value = "鍙戝竷鐗堟湰")
+	@ApiModelProperty("鍙戝竷鐗堟湰")
+	private String versionCode;
+
+    /**
+     * 淇鏃ユ湡
+     */
+	@ExcelProperty(value = "淇鏃ユ湡")
+	@ApiModelProperty("淇鏃ユ湡")
+	private String reviseTime;
+
+    /**
+     * 闄勪欢
+     */
+	@ExcelProperty(value = "闄勪欢")
+	@ApiModelProperty("闄勪欢")
+	private String fileUrl;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+	@ExcelProperty(value = "鍒涘缓鏃堕棿")
+	@ApiModelProperty("鍒涘缓鏃堕棿")
+	private Date createTime;
+
+
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/BsManualMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/BsManualMapper.java
new file mode 100644
index 0000000..b49321b
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/BsManualMapper.java
@@ -0,0 +1,14 @@
+package com.ruoyi.oa.mapper;
+
+import com.ruoyi.oa.domain.BsManual;
+import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus;
+
+/**
+ * 鎵嬪唽绠$悊Mapper鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2022-08-15
+ */
+public interface BsManualMapper extends BaseMapperPlus<BsManual> {
+
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/BsTemplateMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/BsTemplateMapper.java
new file mode 100644
index 0000000..180d26c
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/BsTemplateMapper.java
@@ -0,0 +1,14 @@
+package com.ruoyi.oa.mapper;
+
+import com.ruoyi.oa.domain.BsTemplate;
+import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus;
+
+/**
+ * 妯℃澘绠$悊Mapper鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2022-08-15
+ */
+public interface BsTemplateMapper extends BaseMapperPlus<BsTemplate> {
+
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IBsManualService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IBsManualService.java
new file mode 100644
index 0000000..ea4ac73
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IBsManualService.java
@@ -0,0 +1,56 @@
+package com.ruoyi.oa.service;
+
+import com.ruoyi.oa.domain.BsManual;
+import com.ruoyi.oa.domain.vo.BsManualVo;
+import com.ruoyi.oa.domain.bo.BsManualBo;
+import com.ruoyi.common.core.mybatisplus.core.IServicePlus;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 鎵嬪唽绠$悊Service鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2022-08-15
+ */
+public interface IBsManualService extends IServicePlus<BsManual, BsManualVo> {
+	/**
+	 * 鏌ヨ鍗曚釜
+	 * @return
+	 */
+	BsManualVo queryById(Long id);
+
+	/**
+	 * 鏌ヨ鍒楄〃
+	 */
+    TableDataInfo<BsManualVo> queryPageList(BsManualBo bo);
+
+	/**
+	 * 鏌ヨ鍒楄〃
+	 */
+	List<BsManualVo> queryList(BsManualBo bo);
+
+	/**
+	 * 鏍规嵁鏂板涓氬姟瀵硅薄鎻掑叆鎵嬪唽绠$悊
+	 * @param bo 鎵嬪唽绠$悊鏂板涓氬姟瀵硅薄
+	 * @return
+	 */
+	Boolean insertByBo(BsManualBo bo);
+
+	/**
+	 * 鏍规嵁缂栬緫涓氬姟瀵硅薄淇敼鎵嬪唽绠$悊
+	 * @param bo 鎵嬪唽绠$悊缂栬緫涓氬姟瀵硅薄
+	 * @return
+	 */
+	Boolean updateByBo(BsManualBo bo);
+
+	/**
+	 * 鏍¢獙骞跺垹闄ゆ暟鎹�
+	 * @param ids 涓婚敭闆嗗悎
+	 * @param isValid 鏄惁鏍¢獙,true-鍒犻櫎鍓嶆牎楠�,false-涓嶆牎楠�
+	 * @return
+	 */
+	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IBsTemplateService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IBsTemplateService.java
new file mode 100644
index 0000000..76b9335
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IBsTemplateService.java
@@ -0,0 +1,56 @@
+package com.ruoyi.oa.service;
+
+import com.ruoyi.oa.domain.BsTemplate;
+import com.ruoyi.oa.domain.vo.BsTemplateVo;
+import com.ruoyi.oa.domain.bo.BsTemplateBo;
+import com.ruoyi.common.core.mybatisplus.core.IServicePlus;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 妯℃澘绠$悊Service鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2022-08-15
+ */
+public interface IBsTemplateService extends IServicePlus<BsTemplate, BsTemplateVo> {
+	/**
+	 * 鏌ヨ鍗曚釜
+	 * @return
+	 */
+	BsTemplateVo queryById(Long id);
+
+	/**
+	 * 鏌ヨ鍒楄〃
+	 */
+    TableDataInfo<BsTemplateVo> queryPageList(BsTemplateBo bo);
+
+	/**
+	 * 鏌ヨ鍒楄〃
+	 */
+	List<BsTemplateVo> queryList(BsTemplateBo bo);
+
+	/**
+	 * 鏍规嵁鏂板涓氬姟瀵硅薄鎻掑叆妯℃澘绠$悊
+	 * @param bo 妯℃澘绠$悊鏂板涓氬姟瀵硅薄
+	 * @return
+	 */
+	Boolean insertByBo(BsTemplateBo bo);
+
+	/**
+	 * 鏍规嵁缂栬緫涓氬姟瀵硅薄淇敼妯℃澘绠$悊
+	 * @param bo 妯℃澘绠$悊缂栬緫涓氬姟瀵硅薄
+	 * @return
+	 */
+	Boolean updateByBo(BsTemplateBo bo);
+
+	/**
+	 * 鏍¢獙骞跺垹闄ゆ暟鎹�
+	 * @param ids 涓婚敭闆嗗悎
+	 * @param isValid 鏄惁鏍¢獙,true-鍒犻櫎鍓嶆牎楠�,false-涓嶆牎楠�
+	 * @return
+	 */
+	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/BsManualServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/BsManualServiceImpl.java
new file mode 100644
index 0000000..24b27ad
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/BsManualServiceImpl.java
@@ -0,0 +1,110 @@
+package com.ruoyi.oa.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.http.HttpStatus;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.PageUtils;
+import com.ruoyi.common.core.page.PagePlus;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.oa.domain.BsTemplate;
+import org.springframework.stereotype.Service;
+import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.oa.domain.bo.BsManualBo;
+import com.ruoyi.oa.domain.vo.BsManualVo;
+import com.ruoyi.oa.domain.BsManual;
+import com.ruoyi.oa.mapper.BsManualMapper;
+import com.ruoyi.oa.service.IBsManualService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 鎵嬪唽绠$悊Service涓氬姟灞傚鐞�
+ *
+ * @author ruoyi
+ * @date 2022-08-15
+ */
+@Service
+public class BsManualServiceImpl extends ServicePlusImpl<BsManualMapper, BsManual, BsManualVo> implements IBsManualService {
+
+    @Override
+    public BsManualVo queryById(Long id){
+        return getVoById(id);
+    }
+
+    @Override
+    public TableDataInfo<BsManualVo> queryPageList(BsManualBo bo) {
+        PagePlus<BsManual, BsManualVo> result = pageVo(PageUtils.buildPagePlus(), buildQueryWrapper(bo));
+        return PageUtils.buildDataInfo(result);
+    }
+
+    @Override
+    public List<BsManualVo> queryList(BsManualBo bo) {
+        return listVo(buildQueryWrapper(bo));
+    }
+
+    private LambdaQueryWrapper<BsManual> buildQueryWrapper(BsManualBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<BsManual> lqw = Wrappers.lambdaQuery();
+        return lqw;
+    }
+
+    @Override
+    public Boolean insertByBo(BsManualBo bo) {
+        List<BsManual> list = baseMapper.selectList(new LambdaQueryWrapper<BsManual>().eq(BsManual::getManual, bo.getManual()));
+        if (list.size() > 0) {
+            throw new ServiceException("鎵嬪唽閲嶅", HttpStatus.HTTP_PARTIAL);
+        }
+        List<BsManual> vList = baseMapper.selectList(new LambdaQueryWrapper<BsManual>().eq(BsManual::getVersionCode, bo.getVersionCode()));
+        if (vList.size() > 0) {
+            throw new ServiceException("鍙戝竷鐗堟湰閲嶅", HttpStatus.HTTP_PARTIAL);
+        }
+        BsManual add = BeanUtil.toBean(bo, BsManual.class);
+        validEntityBeforeSave(add);
+        boolean flag = save(add);
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    @Override
+    public Boolean updateByBo(BsManualBo bo) {
+        List<BsManual> list = baseMapper.selectList(new LambdaQueryWrapper<BsManual>()
+            .eq(BsManual::getManual, bo.getManual())
+            .ne(BsManual::getId, bo.getId()));
+        if (list.size() > 0) {
+            throw new ServiceException("鎵嬪唽閲嶅", HttpStatus.HTTP_PARTIAL);
+        }
+        List<BsManual> vList = baseMapper.selectList(new LambdaQueryWrapper<BsManual>()
+            .eq(BsManual::getVersionCode, bo.getVersionCode())
+            .ne(BsManual::getId, bo.getId()));
+        if (vList.size() > 0) {
+            throw new ServiceException("鍙戝竷鐗堟湰閲嶅", HttpStatus.HTTP_PARTIAL);
+        }
+        BsManual update = BeanUtil.toBean(bo, BsManual.class);
+        validEntityBeforeSave(update);
+        return updateById(update);
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     *
+     * @param entity 瀹炰綋绫绘暟鎹�
+     */
+    private void validEntityBeforeSave(BsManual entity){
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return removeByIds(ids);
+    }
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/BsTemplateServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/BsTemplateServiceImpl.java
new file mode 100644
index 0000000..96476f8
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/BsTemplateServiceImpl.java
@@ -0,0 +1,110 @@
+package com.ruoyi.oa.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.http.HttpStatus;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.PageUtils;
+import com.ruoyi.common.core.page.PagePlus;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.oa.domain.BsRules;
+import org.springframework.stereotype.Service;
+import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.oa.domain.bo.BsTemplateBo;
+import com.ruoyi.oa.domain.vo.BsTemplateVo;
+import com.ruoyi.oa.domain.BsTemplate;
+import com.ruoyi.oa.mapper.BsTemplateMapper;
+import com.ruoyi.oa.service.IBsTemplateService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 妯℃澘绠$悊Service涓氬姟灞傚鐞�
+ *
+ * @author ruoyi
+ * @date 2022-08-15
+ */
+@Service
+public class BsTemplateServiceImpl extends ServicePlusImpl<BsTemplateMapper, BsTemplate, BsTemplateVo> implements IBsTemplateService {
+
+    @Override
+    public BsTemplateVo queryById(Long id){
+        return getVoById(id);
+    }
+
+    @Override
+    public TableDataInfo<BsTemplateVo> queryPageList(BsTemplateBo bo) {
+        PagePlus<BsTemplate, BsTemplateVo> result = pageVo(PageUtils.buildPagePlus(), buildQueryWrapper(bo));
+        return PageUtils.buildDataInfo(result);
+    }
+
+    @Override
+    public List<BsTemplateVo> queryList(BsTemplateBo bo) {
+        return listVo(buildQueryWrapper(bo));
+    }
+
+    private LambdaQueryWrapper<BsTemplate> buildQueryWrapper(BsTemplateBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<BsTemplate> lqw = Wrappers.lambdaQuery();
+        return lqw;
+    }
+
+    @Override
+    public Boolean insertByBo(BsTemplateBo bo) {
+        List<BsTemplate> list = baseMapper.selectList(new LambdaQueryWrapper<BsTemplate>().eq(BsTemplate::getTemplateName, bo.getTemplateName()));
+        if (list.size() > 0) {
+            throw new ServiceException("妯℃澘閲嶅", HttpStatus.HTTP_PARTIAL);
+        }
+        List<BsTemplate> vList = baseMapper.selectList(new LambdaQueryWrapper<BsTemplate>().eq(BsTemplate::getVersionCode, bo.getVersionCode()));
+        if (vList.size() > 0) {
+            throw new ServiceException("鍙戝竷鐗堟湰閲嶅", HttpStatus.HTTP_PARTIAL);
+        }
+        BsTemplate add = BeanUtil.toBean(bo, BsTemplate.class);
+        validEntityBeforeSave(add);
+        boolean flag = save(add);
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    @Override
+    public Boolean updateByBo(BsTemplateBo bo) {
+        List<BsTemplate> list = baseMapper.selectList(new LambdaQueryWrapper<BsTemplate>()
+            .eq(BsTemplate::getTemplateName, bo.getTemplateName())
+            .ne(BsTemplate::getId, bo.getId()));
+        if (list.size() > 0) {
+            throw new ServiceException("妯℃澘閲嶅", HttpStatus.HTTP_PARTIAL);
+        }
+        List<BsTemplate> vList = baseMapper.selectList(new LambdaQueryWrapper<BsTemplate>()
+            .eq(BsTemplate::getVersionCode, bo.getVersionCode())
+            .ne(BsTemplate::getId, bo.getId()));
+        if (vList.size() > 0) {
+            throw new ServiceException("鍙戝竷鐗堟湰閲嶅", HttpStatus.HTTP_PARTIAL);
+        }
+        BsTemplate update = BeanUtil.toBean(bo, BsTemplate.class);
+        validEntityBeforeSave(update);
+        return updateById(update);
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     *
+     * @param entity 瀹炰綋绫绘暟鎹�
+     */
+    private void validEntityBeforeSave(BsTemplate entity){
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return removeByIds(ids);
+    }
+}
diff --git a/ruoyi-oa/src/main/resources/mapper/oa/BsManualMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/BsManualMapper.xml
new file mode 100644
index 0000000..427d2c9
--- /dev/null
+++ b/ruoyi-oa/src/main/resources/mapper/oa/BsManualMapper.xml
@@ -0,0 +1,21 @@
+<?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.ruoyi.oa.mapper.BsManualMapper">
+
+    <resultMap type="com.ruoyi.oa.domain.BsManual" id="BsManualResult">
+        <result property="id" column="id"/>
+        <result property="manual" column="manual"/>
+        <result property="versionCode" column="version_code"/>
+        <result property="reviseTime" column="revise_time"/>
+        <result property="fileUrl" column="file_url"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="delFlag" column="del_flag"/>
+    </resultMap>
+
+
+</mapper>
diff --git a/ruoyi-oa/src/main/resources/mapper/oa/BsTemplateMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/BsTemplateMapper.xml
new file mode 100644
index 0000000..944e8fb
--- /dev/null
+++ b/ruoyi-oa/src/main/resources/mapper/oa/BsTemplateMapper.xml
@@ -0,0 +1,21 @@
+<?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.ruoyi.oa.mapper.BsTemplateMapper">
+
+    <resultMap type="com.ruoyi.oa.domain.BsTemplate" id="BsTemplateResult">
+        <result property="id" column="id"/>
+        <result property="templateName" column="template_name"/>
+        <result property="versionCode" column="version_code"/>
+        <result property="reviseTime" column="revise_time"/>
+        <result property="fileUrl" column="file_url"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="delFlag" column="del_flag"/>
+    </resultMap>
+
+
+</mapper>

--
Gitblit v1.9.1