feat(all): 初始化版本
This commit is contained in:
253
.gitignore
vendored
Normal file
253
.gitignore
vendored
Normal file
@@ -0,0 +1,253 @@
|
|||||||
|
.idea/**/workspace.xml
|
||||||
|
.idea/**/tasks.xml
|
||||||
|
.idea/**/usage.statistics.xml
|
||||||
|
.idea/**/dictionaries
|
||||||
|
.idea/**/shelf
|
||||||
|
.idea/**/aws.xml
|
||||||
|
.idea/**/contentModel.xml
|
||||||
|
.idea/**/dataSources/
|
||||||
|
.idea/**/dataSources.ids
|
||||||
|
.idea/**/dataSources.local.xml
|
||||||
|
.idea/**/sqlDataSources.xml
|
||||||
|
.idea/**/dynamic.xml
|
||||||
|
.idea/**/uiDesigner.xml
|
||||||
|
.idea/**/dbnavigator.xml
|
||||||
|
.idea/**/gradle.xml
|
||||||
|
.idea/**/libraries
|
||||||
|
cmake-build-*/
|
||||||
|
.idea/**/mongoSettings.xml
|
||||||
|
*.iws
|
||||||
|
out/
|
||||||
|
.idea_modules/
|
||||||
|
atlassian-ide-plugin.xml
|
||||||
|
.idea/replstate.xml
|
||||||
|
.idea/sonarlint/
|
||||||
|
com_crashlytics_export_strings.xml
|
||||||
|
crashlytics.properties
|
||||||
|
crashlytics-build.properties
|
||||||
|
fabric.properties
|
||||||
|
.idea/httpRequests
|
||||||
|
.idea/caches/build_file_checksums.ser
|
||||||
|
target/
|
||||||
|
pom.xml.tag
|
||||||
|
pom.xml.releaseBackup
|
||||||
|
pom.xml.versionsBackup
|
||||||
|
pom.xml.next
|
||||||
|
release.properties
|
||||||
|
dependency-reduced-pom.xml
|
||||||
|
buildNumber.properties
|
||||||
|
.mvn/timing.properties
|
||||||
|
.mvn/wrapper/maven-wrapper.jar
|
||||||
|
.project
|
||||||
|
.classpath
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/settings.json
|
||||||
|
!.vscode/tasks.json
|
||||||
|
!.vscode/launch.json
|
||||||
|
!.vscode/extensions.json
|
||||||
|
!.vscode/*.code-snippets
|
||||||
|
.history/
|
||||||
|
*.vsix
|
||||||
|
.metadata
|
||||||
|
bin/
|
||||||
|
tmp/
|
||||||
|
*.tmp
|
||||||
|
*.bak
|
||||||
|
*.swp
|
||||||
|
*~.nib
|
||||||
|
local.properties
|
||||||
|
.settings/
|
||||||
|
.loadpath
|
||||||
|
.recommenders
|
||||||
|
.externalToolBuilders/
|
||||||
|
*.launch
|
||||||
|
*.pydevproject
|
||||||
|
.cproject
|
||||||
|
.autotools
|
||||||
|
.factorypath
|
||||||
|
.buildpath
|
||||||
|
.target
|
||||||
|
.tern-project
|
||||||
|
.texlipse
|
||||||
|
.springBeans
|
||||||
|
.recommenders/
|
||||||
|
.apt_generated/
|
||||||
|
.apt_generated_test/
|
||||||
|
.cache-main
|
||||||
|
.scala_dependencies
|
||||||
|
.worksheet
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
.pnpm-debug.log*
|
||||||
|
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||||
|
pids
|
||||||
|
*.pid
|
||||||
|
*.seed
|
||||||
|
*.pid.lock
|
||||||
|
lib-cov
|
||||||
|
coverage
|
||||||
|
*.lcov
|
||||||
|
.nyc_output
|
||||||
|
.grunt
|
||||||
|
bower_components
|
||||||
|
.lock-wscript
|
||||||
|
build/Release
|
||||||
|
node_modules/
|
||||||
|
jspm_packages/
|
||||||
|
web_modules/
|
||||||
|
*.tsbuildinfo
|
||||||
|
.npm
|
||||||
|
.eslintcache
|
||||||
|
.stylelintcache
|
||||||
|
.rpt2_cache/
|
||||||
|
.rts2_cache_cjs/
|
||||||
|
.rts2_cache_es/
|
||||||
|
.rts2_cache_umd/
|
||||||
|
.node_repl_history
|
||||||
|
*.tgz
|
||||||
|
.yarn-integrity
|
||||||
|
.env
|
||||||
|
.env.development.local
|
||||||
|
.env.test.local
|
||||||
|
.env.production.local
|
||||||
|
.env.local
|
||||||
|
.cache
|
||||||
|
.parcel-cache
|
||||||
|
.next
|
||||||
|
out
|
||||||
|
.nuxt
|
||||||
|
dist
|
||||||
|
.cache/
|
||||||
|
.vuepress/dist
|
||||||
|
.temp
|
||||||
|
.docusaurus
|
||||||
|
.serverless/
|
||||||
|
.fusebox/
|
||||||
|
.dynamodb/
|
||||||
|
.tern-port
|
||||||
|
.vscode-test
|
||||||
|
.yarn/cache
|
||||||
|
.yarn/unplugged
|
||||||
|
.yarn/build-state.yml
|
||||||
|
.yarn/install-state.gz
|
||||||
|
.pnp.*
|
||||||
|
.DS_*
|
||||||
|
**/*.backup.*
|
||||||
|
**/*.back.*
|
||||||
|
node_modules
|
||||||
|
*.sublime*
|
||||||
|
psd
|
||||||
|
thumb
|
||||||
|
sketch
|
||||||
|
Thumbs.db
|
||||||
|
Thumbs.db:encryptable
|
||||||
|
ehthumbs.db
|
||||||
|
ehthumbs_vista.db
|
||||||
|
*.stackdump
|
||||||
|
[Dd]esktop.ini
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
*.cab
|
||||||
|
*.msi
|
||||||
|
*.msix
|
||||||
|
*.msm
|
||||||
|
*.msp
|
||||||
|
*.lnk
|
||||||
|
.vagrant/
|
||||||
|
*.tmlanguage.cache
|
||||||
|
*.tmPreferences.cache
|
||||||
|
*.stTheme.cache
|
||||||
|
*.sublime-workspace
|
||||||
|
sftp-config.json
|
||||||
|
sftp-config-alt*.json
|
||||||
|
Package Control.last-run
|
||||||
|
Package Control.ca-list
|
||||||
|
Package Control.ca-bundle
|
||||||
|
Package Control.system-ca-bundle
|
||||||
|
Package Control.cache/
|
||||||
|
Package Control.ca-certs/
|
||||||
|
Package Control.merged-ca-bundle
|
||||||
|
Package Control.user-ca-bundle
|
||||||
|
oscrypto-ca-bundle.crt
|
||||||
|
bh_unicode_properties.cache
|
||||||
|
GitHub.sublime-settings
|
||||||
|
*.accdb
|
||||||
|
*.db
|
||||||
|
*.dbf
|
||||||
|
*.mdb
|
||||||
|
*.pdb
|
||||||
|
*.sqlite3
|
||||||
|
*.db-shm
|
||||||
|
*.db-wal
|
||||||
|
.DS_Store
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
Icon
|
||||||
|
._*
|
||||||
|
.DocumentRevisions-V100
|
||||||
|
.fseventsd
|
||||||
|
.Spotlight-V100
|
||||||
|
.TemporaryItems
|
||||||
|
.Trashes
|
||||||
|
.VolumeIcon.icns
|
||||||
|
.com.apple.timemachine.donotpresent
|
||||||
|
.AppleDB
|
||||||
|
.AppleDesktop
|
||||||
|
Network Trash Folder
|
||||||
|
Temporary Items
|
||||||
|
.apdisk
|
||||||
|
*.class
|
||||||
|
*.ctxt
|
||||||
|
.mtj.tmp/
|
||||||
|
*.jar
|
||||||
|
*.war
|
||||||
|
*.nar
|
||||||
|
*.ear
|
||||||
|
*.zip
|
||||||
|
*.tar.gz
|
||||||
|
*.rar
|
||||||
|
hs_err_pid*
|
||||||
|
replay_pid*
|
||||||
|
*.orig
|
||||||
|
*.BACKUP.*
|
||||||
|
*.BASE.*
|
||||||
|
*.LOCAL.*
|
||||||
|
*.REMOTE.*
|
||||||
|
*_BACKUP_*.txt
|
||||||
|
*_BASE_*.txt
|
||||||
|
*_LOCAL_*.txt
|
||||||
|
*_REMOTE_*.txt
|
||||||
|
*~
|
||||||
|
.fuse_hidden*
|
||||||
|
.directory
|
||||||
|
.Trash-*
|
||||||
|
.nfs*
|
||||||
|
[._]*.s[a-v][a-z]
|
||||||
|
!*.svg # comment out if you don't need vector files
|
||||||
|
[._]*.sw[a-p]
|
||||||
|
[._]s[a-rt-v][a-z]
|
||||||
|
[._]ss[a-gi-z]
|
||||||
|
[._]sw[a-p]
|
||||||
|
Session.vim
|
||||||
|
Sessionx.vim
|
||||||
|
.netrwhist
|
||||||
|
tags
|
||||||
|
[._]*.un~
|
||||||
|
.gradle
|
||||||
|
**/build/
|
||||||
|
!src/**/build/
|
||||||
|
gradle-app.setting
|
||||||
|
!gradle-wrapper.jar
|
||||||
|
!gradle-wrapper.properties
|
||||||
|
.gradletasknamecache
|
||||||
|
.yarn/*
|
||||||
|
!.yarn/releases
|
||||||
|
!.yarn/patches
|
||||||
|
!.yarn/plugins
|
||||||
|
!.yarn/sdks
|
||||||
|
!.yarn/versions
|
||||||
|
!.yarn/cache
|
||||||
|
nohup.out
|
||||||
10
.idea/.gitignore
generated
vendored
Normal file
10
.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# 默认忽略的文件
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# 基于编辑器的 HTTP 客户端请求
|
||||||
|
/httpRequests/
|
||||||
|
# 依赖于环境的 Maven 主目录路径
|
||||||
|
/mavenHomeManager.xml
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
||||||
6
.idea/ApifoxUploaderProjectSetting.xml
generated
Normal file
6
.idea/ApifoxUploaderProjectSetting.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ApifoxUploaderProjectSetting">
|
||||||
|
<option name="apiAccessToken" value="APS-0ZZaS4q0gUiFOlbBJMN8hAmS7viQNi4D" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
82
.idea/codeStyles/Project.xml
generated
Normal file
82
.idea/codeStyles/Project.xml
generated
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
<component name="ProjectCodeStyleConfiguration">
|
||||||
|
<code_scheme name="Project" version="173">
|
||||||
|
<JavaCodeStyleSettings>
|
||||||
|
<option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="100" />
|
||||||
|
<option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="100" />
|
||||||
|
<option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND">
|
||||||
|
<value />
|
||||||
|
</option>
|
||||||
|
<option name="IMPORT_LAYOUT_TABLE">
|
||||||
|
<value>
|
||||||
|
<package name="" withSubpackages="true" static="false" module="true" />
|
||||||
|
<package name="" withSubpackages="true" static="false" />
|
||||||
|
<emptyLine />
|
||||||
|
<package name="" withSubpackages="true" static="true" />
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
</JavaCodeStyleSettings>
|
||||||
|
<JetCodeStyleSettings>
|
||||||
|
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
||||||
|
</JetCodeStyleSettings>
|
||||||
|
<ScalaCodeStyleSettings>
|
||||||
|
<option name="MULTILINE_STRING_CLOSING_QUOTES_ON_NEW_LINE" value="true" />
|
||||||
|
</ScalaCodeStyleSettings>
|
||||||
|
<TypeScriptCodeStyleSettings version="0">
|
||||||
|
<option name="USE_SEMICOLON_AFTER_STATEMENT" value="false" />
|
||||||
|
<option name="FORCE_SEMICOLON_STYLE" value="true" />
|
||||||
|
<option name="USE_DOUBLE_QUOTES" value="false" />
|
||||||
|
<option name="FORCE_QUOTE_STYlE" value="true" />
|
||||||
|
<option name="ENFORCE_TRAILING_COMMA" value="WhenMultiline" />
|
||||||
|
</TypeScriptCodeStyleSettings>
|
||||||
|
<codeStyleSettings language="CSS">
|
||||||
|
<indentOptions>
|
||||||
|
<option name="INDENT_SIZE" value="2" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="2" />
|
||||||
|
<option name="TAB_SIZE" value="2" />
|
||||||
|
</indentOptions>
|
||||||
|
</codeStyleSettings>
|
||||||
|
<codeStyleSettings language="HTML">
|
||||||
|
<indentOptions>
|
||||||
|
<option name="INDENT_SIZE" value="2" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="2" />
|
||||||
|
<option name="TAB_SIZE" value="2" />
|
||||||
|
</indentOptions>
|
||||||
|
</codeStyleSettings>
|
||||||
|
<codeStyleSettings language="JAVA">
|
||||||
|
<option name="LINE_COMMENT_AT_FIRST_COLUMN" value="false" />
|
||||||
|
<option name="LINE_COMMENT_ADD_SPACE" value="true" />
|
||||||
|
<option name="LINE_COMMENT_ADD_SPACE_ON_REFORMAT" value="true" />
|
||||||
|
<option name="KEEP_FIRST_COLUMN_COMMENT" value="false" />
|
||||||
|
<indentOptions>
|
||||||
|
<option name="INDENT_SIZE" value="2" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="2" />
|
||||||
|
<option name="TAB_SIZE" value="2" />
|
||||||
|
</indentOptions>
|
||||||
|
</codeStyleSettings>
|
||||||
|
<codeStyleSettings language="JavaScript">
|
||||||
|
<indentOptions>
|
||||||
|
<option name="INDENT_SIZE" value="2" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="2" />
|
||||||
|
<option name="TAB_SIZE" value="2" />
|
||||||
|
</indentOptions>
|
||||||
|
</codeStyleSettings>
|
||||||
|
<codeStyleSettings language="SCSS">
|
||||||
|
<option name="LINE_COMMENT_ADD_SPACE" value="true" />
|
||||||
|
<option name="BLOCK_COMMENT_ADD_SPACE" value="true" />
|
||||||
|
<indentOptions>
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="2" />
|
||||||
|
<option name="TAB_SIZE" value="2" />
|
||||||
|
</indentOptions>
|
||||||
|
</codeStyleSettings>
|
||||||
|
<codeStyleSettings language="TypeScript">
|
||||||
|
<indentOptions>
|
||||||
|
<option name="INDENT_SIZE" value="2" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="2" />
|
||||||
|
<option name="TAB_SIZE" value="2" />
|
||||||
|
</indentOptions>
|
||||||
|
</codeStyleSettings>
|
||||||
|
<codeStyleSettings language="kotlin">
|
||||||
|
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
||||||
|
</codeStyleSettings>
|
||||||
|
</code_scheme>
|
||||||
|
</component>
|
||||||
5
.idea/codeStyles/codeStyleConfig.xml
generated
Normal file
5
.idea/codeStyles/codeStyleConfig.xml
generated
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<component name="ProjectCodeStyleConfiguration">
|
||||||
|
<state>
|
||||||
|
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
|
||||||
|
</state>
|
||||||
|
</component>
|
||||||
96
.idea/compiler.xml
generated
Normal file
96
.idea/compiler.xml
generated
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="CompilerConfiguration">
|
||||||
|
<annotationProcessing>
|
||||||
|
<profile default="true" name="Default" enabled="true" />
|
||||||
|
<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" />
|
||||||
|
</profile>
|
||||||
|
<profile name="Annotation profile for leopard" enabled="true">
|
||||||
|
<sourceOutputDir name="target/generated-sources/annotations" />
|
||||||
|
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
|
||||||
|
<outputRelativeToContentRoot value="true" />
|
||||||
|
<processorPath useClasspath="false">
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-configuration-processor/3.5.0/spring-boot-configuration-processor-3.5.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.18.38/lombok-1.18.38.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/hibernate/orm/hibernate-jpamodelgen/6.6.8.Final/hibernate-jpamodelgen-6.6.8.Final.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/hibernate/orm/hibernate-core/6.6.8.Final/hibernate-core-6.6.8.Final.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/jakarta/persistence/jakarta.persistence-api/3.2.0/jakarta.persistence-api-3.2.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/jakarta/transaction/jakarta.transaction-api/2.0.1/jakarta.transaction-api-2.0.1.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/jboss/logging/jboss-logging/3.5.0.Final/jboss-logging-3.5.0.Final.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/hibernate/common/hibernate-commons-annotations/7.0.3.Final/hibernate-commons-annotations-7.0.3.Final.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/io/smallrye/jandex/3.2.0/jandex-3.2.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/com/fasterxml/classmate/1.5.1/classmate-1.5.1.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/net/bytebuddy/byte-buddy/1.15.11/byte-buddy-1.15.11.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/jakarta/xml/bind/jakarta.xml.bind-api/4.0.0/jakarta.xml.bind-api-4.0.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/jakarta/activation/jakarta.activation-api/2.1.0/jakarta.activation-api-2.1.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/glassfish/jaxb/jaxb-runtime/4.0.2/jaxb-runtime-4.0.2.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/glassfish/jaxb/jaxb-core/4.0.2/jaxb-core-4.0.2.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/eclipse/angus/angus-activation/2.0.0/angus-activation-2.0.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/glassfish/jaxb/txw2/4.0.2/txw2-4.0.2.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/com/sun/istack/istack-commons-runtime/4.1.1/istack-commons-runtime-4.1.1.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/jakarta/inject/jakarta.inject-api/2.0.1/jakarta.inject-api-2.0.1.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/antlr/antlr4-runtime/4.13.0/antlr4-runtime-4.13.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/jakarta/validation/jakarta.validation-api/3.0.2/jakarta.validation-api-3.0.2.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/jakarta/annotation/jakarta.annotation-api/2.1.1/jakarta.annotation-api-2.1.1.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/io/github/openfeign/querydsl/querydsl-apt/7.0/querydsl-apt-7.0-jpa.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/io/github/openfeign/querydsl/querydsl-codegen/7.0/querydsl-codegen-7.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/io/github/openfeign/querydsl/querydsl-core/7.0/querydsl-core-7.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/io/projectreactor/reactor-core/3.7.6/reactor-core-3.7.6.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/io/github/openfeign/querydsl/querydsl-codegen-utils/7.0/querydsl-codegen-utils-7.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/eclipse/jdt/ecj/3.40.0/ecj-3.40.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/io/github/classgraph/classgraph/4.8.179/classgraph-4.8.179.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/jetbrains/annotations/26.0.2/annotations-26.0.2.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/dev/morphia/morphia/morphia-core/2.5.0/morphia-core-2.5.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/io/smallrye/config/smallrye-config/3.10.1/smallrye-config-3.10.1.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/io/smallrye/config/smallrye-config-core/3.10.1/smallrye-config-core-3.10.1.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/eclipse/microprofile/config/microprofile-config-api/3.1/microprofile-config-api-3.1.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/io/smallrye/common/smallrye-common-annotation/2.8.0/smallrye-common-annotation-2.8.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/io/smallrye/common/smallrye-common-expression/2.8.0/smallrye-common-expression-2.8.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/io/smallrye/common/smallrye-common-function/2.8.0/smallrye-common-function-2.8.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/io/smallrye/common/smallrye-common-constraint/2.8.0/smallrye-common-constraint-2.8.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/io/smallrye/common/smallrye-common-classloader/2.8.0/smallrye-common-classloader-2.8.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/ow2/asm/asm/9.8/asm-9.8.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/io/smallrye/config/smallrye-config-common/3.10.1/smallrye-config-common-3.10.1.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/mongodb/mongodb-driver-sync/5.4.0/mongodb-driver-sync-5.4.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/mongodb/bson/5.4.0/bson-5.4.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/mongodb/mongodb-driver-core/5.4.0/mongodb-driver-core-5.4.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/mongodb/bson-record-codec/5.4.0/bson-record-codec-5.4.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/mongodb/mongodb-driver-legacy/5.4.0/mongodb-driver-legacy-5.4.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/2.0.17/slf4j-api-2.0.17.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/com/github/spotbugs/spotbugs-annotations/4.8.6/spotbugs-annotations-4.8.6.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/semver4j/semver4j/5.6.0/semver4j-5.6.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/jspecify/jspecify/1.0.0/jspecify-1.0.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/jsoup/jsoup/1.18.3/jsoup-1.18.3.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/hibernate/orm/hibernate-envers/7.0.0.Beta1/hibernate-envers-7.0.0.Beta1.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/hibernate/models/hibernate-models/0.8.6/hibernate-models-0.8.6.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/io/github/openfeign/querydsl/querydsl-core/7.0/querydsl-core-7.0-tests.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/joda/joda-money/2.0.2/joda-money-2.0.2.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter/5.13.1/junit-jupiter-5.13.1.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter-api/5.13.1/junit-jupiter-api-5.13.1.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/opentest4j/opentest4j/1.3.0/opentest4j-1.3.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/junit/platform/junit-platform-commons/1.13.1/junit-platform-commons-1.13.1.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter-params/5.13.1/junit-jupiter-params-5.13.1.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter-engine/5.13.1/junit-jupiter-engine-5.13.1.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/junit/platform/junit-platform-engine/1.13.1/junit-platform-engine-1.13.1.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/assertj/assertj-core/3.27.3/assertj-core-3.27.3.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/junit/vintage/junit-vintage-engine/5.13.1/junit-vintage-engine-5.13.1.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/junit/junit/4.13.2/junit-4.13.2.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/easymock/easymock/5.6.0/easymock-5.6.0.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/objenesis/objenesis/3.4/objenesis-3.4.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/javassist/javassist/3.30.2-GA/javassist-3.30.2-GA.jar" />
|
||||||
|
</processorPath>
|
||||||
|
<module name="leopard-server" />
|
||||||
|
</profile>
|
||||||
|
</annotationProcessing>
|
||||||
|
<bytecodeTargetLevel>
|
||||||
|
<module name="leopard-core" target="17" />
|
||||||
|
</bytecodeTargetLevel>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
31
.idea/dataSources.xml
generated
Normal file
31
.idea/dataSources.xml
generated
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
|
||||||
|
<data-source source="LOCAL" name="root@mysql.lanyuanxiaoyao.com" uuid="1f0a496b-90a1-4c90-9317-4dcd96ac83fb">
|
||||||
|
<driver-ref>mysql.8</driver-ref>
|
||||||
|
<synchronize>true</synchronize>
|
||||||
|
<jdbc-driver>com.mysql.cj.jdbc.Driver</jdbc-driver>
|
||||||
|
<jdbc-url>jdbc:mysql://mysql.lanyuanxiaoyao.com:43780</jdbc-url>
|
||||||
|
<jdbc-additional-properties>
|
||||||
|
<property name="com.intellij.clouds.kubernetes.db.host.port" />
|
||||||
|
<property name="com.intellij.clouds.kubernetes.db.enabled" value="false" />
|
||||||
|
<property name="com.intellij.clouds.kubernetes.db.resource.type" value="Deployment" />
|
||||||
|
<property name="com.intellij.clouds.kubernetes.db.container.port" />
|
||||||
|
</jdbc-additional-properties>
|
||||||
|
<working-dir>$ProjectFileDir$</working-dir>
|
||||||
|
</data-source>
|
||||||
|
<data-source source="LOCAL" name="leopard@mysql.lanyuanxiaoyao.com" uuid="a8b9cd0a-335e-42ae-991a-f2733200afbf">
|
||||||
|
<driver-ref>mysql.8</driver-ref>
|
||||||
|
<synchronize>true</synchronize>
|
||||||
|
<jdbc-driver>com.mysql.cj.jdbc.Driver</jdbc-driver>
|
||||||
|
<jdbc-url>jdbc:mysql://mysql.lanyuanxiaoyao.com:43780/leopard</jdbc-url>
|
||||||
|
<jdbc-additional-properties>
|
||||||
|
<property name="com.intellij.clouds.kubernetes.db.host.port" />
|
||||||
|
<property name="com.intellij.clouds.kubernetes.db.enabled" value="false" />
|
||||||
|
<property name="com.intellij.clouds.kubernetes.db.resource.type" value="Deployment" />
|
||||||
|
<property name="com.intellij.clouds.kubernetes.db.container.port" />
|
||||||
|
</jdbc-additional-properties>
|
||||||
|
<working-dir>$ProjectFileDir$</working-dir>
|
||||||
|
</data-source>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
12
.idea/encodings.xml
generated
Normal file
12
.idea/encodings.xml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="Encoding">
|
||||||
|
<file url="file://$PROJECT_DIR$/leopard-core/src/main/java" charset="UTF-8" />
|
||||||
|
<file url="file://$PROJECT_DIR$/leopard-core/src/main/resources" charset="UTF-8" />
|
||||||
|
<file url="file://$PROJECT_DIR$/leopard-server/src/main/java" charset="UTF-8" />
|
||||||
|
<file url="file://$PROJECT_DIR$/leopard-server/src/main/resources" charset="UTF-8" />
|
||||||
|
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
|
||||||
|
<file url="file://$PROJECT_DIR$/src/main/kotlin" charset="UTF-8" />
|
||||||
|
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
35
.idea/jarRepositories.xml
generated
Normal file
35
.idea/jarRepositories.xml
generated
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<?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="https://repo.maven.apache.org/maven2" />
|
||||||
|
</remote-repository>
|
||||||
|
<remote-repository>
|
||||||
|
<option name="id" value="mavenCentral" />
|
||||||
|
<option name="name" value="mavenCentral" />
|
||||||
|
<option name="url" value="https://repo1.maven.org/maven2/" />
|
||||||
|
</remote-repository>
|
||||||
|
<remote-repository>
|
||||||
|
<option name="id" value="lanyuanxiaoyao-maven-central" />
|
||||||
|
<option name="name" value="lanyuanxiaoyao-maven-central" />
|
||||||
|
<option name="url" value="https://maven.lanyuanxiaoyao.com/central" />
|
||||||
|
</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>
|
||||||
|
<remote-repository>
|
||||||
|
<option name="id" value="central" />
|
||||||
|
<option name="name" value="Central Repository" />
|
||||||
|
<option name="url" value="https://maven.lanyuanxiaoyao.com/central" />
|
||||||
|
</remote-repository>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
6
.idea/kotlinc.xml
generated
Normal file
6
.idea/kotlinc.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="KotlinJpsPluginSettings">
|
||||||
|
<option name="version" value="2.1.21" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
19
.idea/misc.xml
generated
Normal file
19
.idea/misc.xml
generated
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?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$/leopard-core/pom.xml" />
|
||||||
|
</set>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="temurin-17" project-jdk-type="JavaSDK">
|
||||||
|
<output url="file://$PROJECT_DIR$/out" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
9
.idea/modules.xml
generated
Normal file
9
.idea/modules.xml
generated
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/leopard-core/leopard-core.iml" filepath="$PROJECT_DIR$/leopard-core/leopard-core.iml" />
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/leopard-server/leopard-server.iml" filepath="$PROJECT_DIR$/leopard-server/leopard-server.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
15
leopard-server/leopard-server.iml
Normal file
15
leopard-server/leopard-server.iml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module version="4">
|
||||||
|
<component name="FacetManager">
|
||||||
|
<facet type="jpa" name="JPA">
|
||||||
|
<configuration>
|
||||||
|
<setting name="validation-enabled" value="true" />
|
||||||
|
<setting name="provider-name" value="Hibernate" />
|
||||||
|
<datasource-mapping>
|
||||||
|
<factory-entry name="entityManagerFactory" value="a8b9cd0a-335e-42ae-991a-f2733200afbf" />
|
||||||
|
</datasource-mapping>
|
||||||
|
<naming-strategy-map />
|
||||||
|
</configuration>
|
||||||
|
</facet>
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
107
leopard-server/pom.xml
Normal file
107
leopard-server/pom.xml
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
<?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>com.lanyuanxiaoyao</groupId>
|
||||||
|
<artifactId>leopard</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>leopard-server</artifactId>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.lanyuanxiaoyao</groupId>
|
||||||
|
<artifactId>spring-boot-service-template</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-tomcat</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-jetty</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-configuration-processor</artifactId>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.hutool</groupId>
|
||||||
|
<artifactId>hutool-core</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.hutool</groupId>
|
||||||
|
<artifactId>hutool-http</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.mysql</groupId>
|
||||||
|
<artifactId>mysql-connector-j</artifactId>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<annotationProcessorPaths>
|
||||||
|
<path>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-configuration-processor</artifactId>
|
||||||
|
</path>
|
||||||
|
<path>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
</path>
|
||||||
|
<path>
|
||||||
|
<groupId>org.hibernate</groupId>
|
||||||
|
<artifactId>hibernate-jpamodelgen</artifactId>
|
||||||
|
<version>6.6.8.Final</version>
|
||||||
|
</path>
|
||||||
|
<path>
|
||||||
|
<groupId>io.github.openfeign.querydsl</groupId>
|
||||||
|
<artifactId>querydsl-apt</artifactId>
|
||||||
|
<version>7.0</version>
|
||||||
|
<classifier>jpa</classifier>
|
||||||
|
</path>
|
||||||
|
<path>
|
||||||
|
<groupId>jakarta.persistence</groupId>
|
||||||
|
<artifactId>jakarta.persistence-api</artifactId>
|
||||||
|
<version>3.2.0</version>
|
||||||
|
</path>
|
||||||
|
</annotationProcessorPaths>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<excludes>
|
||||||
|
<exclude>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
</exclude>
|
||||||
|
</excludes>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package com.lanyuanxiaoyao.leopard.server;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 静态字段
|
||||||
|
*
|
||||||
|
* @author lanyuanxiaoyao
|
||||||
|
* @version 20250829
|
||||||
|
*/
|
||||||
|
public interface Constants {
|
||||||
|
String DATABASE_PREFIX = "leopard_";
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package com.lanyuanxiaoyao.leopard.server;
|
||||||
|
|
||||||
|
import com.blinkfox.fenix.EnableFenix;
|
||||||
|
import com.lanyuanxiaoyao.leopard.server.service.StockService;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.boot.ApplicationArguments;
|
||||||
|
import org.springframework.boot.ApplicationRunner;
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lanyuanxiaoyao
|
||||||
|
* @version 20250828
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@SpringBootApplication
|
||||||
|
@EnableFenix
|
||||||
|
@EnableJpaAuditing
|
||||||
|
public class LeopardServerApplication implements ApplicationRunner {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(LeopardServerApplication.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run(ApplicationArguments args) {
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package com.lanyuanxiaoyao.leopard.server.configuration;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.web.cors.CorsConfiguration;
|
||||||
|
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
|
||||||
|
import org.springframework.web.filter.CorsFilter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网络配置
|
||||||
|
*
|
||||||
|
* @author lanyuanxiaoyao
|
||||||
|
* @version 20250826
|
||||||
|
*/
|
||||||
|
@Configuration
|
||||||
|
public class WebConfiguration {
|
||||||
|
@Bean
|
||||||
|
public CorsFilter corsFilter() {
|
||||||
|
CorsConfiguration configuration = new CorsConfiguration();
|
||||||
|
configuration.setAllowCredentials(true);
|
||||||
|
configuration.addAllowedOriginPattern("*");
|
||||||
|
configuration.addAllowedHeader("*");
|
||||||
|
configuration.addAllowedMethod("*");
|
||||||
|
configuration.setMaxAge(7200L);
|
||||||
|
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
|
||||||
|
source.registerCorsConfiguration("/**", configuration);
|
||||||
|
return new CorsFilter(source);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
package com.lanyuanxiaoyao.leopard.server.controller;
|
||||||
|
|
||||||
|
import com.lanyuanxiaoyao.leopard.server.entity.Stock;
|
||||||
|
import com.lanyuanxiaoyao.leopard.server.entity.Task;
|
||||||
|
import com.lanyuanxiaoyao.leopard.server.service.StockService;
|
||||||
|
import com.lanyuanxiaoyao.service.template.controller.GlobalResponse;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下拉菜单枚举类型
|
||||||
|
*
|
||||||
|
* @author lanyuanxiaoyao
|
||||||
|
* @version 20250826
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("constants")
|
||||||
|
public class CommonOptionsController {
|
||||||
|
private static final List<String> COLORS = List.of(
|
||||||
|
"bg-black",
|
||||||
|
"bg-primary",
|
||||||
|
"bg-secondary",
|
||||||
|
"bg-success",
|
||||||
|
"bg-info",
|
||||||
|
"bg-warning",
|
||||||
|
"bg-danger",
|
||||||
|
"bg-dark",
|
||||||
|
"bg-gray-500",
|
||||||
|
"bg-gray-600",
|
||||||
|
"bg-gray-700",
|
||||||
|
"bg-gray-800",
|
||||||
|
"bg-gray-900",
|
||||||
|
"bg-red-500",
|
||||||
|
"bg-red-600",
|
||||||
|
"bg-red-700",
|
||||||
|
"bg-red-800",
|
||||||
|
"bg-red-900",
|
||||||
|
"bg-yellow-500",
|
||||||
|
"bg-yellow-600",
|
||||||
|
"bg-yellow-700",
|
||||||
|
"bg-yellow-800",
|
||||||
|
"bg-yellow-900",
|
||||||
|
"bg-green-500",
|
||||||
|
"bg-green-600",
|
||||||
|
"bg-green-700",
|
||||||
|
"bg-green-800",
|
||||||
|
"bg-green-900",
|
||||||
|
"bg-blue-500",
|
||||||
|
"bg-blue-600",
|
||||||
|
"bg-blue-700",
|
||||||
|
"bg-blue-800",
|
||||||
|
"bg-blue-900",
|
||||||
|
"bg-cyan-500",
|
||||||
|
"bg-cyan-600",
|
||||||
|
"bg-cyan-700",
|
||||||
|
"bg-cyan-800",
|
||||||
|
"bg-cyan-900",
|
||||||
|
"bg-indigo-500",
|
||||||
|
"bg-indigo-600",
|
||||||
|
"bg-indigo-700",
|
||||||
|
"bg-indigo-800",
|
||||||
|
"bg-indigo-900",
|
||||||
|
"bg-purple-500",
|
||||||
|
"bg-purple-600",
|
||||||
|
"bg-purple-700",
|
||||||
|
"bg-purple-800",
|
||||||
|
"bg-purple-900",
|
||||||
|
"bg-pink-500",
|
||||||
|
"bg-pink-600",
|
||||||
|
"bg-pink-700",
|
||||||
|
"bg-pink-800",
|
||||||
|
"bg-pink-900"
|
||||||
|
);
|
||||||
|
|
||||||
|
private final StockService stockService;
|
||||||
|
|
||||||
|
public CommonOptionsController(StockService stockService) {
|
||||||
|
this.stockService = stockService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/options/{name}")
|
||||||
|
public GlobalResponse<List<Option>> options(@PathVariable("name") String name) {
|
||||||
|
return switch (name) {
|
||||||
|
case "stock_market" -> GlobalResponse.responseSuccess(
|
||||||
|
Arrays.stream(Stock.Market.values())
|
||||||
|
.map(market -> new Option(market.getChineseName(), market.name()))
|
||||||
|
.toList()
|
||||||
|
);
|
||||||
|
case "stock_industry" -> GlobalResponse.responseSuccess(
|
||||||
|
stockService.findDistinctIndustries()
|
||||||
|
.stream()
|
||||||
|
.map(industry -> new Option(industry, industry))
|
||||||
|
.toList()
|
||||||
|
);
|
||||||
|
default -> GlobalResponse.responseSuccess(List.of());
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/mappings/{name}/{field}")
|
||||||
|
public GlobalResponse<Map<String, String>> mappings(@PathVariable("name") String name, @PathVariable("field") String field) {
|
||||||
|
return switch (name) {
|
||||||
|
case "stock_market" -> GlobalResponse.responseSuccess(buildMapping(
|
||||||
|
Arrays.stream(Stock.Market.values())
|
||||||
|
.map(market -> new Mapping(market.name(), market.getChineseName()))
|
||||||
|
.toList(),
|
||||||
|
field
|
||||||
|
));
|
||||||
|
case "task_status" -> GlobalResponse.responseSuccess(buildMapping(
|
||||||
|
Arrays.stream(Task.Status.values())
|
||||||
|
.map(status -> new Mapping(status.name(), status.getChineseName()))
|
||||||
|
.toList(),
|
||||||
|
field
|
||||||
|
));
|
||||||
|
default -> GlobalResponse.responseSuccess(Map.of());
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, String> buildMapping(List<Mapping> mappings, String field) {
|
||||||
|
var map = mappings
|
||||||
|
.stream()
|
||||||
|
.collect(Collectors.toMap(Mapping::name, mapping -> {
|
||||||
|
var color = COLORS.get(Math.abs(mapping.name.hashCode()) % COLORS.size());
|
||||||
|
return "<span class='label %s'>%s</span>".formatted(color, mapping.label());
|
||||||
|
}));
|
||||||
|
map.put("*", "<span class='label bg-gray-300'>%s</span>".formatted(field));
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
public record Option(String label, Object value) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public record Mapping(String name, String label) {
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
package com.lanyuanxiaoyao.leopard.server.controller;
|
||||||
|
|
||||||
|
import com.lanyuanxiaoyao.leopard.server.entity.Stock;
|
||||||
|
import com.lanyuanxiaoyao.leopard.server.service.StockService;
|
||||||
|
import com.lanyuanxiaoyao.service.template.controller.GlobalResponse;
|
||||||
|
import com.lanyuanxiaoyao.service.template.controller.SimpleControllerSupport;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lanyuanxiaoyao
|
||||||
|
* @version 20250829
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("stock")
|
||||||
|
public class StockController extends SimpleControllerSupport<Stock, Void, StockController.DetailItem, StockController.DetailItem> {
|
||||||
|
public StockController(StockService service) {
|
||||||
|
super(service);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GlobalResponse<Long> save(Void unused) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Function<Void, Stock> saveItemMapper() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private DetailItem covert(Stock stock) {
|
||||||
|
return new DetailItem(
|
||||||
|
stock.getId(),
|
||||||
|
stock.getCode(),
|
||||||
|
stock.getName(),
|
||||||
|
stock.getFullname(),
|
||||||
|
stock.getMarket(),
|
||||||
|
stock.getIndustry()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Function<Stock, DetailItem> listItemMapper() {
|
||||||
|
return this::covert;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Function<Stock, DetailItem> detailItemMapper() {
|
||||||
|
return this::covert;
|
||||||
|
}
|
||||||
|
|
||||||
|
public record DetailItem(
|
||||||
|
Long id,
|
||||||
|
String code,
|
||||||
|
String name,
|
||||||
|
String fullname,
|
||||||
|
Stock.Market market,
|
||||||
|
String industry
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
package com.lanyuanxiaoyao.leopard.server.controller;
|
||||||
|
|
||||||
|
import com.lanyuanxiaoyao.leopard.server.entity.Task;
|
||||||
|
import com.lanyuanxiaoyao.leopard.server.service.TaskService;
|
||||||
|
import com.lanyuanxiaoyao.service.template.controller.GlobalResponse;
|
||||||
|
import com.lanyuanxiaoyao.service.template.controller.SimpleControllerSupport;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 任务列表
|
||||||
|
*
|
||||||
|
* @author lanyuanxiaoyao
|
||||||
|
* @version 20250829
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("task")
|
||||||
|
public class TaskController extends SimpleControllerSupport<Task, Void, TaskController.ListItem, TaskController.DetailItem> {
|
||||||
|
public TaskController(TaskService service) {
|
||||||
|
super(service);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GlobalResponse<Long> save(Void unused) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Function<Void, Task> saveItemMapper() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Function<Task, ListItem> listItemMapper() {
|
||||||
|
return task -> new ListItem(
|
||||||
|
task.getId(),
|
||||||
|
task.getName(),
|
||||||
|
task.getDescription(),
|
||||||
|
task.getStatus(),
|
||||||
|
task.getLaunchedTime(),
|
||||||
|
task.getFinishedTime()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Function<Task, DetailItem> detailItemMapper() {
|
||||||
|
return task -> new DetailItem(
|
||||||
|
task.getId(),
|
||||||
|
task.getName(),
|
||||||
|
task.getDescription(),
|
||||||
|
task.getStatus(),
|
||||||
|
task.getError(),
|
||||||
|
task.getResult(),
|
||||||
|
task.getLaunchedTime(),
|
||||||
|
task.getFinishedTime()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public record ListItem(
|
||||||
|
Long id,
|
||||||
|
String name,
|
||||||
|
String description,
|
||||||
|
Task.Status status,
|
||||||
|
LocalDateTime launchedTime,
|
||||||
|
LocalDateTime finishedTime
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public record DetailItem(
|
||||||
|
Long id,
|
||||||
|
String name,
|
||||||
|
String description,
|
||||||
|
Task.Status status,
|
||||||
|
String error,
|
||||||
|
String result,
|
||||||
|
LocalDateTime launchedTime,
|
||||||
|
LocalDateTime finishedTime
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
package com.lanyuanxiaoyao.leopard.server.entity;
|
||||||
|
|
||||||
|
import com.lanyuanxiaoyao.leopard.server.Constants;
|
||||||
|
import com.lanyuanxiaoyao.leopard.server.entity.base.SimpleEnum;
|
||||||
|
import com.lanyuanxiaoyao.service.template.entity.SimpleEntity;
|
||||||
|
import jakarta.persistence.Column;
|
||||||
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.EntityListeners;
|
||||||
|
import jakarta.persistence.EnumType;
|
||||||
|
import jakarta.persistence.Enumerated;
|
||||||
|
import jakarta.persistence.Table;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import lombok.ToString;
|
||||||
|
import lombok.experimental.FieldNameConstants;
|
||||||
|
import org.hibernate.annotations.Comment;
|
||||||
|
import org.hibernate.annotations.DynamicInsert;
|
||||||
|
import org.hibernate.annotations.DynamicUpdate;
|
||||||
|
import org.hibernate.annotations.SoftDelete;
|
||||||
|
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 股票
|
||||||
|
*
|
||||||
|
* @author lanyuanxiaoyao
|
||||||
|
* @version 20250828
|
||||||
|
*/
|
||||||
|
@Setter
|
||||||
|
@Getter
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
@FieldNameConstants
|
||||||
|
@Entity
|
||||||
|
@SoftDelete
|
||||||
|
@DynamicUpdate
|
||||||
|
@DynamicInsert
|
||||||
|
@EntityListeners(AuditingEntityListener.class)
|
||||||
|
@Table(name = Constants.DATABASE_PREFIX + "stock")
|
||||||
|
public class Stock extends SimpleEntity {
|
||||||
|
@Column(unique = true, nullable = false)
|
||||||
|
@Comment("股票代码")
|
||||||
|
private String code;
|
||||||
|
@Column(nullable = false)
|
||||||
|
@Comment("股票名称")
|
||||||
|
private String name;
|
||||||
|
@Column(nullable = false)
|
||||||
|
@Comment("股票全称")
|
||||||
|
private String fullname;
|
||||||
|
@Column(nullable = false)
|
||||||
|
@Comment("交易市场")
|
||||||
|
@Enumerated(EnumType.STRING)
|
||||||
|
private Market market;
|
||||||
|
@Column(nullable = false)
|
||||||
|
@Comment("行业")
|
||||||
|
private String industry;
|
||||||
|
@Column(nullable = false)
|
||||||
|
@Comment("上市状态")
|
||||||
|
private boolean listed = true;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public enum Market implements SimpleEnum {
|
||||||
|
SSE("上交所"),
|
||||||
|
SZSE("深交所"),
|
||||||
|
BSE("北交所");
|
||||||
|
|
||||||
|
private final String chineseName;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
package com.lanyuanxiaoyao.leopard.server.entity;
|
||||||
|
|
||||||
|
import com.lanyuanxiaoyao.leopard.server.Constants;
|
||||||
|
import com.lanyuanxiaoyao.leopard.server.entity.base.SimpleEnum;
|
||||||
|
import com.lanyuanxiaoyao.service.template.entity.SimpleEntity;
|
||||||
|
import jakarta.persistence.Basic;
|
||||||
|
import jakarta.persistence.Column;
|
||||||
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.EntityListeners;
|
||||||
|
import jakarta.persistence.EnumType;
|
||||||
|
import jakarta.persistence.Enumerated;
|
||||||
|
import jakarta.persistence.FetchType;
|
||||||
|
import jakarta.persistence.Lob;
|
||||||
|
import jakarta.persistence.Table;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import lombok.ToString;
|
||||||
|
import lombok.experimental.FieldNameConstants;
|
||||||
|
import org.hibernate.annotations.Comment;
|
||||||
|
import org.hibernate.annotations.DynamicInsert;
|
||||||
|
import org.hibernate.annotations.DynamicUpdate;
|
||||||
|
import org.hibernate.annotations.SoftDelete;
|
||||||
|
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 任务
|
||||||
|
*
|
||||||
|
* @author lanyuanxiaoyao
|
||||||
|
* @version 20250829
|
||||||
|
*/
|
||||||
|
@Setter
|
||||||
|
@Getter
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
@FieldNameConstants
|
||||||
|
@Entity
|
||||||
|
@SoftDelete
|
||||||
|
@DynamicUpdate
|
||||||
|
@DynamicInsert
|
||||||
|
@EntityListeners(AuditingEntityListener.class)
|
||||||
|
@Table(name = Constants.DATABASE_PREFIX + "task")
|
||||||
|
public class Task extends SimpleEntity {
|
||||||
|
@Column(nullable = false)
|
||||||
|
@Comment("任务名称")
|
||||||
|
private String name;
|
||||||
|
@Lob
|
||||||
|
@Comment("任务描述")
|
||||||
|
private String description;
|
||||||
|
@Lob
|
||||||
|
@Basic(fetch = FetchType.LAZY)
|
||||||
|
@ToString.Exclude
|
||||||
|
@Comment("错误信息")
|
||||||
|
private String error;
|
||||||
|
@Lob
|
||||||
|
@Basic(fetch = FetchType.LAZY)
|
||||||
|
@ToString.Exclude
|
||||||
|
@Comment("任务结果")
|
||||||
|
private String result;
|
||||||
|
@Column(nullable = false)
|
||||||
|
@Enumerated(EnumType.STRING)
|
||||||
|
@Comment("任务状态")
|
||||||
|
private Status status;
|
||||||
|
@Comment("任务开始时间")
|
||||||
|
private LocalDateTime launchedTime;
|
||||||
|
@Comment("任务结束时间")
|
||||||
|
private LocalDateTime finishedTime;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public enum Status implements SimpleEnum {
|
||||||
|
PENDING("待执行"),
|
||||||
|
RUNNING("执行中"),
|
||||||
|
SUCCESS("成功"),
|
||||||
|
FAILURE("失败"),
|
||||||
|
CANCELED("取消");
|
||||||
|
|
||||||
|
private final String chineseName;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package com.lanyuanxiaoyao.leopard.server.entity.base;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lanyuanxiaoyao
|
||||||
|
* @version 20250829
|
||||||
|
*/
|
||||||
|
public interface SimpleEnum {
|
||||||
|
String getChineseName();
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package com.lanyuanxiaoyao.leopard.server.repository;
|
||||||
|
|
||||||
|
import com.lanyuanxiaoyao.leopard.server.entity.Stock;
|
||||||
|
import com.lanyuanxiaoyao.service.template.repository.SimpleRepository;
|
||||||
|
import java.util.List;
|
||||||
|
import org.springframework.data.jpa.repository.Query;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lanyuanxiaoyao
|
||||||
|
* @version 20250828
|
||||||
|
*/
|
||||||
|
@Repository
|
||||||
|
public interface StockRepository extends SimpleRepository<Stock> {
|
||||||
|
@Query("select distinct stock.industry from Stock stock where stock.industry is not null")
|
||||||
|
List<String> findDistinctIndustries();
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package com.lanyuanxiaoyao.leopard.server.repository;
|
||||||
|
|
||||||
|
import com.lanyuanxiaoyao.leopard.server.entity.Task;
|
||||||
|
import com.lanyuanxiaoyao.service.template.repository.SimpleRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lanyuanxiaoyao
|
||||||
|
* @version 20250829
|
||||||
|
*/
|
||||||
|
@Repository
|
||||||
|
public interface TaskRepository extends SimpleRepository<Task> {
|
||||||
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
package com.lanyuanxiaoyao.leopard.server.service;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.EnumUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import com.lanyuanxiaoyao.leopard.server.entity.Stock;
|
||||||
|
import com.lanyuanxiaoyao.leopard.server.repository.StockRepository;
|
||||||
|
import com.lanyuanxiaoyao.service.template.service.SimpleServiceSupport;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lanyuanxiaoyao
|
||||||
|
* @version 20250828
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
public class StockService extends SimpleServiceSupport<Stock> {
|
||||||
|
private final StockRepository stockRepository;
|
||||||
|
private final TuShareService tuShareService;
|
||||||
|
|
||||||
|
public StockService(StockRepository repository, TuShareService tuShareService) {
|
||||||
|
super(repository);
|
||||||
|
this.stockRepository = repository;
|
||||||
|
this.tuShareService = tuShareService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> findDistinctIndustries() {
|
||||||
|
return stockRepository.findDistinctIndustries();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(rollbackFor = Throwable.class)
|
||||||
|
public void refresh() {
|
||||||
|
log.info("开始刷新股票列表");
|
||||||
|
var stocks = list();
|
||||||
|
var stocksMap = stocks.stream().collect(Collectors.toMap(Stock::getCode, stock -> stock));
|
||||||
|
tuShareService.stockList()
|
||||||
|
.data()
|
||||||
|
.items()
|
||||||
|
.forEach(item -> {
|
||||||
|
var code = item.get(0);
|
||||||
|
var name = item.get(1);
|
||||||
|
var fullname = item.get(2);
|
||||||
|
var market = EnumUtil.fromString(Stock.Market.class, item.get(3));
|
||||||
|
var industry = item.get(4);
|
||||||
|
var listed = StrUtil.equals("L", item.get(5));
|
||||||
|
if (stocksMap.containsKey(code)) {
|
||||||
|
var stock = stocksMap.get(code);
|
||||||
|
stock.setName(name);
|
||||||
|
stock.setFullname(fullname);
|
||||||
|
stock.setMarket(market);
|
||||||
|
stock.setIndustry(industry);
|
||||||
|
stock.setListed(listed);
|
||||||
|
} else {
|
||||||
|
var stock = new Stock();
|
||||||
|
stock.setCode(code);
|
||||||
|
stock.setName(name);
|
||||||
|
stock.setFullname(fullname);
|
||||||
|
stock.setMarket(market);
|
||||||
|
stock.setIndustry(industry);
|
||||||
|
stock.setListed(listed);
|
||||||
|
stocks.add(stock);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
repository.saveAll(stocks);
|
||||||
|
log.info("股票列表刷新完成");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.lanyuanxiaoyao.leopard.server.service;
|
||||||
|
|
||||||
|
import com.lanyuanxiaoyao.leopard.server.entity.Task;
|
||||||
|
import com.lanyuanxiaoyao.leopard.server.repository.TaskRepository;
|
||||||
|
import com.lanyuanxiaoyao.service.template.repository.SimpleRepository;
|
||||||
|
import com.lanyuanxiaoyao.service.template.service.SimpleServiceSupport;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lanyuanxiaoyao
|
||||||
|
* @version 20250829
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
public class TaskService extends SimpleServiceSupport<Task> {
|
||||||
|
|
||||||
|
|
||||||
|
public TaskService(TaskRepository repository) {
|
||||||
|
super(repository);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
package com.lanyuanxiaoyao.leopard.server.service;
|
||||||
|
|
||||||
|
import cn.hutool.http.HttpUtil;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import lombok.SneakyThrows;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对接TuShare接口
|
||||||
|
*
|
||||||
|
* @author lanyuanxiaoyao
|
||||||
|
* @version 20250828
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
public class TuShareService {
|
||||||
|
private static final String API_URL = "https://api.tushare.pro";
|
||||||
|
private static final String API_TOKEN = "64ebff4fa679167600b905ee45dd88e76f3963c0ff39157f3f085f0e";
|
||||||
|
|
||||||
|
private final ObjectMapper mapper;
|
||||||
|
|
||||||
|
public TuShareService(Jackson2ObjectMapperBuilder builder) {
|
||||||
|
this.mapper = builder.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@SneakyThrows
|
||||||
|
private String buildRequest(String apiName, Map<String, Object> params, List<String> fields) {
|
||||||
|
return mapper.writeValueAsString(Map.of(
|
||||||
|
"api_name", apiName,
|
||||||
|
"token", API_TOKEN,
|
||||||
|
"params", params,
|
||||||
|
"fields", fields
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
@SneakyThrows
|
||||||
|
public TuShareResponse stockList() {
|
||||||
|
var response = HttpUtil.post(API_URL, buildRequest(
|
||||||
|
"stock_basic",
|
||||||
|
Map.of("list_status", "L"),
|
||||||
|
List.of("ts_code", "name", "fullname", "exchange", "industry", "list_status")
|
||||||
|
));
|
||||||
|
var tuShareResponse = mapper.readValue(response, TuShareResponse.class);
|
||||||
|
if (tuShareResponse.code != 0) {
|
||||||
|
throw new RuntimeException(tuShareResponse.message);
|
||||||
|
}
|
||||||
|
return tuShareResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public record TuShareResponse(
|
||||||
|
Integer code,
|
||||||
|
@JsonProperty("msg")
|
||||||
|
String message,
|
||||||
|
Data data
|
||||||
|
) {
|
||||||
|
public record Data(
|
||||||
|
List<String> fields,
|
||||||
|
List<List<String>> items
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package com.lanyuanxiaoyao.leopard.server.task;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 任务
|
||||||
|
*
|
||||||
|
* @author lanyuanxiaoyao
|
||||||
|
* @version 20250829
|
||||||
|
*/
|
||||||
|
public abstract class TaskTemplate {
|
||||||
|
private String name;
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
public abstract Type getType();
|
||||||
|
|
||||||
|
public enum Type {
|
||||||
|
CLASS
|
||||||
|
}
|
||||||
|
}
|
||||||
17
leopard-server/src/main/resources/application.yml
Normal file
17
leopard-server/src/main/resources/application.yml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
server:
|
||||||
|
port: 9786
|
||||||
|
spring:
|
||||||
|
application:
|
||||||
|
name: leopard-server
|
||||||
|
mvc:
|
||||||
|
async:
|
||||||
|
request-timeout: 3600000
|
||||||
|
datasource:
|
||||||
|
url: jdbc:mysql://mysql.lanyuanxiaoyao.com:43780/leopard?useSSL=false
|
||||||
|
username: leopard
|
||||||
|
password: '9NEzFzovnddf@PyEP?e*AYAWnCyd7UhYwQK$pJf>7?ccFiN^x4$eKEZ5~E<7<+~X'
|
||||||
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
|
jpa:
|
||||||
|
generate-ddl: true
|
||||||
|
fenix:
|
||||||
|
print-banner: false
|
||||||
24
leopard-server/src/main/resources/logback-spring.xml
Normal file
24
leopard-server/src/main/resources/logback-spring.xml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<configuration>
|
||||||
|
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
|
||||||
|
|
||||||
|
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
|
||||||
|
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
|
||||||
|
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
|
||||||
|
|
||||||
|
<springProperty scope="context" name="LOGGING_PARENT" source="logging.parent"/>
|
||||||
|
<springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
|
||||||
|
|
||||||
|
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %clr(%5p) %clr([${HOSTNAME}]){yellow} %clr([%t]){magenta} %clr(%logger{40}){cyan}: %m%n%wEx</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<logger name="com.zaxxer.hikari" level="ERROR"/>
|
||||||
|
<logger name="org.hibernate.SQL" level="DEBUG"/>
|
||||||
|
<logger name="org.hibernate.type.descriptor.jdbc.BasicBinder" level="TRACE"/>
|
||||||
|
|
||||||
|
<root level="INFO">
|
||||||
|
<appender-ref ref="Console"/>
|
||||||
|
</root>
|
||||||
|
</configuration>
|
||||||
47
leopard-server/src/test/resources/tushare.http
Normal file
47
leopard-server/src/test/resources/tushare.http
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
@api_url = http://api.tushare.pro
|
||||||
|
@api_key = 64ebff4fa679167600b905ee45dd88e76f3963c0ff39157f3f085f0e
|
||||||
|
|
||||||
|
### Get Stock List
|
||||||
|
POST {{api_url}}
|
||||||
|
Content-Type: application/json
|
||||||
|
|
||||||
|
{
|
||||||
|
"api_name": "stock_basic",
|
||||||
|
"token": "{{api_key}}",
|
||||||
|
"params": {
|
||||||
|
"list_status": "D,P,L"
|
||||||
|
},
|
||||||
|
"fields": [
|
||||||
|
"ts_code",
|
||||||
|
"name",
|
||||||
|
"fullname",
|
||||||
|
"exchange",
|
||||||
|
"industry"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
### Get income list
|
||||||
|
POST {{api_url}}
|
||||||
|
Content-Type: application/json
|
||||||
|
|
||||||
|
{
|
||||||
|
"api_name": "income",
|
||||||
|
"token": "{{api_key}}",
|
||||||
|
"params": {
|
||||||
|
"ts_code": "600000.SH"
|
||||||
|
},
|
||||||
|
"fields": [
|
||||||
|
"ts_code",
|
||||||
|
"ann_date",
|
||||||
|
"fiscal_year",
|
||||||
|
"report_type",
|
||||||
|
"net_profit",
|
||||||
|
"total_revenue",
|
||||||
|
"total_cost",
|
||||||
|
"gross_profit",
|
||||||
|
"operating_profit",
|
||||||
|
"net_profit_before_tax",
|
||||||
|
"net_profit_to_parent",
|
||||||
|
"total_revenue_to_parent"
|
||||||
|
]
|
||||||
|
}
|
||||||
32
leopard-web/index.html
Normal file
32
leopard-web/index.html
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<!--suppress CssUnknownTarget, HtmlUnknownTarget -->
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="zh">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8"/>
|
||||||
|
<link rel="icon" href="icon.png"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||||
|
<title>金钱豹</title>
|
||||||
|
<style>
|
||||||
|
html, body, #root {
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'LXGWWenKai';
|
||||||
|
src: url('fonts/LXGWNeoXiHei.ttf') format('truetype');
|
||||||
|
}
|
||||||
|
|
||||||
|
*:not(.fa,.fas) {
|
||||||
|
font-family: LXGWWenKai, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji', serif !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="root"></div>
|
||||||
|
<script type="module" src="/src/index.tsx"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
49
leopard-web/package.json
Normal file
49
leopard-web/package.json
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"name": "lepoard-web",
|
||||||
|
"private": true,
|
||||||
|
"version": "0.0.0",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite",
|
||||||
|
"build": "tsc -b && vite build",
|
||||||
|
"preview": "vite preview",
|
||||||
|
"test": "vitest run"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@ant-design/icons": "^6.0.0",
|
||||||
|
"@ant-design/pro-components": "^2.8.10",
|
||||||
|
"@ant-design/x": "^1.6.0",
|
||||||
|
"@echofly/fetch-event-source": "^3.0.2",
|
||||||
|
"@fortawesome/fontawesome-free": "^6.7.2",
|
||||||
|
"@lightenna/react-mermaid-diagram": "^1.0.21",
|
||||||
|
"ahooks": "^3.9.4",
|
||||||
|
"amis": "^6.13.0",
|
||||||
|
"amis-core": "^6.13.0",
|
||||||
|
"antd": "^5.27.1",
|
||||||
|
"axios": "1.11.0",
|
||||||
|
"chart.js": "^4.5.0",
|
||||||
|
"echarts-for-react": "^3.0.2",
|
||||||
|
"licia": "^1.48.0",
|
||||||
|
"mermaid": "^11.10.1",
|
||||||
|
"react": "^18.3.1",
|
||||||
|
"react-chartjs-2": "^5.3.0",
|
||||||
|
"react-dom": "^18.3.1",
|
||||||
|
"react-markdown": "^10.1.0",
|
||||||
|
"react-router": "^7.8.2",
|
||||||
|
"remark-gfm": "^4.0.1",
|
||||||
|
"styled-components": "^6.1.19",
|
||||||
|
"yocto-queue": "^1.2.1",
|
||||||
|
"zustand": "^5.0.8"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/react": "^18.3.24",
|
||||||
|
"@types/react-dom": "^18.3.7",
|
||||||
|
"@vitejs/plugin-react-swc": "^3.11.0",
|
||||||
|
"globals": "^16.3.0",
|
||||||
|
"sass": "^1.91.0",
|
||||||
|
"typescript": "~5.8.3",
|
||||||
|
"vite": "^7.1.3",
|
||||||
|
"vite-plugin-javascript-obfuscator": "^3.1.0",
|
||||||
|
"vitest": "^3.2.4"
|
||||||
|
}
|
||||||
|
}
|
||||||
8564
leopard-web/pnpm-lock.yaml
generated
Normal file
8564
leopard-web/pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load Diff
BIN
leopard-web/public/fonts/LXGWNeoXiHei.ttf
Normal file
BIN
leopard-web/public/fonts/LXGWNeoXiHei.ttf
Normal file
Binary file not shown.
BIN
leopard-web/public/icon.png
Normal file
BIN
leopard-web/public/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.4 KiB |
54
leopard-web/src/components/Markdown.tsx
Normal file
54
leopard-web/src/components/Markdown.tsx
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
import 'chart.js/auto'
|
||||||
|
import {MermaidDiagram} from '@lightenna/react-mermaid-diagram'
|
||||||
|
import EChartsReact from 'echarts-for-react'
|
||||||
|
import {trim} from 'licia'
|
||||||
|
import {Chart} from 'react-chartjs-2'
|
||||||
|
import Markdown from 'react-markdown'
|
||||||
|
import remarkGfm from 'remark-gfm'
|
||||||
|
|
||||||
|
type MarkdownOptions = {
|
||||||
|
content: string
|
||||||
|
}
|
||||||
|
|
||||||
|
function MarkdownRender(options: MarkdownOptions) {
|
||||||
|
return (
|
||||||
|
<Markdown
|
||||||
|
remarkPlugins={[
|
||||||
|
remarkGfm
|
||||||
|
]}
|
||||||
|
children={options.content}
|
||||||
|
components={{
|
||||||
|
code: ({children, className, node, ...rest}) => {
|
||||||
|
switch (trim(className || '')) {
|
||||||
|
case 'language-mermaid':
|
||||||
|
return (
|
||||||
|
<MermaidDiagram
|
||||||
|
children={children as string}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
case 'language-chartjs':
|
||||||
|
let chartjsData = eval(`(${children as string})`)
|
||||||
|
return (
|
||||||
|
<Chart
|
||||||
|
{...chartjsData}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
case 'language-echart':
|
||||||
|
let echartData = eval(`(${children as string})`)
|
||||||
|
return (
|
||||||
|
<EChartsReact option={echartData}/>
|
||||||
|
)
|
||||||
|
default:
|
||||||
|
return (
|
||||||
|
<code {...rest} className={className}>
|
||||||
|
{children}
|
||||||
|
</code>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default MarkdownRender
|
||||||
15
leopard-web/src/components/amis/MarkdownEnhance.scss
Normal file
15
leopard-web/src/components/amis/MarkdownEnhance.scss
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
.markdown-enhance {
|
||||||
|
tr {
|
||||||
|
border-top: 1px solid #c6cbd1;
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
th, td {
|
||||||
|
padding: 6px 13px;
|
||||||
|
border: 1px solid #dfe2e5;
|
||||||
|
}
|
||||||
|
|
||||||
|
table tr:nth-child(2n) {
|
||||||
|
background: #f6f8fa;
|
||||||
|
}
|
||||||
|
}
|
||||||
22
leopard-web/src/components/amis/MarkdownEnhance.tsx
Normal file
22
leopard-web/src/components/amis/MarkdownEnhance.tsx
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import {Renderer, type RendererProps} from "amis";
|
||||||
|
import {once} from "licia";
|
||||||
|
import React from "react";
|
||||||
|
import Markdown from "../Markdown.tsx";
|
||||||
|
import './MarkdownEnhance.scss'
|
||||||
|
|
||||||
|
const MarkdownEnhance: React.FC<RendererProps> = props => {
|
||||||
|
return (
|
||||||
|
<div className="markdown-enhance">
|
||||||
|
<Markdown content={props.content}/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const register = once(() => {
|
||||||
|
Renderer({
|
||||||
|
type: 'markdown-enhance',
|
||||||
|
autoVar: true,
|
||||||
|
})(React.memo(MarkdownEnhance))
|
||||||
|
})
|
||||||
|
|
||||||
|
register()
|
||||||
1
leopard-web/src/components/amis/Registry.ts
Normal file
1
leopard-web/src/components/amis/Registry.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
import './MarkdownEnhance.tsx'
|
||||||
4
leopard-web/src/index.scss
Normal file
4
leopard-web/src/index.scss
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
// 改写一些amis中控制不到的全局CSS
|
||||||
|
button.btn-deleted:hover {
|
||||||
|
color: #dc2626 !important;
|
||||||
|
}
|
||||||
70
leopard-web/src/index.tsx
Normal file
70
leopard-web/src/index.tsx
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
import {createRoot} from 'react-dom/client'
|
||||||
|
import {createHashRouter, Navigate, type RouteObject, RouterProvider} from 'react-router'
|
||||||
|
import './index.scss'
|
||||||
|
import './components/amis/Registry.ts'
|
||||||
|
import Overview from "./pages/Overview.tsx";
|
||||||
|
import Root from "./pages/Root.tsx";
|
||||||
|
import Test from "./pages/Test.tsx";
|
||||||
|
import StockList from "./pages/stock/StockList.tsx";
|
||||||
|
import StockDetail from './pages/stock/StockDetail.tsx';
|
||||||
|
import TaskList from "./pages/task/TaskList.tsx";
|
||||||
|
import TaskAdd from './pages/task/TaskAdd.tsx';
|
||||||
|
|
||||||
|
const routes: RouteObject[] = [
|
||||||
|
{
|
||||||
|
path: '/',
|
||||||
|
Component: Root,
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
index: true,
|
||||||
|
element: <Navigate to="/overview" replace/>,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'overview',
|
||||||
|
Component: Overview,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'stock',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
index: true,
|
||||||
|
element: <Navigate to="/stock/list" replace/>,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'list',
|
||||||
|
Component: StockList,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'detail/:id',
|
||||||
|
Component: StockDetail,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'task',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
index: true,
|
||||||
|
element: <Navigate to="/task/list" replace/>,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'list',
|
||||||
|
Component: TaskList,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'add',
|
||||||
|
Component: TaskAdd,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'test',
|
||||||
|
Component: Test,
|
||||||
|
}
|
||||||
|
],
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
createRoot(document.getElementById('root')!).render(
|
||||||
|
<RouterProvider router={createHashRouter(routes)}/>,
|
||||||
|
)
|
||||||
9
leopard-web/src/pages/Overview.tsx
Normal file
9
leopard-web/src/pages/Overview.tsx
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
import React from "react";
|
||||||
|
|
||||||
|
function Overview() {
|
||||||
|
return (
|
||||||
|
<div className="overview"></div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default React.memo(Overview)
|
||||||
130
leopard-web/src/pages/Root.tsx
Normal file
130
leopard-web/src/pages/Root.tsx
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
import {
|
||||||
|
DeploymentUnitOutlined,
|
||||||
|
InfoCircleOutlined,
|
||||||
|
MoneyCollectOutlined,
|
||||||
|
UnorderedListOutlined
|
||||||
|
} from "@ant-design/icons";
|
||||||
|
import {type AppItemProps, ProLayout} from '@ant-design/pro-components'
|
||||||
|
import {ConfigProvider} from 'antd'
|
||||||
|
import {dateFormat} from 'licia'
|
||||||
|
import React, {useMemo} from 'react'
|
||||||
|
import {NavLink, Outlet, useLocation} from 'react-router'
|
||||||
|
import styled from 'styled-components'
|
||||||
|
|
||||||
|
const ProLayoutDiv = styled.div`
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
.ant-menu-sub > .ant-menu-item {
|
||||||
|
//padding-left: 28px !important;
|
||||||
|
}
|
||||||
|
`
|
||||||
|
const apps: AppItemProps[] = []
|
||||||
|
|
||||||
|
const menus = {
|
||||||
|
routes: [
|
||||||
|
{
|
||||||
|
path: '/',
|
||||||
|
name: '概览',
|
||||||
|
icon: <InfoCircleOutlined/>,
|
||||||
|
routes: [
|
||||||
|
{
|
||||||
|
path: '/overview',
|
||||||
|
name: '概览',
|
||||||
|
icon: <InfoCircleOutlined/>,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/stock',
|
||||||
|
name: '股票',
|
||||||
|
icon: <MoneyCollectOutlined/>,
|
||||||
|
}, {
|
||||||
|
path: '/task',
|
||||||
|
name: '任务',
|
||||||
|
icon: <UnorderedListOutlined/>,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/test',
|
||||||
|
name: '测试',
|
||||||
|
icon: <DeploymentUnitOutlined/>,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
const Root: React.FC = () => {
|
||||||
|
const location = useLocation()
|
||||||
|
const currentYear = useMemo(() => dateFormat(new Date(), 'yyyy'), [])
|
||||||
|
return (
|
||||||
|
<ProLayoutDiv>
|
||||||
|
<ProLayout
|
||||||
|
collapsed={false}
|
||||||
|
collapsedButtonRender={() => <></>}
|
||||||
|
siderWidth={180}
|
||||||
|
token={{
|
||||||
|
colorTextAppListIcon: '#dfdfdf',
|
||||||
|
colorTextAppListIconHover: '#ffffff',
|
||||||
|
header: {
|
||||||
|
colorBgHeader: '#292f33',
|
||||||
|
colorHeaderTitle: '#ffffff',
|
||||||
|
colorTextMenu: '#dfdfdf',
|
||||||
|
colorTextMenuSecondary: '#dfdfdf',
|
||||||
|
colorTextMenuSelected: '#ffffff',
|
||||||
|
colorTextMenuActive: '#ffffff',
|
||||||
|
colorBgMenuItemSelected: '#22272b',
|
||||||
|
colorTextRightActionsItem: '#dfdfdf',
|
||||||
|
},
|
||||||
|
pageContainer: {
|
||||||
|
paddingBlockPageContainerContent: 0,
|
||||||
|
paddingInlinePageContainerContent: 0,
|
||||||
|
marginBlockPageContainerContent: 0,
|
||||||
|
marginInlinePageContainerContent: 0,
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
appList={apps}
|
||||||
|
breakpoint={false}
|
||||||
|
disableMobile={true}
|
||||||
|
logo={<img src="icon.png" alt="logo"/>}
|
||||||
|
title="金钱豹"
|
||||||
|
route={menus}
|
||||||
|
location={{pathname: location.pathname}}
|
||||||
|
menu={{type: 'sub'}}
|
||||||
|
menuItemRender={(item, defaultDom) =>
|
||||||
|
<NavLink to={item.path || '/'}>{defaultDom}</NavLink>
|
||||||
|
}
|
||||||
|
fixSiderbar={true}
|
||||||
|
layout="side"
|
||||||
|
splitMenus={true}
|
||||||
|
style={{minHeight: '100vh'}}
|
||||||
|
contentStyle={{backgroundColor: 'white', padding: '10px 10px 10px 20px'}}
|
||||||
|
menuFooterRender={props => {
|
||||||
|
return (
|
||||||
|
<div className="text-xs text-center" style={{userSelect: 'none', msUserSelect: 'none'}}>
|
||||||
|
{props?.collapsed
|
||||||
|
? undefined
|
||||||
|
: <div>© 2023-{currentYear} 兰缘小妖</div>}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<ConfigProvider
|
||||||
|
theme={{
|
||||||
|
components: {
|
||||||
|
Card: {
|
||||||
|
bodyPadding: 0,
|
||||||
|
bodyPaddingSM: 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Outlet/>
|
||||||
|
</ConfigProvider>
|
||||||
|
</ProLayout>
|
||||||
|
</ProLayoutDiv>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Root
|
||||||
10
leopard-web/src/pages/Test.tsx
Normal file
10
leopard-web/src/pages/Test.tsx
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import React from "react";
|
||||||
|
|
||||||
|
function Test() {
|
||||||
|
return (
|
||||||
|
<div className="test">
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default React.memo(Test)
|
||||||
39
leopard-web/src/pages/stock/StockDetail.tsx
Normal file
39
leopard-web/src/pages/stock/StockDetail.tsx
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import {useParams} from 'react-router'
|
||||||
|
import {amisRender, commonInfo, remoteMappings} from '../../util/amis.tsx'
|
||||||
|
|
||||||
|
function StockDetail() {
|
||||||
|
const {id} = useParams()
|
||||||
|
return (
|
||||||
|
<div className="stock-detail">
|
||||||
|
{amisRender(
|
||||||
|
{
|
||||||
|
type: 'page',
|
||||||
|
title: '股票详情(${code} ${name})',
|
||||||
|
initApi: `get:${commonInfo.baseUrl}/stock/detail/${id}`,
|
||||||
|
body: [
|
||||||
|
{
|
||||||
|
type: 'property',
|
||||||
|
items: [
|
||||||
|
{label: '编码', content: '${code}'},
|
||||||
|
{label: '名称', content: '${name}'},
|
||||||
|
{label: '全名', content: '${fullname}'},
|
||||||
|
{
|
||||||
|
label: '市场',
|
||||||
|
content: {
|
||||||
|
...remoteMappings('stock_market', 'market'),
|
||||||
|
value: '${market}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{label: '行业', content: '${industry}'},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{type: 'divider'},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default React.memo(StockDetail)
|
||||||
159
leopard-web/src/pages/stock/StockList.tsx
Normal file
159
leopard-web/src/pages/stock/StockList.tsx
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import {
|
||||||
|
amisRender,
|
||||||
|
commonInfo,
|
||||||
|
crudCommonOptions,
|
||||||
|
paginationTemplate,
|
||||||
|
remoteMappings,
|
||||||
|
remoteOptions,
|
||||||
|
} from '../../util/amis.tsx'
|
||||||
|
import {useNavigate} from 'react-router'
|
||||||
|
|
||||||
|
function StockList() {
|
||||||
|
const navigate = useNavigate()
|
||||||
|
return (
|
||||||
|
<div className="stock-list">
|
||||||
|
{amisRender(
|
||||||
|
{
|
||||||
|
type: 'page',
|
||||||
|
title: '股票列表',
|
||||||
|
body: [
|
||||||
|
{
|
||||||
|
type: 'crud',
|
||||||
|
api: {
|
||||||
|
method: 'post',
|
||||||
|
url: `${commonInfo.baseUrl}/stock/list`,
|
||||||
|
data: {
|
||||||
|
query: {
|
||||||
|
contain: {
|
||||||
|
code: '${filter_code|default:undefined}',
|
||||||
|
name: '${filter_keyword|default:undefined}',
|
||||||
|
fullname: '${filter_keyword|default:undefined}',
|
||||||
|
},
|
||||||
|
inside: {
|
||||||
|
market: '${filter_market|default:undefined}',
|
||||||
|
industry: '${filter_industry|default:undefined}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
page: {
|
||||||
|
index: '${page}',
|
||||||
|
size: '${perPage}',
|
||||||
|
},
|
||||||
|
sort: [
|
||||||
|
{
|
||||||
|
column: 'code',
|
||||||
|
direction: 'ASC',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
...crudCommonOptions(),
|
||||||
|
...paginationTemplate(15, undefined, ['filter-toggler']),
|
||||||
|
filterTogglable: true,
|
||||||
|
filterDefaultVisible: false,
|
||||||
|
filter: {
|
||||||
|
title: '快速搜索',
|
||||||
|
mode: 'default',
|
||||||
|
columnCount: 4,
|
||||||
|
body: [
|
||||||
|
{
|
||||||
|
type: 'input-text',
|
||||||
|
name: 'filter_code',
|
||||||
|
label: '编号',
|
||||||
|
placeholder: '请输入编号',
|
||||||
|
clearable: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'input-text',
|
||||||
|
name: 'filter_keyword',
|
||||||
|
label: '关键字',
|
||||||
|
placeholder: '请输入关键字',
|
||||||
|
clearable: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'filter_market',
|
||||||
|
label: '市场',
|
||||||
|
...remoteOptions('select', 'stock_market'),
|
||||||
|
multiple: true,
|
||||||
|
extractValue: true,
|
||||||
|
joinValues: false,
|
||||||
|
clearable: true,
|
||||||
|
checkAll: true,
|
||||||
|
checkAllBySearch: true,
|
||||||
|
defaultCheckAll: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'filter_industry',
|
||||||
|
label: '行业',
|
||||||
|
...remoteOptions('select', 'stock_industry'),
|
||||||
|
searchable: true,
|
||||||
|
multiple: true,
|
||||||
|
extractValue: true,
|
||||||
|
joinValues: false,
|
||||||
|
clearable: true,
|
||||||
|
checkAll: true,
|
||||||
|
checkAllBySearch: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
name: 'code',
|
||||||
|
label: '编号',
|
||||||
|
width: 150,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'name',
|
||||||
|
label: '简称',
|
||||||
|
width: 150,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'fullname',
|
||||||
|
label: '全名',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'market',
|
||||||
|
label: '市场',
|
||||||
|
width: 100,
|
||||||
|
...remoteMappings('stock_market', 'market'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'industry',
|
||||||
|
label: '行业',
|
||||||
|
width: 150,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'operation',
|
||||||
|
label: '操作',
|
||||||
|
width: 100,
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
type: 'action',
|
||||||
|
label: '详情',
|
||||||
|
level: 'link',
|
||||||
|
onEvent: {
|
||||||
|
click: {
|
||||||
|
actions: [
|
||||||
|
{
|
||||||
|
actionType: 'custom',
|
||||||
|
// @ts-ignore
|
||||||
|
script: (context, action, event) => {
|
||||||
|
navigate(`/stock/detail/${context.props.data['id']}`)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default React.memo(StockList)
|
||||||
27
leopard-web/src/pages/task/TaskAdd.tsx
Normal file
27
leopard-web/src/pages/task/TaskAdd.tsx
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import {amisRender, commonInfo} from '../../util/amis.tsx'
|
||||||
|
|
||||||
|
function TaskAdd() {
|
||||||
|
return (
|
||||||
|
<div className="task-add">
|
||||||
|
{amisRender(
|
||||||
|
{
|
||||||
|
type: 'page',
|
||||||
|
title: '任务添加',
|
||||||
|
body: [
|
||||||
|
{
|
||||||
|
debug: commonInfo.debug,
|
||||||
|
type: 'form',
|
||||||
|
wrapWithPanel: false,
|
||||||
|
mode: 'horizontal',
|
||||||
|
labelAlign: 'left',
|
||||||
|
body: [],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default React.memo(TaskAdd)
|
||||||
113
leopard-web/src/pages/task/TaskList.tsx
Normal file
113
leopard-web/src/pages/task/TaskList.tsx
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import {amisRender, commonInfo, crudCommonOptions, paginationTemplate, remoteMappings} from '../../util/amis.tsx'
|
||||||
|
import {useNavigate} from 'react-router'
|
||||||
|
|
||||||
|
function TaskList() {
|
||||||
|
const navigate = useNavigate()
|
||||||
|
return (
|
||||||
|
<div className="task-list">
|
||||||
|
{amisRender(
|
||||||
|
{
|
||||||
|
type: 'page',
|
||||||
|
title: '任务列表',
|
||||||
|
body: [
|
||||||
|
{
|
||||||
|
type: 'crud',
|
||||||
|
api: {
|
||||||
|
method: 'post',
|
||||||
|
url: `${commonInfo.baseUrl}/task/list`,
|
||||||
|
data: {
|
||||||
|
page: {
|
||||||
|
index: '${page}',
|
||||||
|
size: '${perPage}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
...crudCommonOptions(),
|
||||||
|
...paginationTemplate(
|
||||||
|
15,
|
||||||
|
undefined,
|
||||||
|
[
|
||||||
|
{
|
||||||
|
type: 'action',
|
||||||
|
label: '',
|
||||||
|
icon: 'fa fa-plus',
|
||||||
|
tooltip: '添加任务',
|
||||||
|
tooltipPlacement: 'top',
|
||||||
|
onEvent: {
|
||||||
|
click: {
|
||||||
|
actions: [
|
||||||
|
{
|
||||||
|
actionType: 'custom',
|
||||||
|
// @ts-ignore
|
||||||
|
script: (context, action, event) => {
|
||||||
|
navigate('/task/add')
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
),
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
name: 'name',
|
||||||
|
label: '简称',
|
||||||
|
width: 150,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'description',
|
||||||
|
label: '描述',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'status',
|
||||||
|
label: '状态',
|
||||||
|
width: 100,
|
||||||
|
...remoteMappings('task_status', 'status'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'launchedTime',
|
||||||
|
label: '启动时间',
|
||||||
|
width: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'finishedTime',
|
||||||
|
label: '结束时间',
|
||||||
|
width: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'operation',
|
||||||
|
label: '操作',
|
||||||
|
width: 100,
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
type: 'action',
|
||||||
|
label: '详情',
|
||||||
|
level: 'link',
|
||||||
|
onEvent: {
|
||||||
|
click: {
|
||||||
|
actions: [
|
||||||
|
{
|
||||||
|
actionType: 'custom',
|
||||||
|
// @ts-ignore
|
||||||
|
script: (context, action, event) => {
|
||||||
|
navigate(`/task/detail/${context.props.data['id']}`)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default React.memo(TaskList)
|
||||||
330
leopard-web/src/util/amis.tsx
Normal file
330
leopard-web/src/util/amis.tsx
Normal file
@@ -0,0 +1,330 @@
|
|||||||
|
import {AlertComponent, attachmentAdpator, makeTranslator, render, type Schema, ToastComponent} from 'amis'
|
||||||
|
|
||||||
|
import 'amis/lib/themes/antd.css'
|
||||||
|
import 'amis/lib/helper.css'
|
||||||
|
import 'amis/sdk/iconfont.css'
|
||||||
|
import '@fortawesome/fontawesome-free/css/all.min.css'
|
||||||
|
import axios from 'axios'
|
||||||
|
import {isEqual} from 'licia'
|
||||||
|
|
||||||
|
export const commonInfo = {
|
||||||
|
debug: isEqual(import.meta.env.MODE, 'development'),
|
||||||
|
baseUrl: 'http://localhost:9786',
|
||||||
|
}
|
||||||
|
|
||||||
|
const __ = makeTranslator('zh')
|
||||||
|
|
||||||
|
const responseAdaptor = () => (response: any) => {
|
||||||
|
let payload = response.data || {} // blob 下可能会返回内容为空?
|
||||||
|
if (payload.hasOwnProperty('errno')) {
|
||||||
|
payload.status = payload.errno
|
||||||
|
payload.msg = payload.errmsg
|
||||||
|
} else if (payload.hasOwnProperty('no')) {
|
||||||
|
payload.status = payload.no
|
||||||
|
payload.msg = payload.error
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
...response,
|
||||||
|
data: payload,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const amisRender = (schema: Schema, data: Record<any, any> = {}) => {
|
||||||
|
const theme = 'antd'
|
||||||
|
const locale = 'zh-CN'
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<ToastComponent
|
||||||
|
theme={theme}
|
||||||
|
key="toast"
|
||||||
|
position={'top-right'}
|
||||||
|
locale={locale}
|
||||||
|
/>
|
||||||
|
<AlertComponent theme={theme} key="alert" locale={locale}/>
|
||||||
|
{render(
|
||||||
|
schema,
|
||||||
|
{
|
||||||
|
data: {
|
||||||
|
...commonInfo,
|
||||||
|
...data,
|
||||||
|
},
|
||||||
|
theme: theme,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
enableAMISDebug: commonInfo.debug,
|
||||||
|
fetcher: async (api: any) => {
|
||||||
|
let {url, method, data, responseType, config, headers} = api
|
||||||
|
config = config || {}
|
||||||
|
config.url = url
|
||||||
|
config.withCredentials = true
|
||||||
|
responseType && (config.responseType = responseType)
|
||||||
|
|
||||||
|
if (config.cancelExecutor) {
|
||||||
|
config.cancelToken = new (axios as any).CancelToken(
|
||||||
|
config.cancelExecutor,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
config.headers = headers || {}
|
||||||
|
config.method = method
|
||||||
|
config.data = data
|
||||||
|
|
||||||
|
if (method === 'get' && data) {
|
||||||
|
config.params = data
|
||||||
|
} else if (data && data instanceof FormData) {
|
||||||
|
// config.headers['Content-Type'] = 'multipart/form-data';
|
||||||
|
} else if (
|
||||||
|
data &&
|
||||||
|
typeof data !== 'string' &&
|
||||||
|
!(data instanceof Blob) &&
|
||||||
|
!(data instanceof ArrayBuffer)
|
||||||
|
) {
|
||||||
|
data = JSON.stringify(data)
|
||||||
|
config.headers['Content-Type'] = 'application/json'
|
||||||
|
}
|
||||||
|
|
||||||
|
// 支持返回各种报错信息
|
||||||
|
config.validateStatus = function () {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
let response = await axios(config)
|
||||||
|
response = await attachmentAdpator(response, __, api)
|
||||||
|
response = responseAdaptor()(response)
|
||||||
|
|
||||||
|
if (response.status >= 400) {
|
||||||
|
if (response.data) {
|
||||||
|
// 主要用于 raw: 模式下,后端自己校验登录,
|
||||||
|
if (
|
||||||
|
response.status === 401 &&
|
||||||
|
response.data.location &&
|
||||||
|
response.data.location.startsWith('http')
|
||||||
|
) {
|
||||||
|
location.href = response.data.location.replace(
|
||||||
|
'{{redirect}}',
|
||||||
|
encodeURIComponent(location.href),
|
||||||
|
)
|
||||||
|
return new Promise(() => {
|
||||||
|
})
|
||||||
|
} else if (response.data.msg) {
|
||||||
|
throw new Error(response.data.msg)
|
||||||
|
} else {
|
||||||
|
throw new Error(
|
||||||
|
'System.requestError' + JSON.stringify(response.data, null, 2),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new Error(
|
||||||
|
`${'System.requestErrorStatus'} ${response.status}`,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return response
|
||||||
|
},
|
||||||
|
isCancel: (value: any) => (axios as any).isCancel(value),
|
||||||
|
},
|
||||||
|
)}
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function horizontalFormOptions() {
|
||||||
|
return {
|
||||||
|
mode: 'horizontal',
|
||||||
|
horizontal: {
|
||||||
|
leftFixed: 'sm',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function crudCommonOptions() {
|
||||||
|
return {
|
||||||
|
affixHeader: false,
|
||||||
|
stopAutoRefreshWhenModalIsOpen: true,
|
||||||
|
resizable: false,
|
||||||
|
syncLocation: false,
|
||||||
|
silentPolling: true,
|
||||||
|
columnsTogglable: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function readOnlyDialogOptions() {
|
||||||
|
return {
|
||||||
|
actions: [],
|
||||||
|
showCloseButton: false,
|
||||||
|
closeOnEsc: true,
|
||||||
|
closeOnOutside: true,
|
||||||
|
disabled: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function paginationCommonOptions(perPage = true, maxButtons = 5) {
|
||||||
|
let option = {
|
||||||
|
type: 'pagination',
|
||||||
|
layout: [
|
||||||
|
'pager',
|
||||||
|
],
|
||||||
|
maxButtons: maxButtons,
|
||||||
|
showPageInput: false,
|
||||||
|
perPageAvailable: [10, 15, 20, 50, 100, 200],
|
||||||
|
}
|
||||||
|
if (perPage) {
|
||||||
|
option.layout.push('perPage')
|
||||||
|
}
|
||||||
|
return option
|
||||||
|
}
|
||||||
|
|
||||||
|
export function paginationTemplate(perPage = 20, maxButtons = 5, extraHeaders: Array<Schema | string> = [], extraFooters: Array<Schema | string> = []) {
|
||||||
|
return {
|
||||||
|
perPage: perPage,
|
||||||
|
headerToolbar: [
|
||||||
|
'reload',
|
||||||
|
paginationCommonOptions(true, maxButtons),
|
||||||
|
...extraHeaders,
|
||||||
|
],
|
||||||
|
footerToolbar: [
|
||||||
|
'statistics',
|
||||||
|
paginationCommonOptions(true, maxButtons),
|
||||||
|
...extraFooters,
|
||||||
|
],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function copyField(field: string, tips = '复制', ignoreLength = 0) {
|
||||||
|
let tpl = ignoreLength === 0 ? `\${${field}}` : `\${TRUNCATE(${field}, ${ignoreLength})}`
|
||||||
|
return {
|
||||||
|
type: 'wrapper',
|
||||||
|
size: 'none',
|
||||||
|
body: [
|
||||||
|
{
|
||||||
|
type: 'tpl',
|
||||||
|
className: 'mr-1',
|
||||||
|
tpl: tpl,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'action',
|
||||||
|
level: 'link',
|
||||||
|
label: '',
|
||||||
|
icon: 'fa fa-copy',
|
||||||
|
size: 'xs',
|
||||||
|
actionType: 'copy',
|
||||||
|
content: `\$${field}`,
|
||||||
|
tooltip: `${tips}`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function mappingItem(label: string, value: string, color = 'bg-info') {
|
||||||
|
return {
|
||||||
|
label: label,
|
||||||
|
value: value,
|
||||||
|
color: color,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function mappingField(field: string, mapping: Array<Record<string, string>>) {
|
||||||
|
let mapData: Record<string, string> = {
|
||||||
|
'*': `<span class='label bg-gray-300'>\${${field}}</span>`,
|
||||||
|
}
|
||||||
|
mapping.forEach(item => {
|
||||||
|
mapData[item['value']] = `<span class='label ${item['color']}'>${item['label']}</span>`
|
||||||
|
})
|
||||||
|
return {
|
||||||
|
type: 'mapping',
|
||||||
|
value: `\${${field}}`,
|
||||||
|
map: mapData,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function filterableField(mapping: Array<Record<string, any>>, multiple = false) {
|
||||||
|
return {
|
||||||
|
multiple: multiple,
|
||||||
|
options: [
|
||||||
|
...mapping,
|
||||||
|
],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function time(field: string) {
|
||||||
|
return {
|
||||||
|
type: 'tpl',
|
||||||
|
tpl: `\${IF(${field}, DATETOSTR(${field}, 'YYYY-MM-DD HH:mm:ss'), undefined)}`,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function pictureFromIds(field: string) {
|
||||||
|
return `\${ARRAYMAP(${field},id => '${commonInfo.baseUrl}/upload/download/' + id)}`
|
||||||
|
}
|
||||||
|
|
||||||
|
export const formInputFileStaticColumns = [
|
||||||
|
{
|
||||||
|
name: 'filename',
|
||||||
|
label: '文件名',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'operation',
|
||||||
|
label: '操作',
|
||||||
|
width: 140,
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
type: 'action',
|
||||||
|
label: '预览',
|
||||||
|
level: 'link',
|
||||||
|
icon: 'fas fa-eye',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'action',
|
||||||
|
label: '下载',
|
||||||
|
level: 'link',
|
||||||
|
icon: 'fa fa-download',
|
||||||
|
actionType: 'ajax',
|
||||||
|
// api: {
|
||||||
|
// ...apiGet('${base}/upload/download/${id}'),
|
||||||
|
// responseType: 'blob',
|
||||||
|
// }
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
export function formInputSingleFileStatic(field: string, label: string) {
|
||||||
|
return {
|
||||||
|
visibleOn: '${static}',
|
||||||
|
type: 'control',
|
||||||
|
label: label,
|
||||||
|
required: true,
|
||||||
|
body: {
|
||||||
|
type: 'table',
|
||||||
|
source: `\${${field}|asArray}`,
|
||||||
|
columns: formInputFileStaticColumns,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function formInputMultiFileStatic(field: string, label: string) {
|
||||||
|
return {
|
||||||
|
visibleOn: '${static}',
|
||||||
|
type: 'input-table',
|
||||||
|
label: label,
|
||||||
|
name: field,
|
||||||
|
required: true,
|
||||||
|
resizable: false,
|
||||||
|
columns: formInputFileStaticColumns,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function remoteOptions(type: string = 'select', name: string) {
|
||||||
|
return {
|
||||||
|
type: type,
|
||||||
|
source: `get:${commonInfo.baseUrl}/constants/options/${name}`,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function remoteMappings(name: string, field: string) {
|
||||||
|
return {
|
||||||
|
type: 'mapping',
|
||||||
|
source: `get:${commonInfo.baseUrl}/constants/mappings/${name}/${field}`,
|
||||||
|
}
|
||||||
|
}
|
||||||
3
leopard-web/src/vite-env.d.ts
vendored
Normal file
3
leopard-web/src/vite-env.d.ts
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
/// <reference types="vite/client" />
|
||||||
|
|
||||||
|
declare const __APP_VERSION__: string
|
||||||
31
leopard-web/tsconfig.json
Normal file
31
leopard-web/tsconfig.json
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
||||||
|
"target": "ESNext",
|
||||||
|
"useDefineForClassFields": true,
|
||||||
|
"lib": [
|
||||||
|
"ESNext",
|
||||||
|
"DOM",
|
||||||
|
"DOM.Iterable"
|
||||||
|
],
|
||||||
|
"module": "ESNext",
|
||||||
|
"skipLibCheck": true,
|
||||||
|
/* Bundler mode */
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"allowImportingTsExtensions": true,
|
||||||
|
"verbatimModuleSyntax": true,
|
||||||
|
"moduleDetection": "force",
|
||||||
|
"noEmit": true,
|
||||||
|
"jsx": "react-jsx",
|
||||||
|
/* Linting */
|
||||||
|
"strict": true,
|
||||||
|
"noUnusedLocals": true,
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
"erasableSyntaxOnly": true,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
"noUncheckedSideEffectImports": true
|
||||||
|
},
|
||||||
|
"include": [
|
||||||
|
"src"
|
||||||
|
]
|
||||||
|
}
|
||||||
39
leopard-web/vite.config.ts
Normal file
39
leopard-web/vite.config.ts
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
import react from '@vitejs/plugin-react-swc'
|
||||||
|
import {defineConfig, type UserConfig} from 'vite'
|
||||||
|
import obfuscatorPlugin from 'vite-plugin-javascript-obfuscator'
|
||||||
|
// @ts-ignore
|
||||||
|
import packageJson from './package.json'
|
||||||
|
|
||||||
|
// https://vite.dev/config/
|
||||||
|
export default defineConfig(({mode}) => {
|
||||||
|
let config: UserConfig = {
|
||||||
|
define: {
|
||||||
|
__APP_VERSION__: JSON.stringify(packageJson.version) ?? '0.0.0',
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
react(),
|
||||||
|
obfuscatorPlugin({
|
||||||
|
apply: config => config['mode'] === 'production',
|
||||||
|
options: {
|
||||||
|
compact: true,
|
||||||
|
controlFlowFlattening: true,
|
||||||
|
controlFlowFlatteningThreshold: 0.75,
|
||||||
|
deadCodeInjection: true,
|
||||||
|
deadCodeInjectionThreshold: 0.4,
|
||||||
|
debugProtection: false,
|
||||||
|
disableConsoleOutput: true,
|
||||||
|
identifierNamesGenerator: 'hexadecimal',
|
||||||
|
renameGlobals: false,
|
||||||
|
stringArrayRotate: true,
|
||||||
|
selfDefending: true,
|
||||||
|
stringArray: true,
|
||||||
|
stringArrayEncoding: ['base64'],
|
||||||
|
stringArrayThreshold: 0.75,
|
||||||
|
transformObjectKeys: true,
|
||||||
|
unicodeEscapeSequence: false,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
})
|
||||||
91
pom.xml
Normal file
91
pom.xml
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<?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.lanyuanxiaoyao</groupId>
|
||||||
|
<artifactId>leopard</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
|
<modules>
|
||||||
|
<module>leopard-server</module>
|
||||||
|
</modules>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<java.version>17</java.version>
|
||||||
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
|
||||||
|
<spring-boot.version>3.5.0</spring-boot.version>
|
||||||
|
<spring-cloud.version>2025.0.0</spring-cloud.version>
|
||||||
|
<spring-ai.version>1.0.1</spring-ai.version>
|
||||||
|
|
||||||
|
<eclipse-collections.version>13.0.0</eclipse-collections.version>
|
||||||
|
<hutool.version>5.8.39</hutool.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.lanyuanxiaoyao</groupId>
|
||||||
|
<artifactId>spring-boot-service-template</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.hutool</groupId>
|
||||||
|
<artifactId>hutool-core</artifactId>
|
||||||
|
<version>${hutool.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.hutool</groupId>
|
||||||
|
<artifactId>hutool-http</artifactId>
|
||||||
|
<version>${hutool.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-dependencies</artifactId>
|
||||||
|
<version>${spring-boot.version}</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.ai</groupId>
|
||||||
|
<artifactId>spring-ai-bom</artifactId>
|
||||||
|
<version>${spring-ai.version}</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</dependencyManagement>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<pluginManagement>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.14.0</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
<version>${spring-boot.version}</version>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</pluginManagement>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
||||||
Reference in New Issue
Block a user