统一修改ruoyi->bms

This commit is contained in:
caojia
2026-09-28 10:02:38 +08:00
parent 341afc4111
commit 0408b6c35e
639 changed files with 2776 additions and 2807 deletions
@@ -0,0 +1 @@
restart.include.json=/com.alibaba.fastjson2.*.jar
@@ -0,0 +1,80 @@
# 本地配置(默认生效)
# 启动:不传 profile,或 --spring.profiles.active=local
# Elasticsearch:本机 Docker http://127.0.0.1:9200
# 数据源暂与线上相同,换本地库时只改本文件
bms:
elasticsearch:
enabled: true
uris: http://127.0.0.1:9200
username:
password:
index: bms_biz_log
# 数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 主库数据源
master:
url: jdbc:mysql://47.106.220.100:3307/bms?useUnicode=true&characterEncoding=utf8&connectionCollation=utf8mb4_unicode_ci&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
username: bms
password: D3wsHf2ZMfFtWtKX
connectionInitSqls: SET NAMES utf8mb4
# Slave DS: Oracle upstream order (TAB_ORDER)
slave:
enabled: true
driverClassName: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@//120.79.189.203:15281/WSDB
username: readonly_report
password: k5x15WP1hE
# Oracle remote query may need longer read timeout than MySQL
connectTimeout: 30000
socketTimeout: 120000
validationQuery: SELECT 1 FROM DUAL
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置连接超时时间
connectTimeout: 30000
# 配置网络超时时间
socketTimeout: 60000
# 配置间隔多久检测一次空闲连接,避免远程数据库断开后连接池继续复用失效连接,单位是毫秒
timeBetweenEvictionRunsMillis: 30000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
# 异步账单任务借用连接时校验连接有效性,避免拿到已被数据库断开的连接
testOnBorrow: true
testOnReturn: false
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: bms
login-password: 123456
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
@@ -0,0 +1,90 @@
# 线上配置
# 启动:--spring.profiles.active=prod
# Elasticsearch:172.19.64.13:9200
# 生产环境文件存储根目录
# 上传、导入、头像及账单下载文件都会基于此目录保存
bms:
profile: /www/server/bms/data
elasticsearch:
enabled: true
uris: https://127.0.0.1:9200
username: elastic
password: d4aoZYB2yQHXmWZiH6Gw
index: bms_biz_log
logging:
level:
com.bms: info
org.springframework: warn
# 数据源配置
spring:
devtools:
restart:
enabled: false
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 主库数据源
master:
url: jdbc:mysql://127.0.0.1:3306/bms?useUnicode=true&characterEncoding=utf8&connectionCollation=utf8mb4_unicode_ci&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
username: bms
password: JnE6nTRSNZjnhrcP
connectionInitSqls: SET NAMES utf8mb4
# Slave DS: Oracle upstream order (TAB_ORDER)
slave:
enabled: true
driverClassName: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@//120.79.189.203:15281/WSDB
username: readonly_report
password: k5x15WP1hE
# Oracle remote query may need longer read timeout than MySQL
connectTimeout: 30000
socketTimeout: 120000
validationQuery: SELECT 1 FROM DUAL
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置连接超时时间
connectTimeout: 30000
# 配置网络超时时间
socketTimeout: 60000
# 配置间隔多久检测一次空闲连接,避免远程数据库断开后连接池继续复用失效连接,单位是毫秒
timeBetweenEvictionRunsMillis: 30000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
# 异步账单任务借用连接时校验连接有效性,避免拿到已被数据库断开的连接
testOnBorrow: true
testOnReturn: false
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: bms
login-password: 123456
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
@@ -0,0 +1,171 @@
# 项目相关配置
bms:
# 名称
name: BMS
# 版本
version: 3.9.2
# 版权年份
copyrightYear: 2026
# 文件路径 示例( Windows配置D:/bms/uploadPath,Linux配置 /home/bms/uploadPath)
profile: D:/bms/uploadPath
# 获取ip地址开关
addressEnabled: false
# 验证码类型 math 数字计算 char 字符验证
captchaType: math
# TMS open API
tms:
# Agreed API identification code for TMS callers
api-code: BMS.TMS.ZYaOvlQzpcfau8TUaCFfO3Hp8ieHIqGw
billing:
# MQ mode: redis (default list queue) | local (Spring event)
mq-mode: redis
mq-queue-key: bms:billing:task
consumer-enabled: true
# Pop/process interval after previous tick finishes
consumer-delay-ms: 200
# Max messages popped per tick; processed by consumer-threads pool
consumer-batch-size: 32
consumer-threads: 8
oracle:
# SLAVE datasource Oracle main-order table (schema.table allowed)
order-table: WEISHI_USER.TAB_ORDER
# Fallback product when Oracle row has no PRODUCT_CODE
default-product-code: ""
# 开发环境配置
server:
# 服务器的HTTP端口,默认为8080
port: 8080
servlet:
# 应用的访问路径
context-path: /
tomcat:
# tomcat的URI编码
uri-encoding: UTF-8
# 连接数满后的排队数,默认为100
accept-count: 1000
threads:
# tomcat最大线程数,默认为200
max: 800
# Tomcat启动初始化的线程数,默认值10
min-spare: 100
# 日志配置
logging:
level:
com.bms: debug
org.springframework: warn
# 用户配置
user:
password:
# 密码最大错误次数
maxRetryCount: 5
# 密码锁定时间(默认10分钟)
lockTime: 10
# Spring配置
spring:
# 允许循环引用(price 模块 PrcOrderBillServiceImpl <-> PrcCreditArrearsClearAsyncRunner 互依赖)
main:
allow-circular-references: true
# 资源信息
messages:
# 国际化资源文件路径
basename: i18n/messages
profiles:
# local -> application-local.yml ; prod -> application-prod.yml
active: '@profiles.active@'
# 文件上传
servlet:
multipart:
# 单个文件大小
max-file-size: 10MB
# 设置总上传的文件大小
max-request-size: 20MB
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
# 服务模块
devtools:
restart:
# 热部署开关
enabled: true
data:
# redis 配置
redis:
# 地址
host: localhost
# 端口,默认为6379
port: 6379
# 数据库索引
database: 0
# 密码
password:
# 连接超时时间
timeout: 10s
lettuce:
pool:
# 连接池中的最小空闲连接
min-idle: 0
# 连接池中的最大空闲连接
max-idle: 8
# 连接池的最大数据库连接数
max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# token配置
token:
# 令牌自定义标识
header: Authorization
# 令牌密钥
secret: abcdefghijklmnopqrstuvwxyz
# 令牌有效期(默认30分钟)
expireTime: 30
# MyBatis配置
mybatis:
# 搜索指定包别名
typeAliasesPackage: com.bms.**.domain
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath*:mapper/**/*Mapper.xml
# 加载全局的配置文件
configLocation: classpath:mybatis/mybatis-config.xml
# PageHelper分页插件
pagehelper:
helperDialect: mysql
supportMethodsArguments: true
params: count=countSql
# Springdoc配置
springdoc:
api-docs:
path: /v3/api-docs
swagger-ui:
enabled: true
path: /swagger-ui.html
tags-sorter: alpha
group-configs:
- group: 'default'
display-name: '测试模块'
paths-to-match: '/**'
packages-to-scan: com.bms.web.controller.tool
# 防盗链配置
referer:
# 防盗链开关
enabled: false
# 允许的域名列表
allowed-domains: localhost,127.0.0.1
# 防止XSS攻击
xss:
# 过滤开关
enabled: true
# 排除链接(多个用逗号分隔)
excludes: /system/notice
# 匹配链接
urlPatterns: /system/*,/monitor/*,/tool/*
@@ -0,0 +1,24 @@
Application Version: ${bms.version}
Spring Boot Version: ${spring-boot.version}
////////////////////////////////////////////////////////////////////
// _ooOoo_ //
// o8888888o //
// 88" . "88 //
// (| ^_^ |) //
// O\ = /O //
// ____/`---'\____ //
// .' \\| |// `. //
// / \\||| : |||// \ //
// / _||||| -:- |||||- \ //
// | | \\\ - /// | | //
// | \_| ''\---/'' | | //
// \ .-\__ `-` ___/-. / //
// ___`. .' /--.--\ `. . ___ //
// ."" '< `.___\_<|>_/___.' >'"". //
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
// \ \ `-. \_ __\ /__ _/ .-` / / //
// ========`-.____`-.___\_____/___.-`____.-'======== //
// `=---=' //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永不宕机 永无BUG //
////////////////////////////////////////////////////////////////////
@@ -0,0 +1,107 @@
[
{"name":{"common":"China","official":"People's Republic of China"},"cca2":"CN","cca3":"CHN","region":"Asia","subregion":"Eastern Asia","currencies":{"CNY":{"name":"Chinese yuan","symbol":"¥"}},"idd":{"root":"+86","suffixes":[""]},"flag":"🇨🇳","flags":{"png":"https://flagcdn.com/w320/cn.png"},"independent":true},
{"name":{"common":"United States","official":"United States of America"},"cca2":"US","cca3":"USA","region":"Americas","subregion":"North America","currencies":{"USD":{"name":"United States dollar","symbol":"$"}},"idd":{"root":"+1","suffixes":[""]},"flag":"🇺🇸","flags":{"png":"https://flagcdn.com/w320/us.png"},"independent":true},
{"name":{"common":"Germany","official":"Federal Republic of Germany"},"cca2":"DE","cca3":"DEU","region":"Europe","subregion":"Western Europe","currencies":{"EUR":{"name":"Euro","symbol":"€"}},"idd":{"root":"+49","suffixes":[""]},"flag":"🇩🇪","flags":{"png":"https://flagcdn.com/w320/de.png"},"independent":true},
{"name":{"common":"Japan","official":"Japan"},"cca2":"JP","cca3":"JPN","region":"Asia","subregion":"Eastern Asia","currencies":{"JPY":{"name":"Japanese yen","symbol":"¥"}},"idd":{"root":"+81","suffixes":[""]},"flag":"🇯🇵","flags":{"png":"https://flagcdn.com/w320/jp.png"},"independent":true},
{"name":{"common":"South Korea","official":"Republic of Korea"},"cca2":"KR","cca3":"KOR","region":"Asia","subregion":"Eastern Asia","currencies":{"KRW":{"name":"South Korean won","symbol":"₩"}},"idd":{"root":"+82","suffixes":[""]},"flag":"🇰🇷","flags":{"png":"https://flagcdn.com/w320/kr.png"},"independent":true},
{"name":{"common":"United Kingdom","official":"United Kingdom of Great Britain and Northern Ireland"},"cca2":"GB","cca3":"GBR","region":"Europe","subregion":"Northern Europe","currencies":{"GBP":{"name":"British pound","symbol":"£"}},"idd":{"root":"+44","suffixes":[""]},"flag":"🇬🇧","flags":{"png":"https://flagcdn.com/w320/gb.png"},"independent":true},
{"name":{"common":"France","official":"French Republic"},"cca2":"FR","cca3":"FRA","region":"Europe","subregion":"Western Europe","currencies":{"EUR":{"name":"Euro","symbol":"€"}},"idd":{"root":"+33","suffixes":[""]},"flag":"🇫🇷","flags":{"png":"https://flagcdn.com/w320/fr.png"},"independent":true},
{"name":{"common":"Italy","official":"Italian Republic"},"cca2":"IT","cca3":"ITA","region":"Europe","subregion":"Southern Europe","currencies":{"EUR":{"name":"Euro","symbol":"€"}},"idd":{"root":"+39","suffixes":[""]},"flag":"🇮🇹","flags":{"png":"https://flagcdn.com/w320/it.png"},"independent":true},
{"name":{"common":"Spain","official":"Kingdom of Spain"},"cca2":"ES","cca3":"ESP","region":"Europe","subregion":"Southern Europe","currencies":{"EUR":{"name":"Euro","symbol":"€"}},"idd":{"root":"+34","suffixes":[""]},"flag":"🇪🇸","flags":{"png":"https://flagcdn.com/w320/es.png"},"independent":true},
{"name":{"common":"Netherlands","official":"Kingdom of the Netherlands"},"cca2":"NL","cca3":"NLD","region":"Europe","subregion":"Western Europe","currencies":{"EUR":{"name":"Euro","symbol":"€"}},"idd":{"root":"+31","suffixes":[""]},"flag":"🇳🇱","flags":{"png":"https://flagcdn.com/w320/nl.png"},"independent":true},
{"name":{"common":"Belgium","official":"Kingdom of Belgium"},"cca2":"BE","cca3":"BEL","region":"Europe","subregion":"Western Europe","currencies":{"EUR":{"name":"Euro","symbol":"€"}},"idd":{"root":"+32","suffixes":[""]},"flag":"🇧🇪","flags":{"png":"https://flagcdn.com/w320/be.png"},"independent":true},
{"name":{"common":"Switzerland","official":"Swiss Confederation"},"cca2":"CH","cca3":"CHE","region":"Europe","subregion":"Western Europe","currencies":{"CHF":{"name":"Swiss franc","symbol":"Fr."}},"idd":{"root":"+41","suffixes":[""]},"flag":"🇨🇭","flags":{"png":"https://flagcdn.com/w320/ch.png"},"independent":true},
{"name":{"common":"Austria","official":"Republic of Austria"},"cca2":"AT","cca3":"AUT","region":"Europe","subregion":"Western Europe","currencies":{"EUR":{"name":"Euro","symbol":"€"}},"idd":{"root":"+43","suffixes":[""]},"flag":"🇦🇹","flags":{"png":"https://flagcdn.com/w320/at.png"},"independent":true},
{"name":{"common":"Sweden","official":"Kingdom of Sweden"},"cca2":"SE","cca3":"SWE","region":"Europe","subregion":"Northern Europe","currencies":{"SEK":{"name":"Swedish krona","symbol":"kr"}},"idd":{"root":"+46","suffixes":[""]},"flag":"🇸🇪","flags":{"png":"https://flagcdn.com/w320/se.png"},"independent":true},
{"name":{"common":"Norway","official":"Kingdom of Norway"},"cca2":"NO","cca3":"NOR","region":"Europe","subregion":"Northern Europe","currencies":{"NOK":{"name":"Norwegian krone","symbol":"kr"}},"idd":{"root":"+47","suffixes":[""]},"flag":"🇳🇴","flags":{"png":"https://flagcdn.com/w320/no.png"},"independent":true},
{"name":{"common":"Denmark","official":"Kingdom of Denmark"},"cca2":"DK","cca3":"DNK","region":"Europe","subregion":"Northern Europe","currencies":{"DKK":{"name":"Danish krone","symbol":"kr"}},"idd":{"root":"+45","suffixes":[""]},"flag":"🇩🇰","flags":{"png":"https://flagcdn.com/w320/dk.png"},"independent":true},
{"name":{"common":"Finland","official":"Republic of Finland"},"cca2":"FI","cca3":"FIN","region":"Europe","subregion":"Northern Europe","currencies":{"EUR":{"name":"Euro","symbol":"€"}},"idd":{"root":"+358","suffixes":[""]},"flag":"🇫🇮","flags":{"png":"https://flagcdn.com/w320/fi.png"},"independent":true},
{"name":{"common":"Poland","official":"Republic of Poland"},"cca2":"PL","cca3":"POL","region":"Europe","subregion":"Central Europe","currencies":{"PLN":{"name":"Polish zloty","symbol":"zł"}},"idd":{"root":"+48","suffixes":[""]},"flag":"🇵🇱","flags":{"png":"https://flagcdn.com/w320/pl.png"},"independent":true},
{"name":{"common":"Russia","official":"Russian Federation"},"cca2":"RU","cca3":"RUS","region":"Europe","subregion":"Eastern Europe","currencies":{"RUB":{"name":"Russian ruble","symbol":"₽"}},"idd":{"root":"+7","suffixes":[""]},"flag":"🇷🇺","flags":{"png":"https://flagcdn.com/w320/ru.png"},"independent":true},
{"name":{"common":"India","official":"Republic of India"},"cca2":"IN","cca3":"IND","region":"Asia","subregion":"Southern Asia","currencies":{"INR":{"name":"Indian rupee","symbol":"₹"}},"idd":{"root":"+91","suffixes":[""]},"flag":"🇮🇳","flags":{"png":"https://flagcdn.com/w320/in.png"},"independent":true},
{"name":{"common":"Brazil","official":"Federative Republic of Brazil"},"cca2":"BR","cca3":"BRA","region":"Americas","subregion":"South America","currencies":{"BRL":{"name":"Brazilian real","symbol":"R$"}},"idd":{"root":"+55","suffixes":[""]},"flag":"🇧🇷","flags":{"png":"https://flagcdn.com/w320/br.png"},"independent":true},
{"name":{"common":"Canada","official":"Canada"},"cca2":"CA","cca3":"CAN","region":"Americas","subregion":"North America","currencies":{"CAD":{"name":"Canadian dollar","symbol":"$"}},"idd":{"root":"+1","suffixes":[""]},"flag":"🇨🇦","flags":{"png":"https://flagcdn.com/w320/ca.png"},"independent":true},
{"name":{"common":"Australia","official":"Commonwealth of Australia"},"cca2":"AU","cca3":"AUS","region":"Oceania","subregion":"Australia and New Zealand","currencies":{"AUD":{"name":"Australian dollar","symbol":"$"}},"idd":{"root":"+61","suffixes":[""]},"flag":"🇦🇺","flags":{"png":"https://flagcdn.com/w320/au.png"},"independent":true},
{"name":{"common":"Mexico","official":"United Mexican States"},"cca2":"MX","cca3":"MEX","region":"Americas","subregion":"North America","currencies":{"MXN":{"name":"Mexican peso","symbol":"$"}},"idd":{"root":"+52","suffixes":[""]},"flag":"🇲🇽","flags":{"png":"https://flagcdn.com/w320/mx.png"},"independent":true},
{"name":{"common":"Indonesia","official":"Republic of Indonesia"},"cca2":"ID","cca3":"IDN","region":"Asia","subregion":"South-Eastern Asia","currencies":{"IDR":{"name":"Indonesian rupiah","symbol":"Rp"}},"idd":{"root":"+62","suffixes":[""]},"flag":"🇮🇩","flags":{"png":"https://flagcdn.com/w320/id.png"},"independent":true},
{"name":{"common":"Thailand","official":"Kingdom of Thailand"},"cca2":"TH","cca3":"THA","region":"Asia","subregion":"South-Eastern Asia","currencies":{"THB":{"name":"Thai baht","symbol":"฿"}},"idd":{"root":"+66","suffixes":[""]},"flag":"🇹🇭","flags":{"png":"https://flagcdn.com/w320/th.png"},"independent":true},
{"name":{"common":"Vietnam","official":"Socialist Republic of Vietnam"},"cca2":"VN","cca3":"VNM","region":"Asia","subregion":"South-Eastern Asia","currencies":{"VND":{"name":"Vietnamese đồng","symbol":"₫"}},"idd":{"root":"+84","suffixes":[""]},"flag":"🇻🇳","flags":{"png":"https://flagcdn.com/w320/vn.png"},"independent":true},
{"name":{"common":"Malaysia","official":"Malaysia"},"cca2":"MY","cca3":"MYS","region":"Asia","subregion":"South-Eastern Asia","currencies":{"MYR":{"name":"Malaysian ringgit","symbol":"RM"}},"idd":{"root":"+60","suffixes":[""]},"flag":"🇲🇾","flags":{"png":"https://flagcdn.com/w320/my.png"},"independent":true},
{"name":{"common":"Singapore","official":"Republic of Singapore"},"cca2":"SG","cca3":"SGP","region":"Asia","subregion":"South-Eastern Asia","currencies":{"SGD":{"name":"Singapore dollar","symbol":"$"}},"idd":{"root":"+65","suffixes":[""]},"flag":"🇸🇬","flags":{"png":"https://flagcdn.com/w320/sg.png"},"independent":true},
{"name":{"common":"Philippines","official":"Republic of the Philippines"},"cca2":"PH","cca3":"PHL","region":"Asia","subregion":"South-Eastern Asia","currencies":{"PHP":{"name":"Philippine peso","symbol":"₱"}},"idd":{"root":"+63","suffixes":[""]},"flag":"🇵🇭","flags":{"png":"https://flagcdn.com/w320/ph.png"},"independent":true},
{"name":{"common":"Turkey","official":"Republic of Türkiye"},"cca2":"TR","cca3":"TUR","region":"Asia","subregion":"Western Asia","currencies":{"TRY":{"name":"Turkish lira","symbol":"₺"}},"idd":{"root":"+90","suffixes":[""]},"flag":"🇹🇷","flags":{"png":"https://flagcdn.com/w320/tr.png"},"independent":true},
{"name":{"common":"Saudi Arabia","official":"Kingdom of Saudi Arabia"},"cca2":"SA","cca3":"SAU","region":"Asia","subregion":"Western Asia","currencies":{"SAR":{"name":"Saudi riyal","symbol":"ر.س"}},"idd":{"root":"+966","suffixes":[""]},"flag":"🇸🇦","flags":{"png":"https://flagcdn.com/w320/sa.png"},"independent":true},
{"name":{"common":"United Arab Emirates","official":"United Arab Emirates"},"cca2":"AE","cca3":"ARE","region":"Asia","subregion":"Western Asia","currencies":{"AED":{"name":"United Arab Emirates dirham","symbol":"د.إ"}},"idd":{"root":"+971","suffixes":[""]},"flag":"🇦🇪","flags":{"png":"https://flagcdn.com/w320/ae.png"},"independent":true},
{"name":{"common":"Israel","official":"State of Israel"},"cca2":"IL","cca3":"ISR","region":"Asia","subregion":"Western Asia","currencies":{"ILS":{"name":"Israeli new shekel","symbol":"₪"}},"idd":{"root":"+972","suffixes":[""]},"flag":"🇮🇱","flags":{"png":"https://flagcdn.com/w320/il.png"},"independent":true},
{"name":{"common":"Egypt","official":"Arab Republic of Egypt"},"cca2":"EG","cca3":"EGY","region":"Africa","subregion":"Northern Africa","currencies":{"EGP":{"name":"Egyptian pound","symbol":"£"}},"idd":{"root":"+20","suffixes":[""]},"flag":"🇪🇬","flags":{"png":"https://flagcdn.com/w320/eg.png"},"independent":true},
{"name":{"common":"South Africa","official":"Republic of South Africa"},"cca2":"ZA","cca3":"ZAF","region":"Africa","subregion":"Southern Africa","currencies":{"ZAR":{"name":"South African rand","symbol":"R"}},"idd":{"root":"+27","suffixes":[""]},"flag":"🇿🇦","flags":{"png":"https://flagcdn.com/w320/za.png"},"independent":true},
{"name":{"common":"Nigeria","official":"Federal Republic of Nigeria"},"cca2":"NG","cca3":"NGA","region":"Africa","subregion":"Western Africa","currencies":{"NGN":{"name":"Nigerian naira","symbol":"₦"}},"idd":{"root":"+234","suffixes":[""]},"flag":"🇳🇬","flags":{"png":"https://flagcdn.com/w320/ng.png"},"independent":true},
{"name":{"common":"Argentina","official":"Argentine Republic"},"cca2":"AR","cca3":"ARG","region":"Americas","subregion":"South America","currencies":{"ARS":{"name":"Argentine peso","symbol":"$"}},"idd":{"root":"+54","suffixes":[""]},"flag":"🇦🇷","flags":{"png":"https://flagcdn.com/w320/ar.png"},"independent":true},
{"name":{"common":"Chile","official":"Republic of Chile"},"cca2":"CL","cca3":"CHL","region":"Americas","subregion":"South America","currencies":{"CLP":{"name":"Chilean peso","symbol":"$"}},"idd":{"root":"+56","suffixes":[""]},"flag":"🇨🇱","flags":{"png":"https://flagcdn.com/w320/cl.png"},"independent":true},
{"name":{"common":"Colombia","official":"Republic of Colombia"},"cca2":"CO","cca3":"COL","region":"Americas","subregion":"South America","currencies":{"COP":{"name":"Colombian peso","symbol":"$"}},"idd":{"root":"+57","suffixes":[""]},"flag":"🇨🇴","flags":{"png":"https://flagcdn.com/w320/co.png"},"independent":true},
{"name":{"common":"Peru","official":"Republic of Peru"},"cca2":"PE","cca3":"PER","region":"Americas","subregion":"South America","currencies":{"PEN":{"name":"Peruvian sol","symbol":"S/"}},"idd":{"root":"+51","suffixes":[""]},"flag":"🇵🇪","flags":{"png":"https://flagcdn.com/w320/pe.png"},"independent":true},
{"name":{"common":"New Zealand","official":"New Zealand"},"cca2":"NZ","cca3":"NZL","region":"Oceania","subregion":"Australia and New Zealand","currencies":{"NZD":{"name":"New Zealand dollar","symbol":"$"}},"idd":{"root":"+64","suffixes":[""]},"flag":"🇳🇿","flags":{"png":"https://flagcdn.com/w320/nz.png"},"independent":true},
{"name":{"common":"Ireland","official":"Republic of Ireland"},"cca2":"IE","cca3":"IRL","region":"Europe","subregion":"Northern Europe","currencies":{"EUR":{"name":"Euro","symbol":"€"}},"idd":{"root":"+353","suffixes":[""]},"flag":"🇮🇪","flags":{"png":"https://flagcdn.com/w320/ie.png"},"independent":true},
{"name":{"common":"Portugal","official":"Portuguese Republic"},"cca2":"PT","cca3":"PRT","region":"Europe","subregion":"Southern Europe","currencies":{"EUR":{"name":"Euro","symbol":"€"}},"idd":{"root":"+351","suffixes":[""]},"flag":"🇵🇹","flags":{"png":"https://flagcdn.com/w320/pt.png"},"independent":true},
{"name":{"common":"Greece","official":"Hellenic Republic"},"cca2":"GR","cca3":"GRC","region":"Europe","subregion":"Southern Europe","currencies":{"EUR":{"name":"Euro","symbol":"€"}},"idd":{"root":"+30","suffixes":[""]},"flag":"🇬🇷","flags":{"png":"https://flagcdn.com/w320/gr.png"},"independent":true},
{"name":{"common":"Czechia","official":"Czech Republic"},"cca2":"CZ","cca3":"CZE","region":"Europe","subregion":"Central Europe","currencies":{"CZK":{"name":"Czech koruna","symbol":"Kč"}},"idd":{"root":"+420","suffixes":[""]},"flag":"🇨🇿","flags":{"png":"https://flagcdn.com/w320/cz.png"},"independent":true},
{"name":{"common":"Hungary","official":"Hungary"},"cca2":"HU","cca3":"HUN","region":"Europe","subregion":"Central Europe","currencies":{"HUF":{"name":"Hungarian forint","symbol":"Ft"}},"idd":{"root":"+36","suffixes":[""]},"flag":"🇭🇺","flags":{"png":"https://flagcdn.com/w320/hu.png"},"independent":true},
{"name":{"common":"Romania","official":"Romania"},"cca2":"RO","cca3":"ROU","region":"Europe","subregion":"Central Europe","currencies":{"RON":{"name":"Romanian leu","symbol":"lei"}},"idd":{"root":"+40","suffixes":[""]},"flag":"🇷🇴","flags":{"png":"https://flagcdn.com/w320/ro.png"},"independent":true},
{"name":{"common":"Bulgaria","official":"Republic of Bulgaria"},"cca2":"BG","cca3":"BGR","region":"Europe","subregion":"Southeast Europe","currencies":{"BGN":{"name":"Bulgarian lev","symbol":"лв"}},"idd":{"root":"+359","suffixes":[""]},"flag":"🇧🇬","flags":{"png":"https://flagcdn.com/w320/bg.png"},"independent":true},
{"name":{"common":"Croatia","official":"Republic of Croatia"},"cca2":"HR","cca3":"HRV","region":"Europe","subregion":"Southeast Europe","currencies":{"EUR":{"name":"Euro","symbol":"€"}},"idd":{"root":"+385","suffixes":[""]},"flag":"🇭🇷","flags":{"png":"https://flagcdn.com/w320/hr.png"},"independent":true},
{"name":{"common":"Slovakia","official":"Slovak Republic"},"cca2":"SK","cca3":"SVK","region":"Europe","subregion":"Central Europe","currencies":{"EUR":{"name":"Euro","symbol":"€"}},"idd":{"root":"+421","suffixes":[""]},"flag":"🇸🇰","flags":{"png":"https://flagcdn.com/w320/sk.png"},"independent":true},
{"name":{"common":"Slovenia","official":"Republic of Slovenia"},"cca2":"SI","cca3":"SVN","region":"Europe","subregion":"Central Europe","currencies":{"EUR":{"name":"Euro","symbol":"€"}},"idd":{"root":"+386","suffixes":[""]},"flag":"🇸🇮","flags":{"png":"https://flagcdn.com/w320/si.png"},"independent":true},
{"name":{"common":"Lithuania","official":"Republic of Lithuania"},"cca2":"LT","cca3":"LTU","region":"Europe","subregion":"Northern Europe","currencies":{"EUR":{"name":"Euro","symbol":"€"}},"idd":{"root":"+370","suffixes":[""]},"flag":"🇱🇹","flags":{"png":"https://flagcdn.com/w320/lt.png"},"independent":true},
{"name":{"common":"Latvia","official":"Republic of Latvia"},"cca2":"LV","cca3":"LVA","region":"Europe","subregion":"Northern Europe","currencies":{"EUR":{"name":"Euro","symbol":"€"}},"idd":{"root":"+371","suffixes":[""]},"flag":"🇱🇻","flags":{"png":"https://flagcdn.com/w320/lv.png"},"independent":true},
{"name":{"common":"Estonia","official":"Republic of Estonia"},"cca2":"EE","cca3":"EST","region":"Europe","subregion":"Northern Europe","currencies":{"EUR":{"name":"Euro","symbol":"€"}},"idd":{"root":"+372","suffixes":[""]},"flag":"🇪🇪","flags":{"png":"https://flagcdn.com/w320/ee.png"},"independent":true},
{"name":{"common":"Ukraine","official":"Ukraine"},"cca2":"UA","cca3":"UKR","region":"Europe","subregion":"Eastern Europe","currencies":{"UAH":{"name":"Ukrainian hryvnia","symbol":"₴"}},"idd":{"root":"+380","suffixes":[""]},"flag":"🇺🇦","flags":{"png":"https://flagcdn.com/w320/ua.png"},"independent":true},
{"name":{"common":"Morocco","official":"Kingdom of Morocco"},"cca2":"MA","cca3":"MAR","region":"Africa","subregion":"Northern Africa","currencies":{"MAD":{"name":"Moroccan dirham","symbol":"د.م."}},"idd":{"root":"+212","suffixes":[""]},"flag":"🇲🇦","flags":{"png":"https://flagcdn.com/w320/ma.png"},"independent":true},
{"name":{"common":"Kenya","official":"Republic of Kenya"},"cca2":"KE","cca3":"KEN","region":"Africa","subregion":"Eastern Africa","currencies":{"KES":{"name":"Kenyan shilling","symbol":"KSh"}},"idd":{"root":"+254","suffixes":[""]},"flag":"🇰🇪","flags":{"png":"https://flagcdn.com/w320/ke.png"},"independent":true},
{"name":{"common":"Pakistan","official":"Islamic Republic of Pakistan"},"cca2":"PK","cca3":"PAK","region":"Asia","subregion":"Southern Asia","currencies":{"PKR":{"name":"Pakistani rupee","symbol":"₨"}},"idd":{"root":"+92","suffixes":[""]},"flag":"🇵🇰","flags":{"png":"https://flagcdn.com/w320/pk.png"},"independent":true},
{"name":{"common":"Bangladesh","official":"People's Republic of Bangladesh"},"cca2":"BD","cca3":"BGD","region":"Asia","subregion":"Southern Asia","currencies":{"BDT":{"name":"Bangladeshi taka","symbol":"৳"}},"idd":{"root":"+880","suffixes":[""]},"flag":"🇧🇩","flags":{"png":"https://flagcdn.com/w320/bd.png"},"independent":true},
{"name":{"common":"Iran","official":"Islamic Republic of Iran"},"cca2":"IR","cca3":"IRN","region":"Asia","subregion":"Southern Asia","currencies":{"IRR":{"name":"Iranian rial","symbol":"﷼"}},"idd":{"root":"+98","suffixes":[""]},"flag":"🇮🇷","flags":{"png":"https://flagcdn.com/w320/ir.png"},"independent":true},
{"name":{"common":"Iraq","official":"Republic of Iraq"},"cca2":"IQ","cca3":"IRQ","region":"Asia","subregion":"Western Asia","currencies":{"IQD":{"name":"Iraqi dinar","symbol":"د.ع"}},"idd":{"root":"+964","suffixes":[""]},"flag":"🇮🇶","flags":{"png":"https://flagcdn.com/w320/iq.png"},"independent":true},
{"name":{"common":"Kuwait","official":"State of Kuwait"},"cca2":"KW","cca3":"KWT","region":"Asia","subregion":"Western Asia","currencies":{"KWD":{"name":"Kuwaiti dinar","symbol":"د.ك"}},"idd":{"root":"+965","suffixes":[""]},"flag":"🇰🇼","flags":{"png":"https://flagcdn.com/w320/kw.png"},"independent":true},
{"name":{"common":"Qatar","official":"State of Qatar"},"cca2":"QA","cca3":"QAT","region":"Asia","subregion":"Western Asia","currencies":{"QAR":{"name":"Qatari riyal","symbol":"ر.ق"}},"idd":{"root":"+974","suffixes":[""]},"flag":"🇶🇦","flags":{"png":"https://flagcdn.com/w320/qa.png"},"independent":true},
{"name":{"common":"Hong Kong","official":"Hong Kong Special Administrative Region of China"},"cca2":"HK","cca3":"HKG","region":"Asia","subregion":"Eastern Asia","currencies":{"HKD":{"name":"Hong Kong dollar","symbol":"$"}},"idd":{"root":"+852","suffixes":[""]},"flag":"🇭🇰","flags":{"png":"https://flagcdn.com/w320/hk.png"},"independent":false},
{"name":{"common":"Taiwan","official":"Republic of China"},"cca2":"TW","cca3":"TWN","region":"Asia","subregion":"Eastern Asia","currencies":{"TWD":{"name":"New Taiwan dollar","symbol":"$"}},"idd":{"root":"+886","suffixes":[""]},"flag":"🇹🇼","flags":{"png":"https://flagcdn.com/w320/tw.png"},"independent":false},
{"name":{"common":"Iceland","official":"Iceland"},"cca2":"IS","cca3":"ISL","region":"Europe","subregion":"Northern Europe","currencies":{"ISK":{"name":"Icelandic króna","symbol":"kr"}},"idd":{"root":"+354","suffixes":[""]},"flag":"🇮🇸","flags":{"png":"https://flagcdn.com/w320/is.png"},"independent":true},
{"name":{"common":"Luxembourg","official":"Grand Duchy of Luxembourg"},"cca2":"LU","cca3":"LUX","region":"Europe","subregion":"Western Europe","currencies":{"EUR":{"name":"Euro","symbol":"€"}},"idd":{"root":"+352","suffixes":[""]},"flag":"🇱🇺","flags":{"png":"https://flagcdn.com/w320/lu.png"},"independent":true},
{"name":{"common":"Malta","official":"Republic of Malta"},"cca2":"MT","cca3":"MLT","region":"Europe","subregion":"Southern Europe","currencies":{"EUR":{"name":"Euro","symbol":"€"}},"idd":{"root":"+356","suffixes":[""]},"flag":"🇲🇹","flags":{"png":"https://flagcdn.com/w320/mt.png"},"independent":true},
{"name":{"common":"Cyprus","official":"Republic of Cyprus"},"cca2":"CY","cca3":"CYP","region":"Europe","subregion":"Southern Europe","currencies":{"EUR":{"name":"Euro","symbol":"€"}},"idd":{"root":"+357","suffixes":[""]},"flag":"🇨🇾","flags":{"png":"https://flagcdn.com/w320/cy.png"},"independent":true},
{"name":{"common":"Albania","official":"Republic of Albania"},"cca2":"AL","cca3":"ALB","region":"Europe","subregion":"Southeast Europe","currencies":{"ALL":{"name":"Albanian lek","symbol":"L"}},"idd":{"root":"+355","suffixes":[""]},"flag":"🇦🇱","flags":{"png":"https://flagcdn.com/w320/al.png"},"independent":true},
{"name":{"common":"Serbia","official":"Republic of Serbia"},"cca2":"RS","cca3":"SRB","region":"Europe","subregion":"Southeast Europe","currencies":{"RSD":{"name":"Serbian dinar","symbol":"дин"}},"idd":{"root":"+381","suffixes":[""]},"flag":"🇷🇸","flags":{"png":"https://flagcdn.com/w320/rs.png"},"independent":true},
{"name":{"common":"Belarus","official":"Republic of Belarus"},"cca2":"BY","cca3":"BLR","region":"Europe","subregion":"Eastern Europe","currencies":{"BYN":{"name":"Belarusian ruble","symbol":"Br"}},"idd":{"root":"+375","suffixes":[""]},"flag":"🇧🇾","flags":{"png":"https://flagcdn.com/w320/by.png"},"independent":true},
{"name":{"common":"Kazakhstan","official":"Republic of Kazakhstan"},"cca2":"KZ","cca3":"KAZ","region":"Asia","subregion":"Central Asia","currencies":{"KZT":{"name":"Kazakhstani tenge","symbol":"₸"}},"idd":{"root":"+7","suffixes":[""]},"flag":"🇰🇿","flags":{"png":"https://flagcdn.com/w320/kz.png"},"independent":true},
{"name":{"common":"Uzbekistan","official":"Republic of Uzbekistan"},"cca2":"UZ","cca3":"UZB","region":"Asia","subregion":"Central Asia","currencies":{"UZS":{"name":"Uzbekistani soʻm","symbol":"so'm"}},"idd":{"root":"+998","suffixes":[""]},"flag":"🇺🇿","flags":{"png":"https://flagcdn.com/w320/uz.png"},"independent":true},
{"name":{"common":"Sri Lanka","official":"Democratic Socialist Republic of Sri Lanka"},"cca2":"LK","cca3":"LKA","region":"Asia","subregion":"Southern Asia","currencies":{"LKR":{"name":"Sri Lankan rupee","symbol":"Rs"}},"idd":{"root":"+94","suffixes":[""]},"flag":"🇱🇰","flags":{"png":"https://flagcdn.com/w320/lk.png"},"independent":true},
{"name":{"common":"Cambodia","official":"Kingdom of Cambodia"},"cca2":"KH","cca3":"KHM","region":"Asia","subregion":"South-Eastern Asia","currencies":{"KHR":{"name":"Cambodian riel","symbol":"៛"}},"idd":{"root":"+855","suffixes":[""]},"flag":"🇰🇭","flags":{"png":"https://flagcdn.com/w320/kh.png"},"independent":true},
{"name":{"common":"Myanmar","official":"Republic of the Union of Myanmar"},"cca2":"MM","cca3":"MMR","region":"Asia","subregion":"South-Eastern Asia","currencies":{"MMK":{"name":"Burmese kyat","symbol":"K"}},"idd":{"root":"+95","suffixes":[""]},"flag":"🇲🇲","flags":{"png":"https://flagcdn.com/w320/mm.png"},"independent":true},
{"name":{"common":"Laos","official":"Lao People's Democratic Republic"},"cca2":"LA","cca3":"LAO","region":"Asia","subregion":"South-Eastern Asia","currencies":{"LAK":{"name":"Lao kip","symbol":"₭"}},"idd":{"root":"+856","suffixes":[""]},"flag":"🇱🇦","flags":{"png":"https://flagcdn.com/w320/la.png"},"independent":true},
{"name":{"common":"Nepal","official":"Federal Democratic Republic of Nepal"},"cca2":"NP","cca3":"NPL","region":"Asia","subregion":"Southern Asia","currencies":{"NPR":{"name":"Nepalese rupee","symbol":"रू"}},"idd":{"root":"+977","suffixes":[""]},"flag":"🇳🇵","flags":{"png":"https://flagcdn.com/w320/np.png"},"independent":true},
{"name":{"common":"Afghanistan","official":"Islamic Republic of Afghanistan"},"cca2":"AF","cca3":"AFG","region":"Asia","subregion":"Southern Asia","currencies":{"AFN":{"name":"Afghan afghani","symbol":"؋"}},"idd":{"root":"+93","suffixes":[""]},"flag":"🇦🇫","flags":{"png":"https://flagcdn.com/w320/af.png"},"independent":true},
{"name":{"common":"Jordan","official":"Hashemite Kingdom of Jordan"},"cca2":"JO","cca3":"JOR","region":"Asia","subregion":"Western Asia","currencies":{"JOD":{"name":"Jordanian dinar","symbol":"د.ا"}},"idd":{"root":"+962","suffixes":[""]},"flag":"🇯🇴","flags":{"png":"https://flagcdn.com/w320/jo.png"},"independent":true},
{"name":{"common":"Lebanon","official":"Lebanese Republic"},"cca2":"LB","cca3":"LBN","region":"Asia","subregion":"Western Asia","currencies":{"LBP":{"name":"Lebanese pound","symbol":"ل.ل"}},"idd":{"root":"+961","suffixes":[""]},"flag":"🇱🇧","flags":{"png":"https://flagcdn.com/w320/lb.png"},"independent":true},
{"name":{"common":"Oman","official":"Sultanate of Oman"},"cca2":"OM","cca3":"OMN","region":"Asia","subregion":"Western Asia","currencies":{"OMR":{"name":"Omani rial","symbol":"ر.ع."}},"idd":{"root":"+968","suffixes":[""]},"flag":"🇴🇲","flags":{"png":"https://flagcdn.com/w320/om.png"},"independent":true},
{"name":{"common":"Bahrain","official":"Kingdom of Bahrain"},"cca2":"BH","cca3":"BHR","region":"Asia","subregion":"Western Asia","currencies":{"BHD":{"name":"Bahraini dinar","symbol":"د.ب"}},"idd":{"root":"+973","suffixes":[""]},"flag":"🇧🇭","flags":{"png":"https://flagcdn.com/w320/bh.png"},"independent":true},
{"name":{"common":"Algeria","official":"People's Democratic Republic of Algeria"},"cca2":"DZ","cca3":"DZA","region":"Africa","subregion":"Northern Africa","currencies":{"DZD":{"name":"Algerian dinar","symbol":"دج"}},"idd":{"root":"+213","suffixes":[""]},"flag":"🇩🇿","flags":{"png":"https://flagcdn.com/w320/dz.png"},"independent":true},
{"name":{"common":"Tunisia","official":"Republic of Tunisia"},"cca2":"TN","cca3":"TUN","region":"Africa","subregion":"Northern Africa","currencies":{"TND":{"name":"Tunisian dinar","symbol":"د.ت"}},"idd":{"root":"+216","suffixes":[""]},"flag":"🇹🇳","flags":{"png":"https://flagcdn.com/w320/tn.png"},"independent":true},
{"name":{"common":"Ghana","official":"Republic of Ghana"},"cca2":"GH","cca3":"GHA","region":"Africa","subregion":"Western Africa","currencies":{"GHS":{"name":"Ghanaian cedi","symbol":"₵"}},"idd":{"root":"+233","suffixes":[""]},"flag":"🇬🇭","flags":{"png":"https://flagcdn.com/w320/gh.png"},"independent":true},
{"name":{"common":"Ethiopia","official":"Federal Democratic Republic of Ethiopia"},"cca2":"ET","cca3":"ETH","region":"Africa","subregion":"Eastern Africa","currencies":{"ETB":{"name":"Ethiopian birr","symbol":"Br"}},"idd":{"root":"+251","suffixes":[""]},"flag":"🇪🇹","flags":{"png":"https://flagcdn.com/w320/et.png"},"independent":true},
{"name":{"common":"Tanzania","official":"United Republic of Tanzania"},"cca2":"TZ","cca3":"TZA","region":"Africa","subregion":"Eastern Africa","currencies":{"TZS":{"name":"Tanzanian shilling","symbol":"Sh"}},"idd":{"root":"+255","suffixes":[""]},"flag":"🇹🇿","flags":{"png":"https://flagcdn.com/w320/tz.png"},"independent":true},
{"name":{"common":"Uganda","official":"Republic of Uganda"},"cca2":"UG","cca3":"UGA","region":"Africa","subregion":"Eastern Africa","currencies":{"UGX":{"name":"Ugandan shilling","symbol":"Sh"}},"idd":{"root":"+256","suffixes":[""]},"flag":"🇺🇬","flags":{"png":"https://flagcdn.com/w320/ug.png"},"independent":true},
{"name":{"common":"Cameroon","official":"Republic of Cameroon"},"cca2":"CM","cca3":"CMR","region":"Africa","subregion":"Middle Africa","currencies":{"XAF":{"name":"Central African CFA franc","symbol":"FCFA"}},"idd":{"root":"+237","suffixes":[""]},"flag":"🇨🇲","flags":{"png":"https://flagcdn.com/w320/cm.png"},"independent":true},
{"name":{"common":"Angola","official":"Republic of Angola"},"cca2":"AO","cca3":"AGO","region":"Africa","subregion":"Middle Africa","currencies":{"AOA":{"name":"Angolan kwanza","symbol":"Kz"}},"idd":{"root":"+244","suffixes":[""]},"flag":"🇦🇴","flags":{"png":"https://flagcdn.com/w320/ao.png"},"independent":true},
{"name":{"common":"Senegal","official":"Republic of Senegal"},"cca2":"SN","cca3":"SEN","region":"Africa","subregion":"Western Africa","currencies":{"XOF":{"name":"West African CFA franc","symbol":"FCFA"}},"idd":{"root":"+221","suffixes":[""]},"flag":"🇸🇳","flags":{"png":"https://flagcdn.com/w320/sn.png"},"independent":true},
{"name":{"common":"Zimbabwe","official":"Republic of Zimbabwe"},"cca2":"ZW","cca3":"ZWE","region":"Africa","subregion":"Eastern Africa","currencies":{"ZWL":{"name":"Zimbabwean dollar","symbol":"$"}},"idd":{"root":"+263","suffixes":[""]},"flag":"🇿🇼","flags":{"png":"https://flagcdn.com/w320/zw.png"},"independent":true},
{"name":{"common":"Bolivia","official":"Plurinational State of Bolivia"},"cca2":"BO","cca3":"BOL","region":"Americas","subregion":"South America","currencies":{"BOB":{"name":"Bolivian boliviano","symbol":"Bs"}},"idd":{"root":"+591","suffixes":[""]},"flag":"🇧🇴","flags":{"png":"https://flagcdn.com/w320/bo.png"},"independent":true},
{"name":{"common":"Ecuador","official":"Republic of Ecuador"},"cca2":"EC","cca3":"ECU","region":"Americas","subregion":"South America","currencies":{"USD":{"name":"United States dollar","symbol":"$"}},"idd":{"root":"+593","suffixes":[""]},"flag":"🇪🇨","flags":{"png":"https://flagcdn.com/w320/ec.png"},"independent":true},
{"name":{"common":"Uruguay","official":"Oriental Republic of Uruguay"},"cca2":"UY","cca3":"URY","region":"Americas","subregion":"South America","currencies":{"UYU":{"name":"Uruguayan peso","symbol":"$"}},"idd":{"root":"+598","suffixes":[""]},"flag":"🇺🇾","flags":{"png":"https://flagcdn.com/w320/uy.png"},"independent":true},
{"name":{"common":"Paraguay","official":"Republic of Paraguay"},"cca2":"PY","cca3":"PRY","region":"Americas","subregion":"South America","currencies":{"PYG":{"name":"Paraguayan guaraní","symbol":"₲"}},"idd":{"root":"+595","suffixes":[""]},"flag":"🇵🇾","flags":{"png":"https://flagcdn.com/w320/py.png"},"independent":true},
{"name":{"common":"Venezuela","official":"Bolivarian Republic of Venezuela"},"cca2":"VE","cca3":"VEN","region":"Americas","subregion":"South America","currencies":{"VES":{"name":"Venezuelan bolívar soberano","symbol":"Bs.S"}},"idd":{"root":"+58","suffixes":[""]},"flag":"🇻🇪","flags":{"png":"https://flagcdn.com/w320/ve.png"},"independent":true},
{"name":{"common":"Dominican Republic","official":"Dominican Republic"},"cca2":"DO","cca3":"DOM","region":"Americas","subregion":"Caribbean","currencies":{"DOP":{"name":"Dominican peso","symbol":"$"}},"idd":{"root":"+1","suffixes":["809"]},"flag":"🇩🇴","flags":{"png":"https://flagcdn.com/w320/do.png"},"independent":true},
{"name":{"common":"Guatemala","official":"Republic of Guatemala"},"cca2":"GT","cca3":"GTM","region":"Americas","subregion":"Central America","currencies":{"GTQ":{"name":"Guatemalan quetzal","symbol":"Q"}},"idd":{"root":"+502","suffixes":[""]},"flag":"🇬🇹","flags":{"png":"https://flagcdn.com/w320/gt.png"},"independent":true},
{"name":{"common":"Panama","official":"Republic of Panama"},"cca2":"PA","cca3":"PAN","region":"Americas","subregion":"Central America","currencies":{"USD":{"name":"United States dollar","symbol":"$"}},"idd":{"root":"+507","suffixes":[""]},"flag":"🇵🇦","flags":{"png":"https://flagcdn.com/w320/pa.png"},"independent":true},
{"name":{"common":"Costa Rica","official":"Republic of Costa Rica"},"cca2":"CR","cca3":"CRI","region":"Americas","subregion":"Central America","currencies":{"CRC":{"name":"Costa Rican colón","symbol":"₡"}},"idd":{"root":"+506","suffixes":[""]},"flag":"🇨🇷","flags":{"png":"https://flagcdn.com/w320/cr.png"},"independent":true},
{"name":{"common":"Vietnam","official":"Socialist Republic of Vietnam"},"cca2":"VN","cca3":"VNM","region":"Asia","subregion":"South-Eastern Asia","currencies":{"VND":{"name":"Vietnamese đồng","symbol":"₫"}},"idd":{"root":"+84","suffixes":[""]},"flag":"🇻🇳","flags":{"png":"https://flagcdn.com/w320/vn.png"},"independent":true}
]
@@ -0,0 +1,175 @@
#错误消息
not.null=* 必须填写
user.jcaptcha.error=验证码错误
user.jcaptcha.expire=验证码已失效
user.not.exists=用户不存在/密码错误
user.password.not.match=用户不存在/密码错误
user.password.retry.limit.count=密码输入错误{0}次
user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟
user.password.delete=对不起,您的账号已被删除
user.blocked=用户已封禁,请联系管理员
role.blocked=角色已封禁,请联系管理员
login.blocked=很遗憾,访问IP已被列入系统黑名单
user.logout.success=退出成功
length.not.valid=长度必须在{min}到{max}个字符之间
user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头
user.password.not.valid=* 5-50个字符
user.email.not.valid=邮箱格式错误
user.mobile.phone.number.not.valid=手机号格式错误
user.login.success=登录成功
user.register.success=注册成功
user.notfound=请重新登录
user.forcelogout=管理员强制退出,请重新登录
user.unknown.error=未知错误,请重新登录
##文件上传消息
upload.exceed.maxSize=上传的文件大小超出限制的文件大小!<br/>允许的文件最大大小是:{0}MB!
upload.filename.exceed.length=上传的文件名最长{0}个字符
##权限
no.permission=您没有数据的权限,请联系管理员添加权限 [{0}]
no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}]
no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}]
no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}]
no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}]
no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}]
##价格模块提示语(price)
# 附加费 PrcSurcharge
price.surcharge.scName.empty=附加费名称不能为空
price.surcharge.chargeType.empty=计费方式不能为空
price.surcharge.chargeValue.empty=计费数值不能为空
price.surcharge.chargeValue.negative=计费数值不能为负数
# 附加费关联 PrcSurchargeRel
price.surchargeRel.scId.empty=附加费ID不能为空
price.surchargeRel.productId.empty=产品ID不能为空
price.surchargeRel.productCode.empty=产品代码不能为空
# 套餐 PrcPriceSet
price.set.notExists=套餐不存在
price.set.name.empty=套餐名称不能为空
price.set.name.exists=套餐名称已存在
price.set.effectiveDate.empty=生效日期不能为空
price.set.date.invalid=生效日期不能晚于失效日期
price.set.discount.range=折扣模式默认折扣需在 1~99
price.set.delete.statusNotAllowed=仅待启用或驳回状态的套餐允许删除:{0}
price.set.delete.boundCustomer=套餐【{0}】已绑定客户,请先解绑后再删除
price.set.submit.statusNotAllowed=当前状态不允许提交审核
price.set.approve.statusNotAllowed=仅审核中的套餐可以生效
price.set.reject.statusNotAllowed=仅审核中的套餐可以驳回
price.set.disable.statusNotAllowed=仅生效中的套餐可停用
price.set.enable.statusNotAllowed=套餐已是生效状态
price.set.edit.audit=审核中的套餐不允许修改
price.set.edit.stopped=已停用的套餐不允许修改,请使用复用新建
price.set.childEdit.audit=审核中的套餐不允许改明细或客户
price.set.childEdit.stopped=已停用的套餐不允许改明细或客户
price.set.detail.notExists=套餐明细不存在
price.set.detail.productCode.empty=明细产品代码不能为空
price.set.detail.country.empty=固定价明细必须填写国家
price.set.detail.weight.empty=固定价明细必须填写重量段
price.set.detail.freight.empty=固定价明细必须填写运费单价
price.set.detail.registration.empty=固定价明细必须填写挂号费
price.set.detail.zone.empty=固定价明细必须选择分区
price.set.detail.roundMode.invalid=取值方式仅支持 UP / DOWN / HALF_UP
price.set.detail.freight.belowBase=套餐运费不能低于导入基准价 {0}
price.set.detail.registration.belowBase=套餐挂号费不能低于导入基准价 {0}
price.set.customer.notExists=客户绑定不存在
price.set.customer.unbindAudit=审核中的套餐不允许解绑客户
price.set.customer.customerId.empty=客户ID不能为空
price.set.customer.beginDate.empty=客户绑定生效日期不能为空
price.set.customer.date.invalid=客户绑定生效日期不能晚于失效日期
price.set.customer.alreadyBound=该客户已绑定套餐,一个客户只能绑定一个套餐
price.set.customer.masterNotFound=客户主数据不存在
price.set.customer.priority.invalid=优先级必须大于等于 1
# 重量段 PrcWeight
price.weight.range.empty=起始重量和结束重量不能为空
price.weight.range.invalid=起始重量必须小于结束重量
# Zone PrcZone (country -> zone -> postcode)
price.zone.import.fileEmpty=上传文件不能为空
price.zone.import.fileType=仅支持 xls / xlsx 文件
price.zone.import.noSheet=未找到可导入的分区 sheet(澳大利亚分区/加拿大偏远附加费/法国MR邮编/日本附加费/英国附加费)
price.zone.import.noData=分区 sheet 无有效邮编/分区数据
price.zone.import.success=导入成功:{0} 个国家,{1} 个分区,{2} 条邮编明细({3})
price.zone.import.unmatched=;未匹配国家已跳过:{0}
price.zone.import.regionNotFound=未在 bms_region 匹配到国家:{0}
price.zone.import.regionEmpty=bms_region 无可用国家数据,请先同步/维护国家表
price.zone.region.notFound=国家不存在或已删除
price.zone.region.required=请选择国家(bms_region)
price.zone.countryCode.empty=国家编码不能为空,请检查 bms_region.country_code_2
# 产品导入 BmsProduct
price.product.codeDate.exists=同一产品代码与生效日期已存在,不能覆盖历史数据
price.product.effectiveDate.empty=生效日期不能为空
price.product.import.effEmpty=缺少生效日期,已跳过
price.product.import.fileEmpty=上传文件不能为空
price.product.import.fileType=仅支持 xls / xlsx 文件
price.product.import.sheetNotFound=未找到「产品目录」sheet,请上传威狮B2C小包价表格格式文件
price.product.import.noData=产品目录无有效数据行
price.product.import.regionEmpty=bms_region 无可用国家数据,请先同步/维护国家表后再导入
price.product.import.partialFail=导入完成但存在失败项:新增 {0},跳过 {1};失败明细:{2}
price.product.import.effTooEarly=生效日期 {0} 早于当前开放版 {1},请使用更晚的生效日期导入
price.product.import.needFeeAlter=请先执行 SQL:bms-back/sql/price/product_country_fee_alter.sql(缺少运费/挂号费字段)
price.product.import.needExpireAlter=请先执行 SQL:bms-back/sql/price/product_country_expire_alter.sql(缺少失效日期/版本唯一键)
price.product.import.needCodeEffUnique=无法新增「同代码、不同生效日」的产品。请先执行 SQL:bms-back/sql/price/product_code_eff_unique_alter.sql(去掉 product_code 单列唯一,改为代码+生效日唯一)
price.product.import.success=导入成功:新增 {0} 个产品,跳过 {1} 个(同代码同生效日不覆盖);写入国家/重量段明细 {2} 行。
price.product.import.success.detail1=产品主数据按「产品代码+生效日期」新增,不覆盖已有记录。国家明细:新生效日晚于上次则保留历史,上次失效日=本次生效日。
price.product.import.success.detail2=范围:产品目录 + 重量段 + 运费/挂号费 + 尺寸/尾程/时效;国家码来自 bms_region。
price.product.import.noSheet=未找到产品明细sheet(需与产品名称一致):{0}
price.product.import.noCountry=产品明细sheet无有效国家/重量段数据:{0}
price.product.import.euEmpty=国家表无欧盟成员(is_eu=1),无法展开「欧盟」
price.product.import.success.unmatched=未匹配国家表(country_code 为空):{0}
price.product.import.countryRequired=请选择目的国家
price.product.import.countryNotFound=国家不存在或已停用:{0}
price.product.import.countrySheetNotFound=未找到「产品目录」sheet,请上传单国专线成本价表
price.product.import.countryNoPrice=未找到该产品的重量段价格:{0}
price.product.import.countrySuccess=按国家导入成功({0}):新增 {1} 个产品,跳过 {2} 个(同代码同生效日不覆盖主数据);写入重量段 {3} 行。
# 报价试算 TmsPriceQuote(对外 TMS API 错误码,保持英文契约)
price.quote.postcodeRequired=该国家/产品有分区,请填写目的邮编
price.quote.postcodeZoneNotFound=邮编未匹配到分区,请核对目的邮编
price.quote.zonePriceNotHit=已匹配分区,但该分区无对应产品重量段价格
price.quote.priceNotHit=没有产品/国家/重量段绑定,暂无价格
price.quote.freightMissing1=产品默认运费为空
price.quote.freightMissing2=产品默认运费或挂号费为空
price.quote.freightMissing3=运费为空
price.quote.requestBodyRequired=请求体为空
price.quote.customerIdRequired=客户ID为空
price.quote.customerCodeRequired=客户代码不能为空
price.quote.customerCodeNotFound=客户代码不存在
price.quote.customerDisabled=客户已停用,不可计费
price.quote.productCodeRequired=产品代码为空
price.quote.countryRequired=国家代码或国家名称为空
price.quote.weightInvalid=重量必须大于0
price.quote.bizDateInvalid=业务日期格式必须为yyyy-MM-dd
price.quote.fixedPackageNoDetails=套餐固定价格没有明细,使用产品默认价格
price.quote.noCustomerPackageOverride=没有客户套餐覆盖,使用产品默认运费/挂号费
price.quote.noCustomerPackage=客户未绑定套餐,无法试算
price.quote.quoteIdRequired=报价ID为空
price.quote.hitCustomerFixedPackageDetail=命中客户套餐固定价格明细
# receivable bill
price.bill.orderNoRequired=订单号为空
price.bill.billIdRequired=计费ID为空
price.bill.notFound=计费记录不存在
price.bill.customerRequired=订单同步缺少有效客户
price.bill.alreadyInArBill=订单{0}已生成应收账单,作废后方可重新计费
price.bill.bizDateRequired=业务日期为空
price.bill.noCustomerPackage=客户未绑定套餐,无法计费
price.bill.fee.scIdRequired=附加费不能为空
price.bill.fee.surchargeNotFound=附加费配置不存在或已停用
price.bill.fee.notFound=费用明细不存在
price.bill.fee.notManual=仅手动增加的费用可编辑或删除
price.bill.fee.alreadyBilled=费用已生成账单,不可编辑或删除
price.bill.fee.idRequired=费用ID不能为空
price.set.version.effectiveTime.empty=版本生效时间不能为空
price.set.version.notExists=套餐版本不存在
price.set.version.activate.statusNotAllowed=仅草稿或待生效版本可设置生效时间
price.set.version.delete.statusNotAllowed=仅草稿版本可删除
price.set.version.copy.draftExists=已有草稿版本,请先启动或删除后再复制
price.set.save.task.notExists=保存任务不存在或已过期
price.set.library.empty=产品库无可用价格明细,请检查产品国家配置
price.set.detail.duplicate.fixed=产品{0} 国家{1} 重量段{2} {3}(共{4}条)
price.set.detail.duplicate.discount=产品{0}(共{1}条)
price.set.detail.duplicate.hasZone=有分区({0})
price.set.detail.duplicate.noZone=无分区
@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 日志存放路径 -->
<property name="log.path" value="${user.dir}/logs" />
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 用户访问日志输出 -->
<appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-user.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.bms" level="info" />
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn" />
<root level="info">
<appender-ref ref="console" />
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info" />
<appender-ref ref="file_error" />
</root>
<!--系统用户操作日志-->
<logger name="sys-user" level="info">
<appender-ref ref="sys-user"/>
</logger>
</configuration>
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 全局参数 -->
<settings>
<!-- 使全局的映射器启用或禁用缓存 -->
<setting name="cacheEnabled" value="true" />
<!-- 允许JDBC 支持自动生成主键 -->
<setting name="useGeneratedKeys" value="true" />
<!-- 配置默认的执行器.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 -->
<setting name="defaultExecutorType" value="SIMPLE" />
<!-- 指定 MyBatis 所用日志的具体实现 -->
<setting name="logImpl" value="SLF4J" />
<!-- 使用驼峰命名法转换字段 -->
<!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
</settings>
</configuration>