refactor: 前后端基础部分

This commit is contained in:
2024-05-27 14:15:48 +08:00
parent f23e4548cd
commit f5e6db390a
928 changed files with 65057 additions and 0 deletions

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">ext.dic;</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">stopword.dic;</entry>
</properties>

View File

@@ -0,0 +1 @@
# org.nl.config.thread.ThreadMonitorCollector

View File

@@ -0,0 +1,8 @@
_ _ ___________ _ _____ _ ___________ _____
| \ | | _ | ___ \ | | ___| | | ___| ___|_ _|
| \| | | | | |_/ / | | |__ | | | |__ | |_ | |
| . ` | | | | ___ \ | | __|| | | __|| _| | |
| |\ \ \_/ / |_/ / |____| |___| |____| |___| | | |
\_| \_/\___/\____/\_____/\____/\_____/\____/\_| \_/
:: Spring Boot :: (v2.1.0.RELEASE)

View File

@@ -0,0 +1,149 @@
server:
port: 8011
#配置数据源
spring:
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
datasource:
dynamic:
primary: mysql
datasource:
mysql:
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
# url: jdbc:log4jdbc:mysql://${DB_HOST:10.93.41.198}:${DB_PORT:3306}/${DB_NAME:rl_mg_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
# username: ${DB_USER:root}
# password: ${DB_PWD:123456}
url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:nl-platform}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
username: ${DB_USER:root}
password: ${DB_PWD:12356}
type: com.alibaba.druid.pool.DruidDataSource
oracle:
driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@172.27.37.66:1521:RTMES
username: ${DB_USER:LMSTELCOM}
password: ${DB_PWD:LMSTELCOM_6463}
type: com.alibaba.druid.pool.DruidDataSource
sqlserver:
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
url: jdbc:sqlserver://10.93.41.2\WINCC;DatabaseName=马钢_RH
username: ${DB_USER:sa}
password: ${DB_PWD:123}
type: com.alibaba.druid.pool.DruidDataSource
redis:
#数据库索引
host: ${REDIS_HOST:127.0.0.1}
port: ${REDIS_PORT:6379}
password: ${REDIS_PWD:}
redisson:
config: |
threads: 4
nettyThreads: 4
singleServerConfig:
database: 3
connectionMinimumIdleSize: 8
connectionPoolSize: 8
address: redis://127.0.0.1:6379
idleConnectionTimeout: 10000
timeout: 3000
# 登录相关配置
login:
# 登录缓存
cache-enable: true
# 是否限制单用户登录
single-login: false
# 验证码
login-code:
# 验证码类型配置 查看 LoginProperties 类
code-type: arithmetic
# 登录图形验证码有效时间/分钟
expiration: 2
# 验证码高度
width: 111
# 验证码宽度
heigth: 36
# 内容长度
length: 2
# 字体名称,为空则使用默认字体
font-name:
# 字体大小
font-size: 25
#是否允许生成代码生产环境设置为false
generator:
enabled: true
# IP 本地解析
ip:
local-parsing: true
# 文件存储路径
file:
mac:
path: ~/file/
avatar: ~/avatar/
linux:
path: /home/eladmin/file/
avatar: /home/eladmin/avatar/
windows:
path: C:\eladmin\file\
avatar: C:\eladmin\avatar\
# 文件大小 /M
maxSize: 100
avatarMaxSize: 5
logging:
file:
path: C:\log\wms
config: classpath:logback-spring.xml
# Sa-Token配置
sa-token:
# token 名称 (同时也是cookie名称)
token-name: Authorization
# token 有效期单位s 默认30天, -1代表永不过期
timeout: 2592000
# token 临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
activity-timeout: -1
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
is-concurrent: true
# 在多人登录同一账号时是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
is-share: false
# token风格
token-style: random-128
# 是否输出操作日志
is-log: false
jwt-secret-key: opsjajisdnnca0sdkksdfaaasdfwwq
# token 前缀
token-prefix: Bearer
sso:
# Ticket有效期 (单位: 秒),默认五分钟
ticket-timeout: 300
# 所有允许的授权回调地址
allow-url: "*"
# 是否打开单点注销功能
is-slo: true
# ------- SSO-模式三相关配置 下面的配置在SSO模式三并且 is-slo=true 时打开)
# 是否打开模式三
isHttp: true
# 接口调用秘钥用于SSO模式三的单点注销功能
secretkey: kQwIOrYvnXmSDkwEiFngrKidMcdrgKor
# ---- 除了以上配置项,你还需要为 Sa-Token 配置http请求处理器文档有步骤说明
is-read-cookie: true
is-print: false
# 未登录 StpUtil.getTokenSession() 设置值,获取值 @SaIgnore 得忽略接口
token-session-check-login: false
alone-redis:
# Redis数据库索引默认为0
database: 1
# Redis服务器地址
host: 127.0.0.1
# Redis服务器连接端口
port: 6379
# Redis服务器连接密码默认为空
password:
# 连接超时时间
timeout: 10s
lucene:
index:
path: D:\lucene\index

View File

@@ -0,0 +1,165 @@
server:
port: 8010
#配置数据源
spring:
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
datasource:
dynamic:
primary: mysql
datasource:
mysql:
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
url: jdbc:log4jdbc:mysql://${DB_HOST:10.93.41.198}:${DB_PORT:3306}/${DB_NAME:lz_lms_two}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
username: ${DB_USER:root}
password: ${DB_PWD:123456}
# url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:rtmg_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
# username: ${DB_USER:root}
# password: ${DB_PWD:12356}
type: com.alibaba.druid.pool.DruidDataSource
oracle:
driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@172.27.37.66:1521:RTMES
username: ${DB_USER:LMSTELCOM}
password: ${DB_PWD:LMSTELCOM_6463}
type: com.alibaba.druid.pool.DruidDataSource
sqlserver:
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
url: jdbc:sqlserver://10.93.41.2\WINCC;DatabaseName=马钢_RH
username: ${DB_USER:sa}
password: ${DB_PWD:123}
type: com.alibaba.druid.pool.DruidDataSource
redis:
#数据库索引
host: ${REDIS_HOST:127.0.0.1}
port: ${REDIS_PORT:6379}
password: ${REDIS_PWD:}
redisson:
config: |
threads: 4
nettyThreads: 4
singleServerConfig:
database: 15
connectionMinimumIdleSize: 8
connectionPoolSize: 8
address: redis://127.0.0.1:6379
idleConnectionTimeout: 10000
timeout: 3000
# 登录相关配置
login:
# 登录缓存
cache-enable: true
# 是否限制单用户登录
single-login: false
# 验证码
login-code:
# 验证码类型配置 查看 LoginProperties 类
code-type: arithmetic
# 登录图形验证码有效时间/分钟
expiration: 2
# 验证码高度
width: 111
# 验证码宽度
heigth: 36
# 内容长度
length: 2
# 字体名称,为空则使用默认字体,如遇到线上乱码,设置其他字体即可
font-name:
# 字体大小
font-size: 25
#jwt
jwt:
header: Authorization
# 令牌前缀
token-start-with: Bearer
# 必须使用最少88位的Base64对该令牌进行编码
base64-secret: ZmQ0ZGI5NjQ0MDQwY2I4MjMxY2Y3ZmI3MjdhN2ZmMjNhODViOTg1ZGE0NTBjMGM4NDA5NzYxMjdjOWMwYWRmZTBlZjlhNGY3ZTg4Y2U3YTE1ODVkZDU5Y2Y3OGYwZWE1NzUzNWQ2YjFjZDc0NGMxZWU2MmQ3MjY1NzJmNTE0MzI=
# 令牌过期时间 此处单位/毫秒 默认2小时可在此网站生成 https://www.convertworld.com/zh-hans/time/milliseconds.html
token-validity-in-seconds: 7200000
# 在线用户key
online-key: online-token-
# 验证码
code-key: code-key-
# token 续期检查时间范围默认30分钟单位默认毫秒在token即将过期的一段时间内用户操作了则给用户的token续期
detect: 1800000
# 续期时间范围,默认 1小时这里单位毫秒
renew: 3600000
# IP 本地解析
ip:
local-parsing: true
#是否允许生成代码生产环境设置为false
generator:
enabled: false
# 文件存储路径
file:
mac:
path: ~/file/
avatar: ~/avatar/
linux:
path: /home/eladmin/file/
avatar: /home/eladmin/avatar/
windows:
path: C:\eladmin\file\
avatar: C:\eladmin\avatar\
# 文件大小 /M
maxSize: 100
avatarMaxSize: 5
logging:
file:
path: /app/jar/logs
config: classpath:logback-spring.xml
# Sa-Token配置
sa-token:
# token 名称 (同时也是cookie名称)
token-name: Authorization
# token 有效期单位s 默认30天, -1代表永不过期
timeout: 2592000
# token 临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
activity-timeout: -1
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
is-concurrent: true
# 在多人登录同一账号时是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
is-share: false
# token风格
token-style: random-128
# 是否输出操作日志
is-log: false
jwt-secret-key: opsjajisdnnca0sdkksdfaaasdfwwq
# token 前缀
token-prefix: Bearer
sso:
# Ticket有效期 (单位: 秒),默认五分钟
ticket-timeout: 300
# 所有允许的授权回调地址
allow-url: "*"
# 是否打开单点注销功能
is-slo: true
# ------- SSO-模式三相关配置 下面的配置在SSO模式三并且 is-slo=true 时打开)
# 是否打开模式三
isHttp: true
# 接口调用秘钥用于SSO模式三的单点注销功能
secretkey: kQwIOrYvnXmSDkwEiFngrKidMcdrgKor
# ---- 除了以上配置项,你还需要为 Sa-Token 配置http请求处理器文档有步骤说明
is-read-cookie: true
is-print: false
# 未登录 StpUtil.getTokenSession() 设置值,获取值 @SaIgnore 得忽略接口
token-session-check-login: false
alone-redis:
# Redis数据库索引默认为0
database: 9
# Redis服务器地址
host: 127.0.0.1
# Redis服务器连接端口
port: 6379
# Redis服务器连接密码默认为空
password:
# 连接超时时间
timeout: 10s
lucene:
index:
path: D:\lucene\index

View File

@@ -0,0 +1,186 @@
server:
tomcat:
relaxed-query-chars: [ '|','{','}','[',']' ] #字符问题https://blog.csdn.net/CanYue_Yi/article/details/109182577
relaxed-path-chars: [ '|','{','}','[',']' ] #字符问题: https://blog.csdn.net/weixin_41996632/article/details/90715118
spring:
datasource:
druid:
initial-size: 5 #初始化时建立物理连接的个数
min-idle: 15 #最小连接池数量
maxActive: 30 #最大连接池数量
maxWait: 3000 #获取连接时最大等待时间,单位毫秒
#申请连接的时候检测如果空闲时间大于timeBetweenEvictionRunsMillis执行validationQuery检测连接是否有效。
test-while-idle: true
time-between-eviction-runs-millis: 300000 #既作为检测的间隔时间又作为test-while-idle执行的依据
min-evictable-idle-time-millis: 900000 #销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接
#用来检测连接是否有效的sql
#mysql中为 select 'x'
#oracle中为 select 1 from dual
validation-query: SELECT 'x'
test-on-borrow: true #申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
test-on-return: false #归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
exception-sorter: true #当数据库抛出不可恢复的异常时,抛弃该连接
pool-prepared-statements: true #是否缓存preparedStatement,mysql5.5+建议开启
max-pool-prepared-statement-per-connection-size: 20 #当值大于20时poolPreparedStatements会自动修改为true
#通过connectProperties属性来打开mergeSql功能慢SQL记录
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
use-global-data-source-stat: true #合并多个DruidDataSource的监控数据
#filters通过别名的方式配置扩展插件常用的插件有
#监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall
filter:
stat:
enabled: true
# 记录慢SQL
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
#设置访问druid监控页面的拦截路径及账号和密码,默认没有
stat-view-servlet:
enabled: true
url-pattern: /druid/*
login-username: admin
login-password: admin
freemarker:
check-template-location: false
profiles:
active: dev
jackson:
time-zone: GMT+8
data:
redis:
repositories:
enabled: false
dynamic:
tp:
enabled: true # 是否启用 dynamictp默认true
enabledBanner: false # 是否启用 控制台banner默认true
enabledCollect: true # 是否开启监控指标采集默认true
collectorTypes: logging,test_collect # 监控数据采集器类型logging | micrometer | internal_logging默认micrometer
logPath: C:\log\lms # 监控日志数据路径,默认 ${user.home}/logs采集类型非logging不用配置
monitorInterval: 8
tomcatTp: # tomcat webserver 线程池配置
threadPoolAliasName: tomcat 线程池 # 线程池别名,可选
corePoolSize: 100
maximumPoolSize: 200
keepAliveTime: 60
runTimeout: 10000
queueTimeout: 100
notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警、拒绝报警、任务超时报警)
- type: change
enabled: true
- type: capacity # 队列容量使用率,报警项类型,查看源码 NotifyTypeEnum枚举类
enabled: true
threshold: 80 # 报警阈值默认70意思是队列使用率达到70%告警
interval: 120 # 报警间隔单位s默认120
- type: liveness # 线程池活性
enabled: true
threshold: 80 # 报警阈值,默认 70意思是活性达到70%告警
- type: reject # 触发任务拒绝告警
enabled: true
threshold: 100 # 默认阈值10
- type: run_timeout # 任务执行超时告警
enabled: true
threshold: 100 # 默认阈值10
- type: queue_timeout # 任务排队超时告警
enabled: true
threshold: 100 # 默认阈值10
task:
pool:
# 核心线程池大小
core-pool-size: 10
# 最大线程数
max-pool-size: 30
# 活跃时间
keep-alive-seconds: 60
# 队列容量
queue-capacity: 50
#七牛云
qiniu:
# 文件大小 /M
max-size: 15
#邮箱验证码有效时间/秒
code:
expiration: 300
#密码加密传输,前端公钥加密,后端私钥解密
rsa:
private_key: MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A==
logging:
file:
path: C:\log\wms
config: classpath:logback-spring.xml
# sa-token白名单配置
security:
# 排除路径
excludes:
# 认证
- /auth/login
- /auth/code
- /auth/logout
- /sys-user-do/**
- /webjars/**
- /file/**
- /webSocket/**
# 静态资源
- /*.html
- /**/*.html
- /**/*.css
- /**/*.js
- /favicon.ico
- /*/api-docs
- /*/api-docs/**
# druid 监控配置
- /druid/**
# actuator 监控配置
- /actuator
- /actuator/**
# 上传
- /api/localStorage/pictures
# 参数
- /api/param/getValueByCode
mybatis-plus:
configuration:
map-underscore-to-camel-case: false
call-setters-on-nulls: true
jdbc-type-for-null: null
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations:
- classpath:/org/nl/**/mapper/**/*.xml
global-config:
db-config:
id-type: INPUT
banner: false
jetcache:
statIntervalMinutes: 15
areaInCacheName: false
local:
default:
type: linkedhashmap
keyConvertor: fastjson
remote:
default:
type: redis
keyConvertor: fastjson2
broadcastChannel: projectA
valueEncoder: java
valueDecoder: java
poolConfig:
minIdle: 5
maxIdle: 20
maxTotal: 50
host: 127.0.0.1
port: 6379
lucene:
index:
path: D:\lucene\index

View File

@@ -0,0 +1,20 @@
# ????Java????
tinyint=Boolean
smallint=Integer
mediumint=Integer
int=Integer
integer=Integer
bigint=Long
float=Float
double=Double
decimal=BigDecimal
bit=Boolean
char=String
varchar=String
tinytext=String
text=String
mediumtext=String
longtext=String
date=Date
datetime=Date
Date=Date

View File

@@ -0,0 +1,20 @@
dept_has=部门存在绑定的人员,请先解绑人员对应部门
device_check=设备编号不能为空
device_orderRun=设备工单已在生产
genrator_cfg=请先配置生成器
material_cfg=物料{0}配置信息异常,请维护
material_check=物料ID{0}不存在
material_notEq=物料不一致
menu_url=外链必须以http\://或者https\://开头
per_auth=存在关联的数据权限,请解除关联后删除
point_checkNull=点位不能为空
point_checkNull_1=起点或终点不能同时为空
quartz_check=子任务中不能添加当前任务ID
role_Check_1=角色名字不能为空
task_isNull=任务信息不存在{0}
task_statusWrong=任务已完成或已取消
vehicle_check=载具编码不能为空
vehicle_check_1=载具{0}组盘信息不存在
workorder_checkNull=工单不存在{0}
workorder_checkRun=该设备{0}不在生产中的工单
workorder_statusError=工单状态不正确

View File

@@ -0,0 +1,20 @@
dept_has=Ada personal terikat di departments Tolong lepaskan departments yang sama dari personal persona
device_check=Equipment number cannot be empty
device_orderRun=The equipment work order is already in production
genrator_cfg=Please configure the generator first
material_cfg=Abnormal configuration information for material {0}, please maintain
material_check=Item ID {0} does not exist
material_notEq=Material inconsistency
menu_url=External links must start with http\://or https\://
per_auth=There is an associated data permission, please remove it after disassociation
point_checkNull=The point cannot be empty
point_checkNull_1=The starting or ending points cannot both be empty
quartz_check=The current task ID cannot be added to a subtask
role_Check_1=The character name cannot be empty
task_isNull=Task information does not exist {0}
task_statusWrong=Task completed or canceled
vehicle_check=Vehicle code cannot be empty
vehicle_check_1=The disk information of vehicle {0} does not exist
workorder_checkNull=The work order does not exist {0}
workorder_checkRun=The equipment {0} is not in production for a work order
workorder_statusError=The work order status is incorrect

View File

@@ -0,0 +1,20 @@
dept_has=Ada personil terikat di departemen. Tolong lepaskan departemen yang sama dari personil pertama
device_check=Nomor peralatan tidak dapat kosong
device_orderRun=Perintah kerja peralatan sudah dalam produksi
genrator_cfg=Silakan konfigur generator pertama
material_cfg=Informasi konfigurasi abnormal untuk material {0}, silakan tetap
material_check=ID Item {0} tidak ada
material_notEq=Tidak konsistens materi
menu_url=Hubungan luar harus dimulai dengan http\://atau https\://
per_auth=Ada izin data terkait, silakan hapuskan setelah pemisahan
point_checkNull=Titik tidak dapat kosong
point_checkNull_1=Titik awal atau akhir tidak dapat berdua kosong
quartz_check=ID tugas saat ini tidak dapat ditambah ke subtask
role_Check_1=Nama karakter tidak dapat kosong
task_isNull=Informasi tugas tidak ada {0}
task_statusWrong=Tugas selesai atau dibatalkan
vehicle_check=Kode kendaraan tidak dapat kosong
vehicle_check_1=Informasi disk dari kendaraan {0} tidak ada
workorder_checkNull=Perintah kerja tidak ada {0}
workorder_checkRun=Perangkat {0} tidak dalam produksi untuk perintah kerja
workorder_statusError=Status perintah kerja tidak benar

View File

@@ -0,0 +1,20 @@
dept_has=Ada personil terikat di departemen. Tolong lepaskan departemen yang sama dari personil pertama
device_check=Nomor peralatan tidak dapat kosong
device_orderRun=Perintah kerja peralatan sudah dalam produksi
genrator_cfg=Silakan konfigur generator pertama
material_cfg=Informasi konfigurasi abnormal untuk material {0}, silakan tetap
material_check=ID Item {0} tidak ada
material_notEq=Tidak konsistens materi
menu_url=Hubungan luar harus dimulai dengan http\://atau https\://
per_auth=Ada izin data terkait, silakan hapuskan setelah pemisahan
point_checkNull=Titik tidak dapat kosong
point_checkNull_1=Titik awal atau akhir tidak dapat berdua kosong
quartz_check=ID tugas saat ini tidak dapat ditambah ke subtask
role_Check_1=Nama karakter tidak dapat kosong
task_isNull=Informasi tugas tidak ada {0}
task_statusWrong=Tugas selesai atau dibatalkan
vehicle_check=Kode kendaraan tidak dapat kosong
vehicle_check_1=Informasi disk dari kendaraan {0} tidak ada
workorder_checkNull=Perintah kerja tidak ada {0}
workorder_checkRun=Perangkat {0} tidak dalam produksi untuk perintah kerja
workorder_statusError=Status perintah kerja tidak benar

View File

@@ -0,0 +1,20 @@
dept_has=部门存在绑定的人员,请先解绑人员对应部门
device_check=设备编号不能为空
device_orderRun=设备工单已在生产
genrator_cfg=请先配置生成器
material_cfg=物料{0}配置信息异常,请维护
material_check=物料ID{0}不存在
material_notEq=物料不一致
menu_url=外链必须以http\://或者https\://开头
per_auth=存在关联的数据权限,请解除关联后删除
point_checkNull=点位不能为空
point_checkNull_1=起点或终点不能同时为空
quartz_check=子任务中不能添加当前任务ID
role_Check_1=角色名字不能为空
task_isNull=任务信息不存在{0}
task_statusWrong=任务已完成或已取消
vehicle_check=载具编码不能为空
vehicle_check_1=载具{0}组盘信息不存在
workorder_checkNull=工单不存在{0}
workorder_checkRun=该设备{0}不在生产中的工单
workorder_statusError=工单状态不正确

View File

@@ -0,0 +1,21 @@
error_AccessLimit=访问次数限制\!
error_CodeGenerator=此环境不允许生成代码,请选择预览或者下载查看
error_Config=配置信息不正确
error_Create=创建失败
error_Delete=删除失败
error_File_1=文件超出规定大小\!
error_File_2=只能上传图片
error_File_3=上传失败
error_LockOut=操作锁被占用{0},等待结束
error_NotEq=参数校验异常:信息不一致
error_NullPoint=信息为空
error_NumberError_1=长度不是偶数\!
error_ParamError=参数不正确
error_ParamExist=信息已经存在{0}
error_Point=点位错误
error_Send=消息发送失败
error_StatusError={0}信息状态不正确
error_SystemAuthError=权限不足,操作失败
error_SystemError=系统繁忙,稍后在试
error_Update=更新失败
error_isNull={0}查询信息不存在

View File

@@ -0,0 +1,21 @@
error_AccessLimit=Access limit\!
error_CodeGenerator=This environment does not allow code generation. Please choose to preview or download to view
error_Config=Incorrect configuration information
error_Create=Creation failed
error_Delete=Delete failed
error_File_1=The file exceeds the specified size\!
error_File_2=Only uploadable images
error_File_3=Upload failed
error_LockOut=Operation lock is occupied {0}, waiting for end
error_NotEq=Parameter verification exception\: inconsistent information
error_NullPoint=Only Empty Question
error_NumberError_1=It's not even long\!
error_ParamError=invalid parameter
error_ParamExist=Parameter already exists {0}
error_Point=point error
error_Send=Message sending failed
error_StatusError={0} information status is incorrect
error_SystemAuthError=Insufficient permissions, operation failed
error_SystemError=The system is busy, please try again later
error_Update=Update failed
error_isNull={0}query is null

View File

@@ -0,0 +1,21 @@
error_AccessLimit=Batas akses\!
error_CodeGenerator=lingkungan ini tidak memungkinkan generasi kode. Silakan pilih untuk melihat atau mengunduh untuk melihat
error_Config=Informasi konfigurasi yang salah
error_Create=Penciptaan gagal
error_Delete=Hapus gagal
error_File_1=Berkas melebihi ukuran yang ditentukan\!
error_File_2=Hanya gambar yang dapat diunggah
error_File_3=Upload gagal
error_LockOut=Operasi kunci sedang sibuk {0}, menunggu akhir
error_NotEq=Pengecualian verifikasi parameter\: informasi yang tidak konsisten
error_NullPoint=Pertanyaan Hanya Kosong
error_NumberError_1=Panjangnya bahkan tidak\!
error_ParamError=parameter tidak benar
error_ParamExist=Parameter sudah ada {0}
error_Point=Kesalahan titik
error_Send=Pengiriman pesan gagal
error_StatusError=Status informasi {0} tidak benar
error_SystemAuthError=Keizinan tidak cukup, operasi gagal
error_SystemError=Sistemnya sibuk, tolong coba lagi nanti
error_Update=Kemaskini gagal
error_isNull={0}Pertanyaan Tidak ada

View File

@@ -0,0 +1,21 @@
error_AccessLimit=Batas akses\!
error_CodeGenerator=lingkungan ini tidak memungkinkan generasi kode. Silakan pilih untuk melihat atau mengunduh untuk melihat
error_Config=Informasi konfigurasi yang salah
error_Create=Penciptaan gagal
error_Delete=Hapus gagal
error_File_1=Berkas melebihi ukuran yang ditentukan\!
error_File_2=Hanya gambar yang dapat diunggah
error_File_3=Upload gagal
error_LockOut=Operasi kunci sedang sibuk {0}, menunggu akhir
error_NotEq=Pengecualian verifikasi parameter\: informasi yang tidak konsisten
error_NullPoint=Pertanyaan Hanya Kosong
error_NumberError_1=Panjangnya bahkan tidak\!
error_ParamError=parameter tidak benar
error_ParamExist=Parameter sudah ada {0}
error_Point=Kesalahan titik
error_Send=Pengiriman pesan gagal
error_StatusError=Status informasi {0} tidak benar
error_SystemAuthError=Keizinan tidak cukup, operasi gagal
error_SystemError=Sistemnya sibuk, tolong coba lagi nanti
error_Update=Kemaskini gagal
error_isNull={0}Pertanyaan Tidak ada

View File

@@ -0,0 +1,21 @@
error_AccessLimit=访问次数限制\!
error_CodeGenerator=此环境不允许生成代码,请选择预览或者下载查看
error_Config=配置信息不正确
error_Create=创建失败
error_Delete=删除失败
error_File_1=文件超出规定大小\!
error_File_2=只能上传图片
error_File_3=上传失败
error_LockOut=操作锁被占用{0},等待结束
error_NotEq=参数校验异常:信息不一致
error_NullPoint=信息为空
error_NumberError_1=长度不是偶数\!
error_ParamError=参数不正确
error_ParamExist=信息已经存在{0}
error_Point=点位错误
error_Send=消息发送失败
error_StatusError={0}信息状态不正确
error_SystemAuthError=权限不足,操作失败
error_SystemError=系统繁忙,稍后在试
error_Update=更新失败
error_isNull={0}查询信息不存在

View File

@@ -0,0 +1,7 @@
login_CodeError=验证码配置信息错误!
login_CodeNull=验证码不存在或者过期
login_account=账号未激活
login_childError=上级不能为自己或自己的下级
login_pwd=账号或者密码不正确
login_pwd_1=修改失败,旧密码错误
login_pwd_2=新密码不能与旧密码相同

View File

@@ -0,0 +1,7 @@
login_CodeError=Verification code configuration information error\!
login_CodeNull=The verification code does not exist or has expired
login_account=Account not activated
login_childError=The superior cannot act for themselves
login_pwd=Incorrect account or password
login_pwd_1=Modification failed, old password error
login_pwd_2=The new password cannot be the same as the old password

View File

@@ -0,0 +1,7 @@
login_CodeError=Galat konfigurasi kode verifikasi\!
login_CodeNull=Kode verifikasi tidak ada atau sudah habis
login_account=Akaun tidak diaktifkan
login_childError=Atasan tidak bisa bertindak untuk diri mereka sendiri
login_pwd=Akaun atau kata sandi yang salah
login_pwd_1=Modifikasi gagal, kesalahan kata sandi lama
login_pwd_2=Kata sandi baru tidak dapat sama dengan kata sandi lama

View File

@@ -0,0 +1,7 @@
login_CodeError=Galat konfigurasi kode verifikasi\!
login_CodeNull=Kode verifikasi tidak ada atau sudah habis
login_account=Akaun tidak diaktifkan
login_childError=Atasan tidak bisa bertindak untuk diri mereka sendiri
login_pwd=Akaun atau kata sandi yang salah
login_pwd_1=Modifikasi gagal, kesalahan kata sandi lama
login_pwd_2=Kata sandi baru tidak dapat sama dengan kata sandi lama

View File

@@ -0,0 +1,7 @@
login_CodeError=验证码配置信息错误!
login_CodeNull=验证码不存在或者过期
login_account=账号未激活
login_childError=上级不能为自己或自己的下级
login_pwd=账号或者密码不正确
login_pwd_1=修改失败,旧密码错误
login_pwd_2=新密码不能与旧密码相同

View File

@@ -0,0 +1,9 @@
CallEmpReelTask_createTaskTip1=请求参数不能为空
CallEmpReelTask_createTaskTip2=业务类型不能为空
CallEmpReelTask_createTaskTip3=载具号不能为空
CallEmpReelTask_createTaskTip4=起点不能为空
CallEmpReelTask_createTaskTip5=下一点不能为空
CallEmpReelTask_forceFinish=CallEmpReelTask任务取消接口任务号为空!
CallEmpReelTask_forceCancel=CallEmpReelTask任务取消接口任务号为空!
CallEmpReelTask_update1=CallEmpReelTask任务更新接口任务号为空
CallEmpReelTask_update2=CallEmpReelTask任务已执行不能取消

View File

@@ -0,0 +1,9 @@
CallEmpReelTask_createTaskTip1=Request parameters cannot be empty
CallEmpReelTask_createTaskTip2=Business type cannot be empty
CallEmpReelTask_createTaskTip3=The vehicle number cannot be empty
CallEmpReelTask_createTaskTip4=The starting point cannot be empty
CallEmpReelTask_createTaskTip5=The next point cannot be empty
CallEmpReelTask_forceFinish=CallEmpReelTask task cancellation interface task number is empty!
CallEmpReelTask_forceCancel=CallEmpReelTask task cancellation interface task number is empty!
CallEmpReelTask_update1=CallEmpReelTask task update interface task number is empty
CallEmpReelTask_update2=The CallEmpReelTask task has been executed and cannot be canceled

View File

@@ -0,0 +1,9 @@
CallEmpReelTask_createTaskTip1=Parameter permintaan tidak boleh kosong
CallEmpReelTask_createTaskTip2=Jenis bisnis tidak boleh kosong
CallEmpReelTask_createTaskTip3=Nomor kendaraan tidak boleh kosong
CallEmpReelTask_createTaskTip4=Titik awal tidak boleh kosong
CallEmpReelTask_createTaskTip5=Poin selanjutnya tidak boleh kosong
CallEmpReelTask_forceFinish=Nomor tugas antarmuka pembatalan tugas CallEmpReelTask kosong!
CallEmpReelTask_forceCancel=Nomor tugas antarmuka pembatalan tugas CallEmpReelTask kosong!
CallEmpReelTask_update1=Nomor tugas antarmuka pembaruan tugas CallEmpReelTask kosong
CallEmpReelTask_update2=Tugas CallEmpReelTask telah dijalankan dan tidak dapat dibatalkan

View File

@@ -0,0 +1,9 @@
CallEmpReelTask_createTaskTip1=Parameter permintaan tidak boleh kosong
CallEmpReelTask_createTaskTip2=Jenis bisnis tidak boleh kosong
CallEmpReelTask_createTaskTip3=Nomor kendaraan tidak boleh kosong
CallEmpReelTask_createTaskTip4=Titik awal tidak boleh kosong
CallEmpReelTask_createTaskTip5=Poin selanjutnya tidak boleh kosong
CallEmpReelTask_forceFinish=Nomor tugas antarmuka pembatalan tugas CallEmpReelTask kosong!
CallEmpReelTask_forceCancel=Nomor tugas antarmuka pembatalan tugas CallEmpReelTask kosong!
CallEmpReelTask_update1=Nomor tugas antarmuka pembaruan tugas CallEmpReelTask kosong
CallEmpReelTask_update2=Tugas CallEmpReelTask telah dijalankan dan tidak dapat dibatalkan

View File

@@ -0,0 +1,9 @@
CallEmpReelTask_createTaskTip1=请求参数不能为空
CallEmpReelTask_createTaskTip2=业务类型不能为空
CallEmpReelTask_createTaskTip3=载具号不能为空
CallEmpReelTask_createTaskTip4=起点不能为空
CallEmpReelTask_createTaskTip5=下一点不能为空
CallEmpReelTask_forceFinish=CallEmpReelTask任务取消接口任务号为空!
CallEmpReelTask_forceCancel=CallEmpReelTask任务取消接口任务号为空!
CallEmpReelTask_update1=CallEmpReelTask任务更新接口任务号为空
CallEmpReelTask_update2=CallEmpReelTask任务已执行不能取消

View File

@@ -0,0 +1,3 @@
common_configTip=找不到配置文件,请确认[{0}]配置是否存在!
common_maxTaskTip={0}该点位申请的任务未完成数已超过上限,无法申请任务!
common_taskCreatedTip=点位[{0}]已经创建过任务

View File

@@ -0,0 +1,3 @@
common_configTip=The configuration file cannot be found, please confirm whether the [{0}] configuration exists!
common_maxTaskTip={0}The number of unfinished tasks applied for at this point has exceeded the upper limit, and the task cannot be applied!
common_taskCreatedTip=Point[{0}] has already created a task

View File

@@ -0,0 +1,3 @@
common_configTip=File konfigurasi tidak dapat ditemukan, harap konfirmasi apakah konfigurasi [{0}] ada!
common_maxTaskTip={0}Jumlah tugas yang belum selesai yang diajukan pada saat ini telah melampaui batas atas, dan tugas tersebut tidak dapat diterapkan!
common_taskCreatedTip=Point[{0}] telah membuat tugas

View File

@@ -0,0 +1,3 @@
common_configTip=File konfigurasi tidak dapat ditemukan, harap konfirmasi apakah konfigurasi [{0}] ada!
common_maxTaskTip={0}Jumlah tugas yang belum selesai yang diajukan pada saat ini telah melampaui batas atas, dan tugas tersebut tidak dapat diterapkan!
common_taskCreatedTip=Point[{0}] telah membuat tugas

View File

@@ -0,0 +1,3 @@
common_configTip=找不到配置文件,请确认[{0}]配置是否存在!
common_maxTaskTip={0}该点位申请的任务未完成数已超过上限,无法申请任务!
common_taskCreatedTip=点位[{0}]已经创建过任务

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<included>
<springProperty scope="context" name="logPath" source="logging.file.path" defaultValue="logs"/>
<property name="LOG_HOME" value="${logPath}"/>
<!--<define name="DEVICECODE" class="org.nl.common.logging.DeviceCodeDir"/>-->
<!-- 按照每天生成日志文件 -->
<appender name="FILE_XGAGV" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/XgAgvDeviceDriver/${DEVICECODE}/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
<!--单个日志最大容量 至少10MB才能看得出来-->
<maxFileSize>200MB</maxFileSize>
<!--所有日志最多占多大容量-->
<totalSizeCap>2GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>${log.charset}</charset>
</encoder>
</appender>
<!-- <logger name="org.nl.start.Init" level="info" additivity="false">
<appender-ref ref="FILE3"/>
</logger>-->
<!-- 打印sql -->
<logger name="org.nl.system.service.lucene.impl.LuceneExecuteLogServiceImpl" level="info" additivity="false">
<appender-ref ref="FILE_XGAGV"/>
</logger>
</included>

View File

@@ -0,0 +1,4 @@
# If you use SLF4J. First, you need to tell log4jdbc-log4j2 that you want to use the SLF4J logger
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.auto.load.popular.drivers=false
log4jdbc.drivers=com.mysql.cj.jdbc.Driver

View File

@@ -0,0 +1,219 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--配置说明:
https://www.cnblogs.com/jybky/p/12204586.html
https://blog.csdn.net/wzygis/article/details/103189490
https://www.cnblogs.com/xrq730/p/8628945.html
https://www.jianshu.com/p/af5a7bab0e59
https://blog.csdn.net/wzygis/article/details/103189490
https://juejin.cn/post/6844903775631572999
-->
<configuration scan="true" scanPeriod="30 seconds" debug="false">
<contextName>nlAdmin</contextName>
<property name="log.charset" value="utf-8"/>
<property name="log.pattern"
value="%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %cyan(%msg%n)"/>
<springProperty scope="context" name="logPath" source="logging.file.path" defaultValue="logs"/>
<property name="LOG_HOME" value="${logPath}"/>
<!--引入默认的一些设置-->
<!--<include resource="log/XrToMes.xml"/>
<include resource="log/MesToErp.xml"/>-->
<include resource="log/XgAgvDeviceDriver.xml"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--withJansi 参数改为true-->
<withJansi>true</withJansi>
<encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
<pattern>${log.pattern}</pattern>
<!-- <charset>${log.charset}</charset>-->
</encoder>
</appender>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="${logPath}"/>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件保留天数-->
<maxHistory>30</maxHistory>
<!--单个日志最大容量 至少10MB才能看得出来-->
<maxFileSize>120MB</maxFileSize>
<!--所有日志最多占多大容量-->
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<appender name="luceneAppender" class="org.nl.config.lucene.LuceneAppender" >
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="asyncLuceneAppender" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="luceneAppender" />
<!-- 设置队列大小 -->
<queueSize>512</queueSize>
</appender>
<!--异步到文件-->
<appender name="asyncFileAppender" class="com.yomahub.tlog.core.enhance.logback.async.AspectLogbackAsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>500</queueSize>
<appender-ref ref="FILE"/>
</appender>
<!--开发环境:打印控制台-->
<springProfile name="dev">
<root level="debug">
<appender-ref ref="asyncLuceneAppender"/>
<appender-ref ref="CONSOLE"/>
</root>
<logger name="com.baomidou.mybatisplus.core.MybatisConfiguration" level="ERROR" additivity="false">
<appender-ref ref="asyncLuceneAppender"/>
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="org.redisson.command.RedisExecutor" level="ERROR" additivity="false">
<appender-ref ref="asyncLuceneAppender"/>
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="org.reflections.Reflections" level="ERROR" additivity="false">
<appender-ref ref="asyncLuceneAppender"/>
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="org.redisson.connection.ClientConnectionsEntry" level="ERROR" additivity="false">
<appender-ref ref="asyncLuceneAppender"/>
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="org.mybatis.spring.mapper.ClassPathMapperScanner" level="ERROR" additivity="false">
<appender-ref ref="asyncLuceneAppender"/>
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="org.springframework" level="ERROR" additivity="true">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="com.baomidou.dynamic.datasource.DynamicRoutingDataSource" level="INFO" additivity="true">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="org.redisson.connection.pool.MasterPubSubConnectionPool" level="INFO" additivity="true">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="org.redisson.connection.pool.MasterConnectionPool" level="INFO" additivity="true">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="org.redisson.Version" level="INFO" additivity="true">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="com.alibaba.druid.pool.DruidDataSource" level="INFO" additivity="true">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="org.nl.config.RedisConfig" level="INFO" additivity="true">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="org.apache" level="ERROR" additivity="true">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="org.hibernate" level="ERROR" additivity="true">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="io.netty" level="ERROR" additivity="true">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="jdbc" level="ERROR" additivity="true">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="io.lettuce" level="ERROR" additivity="true">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="com.fasterxml" level="ERROR" additivity="true">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="org.quartz" level="ERROR" additivity="true">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="com.google" level="ERROR" additivity="true">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="springfox" level="ERROR" additivity="true">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="log4jdbc" level="ERROR" additivity="true">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="nl.basjes" level="ERROR" additivity="true">
<appender-ref ref="CONSOLE"/>
</logger>
</springProfile>
<!--生产环境:打印控制台和输出到文件-->
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="asyncFileAppender"/>
<appender-ref ref="asyncLuceneAppender"/>
</root>
<logger name="org.springframework" level="ERROR" additivity="false">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="org.apache" level="ERROR" additivity="false">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="org.hibernate" level="ERROR" additivity="false">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="io.netty" level="ERROR" additivity="false">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="jdbc" level="ERROR" additivity="false">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="io.lettuce" level="ERROR" additivity="false">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="com.fasterxml" level="ERROR" additivity="false">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="org.quartz" level="ERROR" additivity="false">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="com.google" level="ERROR" additivity="false">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="springfox" level="ERROR" additivity="false">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="log4jdbc" level="ERROR" additivity="false">
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="nl.basjes" level="ERROR" additivity="false">
<appender-ref ref="asyncFileAppender"/>
</logger>
</springProfile>
<!--测试环境:打印控制台-->
<springProfile name="test">
<root level="INFO">
<appender-ref ref="asyncFileAppender"/>
</root>
<logger name="jdbc.audit" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="jdbc.resultset" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="springfox.documentation" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="jdbc.resultsettable" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="jdbc.sqlonly" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
</springProfile>
</configuration>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
/*! layer mobile-v2.0.0 Web弹层组件 MIT License http://layer.layui.com/mobile By 贤心 */
;!function(e){"use strict";var t=document,n="querySelectorAll",i="getElementsByClassName",a=function(e){return t[n](e)},s={type:0,shade:!0,shadeClose:!0,fixed:!0,anim:"scale"},l={extend:function(e){var t=JSON.parse(JSON.stringify(s));for(var n in e)t[n]=e[n];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener("click",function(e){t.call(this,e)},!1)};var r=0,o=["layui-m-layer"],c=function(e){var t=this;t.config=l.extend(e),t.view()};c.prototype.view=function(){var e=this,n=e.config,s=t.createElement("div");e.id=s.id=o[0]+r,s.setAttribute("class",o[0]+" "+o[0]+(n.type||0)),s.setAttribute("index",r);var l=function(){var e="object"==typeof n.title;return n.title?'<h3 style="'+(e?n.title[1]:"")+'">'+(e?n.title[0]:n.title)+"</h3>":""}(),c=function(){"string"==typeof n.btn&&(n.btn=[n.btn]);var e,t=(n.btn||[]).length;return 0!==t&&n.btn?(e='<span yes type="1">'+n.btn[0]+"</span>",2===t&&(e='<span no type="0">'+n.btn[1]+"</span>"+e),'<div class="layui-m-layerbtn">'+e+"</div>"):""}();if(n.fixed||(n.top=n.hasOwnProperty("top")?n.top:100,n.style=n.style||"",n.style+=" top:"+(t.body.scrollTop+n.top)+"px"),2===n.type&&(n.content='<i></i><i class="layui-m-layerload"></i><i></i><p>'+(n.content||"")+"</p>"),n.skin&&(n.anim="up"),"msg"===n.skin&&(n.shade=!1),s.innerHTML=(n.shade?"<div "+("string"==typeof n.shade?'style="'+n.shade+'"':"")+' class="layui-m-layershade"></div>':"")+'<div class="layui-m-layermain" '+(n.fixed?"":'style="position:static;"')+'><div class="layui-m-layersection"><div class="layui-m-layerchild '+(n.skin?"layui-m-layer-"+n.skin+" ":"")+(n.className?n.className:"")+" "+(n.anim?"layui-m-anim-"+n.anim:"")+'" '+(n.style?'style="'+n.style+'"':"")+">"+l+'<div class="layui-m-layercont">'+n.content+"</div>"+c+"</div></div></div>",!n.type||2===n.type){var d=t[i](o[0]+n.type),y=d.length;y>=1&&layer.close(d[0].getAttribute("index"))}document.body.appendChild(s);var u=e.elem=a("#"+e.id)[0];n.success&&n.success(u),e.index=r++,e.action(n,u)},c.prototype.action=function(e,t){var n=this;e.time&&(l.timer[n.index]=setTimeout(function(){layer.close(n.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),layer.close(n.index)):e.yes?e.yes(n.index):layer.close(n.index)};if(e.btn)for(var s=t[i]("layui-m-layerbtn")[0].children,r=s.length,o=0;o<r;o++)l.touch(s[o],a);if(e.shade&&e.shadeClose){var c=t[i]("layui-m-layershade")[0];l.touch(c,function(){layer.close(n.index,e.end)})}e.end&&(l.end[n.index]=e.end)},e.layer={v:"2.0",index:r,open:function(e){var t=new c(e||{});return t.index},close:function(e){var n=a("#"+o[0]+e)[0];n&&(n.innerHTML="",t.body.removeChild(n),clearTimeout(l.timer[e]),delete l.timer[e],"function"==typeof l.end[e]&&l.end[e](),delete l.end[e])},closeAll:function(){for(var e=t[i](o[0]),n=0,a=e.length;n<a;n++)layer.close(0|e[0].getAttribute("index"))}},"function"==typeof define?define(function(){return layer}):function(){var e=document.scripts,n=e[e.length-1],i=n.src,a=i.substring(0,i.lastIndexOf("/")+1);n.getAttribute("merge")||document.head.appendChild(function(){var e=t.createElement("link");return e.href=a+"need/layer.css?2.0",e.type="text/css",e.rel="styleSheet",e.id="layermcss",e}())}()}(window);

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1,59 @@
*{margin: 0; padding: 0;}
body{font-family: Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif;}
::-webkit-input-placeholder{color: #ccc;}
/* 视图盒子 */
.view-box{position: relative; width: 100vw; height: 100vh; overflow: hidden;}
/* 背景 EAEFF3 */
.bg-1{height: 50%; background: linear-gradient(to bottom right, #0466c5, #3496F5);}
.bg-2{height: 50%; background-color: #EAEFF3;}
/* 渐变背景 */
/*.bg-1{
background-size: 500%;
background-image: linear-gradient(125deg,#0466c5,#3496F5,#0466c5,#3496F5,#0466c5,#2496F5);
animation: bganimation 30s infinite;
}
@keyframes bganimation{
0%{background-position: 0% 50%;}
50%{background-position: 100% 50%;}
100%{background-position: 0% 50%;}
} */
/* 背景 */
.bg-1{background: #101C34;}
.bg-2{background: #101C34;}
/* .bg-1{height: 100%; background-image: url(./login-bg.png); background-size: 100% 100%;} */
/* 内容盒子 */
.content-box{position: absolute; width: 100vw; height: 100vh; top: 0px;}
/* 登录盒子 */
/* .login-box{width: 400px; height: 400px; position: absolute; left: calc(50% - 200px); top: calc(50% - 200px); max-width: 90%; } */
.login-box{width: 400px; margin: auto; max-width: 90%; height: 100%;}
.login-box{display: flex; align-items: center; text-align: center;}
/* 表单 */
.from-box{flex: 1; padding: 20px 50px; background-color: #FFF;}
.from-box{border-radius: 1px; box-shadow: 1px 1px 20px #666;}
.from-title{margin-top: 20px; margin-bottom: 30px; text-align: center;}
/* 输入框 */
.from-item{border: 0px #000 solid; margin-bottom: 15px;}
.s-input{width: 100%; line-height: 32px; height: 32px; text-indent: 1em; outline: 0; border: 1px #ccc solid; border-radius: 3px; transition: all 0.2s;}
.s-input{font-size: 12px;}
.s-input:focus{border-color: #409eff}
/* 登录按钮 */
.s-btn{ text-indent: 0; cursor: pointer; background-color: #409EFF; border-color: #409EFF; color: #FFF;}
.s-btn:hover{background-color: #50aEFF;}
/* 重置按钮 */
.reset-box{text-align: left; font-size: 12px;}
.reset-box a{text-decoration: none;}
.reset-box a:hover{text-decoration: underline;}
/* loading框样式 */
.ajax-layer-load.layui-layer-dialog{min-width: 0px !important; background-color: rgba(0,0,0,0.85);}
.ajax-layer-load.layui-layer-dialog .layui-layer-content{padding: 10px 20px 10px 40px; color: #FFF;}
.ajax-layer-load.layui-layer-dialog .layui-layer-content .layui-layer-ico{width: 20px; height: 20px; background-size: 20px 20px; top: 12px; }

View File

@@ -0,0 +1,65 @@
// sa
var sa = {};
// 打开loading
sa.loading = function(msg) {
layer.closeAll(); // 开始前先把所有弹窗关了
return layer.msg(msg, {icon: 16, shade: 0.3, time: 1000 * 20, skin: 'ajax-layer-load' });
};
// 隐藏loading
sa.hideLoading = function() {
layer.closeAll();
};
// ----------------------------------- 登录事件 -----------------------------------
$('.login-btn').click(function(){
sa.loading("正在登录...");
// 开始登录
setTimeout(function() {
$.ajax({
url: "sso/doLogin",
type: "post",
data: {
name: $('[name=name]').val(),
pwd: $('[name=pwd]').val()
},
dataType: 'json',
success: function(res){
console.log('返回数据:', res);
sa.hideLoading();
if(res.code == 200) {
layer.msg('登录成功', {anim: 0, icon: 6 });
setTimeout(function() {
location.reload();
}, 800)
} else {
layer.msg(res.msg, {anim: 6, icon: 2 });
}
},
error: function(xhr, type, errorThrown){
sa.hideLoading();
if(xhr.status == 0){
return layer.alert('无法连接到服务器,请检查网络');
}
return layer.alert("异常:" + JSON.stringify(xhr));
}
});
}, 400);
});
// 绑定回车事件
$('[name=name],[name=pwd]').bind('keypress', function(event){
if(event.keyCode == "13") {
$('.login-btn').click();
}
});
// 输入框获取焦点
$("[name=name]").focus();
// 打印信息
var str = "This page is provided by Sa-Token, Please refer to: " + "https://sa-token.cc/";
console.log(str);

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,48 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<style>
@page {
margin: 0;
}
</style>
</head>
<body style="margin: 0px;
padding: 0px;
font: 100% SimSun, Microsoft YaHei, Times New Roman, Verdana, Arial, Helvetica, sans-serif;
color: #000;">
<div style="height: auto;
width: 820px;
min-width: 820px;
margin: 0 auto;
margin-top: 20px;
border: 1px solid #eee;">
<div style="padding: 10px;padding-bottom: 0px;">
<p style="margin-bottom: 10px;padding-bottom: 0px;">尊敬的用户,您好:</p>
<p style="text-indent: 2em; margin-bottom: 10px;">您正在申请邮箱验证,您的验证码为:</p>
<p style="text-align: center;
font-family: Times New Roman;
font-size: 22px;
color: #C60024;
padding: 20px 0px;
margin-bottom: 10px;
font-weight: bold;
background: #ebebeb;">${code}</p>
<div class="foot-hr hr" style="margin: 0 auto;
z-index: 111;
width: 800px;
margin-top: 30px;
border-top: 1px solid #DA251D;">
</div>
<div style="text-align: center;
font-size: 12px;
padding: 20px 0px;
font-family: Microsoft YaHei;">
Copyright &copy;${.now?string("yyyy")} <a hover="color: #DA251D;" style="color: #999;" href="https://github.com/elunez/eladmin" target="_blank">EL-ADMIN</a> 后台管理系统 All Rights Reserved.
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,69 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<style>
@page {
margin: 0;
}
</style>
</head>
<body style="margin: 0px;
padding: 0px;
font: 100% SimSun, Microsoft YaHei, Times New Roman, Verdana, Arial, Helvetica, sans-serif;
color: #000;">
<div style="height: auto;
margin: 0 auto;
margin-top: 20px;
padding: 20px;
border: 1px solid #eee;">
<div>
<p style="margin-bottom: 10px;">任务信息:</p>
<table style="border-collapse: collapse;">
<tr>
<th style="padding: .65em;background: #666;border: 1px solid #777;color: #fff;">任务名称</th>
<th style="padding: .65em;background: #666;border: 1px solid #777;color: #fff;">Bean名称</th>
<th style="padding: .65em;background: #666;border: 1px solid #777;color: #fff;">执行方法</th>
<th style="padding: .65em;background: #666;border: 1px solid #777;color: #fff;">参数内容</th>
<th style="padding: .65em;background: #666;border: 1px solid #777;color: #fff;">Cron表达式</th>
<th style="padding: .65em;background: #666;border: 1px solid #777;color: #fff;">描述内容</th>
</tr>
<tr>
<td style="padding: .65em;border: 1px solid#777;">${task.jobName}</td>
<td style="padding: .65em;border: 1px solid#777;">${task.beanName}</td>
<td style="padding: .65em;border: 1px solid#777;">${task.methodName}</td>
<td style="padding: .65em;border: 1px solid#777;">${(task.params)!""}</td>
<td style="padding: .65em;border: 1px solid#777;">${task.cronExpression}</td>
<td style="padding: .65em;border: 1px solid#777;">${(task.description)!""}</td>
</tr>
</table>
</div>
<div>
<p style="margin-bottom: 10px;">异常信息:</p>
<pre style="position: relative;
padding: 15px;
line-height: 20px;
border-left: 5px solid #ddd;
color: #333;
font-family: Courier New, serif;
font-size: 12px">
${msg}
</pre>
</div>
<div class="foot-hr hr" style="margin: 0 auto;
z-index: 111;
width: 800px;
margin-top: 30px;
border-top: 1px solid #DA251D;">
</div>
<div style="text-align: center;
font-size: 12px;
padding: 20px 0px;
font-family: Microsoft YaHei;">
Copyright &copy;${.now?string("yyyy")} <a hover="color: #DA251D;" style="color: #999;" href="https://github.com/elunez/eladmin" target="_blank">EL-ADMIN</a> 后台管理系统 All Rights Reserved.
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,59 @@
package ${package}.controller;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.base.TableDataInfo;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.logging.annotation.Log;
import ${package}.service.I${className}Service;
import ${package}.service.dao.${className};
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
import java.util.Set;
/**
* @author ${author}
* @date ${date}
**/
@Slf4j
@RestController
@RequestMapping("/api/${changeClassName}")
public class ${className}Controller {
@Autowired
private I${className}Service ${changeClassName}Service;
@GetMapping
@Log("查询${apiAlias}")
//@SaCheckPermission("${changeClassName}:list")
public ResponseEntity<Object> query(@RequestParam Map whereJson, PageQuery page){
return new ResponseEntity<>(TableDataInfo.build(${changeClassName}Service.queryAll(whereJson,page)),HttpStatus.OK);
}
@PostMapping
@Log("新增${apiAlias}")
//@SaCheckPermission("${changeClassName}:add")
public ResponseEntity<Object> create(@Validated @RequestBody ${className} entity){
${changeClassName}Service.create(entity);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@PutMapping
@Log("修改${apiAlias}")
//@SaCheckPermission("${changeClassName}:edit")
public ResponseEntity<Object> update(@Validated @RequestBody ${className} entity){
${changeClassName}Service.update(entity);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@Log("删除${apiAlias}")
//@SaCheckPermission("${changeClassName}:del")
@DeleteMapping
public ResponseEntity<Object> delete(@RequestBody Set<String> ids) {
${changeClassName}Service.deleteAll(ids);
return new ResponseEntity<>(HttpStatus.OK);
}
}

View File

@@ -0,0 +1,36 @@
package ${package}.service.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
<#if hasTimestamp>
import java.sql.Timestamp;
</#if>
<#if hasBigDecimal>
import java.math.BigDecimal;
</#if>
import lombok.Data;
import java.io.Serializable;
/**
* @description /
* @author ${author}
* @date ${date}
**/
@Data
public class ${className}Dto implements Serializable {
<#if columns??>
<#list columns as column>
<#if column.remark?has_content>
/** ${column.remark} */
</#if>
<#if column.columnKey = 'PRI'>
<#if !auto && pkColumnType = 'Long'>
/** 防止精度丢失 */
@JsonSerialize(using= ToStringSerializer.class)
</#if>
</#if>
private ${column.columnType} ${column.changeColumnName};
</#list>
</#if>
}

View File

@@ -0,0 +1,46 @@
package ${package}.service.dao;
<#if hasPk>
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
</#if>
import lombok.Data;
import lombok.EqualsAndHashCode;
<#if hasTimestamp>
import java.sql.Timestamp;
</#if>
<#if hasBigDecimal>
import java.math.BigDecimal;
</#if>
import java.io.Serializable;
/**
* @description /
* @author ${author}
* @date ${date}
**/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("${tableName}")
public class ${className} implements Serializable {
private static final long serialVersionUID = 1L;
<#if columns??>
<#list columns as column>
<#if column.columnKey = 'PRI'>
@TableId(value = "${column.columnName}", type = <#if auto>IdType.AUTO<#else>IdType.NONE</#if>)
</#if>
<#if column.remark?has_content>
/** ${column.remark} */
<#else>
/** ${column.changeColumnName} */
</#if>
private ${column.columnType} ${column.changeColumnName};
</#list>
</#if>
}

View File

@@ -0,0 +1,12 @@
package ${package}.service.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import ${package}.service.dao.${className};
/**
* @author ${author}
* @date ${date}
**/
public interface ${className}Mapper extends BaseMapper<${className}> {
}

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="${package}.service.dao.mapper.${className}Mapper">
</mapper>

View File

@@ -0,0 +1,12 @@
package ${package}.service.dto;
import org.nl.common.domain.query.BaseQuery;
import ${package}.service.dao.${className};
/**
* @author ${author}
* @date ${date}
**/
public class ${className}Query extends BaseQuery<${className}> {
}

View File

@@ -0,0 +1,25 @@
package ${package}.repository;
import ${package}.domain.${className};
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
/**
* @author ${author}
* @date ${date}
**/
public interface ${className}Repository extends JpaRepository<${className}, ${pkColumnType}>, JpaSpecificationExecutor<${className}> {
<#if columns??>
<#list columns as column>
<#if column.columnKey = 'UNI'>
/**
* 根据 ${column.capitalColumnName} 查询
* @param ${column.columnName} /
* @return /
*/
${className} findBy${column.capitalColumnName}(${column.columnType} ${column.columnName});
</#if>
</#list>
</#if>
}

View File

@@ -0,0 +1,43 @@
package ${package}.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.nl.common.domain.query.PageQuery;
import com.baomidou.mybatisplus.extension.service.IService;
import ${package}.service.dao.${className};
import java.util.Map;
import java.util.Set;
/**
* @description 服务接口
* @author ${author}
* @date ${date}
**/
public interface I${className}Service extends IService<${className}> {
/**
* 查询数据分页
* @param whereJson 条件
* @param pageable 分页参数
* @return IPage<${className}>
*/
IPage<${className}> queryAll(Map whereJson, PageQuery pageable);
/**
* 创建
* @param entity /
*/
void create(${className} entity);
/**
* 编辑
* @param entity /
*/
void update(${className} entity);
/**
* 多选删除
* @param ids /
*/
void deleteAll(Set<String> ids);
}

View File

@@ -0,0 +1,81 @@
package ${package}.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.config.language.LangProcess;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.SecurityUtils;
import ${package}.service.I${className}Service;
import ${package}.service.dao.mapper.${className}Mapper;
import ${package}.service.dao.${className};
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.Set;
/**
* @description 服务实现
* @author ${author}
* @date ${date}
**/
@Slf4j
@Service
public class ${className}ServiceImpl extends ServiceImpl<${className}Mapper, ${className}> implements I${className}Service {
@Autowired
private ${className}Mapper ${changeClassName}Mapper;
@Override
public IPage<${className}> queryAll(Map whereJson, PageQuery page){
LambdaQueryWrapper<${className}> lam = new LambdaQueryWrapper<>();
IPage<${className}> pages = new Page<>(page.getPage() + 1, page.getSize());
${changeClassName}Mapper.selectPage(pages, lam);
return pages;
}
@Override
public void create(${className} entity) {
String currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
String now = DateUtil.now();
entity.set${pkChangeColName ? cap_first }(IdUtil.getSnowflake(1, 1).nextIdStr());
entity.setCreate_id(currentUserId);
entity.setCreate_name(nickName);
entity.setCreate_time(now);
entity.setUpdate_id(currentUserId);
entity.setUpdate_name(nickName);
entity.setUpdate_time(now);
${changeClassName}Mapper.insert(entity);
}
@Override
public void update(${className} entity) {
${className} dto = ${changeClassName}Mapper.selectById(entity.get${pkChangeColName ? cap_first }());
if (dto == null) throw new BadRequestException(LangProcess.msg("error_SystemAuthError"));
String currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
String now = DateUtil.now();
entity.setUpdate_id(currentUserId);
entity.setUpdate_name(nickName);
entity.setUpdate_time(now);
${changeClassName}Mapper.updateById(entity);
}
@Override
public void deleteAll(Set<String> ids) {
// 真删除
${changeClassName}Mapper.deleteBatchIds(ids);
}
}

View File

@@ -0,0 +1,27 @@
import request from '@/utils/request'
export function add(data) {
return request({
url: 'api/${changeClassName}',
method: 'post',
data
})
}
export function del(ids) {
return request({
url: 'api/${changeClassName}/',
method: 'delete',
data: ids
})
}
export function edit(data) {
return request({
url: 'api/${changeClassName}',
method: 'put',
data
})
}
export default { add, edit, del }

View File

@@ -0,0 +1,184 @@
<#--noinspection ALL-->
<template>
<div class="app-container">
<!--工具栏-->
<div class="head-container">
<#if hasQuery>
<div v-if="crud.props.searchToggle">
<!-- 搜索 -->
<#if queryColumns??>
<#list queryColumns as column>
<#if column.queryType != 'BetWeen'>
<label class="el-form-item-label"><#if column.remark?has_content>${column.remark}<#else>${column.changeColumnName}</#if></label>
<el-input v-model="query.${column.changeColumnName}" clearable placeholder="<#if column.remark?has_content>${column.remark}<#else>${column.changeColumnName}</#if>" style="width: 185px;" class="filter-item" @keyup.enter.native="crud.toQuery" />
</#if>
</#list>
</#if>
<#if betweens??>
<#list betweens as column>
<#if column.queryType = 'BetWeen'>
<date-range-picker
v-model="query.${column.changeColumnName}"
start-placeholder="${column.changeColumnName}Start"
end-placeholder="${column.changeColumnName}Start"
class="date-item"
/>
</#if>
</#list>
</#if>
<rrOperation :crud="crud" />
</div>
</#if>
<!--如果想在工具栏加入更多按钮,可以使用插槽方式, slot = 'left' or 'right'-->
<crudOperation :permission="permission" />
<!--表单组件-->
<el-dialog :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title" width="500px">
<el-form ref="form" :model="form" <#if isNotNullColumns??>:rules="rules"</#if> size="mini" label-width="80px">
<#if columns??>
<#list columns as column>
<#if column.formShow>
<el-form-item label="<#if column.remark?has_content>${column.remark}<#else>${column.changeColumnName}</#if>"<#if column.istNotNull> prop="${column.changeColumnName}"</#if>>
<#if column.formType = 'Input'>
<el-input v-model="form.${column.changeColumnName}" style="width: 370px;" />
<#elseif column.formType = 'Textarea'>
<el-input v-model="form.${column.changeColumnName}" :rows="3" type="textarea" style="width: 370px;" />
<#elseif column.formType = 'Radio'>
<#if (column.dictName)?? && (column.dictName)!="">
<el-radio v-model="form.${column.changeColumnName}" v-for="item in dict.${column.dictName}" :key="item.id" :label="item.value">{{ item.label }}</el-radio>
<#else>
未设置字典,请手动设置 Radio
</#if>
<#elseif column.formType = 'Select'>
<#if (column.dictName)?? && (column.dictName)!="">
<el-select v-model="form.${column.changeColumnName}" filterable placeholder="请选择">
<el-option
v-for="item in dict.${column.dictName}"
:key="item.id"
:label="item.label"
:value="item.value" />
</el-select>
<#else>
未设置字典,请手动设置 Select
</#if>
<#else>
<el-date-picker v-model="form.${column.changeColumnName}" type="datetime" style="width: 370px;" />
</#if>
</el-form-item>
</#if>
</#list>
</#if>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="crud.cancelCU">取消</el-button>
<el-button :loading="crud.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
</div>
</el-dialog>
<!--表格渲染-->
<el-table ref="table" v-loading="crud.loading" :data="crud.data" size="mini" style="width: 100%;" @selection-change="crud.selectionChangeHandler">
<el-table-column type="selection" width="55" />
<#if columns??>
<#list columns as column>
<#if column.columnShow>
<#if (column.dictName)?? && (column.dictName)!="">
<el-table-column prop="${column.changeColumnName}" label="<#if column.remark?has_content>${column.remark}<#else>${column.changeColumnName}</#if>" :min-width="flexWidth('${column.changeColumnName}',crud.data,'<#if column.remark?has_content>${column.remark}<#else>${column.changeColumnName}</#if>')">
<template slot-scope="scope">
{{ dict.label.${column.dictName}[scope.row.${column.changeColumnName}] }}
</template>
</el-table-column>
<#elseif column.columnType != 'Date'>
<el-table-column prop="${column.changeColumnName}" label="<#if column.remark?has_content>${column.remark}<#else>${column.changeColumnName}</#if>" :min-width="flexWidth('${column.changeColumnName}',crud.data,'<#if column.remark?has_content>${column.remark}<#else>${column.changeColumnName}</#if>')"/>
<#else>
<el-table-column prop="${column.changeColumnName}" label="<#if column.remark?has_content>${column.remark}<#else>${column.changeColumnName}</#if>" :min-width="flexWidth('${column.changeColumnName}',crud.data,'<#if column.remark?has_content>${column.remark}<#else>${column.changeColumnName}</#if>')">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.${column.changeColumnName}) }}</span>
</template>
</el-table-column>
</#if>
</#if>
</#list>
</#if>
<el-table-column v-permission="[]" label="操作" width="120px" align="center" fixed="right">
<template slot-scope="scope">
<udOperation
:data="scope.row"
:permission="permission"
/>
</template>
</el-table-column>
</el-table>
<!--分页组件-->
<pagination />
</div>
</div>
</template>
<script>
import crud${className} from './${changeClassName}'
import CRUD, {crud, form, header, presenter} from '@crud/crud'
import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation'
import udOperation from '@crud/UD.operation'
import pagination from '@crud/Pagination'
const defaultForm = {
<#if columns??>
<#list columns as column>
${column.changeColumnName}: null<#if column_has_next>,</#if>
</#list>
</#if>
}
export default {
name: '${className}',
components: { pagination, crudOperation, rrOperation, udOperation },
mixins: [presenter(), header(), form(defaultForm), crud()],
<#if hasDict>
dicts: [<#if hasDict??><#list dicts as dict>'${dict}'<#if dict_has_next>, </#if></#list></#if>],
</#if>
cruds() {
return CRUD({
title: '${apiAlias}',
url: 'api/${changeClassName}',
idField: '${pkChangeColName}',
sort: '${pkChangeColName},desc',
crudMethod: { ...crud${className} }
})
},
data() {
return {
permission: {
},
rules: {
<#if isNotNullColumns??>
<#list isNotNullColumns as column>
<#if column.istNotNull>
${column.changeColumnName}: [
{ required: true, message: '<#if column.remark?has_content>${column.remark}</#if>不能为空', trigger: 'blur' }
]<#if column_has_next>,</#if>
</#if>
</#list>
</#if>
}<#if hasQuery>,
queryTypeOptions: [
<#if queryColumns??>
<#list queryColumns as column>
<#if column.queryType != 'BetWeen'>
{ key: '${column.changeColumnName}', display_name: '<#if column.remark?has_content>${column.remark}<#else>${column.changeColumnName}</#if>' }<#if column_has_next>,</#if>
</#if>
</#list>
</#if>
]
</#if>
}
},
methods: {
// 钩子在获取表格数据之前执行false 则代表不获取数据
[CRUD.HOOK.beforeRefresh]() {
return true
}
}
}
</script>
<style scoped>
</style>

View File

@@ -0,0 +1,45 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<title>Sa-SSO-Server 认证中心-登录</title>
<meta charset="utf-8">
<base th:href="@{/}" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
<link rel="stylesheet" href="./sa-res/login.css">
</head>
<body>
<div class="view-box">
<div class="bg-1"></div>
<div class="bg-2"></div>
<div class="content-box">
<div class="login-box">
<div class="from-box">
<h2 class="from-title">Sa-SSO-Server 认证中心</h2>
<div class="from-item">
<input class="s-input" name="name" placeholder="请输入账号" />
</div>
<div class="from-item">
<input class="s-input" name="pwd" type="password" placeholder="请输入密码" />
</div>
<div class="from-item">
<button class="s-input s-btn login-btn">登录</button>
</div>
<div class="from-item reset-box">
<a href="javascript: location.reload();" >刷新</a>
</div>
</div>
</div>
</div>
<!-- 底部 版权 -->
<div style="position: absolute; bottom: 40px; width: 100%; text-align: center; color: #666;">
This page is provided by Sa-Token-SSO
</div>
</div>
<!-- scripts -->
<script src="./sa-res/jquery.min.js"></script>
<script src="./sa-res/layer/layer.js"></script>
<script src="./sa-res/login.js"></script>
</body>
</html>