Browse Source

基础框架配置

machaoyi 1 năm trước cách đây
commit
0ddcfee74c
29 tập tin đã thay đổi với 1400 bổ sung0 xóa
  1. 38 0
      .gitignore
  2. 12 0
      .idea/dataSources.xml
  3. 9 0
      .idea/encodings.xml
  4. 20 0
      .idea/misc.xml
  5. 124 0
      .idea/uiDesigner.xml
  6. 6 0
      .idea/vcs.xml
  7. 152 0
      .idea/workspace.xml
  8. 106 0
      application/pom.xml
  9. 48 0
      application/src/main/java/com/ctsi/Application.java
  10. 24 0
      application/src/main/java/com/ctsi/config/MybatisPlusConfig.java
  11. 26 0
      application/src/main/java/com/ctsi/config/SaTokenConfigure.java
  12. 64 0
      application/src/main/java/com/ctsi/config/SwaggerConfig.java
  13. 17 0
      application/src/main/java/com/ctsi/entity/FramePage.java
  14. 17 0
      application/src/main/java/com/ctsi/handler/GlobalExceptionHandler.java
  15. 14 0
      application/src/main/java/com/ctsi/system/entity/UserForm.java
  16. 46 0
      application/src/main/java/com/ctsi/system/web/login.java
  17. 85 0
      application/src/main/java/com/ctsi/user/controller/SysUserController.java
  18. 65 0
      application/src/main/java/com/ctsi/user/entity/SysUser.java
  19. 26 0
      application/src/main/java/com/ctsi/user/mapper/SysUserMapper.java
  20. 8 0
      application/src/main/java/com/ctsi/user/mapper/SysUserMapper.xml
  21. 53 0
      application/src/main/java/com/ctsi/user/service/SysUserService.java
  22. 115 0
      application/src/main/java/com/ctsi/user/service/impl/SysUserServiceImpl.java
  23. 102 0
      application/src/main/java/com/ctsi/utils/ApiResult.java
  24. 115 0
      application/src/main/java/com/ctsi/utils/JwtUtil.java
  25. 17 0
      application/src/main/java/com/ctsi/utils/PasswordEncoderUtil.java
  26. 47 0
      application/src/main/resources/application.yml
  27. 9 0
      application/src/main/resources/data-h2.sql
  28. 2 0
      application/src/main/resources/schema-h2.sql
  29. 33 0
      pom.xml

+ 38 - 0
.gitignore

@@ -0,0 +1,38 @@
+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

+ 12 - 0
.idea/dataSources.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="DataSourceManagerImpl" format="xml" multifile-model="true">
+    <data-source source="LOCAL" name="myframe@localhost" uuid="846be58b-eba5-4d40-b7e9-7c7402ae0aae">
+      <driver-ref>mysql.8</driver-ref>
+      <synchronize>true</synchronize>
+      <jdbc-driver>com.mysql.cj.jdbc.Driver</jdbc-driver>
+      <jdbc-url>jdbc:mysql://localhost:3306/myframe</jdbc-url>
+      <working-dir>$ProjectFileDir$</working-dir>
+    </data-source>
+  </component>
+</project>

+ 9 - 0
.idea/encodings.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="file://$PROJECT_DIR$/application/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/core/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
+  </component>
+</project>

+ 20 - 0
.idea/misc.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+    <option name="ignoredFiles">
+      <set>
+        <option value="$PROJECT_DIR$/core/pom.xml" />
+      </set>
+    </option>
+    <option name="workspaceImportForciblyTurnedOn" value="true" />
+  </component>
+  <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>

+ 124 - 0
.idea/uiDesigner.xml

@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Palette2">
+    <group name="Swing">
+      <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
+      </item>
+      <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
+        <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
+        <initial-values>
+          <property name="text" value="Button" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="RadioButton" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="CheckBox" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="Label" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
+          <preferred-size width="-1" height="20" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
+      </item>
+    </group>
+  </component>
+</project>

+ 6 - 0
.idea/vcs.xml

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

+ 152 - 0
.idea/workspace.xml

@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="AutoImportSettings">
+    <option name="autoReloadType" value="SELECTIVE" />
+  </component>
+  <component name="ChangeListManager">
+    <list default="true" id="1dc46973-e6f5-473b-a131-bf2bbc2dca15" name="更改" comment="">
+      <change afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/.idea/dataSources.xml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/.idea/encodings.xml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/.idea/uiDesigner.xml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/pom.xml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/Application.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/config/MybatisPlusConfig.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/config/SaTokenConfigure.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/config/SwaggerConfig.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/entity/FramePage.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/handler/GlobalExceptionHandler.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/system/entity/UserForm.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/system/web/login.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/user/controller/SysUserController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/user/entity/SysUser.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/user/mapper/SysUserMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/user/mapper/SysUserMapper.xml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/user/service/SysUserService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/user/service/impl/SysUserServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/utils/ApiResult.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/utils/JwtUtil.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/utils/PasswordEncoderUtil.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/src/main/resources/application.yml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/src/main/resources/data-h2.sql" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/src/main/resources/schema-h2.sql" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
+    </list>
+    <option name="SHOW_DIALOG" value="false" />
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+    <option name="LAST_RESOLUTION" value="IGNORE" />
+  </component>
+  <component name="FileTemplateManagerImpl">
+    <option name="RECENT_TEMPLATES">
+      <list>
+        <option value="Class" />
+      </list>
+    </option>
+  </component>
+  <component name="Git.Settings">
+    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
+  </component>
+  <component name="MavenImportPreferences">
+    <option name="generalSettings">
+      <MavenGeneralSettings>
+        <option name="localRepository" value="D:\maven_Repository" />
+        <option name="useMavenConfig" value="false" />
+        <option name="userSettingsFile" value="C:\Program Files\apache-maven-3.6.3\conf\settings_udp6.8.xml" />
+      </MavenGeneralSettings>
+    </option>
+  </component>
+  <component name="ProjectColorInfo"><![CDATA[{
+  "associatedIndex": 7
+}]]></component>
+  <component name="ProjectId" id="2aezaWUwbDRLzY7u1sjL3Hf0jM5" />
+  <component name="ProjectLevelVcsManager" settingsEditedManually="true">
+    <ConfirmationsSetting value="2" id="Add" />
+  </component>
+  <component name="ProjectViewState">
+    <option name="autoscrollFromSource" value="true" />
+    <option name="hideEmptyMiddlePackages" value="true" />
+    <option name="showLibraryContents" value="true" />
+  </component>
+  <component name="PropertiesComponent"><![CDATA[{
+  "keyToString": {
+    "ASKED_ADD_EXTERNAL_FILES": "true",
+    "Maven.application [clean].executor": "Run",
+    "Maven.application [org.apache.maven.plugins:maven-clean-plugin:3.1.0:clean].executor": "Run",
+    "Maven.application [package].executor": "Run",
+    "Maven.my-spring-boot-app [clean].executor": "Run",
+    "RequestMappingsPanelOrder0": "0",
+    "RequestMappingsPanelOrder1": "1",
+    "RequestMappingsPanelWidth0": "75",
+    "RequestMappingsPanelWidth1": "75",
+    "RunOnceActivity.OpenProjectViewOnStart": "true",
+    "RunOnceActivity.ShowReadmeOnStart": "true",
+    "SHARE_PROJECT_CONFIGURATION_FILES": "true",
+    "Spring Boot.Application.executor": "Debug",
+    "jdk.selected.JAVA_MODULE": "1.8",
+    "kotlin-language-version-configured": "true",
+    "node.js.detected.package.eslint": "true",
+    "node.js.detected.package.tslint": "true",
+    "node.js.selected.package.eslint": "(autodetect)",
+    "node.js.selected.package.tslint": "(autodetect)",
+    "nodejs_package_manager_path": "npm",
+    "project.structure.last.edited": "模块",
+    "project.structure.proportion": "0.0",
+    "project.structure.side.proportion": "0.0",
+    "settings.editor.selected.configurable": "MavenSettings",
+    "vue.rearranger.settings.migration": "true"
+  },
+  "keyToStringList": {
+    "DatabaseDriversLRU": [
+      "mongo",
+      "mysql"
+    ]
+  }
+}]]></component>
+  <component name="RecentsManager">
+    <key name="MoveFile.RECENT_KEYS">
+      <recent name="C:\Users\setin\IdeaProjects\GeneralFrame\application\src\main\resources" />
+      <recent name="C:\Users\setin\IdeaProjects\GeneralFrame\application\src\main\java\com\ctsi" />
+    </key>
+    <key name="CopyClassDialog.RECENTS_KEY">
+      <recent name="com.ctsi.utils" />
+    </key>
+  </component>
+  <component name="RunManager">
+    <configuration name="Application" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
+      <module name="application" />
+      <option name="SPRING_BOOT_MAIN_CLASS" value="com.ctsi.Application" />
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+  </component>
+  <component name="SharedIndexes">
+    <attachedChunks>
+      <set>
+        <option value="jdk-1.8.0_392-corretto-1.8.0_392-3183f394aec4-cb300fc7" />
+      </set>
+    </attachedChunks>
+  </component>
+  <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="应用程序级" UseSingleDictionary="true" transferred="true" />
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="默认任务">
+      <changelist id="1dc46973-e6f5-473b-a131-bf2bbc2dca15" name="更改" comment="" />
+      <created>1704693898384</created>
+      <option name="number" value="Default" />
+      <option name="presentableId" value="Default" />
+      <updated>1704693898384</updated>
+      <workItem from="1704693899463" duration="37720000" />
+    </task>
+    <servers />
+  </component>
+  <component name="TypeScriptGeneratedFilesManager">
+    <option name="version" value="3" />
+  </component>
+  <component name="VcsManagerConfiguration">
+    <option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" />
+  </component>
+</project>

+ 106 - 0
application/pom.xml

@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         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">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.5.15</version>
+        <relativePath/>
+    </parent>
+
+    <groupId>com.ctsi</groupId>
+    <artifactId>application</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>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <version>2.2.220</version>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.24</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-boot-starter</artifactId>
+            <version>3.0.0</version> <!-- 请替换成最新的版本 -->
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.26</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-api</artifactId>
+            <version>0.11.5</version>
+            <scope>compile</scope>
+        </dependency>
+        <!-- Sa-Token 权限认证,在线文档:https://sa-token.cc -->
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-spring-boot-starter</artifactId>
+            <version>1.37.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.data</groupId>
+            <artifactId>spring-data-commons</artifactId>
+            <version>2.3.1.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.mindrot</groupId>
+            <artifactId>jbcrypt</artifactId>
+            <version>0.4</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <directory>src/main/java</directory>
+                <includes>
+                    <include>**/*.xml</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+            </resource>
+        </resources>
+    </build>
+
+</project>

+ 48 - 0
application/src/main/java/com/ctsi/Application.java

@@ -0,0 +1,48 @@
+package com.ctsi;
+
+import cn.dev33.satoken.SaManager;
+import cn.hutool.system.HostInfo;
+import org.apache.ibatis.annotations.Mapper;
+import org.mybatis.spring.annotation.MapperScan;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.core.env.Environment;
+
+@SpringBootApplication(scanBasePackages = {"com.ctsi.*"})
+@MapperScan("com.ctsi.*.mapper")
+public class Application {
+    private static final Logger log = LoggerFactory.getLogger(Application.class);
+    private static final String SWAGGER_PAGE = "swagger-ui/index.html";
+    private static final String SERVER_SSL_KEY_STORE = "server.ssl.key-store";
+
+    public static void main(String[] args) {
+        SpringApplication app = new SpringApplication(Application.class);
+        Environment env = app.run(args).getEnvironment();
+        String serverPort = env.getProperty("server.port");
+        String protocol = "http";
+        if (env.getProperty(SERVER_SSL_KEY_STORE) != null) {
+            protocol = "https";
+        }
+        log.info("\n----------------------------------------------------------\n\t" +
+                        "Application '{}' is running! Access URLs:\n\t" +
+                        "Local: \t\t{}://localhost:{}\n\t" +
+                        "External: \t{}://{}:{}\n\t" +
+                        "API doc: \t{}://{}:{}/{}\n\t" +
+                        "启动成功,Sa-Token 配置如下:{}"+
+                        "Profile(s): \t{}\n----------------------------------------------------------",
+                env.getProperty("spring.application.name"),
+                protocol,
+                serverPort,
+                protocol,
+                new HostInfo().getAddress(),
+                serverPort,
+                protocol,
+                new HostInfo().getAddress() ,
+                serverPort,
+                SWAGGER_PAGE,
+                SaManager.getConfig(),
+                env.getActiveProfiles());
+    }
+}

+ 24 - 0
application/src/main/java/com/ctsi/config/MybatisPlusConfig.java

@@ -0,0 +1,24 @@
+package com.ctsi.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@MapperScan("com.ctsi.*.mapper")
+public class MybatisPlusConfig {
+
+    /**
+     * 添加分页插件
+     */
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多个插件,切记分页最后添加
+        //interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbType
+        return interceptor;
+    }
+}

+ 26 - 0
application/src/main/java/com/ctsi/config/SaTokenConfigure.java

@@ -0,0 +1,26 @@
+package com.ctsi.config;
+
+import cn.dev33.satoken.interceptor.SaInterceptor;
+import cn.dev33.satoken.stp.StpUtil;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class SaTokenConfigure implements WebMvcConfigurer {
+    // 注册 Sa-Token 拦截器,打开注解式鉴权功能
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        // 注册 Sa-Token 拦截器,打开注解式鉴权功能
+        registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**");
+        // 注册 Sa-Token 拦截器,校验规则为 StpUtil.checkLogin() 登录校验。
+        registry.addInterceptor(new SaInterceptor(handle -> StpUtil.checkLogin()))
+                .addPathPatterns("/**")
+                .excludePathPatterns("/api/system/login",
+                        "/swagger-ui/*",
+                        "/v3/api-docs",
+                        "/webjars/**",
+                        "/swagger-resources/**");
+    }
+}
+

+ 64 - 0
application/src/main/java/com/ctsi/config/SwaggerConfig.java

@@ -0,0 +1,64 @@
+package com.ctsi.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.oas.annotations.EnableOpenApi;
+import springfox.documentation.service.*;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spi.service.contexts.SecurityContext;
+import springfox.documentation.spring.web.plugins.Docket;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@Configuration
+@EnableOpenApi
+public class SwaggerConfig {
+
+    @Bean
+    public Docket api() {
+        return new Docket(DocumentationType.OAS_30)
+                .select()
+                .paths(PathSelectors.any())
+                .build()
+                .securitySchemes(securitySchemes())
+                .securityContexts(Collections.singletonList(securityContext()))
+                .apiInfo(apiInfo());
+    }
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+                .title("GeneralFrame Documentation")
+                .description("API documentation for GeneralFrame")
+                .version("1.0.0")
+                .build();
+    }
+
+    private List<SecurityScheme> securitySchemes() {
+        List<SecurityScheme> apiKeyList= new ArrayList<>();
+        //注意,这里应对应登录token鉴权对应的k-v
+        apiKeyList.add(new ApiKey("Authorization", "Authorization", "header"));
+        return apiKeyList;
+    }
+    /**
+     * 这里设置 swagger2 认证的安全上下文
+     */
+    private SecurityContext securityContext() {
+        return SecurityContext.builder()
+                .securityReferences(Collections.singletonList(new SecurityReference("Authorization", scopes())))
+                .build();
+    }
+
+    /**
+     * 这里是写允许认证的scope
+     */
+    private AuthorizationScope[] scopes() {
+        return new AuthorizationScope[]{
+                new AuthorizationScope("web", "All scope is trusted!")
+        };
+    }
+}

+ 17 - 0
application/src/main/java/com/ctsi/entity/FramePage.java

@@ -0,0 +1,17 @@
+package com.ctsi.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class FramePage {
+    @ApiModelProperty(value = "页码(从0开始)", notes = "")
+    private int pageNum;
+    @ApiModelProperty(value = "每页条数", notes = "")
+    private int pageSize;
+
+    public FramePage() {
+        this.pageNum = 0;
+        this.pageSize = 10;
+    }
+}

+ 17 - 0
application/src/main/java/com/ctsi/handler/GlobalExceptionHandler.java

@@ -0,0 +1,17 @@
+package com.ctsi.handler;
+
+import cn.dev33.satoken.util.SaResult;
+import com.ctsi.utils.ApiResult;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+    // 全局异常拦截
+    @ExceptionHandler
+    public ApiResult handlerException(Exception e) {
+        e.printStackTrace();
+        return ApiResult.result(401, e.getMessage(), null);
+    }
+}
+

+ 14 - 0
application/src/main/java/com/ctsi/system/entity/UserForm.java

@@ -0,0 +1,14 @@
+package com.ctsi.system.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+import lombok.Data;
+
+@ApiOperation(value = "用户登录")
+@Data
+public class UserForm {
+    @ApiModelProperty(value = "用户名")
+    private String username;
+    @ApiModelProperty(value = "密码")
+    private String password;
+}

+ 46 - 0
application/src/main/java/com/ctsi/system/web/login.java

@@ -0,0 +1,46 @@
+package com.ctsi.system.web;
+
+import cn.dev33.satoken.stp.StpUtil;
+import com.ctsi.system.entity.UserForm;
+import com.ctsi.user.entity.SysUser;
+import com.ctsi.user.service.SysUserService;
+import com.ctsi.utils.ApiResult;
+import com.ctsi.utils.PasswordEncoderUtil;
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@Api(tags = "授权")
+@RestController
+@RequestMapping(value = "/api/system")
+public class login {
+    @Resource
+    private SysUserService sysUserService;
+    @PostMapping(value = "/login",name = "登录")
+    public ApiResult auth(UserForm userForm){
+        SysUser User =  sysUserService.queryByUserName(userForm.getUsername());
+        if(User == null){
+            return ApiResult.failure("用户不存在",null);
+        }
+        if (!PasswordEncoderUtil.checkPassword(userForm.getPassword(),User.getPassword())){
+            return ApiResult.failure("密码错误",null);
+        }
+        StpUtil.login(User.getId());
+        return ApiResult.success("登录成功");
+    }
+
+    @GetMapping(value = "/logout",name = "登出")
+    public ApiResult logout(){
+        StpUtil.logout();
+        return ApiResult.success("退出成功");
+    }
+
+    @PostMapping(value = "/islogin",name = "是否登录")
+    public ApiResult islogin(){
+        return ApiResult.success(StpUtil.getLoginId());
+    }
+}

+ 85 - 0
application/src/main/java/com/ctsi/user/controller/SysUserController.java

@@ -0,0 +1,85 @@
+package com.ctsi.user.controller;
+
+import cn.dev33.satoken.annotation.SaCheckLogin;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ctsi.entity.FramePage;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import com.ctsi.user.entity.SysUser;
+import com.ctsi.user.service.SysUserService;
+
+ /**
+ * 用户表;(sys_user)表控制层
+ * @author : http://www.chiner.pro
+ * @date : 2024-1-9
+ */
+@Api(tags = "用户表对象功能接口")
+@RestController
+@RequestMapping("/sysUser")
+public class SysUserController{
+    @Autowired
+    private SysUserService sysUserService;
+    
+    /** 
+     * 通过ID查询单条数据 
+     *
+     * @param id 主键
+     * @return 实例对象
+     */
+    @ApiOperation("通过ID查询单条数据")
+    @GetMapping("{id}")
+    public ResponseEntity<SysUser> queryById(Long id){
+        return ResponseEntity.ok(sysUserService.queryById(id));
+    }
+    
+    /** 
+     * 分页查询
+     *
+     * @param sysUser 筛选条件
+     * @return 查询结果
+     */
+    @ApiOperation("分页查询")
+    @GetMapping
+    public ResponseEntity<Page<SysUser>> paginQuery(SysUser sysUser, FramePage framePage){
+        return ResponseEntity.ok(sysUserService.paginQuery(sysUser, framePage.getPageNum(), framePage.getPageSize()));
+    }
+    
+    /** 
+     * 新增数据
+     *
+     * @param sysUser 实例对象
+     * @return 实例对象
+     */
+    @ApiOperation("新增数据")
+    @PostMapping
+    public ResponseEntity<SysUser> add(@RequestBody SysUser sysUser){
+        return ResponseEntity.ok(sysUserService.insert(sysUser));
+    }
+    
+    /** 
+     * 更新数据
+     *
+     * @param sysUser 实例对象
+     * @return 实例对象
+     */
+    @ApiOperation("更新数据")
+    @PutMapping
+    public ResponseEntity<SysUser> edit(@RequestBody SysUser sysUser){
+        return ResponseEntity.ok(sysUserService.update(sysUser));
+    }
+    
+    /** 
+     * 通过主键删除数据
+     *
+     * @param id 主键
+     * @return 是否成功
+     */
+    @ApiOperation("通过主键删除数据")
+    @DeleteMapping
+    public ResponseEntity<Boolean> deleteById(Long id){
+        return ResponseEntity.ok(sysUserService.deleteById(id));
+    }
+}

+ 65 - 0
application/src/main/java/com/ctsi/user/entity/SysUser.java

@@ -0,0 +1,65 @@
+package com.ctsi.user.entity;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+
+ /**
+ * 用户表;
+ * @author : http://www.chiner.pro
+ * @date : 2024-1-9
+ */
+@ApiModel(value = "用户表",description = "")
+@TableName("sys_user")
+public class SysUser implements Serializable,Cloneable{
+    /** 主键id */
+    @ApiModelProperty(value = "主键id",notes = "")
+    @TableId
+    private Long id ;
+    /** 用户名 */
+    @ApiModelProperty(value = "用户名",notes = "")
+    private String userName ;
+    /** 密码 */
+    @ApiModelProperty(value = "密码",notes = "")
+    private String password ;
+    /** 逻辑删除 */
+    @ApiModelProperty(value = "逻辑删除",notes = "")
+    @TableLogic
+    private Integer delFlag ;
+
+    /** 主键id */
+    public Long getId(){
+        return this.id;
+    }
+    /** 主键id */
+    public void setId(Long id){
+        this.id=id;
+    }
+    /** 用户名 */
+    public String getUserName(){
+        return this.userName;
+    }
+    /** 用户名 */
+    public void setUserName(String userName){
+        this.userName=userName;
+    }
+    /** 密码 */
+    public String getPassword(){
+        return this.password;
+    }
+    /** 密码 */
+    public void setPassword(String password){
+        this.password=password;
+    }
+    /** 逻辑删除 */
+    public Integer getDelFlag(){
+        return this.delFlag;
+    }
+    /** 逻辑删除 */
+    public void setDelFlag(Integer delFlag){
+        this.delFlag=delFlag;
+    }
+}

+ 26 - 0
application/src/main/java/com/ctsi/user/mapper/SysUserMapper.java

@@ -0,0 +1,26 @@
+package com.ctsi.user.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import com.ctsi.user.entity.SysUser;
+
+ /**
+ * 用户表;(sys_user)表数据库访问层
+ * @author : http://www.chiner.pro
+ * @date : 2024-1-9
+ */
+@Mapper
+public interface SysUserMapper  extends BaseMapper<SysUser>{
+    /** 
+     * 分页查询指定行数据
+     *
+     * @param page 分页参数
+     * @param wrapper 动态查询条件
+     * @return 分页对象列表
+     */
+    IPage<SysUser> selectByPage(IPage<SysUser> page , @Param(Constants.WRAPPER) Wrapper<SysUser> wrapper);
+}

+ 8 - 0
application/src/main/java/com/ctsi/user/mapper/SysUserMapper.xml

@@ -0,0 +1,8 @@
+<?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.ctsi.user.mapper.SysUserMapper">
+     <select id="selectByPage" resultType="com.ctsi.user.entity.SysUser">
+        select * from sys_user ${ew.customSqlSegment}
+    </select>
+</mapper>

+ 53 - 0
application/src/main/java/com/ctsi/user/service/SysUserService.java

@@ -0,0 +1,53 @@
+package com.ctsi.user.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ctsi.user.entity.SysUser;
+
+ /**
+ * 用户表;(sys_user)表服务接口
+ * @author : http://www.chiner.pro
+ * @date : 2024-1-9
+ */
+public interface SysUserService{
+    
+    /** 
+     * 通过ID查询单条数据 
+     *
+     * @param id 主键
+     * @return 实例对象
+     */
+    SysUser queryById(Long id);
+    
+    /**
+     * 分页查询
+     *
+     * @param sysUser 筛选条件
+     * @param current 当前页码
+     * @param size  每页大小
+     * @return
+     */
+    Page<SysUser> paginQuery(SysUser sysUser, long current, long size);
+    /** 
+     * 新增数据
+     *
+     * @param sysUser 实例对象
+     * @return 实例对象
+     */
+    SysUser insert(SysUser sysUser);
+    /** 
+     * 更新数据
+     *
+     * @param sysUser 实例对象
+     * @return 实例对象
+     */
+    SysUser update(SysUser sysUser);
+    /** 
+     * 通过主键删除数据
+     *
+     * @param id 主键
+     * @return 是否成功
+     */
+    boolean deleteById(Long id);
+
+     SysUser queryByUserName(String userName);
+}

+ 115 - 0
application/src/main/java/com/ctsi/user/service/impl/SysUserServiceImpl.java

@@ -0,0 +1,115 @@
+package com.ctsi.user.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.ctsi.utils.PasswordEncoderUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
+import com.ctsi.user.entity.SysUser;
+import com.ctsi.user.mapper.SysUserMapper;
+import com.ctsi.user.service.SysUserService;
+ /**
+ * 用户表;(sys_user)表服务实现类
+ * @author : http://www.chiner.pro
+ * @date : 2024-1-9
+ */
+@Service
+public class SysUserServiceImpl implements SysUserService{
+    @Autowired
+    private SysUserMapper sysUserMapper;
+    
+    /** 
+     * 通过ID查询单条数据 
+     *
+     * @param id 主键
+     * @return 实例对象
+     */
+    public SysUser queryById(Long id){
+        return sysUserMapper.selectById(id);
+    }
+    
+    /**
+     * 分页查询
+     *
+     * @param sysUser 筛选条件
+     * @param current 当前页码
+     * @param size  每页大小
+     * @return
+     */
+    public Page<SysUser> paginQuery(SysUser sysUser, long current, long size){
+        //1. 构建动态查询条件
+        LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
+        if(StrUtil.isNotBlank(sysUser.getUserName())){
+            queryWrapper.eq(SysUser::getUserName, sysUser.getUserName());
+        }
+        if(StrUtil.isNotBlank(sysUser.getPassword())){
+            queryWrapper.eq(SysUser::getPassword, sysUser.getPassword());
+        }
+        //2. 执行分页查询
+        Page<SysUser> pagin = new Page<>(current , size , true);
+        IPage<SysUser> selectResult = sysUserMapper.selectPage(pagin , queryWrapper);
+        pagin.setPages(selectResult.getPages());
+        pagin.setTotal(selectResult.getTotal());
+        pagin.setRecords(selectResult.getRecords());
+        //3. 返回结果
+        return pagin;
+    }
+    
+    /** 
+     * 新增数据
+     *
+     * @param sysUser 实例对象
+     * @return 实例对象
+     */
+    public SysUser insert(SysUser sysUser){
+        sysUser.setPassword(PasswordEncoderUtil.hashPassword(sysUser.getPassword()));
+        sysUserMapper.insert(sysUser);
+        return sysUser;
+    }
+    
+    /** 
+     * 更新数据
+     *
+     * @param sysUser 实例对象
+     * @return 实例对象
+     */
+    public SysUser update(SysUser sysUser){
+        //1. 根据条件动态更新
+        LambdaUpdateChainWrapper<SysUser> chainWrapper = new LambdaUpdateChainWrapper<SysUser>(sysUserMapper);
+        if(StrUtil.isNotBlank(sysUser.getUserName())){
+            chainWrapper.eq(SysUser::getUserName, sysUser.getUserName());
+        }
+        if(StrUtil.isNotBlank(sysUser.getPassword())){
+            chainWrapper.eq(SysUser::getPassword, sysUser.getPassword());
+        }
+        //2. 设置主键,并更新
+        chainWrapper.set(SysUser::getId, sysUser.getId());
+        boolean ret = chainWrapper.update();
+        //3. 更新成功了,查询最最对象返回
+        if(ret){
+            return queryById(sysUser.getId());
+        }else{
+            return sysUser;
+        }
+    }
+    
+    /** 
+     * 通过主键删除数据
+     *
+     * @param id 主键
+     * @return 是否成功
+     */
+    public boolean deleteById(Long id){
+        int total = sysUserMapper.deleteById(id);
+        return total > 0;
+    }
+
+    public SysUser queryByUserName(String userName){
+        LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SysUser::getUserName, userName);
+        return sysUserMapper.selectOne(queryWrapper);
+    }
+}

+ 102 - 0
application/src/main/java/com/ctsi/utils/ApiResult.java

@@ -0,0 +1,102 @@
+package com.ctsi.utils;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 统一返回格式
+ *
+ * @author macalzz1
+ * @since 2022-11-25 16:34:17
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@ApiModel(value = "统一返回格式")
+public class ApiResult<T> {
+    /**
+     * 操作成功默认编码
+     */
+    public static final int DEFAULT_SUCCEED_CODE = 200;
+
+    /**
+     * 操作失败默认编码
+     */
+    public static final int DEFAULT_FAIL_CODE = 500;
+    /**
+     * 操作成功默认提示信息
+     */
+    public static final String DEFAULT_SUCCEED_MESSAGE = "操作成功";
+
+    @ApiModelProperty(value = "结果编码")
+    private int code;
+    @ApiModelProperty(value = "提示信息")
+    private String message;
+    @ApiModelProperty(value = "返回数据")
+    private T result;
+
+    /**
+     * 成功
+     *
+     * @param result 数据
+     * @param <T>    类型
+     * @return 成功
+     */
+    public static <T> ApiResult<T> success(T result) {
+        return success(DEFAULT_SUCCEED_MESSAGE, result);
+    }
+
+    /**
+     * 返回成功信息
+     *
+     * @param message 返回信息
+     * @param result  数据
+     * @param <T>     类型
+     * @return 成功
+     */
+    public static <T> ApiResult<T> success(String message, T result) {
+        return new ApiResult<>(DEFAULT_SUCCEED_CODE, message, result);
+    }
+
+    /**
+     * 返回失败信息
+     *
+     * @param message 返回信息
+     * @param result  数据
+     * @param <T>     类型
+     * @return 成功
+     */
+    public static <T> ApiResult<T> failure(String message, T result) {
+        return new ApiResult<>(DEFAULT_FAIL_CODE, message, result);
+    }
+
+    /**
+     * 返回结果
+     *
+     * @param code    返回状态编码
+     * @param message 操作信息
+     * @param result  数据
+     * @param <T>     类型
+     * @return 结果
+     */
+    public static <T> ApiResult<T> result(int code, String message, T result) {
+        return new ApiResult<>(code, message, result);
+    }
+
+    /**
+     * 返回结果
+     *
+     * @param code    返回状态编码
+     * @param message 操作信息
+     * @return 结果
+     */
+    public static ApiResult<Void> result(int code, String message) {
+        return result(code, message, null);
+    }
+}
+

+ 115 - 0
application/src/main/java/com/ctsi/utils/JwtUtil.java

@@ -0,0 +1,115 @@
+package com.ctsi.utils;
+
+
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.JwtBuilder;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+import java.util.Base64;
+import java.util.Date;
+import java.util.UUID;
+
+/**
+ * JWT工具类
+ */
+public class JwtUtil {
+
+    //有效期为
+    public static final Long JWT_TTL = 60 * 60 *1000L;// 60 * 60 *1000  一个小时
+    //设置秘钥明文
+    public static final String JWT_KEY = "sangeng";
+
+    public static String getUUID(){
+        String token = UUID.randomUUID().toString().replaceAll("-", "");
+        return token;
+    }
+
+    /**
+     * 生成jtw
+     * @param subject token中要存放的数据(json格式)
+     * @return
+     */
+    public static String createJWT(String subject) {
+        JwtBuilder builder = getJwtBuilder(subject, null, getUUID());// 设置过期时间
+        return builder.compact();
+    }
+
+    /**
+     * 生成jtw
+     * @param subject token中要存放的数据(json格式)
+     * @param ttlMillis token超时时间
+     * @return
+     */
+    public static String createJWT(String subject, Long ttlMillis) {
+        JwtBuilder builder = getJwtBuilder(subject, ttlMillis, getUUID());// 设置过期时间
+        return builder.compact();
+    }
+
+    private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) {
+        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
+        SecretKey secretKey = generalKey();
+        long nowMillis = System.currentTimeMillis();
+        Date now = new Date(nowMillis);
+        if(ttlMillis==null){
+            ttlMillis=JwtUtil.JWT_TTL;
+        }
+        long expMillis = nowMillis + ttlMillis;
+        Date expDate = new Date(expMillis);
+        return Jwts.builder()
+                .setId(uuid)              //唯一的ID
+                .setSubject(subject)   // 主题  可以是JSON数据
+                .setIssuer("sg")     // 签发者
+                .setIssuedAt(now)      // 签发时间
+                .signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥
+                .setExpiration(expDate);
+    }
+
+    /**
+     * 创建token
+     * @param id
+     * @param subject
+     * @param ttlMillis
+     * @return
+     */
+    public static String createJWT(String id, String subject, Long ttlMillis) {
+        JwtBuilder builder = getJwtBuilder(subject, ttlMillis, id);// 设置过期时间
+        return builder.compact();
+    }
+
+    public static void main(String[] args) throws Exception {
+        String token = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJjYWM2ZDVhZi1mNjVlLTQ0MDAtYjcxMi0zYWEwOGIyOTIwYjQiLCJzdWIiOiJzZyIsImlzcyI6InNnIiwiaWF0IjoxNjM4MTA2NzEyLCJleHAiOjE2MzgxMTAzMTJ9.JVsSbkP94wuczb4QryQbAke3ysBDIL5ou8fWsbt_ebg";
+        Claims claims = parseJWT(token);
+        System.out.println(claims);
+    }
+
+    /**
+     * 生成加密后的秘钥 secretKey
+     * @return
+     */
+    public static SecretKey generalKey() {
+        byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);
+        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
+        return key;
+    }
+
+    /**
+     * 解析
+     *
+     * @param jwt
+     * @return
+     * @throws Exception
+     */
+    public static Claims parseJWT(String jwt) throws Exception {
+        SecretKey secretKey = generalKey();
+        return Jwts.parser()
+                .setSigningKey(secretKey)
+                .parseClaimsJws(jwt)
+                .getBody();
+    }
+
+
+}
+

+ 17 - 0
application/src/main/java/com/ctsi/utils/PasswordEncoderUtil.java

@@ -0,0 +1,17 @@
+package com.ctsi.utils;
+
+import org.mindrot.jbcrypt.BCrypt;
+
+public class PasswordEncoderUtil {
+
+    // 生成哈希密码
+    public static String hashPassword(String plainPassword) {
+        return BCrypt.hashpw(plainPassword, BCrypt.gensalt());
+    }
+
+    // 验证密码
+    public static boolean checkPassword(String plainPassword, String hashedPassword) {
+        return BCrypt.checkpw(plainPassword, hashedPassword);
+    }
+}
+

+ 47 - 0
application/src/main/resources/application.yml

@@ -0,0 +1,47 @@
+# 应用程序名称
+spring:
+  application:
+    name: GeneralFrame
+  # 数据库配置
+  datasource:
+    url: jdbc:mysql://matrix34.tpddns.cn:13306/myframe?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
+    username: root
+    password: 9a41012499f38251
+    driver-class-name: com.mysql.cj.jdbc.Driver
+mybatis-plus:
+  global-config:
+    db-config:
+      logic-delete-field: delFlag
+      logic-delete-value: 1
+      logic-not-delete-value: 0
+  configuration:
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+
+# 服务器端口
+server:
+  port: 60006
+
+# 日志级别
+logging:
+  level:
+    root: info
+# swagger开关
+springfox:
+  documentation:
+    auto-startup: true #false关闭swagger文档 true打开swagger
+############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
+sa-token:
+  # token 名称(同时也是 cookie 名称)
+  token-name: token
+  # token 有效期(单位:秒) 默认30天,-1 代表永久有效
+  timeout: 2592000
+  # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
+  active-timeout: -1
+  # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
+  is-concurrent: true
+  # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
+  is-share: true
+  # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
+  token-style: uuid
+  # 是否输出操作日志
+  is-log: true

+ 9 - 0
application/src/main/resources/data-h2.sql

@@ -0,0 +1,9 @@
+CREATE TABLE sys_user(
+                         `ID` INT NOT NULL AUTO_INCREMENT  COMMENT '主键id' ,
+                         `USER_NAME` VARCHAR(255) NOT NULL   COMMENT '用户id' ,
+                         `PASSWORD` VARCHAR(255) NOT NULL   COMMENT '密码' ,
+                         `DEL_FLAG` INT   DEFAULT 0 COMMENT '逻辑删除' ,
+                         PRIMARY KEY (ID)
+)  COMMENT = '用户表' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+CREATE UNIQUE INDEX userName_index ON sys_user(USER_NAME);

+ 2 - 0
application/src/main/resources/schema-h2.sql

@@ -0,0 +1,2 @@
+INSERT INTO `sys_user` (USER_NAME, PASSWORD) VALUES
+('admin', '123456');

+ 33 - 0
pom.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         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">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.example</groupId>
+    <artifactId>my-spring-boot-app</artifactId>
+    <version>1.0.0</version>
+    <packaging>pom</packaging>
+    <modules>
+        <module>application</module>
+    </modules>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.5.5</version> <!-- 请根据实际情况选择最新版本 -->
+    </parent>
+
+    <dependencies>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <!-- Spring Boot Maven 插件 -->
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+</project>