}D?PGtu
z%Zl`zGU_`-ADc@bo9FYV89i*y@cfBe;Me$#Ysne-t;?qLrz~U?<`alc_eAbAvL^rK
z73Lnrr=LNw)SGaPob;V+{EmGY_&xsMzW>;RSASyr&wS1!;lEI}H}EDOehDEmm=EMv
jwg~VELWlw(fAyTmzA+dl#^vOR@qC}fcafMRrl9EGIme2-
literal 0
HcmV?d00001
diff --git a/common/rabbit-util/target/classes/com/atguigu/tingshu/common/rabbit/constant/MqConst.class b/common/rabbit-util/target/classes/com/atguigu/tingshu/common/rabbit/constant/MqConst.class
new file mode 100644
index 0000000000000000000000000000000000000000..c5536993ac91c90db5a7c3d770f00bdef08947aa
GIT binary patch
literal 2714
zcmb7`TXWk)6vxjdX`=?WY0_LsDTTIBk^(Z6a!p!r6*V<+Y*)5&;bvq-b(GkWk)@Qr
z^Mx25VEWJxz=vY^uPiA?c83{WZ2$J0J@?)9-~YULNksRlKSL8VIZaaqI!EUPT|Tx>
ztzy^mI>lQ1*s()F=Qmu>4Ic=aTwU9pA%!kX(@cS0qk^EhGxf3;IvpnvG<|AyBd7LM
z(9&votum&uet|C0>@;02&>YPRx@-Hrq7`-`w-XgZ*Xs<9q9WFMzE=#acH0d>-XOHR
zu(H3%VFvhofDYfT=O}N-BHFbsFhB)s7H3{M9&d5TjrU%zddFku)Gu0EsJ38iK&}Ofro{`fbg|Ad-RU4u^pwGq3rQO
z+9!GO(-
zq2qKII32m&->{Ykj(ubW9Vc%fsmqw>tXr=#j9VrvT1nGtX0@phPVQ`4FUz+5$ipdL
zN=ucfwajXzCcFC>vJq`H^18lk^Wx~HopRMgEw&*V-P3cu2z6LU=582F;ss|kzZ}~^
z{j=cBhCIx5L50+AG>{!$P9u;CaY<1I)JUNQgj_eSCQ6Imu)yPOhQ3v9G^K-G7Pxev
z22RHvgwoUXoTuG#y`}Hh%Z45gw@mr~Iyr}@ZeMkN?Yn^!Pq@r}ahT>vuvz-KXfP2>
zd(0tk?Y4ff7bo3ftvzv`Kg%bZsI|(~x`{bxvt$!x)%E%jrXjma(=E7(6~fh*UA^fB
zKUN!PdV7uQT2NKVbYdxWrh>A2OD5jqxV<5#udznen&a3S%kXVJziU
z#x?L0#s;{_*aYt}-UoljSn7YzSnB`4SnB`C_$Tnsj4iOu_z?V*v6OchA7a*o{6~n-
zBUHPHZ-MV~cm5>tdpwFRKBbswl8*6N7%I>SbwLXCvduSR3DL~l!HbyO!9E`zHSZ)OEnj7zS{oQUYCVkZGlC0e(
zQA+J~Vn05py(N%C+@;Wq!-JKe+ldv_s<2Num_%8@@}mnp#{uWJWPZxQGqUCAj?8ZQ
zZBJ&W9UQ~6M7O;ta(6w2skJ-qhi`3(Jcs8MZ13YnlWRlBjaZzc
zkuNxy5o9S0x?<85@1R72mmIu|Uyz{Tb}ruSx-Et2xx;(SZwYwT!K?VC!uYNi-^iFq
z7p}_soESN;U8?a54o(T)AzoW8_6hK`gBpIt!*F4}XX4Sh`NJERa0ahgc-_Ho8@m$8FbnC-2t6QsC(^H&+AzLdLT~zp{6UQHe59$<2nFjKsPZH-nw)u2f#^
zh1_|JdIPsVp_rO9PsMSfZuGsK%9&&`=2it}6P8wrF}Ec%PH#rCi1iaFm_gk1LN1Bv
zv;ATj*V7qUFAqv&B3U0yOlrWOGH6}`$xe-L#BO76-Q7?9ZC<~zx_*%f7()sk(JM7`uT;vnR$^F=mAQ(!`R+3oDKyl8eU2===BONX;GGxLPv
z=E1&~1Ai}rPj9SjlBX0aZmYH7$KH~Sw!#N_PMAyMx~xvU)bpy02VT`uKZQg}Z&?}k
zFV*
zWsFjqz)@V{jFTwiEnKFgv8SJ(53#B9a~faa9o{b^%v2vYIak2jXy9Fr40M>=
zf9A+Uj6dKn92N07ug5KpEZk%6yvLD^_qpe3Oj`DTFk!)V9Op+Ivv7ugw)zprli_G~
z*sF|9y55i;ZZh2io?Eizgd9XAi&x}mm
zeM`Ehdzs&3H15Stnbndfo%=VAc9aj
z)`#r^;!qzR5I`CkJgDIvI^Kz$ZSgj2q+MApn*}*uE(@F(30IEW>y$+9#g&E#@54GC
z!7hOZD&~@$aO{HVKWq7meDZwL_C0~UUCeherXYJ%$1wH?Bt7ZpiUQlaO6^FU8OHa$yejLTS
zG#u0MZagM%{N7aXq`P7jq;Vx+#%%aTv#u;!-khuuY@ZGun{wQe;Z;>4Z@6Yf-g4X}
zqe#LSfhGy&(nx#~S#TUDG@R5iiZOws|Fs21?Nq&Uj=Nx%Yjol``Lhutf%NsJ3*0#wRY-prfE4b$^)dMu5Lv(uLabl*`A4Ysv0pplnOh9yZS^^@+$
zS)9{wUdILG1a`LSqCkSxSZTIz%vlvV&!QF3F6A!I&z+qWcsN!B
zYfNLJ=D{ZRtd95KxpktvhYk8d{8psvkK4srX|on<@qnYQ6AQRg(g39!$nDG9Hk&Xz
zr?IAsM#Xzg$9r*|J&?dpvdOLrBu1`=h5ddVAAm{5HO3Sz)OaqtFa&{ujv^=+syd!O
z<2nWQie|q!PObG34xo*6XIirzHvqV#&|MUG<$n`s=RmYqTRVXLp10CYCgmbyQ#r
z>{&N2aR<2Fl$sru_^}=MmSk5ywoVrbG8?zhnnc{HSk~a`@W2upZ0*B2+m|KjvX)m=
zlbXIEutO!MLxVO}a7)AUiW4M)v7snhJ}A3gtY#P3(5}?Dp;zRB0ty7jQFV`x0>CTxnPfAWX1+%bERpChs=gEU7QrnkQ#LF4qB*>Fnc*V>&y3`{vZbRk#x~e|7-?Sw?ook#8#K=J
z@T4QFsHx-bFo|{qcV9}Dft+&7b{{y`%3T=ZSwsDZ!h64oSoq8=e
z1Ng1LOn1iIe@zhR-=%qW`n`^?;Hx|U@6J^u$BtwTHhvvhjfNLB6GU|4<<1_re-kg75t5WTDWS7WO
zj4Y)hPX>`EgUFLA@=TJUUCku7^Y*?53{>w5!}i1-Koo=GC+(c!$iOO<>3WLK-_%c!H$6|m_lIzR`
z_@n}S1`}=gyaWuS755{Ia)egFJjl4M2M2rqxp*5+9km0mQ5a@a{T~FFB+@A7Ym((h5{C-@l`{taH`-ybMXQ}!C(
Iz?;bY2Zl!>2mk;8
literal 0
HcmV?d00001
diff --git a/common/service-util/pom.xml b/common/service-util/pom.xml
new file mode 100644
index 0000000..cf9e591
--- /dev/null
+++ b/common/service-util/pom.xml
@@ -0,0 +1,92 @@
+
+
+
+ common
+ com.atguigu.tingshu
+ 1.0
+
+ 4.0.0
+
+ service-util
+
+
+
+ com.atguigu.tingshu
+ common-util
+ 1.0
+
+
+ com.atguigu.tingshu
+ model
+ 1.0
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+
+
+
+ mysql
+ mysql-connector-java
+
+
+ com.github.xiaoymin
+ knife4j-openapi3-jakarta-spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-aop
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+
+
+ org.springframework.cloud
+ spring-cloud-starter-loadbalancer
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-bootstrap
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+
diff --git a/common/service-util/src/main/java/com/atguigu/tingshu/common/config/knife4j/Knife4jConfig.java b/common/service-util/src/main/java/com/atguigu/tingshu/common/config/knife4j/Knife4jConfig.java
new file mode 100644
index 0000000..9cf3889
--- /dev/null
+++ b/common/service-util/src/main/java/com/atguigu/tingshu/common/config/knife4j/Knife4jConfig.java
@@ -0,0 +1,49 @@
+package com.atguigu.tingshu.common.config.knife4j;
+
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Contact;
+import io.swagger.v3.oas.models.info.Info;
+import org.springdoc.core.models.GroupedOpenApi;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class Knife4jConfig {
+
+ @Value("${spring.application.name}")
+ private String appName;
+
+ @Bean
+ public GroupedOpenApi webApi() {
+ return GroupedOpenApi.builder()
+ .group("web-api")
+ .pathsToMatch("/api/**")
+ .build();
+ }
+
+ /*后台管理相关文档 接口地址以/admin开头 */
+ //@Bean
+ //public GroupedOpenApi adminApi() {
+ // return GroupedOpenApi.builder()
+ // .group("admin-api")
+ // .pathsToMatch("/admin/**")
+ // .build();
+ //}
+
+ /***
+ * @description 自定义接口信息
+ */
+ @Bean
+ public OpenAPI customOpenAPI() {
+
+ return new OpenAPI()
+ .info(new Info()
+ .title(appName + "听书API接口文档")
+ .version("1.0")
+ .description("听书API接口文档")
+ .contact(new Contact().name("atguigu")));
+ }
+
+
+}
diff --git a/common/service-util/src/main/java/com/atguigu/tingshu/common/config/mybatisPlus/MybatisPlusConfig.java b/common/service-util/src/main/java/com/atguigu/tingshu/common/config/mybatisPlus/MybatisPlusConfig.java
new file mode 100644
index 0000000..04032f0
--- /dev/null
+++ b/common/service-util/src/main/java/com/atguigu/tingshu/common/config/mybatisPlus/MybatisPlusConfig.java
@@ -0,0 +1,32 @@
+package com.atguigu.tingshu.common.config.mybatisPlus;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+/**
+ * MybatisPlus配置类
+ *
+ */
+@EnableTransactionManagement
+@Configuration
+@MapperScan("com.atguigu.tingshu.*.mapper")
+public class MybatisPlusConfig {
+
+ /**
+ *
+ * @return
+ */
+ @Bean
+ public MybatisPlusInterceptor optimisticLockerInnerInterceptor(){
+ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+ //向Mybatis过滤器链中添加分页拦截器
+ interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+ return interceptor;
+ }
+
+}
diff --git a/common/service-util/src/main/java/com/atguigu/tingshu/common/config/redis/RedisConfig.java b/common/service-util/src/main/java/com/atguigu/tingshu/common/config/redis/RedisConfig.java
new file mode 100644
index 0000000..a964ab0
--- /dev/null
+++ b/common/service-util/src/main/java/com/atguigu/tingshu/common/config/redis/RedisConfig.java
@@ -0,0 +1,39 @@
+package com.atguigu.tingshu.common.config.redis;
+
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.*;
+
+
+/**
+ * Redis配置类
+ */
+@Configuration
+@EnableCaching
+public class RedisConfig {
+
+ @Bean
+ @Primary
+ public RedisTemplate