^3a!^e7@)0^Xr}qfB(Dq7XX}q
zcm-?%e>uqIpfIq#iBr`UCBPd(AfN;osFpf{KLkCU!C1tjCc2}s$VmpadE>F3L@<_U
z4tDm2S!hB(MdFRMhgmqs!2UJ5%J~ID7Fvp)EMShEoY$-9vS!GNX87sc8Q5)Wn$jr9hN5eR;xl+o6If_rpwf0T
ze4Hqepyx@@CQ0G=qSVSj&1x&Wh()>17f4l7K;ZaRLpU$0n##gg*g!xyrwgjnfZ%V^
zT3Ps-RMAAT8X|9qs$HRL`vz^iAPF1UzQu5ULDq{$NE#Ll26m`ivtaO=Vw-eHV&OX+
zyqjc=9>flOqKtXhr*31Q)-R|k*B}^Pg~!{#nUiK&2r*E<#-z)fuANl^;sr9Ob_Vt|
z3jxt5dO1y0WaqfOCM<***k#Y0R|L0Jr|$1bh2(;41CGHS8w(Kz_P!X6*q!lRB&$d6
zv(T`sNAU)ndtLSIz$?T-b7U^A+a(4nR1NpWkg!=6I&tD^qi)E$-|%uWY5I)d+PcU>
za{-My9%Eqhsc0;kIL*MO!$)wVO1<%RY_dv<#=>%MS6jGS3$}HlQZ2mnFmF1$Gv16>4t8&8==Fk|`UY(U*GOtaU!QoXM=*$v+y*rIL6NIFmyA$6hp9*9WZMuKe>HozuDG
zX!h|^cJ@y8MxQxy8^>M@vTn{)?e65M`P5=4^Xh;(Jd*!0S&YCyojd#uy4;$GUkb+x
zbF0KDSVOZ#G#78;>`9kTALH(rV}0h$B>Lq0hn?2Vz9DmNB(vCOZ^}&er-!-a`_6GV
z044Z;2jCT`hf*j5d~ir5P>#$}yal;};;qP)6mLV`PH`3T4vKdoS5v$TxrX9ekHKb1eW3IG5A
literal 0
HcmV?d00001
diff --git a/common/service-util/target/classes/com/atguigu/context/BaseContext.class b/common/service-util/target/classes/com/atguigu/context/BaseContext.class
new file mode 100644
index 0000000000000000000000000000000000000000..bfcf1feb91e61d9beaf8d02883e9e875c7229f9c
GIT binary patch
literal 1484
zcmaiyTW`}q5QWbsY3#Ue2))n(Ep2*%q|lm6DVGKiR6;@u7pbL)r^-!MsjDQG9H;QJ
zxJa!865^R3g*fZPvC~@O!RwvbnLXdk?4Q3segW9P69XpJau~(BfgCIix7GiSTJ9?M
zJ+*9TxUW2G8a6dN5Xg2r(tA}Gn64h#$F|k9+YM{?(35t(>elS$mOyUDX|!#>>q&uf
za#SVeuDb2U)>GzXKiQsCS8H~?<+Rl{989$3Tf~ojT{*{={
z_|+4PM0y5Kz!EeT5NYbThI#rI_>Bk}O1?N?U+T+ifqYio*3<6YHo+<;nXs6|t0nW!
zFn%eCS4-lZCGXr2?{b`XIpAGM;-&mK-Uad&see6*S5M|$Vf>9GUOkDoOy1QY-cp>m
z6!4alcqxC5ca6O3(0OC{n4Sew1m=Gt_wf|Qcccb8ZLrg$LFM^=Ia(OOs5Fl6ChZh%
F{R6@%015yA
literal 0
HcmV?d00001
diff --git a/logs/service-oa/spring.log b/logs/service-oa/spring.log
new file mode 100644
index 0000000..d4e7ec6
--- /dev/null
+++ b/logs/service-oa/spring.log
@@ -0,0 +1,23 @@
+18:26:31:597 INFO 21276 --- [main] com.atguigu.auth.ServiceAuthApplication : Starting ServiceAuthApplication on bunny with PID 21276 (G:\java项目\guigu-oa-parent\service-oa\target\classes started by 13199 in G:\java项目\guigu-oa-parent)
+18:26:31:598 INFO 21276 --- [main] com.atguigu.auth.ServiceAuthApplication : The following profiles are active: dev
+18:26:32:027 WARN 21276 --- [main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.atguigu.*.mapper]' package. Please check your configuration.
+18:26:32:195 INFO 21276 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8800 (http)
+18:26:32:200 INFO 21276 --- [main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
+18:26:32:200 INFO 21276 --- [main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.39]
+18:26:32:239 INFO 21276 --- [main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
+18:26:32:239 INFO 21276 --- [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 622 ms
+18:26:32:437 INFO 21276 --- [main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
+18:26:32:836 INFO 21276 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8800 (http) with context path ''
+18:26:32:892 INFO 21276 --- [main] com.atguigu.auth.ServiceAuthApplication : Started ServiceAuthApplication in 1.512 seconds (JVM running for 1.974)
+18:27:41:337 INFO 21276 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
+18:27:45:678 INFO 20440 --- [main] com.atguigu.auth.ServiceAuthApplication : Starting ServiceAuthApplication on bunny with PID 20440 (G:\java项目\guigu-oa-parent\service-oa\target\classes started by 13199 in G:\java项目\guigu-oa-parent)
+18:27:45:680 INFO 20440 --- [main] com.atguigu.auth.ServiceAuthApplication : The following profiles are active: dev
+18:27:46:090 WARN 20440 --- [main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.atguigu.*.mapper]' package. Please check your configuration.
+18:27:46:245 INFO 20440 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8800 (http)
+18:27:46:249 INFO 20440 --- [main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
+18:27:46:249 INFO 20440 --- [main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.39]
+18:27:46:284 INFO 20440 --- [main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
+18:27:46:284 INFO 20440 --- [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 581 ms
+18:27:46:478 INFO 20440 --- [main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
+18:27:46:859 INFO 20440 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8800 (http) with context path ''
+18:27:46:901 INFO 20440 --- [main] com.atguigu.auth.ServiceAuthApplication : Started ServiceAuthApplication in 1.425 seconds (JVM running for 1.84)
diff --git a/model/pom.xml b/model/pom.xml
new file mode 100644
index 0000000..1b7d76b
--- /dev/null
+++ b/model/pom.xml
@@ -0,0 +1,37 @@
+
+ 4.0.0
+
+ com.atguigu
+ guigu-oa-parent
+ 1.0-SNAPSHOT
+
+
+ model
+ jar
+
+ model
+ https://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+
+ org.projectlombok
+ lombok
+
+
+ com.github.xiaoymin
+ knife4j-spring-boot-starter
+ provided
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ provided
+
+
+
diff --git a/model/src/main/java/com/atguigu/model/base/BaseEntity.java b/model/src/main/java/com/atguigu/model/base/BaseEntity.java
new file mode 100644
index 0000000..82acbf4
--- /dev/null
+++ b/model/src/main/java/com/atguigu/model/base/BaseEntity.java
@@ -0,0 +1,32 @@
+package com.atguigu.model.base;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+public class BaseEntity implements Serializable {
+
+ @TableId(type = IdType.AUTO)
+ private Long id;
+
+ @TableField("create_time")
+ private Date createTime;
+
+ @TableField("update_time")
+ private Date updateTime;
+
+ @TableLogic
+ @TableField("is_deleted")
+ private Integer isDeleted;
+
+ @TableField(exist = false)
+ private Map param = new HashMap<>();
+}
diff --git a/model/src/main/java/com/atguigu/model/process/Process.java b/model/src/main/java/com/atguigu/model/process/Process.java
new file mode 100644
index 0000000..9e056cf
--- /dev/null
+++ b/model/src/main/java/com/atguigu/model/process/Process.java
@@ -0,0 +1,56 @@
+package com.atguigu.model.process;
+
+import com.atguigu.model.base.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(description = "Process")
+@TableName("oa_process")
+public class Process extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "审批code")
+ @TableField("process_code")
+ private String processCode;
+
+ @ApiModelProperty(value = "用户id")
+ @TableField("user_id")
+ private Long userId;
+
+ @ApiModelProperty(value = "审批模板id")
+ @TableField("process_template_id")
+ private Long processTemplateId;
+
+ @ApiModelProperty(value = "审批类型id")
+ @TableField("process_type_id")
+ private Long processTypeId;
+
+ @ApiModelProperty(value = "标题")
+ @TableField("title")
+ private String title;
+
+ @ApiModelProperty(value = "描述")
+ @TableField("description")
+ private String description;
+
+ @ApiModelProperty(value = "表单值")
+ @TableField("form_values")
+ private String formValues;
+
+ @ApiModelProperty(value = "流程实例id")
+ @TableField("process_instance_id")
+ private String processInstanceId;
+
+ @ApiModelProperty(value = "当前审批人")
+ @TableField("current_auditor")
+ private String currentAuditor;
+
+ @ApiModelProperty(value = "状态(0:默认 1:审批中 2:审批通过 -1:驳回)")
+ @TableField("status")
+ private Integer status;
+}
\ No newline at end of file
diff --git a/model/src/main/java/com/atguigu/model/process/ProcessRecord.java b/model/src/main/java/com/atguigu/model/process/ProcessRecord.java
new file mode 100644
index 0000000..f30e27c
--- /dev/null
+++ b/model/src/main/java/com/atguigu/model/process/ProcessRecord.java
@@ -0,0 +1,37 @@
+package com.atguigu.model.process;
+
+import com.atguigu.model.base.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(description = "ProcessRecord")
+@TableName("oa_process_record")
+public class ProcessRecord extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "审批流程id")
+ @TableField("process_id")
+ private Long processId;
+
+ @ApiModelProperty(value = "审批描述")
+ @TableField("description")
+ private String description;
+
+ @ApiModelProperty(value = "状态")
+ @TableField("status")
+ private Integer status;
+
+ @ApiModelProperty(value = "操作用户id")
+ @TableField("operate_user_id")
+ private Long operateUserId;
+
+ @ApiModelProperty(value = "操作用户")
+ @TableField("operate_user")
+ private String operateUser;
+
+}
\ No newline at end of file
diff --git a/model/src/main/java/com/atguigu/model/process/ProcessTemplate.java b/model/src/main/java/com/atguigu/model/process/ProcessTemplate.java
new file mode 100644
index 0000000..81f75f2
--- /dev/null
+++ b/model/src/main/java/com/atguigu/model/process/ProcessTemplate.java
@@ -0,0 +1,59 @@
+package com.atguigu.model.process;
+
+import com.atguigu.model.base.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(description = "ProcessTemplate")
+@TableName("oa_process_template")
+public class ProcessTemplate extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "模板名称")
+ @TableField("name")
+ private String name;
+
+ @ApiModelProperty(value = "图标路径")
+ @TableField("icon_url")
+ private String iconUrl;
+
+ @ApiModelProperty(value = "processTypeId")
+ @TableField("process_type_id")
+ private Long processTypeId;
+
+ @ApiModelProperty(value = "表单属性")
+ @TableField("form_props")
+ private String formProps;
+
+ @ApiModelProperty(value = "表单选项")
+ @TableField("form_options")
+ private String formOptions;
+
+ @ApiModelProperty(value = "描述")
+ @TableField("description")
+ private String description;
+
+ @ApiModelProperty(value = "流程定义key")
+ @TableField("process_definition_key")
+ private String processDefinitionKey;
+
+ @ApiModelProperty(value = "流程定义上传路process_model_id")
+ @TableField("process_definition_path")
+ private String processDefinitionPath;
+
+ @ApiModelProperty(value = "流程定义模型id")
+ @TableField("process_model_id")
+ private String processModelId;
+
+ @ApiModelProperty(value = "状态")
+ @TableField("status")
+ private Integer status;
+
+ @TableField(exist = false)
+ private String processTypeName;
+}
\ No newline at end of file
diff --git a/model/src/main/java/com/atguigu/model/process/ProcessType.java b/model/src/main/java/com/atguigu/model/process/ProcessType.java
new file mode 100644
index 0000000..c76ea57
--- /dev/null
+++ b/model/src/main/java/com/atguigu/model/process/ProcessType.java
@@ -0,0 +1,29 @@
+package com.atguigu.model.process;
+
+import com.atguigu.model.base.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel(description = "ProcessType")
+@TableName("oa_process_type")
+public class ProcessType extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "类型名称")
+ @TableField("name")
+ private String name;
+
+ @ApiModelProperty(value = "描述")
+ @TableField("description")
+ private String description;
+
+ @TableField(exist = false)
+ private List processTemplateList;
+}
\ No newline at end of file
diff --git a/model/src/main/java/com/atguigu/model/system/SysDept.java b/model/src/main/java/com/atguigu/model/system/SysDept.java
new file mode 100644
index 0000000..777c79f
--- /dev/null
+++ b/model/src/main/java/com/atguigu/model/system/SysDept.java
@@ -0,0 +1,51 @@
+package com.atguigu.model.system;
+
+import com.atguigu.model.base.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel(description = "部门")
+@TableName("sys_dept")
+public class SysDept extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "部门名称")
+ @TableField("name")
+ private String name;
+
+ @ApiModelProperty(value = "上级部门id")
+ @TableField("parent_id")
+ private Long parentId;
+
+ @ApiModelProperty(value = "树结构")
+ @TableField("tree_path")
+ private String treePath;
+
+ @ApiModelProperty(value = "排序")
+ @TableField("sort_value")
+ private Integer sortValue;
+
+ @ApiModelProperty(value = "负责人")
+ @TableField("leader")
+ private String leader;
+
+ @ApiModelProperty(value = "电话")
+ @TableField("phone")
+ private String phone;
+
+ @ApiModelProperty(value = "状态(1正常 0停用)")
+ @TableField("status")
+ private Integer status;
+
+ @ApiModelProperty(value = "下级部门")
+ @TableField(exist = false)
+ private List children;
+
+}
\ No newline at end of file
diff --git a/model/src/main/java/com/atguigu/model/system/SysLoginLog.java b/model/src/main/java/com/atguigu/model/system/SysLoginLog.java
new file mode 100644
index 0000000..b267622
--- /dev/null
+++ b/model/src/main/java/com/atguigu/model/system/SysLoginLog.java
@@ -0,0 +1,38 @@
+package com.atguigu.model.system;
+
+import com.atguigu.model.base.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+@Data
+@ApiModel(description = "SysLoginLog")
+@TableName("sys_login_log")
+public class SysLoginLog extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "用户账号")
+ @TableField("username")
+ private String username;
+
+ @ApiModelProperty(value = "登录IP地址")
+ @TableField("ipaddr")
+ private String ipaddr;
+
+ @ApiModelProperty(value = "登录状态(0成功 1失败)")
+ @TableField("status")
+ private Integer status;
+
+ @ApiModelProperty(value = "提示信息")
+ @TableField("msg")
+ private String msg;
+
+ @ApiModelProperty(value = "访问时间")
+ @TableField("access_time")
+ private Date accessTime;
+
+}
\ No newline at end of file
diff --git a/model/src/main/java/com/atguigu/model/system/SysMenu.java b/model/src/main/java/com/atguigu/model/system/SysMenu.java
new file mode 100644
index 0000000..23b954c
--- /dev/null
+++ b/model/src/main/java/com/atguigu/model/system/SysMenu.java
@@ -0,0 +1,62 @@
+package com.atguigu.model.system;
+
+import com.atguigu.model.base.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel(description = "菜单")
+@TableName("sys_menu")
+public class SysMenu extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "所属上级")
+ @TableField("parent_id")
+ private Long parentId;
+
+ @ApiModelProperty(value = "名称")
+ @TableField("name")
+ private String name;
+
+ @ApiModelProperty(value = "类型(1:菜单,2:按钮)")
+ @TableField("type")
+ private Integer type;
+
+ @ApiModelProperty(value = "路由地址")
+ @TableField("path")
+ private String path;
+
+ @ApiModelProperty(value = "组件路径")
+ @TableField("component")
+ private String component;
+
+ @ApiModelProperty(value = "权限标识")
+ @TableField("perms")
+ private String perms;
+
+ @ApiModelProperty(value = "图标")
+ @TableField("icon")
+ private String icon;
+
+ @ApiModelProperty(value = "排序")
+ @TableField("sort_value")
+ private Integer sortValue;
+
+ @ApiModelProperty(value = "状态(0:禁止,1:正常)")
+ @TableField("status")
+ private Integer status;
+
+ // 下级列表
+ @TableField(exist = false)
+ private List children;
+ //是否选中
+ @TableField(exist = false)
+ private boolean isSelect;
+}
+
diff --git a/model/src/main/java/com/atguigu/model/system/SysOperLog.java b/model/src/main/java/com/atguigu/model/system/SysOperLog.java
new file mode 100644
index 0000000..8249044
--- /dev/null
+++ b/model/src/main/java/com/atguigu/model/system/SysOperLog.java
@@ -0,0 +1,74 @@
+package com.atguigu.model.system;
+
+import com.atguigu.model.base.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+@Data
+@ApiModel(description = "SysOperLog")
+@TableName("sys_oper_log")
+public class SysOperLog extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "模块标题")
+ @TableField("title")
+ private String title;
+
+ @ApiModelProperty(value = "业务类型(0其它 1新增 2修改 3删除)")
+ @TableField("business_type")
+ private String businessType;
+
+ @ApiModelProperty(value = "方法名称")
+ @TableField("method")
+ private String method;
+
+ @ApiModelProperty(value = "请求方式")
+ @TableField("request_method")
+ private String requestMethod;
+
+ @ApiModelProperty(value = "操作类别(0其它 1后台用户 2手机端用户)")
+ @TableField("operator_type")
+ private String operatorType;
+
+ @ApiModelProperty(value = "操作人员")
+ @TableField("oper_name")
+ private String operName;
+
+ @ApiModelProperty(value = "部门名称")
+ @TableField("dept_name")
+ private String deptName;
+
+ @ApiModelProperty(value = "请求URL")
+ @TableField("oper_url")
+ private String operUrl;
+
+ @ApiModelProperty(value = "主机地址")
+ @TableField("oper_ip")
+ private String operIp;
+
+ @ApiModelProperty(value = "请求参数")
+ @TableField("oper_param")
+ private String operParam;
+
+ @ApiModelProperty(value = "返回参数")
+ @TableField("json_result")
+ private String jsonResult;
+
+ @ApiModelProperty(value = "操作状态(0正常 1异常)")
+ @TableField("status")
+ private Integer status;
+
+ @ApiModelProperty(value = "错误消息")
+ @TableField("error_msg")
+ private String errorMsg;
+
+ @ApiModelProperty(value = "操作时间")
+ @TableField("oper_time")
+ private Date operTime;
+
+}
\ No newline at end of file
diff --git a/model/src/main/java/com/atguigu/model/system/SysPost.java b/model/src/main/java/com/atguigu/model/system/SysPost.java
new file mode 100644
index 0000000..8526b61
--- /dev/null
+++ b/model/src/main/java/com/atguigu/model/system/SysPost.java
@@ -0,0 +1,33 @@
+package com.atguigu.model.system;
+
+import com.atguigu.model.base.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(description = "岗位")
+@TableName("sys_post")
+public class SysPost extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "岗位编码")
+ @TableField("post_code")
+ private String postCode;
+
+ @ApiModelProperty(value = "岗位名称")
+ @TableField("name")
+ private String name;
+
+ @ApiModelProperty(value = "显示顺序")
+ @TableField("description")
+ private String description;
+
+ @ApiModelProperty(value = "状态(1正常 0停用)")
+ @TableField("status")
+ private Integer status;
+
+}
\ No newline at end of file
diff --git a/model/src/main/java/com/atguigu/model/system/SysRole.java b/model/src/main/java/com/atguigu/model/system/SysRole.java
new file mode 100644
index 0000000..c414d07
--- /dev/null
+++ b/model/src/main/java/com/atguigu/model/system/SysRole.java
@@ -0,0 +1,32 @@
+package com.atguigu.model.system;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.atguigu.model.base.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+@ApiModel(description = "角色")
+@TableName("sys_role")
+public class SysRole extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ //@NotBlank(message = "角色名称不能为空")
+ @ApiModelProperty(value = "角色名称")
+ @TableField("role_name")
+ private String roleName;
+
+ @ApiModelProperty(value = "角色编码")
+ @TableField("role_code")
+ private String roleCode;
+
+ @ApiModelProperty(value = "描述")
+ @TableField("description")
+ private String description;
+
+}
+
diff --git a/model/src/main/java/com/atguigu/model/system/SysRoleMenu.java b/model/src/main/java/com/atguigu/model/system/SysRoleMenu.java
new file mode 100644
index 0000000..71558eb
--- /dev/null
+++ b/model/src/main/java/com/atguigu/model/system/SysRoleMenu.java
@@ -0,0 +1,26 @@
+package com.atguigu.model.system;
+
+import com.atguigu.model.base.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(description = "角色菜单")
+@TableName("sys_role_menu")
+public class SysRoleMenu extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "角色id")
+ @TableField("role_id")
+ private Long roleId;
+
+ @ApiModelProperty(value = "菜单id")
+ @TableField("menu_id")
+ private Long menuId;
+
+}
+
diff --git a/model/src/main/java/com/atguigu/model/system/SysUser.java b/model/src/main/java/com/atguigu/model/system/SysUser.java
new file mode 100644
index 0000000..8e033c2
--- /dev/null
+++ b/model/src/main/java/com/atguigu/model/system/SysUser.java
@@ -0,0 +1,69 @@
+package com.atguigu.model.system;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import com.atguigu.model.base.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel(description = "用户")
+@TableName("sys_user")
+public class SysUser extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "用户名")
+ @TableField("username")
+ private String username;
+
+ @ApiModelProperty(value = "密码")
+ @TableField("password")
+ private String password;
+
+ @ApiModelProperty(value = "姓名")
+ @TableField("name")
+ private String name;
+
+ @ApiModelProperty(value = "手机")
+ @TableField("phone")
+ private String phone;
+
+ @ApiModelProperty(value = "头像地址")
+ @TableField("head_url")
+ private String headUrl;
+
+ @ApiModelProperty(value = "部门id")
+ @TableField("dept_id")
+ private Long deptId;
+
+ @ApiModelProperty(value = "岗位id")
+ @TableField("post_id")
+ private Long postId;
+
+ @ApiModelProperty(value = "描述")
+ @TableField("description")
+ private String description;
+
+ @ApiModelProperty(value = "openId")
+ @TableField("open_id")
+ private String openId;
+
+ @ApiModelProperty(value = "状态(1:正常 0:停用)")
+ @TableField("status")
+ private Integer status;
+
+ @TableField(exist = false)
+ private List roleList;
+ //岗位
+ @TableField(exist = false)
+ private String postName;
+ //部门
+ @TableField(exist = false)
+ private String deptName;
+}
+
diff --git a/model/src/main/java/com/atguigu/model/system/SysUserRole.java b/model/src/main/java/com/atguigu/model/system/SysUserRole.java
new file mode 100644
index 0000000..86b83d8
--- /dev/null
+++ b/model/src/main/java/com/atguigu/model/system/SysUserRole.java
@@ -0,0 +1,25 @@
+package com.atguigu.model.system;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.atguigu.model.base.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(description = "用户角色")
+@TableName("sys_user_role")
+public class SysUserRole extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "角色id")
+ @TableField("role_id")
+ private Long roleId;
+
+ @ApiModelProperty(value = "用户id")
+ @TableField("user_id")
+ private Long userId;
+}
+
diff --git a/model/src/main/java/com/atguigu/model/wechat/Menu.java b/model/src/main/java/com/atguigu/model/wechat/Menu.java
new file mode 100644
index 0000000..418baa9
--- /dev/null
+++ b/model/src/main/java/com/atguigu/model/wechat/Menu.java
@@ -0,0 +1,34 @@
+package com.atguigu.model.wechat;
+
+import com.atguigu.model.base.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(description = "菜单")
+@TableName("wechat_menu")
+public class Menu extends BaseEntity {
+
+ @ApiModelProperty(value = "id")
+ @TableField("parent_id")
+ private Long parentId;
+
+ @ApiModelProperty(value = "名称")
+ private String name;
+
+ @ApiModelProperty(value = "类型")
+ private String type;
+
+ @ApiModelProperty(value = "网页 链接,用户点击菜单可打开链接")
+ private String url;
+
+ @ApiModelProperty(value = "菜单KEY值,用于消息接口推送")
+ @TableField("meun_key")
+ private String meunKey;
+
+ @ApiModelProperty(value = "排序")
+ private Integer sort;
+}
\ No newline at end of file
diff --git a/model/src/main/java/com/atguigu/vo/process/ApprovalVo.java b/model/src/main/java/com/atguigu/vo/process/ApprovalVo.java
new file mode 100644
index 0000000..bd8e7b5
--- /dev/null
+++ b/model/src/main/java/com/atguigu/vo/process/ApprovalVo.java
@@ -0,0 +1,18 @@
+package com.atguigu.vo.process;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ApprovalVo {
+
+ private Long processId;
+
+ private String taskId;
+
+ @ApiModelProperty(value = "状态")
+ private Integer status;
+
+ @ApiModelProperty(value = "审批描述")
+ private String description;
+}
diff --git a/model/src/main/java/com/atguigu/vo/process/ProcessFormVo.java b/model/src/main/java/com/atguigu/vo/process/ProcessFormVo.java
new file mode 100644
index 0000000..2b99872
--- /dev/null
+++ b/model/src/main/java/com/atguigu/vo/process/ProcessFormVo.java
@@ -0,0 +1,20 @@
+package com.atguigu.vo.process;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(description = "流程表单")
+public class ProcessFormVo {
+
+ @ApiModelProperty(value = "审批模板id")
+ private Long processTemplateId;
+
+ @ApiModelProperty(value = "审批类型id")
+ private Long processTypeId;
+
+ @ApiModelProperty(value = "表单值")
+ private String formValues;
+
+}
\ No newline at end of file
diff --git a/model/src/main/java/com/atguigu/vo/process/ProcessQueryVo.java b/model/src/main/java/com/atguigu/vo/process/ProcessQueryVo.java
new file mode 100644
index 0000000..ea0809c
--- /dev/null
+++ b/model/src/main/java/com/atguigu/vo/process/ProcessQueryVo.java
@@ -0,0 +1,31 @@
+package com.atguigu.vo.process;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(description = "Process")
+public class ProcessQueryVo {
+
+ @ApiModelProperty(value = "关键字")
+ private String keyword;
+
+ @ApiModelProperty(value = "用户id")
+ private Long userId;
+
+ @TableField("process_template_id")
+ private Long processTemplateId;
+
+ @ApiModelProperty(value = "审批类型id")
+ private Long processTypeId;
+
+ private String createTimeBegin;
+ private String createTimeEnd;
+
+ @ApiModelProperty(value = "状态(0:默认 1:审批中 2:审批通过 -1:驳回)")
+ private Integer status;
+
+
+}
\ No newline at end of file
diff --git a/model/src/main/java/com/atguigu/vo/process/ProcessVo.java b/model/src/main/java/com/atguigu/vo/process/ProcessVo.java
new file mode 100644
index 0000000..f706507
--- /dev/null
+++ b/model/src/main/java/com/atguigu/vo/process/ProcessVo.java
@@ -0,0 +1,59 @@
+package com.atguigu.vo.process;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@ApiModel(description = "Process")
+public class ProcessVo {
+
+ private Long id;
+
+ private Date createTime;
+
+ @ApiModelProperty(value = "审批code")
+ private String processCode;
+
+ @ApiModelProperty(value = "用户id")
+ private Long userId;
+ private String name;
+
+ @TableField("process_template_id")
+ private Long processTemplateId;
+ private String processTemplateName;
+
+ @ApiModelProperty(value = "审批类型id")
+ private Long processTypeId;
+ private String processTypeName;
+
+ @ApiModelProperty(value = "标题")
+ private String title;
+
+ @ApiModelProperty(value = "描述")
+ private String description;
+
+ @ApiModelProperty(value = "表单属性")
+ private String formProps;
+
+ @ApiModelProperty(value = "表单选项")
+ private String formOptions;
+
+ @ApiModelProperty(value = "表单属性值")
+ private String formValues;
+
+ @ApiModelProperty(value = "流程实例id")
+ private String processInstanceId;
+
+ @ApiModelProperty(value = "当前审批人")
+ private String currentAuditor;
+
+ @ApiModelProperty(value = "状态(0:默认 1:审批中 2:审批通过 -1:驳回)")
+ private Integer status;
+
+ private String taskId;
+
+}
\ No newline at end of file
diff --git a/model/src/main/java/com/atguigu/vo/system/AssginMenuVo.java b/model/src/main/java/com/atguigu/vo/system/AssginMenuVo.java
new file mode 100644
index 0000000..af63ae2
--- /dev/null
+++ b/model/src/main/java/com/atguigu/vo/system/AssginMenuVo.java
@@ -0,0 +1,20 @@
+package com.atguigu.vo.system;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@ApiModel(description = "分配菜单")
+@Data
+public class AssginMenuVo {
+
+ @ApiModelProperty(value = "角色id")
+ private Long roleId;
+
+ @ApiModelProperty(value = "菜单id列表")
+ private List menuIdList;
+
+}
diff --git a/model/src/main/java/com/atguigu/vo/system/AssginRoleVo.java b/model/src/main/java/com/atguigu/vo/system/AssginRoleVo.java
new file mode 100644
index 0000000..0506d33
--- /dev/null
+++ b/model/src/main/java/com/atguigu/vo/system/AssginRoleVo.java
@@ -0,0 +1,20 @@
+package com.atguigu.vo.system;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@ApiModel(description = "分配菜单")
+@Data
+public class AssginRoleVo {
+
+ @ApiModelProperty(value = "用户id")
+ private Long userId;
+
+ @ApiModelProperty(value = "角色id列表")
+ private List roleIdList;
+
+}
diff --git a/model/src/main/java/com/atguigu/vo/system/LoginVo.java b/model/src/main/java/com/atguigu/vo/system/LoginVo.java
new file mode 100644
index 0000000..2018302
--- /dev/null
+++ b/model/src/main/java/com/atguigu/vo/system/LoginVo.java
@@ -0,0 +1,34 @@
+package com.atguigu.vo.system;
+
+
+/**
+ * 登录对象
+ */
+public class LoginVo {
+
+ /**
+ * 手机号
+ */
+ private String username;
+
+ /**
+ * 密码
+ */
+ private String password;
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+}
diff --git a/model/src/main/java/com/atguigu/vo/system/MetaVo.java b/model/src/main/java/com/atguigu/vo/system/MetaVo.java
new file mode 100644
index 0000000..6acb07a
--- /dev/null
+++ b/model/src/main/java/com/atguigu/vo/system/MetaVo.java
@@ -0,0 +1,33 @@
+package com.atguigu.vo.system;
+
+import lombok.Data;
+
+/**
+ * 路由显示信息
+ *
+ */
+@Data
+public class MetaVo
+{
+ /**
+ * 设置该路由在侧边栏和面包屑中展示的名字
+ */
+ private String title;
+
+ /**
+ * 设置该路由的图标,对应路径src/assets/icons/svg
+ */
+ private String icon;
+
+ public MetaVo()
+ {
+ }
+
+ public MetaVo(String title, String icon)
+ {
+ this.title = title;
+ this.icon = icon;
+ }
+
+}
+
diff --git a/model/src/main/java/com/atguigu/vo/system/RouterVo.java b/model/src/main/java/com/atguigu/vo/system/RouterVo.java
new file mode 100644
index 0000000..a108acf
--- /dev/null
+++ b/model/src/main/java/com/atguigu/vo/system/RouterVo.java
@@ -0,0 +1,50 @@
+package com.atguigu.vo.system;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 路由配置信息
+ *
+ */
+@Data
+public class RouterVo
+{
+ /**
+ * 路由名字
+ */
+ //private String name;
+
+ /**
+ * 路由地址
+ */
+ private String path;
+
+ /**
+ * 是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现
+ */
+ private boolean hidden;
+
+ /**
+ * 组件地址
+ */
+ private String component;
+
+ /**
+ * 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面
+ */
+ private Boolean alwaysShow;
+
+ /**
+ * 其他元素
+ */
+ private MetaVo meta;
+
+ /**
+ * 子路由
+ */
+ private List children;
+
+
+}
diff --git a/model/src/main/java/com/atguigu/vo/system/SysLoginLogQueryVo.java b/model/src/main/java/com/atguigu/vo/system/SysLoginLogQueryVo.java
new file mode 100644
index 0000000..4fdd194
--- /dev/null
+++ b/model/src/main/java/com/atguigu/vo/system/SysLoginLogQueryVo.java
@@ -0,0 +1,16 @@
+package com.atguigu.vo.system;
+
+import lombok.Data;
+import io.swagger.annotations.ApiModelProperty;
+
+@Data
+public class SysLoginLogQueryVo {
+
+ @ApiModelProperty(value = "用户账号")
+ private String username;
+
+ private String createTimeBegin;
+ private String createTimeEnd;
+
+}
+
diff --git a/model/src/main/java/com/atguigu/vo/system/SysOperLogQueryVo.java b/model/src/main/java/com/atguigu/vo/system/SysOperLogQueryVo.java
new file mode 100644
index 0000000..5c28d5a
--- /dev/null
+++ b/model/src/main/java/com/atguigu/vo/system/SysOperLogQueryVo.java
@@ -0,0 +1,15 @@
+package com.atguigu.vo.system;
+
+import lombok.Data;
+
+@Data
+public class SysOperLogQueryVo {
+
+ private String title;
+ private String operName;
+
+ private String createTimeBegin;
+ private String createTimeEnd;
+
+}
+
diff --git a/model/src/main/java/com/atguigu/vo/system/SysPostQueryVo.java b/model/src/main/java/com/atguigu/vo/system/SysPostQueryVo.java
new file mode 100644
index 0000000..72ec96d
--- /dev/null
+++ b/model/src/main/java/com/atguigu/vo/system/SysPostQueryVo.java
@@ -0,0 +1,19 @@
+package com.atguigu.vo.system;
+
+import lombok.Data;
+
+@Data
+public class SysPostQueryVo {
+
+ //@ApiModelProperty(value = "岗位编码")
+ private String postCode;
+
+ //@ApiModelProperty(value = "岗位名称")
+ private String name;
+
+ //@ApiModelProperty(value = "状态(1正常 0停用)")
+ private Boolean status;
+
+
+}
+
diff --git a/model/src/main/java/com/atguigu/vo/system/SysRoleQueryVo.java b/model/src/main/java/com/atguigu/vo/system/SysRoleQueryVo.java
new file mode 100644
index 0000000..d381cbf
--- /dev/null
+++ b/model/src/main/java/com/atguigu/vo/system/SysRoleQueryVo.java
@@ -0,0 +1,29 @@
+//
+//
+package com.atguigu.vo.system;
+
+import java.io.Serializable;
+
+/**
+ *
+ * 角色查询实体
+ *
+ *
+ * @author qy
+ * @since 2019-11-08
+ */
+public class SysRoleQueryVo implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private String roleName;
+
+ public String getRoleName() {
+ return roleName;
+ }
+
+ public void setRoleName(String roleName) {
+ this.roleName = roleName;
+ }
+}
+
diff --git a/model/src/main/java/com/atguigu/vo/system/SysUserQueryVo.java b/model/src/main/java/com/atguigu/vo/system/SysUserQueryVo.java
new file mode 100644
index 0000000..3dfc591
--- /dev/null
+++ b/model/src/main/java/com/atguigu/vo/system/SysUserQueryVo.java
@@ -0,0 +1,30 @@
+//
+//
+package com.atguigu.vo.system;
+
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ *
+ * 用户查询实体
+ *
+ */
+@Data
+public class SysUserQueryVo implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private String keyword;
+
+ private String createTimeBegin;
+ private String createTimeEnd;
+
+ private Long roleId;
+ private Long postId;
+ private Long deptId;
+
+}
+
diff --git a/model/src/main/java/com/atguigu/vo/wechat/BindPhoneVo.java b/model/src/main/java/com/atguigu/vo/wechat/BindPhoneVo.java
new file mode 100644
index 0000000..5f8ff9b
--- /dev/null
+++ b/model/src/main/java/com/atguigu/vo/wechat/BindPhoneVo.java
@@ -0,0 +1,15 @@
+package com.atguigu.vo.wechat;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class BindPhoneVo {
+
+ @ApiModelProperty(value = "手机")
+ private String phone;
+
+ @ApiModelProperty(value = "openId")
+ private String openId;
+}
diff --git a/model/src/main/java/com/atguigu/vo/wechat/MenuVo.java b/model/src/main/java/com/atguigu/vo/wechat/MenuVo.java
new file mode 100644
index 0000000..27ca374
--- /dev/null
+++ b/model/src/main/java/com/atguigu/vo/wechat/MenuVo.java
@@ -0,0 +1,39 @@
+package com.atguigu.vo.wechat;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel(description = "菜单")
+public class MenuVo {
+
+ @ApiModelProperty(value = "id")
+ private Long id;
+
+ @ApiModelProperty(value = "id")
+ private Long parentId;
+
+ @ApiModelProperty(value = "名称")
+ private String name;
+
+ @ApiModelProperty(value = "类型")
+ private String type;
+
+ @ApiModelProperty(value = "url")
+ private String url;
+
+ @ApiModelProperty(value = "菜单key")
+ private String meunKey;
+
+ @ApiModelProperty(value = "排序")
+ private Integer sort;
+
+ @ApiModelProperty(value = "下级")
+ @TableField(exist = false)
+ private List children;
+
+}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..e29af07
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,82 @@
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.3.6.RELEASE
+
+
+ com.atguigu
+ guigu-oa-parent
+ 1.0-SNAPSHOT
+ pom
+
+ guigu-oa-parent
+ https://maven.apache.org
+
+ common
+ model
+ service-oa
+
+
+
+ UTF-8
+ 1.8
+ 3.4.1
+ 8.0.30
+ 3.0.3
+ 0.9.1
+ 2.0.21
+
+
+
+
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ ${mybatis-plus.version}
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.version}
+
+
+
+ com.github.xiaoymin
+ knife4j-spring-boot-starter
+ ${knife4j.version}
+
+
+
+ io.jsonwebtoken
+ jjwt
+ ${jwt.version}
+
+
+
+ com.alibaba
+ fastjson
+ ${fastjson.version}
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.1
+
+ 1.8
+ 1.8
+
+
+
+
+
diff --git a/service-oa/Dockerfile b/service-oa/Dockerfile
new file mode 100644
index 0000000..ef109ac
--- /dev/null
+++ b/service-oa/Dockerfile
@@ -0,0 +1,21 @@
+FROM openjdk:17
+MAINTAINER bunny
+
+#系统编码
+ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
+
+# 设置时区,构建镜像时执行的命令
+RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
+RUN echo "Asia/Shanghai" > /etc/timezone
+
+# 设定工作目录
+WORKDIR /home/bunny
+
+# 复制jar包
+COPY target/*.jar /home/bunny/app.jar
+
+#启动容器时的进程
+ENTRYPOINT ["java","-jar","/home/bunny/app.jar"]
+
+#暴露 8080 端口
+EXPOSE 8080
\ No newline at end of file
diff --git a/service-oa/pom.xml b/service-oa/pom.xml
new file mode 100644
index 0000000..2f0d8f9
--- /dev/null
+++ b/service-oa/pom.xml
@@ -0,0 +1,54 @@
+
+ 4.0.0
+
+ com.atguigu
+ guigu-oa-parent
+ 1.0-SNAPSHOT
+
+
+ service-oa
+ jar
+
+ service-oa
+ https://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+ com.atguigu
+ model
+ 1.0-SNAPSHOT
+
+
+ com.atguigu
+ service-util
+ 1.0-SNAPSHOT
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+ com.github.xiaoymin
+ knife4j-spring-boot-starter
+
+
+
+
+ ${project.artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/service-oa/src/main/java/com/atguigu/auth/ServiceAuthApplication.java b/service-oa/src/main/java/com/atguigu/auth/ServiceAuthApplication.java
new file mode 100644
index 0000000..ed1763e
--- /dev/null
+++ b/service-oa/src/main/java/com/atguigu/auth/ServiceAuthApplication.java
@@ -0,0 +1,13 @@
+package com.atguigu.auth;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+@SpringBootApplication
+@ComponentScan("com.atguigu")
+public class ServiceAuthApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(ServiceAuthApplication.class, args);
+ }
+}
\ No newline at end of file
diff --git a/service-oa/src/main/java/com/atguigu/auth/config/Knife4jConfig.java b/service-oa/src/main/java/com/atguigu/auth/config/Knife4jConfig.java
new file mode 100644
index 0000000..d7aff99
--- /dev/null
+++ b/service-oa/src/main/java/com/atguigu/auth/config/Knife4jConfig.java
@@ -0,0 +1,56 @@
+package com.atguigu.auth.config;
+
+import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.ParameterBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.schema.ModelRef;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.service.Parameter;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Configuration
+@EnableKnife4j
+public class Knife4jConfig {
+ @Bean
+ public Docket adminApiConfig() {
+ List pars = new ArrayList<>();
+ ParameterBuilder tokenPar = new ParameterBuilder();
+ tokenPar.name("token")
+ .description("用户token")
+ .defaultValue("")
+ .modelRef(new ModelRef("string"))
+ .parameterType("header")
+ .required(false)
+ .build();
+ pars.add(tokenPar.build());
+ // 添加head参数end
+
+ return new Docket(DocumentationType.SWAGGER_2)
+ .groupName("adminApi")
+ .apiInfo(adminApiInfo())
+ .select()
+ // 只显示admin路径下的页面
+ .apis(RequestHandlerSelectors.basePackage("com.atguigu"))
+ .paths(PathSelectors.regex("/admin/.*"))
+ .build()
+ .globalOperationParameters(pars);
+ }
+
+ private ApiInfo adminApiInfo() {
+ return new ApiInfoBuilder()
+ .title("后台管理系统-API文档")
+ .description("本文档描述了后台管理系统微服务接口定义")
+ .version("1.0")
+ .contact(new Contact("atguigu", "http://atguigu.com", "atguigu@qq.com"))
+ .build();
+ }
+}
\ No newline at end of file
diff --git a/service-oa/src/main/resources/application-dev.yml b/service-oa/src/main/resources/application-dev.yml
new file mode 100644
index 0000000..2ea6574
--- /dev/null
+++ b/service-oa/src/main/resources/application-dev.yml
@@ -0,0 +1,21 @@
+server:
+ port: 8800
+
+bunny:
+ datasource:
+ host: 106.15.251.123
+ port: 3305
+ sqlData: guigu-oa
+ username: root
+ password: "02120212"
+
+# nacos:
+# server-addr: z-bunny.cn:8848
+# discovery:
+# namespace: ssyx
+#
+# minio:
+# endpointUrl: "http://129.211.31.58:9000"
+# bucket-name: ssyx
+# accessKey: bunny
+# secretKey: "02120212"
\ No newline at end of file
diff --git a/service-oa/src/main/resources/application.yml b/service-oa/src/main/resources/application.yml
new file mode 100644
index 0000000..856c064
--- /dev/null
+++ b/service-oa/src/main/resources/application.yml
@@ -0,0 +1,34 @@
+server:
+ port: 8800
+
+spring:
+ application:
+ name: service-oa
+ profiles:
+ active: dev
+
+ datasource:
+ type: com.zaxxer.hikari.HikariDataSource
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ url: jdbc:mysql://${bunny.datasource.host}:${bunny.datasource.port}/${bunny.datasource.sqlData}?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8&allowPublicKeyRetrieval=true
+ username: ${bunny.datasource.username}
+ password: ${bunny.datasource.password}
+
+ jackson:
+ date-format: yyyy-MM-dd HH:mm:ss
+ time-zone: GMT+8
+
+mybatis-plus:
+ mapper-locations: classpath:mapper/*.xml
+ configuration:
+ log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 查看日志
+
+logging:
+ level:
+ com.atguigu.auth.mapper: debug
+ com.atguigu.auth.controller: info
+ com.atguigu.auth.service: info
+ pattern:
+ dateformat: HH:mm:ss:SSS
+ file:
+ path: "logs/${spring.application.name}"
\ No newline at end of file
diff --git a/service-oa/src/main/resources/banner.txt b/service-oa/src/main/resources/banner.txt
new file mode 100644
index 0000000..cc77fc2
--- /dev/null
+++ b/service-oa/src/main/resources/banner.txt
@@ -0,0 +1,16 @@
+-----------------▄██-█▄---------
+-----------------███▄██▄--------
+-----------------███████--------
+-----------------▀███████-------
+-------------------██████▄▄-----
+-------------------█████████▄---
+-------------------██████▄████--
+-------▄███████████████████████-
+-----▄███████████████████████▀--
+---▄██████████████████████------
+---███████████████████████------
+---███████████████████████------
+-▄▄██████████████████████▀------
+-█████████████████▀█████--------
+-▀██████████████▀▀-▀█████▄------
+-------▀▀▀▀▀▀▀▀▀------▀▀▀▀------
\ No newline at end of file
diff --git a/service-oa/src/main/resources/favicon.ico b/service-oa/src/main/resources/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..2f64da52ae22180ce73a6cda8d6724f8ad91a185
GIT binary patch
literal 17014
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
literal 0
HcmV?d00001
diff --git a/service-oa/target/classes/application-dev.yml b/service-oa/target/classes/application-dev.yml
new file mode 100644
index 0000000..2ea6574
--- /dev/null
+++ b/service-oa/target/classes/application-dev.yml
@@ -0,0 +1,21 @@
+server:
+ port: 8800
+
+bunny:
+ datasource:
+ host: 106.15.251.123
+ port: 3305
+ sqlData: guigu-oa
+ username: root
+ password: "02120212"
+
+# nacos:
+# server-addr: z-bunny.cn:8848
+# discovery:
+# namespace: ssyx
+#
+# minio:
+# endpointUrl: "http://129.211.31.58:9000"
+# bucket-name: ssyx
+# accessKey: bunny
+# secretKey: "02120212"
\ No newline at end of file
diff --git a/service-oa/target/classes/application.yml b/service-oa/target/classes/application.yml
new file mode 100644
index 0000000..856c064
--- /dev/null
+++ b/service-oa/target/classes/application.yml
@@ -0,0 +1,34 @@
+server:
+ port: 8800
+
+spring:
+ application:
+ name: service-oa
+ profiles:
+ active: dev
+
+ datasource:
+ type: com.zaxxer.hikari.HikariDataSource
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ url: jdbc:mysql://${bunny.datasource.host}:${bunny.datasource.port}/${bunny.datasource.sqlData}?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8&allowPublicKeyRetrieval=true
+ username: ${bunny.datasource.username}
+ password: ${bunny.datasource.password}
+
+ jackson:
+ date-format: yyyy-MM-dd HH:mm:ss
+ time-zone: GMT+8
+
+mybatis-plus:
+ mapper-locations: classpath:mapper/*.xml
+ configuration:
+ log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 查看日志
+
+logging:
+ level:
+ com.atguigu.auth.mapper: debug
+ com.atguigu.auth.controller: info
+ com.atguigu.auth.service: info
+ pattern:
+ dateformat: HH:mm:ss:SSS
+ file:
+ path: "logs/${spring.application.name}"
\ No newline at end of file
diff --git a/service-oa/target/classes/banner.txt b/service-oa/target/classes/banner.txt
new file mode 100644
index 0000000..cc77fc2
--- /dev/null
+++ b/service-oa/target/classes/banner.txt
@@ -0,0 +1,16 @@
+-----------------▄██-█▄---------
+-----------------███▄██▄--------
+-----------------███████--------
+-----------------▀███████-------
+-------------------██████▄▄-----
+-------------------█████████▄---
+-------------------██████▄████--
+-------▄███████████████████████-
+-----▄███████████████████████▀--
+---▄██████████████████████------
+---███████████████████████------
+---███████████████████████------
+-▄▄██████████████████████▀------
+-█████████████████▀█████--------
+-▀██████████████▀▀-▀█████▄------
+-------▀▀▀▀▀▀▀▀▀------▀▀▀▀------
\ No newline at end of file
diff --git a/service-oa/target/classes/favicon.ico b/service-oa/target/classes/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..2f64da52ae22180ce73a6cda8d6724f8ad91a185
GIT binary patch
literal 17014
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
literal 0
HcmV?d00001