Compare commits

..
1 Commits
Author SHA1 Message Date
admin c6ea9d565b Initial commit 2026-10-29 06:45:30 +00:00
133 changed files with 2 additions and 59508 deletions

No files matched your search

-12
View File
@@ -1,12 +0,0 @@
* text=auto
*.sh text eol=lf
*.md text eol=lf
*.yaml text eol=lf
*.yml text eol=lf
*.sql text eol=lf
*.txt text eol=lf
*.conf text eol=lf
*.xml text eol=lf
*.bat text eol=crlf
*.png binary
*.jpg binary
-92
View File
@@ -1,92 +0,0 @@
######################################################################
# Build Tools
.gradle
!gradle/wrapper/gradle-wrapper.jar
target/
!.mvn/wrapper/maven-wrapper.jar
######################################################################
# IDE
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
*.class
### JRebel ###
rebel.xml
### NetBeans ###
nbproject/private/
nbbuild/
dist/
nbdist/
.nb-gradle/
######################################################################
# Others
*.log
*.xml.versionsBackup
*.swp
tmp
~$*
# docker
build/docker/mysql/data
build/docker/redis/data
build/docker/mysql/log
build/docker/nacos/logs
build/docker/mysql/db/*.sql
build/docker/mysql/db/upgrade/*/*.sql
build/docker/wfc/*/jar/*.jar
build/docker/wfc/*/*/jar/*.jar
build/docker/conf/default/i18n/*.properties
# Logs
logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
.DS_Store
dist
dist-ssr
coverage
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
!.vscode/settings.json
!.vscode/launch.json
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
package-lock.json
yarn.lock
.VSCodeCounter
# release
release/debs/*.deb
release/tars/*.tar.gz
release/src-tars/*.tar.gz
debbuild/etc
debbuild/opt
+2 -81
View File
@@ -1,82 +1,3 @@
# WANFi Control & Billing System # build.wfc
## 构建目录 打包脚本
```text
build.wfc/
├── bin # build binary file
├── build # build directory
│   ├── bin
│   ├── docker # docker compose root directory
│   │   ├── env
│   │   ├── mysql
│   │   │   ├── conf
│   │   │   ├── data
│   │   │   ├── db
│   │   │   └── logs
│   │   ├── nacos
│   │   │   ├── conf
│   │   │   └── logs
│   │   ├── nginx
│   │   │   ├── conf
│   │   │   ├── conf.d
│   │   │   ├── html
│   │   │   └── logs
│   │   ├── redis
│   │   │   ├── conf
│   │   │   └── data
│   │   └── wfc
│   │   ├── auth
│   │   │   └── jar
│   │   ├── gateway
│   │   │   └── jar
│   │   ├── modules
│   │   │   ├── file
│   │   │   │   └── jar
│   │   │   ├── gen
│   │   │   │   └── jar
│   │   │   ├── job
│   │   │   │   └── jar
│   │   │   ├── payment
│   │   │   │   └── jar
│   │   │   ├── system
│   │   │   │   └── jar
│   │   │   └── user
│   │   │   └── jar
│   │   ├── upload
│   │   └── visual
│   │   └── monitor
│   │   └── jar
│   └── systemd # system service daemon file saved here
│   └── system
├── debbuild # deb build directory, not ready
│   ├── DEBIAN
│   ├── etc
│   └── opt
│   └── wfc
├── docs
│   ├── 01-requirement
│   ├── 02-design
│   └── 03-configuration
└── release
├── debs # deb package release, n/a
└── tars # tar package release
```
## 准备工作
```text
JDK >= 1.8 (推荐1.8版本)
Maven >= 3.0
Mysql >= 5.7.0 (推荐5.7版本) # docker内部构建
Redis >= 7.4.2 # docker内部构建
nacos >= v2.5.0 # docker内部构建
sentinel >= 1.6.0 (optional)
```
## 构建发布包
```sh
cd wfc.git/build.wfc/bin
./build.sh -g tar
```
-322
View File
@@ -1,322 +0,0 @@
#!/bin/bash
ProjectL=wfc
ProjectU=WFC
RelDate=`date +%Y%m%d`
#GitRootDir=${HOME}/wfc.git
GitRootDir=$(dirname $(dirname $(dirname $(realpath $0))))
BERootDir=${GitRootDir}/be.wfc
FERootDir=${GitRootDir}/fe.wfc
FEUserRootDir=${GitRootDir}/fe.wfc.user
BuildRootDir=${GitRootDir}/build.wfc
LicenseBuildDir=${GitRootDir}/license.build.wfc
LicenseRootDir=${GitRootDir}/license.wfc
WFCWorkDir=/opt/wfc
BuildDockerDir=${BuildRootDir}/build/docker
ReleseDir=${BuildRootDir}/release
SystemdDir=${BuildRootDir}/build/systemd/system
DebBuildDir=${BuildRootDir}/debbuild
DebReleseDir=${ReleseDir}/debs
DebSystemdDir=${DebBuildDir}/etc/systemd/system
TmpDir=${BuildRootDir}/tmp
TmpEnvFile=${TmpDir}/.env.tmp
usage() {
echo "Usage: sh build.sh [extras|jar|dist|copy|tar|srctar|deb|all] [-g]"
exit 1
}
SKIP_PRE_GIT_PULL=false
# Reorder arguments so that options come first
ARGS=()
for arg in "$@"; do
case $arg in
-g)
SKIP_PRE_GIT_PULL=true
;;
*)
ARGS+=("$arg")
;;
esac
done
if SKIP_PRE_GIT_PULL=true; then
ARGS+=("-g")
fi
# Restore positional parameters
set -- "${ARGS[@]}"
# Process options
while getopts "g" opt; do
case ${opt} in
g )
SKIP_PRE_GIT_PULL=true
;;
\? )
usage
;;
esac
done
shift $((OPTIND -1))
pre-build-tar(){
if [ ! -d ${ReleseDir}/tars ]; then
mkdir -p ${ReleseDir}/tars
fi
source ${BuildRootDir}/bin/control.sh
cd ${BuildRootDir}
sed -i "s/YYYYMMDD/${RelDate}/" ${BuildDockerDir}/env/wfc-release
# git update-index --assume-unchanged ${BuildDockerDir}/env/wfc-release
}
pre-git-pull(){
cd ${BERootDir}
git pull
cd ${FERootDir}
git checkout src/typings/
git pull
cd ${FEUserRootDir}
git checkout src/typings/
git pull
cd ${BuildRootDir}
git pull
if [ -d ${LicenseRootDir} ]; then
cd ${LicenseRootDir}
git pull
fi
if [ -d ${LicenseBuildDir} ]; then
cd ${LicenseBuildDir}
git pull
fi
}
pre-build-deb(){
if [ ! -d ${ReleseDir}/debs ]; then
mkdir -p ${ReleseDir}/debs
fi
if [ ! -d ${DebBuildDir}/opt/wfc ]; then
mkdir -p ${DebBuildDir}/opt/wfc
fi
if [ ! -d ${DebSystemdDir} ]; then
mkdir -p ${DebSystemdDir}
fi
cd ${BuildRootDir}
sed -i "s/YYYYMMDD/${RelDate}/" ${BuildDockerDir}/env/wfc-release
# git update-index --assume-unchanged ${BuildDockerDir}/env/wfc-release
}
build-extras(){
cd ${BuildRootDir}
echo -n "Begin build extras file ... "
cd ${BuildRootDir}/bin
javac -source 8 -target 8 -bootclasspath /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/rt.jar -extdirs "" -Xlint:-options printJarVer.java
echo "done"
}
build-jar(){
cd ${BERootDir}
# git pull
mvn clean package -Dmaven.test.skip=true -P prod
}
pre-build-src-tar(){
if [ ! -d ${ReleseDir}/src-tars ]; then
mkdir -p ${ReleseDir}/src-tars
fi
source ${BuildRootDir}/bin/control.sh
}
clean-jar(){
cd ${BERootDir}
mvn clean
cd ${LicenseRootDir}
mvn clean
}
build-dist(){
cd ${FERootDir}
# git checkout src/typings/
# git pull
pnpm i
pnpm build
cd ${FEUserRootDir}
# git checkout src/typings/
# git pull
if ! pnpm list terser --depth 0 &> /dev/null; then
pnpm add terser --save-dev
fi
pnpm i
pnpm build
}
copy-file(){
${BuildRootDir}/bin/copy.sh ${GitRootDir}
cp -f ${BuildRootDir}/bin/printJarVer.class ${BuildRootDir}/build/bin/
}
copy-file-debbuild(){
rm -rf ${DebBuildDir}/opt/wfc/*
cp -rf ${BuildRootDir}/build/bin/ ${DebBuildDir}/opt/wfc
cp -rf ${BuildRootDir}/build/docker/ ${DebBuildDir}/opt/wfc
cp -rf ${BuildRootDir}/build/systemd/ ${DebBuildDir}/opt/wfc
if [ -f ${DebBuildDir}/opt/wfc/docker/.env ]; then
rm ${DebBuildDir}/opt/wfc/docker/.env
fi
cp -rf ${SystemdDir}/* ${DebSystemdDir}/
chmod 755 ${DebBuildDir}/DEBIAN/preinst
chmod 755 ${DebBuildDir}/DEBIAN/postinst
chmod 755 ${DebBuildDir}/DEBIAN/postrm
}
# create tar package
create-tar(){
TarFileName=${ProjectL}-${RelVersion}-${RelDate}.tar.gz
echo -n "Begin build tar package(${TarFileName}) ... "
cd ${BuildRootDir}/build
tar cvfz ${ReleseDir}/tars/${TarFileName} \
--exclude='./docker/mysql/logs' \
--exclude='./docker/mysql/data' \
--exclude='./docker/mysql/tmp' \
--exclude='./docker/nacos/logs' \
--exclude='./docker/nginx/logs' \
--exclude='./docker/.env' \
. 1>/dev/null
echo "done"
}
# create source tar package
create-src-tar(){
SrcTarFileName=${ProjectL}-${RelVersion}-${RelDate}.src.tar.gz
echo -n "Begin build source tar package(${SrcTarFileName}) ... "
WFCRelativeDir=./wfc.git
BeRelativeDir=${WFCRelativeDir}/be.wfc
FeRelativeDir=${WFCRelativeDir}/fe.wfc
FeUserRelativeDir=${WFCRelativeDir}/fe.wfc.user
BuildRelativeDir=${WFCRelativeDir}/build.wfc
LicenseSrcDir=${WFCRelativeDir}/license.wfc
LicenseBuildDir=${WFCRelativeDir}/license.build.wfc
cd ${HOME}
tar cvfz ${ReleseDir}/src-tars/${SrcTarFileName} \
--exclude=${WFCRelativeDir}/.vscode \
--exclude=${BeRelativeDir}/.vscode \
--exclude=${BeRelativeDir}/.git \
--exclude=${BeRelativeDir}/bin \
--exclude=${BeRelativeDir}/docker \
--exclude=${BeRelativeDir}/.github \
--exclude=${BeRelativeDir}/tmp \
--exclude=${FeRelativeDir}/.vscode \
--exclude=${FeRelativeDir}/.git \
--exclude=${FeRelativeDir}/dist \
--exclude=${FeRelativeDir}/node_modules \
--exclude=${FeUserRelativeDir}/.vscode \
--exclude=${FeUserRelativeDir}/.git \
--exclude=${FeUserRelativeDir}/dist \
--exclude=${FeUserRelativeDir}/node_modules \
--exclude=${BuildRelativeDir}/.vscode \
--exclude=${BuildRelativeDir}/.git \
--exclude=${BuildRelativeDir}/tmp \
--exclude=${BuildRelativeDir}/release \
--exclude=${BuildRelativeDir}/build/docker/nginx/html \
--exclude=${BuildRelativeDir}/build/docker/wfc/auth/jar/*.jar \
--exclude=${BuildRelativeDir}/build/docker/wfc/gateway/jar/*.jar \
--exclude=${BuildRelativeDir}/build/docker/wfc/modules/*/jar/*.jar \
--exclude=${BuildRelativeDir}/build/docker/wfc/visual/jar/*.jar \
--exclude=${BuildRelativeDir}/debbuild/etc \
--exclude=${BuildRelativeDir}/debbuild/opt \
--exclude=${BuildRelativeDir}/bin/cpto205.sh \
--exclude=${BuildRelativeDir}/docs/98-acceptance \
--exclude=${BuildRelativeDir}/docs/99-reference \
--exclude=${BuildRelativeDir}/docs/100-images \
--exclude=${LicenseSrcDir}/.git \
--exclude=${LicenseSrcDir}/.vscode \
--exclude=${LicenseSrcDir}/target \
--exclude=${LicenseBuildDir}/.git \
--exclude=${LicenseBuildDir}/.vscode \
--exclude=${LicenseBuildDir}/debbuild/opt/lic/docker/jar/*.jar \
--exclude=${LicenseBuildDir}/debbuild/opt/lic/docs \
--exclude=${LicenseBuildDir}/release \
${WFCRelativeDir} 1>/dev/null
echo "done"
}
# create deb package
create-deb(){
Version=$(grep '^Version:' ${DebBuildDir}/DEBIAN/control | awk '{print $2}')
DebPkgFile=${ProjectL}-${Version}-${RelDate}-ub22.deb
echo -n "Begin build deb package(${DebPkgFile}) ... "
dpkg -b ${DebBuildDir} ${DebReleseDir}/${DebPkgFile} 1>/dev/null
echo "done"
}
post-build(){
# if [ -f ${TmpEnvFile} ] && [ ! -f ${BuildDockerDir}/.env ]; then
# mv -f ${TmpEnvFile} ${BuildDockerDir}/.env
# fi
cd ${BuildRootDir}
sed -i "s/${RelDate}/YYYYMMDD/" ${BuildDockerDir}/env/wfc-release
# git checkout ${BuildDockerDir}/env/wfc-release
# git update-index --no-assume-unchanged ${BuildDockerDir}/env/wfc-release
}
case "$1" in
"extras")
build-extras
;;
"jar")
build-jar
;;
"dist")
build-dist
;;
"copy")
copy-file
;;
"tar")
if [ "$SKIP_PRE_GIT_PULL" = false ]; then
pre-git-pull
fi
pre-build-tar
build-extras
build-jar
build-dist
copy-file
create-tar
post-build
;;
"deb")
if [ "$SKIP_PRE_GIT_PULL" = false ]; then
pre-git-pull
fi
pre-build-deb
build-extras
build-jar
build-dist
copy-file
copy-file-debbuild
create-deb
post-build
;;
"srctar")
if [ "$SKIP_PRE_GIT_PULL" = false ]; then
pre-git-pull
fi
pre-build-src-tar
clean-jar
create-src-tar
# post-build
;;
"all")
# Recursively call the script with the 'deb' argument and pass necessary parameters
$0 deb "${ARGS[@]:2}"
# Recursively call the script with the 'tar' argument and pass necessary parameters
$0 tar "${ARGS[@]:2}"
;;
*)
usage
;;
esac
-4
View File
@@ -1,4 +0,0 @@
Package=WFC
RelVersion=1.0.19
Architecture=amd64
Description='MacroHub Control and Billing System'
-90
View File
@@ -1,90 +0,0 @@
#!/bin/bash
GitRootDir=$(dirname $(dirname $(dirname $(realpath $0))))
BERootDir=${GitRootDir}/be.wfc
FERootDir=${GitRootDir}/fe.wfc
FEUserRootDir=${GitRootDir}/fe.wfc.user
BuildRootDir=${GitRootDir}/build.wfc
I18nResourcesDir=${BERootDir}/wfc-common/wfc-common-core/src/main/resources
WFCWorkDir=/opt/wfc
BuildDockerDir=${BuildRootDir}/build/docker
# 复制项目的文件到对应docker路径,便于一键生成镜像。
usage() {
echo "Usage: sh copy.sh"
exit 1
}
if [ $# -ne 1 ]; then
GitRootDir=$1
fi
# copy sql
echo -n "Begin copy sql ... "
cp ${BERootDir}/sql/wfc_config_db/wfc_config_db.sql ${BuildDockerDir}/mysql/db
cp ${BERootDir}/sql/wfc_system_db/wfc_system_db.sql ${BuildDockerDir}/mysql/db
cp ${BERootDir}/sql/wfc_user_db/wfc_user_db.sql ${BuildDockerDir}/mysql/db
rm -rf ${BuildDockerDir}/mysql/db/upgrade/*
cp -rf ${BERootDir}/sql/upgrade ${BuildDockerDir}/mysql/db/
#ln -sf /tmp ${BuildDockerDir}/mysql/
echo "done"
# copy html
echo -n "Begin copy system html ... "
mkdir -p ${BuildDockerDir}/nginx/html/dist/sys
rm -rf ${BuildDockerDir}/nginx/html/dist/sys/*
cp -rf ${FERootDir}/dist/* ${BuildDockerDir}/nginx/html/dist/sys/
echo "done"
echo -n "Begin copy user html ... "
mkdir -p ${BuildDockerDir}/nginx/html/dist/u
rm -rf ${BuildDockerDir}/nginx/html/dist/u/*
cp -rf ${FEUserRootDir}/dist/* ${BuildDockerDir}/nginx/html/dist/u/
echo "done"
# copy i18n message resuorces
echo -n "Begin copy i18n message resources ... "
if [ ! -d ${BuildDockerDir}/conf/default/i18n ]; then
mkdir -p ${BuildDockerDir}/conf/default/i18n
fi
cp -rf ${I18nResourcesDir}/i18n/* ${BuildDockerDir}/conf/default/i18n/
echo "done"
# copy jar
echo -n "Begin copy wfc-gateway ... "
cp ${BERootDir}/wfc-gateway/target/wfc-gateway.jar ${BuildDockerDir}/wfc/gateway/jar
echo "done"
echo -n "Begin copy wfc-auth ... "
cp ${BERootDir}/wfc-auth/target/wfc-auth.jar ${BuildDockerDir}/wfc/auth/jar
echo "done"
# echo -n "Begin copy wfc-visual ... "
# cp ${BERootDir}/wfc-visual/wfc-visual-monitor/target/wfc-visual-monitor.jar ${BuildDockerDir}/wfc/visual/monitor/jar
# echo "done"
echo -n "Begin copy wfc-modules-system ... "
cp ${BERootDir}/wfc-modules/wfc-system/target/wfc-modules-system.jar ${BuildDockerDir}/wfc/modules/system/jar
echo "done"
echo -n "Begin copy wfc-modules-user ... "
cp ${BERootDir}/wfc-modules/wfc-user/target/wfc-modules-user.jar ${BuildDockerDir}/wfc/modules/user/jar
echo "done"
echo -n "Begin copy wfc-modules-file ... "
cp ${BERootDir}/wfc-modules/wfc-file/target/wfc-modules-file.jar ${BuildDockerDir}/wfc/modules/file/jar
echo "done"
echo -n "Begin copy wfc-modules-job ... "
cp ${BERootDir}/wfc-modules/wfc-job/target/wfc-modules-job.jar ${BuildDockerDir}/wfc/modules/job/jar
echo "done"
# echo -n "Begin copy wfc-modules-gen ... "
# cp ${BERootDir}/wfc-modules/wfc-gen/target/wfc-modules-gen.jar ${BuildDockerDir}/wfc/modules/gen/jar
# echo "done"
echo -n "Begin copy wfc-modules-payment ... "
cp -rf ${BERootDir}/wfc-modules/wfc-payment/target/wfc-modules-payment.jar ${BuildDockerDir}/wfc/modules/payment/jar
echo "done"
-75
View File
@@ -1,75 +0,0 @@
#!/bin/bash
git_root_dir=$(dirname $(dirname $(dirname $(realpath $0))))
build_root_dir=${git_root_dir}/build.wfc
build_doc_dir=${build_root_dir}/docs/03-configuration
local_tars_rel_dir=${build_root_dir}/release/tars
local_debs_rel_dir=${build_root_dir}/release/debs
wfc_rel_dir_205=/mnt/public/release/omc/wfc
tars_rel_dir_205=${wfc_rel_dir_205}/tars/
debs_rel_dir_205=${wfc_rel_dir_205}/debs/
server_ip_205=192.168.1.205
passwd=admin123
usage() {
echo "Usage: sh cpto205.sh {rel_date}"
echo " {rel_date} should be in the format YYYYMMDD"
}
if [ ! -z "$1" ]; then
rel_date=$1
else
rel_date=$(date +%Y%m%d)
fi
quickstart_file=${build_doc_dir}/03-WANFi软件快速安装.pdf
latest_tar_file=$(ls -t ${local_tars_rel_dir}/*${rel_date}* 2>/dev/null | head -n 1)
latest_deb_file=$(ls -t ${local_debs_rel_dir}/*${rel_date}* 2>/dev/null | head -n 1)
# Use expect to automatically answer yes and input password for rsync commands
if [ -n "${latest_deb_file}" ]; then
expect <<EOF
set timeout -1
spawn rsync -avz ${latest_deb_file} agtuser@${server_ip_205}:${debs_rel_dir_205}
expect {
"yes/no" {
send "yes\n"
exp_continue
}
"password:" { send "$passwd\n" }
}
expect eof
EOF
fi
if [ -n "${latest_tar_file}" ]; then
expect <<EOF
set timeout -1
spawn rsync -avz ${latest_tar_file} agtuser@${server_ip_205}:${tars_rel_dir_205}
expect {
"yes/no" {
send "yes\n"
exp_continue
}
"password:" { send "$passwd\n" }
}
expect eof
EOF
fi
if [ -f "${quickstart_file}" ]; then
expect <<EOF
set timeout -1
spawn rsync -avz ${quickstart_file} agtuser@${server_ip_205}:${wfc_rel_dir_205}
expect {
"yes/no" {
send "yes\n"
exp_continue
}
"password:" { send "$passwd\n" }
}
expect eof
EOF
fi
-28
View File
@@ -1,28 +0,0 @@
import java.io.File;
import java.io.IOException;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
public class printJarVer {
public static void main(String[] args) {
if (args.length == 0) {
System.out.println("Please input jars path and file name.");
return;
}
for (String jarPath : args) {
File jarFile = new File(jarPath);
String jarName = jarFile.getName();
try (JarFile jar = new JarFile(jarFile)) {
Manifest manifest = jar.getManifest();
Attributes attributes = manifest.getMainAttributes();
String version = attributes.getValue("Implementation-Version");
System.out.println(jarName + " version: " + (version != null ? version : "not found version info"));
} catch (IOException e) {
System.out.println("Can't read " + jarName + " version.");
e.printStackTrace();
}
}
}
}
-66
View File
@@ -1,66 +0,0 @@
#!/bin/bash
WFCWorkDir=/opt/wfc
WFCBinDir=${WFCWorkDir}/bin
DockerDir=${WFCWorkDir}/docker
DockerCompose=docker-compose
PIDFile=/run/wfccontrol.pid
Jars="/opt/wfc/docker/wfc/auth/jar/wfc-auth.jar
/opt/wfc/docker/wfc/gateway/jar/wfc-gateway.jar
/opt/wfc/docker/wfc/modules/system/jar/wfc-modules-system.jar
/opt/wfc/docker/wfc/modules/user/jar/wfc-modules-user.jar
/opt/wfc/docker/wfc/modules/file/jar/wfc-modules-file.jar
/opt/wfc/docker/wfc/modules/job/jar/wfc-modules-job.jar
/opt/wfc/docker/wfc/modules/payment/jar/wfc-modules-payment.jar
"
case "$1" in
start)
cd ${DockerDir}
if [ -z "$2" ]; then
${DockerCompose} up -d
echo $! > ${PIDFile}
else
${DockerCompose} up -d $2
fi
;;
stop)
cd ${DockerDir}
if [ -z "$2" ]; then
${DockerCompose} stop
if [ -f ${PIDFile} ]; then
rm ${PIDFile}
fi
else
${DockerCompose} stop $2
fi
;;
restart)
$0 stop $2
sleep 1
$0 start $2
;;
status)
cd ${DockerDir}
if [ -z "$2" ]; then
${DockerCompose} ps
else
${DockerCompose} ps $2
fi
;;
version)
cd ${WFCBinDir}
# java printJarVer ${Jars}
for jar in ${Jars}; do
jar_name=$(basename "$jar" .jar)
version=$(unzip -p "$jar" META-INF/MANIFEST.MF | grep 'Implementation-Version' | awk '{print $2}')
echo "$jar_name version: $version"
done
;;
*)
echo "WANFi Control and Billing System Service ... "
echo "Usage: $0 start|stop|restart|status|version"
exit 1
;;
esac
-328
View File
@@ -1,328 +0,0 @@
#!/bin/bash
wfc_work_dir=/opt/wfc
docker_work_dir=${wfc_work_dir}/docker
redis_work_dir=${docker_work_dir}/redis
src_service_dir=${wfc_work_dir}/systemd/system
dst_service_dir=/etc/systemd/system
java_work_dir=${docker_work_dir}/java
ssl_work_dir=${docker_work_dir}/nginx/ssl
base_dockers="wfc-nacos wfc-mysql wfc-redis"
jar_dockers="wfc-auth wfc-gateway wfc-modules-system wfc-modules-user wfc-modules-job wfc-modules-file wfc-modules-payment"
modules_dockers="wfc-modules-system wfc-modules-user wfc-modules-job wfc-modules-file wfc-modules-payment"
fe_docker=wfc-nginx
docker_mysql_conf_d=/etc/mysql/conf.d
docker_my_conf_file=${docker_mysql_conf_d}/my.cnf
wfc_jar_images=$(docker images --format "{{.Repository}}"|grep -E "docker-wfc-|docker_wfc-")
wfc_modules_images=$(docker images --format "{{.Repository}}"|grep -E "docker-wfc-modules-|docker_wfc-modules-")
conf_dirs=" ${docker_work_dir}/conf
${docker_work_dir}/redis/conf
${docker_work_dir}/mysql/conf.d
${docker_work_dir}/nacos/conf
${docker_work_dir}/nginx/conf
${docker_work_dir}/wfc/gateway/conf
${docker_work_dir}/wfc/auth/conf
${docker_work_dir}/wfc/modules/system/conf
${docker_work_dir}/wfc/modules/user/conf
${docker_work_dir}/wfc/modules/job/conf
${docker_work_dir}/wfc/modules/file/conf
${docker_work_dir}/wfc/modules/payment/conf
"
case "$1" in
env)
# prepare directory
mkdir -p ${docker_work_dir}/mysql/tmp
chown -R root:root ${docker_work_dir}
if [ ! -d ${redis_work_dir}/data ]; then
mkdir -p ${redis_work_dir}/data
fi
# setup system serivce
if [ -f ${src_service_dir}/wfccontrol.service ]; then
cp -rf ${src_service_dir}/wfccontrol.service ${dst_service_dir}/
systemctl daemon-reload
systemctl enable wfccontrol.service
fi
if [ ! -f ${docker_work_dir}/docker-compose.yml ]; then
cp ${docker_work_dir}/compose/docker-compose.yml ${docker_work_dir}/docker-compose.yml
fi
# 获取传入的IP地址
new_ip=$2
# env定义原始文件和临时文件
def_env_file=${docker_work_dir}/env/default.env
org_env_file=${docker_work_dir}/.env
tmp_env_file=${docker_work_dir}/temp.env
if [ ! -f ${org_env_file} ]; then
cp ${def_env_file} ${org_env_file}
fi
# copy default config files to conf directory
for conf_dir in $conf_dirs; do
if [ ! -d $conf_dir ]; then
continue
fi
if [ ! -d $conf_dir/default ]; then
continue
fi
# 遍历config default配置文件
for file in "$conf_dir/default"/*; do
filename=$(basename "$file")
# 如果conf目录下不存在相应的文件,则拷贝
if [ ! -f "$conf_dir/$filename" ]; then
cp -rf "$file" "$conf_dir/"
fi
done
done
if [ ! -z "${new_ip}" ]; then
# 使用sed命令替换IP地址
# 替换.env文件
sed "s/WFC_SERVER_IP=.*/WFC_SERVER_IP=${new_ip}/" ${org_env_file} > $tmp_env_file
mv $tmp_env_file $org_env_file
fi
# Check system timezone
if [ -f /etc/timezone ]; then
TIMEZONE=$(cat /etc/timezone)
elif [ -f /etc/localtime ]; then
TIMEZONE=$(readlink /etc/localtime | sed 's|.*/zoneinfo/||')
else
TIMEZONE="UTC"
fi
if grep -q "TZ=" ${org_env_file}; then
sed "s|TZ=.*|TZ=${TIMEZONE}|" ${org_env_file} > $tmp_env_file
mv $tmp_env_file $org_env_file
else
echo "TZ=${TIMEZONE}" >> ${org_env_file}
fi
# replace nginx.conf gateway server ip and port
while IFS= read -r line; do
if [[ ! $line =~ ^# && $line =~ .*=.* ]]; then
eval "export $line"
fi
done < $org_env_file
# 生成ssl证书
# openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout ${ssl_work_dir}/server.key -out ${ssl_work_dir}/server.crt -config ${ssl_work_dir}/req.cnf -sha256
# nginx定义原始文件和临时文件
org_nginx_conf=${docker_work_dir}/nginx/conf/nginx.conf
tmp_intermediate_conf=${docker_work_dir}/nginx/conf/tmp_intermediate.conf
tmp_nginx_conf=${docker_work_dir}/nginx/conf/tmp_nginx.conf
# 使用sed命令替换proxy_pass行中的IP地址
# Define intermediate temporary nginx configuration file
# Replace the proxy_pass line with the correct GATEWAY_SERVER_IP and GATEWAY_SERVER_PORT
sed "s|proxy_pass http://.*:8080/;|proxy_pass http://${GATEWAY_SERVER_IP}:${GATEWAY_SERVER_PORT}/;|" $org_nginx_conf > $tmp_intermediate_conf
# Replace the IP address and port for the file server in the nginx configuration
sed "s|proxy_pass http://.*:9201/;|proxy_pass http://${GATEWAY_SERVER_IP}:${WFC_FILE_PORT}/;|" $tmp_intermediate_conf > $tmp_nginx_conf
# Remove the intermediate temporary file and move the final configuration
rm $tmp_intermediate_conf
mv $tmp_nginx_conf $org_nginx_conf
# 统一替换系统名
nginx_html_u_zh=${docker_work_dir}/nginx/html/dist/u/langs/zh-cn.js
nginx_html_u_en=${docker_work_dir}/nginx/html/dist/u/langs/en-us.js
nginx_html_sys_zh=${docker_work_dir}/nginx/html/dist/sys/langs/zh-cn.js
nginx_html_sys_en=${docker_work_dir}/nginx/html/dist/sys/langs/en-us.js
sed -i "3s|title: '.*'|title: '${SYSTEM_TITLE}'|" $nginx_html_u_zh
sed -i "3s|title: '.*'|title: '${SYSTEM_TITLE}'|" $nginx_html_u_en
sed -i "3s|title: '.*'|title: '${SYSTEM_TITLE}'|" $nginx_html_sys_zh
sed -i "3s|title: '.*'|title: '${SYSTEM_TITLE}'|" $nginx_html_sys_en
# chown and chmod for all docker work directory
if [ -d ${docker_work_dir}/mysql/data ]; then
chown -R 999:999 ${docker_work_dir}/mysql/data
fi
find ${docker_work_dir} -type d -exec chmod 775 {} \;
find ${docker_work_dir} -type f -exec chmod 664 {} \;
chown root:root ${docker_work_dir}/mysql/conf.d/my.cnf
chmod 600 ${docker_work_dir}/mysql/conf.d/my.cnf
chmod 1777 ${docker_work_dir}/mysql/tmp
;;
initdb)
# init database
cd ${docker_work_dir}
docker-compose up -d wfc-mysql
sleep 10
for sql in ${docker_work_dir}/mysql/db/*.sql; do
if [ -f "$sql" ]; then
echo -n "Execute SQL script: ${sql} ... "
docker exec -i wfc-mysql mysql --defaults-extra-file=${docker_my_conf_file} < ${sql}
if [ $? = 0 ]; then
echo "done"
fi
else
echo "No SQL files found in ${docker_work_dir}/mysql/db/"
fi
done
;;
upgdb)
mysql_container_name=wfc-mysql
# upgrade database
cd ${docker_work_dir}
docker-compose up -d ${mysql_container_name}
sleep 10
# 获取 MySQL 容器的 IP 地址和端口
mysql_container_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${mysql_container_name})
mysql_container_port=$(docker inspect -f '{{(index (index .NetworkSettings.Ports "3306/tcp") 0).HostPort}}' ${mysql_container_name})
# 在容器内生成 my.cnf 文件
docker exec ${mysql_container_name} bash -c "cat <<EOF > ${docker_my_conf_file}
[client]
user=root
password=\${MYSQL_ROOT_PASSWORD}
host=wfc-mysql
port=${mysql_container_port}
EOF"
# 检查容器健康状态
timeout=60
interval=2
elapsed=0
while [ $elapsed -lt $timeout ]; do
health_status=$(docker inspect --format='{{.State.Health.Status}}' $mysql_container_name)
if [ "$health_status" == "healthy" ]; then
echo "Container $mysql_container_name is healthy"
echo "Executing database upgrade scripts ..."
${wfc_work_dir}/bin/wfcupgrade.sh
exit 0
fi
sleep $interval
elapsed=$((elapsed + interval))
done
echo "Container $mysql_container_name is not healthy after $timeout seconds, please check the container status."
;;
base)
# build docker compose
cd ${docker_work_dir}
docker-compose stop ${base_dockers}
docker-compose build ${base_dockers}
cd ${java_work_dir}
if [[ "$(docker images -q wfc-java:jre8 2> /dev/null)" == "" ]]; then
echo "Building wfc-java:jre8"
docker build -t wfc-java:jre8 -f dockerfile .
fi
;;
jar)
# build docker compose
cd ${docker_work_dir}
docker-compose stop ${jar_dockers}
docker-compose build ${jar_dockers}
;;
modules)
# build docker compose
cd ${docker_work_dir}
docker-compose stop ${modules_dockers}
docker-compose build ${modules_dockers}
;;
fe)
# build docker compose
cd ${docker_work_dir}
docker-compose stop ${fe_docker}
docker-compose build ${fe_docker}
;;
all)
$0 env $2
$0 base
$0 jar
$0 fe
$0 upgdb
;;
rm)
case "$2" in
base)
cd ${docker_work_dir}
docker-compose stop ${base_dockers}
for base_docker in ${base_dockers}; do
docker rm ${base_docker}
done
;;
jar)
cd ${docker_work_dir}
docker-compose stop ${jar_dockers}
docker rm ${jar_dockers}
if [ ! -z "${wfc_jar_images}" ]; then
docker rmi ${wfc_jar_images}
fi
# for jar_docker in ${jar_dockers}; do
# docker rm ${jar_docker}
# docker rmi docker_${jar_docker}
# done
;;
modules)
cd ${docker_work_dir}
docker-compose stop ${modules_dockers}
docker rm ${modules_dockers}
if [ ! -z "${wfc_modules_images}" ]; then
docker rmi ${wfc_modules_images}
fi
# for modules_docker in ${modules_dockers}; do
# docker rm ${modules_docker}
# docker rmi docker_${modules_docker}
# docker rmi docker-${modules_docker}
# done
;;
fe)
cd ${docker_work_dir}
docker-compose stop ${fe_docker}
docker rm ${fe_docker}
# docker rmi nginx
;;
network)
cd ${docker_work_dir}
docker-compose stop
docker network rm wfc-fe-network
docker network rm wfc-be-network
;;
all)
$0 rm base
$0 rm jar
$0 rm fe
$0 rm network
;;
*)
echo "WANFi Control and Billing System Setup ... "
echo "Usage: $0 rm [base|jar|modules|fe|network|all]"
exit 1
;;
esac
;;
prune)
cd ${docker_work_dir}
docker-compose down
docker system prune -a
;;
*)
echo "WANFi Control and Billing System Setup ... "
echo "Usage: $0 env|initdb|upgdb|base|jar|modules|fe|all|rm [base|jar|modules|fe|network|all]|prune"
echo " $0 env [IP]"
echo " $0 initdb"
echo " $0 upgdb"
echo " $0 base|jar|modules|fe"
echo " $0 all [IP]"
echo " $0 rm [base|jar|modules|fe|network|all]"
echo " $0 prune"
exit 1
;;
esac
-43
View File
@@ -1,43 +0,0 @@
#!/bin/bash
wfc_work_dir=/opt/wfc
docker_work_dir=${wfc_work_dir}/docker
mysql_sql_dir=${docker_work_dir}/mysql/db
docker_mysql_conf_d=/etc/mysql/conf.d
docker_my_conf_file=${docker_mysql_conf_d}/my.cnf
mysql_container_name=wfc-mysql
execute_sql_scripts() {
version=$1
cd ${mysql_sql_dir}
for sql in ./upgrade/${version}/*.sql; do
if [ -f "$sql" ]; then
echo -n "Execute SQL script: ${sql} ... "
docker exec -i ${mysql_container_name} mysql --defaults-extra-file=${docker_my_conf_file} < ${sql}
if [ $? = 0 ]; then
echo "done"
fi
else
echo "No SQL files found in ./upgrade/${version}/"
fi
done
}
if [ -z "$1" ]; then
# No parameter, traverse all subdirectories in upgrade directory
for dir in ${mysql_sql_dir}/upgrade/*; do
if [ -d "$dir" ]; then
version=$(basename $dir)
echo "Executing upgrade for version $version"
execute_sql_scripts $version
fi
done
else
# Parameter provided, execute for the specific version or database name
ver_or_dbname=$1
if [ ! -d ${mysql_sql_dir}/upgrade/${ver_or_dbname} ]; then
echo "No upgrade scripts found for ${ver_or_dbname}"
exit 1
fi
execute_sql_scripts $ver_or_dbname
fi
-36
View File
@@ -1,36 +0,0 @@
#!/bin/bash
wfc_work_dir=/opt/wfc
docker_work_dir=${wfc_work_dir}/docker
# Get the new version number
new_version=$(grep '^VERSION_ID=' ${docker_work_dir}/env/wfc-release | cut -d'=' -f2 | tr -d '"')
# Get the original version number
if [ -f ${docker_work_dir}/.wfc-release ]; then
old_version=$(grep '^VERSION_ID=' ${docker_work_dir}/.wfc-release | cut -d'=' -f2 | tr -d '"')
else
old_version=$new_version
fi
# Convert the version number to a comparable format
version_to_number() {
echo "$1" | awk -F. '{ printf("%d%03d%03d\n", $1,$2,$3); }'
}
new_version_num=$(version_to_number $new_version)
old_version_num=$(version_to_number $old_version)
# Find and execute all version directories higher than the original version number
for dir in ${docker_work_dir}/mysql/db/upgrade/*; do
version=$(basename $dir)
version_num=$(version_to_number $version)
if [ $version_num -gt $old_version_num ] && [ $version_num -le $new_version_num ]; then
echo "Executing upgrade for version $version"
${wfc_work_dir}/bin/wfcupgdb.sh $version
fi
done
# Update the version number
cp -f ${docker_work_dir}/env/wfc-release ${docker_work_dir}/.wfc-release
echo "Upgrade complete"
-27
View File
@@ -1,27 +0,0 @@
WFC_CONFIG_DATABASE=wfc_config_db
WFC_SYSTEM_DATABASE=wfc_system_db
WFC_USER_DATABASE=wfc_user_db
MYSQL_SERVICE_NAME=wfc-mysql
MYSQL_SERVICE_PORT=3306
MYSQL_ROOT_PASSWORD=123456
MYSQL_SERVICE_USER=root
MYSQL_SERVICE_PASSWORD=123456
REDIS_PORT=6379
NACOS_PROFILE_NAME=prod
NACOS_NAME_SPACE=wfc-prod
NACOS_SERVER_NAME=wfc-nacos
WFC_SERVER_PORT=80
WFC_SERVER_HTTPS_PORT=443
NACOS_SERVER_PORT=8848
GATEWAY_SERVER_PORT=8080
AUTH_SERVER_PORT=8081
WFC_FILE_PORT=9201
WFC_JOB_PORT=9203
WFC_PAYMENT_PORT=9204
WFC_SYSTEM_PORT=9205
WFC_USER_PORT=9206
WFC_SERVER_IP=192.168.2.116
NACOS_SERVER_IP=${WFC_SERVER_IP}
GATEWAY_SERVER_IP=${WFC_SERVER_IP}
RESTART_OPTION=on-failure:5
SYSTEM_TITLE=MacroHub
@@ -1,393 +0,0 @@
services:
wfc-mysql:
image: mysql:5.7
container_name: ${MYSQL_SERVICE_NAME}
build:
context: ./mysql
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- TZ=${TZ}
ports:
- "${MYSQL_SERVICE_PORT}:${MYSQL_SERVICE_PORT}"
networks:
- wfc-be-network
volumes:
- ./mysql/db:/docker-entrypoint-initdb.d
- ./mysql/conf.d:/etc/mysql/conf.d
- ./mysql/logs:/opt/wfc/mysql/logs
- ./mysql/data:/var/lib/mysql
- ./mysql/tmp:/tmp
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -u root -p'${MYSQL_ROOT_PASSWORD}'"]
interval: 10s
timeout: 10s
retries: 5
restart: ${RESTART_OPTION}
wfc-redis:
image: redis:7.4.2
container_name: wfc-redis
build:
context: ./redis
environment:
- TZ=${TZ}
ports:
- "${REDIS_PORT}:${REDIS_PORT}"
networks:
- wfc-be-network
volumes:
- ./redis/conf/redis.conf:/opt/wfc/redis/redis.conf
- ./redis/data:/opt/wfc/redis/data
command: redis-server /opt/wfc/redis/redis.conf
healthcheck:
test: ["CMD-SHELL", "redis-cli ping"]
interval: 10s
timeout: 5s
retries: 5
restart: ${RESTART_OPTION}
wfc-nacos:
image: nacos/nacos-server:v2.5.0
container_name: ${NACOS_SERVER_NAME}
build:
context: ./nacos
environment:
- MODE=standalone
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=${MYSQL_SERVICE_NAME}
- MYSQL_SERVICE_DB_NAME=${WFC_CONFIG_DATABASE}
- MYSQL_SERVICE_PORT=${MYSQL_SERVICE_PORT}
- MYSQL_SERVICE_USER=${MYSQL_SERVICE_USER}
- MYSQL_SERVICE_PASSWORD=${MYSQL_SERVICE_PASSWORD}
- NACOS_PROFILE_NAME=${NACOS_PROFILE_NAME}
- NACOS_NAME_SPACE=${NACOS_NAME_SPACE}
- NACOS_SERVER_NAME=${NACOS_SERVER_NAME}
- NACOS_SERVER_IP=${NACOS_SERVER_IP}
- NACOS_SERVER_PORT=${NACOS_SERVER_PORT}
- SPRING_CONFIG_ADDITIONAL_LOCATION=optional:classpath:/,optional:file:/home/nacos/conf/
- TZ=${TZ}
volumes:
- ./nacos/logs/:/home/nacos/logs
- ./nacos/conf/application.properties:/home/nacos/conf/application.properties
ports:
- "${NACOS_SERVER_PORT}:${NACOS_SERVER_PORT}"
networks:
- wfc-be-network
depends_on:
wfc-redis:
condition: service_healthy
wfc-mysql:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "curl -f http://${NACOS_SERVER_IP}:${NACOS_SERVER_PORT}/nacos/v1/console/health/liveness || exit 1"]
interval: 30s
timeout: 10s
retries: 5
restart: ${RESTART_OPTION}
wfc-gateway:
image: wfc-java:jre8
container_name: wfc-gateway
ports:
- "${GATEWAY_SERVER_PORT}:${GATEWAY_SERVER_PORT}"
networks:
- wfc-be-network
volumes:
- ./wfc/gateway/jar/wfc-gateway.jar:/opt/wfc/app.jar
- ./conf/application-common.yml:/opt/wfc/conf/application-common.yml
- ./conf/i18n/:/opt/wfc/conf/i18n
- ./wfc/gateway/conf/application.yml:/opt/wfc/conf/application.yml
depends_on:
wfc-redis:
condition: service_healthy
wfc-mysql:
condition: service_healthy
wfc-nacos:
condition: service_healthy
environment:
- NACOS_PROFILE_NAME=${NACOS_PROFILE_NAME}
- NACOS_NAME_SPACE=${NACOS_NAME_SPACE}
- NACOS_SERVER_NAME=${NACOS_SERVER_NAME}
- NACOS_SERVER_IP=${NACOS_SERVER_IP}
- NACOS_SERVER_PORT=${NACOS_SERVER_PORT}
- GATEWAY_SERVER_PORT=${GATEWAY_SERVER_PORT}
- SPRING_CONFIG_ADDITIONAL_LOCATION=optional:classpath:/,optional:file:/opt/wfc/conf/
- TZ=${TZ}
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:${GATEWAY_SERVER_PORT}/actuator/health || exit 1"]
interval: 30s
timeout: 10s
retries: 10
restart: ${RESTART_OPTION}
wfc-auth:
image: wfc-java:jre8
container_name: wfc-auth
ports:
- "${AUTH_SERVER_PORT}:${AUTH_SERVER_PORT}"
networks:
- wfc-be-network
volumes:
- ./wfc/auth/jar/wfc-auth.jar:/opt/wfc/app.jar
- ./conf/application-common.yml:/opt/wfc/conf/application-common.yml
- ./conf/i18n/:/opt/wfc/conf/i18n
- ./wfc/auth/conf/application.yml:/opt/wfc/conf/application.yml
depends_on:
wfc-redis:
condition: service_healthy
wfc-mysql:
condition: service_healthy
wfc-nacos:
condition: service_healthy
wfc-gateway:
condition: service_healthy
environment:
- NACOS_PROFILE_NAME=${NACOS_PROFILE_NAME}
- NACOS_NAME_SPACE=${NACOS_NAME_SPACE}
- NACOS_SERVER_NAME=${NACOS_SERVER_NAME}
- NACOS_SERVER_IP=${NACOS_SERVER_IP}
- NACOS_SERVER_PORT=${NACOS_SERVER_PORT}
- AUTH_SERVER_PORT=${AUTH_SERVER_PORT}
- SPRING_CONFIG_ADDITIONAL_LOCATION=optional:classpath:/,optional:file:/opt/wfc/conf/
- TZ=${TZ}
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:${AUTH_SERVER_PORT}/actuator/health || exit 1"]
interval: 30s
timeout: 10s
retries: 10
restart: ${RESTART_OPTION}
wfc-modules-system:
image: wfc-java:jre8
container_name: wfc-modules-system
ports:
- "${WFC_SYSTEM_PORT}:${WFC_SYSTEM_PORT}"
- "5005:5005" # 调试端口映射
networks:
- wfc-be-network
volumes:
- ./wfc/modules/system/jar/wfc-modules-system.jar:/opt/wfc/app.jar
- ./conf/application-common.yml:/opt/wfc/conf/application-common.yml
- ./conf/i18n/:/opt/wfc/conf/i18n
- ./wfc/modules/system/conf/application.yml:/opt/wfc/conf/application.yml
depends_on:
wfc-redis:
condition: service_healthy
wfc-mysql:
condition: service_healthy
wfc-auth:
condition: service_healthy
wfc-gateway:
condition: service_healthy
environment:
- NACOS_PROFILE_NAME=${NACOS_PROFILE_NAME}
- NACOS_NAME_SPACE=${NACOS_NAME_SPACE}
- NACOS_SERVER_NAME=${NACOS_SERVER_NAME}
- NACOS_SERVER_IP=${NACOS_SERVER_IP}
- NACOS_SERVER_PORT=${NACOS_SERVER_PORT}
- WFC_SYSTEM_PORT=${WFC_SYSTEM_PORT}
- SPRING_CONFIG_ADDITIONAL_LOCATION=optional:classpath:/,optional:file:/opt/wfc/conf/
- JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005 # 调试参数
- TZ=${TZ}
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:${WFC_SYSTEM_PORT}/actuator/health || exit 1"]
interval: 30s
timeout: 10s
retries: 6
restart: ${RESTART_OPTION}
wfc-modules-user:
image: wfc-java:jre8
container_name: wfc-modules-user
ports:
- "${WFC_USER_PORT}:${WFC_USER_PORT}"
- "5006:5006" # 调试端口映射
networks:
- wfc-be-network
volumes:
- ./wfc/modules/user/jar/wfc-modules-user.jar:/opt/wfc/app.jar
- ./conf/application-common.yml:/opt/wfc/conf/application-common.yml
- ./conf/i18n/:/opt/wfc/conf/i18n
- ./wfc/modules/user/conf/application.yml:/opt/wfc/conf/application.yml
depends_on:
wfc-redis:
condition: service_healthy
wfc-mysql:
condition: service_healthy
wfc-auth:
condition: service_healthy
wfc-gateway:
condition: service_healthy
environment:
- NACOS_PROFILE_NAME=${NACOS_PROFILE_NAME}
- NACOS_NAME_SPACE=${NACOS_NAME_SPACE}
- NACOS_SERVER_NAME=${NACOS_SERVER_NAME}
- NACOS_SERVER_IP=${NACOS_SERVER_IP}
- NACOS_SERVER_PORT=${NACOS_SERVER_PORT}
- WFC_USER_PORT=${WFC_USER_PORT}
- SPRING_CONFIG_ADDITIONAL_LOCATION=optional:classpath:/,optional:file:/opt/wfc/conf/
- JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5006 # 调试参数
- TZ=${TZ}
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:${WFC_USER_PORT}/actuator/health || exit 1"]
interval: 30s
timeout: 10s
retries: 6
restart: ${RESTART_OPTION}
wfc-modules-file:
image: wfc-java:jre8
container_name: wfc-modules-file
ports:
- "${WFC_FILE_PORT}:${WFC_FILE_PORT}"
networks:
- wfc-be-network
volumes:
- ./wfc/modules/file/jar/wfc-modules-file.jar:/opt/wfc/app.jar
- ./wfc/modules/file/upload:/opt/wfc/upload
- ./wfc/modules/file/logs/:/opt/wfc/logs/
- ./conf/application-common.yml:/opt/wfc/conf/application-common.yml
- ./conf/i18n/:/opt/wfc/conf/i18n
- ./wfc/modules/file/conf/application.yml:/opt/wfc/conf/application.yml
depends_on:
wfc-auth:
condition: service_healthy
wfc-gateway:
condition: service_healthy
environment:
- NACOS_PROFILE_NAME=${NACOS_PROFILE_NAME}
- NACOS_NAME_SPACE=${NACOS_NAME_SPACE}
- NACOS_SERVER_NAME=${NACOS_SERVER_NAME}
- NACOS_SERVER_IP=${NACOS_SERVER_IP}
- NACOS_SERVER_PORT=${NACOS_SERVER_PORT}
- WFC_FILE_PORT=${WFC_FILE_PORT}
- SPRING_CONFIG_ADDITIONAL_LOCATION=optional:classpath:/,optional:file:/opt/wfc/conf/
- TZ=${TZ}
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:${WFC_FILE_PORT}/actuator/health || exit 1"]
interval: 30s
timeout: 10s
retries: 6
restart: ${RESTART_OPTION}
wfc-modules-job:
image: wfc-java:jre8
container_name: wfc-modules-job
ports:
- "${WFC_JOB_PORT}:${WFC_JOB_PORT}"
networks:
- wfc-be-network
volumes:
- ./wfc/modules/job/jar/wfc-modules-job.jar:/opt/wfc/app.jar
- ./conf/application-common.yml:/opt/wfc/conf/application-common.yml
- ./conf/i18n/:/opt/wfc/conf/i18n
- ./wfc/modules/job/conf/application.yml:/opt/wfc/conf/application.yml
depends_on:
wfc-mysql:
condition: service_healthy
wfc-auth:
condition: service_healthy
wfc-gateway:
condition: service_healthy
environment:
- NACOS_PROFILE_NAME=${NACOS_PROFILE_NAME}
- NACOS_NAME_SPACE=${NACOS_NAME_SPACE}
- NACOS_SERVER_NAME=${NACOS_SERVER_NAME}
- NACOS_SERVER_IP=${NACOS_SERVER_IP}
- NACOS_SERVER_PORT=${NACOS_SERVER_PORT}
- WFC_JOB_PORT=${WFC_JOB_PORT}
- SPRING_CONFIG_ADDITIONAL_LOCATION=optional:classpath:/,optional:file:/opt/wfc/conf/
- TZ=${TZ}
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:${WFC_JOB_PORT}/actuator/health || exit 1"]
interval: 30s
timeout: 10s
retries: 6
restart: ${RESTART_OPTION}
wfc-modules-payment:
image: wfc-java:jre8
container_name: wfc-modules-payment
ports:
- "${WFC_PAYMENT_PORT}:${WFC_PAYMENT_PORT}"
networks:
- wfc-be-network
volumes:
- ./wfc/modules/payment/jar/wfc-modules-payment.jar:/opt/wfc/app.jar
- ./wfc/modules/payment/logs/:/opt/wfc/logs/
- ./conf/application-common.yml:/opt/wfc/conf/application-common.yml
- ./conf/i18n/:/opt/wfc/conf/i18n
- ./wfc/modules/payment/conf/application.yml:/opt/wfc/conf/application.yml
depends_on:
wfc-redis:
condition: service_healthy
wfc-mysql:
condition: service_healthy
wfc-auth:
condition: service_healthy
wfc-gateway:
condition: service_healthy
environment:
- NACOS_PROFILE_NAME=${NACOS_PROFILE_NAME}
- NACOS_NAME_SPACE=${NACOS_NAME_SPACE}
- NACOS_SERVER_NAME=${NACOS_SERVER_NAME}
- NACOS_SERVER_IP=${NACOS_SERVER_IP}
- NACOS_SERVER_PORT=${NACOS_SERVER_PORT}
- WFC_PAYMENT_PORT=${WFC_PAYMENT_PORT}
- SPRING_CONFIG_ADDITIONAL_LOCATION=optional:classpath:/,optional:file:/opt/wfc/conf/
- TZ=${TZ}
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:${WFC_PAYMENT_PORT}/actuator/health || exit 1"]
interval: 30s
timeout: 10s
retries: 6
restart: ${RESTART_OPTION}
wfc-nginx:
image: nginx:1.27.4
container_name: wfc-nginx
build:
context: ./nginx
ports:
- "${WFC_SERVER_PORT}:${WFC_SERVER_PORT}"
networks:
- wfc-fe-network
- wfc-be-network
volumes:
- ./wfc/modules/file/upload:/opt/wfc/file/upload
- ./nginx/html/dist:/opt/wfc/portal
- ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/logs:/var/log/nginx
- ./nginx/conf.d:/etc/nginx/conf.d
depends_on:
wfc-modules-system:
condition: service_healthy
wfc-modules-user:
condition: service_healthy
environment:
- GATEWAY_SERVER_IP=${GATEWAY_SERVER_IP}
- GATEWAY_SERVER_PORT=${GATEWAY_SERVER_PORT}
- WFC_SERVER_IP=${WFC_SERVER_IP}
- WFC_SERVER_PORT=${WFC_SERVER_PORT}
- TZ=${TZ}
healthcheck:
test:
- "CMD-SHELL"
- >
curl -f http://localhost:${WFC_SERVER_PORT}/sys &&
curl -f http://localhost:${WFC_SERVER_PORT}/u ||
exit 1
interval: 30s
timeout: 5s
retries: 6
restart: ${RESTART_OPTION}
networks:
wfc-fe-network:
name: wfc-fe-network
driver: bridge
wfc-be-network:
name: wfc-be-network
driver: bridge
ipam:
driver: default
@@ -1,67 +0,0 @@
services:
omada-controller:
container_name: omada-controller
image: mbentley/omada-controller:5.15
restart: unless-stopped
ulimits:
nofile:
soft: 4096
hard: 8192
stop_grace_period: 60s
network_mode: bridge
environment:
- PUID=508
- PGID=508
- MANAGE_HTTP_PORT=8088
- MANAGE_HTTPS_PORT=8043
- PORTAL_HTTP_PORT=8088
- PORTAL_HTTPS_PORT=8843
- PORT_APP_DISCOVERY=27001
- PORT_ADOPT_V1=29812
- PORT_UPGRADE_V1=29813
- PORT_MANAGER_V1=29811
- PORT_MANAGER_V2=29814
- PORT_DISCOVERY=29810
- PORT_TRANSFER_V2=29815
- PORT_RTTY=29816
- SHOW_SERVER_LOGS=true
- SHOW_MONGODB_LOGS=false
- SSL_CERT_NAME=tls.crt
- SSL_KEY_NAME=tls.key
- TZ=Etc/UTC
volumes:
- omada-data:/opt/tplink/EAPController/data
- omada-logs:/opt/tplink/EAPController/logs
ports:
- 8088:8088
- 8043:8043
- 8843:8843
- 19810:19810/udp
- 29810:29810/udp
- 29811:29811
- 29812:29812
- 29813:29813
- 29814:29814
- 29815:29815
- 29816:29816
healthcheck:
test: ["CMD-SHELL", "wget --quiet --tries=1 --no-check-certificate -O /dev/null --server-response --timeout=5 'https://127.0.0.1:${MANAGE_HTTPS_PORT:-8043}/login' || exit 1"]
interval: 30s
timeout: 10s
retries: 5
volumes:
omada-data:
name: omada-data
driver: local
driver_opts:
type: none
device: /opt/tplink/EAPController/data
o: bind
omada-logs:
name: omada-logs
driver: local
driver_opts:
type: none
device: /opt/tplink/EAPController/logs
o: bind
-404
View File
@@ -1,404 +0,0 @@
services:
wfc-mysql:
image: mysql:5.7
container_name: ${MYSQL_SERVICE_NAME}
build:
context: ./mysql
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- TZ=${TZ}
ports:
- "${MYSQL_SERVICE_PORT}:${MYSQL_SERVICE_PORT}"
networks:
- wfc-be-network
volumes:
- ./mysql/db:/docker-entrypoint-initdb.d
- ./mysql/conf.d:/etc/mysql/conf.d
- ./mysql/logs:/opt/wfc/mysql/logs
- ./mysql/data:/var/lib/mysql
- ./mysql/tmp:/tmp
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -u root -p'${MYSQL_ROOT_PASSWORD}'"]
interval: 10s
timeout: 10s
retries: 5
restart: ${RESTART_OPTION}
wfc-redis:
image: redis:7.4.2
container_name: wfc-redis
build:
context: ./redis
environment:
- TZ=${TZ}
ports:
- "${REDIS_PORT}:${REDIS_PORT}"
networks:
- wfc-be-network
volumes:
- ./redis/conf/redis.conf:/opt/wfc/redis/redis.conf
- ./redis/data:/opt/wfc/redis/data
command: redis-server /opt/wfc/redis/redis.conf
healthcheck:
test: ["CMD-SHELL", "redis-cli ping"]
interval: 10s
timeout: 5s
retries: 5
restart: ${RESTART_OPTION}
wfc-nacos:
image: nacos/nacos-server:v2.5.0
container_name: ${NACOS_SERVER_NAME}
build:
context: ./nacos
environment:
- MODE=standalone
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=${MYSQL_SERVICE_NAME}
- MYSQL_SERVICE_DB_NAME=${WFC_CONFIG_DATABASE}
- MYSQL_SERVICE_PORT=${MYSQL_SERVICE_PORT}
- MYSQL_SERVICE_USER=${MYSQL_SERVICE_USER}
- MYSQL_SERVICE_PASSWORD=${MYSQL_SERVICE_PASSWORD}
- NACOS_PROFILE_NAME=${NACOS_PROFILE_NAME}
- NACOS_NAME_SPACE=${NACOS_NAME_SPACE}
- NACOS_SERVER_NAME=${NACOS_SERVER_NAME}
- NACOS_SERVER_IP=${NACOS_SERVER_IP}
- NACOS_SERVER_PORT=${NACOS_SERVER_PORT}
- SPRING_CONFIG_ADDITIONAL_LOCATION=optional:classpath:/,optional:file:/home/nacos/conf/
- TZ=${TZ}
volumes:
- ./nacos/logs/:/home/nacos/logs
- ./nacos/conf/application.properties:/home/nacos/conf/application.properties
ports:
- "${NACOS_SERVER_PORT}:${NACOS_SERVER_PORT}"
networks:
- wfc-be-network
depends_on:
wfc-redis:
condition: service_healthy
wfc-mysql:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "curl -f http://${NACOS_SERVER_IP}:${NACOS_SERVER_PORT}/nacos/v1/console/health/liveness || exit 1"]
interval: 30s
timeout: 10s
retries: 5
restart: ${RESTART_OPTION}
wfc-gateway:
build:
context: ./wfc/gateway
container_name: wfc-gateway
ports:
- "${GATEWAY_SERVER_PORT}:${GATEWAY_SERVER_PORT}"
networks:
- wfc-be-network
privileged: true
volumes:
- ./wfc/gateway/jar/wfc-gateway.jar:/opt/wfc/app.jar
- ./conf/application-common.yml:/opt/wfc/conf/application-common.yml
- ./wfc/gateway/logs/:/opt/wfc/logs/
- ./conf/i18n/:/opt/wfc/conf/i18n
- /var/lib/pro/etc/server:/var/lib/pro/etc/server
- ./wfc/gateway/conf/application.yml:/opt/wfc/conf/application.yml
- ./conf/license:/opt/wfc/license
- /sbin/dmidecode:/sbin/dmidecode
- /dev/mem:/dev/mem
depends_on:
wfc-redis:
condition: service_healthy
wfc-mysql:
condition: service_healthy
wfc-nacos:
condition: service_healthy
environment:
- NACOS_PROFILE_NAME=${NACOS_PROFILE_NAME}
- NACOS_NAME_SPACE=${NACOS_NAME_SPACE}
- NACOS_SERVER_NAME=${NACOS_SERVER_NAME}
- NACOS_SERVER_IP=${NACOS_SERVER_IP}
- NACOS_SERVER_PORT=${NACOS_SERVER_PORT}
- GATEWAY_SERVER_PORT=${GATEWAY_SERVER_PORT}
- SPRING_CONFIG_ADDITIONAL_LOCATION=optional:classpath:/,optional:file:/opt/wfc/conf/
- TZ=${TZ}
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:${GATEWAY_SERVER_PORT}/actuator/health || exit 1"]
interval: 30s
timeout: 10s
retries: 10
restart: ${RESTART_OPTION}
wfc-auth:
image: wfc-java:jre8
container_name: wfc-auth
ports:
- "${AUTH_SERVER_PORT}:${AUTH_SERVER_PORT}"
networks:
- wfc-be-network
volumes:
- ./wfc/auth/jar/wfc-auth.jar:/opt/wfc/app.jar
- ./conf/application-common.yml:/opt/wfc/conf/application-common.yml
- ./wfc/auth/logs/:/opt/wfc/logs/
- ./conf/i18n/:/opt/wfc/conf/i18n
- ./wfc/auth/conf/application.yml:/opt/wfc/conf/application.yml
depends_on:
wfc-redis:
condition: service_healthy
wfc-mysql:
condition: service_healthy
wfc-nacos:
condition: service_healthy
wfc-gateway:
condition: service_healthy
environment:
- NACOS_PROFILE_NAME=${NACOS_PROFILE_NAME}
- NACOS_NAME_SPACE=${NACOS_NAME_SPACE}
- NACOS_SERVER_NAME=${NACOS_SERVER_NAME}
- NACOS_SERVER_IP=${NACOS_SERVER_IP}
- NACOS_SERVER_PORT=${NACOS_SERVER_PORT}
- AUTH_SERVER_PORT=${AUTH_SERVER_PORT}
- SPRING_CONFIG_ADDITIONAL_LOCATION=optional:classpath:/,optional:file:/opt/wfc/conf/
- TZ=${TZ}
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:${AUTH_SERVER_PORT}/actuator/health || exit 1"]
interval: 30s
timeout: 10s
retries: 10
restart: ${RESTART_OPTION}
wfc-modules-system:
image: wfc-java:jre8
container_name: wfc-modules-system
ports:
- "${WFC_SYSTEM_PORT}:${WFC_SYSTEM_PORT}"
networks:
- wfc-be-network
volumes:
- ./wfc/modules/system/jar/wfc-modules-system.jar:/opt/wfc/app.jar
- ./conf/application-common.yml:/opt/wfc/conf/application-common.yml
- ./wfc/modules/system/logs/:/opt/wfc/logs/
- ./conf/i18n/:/opt/wfc/conf/i18n
- ./wfc/modules/system/conf/application.yml:/opt/wfc/conf/application.yml
- ./conf/templates/system:/opt/wfc/templates
depends_on:
wfc-redis:
condition: service_healthy
wfc-mysql:
condition: service_healthy
wfc-auth:
condition: service_healthy
wfc-gateway:
condition: service_healthy
environment:
- NACOS_PROFILE_NAME=${NACOS_PROFILE_NAME}
- NACOS_NAME_SPACE=${NACOS_NAME_SPACE}
- NACOS_SERVER_NAME=${NACOS_SERVER_NAME}
- NACOS_SERVER_IP=${NACOS_SERVER_IP}
- NACOS_SERVER_PORT=${NACOS_SERVER_PORT}
- WFC_SYSTEM_PORT=${WFC_SYSTEM_PORT}
- SPRING_CONFIG_ADDITIONAL_LOCATION=optional:classpath:/,optional:file:/opt/wfc/conf/
- TZ=${TZ}
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:${WFC_SYSTEM_PORT}/actuator/health || exit 1"]
interval: 30s
timeout: 10s
retries: 6
restart: ${RESTART_OPTION}
wfc-modules-user:
image: wfc-java:jre8
container_name: wfc-modules-user
ports:
- "${WFC_USER_PORT}:${WFC_USER_PORT}"
networks:
- wfc-be-network
volumes:
- ./wfc/modules/user/jar/wfc-modules-user.jar:/opt/wfc/app.jar
- ./conf/application-common.yml:/opt/wfc/conf/application-common.yml
- ./wfc/modules/user/logs/:/opt/wfc/logs/
- ./conf/i18n/:/opt/wfc/conf/i18n
- ./wfc/modules/user/conf/application.yml:/opt/wfc/conf/application.yml
- ./conf/templates/user:/opt/wfc/templates
depends_on:
wfc-redis:
condition: service_healthy
wfc-mysql:
condition: service_healthy
wfc-auth:
condition: service_healthy
wfc-gateway:
condition: service_healthy
environment:
- NACOS_PROFILE_NAME=${NACOS_PROFILE_NAME}
- NACOS_NAME_SPACE=${NACOS_NAME_SPACE}
- NACOS_SERVER_NAME=${NACOS_SERVER_NAME}
- NACOS_SERVER_IP=${NACOS_SERVER_IP}
- NACOS_SERVER_PORT=${NACOS_SERVER_PORT}
- WFC_USER_PORT=${WFC_USER_PORT}
- SPRING_CONFIG_ADDITIONAL_LOCATION=optional:classpath:/,optional:file:/opt/wfc/conf/
- TZ=${TZ}
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:${WFC_USER_PORT}/actuator/health || exit 1"]
interval: 30s
timeout: 10s
retries: 6
restart: ${RESTART_OPTION}
wfc-modules-file:
image: wfc-java:jre8
container_name: wfc-modules-file
ports:
- "${WFC_FILE_PORT}:${WFC_FILE_PORT}"
networks:
- wfc-be-network
volumes:
- ./wfc/modules/file/jar/wfc-modules-file.jar:/opt/wfc/app.jar
- ./wfc/modules/file/upload:/opt/wfc/upload
- ./wfc/modules/file/logs/:/opt/wfc/logs/
- ./conf/application-common.yml:/opt/wfc/conf/application-common.yml
- ./conf/i18n/:/opt/wfc/conf/i18n
- ./wfc/modules/file/conf/application.yml:/opt/wfc/conf/application.yml
depends_on:
wfc-auth:
condition: service_healthy
wfc-gateway:
condition: service_healthy
environment:
- NACOS_PROFILE_NAME=${NACOS_PROFILE_NAME}
- NACOS_NAME_SPACE=${NACOS_NAME_SPACE}
- NACOS_SERVER_NAME=${NACOS_SERVER_NAME}
- NACOS_SERVER_IP=${NACOS_SERVER_IP}
- NACOS_SERVER_PORT=${NACOS_SERVER_PORT}
- WFC_FILE_PORT=${WFC_FILE_PORT}
- SPRING_CONFIG_ADDITIONAL_LOCATION=optional:classpath:/,optional:file:/opt/wfc/conf/
- TZ=${TZ}
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:${WFC_FILE_PORT}/actuator/health || exit 1"]
interval: 30s
timeout: 10s
retries: 6
restart: ${RESTART_OPTION}
wfc-modules-job:
image: wfc-java:jre8
container_name: wfc-modules-job
ports:
- "${WFC_JOB_PORT}:${WFC_JOB_PORT}"
networks:
- wfc-be-network
volumes:
- ./wfc/modules/job/jar/wfc-modules-job.jar:/opt/wfc/app.jar
- ./conf/application-common.yml:/opt/wfc/conf/application-common.yml
- ./wfc/modules/job/logs/:/opt/wfc/logs/
- ./conf/i18n/:/opt/wfc/conf/i18n
- ./wfc/modules/job/conf/application.yml:/opt/wfc/conf/application.yml
depends_on:
wfc-mysql:
condition: service_healthy
wfc-auth:
condition: service_healthy
wfc-gateway:
condition: service_healthy
environment:
- NACOS_PROFILE_NAME=${NACOS_PROFILE_NAME}
- NACOS_NAME_SPACE=${NACOS_NAME_SPACE}
- NACOS_SERVER_NAME=${NACOS_SERVER_NAME}
- NACOS_SERVER_IP=${NACOS_SERVER_IP}
- NACOS_SERVER_PORT=${NACOS_SERVER_PORT}
- WFC_JOB_PORT=${WFC_JOB_PORT}
- SPRING_CONFIG_ADDITIONAL_LOCATION=optional:classpath:/,optional:file:/opt/wfc/conf/
- TZ=${TZ}
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:${WFC_JOB_PORT}/actuator/health || exit 1"]
interval: 30s
timeout: 10s
retries: 6
restart: ${RESTART_OPTION}
wfc-modules-payment:
image: wfc-java:jre8
container_name: wfc-modules-payment
ports:
- "${WFC_PAYMENT_PORT}:${WFC_PAYMENT_PORT}"
networks:
- wfc-be-network
volumes:
- ./wfc/modules/payment/jar/wfc-modules-payment.jar:/opt/wfc/app.jar
- ./wfc/modules/payment/logs/:/opt/wfc/logs/
- ./conf/application-common.yml:/opt/wfc/conf/application-common.yml
- ./conf/i18n/:/opt/wfc/conf/i18n
- ./wfc/modules/payment/conf/application.yml:/opt/wfc/conf/application.yml
depends_on:
wfc-redis:
condition: service_healthy
wfc-mysql:
condition: service_healthy
wfc-auth:
condition: service_healthy
wfc-gateway:
condition: service_healthy
environment:
- NACOS_PROFILE_NAME=${NACOS_PROFILE_NAME}
- NACOS_NAME_SPACE=${NACOS_NAME_SPACE}
- NACOS_SERVER_NAME=${NACOS_SERVER_NAME}
- NACOS_SERVER_IP=${NACOS_SERVER_IP}
- NACOS_SERVER_PORT=${NACOS_SERVER_PORT}
- WFC_PAYMENT_PORT=${WFC_PAYMENT_PORT}
- SPRING_CONFIG_ADDITIONAL_LOCATION=optional:classpath:/,optional:file:/opt/wfc/conf/
- TZ=${TZ}
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:${WFC_PAYMENT_PORT}/actuator/health || exit 1"]
interval: 30s
timeout: 10s
retries: 6
restart: ${RESTART_OPTION}
wfc-nginx:
image: nginx:1.27.4
container_name: wfc-nginx
build:
context: ./nginx
ports:
- "${WFC_SERVER_PORT}:${WFC_SERVER_PORT}"
- "${WFC_SERVER_HTTPS_PORT}:${WFC_SERVER_HTTPS_PORT}"
networks:
- wfc-fe-network
- wfc-be-network
volumes:
- ./wfc/modules/file/upload:/opt/wfc/file/upload
- ./nginx/html/dist:/opt/wfc/portal
- ./nginx/ssl:/opt/wfc/ssl
- ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/logs:/var/log/nginx
- ./nginx/conf.d:/etc/nginx/conf.d
depends_on:
wfc-modules-system:
condition: service_healthy
wfc-modules-user:
condition: service_healthy
environment:
- GATEWAY_SERVER_IP=${GATEWAY_SERVER_IP}
- GATEWAY_SERVER_PORT=${GATEWAY_SERVER_PORT}
- WFC_SERVER_IP=${WFC_SERVER_IP}
- WFC_SERVER_PORT=${WFC_SERVER_PORT}
- TZ=${TZ}
healthcheck:
test:
- "CMD-SHELL"
- >
curl -f http://localhost:${WFC_SERVER_PORT}/sys &&
curl -f http://localhost:${WFC_SERVER_PORT}/u ||
exit 1
interval: 30s
timeout: 5s
retries: 6
restart: ${RESTART_OPTION}
networks:
wfc-fe-network:
name: wfc-fe-network
driver: bridge
wfc-be-network:
name: wfc-be-network
driver: bridge
ipam:
driver: default
@@ -1,71 +0,0 @@
spring:
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
mvc:
pathmatch:
matching-strategy: ant_path_matcher
# i18n resource file path
messages:
# i18n resource file path
basename: file:/opt/wfc/conf/i18n/messages,i18n/messages
# Enable remote debugging
devtools:
remote:
secret: 123456
# feign config
feign:
sentinel:
enabled: true
okhttp:
enabled: false
httpclient:
enabled: true
disable-ssl-validation: true
client:
config:
default:
connectTimeout: 60000
readTimeout: 60000
compression:
request:
enabled: true
min-request-size: 8192
response:
enabled: true
# eureka config
management:
endpoints:
web:
exposure:
include: '*'
mail:
enabled: true
host: mail.agrandtech.com
port: 25
# Enable authentication
auth: true
# Sender, follows RFC-822 standard
from: smtpext <smtpex@agrandtech.com>
# User name
user: smtpext
# Password
pass: Smtp123@agt
# Use TLS security connection
starttlsEnable: false
# Use SSL security connection
sslEnable: false
# Timeout value for sending mail, in milliseconds
timeout: 0
# Connection timeout value, in milliseconds
connectionTimeout: 0
# Omada config
omada:
# web url or host exp: 'https://192.168.2.249:8043'
omada-url: 'https://aps1-omada-northbound.tplinkcloud.com'
omadac-id: 'c4decbf73f80094019d664506ec9b4d4'
client-id: '6110a77822234243a033e652d1e8a3ae'
client-secret: '651957da95f14f45b719876bb68bd6f5'
@@ -1,72 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Verification Code</title>
<style>
body {
font-family: Arial, sans-serif;
line-height: 1.6;
color: #333333;
margin: 0;
padding: 0;
}
.container {
max-width: 600px;
margin: 0 auto;
padding: 20px;
}
.header {
text-align: center;
padding: 20px 0;
}
.code-box {
background-color: #f8f8f8;
padding: 20px;
text-align: center;
margin: 20px 0;
border-radius: 5px;
}
.verification-code {
font-size: 32px;
font-weight: bold;
letter-spacing: 5px;
color: #2b2b2b;
}
.footer {
font-size: 12px;
color: #666666;
text-align: center;
margin-top: 30px;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h2>WANFI Verification Code</h2>
</div>
<p>Dear User,</p>
<p>Thank you for using our service. Your verification code is:</p>
<div class="code-box">
<div class="verification-code"> <span th:text="${verificationCode}"></span> </div>
</div>
<p>This code will expire in <span th:text="${expirationTime}">10</span> minutes. Please do not share this code with anyone.</p>
<p>If you didn't request this code, please ignore this email.</p>
<p>Best regards,<br>
Your Company Name</p>
<div class="footer">
<p>This is an automated message, please do not reply to this email.</p>
<p>&copy; 2024 Your Company Name. All rights reserved.</p>
</div>
</div>
</body>
</html>
@@ -1,72 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Verification Code</title>
<style>
body {
font-family: Arial, sans-serif;
line-height: 1.6;
color: #333333;
margin: 0;
padding: 0;
}
.container {
max-width: 600px;
margin: 0 auto;
padding: 20px;
}
.header {
text-align: center;
padding: 20px 0;
}
.code-box {
background-color: #f8f8f8;
padding: 20px;
text-align: center;
margin: 20px 0;
border-radius: 5px;
}
.verification-code {
font-size: 32px;
font-weight: bold;
letter-spacing: 5px;
color: #2b2b2b;
}
.footer {
font-size: 12px;
color: #666666;
text-align: center;
margin-top: 30px;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h2>Verification Code</h2>
</div>
<p>Dear User,</p>
<p>Thank you for using our service. Your verification code is:</p>
<div class="code-box">
<div class="verification-code"> <span th:text="${verificationCode}"></span> </div>
</div>
<p>This code will expire in <span th:text="${expirationTime}">10</span> minutes. Please do not share this code with anyone.</p>
<p>If you didn't request this code, please ignore this email.</p>
<p>Best regards,<br>
Your Company Name</p>
<div class="footer">
<p>This is an automated message, please do not reply to this email.</p>
<p>&copy; 2024 Your Company Name. All rights reserved.</p>
</div>
</div>
</body>
</html>
@@ -1,70 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Verification Code</title>
<style>
body {
font-family: Arial, sans-serif;
line-height: 1.6;
color: #333333;
margin: 0;
padding: 0;
}
.container {
max-width: 600px;
margin: 0 auto;
padding: 20px;
}
.header {
text-align: center;
padding: 20px 0;
}
.code-box {
background-color: #f8f8f8;
padding: 20px;
text-align: center;
margin: 20px 0;
border-radius: 5px;
}
.verification-code {
font-size: 32px;
font-weight: bold;
letter-spacing: 5px;
color: #2b2b2b;
}
.footer {
font-size: 12px;
color: #666666;
text-align: center;
margin-top: 30px;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h2>Balance Reminder</h2>
</div>
<p>Dear User,</p>
<p>Thank you for using our service. We want to inform you that from now on, your balance is less than <span th:text="${currencySymbol}">$</span><span th:text="${threshold}">10</span>.</p>
<div class="code-box">
<div> <strong>Balance:</strong> <span th:text="${currencySymbol}">$</span><span th:text="${balance}">100</span></div>
</div>
<p>To avoid service interruption, please recharge in time.</p>
<p>Best regards,<br>
Your Company Name</p>
<div class="footer">
<p>This is an automated message, please do not reply to this email</p>
<p>&copy; 2024 Your Company Name. All rights reserved.</p>
</div>
</div>
</body>
</html>
@@ -1,296 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Invoice: Wanfi Technology - INV-2025-05-001</title>
<style>
/* 整体样式 */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Helvetica Neue', Arial, sans-serif;
}
body {
margin: 15px;
line-height: 1.6;
}
.container {
max-width: 800px;
margin: 0 auto;
}
.invoice-container {
background: white;
border: 1px solid #e0e0e0;
border-radius: 8px;
padding: 40px;
box-shadow: 0 5px 15px rgba(0,0,0,0.05);
}
/* 头部样式 */
.header {
display: flex;
margin-bottom: 15px;
padding-bottom: 10px;
border-bottom: 1px solid #e9ecef;
}
.company-info {
flex: 1;
}
.company-logo {
text-align: right;
}
.company-logo img {
max-width: 150px;
height: auto;
}
h1 {
font-size: 25px;
color: #2c3e50;
margin-bottom: 5px;
text-transform: uppercase;
letter-spacing: 1px;
}
/* 发票信息 */
.invoice-info {
display: flex;
margin-bottom: 10px;
}
.bill-to {
flex: 1;
}
.invoice-details {
text-align: right;
}
.invoice-details div {
margin-bottom: 8px;
}
.invoice-number {
font-size: 20px;
font-weight: bold;
color: #2c3e50;
}
/* 表格样式 */
table {
width: 100%;
border-collapse: collapse;
margin: 10px 0 20px;
}
th {
background-color: #f0f7ff;
text-align: left;
padding: 12px 15px;
font-weight: 600;
}
td {
padding: 12px 15px;
border-bottom: 1px solid #e9ecef;
}
tr:last-child td {
border-bottom: none;
}
/* 服务详情 */
.service-details {
margin: 10px 0;
padding: 5px;
background-color: #f8f9fa;
border-left: 3px solid #3498db;
font-size: 15px;
}
.service-details li {
margin-left: 20px;
}
/* 金额部分 */
.amount-summary {
margin-top: 20px;
width: 100%;
text-align: right;
}
.amount-row {
display: flex;
justify-content: flex-end;
padding: 8px 0;
}
.amount-label {
width: 250px;
text-align: right;
padding-right: 15px;
font-weight: bold;
}
.amount-value {
width: 150px;
text-align: right;
}
.total-due {
font-size: 20px;
font-weight: bold;
border-top: 2px solid #2c3e50;
padding-top: 12px;
margin-top: 5px;
color: #2c3e50;
}
/* 付款信息 */
.payment-info {
margin-top: 10px;
padding: 5px;
background-color: #e8f4ff;
border-radius: 6px;
}
.payment-info h3 {
margin-bottom: 5px;
color: #2c3e50;
}
.bank-details {
display: flex;
flex-wrap: wrap;
gap: 15px;
}
.bank-details div {
min-width: 200px;
}
/* 页脚 */
.thank-you {
margin-top: 20px;
text-align: center;
font-size: 15px;
color: #2c3e50;
padding-top: 5px;
border-top: 1px solid #e9ecef;
font-style: italic;
}
/* 分隔线 */
hr {
border: 0;
height: 1px;
/* background: linear-gradient(to right, rgba(0,0,0,0), rgba(0,0,0,0.1), rgba(0,0,0,0)); */
background: #e9ecef;
margin: 15px 0;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<div class="company-info">
<h1>INVOICE</h1>
<p><strong>From:</strong></p>
<p><strong>MacroHub Technology</strong></p>
<p>ABN: 12 345 678 900</p>
<p>contact@exampel.com</p>
<p>+61 400 000 001</p>
</div>
<div class="company-logo">
<img src="https://img.icons8.com/?size=100&id=13047&format=png&color=000000" alt="Wanfi Technology Logo">
</div>
</div>
<div class="invoice-info">
<div class="bill-to">
<p><strong>To:</strong></p>
<p><span th:text="${username}">Mr. Exampele</span></p>
<p><span th:text="${email}">Example@example.com</span></p>
</div>
<div class="invoice-details">
<div><strong>Invoice Number:</strong> <span th:text="${invoiceNumber}">INV-2025-05-001</span></div>
<div><strong>Invoice Date:</strong> <span th:text="${#dates.format(new java.util.Date(now), 'yyyy-MM-dd')}">2025-05-28</span></div>
<div><strong>Due Date:</strong> <span th:text="${#dates.format(new java.util.Date(now + 7*1000*60*60*24L), 'yyyy-MM-dd')}">2025-06-04</span></div>
</div>
</div>
<hr>
<h2>Description of Services</h2>
<table>
<thead>
<tr>
<th>Item Name</th>
<th>Qty</th>
<th>Unit Price (<span th:text="${currency}">AUD</span>)</th>
<th>Total (<span th:text="${currency}">AUD</span>)</th>
</tr>
</thead>
<tbody>
<tr>
<td><span th:text="${itemName}">Network Traffic Fee</span></td>
<td><span th:text="${qty}">1</span></td>
<td><span th:text="${unitPrice}">$50</span></td>
<td><span th:text="${total}">$50</span></td>
</tr>
</tbody>
</table>
<div class="service-details" th:if="${hasDetails}">
<p><strong>Details:</strong></p>
<ul>
<li>Total data: <strong><span th:text="${traffic}">200GB</span></strong></li>
<li>Speed cap: <strong><span th:text="${speedCap}">Upload 30 Mbps / Download 100 Mbps</span></strong></li>
<li>Number of devices supported: <strong><span th:text="${clientsNumber}">5</span></strong></li>
<li>Billing cycle: <strong><span th:text="${billingCycle}">Monthly</span></strong></li>
</ul>
</div>
<div class="amount-summary">
<div class="amount-row">
<div class="amount-label">Subtotal:</div>
<div class="amount-value"><span th:text="${total}">$50.00</span></div>
</div>
<div class="amount-row">
<div class="amount-label">GST (0%):</div>
<div class="amount-value"><span th:text="${currencySymbol}">$</span>0.00</div>
</div>
<div class="amount-row total-due">
<div class="amount-label">Total Due (<span th:text="${currency}">AUD</span>):</div>
<div class="amount-value"><span th:text="${total}">$50.00</span></div>
</div>
</div>
<!-- <hr>
<div class="payment-info">
<h3>Payment Details</h3>
<div class="bank-details">
<div><strong>Bank:</strong> ANZ</div>
<div><strong>BSB:</strong> 123-456</div>
<div><strong>Account:</strong> 98765432</div>
<div><strong>Reference:</strong> INV-2025-05-001</div>
</div>
</div> -->
<div class="thank-you">
<p>Thank you for your business!</p>
</div>
</div>
</body>
</html>
@@ -1,72 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Verification Code</title>
<style>
body {
font-family: Arial, sans-serif;
line-height: 1.6;
color: #333333;
margin: 0;
padding: 0;
}
.container {
max-width: 600px;
margin: 0 auto;
padding: 20px;
}
.header {
text-align: center;
padding: 20px 0;
}
.code-box {
background-color: #f8f8f8;
padding: 20px;
text-align: center;
margin: 20px 0;
border-radius: 5px;
}
.verification-code {
font-size: 32px;
font-weight: bold;
letter-spacing: 5px;
color: #2b2b2b;
}
.footer {
font-size: 12px;
color: #666666;
text-align: center;
margin-top: 30px;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h2>Verification Code</h2>
</div>
<p>Dear User,</p>
<p>Thank you for using our service. Your verification code is:</p>
<div class="code-box">
<div class="verification-code"> <span th:text="${verificationCode}"></span> </div>
</div>
<p>This code will expire in <span th:text="${expirationTime}">10</span> minutes. Please do not share this code with anyone.</p>
<p>If you didn't request this code, please ignore this email.</p>
<p>Best regards,<br>
Your Company Name</p>
<div class="footer">
<p>This is an automated message, please do not reply to this email.</p>
<p>&copy; 2024 Your Company Name. All rights reserved.</p>
</div>
</div>
</body>
</html>
@@ -1,71 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Verification Code</title>
<style>
body {
font-family: Arial, sans-serif;
line-height: 1.6;
color: #333333;
margin: 0;
padding: 0;
}
.container {
max-width: 600px;
margin: 0 auto;
padding: 20px;
}
.header {
text-align: center;
padding: 20px 0;
}
.code-box {
background-color: #f8f8f8;
padding: 20px;
text-align: center;
margin: 20px 0;
border-radius: 5px;
}
.verification-code {
font-size: 32px;
font-weight: bold;
letter-spacing: 5px;
color: #2b2b2b;
}
.footer {
font-size: 12px;
color: #666666;
text-align: center;
margin-top: 30px;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h2>Traffic Reminder</h2>
</div>
<p>Dear User,</p>
<p>Thank you for using our service. We want to inform you that from now on, your package traffic is less than <span th:text="${threshold}">10</span>%.</p>
<div class="code-box">
<div> <strong>Total Traffic:</strong> <span th:text="${totalTraffic}">10 GB</span></div>
<div> <strong>Used Traffic:</strong> <span th:text="${usedTraffic}">1 GB</span></div>
</div>
<p>To avoid service interruption, please purchase the package in time.</p>
<p>Best regards,<br>
Your Company Name</p>
<div class="footer">
<p>This is an automated message, please do not reply to this email</p>
<p>&copy; 2024 Your Company Name. All rights reserved.</p>
</div>
</div>
</body>
</html>
-28
View File
@@ -1,28 +0,0 @@
WFC_CONFIG_DATABASE=wfc_config_db
WFC_SYSTEM_DATABASE=wfc_system_db
WFC_USER_DATABASE=wfc_user_db
MYSQL_SERVICE_NAME=wfc-mysql
MYSQL_SERVICE_PORT=3306
MYSQL_ROOT_PASSWORD=123456
MYSQL_SERVICE_USER=root
MYSQL_SERVICE_PASSWORD=123456
REDIS_PORT=6379
NACOS_PROFILE_NAME=prod
NACOS_NAME_SPACE=wfc-prod
NACOS_SERVER_NAME=wfc-nacos
WFC_SERVER_PORT=80
WFC_SERVER_HTTPS_PORT=443
NACOS_SERVER_PORT=8848
GATEWAY_SERVER_PORT=8080
AUTH_SERVER_PORT=8081
WFC_FILE_PORT=9201
WFC_JOB_PORT=9203
WFC_PAYMENT_PORT=9204
WFC_SYSTEM_PORT=9205
WFC_USER_PORT=9206
WFC_SERVER_IP=192.168.13.128
NACOS_SERVER_IP=${WFC_SERVER_IP}
GATEWAY_SERVER_IP=${WFC_SERVER_IP}
RESTART_OPTION=unless-stopped
TZ=Asia/Shanghai
SYSTEM_TITLE=MacroHub
-5
View File
@@ -1,5 +0,0 @@
NAME="wfc"
VERSION="1.0.19-YYYYMMDD"
ID="wfc"
VERSION_ID="1.0.19"
DESCRIPTION="WANFi Control and Billing System"
-15
View File
@@ -1,15 +0,0 @@
FROM openjdk:8-jre
# 通过挂载-v 来挂载宿主机的文件到容器中 /opt/wfc/app.jar
WORKDIR /opt/wfc
# 设置环境变量
ENV JVM_OPTS="-Xms128m -Xmx512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m"
ENV JAVA_OPTS="--spring.config.additional_location=optional:classpath:/,optional:file:/opt/wfc/conf/application.yml"
ENV JAR_FILE="app.jar"
# 使用 sh -c 解析环境变量
ENTRYPOINT ["sh", "-c", "java -Dfile.encoding=utf-8 ${JVM_OPTS} -jar ${JAR_FILE} ${JAVA_OPTS}"]
# docker build -t java:jre8 .
# docker run -v /home/manager/probject/wfc/wfc-gateway.jar:/app.jar java:jre8
-3
View File
@@ -1,3 +0,0 @@
[client]
user=root
password=123456
-1
View File
@@ -1 +0,0 @@
存放sql目录下的所有脚本,用于docker自动执行。
-9
View File
@@ -1,9 +0,0 @@
# 基础镜像
FROM mysql:5.7
# 执行sql脚本
# ENV MYSQL_ROOT_PASSWORD=123456
# COPY ./db/*.sql /docker-entrypoint-initdb.d/
# COPY ./db/initdb.sh /docker-entrypoint-initdb.d/
# RUN chmod 755 /docker-entrypoint-initdb.d/initdb.sh
# ENTRYPOINT ["bash", "/docker-entrypoint-initdb.d/initdb.sh"]
@@ -1,53 +0,0 @@
# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_SERVER_PORT:8848}
server.tomcat.accesslog.max-days=30
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.error.include-message=ALWAYS
# default current work dir
server.tomcat.basedir=file:.
#*************** Config Module Related Configurations ***************#
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
#spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:}
spring.sql.init.platform=${SPRING_DATASOURCE_PLATFORM:}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=${MYSQL_DATABASE_NUM:1}
db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.user.0=${MYSQL_SERVICE_USER}
db.password.0=${MYSQL_SERVICE_PASSWORD}
## DB connection pool settings
db.pool.config.connectionTimeout=${DB_POOL_CONNECTION_TIMEOUT:30000}
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
### The auth system to use, currently only 'nacos' and 'ldap' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
### The default token:
nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:}
### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:}
## spring security config
### turn off security
nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**}
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
nacos.console.ui.enabled=true
nacos.core.param.check.enabled=true
@@ -1,66 +0,0 @@
spring:
datasource:
platform: mysql
db:
num: 1
url:
0: jdbc:mysql://wfc-mysql:3306/wfc_config_db?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
user: root
password: 123456
nacos:
naming:
empty-service:
auto-clean: true
clean:
initial-delay-ms: 50000
period-time-ms: 30000
# server:
# ip: ${NACOS_SERVER_IP}
# port: ${NACOS_SERVER_PORT}
security:
ignore:
urls: /,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-ui/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**
core:
auth:
system:
type: nacos
enabled: false
default:
token:
expire:
seconds: 18000
secret:
key: SecretKey012345678901234567890123456789012345678901234567890123456789
caching:
enabled: true
enable:
userAgentAuthWhite: false
server:
identity:
key: serverIdentity
value: security
istio:
mcp:
server:
enabled: false
management:
endpoints:
web:
exposure:
include: "*"
metrics:
export:
elastic:
enabled: false
influx:
enabled: false
server:
tomcat:
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i'
basedir: /home/wfc/nacos/tomcat/logs
-6
View File
@@ -1,6 +0,0 @@
# 基础镜像
FROM nacos/nacos-server:v2.5.0
# 复制conf文件到路径
# COPY ./conf/application.properties /home/nacos/conf/application.properties
# COPY ./conf/application.yml /home/nacos/conf/application.yml
@@ -1,98 +0,0 @@
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
client_max_body_size 5m;
# server {
# listen 80;
# server_name localhost;
# return 301 https://$host$request_uri; # 将HTTP请求重定向到HTTPS
# }
server {
listen 80;
server_name localhost;
# ssl_certificate /opt/wfc/ssl/server.crt;
# ssl_certificate_key /opt/wfc/ssl/server.key;
# ssl_session_cache shared:SSL:10m;
# ssl_session_timeout 120m;
# ssl_prefer_server_ciphers on;
# ssl_session_tickets off;
# ssl_stapling_verify on;
location /kyc {
alias /opt/wfc/file/upload;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
location /sys {
root /opt/wfc/portal;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /sys-api/{
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.13.128:8080/;
}
location /u {
root /opt/wfc/portal;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /u-api/{
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.13.128:8080/;
}
location /file {
proxy_pass http://192.168.13.128:9201/;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header Content-Type $content_type;
proxy_set_header Content-Length $http_content_length;
}
# Avoid actuator access
if ($request_uri ~ "/actuator") {
return 403;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
-9
View File
@@ -1,9 +0,0 @@
# 基础镜像
FROM nginx:1.27.4
# 工作目录
WORKDIR /opt/wfc/portal
# 复制conf文件到路径
COPY ./conf/nginx.conf /etc/nginx/nginx.conf
# 复制html文件到路径
COPY ./html /opt/wfc/portal
-3
View File
@@ -1,3 +0,0 @@
1. 目录./sys存放客户平台(sys portal)前端文件
2. 目录./u存放用户平台(user portal)前端文件
用于nginx自动执行
-33
View File
@@ -1,33 +0,0 @@
# 定义输入用户信息选项的"特征名称"字段名,该扩展字段定义了多项用户信息。
distinguished_name = req_distinguished_name
# 生成自签名证书时要使用的证书扩展项字段名,该扩展字段定义了要加入到证书中的一系列扩展项。
x509_extensions = v3_req
# 如果设为no,那么 req 指令将直接从配置文件中读取证书字段的信息,而不提示用户输入。
prompt = no
[req_distinguished_name]
#国家代码,一般都是CN(大写)
C = CN
#省份
ST = gd
#城市
L = gz
#企业/单位名称
O = wanfi
#企业部门
OU = wanfi
#证书的主域名
CN = localhost
##### 要加入到证书请求中的一系列扩展项 #####
[v3_req]
keyUsage = critical, digitalSignature, keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[ alt_names ]
IP.1 = 192.168.11.111
# IP.2 = 192.168.11.222
@@ -1,3 +0,0 @@
# requirepass 123456
dbfilename dump.rdb
dir /opt/wfc/redis/data
-11
View File
@@ -1,11 +0,0 @@
# 基础镜像
FROM redis:7.4.2
# 挂载目录
VOLUME /opt/wfc/redis
# 创建目录
RUN mkdir -p /opt/wfc/redis
# 指定路径
WORKDIR /opt/wfc/redis
# 复制conf文件到路径
COPY ./conf/redis.conf /opt/wfc/redis/redis.conf
@@ -1,7 +0,0 @@
spring:
redis:
host: wfc-redis
port: 6379
password:
config:
import: optional:file:/opt/wfc/conf/application-common.yml
-15
View File
@@ -1,15 +0,0 @@
# 基础镜像
FROM openjdk:8-jre
# author
LABEL org.wfc.image.authors="wfc@wfc.org"
# 挂载目录
VOLUME /opt/wfc
# 创建目录
RUN mkdir -p /opt/wfc
# 指定路径
WORKDIR /opt/wfc
# 复制jar文件到路径
COPY ./jar/wfc-auth.jar /opt/wfc/wfc-auth.jar
# 启动认证服务
ENTRYPOINT ["java","-jar","wfc-auth.jar"]
-1
View File
@@ -1 +0,0 @@
存放认证中心打包好的jar文件,用于docker启动应用。
@@ -1,87 +0,0 @@
spring:
redis:
host: wfc-redis
port: 6379
password:
cloud:
gateway:
discovery:
locator:
lowerCaseServiceId: true
enabled: true
routes:
# 认证中心
- id: wfc-auth
uri: lb://wfc-auth
predicates:
- Path=/auth/**
filters:
# 验证码处理
- CacheRequestFilter
- ValidateCodeFilter
- StripPrefix=1
# 代码生成
- id: wfc-gen
uri: lb://wfc-gen
predicates:
- Path=/code/**
filters:
- StripPrefix=1
# 定时任务
- id: wfc-job
uri: lb://wfc-job
predicates:
- Path=/schedule/**
filters:
- StripPrefix=1
# 系统模块
- id: wfc-system
uri: lb://wfc-system
predicates:
- Path=/system/**
filters:
- StripPrefix=1
# 用户模块
- id: wfc-user
uri: lb://wfc-user
predicates:
- Path=/u/**
filters:
- StripPrefix=1
# 文件服务
- id: wfc-file
uri: lb://wfc-file
predicates:
- Path=/file/**
filters:
- StripPrefix=1
# payment
- id: wfc-payment
uri: lb://wfc-payment
predicates:
- Path=/payment/**
filters:
- StripPrefix=1
config:
import: optional:file:/opt/wfc/conf/application-common.yml
# 安全配置
security:
# 验证码
captcha:
enabled: true
type: math
# 防止XSS攻击
xss:
enabled: true
excludeUrls:
- /system/notice
# 不校验白名单
ignore:
whites:
- /auth/logout
- /auth/login
- /auth/register
- /auth/checkRepeat
- /*/v2/api-docs
- /csrf
-42
View File
@@ -1,42 +0,0 @@
# 使用Ubuntu 22.04 LTS作为基础镜像
FROM ubuntu:22.04
# 设置时区(可选)
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 编码格式
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
# 设置华为云源
RUN sed -i 's/http:\/\/archive.ubuntu.com\/ubuntu\//http:\/\/repo.huaweicloud.com\/ubuntu\//g' /etc/apt/sources.list && \
sed -i 's#http://security.ubuntu.com/ubuntu#http://repo.huaweicloud.com/ubuntu#' /etc/apt/sources.list
# 安装OpenJDK 8
RUN apt-get update && \
apt-get install -y openjdk-8-jre && \
apt-get install -y locales && \
apt-get install -y curl && \
locale-gen en_US.UTF-8 && \
update-locale LANG=en_US.UTF-8 && \
apt-get clean;
# 设置JAVA_HOME环境变量
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64
ENV PATH $JAVA_HOME/bin:$PATH
# author
LABEL org.wfc.image.authors="wfc@wfc.org"
# 挂载目录
VOLUME /opt/wfc
# 创建目录
RUN mkdir -p /opt/wfc
# 指定路径
WORKDIR /opt/wfc
# 复制jar文件到路径
COPY ./jar/wfc-gateway.jar /opt/wfc/wfc-gateway.jar
# 启动网关服务
ENTRYPOINT ["java","-jar","wfc-gateway.jar"]
-1
View File
@@ -1 +0,0 @@
存放网关模块打包好的jar文件,用于docker启动应用。
@@ -1,25 +0,0 @@
# spring配置
spring:
config:
import: optional:file:/opt/wfc/conf/application-common.yml
# 本地文件上传
file:
domain: wfc-file:9201
path: /opt/wfc/upload
prefix: /kyc
gateway: http://192.168.2.116:8080
# FastDFS配置
fdfs:
domain: http://wfc-file
soTimeout: 3000
connectTimeout: 2000
trackerList: wfc-file:22122
# Minio配置
minio:
url: http://wfc-file:9000
accessKey: minioadmin
secretKey: minioadmin
bucketName: test
-15
View File
@@ -1,15 +0,0 @@
# 基础镜像
FROM openjdk:8-jre
# author
LABEL org.wfc.image.authors="wfc@wfc.org"
# 挂载目录
VOLUME /opt/wfc
# 创建目录
RUN mkdir -p /opt/wfc
# 指定路径
WORKDIR /opt/wfc
# 复制jar文件到路径
COPY ./jar/wfc-modules-file.jar /opt/wfc/wfc-modules-file.jar
# 启动文件服务
ENTRYPOINT ["java","-jar","wfc-modules-file.jar"]
@@ -1 +0,0 @@
存放文件服务打包好的jar文件,用于docker启动应用。
@@ -1,37 +0,0 @@
# spring配置
spring:
redis:
host: wfc-redis
port: 6379
password:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://wfc-mysql:3306/wfc_system_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: 123456
config:
import: optional:file:/opt/wfc/conf/application-common.yml
# mybatis配置
mybatis:
# 搜索指定包别名
typeAliasesPackage: org.wfc.gen.domain
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath:mapper/**/*.xml
# swagger配置
swagger:
title: 代码生成接口文档
license: Powered By wfc
licenseUrl: https://wfc.vip
# 代码生成
gen:
# 作者
author: wfc
# 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
packageName: org.wfc.system
# 自动去除表前缀,默认是false
autoRemovePre: false
# 表前缀(生成类名不会包含表前缀,多个用逗号分隔)
tablePrefix: sys_
-15
View File
@@ -1,15 +0,0 @@
# 基础镜像
FROM openjdk:8-jre
# author
LABEL org.wfc.image.authors="wfc@wfc.org"
# 挂载目录
VOLUME /opt/wfc
# 创建目录
RUN mkdir -p /opt/wfc
# 指定路径
WORKDIR /opt/wfc
# 复制jar文件到路径
COPY ./jar/wfc-modules-gen.jar /opt/wfc/wfc-modules-gen.jar
# 启动代码生成服务
ENTRYPOINT ["java","-jar","wfc-modules-gen.jar"]
@@ -1 +0,0 @@
存放代码生成打包好的jar文件,用于docker启动应用。
@@ -1,26 +0,0 @@
# spring配置
spring:
redis:
host: wfc-redis
port: 6379
password:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://wfc-mysql:3306/wfc_system_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: 123456
config:
import: optional:file:/opt/wfc/conf/application-common.yml
# mybatis配置
mybatis:
# 搜索指定包别名
typeAliasesPackage: org.wfc.job.domain
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath:mapper/**/*.xml
# swagger配置
swagger:
title: 定时任务接口文档
license: Powered By wfc
licenseUrl: https://wfc.vip
-15
View File
@@ -1,15 +0,0 @@
# 基础镜像
FROM openjdk:8-jre
# author
LABEL org.wfc.image.authors="wfc@wfc.org"
# 挂载目录
VOLUME /opt/wfc
# 创建目录
RUN mkdir -p /opt/wfc
# 指定路径
WORKDIR /opt/wfc
# 复制jar文件到路径
COPY ./jar/wfc-modules-job.jar /opt/wfc/wfc-modules-job.jar
# 启动定时任务服务
ENTRYPOINT ["java","-jar","wfc-modules-job.jar"]
@@ -1 +0,0 @@
存放定时任务打包好的jar文件,用于docker启动应用。
@@ -1 +0,0 @@
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt/+bR1+YqImwll81GFVSIHdMHsYqOQm0SEzUNrGjzm9e44qHtEOULv8Y3HYxLvCUNez0M4wx3Ih1fBP33CdaoFo2HKby6baf40Sewu+ZHJI+2d5mmo4M8MY5NspZoYE5HeciYl/u8sDV/+PA/wcfdOk11JRFDCDfgDtfTGc33OTcAy+QwALFDiFWxj/zkwCSH69cj5rPTaBbTmnfy9wW/DhKNsVYtmnNO8slPG37VTxLWIB+jsfrm7WEO+HUbM5OIekKHrqnKqOGHlgPVzuO9SfMurXPqDLH96xfM46OvVvh7H8XwTb1M4XigspuF8kt2yNCh8Hu8hQu7/6ke2oTMQIDAQAB
@@ -1 +0,0 @@
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC3/5tHX5ioibCWXzUYVVIgd0wexio5CbRITNQ2saPOb17jioe0Q5Qu/xjcdjEu8JQ17PQzjDHciHV8E/fcJ1qgWjYcpvLptp/jRJ7C75kckj7Z3maajgzwxjk2ylmhgTkd5yJiX+7ywNX/48D/Bx906TXUlEUMIN+AO19MZzfc5NwDL5DAAsUOIVbGP/OTAJIfr1yPms9NoFtOad/L3Bb8OEo2xVi2ac07yyU8bftVPEtYgH6Ox+ubtYQ74dRszk4h6Qoeuqcqo4YeWA9XO471J8y6tc+oMsf3rF8zjo69W+HsfxfBNvUzheKCym4XyS3bI0KHwe7yFC7v/qR7ahMxAgMBAAECggEBAJ7cEi3KTJxe3NbHdqj+qTyco10CjNvYFA5EPwjF0H7gSxW7ujSaECuPVeCqLwau8depMKH8zePw8TZiayJp2+YMXSHZxmqgoWTwDv6RLSms3pTuXrncITIUgrtac45samr17wrudviiI2GeOzg05yTiYPab2Q2CqFUnbb0idOnCOEWK37z2ojA9XgNDukoA+1Wpm1HqoTNNRNHZOq8ZfbxyZY3iq4nuoEDQf741kzNe4skmw21N6rC21QJ8nrCfc70C47iz5XW8lfuVNkUeJc+E595HrLBp7he5cEBWKsZ4xi+X0tlyNgg9OlLuP+8twOxl9rwP/0d4pjKnnfEa0a0CgYEA+EM7FqCFhExZHoO6/c9igbtqlIc93UNT5YVrujgmgfq0ACq6X8tWV1j+1WPcYwLqOKlgprNCoW+aT0rUTI3Nq/wFr5AkAdNClje707Ec8n5NTNUSX3i2zpdgTIKFHFEgl13BsKgb5ABosexlXU/gxpJCZctQ33tfYtZfnA5Zr3MCgYEAvbukhHBv1UcSH54UULoY1tNkFKwiiAbJIcSRV+ZLqxW9adREFLxSJOqk90B9t8CXdRVgT+7Oap0GztACQ63psqxbeKeXdHnJNL4CEl4RWcge6isI3V7kU0/yx+/miWhyYGByZ816D/QUdbbF1kU14dD79TVD171uS9IJxKTRgcsCgYAopYlFGR8DHCTzNAoniA7Owsqeas4cLevMhl2u7YaQfWV/KX++M2J9hpqigWkR5OZIRKMIaA0etVEEbnH33rev0uFzbxwWGGqsgY+FB1h/82HglHofm3oCtRIVNMFqc3XsknMl40A9wjth9hxafLuGh2fLltA05tQlMIgS2t6gNQKBgQCzRHJDeIESAR7MpO4JAGyrvfwX1DSkVdUAhNvXM49XTSk0rwzMkssCenn37AVc8ymnxNTFcZuy/D8MdVlOXSosWdHrhF4D/XXw0X7fn+XA8ObU1mh/0ULmvOllo/Qs7HT1PuuZzHmCTVpvhowS0j4A6RbHLta1JxTpqsDz/c6+VQKBgQDubC69oYbaBjxOKsQGvYUhpS9RsqZCxmg1GzLcPiUOvjWzi8fNx3JrrJ8PFOcpxs+OhRT0rlzlePfHGu/lzrSuL0sCol9enFk80rKLFAw4oXAdnTbtEjaoxA1dFTrrUIxFQkHpeH0NAkqU6BVaxbCPH22zH6/BZt2J9225lBuelQ==
@@ -1,21 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDizCCAnMCFCM5aRkNMigZAPlRtttmHcb/EQuOMA0GCSqGSIb3DQEBCwUAMIGB
MQswCQYDVQQGEwJDTjESMBAGA1UECAwJR3Vhbmdkb25nMREwDwYDVQQHDAhTaGVu
emhlbjEMMAoGA1UECgwDV0ZDMQswCQYDVQQLDAJJVDEQMA4GA1UEAwwHd2ZjLmNv
bTEeMBwGCSqGSIb3DQEJARYPc3VwcG9ydEB3ZmMuY29tMB4XDTI1MDEwNDAzMjYw
NloXDTI2MDEwNDAzMjYwNlowgYExCzAJBgNVBAYTAkNOMRIwEAYDVQQIDAlHdWFu
Z2RvbmcxETAPBgNVBAcMCFNoZW56aGVuMQwwCgYDVQQKDANXRkMxCzAJBgNVBAsM
AklUMRAwDgYDVQQDDAd3ZmMuY29tMR4wHAYJKoZIhvcNAQkBFg9zdXBwb3J0QHdm
Yy5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC/qAi6vyAqmM+o
G7o3tGVBltV3pMMfDHIW0QR6JTy+sb8k+pVWG+zTKPzDnkC6gYsRYXd1cqb2aS9F
yfe7gLeug2fxllZbbujDoicwgMzdQXoQrk36qbsUhBMADDtpS5ay+xJAS/RKWfhr
ivbcVPdB/ukV+ZH30mFBw/6NYYHyPk8XKlAW7HtOA+xItOTwrW0DhBoQRntM4SAx
/rNG1cmMq+9jr98AvwKzK0/6zRh50b+u3sD8Pak0A8azdPLVd9rwi2jBHMBeOWSa
4Kb4m4hY5D2OsV7dqrsGxFmAyQ/CCmV992Iwf0UtTMrSc8IvWD2j0wtpP3w7p9sD
xafGtv+zAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAAiNjhkCOE/BF5qUTub2EUfv
Rn3zUstTY7grgtKF4qqzX6Sg5khq78QeD/vIOwEyhcEAtOoKxoSjAA7vH+wzaBwa
VxwM1/bpG25W13G3J4YezKM844dXU73iaIQHcSJpbDCpvqMmYKp7k9i1e+P5RS3q
sUZaRAGzGuepvFBvf9tQoJSB6MkJMSjHGf+jCBB3/BMocue5B/QMURrHU+fShy+f
uSqbj0Y3b9iQxph+LXD4hYBVrRY5MnxbbUXfrv+SZjjoc5tfMdULDyIcA6cq/hi3
36u0ckGeGQ4b9OuInQquQ/bP6EqXneYIWUssXS1gZ06vFlFcXPLdT5p4Mt0hY5k=
-----END CERTIFICATE-----
@@ -1,18 +0,0 @@
-----BEGIN CERTIFICATE REQUEST-----
MIIC8jCCAdoCAQAwgYExCzAJBgNVBAYTAkNOMRIwEAYDVQQIDAlHdWFuZ2Rvbmcx
ETAPBgNVBAcMCFNoZW56aGVuMQwwCgYDVQQKDANXRkMxCzAJBgNVBAsMAklUMRAw
DgYDVQQDDAd3ZmMuY29tMR4wHAYJKoZIhvcNAQkBFg9zdXBwb3J0QHdmYy5jb20w
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC/qAi6vyAqmM+oG7o3tGVB
ltV3pMMfDHIW0QR6JTy+sb8k+pVWG+zTKPzDnkC6gYsRYXd1cqb2aS9Fyfe7gLeu
g2fxllZbbujDoicwgMzdQXoQrk36qbsUhBMADDtpS5ay+xJAS/RKWfhrivbcVPdB
/ukV+ZH30mFBw/6NYYHyPk8XKlAW7HtOA+xItOTwrW0DhBoQRntM4SAx/rNG1cmM
q+9jr98AvwKzK0/6zRh50b+u3sD8Pak0A8azdPLVd9rwi2jBHMBeOWSa4Kb4m4hY
5D2OsV7dqrsGxFmAyQ/CCmV992Iwf0UtTMrSc8IvWD2j0wtpP3w7p9sDxafGtv+z
AgMBAAGgKzASBgkqhkiG9w0BCQIxBQwDd2ZjMBUGCSqGSIb3DQEJBzEIDAYxMjM0
NTYwDQYJKoZIhvcNAQELBQADggEBABJkN0yyJJWHFbQLNILL+x6/hFHg6JmxvXnK
b+9DFH0IID6n8jtLkRE1QTjVj6LNr7g9kvei1tyDs4a7UFwSokGOJJP4jqlfPihk
2Vo8VR7IDbgmNG6pAgya+bTKiS0ImNeNB11Cc4ofCvYLY34qraRtyqBVxstEAlAm
t5GziFXbxFnZgDvn/pSmd8rorz8rNa9XUTAGhgoQJxPzoV0I+BHctH56FTOUJkPH
Gchs5jmyIAWWeCF+kXmG1trB5znIurpzRUoOK/XeGh06JIX1ofj83uLyxNCSEDQi
IetdBsMzu82P9TclZwiFXgsWylW2oin3Wuus4TDqm5Xlh0DzqjA=
-----END CERTIFICATE REQUEST-----
@@ -1,28 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC/qAi6vyAqmM+o
G7o3tGVBltV3pMMfDHIW0QR6JTy+sb8k+pVWG+zTKPzDnkC6gYsRYXd1cqb2aS9F
yfe7gLeug2fxllZbbujDoicwgMzdQXoQrk36qbsUhBMADDtpS5ay+xJAS/RKWfhr
ivbcVPdB/ukV+ZH30mFBw/6NYYHyPk8XKlAW7HtOA+xItOTwrW0DhBoQRntM4SAx
/rNG1cmMq+9jr98AvwKzK0/6zRh50b+u3sD8Pak0A8azdPLVd9rwi2jBHMBeOWSa
4Kb4m4hY5D2OsV7dqrsGxFmAyQ/CCmV992Iwf0UtTMrSc8IvWD2j0wtpP3w7p9sD
xafGtv+zAgMBAAECggEAPFuvkByEBVZFw6Qj08pAv1TA2qKtfpg9T/k4pz0V8dpp
n7w5DrrRrTixzeuHaBVHFkyzQe4/Lcg3houSNN9XOaMRt7BIdxgpPv9Qx0IxApdN
2XYDgec1T0M+9ptjlIglKC3Q9CXXhBjslvXXQ9GQYxzkDDMiaME9NuiCQMVOFttC
8VlyTXq/jHRie772Csu609DEE61ta4WFPgU10v6D33MiWzH66EjUMbXanhhetyGN
7gh9yEmKHhBwXjDAs1t6MIt9VfGHyscxt0Uns0DvFFQT5Tm8yY7Rj6HUmeDfChjK
0nysv64yZd2x9V7p85BYOw7xKbhBeW89oDyQ4NW1IQKBgQDCFlHhzGf9JPqD6qVb
761qG1EkK8HUDNZW6miCLxxrX1fNsMURBSfbfHGhI3+GVMGBt2/y8abjsxx6GKYf
qAp1cJgf+RY7+kash9/ew3cYCgMKKvlClaBXJkxbYeIOUpLDiSY5Qi3wrBbi65qk
PUdvmzlSHKw5JiAAXFUfStgWEwKBgQD8yzVS/5HCBeLm77InED8kpMqny5sbxLJ+
3Wuc4cPc4NSgiDCERB3MbstXYqFtKf2OOlTguT/pYqHfPgkBIXSx/1yvBf6YO2bN
c7IDvrtKew8EIPmOjnWnPYU3zmxZcbO3OYT+brZRT2D10uFWIIZtxzhSyHLy4zav
fZHMMf0j4QKBgF+MrXMENo2hjtMyyYWhUTZTjHbKM/o496yCakDtAIi7v3Y7+EiQ
yTZ85VP3LejsAPfjXvGzlf2zR+m0CNS83alDbSEQd6m/ZNu7aLM6d38WLrjqvxvQ
ncdJy32RisCSVj59XpwBwKwjjIDajJ8eq/R97pJGG2NnKYoD6sQlDIyRAoGBANzh
8kYDaajO2+RNrKzVVVb/ZtQW5ADvbcfMUStTWYC2MxPR7BKmMiNe6+3/EG4CMrsD
3QY+18lllWsrGVMTmJOvPZzw7/S0cq8yWGlNTvlVbVl+NpCJieQHrU+F3saIwy9l
4v8uXb/OTDp/eMV4xf1GBcDPxSDVyAKvBaYWR8oBAoGABXrZ8YaWkcTgVAmPfy7J
gYfOqH98qP1Jeo83dgY3Aon60NlpwVoAOfSIuNw+6CLQYmRUs2HqZI7J6BGMenHj
oWwnL0KNSjyE1O9AOLgXUlPiv53JLUTrVD1oGG0FvYewRpaIt9/337gJc9IVCa/C
y/whpOxKAivgmcSQQLdBfrs=
-----END PRIVATE KEY-----
@@ -1,23 +0,0 @@
-----BEGIN CERTIFICATE-----
MIID5TCCAs2gAwIBAgIUHTAul79DQ7u2F0isDV8VUcEV64IwDQYJKoZIhvcNAQEL
BQAwgYExCzAJBgNVBAYTAkNOMRIwEAYDVQQIDAlHdWFuZ2RvbmcxETAPBgNVBAcM
CFNoZW56aGVuMQwwCgYDVQQKDANXRkMxCzAJBgNVBAsMAklUMRAwDgYDVQQDDAd3
ZmMuY29tMR4wHAYJKoZIhvcNAQkBFg9zdXBwb3J0QHdmYy5jb20wHhcNMjUwMTAz
MTAyODI0WhcNMjcxMDI0MTAyODI0WjCBgTELMAkGA1UEBhMCQ04xEjAQBgNVBAgM
CUd1YW5nZG9uZzERMA8GA1UEBwwIU2hlbnpoZW4xDDAKBgNVBAoMA1dGQzELMAkG
A1UECwwCSVQxEDAOBgNVBAMMB3dmYy5jb20xHjAcBgkqhkiG9w0BCQEWD3N1cHBv
cnRAd2ZjLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMO7Rupe
LlfCceBlT/cLitpFFw3YUcE44FEA+xfDwMwfZY65Ahg/RA/AuHTeMI2397uFO4aP
lkKWowa3iNrIVEKhlxstfEvkXFDg8j+6686oXIRiSS/tLgVtUNhuQuy9h9y3OIRc
HaYccVedG5S8J93q2qklNpdU82/v+8hueHlYtC8I951kjzvW1Ks+f8rn7uoikR1+
nzRQBElQ3Lk1VB2f2JK589hfcem3o3DmOVqA4oadC97GbiFKPPqIDA/O5G4yxlLO
Va0c1NOMmjyT2S8snC7oT/FGi//LmQakfcNIPGJGPCL9QAj/Z3AbAPeUzsKofK1Y
boaiy9FZT+tAhrkCAwEAAaNTMFEwHQYDVR0OBBYEFL/5FQ2HpqZIYfQp0UCpcHcv
qPp4MB8GA1UdIwQYMBaAFL/5FQ2HpqZIYfQp0UCpcHcvqPp4MA8GA1UdEwEB/wQF
MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAC1+WYCwJg8rgQnoaFQ9haL8/2be/kbC
Wqmuow9nZWFiIloetKE/y6ME/oxggBWGTdZMNbbCZHZiwTXgmlJm2XrWPYXPrtBa
ua1NjssfePSZDbHYCfT9ySrFqQFpduccMmT3nJZRR00up93Mk1ccvUxEPE5Wr+qI
Y6J5ZVRAVEGmpWljFpodFowt3paeoq2e7ogeZt53LxLdTh8Jb1p4pbDyQdVVrVH/
Ee4JF+IwkkeLksdcW31D7/JNlg8Q+MBC4TG7EVMwKnxQGZmIcouy22JGyRbWObCX
xlVkf0H1hR2hwUZHDFTLQ6n/FjQYwWVjYnf4G5yU3xMDOH2p03wunXA=
-----END CERTIFICATE-----
@@ -1,28 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDDu0bqXi5XwnHg
ZU/3C4raRRcN2FHBOOBRAPsXw8DMH2WOuQIYP0QPwLh03jCNt/e7hTuGj5ZClqMG
t4jayFRCoZcbLXxL5FxQ4PI/uuvOqFyEYkkv7S4FbVDYbkLsvYfctziEXB2mHHFX
nRuUvCfd6tqpJTaXVPNv7/vIbnh5WLQvCPedZI871tSrPn/K5+7qIpEdfp80UARJ
UNy5NVQdn9iSufPYX3Hpt6Nw5jlagOKGnQvexm4hSjz6iAwPzuRuMsZSzlWtHNTT
jJo8k9kvLJwu6E/xRov/y5kGpH3DSDxiRjwi/UAI/2dwGwD3lM7CqHytWG6GosvR
WU/rQIa5AgMBAAECggEAEx5D8CDEp00OfTf8InHxzT3eIXuxiZ1t+K+PNxwnZPDE
pVcQG7DzS5QcGEs7JB6V7660+KDmEQlAcYekEhWq+EqrFSwhVdLfiwVb2CqAfbIv
fj1Q74Hb4ssRkGBdwFzHbGFHn5MVUMw6rG+DugiSXtBhrQ+d2FSDhjmjRum2cgiy
cSQYAxL84bpLbNdCUOgEM73nT+7salPwSntrDK99xYxhjmItwgYc9sUCjsUhou5v
oT4rbNckY0otDaD841IYdmqfU4LC04lhDdI0B8A1kvgls1JfG0TBcoXCn1280um/
VzRO94w7IEekNloVegS+3EAPwDL56vCbkZbxo2wAcQKBgQDJfxDsSeL/4YeX+7k3
uq539XucVCd/FZlh+DRyeuOy3V0XoOhTBiJQB2emynoWIZbVGDkJDuCEuUfJR0wn
ssrJCHJOqJEFiKM9EicojQwpX1R/3UQv1x0Tvrjp56OL3wTHZCljPXqs6D4yfPbi
edkrwgihHTdFXcx6HSkAjluXKQKBgQD4rQSj8loa7yU+tbOx++fRYDwd8vypNJl8
TZ0Gr4hswXY+UnQly2kRgyJJ5G0w6/913drQUUrn6hGvWaGt8+OoXJhr3LmkkosJ
EW8MR39vf6HvetMLDl1zLyS+kA9b8+1ipgQBd/Nfn6MCNf/3/s0kj01KVXK0Hjak
o13n9eA1EQKBgDqIfQQHGrg2bctKxq1Xv6L9XuE02Rxjy+DX13SCGm81OvvINHUZ
zRHudL/RBdI0A7r3hGoLNlGX+TCRU6AcoifwGjSbZzVyUelFwrZW8vd5x/Q09L/o
/3ti5hicv7e8G4lIoXVAwMhF1vuXrahwuROrFBKpiArQirvWiLiuohCxAoGBANrV
Jug/NRvOpy/wJhnSW8XcsgqI8d7U8tx4UF65yYwrEyr01FEOF3/ZriroYU5T35KR
kSUQ5KIBUV7FuYmivgxCr777lkJE0yU/ukFMCdDMuGxN4boxAfuC2Qr5Kwr4NUZC
YfQI4pqbmI8xhfduuogZsyJe33mxvNRVDyY5MPyBAoGARECPnpqCn0tx93L3lZe2
JpHUtouJNj2BroLM7P90I5epYPD/epvCqOmjTsHJWytLQ8oZqHnoBA6307PHhIsk
dZZJ5JjyLW8OqHxZBJAtmbwzYwicklMMFCq7kmJeIXFDbgDZTX0eX7zeBmuqhw71
R/PQtWoiMPAY6ReaW1dAruI=
-----END PRIVATE KEY-----
@@ -1,23 +0,0 @@
-----BEGIN CERTIFICATE-----
MIID5TCCAs2gAwIBAgIUDpe1aXJOe6VwcbF528vIPiRlFaEwDQYJKoZIhvcNAQEL
BQAwgYExCzAJBgNVBAYTAkNOMRIwEAYDVQQIDAlHdWFuZ2RvbmcxETAPBgNVBAcM
CFNoZW56aGVuMQwwCgYDVQQKDANXRkMxCzAJBgNVBAsMAklUMRAwDgYDVQQDDAd3
ZmMuY29tMR4wHAYJKoZIhvcNAQkBFg9zdXBwb3J0QHdmYy5jb20wHhcNMjUwMTAz
MTA1MjA5WhcNMjYwMTAzMTA1MjA5WjCBgTELMAkGA1UEBhMCQ04xEjAQBgNVBAgM
CUd1YW5nZG9uZzERMA8GA1UEBwwIU2hlbnpoZW4xDDAKBgNVBAoMA1dGQzELMAkG
A1UECwwCSVQxEDAOBgNVBAMMB3dmYy5jb20xHjAcBgkqhkiG9w0BCQEWD3N1cHBv
cnRAd2ZjLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK18xpnm
t1O42Fjj6mG/Z8CSwFcdG3vd5m1MmUlRh35/SR7xmOy1NIguEPuLOS1BTl02eePH
/H4KLfo12HbWtsHVDuwX1YFoXKxFKI7WCDSMdxPOIYxNQwL0sc74X3F+nNxKA4kW
Oi84jJA/C/kzrUkt1h+UqNhcx4oBfkvnjScjZO+4igHMrZ6FD8OmFP0JAV5msOSm
ojK1lzgEefbLwknX8gdk60iBzYKsGHLFrr3C2VOSQoeTjzxBXEeqIFmKLT4djmNi
ano1Bz5kicyzxdh21ITdzTMmeVwze6CTsxaKj6tC1f5kViQvrSWVmuHIpJnu/hXA
fCDBdVj/qiDeHG8CAwEAAaNTMFEwHQYDVR0OBBYEFKgXPMw5bfDUpNhqjzAP5qte
caofMB8GA1UdIwQYMBaAFKgXPMw5bfDUpNhqjzAP5qtecaofMA8GA1UdEwEB/wQF
MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJh2eTmJUHl+/WgIdaLZcCnFxcMAXpv0
iTVltQeF6iKQH2FSJdR1NM2+46wUQYmjPx9YCbyyQYFWHaVfD050Nwg2Qg/Pna+2
S/nQjunxTr+VbJHkGAKA3lbqC5jrdpYuOB8eykteIzzaGuzkaRQyPyZm3FsrpCvZ
vKazjAkvKnvqa0j48k03zV+l+EaHQgxtozRvhGi4TAPQL9Gr7DRlnJm7IuAzv4Bu
8pXlyHH2ko5INvPn1nlJhbM8M50RkxuPmrKCgcSFf4ngGDlPDj9m2vScxt5GTthc
pUv+yyfgCnUTiNK2U7Duq/pCJia4Ih7SIZQLLaoUY7B3vUgxQDF2KEY=
-----END CERTIFICATE-----
@@ -1,28 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCtfMaZ5rdTuNhY
4+phv2fAksBXHRt73eZtTJlJUYd+f0ke8ZjstTSILhD7izktQU5dNnnjx/x+Ci36
Ndh21rbB1Q7sF9WBaFysRSiO1gg0jHcTziGMTUMC9LHO+F9xfpzcSgOJFjovOIyQ
Pwv5M61JLdYflKjYXMeKAX5L540nI2TvuIoBzK2ehQ/DphT9CQFeZrDkpqIytZc4
BHn2y8JJ1/IHZOtIgc2CrBhyxa69wtlTkkKHk488QVxHqiBZii0+HY5jYmp6NQc+
ZInMs8XYdtSE3c0zJnlcM3ugk7MWio+rQtX+ZFYkL60llZrhyKSZ7v4VwHwgwXVY
/6og3hxvAgMBAAECggEAI7IbOPpYOTE8zplilecopV5sleAG0ic3rMCIf6X3T4dI
F8ZVFUs5elWkJ+WfB5k60wIM9VmmMZbNnABtQBJwuxQoBFrpEr3S5505OZ5/RLSs
IZaVn4UcJyUK2s+O787B3q+Z56B7q1Ci12EpiQZhfr+gIZJYZWA9rD8faeXETMts
VLsEK82aDW1KxQJpcHeJnwvy91/3Wt5gdMN5zwjlpIFkJQWrRRAdUgkjQQbuV+Z5
RkVqRt9U6ggsXwQqSL+OE/KIfMrnjRMJ8oUBhqeo0YW0MSMrfMnxqD4u4JKoB8/3
8kmm5js+YGY75PRobMTMj0XEQ2SlF0/UJP65RLCW6QKBgQDRCizwJng70Ml+k91l
KwWOYs8LaneYhYZ68CtP75Bq0vx23/OlFh2QgvFH/kDxMbK/Dwx+9VZ32TXUNlOh
YWS71SugwytKIQ85t1ZZhb9A4fM1eMg2RM4Ht5JNC+ysb+7aDLu2/i65CcBndUWx
RWp+8eGpQq7FoUtOg0Jj7jksOQKBgQDUdf5nWepBizj3nPsXoZ8rg1dwj4OvvUTq
9KFAr7VJciYDLApS5KuOhrF1ctW47XLeFNHYLuiHHWNngVjmvd24zVWXB7jovgV/
9tatIJymIDkmROiJT2zkO0bXN6oZe/pc0CvNBHC4ftyoJkv03Yw1FvbfJ2a3qpFl
SeP/hOrd5wKBgEje4Td+UZ+YcwVbCmzACJnQPBjgrnxO38hvfMnK229ByZyvCUJd
aUT9QJs2OPFbv9H2rwZ7A/+XirpFjfXN+822zBSotKiMyb/293URuNAndB8J0dGJ
PsFV7vxI0eJyyrLciXuLNEJw8c+fBAJ+DlfefioBAugGCDiAbV5kpy2RAoGAbpN+
tdGhTz2jh5QHRxRSIDZ6gtXexs9uGA78AguxAanMSOhZ8yyacVJ+986tl1LV7unN
EYPQd8n+23cBiw4UYMNVoYZeYZvMhv40WuTXQssQk29Xy2cwGFUVmJubByp0cmvR
8CE4fX1hYI6WB7pq55KtKBV8q2i1xY7AgFNwXc8CgYA5SuT9+Lrj+1CVBeM8FD1x
8ZeH4CrPrqczTPg6E7x1jTNzRY8Nd/2AYdDZ3KQRfT9tJS2Cdk9W4xc8QokzAxU7
XcmMSELa03xaxw2b5RWQ9jmu6Yj3zfX9BR7zB95fbjiRGDkCEj+VUMBx2a8xABFW
+SQiX9Zey0DDSYmn4brw5w==
-----END PRIVATE KEY-----
@@ -1,109 +0,0 @@
# spring配置
spring:
application:
name: wfc-payment
cloud:
nacos:
discovery:
server-addr: ${NACOS_SERVER_ADDR:wfc-nacos}:${NACOS_SERVER_PORT:8848}
namespace: ${NACOS_NAME_SPACE:wfc-prod}
main:
allow-bean-definition-overriding: true
redis:
host: wfc-redis
port: 6379
password:
datasource:
druid:
stat-view-servlet:
enabled: true
loginUsername: admin
loginPassword: 123456
dynamic:
druid:
initial-size: 5
min-idle: 5
maxActive: 20
maxWait: 60000
connectTimeout: 30000
socketTimeout: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
filters: stat,slf4j
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
datasource:
# 主库数据源
master:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://wfc-mysql:3306/wfc_user_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: 123456
# 从库数据源
# slave:
# username:
# password:
# url:
# driver-class-name:
config:
import: optional:file:/opt/wfc/conf/application-common.yml
# mybatis-plus配置
mybatis-plus:
# 搜索指定包别名
type-aliases-package: org.wfc.system
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapper-locations: classpath:mapper/**/*.xml
global-config:
db-config:
logic-delete-field: del_flag
logic-delete-value: 1
logic-not-delete-value: 0
# swagger configuration
swagger:
title: payment modules api
license: Powered By wfc
licenseUrl: https://wfc.vip
# payment configuration,
# alipay configuration
alipay:
appId: 9021000122699258
privateKey: MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC7YAcIXV5GJlTWBOoBcrVG1zKxHunznSjYXwTS2DM3YgloxzKye4apfcmBDVnoL93m4QrJTtbiHYvu4yJjJfJsQEY+Wo44IczhDypyu+Il6JpQOwylTs94/+3aaQ1wThsDaGs8edaFGteuw+1pUVl4nxF00fS1VoIR30riqAGFAXrPhcSA6Y9c8HK1htxCelICnPzjpqC4s8ZjrjS7FoyHP2ZAay5fx1VEtah30E4RvycFfV/i2+k3JGFOSeevdCx6Ufu+9Y/RaG4Sh84QuYRQUhAHUswlFDHpRrAnxHzt0zDkOkg3BrCT7vMtBbSOP9BdIhpVTaZm4diQdNbLSl4hAgMBAAECggEAKb1Xc7aQ1KGfTlmj4xSxawlvImOXjAwbWC+6fFlq91BgdjXBhl7b/Y+mvpfBymY3UUIaTAPC/HXGgT2ZoGqImTKsMyGrArgM0qm1M//EfdtV3L96rqxirTqduoSiWL0daWHuWXduoRH8r9K3ZTmY67TLh7FpiKevq9mI7fqs8/qgq5QAN4UPFb3Cq9hDNTU4l6+Bywdg1KkwJ2Jc98SlrIdVl+1eCMAgueLR0aNHTobyPBZ/KfwGRV0OQ3QqjLVgL3zlbzuylYhaZqPgxxd46vgWwkyMiiv7u2OyCetq4LFd+tcNDz0Yqk6rK9/S0oxbN8NM5DLkpwFh/433BoPS3QKBgQD/dsxNr2PYdPLp6pOvw7H2AFMH8CkwTlRg+2f/0fgQF14rJwZgEU6fL5A2JvQeRRC5mCff2m5tDqrS321JNyH/JIKJ+4J8I34GEo/kSCHL3RmyvJGQOQ/EpEyxvP8BV3ob6UO3LR58DOGlJr8eTsr3Y8o9cAMuknCNxvsd2LvybwKBgQC7xKkx4KIPBny6sCOtChOkgIrY3hOCi+ZsHQVESXKzeku0NkH/qrAG+S9pb1XCzXdM2HrzkMeuz6tqi+2TY8nORyY2DZHNW7FqzkAiZ/NO2AgGIlALq1ZfJZke2MxgtBnxSsQ03gfXP9opu/FsLH9a+s6edfHPvKD4kHxlLBfAbwKBgQDYvr6QmuKn4HHJLZGoau0uvw+ziHwp1AubTTLrxgYmAO2Qx0eNcqG2RfChQWOV2xtZnFMYhodyWCNvTsm2eOSLSTrIP3ByStq95DnZganLAgivsXX/W6qZOJ0poCTryoB79enSHKHktjksmjdFS6zBQRVyEvtgJDcC03Rz2lN8WQKBgQCCoJE4otb7bv7s/ccEBeOeaNKvhue5xUwbYKEeXZ6PYAA0sh5+GCf34flq90qJiFl7u4rl0Y4pfk35hLlV9XEasYLSzePmIuktrakOhpTNABus8MgRJjSjYsvAmwCsMf9uTx5qzSBVThWfPSH6qIY9LAj8Un9UjxzJb/Mqi19GvwKBgQC0/KB+3robTqy9KOV4iEKJ4kmnXDRu7ecpMyc8k5HzpolIHcXLZHkBK9pMCXBQ9Kwy6BjRGNnUZOahS+tvnMcjHpwdhu90r7D51GXW/+PeFtphYTscFhHv1yuWbbojzhKf69pZnsVmyllIBqRgtbkS2WNHxWo/peCg47TcLaQNMA==
publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhBZoE6p1TKpd/WsAJRTA2D6yUTzqLmZ73scxbPxxKwPIg2ys2Ap21u/lVmqBWO9Wf2Z7wUwr/6BP1PQqVpg0GAqU3yjjZ0LGfBitzMBMbGrlOLqJQ3PKgnUNmnOdLR4FlHCAjKtuyxjHkxBTHg/L4punk4lkFJQD8YvzFrYalS6WYw5j1/oq080NbcjPirPCRlsU7MRraQuUqSTdPwm2iHkroKwCEbGv+RtNJCfOkKNQVtRFFgPGMhU4nQ620gdfzsGJsNFKVJnD5SjeDWniBAbaGaVF4rEfKJPe6+XrcMg3h+9Fz+A2IU1KCCoth2neEZEaU1t0KBGxXIuo4efi/QIDAQAB
appCertPath: \u5E94\u7528\u516C\u94A5\u8BC1\u4E66
aliPayCertPath: \u652F\u4ED8\u5B9D\u516C\u94A5\u8BC1\u4E66
aliPayRootCertPath: \u652F\u4ED8\u5B9D\u6839\u8BC1\u4E66
serverUrl: https://openapi-sandbox.dl.alipaydev.com/gateway.do
domain: http://192.168.2.249
testDomain: http://129.204.171.210:8085
# wxpay configuration
wxpay:
appId:
appSecret:
mchId:
partnerKey:
certPath:
domain: http://192.168.2.249/u
# paypal configuration
paypal:
client-id: AfPgwFAmo9K7KCqiiGpNRCyQMSxI6V33eH-nEMnVndJNVEYOEOEn5wSPkHUybfzcjDLnBejt-RKnIfqX
client_secret: EOYQzSGuMaTMWodcppZUTz9v3H9j38yYiv8bmj4kLZl5NiSUJ0AJJuGlA1CU4oDtEX6jNdGNhsMCiAcN
sandBox: true
# stripe configuration
# 需要在https://dashboard.stripe.com/workbench/webhooks配置webhook,添加接收端-选择事件checkout.session.completed-端点URL填http(s)//ip/u-api/payment/stripe/callback
# endpoint-secret在创建webhook后生成
stripe:
secret-key: sk_test_51RHGN8FwutpVO5TqqmAkJNYMlWDPgwj4NVKPxcPKEXMGSPpEZ4yKwpGancV1vyPP74Pk3ETPUdAws0CfiH1jTN9v00kQ64suj5
domain: http://192.168.6.222/u
endpoint-secret: whsec_zBaAhDlSc6AdNBlbLzmbT0mfGCikA8IT
@@ -1,15 +0,0 @@
# 基础镜像
FROM openjdk:8-jre
# author
LABEL org.wfc.image.authors="wfc@wfc.org"
# 挂载目录
VOLUME /opt/wfc
# 创建目录
RUN mkdir -p /opt/wfc
# 指定路径
WORKDIR /opt/wfc
# 复制jar文件到路径
COPY ./jar/wfc-modules-payment.jar /opt/wfc/wfc-modules-payment.jar
# 启动系统服务
ENTRYPOINT ["java","-jar","wfc-modules-payment.jar"]
@@ -1 +0,0 @@
存放系统模块打包好的jar文件,用于docker启动应用。
@@ -1,58 +0,0 @@
# spring配置
spring:
redis:
host: wfc-redis
port: 6379
password:
datasource:
druid:
stat-view-servlet:
enabled: true
loginUsername: admin
loginPassword: 123456
dynamic:
druid:
initial-size: 5
min-idle: 5
maxActive: 20
maxWait: 60000
connectTimeout: 30000
socketTimeout: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
filters: stat,slf4j
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
datasource:
# 主库数据源
master:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://wfc-mysql:3306/wfc_system_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: 123456
# 从库数据源
# slave:
# username:
# password:
# url:
# driver-class-name:
config:
import: optional:file:/opt/wfc/conf/application-common.yml
# mybatis配置
mybatis:
# 搜索指定包别名
typeAliasesPackage: org.wfc.system
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath:mapper/**/*.xml
# swagger配置
swagger:
title: 系统模块接口文档
license: Powered By wfc
licenseUrl: https://wfc.vip
@@ -1,15 +0,0 @@
# 基础镜像
FROM openjdk:8-jre
# author
LABEL org.wfc.image.authors="wfc@wfc.org"
# 挂载目录
VOLUME /opt/wfc
# 创建目录
RUN mkdir -p /opt/wfc
# 指定路径
WORKDIR /opt/wfc
# 复制jar文件到路径
COPY ./jar/wfc-modules-system.jar /opt/wfc/wfc-modules-system.jar
# 启动系统服务
ENTRYPOINT ["java","-jar","wfc-modules-system.jar"]
@@ -1 +0,0 @@
存放系统模块打包好的jar文件,用于docker启动应用。
@@ -1,74 +0,0 @@
# spring配置
spring:
redis:
host: wfc-redis
port: 6379
password:
datasource:
druid:
stat-view-servlet:
enabled: true
loginUsername: admin
loginPassword: 123456
dynamic:
druid:
initial-size: 5
min-idle: 5
maxActive: 20
maxWait: 60000
connectTimeout: 30000
socketTimeout: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
filters: stat,slf4j
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
datasource:
# 主库数据源
master:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://wfc-mysql:3306/wfc_user_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: 123456
# 从库数据源
# slave:
# username:
# password:
# url:
# driver-class-name:
config:
import: optional:file:/opt/wfc/conf/application-common.yml
# mybatis配置
mybatis:
# 搜索指定包别名
typeAliasesPackage: org.wfc.user
config-location: classpath:mybatis-config.xml
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath:mapper/**/*.xml
# swagger配置
swagger:
title: 系统模块接口文档
license: Powered By wfc
licenseUrl: https://wfc.vip
# 提醒配置
reminder:
# 是否开启流量提醒
trafficEnable: true
# 流量提醒阈值,单位:百分比, 如剩余小于10%会触发邮件提醒
trafficThreshold: 10
# 是否开启余额提醒
balanceEnable: true
# 余额提醒阈值,单位:跟随系统, 如余额小于5元会触发邮件提醒
balanceThreshold: 5
# 流量提醒邮件标题
trafficTitle: 'Traffic Reminder'
# 余额提醒邮件标题
balanceTitle: 'Balance Reminder'
-15
View File
@@ -1,15 +0,0 @@
# 基础镜像
FROM openjdk:8-jre
# author
LABEL org.wfc.image.authors="wfc@wfc.org"
# 挂载目录
VOLUME /opt/wfc
# 创建目录
RUN mkdir -p /opt/wfc
# 指定路径
WORKDIR /opt/wfc
# 复制jar文件到路径
COPY ./jar/wfc-modules-user.jar /opt/wfc/wfc-modules-user.jar
# 启动系统服务
ENTRYPOINT ["java","-jar","wfc-modules-user.jar"]
@@ -1 +0,0 @@
存放系统模块打包好的jar文件,用于docker启动应用。
@@ -1,15 +0,0 @@
# 基础镜像
FROM openjdk:8-jre
# author
LABEL org.wfc.image.authors="wfc@wfc.org"
# 挂载目录
VOLUME /opt/wfc
# 创建目录
RUN mkdir -p /opt/wfc
# 指定路径
WORKDIR /opt/wfc
# 复制jar文件到路径
COPY ./jar/wfc-visual-monitor.jar /opt/wfc/wfc-visual-monitor.jar
# 启动系统服务
ENTRYPOINT ["java","-jar","wfc-visual-monitor.jar"]
@@ -1 +0,0 @@
存放监控中心打包好的jar文件,用于docker启动应用。
-15
View File
@@ -1,15 +0,0 @@
[Unit]
Description=WANFi Control and Billing System
After=network.target
Requires=network.target
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/wfc/docker
ExecStart=docker-compose start
ExecStop=docker-compose stop
ExecReload=docker-compose restart
[Install]
WantedBy=multi-user.target
-9
View File
@@ -1,9 +0,0 @@
Package: WFC
Version: 1.0.19
Section: WFC
Prioritt: optional
Architecture: amd64
Maintainer: wfc
Depends:
Description: WANFi Control and Billing System
-14
View File
@@ -1,14 +0,0 @@
# !/bin/bash
wfc_root_dir=/opt/wfc
systemd_dir=/etc/systemd/system
fe_dist_dir=${wfc_root_dir}/opt/wfc/docker/nginx/html/dist
wfc_bin_dir=${wfc_root_dir}/bin
chmod +rx ${wfc_root_dir}/bin/*
systemctl daemon-reload
systemctl enable wfccontrol.service
-6
View File
@@ -1,6 +0,0 @@
# !/bin/bash
systemctl daemon-reload
# systemctl stop wfccontrol.service
systemctl disable wfccontrol.service
-8
View File
@@ -1,8 +0,0 @@
# !/bin/bash
fe_dist_dir=/opt/wfc/docker/nginx/html/dist
# clear front-end old hash js files
rm -rf ${fe_dist_dir}/sys
rm -rf ${fe_dist_dir}/u
-7
View File
@@ -1,7 +0,0 @@
# !/bin/bash
wfc_bin_dir=/opt/wfc/bin
${wfc_bin_dir}/wfccontrol.sh stop
${wfc_bin_dir}/wfcsetup.sh rm all
exit 0
File diff suppressed because it is too large. Load diff
@@ -1,997 +0,0 @@
**修订记录**
| 修订日期 | 版本号 | 修订内容 | 修订人 | 备注 |
| ---------- | ------ | --------------------------- | ------------------ | ---- |
| 2024/11/13 | V1.0 | 初稿 | 张树忠/李昌/蔡育超 | |
| 2024/11/13 | V1.1 | 完善架构设计和描述 | 张树忠 | |
| 2024/11/30 | V1.2 | 增加计费和套餐设计 | 张树忠 | |
| 2025/02/17 | V1.3 | 架构修改,去掉多余微服务 | 张树忠 | |
| 2025/02/24 | V1.4 | 增加数据库表设计,业务流程图 | 张树忠 | |
| 2025/06/24 | V1.5 | 修改名称WANFi为MacroHub | 张树忠 | |
---
# **MacroHub软件系统设计文档**
# 1. 需求分析
MacroHub控制平台用于提供给运营商用于AP设备的管理监控,并对终端用户进行管理和计费管理。具体的业务需求概括如下:
## 1.1. 使用对象定义
> a) "客户"指购买AP设备的B端公司或组织,包含有多个管理和运维人员
>
> b) "用户"指使用改B端提供的的WiFi服务的C端用户,一个用户只有一个账号,一个账号可以使用多个终端设备
## 1.2. 平台需求定义
> a) 客户平台:为B端客户提供的控制和费用管理界面,用于AP的远程管理,配置,运行检测(根据API 文档逐一实现 Omada平台上的功能),管理用户数据、设备信息和计费信息
> b) 用户平台:为C端客户提供的个人信息管理:用于C端用户缴费以及个人信息管理,终端设备管理
> c) 客户平台包含用户平台的信息,但用户平台无法获取客户平台信息
## 1.3. 商业模式定义
> a. 客户服务用户(比如运营商):包含完整的客户平台和用户平台功能
> b. 客户服务设备(比如农场采购,直接用于农场智能设备,没有用户参与):只需要开发客户平台,以及客户平台中的设备信息管理,无需用户信息管理以及缴费系统
> c. 二者在开发系统上和数据库结构上尽可能兼容,保证一套系统可以为二者服务
> d. 费用以设备为维度进行管理,即通过数据库管理每一个设备的流量,使用时长等该需求是指一个用户/账号下的多个设备可以单独计费??)
> e. 费用以用户为维度进行收费,每个用户会收到一个账单,包含账户下设备数量,使用流量,使用时长等
![客户平台和用户平台数据库关系图](image/admin-user-portal.png)
# 2. 系统架构设计
![](image/MacroHub-Architecture.png)
## 2.1. 架构说明
> a) 微服务架构
> b) B/S模式
> c) 支持本地和云部署
## 2.2. 开发运行环境和技术栈
> a) 操作系统:
Ubuntu 22.04
> b) 数据库:
MySQL 5.7
Redis 7.4.2
MongoDB 7.0.15 (用于Omada SDN Controller)
ElasticsSearch 7.1 用于大数据文本的查询 (暂未使用)
> c) 后端开发语言:
Java 1.8
SprintgBoot 2.7
SpringCloud 2021.0.8
SpringCloudAlibaba 2021.0.5.0
> d) 前端开发语言:
HTML+CSS,
Vue.js 3.4.27
AntD 4.2.2
# 3. 业务流程
## 3.1. 用户登录注册
* 用户注册,需填写个人信息,邮箱,手机号,实名认证等
* 用户连接MacroHub时,通过网页进行登录
* 登陆后,后端API获取当前连接设备的MAC地址,如果该设备未被绑定到数据库中,则由后端API将当前设备绑定到数据库中
![](image/user-login-register-1.png)
## 3.2. 终端设备访问控制
* 终端设备连接AP热点,门户拦截
* 用户登录,判断是否充值有效套餐或者余额是否为0
* 如果存在套餐流量不为0或者余额部位0,则授权终端设备Internet连接准入
* 用户平台定时监测终端设备上网流量并实时计算套餐流量或余额
* 如果套餐流量为0且余额为0,则去授权终端设备Internet接入权限
![](image/client-auth-p1.png)
# 4. 数据库设计
## 4.1. 客户数据库表设计
系统采用 MySQL 数据库,字符集为 utf8mb4,主要涉及系统配置、部门、设备、数据字典、定时任务、日志、菜单、角色以及用户管理等模块。
### 4.1.1. 数据库架构
- **数据库名称**:`wfc_system_db`
- **字符集**:utf8mb4
- **校对规则**:utf8mb4_general_ci
### 4.1.2. 客户平台表总览
| 表名 | 主键 | 备注说明 | 说明 |
| -------------- | ---------------- | ------------------ | ------------------------ |
| sys_config | config_id | 参数配置表 | 存储系统参数配置信息 |
| sys_dept | dept_id | 部门表 | 存储部门信息 |
| sys_device | id | 客户平台-设备表 | 存储设备信息 |
| sys_dict_data | dict_code | 字典数据表 | 存储字典数据 |
| sys_dict_type | dict_id | 字典类型表 | 存储字典类型 |
| sys_job | job_id | 定时任务调度表 | 存储定时任务调度信息 |
| sys_job_log | job_log_id | 定时任务调度日志表 | 存储定时任务调度日志信息 |
| sys_logininfor | info_id | 系统访问记录 | 存储系统访问记录 |
| sys_menu | menu_id | 菜单权限表 | 存储菜单权限信息 |
| sys_oper_log | oper_id | 操作日志记录 | 存储操作日志记录 |
| sys_post | post_id | 岗位信息表 | 存储岗位信息 |
| sys_role | role_id | 角色信息表 | 存储角色信息 |
| sys_role_dept | role_id, dept_id | 角色和部门关联表 | 存储角色和部门的关联信息 |
| sys_role_menu | role_id, menu_id | 角色和菜单关联表 | 存储角色和菜单的关联信息 |
| sys_user | user_id | 用户信息表 | 存储用户信息 |
| sys_user_post | user_id, post_id | 用户与岗位关联表 | 存储用户与岗位的关联信息 |
| sys_user_role | user_id, role_id | 用户和角色关联表 | 存储用户和角色的关联信息 |
---
### 4.1.3 表结构设计
#### 参数配置表 - sys_config
用于存储全局系统配置参数。
| 列名 | 数据类型 | 约束 | 说明 |
| ------------ | ------------ | --------------------------- | -------------------------------------- |
| config_id | int(11) | PRIMARY KEY``AUTO_INCREMENT | 参数主键 |
| config_name | varchar(100) | DEFAULT '' | 参数名称 |
| config_key | varchar(100) | DEFAULT '' | 参数键名 |
| config_value | varchar(500) | DEFAULT '' | 参数键值 |
| config_type | char(1) | DEFAULT 'N' | 系统内置标识(Y表示内置, N表示非内置) |
| create_by | varchar(64) | DEFAULT '' | 创建者 |
| create_time | datetime | NULLABLE | 创建时间 |
| update_by | varchar(64) | DEFAULT '' | 更新者 |
| update_time | datetime | NULLABLE | 更新时间 |
| remark | varchar(500) | NULLABLE | 备注 |
---
#### 部门表 - sys_dept
存储各部门信息,支持层级结构。
| 列名 | 数据类型 | 约束 | 说明 |
| ----------- | ------------ | --------------------------- | ------------------------ |
| dept_id | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 部门 ID |
| parent_id | bigint(20) | DEFAULT 0 | 父部门 ID |
| ancestors | varchar(50) | DEFAULT '' | 祖级列表 |
| dept_name | varchar(30) | DEFAULT '' | 部门名称 |
| order_num | int(11) | DEFAULT 0 | 显示顺序 |
| leader | varchar(20) | NULLABLE | 负责人 |
| phone | varchar(11) | NULLABLE | 联系电话 |
| email | varchar(50) | NULLABLE | 邮箱 |
| status | char(1) | DEFAULT '0' | 部门状态(0正常、1停用) |
| del_flag | char(1) | DEFAULT '0' | 删除标志(0存在,2删除) |
| create_by | varchar(64) | DEFAULT '' | 创建者 |
| create_time | datetime | NULLABLE | 创建时间 |
| update_by | varchar(64) | DEFAULT '' | 更新者 |
| update_time | datetime | NULLABLE | 更新时间 |
| remark | varchar(500) | NULLABLE | 备注 |
---
#### 系统设备表 - sys_device
存储客户平台中设备的各项信息。
| 列名 | 数据类型 | 约束 & 默认值 | 说明 |
| ------------------ | ------------ | --------------------------- | ----------------------- |
| id | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 主键 |
| site_id | varchar(64) | NULLABLE | 站点 ID |
| mac | varchar(64) | NULLABLE | MAC 地址 |
| name | varchar(64) | NULLABLE | 设备名称 |
| type | varchar(32) | NULLABLE | 类型 |
| subtype | varchar(32) | NULLABLE | 子类型 |
| device_series_type | varchar(32) | NULLABLE | 产品系列类型 |
| model | varchar(64) | NULLABLE | 设备型号 |
| ip | varchar(64) | NULLABLE | IP 地址 |
| ipv6s | varchar(255) | NULLABLE | IPv6 地址(可能多个) |
| uptime | varchar(64) | NULLABLE | 在线时长 |
| status | int(11) | NULLABLE | 状态 |
| last_seen | bigint(20) | NULLABLE | 最后在线时间 |
| cpu_util | int(11) | NULLABLE | CPU 利用率 |
| mem_util | int(11) | NULLABLE | 内存利用率 |
| sn | varchar(64) | NULLABLE | 序列号 |
| license_status | int(11) | NULLABLE | 授权状态 |
| tag_name | varchar(64) | NULLABLE | Tag Name |
| uplink_device_mac | varchar(64) | NULLABLE | Uplink Device Mac |
| uplink_device_name | varchar(64) | NULLABLE | Uplink Device Name |
| uplink_device_port | varchar(64) | NULLABLE | Uplink Device Port |
| link_speed | int(11) | NULLABLE | Link Speed |
| duplex | int(11) | NULLABLE | Duplex |
| switch_consistent | tinyint(1) | NULLABLE | Switch Consistent |
| public_ip | varchar(64) | NULLABLE | Public IP |
| firmware_version | varchar(64) | NULLABLE | Firmware Version |
| del_flag | tinyint(1) | NULLABLE | 删除标志(0存在 1删除) |
| create_by | bigint(20) | NULLABLE | 创建人 |
| create_time | datetime | NULLABLE | 创建时间 |
| update_by | bigint(20) | NULLABLE | 更新人 |
| update_time | datetime | NULLABLE | 更新时间 |
#### 字典相关
##### 字典数据表 - sys_dict_data
存储系统使用的字典数据,包含常用的选项列表。
| 列名 | 数据类型 | 约束 | 说明 |
| ----------- | ------------ | --------------------------- | ------------------- |
| dict_code | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 字典编码 |
| dict_sort | int(11) | DEFAULT 0 | 字典排序 |
| dict_label | varchar(100) | DEFAULT '' | 字典标签 |
| dict_value | varchar(100) | DEFAULT '' | 字典键值 |
| dict_type | varchar(100) | DEFAULT '' | 字典类型 |
| css_class | varchar(100) | NULLABLE | 样式属性(扩展) |
| list_class | varchar(100) | NULLABLE | 列表显示样式 |
| is_default | char(1) | DEFAULT 'Y' | 是否默认(Y/N) |
| status | char(1) | DEFAULT '0' | 状态(0正常 1停用) |
| create_by | varchar(64) | DEFAULT '' | 创建者 |
| create_time | datetime | NULLABLE | 创建时间 |
| update_by | varchar(64) | DEFAULT '' | 更新者 |
| update_time | datetime | NULLABLE | 更新时间 |
| remark | varchar(500) | NULLABLE | 备注 |
---
##### 字典类型表 - sys_dict_type
存放字典分组及类型定义。
| 列名 | 数据类型 | 约束 | 说明 |
| ----------- | ------------ | --------------------------- | ------------------- |
| dict_id | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 字典主键 |
| dict_name | varchar(100) | DEFAULT '' | 字典名称 |
| dict_type | varchar(100) | DEFAULT ''``UNIQUE | 字典类型标识 |
| status | char(1) | DEFAULT '0' | 状态(0正常 1停用) |
| create_by | varchar(64) | DEFAULT '' | 创建者 |
| create_time | datetime | NULLABLE | 创建时间 |
| update_by | varchar(64) | DEFAULT '' | 更新者 |
| update_time | datetime | NULLABLE | 更新时间 |
| remark | varchar(500) | NULLABLE | 备注 |
---
#### 定时任务相关
##### 定时任务表 - sys_job
存储各定时任务的配置信息。
| 列名 | 数据类型 | 约束 | 说明 |
| --------------- | ------------ | --------------------------- | --------------------------------------------- |
| job_id | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 任务ID |
| job_name | varchar(64) | NOT NULL, DEFAULT '' | 任务名称 |
| job_group | varchar(64) | NOT NULL, DEFAULT 'DEFAULT' | 任务组名称 |
| invoke_target | varchar(500) | NOT NULL | 调用目标字符串 |
| cron_expression | varchar(255) | DEFAULT '' | CRON 表达式 |
| misfire_policy | varchar(20) | DEFAULT '3' | 错误处理策略(1立即执行 2执行一次 3放弃执行) |
| concurrent | char(1) | DEFAULT '1' | 是否并发执行(0允许、1禁止) |
| status | char(1) | DEFAULT '0' | 任务状态(0正常 1暂停) |
| create_by | varchar(64) | NULLABLE | 创建者 |
| create_time | datetime | NULLABLE | 创建时间 |
| update_by | varchar(64) | NULLABLE | 更新者 |
| update_time | datetime | NULLABLE | 更新时间 |
| remark | varchar(500) | NULLABLE | 备注信息 |
记录示例包括 Omada 同步任务及初始化任务。
##### 定时任务日志表 - sys_job_log
记录任务执行的日志信息。
| 列名 | 数据类型 | 约束 | 说明 |
| -------------- | ------------- | --------------------------- | ------------------------ |
| job_log_id | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 任务日志ID |
| job_name | varchar(64) | NOT NULL | 任务名称 |
| job_group | varchar(64) | NOT NULL | 任务组名称 |
| invoke_target | varchar(500) | NOT NULL | 调用目标字符串 |
| job_message | varchar(500) | 可空 | 日志信息 |
| status | char(1) | DEFAULT '0' | 执行状态(0成功、1失败) |
| exception_info | varchar(2000) | DEFAULT '' | 异常信息 |
| create_time | datetime | NULLABLE | 执行时间 |
---
#### 系统访问记录 - sys_logininfor
记录系统用户的登录访问情况。
| 列名 | 数据类型 | 约束 | 说明 |
| ----------- | ------------ | --------------------------- | ------------------------ |
| info_id | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 访问记录主键 |
| user_name | varchar(50) | DEFAULT '' | 用户账号 |
| ipaddr | varchar(128) | DEFAULT '' | 登录 IP 地址 |
| status | char(1) | DEFAULT '0' | 登录状态(0成功,1失败) |
| msg | varchar(255) | DEFAULT '' | 提示信息 |
| access_time | datetime | NULLABLE | 访问时间 |
辅助索引包括 status 及 access_time。
---
#### 菜单权限表 - sys_menu
存储系统菜单信息以及相应的访问权限标识。
| 列名 | 数据类型 | 约束 | 说明 |
| ----------- | ------------ | --------------------------- | ------------------------------------- |
| menu_id | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 菜单 ID |
| menu_name | varchar(50) | NOT NULL | 菜单名称,如 'menu.system.management' |
| parent_id | bigint(20) | DEFAULT 0 | 父级菜单 ID |
| order_num | int(11) | DEFAULT 0 | 显示顺序 |
| path | varchar(200) | DEFAULT '' | 路由地址 |
| component | varchar(255) | DEFAULT NULL | 组件路径 |
| menu_type | char(1) | | 类型(M:目录, C:菜单, F:按钮) |
| visible | char(1) | DEFAULT '0' | 菜单显示状态(0显示,1隐藏) |
| status | char(1) | DEFAULT '0' | 菜单状态(0正常,1停用) |
| perms | varchar(100) | DEFAULT NULL | 权限标识 |
| icon | varchar(100) | DEFAULT '#' | 菜单图标 |
| create_by | varchar(64) | DEFAULT '' | 创建者 |
| create_time | datetime | NULLABLE | 创建时间 |
| update_by | varchar(64) | DEFAULT '' | 更新者 |
| update_time | datetime | NULLABLE | 更新时间 |
| remark | varchar(500) | DEFAULT '' | 备注 |
| name | varchar(30) | DEFAULT NULL | 菜单 key,作为前端标识使用 |
记录插入部分展示了系统管理、工具、账户管理、角色管理、菜单管理、部门管理、岗位管理、字典管理以及多项操作权限的菜单。
---
#### 操作日志记录 - sys_oper_log
记录用户在系统中的各项操作,用于安全审计。
| 列名 | 数据类型 | 约束 | 说明 |
| -------------- | ------------- | --------------------------- | -------------------------------------- |
| oper_id | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 日志主键 |
| title | varchar(50) | DEFAULT '' | 模块标题 |
| business_type | int(11) | DEFAULT 0 | 业务类型(0其它、1新增、2修改、3删除) |
| method | varchar(100) | DEFAULT '' | 方法名称 |
| request_method | varchar(10) | DEFAULT '' | 请求方式 |
| oper_name | varchar(50) | DEFAULT '' | 操作人员 |
| dept_name | varchar(50) | DEFAULT '' | 部门名称 |
| oper_url | varchar(255) | DEFAULT '' | 请求 URL |
| oper_ip | varchar(128) | DEFAULT '' | IP 地址 |
| oper_location | varchar(255) | DEFAULT '' | 操作地点 |
| oper_param | varchar(2000) | DEFAULT '' | 请求参数 |
| json_result | varchar(2000) | DEFAULT '' | 返回结果 |
| status | int(11) | DEFAULT 0 | 操作状态(0正常、1异常) |
| error_msg | varchar(2000) | DEFAULT '' | 错误消息 |
| oper_time | datetime | NULLABLE | 操作时间 |
| cost_time | bigint(20) | DEFAULT 0 | 消耗时间(毫秒) |
附带建立了 business_type、status 及 oper_time 的索引。
---
#### 岗位信息表 - sys_post
记录系统中定义的岗位信息。
| 列名 | 数据类型 | 约束 | 说明 |
| ----------- | ------------ | --------------------------- | -------------------- |
| post_id | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 岗位 ID |
| post_code | varchar(64) | NOT NULL | 岗位编码 |
| post_name | varchar(50) | NOT NULL | 岗位名称 |
| post_sort | int(11) | NOT NULL | 显示顺序 |
| status | char(1) | NOT NULL | 状态(0正常、1停用) |
| create_by | varchar(64) | DEFAULT '' | 创建者 |
| create_time | datetime | NULLABLE | 创建时间 |
| update_by | varchar(64) | DEFAULT '' | 更新者 |
| update_time | datetime | NULLABLE | 更新时间 |
| remark | varchar(500) | DEFAULT NULL | 备注 |
示例记录定义了 administrator、manager、hr 及 user 岗位。
---
#### 用户信息表 - sys_user
存储用户账号及相关信息,实现系统登录和管理。
| 列名 | 数据类型 | 约束 | 说明 |
| ----------- | ------------ | --------------------------- | ------------------------------------ |
| user_id | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 用户 ID |
| dept_id | bigint(20) | NULLABLE | 所属部门 ID |
| user_name | varchar(30) | NOT NULL | 用户账号 |
| nick_name | varchar(30) | NOT NULL | 用户昵称 |
| user_type | varchar(2) | DEFAULT '00' | 用户类型(例如:00系统用户) |
| email | varchar(50) | DEFAULT '' | 用户邮箱 |
| phonenumber | varchar(11) | DEFAULT '' | 手机号码 |
| sex | char(1) | DEFAULT '0' | 性别(0男、1女、2未知) |
| avatar | varchar(100) | DEFAULT '' | 头像地址 |
| password | varchar(100) | DEFAULT '' | 密码(通常加密存储,如 bcrypt 结果) |
| status | char(1) | DEFAULT '0' | 帐号状态(0正常、1停用) |
| del_flag | char(1) | DEFAULT '0' | 删除标志(0存在、2删除) |
| login_ip | varchar(128) | DEFAULT '' | 最后登录IP |
| login_date | datetime | NULLABLE | 最后登录时间 |
| create_by | varchar(64) | DEFAULT '' | 创建者 |
| create_time | datetime | NULLABLE | 创建时间 |
| update_by | varchar(64) | DEFAULT '' | 更新者 |
| update_time | datetime | NULLABLE | 更新时间 |
| remark | varchar(500) | DEFAULT NULL | 备注 |
系统默认记录了超级管理员(super)、管理员(admin)等用户信息。
---
#### 用户与岗位关联表 - sys_user_post
用于关联用户与其所属岗位。
| 列名 | 数据类型 | 约束 | 说明 |
| ------- | ---------- | ---------------------- | ------- |
| user_id | bigint(20) | PRIMARY KEY (联合主键) | 用户 ID |
| post_id | bigint(20) | PRIMARY KEY (联合主键) | 岗位 ID |
---
#### 用户与角色关联表 - sys_user_role
用于关联用户与分配的角色,实现权限管理。
| 列名 | 数据类型 | 约束 | 说明 |
| ------- | ---------- | ---------------------- | ------- |
| user_id | bigint(20) | PRIMARY KEY (联合主键) | 用户 ID |
| role_id | bigint(20) | PRIMARY KEY (联合主键) | 角色 ID |
插入示例中,用户 1 分配了角色 1(Supervisor),用户 2 分配了角色 2(Administrator)。
---
#### 角色信息表 - sys_role
定义系统内各角色及其基本属性。
| 列名 | 数据类型 | 约束 | 说明 |
| ------------------- | ------------ | --------------------------- | -------------------------------------- |
| role_id | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 角色 ID |
| role_name | varchar(30) | NOT NULL | 角色名称 |
| role_key | varchar(100) | NOT NULL | 角色权限字符串(作为 RBAC 标识) |
| role_sort | int(11) | 可空 | 显示顺序 |
| data_scope | char(1) | DEFAULT '1' | 数据权限范围(例如全部、自定、部门等) |
| menu_check_strictly | tinyint(1) | DEFAULT 1 | 菜单树选择时是否关联显示 |
| dept_check_strictly | tinyint(1) | DEFAULT 1 | 部门树选择时是否关联显示 |
| status | char(1) | NOT NULL | 角色状态(0正常、1停用) |
| del_flag | char(1) | DEFAULT '0' | 删除标志(0存在、2删除) |
| create_by | varchar(64) | DEFAULT '' | 创建者 |
| create_time | datetime | NULLABLE | 创建时间 |
| update_by | varchar(64) | DEFAULT '' | 更新者 |
| update_time | datetime | NULLABLE | 更新时间 |
| remark | varchar(500) | NULLABLE | 备注 |
示例中定义了 Supervisor、Administrator 及 User 角色。
---
#### 角色与部门关联表 - sys_role_dept
用于关联角色和部门,控制数据权限。
| 列名 | 数据类型 | 约束 | 说明 |
| ------- | ---------- | ---------------------- | ------- |
| role_id | bigint(20) | PRIMARY KEY (联合主键) | 角色 ID |
| dept_id | bigint(20) | PRIMARY KEY (联合主键) | 部门 ID |
---
#### 角色与菜单关联表 - `sys_role_menu`
用于关联角色与菜单,实现系统权限的控制。
| 列名 | 数据类型 | 约束 | 说明 |
| ------- | ---------- | ---------------------- | ------- |
| role_id | bigint(20) | PRIMARY KEY (联合主键) | 角色 ID |
| menu_id | bigint(20) | PRIMARY KEY (联合主键) | 菜单 ID |
### 4.1.4. 关系与数据流
- **用户-角色**:通过 `sys_user_role` 表实现,一个用户可以拥有多个角色。
- **角色-菜单**:通过 `sys_role_menu` 表关联角色与菜单,实现权限分配。
- **用户-岗位**:通过 `sys_user_post` 实现,方便对岗位信息管理。
- **角色-部门**:通过 `sys_role_dept` 表实现角色对部门数据的访问控制。
- **数据字典**:`sys_dict_type` 定义字典类型,`sys_dict_data` 存储各字典项,系统中各模块均可引用以保证数据一致性。
## 4.2. 用户平台数据库表设计
### 4.2.1. 数据库架构
- **数据库名称**:`wfc_user_db`
- **字符集**:utf8mb4
- **校对规则**:utf8mb4_general_ci
### 4.2.2. 用户平台表总览
---
| 表名 | 主键 | 备注说明 | 说明 |
| ----------------- | ----------- | ------------------- | ------------------------------------------------------- |
| u_account | id | 用户平台-账户表 | 存储用户账户信息(余额、套餐、流量、时长等) |
| u_account_package | id | 用户平台-账户套餐表 | 存储账户对应的套餐信息,如套餐流量、时长、有效期等 |
| u_bill | id | 用户平台-账单表 | 存储账单记录,包括金额、状态、支付信息等 |
| u_bill_rule | id | 用户平台-计费规则表 | 存储计费规则,包括价格、流量、单位及状态等 |
| u_cdr | id | 用户平台_用户话单表 | 存储用户话单数据,如流量、速率、数据包信息等 |
| u_cdr_history | id | 用户平台_话单历史表 | 存储详细话单历史记录,包括时长、流量等 |
| u_client | id | 用户平台_用户设备表 | 存储用户设备信息,如设备名称、mac 地址、设备类型等 |
| u_device | id | 用户平台_AP设备表 | 存储 AP(无线接入点)设备信息 |
| u_order | id | 用户平台-订单表 | 存储订单信息,包括订单编号、订单金额及状态等 |
| u_package | id | 用户平台-套餐表 | 存储套餐信息,如套餐价格、流量、时长、设备数等 |
| u_payment | id | 用户平台-支付表 | 存储支付相关信息,包括支付名称、类型、网关、证书等 |
| u_rate_limit | id | 用户平台-带宽限速表 | 存储限速设置,如下行/上行限速及启用状态 |
| u_recharge | recharge_id | 用户平台_用户信息表 | 存储充值信息,关联 u_user 表;外键约束确保用户存在 |
| u_user | user_id | 用户平台_用户信息表 | 存储用户基本信息,包括用户名、昵称、邮件、密码等 |
| u_kyc | kyc_id | 用户平台_用户信息表 | 存储实名认证信息(KYC),包括真实姓名、证件类型、状态等 |
### 4.2.2. 表结构设计
---
#### 用户账号信息 - u_account
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| ----------------- | ------------- | ------------- | ------ | -------------- | ----------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | 主键 |
| user_id | bigint(20) | YES | NULL | – | 用户ID |
| balance | decimal(18,4) | YES | NULL | – | 余额 |
| balance_used | decimal(18,4) | YES | NULL | – | 余额已使用 |
| package_id | bigint(20) | YES | NULL | – | 套餐ID |
| start_time | datetime | YES | NULL | – | 开始时间 |
| end_time | datetime | YES | NULL | – | 结束时间 |
| traffic | bigint(20) | YES | NULL | – | 流量 |
| traffic_used | bigint(20) | YES | NULL | – | 流量已使用 |
| duration | bigint(20) | YES | NULL | – | 时长 |
| duration_used | bigint(20) | YES | NULL | – | 时长已使用 |
| client_num | int(11) | YES | NULL | – | 在线设备数 |
| client_num_used | int(11) | YES | NULL | – | 在线设备数已使用 |
| expired_time | datetime | YES | NULL | – | 失效时间 |
| package_name | varchar(64) | YES | NULL | – | 套餐名称 |
| period_num | int(11) | YES | NULL | – | 有效期数 |
| period_type | tinyint(4) | YES | NULL | – | 有效期类型 |
| price | decimal(18,4) | YES | NULL | – | 价格 |
| remark | varchar(500) | YES | NULL | – | 备注 |
| rate_limit_enable | tinyint(1) | YES | 0 | – | 带宽是否限制 |
| traffic_enable | tinyint(1) | YES | 0 | – | 流量是否限制 |
| duration_enable | tinyint(1) | YES | 0 | – | 时长是否限制 |
| client_num_enable | tinyint(1) | YES | 0 | – | 在线设备数是否限制 |
| rate_limit_name | varchar(32) | YES | NULL | – | 限速名称 |
| down_limit | bigint(20) | YES | NULL | – | 下行限速 |
| down_limit_enable | tinyint(1) | YES | 0 | – | 下行限速启用 |
| up_limit | bigint(20) | YES | NULL | – | 上行限速 |
| up_limit_enable | tinyint(1) | YES | 0 | – | 上行限速启用 |
| del_flag | tinyint(1) | YES | 0 | – | 删除标志(0存在 1删除) |
| create_by | bigint(20) | YES | NULL | – | 创建人 |
| create_time | datetime | YES | NULL | – | 创建时间 |
| update_by | bigint(20) | YES | NULL | – | 更新人 |
| update_time | datetime | YES | NULL | – | 更新时间 |
---
#### 账号与套餐关系表 - u_account_package
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| ----------------- | ------------- | ------------- | ------ | -------------- | ----------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | 主键 |
| account_id | bigint(20) | YES | NULL | – | 账户ID |
| package_id | bigint(20) | YES | NULL | – | 套餐ID |
| traffic | bigint(20) | YES | NULL | – | 流量 |
| duration | bigint(20) | YES | NULL | – | 时长 |
| client_num | int(11) | YES | NULL | – | 在线设备数 |
| expired_time | datetime | YES | NULL | – | 失效时间 |
| package_name | varchar(64) | YES | NULL | – | 套餐名称 |
| period_num | int(11) | YES | NULL | – | 有效期数 |
| period_type | tinyint(4) | YES | NULL | – | 有效期类型 |
| price | decimal(18,4) | YES | NULL | – | 价格 |
| remark | varchar(500) | YES | NULL | – | 备注 |
| rate_limit_enable | tinyint(1) | YES | 0 | – | 带宽是否限制 |
| traffic_enable | tinyint(1) | YES | 0 | – | 流量是否限制 |
| duration_enable | tinyint(1) | YES | 0 | – | 时长是否限制 |
| client_num_enable | tinyint(1) | YES | 0 | – | 在线设备数是否限制 |
| rate_limit_name | varchar(32) | YES | NULL | – | 限速名称 |
| down_limit | bigint(20) | YES | NULL | – | 下行限速 |
| down_limit_enable | tinyint(1) | YES | 0 | – | 下行限速启用 |
| up_limit | bigint(20) | YES | NULL | – | 上行限速 |
| up_limit_enable | tinyint(1) | YES | 0 | – | 上行限速启用 |
| del_flag | tinyint(1) | YES | 0 | – | 删除标志(0存在 1删除) |
| create_by | bigint(20) | YES | NULL | – | 创建人 |
| create_time | datetime | YES | NULL | – | 创建时间 |
| update_by | bigint(20) | YES | NULL | – | 更新人 |
| update_time | datetime | YES | NULL | – | 更新时间 |
---
#### 账单表 - u_bill
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| -------------- | ------------- | ------------- | ------ | -------------- | ----------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | 主键 |
| user_id | bigint(20) | YES | NULL | – | 用户ID |
| cdr_history_id | bigint(20) | YES | NULL | – | 话单记录ID |
| type | tinyint(4) | YES | NULL | – | 类型 |
| amount | decimal(18,4) | YES | NULL | – | 金额 |
| status | tinyint(4) | YES | NULL | – | 状态 |
| del_flag | tinyint(1) | YES | 0 | – | 删除标志(0存在 1删除) |
| create_by | bigint(20) | YES | NULL | – | 创建人 |
| create_time | datetime | YES | NULL | – | 创建时间 |
| update_by | bigint(20) | YES | NULL | – | 更新人 |
| update_time | datetime | YES | NULL | – | 更新时间 |
---
#### 计费规则表 - u_bill_rule
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| ----------- | ------------- | ------------- | ------ | -------------- | ----------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | 主键 |
| price | decimal(18,4) | YES | NULL | – | 价格 |
| traffic | bigint(20) | YES | NULL | – | 流量 |
| unit | tinyint(4) | YES | NULL | – | 单位 |
| enable | tinyint(1) | YES | NULL | – | 是否启用 |
| del_flag | tinyint(1) | YES | 0 | – | 删除标志(0存在 1删除) |
| create_by | bigint(20) | YES | NULL | – | 创建人 |
| create_time | datetime | YES | NULL | – | 创建时间 |
| update_by | bigint(20) | YES | NULL | – | 更新人 |
| update_time | datetime | YES | NULL | – | 更新时间 |
---
#### 话单表 - u_cdr
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| --------------------- | ----------- | ------------- | ------ | -------------- | --------------------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | CDR ID |
| user_id | bigint(20) | YES | NULL | – | User ID link to u_user |
| client_id | bigint(20) | YES | NULL | – | Client ID |
| device_id | bigint(20) | YES | NULL | – | Device ID |
| ssid | varchar(64) | YES | NULL | – | Wireless SSID name |
| rx_rate | bigint(20) | YES | NULL | – | rx rate |
| tx_rate | bigint(20) | YES | NULL | – | tx rate |
| down_packet | bigint(20) | YES | NULL | – | Number of downstream packets |
| up_packet | bigint(20) | YES | NULL | – | Number of upstream packets |
| traffic_down | bigint(20) | YES | NULL | – | Downstream traffic (Byte) |
| traffic_up | bigint(20) | YES | NULL | – | Upstream traffic (Byte) |
| rate_limit_profile_id | varchar(16) | YES | NULL | – | Rate limit profile ID |
| up_time | bigint(20) | YES | NULL | – | Up time (unit: s) |
| last_seen_time | bigint(20) | YES | NULL | – | Last found time, timestamp (ms) |
| activity | bigint(20) | YES | NULL | – | Activity download speed (Bytes/s) |
| del_flag | char(1) | YES | '0' | – | delete flag |
| create_by | bigint(20) | YES | NULL | – | creater |
| create_time | datetime | YES | NULL | – | create time |
| update_by | bigint(20) | YES | NULL | – | updater |
| update_time | datetime | YES | NULL | – | update time |
---
#### 历史话单表 - u_cdr_history
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| ------------ | ---------- | ------------- | ------ | -------------- | ------------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | CDR Detail ID |
| cdr_id | bigint(20) | YES | NULL | – | CDR ID |
| traffic_down | bigint(20) | YES | NULL | – | Downstream traffic (Byte) |
| traffic_up | bigint(20) | YES | NULL | – | Upstream traffic (Byte) |
| start_time | bigint(20) | YES | NULL | – | Start time |
| end_time | bigint(20) | YES | NULL | – | End time |
| duration | bigint(20) | YES | NULL | – | Duration(s) |
| del_flag | char(1) | YES | '0' | – | delete flag |
| create_by | bigint(20) | YES | NULL | – | creater |
| create_time | datetime | YES | NULL | – | create time |
| update_by | bigint(20) | YES | NULL | – | updater |
| update_time | datetime | YES | NULL | – | update time |
---
#### 终端信息表 - u_client
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| ------------------ | ----------- | ------------- | ------ | -------------- | ---------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | Client ID |
| user_id | bigint(20) | YES | NULL | – | User ID link to u_user |
| site_id | varchar(64) | YES | NULL | – | Site ID |
| client_name | varchar(64) | YES | NULL | – | Client Name |
| client_device_type | varchar(16) | YES | NULL | – | Client device type |
| client_mac | varchar(32) | YES | NULL | – | Client mac address |
| del_flag | char(1) | YES | '0' | – | delete flag |
| create_by | bigint(20) | YES | NULL | – | creater |
| create_time | datetime | YES | NULL | – | create time |
| update_by | bigint(20) | YES | NULL | – | updater |
| update_time | datetime | YES | NULL | – | update time |
---
#### 设备表 - u_device
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| ------------ | ----------- | ------------- | ------ | -------------- | ---------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | Device ID |
| user_id | bigint(20) | YES | NULL | – | User ID link to u_user |
| device_name | varchar(64) | YES | NULL | – | Device Name |
| device_ip | varchar(16) | YES | NULL | – | Device ip |
| device_mac | varchar(32) | YES | NULL | – | Device mac |
| device_model | varchar(32) | YES | NULL | – | Device model |
| del_flag | char(1) | YES | '0' | – | delete flag |
| create_by | bigint(20) | YES | NULL | – | creater |
| create_time | datetime | YES | NULL | – | create time |
| update_by | bigint(20) | YES | NULL | – | updater |
| update_time | datetime | YES | NULL | – | update time |
---
#### 订单表 - u_order
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| ------------ | ------------- | ------------- | ------ | -------------- | --------------------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | 主键 |
| user_id | bigint(20) | YES | NULL | – | 用户ID |
| package_id | bigint(20) | YES | NULL | – | 套餐ID |
| payment_id | bigint(20) | YES | NULL | – | 支付ID |
| order_no | varchar(64) | YES | NULL | – | 订单编号 |
| type | tinyint(4) | YES | NULL | – | 订单类型(0套餐 1充值) |
| order_amount | decimal(18,4) | YES | NULL | – | 订单金额 |
| status | tinyint(4) | YES | NULL | – | 订单状态(0待支付 1已支付 2已取消) |
| del_flag | tinyint(1) | YES | 0 | – | 删除标志(0存在 1删除) |
| create_by | bigint(20) | YES | NULL | – | 创建人 |
| create_time | datetime | YES | NULL | – | 创建时间 |
| update_by | bigint(20) | YES | NULL | – | 更新人 |
| update_time | datetime | YES | NULL | – | 更新时间 |
---
#### 套餐表 - u_package
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| ----------------- | ------------- | ------------- | ------ | -------------- | ----------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | 主键 |
| rate_limit_id | bigint(20) | YES | NULL | – | 带宽限速ID |
| package_name | varchar(64) | YES | NULL | – | 套餐名称 |
| period_num | int(11) | YES | NULL | – | 有效期数 |
| period_type | tinyint(4) | YES | NULL | – | 有效期类型 |
| price | decimal(18,4) | YES | NULL | – | 价格 |
| traffic | bigint(20) | YES | NULL | – | 流量 |
| duration | bigint(20) | YES | NULL | – | 时长 |
| client_num | int(11) | YES | NULL | – | 在线设备数 |
| remark | varchar(500) | YES | NULL | – | 备注 |
| rate_limit_enable | tinyint(1) | YES | 0 | – | 带宽是否限制 |
| traffic_enable | tinyint(1) | YES | 0 | – | 流量是否限制 |
| duration_enable | tinyint(1) | YES | 0 | – | 时长是否限制 |
| client_num_enable | tinyint(1) | YES | 0 | – | 在线设备数是否限制 |
| package_enable | tinyint(1) | YES | 0 | – | 套餐是否启用 |
| del_flag | tinyint(1) | YES | 0 | – | 删除标志(0存在 1删除) |
| create_by | bigint(20) | YES | NULL | – | 创建人 |
| create_time | datetime | YES | NULL | – | 创建时间 |
| update_by | bigint(20) | YES | NULL | – | 更新人 |
| update_time | datetime | YES | NULL | – | 更新时间 |
---
#### 支付表 - u_payment
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| -------------- | ------------ | ------------- | ------ | -------------- | ----------------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | 主键 |
| name | varchar(32) | YES | NULL | – | 支付名称 |
| type | tinyint(4) | YES | NULL | – | 类型(0支付宝 1微信 2信用卡) |
| appId | varchar(32) | YES | NULL | – | 应用编号 |
| server_url | varchar(32) | YES | NULL | – | 支付网关 |
| domain | varchar(32) | YES | NULL | – | 外网访问项目的域名 |
| private_key | varchar(128) | YES | NULL | – | 应用私钥 |
| public_key | varchar(128) | YES | NULL | – | 应用公钥 |
| app_cert_path | varchar(64) | YES | NULL | – | 应用公钥证书 |
| cert_path | varchar(64) | YES | NULL | – | 公钥证书 |
| root_cert_path | varchar(64) | YES | NULL | – | 根证书 |
| enable | tinyint(1) | YES | NULL | – | 是否启用 |
| del_flag | tinyint(1) | YES | 0 | – | 删除标志(0存在 1删除) |
| create_by | bigint(20) | YES | NULL | – | 创建人 |
| create_time | datetime | YES | NULL | – | 创建时间 |
| update_by | bigint(20) | YES | NULL | – | 更新人 |
| update_time | datetime | YES | NULL | – | 更新时间 |
---
#### 限速表 - u_rate_limit
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| ----------------- | ----------- | ------------- | ------ | -------------- | ----------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | 主键 |
| rate_limit_name | varchar(32) | YES | NULL | – | 限速名称 |
| down_limit | bigint(20) | YES | NULL | – | 下行限速 |
| down_limit_enable | tinyint(1) | YES | 0 | – | 下行限速启用 |
| up_limit | bigint(20) | YES | NULL | – | 上行限速 |
| up_limit_enable | tinyint(1) | YES | 0 | – | 上行限速启用 |
| del_flag | tinyint(1) | YES | 0 | – | 删除标志(0存在 1删除) |
| create_by | bigint(20) | YES | | | |
---
#### 充值表 - u_recharge
| 字段名称 | 数据类型 | 允许 NULL | 默认值 | 自增 | 注释 |
| ----------- | --------------------- | --------- | -------- | -------------- | ---------------------- |
| recharge_id | bigint(20) | NO | — | AUTO_INCREMENT | Recharge ID |
| user_id | bigint(20) | YES | NULL | | User ID link to u_user |
| fee | double | YES | NULL | | — |
| status | enum('unpaid','paid') | YES | 'unpaid' | | — |
| create_by | varchar(32) | YES | '' | | create name |
| create_time | datetime | YES | NULL | | create time |
---
#### 用户信息表 - u_user
| 字段名称 | 数据类型 | 允许 NULL | 默认值 | 自增 | 注释 |
| ----------- | ------------ | --------- | ------ | -------------- | ------------------------------- |
| user_id | bigint(20) | NO | — | AUTO_INCREMENT | 用户ID |
| dept_id | bigint(20) | YES | NULL | | 部门ID |
| user_name | varchar(30) | NO | — | | 用户账号 |
| nick_name | varchar(30) | NO | — | | 用户昵称 |
| full_name | varchar(64) | YES | NULL | | 用户姓名 |
| user_type | varchar(2) | YES | '00' | | 用户类型(00系统用户) |
| email | varchar(50) | YES | '' | | 用户邮箱 |
| phonenumber | varchar(15) | YES | '' | | 手机号码 |
| sex | char(1) | YES | '0' | | 用户性别(0男 1女 2未知) |
| avatar | varchar(100) | YES | '' | | 头像地址 |
| password | varchar(100) | YES | '' | | 密码 |
| age | int(11) | YES | NULL | | 年龄 |
| birth_date | date | YES | NULL | | 出生日期 |
| address | varchar(255) | YES | NULL | | 地址 |
| status | char(1) | YES | '0' | | 帐号状态(0正常 1停用) |
| del_flag | char(1) | YES | '0' | | 删除标志(0代表存在 2代表删除) |
| login_ip | varchar(128) | YES | '' | | 最后登录IP |
| login_date | datetime | YES | NULL | | 最后登录时间 |
| create_by | varchar(64) | YES | '' | | 创建者 |
| create_time | datetime | YES | NULL | | 创建时间 |
| update_by | varchar(64) | YES | '' | | 更新者 |
| update_time | datetime | YES | NULL | | 更新时间 |
| remark | varchar(500) | YES | NULL | | 备注 |
---
#### KYC表 - u_kyc
| 字段名称 | 数据类型 | 允许 NULL | 默认值 | 自增 | 注释 |
| ---------------- | ------------ | --------- | --------- | -------------- | --------------------------------------------------------------------------------------------------------------- |
| kyc_id | bigint(20) | NO | — | AUTO_INCREMENT | ID |
| user_id | bigint(20) | YES | NULL | | link to user_id of u_user |
| real_name | varchar(64) | YES | NULL | | — |
| birth_date | date | YES | NULL | | — |
| id_type | enum | YES | NULL | | identify type('DRIVERS_LICENSE','PASSPORT','RESIDENCE_PERMIT','STUDENT_ID','MEDICARE_CARD','BIRTH_CERTIFICATE') |
| id_file | varchar(128) | YES | '' | | ID file |
| identify_picture | varchar(128) | YES | NULL | | identify picture |
| status | enum | YES | 'PENDING' | | KYC Status: 1-VERIFIED/2-UNVERIFIED/3-PENDING/4-REJECTED |
| description | varchar(255) | YES | NULL | | — |
| del_flag | char(1) | YES | '0' | | 删除标志(0代表存在 2代表删除) |
| create_by | varchar(64) | YES | '' | | 创建者 |
| create_time | datetime | YES | NULL | | 创建时间 |
| update_by | varchar(64) | YES | '' | | 更新者 |
| update_time | datetime | YES | NULL | | 更新时间 |
---
# 5. 功能模块设计
## 5.1. 客户平台
1. **Dashboard**:主控制面板,提供系统概览。
2. **设备管理**:
- **AP设备管理**:管理接入点设备。
- **无线网络**:配置和管理无线网络。
- **门户**:管理门户设置。
- **终端设备管理**:管理连接的终端设备。
- **监控/配置/启停/移除/纳管**:对设备进行监控、配置、启动、停止、移除和纳管操作。
3. **用户管理**:
- **用户信息**:查看和管理用户信息。
- **KYC状态**:管理用户的KYC(了解你的客户)状态,包括未KYC和已KYC。
- **MAC**:管理设备的MAC地址。
- **话单管理**:查询通话记录,包括时长和流量。
4. **账单管理**:
- **查询**:查询账单信息。
- **KYC审核**:审核用户的KYC信息,包括批准和拒绝操作。
5. **计费管理**:
- **计费规则**:设置计费规则。
- **限速设置**:配置网络限速。
- **套餐管理**:管理计费套餐,包括查询、增加、修改和删除操作。
6. **系统管理**:
- **账号管理**:管理系统账号。
- **角色管理**:管理用户角色。
- **菜单管理**:管理系统菜单。
- **字典管理**:管理系统字典。
- **日志管理**:管理系统日志。
- **任务管理**:管理系统任务。
这些功能模块共同构成了一个全面的管理门户,支持设备、用户、账单和系统的综合管理。
![](image/admin-portal-features-2.png)
## 5.2 用户平台
1. **账号注册**:
- **个人信息填写**:包括账户名、姓名、年龄、性别、电话、邮箱、地址等信息。
- **协议声明和签署**:用户需同意相关协议。
- **获取验证码**:通过邮箱获取验证码进行验证。
2. **登录**:
- **忘记密码**:提供找回密码功能,通过邮箱重置密码。
3. **用户平台**:
- **主页/仪表盘**:用户主界面,提供系统概览。
- **套餐购买**:提供套餐购买功能,支持多种支付方式,包括支付宝和微信支付。
- **余额充值**:提供余额充值功能,支持多种支付方式,包括支付宝和微信支付。
4. **终端设备**:
- **当前设备**:查询当前连接的设备。
- **历史设备**:查询历史连接的设备。
5. **充值服务**:
- **余额充值**:提供余额充值功能。
- **套餐办理**:办理新的套餐。
6. **账单**:
- **充值记录**:查询充值记录。
- **上网记录**:查询上网记录。
- **套餐记录**:查询套餐记录。
7. **个人信息**:
- **修改信息**:修改个人信息。
- **修改密码**:修改账户密码。
- **KYC认证**:进行KYC认证,需人工审核。
这些功能模块共同构成了一个全面的用户平台,支持用户注册、登录、套餐购买、设备管理、充值服务、账单查询和个人信息管理等功能。
![](image/user-portal-features-1.png)
# 6. 计费和套餐设计
1. **计算周期**:
- 支持小时、天、月、年等不同的计算周期。
2. **时间限制**:
- 时段限制:支持小时、天或不限。
- 计算差值:根据时间限制计算差值。
3. **流量限制**:
- 支持设置不同的流量限制(流量1、流量2等)或不限。
4. **设备数据限制**:
- 支持设置不同的设备数量限制(数量1、数量2等)或不限。
5. **带宽限制**:
- 支持设置不同的带宽限制(带宽1、带宽2等)或不限。
6. **计算规则**:
- **计时**:支持按秒、分钟、小时、天或不限进行计时。
- **计算类型**:当前仅支持预付费,单位可以是KB、MB等。
- **等头流量处理**:支持向上取整或四舍五入。
- **价格**:支持按天或月设置价格周期。
7. **封闭设置**:
- 支持设置封闭金额和期初限制。
8. **规则设置**:
- 当前仅支持单一规则(规则1),不支持多种规则选择。
9. **备注**:
- 当前仅支持预付费模式。
- 标注“NA”的选项当前不支持。
计费套餐和计费规则共同构成了一个灵活的计费套餐和规则配置系统,支持根据时间、流量、设备和带宽等不同维度进行计费规则的定制。
![](image/billing-package-1.png)
File diff suppressed because it is too large. Load diff
@@ -1,996 +0,0 @@
**修订记录**
| 修订日期 | 版本号 | 修订内容 | 修订人 | 备注 |
| ---------- | ------ | --------------------------- | ------------------ | ---- |
| 2024/11/13 | V1.0 | 初稿 | 张树忠/李昌/蔡育超 | |
| 2024/11/13 | V1.1 | 完善架构设计和描述 | 张树忠 | |
| 2024/11/30 | V1.2 | 增加计费和套餐设计 | 张树忠 | |
| 2025/02/17 | V1.3 | 架构修改,去掉多余微服务 | 张树忠 | |
| 2025/02/24 | V1.4 | 增加数据库表设计,业务流程图 | 张树忠 | |
---
# **WANFi软件系统设计文档**
# 1. 需求分析
WANFi控制平台用于提供给运营商用于AP设备的管理监控,并对终端用户进行管理和计费管理。具体的业务需求概括如下:
## 1.1. 使用对象定义
> a) "客户"指购买AP设备的B端公司或组织,包含有多个管理和运维人员
>
> b) "用户"指使用改B端提供的的WiFi服务的C端用户,一个用户只有一个账号,一个账号可以使用多个终端设备
## 1.2. 平台需求定义
> a) 客户平台:为B端客户提供的控制和费用管理界面,用于AP的远程管理,配置,运行检测(根据API 文档逐一实现 Omada平台上的功能),管理用户数据、设备信息和计费信息
> b) 用户平台:为C端客户提供的个人信息管理:用于C端用户缴费以及个人信息管理,终端设备管理
> c) 客户平台包含用户平台的信息,但用户平台无法获取客户平台信息
## 1.3. 商业模式定义
> a. 客户服务用户(比如运营商):包含完整的客户平台和用户平台功能
> b. 客户服务设备(比如农场采购,直接用于农场智能设备,没有用户参与):只需要开发客户平台,以及客户平台中的设备信息管理,无需用户信息管理以及缴费系统
> c. 二者在开发系统上和数据库结构上尽可能兼容,保证一套系统可以为二者服务
> d. 费用以设备为维度进行管理,即通过数据库管理每一个设备的流量,使用时长等该需求是指一个用户/账号下的多个设备可以单独计费??)
> e. 费用以用户为维度进行收费,每个用户会收到一个账单,包含账户下设备数量,使用流量,使用时长等
![客户平台和用户平台数据库关系图](image/admin-user-portal.png)
# 2. 系统架构设计
![](image/WANFi-Architecture.png)
## 2.1. 架构说明
> a) 微服务架构
> b) B/S模式
> c) 支持本地和云部署
## 2.2. 开发运行环境和技术栈
> a) 操作系统:
Ubuntu 22.04
> b) 数据库:
MySQL 5.7
Redis 7.4.2
MongoDB 7.0.15 (用于Omada SDN Controller)
ElasticsSearch 7.1 用于大数据文本的查询 (暂未使用)
> c) 后端开发语言:
Java 1.8
SprintgBoot 2.7
SpringCloud 2021.0.8
SpringCloudAlibaba 2021.0.5.0
> d) 前端开发语言:
HTML+CSS,
Vue.js 3.4.27
AntD 4.2.2
# 3. 业务流程
## 3.1. 用户登录注册
* 用户注册,需填写个人信息,邮箱,手机号,实名认证等
* 用户连接WANFi时,通过网页进行登录
* 登陆后,后端API获取当前连接设备的MAC地址,如果该设备未被绑定到数据库中,则由后端API将当前设备绑定到数据库中
![](image/user-login-register-1.png)
## 3.2. 终端设备访问控制
* 终端设备连接AP热点,门户拦截
* 用户登录,判断是否充值有效套餐或者余额是否为0
* 如果存在套餐流量不为0或者余额部位0,则授权终端设备Internet连接准入
* 用户平台定时监测终端设备上网流量并实时计算套餐流量或余额
* 如果套餐流量为0且余额为0,则去授权终端设备Internet接入权限
![](image/client-auth-p1.png)
# 4. 数据库设计
## 4.1. 客户数据库表设计
系统采用 MySQL 数据库,字符集为 utf8mb4,主要涉及系统配置、部门、设备、数据字典、定时任务、日志、菜单、角色以及用户管理等模块。
### 4.1.1. 数据库架构
- **数据库名称**:`wfc_system_db`
- **字符集**:utf8mb4
- **校对规则**:utf8mb4_general_ci
### 4.1.2. 客户平台表总览
| 表名 | 主键 | 备注说明 | 说明 |
| -------------- | ---------------- | ------------------ | ------------------------ |
| sys_config | config_id | 参数配置表 | 存储系统参数配置信息 |
| sys_dept | dept_id | 部门表 | 存储部门信息 |
| sys_device | id | 客户平台-设备表 | 存储设备信息 |
| sys_dict_data | dict_code | 字典数据表 | 存储字典数据 |
| sys_dict_type | dict_id | 字典类型表 | 存储字典类型 |
| sys_job | job_id | 定时任务调度表 | 存储定时任务调度信息 |
| sys_job_log | job_log_id | 定时任务调度日志表 | 存储定时任务调度日志信息 |
| sys_logininfor | info_id | 系统访问记录 | 存储系统访问记录 |
| sys_menu | menu_id | 菜单权限表 | 存储菜单权限信息 |
| sys_oper_log | oper_id | 操作日志记录 | 存储操作日志记录 |
| sys_post | post_id | 岗位信息表 | 存储岗位信息 |
| sys_role | role_id | 角色信息表 | 存储角色信息 |
| sys_role_dept | role_id, dept_id | 角色和部门关联表 | 存储角色和部门的关联信息 |
| sys_role_menu | role_id, menu_id | 角色和菜单关联表 | 存储角色和菜单的关联信息 |
| sys_user | user_id | 用户信息表 | 存储用户信息 |
| sys_user_post | user_id, post_id | 用户与岗位关联表 | 存储用户与岗位的关联信息 |
| sys_user_role | user_id, role_id | 用户和角色关联表 | 存储用户和角色的关联信息 |
---
### 4.1.3 表结构设计
#### 参数配置表 - sys_config
用于存储全局系统配置参数。
| 列名 | 数据类型 | 约束 | 说明 |
| ------------ | ------------ | --------------------------- | -------------------------------------- |
| config_id | int(11) | PRIMARY KEY``AUTO_INCREMENT | 参数主键 |
| config_name | varchar(100) | DEFAULT '' | 参数名称 |
| config_key | varchar(100) | DEFAULT '' | 参数键名 |
| config_value | varchar(500) | DEFAULT '' | 参数键值 |
| config_type | char(1) | DEFAULT 'N' | 系统内置标识(Y表示内置, N表示非内置) |
| create_by | varchar(64) | DEFAULT '' | 创建者 |
| create_time | datetime | NULLABLE | 创建时间 |
| update_by | varchar(64) | DEFAULT '' | 更新者 |
| update_time | datetime | NULLABLE | 更新时间 |
| remark | varchar(500) | NULLABLE | 备注 |
---
#### 部门表 - sys_dept
存储各部门信息,支持层级结构。
| 列名 | 数据类型 | 约束 | 说明 |
| ----------- | ------------ | --------------------------- | ------------------------ |
| dept_id | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 部门 ID |
| parent_id | bigint(20) | DEFAULT 0 | 父部门 ID |
| ancestors | varchar(50) | DEFAULT '' | 祖级列表 |
| dept_name | varchar(30) | DEFAULT '' | 部门名称 |
| order_num | int(11) | DEFAULT 0 | 显示顺序 |
| leader | varchar(20) | NULLABLE | 负责人 |
| phone | varchar(11) | NULLABLE | 联系电话 |
| email | varchar(50) | NULLABLE | 邮箱 |
| status | char(1) | DEFAULT '0' | 部门状态(0正常、1停用) |
| del_flag | char(1) | DEFAULT '0' | 删除标志(0存在,2删除) |
| create_by | varchar(64) | DEFAULT '' | 创建者 |
| create_time | datetime | NULLABLE | 创建时间 |
| update_by | varchar(64) | DEFAULT '' | 更新者 |
| update_time | datetime | NULLABLE | 更新时间 |
| remark | varchar(500) | NULLABLE | 备注 |
---
#### 系统设备表 - sys_device
存储客户平台中设备的各项信息。
| 列名 | 数据类型 | 约束 & 默认值 | 说明 |
| ------------------ | ------------ | --------------------------- | ----------------------- |
| id | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 主键 |
| site_id | varchar(64) | NULLABLE | 站点 ID |
| mac | varchar(64) | NULLABLE | MAC 地址 |
| name | varchar(64) | NULLABLE | 设备名称 |
| type | varchar(32) | NULLABLE | 类型 |
| subtype | varchar(32) | NULLABLE | 子类型 |
| device_series_type | varchar(32) | NULLABLE | 产品系列类型 |
| model | varchar(64) | NULLABLE | 设备型号 |
| ip | varchar(64) | NULLABLE | IP 地址 |
| ipv6s | varchar(255) | NULLABLE | IPv6 地址(可能多个) |
| uptime | varchar(64) | NULLABLE | 在线时长 |
| status | int(11) | NULLABLE | 状态 |
| last_seen | bigint(20) | NULLABLE | 最后在线时间 |
| cpu_util | int(11) | NULLABLE | CPU 利用率 |
| mem_util | int(11) | NULLABLE | 内存利用率 |
| sn | varchar(64) | NULLABLE | 序列号 |
| license_status | int(11) | NULLABLE | 授权状态 |
| tag_name | varchar(64) | NULLABLE | Tag Name |
| uplink_device_mac | varchar(64) | NULLABLE | Uplink Device Mac |
| uplink_device_name | varchar(64) | NULLABLE | Uplink Device Name |
| uplink_device_port | varchar(64) | NULLABLE | Uplink Device Port |
| link_speed | int(11) | NULLABLE | Link Speed |
| duplex | int(11) | NULLABLE | Duplex |
| switch_consistent | tinyint(1) | NULLABLE | Switch Consistent |
| public_ip | varchar(64) | NULLABLE | Public IP |
| firmware_version | varchar(64) | NULLABLE | Firmware Version |
| del_flag | tinyint(1) | NULLABLE | 删除标志(0存在 1删除) |
| create_by | bigint(20) | NULLABLE | 创建人 |
| create_time | datetime | NULLABLE | 创建时间 |
| update_by | bigint(20) | NULLABLE | 更新人 |
| update_time | datetime | NULLABLE | 更新时间 |
#### 字典相关
##### 字典数据表 - sys_dict_data
存储系统使用的字典数据,包含常用的选项列表。
| 列名 | 数据类型 | 约束 | 说明 |
| ----------- | ------------ | --------------------------- | ------------------- |
| dict_code | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 字典编码 |
| dict_sort | int(11) | DEFAULT 0 | 字典排序 |
| dict_label | varchar(100) | DEFAULT '' | 字典标签 |
| dict_value | varchar(100) | DEFAULT '' | 字典键值 |
| dict_type | varchar(100) | DEFAULT '' | 字典类型 |
| css_class | varchar(100) | NULLABLE | 样式属性(扩展) |
| list_class | varchar(100) | NULLABLE | 列表显示样式 |
| is_default | char(1) | DEFAULT 'Y' | 是否默认(Y/N) |
| status | char(1) | DEFAULT '0' | 状态(0正常 1停用) |
| create_by | varchar(64) | DEFAULT '' | 创建者 |
| create_time | datetime | NULLABLE | 创建时间 |
| update_by | varchar(64) | DEFAULT '' | 更新者 |
| update_time | datetime | NULLABLE | 更新时间 |
| remark | varchar(500) | NULLABLE | 备注 |
---
##### 字典类型表 - sys_dict_type
存放字典分组及类型定义。
| 列名 | 数据类型 | 约束 | 说明 |
| ----------- | ------------ | --------------------------- | ------------------- |
| dict_id | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 字典主键 |
| dict_name | varchar(100) | DEFAULT '' | 字典名称 |
| dict_type | varchar(100) | DEFAULT ''``UNIQUE | 字典类型标识 |
| status | char(1) | DEFAULT '0' | 状态(0正常 1停用) |
| create_by | varchar(64) | DEFAULT '' | 创建者 |
| create_time | datetime | NULLABLE | 创建时间 |
| update_by | varchar(64) | DEFAULT '' | 更新者 |
| update_time | datetime | NULLABLE | 更新时间 |
| remark | varchar(500) | NULLABLE | 备注 |
---
#### 定时任务相关
##### 定时任务表 - sys_job
存储各定时任务的配置信息。
| 列名 | 数据类型 | 约束 | 说明 |
| --------------- | ------------ | --------------------------- | --------------------------------------------- |
| job_id | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 任务ID |
| job_name | varchar(64) | NOT NULL, DEFAULT '' | 任务名称 |
| job_group | varchar(64) | NOT NULL, DEFAULT 'DEFAULT' | 任务组名称 |
| invoke_target | varchar(500) | NOT NULL | 调用目标字符串 |
| cron_expression | varchar(255) | DEFAULT '' | CRON 表达式 |
| misfire_policy | varchar(20) | DEFAULT '3' | 错误处理策略(1立即执行 2执行一次 3放弃执行) |
| concurrent | char(1) | DEFAULT '1' | 是否并发执行(0允许、1禁止) |
| status | char(1) | DEFAULT '0' | 任务状态(0正常 1暂停) |
| create_by | varchar(64) | NULLABLE | 创建者 |
| create_time | datetime | NULLABLE | 创建时间 |
| update_by | varchar(64) | NULLABLE | 更新者 |
| update_time | datetime | NULLABLE | 更新时间 |
| remark | varchar(500) | NULLABLE | 备注信息 |
记录示例包括 Omada 同步任务及初始化任务。
##### 定时任务日志表 - sys_job_log
记录任务执行的日志信息。
| 列名 | 数据类型 | 约束 | 说明 |
| -------------- | ------------- | --------------------------- | ------------------------ |
| job_log_id | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 任务日志ID |
| job_name | varchar(64) | NOT NULL | 任务名称 |
| job_group | varchar(64) | NOT NULL | 任务组名称 |
| invoke_target | varchar(500) | NOT NULL | 调用目标字符串 |
| job_message | varchar(500) | 可空 | 日志信息 |
| status | char(1) | DEFAULT '0' | 执行状态(0成功、1失败) |
| exception_info | varchar(2000) | DEFAULT '' | 异常信息 |
| create_time | datetime | NULLABLE | 执行时间 |
---
#### 系统访问记录 - sys_logininfor
记录系统用户的登录访问情况。
| 列名 | 数据类型 | 约束 | 说明 |
| ----------- | ------------ | --------------------------- | ------------------------ |
| info_id | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 访问记录主键 |
| user_name | varchar(50) | DEFAULT '' | 用户账号 |
| ipaddr | varchar(128) | DEFAULT '' | 登录 IP 地址 |
| status | char(1) | DEFAULT '0' | 登录状态(0成功,1失败) |
| msg | varchar(255) | DEFAULT '' | 提示信息 |
| access_time | datetime | NULLABLE | 访问时间 |
辅助索引包括 status 及 access_time。
---
#### 菜单权限表 - sys_menu
存储系统菜单信息以及相应的访问权限标识。
| 列名 | 数据类型 | 约束 | 说明 |
| ----------- | ------------ | --------------------------- | ------------------------------------- |
| menu_id | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 菜单 ID |
| menu_name | varchar(50) | NOT NULL | 菜单名称,如 'menu.system.management' |
| parent_id | bigint(20) | DEFAULT 0 | 父级菜单 ID |
| order_num | int(11) | DEFAULT 0 | 显示顺序 |
| path | varchar(200) | DEFAULT '' | 路由地址 |
| component | varchar(255) | DEFAULT NULL | 组件路径 |
| menu_type | char(1) | | 类型(M:目录, C:菜单, F:按钮) |
| visible | char(1) | DEFAULT '0' | 菜单显示状态(0显示,1隐藏) |
| status | char(1) | DEFAULT '0' | 菜单状态(0正常,1停用) |
| perms | varchar(100) | DEFAULT NULL | 权限标识 |
| icon | varchar(100) | DEFAULT '#' | 菜单图标 |
| create_by | varchar(64) | DEFAULT '' | 创建者 |
| create_time | datetime | NULLABLE | 创建时间 |
| update_by | varchar(64) | DEFAULT '' | 更新者 |
| update_time | datetime | NULLABLE | 更新时间 |
| remark | varchar(500) | DEFAULT '' | 备注 |
| name | varchar(30) | DEFAULT NULL | 菜单 key,作为前端标识使用 |
记录插入部分展示了系统管理、工具、账户管理、角色管理、菜单管理、部门管理、岗位管理、字典管理以及多项操作权限的菜单。
---
#### 操作日志记录 - sys_oper_log
记录用户在系统中的各项操作,用于安全审计。
| 列名 | 数据类型 | 约束 | 说明 |
| -------------- | ------------- | --------------------------- | -------------------------------------- |
| oper_id | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 日志主键 |
| title | varchar(50) | DEFAULT '' | 模块标题 |
| business_type | int(11) | DEFAULT 0 | 业务类型(0其它、1新增、2修改、3删除) |
| method | varchar(100) | DEFAULT '' | 方法名称 |
| request_method | varchar(10) | DEFAULT '' | 请求方式 |
| oper_name | varchar(50) | DEFAULT '' | 操作人员 |
| dept_name | varchar(50) | DEFAULT '' | 部门名称 |
| oper_url | varchar(255) | DEFAULT '' | 请求 URL |
| oper_ip | varchar(128) | DEFAULT '' | IP 地址 |
| oper_location | varchar(255) | DEFAULT '' | 操作地点 |
| oper_param | varchar(2000) | DEFAULT '' | 请求参数 |
| json_result | varchar(2000) | DEFAULT '' | 返回结果 |
| status | int(11) | DEFAULT 0 | 操作状态(0正常、1异常) |
| error_msg | varchar(2000) | DEFAULT '' | 错误消息 |
| oper_time | datetime | NULLABLE | 操作时间 |
| cost_time | bigint(20) | DEFAULT 0 | 消耗时间(毫秒) |
附带建立了 business_type、status 及 oper_time 的索引。
---
#### 岗位信息表 - sys_post
记录系统中定义的岗位信息。
| 列名 | 数据类型 | 约束 | 说明 |
| ----------- | ------------ | --------------------------- | -------------------- |
| post_id | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 岗位 ID |
| post_code | varchar(64) | NOT NULL | 岗位编码 |
| post_name | varchar(50) | NOT NULL | 岗位名称 |
| post_sort | int(11) | NOT NULL | 显示顺序 |
| status | char(1) | NOT NULL | 状态(0正常、1停用) |
| create_by | varchar(64) | DEFAULT '' | 创建者 |
| create_time | datetime | NULLABLE | 创建时间 |
| update_by | varchar(64) | DEFAULT '' | 更新者 |
| update_time | datetime | NULLABLE | 更新时间 |
| remark | varchar(500) | DEFAULT NULL | 备注 |
示例记录定义了 administrator、manager、hr 及 user 岗位。
---
#### 用户信息表 - sys_user
存储用户账号及相关信息,实现系统登录和管理。
| 列名 | 数据类型 | 约束 | 说明 |
| ----------- | ------------ | --------------------------- | ------------------------------------ |
| user_id | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 用户 ID |
| dept_id | bigint(20) | NULLABLE | 所属部门 ID |
| user_name | varchar(30) | NOT NULL | 用户账号 |
| nick_name | varchar(30) | NOT NULL | 用户昵称 |
| user_type | varchar(2) | DEFAULT '00' | 用户类型(例如:00系统用户) |
| email | varchar(50) | DEFAULT '' | 用户邮箱 |
| phonenumber | varchar(11) | DEFAULT '' | 手机号码 |
| sex | char(1) | DEFAULT '0' | 性别(0男、1女、2未知) |
| avatar | varchar(100) | DEFAULT '' | 头像地址 |
| password | varchar(100) | DEFAULT '' | 密码(通常加密存储,如 bcrypt 结果) |
| status | char(1) | DEFAULT '0' | 帐号状态(0正常、1停用) |
| del_flag | char(1) | DEFAULT '0' | 删除标志(0存在、2删除) |
| login_ip | varchar(128) | DEFAULT '' | 最后登录IP |
| login_date | datetime | NULLABLE | 最后登录时间 |
| create_by | varchar(64) | DEFAULT '' | 创建者 |
| create_time | datetime | NULLABLE | 创建时间 |
| update_by | varchar(64) | DEFAULT '' | 更新者 |
| update_time | datetime | NULLABLE | 更新时间 |
| remark | varchar(500) | DEFAULT NULL | 备注 |
系统默认记录了超级管理员(super)、管理员(admin)等用户信息。
---
#### 用户与岗位关联表 - sys_user_post
用于关联用户与其所属岗位。
| 列名 | 数据类型 | 约束 | 说明 |
| ------- | ---------- | ---------------------- | ------- |
| user_id | bigint(20) | PRIMARY KEY (联合主键) | 用户 ID |
| post_id | bigint(20) | PRIMARY KEY (联合主键) | 岗位 ID |
---
#### 用户与角色关联表 - sys_user_role
用于关联用户与分配的角色,实现权限管理。
| 列名 | 数据类型 | 约束 | 说明 |
| ------- | ---------- | ---------------------- | ------- |
| user_id | bigint(20) | PRIMARY KEY (联合主键) | 用户 ID |
| role_id | bigint(20) | PRIMARY KEY (联合主键) | 角色 ID |
插入示例中,用户 1 分配了角色 1(Supervisor),用户 2 分配了角色 2(Administrator)。
---
#### 角色信息表 - sys_role
定义系统内各角色及其基本属性。
| 列名 | 数据类型 | 约束 | 说明 |
| ------------------- | ------------ | --------------------------- | -------------------------------------- |
| role_id | bigint(20) | PRIMARY KEY``AUTO_INCREMENT | 角色 ID |
| role_name | varchar(30) | NOT NULL | 角色名称 |
| role_key | varchar(100) | NOT NULL | 角色权限字符串(作为 RBAC 标识) |
| role_sort | int(11) | 可空 | 显示顺序 |
| data_scope | char(1) | DEFAULT '1' | 数据权限范围(例如全部、自定、部门等) |
| menu_check_strictly | tinyint(1) | DEFAULT 1 | 菜单树选择时是否关联显示 |
| dept_check_strictly | tinyint(1) | DEFAULT 1 | 部门树选择时是否关联显示 |
| status | char(1) | NOT NULL | 角色状态(0正常、1停用) |
| del_flag | char(1) | DEFAULT '0' | 删除标志(0存在、2删除) |
| create_by | varchar(64) | DEFAULT '' | 创建者 |
| create_time | datetime | NULLABLE | 创建时间 |
| update_by | varchar(64) | DEFAULT '' | 更新者 |
| update_time | datetime | NULLABLE | 更新时间 |
| remark | varchar(500) | NULLABLE | 备注 |
示例中定义了 Supervisor、Administrator 及 User 角色。
---
#### 角色与部门关联表 - sys_role_dept
用于关联角色和部门,控制数据权限。
| 列名 | 数据类型 | 约束 | 说明 |
| ------- | ---------- | ---------------------- | ------- |
| role_id | bigint(20) | PRIMARY KEY (联合主键) | 角色 ID |
| dept_id | bigint(20) | PRIMARY KEY (联合主键) | 部门 ID |
---
#### 角色与菜单关联表 - `sys_role_menu`
用于关联角色与菜单,实现系统权限的控制。
| 列名 | 数据类型 | 约束 | 说明 |
| ------- | ---------- | ---------------------- | ------- |
| role_id | bigint(20) | PRIMARY KEY (联合主键) | 角色 ID |
| menu_id | bigint(20) | PRIMARY KEY (联合主键) | 菜单 ID |
### 4.1.4. 关系与数据流
- **用户-角色**:通过 `sys_user_role` 表实现,一个用户可以拥有多个角色。
- **角色-菜单**:通过 `sys_role_menu` 表关联角色与菜单,实现权限分配。
- **用户-岗位**:通过 `sys_user_post` 实现,方便对岗位信息管理。
- **角色-部门**:通过 `sys_role_dept` 表实现角色对部门数据的访问控制。
- **数据字典**:`sys_dict_type` 定义字典类型,`sys_dict_data` 存储各字典项,系统中各模块均可引用以保证数据一致性。
## 4.2. 用户平台数据库表设计
### 4.2.1. 数据库架构
- **数据库名称**:`wfc_user_db`
- **字符集**:utf8mb4
- **校对规则**:utf8mb4_general_ci
### 4.2.2. 用户平台表总览
---
| 表名 | 主键 | 备注说明 | 说明 |
| ----------------- | ----------- | ------------------- | ------------------------------------------------------- |
| u_account | id | 用户平台-账户表 | 存储用户账户信息(余额、套餐、流量、时长等) |
| u_account_package | id | 用户平台-账户套餐表 | 存储账户对应的套餐信息,如套餐流量、时长、有效期等 |
| u_bill | id | 用户平台-账单表 | 存储账单记录,包括金额、状态、支付信息等 |
| u_bill_rule | id | 用户平台-计费规则表 | 存储计费规则,包括价格、流量、单位及状态等 |
| u_cdr | id | 用户平台_用户话单表 | 存储用户话单数据,如流量、速率、数据包信息等 |
| u_cdr_history | id | 用户平台_话单历史表 | 存储详细话单历史记录,包括时长、流量等 |
| u_client | id | 用户平台_用户设备表 | 存储用户设备信息,如设备名称、mac 地址、设备类型等 |
| u_device | id | 用户平台_AP设备表 | 存储 AP(无线接入点)设备信息 |
| u_order | id | 用户平台-订单表 | 存储订单信息,包括订单编号、订单金额及状态等 |
| u_package | id | 用户平台-套餐表 | 存储套餐信息,如套餐价格、流量、时长、设备数等 |
| u_payment | id | 用户平台-支付表 | 存储支付相关信息,包括支付名称、类型、网关、证书等 |
| u_rate_limit | id | 用户平台-带宽限速表 | 存储限速设置,如下行/上行限速及启用状态 |
| u_recharge | recharge_id | 用户平台_用户信息表 | 存储充值信息,关联 u_user 表;外键约束确保用户存在 |
| u_user | user_id | 用户平台_用户信息表 | 存储用户基本信息,包括用户名、昵称、邮件、密码等 |
| u_kyc | kyc_id | 用户平台_用户信息表 | 存储实名认证信息(KYC),包括真实姓名、证件类型、状态等 |
### 4.2.2. 表结构设计
---
#### 用户账号信息 - u_account
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| ----------------- | ------------- | ------------- | ------ | -------------- | ----------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | 主键 |
| user_id | bigint(20) | YES | NULL | – | 用户ID |
| balance | decimal(18,4) | YES | NULL | – | 余额 |
| balance_used | decimal(18,4) | YES | NULL | – | 余额已使用 |
| package_id | bigint(20) | YES | NULL | – | 套餐ID |
| start_time | datetime | YES | NULL | – | 开始时间 |
| end_time | datetime | YES | NULL | – | 结束时间 |
| traffic | bigint(20) | YES | NULL | – | 流量 |
| traffic_used | bigint(20) | YES | NULL | – | 流量已使用 |
| duration | bigint(20) | YES | NULL | – | 时长 |
| duration_used | bigint(20) | YES | NULL | – | 时长已使用 |
| client_num | int(11) | YES | NULL | – | 在线设备数 |
| client_num_used | int(11) | YES | NULL | – | 在线设备数已使用 |
| expired_time | datetime | YES | NULL | – | 失效时间 |
| package_name | varchar(64) | YES | NULL | – | 套餐名称 |
| period_num | int(11) | YES | NULL | – | 有效期数 |
| period_type | tinyint(4) | YES | NULL | – | 有效期类型 |
| price | decimal(18,4) | YES | NULL | – | 价格 |
| remark | varchar(500) | YES | NULL | – | 备注 |
| rate_limit_enable | tinyint(1) | YES | 0 | – | 带宽是否限制 |
| traffic_enable | tinyint(1) | YES | 0 | – | 流量是否限制 |
| duration_enable | tinyint(1) | YES | 0 | – | 时长是否限制 |
| client_num_enable | tinyint(1) | YES | 0 | – | 在线设备数是否限制 |
| rate_limit_name | varchar(32) | YES | NULL | – | 限速名称 |
| down_limit | bigint(20) | YES | NULL | – | 下行限速 |
| down_limit_enable | tinyint(1) | YES | 0 | – | 下行限速启用 |
| up_limit | bigint(20) | YES | NULL | – | 上行限速 |
| up_limit_enable | tinyint(1) | YES | 0 | – | 上行限速启用 |
| del_flag | tinyint(1) | YES | 0 | – | 删除标志(0存在 1删除) |
| create_by | bigint(20) | YES | NULL | – | 创建人 |
| create_time | datetime | YES | NULL | – | 创建时间 |
| update_by | bigint(20) | YES | NULL | – | 更新人 |
| update_time | datetime | YES | NULL | – | 更新时间 |
---
#### 账号与套餐关系表 - u_account_package
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| ----------------- | ------------- | ------------- | ------ | -------------- | ----------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | 主键 |
| account_id | bigint(20) | YES | NULL | – | 账户ID |
| package_id | bigint(20) | YES | NULL | – | 套餐ID |
| traffic | bigint(20) | YES | NULL | – | 流量 |
| duration | bigint(20) | YES | NULL | – | 时长 |
| client_num | int(11) | YES | NULL | – | 在线设备数 |
| expired_time | datetime | YES | NULL | – | 失效时间 |
| package_name | varchar(64) | YES | NULL | – | 套餐名称 |
| period_num | int(11) | YES | NULL | – | 有效期数 |
| period_type | tinyint(4) | YES | NULL | – | 有效期类型 |
| price | decimal(18,4) | YES | NULL | – | 价格 |
| remark | varchar(500) | YES | NULL | – | 备注 |
| rate_limit_enable | tinyint(1) | YES | 0 | – | 带宽是否限制 |
| traffic_enable | tinyint(1) | YES | 0 | – | 流量是否限制 |
| duration_enable | tinyint(1) | YES | 0 | – | 时长是否限制 |
| client_num_enable | tinyint(1) | YES | 0 | – | 在线设备数是否限制 |
| rate_limit_name | varchar(32) | YES | NULL | – | 限速名称 |
| down_limit | bigint(20) | YES | NULL | – | 下行限速 |
| down_limit_enable | tinyint(1) | YES | 0 | – | 下行限速启用 |
| up_limit | bigint(20) | YES | NULL | – | 上行限速 |
| up_limit_enable | tinyint(1) | YES | 0 | – | 上行限速启用 |
| del_flag | tinyint(1) | YES | 0 | – | 删除标志(0存在 1删除) |
| create_by | bigint(20) | YES | NULL | – | 创建人 |
| create_time | datetime | YES | NULL | – | 创建时间 |
| update_by | bigint(20) | YES | NULL | – | 更新人 |
| update_time | datetime | YES | NULL | – | 更新时间 |
---
#### 账单表 - u_bill
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| -------------- | ------------- | ------------- | ------ | -------------- | ----------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | 主键 |
| user_id | bigint(20) | YES | NULL | – | 用户ID |
| cdr_history_id | bigint(20) | YES | NULL | – | 话单记录ID |
| type | tinyint(4) | YES | NULL | – | 类型 |
| amount | decimal(18,4) | YES | NULL | – | 金额 |
| status | tinyint(4) | YES | NULL | – | 状态 |
| del_flag | tinyint(1) | YES | 0 | – | 删除标志(0存在 1删除) |
| create_by | bigint(20) | YES | NULL | – | 创建人 |
| create_time | datetime | YES | NULL | – | 创建时间 |
| update_by | bigint(20) | YES | NULL | – | 更新人 |
| update_time | datetime | YES | NULL | – | 更新时间 |
---
#### 计费规则表 - u_bill_rule
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| ----------- | ------------- | ------------- | ------ | -------------- | ----------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | 主键 |
| price | decimal(18,4) | YES | NULL | – | 价格 |
| traffic | bigint(20) | YES | NULL | – | 流量 |
| unit | tinyint(4) | YES | NULL | – | 单位 |
| enable | tinyint(1) | YES | NULL | – | 是否启用 |
| del_flag | tinyint(1) | YES | 0 | – | 删除标志(0存在 1删除) |
| create_by | bigint(20) | YES | NULL | – | 创建人 |
| create_time | datetime | YES | NULL | – | 创建时间 |
| update_by | bigint(20) | YES | NULL | – | 更新人 |
| update_time | datetime | YES | NULL | – | 更新时间 |
---
#### 话单表 - u_cdr
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| --------------------- | ----------- | ------------- | ------ | -------------- | --------------------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | CDR ID |
| user_id | bigint(20) | YES | NULL | – | User ID link to u_user |
| client_id | bigint(20) | YES | NULL | – | Client ID |
| device_id | bigint(20) | YES | NULL | – | Device ID |
| ssid | varchar(64) | YES | NULL | – | Wireless SSID name |
| rx_rate | bigint(20) | YES | NULL | – | rx rate |
| tx_rate | bigint(20) | YES | NULL | – | tx rate |
| down_packet | bigint(20) | YES | NULL | – | Number of downstream packets |
| up_packet | bigint(20) | YES | NULL | – | Number of upstream packets |
| traffic_down | bigint(20) | YES | NULL | – | Downstream traffic (Byte) |
| traffic_up | bigint(20) | YES | NULL | – | Upstream traffic (Byte) |
| rate_limit_profile_id | varchar(16) | YES | NULL | – | Rate limit profile ID |
| up_time | bigint(20) | YES | NULL | – | Up time (unit: s) |
| last_seen_time | bigint(20) | YES | NULL | – | Last found time, timestamp (ms) |
| activity | bigint(20) | YES | NULL | – | Activity download speed (Bytes/s) |
| del_flag | char(1) | YES | '0' | – | delete flag |
| create_by | bigint(20) | YES | NULL | – | creater |
| create_time | datetime | YES | NULL | – | create time |
| update_by | bigint(20) | YES | NULL | – | updater |
| update_time | datetime | YES | NULL | – | update time |
---
#### 历史话单表 - u_cdr_history
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| ------------ | ---------- | ------------- | ------ | -------------- | ------------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | CDR Detail ID |
| cdr_id | bigint(20) | YES | NULL | – | CDR ID |
| traffic_down | bigint(20) | YES | NULL | – | Downstream traffic (Byte) |
| traffic_up | bigint(20) | YES | NULL | – | Upstream traffic (Byte) |
| start_time | bigint(20) | YES | NULL | – | Start time |
| end_time | bigint(20) | YES | NULL | – | End time |
| duration | bigint(20) | YES | NULL | – | Duration(s) |
| del_flag | char(1) | YES | '0' | – | delete flag |
| create_by | bigint(20) | YES | NULL | – | creater |
| create_time | datetime | YES | NULL | – | create time |
| update_by | bigint(20) | YES | NULL | – | updater |
| update_time | datetime | YES | NULL | – | update time |
---
#### 终端信息表 - u_client
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| ------------------ | ----------- | ------------- | ------ | -------------- | ---------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | Client ID |
| user_id | bigint(20) | YES | NULL | – | User ID link to u_user |
| site_id | varchar(64) | YES | NULL | – | Site ID |
| client_name | varchar(64) | YES | NULL | – | Client Name |
| client_device_type | varchar(16) | YES | NULL | – | Client device type |
| client_mac | varchar(32) | YES | NULL | – | Client mac address |
| del_flag | char(1) | YES | '0' | – | delete flag |
| create_by | bigint(20) | YES | NULL | – | creater |
| create_time | datetime | YES | NULL | – | create time |
| update_by | bigint(20) | YES | NULL | – | updater |
| update_time | datetime | YES | NULL | – | update time |
---
#### 设备表 - u_device
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| ------------ | ----------- | ------------- | ------ | -------------- | ---------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | Device ID |
| user_id | bigint(20) | YES | NULL | – | User ID link to u_user |
| device_name | varchar(64) | YES | NULL | – | Device Name |
| device_ip | varchar(16) | YES | NULL | – | Device ip |
| device_mac | varchar(32) | YES | NULL | – | Device mac |
| device_model | varchar(32) | YES | NULL | – | Device model |
| del_flag | char(1) | YES | '0' | – | delete flag |
| create_by | bigint(20) | YES | NULL | – | creater |
| create_time | datetime | YES | NULL | – | create time |
| update_by | bigint(20) | YES | NULL | – | updater |
| update_time | datetime | YES | NULL | – | update time |
---
#### 订单表 - u_order
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| ------------ | ------------- | ------------- | ------ | -------------- | --------------------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | 主键 |
| user_id | bigint(20) | YES | NULL | – | 用户ID |
| package_id | bigint(20) | YES | NULL | – | 套餐ID |
| payment_id | bigint(20) | YES | NULL | – | 支付ID |
| order_no | varchar(64) | YES | NULL | – | 订单编号 |
| type | tinyint(4) | YES | NULL | – | 订单类型(0套餐 1充值) |
| order_amount | decimal(18,4) | YES | NULL | – | 订单金额 |
| status | tinyint(4) | YES | NULL | – | 订单状态(0待支付 1已支付 2已取消) |
| del_flag | tinyint(1) | YES | 0 | – | 删除标志(0存在 1删除) |
| create_by | bigint(20) | YES | NULL | – | 创建人 |
| create_time | datetime | YES | NULL | – | 创建时间 |
| update_by | bigint(20) | YES | NULL | – | 更新人 |
| update_time | datetime | YES | NULL | – | 更新时间 |
---
#### 套餐表 - u_package
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| ----------------- | ------------- | ------------- | ------ | -------------- | ----------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | 主键 |
| rate_limit_id | bigint(20) | YES | NULL | – | 带宽限速ID |
| package_name | varchar(64) | YES | NULL | – | 套餐名称 |
| period_num | int(11) | YES | NULL | – | 有效期数 |
| period_type | tinyint(4) | YES | NULL | – | 有效期类型 |
| price | decimal(18,4) | YES | NULL | – | 价格 |
| traffic | bigint(20) | YES | NULL | – | 流量 |
| duration | bigint(20) | YES | NULL | – | 时长 |
| client_num | int(11) | YES | NULL | – | 在线设备数 |
| remark | varchar(500) | YES | NULL | – | 备注 |
| rate_limit_enable | tinyint(1) | YES | 0 | – | 带宽是否限制 |
| traffic_enable | tinyint(1) | YES | 0 | – | 流量是否限制 |
| duration_enable | tinyint(1) | YES | 0 | – | 时长是否限制 |
| client_num_enable | tinyint(1) | YES | 0 | – | 在线设备数是否限制 |
| package_enable | tinyint(1) | YES | 0 | – | 套餐是否启用 |
| del_flag | tinyint(1) | YES | 0 | – | 删除标志(0存在 1删除) |
| create_by | bigint(20) | YES | NULL | – | 创建人 |
| create_time | datetime | YES | NULL | – | 创建时间 |
| update_by | bigint(20) | YES | NULL | – | 更新人 |
| update_time | datetime | YES | NULL | – | 更新时间 |
---
#### 支付表 - u_payment
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| -------------- | ------------ | ------------- | ------ | -------------- | ----------------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | 主键 |
| name | varchar(32) | YES | NULL | – | 支付名称 |
| type | tinyint(4) | YES | NULL | – | 类型(0支付宝 1微信 2信用卡) |
| appId | varchar(32) | YES | NULL | – | 应用编号 |
| server_url | varchar(32) | YES | NULL | – | 支付网关 |
| domain | varchar(32) | YES | NULL | – | 外网访问项目的域名 |
| private_key | varchar(128) | YES | NULL | – | 应用私钥 |
| public_key | varchar(128) | YES | NULL | – | 应用公钥 |
| app_cert_path | varchar(64) | YES | NULL | – | 应用公钥证书 |
| cert_path | varchar(64) | YES | NULL | – | 公钥证书 |
| root_cert_path | varchar(64) | YES | NULL | – | 根证书 |
| enable | tinyint(1) | YES | NULL | – | 是否启用 |
| del_flag | tinyint(1) | YES | 0 | – | 删除标志(0存在 1删除) |
| create_by | bigint(20) | YES | NULL | – | 创建人 |
| create_time | datetime | YES | NULL | – | 创建时间 |
| update_by | bigint(20) | YES | NULL | – | 更新人 |
| update_time | datetime | YES | NULL | – | 更新时间 |
---
#### 限速表 - u_rate_limit
| 字段名称 | 数据类型 | 是否允许 NULL | 默认值 | 额外属性 | 注释 |
| ----------------- | ----------- | ------------- | ------ | -------------- | ----------------------- |
| id | bigint(20) | NO | – | AUTO_INCREMENT | 主键 |
| rate_limit_name | varchar(32) | YES | NULL | – | 限速名称 |
| down_limit | bigint(20) | YES | NULL | – | 下行限速 |
| down_limit_enable | tinyint(1) | YES | 0 | – | 下行限速启用 |
| up_limit | bigint(20) | YES | NULL | – | 上行限速 |
| up_limit_enable | tinyint(1) | YES | 0 | – | 上行限速启用 |
| del_flag | tinyint(1) | YES | 0 | – | 删除标志(0存在 1删除) |
| create_by | bigint(20) | YES | | | |
---
#### 充值表 - u_recharge
| 字段名称 | 数据类型 | 允许 NULL | 默认值 | 自增 | 注释 |
| ----------- | --------------------- | --------- | -------- | -------------- | ---------------------- |
| recharge_id | bigint(20) | NO | — | AUTO_INCREMENT | Recharge ID |
| user_id | bigint(20) | YES | NULL | | User ID link to u_user |
| fee | double | YES | NULL | | — |
| status | enum('unpaid','paid') | YES | 'unpaid' | | — |
| create_by | varchar(32) | YES | '' | | create name |
| create_time | datetime | YES | NULL | | create time |
---
#### 用户信息表 - u_user
| 字段名称 | 数据类型 | 允许 NULL | 默认值 | 自增 | 注释 |
| ----------- | ------------ | --------- | ------ | -------------- | ------------------------------- |
| user_id | bigint(20) | NO | — | AUTO_INCREMENT | 用户ID |
| dept_id | bigint(20) | YES | NULL | | 部门ID |
| user_name | varchar(30) | NO | — | | 用户账号 |
| nick_name | varchar(30) | NO | — | | 用户昵称 |
| full_name | varchar(64) | YES | NULL | | 用户姓名 |
| user_type | varchar(2) | YES | '00' | | 用户类型(00系统用户) |
| email | varchar(50) | YES | '' | | 用户邮箱 |
| phonenumber | varchar(15) | YES | '' | | 手机号码 |
| sex | char(1) | YES | '0' | | 用户性别(0男 1女 2未知) |
| avatar | varchar(100) | YES | '' | | 头像地址 |
| password | varchar(100) | YES | '' | | 密码 |
| age | int(11) | YES | NULL | | 年龄 |
| birth_date | date | YES | NULL | | 出生日期 |
| address | varchar(255) | YES | NULL | | 地址 |
| status | char(1) | YES | '0' | | 帐号状态(0正常 1停用) |
| del_flag | char(1) | YES | '0' | | 删除标志(0代表存在 2代表删除) |
| login_ip | varchar(128) | YES | '' | | 最后登录IP |
| login_date | datetime | YES | NULL | | 最后登录时间 |
| create_by | varchar(64) | YES | '' | | 创建者 |
| create_time | datetime | YES | NULL | | 创建时间 |
| update_by | varchar(64) | YES | '' | | 更新者 |
| update_time | datetime | YES | NULL | | 更新时间 |
| remark | varchar(500) | YES | NULL | | 备注 |
---
#### KYC表 - u_kyc
| 字段名称 | 数据类型 | 允许 NULL | 默认值 | 自增 | 注释 |
| ---------------- | ------------ | --------- | --------- | -------------- | --------------------------------------------------------------------------------------------------------------- |
| kyc_id | bigint(20) | NO | — | AUTO_INCREMENT | ID |
| user_id | bigint(20) | YES | NULL | | link to user_id of u_user |
| real_name | varchar(64) | YES | NULL | | — |
| birth_date | date | YES | NULL | | — |
| id_type | enum | YES | NULL | | identify type('DRIVERS_LICENSE','PASSPORT','RESIDENCE_PERMIT','STUDENT_ID','MEDICARE_CARD','BIRTH_CERTIFICATE') |
| id_file | varchar(128) | YES | '' | | ID file |
| identify_picture | varchar(128) | YES | NULL | | identify picture |
| status | enum | YES | 'PENDING' | | KYC Status: 1-VERIFIED/2-UNVERIFIED/3-PENDING/4-REJECTED |
| description | varchar(255) | YES | NULL | | — |
| del_flag | char(1) | YES | '0' | | 删除标志(0代表存在 2代表删除) |
| create_by | varchar(64) | YES | '' | | 创建者 |
| create_time | datetime | YES | NULL | | 创建时间 |
| update_by | varchar(64) | YES | '' | | 更新者 |
| update_time | datetime | YES | NULL | | 更新时间 |
---
# 5. 功能模块设计
## 5.1. 客户平台
1. **Dashboard**:主控制面板,提供系统概览。
2. **设备管理**:
- **AP设备管理**:管理接入点设备。
- **无线网络**:配置和管理无线网络。
- **门户**:管理门户设置。
- **终端设备管理**:管理连接的终端设备。
- **监控/配置/启停/移除/纳管**:对设备进行监控、配置、启动、停止、移除和纳管操作。
3. **用户管理**:
- **用户信息**:查看和管理用户信息。
- **KYC状态**:管理用户的KYC(了解你的客户)状态,包括未KYC和已KYC。
- **MAC**:管理设备的MAC地址。
- **话单管理**:查询通话记录,包括时长和流量。
4. **账单管理**:
- **查询**:查询账单信息。
- **KYC审核**:审核用户的KYC信息,包括批准和拒绝操作。
5. **计费管理**:
- **计费规则**:设置计费规则。
- **限速设置**:配置网络限速。
- **套餐管理**:管理计费套餐,包括查询、增加、修改和删除操作。
6. **系统管理**:
- **账号管理**:管理系统账号。
- **角色管理**:管理用户角色。
- **菜单管理**:管理系统菜单。
- **字典管理**:管理系统字典。
- **日志管理**:管理系统日志。
- **任务管理**:管理系统任务。
这些功能模块共同构成了一个全面的管理门户,支持设备、用户、账单和系统的综合管理。
![](image/admin-portal-features-2.png)
## 5.2 用户平台
1. **账号注册**:
- **个人信息填写**:包括账户名、姓名、年龄、性别、电话、邮箱、地址等信息。
- **协议声明和签署**:用户需同意相关协议。
- **获取验证码**:通过邮箱获取验证码进行验证。
2. **登录**:
- **忘记密码**:提供找回密码功能,通过邮箱重置密码。
3. **用户平台**:
- **主页/仪表盘**:用户主界面,提供系统概览。
- **套餐购买**:提供套餐购买功能,支持多种支付方式,包括支付宝和微信支付。
- **余额充值**:提供余额充值功能,支持多种支付方式,包括支付宝和微信支付。
4. **终端设备**:
- **当前设备**:查询当前连接的设备。
- **历史设备**:查询历史连接的设备。
5. **充值服务**:
- **余额充值**:提供余额充值功能。
- **套餐办理**:办理新的套餐。
6. **账单**:
- **充值记录**:查询充值记录。
- **上网记录**:查询上网记录。
- **套餐记录**:查询套餐记录。
7. **个人信息**:
- **修改信息**:修改个人信息。
- **修改密码**:修改账户密码。
- **KYC认证**:进行KYC认证,需人工审核。
这些功能模块共同构成了一个全面的用户平台,支持用户注册、登录、套餐购买、设备管理、充值服务、账单查询和个人信息管理等功能。
![](image/user-portal-features-1.png)
# 6. 计费和套餐设计
1. **计算周期**:
- 支持小时、天、月、年等不同的计算周期。
2. **时间限制**:
- 时段限制:支持小时、天或不限。
- 计算差值:根据时间限制计算差值。
3. **流量限制**:
- 支持设置不同的流量限制(流量1、流量2等)或不限。
4. **设备数据限制**:
- 支持设置不同的设备数量限制(数量1、数量2等)或不限。
5. **带宽限制**:
- 支持设置不同的带宽限制(带宽1、带宽2等)或不限。
6. **计算规则**:
- **计时**:支持按秒、分钟、小时、天或不限进行计时。
- **计算类型**:当前仅支持预付费,单位可以是KB、MB等。
- **等头流量处理**:支持向上取整或四舍五入。
- **价格**:支持按天或月设置价格周期。
7. **封闭设置**:
- 支持设置封闭金额和期初限制。
8. **规则设置**:
- 当前仅支持单一规则(规则1),不支持多种规则选择。
9. **备注**:
- 当前仅支持预付费模式。
- 标注“NA”的选项当前不支持。
计费套餐和计费规则共同构成了一个灵活的计费套餐和规则配置系统,支持根据时间、流量、设备和带宽等不同维度进行计费规则的定制。
![](image/billing-package-1.png)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 259 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 177 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 KiB

@@ -1,339 +0,0 @@
# WANFi Software Quick Installation Guide
## Preparation
* Hardware Requirements
```text
CPU: >= 4 core
Memory: >= 16GiB
Storage:
OS: >= 50GiB
/opt/wfc: >= 50GiB # work and database storage
/var/lib/docker: >= 50GiB
```
* System Environment
```text
Linux >= Ubuntu 22.04
JDK >= 1.8 (Recommended version 1.8) (for Omada SDN Controller)
Omada SDN Controller > 5.15.6.7
docker >= 24.0.7, build 24.0.7-0ubuntu2~22.04.1
docker-compose >= v2.10.0
docker-buildx >= 0.14.1
```
* Install docker, docker-compose and buildx plugin
```sh
sudo apt-get update
sudo apt-get install -y docker.io
# Install the docker-compose-v2 plugin
sudo apt-get install -y docker-compose-v2
sudo ln -s /usr/libexec/docker/cli-plugins/docker-compose /usr/bin/docker-compose
# Install the docker-buildx plugin
sudo apt-get install -y docker-buildx
sudo ln -s /usr/libexec/docker/cli-plugins/docker-buildx /usr/bin/docker-buildx
```
* Please confirm that the versions of docker, docker-compose and docker-buildx plugin meet the requirements
```sh
docker -v
docker compose version
docker buildx version
```
## Obtaining the Installation Package
- TAR Installation Package
File name: wfc-1.0.7-20250221.tar.gz
- DEB Installation Package
File name:wfc-1.0.7-20250221.deb
Notes:
* Version: 1.0.7
* Build date:20250221
Obtain the latest version of the software installation package as needed
## Installing and Configuring the Software
**TAR Package Installation Method**
- Create Installation Directory
This step is required for fresh installations. If upgrading, retain the existing directory
```sh
sudo mkdir /opt/wfc
```
- Extract the Software Package to the Installation Directory
```sh
sudo tar xvfz wfc-1.0.7-20250221.tar.gz -C /opt/wfc
```
**DEB Package Installation Method**
- Install the Software Package
```sh
sudo dpkg -i wfc-1.0.7-20250221.deb
```
* Directory Tree After Installation
```text
/opt/wfc # work root directory
├── bin # shell script and binary file
├── docker # docker compose work directory
│   ├── env # default docker environment file, will be copy to docker compose work directory
│   ├── java # java image directory
│   ├── mysql # mysql database container directory
│   │   ├── conf
│   │   ├── conf.d
│   │   ├── data
│   │   ├── db
│   │   ├── logs
│   │   └── tmp
│   ├── nacos # nacos container directory
│   │   ├── conf
│   │   └── logs
│   ├── nginx # nginx container directory
│   │   ├── conf
│   │   ├── conf.d
│   │   ├── html
│   │   │   └── dist
│   │   │   ├── sys # system portal
│   │   │   └── u # user portal
│   │   └── logs
│   ├── redis # redis container directroy
│   │   ├── conf
│   │   └── data
│   └── wfc # wfc container root directory
│   ├── auth # auth root directory
│   │   └── jar
│   ├── gateway # gateway root directory
│   │   └── jar
│   ├── modules # modules root directory
│   │   ├── file
│   │   │   └── jar
│   │   ├── gen
│   │   │   └── jar
│   │   ├── job
│   │   │   └── jar
│   │   ├── payment
│   │   │   └── jar
│   │   ├── system
│   │   │   └── jar
│   │   └── user
│   │   └── jar
│   ├── upload # file upload directory
│   └── visual
│   └── monitor
│   └── jar
└── systemd # service daemon file,will be copy to /etc/systemd/system
└── system
```
* Configure the Software Environment
```sh
cd /opt/wfc/bin
sudo ./wfcsetup.sh env 192.168.13.128 # Parameter 2 is the host machine IP address
```
* Modify Docker Environment Parameters
Modify the following environment parameter configurations according to actual conditions:
** WFC_SERVER_IP address has already been replaced in the above configuration process
** Replace TZ with the host machine system time zone
```sh
cd /opt/wfc/docker
cat .env
WFC_CONFIG_DATABASE=wfc_config_db
WFC_SYSTEM_DATABASE=wfc_system_db
WFC_USER_DATABASE=wfc_user_db
MYSQL_SERVICE_NAME=wfc-mysql
MYSQL_SERVICE_PORT=3306
MYSQL_ROOT_PASSWORD=123456
MYSQL_SERVICE_USER=root
MYSQL_SERVICE_PASSWORD=123456
REDIS_PORT=6379
NACOS_PROFILE_NAME=prod
NACOS_NAME_SPACE=wfc-prod
NACOS_SERVER_NAME=wfc-nacos
WFC_SERVER_PORT=80
NACOS_SERVER_PORT=8848
GATEWAY_SERVER_PORT=8080
AUTH_SERVER_PORT=8081
WFC_FILE_PORT=9201
WFC_JOB_PORT=9203
WFC_PAYMENT_PORT=9204
WFC_SYSTEM_PORT=9205
WFC_USER_PORT=9206
WFC_SERVER_IP=192.168.13.128
NACOS_SERVER_IP=${WFC_SERVER_IP}
GATEWAY_SERVER_IP=${WFC_SERVER_IP}
RESTART_OPTION=on-failure:5
TZ=Asia/Shanghai #docker container time zone
```
If these container environment parameters have not been changed, you can directly run the following command to set the environment and create containers:
```sh
cd /opt/wfc/bin
sudo ./wfcsetup.sh all 192.168.13.128 # Parameter 2 is the host machine IP address
```
* Create Docker Containers
If you have already run 'sudo ./wfcsetup.sh all 192.168.13.128', the following command can be omitted
```sh
cd /opt/wfc/bin
sudo ./wfcsetup.sh all
```
## Configure Omada Platform Integration Connection Parameters
* Obtain portal platform integration connection parameters from the Omada service, as shown below:
![Omada platform integration configuration screenshot](media/wfc-omada-integration.png)
Note: The connection MODE uses Client. For specific configuration methods, refer to the relevant Omada documentation
* Modify Configuration Files
* Modify the following Omada configuration items for platform integration with Omada
```sh
cd /opt/wfc/docker/conf
cat application-common.yml
...
# Omada config
omada:
# web url or host exp: 'https://192.168.2.249:8043'
omada-url: 'https://aps1-omada-northbound.tplinkcloud.com'
omadac-id: 'c4decbf73f80094019d664506ec9b4d4'
client-id: '6110a77822234243a033e652d1e8a3ae'
client-secret: '651957da95f14f45b719876bb68bd6f5'
...
```
* Modify the following email configuration items for sending email verification codes
```sh
cd /opt/wfc/docker/conf
cat application-common.yml
...
mail:
enabled: true
host: mail.agrandtech.com
port: 25
# Enable authentication
auth: true
# Sender, follows RFC-822 standard
from: smtpext <smtpext@agrandtech.com>
# User name
user: smtpext
# Password
pass: Smtp123@agt
# Use TLS security connection
starttlsEnable: false
# Use SSL security connection
sslEnable: false
# Timeout value for sending mail, in milliseconds
timeout: 0
# Connection timeout value, in milliseconds
connectionTimeout: 0
...
```
* Allow email-related domains in Omada
To support users in obtaining email verification codes without network permissions when logging into AP for the first time, you can allow email-related domains in Omada. The specific steps are as follows:
After entering Omada, select the site you need to configure, select Settings->Authentication->Portal->Access Control->Pre-Authentication Access->check Enable, then add the email-related domains to the Pre-Authentication Access List. Note that all domains involved in accessing email need to be allowed, as shown in the following figures (the allowed domains may not be complete):
![](media/omada-auth-settings-1.png)
![](media/email-omada-auth-settings-2.png)
* Modify payment configuration items
```sh
cd /opt/wfc/docker/wfc/modules/payment/conf/
cat application.yml
...
# payment configuration,
# alipay configuration
alipay:
appId: 9021000122699258
privateKey: MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC7YAcIXV5GJlTWBOoBcrVG1zKxHunznSjYXwTS2DM3YgloxzKye4apfcmBDVnoL93m4QrJTtbiHYvu4yJjJfJsQEY+Wo44IczhDypyu+Il6JpQOwylTs94/+3aaQ1wThsDaGs8edaFGteuw+1pUVl4nxF00fS1VoIR30riqAGFAXrPhcSA6Y9c8HK1htxCelICnPzjpqC4s8ZjrjS7FoyHP2ZAay5fx1VEtah30E4RvycFfV/i2+k3JGFOSeevdCx6Ufu+9Y/RaG4Sh84QuYRQUhAHUswlFDHpRrAnxHzt0zDkOkg3BrCT7vMtBbSOP9BdIhpVTaZm4diQdNbLSl4hAgMBAAECggEAKb1Xc7aQ1KGfTlmj4xSxawlvImOXjAwbWC+6fFlq91BgdjXBhl7b/Y+mvpfBymY3UUIaTAPC/HXGgT2ZoGqImTKsMyGrArgM0qm1M//EfdtV3L96rqxirTqduoSiWL0daWHuWXduoRH8r9K3ZTmY67TLh7FpiKevq9mI7fqs8/qgq5QAN4UPFb3Cq9hDNTU4l6+Bywdg1KkwJ2Jc98SlrIdVl+1eCMAgueLR0aNHTobyPBZ/KfwGRV0OQ3QqjLVgL3zlbzuylYhaZqPgxxd46vgWwkyMiiv7u2OyCetq4LFd+tcNDz0Yqk6rK9/S0oxbN8NM5DLkpwFh/433BoPS3QKBgQD/dsxNr2PYdPLp6pOvw7H2AFMH8CkwTlRg+2f/0fgQF14rJwZgEU6fL5A2JvQeRRC5mCff2m5tDqrS321JNyH/JIKJ+4J8I34GEo/kSCHL3RmyvJGQOQ/EpEyxvP8BV3ob6UO3LR58DOGlJr8eTsr3Y8o9cAMuknCNxvsd2LvybwKBgQC7xKkx4KIPBny6sCOtChOkgIrY3hOCi+ZsHQVESXKzeku0NkH/qrAG+S9pb1XCzXdM2HrzkMeuz6tqi+2TY8nORyY2DZHNW7FqzkAiZ/NO2AgGIlALq1ZfJZke2MxgtBnxSsQ03gfXP9opu/FsLH9a+s6edfHPvKD4kHxlLBfAbwKBgQDYvr6QmuKn4HHJLZGoau0uvw+ziHwp1AubTTLrxgYmAO2Qx0eNcqG2RfChQWOV2xtZnFMYhodyWCNvTsm2eOSLSTrIP3ByStq95DnZganLAgivsXX/W6qZOJ0poCTryoB79enSHKHktjksmjdFS6zBQRVyEvtgJDcC03Rz2lN8WQKBgQCCoJE4otb7bv7s/ccEBeOeaNKvhue5xUwbYKEeXZ6PYAA0sh5+GCf34flq90qJiFl7u4rl0Y4pfk35hLlV9XEasYLSzePmIuktrakOhpTNABus8MgRJjSjYsvAmwCsMf9uTx5qzSBVThWfPSH6qIY9LAj8Un9UjxzJb/Mqi19GvwKBgQC0/KB+3robTqy9KOV4iEKJ4kmnXDRu7ecpMyc8k5HzpolIHcXLZHkBK9pMCXBQ9Kwy6BjRGNnUZOahS+tvnMcjHpwdhu90r7D51GXW/+PeFtphYTscFhHv1yuWbbojzhKf69pZnsVmyllIBqRgtbkS2WNHxWo/peCg47TcLaQNMA==
publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhBZoE6p1TKpd/WsAJRTA2D6yUTzqLmZ73scxbPxxKwPIg2ys2Ap21u/lVmqBWO9Wf2Z7wUwr/6BP1PQqVpg0GAqU3yjjZ0LGfBitzMBMbGrlOLqJQ3PKgnUNmnOdLR4FlHCAjKtuyxjHkxBTHg/L4punk4lkFJQD8YvzFrYalS6WYw5j1/oq080NbcjPirPCRlsU7MRraQuUqSTdPwm2iHkroKwCEbGv+RtNJCfOkKNQVtRFFgPGMhU4nQ620gdfzsGJsNFKVJnD5SjeDWniBAbaGaVF4rEfKJPe6+XrcMg3h+9Fz+A2IU1KCCoth2neEZEaU1t0KBGxXIuo4efi/QIDAQAB
appCertPath: \u5E94\u7528\u516C\u94A5\u8BC1\u4E66
aliPayCertPath: \u652F\u4ED8\u5B9D\u516C\u94A5\u8BC1\u4E66
aliPayRootCertPath: \u652F\u4ED8\u5B9D\u6839\u8BC1\u4E66
serverUrl: https://openapi-sandbox.dl.alipaydev.com/gateway.do
domain: http://192.168.2.249
testDomain: http://129.204.171.210:8085
# wxpay configuration
wxpay:
appId:
appSecret:
mchId:
partnerKey:
certPath:
domain: http://192.168.2.249/u
...
```
* Allow payment-related domains in Omada
To support users in normally completing package purchases or balance recharges without network permissions when logging into AP for the first time, you need to allow payment-related domains in Omada. The specific steps are as follows:
After entering Omada, select the site you need to configure, select Settings->Authentication->Portal->Access Control->Pre-Authentication Access->check Enable, then add the payment method-related domains to the Pre-Authentication Access List. Note that all domains involved in payment need to be allowed, as shown in the following figures (the allowed domains may not be complete):
![](media/omada-auth-settings-1.png)
![](media/pay-omada-auth-settings-2.png)
* Start/View/Stop/Version Software
```sh
cd /opt/wfc/bin
sudo ./wfccontrol.sh start/restart/status/stop/version
```
## Access System Platform and User Platform via Browser
* System Platform Portal Address:
```url
http://192.168.13.128/sys
```
* User Platform Portal Address:
```url
http://192.168.13.128/u
```
Loaded 100 of 133 files, more files were not shown because too many files have changed in this diff. Show more