Compare commits

...

No commits in common. "master" and "jjz" have entirely different histories.
master ... jjz

152 changed files with 2361 additions and 2670 deletions

38
.gitignore vendored
View File

@ -1,38 +0,0 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

32
.idea/compiler.xml 100644
View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="bwie-user" />
<module name="bwie-clazz" />
<module name="bwie-es" />
<module name="bwie-gateway" />
<module name="bwie-common" />
<module name="bwie-menu" />
<module name="bwie-mq" />
<module name="bwie-auth" />
</profile>
</annotationProcessing>
</component>
<component name="JavacSettings">
<option name="ADDITIONAL_OPTIONS_OVERRIDE">
<module name="bwie-auth" options="-parameters" />
<module name="bwie-clazz" options="-parameters" />
<module name="bwie-common" options="-parameters" />
<module name="bwie-es" options="-parameters" />
<module name="bwie-gateway" options="-parameters" />
<module name="bwie-menu" options="-parameters" />
<module name="bwie-mq" options="-parameters" />
<module name="bwie-user" options="-parameters" />
</option>
</component>
</project>

View File

@ -4,9 +4,10 @@
<file url="file://$PROJECT_DIR$/bwie-auth/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/bwie-auth/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/bwie-common/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/bwie-common/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/bwie-gateway/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/bwie-gateway/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/bwie-modules/bwie-health/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/bwie-modules/bwie-clazz/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/bwie-modules/bwie-es/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/bwie-modules/bwie-menu/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/bwie-modules/bwie-mq/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/bwie-modules/bwie-mq/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/bwie-modules/bwie-notice/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/bwie-modules/bwie-user/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/bwie-modules/bwie-user/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/bwie-modules/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/bwie-modules/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/bwie-modules/src/main/resources" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/bwie-modules/src/main/resources" charset="UTF-8" />

View File

@ -2,13 +2,8 @@
<profile version="1.0"> <profile version="1.0">
<option name="myName" value="Project Default" /> <option name="myName" value="Project Default" />
<inspection_tool class="AliAccessStaticViaInstance" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="AliAccessStaticViaInstance" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="AliArrayNamingShouldHaveBracket" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="AutoCloseableResource" enabled="true" level="WARNING" enabled_by_default="true">
<inspection_tool class="AliControlFlowStatementWithoutBraces" enabled="true" level="WARNING" enabled_by_default="true" /> <option name="METHOD_MATCHER_CONFIG" value="java.util.Formatter,format,java.io.Writer,append,com.google.common.base.Preconditions,checkNotNull,org.hibernate.Session,close,java.io.PrintWriter,printf,java.io.PrintStream,printf,com.github.pagehelper.page.PageMethod,startPage" />
<inspection_tool class="AliDeprecation" enabled="true" level="WARNING" enabled_by_default="true" /> </inspection_tool>
<inspection_tool class="AliEqualsAvoidNull" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="AliLongLiteralsEndingWithLowercaseL" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="AliMissingOverrideAnnotation" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="AliWrapperTypeEquality" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="MapOrSetKeyShouldOverrideHashCodeEquals" enabled="true" level="WARNING" enabled_by_default="true" />
</profile> </profile>
</component> </component>

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="http://maven.aliyun.com/nexus/content/groups/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
</component>
</project>

View File

@ -8,7 +8,5 @@
</list> </list>
</option> </option>
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
<output url="file://$PROJECT_DIR$/out" />
</component>
</project> </project>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="VcsDirectoryMappings"> <component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" /> <mapping directory="" vcs="Git" />
</component> </component>
</project> </project>

View File

@ -4,15 +4,29 @@
<option name="autoReloadType" value="SELECTIVE" /> <option name="autoReloadType" value="SELECTIVE" />
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="2264b00c-a866-471a-9769-9a0864968167" name="Changes" comment="后台框架"> <list default="true" id="a2d0a5ad-79f5-4399-aeeb-01924fb2adda" name="更改" comment="">
<change afterPath="$PROJECT_DIR$/bwie-common/src/main/java/com/bwie/common/domain/request/VoClazz.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/bwie-common/src/main/java/com/bwie/common/domain/request/VoInsertClazz.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/bwie-common/src/main/java/com/bwie/common/domain/request/VoStu.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/bwie-common/src/main/java/com/bwie/common/domain/response/DTOClazz.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/bwie-common/src/main/java/com/bwie/common/domain/response/DTOStudent.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/bwie-modules/bwie-clazz/pom.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/bwie-modules/bwie-clazz/src/main/java/com/bwie/ClazzApplication.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/bwie-modules/bwie-clazz/src/main/java/com/bwie/controller/ClazzController.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/bwie-modules/bwie-clazz/src/main/java/com/bwie/dao/ClazzDao.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/bwie-modules/bwie-clazz/src/main/java/com/bwie/service/ClazzService.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/bwie-modules/bwie-clazz/src/main/java/com/bwie/service/impl/ClazzServiceImpl.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/bwie-modules/bwie-clazz/src/main/resources/bootstrap.yml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/bwie-modules/bwie-clazz/src/main/resources/mapper/ClazzMapper.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/.gitignore" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/compiler.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/compiler.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/encodings.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/encodings.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/encodings.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/encodings.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/vcs.xml" beforeDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/jarRepositories.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/jarRepositories.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/bwie-common/src/main/java/com/bwie/common/domain/User.java" beforeDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/bwie-common/src/main/java/com/bwie/common/domain/request/Userlogin.java" beforeDir="false" afterPath="$PROJECT_DIR$/bwie-common/src/main/java/com/bwie/common/domain/request/Userlogin.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/uiDesigner.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/uiDesigner.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/bwie-common/src/main/java/com/bwie/common/domain/response/UserResponse.java" beforeDir="false" afterPath="$PROJECT_DIR$/bwie-common/src/main/java/com/bwie/common/domain/response/UserResponse.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/bwie-12_16manage.iml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/bwie-common/src/main/java/com/bwie/common/result/Result.java" beforeDir="false" afterPath="$PROJECT_DIR$/bwie-common/src/main/java/com/bwie/common/result/Result.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/bwie-modules/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/bwie-modules/pom.xml" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -23,7 +37,7 @@
<option name="RECENT_TEMPLATES"> <option name="RECENT_TEMPLATES">
<list> <list>
<option value="Interface" /> <option value="Interface" />
<option value="Mapper" /> <option value="XML file" />
<option value="Class" /> <option value="Class" />
</list> </list>
</option> </option>
@ -34,60 +48,51 @@
<component name="MavenImportPreferences"> <component name="MavenImportPreferences">
<option name="generalSettings"> <option name="generalSettings">
<MavenGeneralSettings> <MavenGeneralSettings>
<option name="localRepository" value="F:\maven_repository" /> <option name="localRepository" value="D:\javaWeb\maven_repository" />
<option name="mavenHome" value="$PROJECT_DIR$/../../maven/apache-maven-3.6.1" /> <option name="mavenHome" value="$PROJECT_DIR$/../javaWeb/apache-maven-3.6.1" />
<option name="userSettingsFile" value="F:\maven\apache-maven-3.6.1\conf\settings.xml" /> <option name="userSettingsFile" value="D:\javaWeb\apache-maven-3.6.1\conf\settings.xml" />
</MavenGeneralSettings> </MavenGeneralSettings>
</option> </option>
</component> </component>
<component name="ProjectId" id="2Zh4ArdLNvqloNVDJ9wdx7eVgXz" /> <component name="ProjectColorInfo">{
<component name="ProjectLevelVcsManager" settingsEditedManually="true" /> &quot;customColor&quot;: &quot;&quot;,
&quot;associatedIndex&quot;: 1
}</component>
<component name="ProjectId" id="2ZeJEgX5d1XCs5AJOVKNmSKK3UG" />
<component name="ProjectLevelVcsManager">
<ConfirmationsSetting value="2" id="Add" />
</component>
<component name="ProjectViewState"> <component name="ProjectViewState">
<option name="showLibraryContents" value="true" /> <option name="showLibraryContents" value="true" />
<option name="showVisibilityIcons" value="true" />
</component> </component>
<component name="PropertiesComponent"><![CDATA[{ <component name="PropertiesComponent">{
"keyToString": { &quot;keyToString&quot;: {
"RequestMappingsPanelOrder0": "0", &quot;RequestMappingsPanelOrder0&quot;: &quot;0&quot;,
"RequestMappingsPanelOrder1": "1", &quot;RequestMappingsPanelOrder1&quot;: &quot;1&quot;,
"RequestMappingsPanelWidth0": "75", &quot;RequestMappingsPanelWidth0&quot;: &quot;75&quot;,
"RequestMappingsPanelWidth1": "75", &quot;RequestMappingsPanelWidth1&quot;: &quot;75&quot;,
"RunOnceActivity.OpenProjectViewOnStart": "true", &quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
"RunOnceActivity.ShowReadmeOnStart": "true", &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
"WebServerToolWindowFactoryState": "false", &quot;WebServerToolWindowFactoryState&quot;: &quot;false&quot;,
"git-widget-placeholder": "master", &quot;git-widget-placeholder&quot;: &quot;master&quot;,
"jdk.selected.JAVA_MODULE": "1.8", &quot;jdk.selected.JAVA_MODULE&quot;: &quot;1.8&quot;,
"last_opened_file_path": "F:/task/day09/bwie-modules/bwie-health/src/main/resources", &quot;last_opened_file_path&quot;: &quot;C:/Users/zhen/Desktop/Springcould-ruoyi/Bwie-Cloud/pom.xml&quot;,
"node.js.detected.package.eslint": "true", &quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
"node.js.detected.package.tslint": "true", &quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
"node.js.selected.package.eslint": "(autodetect)", &quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
"node.js.selected.package.tslint": "(autodetect)", &quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
"nodejs_package_manager_path": "npm", &quot;settings.editor.selected.configurable&quot;: &quot;MavenSettings&quot;,
"settings.editor.selected.configurable": "project.propVCSSupport.DirectoryMappings", &quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
"spring.configuration.checksum": "5de7b6514bd4a64f9d0445dc77c1e5fd",
"vue.rearranger.settings.migration": "true"
} }
}]]></component> }</component>
<component name="ReactorSettings"> <component name="ReactorSettings">
<option name="notificationShown" value="true" /> <option name="notificationShown" value="true" />
</component> </component>
<component name="RecentsManager"> <component name="RecentsManager">
<key name="CreateClassDialog.RecentsKey">
<recent name="com.bwie.mapper" />
<recent name="com.bwie.service" />
<recent name="com.bwie.feign" />
</key>
<key name="CopyFile.RECENT_KEYS"> <key name="CopyFile.RECENT_KEYS">
<recent name="F:\task\day09\bwie-modules\bwie-health\src\main\resources" /> <recent name="D:\test\bwie-modules\bwie-clazz\src\main\java\com\bwie\service" />
<recent name="F:\task\day09\bwie-modules\bwie-health\src\main\java" /> <recent name="D:\test\bwie-modules\bwie-clazz\src\main\java\com\bwie" />
<recent name="F:\task\day09\bwie-modules\bwie-notice\src\main\resources" /> <recent name="D:\test\bwie-modules\bwie-clazz\src\main\resources" />
<recent name="F:\task\day09\bwie-modules\bwie-notice\src\main\java" />
<recent name="F:\task\day09\bwie-gateway\src\main\resources" />
</key>
<key name="CopyClassDialog.RECENTS_KEY">
<recent name="com.bwie.common.domain.request" />
<recent name="com.bwie" />
<recent name="com.bwie.gateway" />
</key> </key>
</component> </component>
<component name="RunDashboard"> <component name="RunDashboard">
@ -97,73 +102,23 @@
</set> </set>
</option> </option>
</component> </component>
<component name="RunManager" selected="Spring Boot.HealthApplication"> <component name="RunManager">
<configuration default="true" type="JetRunConfigurationType"> <configuration default="true" type="JetRunConfigurationType">
<module name="test" />
<method v="2"> <method v="2">
<option name="Make" enabled="true" /> <option name="Make" enabled="true" />
</method> </method>
</configuration> </configuration>
<configuration default="true" type="KotlinStandaloneScriptRunConfigurationType"> <configuration default="true" type="KotlinStandaloneScriptRunConfigurationType">
<module name="test" />
<option name="filePath" /> <option name="filePath" />
<method v="2"> <method v="2">
<option name="Make" enabled="true" /> <option name="Make" enabled="true" />
</method> </method>
</configuration> </configuration>
<configuration name="AuthApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot" temporary="true" nameIsGenerated="true"> <configuration name="ClazzApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot" temporary="true" nameIsGenerated="true">
<module name="bwie-auth" /> <module name="bwie-clazz" />
<option name="SPRING_BOOT_MAIN_CLASS" value="com.bwie.AuthApplication" /> <option name="SPRING_BOOT_MAIN_CLASS" value="com.bwie.ClazzApplication" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="com.bwie.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="GatewayApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot" temporary="true" nameIsGenerated="true">
<module name="bwie-gateway" />
<option name="SPRING_BOOT_MAIN_CLASS" value="com.bwie.gateway.GatewayApplication" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="com.bwie.gateway.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="HealthApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot" temporary="true" nameIsGenerated="true">
<module name="bwie-health" />
<option name="SPRING_BOOT_MAIN_CLASS" value="com.bwie.HealthApplication" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="com.bwie.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="NoticeApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot" temporary="true" nameIsGenerated="true">
<module name="bwie-notice" />
<option name="SPRING_BOOT_MAIN_CLASS" value="com.bwie.NoticeApplication" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="com.bwie.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="UserApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot" temporary="true" nameIsGenerated="true">
<module name="bwie-user" />
<option name="SPRING_BOOT_MAIN_CLASS" value="com.bwie.UserApplication" />
<extension name="coverage"> <extension name="coverage">
<pattern> <pattern>
<option name="PATTERN" value="com.bwie.*" /> <option name="PATTERN" value="com.bwie.*" />
@ -176,48 +131,26 @@
</configuration> </configuration>
<recent_temporary> <recent_temporary>
<list> <list>
<item itemvalue="Spring Boot.HealthApplication" /> <item itemvalue="Spring Boot.ClazzApplication" />
<item itemvalue="Spring Boot.NoticeApplication" />
<item itemvalue="Spring Boot.AuthApplication" />
<item itemvalue="Spring Boot.UserApplication" />
<item itemvalue="Spring Boot.GatewayApplication" />
</list> </list>
</recent_temporary> </recent_temporary>
</component> </component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" /> <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="应用程序级" UseSingleDictionary="true" transferred="true" />
<component name="SshConsoleOptionsProvider">
<option name="myEncoding" value="UTF-8" />
</component>
<component name="TaskManager"> <component name="TaskManager">
<task active="true" id="Default" summary="Default task"> <task active="true" id="Default" summary="默认任务">
<changelist id="2264b00c-a866-471a-9769-9a0864968167" name="Changes" comment="" /> <changelist id="a2d0a5ad-79f5-4399-aeeb-01924fb2adda" name="更改" comment="" />
<created>1702860837789</created> <created>1702776504661</created>
<option name="number" value="Default" /> <option name="number" value="Default" />
<option name="presentableId" value="Default" /> <option name="presentableId" value="Default" />
<updated>1702860837789</updated> <updated>1702776504661</updated>
<workItem from="1702860838956" duration="316000" /> <workItem from="1702776508940" duration="98000" />
<workItem from="1702861158235" duration="1921000" /> <workItem from="1702784095617" duration="6654000" />
<workItem from="1702863474710" duration="1170000" /> <workItem from="1702862700997" duration="1731000" />
<workItem from="1702865515208" duration="937000" /> <workItem from="1703052165836" duration="682000" />
<workItem from="1702886885348" duration="11341000" />
<workItem from="1702947297029" duration="2921000" />
</task> </task>
<task id="LOCAL-00001" summary="后台框架">
<option name="closed" value="true" />
<created>1702861986295</created>
<option name="number" value="00001" />
<option name="presentableId" value="LOCAL-00001" />
<option name="project" value="LOCAL" />
<updated>1702861986295</updated>
</task>
<option name="localTasksCounter" value="2" />
<servers /> <servers />
</component> </component>
<component name="TypeScriptGeneratedFilesManager"> <component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" /> <option name="version" value="3" />
</component> </component>
<component name="VcsManagerConfiguration">
<MESSAGE value="后台框架" />
<option name="LAST_COMMIT_MESSAGE" value="后台框架" />
</component>
</project> </project>

38
bwie-auth/.gitignore vendored
View File

@ -1,38 +0,0 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

View File

@ -2,20 +2,14 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent> <parent>
<artifactId>bwie-12_16manage</artifactId>
<groupId>com.bwie</groupId> <groupId>com.bwie</groupId>
<artifactId>mqis</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>bwie-auth</artifactId> <artifactId>bwie-auth</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies> <dependencies>
<!-- 项目公共 依赖 --> <!-- 项目公共 依赖 -->
<dependency> <dependency>
@ -27,5 +21,23 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependency>
<!-- test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
<!-- kafka -->
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
</dependencies> </dependencies>
</project>
</project>

View File

@ -1,21 +1,17 @@
package com.bwie; package com.bwie.auth;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
/** /**
* @Author: zhx * @ClassName AuthApplication
* @Package: com.bwie * @Description
* @Datetime: 2023/12/18 16:12 * @Author LiAng.xiAo
* @Filename: AuthApplication * @Date 2023/12/17 9:04
*/ */
@SpringBootApplication @SpringBootApplication
@EnableFeignClients
public class AuthApplication { public class AuthApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(AuthApplication.class); SpringApplication.run(AuthApplication.class);
} }
} }

View File

@ -0,0 +1,48 @@
package com.bwie.auth.config;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
*
*/
@Component
public class ConfirmCallbackConfig implements RabbitTemplate.ConfirmCallback {
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* @PostContructspringspring
* @PostConstruct bean
* @PreDestory bean
*/
@PostConstruct
public void init() {
rabbitTemplate.setConfirmCallback(this);
}
/**
*
*
* @param correlationData
* @param ack
* @param cause
*/
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
if (ack) {
// 消息投递到 broker 的状态true表示成功
System.out.println("消息发送成功!");
} else {
// 发送异常
System.out.println("发送异常原因 = " + cause);
// TODO 可以将消息 内容 以及 失败的原因 记录到 日志表中
}
}
}

View File

@ -0,0 +1,103 @@
package com.bwie.auth.config;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.config.KafkaListenerContainerFactory;
import org.springframework.kafka.core.ConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaConsumerFactory;
import org.springframework.kafka.listener.ConcurrentMessageListenerContainer;
import org.springframework.kafka.listener.ContainerProperties;
import org.springframework.kafka.support.serializer.JsonDeserializer;
import java.util.HashMap;
import java.util.Map;
/**
* @author
* @date 2022/10/31 18:05
* kafkaymlyml
*/
@SpringBootConfiguration
public class KafkaConsumerConfig {
@Value("${spring.kafka.consumer.bootstrap-servers}")
private String bootstrapServers;
@Value("${spring.kafka.consumer.group-id}")
private String groupId;
@Value("${spring.kafka.consumer.enable-auto-commit}")
private boolean enableAutoCommit;
@Value("${spring.kafka.properties.session.timeout.ms}")
private String sessionTimeout;
@Value("${spring.kafka.properties.max.poll.interval.ms}")
private String maxPollIntervalTime;
@Value("${spring.kafka.consumer.max-poll-records}")
private String maxPollRecords;
@Value("${spring.kafka.consumer.auto-offset-reset}")
private String autoOffsetReset;
@Value("${spring.kafka.listener.concurrency}")
private Integer concurrency;
@Value("${spring.kafka.listener.missing-topics-fatal}")
private boolean missingTopicsFatal;
@Value("${spring.kafka.listener.poll-timeout}")
private long pollTimeout;
@Bean
public Map<String, Object> consumerConfigs() {
Map<String, Object> propsMap = new HashMap<>(16);
propsMap.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
propsMap.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
//是否自动提交偏移量默认值是true为了避免出现重复数据和数据丢失可以把它设置为false然后手动提交偏移量
propsMap.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, enableAutoCommit);
//自动提交的时间间隔,自动提交开启时生效
propsMap.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "2000");
//该属性指定了消费者在读取一个没有偏移量的分区或者偏移量无效的情况下该作何处理:
//earliest当各分区下有已提交的offset时从提交的offset开始消费无提交的offset时从头开始消费分区的记录
//latest当各分区下有已提交的offset时从提交的offset开始消费无提交的offset时消费新产生的该分区下的数据在消费者启动之后生成的记录
//none当各分区都存在已提交的offset时从提交的offset开始消费只要有一个分区不存在已提交的offset则抛出异常
propsMap.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, autoOffsetReset);
//两次poll之间的最大间隔默认值为5分钟。如果超过这个间隔会触发reBalance
propsMap.put(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, maxPollIntervalTime);
//这个参数定义了poll方法最多可以拉取多少条消息默认值为500。如果在拉取消息的时候新消息不足500条那有多少返回多少如果超过500条每次只返回500。
//这个默认值在有些场景下太大有些场景很难保证能够在5min内处理完500条消息
//如果消费者无法在5分钟内处理完500条消息的话就会触发reBalance,
//然后这批消息会被分配到另一个消费者中,还是会处理不完,这样这批消息就永远也处理不完。
//要避免出现上述问题提前评估好处理一条消息最长需要多少时间然后覆盖默认的max.poll.records参数
//注需要开启BatchListener批量监听才会生效如果不开启BatchListener则不会出现reBalance情况
propsMap.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, maxPollRecords);
//当broker多久没有收到consumer的心跳请求后就触发reBalance默认值是10s
propsMap.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, sessionTimeout);
//序列化建议使用Json这种序列化方式可以无需额外配置传输实体类
propsMap.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class);
propsMap.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class);
return propsMap;
}
@Bean
public ConsumerFactory<Object, Object> consumerFactory() {
//配置消费者的 Json 反序列化的可信赖包,反序列化实体类需要
try(JsonDeserializer<Object> deserializer = new JsonDeserializer<>()) {
deserializer.trustedPackages("*");
return new DefaultKafkaConsumerFactory<>(consumerConfigs(), new JsonDeserializer<>(), deserializer);
}
}
@Bean
public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<Object, Object>> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<Object, Object> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
//在侦听器容器中运行的线程数,一般设置为 机器数*分区数
factory.setConcurrency(concurrency);
//消费监听接口监听的主题不存在时默认会报错所以设置为false忽略错误
factory.setMissingTopicsFatal(missingTopicsFatal);
// 自动提交关闭,需要设置手动消息确认
factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE);
factory.getContainerProperties().setPollTimeout(pollTimeout);
// 设置为批量监听需要用List接收
// factory.setBatchListener(true);
return factory;
}
}

View File

@ -0,0 +1,85 @@
package com.bwie.auth.config;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;
import org.springframework.kafka.support.serializer.JsonSerializer;
import org.springframework.kafka.transaction.KafkaTransactionManager;
import java.util.HashMap;
import java.util.Map;
/**
* kafka
*/
@SpringBootConfiguration
public class KafkaProviderConfig {
@Value("${spring.kafka.producer.bootstrap-servers}")
private String bootstrapServers;
@Value("${spring.kafka.producer.transaction-id-prefix}")
private String transactionIdPrefix;
@Value("${spring.kafka.producer.acks}")
private String acks;
@Value("${spring.kafka.producer.retries}")
private String retries;
@Value("${spring.kafka.producer.batch-size}")
private String batchSize;
@Value("${spring.kafka.producer.buffer-memory}")
private String bufferMemory;
@Bean
public Map<String, Object> producerConfigs() {
Map<String, Object> props = new HashMap<>(16);
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
//acks=0 生产者在成功写入消息之前不会等待任何来自服务器的响应。
//acks=1 只要集群的首领节点收到消息,生产者就会收到一个来自服务器成功响应。
//acks=all :只有当所有参与复制的节点全部收到消息时,生产者才会收到一个来自服务器的成功响应。
//开启事务必须设为all
props.put(ProducerConfig.ACKS_CONFIG, acks);
//发生错误后消息重发的次数开启事务必须大于0
props.put(ProducerConfig.RETRIES_CONFIG, retries);
//当多个消息发送到相同分区时,生产者会将消息打包到一起,以减少请求交互. 而不是一条条发送
//批次的大小可以通过batch.size 参数设置.默认是16KB
//较小的批次大小有可能降低吞吐量批次大小为0则完全禁用批处理
//比如说kafka里的消息5秒钟Batch才凑满了16KB才能发送出去。那这些消息的延迟就是5秒钟
//实测batchSize这个参数没有用
props.put(ProducerConfig.BATCH_SIZE_CONFIG, batchSize);
//有的时刻消息比较少,过了很久,比如5min也没有凑够16KB,这样延时就很大,所以需要一个参数. 再设置一个时间,到了这个时间,
//即使数据没达到16KB,也将这个批次发送出去
props.put(ProducerConfig.LINGER_MS_CONFIG, "5000");
//生产者内存缓冲区的大小
props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, bufferMemory);
//反序列化,和生产者的序列化方式对应
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
return props;
}
@Bean
public ProducerFactory<Object, Object> producerFactory() {
DefaultKafkaProducerFactory<Object, Object> factory = new DefaultKafkaProducerFactory<>(producerConfigs());
//开启事务,会导致 LINGER_MS_CONFIG 配置失效
factory.setTransactionIdPrefix(transactionIdPrefix);
return factory;
}
@Bean
public KafkaTransactionManager<Object, Object> kafkaTransactionManager(ProducerFactory<Object, Object> producerFactory) {
return new KafkaTransactionManager<>(producerFactory);
}
@Bean
public KafkaTemplate<Object, Object> kafkaTemplate() {
return new KafkaTemplate<>(producerFactory());
}
}

View File

@ -0,0 +1,25 @@
package com.bwie.auth.config;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;
import org.springframework.kafka.support.ProducerListener;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
/**
* @author
* @date 2022/10/31 15:41
* kafka
*/
@Component
public class KafkaSendResultHandler implements ProducerListener<Object, Object> {
@Override
public void onSuccess(ProducerRecord producerRecord, RecordMetadata recordMetadata) {
System.out.println("消息发送成功:" + producerRecord.toString());
}
@Override
public void onError(ProducerRecord producerRecord, @Nullable RecordMetadata recordMetadata, Exception exception) {
System.out.println("消息发送失败:" + producerRecord.toString() + exception.getMessage());
}
}

View File

@ -0,0 +1,34 @@
package com.bwie.auth.config;
import org.apache.kafka.clients.consumer.Consumer;
import org.springframework.kafka.listener.KafkaListenerErrorHandler;
import org.springframework.kafka.listener.ListenerExecutionFailedException;
import org.springframework.lang.NonNull;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;
/**
* @author
* @date 2022/10/31 15:27
*
*/
@Component
public class MyKafkaListenerErrorHandler implements KafkaListenerErrorHandler {
@Override
@NonNull
public Object handleError(@NonNull Message<?> message, @NonNull ListenerExecutionFailedException exception) {
return new Object();
}
@Override
@NonNull
public Object handleError(@NonNull Message<?> message, @NonNull ListenerExecutionFailedException exception,
Consumer<?, ?> consumer) {
System.out.println("消息详情:" + message);
System.out.println("异常信息::" + exception);
System.out.println("消费者详情::" + consumer.groupMetadata());
System.out.println("监听主题::" + consumer.listTopics());
return KafkaListenerErrorHandler.super.handleError(message, exception, consumer);
}
}

View File

@ -0,0 +1,53 @@
package com.bwie.auth.config;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* RabbitAdminRabbitMQJavaRabbitMQRabbitMQ
*/
@Configuration
public class RabbitAdminConfig {
@Value("${spring.rabbitmq.host}")
private String host;
@Value("${spring.rabbitmq.username}")
private String username;
@Value("${spring.rabbitmq.password}")
private String password;
@Value("${spring.rabbitmq.virtualhost}")
private String virtualhost;
/**
* RabbitMQ
* @return
*/
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setAddresses(host);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
connectionFactory.setVirtualHost(virtualhost);
// 配置发送确认回调时次配置必须配置否则即使在RabbitTemplate配置了ConfirmCallback也不会生效
connectionFactory.setPublisherConfirmType(CachingConnectionFactory.ConfirmType.CORRELATED);
connectionFactory.setPublisherReturns(true);
return connectionFactory;
}
/**
* RabbitAdmin
* @param connectionFactory
* @return
*/
@Bean
public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
rabbitAdmin.setAutoStartup(true);
return rabbitAdmin;
}
}

View File

@ -0,0 +1,15 @@
package com.bwie.auth.config;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitmqConfig {
// 消息转换配置
@Bean
public MessageConverter jsonMessageConverter() {
return new Jackson2JsonMessageConverter();
}
}

View File

@ -0,0 +1,39 @@
package com.bwie.auth.config;
import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
*
*/
@Component
public class ReturnCallbackConfig implements RabbitTemplate.ReturnsCallback {
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* @PostContructspringspring
*/
@PostConstruct
public void init() {
rabbitTemplate.setReturnsCallback(this);
}
/**
*
*
* @param returnedMessage the returned message and metadata.
*/
@Override
public void returnedMessage(ReturnedMessage returnedMessage) {
System.out.println("消息" + returnedMessage.getMessage().toString() + "被交换机" + returnedMessage.getExchange() + "回退!"
+ "退回原因为:" + returnedMessage.getReplyText());
// TODO 回退了所有的信息,可做补偿机制 记录日志
}
}

View File

@ -0,0 +1,26 @@
package com.bwie.auth.controller;
import com.bwie.auth.service.AuthService;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
/**
* @ClassName AuthController
* @Description
* @Author LiAng.xiAo
* @Date 2023/12/16 11:45
*/
@RestController
@Log4j2
public class AuthController {
@Autowired
private AuthService authService;
@Autowired
private HttpServletRequest request;
}

View File

@ -0,0 +1,13 @@
package com.bwie.auth.feign;
import org.springframework.cloud.openfeign.FeignClient;
/**
* @ClassName AuthFeignService
* @Description
* @Author LiAng.xiAo
* @Date 2023/12/16 11:48
*/
@FeignClient("bwie-user")
public interface AuthFeignService {
}

View File

@ -0,0 +1,10 @@
package com.bwie.auth.service;
/**
* @ClassName AuthServcie
* @Description
* @Author LiAng.xiAo
* @Date 2023/12/16 11:46
*/
public interface AuthService {
}

View File

@ -0,0 +1,20 @@
package com.bwie.auth.service.impl;
import com.bwie.auth.feign.AuthFeignService;
import com.bwie.auth.service.AuthService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @ClassName AuthServiceImpl
* @Description
* @Author LiAng.xiAo
* @Date 2023/12/16 11:47
*/
@Service
public class AuthServiceImpl implements AuthService {
@Autowired
private AuthFeignService authFeignService;
}

View File

@ -0,0 +1,77 @@
package com.bwie.auth.utils;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
@Component
public class DLXQueue {
// routingKey
private static final String DEAD_ROUTING_KEY = "dead.routingkey";
private static final String ROUTING_KEY = "routingkey";
private static final String DEAD_EXCHANGE = "dead.exchange";
private static final String EXCHANGE = "common.exchange";
@Autowired
RabbitTemplate rabbitTemplate;
@Resource
RabbitAdmin rabbitAdmin;
/**
*
*
* @param queueName
* @param deadQueueName
* @param params
* @param expiration
*/
public void sendDLXQueue(String queueName, String deadQueueName, Object params, Integer expiration) {
/**
* ----------------------------------ttl--------------------------------------------
*/
Map<String, Object> map = new HashMap<>();
// 队列设置存活时间单位ms, 必须是整形数据。
map.put("x-message-ttl", expiration);
// 设置死信交换机
map.put("x-dead-letter-exchange", DEAD_EXCHANGE);
// 设置死信交换器路由
map.put("x-dead-letter-routing-key", DEAD_ROUTING_KEY);
/*参数1队列名称 参数2持久化 参数3是否排他 参数4自动删除队列 参数5队列参数*/
Queue queue = new Queue(queueName, true, false, false, map);
rabbitAdmin.declareQueue(queue);
/**
* ------------------------------------------------------------------------------
*/
DirectExchange directExchange = new DirectExchange(EXCHANGE, true, false);
rabbitAdmin.declareExchange(directExchange);
/**
* ------------------------------------------------------------------------------
*/
Binding binding = BindingBuilder.bind(queue).to(directExchange).with(ROUTING_KEY);
rabbitAdmin.declareBinding(binding);
/**
* ------------------------------------------------------------------------------
*/
DirectExchange deadExchange = new DirectExchange(DEAD_EXCHANGE, true, false);
rabbitAdmin.declareExchange(deadExchange);
Queue deadQueue = new Queue(deadQueueName, true, false, false);
rabbitAdmin.declareQueue(deadQueue);
/**
* ------------------------------------------------------------------------------
*/
// 将队列和交换机绑定
Binding deadbinding = BindingBuilder.bind(deadQueue).to(deadExchange).with(DEAD_ROUTING_KEY);
rabbitAdmin.declareBinding(deadbinding);
// 发送消息
rabbitTemplate.convertAndSend(EXCHANGE, ROUTING_KEY, params);
}
}

View File

@ -0,0 +1,79 @@
package com.bwie.auth.utils;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.CustomExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
*
*/
@Component
public class DelayedQueue {
// routingKey
private static final String DELAYED_ROUTING_KEY = "delayed.routingkey";
// 延迟队列交换机
private static final String DELAYED_EXCHANGE = "delayed.exchange";
@Autowired
RabbitTemplate rabbitTemplate;
@Resource
RabbitAdmin rabbitAdmin;
/**
*
*
* @param queueName
* @param params
* @param expiration
*/
public void sendDelayedQueue(String queueName, Object params, Integer expiration) {
// 先创建一个队列
Queue queue = new Queue(queueName);
rabbitAdmin.declareQueue(queue);
// 创建延迟队列交换机
CustomExchange customExchange = createCustomExchange();
rabbitAdmin.declareExchange(customExchange);
// 将队列和交换机绑定
Binding binding = BindingBuilder.bind(queue).to(customExchange).with(DELAYED_ROUTING_KEY).noargs();
rabbitAdmin.declareBinding(binding);
// 发送延迟消息
rabbitTemplate.convertAndSend(DELAYED_EXCHANGE, DELAYED_ROUTING_KEY, params, msg -> {
// 发送消息的时候 延迟时长
msg.getMessageProperties().setMessageId(UUID.randomUUID().toString().replaceAll("-", ""));
msg.getMessageProperties().setDelay(expiration);
return msg;
});
}
private CustomExchange createCustomExchange() {
Map<String, Object> arguments = new HashMap<>();
/**
*
* 1.
* 2.
* 3.
* 4.
* 5.
*/
arguments.put("x-delayed-type", "direct");
return new CustomExchange(DELAYED_EXCHANGE, "x-delayed-message", true, false, arguments);
}
}

View File

@ -0,0 +1,66 @@
package com.bwie.auth.utils;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
/**
* TTL
*
*/
@Component
public class TtlQueue {
// routingKey
private static final String TTL_KEY = "ttl.routingkey";
private static final String TTL_EXCHANGE = "ttl.exchange";
@Autowired
RabbitTemplate rabbitTemplate;
@Resource
RabbitAdmin rabbitAdmin;
/**
* TTL
*
* @param queueName
* @param params
* @param expiration
*/
public void sendTtlQueue(String queueName, Object params, Integer expiration) {
/**
* ----------------------------------ttl--------------------------------------------
*/
Map<String, Object> map = new HashMap<>();
// 队列设置存活时间单位ms,必须是整形数据。
map.put("x-message-ttl", expiration);
/*参数1队列名称 参数2持久化 参数3是否排他 参数4自动删除队列 参数5队列参数*/
Queue queue = new Queue(queueName, true, false, false, map);
rabbitAdmin.declareQueue(queue);
/**
* ------------------------------------------------------------------------------
*/
DirectExchange directExchange = new DirectExchange(TTL_EXCHANGE, true, false);
rabbitAdmin.declareExchange(directExchange);
/**
* ------------------------------------------------------------------------------
*/
// 将队列和交换机绑定
Binding binding = BindingBuilder.bind(queue).to(directExchange).with(TTL_KEY);
rabbitAdmin.declareBinding(binding);
// 发送消息
rabbitTemplate.convertAndSend(TTL_EXCHANGE, TTL_KEY, params);
}
}

View File

@ -1,49 +0,0 @@
package com.bwie.controller;
import com.alibaba.fastjson.JSONObject;
import com.bwie.common.domain.request.Userlogin;
import com.bwie.common.result.Result;
import com.bwie.service.AuthService;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
/**
* @Author: zhx
* @Package: com.bwie.controller
* @Datetime: 2023/12/18 16:10
* @Filename: AuthController
*/
@RestController
@Log4j2
public class AuthController {
@Autowired
private AuthService authService;
@Autowired
private HttpServletRequest request;
@GetMapping("/getCode/{phone}")
public Result getCode(@PathVariable String phone){
log.info("功能名称:获取登录验证码,请求URI:{},请求方式:{},请求参数:{}",
request.getRequestURI(),request.getMethod(),phone);
Result result = authService.getCode(phone);
log.info("功能名称:获取登录验证码,请求URI:{},请求方式:{},响应结果:{}",
request.getRequestURI(),request.getMethod(), JSONObject.toJSONString(result));
return result;
}
@PostMapping("/login")
public Result login(@RequestBody Userlogin userlogin){
log.info("功能名称:xxx,请求URI:{},请求方式:{},请求参数:{}",
request.getRequestURI(),request.getMethod(),userlogin);
Result result = authService.login(userlogin);
log.info("功能名称:xxx,请求URI:{},请求方式:{},响应结果:{}",
request.getRequestURI(),request.getMethod(), JSONObject.toJSONString(result));
return result;
}
}

View File

@ -1,19 +0,0 @@
package com.bwie.feign;
import com.bwie.common.domain.Admin;
import com.bwie.common.result.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
* @Author: zhx
* @Package: com.bwie.feign
* @Datetime: 2023/12/18 16:14
* @Filename: AuthFeign
*/
@FeignClient("bwie-user")
public interface AuthFeign {
@GetMapping("/findPhone")
public Result<Admin> findPhone(@RequestParam String phone);
}

View File

@ -1,17 +0,0 @@
package com.bwie.service;
import com.bwie.common.domain.request.Userlogin;
import com.bwie.common.result.Result;
/**
* @Author: zhx
* @Package: com.bwie.service
* @Datetime: 2023/12/18 16:11
* @Filename: AuthService
*/
public interface AuthService {
Result getCode(String phone);
Result login(Userlogin userlogin);
}

View File

@ -1,86 +0,0 @@
package com.bwie.service.impl;
import com.alibaba.fastjson.JSON;
import com.bwie.common.constants.JwtConstants;
import com.bwie.common.domain.Admin;
import com.bwie.common.domain.request.Userlogin;
import com.bwie.common.result.Result;
import com.bwie.common.utils.JwtUtils;
import com.bwie.feign.AuthFeign;
import com.bwie.service.AuthService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Random;
import java.util.concurrent.TimeUnit;
/**
* @Author: zhx
* @Package: com.bwie.service.impl
* @Datetime: 2023/12/18 16:11
* @Filename: AuthServiceImpl
*/
@Service
public class AuthServiceImpl implements AuthService {
@Autowired
private AuthFeign authFeign;
@Autowired
private RedisTemplate<String,Object> redisTemplate;
@Override
public Result getCode(String phone) {
Result<Admin> result = authFeign.findPhone(phone);
Admin data = result.getData();
if(data==null){
return Result.error("用户不存在");
}
String code = "";
for (int i = 0; i < 4; i++) {
code+=new Random().nextInt(10);
}
System.out.println("生成的验证码为:"+code);
redisTemplate.opsForValue().set(phone,code,15, TimeUnit.MINUTES);
return Result.success(code,"获取验证码成功");
}
@Override
public Result login(Userlogin userlogin) {
Result<Admin> result = authFeign.findPhone(userlogin.getPhone());
Admin admin = result.getData();
if(admin==null){
return Result.error("用户不存在");
}
if(!redisTemplate.hasKey(userlogin.getPhone())){
return Result.error("验证码过期");
}
Object o = redisTemplate.opsForValue().get(userlogin.getPhone());
String o1 = (String) o;
if(!userlogin.getCode().equals(redisTemplate.opsForValue().get(userlogin.getPhone()))) {
return Result.error("验证码有误");
}
HashMap<String, Object> map = new HashMap<>();
map.put(JwtConstants.USER_PHONE,userlogin.getPhone());
String token = JwtUtils.createToken(map);
admin.setToken(token);
redisTemplate.opsForValue().set(JwtConstants.LOGIN_TOKEN+token, JSON.toJSONString(admin),30,TimeUnit.MINUTES);
return Result.success(admin,"登录成功");
}
}

View File

@ -11,6 +11,78 @@ spring:
application: application:
# 应用名称 # 应用名称
name: bwie-auth name: bwie-auth
kafka:
producer:
# Kafka服务器
bootstrap-servers: 124.223.86.235:9092
# 开启事务,必须在开启了事务的方法中发送,否则报错
transaction-id-prefix: kafkaTx-
# 发生错误后消息重发的次数开启事务必须设置大于0。
retries: 3
# acks=0 生产者在成功写入消息之前不会等待任何来自服务器的响应。
# acks=1 只要集群的首领节点收到消息,生产者就会收到一个来自服务器成功响应。
# acks=all :只有当所有参与复制的节点全部收到消息时,生产者才会收到一个来自服务器的成功响应。
# 开启事务时必须设置为all
acks: all
# 当有多个消息需要被发送到同一个分区时,生产者会把它们放在同一个批次里。该参数指定了一个批次可以使用的内存大小,按照字节数计算。
batch-size: 16384
# 生产者内存缓冲区的大小。
buffer-memory: 1024000
# 键的序列化方式
key-serializer: org.springframework.kafka.support.serializer.JsonSerializer
# 值的序列化方式建议使用Json这种序列化方式可以无需额外配置传输实体类
value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
consumer:
# Kafka服务器
bootstrap-servers: 124.223.86.235:9092
group-id: firstGroup
# 自动提交的时间间隔 在spring boot 2.X 版本中这里采用的是值的类型为Duration 需要符合特定的格式如1S,1M,2H,5D
#auto-commit-interval: 2s
# 该属性指定了消费者在读取一个没有偏移量的分区或者偏移量无效的情况下该作何处理:
# earliest当各分区下有已提交的offset时从提交的offset开始消费无提交的offset时从头开始消费分区的记录
# latest当各分区下有已提交的offset时从提交的offset开始消费无提交的offset时消费新产生的该分区下的数据在消费者启动之后生成的记录
# none当各分区都存在已提交的offset时从提交的offset开始消费只要有一个分区不存在已提交的offset则抛出异常
auto-offset-reset: latest
# 是否自动提交偏移量默认值是true为了避免出现重复数据和数据丢失可以把它设置为false然后手动提交偏移量
enable-auto-commit: false
# 键的反序列化方式
#key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
key-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
# 值的反序列化方式建议使用Json这种序列化方式可以无需额外配置传输实体类
value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
# 配置消费者的 Json 反序列化的可信赖包,反序列化实体类需要
properties:
spring:
json:
trusted:
packages: "*"
# 这个参数定义了poll方法最多可以拉取多少条消息默认值为500。如果在拉取消息的时候新消息不足500条那有多少返回多少如果超过500条每次只返回500。
# 这个默认值在有些场景下太大有些场景很难保证能够在5min内处理完500条消息
# 如果消费者无法在5分钟内处理完500条消息的话就会触发reBalance,
# 然后这批消息会被分配到另一个消费者中,还是会处理不完,这样这批消息就永远也处理不完。
# 要避免出现上述问题提前评估好处理一条消息最长需要多少时间然后覆盖默认的max.poll.records参数
# 注需要开启BatchListener批量监听才会生效如果不开启BatchListener则不会出现reBalance情况
max-poll-records: 3
properties:
# 两次poll之间的最大间隔默认值为5分钟。如果超过这个间隔会触发reBalance
max:
poll:
interval:
ms: 600000
# 当broker多久没有收到consumer的心跳请求后就触发reBalance默认值是10s
session:
timeout:
ms: 10000
listener:
# 在侦听器容器中运行的线程数,一般设置为 机器数*分区数
concurrency: 4
# 自动提交关闭,需要设置手动消息确认
ack-mode: manual_immediate
# 消费监听接口监听的主题不存在时默认会报错所以设置为false忽略错误
missing-topics-fatal: false
# 两次poll之间的最大间隔默认值为5分钟。如果超过这个间隔会触发reBalance
poll-timeout: 600000
profiles: profiles:
# 环境配置 # 环境配置
active: dev active: dev
@ -18,13 +90,28 @@ spring:
nacos: nacos:
discovery: discovery:
# 服务注册地址 # 服务注册地址
server-addr: 124.223.114.120:8848 server-addr: 124.223.86.235:8848
config: config:
# 配置中心地址 # 配置中心地址
server-addr: 124.223.114.120:8848 server-addr: 124.223.86.235:8848
# 配置文件格式 # 配置文件格式
file-extension: yml file-extension: yml
# 共享配置 # 共享配置
shared-configs: shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
rabbitmq:
host: 124.223.86.235
port: 5672
username: guest
password: guest
virtual-host: /
listener:
simple:
prefetch: 1 #每次取出来一条消息,消费完毕之后取下一条消费
acknowledge-mode: manual #手动确认消费
retry: #重试
enabled: true
#发送确认配置 开启发送确认
publisher-confirm-type: correlated #消息发送到broker确认
publisher-returns: true #消息发送到队列确认

View File

@ -1,38 +0,0 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

View File

@ -2,22 +2,21 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent> <parent>
<artifactId>bwie-12_16manage</artifactId>
<groupId>com.bwie</groupId> <groupId>com.bwie</groupId>
<artifactId>mqis</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>bwie-common</artifactId> <artifactId>bwie-common</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies> <dependencies>
<!-- bootstrap 启动器 --> <!-- bootstrap 启动器 -->
<!-- Java Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.cloud</groupId> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId> <artifactId>spring-cloud-starter-bootstrap</artifactId>
@ -91,59 +90,11 @@
<artifactId>dysmsapi20170525</artifactId> <artifactId>dysmsapi20170525</artifactId>
<version>2.0.1</version> <version>2.0.1</version>
</dependency> </dependency>
<!-- oss 图片上传 --> <!-- rabbitMQ -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.12.0</version>
</dependency>
<!--短信依赖 5条依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.15</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.2.1</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-util</artifactId>
<version>9.3.7.v20160115</version>
</dependency>
<!--MQ-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!--fastDfs文件上传-->
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.26.5</version>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId> <artifactId>spring-boot-starter-amqp</artifactId>
</dependency> </dependency>
</dependencies> </dependencies>
</project>
</project>

View File

@ -1,40 +0,0 @@
package com.bwie.common.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new
Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}

View File

@ -1,6 +1,11 @@
package com.bwie.common.constants; package com.bwie.common.constants;
/**
* @author DongZl
* @description: Jwt
*/
public class JwtConstants { public class JwtConstants {
/** /**
* ID * ID
*/ */
@ -9,7 +14,7 @@ public class JwtConstants {
/** /**
* *
*/ */
public static final String DETAILS_USERNAME = "user_name"; public static final String DETAILS_USERNAME = "username";
/** /**
* *
@ -21,14 +26,4 @@ public class JwtConstants {
*/ */
public final static String SECRET = "abcdefghijklmnopqrstuvwxyz"; public final static String SECRET = "abcdefghijklmnopqrstuvwxyz";
/**
*
*/
public static final String USER_PHONE = "user_phone";
/**
* token
*/
public static final String LOGIN_TOKEN = "login_token:";
} }

View File

@ -0,0 +1,15 @@
package com.bwie.common.constants;
/**
* @Project boot-month
* @Author
* @Date 2023/9/6 10:06-+
* @Description
*/
public class QueueConstants {
public static final String SEND_CODE_QUEUE = "send_code_queue";
public static final String SEND_CODE_PREVENT_REPEAT_ID = "send_code_prevent_repeat_id:";
public static final String BLOG_UPDATE_QUEUE = "blog_update_queue";
public static final String BLOG_UPDATE_PREVENT_REPEAT_ID = "blog_update_prevent_repeat_id:";
}

View File

@ -1,5 +1,11 @@
package com.bwie.common.constants; package com.bwie.common.constants;
/**
* @BelongsProject: Bob_Up_Like_A_Cork
* @BelongsPackage: com.bwie.common.constants
* @Author: zhangquan
* @CreateTime: 2023/8/1 20:11
*/
public class RabbitMQConstants { public class RabbitMQConstants {
public static final String SEND_SMS_QUEUE = "send_sms_queue"; public static final String SEND_CODE="send_code";
} }

View File

@ -0,0 +1,18 @@
package com.bwie.common.constants;
/**
* Clazz:2103A
* Name :FYSN
* Desc :--·
* Date :2023-08-20 20:37:02
*/
public class RabbitMQOneConstants {
//发送短消息队列名称
public static final String SEND_SHORT_MESSAGE_QUEUE_NAME = "send_short_message";
//查看的日志队列名称
public static final String QUERY_LOG_QUEUE_NAME = "query_log_message";
}

View File

@ -0,0 +1,18 @@
package com.bwie.common.constants;
/**
* Clazz:2103A
* Name :FYSN
* Desc :--·
* Date :2023-08-20 20:37:02
*/
public class RabbitMQTwoConstants {
//发送消息队列名称
public static final String SEND_SMS_QUEUE = "send_sms_queue";
//添加消息队列名称日志
public static final String ADD_MESSAGE_QUEUE_NAME_LOG = "add_message_log";
}

View File

@ -1,59 +0,0 @@
package com.bwie.common.domain;
import lombok.Data;
/**
* @Author: zhx
* @Package: com.bwie.common.domain
* @Datetime: 2023/12/18 16:15
* @Filename: Admin
*/
@Data
public class Admin {
/**
*
*/
private String adminId;
/**
*
*/
private String userName;
/**
*
*/
private String passWord;
/**
*
*/
private String name;
/**
* 1 2
*/
private String gender;
/**
*
*/
private String age;
/**
*
*/
private String phoneNum;
/**
*
*/
private String email;
/**
*
*/
private String avatar;
/**
* token
*/
private String token;
/**
*
*/
private String code;
}

View File

@ -1,54 +0,0 @@
package com.bwie.common.domain;
import com.alibaba.nacos.shaded.org.checkerframework.checker.units.qual.A;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* @Author: zhx
* @Package: com.bwie.common.domain
* @Datetime: 2023/12/19 9:11
* @Filename: Aop
*/
@Data
public class Aop {
/**
*
*/
/**
* id
*/
private Integer aopId;
/**
*
*/
private String aopName;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date aopTime;
/**
*
*/
private Integer adminId;
public Aop() {
}
public Aop(String aopName, Integer adminId) {
this.aopName = aopName;
this.adminId = adminId;
}
}

View File

@ -1,54 +0,0 @@
package com.bwie.common.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* @Author: zhx
* @Package: com.bwie.common.domain
* @Datetime: 2023/12/18 20:30
* @Filename: Health
*/
@Data
public class Health {
/**
*
*/
private Integer healthId;
/**
*
*/
private String healthText;
/**
*
*/
private String healthPic;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date healthTime;
/**
*id
*/
private Integer stuId;
/**
*
*/
private String name;
/**
*id
*/
private Integer clazzId;
/**
*
*/
private String clazzName;
}

View File

@ -1,41 +0,0 @@
package com.bwie.common.domain;
import lombok.Data;
/**
* @Author: zhx
* @Package: com.bwie.common.domain
* @Datetime: 2023/12/18 17:19
* @Filename: Notice
*/
@Data
public class Notice {
/**
*
*/
/**
*
*/
private String id;
/**
*
*/
private String title;
/**
*
*/
private String content;
/**
*
*/
private String author;
/**
*
*/
private String releaseTime;
}

View File

@ -1,45 +0,0 @@
package com.bwie.common.domain.request;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* @Author: zhx
* @Package: com.bwie.common.domain.request
* @Datetime: 2023/12/18 19:08
* @Filename: HealthRequest
*/
@Data
public class HealthRequest {
/**
*
*/
private String healthText;;
/**
*
*/
private Integer stuId;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date startTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date endTime;
/**
*
*/
private Integer pageNum = 1;
private Integer pageSize = 4;
}

View File

@ -1,50 +0,0 @@
package com.bwie.common.domain.request;
import com.bwie.common.result.PageResult;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* @Author: zhx
* @Package: com.bwie.common.domain.request
* @Datetime: 2023/12/18 19:08
* @Filename: NoticeRequest
*/
@Data
public class NoticeRequest {
/**
*
*/
private String title;
/**
*
*/
private String author;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date startTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date endTime;
/**
*
*/
private Integer pageNum = 1;
private Integer pageSize = 4;
}

View File

@ -1,50 +0,0 @@
package com.bwie.common.domain.request;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* @Author: zhx
* @Package: com.bwie.common.domain.request
* @Datetime: 2023/12/18 20:55
* @Filename: PutHealth
*/
@Data
public class PutHealth {
/**
*
*/
/**
*
*/
private Integer healthId;
/**
*
*/
private String healthText;
/**
*
*/
private String healthPic;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date healthTime;
/**
*id
*/
private Integer stuId;
/**
*id
*/
private Integer clazzId;
}

View File

@ -1,24 +0,0 @@
package com.bwie.common.domain.request;
import lombok.Data;
/**
* @ClassName Userlogin
* @Description
* @Author zhengshixian
* @Date 2023/10/19 9:16
*/
@Data
public class Userlogin {
private String phone;
private String code;
public Userlogin(String phone, String code) {
this.phone = phone;
this.code = code;
}
public Userlogin() {
}
}

View File

@ -0,0 +1,20 @@
package com.bwie.common.domain.request;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author:
* @Date: 2023/12/17 11:54
* @Description:
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class VoClazz {
private Integer pageNum=1;
private Integer pageSize=5;
private String clazzName;
}

View File

@ -0,0 +1,14 @@
package com.bwie.common.domain.request;
import lombok.Data;
/**
* @Author:
* @Date: 2023/12/17 14:40
* @Description:
**/
@Data
public class VoInsertClazz {
private String clazzName;
}

View File

@ -0,0 +1,21 @@
package com.bwie.common.domain.request;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author:
* @Date: 2023/12/17 14:29
* @Description:
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class VoStu {
private Integer pageNum=1;
private Integer pageSize=5;
private String stuName;
private Integer clazzId;
}

View File

@ -0,0 +1,20 @@
package com.bwie.common.domain.response;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author:
* @Date: 2023/12/17 11:45
* @Description:
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DTOClazz {
private Integer clazzId;
private String clazzName;
}

View File

@ -0,0 +1,30 @@
package com.bwie.common.domain.response;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author:
* @Date: 2023/12/17 11:45
* @Description:
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DTOStudent {
private String stuId;
private String username;
private String password;
private String age;
private String name;
private String gender;
private String phoneNum;
private String email;
private String avatar;
private String clazzId;
private DTOClazz dtoClazz;
}

View File

@ -1,24 +0,0 @@
package com.bwie.common.domain.response;
import lombok.Data;
/**
* @ClassName UserResponse
* @Description
* @Author zhengshixian
* @Date 2023/10/19 9:17
*/
@Data
public class UserResponse {
/**
*
*/
private String token;
/**
*
*/
private String time;
}

View File

@ -45,9 +45,6 @@ public class Result<T> implements Serializable {
public static <T> Result<T> success(T data, String msg) { public static <T> Result<T> success(T data, String msg) {
return restResult(data, SUCCESS, msg); return restResult(data, SUCCESS, msg);
} }
public static <T> Result<T> success(String msg) {
return restResult(null, SUCCESS, msg);
}
public static <T> Result<T> error() { public static <T> Result<T> error() {
return restResult(null, FAIL, Constants.ERROR_MSG); return restResult(null, FAIL, Constants.ERROR_MSG);

View File

@ -1,250 +0,0 @@
package com.bwie.common.utils;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Base64Utils;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
/**
* @ClassName AESUtils
* @Description
* @Author WenSha.Wan
* @Date 2023/7/8 7:48
*/
public class AESUtils {
/**
*
*/
private static final Logger LOGGER = LoggerFactory.getLogger(AESUtils.class);
/**
*
*/
private static final String ENCODING = "UTF-8";
/**
*
*/
private static final String AES_ALGORITHM = "AES";
/**
*
*/
private static final String CIPHER_PADDING = "AES/ECB/PKCS5Padding";
private static final String CIPHER_CBC_PADDING = "AES/CBC/PKCS5Padding";
/**
* (CBC使)
*/
private static final String IV_SEED = "1234567812345678";
/**
* AES
* @param content
* @param aesKey
* @return
*/
public static String encrypt(String content, String aesKey){
if(StringUtils.isBlank(content)){
LOGGER.info("AES encrypt: the content is null!");
return null;
}
//判断秘钥是否为16位
if(StringUtils.isNotBlank(aesKey) && aesKey.length() == 16){
try {
//对密码进行编码
byte[] bytes = aesKey.getBytes(ENCODING);
//设置加密算法,生成秘钥
SecretKeySpec skeySpec = new SecretKeySpec(bytes, AES_ALGORITHM);
// "算法/模式/补码方式"
Cipher cipher = Cipher.getInstance(CIPHER_PADDING);
//选择加密
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
//根据待加密内容生成字节数组
byte[] encrypted = cipher.doFinal(content.getBytes(ENCODING));
//返回base64字符串
return Base64Utils.encodeToString(encrypted);
} catch (Exception e) {
LOGGER.info("AES encrypt exception:" + e.getMessage());
throw new RuntimeException(e);
}
}else {
LOGGER.info("AES encrypt: the aesKey is null or error!");
return null;
}
}
/**
*
*
* @param content
* @param aesKey
* @return
*/
public static String decrypt(String content, String aesKey){
if(StringUtils.isBlank(content)){
LOGGER.info("AES decrypt: the content is null!");
return null;
}
//判断秘钥是否为16位
if(StringUtils.isNotBlank(aesKey) && aesKey.length() == 16){
try {
//对密码进行编码
byte[] bytes = aesKey.getBytes(ENCODING);
//设置解密算法,生成秘钥
SecretKeySpec skeySpec = new SecretKeySpec(bytes, AES_ALGORITHM);
// "算法/模式/补码方式"
Cipher cipher = Cipher.getInstance(CIPHER_PADDING);
//选择解密
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
//先进行Base64解码
byte[] decodeBase64 = Base64Utils.decodeFromString(content);
//根据待解密内容进行解密
byte[] decrypted = cipher.doFinal(decodeBase64);
//将字节数组转成字符串
return new String(decrypted, ENCODING);
} catch (Exception e) {
LOGGER.info("AES decrypt exception:" + e.getMessage());
throw new RuntimeException(e);
}
}else {
LOGGER.info("AES decrypt: the aesKey is null or error!");
return null;
}
}
/**
* AES_CBC
*
* @param content
* @param aesKey
* @return
*/
public static String encryptCBC(String content, String aesKey){
if(StringUtils.isBlank(content)){
LOGGER.info("AES_CBC encrypt: the content is null!");
return null;
}
//判断秘钥是否为16位
if(StringUtils.isNotBlank(aesKey) && aesKey.length() == 16){
try {
//对密码进行编码
byte[] bytes = aesKey.getBytes(ENCODING);
//设置加密算法,生成秘钥
SecretKeySpec skeySpec = new SecretKeySpec(bytes, AES_ALGORITHM);
// "算法/模式/补码方式"
Cipher cipher = Cipher.getInstance(CIPHER_CBC_PADDING);
//偏移
IvParameterSpec iv = new IvParameterSpec(IV_SEED.getBytes(ENCODING));
//选择加密
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
//根据待加密内容生成字节数组
byte[] encrypted = cipher.doFinal(content.getBytes(ENCODING));
//返回base64字符串
return Base64Utils.encodeToString(encrypted);
} catch (Exception e) {
LOGGER.info("AES_CBC encrypt exception:" + e.getMessage());
throw new RuntimeException(e);
}
}else {
LOGGER.info("AES_CBC encrypt: the aesKey is null or error!");
return null;
}
}
/**
* AES_CBC
*
* @param content
* @param aesKey
* @return
*/
public static String decryptCBC(String content, String aesKey){
if(StringUtils.isBlank(content)){
LOGGER.info("AES_CBC decrypt: the content is null!");
return null;
}
//判断秘钥是否为16位
if(StringUtils.isNotBlank(aesKey) && aesKey.length() == 16){
try {
//对密码进行编码
byte[] bytes = aesKey.getBytes(ENCODING);
//设置解密算法,生成秘钥
SecretKeySpec skeySpec = new SecretKeySpec(bytes, AES_ALGORITHM);
//偏移
IvParameterSpec iv = new IvParameterSpec(IV_SEED.getBytes(ENCODING));
// "算法/模式/补码方式"
Cipher cipher = Cipher.getInstance(CIPHER_CBC_PADDING);
//选择解密
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
//先进行Base64解码
byte[] decodeBase64 = Base64Utils.decodeFromString(content);
//根据待解密内容进行解密
byte[] decrypted = cipher.doFinal(decodeBase64);
//将字节数组转成字符串
return new String(decrypted, ENCODING);
} catch (Exception e) {
LOGGER.info("AES_CBC decrypt exception:" + e.getMessage());
throw new RuntimeException(e);
}
}else {
LOGGER.info("AES_CBC decrypt: the aesKey is null or error!");
return null;
}
}
public static void main(String[] args) {
// AES支持三种长度的密钥128位、192位、256位。
// 代码中这种就是128位的加密密钥16字节 * 8位/字节 = 128位。
// String random = RandomStringUtils.random(16, "abcdefghijklmnopqrstuvwxyz1234567890");
// String random = RandomStringUtils.random(16, "123456");
// System.out.println("随机key:" + random);
// System.out.println();
//
// System.out.println("---------加密---------");
// String aesResult = encrypt("测试AES加密12", random);
// System.out.println("aes加密结果:" + aesResult);
// System.out.println();
//
// System.out.println("---------解密---------");
// String decrypt = decrypt(aesResult, random);
// System.out.println("aes解密结果:" + decrypt);
// System.out.println();
//
//
// System.out.println("--------AES_CBC加密解密---------");
// String cbcResult = encryptCBC("测试AES加密12456", random);
// System.out.println("aes_cbc加密结果:" + cbcResult);
// System.out.println();
//
// System.out.println("---------解密CBC---------");
// String cbcDecrypt = decryptCBC(cbcResult, random);
// System.out.println("aes解密结果:" + cbcDecrypt);
// System.out.println();
//加密
String encrypt1 = encrypt ("123", "1234567890000000");
System.out.println ("123加密后 1====================={"+encrypt1);
//解密
// decrypt ("/83VCGvDN+C5pvYN/19pBQ==")
}
}

View File

@ -1,15 +0,0 @@
package com.bwie.common.utils;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class CodeEntity {
private String phone;
private String code;
}

View File

@ -1,87 +0,0 @@
package com.bwie.common.utils;
import java.util.Random;
/**
* @author DongZl
* @description:
* @Date 2023-5-11 10:09
*/
public class GenCodeUtils {
/**
*
*/
private static final String NUMBER_STR = "0123456789";
/**
*
*/
private static final String LETTERS_STR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
/**
*
*/
private static final Integer SMS_CODE_LENGTH = 4;
/**
*
* @return
*/
public static String genLetterStrSms(){
return genCode(LETTERS_STR, SMS_CODE_LENGTH);
}
/**
*
* @return
*/
public static String genNumberCodeSms(){
return genCode(NUMBER_STR, SMS_CODE_LENGTH);
}
/**
*
* @param codeLength
* @return
*/
public static String genLetterStr(int codeLength){
return genCode(LETTERS_STR, codeLength);
}
/**
*
* @param codeLength
* @return
*/
public static String genNumberCode( int codeLength){
return genCode(NUMBER_STR, codeLength);
}
/**
*
* @param str
* @param codeLength
* @return
*/
public static String genCode (String str, int codeLength){
//将字符串转换为一个新的字符数组。
char[] verificationCodeArray = str.toCharArray();
Random random = new Random();
//计数器
int count = 0;
StringBuilder stringBuilder = new StringBuilder();
do {
//随机生成一个随机数
int index = random.nextInt(verificationCodeArray.length);
char c = verificationCodeArray[index];
//限制四位不重复数字
if (stringBuilder.indexOf(String.valueOf(c)) == -1) {
stringBuilder.append(c);
//计数器加1
count++;
}
//当count等于4时结束随机生成四位数的验证码
} while (count != codeLength);
return stringBuilder.toString();
}
}

View File

@ -1,312 +0,0 @@
package com.bwie.common.utils;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
public class HttpUtils {
/**
* get
*
* @param host
* @param path
* @param method
* @param headers
* @param querys
* @return
* @throws Exception
*/
public static HttpResponse doGet(String host, String path, String method,
Map<String, String> headers,
Map<String, String> querys)
throws Exception {
HttpClient httpClient = wrapClient(host);
HttpGet request = new HttpGet(buildUrl(host, path, querys));
for (Map.Entry<String, String> e : headers.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
}
return httpClient.execute(request);
}
/**
* post form
*
* @param host
* @param path
* @param method
* @param headers
* @param querys
* @param bodys
* @return
* @throws Exception
*/
public static HttpResponse doPost(String host, String path, String method,
Map<String, String> headers,
Map<String, String> querys,
Map<String, String> bodys)
throws Exception {
HttpClient httpClient = wrapClient(host);
HttpPost request = new HttpPost(buildUrl(host, path, querys));
for (Map.Entry<String, String> e : headers.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
}
if (bodys != null) {
List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();
for (String key : bodys.keySet()) {
nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key)));
}
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8");
formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
request.setEntity(formEntity);
}
return httpClient.execute(request);
}
/**
* Post String
*
* @param host
* @param path
* @param method
* @param headers
* @param querys
* @param body
* @return
* @throws Exception
*/
public static HttpResponse doPost(String host, String path, String method,
Map<String, String> headers,
Map<String, String> querys,
String body)
throws Exception {
HttpClient httpClient = wrapClient(host);
HttpPost request = new HttpPost(buildUrl(host, path, querys));
for (Map.Entry<String, String> e : headers.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
}
if (StringUtils.isNotBlank(body)) {
request.setEntity(new StringEntity(body, "utf-8"));
}
return httpClient.execute(request);
}
/**
* Post stream
*
* @param host
* @param path
* @param method
* @param headers
* @param querys
* @param body
* @return
* @throws Exception
*/
public static HttpResponse doPost(String host, String path, String method,
Map<String, String> headers,
Map<String, String> querys,
byte[] body)
throws Exception {
HttpClient httpClient = wrapClient(host);
HttpPost request = new HttpPost(buildUrl(host, path, querys));
for (Map.Entry<String, String> e : headers.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
}
if (body != null) {
request.setEntity(new ByteArrayEntity(body));
}
return httpClient.execute(request);
}
/**
* Put String
* @param host
* @param path
* @param method
* @param headers
* @param querys
* @param body
* @return
* @throws Exception
*/
public static HttpResponse doPut(String host, String path, String method,
Map<String, String> headers,
Map<String, String> querys,
String body)
throws Exception {
HttpClient httpClient = wrapClient(host);
HttpPut request = new HttpPut(buildUrl(host, path, querys));
for (Map.Entry<String, String> e : headers.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
}
if (StringUtils.isNotBlank(body)) {
request.setEntity(new StringEntity(body, "utf-8"));
}
return httpClient.execute(request);
}
/**
* Put stream
* @param host
* @param path
* @param method
* @param headers
* @param querys
* @param body
* @return
* @throws Exception
*/
public static HttpResponse doPut(String host, String path, String method,
Map<String, String> headers,
Map<String, String> querys,
byte[] body)
throws Exception {
HttpClient httpClient = wrapClient(host);
HttpPut request = new HttpPut(buildUrl(host, path, querys));
for (Map.Entry<String, String> e : headers.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
}
if (body != null) {
request.setEntity(new ByteArrayEntity(body));
}
return httpClient.execute(request);
}
/**
* Delete
*
* @param host
* @param path
* @param method
* @param headers
* @param querys
* @return
* @throws Exception
*/
public static HttpResponse doDelete(String host, String path, String method,
Map<String, String> headers,
Map<String, String> querys)
throws Exception {
HttpClient httpClient = wrapClient(host);
HttpDelete request = new HttpDelete(buildUrl(host, path, querys));
for (Map.Entry<String, String> e : headers.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
}
return httpClient.execute(request);
}
private static String buildUrl(String host, String path, Map<String, String> querys) throws UnsupportedEncodingException {
StringBuilder sbUrl = new StringBuilder();
sbUrl.append(host);
if (!StringUtils.isBlank(path)) {
sbUrl.append(path);
}
if (null != querys) {
StringBuilder sbQuery = new StringBuilder();
for (Map.Entry<String, String> query : querys.entrySet()) {
if (0 < sbQuery.length()) {
sbQuery.append("&");
}
if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) {
sbQuery.append(query.getValue());
}
if (!StringUtils.isBlank(query.getKey())) {
sbQuery.append(query.getKey());
if (!StringUtils.isBlank(query.getValue())) {
sbQuery.append("=");
sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8"));
}
}
}
if (0 < sbQuery.length()) {
sbUrl.append("?").append(sbQuery);
}
}
return sbUrl.toString();
}
private static HttpClient wrapClient(String host) {
HttpClient httpClient = new DefaultHttpClient();
if (host.startsWith("https://")) {
sslClient(httpClient);
}
return httpClient;
}
private static void sslClient(HttpClient httpClient) {
try {
SSLContext ctx = SSLContext.getInstance("TLS");
X509TrustManager tm = new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] xcs, String str) {
}
public void checkServerTrusted(X509Certificate[] xcs, String str) {
}
};
ctx.init(null, new TrustManager[] { tm }, null);
SSLSocketFactory ssf = new SSLSocketFactory(ctx);
ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
ClientConnectionManager ccm = httpClient.getConnectionManager();
SchemeRegistry registry = ccm.getSchemeRegistry();
registry.register(new Scheme("https", 443, ssf));
} catch (KeyManagementException ex) {
throw new RuntimeException(ex);
} catch (NoSuchAlgorithmException ex) {
throw new RuntimeException(ex);
}
}
}

View File

@ -0,0 +1,312 @@
package com.bwie.common.utils;
import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* IP
*
* @author ruoyi
*/
public class IpUtils {
public final static String REGX_0_255 = "(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)";
// 匹配 ip
public final static String REGX_IP = "((" + REGX_0_255 + "\\.){3}" + REGX_0_255 + ")";
public final static String REGX_IP_WILDCARD = "(((\\*\\.){3}\\*)|(" + REGX_0_255 + "(\\.\\*){3})|(" + REGX_0_255 + "\\." + REGX_0_255 + ")(\\.\\*){2}" + "|((" + REGX_0_255 + "\\.){3}\\*))";
// 匹配网段
public final static String REGX_IP_SEG = "(" + REGX_IP + "\\-" + REGX_IP + ")";
/**
* IP
*
* @param request
* @return IP
*/
public static String getIpAddr(HttpServletRequest request) {
if (request == null) {
return "unknown";
}
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Forwarded-For");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Real-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip);
}
/**
* IP
*
* @param ip IP
* @return
*/
public static boolean internalIp(String ip) {
byte[] addr = textToNumericFormatV4(ip);
return internalIp(addr) || "127.0.0.1".equals(ip);
}
/**
* IP
*
* @param addr byte
* @return
*/
private static boolean internalIp(byte[] addr) {
if (StringUtils.isNull(addr) || addr.length < 2) {
return true;
}
final byte b0 = addr[0];
final byte b1 = addr[1];
// 10.x.x.x/8
final byte SECTION_1 = 0x0A;
// 172.16.x.x/12
final byte SECTION_2 = (byte) 0xAC;
final byte SECTION_3 = (byte) 0x10;
final byte SECTION_4 = (byte) 0x1F;
// 192.168.x.x/16
final byte SECTION_5 = (byte) 0xC0;
final byte SECTION_6 = (byte) 0xA8;
switch (b0) {
case SECTION_1:
return true;
case SECTION_2:
if (b1 >= SECTION_3 && b1 <= SECTION_4) {
return true;
}
case SECTION_5:
switch (b1) {
case SECTION_6:
return true;
}
default:
return false;
}
}
/**
* IPv4
*
* @param text IPv4
* @return byte
*/
public static byte[] textToNumericFormatV4(String text) {
if (text.length() == 0) {
return null;
}
byte[] bytes = new byte[4];
String[] elements = text.split("\\.", -1);
try {
long l;
int i;
switch (elements.length) {
case 1:
l = Long.parseLong(elements[0]);
if ((l < 0L) || (l > 4294967295L)) {
return null;
}
bytes[0] = (byte) (int) (l >> 24 & 0xFF);
bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF);
bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
bytes[3] = (byte) (int) (l & 0xFF);
break;
case 2:
l = Integer.parseInt(elements[0]);
if ((l < 0L) || (l > 255L)) {
return null;
}
bytes[0] = (byte) (int) (l & 0xFF);
l = Integer.parseInt(elements[1]);
if ((l < 0L) || (l > 16777215L)) {
return null;
}
bytes[1] = (byte) (int) (l >> 16 & 0xFF);
bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
bytes[3] = (byte) (int) (l & 0xFF);
break;
case 3:
for (i = 0; i < 2; ++i) {
l = Integer.parseInt(elements[i]);
if ((l < 0L) || (l > 255L)) {
return null;
}
bytes[i] = (byte) (int) (l & 0xFF);
}
l = Integer.parseInt(elements[2]);
if ((l < 0L) || (l > 65535L)) {
return null;
}
bytes[2] = (byte) (int) (l >> 8 & 0xFF);
bytes[3] = (byte) (int) (l & 0xFF);
break;
case 4:
for (i = 0; i < 4; ++i) {
l = Integer.parseInt(elements[i]);
if ((l < 0L) || (l > 255L)) {
return null;
}
bytes[i] = (byte) (int) (l & 0xFF);
}
break;
default:
return null;
}
} catch (NumberFormatException e) {
return null;
}
return bytes;
}
/**
* IP
*
* @return IP
*/
public static String getHostIp() {
try {
return InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
}
return "127.0.0.1";
}
/**
*
*
* @return
*/
public static String getHostName() {
try {
return InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException e) {
}
return "未知";
}
/**
* unknown IP
*
* @param ip IP
* @return unknown IP
*/
public static String getMultistageReverseProxyIp(String ip) {
// 多级反向代理检测
if (ip != null && ip.indexOf(",") > 0) {
final String[] ips = ip.trim().split(",");
for (String subIp : ips) {
if (false == isUnknown(subIp)) {
ip = subIp;
break;
}
}
}
return StringUtils.substring(ip, 0, 255);
}
/**
* HTTP
*
* @param checkString
* @return
*/
public static boolean isUnknown(String checkString) {
return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString);
}
/**
* IP
*/
public static boolean isIP(String ip) {
return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP);
}
/**
* IP *
*/
public static boolean isIpWildCard(String ip) {
return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP_WILDCARD);
}
/**
* ip
*/
public static boolean ipIsInWildCardNoCheck(String ipWildCard, String ip) {
String[] s1 = ipWildCard.split("\\.");
String[] s2 = ip.split("\\.");
boolean isMatchedSeg = true;
for (int i = 0; i < s1.length && !s1[i].equals("*"); i++) {
if (!s1[i].equals(s2[i])) {
isMatchedSeg = false;
break;
}
}
return isMatchedSeg;
}
/**
* :10.10.10.1-10.10.10.99ip
*/
public static boolean isIPSegment(String ipSeg) {
return StringUtils.isNotBlank(ipSeg) && ipSeg.matches(REGX_IP_SEG);
}
/**
* ip
*/
public static boolean ipIsInNetNoCheck(String iparea, String ip) {
int idx = iparea.indexOf('-');
String[] sips = iparea.substring(0, idx).split("\\.");
String[] sipe = iparea.substring(idx + 1).split("\\.");
String[] sipt = ip.split("\\.");
long ips = 0L, ipe = 0L, ipt = 0L;
for (int i = 0; i < 4; ++i) {
ips = ips << 8 | Integer.parseInt(sips[i]);
ipe = ipe << 8 | Integer.parseInt(sipe[i]);
ipt = ipt << 8 | Integer.parseInt(sipt[i]);
}
if (ips > ipe) {
long t = ips;
ips = ipe;
ipe = t;
}
return ips <= ipt && ipt <= ipe;
}
/**
* ip
*
* @param filter IP,'*',:`10.10.10.1-10.10.10.99`
* @param ip IP
* @return boolean
*/
public static boolean isMatchedIp(String filter, String ip) {
if (StringUtils.isEmpty(filter) || StringUtils.isEmpty(ip)) {
return false;
}
String[] ips = filter.split(";");
for (String iStr : ips) {
if (isIP(iStr) && iStr.equals(ip)) {
return true;
} else if (isIpWildCard(iStr) && ipIsInWildCardNoCheck(iStr, ip)) {
return true;
} else if (isIPSegment(iStr) && ipIsInNetNoCheck(iStr, ip)) {
return true;
}
}
return false;
}
}

View File

@ -0,0 +1,5 @@
package com.bwie.common.utils;
public class KafkaTopic {
public static final String NEW_BLOG_TOPIC="new_blog_topic";
}

View File

@ -1,66 +0,0 @@
package com.bwie.common.utils;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class MsgUtil {
//取code
@Cacheable(key = "#phone",value = "bbb")
public String getCacheCode(String phone){
return null;
}
//把当前注解的返回值装进去 //存code
@CachePut(key = "#codeEntity.phone",value = "bbb")
public String saveCacheCode(CodeEntity codeEntity){
return codeEntity.getCode();
}
public String sendMsg(String phone,String code){
String result = null;
String host = "https://gyytz.market.alicloudapi.com";
String path = "/sms/smsSend";
String method = "POST";
String appcode = "7ac0173f69ac4737a4ec5a5c4c6ca3b5";
Map<String, String> headers = new HashMap<String, String>();
//最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
headers.put("Authorization", "APPCODE " + appcode);
Map<String, String> querys = new HashMap<String, String>();
querys.put("mobile", phone);
querys.put("param", "**code**:"+code+",**minute**:5");
//smsSignId短信前缀和templateId短信模板可登录国阳云控制台自助申请。参考文档http://help.guoyangyun.com/Problem/Qm.html
querys.put("smsSignId", "2e65b1bb3d054466b82f0c9d125465e2");
querys.put("templateId", "908e94ccf08b4476ba6c876d13f084ad");
Map<String, String> bodys = new HashMap<String, String>();
try {
/**
* :
* HttpUtils\r\n\t \t* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java\r\n\t \t* 下载
*
*
* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
*/
HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys);
// System.out.println(response.toString());
//获取response的body
result = EntityUtils.toString(response.getEntity());
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}

View File

@ -1,153 +0,0 @@
package com.bwie.common.utils;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.PutObjectRequest;
import lombok.extern.log4j.Log4j2;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.time.LocalDateTime;
import java.util.UUID;
/**
* Oss
*/
@Log4j2
public class OssUtil {
/**
* Endpoint AccessKeyaccessKeySecretAPI访 访
*/
private static String endPoint = "oss-cn-shanghai.aliyuncs.com";
private static String accessKeyId = "LTAI5tD2tppzLQ4Rb6yKYyph";
private static String accessKeySecret = "KEKNKwVvDq7PZLjE63NPBouqHXox4Q";
private static String accessPre = "https://dzlmuyu.oss-cn-shanghai.aliyuncs.com/";
/**
* bucket
* @return
*/
private static String bucketName = "dzlmuyu";
private static OSS ossClient ;
static {
ossClient = new OSSClientBuilder().build(
endPoint,
accessKeyId,
accessKeySecret);
log.info("oss服务连接成功");
}
/**
*
* @param filePath
*/
public static String uploadFile(String filePath){
return uploadFileForBucket(bucketName,getOssFilePath(filePath) ,filePath);
}
/**
* multipartFile
* @param multipartFile
*/
public static String uploadMultipartFile(MultipartFile multipartFile) {
return uploadMultipartFile(bucketName,getOssFilePath(multipartFile.getOriginalFilename()),multipartFile);
}
/**
* multipartFile
* @param bucketName
* @param ossPath
* @param multipartFile
*/
public static String uploadMultipartFile(String bucketName , String ossPath , MultipartFile multipartFile){
InputStream inputStream = null;
try {
inputStream = multipartFile.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
uploadFileInputStreamForBucket(bucketName, ossPath, inputStream);
return accessPre+ossPath;
}
/**
* 使FilePutObject ** 使
* @param bucketName
* @param ossPath oss
* @param filePath
*/
public static String uploadFileForBucket(String bucketName , String ossPath , String filePath) {
// 创建PutObjectRequest对象。
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, ossPath, new File(filePath));
// 上传
ossClient.putObject(putObjectRequest);
return accessPre+ossPath;
}
/**
* 使bucket
* @param bucketName
* @param ossPath oss
* @param filePath
*/
public static String uploadFileInputStreamForBucket(String bucketName , String ossPath , String filePath){
// 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
InputStream inputStream = null;
try {
inputStream = new FileInputStream(filePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。
uploadFileInputStreamForBucket(bucketName, ossPath, inputStream);
return accessPre+ossPath;
}
public static void uploadFileInputStreamForBucket(String bucketName , String ossPath , InputStream inputStream ){
ossClient.putObject(bucketName, ossPath, inputStream);
}
/**
*
* @param ossFilePath
* @param filePath
*/
public static void downloadFile(String ossFilePath , String filePath ){
downloadFileForBucket(bucketName , ossFilePath , filePath);
}
/**
*
* @param bucketName
* @param ossFilePath oss
* @param filePath
*/
public static void downloadFileForBucket(String bucketName , String ossFilePath , String filePath ){
ossClient.getObject(new GetObjectRequest(bucketName, ossFilePath), new File(filePath));
}
/**
*
* @return
*/
public static String getOssDefaultPath(){
LocalDateTime now = LocalDateTime.now();
String url =
now.getYear()+"/"+
now.getMonth()+"/"+
now.getDayOfMonth()+"/"+
now.getHour()+"/"+
now.getMinute()+"/";
return url;
}
public static String getOssFilePath(String filePath){
String fileSuf = filePath.substring(filePath.indexOf(".") + 1);
return getOssDefaultPath() + UUID.randomUUID().toString() + "." + fileSuf;
}
}

View File

@ -0,0 +1,5 @@
package com.bwie.common.utils;
public class RabbitMQ {
public static final String SEND_CODE_QUEUE="send_code_queue";
}

View File

@ -18,9 +18,9 @@ public class TelSmsUtils {
/** /**
* AccessKeyaccessKeySecretAPI访 * AccessKeyaccessKeySecretAPI访
*/ */
private static String accessKeyId = "204250583"; private static String accessKeyId = "LTAI5tQWdAodc1EJ1doShoW4";
private static String accessKeySecret = "rDrLLGT0SqKA3IykgXwlgCgxuKCPLeca"; private static String accessKeySecret = "9MbfDBJ3Efqc6iN5yPFX0zq3ZErsII";
private static String templateCode = "a4ab2ca295e44e23a4a85fd6ecbc907a"; private static String templateCode = "SMS0001";
/** /**
* 访 * 访
@ -66,9 +66,10 @@ public class TelSmsUtils {
/** /**
* *
* @param tel * @param tel
* @param templateCode SMS_153991546
* @param sendDataMap * @param sendDataMap
*/ */
public static String sendSms(String tel , Map<String,String> sendDataMap){ public static String sendSms(String tel, String templateCode,Map<String,String> sendDataMap){
SendSmsRequest sendSmsRequest = new SendSmsRequest() SendSmsRequest sendSmsRequest = new SendSmsRequest()
.setPhoneNumbers(tel) .setPhoneNumbers(tel)
.setSignName(signName) .setSignName(signName)
@ -81,7 +82,6 @@ public class TelSmsUtils {
} catch (Exception e) { } catch (Exception e) {
log.error("短信发送异常,手机号:【{}】,短信内容:【{}】,异常信息:【{}】", tel, sendDataMap, e); log.error("短信发送异常,手机号:【{}】,短信内容:【{}】,异常信息:【{}】", tel, sendDataMap, e);
} }
// SendSmsResponseBody
return JSONObject.toJSONString(sendSmsResponse.getBody()); return JSONObject.toJSONString(sendSmsResponse.getBody());
} }

View File

@ -1,38 +0,0 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

View File

@ -2,20 +2,14 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent> <parent>
<artifactId>bwie-12_16manage</artifactId>
<groupId>com.bwie</groupId> <groupId>com.bwie</groupId>
<artifactId>mqis</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>bwie-gateway</artifactId> <artifactId>bwie-gateway</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies> <dependencies>
<!-- 公共模块 --> <!-- 公共模块 -->
<dependency> <dependency>
@ -39,4 +33,5 @@
<artifactId>sentinel-spring-cloud-gateway-adapter</artifactId> <artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
</dependency> </dependency>
</dependencies> </dependencies>
</project>
</project>

View File

@ -0,0 +1,17 @@
package com.bwie.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @ClassName AuthApplication
* @Description
* @Author LiAng.xiAo
* @Date 2023/12/17 9:04
*/
@SpringBootApplication
public class GateWayApplication {
public static void main(String[] args) {
SpringApplication.run(GateWayApplication.class);
}
}

View File

@ -1,78 +1,83 @@
package com.bwie.gateway.filters; package com.bwie.gateway.filters;
import com.bwie.common.constants.JwtConstants; import com.bwie.common.constants.TokenConstants;
import com.bwie.common.utils.JwtUtils; import com.bwie.common.utils.JwtUtils;
import com.bwie.common.utils.StringUtils; import com.bwie.common.utils.StringUtils;
import com.bwie.gateway.config.IgnoreWhiteConfig; import com.bwie.gateway.config.IgnoreWhiteConfig;
import com.bwie.gateway.utils.GatewayUtils; import com.bwie.gateway.utils.GatewayUtils;
import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* @ClassName:
* @Description:
* @Author: zhuwenqiang
* @Date: 2023/8/18
*/
@Component @Component
public class AuthFilter implements GlobalFilter, Ordered { public class AuthFilter implements GlobalFilter, Ordered {
@Autowired
private StringRedisTemplate redisTemplate;
@Autowired @Autowired
private IgnoreWhiteConfig ignoreWhiteConfig; private IgnoreWhiteConfig ignoreWhiteConfig;
@Autowired
private RedisTemplate<String, String> redisTemplate;
/**
* token
* @param exchange
* @param chain chain
* @return Mono
*/
@Override @Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//获取白名单 // 验证当前的请求 是否需要拦截 【配置白名单请求 不拦截的请求 】 将白名单请求配置到配置文件中
// 获取系统白名单请求
List<String> whites = ignoreWhiteConfig.getWhites(); List<String> whites = ignoreWhiteConfig.getWhites();
// 获取当前的请求 URI
//获取用户请求路径
ServerHttpRequest request = exchange.getRequest(); ServerHttpRequest request = exchange.getRequest();
String path = request.getURI().getPath(); String path = request.getURI().getPath();
System.out.println("路径>>>>>>"+path); boolean matches = StringUtils.matches(path, whites);
if (matches) { // 放行
//放行
if (StringUtils.matches(path,whites)){
return chain.filter(exchange); return chain.filter(exchange);
} }
// 获取token
//获取token String token = request.getHeaders().getFirst(TokenConstants.TOKEN);
String token = request.getHeaders().getFirst("token"); // token 非空验证
if(token==null){ if (StringUtils.isEmpty(token)) {
return GatewayUtils.errorResponse(exchange,"必须携带token"); // 不放行 提示错误信息
return GatewayUtils.errorResponse(exchange, "token不能为空", HttpStatus.UNAUTHORIZED);
} }
//token合法性
Claims claims = null;
try { try {
claims = JwtUtils.parseToken(token); // token 合法性性
} catch (Exception e) { JwtUtils.parseToken(token);
return GatewayUtils.errorResponse(exchange,"token不合法"); } catch (Exception ex) {
return GatewayUtils.errorResponse(exchange, "token格式错误");
} }
// token 是否过期
//时效性 // 获取 UserKey
if(!redisTemplate.hasKey(JwtConstants.LOGIN_TOKEN+token)){ String userKey = JwtUtils.getUserKey(token);
return GatewayUtils.errorResponse(exchange,"token过期"); if (!redisTemplate.hasKey(TokenConstants.LOGIN_TOKEN_KEY + userKey)) {
return GatewayUtils.errorResponse(exchange, "token过期");
} }
// 放行
Long expire = redisTemplate.getExpire(JwtConstants.LOGIN_TOKEN+token);
// if(expire<jwt原定过期时间的一半){
// redisTemplate.expire("token:"+userId, 60, TimeUnit.SECONDS);
// }
//自动续期 15分钟
redisTemplate.expire(JwtConstants.LOGIN_TOKEN+token,15, TimeUnit.MINUTES);
return chain.filter(exchange); return chain.filter(exchange);
} }
/**
* filter
* @return
*/
@Override @Override
public int getOrder() { public int getOrder() {
return 0; return 0;

View File

@ -18,10 +18,10 @@ spring:
nacos: nacos:
discovery: discovery:
# 服务注册地址 # 服务注册地址
server-addr: 124.223.114.120:8848 server-addr: 124.223.86.235:8848
config: config:
# 配置中心地址 # 配置中心地址
server-addr: 124.223.114.120:8848 server-addr: 124.223.86.235:8848
# 配置文件格式 # 配置文件格式
file-extension: yml file-extension: yml
# 共享配置 # 共享配置

View File

@ -1,38 +0,0 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

View File

@ -5,11 +5,12 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>com.bwie</groupId> <groupId>com.bwie</groupId>
<artifactId>bwie-modules</artifactId> <artifactId>bwie-12_16manage</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent> </parent>
<artifactId>bwie-notice</artifactId> <artifactId>bwie-clazz</artifactId>
<properties> <properties>
<maven.compiler.source>8</maven.compiler.source> <maven.compiler.source>8</maven.compiler.source>
@ -50,5 +51,18 @@
<artifactId>pagehelper-spring-boot-starter</artifactId> <artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.1</version> <version>1.4.1</version>
</dependency> </dependency>
<!-- test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.26.5</version>
</dependency>
</dependencies> </dependencies>
</project>
</project>

View File

@ -0,0 +1,19 @@
package com.bwie;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author:
* @Date: 2023/12/17 14:08
* @Description:
**/
@SpringBootApplication
@MapperScan("com.bwie.dao")
public class ClazzApplication {
public static void main(String[] args) {
SpringApplication.run (ClazzApplication.class);
}
}

View File

@ -0,0 +1,57 @@
package com.bwie.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.bwie.common.domain.request.VoClazz;
import com.bwie.common.domain.request.VoStu;
import com.bwie.common.result.Result;
import com.bwie.service.ClazzService;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
/**
* @Author:
* @Date: 2023/12/17 11:50
* @Description:
**/
@RestController
@RequestMapping("/clazz")
@Log4j2
public class ClazzController {
@Autowired
private HttpServletRequest request;
@Autowired
private ClazzService service;
@PostMapping("/clazzList")
public Result clazzList(@RequestBody VoClazz voClazz) {
log.info ("功能名称:xxx,请求URI:{},请求方式:{},请求参数:{}",
request.getRequestURI (), request.getMethod (), JSON.toJSONString (voClazz));
Result result = service.clazzList (voClazz);
log.info ("功能名称:xxx,请求URI:{},请求方式:{},响应结果:{}",
request.getRequestURI (), request.getMethod (), JSONObject.toJSONString (result));
return result;
}
@PostMapping("/stuList")
public Result stuList(@RequestBody VoStu voStu) {
log.info ("功能名称:xxx,请求URI:{},请求方式:{},请求参数:{}",
request.getRequestURI (), request.getMethod (), JSON.toJSONString (voStu));
Result result = service.stuList (voStu);
log.info ("功能名称:xxx,请求URI:{},请求方式:{},响应结果:{}",
request.getRequestURI (), request.getMethod (), JSONObject.toJSONString (result));
return result;
}
}

View File

@ -0,0 +1,14 @@
package com.bwie.dao;
import com.bwie.common.domain.request.VoClazz;
import com.bwie.common.domain.request.VoStu;
import com.bwie.common.domain.response.DTOClazz;
import com.bwie.common.domain.response.DTOStudent;
import java.util.List;
public interface ClazzDao {
List<DTOClazz> clazzList(VoClazz voClazz);
List<DTOStudent> stuList(VoStu voStu);
}

View File

@ -0,0 +1,11 @@
package com.bwie.service;
import com.bwie.common.domain.request.VoClazz;
import com.bwie.common.domain.request.VoStu;
import com.bwie.common.result.Result;
public interface ClazzService {
Result clazzList(VoClazz voClazz);
Result stuList(VoStu voStu);
}

View File

@ -0,0 +1,43 @@
package com.bwie.service.impl;
import com.bwie.common.domain.request.VoClazz;
import com.bwie.common.domain.request.VoStu;
import com.bwie.common.domain.response.DTOClazz;
import com.bwie.common.domain.response.DTOStudent;
import com.bwie.common.result.Result;
import com.bwie.dao.ClazzDao;
import com.bwie.service.ClazzService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @Author:
* @Date: 2023/12/17 11:51
* @Description:
**/
@SuppressWarnings("ALL")
@Service
public class ClazzServiceImpl implements ClazzService {
@Autowired
private ClazzDao clazzDao;
@Override
public Result clazzList(VoClazz voClazz) {
PageHelper.startPage (voClazz.getPageNum (), voClazz.getPageSize ());
List<DTOClazz> list = clazzDao.clazzList(voClazz);
PageInfo<DTOClazz> info = new PageInfo<> (list);
return Result.success (info);
}
@Override
public Result stuList(VoStu voStu) {
PageHelper.startPage (voStu.getPageNum (),voStu.getPageSize ());
List<DTOStudent> list = clazzDao.stuList(voStu);
PageInfo<DTOStudent> info = new PageInfo<> (list);
return Result.success (info);
}
}

View File

@ -0,0 +1,43 @@
# Tomcat
server:
port: 9005
# Spring
spring:
main:
allow-circular-references: true
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
application:
# 应用名称
name: bwie-book
profiles:
# 环境配置
active: dev
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 124.223.114.120:8848
namespace: 00f412e2-0405-407b-a17e-0f5b2528f0fa
config:
# 配置中心地址
server-addr: 124.223.114.120:8848
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
namespace: 00f412e2-0405-407b-a17e-0f5b2528f0fa
fdfs:
so-timeout: 1500 # socket 连接时长
connect-timeout: 600 # 连接 tracker 服务器超时时长
# 这两个是你服务器的 IP 地址,注意 23000 端口也要打开阿里云服务器记得配置安全组。tracker 要和 stroage 服务进行交流
tracker-list: 124.223.86.235:22122
web-server-url: 124.223.86.235:8888
pool:
jmx-enabled: false
# 生成缩略图
thumb-image:
height: 500
width: 500

View File

@ -0,0 +1,45 @@
<?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.bwie.dao.ClazzDao">
<resultMap id="map" type="com.bwie.common.domain.response.DTOStudent">
<id property="stuId" column="stu_id"></id>
<result property="username" column="username"></result>
<result property="password" column="password"></result>
<result property="age" column="age"></result>
<result property="name" column="name"></result>
<result property="gender" column="gender"></result>
<result property="phoneNum" column="phone_num"></result>
<result property="email" column="email"></result>
<result property="avatar" column="avatar"></result>
<result property="clazzId" column="clazz_id"></result>
<association property="dtoClazz" javaType="com.bwie.common.domain.response.DTOClazz">
<id property="clazzId" column="clazz_id"></id>
<result property="clazzName" column="clazz_name"></result>
</association>
</resultMap>
<select id="clazzList" resultType="com.bwie.common.domain.response.DTOClazz">
select *
from clazz
<where>
<if test="null!=clazzName and ''!=clazzName">
and clazz_name like concat('%',#{clazzName},'%')
</if>
</where>
</select>
<select id="stuList" resultMap="map">
SELECT c.clazz_name,s.* FROM clazz c LEFT JOIN student s on c.clazz_id=s.clazz_id
<where>
<if test="null!=clazzId">
and c.clazz_id=#{clazzId}
</if>
<if test="null!=stuName and ''!=stuName">
and s.name like concat('%'#{stuName},'%')
</if>
</where>
</select>
</mapper>

View File

@ -10,7 +10,7 @@ spring:
time-zone: GMT+8 time-zone: GMT+8
application: application:
# 应用名称 # 应用名称
name: bwie-notice name: bwie-book
profiles: profiles:
# 环境配置 # 环境配置
active: dev active: dev
@ -31,8 +31,8 @@ fdfs:
so-timeout: 1500 # socket 连接时长 so-timeout: 1500 # socket 连接时长
connect-timeout: 600 # 连接 tracker 服务器超时时长 connect-timeout: 600 # 连接 tracker 服务器超时时长
# 这两个是你服务器的 IP 地址,注意 23000 端口也要打开阿里云服务器记得配置安全组。tracker 要和 stroage 服务进行交流 # 这两个是你服务器的 IP 地址,注意 23000 端口也要打开阿里云服务器记得配置安全组。tracker 要和 stroage 服务进行交流
tracker-list: 124.223.114.120:22122 tracker-list: 124.223.86.235:22122
web-server-url: 124.223.114.120:8888 web-server-url: 124.223.86.235:8888
pool: pool:
jmx-enabled: false jmx-enabled: false
# 生成缩略图 # 生成缩略图

Some files were not shown because too many files have changed in this diff Show More