3 Commits

Author SHA1 Message Date
TsMask
afbe029a28 Refactor server configuration and update certificate handling
- Changed the NotifyUrl in PostMeasureTaskToNF to use a hardcoded port (33030).
- Updated GetEMSState to retrieve the port from the server configuration instead of the YAML config.
- Removed deprecated RestParam struct and related code from YamlConfig.
- Deleted old certificate files (omc-server.crt, omc-server.key, omc-web.crt, omc-web.key).
- Added new certificate files (www.omc.net.crt, www.omc.net.key) for updated server configuration.
- Modified local/omc.yaml to reflect changes in server configuration and certificate paths.
- Updated main.go to load server configuration instead of rest configuration, ensuring proper handling of multiple HTTP services.
2025-04-27 17:21:55 +08:00
TsMask
80d612c56c Refactor error handling in system and trace controllers
- Updated error response codes for various validation errors from 400 to 422 to better reflect the nature of the errors.
- Changed error messages for empty parameters (e.g., userId, menuId, roleId) to use a consistent error code format.
- Improved error handling in the IPerf, Ping, and WS controllers to provide more informative error messages.
- Ensured that all controllers return appropriate error messages when binding JSON or query parameters fails.
2025-04-27 16:38:19 +08:00
TsMask
56991a0b49 feat: Implement Oauth2 login log service and repository
- Added Oauth2LogLoginService for managing user authorization logs.
- Implemented methods for inserting logs, cleaning logs, and exporting log data.
- Created a new file for Oauth2 login log service.

refactor: Remove unused open_api module

- Deleted the open_api.go file as it was not utilized in the project.

fix: Update error codes in SysProfileController

- Changed error codes for binding errors and user authentication errors to more descriptive values.

fix: Update cache handling in SysConfig and SysDictType services

- Modified Redis set operations to include expiration time for cached values.

refactor: Update middleware authorization checks

- Replaced PreAuthorize middleware with AuthorizeUser across multiple routes in system and tool modules for consistency.

chore: Clean up trace and ws modules

- Updated middleware authorization in trace and ws modules to use AuthorizeUser.
2025-04-27 11:07:34 +08:00
142 changed files with 2985 additions and 1531 deletions

View File

@@ -0,0 +1,24 @@
-- ----------------------------
-- Table structure for oauth2_client
-- ----------------------------
DROP TABLE IF EXISTS "oauth2_client";
CREATE TABLE "oauth2_client" (
"id" integer NOT NULL,
"client_id" text(32) NOT NULL,
"client_secret" text(64) NOT NULL,
"title" text(64),
"ip_white" text(255),
"del_flag" text(1),
"login_ip" text(128),
"login_time" integer,
"create_by" text(64),
"create_time" integer,
"update_by" text(64),
"update_time" integer,
"remark" text(200),
PRIMARY KEY ("id")
);
-- ----------------------------
-- Records of oauth2_client
-- ----------------------------

View File

@@ -0,0 +1,20 @@
-- ----------------------------
-- Table structure for oauth2_log_login
-- ----------------------------
DROP TABLE IF EXISTS "oauth2_log_login";
CREATE TABLE "oauth2_log_login" (
"id" integer NOT NULL,
"client_id" text(32),
"login_ip" text(128),
"login_location" text(32),
"browser" text(64),
"os" text(64),
"status_flag" text(1),
"msg" text(255),
"login_time" integer,
PRIMARY KEY ("id")
);
-- ----------------------------
-- Records of oauth2_log_login
-- ----------------------------

View File

@@ -613,7 +613,7 @@ INSERT INTO "sys_i18n" VALUES (543, 'dictData.cdr_sip_code.503', '服务不可
INSERT INTO "sys_i18n" VALUES (544, 'dictData.cdr_sip_code.504', '服务器超时', 'Server Time Out');
INSERT INTO "sys_i18n" VALUES (545, 'dictData.cdr_sip_code.603', '拒绝', 'Decline');
INSERT INTO "sys_i18n" VALUES (546, 'dictData.cdr_sip_code.606', '不可接受', 'Not Acceptable');
INSERT INTO "sys_i18n" VALUES (547, 'cache.name.user', '登录用户', 'Login User');
INSERT INTO "sys_i18n" VALUES (547, 'cache.name.token', '用户令牌', 'User Token');
INSERT INTO "sys_i18n" VALUES (548, 'cache.name.sys_config', '参数管理', 'Parameters Management');
INSERT INTO "sys_i18n" VALUES (549, 'cache.name.sys_dict', '字典管理', 'Dictionary Management');
INSERT INTO "sys_i18n" VALUES (550, 'cache.name.captcha_codes', '验证码', 'Captcha');
@@ -708,6 +708,8 @@ View network element configuration backup records for downloading or importing c
INSERT INTO "sys_i18n" VALUES (637, 'job.backup_export_table_sys_log_operate', '备份-操作日志表定期导出', 'Backup-Operation Log Table Periodic Export');
INSERT INTO "sys_i18n" VALUES (638, 'job.backup_export_table_cdr_event_ims', '备份-语音话单表定期导出', 'Backup-Regular Export of voice bill forms');
INSERT INTO "sys_i18n" VALUES (639, 'job.backup_export_table_cdr_event_smf', '备份-数据话单表定期导出', 'Backup-Regular Export of data sheet tables');
INSERT INTO "sys_i18n" VALUES (640, 'cache.name.oauth2_codes', '客户端授权码', 'Oauth2 Client Code');
INSERT INTO "sys_i18n" VALUES (641, 'cache.name.oauth2_devices', '客户端令牌', 'Oauth2 Token');
INSERT INTO "sys_i18n" VALUES (644, 'menu.log.exportFile', '导出文件', 'Exported File');
INSERT INTO "sys_i18n" VALUES (645, 'menu.perf.kpiCReport', '自定义指标数据', 'Custom Indicator Data');
INSERT INTO "sys_i18n" VALUES (646, 'menu.trace.taskHLR', 'HLR 跟踪任务', 'HLR Trace Task');
@@ -751,6 +753,7 @@ alertHours upcoming expiration reminder time');
INSERT INTO "sys_i18n" VALUES (674, 'config.sys.user.passwdNotAllowedHistory', '用户管理-不允许使用最近密码次数', 'User Management-Not Allowed Recent Passwords');
INSERT INTO "sys_i18n" VALUES (675, 'config.sys.user.passwdNotAllowedHistoryRemark', '创建新密码不等于之前使用的x次中的密码', 'Creating a new password that is not equal to the previously used password in x times');
INSERT INTO "sys_i18n" VALUES (676, 'login.errPasswdHistory', '不允许使用最近密码', 'Recent passwords not allowed');
INSERT INTO "sys_i18n" VALUES (677, 'log.operate.title.oauth2client', 'Oauth2客户端授权', 'Oauth2 Client Authorization');
INSERT INTO "sys_i18n" VALUES (679, 'dictType.trace_msg_type', '跟踪消息类型', 'Trace Message Type');
INSERT INTO "sys_i18n" VALUES (680, 'dictData.trace_msg_type.0', '请求', 'Request');
INSERT INTO "sys_i18n" VALUES (681, 'dictData.trace_msg_type.1', '响应', 'Response');

View File

@@ -0,0 +1,27 @@
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for oauth2_client
-- ----------------------------
DROP TABLE IF EXISTS `oauth2_client`;
CREATE TABLE `oauth2_client` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '应用ID',
`client_id` varchar(32) COLLATE utf8mb4_general_ci NOT NULL COMMENT '应用的唯一标识',
`client_secret` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '应用的凭证秘钥',
`title` varchar(64) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '应用名称',
`ip_white` varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'IP白名单',
`del_flag` varchar(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记0存在 1删除',
`login_ip` varchar(128) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '最后登录IP',
`login_time` bigint DEFAULT '0' COMMENT '最后登录时间',
`create_by` varchar(64) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',
`create_time` bigint DEFAULT '0' COMMENT '创建时间',
`update_by` varchar(64) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',
`update_time` bigint DEFAULT '0' COMMENT '更新时间',
`remark` varchar(200) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='第三方_用户授权应用表';
SET FOREIGN_KEY_CHECKS = 1;
-- Dump completed on 2025-04-25 15:26:56

View File

@@ -0,0 +1,23 @@
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for oauth2_log_login
-- ----------------------------
DROP TABLE IF EXISTS `oauth2_log_login`;
CREATE TABLE `oauth2_log_login` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '登录ID',
`client_id` varchar(32) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '应用的唯一标识',
`login_ip` varchar(128) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '登录IP地址',
`login_location` varchar(32) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '登录地点',
`browser` varchar(64) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '浏览器类型',
`os` varchar(64) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '操作系统',
`status_flag` varchar(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '登录状态0失败 1成功',
`msg` varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '提示消息',
`login_time` bigint DEFAULT '0' COMMENT '登录时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='第三方_用户授权应用登录日志表';
SET FOREIGN_KEY_CHECKS = 1;
-- Dump completed on 2025-04-25 15:26:56

View File

@@ -561,7 +561,7 @@ INSERT INTO `sys_i18n` VALUES (543, 'dictData.cdr_sip_code.503', '服务不可
INSERT INTO `sys_i18n` VALUES (544, 'dictData.cdr_sip_code.504', '服务器超时', 'Server Time Out');
INSERT INTO `sys_i18n` VALUES (545, 'dictData.cdr_sip_code.603', '拒绝', 'Decline');
INSERT INTO `sys_i18n` VALUES (546, 'dictData.cdr_sip_code.606', '不可接受', 'Not Acceptable');
INSERT INTO `sys_i18n` VALUES (547, 'cache.name.user', '登录用户', 'Login User');
INSERT INTO `sys_i18n` VALUES (547, 'cache.name.token', '用户令牌', 'User Token');
INSERT INTO `sys_i18n` VALUES (548, 'cache.name.sys_config', '参数管理', 'Parameters Management');
INSERT INTO `sys_i18n` VALUES (549, 'cache.name.sys_dict', '字典管理', 'Dictionary Management');
INSERT INTO `sys_i18n` VALUES (550, 'cache.name.captcha_codes', '验证码', 'Captcha');
@@ -654,8 +654,8 @@ INSERT INTO `sys_i18n` VALUES (636, 'job.ne_config_backup_remark', '网元配置
INSERT INTO `sys_i18n` VALUES (637, 'job.backup_export_table_sys_log_operate', '备份-操作日志表定期导出', 'Backup-Operation Log Table Periodic Export');
INSERT INTO `sys_i18n` VALUES (638, 'job.backup_export_table_cdr_event_ims', '备份-语音话单表定期导出', 'Backup-Regular Export of voice bill forms');
INSERT INTO `sys_i18n` VALUES (639, 'job.backup_export_table_cdr_event_smf', '备份-数据话单表定期导出', 'Backup-Regular Export of data sheet tables');
-- INSERT INTO `sys_i18n` VALUES (640, 'table.sys_log_operate', '操作日志', 'Operation Log');
-- INSERT INTO `sys_i18n` VALUES (641, 'table.cdr_event_ims', '语音话单', 'Voice CDR');
INSERT INTO `sys_i18n` VALUES (640, 'cache.name.oauth2_codes', '客户端授权码', 'Oauth2 Client Code');
INSERT INTO `sys_i18n` VALUES (641, 'cache.name.oauth2_devices', '客户端令牌', 'Oauth2 Token');
-- INSERT INTO `sys_i18n` VALUES (642, 'table.cdr_event_smf', '数据话单', 'Data CDR');
-- INSERT INTO `sys_i18n` VALUES (643, 'table.cdr_event_smsc', '短信话单', 'SMS CDR');
INSERT INTO `sys_i18n` VALUES (644, 'menu.log.exportFile', '导出文件', 'Exported File');
@@ -691,7 +691,7 @@ INSERT INTO `sys_i18n` VALUES (673, 'config.sys.user.passwdExpireRemark', '数
INSERT INTO `sys_i18n` VALUES (674, 'config.sys.user.passwdNotAllowedHistory', '用户管理-不允许使用最近密码次数', 'User Management-Not Allowed Recent Passwords');
INSERT INTO `sys_i18n` VALUES (675, 'config.sys.user.passwdNotAllowedHistoryRemark', '创建新密码不等于之前使用的x次中的密码', 'Creating a new password that is not equal to the previously used password in x times');
INSERT INTO `sys_i18n` VALUES (676, 'login.errPasswdHistory', '不允许使用最近密码', 'Recent passwords not allowed');
-- INSERT INTO `sys_i18n` VALUES (677, 'config.ne.neConfigBackupFTP', '配置文件备份FTP服务', 'NE Config Backup file FTP service');
INSERT INTO `sys_i18n` VALUES (677, 'log.operate.title.oauth2client', 'Oauth2客户端授权', 'Oauth2 Client Authorization');
-- INSERT INTO `sys_i18n` VALUES (678, 'config.ne.neConfigBackupFTPRemark', '请通过配置文件备份页面进行设置FTP信息', 'Please set the FTP information through the configuration file backup page.');
INSERT INTO `sys_i18n` VALUES (679, 'dictType.trace_msg_type', '跟踪消息类型', 'Trace Message Type');
INSERT INTO `sys_i18n` VALUES (680, 'dictData.trace_msg_type.0', '请求', 'Request');

View File

@@ -1,10 +1,82 @@
# server version: std/lite
serverVersion: "std"
# operation mode system/docker
# serverMode: "system"
# login authentication, default true
# serverLoginAuth: true
# interface encryption, default false
# serverCryptoApi: false
# database for server version
# service listen ipv4/v6 and port, support multiple routines
# ip: 0.0.0.0 or ::0, support IPv4/v6
server:
- ipv4: 0.0.0.0
ipv6: ""
port: 33030
schema: http
- ipv4: 0.0.0.0
ipv6: ""
port: 33443
schema: https
certFile: /usr/local/etc/omc/certs/www.omc.net.crt
keyFile: /usr/local/etc/omc/certs/www.omc.net.key
# web service configuration
# if you are using nginx to take over, you can disable the
webServer:
enabled: true
rootDir: /usr/local/etc/omc/web
listen:
- addr: 0.0.0.0:80
schema: http
- addr: 0.0.0.0:443
schema: https
certFile: /usr/local/etc/omc/certs/www.omc.net.crt
keyFile: /usr/local/etc/omc/certs/www.omc.net.key
# track configuration for NE
trace:
enabled: false
host: "172.16.5.100" # fill in the specific IP address
port: 33033
# data source
database:
# default data source name
defaultDataSourceName: "std"
# dataSource:
# # std: standard
# std:
# type: "mysql"
# host: "127.0.0.1"
# port: 3306
# username: "<username>"
# password: "<password>"
# database: "<database>"
# logging: false
# # lite: lite
# lite:
# type: "sqlite"
# database: "<database path>"
# logging: false
# redis cached data
redis:
# default data source name
defaultDataSourceName: "default"
# dataSource:
# default:
# port: 6379 # port
# host: "127.0.0.1" # host
# password: "<password>"
# db: 10 # db_num
# file: log file name
# level: /trace/debug/info/warn/error/fatal, default: debug
# duration: rotation time with xx hours, example: 1/12/24 hours
@@ -15,31 +87,6 @@ logger:
duration: 24
count: 90
# rest agent listen ipv4/v6 and port, support multiple routines
# ip: 0.0.0.0 or ::0, support IPv4/v6
rest:
- ipv4: 0.0.0.0
ipv6: ""
port: 33030
schema: http
- ipv4: 0.0.0.0
ipv6: ""
port: 33443
schema: https
certFile: /usr/local/etc/omc/certs/omc-server.crt
keyFile: /usr/local/etc/omc/certs/omc-server.key
webServer:
enabled: true
rootDir: /usr/local/etc/omc/web
listen:
- addr: 0.0.0.0:80
schema: http
- addr: 0.0.0.0:443
schema: https
certFile: /usr/local/etc/omc/certs/omc-web.crt
keyFile: /usr/local/etc/omc/certs/omc-web.key
# sleep: time delay for after write buffer (millisecond)
# deadLine: timeout for io read and write (second)
mml:
@@ -50,12 +97,6 @@ mml:
bufferSize: 65535
mmlHome: ./mmlhome
# Tracking configuration
trace:
enabled: false
host: "172.16.5.100" # Fill in the specific IP address
port: 33033
# NE config
ne:
user: omcuser

View File

@@ -11,19 +11,19 @@ func Register(r *gin.RouterGroup) {
{
var o *ConfigOMC
cmOMC.GET("/config/:paramName",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
o.Get,
)
cmOMC.POST("/config/:paramName",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
o.Post,
)
cmOMC.PUT("/config/:paramName",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
o.Put,
)
cmOMC.DELETE("/config/:paramName",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
o.Delete,
)
}

View File

@@ -12,7 +12,7 @@ func Register(r *gin.RouterGroup) {
{
var m *SysJob
lmTable.GET("/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
m.GetFileExportTable,
)
}
@@ -20,19 +20,19 @@ func Register(r *gin.RouterGroup) {
{
var f *FileExport
lmFile.GET("/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
f.GetFileList,
)
lmFile.GET("/total",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
f.Total,
)
lmFile.GET("/:fileName",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
f.DownloadHandler,
)
lmFile.DELETE("/:fileName",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
f.Delete,
)
}

View File

@@ -11,15 +11,15 @@ func Register(r *gin.RouterGroup) {
{
var f *FileNBI
fileNBI.GET("/:category/:type/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
f.GetFileList,
)
fileNBI.GET("/:category/:type/:dateIndex",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
f.GetSingleFileHandler,
)
fileNBI.GET("/:category/:type",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
f.GetMultiFileHandler,
)
}

View File

@@ -12,31 +12,31 @@ func Register(r *gin.RouterGroup) {
{
var k *KpiCReport
pmKPIC.GET("/report",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
k.GetReport2FE,
)
pmKPIC.GET("/report/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
k.Get,
)
pmKPIC.GET("/report/totalList",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
k.Total,
)
pmKPIC.GET("/report/total",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
k.Total,
)
pmKPIC.POST("/report",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
k.Post,
)
pmKPIC.PUT("/report/:id",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
k.Put,
)
pmKPIC.DELETE("/report/:id",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
k.Delete,
)
}

View File

@@ -12,27 +12,27 @@ func Register(r *gin.RouterGroup) {
{
var k *KpiCTitle
pmKPIC.GET("/title",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
k.Get,
)
pmKPIC.GET("/title/total",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
k.Total,
)
pmKPIC.GET("/title/totalList",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
k.GetToalList,
)
pmKPIC.POST("/title",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
k.Post,
)
pmKPIC.PUT("/title/:id",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
k.Put,
)
pmKPIC.DELETE("/title/:id",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
k.Delete,
)
}

View File

@@ -692,7 +692,7 @@ func PostMeasureTaskToNF(w http.ResponseWriter, r *http.Request) {
}
log.Debug("ips:", ips)
measureTask.NotifyUrl = global.SetNotifyUrl(ips[0], config.GetYamlConfig().Rest[0].Port, fmt.Sprintf(MeasureReportFmt, neType))
measureTask.NotifyUrl = global.SetNotifyUrl(ips[0], 33030, fmt.Sprintf(MeasureReportFmt, neType))
log.Debug("Measure Task to NF:", measureTask)
if len(task.NeIds) == 0 {

View File

@@ -21,6 +21,7 @@ import (
cfg "be.ems/src/framework/config"
"be.ems/src/framework/constants"
"be.ems/src/framework/database/db"
"be.ems/src/framework/utils/parse"
)
type CpuUsage struct {
@@ -914,7 +915,15 @@ func GetEMSState(ip string) *SysState {
if expiryDateStr == "" {
expiryDateStr = "-"
}
var port uint16 = 33030
httpArr := cfg.Get("server")
if httpArr != nil {
arr := httpArr.([]any)
if len(arr) > 1 {
rest := arr[0].(map[string]any)
port = uint16(parse.Number(rest["port"]))
}
}
hostName, _ := os.Hostname()
dbInfo := getDbInfo()
emsState := &SysState{
@@ -922,7 +931,7 @@ func GetEMSState(ip string) *SysState {
OsInfo: getUnameStr(),
DbInfo: dbInfo,
IpAddr: ipAddrs,
Port: config.GetYamlConfig().Rest[0].Port,
Port: port,
Version: global.Version,
Capability: CapabilityInt,
SerialNum: snStr,

View File

@@ -22,39 +22,6 @@ type YamlConfig struct {
Count int `yaml:"count"`
} `yaml:"logger"`
Pprof struct {
Enabled bool `yaml:"enabled"`
Addr string `yaml:"addr"`
} `yaml:"pprof"`
// Rest []struct {
// IPv4 string `yaml:"ipv4"`
// IPv6 string `yaml:"ipv6"`
// Port uint16 `yaml:"port"`
// Scheme string `yaml:"scheme"`
// ClientAuthType int `yaml:"clientAuthType"`
// CaFile string `yaml:"caFile"`
// CertFile string `yaml:"certFile"`
// KeyFile string `yaml:"keyFile"`
// } `yaml:"rest"`
Rest []RestParam
WebServer struct {
Enabled bool `yaml:"enabled"`
RootDir string `yaml:"rootDir"`
Listen []struct {
Addr string `yaml:"addr"`
Scheme string `yaml:"scheme"`
ClientAuthType int `yaml:"clientAuthType"`
CaFile string `yaml:"caFile"`
CertFile string `yaml:"certFile"`
KeyFile string `yaml:"keyFile"`
} `yaml:"listen"`
} `yaml:"webServer"`
// Database DbConfig `yaml:"database"`
OMC struct {
UriPrefix string `yaml:"uriPrefix"`
NeType string `yaml:"neType"`
@@ -128,17 +95,6 @@ type YamlConfig struct {
} `yaml:"testConfig"`
}
type RestParam struct {
IPv4 string `yaml:"ipv4"`
IPv6 string `yaml:"ipv6"`
Port uint16 `yaml:"port"`
Scheme string `yaml:"scheme,omitempty" default:"http"`
ClientAuthType int `yaml:"clientAuthType"`
CaFile string `yaml:"caFile"`
CertFile string `yaml:"certFile"`
KeyFile string `yaml:"keyFile"`
}
// type DbConfig struct {
// Type string `yaml:"type"`
// User string `yaml:"user"`
@@ -486,23 +442,6 @@ func GetDefaultUserAgent() string {
return "OMC/" + global.Version
}
func GetOMCHostUrl() string {
var omcip string = "127.0.0.1"
var rest RestParam = yamlConfig.Rest[0]
var port uint16 = rest.Port
if rest.IPv4 != "0.0.0.0" && rest.IPv4 != "" {
omcip = rest.IPv4
} else if rest.IPv6 != "::" && rest.IPv6 != "" {
omcip = "[" + rest.IPv6 + "]"
}
var scheme string = "http"
if rest.Scheme != "" {
scheme = rest.Scheme
}
return fmt.Sprintf("%s://%s:%d", scheme, omcip, port)
}
// const defaultConfigFile = "./etc/restconf.yaml"
// func init() {

View File

@@ -13,7 +13,6 @@ import (
"be.ems/src/framework/constants"
"be.ems/src/framework/token"
"github.com/gorilla/mux"
"golang.org/x/text/language"
)
// GetParam 地址栏参数{id}
@@ -147,63 +146,33 @@ func Authorization(r *http.Request) string {
return arr[1]
}
// AcceptLanguage 解析客户端接收语言 zh中文 en: 英文
func AcceptLanguage(r *http.Request) string {
preferredLanguage := language.English
// Query请求查询
if v := GetQuery(r, "language"); v != "" {
tags, _, _ := language.ParseAcceptLanguage(v)
if len(tags) > 0 {
preferredLanguage = tags[0]
}
}
// Header请求头
if v := GetHeader(r, "Accept-Language"); v != "" {
tags, _, _ := language.ParseAcceptLanguage(v)
if len(tags) > 0 {
preferredLanguage = tags[0]
}
}
// 只取前缀
lang := preferredLanguage.String()
arr := strings.Split(lang, "-")
return arr[0]
}
// ContextKey 定义自定义类型作为键
type ContextKey string
// LoginUser 登录用户信息需要Authorize中间件
func LoginUser(r *http.Request) (token.TokenInfo, error) {
func LoginUser(r *http.Request) (token.UserInfo, error) {
// 获取请求头标识信息
tokenStr := Authorization(r)
if tokenStr == "" {
return token.TokenInfo{}, fmt.Errorf("not token info")
return token.UserInfo{}, fmt.Errorf("not token info")
}
if tokenStr == "" {
return token.UserInfo{}, fmt.Errorf("authorization token is empty")
}
// 验证令牌
claims, err := token.Verify(tokenStr)
claims, err := token.UserTokenVerify(tokenStr, "access")
if err != nil {
return token.TokenInfo{}, fmt.Errorf("token verify fail")
return token.UserInfo{}, err
}
// 获取缓存的用户信息
loginUser := token.Info(claims)
if loginUser.UserId <= 0 {
return token.TokenInfo{}, fmt.Errorf("not user info")
info := token.UserInfoGet(claims)
if info.UserId <= 0 {
return token.UserInfo{}, fmt.Errorf("invalid login user information")
}
return loginUser, nil
}
// LoginUserToUserID 登录用户信息-用户ID
func LoginUserToUserID(r *http.Request) int64 {
loginUser, err := LoginUser(r)
if err != nil {
return 0
}
return loginUser.UserId
return info, nil
}
// LoginUserToUserName 登录用户信息-用户名称

View File

@@ -1,8 +1,10 @@
package services
import "be.ems/src/framework/resp"
const (
CODE_FAIL = 0
CODE_SUCC = 1
CODE_FAIL = resp.CODE_ERROR
CODE_SUCC = resp.CODE_SUCCESS
)
func ErrResp(msg string) map[string]any {

View File

@@ -1,23 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIUJLpIo8eueW/in9CvXZdr3oAVVJwwDQYJKoZIhvcNAQEL
BQAwcjELMAkGA1UEBhMCQVUxDDAKBgNVBAgMA09NQzERMA8GA1UEBwwIT01DLVRl
YW0xITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEMMAoGA1UECwwD
T01DMREwDwYDVQQDDAhPTUMtVGVhbTAeFw0yNTAzMTQwNzQ2MTNaFw0yNjAzMTQw
NzQ2MTNaMHIxCzAJBgNVBAYTAkFVMQwwCgYDVQQIDANPTUMxETAPBgNVBAcMCE9N
Qy1UZWFtMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDDAKBgNV
BAsMA09NQzERMA8GA1UEAwwIT01DLVRlYW0wggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQDbSyUIbKefOlKStnr+rRwVlkr1IXdMsXmmEV9zoapXDz4j4N0H
9pzEkpwvxbP+r5186CfKzueHBNc7HWinm4wSCDR6exaxG3YGODxMuLnKGPtG2tml
XBf7USeiMGNKYEF/KWmjjIPw4/9P+6qdIuneX7i0AdGynJI+3JPDT8Iwky2Cm5B4
LRJTSJMfHO0ayrWPDoUCvKIst8w9GkFLjsbZU+AppjWj0rYWc04Oci7zqoUiFeBh
mnQKbCVrlZ4i2CKwgfuxQV2ieSkQ0QoTAXDjocrL/mRmnpvoH0jB2np3OfVlEPBP
pR4q71vuUNkra/F4zPQRPUlqemfo8+4/k3TPAgMBAAGjUzBRMB0GA1UdDgQWBBTN
+1JjU2yWzQMeSMzS5HItc4WMHDAfBgNVHSMEGDAWgBTN+1JjU2yWzQMeSMzS5HIt
c4WMHDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBZV5RfuZ2R
0Nhs05apqwFFg8k0vJ26KMXr0i6YnlKpksEYqjXqmB58qHze6sOy7h3248FyTFlC
5YWWwwOAMiPjiH4NKMnqTthdUA4kiZiGs92jB4U/GS3lHTpsXzNssvQ8Dys7zKoj
HxnJlYpT8F6/waPPRakuP657BAVux5aAloRtqd6kGV3Donp4DwEmhdZpn6Q12igw
/+m1e9Xhxiv++H+OXzTXLerQOuUkTzKw7Ajj3hY93SeX6DOONMmoyuV1undxbvWp
lVZXo9iTGfrMkiyKF75LUyBRvvd7K5MVXJwxu0l5rvnpn6/aO1+2BUCf1ldd9VEw
DSbfrW2FfOmc
-----END CERTIFICATE-----

View File

@@ -1,28 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDbSyUIbKefOlKS
tnr+rRwVlkr1IXdMsXmmEV9zoapXDz4j4N0H9pzEkpwvxbP+r5186CfKzueHBNc7
HWinm4wSCDR6exaxG3YGODxMuLnKGPtG2tmlXBf7USeiMGNKYEF/KWmjjIPw4/9P
+6qdIuneX7i0AdGynJI+3JPDT8Iwky2Cm5B4LRJTSJMfHO0ayrWPDoUCvKIst8w9
GkFLjsbZU+AppjWj0rYWc04Oci7zqoUiFeBhmnQKbCVrlZ4i2CKwgfuxQV2ieSkQ
0QoTAXDjocrL/mRmnpvoH0jB2np3OfVlEPBPpR4q71vuUNkra/F4zPQRPUlqemfo
8+4/k3TPAgMBAAECggEACunzfuGBeiWPRH6md77/0yc2tc/OPdfmA64rqk0/yrNs
gUvzVC524OWhtlLy7AMA0IhGqrZKGZMpGb0TSfwuKBuWbl4VOV1Hg3Rls9/MXKg0
9p11EDYZeh2GM8aQD9HjO0PsCQK48lKL5gbSwp1L4bsGg0Galna/ueHad3GkatcL
aSlFnnvzk4glAxT093F43lAxS463iPX7ueG/2322z0Ib+c6wGEFRcoYNI0/2Ax/u
6UdWxuHUs+7gDLcVa9FN7vx1UBoqAu49WlCfmtvzDTDyK7xLWlvKCx3O8uSLv4aw
/YMRg/yTulUj0dqIUcs/u/UN6AJc8Xk0H+rTpTfgcQKBgQDyq+FFvtG2xm2Ig0/9
BLRdXPM4VgyokPxOL+j9H7LJfrjdz0cnGEuoOfBT8hDX2zFgC6dqAESSnAbPVQJP
6PaYJ8UtOWhwNUAfpRlid1/Y3iDRHWOirjeMKZRh6xN95m21FVbJUg6LfxTf8HWA
OgNwPsfjPL1Jdinw+OX++EvTBwKBgQDnVo5vRBqnLJl85Q7WXQFqjW9j7S1P8ZVL
JmAyNHlpdaNCF2VD164qDQEAi2FDLeDgV5UnAxOeDh/0Z0a3ncp8QLUkwqksBqwa
dhsUF5Jf0Dy3EjiP2w6FsTYanKGuTtV44ovlFTtXL1SSn2ijMVS17YmJgz6LhJbE
wvry6Vd1+QKBgAN7/k8PD1nNfZMhN4vNfn18sS1U5vegpU7GF1VTGDEWdbcRm9bu
3V87/bxm1GEVD59ua2f1OwbT4LEnalIVaT0EDSu6EErUKOiLaVLlneWyQsxd3Klg
UQHdMvk4892x6k9YUBex6u2L1JPmkvlVW+lHrX0QyTL91FpWaI8Bp60PAoGBAMR/
hh7Gl2kWfg1TNyYn+9L47fvP8yQrjOc3YpBieBp2/MRfwPk+U0aOoyJGQchhSNjm
K9/mQhyH3Oapbqz6j4q5H+RooG+v/zG+zkNjvkY6R8gs5vRyWkR/APjbwI2hkrvK
mo9sWGo23rxoQOYVOeIKMUAnxdGWPsZE5Am+4DZpAoGBAJAF8MP5SlNRSF6zM3Lw
Qf5CQjsyXhll+A/ueOf1iQ+8r7xdxa6dNtcTcOZVVDsbXIBJ4/3HGTLfQCcGrhLN
KK9wljtkiYJ0h6IqcXnhp69uRV4SKRInyVEjNkiBotBPu5y6CYz5MAXFdM87q7jO
ehVc6QGJ9vLnfnwEFbAMArmv
-----END PRIVATE KEY-----

View File

@@ -1,23 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIUJLpIo8eueW/in9CvXZdr3oAVVJwwDQYJKoZIhvcNAQEL
BQAwcjELMAkGA1UEBhMCQVUxDDAKBgNVBAgMA09NQzERMA8GA1UEBwwIT01DLVRl
YW0xITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEMMAoGA1UECwwD
T01DMREwDwYDVQQDDAhPTUMtVGVhbTAeFw0yNTAzMTQwNzQ2MTNaFw0yNjAzMTQw
NzQ2MTNaMHIxCzAJBgNVBAYTAkFVMQwwCgYDVQQIDANPTUMxETAPBgNVBAcMCE9N
Qy1UZWFtMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDDAKBgNV
BAsMA09NQzERMA8GA1UEAwwIT01DLVRlYW0wggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQDbSyUIbKefOlKStnr+rRwVlkr1IXdMsXmmEV9zoapXDz4j4N0H
9pzEkpwvxbP+r5186CfKzueHBNc7HWinm4wSCDR6exaxG3YGODxMuLnKGPtG2tml
XBf7USeiMGNKYEF/KWmjjIPw4/9P+6qdIuneX7i0AdGynJI+3JPDT8Iwky2Cm5B4
LRJTSJMfHO0ayrWPDoUCvKIst8w9GkFLjsbZU+AppjWj0rYWc04Oci7zqoUiFeBh
mnQKbCVrlZ4i2CKwgfuxQV2ieSkQ0QoTAXDjocrL/mRmnpvoH0jB2np3OfVlEPBP
pR4q71vuUNkra/F4zPQRPUlqemfo8+4/k3TPAgMBAAGjUzBRMB0GA1UdDgQWBBTN
+1JjU2yWzQMeSMzS5HItc4WMHDAfBgNVHSMEGDAWgBTN+1JjU2yWzQMeSMzS5HIt
c4WMHDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBZV5RfuZ2R
0Nhs05apqwFFg8k0vJ26KMXr0i6YnlKpksEYqjXqmB58qHze6sOy7h3248FyTFlC
5YWWwwOAMiPjiH4NKMnqTthdUA4kiZiGs92jB4U/GS3lHTpsXzNssvQ8Dys7zKoj
HxnJlYpT8F6/waPPRakuP657BAVux5aAloRtqd6kGV3Donp4DwEmhdZpn6Q12igw
/+m1e9Xhxiv++H+OXzTXLerQOuUkTzKw7Ajj3hY93SeX6DOONMmoyuV1undxbvWp
lVZXo9iTGfrMkiyKF75LUyBRvvd7K5MVXJwxu0l5rvnpn6/aO1+2BUCf1ldd9VEw
DSbfrW2FfOmc
-----END CERTIFICATE-----

View File

@@ -1,28 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDbSyUIbKefOlKS
tnr+rRwVlkr1IXdMsXmmEV9zoapXDz4j4N0H9pzEkpwvxbP+r5186CfKzueHBNc7
HWinm4wSCDR6exaxG3YGODxMuLnKGPtG2tmlXBf7USeiMGNKYEF/KWmjjIPw4/9P
+6qdIuneX7i0AdGynJI+3JPDT8Iwky2Cm5B4LRJTSJMfHO0ayrWPDoUCvKIst8w9
GkFLjsbZU+AppjWj0rYWc04Oci7zqoUiFeBhmnQKbCVrlZ4i2CKwgfuxQV2ieSkQ
0QoTAXDjocrL/mRmnpvoH0jB2np3OfVlEPBPpR4q71vuUNkra/F4zPQRPUlqemfo
8+4/k3TPAgMBAAECggEACunzfuGBeiWPRH6md77/0yc2tc/OPdfmA64rqk0/yrNs
gUvzVC524OWhtlLy7AMA0IhGqrZKGZMpGb0TSfwuKBuWbl4VOV1Hg3Rls9/MXKg0
9p11EDYZeh2GM8aQD9HjO0PsCQK48lKL5gbSwp1L4bsGg0Galna/ueHad3GkatcL
aSlFnnvzk4glAxT093F43lAxS463iPX7ueG/2322z0Ib+c6wGEFRcoYNI0/2Ax/u
6UdWxuHUs+7gDLcVa9FN7vx1UBoqAu49WlCfmtvzDTDyK7xLWlvKCx3O8uSLv4aw
/YMRg/yTulUj0dqIUcs/u/UN6AJc8Xk0H+rTpTfgcQKBgQDyq+FFvtG2xm2Ig0/9
BLRdXPM4VgyokPxOL+j9H7LJfrjdz0cnGEuoOfBT8hDX2zFgC6dqAESSnAbPVQJP
6PaYJ8UtOWhwNUAfpRlid1/Y3iDRHWOirjeMKZRh6xN95m21FVbJUg6LfxTf8HWA
OgNwPsfjPL1Jdinw+OX++EvTBwKBgQDnVo5vRBqnLJl85Q7WXQFqjW9j7S1P8ZVL
JmAyNHlpdaNCF2VD164qDQEAi2FDLeDgV5UnAxOeDh/0Z0a3ncp8QLUkwqksBqwa
dhsUF5Jf0Dy3EjiP2w6FsTYanKGuTtV44ovlFTtXL1SSn2ijMVS17YmJgz6LhJbE
wvry6Vd1+QKBgAN7/k8PD1nNfZMhN4vNfn18sS1U5vegpU7GF1VTGDEWdbcRm9bu
3V87/bxm1GEVD59ua2f1OwbT4LEnalIVaT0EDSu6EErUKOiLaVLlneWyQsxd3Klg
UQHdMvk4892x6k9YUBex6u2L1JPmkvlVW+lHrX0QyTL91FpWaI8Bp60PAoGBAMR/
hh7Gl2kWfg1TNyYn+9L47fvP8yQrjOc3YpBieBp2/MRfwPk+U0aOoyJGQchhSNjm
K9/mQhyH3Oapbqz6j4q5H+RooG+v/zG+zkNjvkY6R8gs5vRyWkR/APjbwI2hkrvK
mo9sWGo23rxoQOYVOeIKMUAnxdGWPsZE5Am+4DZpAoGBAJAF8MP5SlNRSF6zM3Lw
Qf5CQjsyXhll+A/ueOf1iQ+8r7xdxa6dNtcTcOZVVDsbXIBJ4/3HGTLfQCcGrhLN
KK9wljtkiYJ0h6IqcXnhp69uRV4SKRInyVEjNkiBotBPu5y6CYz5MAXFdM87q7jO
ehVc6QGJ9vLnfnwEFbAMArmv
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,33 @@
-----BEGIN CERTIFICATE-----
MIIFqzCCA5OgAwIBAgIUd84SMrVmGfyUArN/y78WQY518DIwDQYJKoZIhvcNAQEL
BQAwZTELMAkGA1UEBhMCQ04xDDAKBgNVBAgMAzVHQzEMMAoGA1UEBwwDNUdDMREw
DwYDVQQKDAhPTUMtVGVhbTERMA8GA1UECwwIT01DLVRlYW0xFDASBgNVBAMMC3d3
dy5vbWMubmV0MB4XDTI1MDQyNzA4NDEzMloXDTM1MDQyNTA4NDEzMlowZTELMAkG
A1UEBhMCQ04xDDAKBgNVBAgMAzVHQzEMMAoGA1UEBwwDNUdDMREwDwYDVQQKDAhP
TUMtVGVhbTERMA8GA1UECwwIT01DLVRlYW0xFDASBgNVBAMMC3d3dy5vbWMubmV0
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAm+870e0lMn8f9P/340HS
cXdEoCWsBGRSuYTZVymY3qeX2uRCfxgrV+y0l5HBYS7jfER6Fd58Ixesd9UXPH06
mWCycl2U1HTxE0miUMVeD37QPYldehy52R/TqXnsCJRBteYvLUlIr1xC0cZR+LYE
4uK0h4VrcANnHrU1c0r1EZIMU1ANZU0EqEOtjUU/+IT/fOUR8MHzTnu20/DpogHU
4v4nG2H94nj5MTzwvjLlTx5EU1VD0J93qHZHkzw+kOWCLDWHf/AkDmBJNHwHPiWK
BC8g7/GENeP8FQY9ZmNtn5whsWOGsjaK4zpiifYz9jpWvDFioDK1CFr0901DRr2q
g2U0qMoMrOFucGIEWLm7ecdWefIjdhWVdhqBP9o1SBtJ1WUIVHfB7ujg8fpA0N8R
o+T4EhSnfwbdJxTvjEZtVPgxBKtrxL47AAjl+TdbY+2f6IU7xBIZn2XLxAiGBFSD
oTL1fm7XOPGKT/NuxOXPCbYiCEeZcipkTFHXXSu274Npwz1xl7rjS2EEaIy6b3QQ
0ks5UquLOP44Wl1IIYwxR+WBQDDXYbklZUHh22lmb02XFc10Cs1m4a/xMFamAklz
hn4WDJTiW5fRgCTJDw6cmCncpvuw5cGjdo9fnsMQYOSLOsg9zzQ5WVjJC3oCu6xJ
p0T2mByiBnwoBK76dhddyF8CAwEAAaNTMFEwHQYDVR0OBBYEFO2829icz/VewU6Q
b9TSwDiG8rFaMB8GA1UdIwQYMBaAFO2829icz/VewU6Qb9TSwDiG8rFaMA8GA1Ud
EwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIBAIEdlrw1w+d6LgjA6kuf8pmo
yfopjQmFfN4vfJ8sPiTSoY5KdetPmxTc04knpWn9qrUhgtpxoW7ZAXNct3ltGiI/
zAPDB6jzXFoXfbhYEPpZYLpuGGWr/J9p2fkXTqdzHODcGFoOJuGlMrvxqIWL1raL
BDHajs1ETuyxJEZFXc1NO6LBeJ07eaLykEsyfUy9x7MCbZ0CkuefTnj6MuBchqAn
oxrNupw1G5+36wnFeyK43FAUWHclP4t/S2VvVHYg1U/2qZcRV6Ddxz/Yra/+TRIP
wBU6kMi+2GMjWVDgURfniKXpBfDkE77GKj3OphMZ+EEPXSKHnOF2Un8Mj5fVk86h
F4rSJ4J6LRcyEFf/pB5LT6usk3Buxq5OZjlD9UqGIbakcwCR6grxO7JPab2G8kwr
M6tYxVzW0wDbfm4YNakkpjpcwPHraVvOY1VV6DIfdFuiRP61HdkMu6WxUnd/DXsr
AOGB7gLya8+EtyydgaABolU0y3lZZaR9XCNSe1tTtTQkjik/SWGxxhue6QNR/Rr2
IGKu2oYtjwnCpir342Bc/OLyTudtYxxHbPXj6/GO1tApYKgG+50KJKx5TXUz9BGM
mqOtLSZLGs3FWKybGmZvPvgurewQqr+inRPYM5Llkeiyis1bg5CVdHL6Bb68VZaJ
+Qv3f5EhOiZfu5jcjdxb
-----END CERTIFICATE-----

View File

@@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQCb7zvR7SUyfx/0
//fjQdJxd0SgJawEZFK5hNlXKZjep5fa5EJ/GCtX7LSXkcFhLuN8RHoV3nwjF6x3
1Rc8fTqZYLJyXZTUdPETSaJQxV4PftA9iV16HLnZH9OpeewIlEG15i8tSUivXELR
xlH4tgTi4rSHhWtwA2cetTVzSvURkgxTUA1lTQSoQ62NRT/4hP985RHwwfNOe7bT
8OmiAdTi/icbYf3iePkxPPC+MuVPHkRTVUPQn3eodkeTPD6Q5YIsNYd/8CQOYEk0
fAc+JYoELyDv8YQ14/wVBj1mY22fnCGxY4ayNorjOmKJ9jP2Ola8MWKgMrUIWvT3
TUNGvaqDZTSoygys4W5wYgRYubt5x1Z58iN2FZV2GoE/2jVIG0nVZQhUd8Hu6ODx
+kDQ3xGj5PgSFKd/Bt0nFO+MRm1U+DEEq2vEvjsACOX5N1tj7Z/ohTvEEhmfZcvE
CIYEVIOhMvV+btc48YpP827E5c8JtiIIR5lyKmRMUdddK7bvg2nDPXGXuuNLYQRo
jLpvdBDSSzlSq4s4/jhaXUghjDFH5YFAMNdhuSVlQeHbaWZvTZcVzXQKzWbhr/Ew
VqYCSXOGfhYMlOJbl9GAJMkPDpyYKdym+7DlwaN2j1+ewxBg5Is6yD3PNDlZWMkL
egK7rEmnRPaYHKIGfCgErvp2F13IXwIDAQABAoICAB0PDxHG5LitUhJBJTvXh1UX
ydUiUBUdcQEbjbkdilxr1PO4t9+hbGpdNSZNxkDLER+WTz4GERIlFkHalxLxr1rn
1zlS0SpqhIZ4oWP189plYn8lOyNHeSbKNJKPovnSTxCLzdzdnEr5oYYgNCRqHyz8
3HGo3mWobK4fTM+od1UH534bG/P1z1lgC1aZQhuZBVeMBLTeH+5PRbnnWlKTjs2i
WT1UHJD4xE91sNNw/qSo2kjBSfr1zMG7EQmSH4K3EnQUoaSo5r87GElMl7jwG/E9
qyCr3FyCmPZ+DDEpdENbQDgjePV7DpTby4M0O2i2ZHV7qop6CJx+/smbP19Odxjs
6roI2z0N/AzQmohHe1enBLGCIgJDVS9TCTC1EARgceEM+EAbUiwOlWpuSIuhqFwI
AwzHtZoilL9O0zvKv1Et9HWvScXtWvVkmNFmDJbsjn1li2fMC/SvsHElx7ZRUgvQ
+pNG6QVSfqHwd6+e4+E0nV1DSzWsXWJL8KXofFWx2xt5HBiFLS19AM8IupaNsLBC
CEeZO1MiqS68YhRar5QMTUm121qq4zNBRXjMWJ6mXOJ2M+pbAj+QfKrwMbZsnvhU
KfxFQLFQ+aD+/rHp+cwRflSVGj7nK1GMZXLJQlcMGfl/15Zl3vbcnbzOq+jC/hyV
Jnz8lAge2E7szo2E7lMpAoIBAQDILUUXL5f3tK/h/aMOCygdjFWSDMHtLe0GAGfK
qhsz6kFBISEDEtqHPwGV/NJF/nD9pWHxI4M2raFkH7QZlMHhgvKEBmjXldfQ2a7p
aP+EGYSf+xHmfomJCie04dyrbvfznzp/CkIRRAUatCpe5kk8PgWbRi5gtueXrQbA
Wdm1hOXIGcz0eh2FnXwpR3ilpjV3PzPi9Pkz3c52efocpBLeFwht3IIOppKAmsyB
LFrEzJBysmKpjhBRvSae1oGsSS+ut7PZx92IjaJRu2zUuAj4z9TRMKf3OEppBHJp
H3U23bf2+sjn1swoAnJXOuIEv+bWWzJjmDt8st11ChD/+MLlAoIBAQDHa3sEMAb9
cq0uWpQBrggKKYv4NvnOEquj/k11oX1tZPSQtO8sRx/vp/8c3zxIX9GdU/iV/32f
Xopqebj8NqvWkSbjzqSXiioNSFgppGVaNu1RH6IFSzUk3EF/M6H9YRqgW8XYMSeE
MVJutvRa2+vrIelhS4KDScWKX/WuKX7mbD8891YJOIObFi4HJMBtTD2mFN/jli24
3YZwlmxsmPN28VrZB6YqBsvJNOeA9oBL7eg/elsWhh0V7Ie4FyKTHd5CSugJwD4C
So3CoEfZGYcNcxGF2pA5AXMhc4bDb8A3afCzQ7C5kIvQ3Yq6FcZvXVKcR7eTPqSD
/JwanOY5QBXzAoIBAQCPdmpS0KhQPe3jwDyw3uwUKTRWpNADZOu/ZmD8jWdLkLLN
s6mOI1/8l/pR/UzSHyXpkzKbeMEcWdoWAOa5grRlI80dM97Fyz1OEATcgYTGrucv
JOhSUhPN5DpK16ioMLKBpnds/vQUnbQuzDqlotOP2j94Zhbs94kJWldBWeO+xQ1N
mLgb6rznutN2XiOoTHN7EA/ms306X9gNbyQCjNB83PMMkYGgcF8EzmyMkzZGXvmT
SieNryQhALgCFGgBCr6isEO0bBpoOGHBw9qepXrAn2q9tepbMruZgjdhAcum08Z5
uohsJ7RPZFmADNJZZxNQQzHc0QipOSOgMuO2IBnFAoIBAEyWuO5Iy8Z3To/o9cMX
ZbsRbdJsutAsV4NqXbF5zkQ/a7ZP5zOoNVnDubUK/4oEUusLnwNs1oBovNxb13H2
RVTo9nizmn8g7zmeuU10+AAH7GklrwI9ejGn7fe+is5XhvRjir6XUkfw8WnYFkz2
/cqWgZ1+dKebo6Sbai3zfetdU4REseRkshbUE+VmdgkEKQEqLzqnKPRBECsZepbS
v17FH1EPIQAvEAE8slTTVz7SJkqK4YTrCSysZQuMxxiddgkb37YvASG8JGnFSRLW
PQorUWWJJa7fIaqNRgq1VqtxoqIWsz7xhuE21NrXFhkbTGj9GkIQ4vpWAFYwQDNo
q4UCggEAD5C079b8ZrrZAPaB62CFW6s5HibiSjI5YTS++eCJSi9TOmi8yAdipZgD
CmuEzfw060VOflyNAAck9vZc1NHkANgpt1StZmo0CQikKjua7u7NPtBIwKF/OMMv
gcYduoTCmntMe85DSviZD0bZ5Ez5ocsT2cTMBvltT1YZjU5F91H87qhzZlVqP9C5
Sml2mY+QYi9yifEYqp5Qth5W5bcp+QV/LecAS6Rv3xbkd5nV4v0oN8ekp40iA3+q
bqoyWol6pHym+3X0j3bHwWbBz1QG6H1rzi6n6fM08lfvT7bHvh+4iOQEm/ph/Alh
RNodAySNybYrYHj6i4VkgDxYg+FhYg==
-----END PRIVATE KEY-----

View File

@@ -1,24 +1,15 @@
# server version: std/lite
serverVersion: "std"
# operation mode system/docker
# serverMode: "system"
# login authentication, default true
# serverLoginAuth: true
# interface encryption, default false
# serverCryptoApi: false
# file: log file name
# level: /trace/debug/info/warn/error/fatal, default: debug
# duration: rotation time with xx hours, example: 1/12/24 hours
# count: rotation count of log, default is 30 rotation
logger:
file: /usr/local/omc/log/omc.log
level: warn
duration: 24
count: 90
# pprof: false(default)/true to disable/enable pprof
pprof:
enabled: true
addr: "0.0.0.0:33060"
# rest agent listen ipv4/v6 and port, support multiple routines
# service listen ipv4/v6 and port, support multiple routines
# ip: 0.0.0.0 or ::0, support IPv4/v6
rest:
server:
- ipv4: "0.0.0.0"
ipv6: ""
port: 33040
@@ -27,9 +18,11 @@ rest:
ipv6: ""
port: 33443
schema: https
certFile: ./local/certs/omc-server.crt
keyFile: ./local/certs/omc-server.key
certFile: ./local/certs/www.omc.net.crt
keyFile: ./local/certs/www.omc.net.key
# web service configuration
# if you are using nginx to take over, you can disable the
webServer:
enabled: false
rootDir: ./local/web
@@ -38,19 +31,14 @@ webServer:
schema: http
- addr: "0.0.0.0:443"
schema: https
certFile: ./local/certs/omc-web.crt
keyFile: ./local/certs/omc-web.key
certFile: ./local/certs/www.omc.net.crt
keyFile: ./local/certs/www.omc.net.key
# 静态文件配置, 相对项目根路径或填绝对路径
staticFile:
# 默认资源dir目录需要预先创建
default:
prefix: "/static"
dir: "C:/usr/local/omc/static"
# 文件上传资源目录映射,与项目目录同级
upload:
prefix: "/upload"
dir: "C:/usr/local/omc/upload"
# track configuration for NE
trace:
enabled: true
host: "192.168.5.58" # fill in the specific IP address
port: 33033
# data sources
database:
@@ -72,18 +60,43 @@ database:
# used to specify the default data source for multiple data resourece
defaultDataSourceName: "std"
# Redis data cache
# redis cached data
redis:
dataSource:
# OMC system db
default:
port: 16379 # Redis port
host: "192.168.9.58" # Redis host
port: 16379 # port
host: "192.168.9.58" # host
password: "helloearth"
db: 10 # Redis db_num
# used to specify the default data source for multiple data resourece
db: 10 # db_num
# default data source name
defaultDataSourceName: "default"
# file: log file name
# level: /trace/debug/info/warn/error/fatal, default: debug
# duration: rotation time with xx hours, example: 1/12/24 hours
# count: rotation count of log, default is 30 rotation
logger:
file: "C:/var/log/omc_restagent.log"
level: warn
duration: 24
count: 90
# pprof grafana Performance Monitor
pprof:
enabled: true
addr: "0.0.0.0:33060"
# 静态文件配置, 相对项目根路径或填绝对路径
staticFile:
# 默认资源dir目录需要预先创建
default:
prefix: "/static"
dir: "C:/usr/local/omc/static"
# 文件上传资源目录映射,与项目目录同级
upload:
prefix: "/upload"
dir: "C:/usr/local/omc/upload"
# sleep: time delay for after write buffer (millisecond)
# deadLine: timeout for io read and write (second)
mml:
@@ -94,12 +107,6 @@ mml:
bufferSize: 65535
mmlHome: ./mmlhome
# Tracking configuration
trace:
enabled: false
host: "172.16.5.100" # Fill in the specific IP address
port: 33033
# NE config
ne:
user: omcuser
@@ -128,8 +135,8 @@ omc:
dn: ""
chk2ne: false
capability: 50
sn: "-"
expiryDate: "-"
sn: "12345678"
expiryDate: "2099-12-31"
checksign: false
rootDir: /usr/local/omc
binDir: /usr/local/omc/bin

20
main.go
View File

@@ -178,7 +178,7 @@ func loadFeatures(app *gin.Engine) {
// 默认路由组
defaultUriGroup := app.Group(featuresCfg.DefaultUriPrefix)
defaultUriGroup.Use(middleware.PreAuthorize(nil))
defaultUriGroup.Use(middleware.AuthorizeUser(nil))
defaultUriGroup.Any("/*any", gin.WrapH(routes.NewRouter()))
// 可配置前缀路由组
uriGroup := app.Group(featuresCfg.UriPrefix)
@@ -219,20 +219,20 @@ func loadGlobalPre(app *gin.Engine) {
// loadServer 多个HTTP服务启动
func loadServer(app *gin.Engine) {
httpArr := config.Get("rest")
httpArr := config.Get("server")
if httpArr == nil {
logger.Errorf("rest config not found")
logger.Errorf("server config not found")
return
}
for _, v := range httpArr.([]any) {
rest := v.(map[string]any)
port := parse.Number(rest["port"])
ipv4 := fmt.Sprint(rest["ipv4"])
ipv6 := fmt.Sprint(rest["ipv6"])
schema := fmt.Sprint(rest["schema"])
item := v.(map[string]any)
port := parse.Number(item["port"])
ipv4 := fmt.Sprint(item["ipv4"])
ipv6 := fmt.Sprint(item["ipv6"])
schema := fmt.Sprint(item["schema"])
if schema == "https" && schema != "<nil>" {
certFile := fmt.Sprint(rest["certfile"])
keyFile := fmt.Sprint(rest["keyfile"])
certFile := fmt.Sprint(item["certfile"])
keyFile := fmt.Sprint(item["keyfile"])
addr := ""
if ipv4 != "" && ipv4 != "<nil>" {
addr = fmt.Sprintf("%s:%d", ipv4, port)

View File

@@ -15,6 +15,7 @@ import (
"be.ems/src/modules/monitor"
networkdata "be.ems/src/modules/network_data"
networkelement "be.ems/src/modules/network_element"
"be.ems/src/modules/oauth2"
"be.ems/src/modules/system"
"be.ems/src/modules/tool"
"be.ems/src/modules/trace"
@@ -83,12 +84,16 @@ func ModulesRoute(app *gin.Engine) {
system.Setup(app)
// 认证模块
auth.Setup(app)
// 开放客户端模块
oauth2.Setup(app)
// 通用模块
common.Setup(app)
// 网元功能模块
networkelement.Setup(app)
// 网元数据模块
networkdata.Setup(app)
// 跟踪模块
trace.Setup(app)
// 图表模块
@@ -97,6 +102,7 @@ func ModulesRoute(app *gin.Engine) {
tool.Setup(app)
// ws 模块
ws.Setup(app)
// 调度任务模块--暂无接口
crontask.Setup(app)
// 监控模块 - 含调度处理加入队列,放最后

View File

@@ -135,13 +135,13 @@ security:
# JWT 令牌配置
jwt:
# 令牌算法 HS256 HS384 HS512
algorithm: "HS512"
algorithm: "HS256"
# 令牌密钥
secret: "217a0481c7f9cfe1cb547d32ee012b0f"
# 令牌有效期默认120分钟)
expiresIn: 120
# 验证令牌有效期相差不足xx分钟自动刷新缓存
refreshIn: 20
# 访问令牌有效期默认15分钟)
expiresIn: 15
# 刷新令牌有效期默认7*24*60分钟
refreshIn: 10080
# DB 数据源
database:

View File

@@ -2,8 +2,8 @@ package constants
// 缓存的key常量
const (
// CACHE_LOGIN_TOKEN 登录用户
CACHE_LOGIN_TOKEN = "login_tokens"
// CACHE_TOKEN_DEVICE 登录用户令牌标识
CACHE_TOKEN_DEVICE = "token_devices"
// CACHE_CAPTCHA_CODE 验证码
CACHE_CAPTCHA_CODE = "captcha_codes"
// CACHE_SYS_CONFIG 参数管理
@@ -16,6 +16,10 @@ const (
CACHE_RATE_LIMIT = "rate_limit"
// CACHE_PWD_ERR_COUNT 登录账户密码错误次数
CACHE_PWD_ERR_COUNT = "pwd_err_count"
// CACHE_OAUTH2_DEVICE 授权客户端令牌标识
CACHE_OAUTH2_DEVICE = "oauth2_devices"
// CACHE_OAUTH2_CODE 客户端授权码
CACHE_OAUTH2_CODE = "oauth2_codes"
// CACHE_I18N 国际化语言管理
CACHE_I18N = "i18n"
// CACHE_NE_INFO 网元信息管理

View File

@@ -1,11 +0,0 @@
package constants
// 验证码常量信息
const (
// CAPTCHA_EXPIRATION 验证码有效期,单位秒
CAPTCHA_EXPIRATION = 2 * 60
// CAPTCHA_TYPE_CHAR 验证码类型-数值计算
CAPTCHA_TYPE_CHAR = "char"
// CAPTCHA_TYPE_MATH 验证码类型-字符验证
CAPTCHA_TYPE_MATH = "math"
)

View File

@@ -10,5 +10,8 @@ const (
// CTX_LOGIN_USER 上下文信息-登录用户
const CTX_LOGIN_USER = "ctx:login_user"
// CTX_LOGIN_OAUTH2 上下文信息-认证客户端
const CTX_LOGIN_OAUTH2 = "ctx:login_oauth2"
// 启动-引导系统初始
const LAUNCH_BOOTLOADER = "bootloader"

View File

@@ -3,19 +3,19 @@ package constants
// 令牌常量信息
// HEADER_PREFIX 令牌-请求头标识前缀
const HEADER_PREFIX = "Bearer "
const HEADER_PREFIX = "Bearer"
// HEADER_KEY 令牌-请求头标识
const HEADER_KEY = "Authorization"
// JWT_UUID 令牌-JWT唯一标识字段
const JWT_UUID = "uuid"
// JWT_DEVICE_ID 令牌-JWT设备标识字段
const JWT_DEVICE_ID = "device_id"
// JWT_USER_ID 令牌-JWT标识用户主键字段
const JWT_USER_ID = "user_id"
// JWT_USER_NAME 令牌-JWT标识用户登录账号字段
const JWT_USER_NAME = "user_name"
// JWT_CLIENT_ID 令牌-JWT标识客户端ID字段
const JWT_CLIENT_ID = "client_id"
// NMS北向使用-数据响应字段和请求头授权
const ACCESS_TOKEN = "accessToken"

View File

@@ -16,6 +16,21 @@ import (
// Redis连接实例
var rdbMap = make(map[string]*redis.Client)
// 声明定义限流脚本命令
var rateLimitCommand = redis.NewScript(`
local key = KEYS[1]
local time = tonumber(ARGV[1])
local count = tonumber(ARGV[2])
local current = redis.call('get', key);
if current and tonumber(current) >= count then
return tonumber(current);
end
current = redis.call('incr', key)
if tonumber(current) == 1 then
redis.call('expire', key, time)
end
return tonumber(current);`)
// Connect 连接Redis实例
func Connect() {
ctx := context.Background()
@@ -33,7 +48,7 @@ func Connect() {
// 测试数据库连接
pong, err := rdb.Ping(ctx).Result()
if err != nil {
logger.Fatalf("failed error redis connect: %s is %v", k, err)
logger.Fatalf("Ping redis %s is %v", k, err)
}
logger.Infof("redis %s %d %s connection is successful.", k, client["db"].(int), pong)
rdbMap[k] = rdb
@@ -139,6 +154,39 @@ func CommandStats(source string) []map[string]string {
return statsObjArr
}
// Has 判断是否存在
func Has(source string, keys ...string) (int64, error) {
// 数据源
rdb := RDB(source)
if rdb == nil {
return 0, fmt.Errorf("redis not client")
}
ctx := context.Background()
exists, err := rdb.Exists(ctx, keys...).Result()
if err != nil {
return 0, err
}
return exists, nil
}
// SetExpire 设置过期时间
func SetExpire(source, key string, expiration time.Duration) error {
// 数据源
rdb := RDB(source)
if rdb == nil {
return fmt.Errorf("redis not client")
}
ctx := context.Background()
err := rdb.Expire(ctx, key, expiration).Err()
if err != nil {
logger.Errorf("redis Expire err %v", err)
return err
}
return nil
}
// GetExpire 获取键的剩余有效时间(秒)
func GetExpire(source string, key string) (int64, error) {
// 数据源
@@ -227,41 +275,8 @@ func Get(source, key string) (string, error) {
return v, nil
}
// Has 判断是否存在
func Has(source string, keys ...string) (int64, error) {
// 数据源
rdb := RDB(source)
if rdb == nil {
return 0, fmt.Errorf("redis not client")
}
ctx := context.Background()
exists, err := rdb.Exists(ctx, keys...).Result()
if err != nil {
return 0, err
}
return exists, nil
}
// Set 设置缓存数据
func Set(source, key string, value any) error {
// 数据源
rdb := RDB(source)
if rdb == nil {
return fmt.Errorf("redis not client")
}
ctx := context.Background()
err := rdb.Set(ctx, key, value, 0).Err()
if err != nil {
logger.Errorf("redis Set err %v", err)
return err
}
return nil
}
// SetByExpire 设置缓存数据与过期时间
func SetByExpire(source, key string, value any, expiration time.Duration) error {
func Set(source, key string, value any, expiration time.Duration) error {
// 数据源
rdb := RDB(source)
if rdb == nil {
@@ -271,7 +286,7 @@ func SetByExpire(source, key string, value any, expiration time.Duration) error
ctx := context.Background()
err := rdb.Set(ctx, key, value, expiration).Err()
if err != nil {
logger.Errorf("redis SetByExpire err %v", err)
logger.Errorf("redis Set err %v", err)
return err
}
return nil
@@ -329,18 +344,3 @@ func RateLimit(source, limitKey string, time, count int64) (int64, error) {
}
return result.(int64), err
}
// 声明定义限流脚本命令
var rateLimitCommand = redis.NewScript(`
local key = KEYS[1]
local time = tonumber(ARGV[1])
local count = tonumber(ARGV[2])
local current = redis.call('get', key);
if current and tonumber(current) >= count then
return tonumber(current);
end
current = redis.call('incr', key)
if tonumber(current) == 1 then
redis.call('expire', key, time)
end
return tonumber(current);`)

View File

@@ -20,14 +20,14 @@ func ErrorCatch() gin.HandlerFunc {
// 返回错误响应给客户端
if config.Env() == "prod" {
c.JSON(500, resp.CodeMsg(500, "Internal Server Errors"))
c.JSON(500, resp.CodeMsg(500001, "Internal Server Errors"))
} else {
// 通过实现 error 接口的 Error() 方法自定义错误类型进行捕获
switch v := err.(type) {
case error:
c.JSON(500, resp.CodeMsg(500, v.Error()))
c.JSON(500, resp.CodeMsg(500001, v.Error()))
default:
c.JSON(500, resp.CodeMsg(500, fmt.Sprint(err)))
c.JSON(500, resp.CodeMsg(500001, fmt.Sprint(err)))
}
}

View File

@@ -0,0 +1,66 @@
package middleware
import (
"fmt"
"github.com/gin-gonic/gin"
"be.ems/src/framework/constants"
"be.ems/src/framework/reqctx"
"be.ems/src/framework/resp"
"be.ems/src/framework/token"
)
// AuthorizeOauth2 客户端授权认证校验
//
// scope 客户端授权范围,例如:[]string{"read","write"}
func AuthorizeOauth2(scope []string) gin.HandlerFunc {
return func(c *gin.Context) {
// 获取请求头标识信息
tokenStr := reqctx.Authorization(c)
if tokenStr == "" {
c.JSON(401, resp.CodeMsg(401003, "authorization token is empty"))
c.Abort() // 停止执行后续的处理函数
return
}
// 验证令牌
claims, err := token.Oauth2TokenVerify(tokenStr, "access")
if err != nil {
c.JSON(401, resp.CodeMsg(401001, err.Error()))
c.Abort() // 停止执行后续的处理函数
return
}
// 获取缓存的用户信息
info := token.Oauth2InfoGet(claims)
if info.ClientId == "" {
c.JSON(401, resp.CodeMsg(401002, "invalid login user information"))
c.Abort() // 停止执行后续的处理函数
return
}
c.Set(constants.CTX_LOGIN_OAUTH2, info)
// 客户端权限校验
if scope != nil {
var hasScope bool = false
for _, item := range info.Scope {
for _, v := range scope {
if item == v {
hasScope = true
break
}
}
}
if !hasScope {
msg := fmt.Sprintf("unauthorized access %s %s", c.Request.Method, c.Request.RequestURI)
c.JSON(403, resp.CodeMsg(403001, msg))
c.Abort() // 停止执行后续的处理函数
return
}
}
// 调用下一个处理程序
c.Next()
}
}

View File

@@ -1,17 +1,17 @@
package middleware
import (
"fmt"
"strings"
"github.com/gin-gonic/gin"
"be.ems/src/framework/config"
"be.ems/src/framework/constants"
"be.ems/src/framework/i18n"
"be.ems/src/framework/reqctx"
"be.ems/src/framework/resp"
"be.ems/src/framework/token"
"be.ems/src/framework/utils/parse"
"github.com/gin-gonic/gin"
)
/**无Token可访问白名单 */
@@ -27,7 +27,7 @@ var URL_WHITE_LIST = []string{
"/oauth/token",
}
// PreAuthorize 用户身份授权认证校验
// AuthorizeUser 用户身份授权认证校验
//
// 只需含有其中角色 "hasRoles": {"xxx"},
//
@@ -36,7 +36,7 @@ var URL_WHITE_LIST = []string{
// 同时匹配其中角色 "matchRoles": {"xxx"},
//
// 同时匹配其中权限 "matchPerms": {"xxx"},
func PreAuthorize(options map[string][]string) gin.HandlerFunc {
func AuthorizeUser(options map[string][]string) gin.HandlerFunc {
return func(c *gin.Context) {
// 登录认证,默认打开
enable := parse.Boolean(config.Get("serverLoginAuth"))
@@ -51,12 +51,9 @@ func PreAuthorize(options map[string][]string) gin.HandlerFunc {
return
}
language := reqctx.AcceptLanguage(c)
requestURI := c.Request.RequestURI
// 判断白名单
isWhite := false
requestURI := c.Request.RequestURI
for _, w := range URL_WHITE_LIST {
if strings.Contains(requestURI, w) {
isWhite = true
@@ -71,42 +68,39 @@ func PreAuthorize(options map[string][]string) gin.HandlerFunc {
// 获取请求头标识信息
tokenStr := reqctx.Authorization(c)
if tokenStr == "" {
c.JSON(401, resp.CodeMsg(401, i18n.TKey(language, "app.common.err401")))
c.JSON(401, resp.CodeMsg(401003, "authorization token is empty"))
c.Abort() // 停止执行后续的处理函数
return
}
// 验证令牌
claims, err := token.Verify(tokenStr)
claims, err := token.UserTokenVerify(tokenStr, "access")
if err != nil {
c.JSON(401, resp.CodeMsg(401, err.Error()))
c.JSON(401, resp.CodeMsg(401001, err.Error()))
c.Abort() // 停止执行后续的处理函数
return
}
// 获取缓存的用户信息
loginUser := token.Info(claims)
if loginUser.UserId <= 0 {
c.JSON(401, resp.CodeMsg(401, i18n.TKey(language, "app.common.err401")))
info := token.UserInfoGet(claims)
if info.UserId <= 0 {
c.JSON(401, resp.CodeMsg(401002, "invalid login user information"))
c.Abort() // 停止执行后续的处理函数
return
}
// 检查刷新有效期后存入上下文
token.RefreshIn(&loginUser)
c.Set(constants.CTX_LOGIN_USER, loginUser)
c.Set(constants.CTX_LOGIN_USER, info)
// 登录用户角色权限校验
if options != nil {
var roles []string
for _, item := range loginUser.User.Roles {
for _, item := range info.User.Roles {
roles = append(roles, item.RoleKey)
}
perms := loginUser.Permissions
perms := info.Permissions
verifyOk := verifyRolePermission(roles, perms, options)
if !verifyOk {
msg := i18n.TTemplate(language, "app.common.err403", map[string]any{"method": c.Request.Method, "requestURI": requestURI})
c.JSON(403, resp.CodeMsg(403, msg))
msg := fmt.Sprintf("unauthorized access %s %s", c.Request.Method, c.Request.RequestURI)
c.JSON(403, resp.CodeMsg(403001, msg))
c.Abort() // 停止执行后续的处理函数
return
}
@@ -125,7 +119,7 @@ func PreAuthorize(options map[string][]string) gin.HandlerFunc {
//
// options 参数
func verifyRolePermission(roles, perms []string, options map[string][]string) bool {
// 直接放行 管理员角色或任意权限
// 直接放行 系统管理员角色或任意权限
if contains(roles, constants.SYS_ROLE_SYSTEM_KEY) || contains(perms, constants.SYS_PERMISSION_SYSTEM) {
return true
}

View File

@@ -103,7 +103,7 @@ func OperateLog(options Options) gin.HandlerFunc {
// 获取登录用户信息
loginUser, err := reqctx.LoginUser(c)
if err != nil {
c.JSON(401, resp.CodeMsg(401, i18n.TKey(language, err.Error())))
c.JSON(401, resp.CodeMsg(401002, i18n.TKey(language, err.Error())))
c.Abort() // 停止执行后续的处理函数
return
}

View File

@@ -51,7 +51,7 @@ func CryptoApi(requestDecrypt, responseEncrypt bool) gin.HandlerFunc {
// 是否存在data字段数据
if contentDe == "" {
c.JSON(400, resp.ErrMsg("decrypt not found field data"))
c.JSON(422, resp.CodeMsg(422002, "decrypt not found field data"))
c.Abort() // 停止执行后续的处理函数
return
}
@@ -61,7 +61,7 @@ func CryptoApi(requestDecrypt, responseEncrypt bool) gin.HandlerFunc {
dataBodyStr, err := crypto.AESDecryptBase64(contentDe, apiKey)
if err != nil {
logger.Errorf("CryptoApi decrypt err => %v", err)
c.JSON(400, resp.ErrMsg("decrypted data could not be parsed"))
c.JSON(422, resp.CodeMsg(422001, "decrypted data could not be parsed"))
c.Abort() // 停止执行后续的处理函数
return
}

View File

@@ -88,7 +88,7 @@ func OperateLog(options Options) gin.HandlerFunc {
// 获取登录用户信息
loginUser, err := reqctx.LoginUser(c)
if err != nil {
c.JSON(401, resp.CodeMsg(401, "无效身份授权"))
c.JSON(401, resp.CodeMsg(401002, "invalid login user information"))
c.Abort() // 停止执行后续的处理函数
return
}
@@ -134,7 +134,7 @@ func OperateLog(options Options) gin.HandlerFunc {
contentDisposition := c.Writer.Header().Get("Content-Disposition")
contentType := c.Writer.Header().Get("Content-Type")
content := contentType + contentDisposition
msg := fmt.Sprintf(`{"status":"%d","size":"%d","content-type":"%s"}`, status, c.Writer.Size(), content)
msg := fmt.Sprintf(`{"status":"%d","size":%d,"content-type":"%s"}`, status, c.Writer.Size(), content)
operaLog.OperaMsg = msg
}

View File

@@ -64,7 +64,7 @@ func RateLimit(option LimitOption) gin.HandlerFunc {
if option.Type == LIMIT_USER {
loginUser, err := reqctx.LoginUser(c)
if err != nil {
c.JSON(401, resp.CodeMsg(40003, err.Error()))
c.JSON(401, resp.CodeMsg(401002, "invalid login user information"))
c.Abort() // 停止执行后续的处理函数
return
}
@@ -80,13 +80,13 @@ func RateLimit(option LimitOption) gin.HandlerFunc {
// 在Redis查询并记录请求次数
rateCount, err := redis.RateLimit("", limitKey, option.Time, option.Count)
if err != nil {
c.JSON(200, resp.CodeMsg(4013, "访问过于频繁,请稍候再试"))
c.JSON(200, resp.ErrMsg("access too often, please try again later"))
c.Abort() // 停止执行后续的处理函数
return
}
rateTime, err := redis.GetExpire("", limitKey)
if err != nil {
c.JSON(200, resp.CodeMsg(4013, "访问过于频繁,请稍候再试"))
c.JSON(200, resp.ErrMsg("access too often, please try again later"))
c.Abort() // 停止执行后续的处理函数
return
}
@@ -97,7 +97,7 @@ func RateLimit(option LimitOption) gin.HandlerFunc {
c.Header("X-RateLimit-Reset", fmt.Sprintf("%d", time.Now().Unix()+rateTime)) // 重置时间戳
if rateCount >= option.Count {
c.JSON(200, resp.CodeMsg(4013, "访问过于频繁,请稍候再试"))
c.JSON(200, resp.ErrMsg("access too often, please try again later"))
c.Abort() // 停止执行后续的处理函数
return
}

View File

@@ -77,7 +77,7 @@ func RepeatSubmit(interval int64) gin.HandlerFunc {
logger.Errorf("RepeatSubmit rp json marshal err: %v", err)
}
// 保存请求时间和参数
redis.SetByExpire("", repeatKey, string(rpJSON), time.Duration(interval)*time.Second)
redis.Set("", repeatKey, string(rpJSON), time.Duration(interval)*time.Second)
// 调用下一个处理程序
c.Next()

View File

@@ -60,7 +60,7 @@ func RepeatSubmit(interval int64) gin.HandlerFunc {
// 小于间隔时间且参数内容一致
if compareTime < interval && compareParams {
c.JSON(200, resp.ErrMsg("不允许重复提交,请稍候再试"))
c.JSON(200, resp.ErrMsg("repeat submissions are not allowed. Please try again later."))
c.Abort()
return
}
@@ -76,7 +76,7 @@ func RepeatSubmit(interval int64) gin.HandlerFunc {
logger.Errorf("RepeatSubmit rp json marshal err: %v", err)
}
// 保存请求时间和参数
_ = redis.SetByExpire("", repeatKey, string(rpJSON), time.Duration(interval)*time.Second)
_ = redis.Set("", repeatKey, string(rpJSON), time.Duration(interval)*time.Second)
// 调用下一个处理程序
c.Next()

View File

@@ -12,12 +12,12 @@ import (
)
// LoginUser 登录用户信息
func LoginUser(c *gin.Context) (token.TokenInfo, error) {
func LoginUser(c *gin.Context) (token.UserInfo, error) {
value, exists := c.Get(constants.CTX_LOGIN_USER)
if exists && value != nil {
return value.(token.TokenInfo), nil
return value.(token.UserInfo), nil
}
return token.TokenInfo{}, fmt.Errorf("invalid login user information")
return token.UserInfo{}, fmt.Errorf("invalid login user information")
}
// LoginUserToUserID 登录用户信息-用户ID
@@ -58,14 +58,14 @@ func LoginUserByContainRoles(c *gin.Context, target string) bool {
// LoginUserByContainPerms 登录用户信息-包含权限标识
func LoginUserByContainPerms(c *gin.Context, target string) bool {
loginUser, err := LoginUser(c)
info, err := LoginUser(c)
if err != nil {
return false
}
if config.IsSystemUser(loginUser.UserId) {
if config.IsSystemUser(info.UserId) {
return true
}
perms := loginUser.Permissions
perms := info.Permissions
for _, str := range perms {
if str == target {
return true

View File

@@ -73,11 +73,11 @@ func Authorization(c *gin.Context) string {
return ""
}
// 拆分 Authorization 请求头,提取 JWT 令牌部分
arr := strings.SplitN(authHeader, constants.HEADER_PREFIX, 2)
if len(arr) < 2 {
return ""
tokenStr := strings.Replace(authHeader, constants.HEADER_PREFIX, "", 1)
if len(tokenStr) > 64 {
return strings.TrimSpace(tokenStr) // 去除可能存在的空格
}
return arr[1]
return ""
}
// AcceptLanguage 解析客户端接收语言 zh中文 en: 英文

View File

@@ -1,9 +1,12 @@
package reqctx
import (
"fmt"
"github.com/gin-gonic/gin"
"be.ems/src/framework/ip2region"
"be.ems/src/framework/utils/crypto"
"be.ems/src/framework/utils/ua"
)
@@ -33,3 +36,9 @@ func UaOsBrowser(c *gin.Context) (string, string) {
}
return os, browser
}
// DeviceFingerprint 设备指纹信息
func DeviceFingerprint(c *gin.Context, v any) string {
str := fmt.Sprintf("%v:%s", v, c.Request.UserAgent())
return crypto.SHA256ToBase64(str)
}

View File

@@ -2,17 +2,17 @@ package resp
const (
// CODE_ERROR 响应-code错误失败
CODE_ERROR = 0
CODE_ERROR = 400001
// MSG_ERROR 响应-msg错误失败
MSG_ERROR = "error"
// CODE_SUCCESS 响应-msg正常成功
CODE_SUCCESS = 1
CODE_SUCCESS = 200001
// MSG_SUCCCESS 响应-code正常成功
MSG_SUCCCESS = "success"
// 响应-code加密数据
CODE_ENCRYPT = 2
CODE_ENCRYPT = 200999
// 响应-msg加密数据
MSG_ENCRYPT = "encrypt"
)

View File

@@ -0,0 +1,14 @@
package token
// Oauth2Info 第三方客户端令牌信息对象
type Oauth2Info struct {
DeviceId string `json:"deviceId"` // 用户设备标识
ClientId string `json:"clientId"` // 客户端ID
LoginTime int64 `json:"loginTime"` // 登录时间时间戳
ExpireTime int64 `json:"expireTime"` // 过期时间时间戳
LoginIp string `json:"loginIp"` // 登录IP地址 x.x.x.x
LoginLocation string `json:"loginLocation"` // 登录地点 xx xx
Browser string `json:"browser"` // 浏览器类型
OS string `json:"os"` // 操作系统
Scope []string `json:"scope"` // 权限列表
}

View File

@@ -0,0 +1,167 @@
package token
import (
"encoding/json"
"fmt"
"time"
"github.com/golang-jwt/jwt/v5"
"be.ems/src/framework/config"
"be.ems/src/framework/constants"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/logger"
"be.ems/src/framework/utils/parse"
)
// Oauth2TokenCreate 生成令牌
// clientId 客户端ID
// deviceFingerprint 设备指纹 SHA256
// tokenType 令牌类型 access:访问令牌 refresh:刷新令牌
func Oauth2TokenCreate(clientId, deviceFingerprint, tokenType string) (string, int64) {
// 令牌算法 HS256 HS384 HS512
algorithm := config.Get("jwt.algorithm").(string)
var method *jwt.SigningMethodHMAC
switch algorithm {
case "HS512":
method = jwt.SigningMethodHS512
case "HS384":
method = jwt.SigningMethodHS384
default: // 包含HS256和其他所有情况
method = jwt.SigningMethodHS256
}
// 生成令牌设置密钥
secret := fmt.Sprint(config.Get("jwt.secret"))
// 设置令牌过期时间
now := time.Now()
exp := now
if tokenType == "access" {
expiresIn := time.Duration(parse.Number(config.Get("jwt.expiresIn")))
exp = now.Add(expiresIn * time.Minute)
secret = "Oauth2_Access:" + secret
}
if tokenType == "refresh" {
refreshIn := time.Duration(parse.Number(config.Get("jwt.refreshIn")))
exp = now.Add(refreshIn * time.Minute)
secret = "Oauth2_Refresh:" + secret
}
// 生成令牌负荷绑定uuid标识
jwtToken := jwt.NewWithClaims(method, jwt.MapClaims{
constants.JWT_DEVICE_ID: deviceFingerprint,
constants.JWT_CLIENT_ID: clientId,
"exp": exp.Unix(), // 过期时间
"iat": now.Unix(), // 签发时间
"nbf": now.Unix(), // 生效时间
})
tokenStr, err := jwtToken.SignedString([]byte(secret))
if err != nil {
logger.Infof("jwt sign err : %v", err)
return "", 0
}
expSeconds := int64(exp.Sub(now).Seconds())
return tokenStr, expSeconds
}
// Oauth2TokenVerify 校验令牌是否有效
// tokenType 令牌类型 access:访问令牌 refresh:刷新令牌
func Oauth2TokenVerify(tokenStr, tokenType string) (jwt.MapClaims, error) {
jwtToken, err := jwt.Parse(tokenStr, func(jToken *jwt.Token) (any, error) {
// 判断加密算法是预期的加密算法
if _, ok := jToken.Method.(*jwt.SigningMethodHMAC); ok {
secret := config.Get("jwt.secret").(string)
if tokenType == "access" {
secret = "Oauth2_Access:" + secret
}
if tokenType == "refresh" {
secret = "Oauth2_Refresh:" + secret
}
return []byte(secret), nil
}
return nil, jwt.ErrSignatureInvalid
})
if err != nil {
logger.Errorf("Token Verify Err: %v", err)
return nil, fmt.Errorf("token invalid")
}
// 如果解析负荷成功并通过签名校验
claims, ok := jwtToken.Claims.(jwt.MapClaims)
if ok && jwtToken.Valid {
return claims, nil
}
return nil, fmt.Errorf("token valid error")
}
// Oauth2InfoRemove 清除登录第三方客户端信息
func Oauth2InfoRemove(tokenStr string) (string, error) {
claims, err := Oauth2TokenVerify(tokenStr, "access")
if err != nil {
logger.Errorf("token verify err %v", err)
return "", err
}
deviceId, ok := claims[constants.JWT_DEVICE_ID]
if ok && deviceId != "" {
// 清除缓存KEY
tokenKey := constants.CACHE_OAUTH2_DEVICE + ":" + fmt.Sprint(deviceId)
return fmt.Sprint(claims[constants.JWT_CLIENT_ID]), redis.Del("", tokenKey)
}
return "", fmt.Errorf("token invalid")
}
// Oauth2InfoCreate 生成访问第三方客户端信息缓存
func Oauth2InfoCreate(info *Oauth2Info, deviceFingerprint string, ilobArr [4]string) {
info.DeviceId = deviceFingerprint
// 设置请求登录客户端
info.LoginIp = ilobArr[0]
info.LoginLocation = ilobArr[1]
info.OS = ilobArr[2]
info.Browser = ilobArr[3]
expiresIn := time.Duration(parse.Number(config.Get("jwt.expiresIn")))
now := time.Now()
exp := now.Add(expiresIn * time.Minute)
info.LoginTime = now.UnixMilli()
info.ExpireTime = exp.UnixMilli()
// 登录信息标识缓存
tokenKey := constants.CACHE_OAUTH2_DEVICE + ":" + info.DeviceId
jsonBytes, err := json.Marshal(info)
if err != nil {
return
}
_ = redis.Set("", tokenKey, string(jsonBytes), expiresIn*time.Minute)
}
// Oauth2InfoUpdate 更新访问第三方客户端信息缓存
func Oauth2InfoUpdate(info Oauth2Info) {
// 登录信息标识缓存
tokenKey := constants.CACHE_OAUTH2_DEVICE + ":" + info.DeviceId
jsonBytes, err := json.Marshal(info)
if err != nil {
return
}
expiresIn, _ := redis.GetExpire("", tokenKey)
expiration := time.Duration(expiresIn) * time.Second
_ = redis.Set("", tokenKey, string(jsonBytes), expiration)
}
// Oauth2InfoGet 缓存的登录第三方客户端信息
func Oauth2InfoGet(claims jwt.MapClaims) Oauth2Info {
info := Oauth2Info{}
deviceId := fmt.Sprint(claims[constants.JWT_DEVICE_ID])
tokenKey := constants.CACHE_OAUTH2_DEVICE + ":" + deviceId
hasKey, err := redis.Has("", tokenKey)
if hasKey > 0 && err == nil {
infoStr, err := redis.Get("", tokenKey)
if infoStr == "" || err != nil {
return info
}
if err := json.Unmarshal([]byte(infoStr), &info); err != nil {
logger.Errorf("info json err : %v", err)
return info
}
}
return info
}

View File

@@ -1,152 +0,0 @@
package token
import (
"encoding/json"
"fmt"
"time"
"github.com/golang-jwt/jwt/v5"
"be.ems/src/framework/config"
"be.ems/src/framework/constants"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/logger"
"be.ems/src/framework/utils/generate"
)
// Remove 清除登录用户信息UUID
func Remove(token string) string {
claims, err := Verify(token)
if err != nil {
logger.Errorf("token verify err %v", err)
return ""
}
// 清除缓存KEY
uuid := claims[constants.JWT_UUID].(string)
tokenKey := constants.CACHE_LOGIN_TOKEN + ":" + uuid
hasKey, err := redis.Has("", tokenKey)
if hasKey > 0 && err == nil {
_ = redis.Del("", tokenKey)
}
return claims[constants.JWT_USER_NAME].(string)
}
// Create 令牌生成
func Create(tokenInfo *TokenInfo, ilobArr [4]string) string {
// 生成用户唯一token 32位
tokenInfo.UUID = generate.Code(32)
tokenInfo.LoginTime = time.Now().UnixMilli()
// 设置请求用户登录客户端
tokenInfo.LoginIp = ilobArr[0]
tokenInfo.LoginLocation = ilobArr[1]
tokenInfo.OS = ilobArr[2]
tokenInfo.Browser = ilobArr[3]
// 设置新登录IP和登录时间
tokenInfo.User.LoginIp = tokenInfo.LoginIp
tokenInfo.User.LoginTime = tokenInfo.LoginTime
// 设置用户令牌有效期并存入缓存
Cache(tokenInfo)
// 令牌算法 HS256 HS384 HS512
algorithm := config.Get("jwt.algorithm").(string)
var method *jwt.SigningMethodHMAC
switch algorithm {
case "HS512":
method = jwt.SigningMethodHS512
case "HS384":
method = jwt.SigningMethodHS384
case "HS256":
default:
method = jwt.SigningMethodHS256
}
// 生成令牌负荷绑定uuid标识
jwtToken := jwt.NewWithClaims(method, jwt.MapClaims{
constants.JWT_UUID: tokenInfo.UUID,
constants.JWT_USER_ID: tokenInfo.UserId,
constants.JWT_USER_NAME: tokenInfo.User.UserName,
"ait": tokenInfo.LoginTime,
})
// 生成令牌设置密钥
secret := config.Get("jwt.secret").(string)
tokenStr, err := jwtToken.SignedString([]byte(secret))
if err != nil {
logger.Infof("jwt sign err : %v", err)
return ""
}
return tokenStr
}
// Cache 缓存登录用户信息
func Cache(tokenInfo *TokenInfo) {
// 计算配置的有效期
expTime := config.Get("jwt.expiresIn").(int)
expTimestamp := time.Duration(expTime) * time.Minute
iatTimestamp := time.Now().UnixMilli()
tokenInfo.LoginTime = iatTimestamp
tokenInfo.ExpireTime = iatTimestamp + expTimestamp.Milliseconds()
tokenInfo.User.Password = ""
// 登录信息标识缓存
tokenKey := constants.CACHE_LOGIN_TOKEN + ":" + tokenInfo.UUID
jsonBytes, err := json.Marshal(tokenInfo)
if err != nil {
return
}
_ = redis.SetByExpire("", tokenKey, string(jsonBytes), expTimestamp)
}
// RefreshIn 验证令牌有效期相差不足xx分钟自动刷新缓存
func RefreshIn(loginUser *TokenInfo) {
// 相差不足xx分钟自动刷新缓存
refreshTime := config.Get("jwt.refreshIn").(int)
refreshTimestamp := time.Duration(refreshTime) * time.Minute
// 过期时间
expireTimestamp := loginUser.ExpireTime
currentTimestamp := time.Now().UnixMilli()
if expireTimestamp-currentTimestamp <= refreshTimestamp.Milliseconds() {
Cache(loginUser)
}
}
// Verify 校验令牌是否有效
func Verify(token string) (jwt.MapClaims, error) {
jwtToken, err := jwt.Parse(token, func(jToken *jwt.Token) (any, error) {
// 判断加密算法是预期的加密算法
if _, ok := jToken.Method.(*jwt.SigningMethodHMAC); ok {
secret := config.Get("jwt.secret").(string)
return []byte(secret), nil
}
return nil, jwt.ErrSignatureInvalid
})
if err != nil {
logger.Errorf("Token Verify Err: %v", err)
return nil, fmt.Errorf("token invalid")
}
// 如果解析负荷成功并通过签名校验
if claims, ok := jwtToken.Claims.(jwt.MapClaims); ok && jwtToken.Valid {
return claims, nil
}
return nil, fmt.Errorf("token valid error")
}
// Info 缓存的登录用户信息
func Info(claims jwt.MapClaims) TokenInfo {
tokenInfo := TokenInfo{}
uuid := claims[constants.JWT_UUID].(string)
tokenKey := constants.CACHE_LOGIN_TOKEN + ":" + uuid
hasKey, err := redis.Has("", tokenKey)
if hasKey > 0 && err == nil {
infoStr, err := redis.Get("", tokenKey)
if infoStr == "" || err != nil {
return tokenInfo
}
if err := json.Unmarshal([]byte(infoStr), &tokenInfo); err != nil {
logger.Errorf("info json err : %v", err)
return tokenInfo
}
}
return tokenInfo
}

View File

@@ -2,9 +2,9 @@ package token
import systemModel "be.ems/src/modules/system/model"
// TokenInfo 令牌信息对象
type TokenInfo struct {
UUID string `json:"uuid"` // 用户唯一标识
// UserInfo 系统用户令牌信息对象
type UserInfo struct {
DeviceId string `json:"deviceId"` // 用户设备标识
UserId int64 `json:"userId"` // 用户ID
DeptId int64 `json:"deptId"` // 部门ID
LoginTime int64 `json:"loginTime"` // 登录时间时间戳

View File

@@ -0,0 +1,173 @@
package token
import (
"encoding/json"
"fmt"
"time"
"github.com/golang-jwt/jwt/v5"
"be.ems/src/framework/config"
"be.ems/src/framework/constants"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/logger"
"be.ems/src/framework/utils/parse"
)
// UserTokenCreate 生成令牌
// userId 用户ID
// deviceFingerprint 设备指纹 SHA256
// tokenType 令牌类型 access:访问令牌 refresh:刷新令牌
func UserTokenCreate(userId int64, deviceFingerprint, tokenType string) (string, int64) {
// 令牌算法 HS256 HS384 HS512
algorithm := config.Get("jwt.algorithm").(string)
var method *jwt.SigningMethodHMAC
switch algorithm {
case "HS512":
method = jwt.SigningMethodHS512
case "HS384":
method = jwt.SigningMethodHS384
default: // 包含HS256和其他所有情况
method = jwt.SigningMethodHS256
}
// 生成令牌设置密钥
secret := fmt.Sprint(config.Get("jwt.secret"))
// 设置令牌过期时间
now := time.Now()
exp := now
if tokenType == "access" {
expiresIn := time.Duration(parse.Number(config.Get("jwt.expiresIn")))
exp = now.Add(expiresIn * time.Minute)
secret = "User_Access:" + secret
}
if tokenType == "refresh" {
refreshIn := time.Duration(parse.Number(config.Get("jwt.refreshIn")))
exp = now.Add(refreshIn * time.Minute)
secret = "User_Refresh:" + secret
}
// 生成令牌负荷绑定uuid标识
jwtToken := jwt.NewWithClaims(method, jwt.MapClaims{
constants.JWT_DEVICE_ID: deviceFingerprint,
constants.JWT_USER_ID: userId,
"exp": exp.Unix(), // 过期时间
"iat": now.Unix(), // 签发时间
"nbf": now.Add(-10 * time.Second).Unix(), // 生效时间
})
tokenStr, err := jwtToken.SignedString([]byte(secret))
if err != nil {
logger.Infof("jwt sign err : %v", err)
return "", 0
}
expSeconds := int64(exp.Sub(now).Seconds())
return tokenStr, expSeconds
}
// UserTokenVerify 校验令牌是否有效
// tokenType 令牌类型 access:访问令牌 refresh:刷新令牌
func UserTokenVerify(tokenStr string, tokenType string) (jwt.MapClaims, error) {
jwtToken, err := jwt.Parse(tokenStr, func(jToken *jwt.Token) (any, error) {
// 判断加密算法是预期的加密算法
if _, ok := jToken.Method.(*jwt.SigningMethodHMAC); ok {
secret := config.Get("jwt.secret").(string)
if tokenType == "access" {
secret = "User_Access:" + secret
}
if tokenType == "refresh" {
secret = "User_Refresh:" + secret
}
return []byte(secret), nil
}
return nil, jwt.ErrSignatureInvalid
})
if err != nil {
logger.Errorf("Token Verify Err: %v", err)
return nil, fmt.Errorf("token invalid")
}
// 如果解析负荷成功并通过签名校验
claims, ok := jwtToken.Claims.(jwt.MapClaims)
if ok && jwtToken.Valid {
return claims, nil
}
return nil, fmt.Errorf("token valid error")
}
// UserInfoRemove 清除访问用户信息缓存
func UserInfoRemove(tokenStr string) (string, error) {
claims, err := UserTokenVerify(tokenStr, "access")
if err != nil {
logger.Errorf("token verify err %v", err)
return "", err
}
info := UserInfoGet(claims)
if info.User.UserName != "" {
// 清除缓存KEY
deviceId := fmt.Sprint(claims[constants.JWT_DEVICE_ID])
tokenKey := constants.CACHE_TOKEN_DEVICE + ":" + deviceId
return info.User.UserName, redis.Del("", tokenKey)
}
return "", fmt.Errorf("token invalid")
}
// UserInfoCreate 生成访问用户信息缓存
func UserInfoCreate(info *UserInfo, deviceFingerprint string, ilobArr [4]string) {
info.DeviceId = deviceFingerprint
// 设置请求用户登录客户端
info.LoginIp = ilobArr[0]
info.LoginLocation = ilobArr[1]
info.OS = ilobArr[2]
info.Browser = ilobArr[3]
expiresIn := time.Duration(parse.Number(config.Get("jwt.expiresIn")))
now := time.Now()
exp := now.Add(expiresIn * time.Minute)
info.LoginTime = now.UnixMilli()
info.ExpireTime = exp.UnixMilli()
// 设置新登录IP和登录时间
info.User.LoginIp = info.LoginIp
info.User.LoginTime = info.LoginTime
info.User.Password = ""
// 登录信息标识缓存
tokenKey := constants.CACHE_TOKEN_DEVICE + ":" + info.DeviceId
jsonBytes, err := json.Marshal(info)
if err != nil {
return
}
_ = redis.Set("", tokenKey, string(jsonBytes), expiresIn*time.Minute)
}
// UserInfoUpdate 更新访问用户信息缓存
func UserInfoUpdate(info UserInfo) {
info.User.Password = ""
// 登录信息标识缓存
tokenKey := constants.CACHE_TOKEN_DEVICE + ":" + info.DeviceId
jsonBytes, err := json.Marshal(info)
if err != nil {
return
}
expiresIn, _ := redis.GetExpire("", tokenKey)
expiration := time.Duration(expiresIn) * time.Second
_ = redis.Set("", tokenKey, string(jsonBytes), expiration)
}
// UserInfoGet 缓存的访问用户信息
func UserInfoGet(claims jwt.MapClaims) UserInfo {
info := UserInfo{}
deviceId := fmt.Sprint(claims[constants.JWT_DEVICE_ID])
tokenKey := constants.CACHE_TOKEN_DEVICE + ":" + deviceId
hasKey, err := redis.Has("", tokenKey)
if hasKey > 0 && err == nil {
infoStr, err := redis.Get("", tokenKey)
if infoStr == "" || err != nil {
return info
}
if err := json.Unmarshal([]byte(infoStr), &info); err != nil {
logger.Errorf("info json err : %v", err)
return info
}
}
return info
}

View File

@@ -0,0 +1,31 @@
package crypto
import (
"crypto/hmac"
"crypto/md5"
"crypto/sha256"
"encoding/base64"
"encoding/hex"
"fmt"
)
// SHA256ToBase64 编码字符串
func SHA256ToBase64(str string) string {
hash := sha256.Sum256([]byte(str))
return base64.URLEncoding.EncodeToString(hash[:])
}
// SHA256Hmac HMAC-SHA256算法
func SHA256Hmac(key string, data string) string {
mac := hmac.New(sha256.New, []byte(key))
mac.Write([]byte(data))
return hex.EncodeToString(mac.Sum(nil))
}
// MD5 md5加密
func MD5(str string) (md5str string) {
data := []byte(str)
has := md5.Sum(data)
md5str = fmt.Sprintf("%x", has)
return md5str
}

View File

@@ -19,9 +19,9 @@ func Setup(router *gin.Engine) {
guideGroup := router.Group("/bootloader")
{
guideGroup.POST("", controller.NewBootloader.Start)
guideGroup.PUT("", middleware.PreAuthorize(nil), controller.NewBootloader.Done)
guideGroup.DELETE("", middleware.PreAuthorize(nil), controller.NewBootloader.Reset)
guideGroup.PUT("/account", middleware.PreAuthorize(nil), controller.NewBootloader.Account)
guideGroup.PUT("", middleware.AuthorizeUser(nil), controller.NewBootloader.Done)
guideGroup.DELETE("", middleware.AuthorizeUser(nil), controller.NewBootloader.Reset)
guideGroup.PUT("/account", middleware.AuthorizeUser(nil), controller.NewBootloader.Account)
}
// 验证码操作
@@ -34,20 +34,17 @@ func Setup(router *gin.Engine) {
controller.NewCaptcha.Image,
)
// 账号身份操作处理
// 账号身份操作
{
router.POST("/login",
router.POST("/auth/login",
middleware.RateLimit(middleware.LimitOption{
Time: 180,
Count: 15,
Type: middleware.LIMIT_IP,
}),
middleware.CryptoApi(true, true),
controller.NewAccount.Login,
)
router.GET("/me", middleware.PreAuthorize(nil), controller.NewAccount.Me)
router.GET("/router", middleware.PreAuthorize(nil), controller.NewAccount.Router)
router.POST("/logout",
router.POST("/auth/logout",
middleware.RateLimit(middleware.LimitOption{
Time: 120,
Count: 15,
@@ -55,17 +52,32 @@ func Setup(router *gin.Engine) {
}),
controller.NewAccount.Logout,
)
router.POST("/auth/refresh-token",
middleware.RateLimit(middleware.LimitOption{
Time: 60,
Count: 5,
Type: middleware.LIMIT_IP,
}),
controller.NewAccount.RefreshToken,
)
router.GET("/me",
middleware.AuthorizeUser(nil),
controller.NewAccount.Me,
)
router.GET("/router",
middleware.AuthorizeUser(nil),
controller.NewAccount.Router,
)
}
// 账号注册操作
{
router.POST("/register",
router.POST("/auth/register",
middleware.RateLimit(middleware.LimitOption{
Time: 300,
Count: 10,
Type: middleware.LIMIT_IP,
}),
middleware.CryptoApi(true, true),
controller.NewRegister.Register,
)
}

View File

@@ -2,7 +2,7 @@ package controller
import (
"fmt"
"strings"
"time"
"be.ems/src/framework/config"
"be.ems/src/framework/constants"
@@ -10,6 +10,7 @@ import (
"be.ems/src/framework/reqctx"
"be.ems/src/framework/resp"
"be.ems/src/framework/token"
"be.ems/src/framework/utils/parse"
"be.ems/src/modules/auth/model"
"be.ems/src/modules/auth/service"
systemModelVO "be.ems/src/modules/system/model/vo"
@@ -34,7 +35,7 @@ type AccountController struct {
// Login 系统登录
//
// POST /login
// POST /auth/login
//
// @Tags common/authorization
// @Accept json
@@ -43,13 +44,13 @@ type AccountController struct {
// @Success 200 {object} object "Response Results"
// @Summary System Login
// @Description System Login
// @Router /login [post]
// @Router /auth/login [post]
func (s AccountController) Login(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body model.LoginBody
if err := c.ShouldBindJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -59,27 +60,31 @@ func (s AccountController) Login(c *gin.Context) {
// 校验验证码 根据错误信息,创建系统访问记录
if err := s.accountService.ValidateCaptcha(body.Code, body.UUID); err != nil {
msg := fmt.Sprintf("%s code: %s", err.Error(), body.Code)
msg := fmt.Sprintf("%s code %s", err.Error(), body.Code)
s.sysLogLoginService.Insert(
body.Username, constants.STATUS_NO, msg,
[4]string{ipaddr, location, os, browser},
)
c.JSON(400, resp.CodeMsg(40012, i18n.TKey(language, err.Error())))
c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error())))
return
}
// 登录用户信息
loginUser, err := s.accountService.ByUsername(body.Username, body.Password)
info, err := s.accountService.ByUsername(body.Username, body.Password)
if err != nil {
s.sysLogLoginService.Insert(
body.Username, constants.STATUS_NO, err.Error(),
[4]string{ipaddr, location, os, browser},
)
c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error())))
return
}
data := map[string]any{}
if !config.IsSystemUser(loginUser.UserId) {
if !config.IsSystemUser(info.UserId) {
// 强制改密码
forcePasswdChange, err := s.accountService.PasswordCountOrExpireTime(loginUser.User.LoginCount, loginUser.User.PasswordUpdateTime)
forcePasswdChange, err := s.accountService.PasswordCountOrExpireTime(info.User.LoginCount, info.User.PasswordUpdateTime)
if err != nil {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error())))
return
@@ -89,25 +94,132 @@ func (s AccountController) Login(c *gin.Context) {
}
}
// 生成令牌,创建系统访问记录
tokenStr := token.Create(&loginUser, [4]string{ipaddr, location, os, browser})
if tokenStr == "" {
c.JSON(200, resp.Err(nil))
deviceFingerprint := reqctx.DeviceFingerprint(c, info.UserId)
// 生成访问令牌
accessToken, expiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "access")
if accessToken == "" || expiresIn == 0 {
c.JSON(200, resp.ErrMsg("token generation failed"))
return
}
// 生成刷新令牌
refreshToken, refreshExpiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "refresh")
// 记录令牌,创建系统访问记录
token.UserInfoCreate(&info, deviceFingerprint, [4]string{ipaddr, location, os, browser})
s.accountService.UpdateLoginDateAndIP(info)
s.sysLogLoginService.Insert(
body.Username, constants.STATUS_YES, "app.common.loginSuccess",
[4]string{ipaddr, location, os, browser},
)
data["tokenType"] = constants.HEADER_PREFIX
data["accessToken"] = accessToken
data["expiresIn"] = expiresIn
data["refreshToken"] = refreshToken
data["refreshExpiresIn"] = refreshExpiresIn
data["userId"] = info.UserId
c.JSON(200, resp.OkData(data))
}
// Logout 系统登出
//
// POST /auth/logout
func (s AccountController) Logout(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
tokenStr := reqctx.Authorization(c)
if tokenStr != "" {
// 存在token时记录退出信息
userName, err := token.UserInfoRemove(tokenStr)
if err != nil {
// 当前请求信息
ipaddr, location := reqctx.IPAddrLocation(c)
os, browser := reqctx.UaOsBrowser(c)
// 创建系统访问记录
s.sysLogLoginService.Insert(
userName, constants.STATUS_YES, "app.common.logoutSuccess",
[4]string{ipaddr, location, os, browser},
)
}
}
c.JSON(200, resp.OkMsg(i18n.TKey(language, "app.common.logoutSuccess")))
}
// RefreshToken 刷新Token
//
// POST /auth/refresh-token
func (s AccountController) RefreshToken(c *gin.Context) {
var body struct {
RefreshToken string `json:"refreshToken" binding:"required"` // 刷新令牌
}
if err := c.ShouldBindJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
} else {
s.accountService.UpdateLoginDateAndIP(loginUser)
// 登录成功
s.sysLogLoginService.Insert(
body.Username, constants.STATUS_YES, "app.common.loginSuccess",
[4]string{ipaddr, location, os, browser},
)
}
data["accessToken"] = tokenStr
data["tokenType"] = strings.TrimRight(constants.HEADER_PREFIX, " ")
data["expiresIn"] = (loginUser.ExpireTime - loginUser.LoginTime) / 1000
data["userId"] = loginUser.UserId
c.JSON(200, resp.OkData(data))
// 验证刷新令牌是否有效
claims, err := token.UserTokenVerify(body.RefreshToken, "refresh")
if err != nil {
c.JSON(401, resp.CodeMsg(401001, err.Error()))
return
}
userId := parse.Number(claims[constants.JWT_USER_ID])
// 登录用户信息
info, err := s.accountService.ByUserId(userId)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
}
// 设备指纹信息是否一致
deviceId := fmt.Sprint(claims[constants.JWT_DEVICE_ID])
deviceFingerprint := reqctx.DeviceFingerprint(c, userId)
if deviceId != deviceFingerprint {
c.JSON(200, resp.ErrMsg("device fingerprint mismatch"))
return
}
// 生成访问令牌
accessToken, expiresIn := token.UserTokenCreate(userId, deviceFingerprint, "access")
if accessToken == "" || expiresIn == 0 {
c.JSON(200, resp.ErrMsg("token generation failed"))
return
}
// 生成刷新令牌
now := time.Now()
exp, _ := claims.GetExpirationTime()
iat, _ := claims.GetIssuedAt()
refreshExpiresIn := int64(exp.Sub(now).Seconds())
refreshToken := body.RefreshToken
// 如果当前时间大于过期时间的一半,则生成新令牌
halfExp := exp.Add(-(exp.Sub(iat.Time)) / 2)
if now.After(halfExp) {
refreshToken, refreshExpiresIn = token.UserTokenCreate(userId, deviceFingerprint, "refresh")
}
// 当前请求信息
ipaddr, location := reqctx.IPAddrLocation(c)
os, browser := reqctx.UaOsBrowser(c)
// 记录令牌,创建系统访问记录
token.UserInfoCreate(&info, deviceFingerprint, [4]string{ipaddr, location, os, browser})
s.accountService.UpdateLoginDateAndIP(info)
s.sysLogLoginService.Insert(
info.User.UserName, constants.STATUS_YES, "Refresh Access Token Successful",
[4]string{ipaddr, location, os, browser},
)
// 返回访问令牌和刷新令牌
c.JSON(200, resp.OkData(map[string]any{
"tokenType": constants.HEADER_PREFIX,
"accessToken": accessToken,
"expiresIn": expiresIn,
"refreshToken": refreshToken,
"refreshExpiresIn": refreshExpiresIn,
"userId": userId,
}))
}
// Me 登录用户信息
@@ -126,7 +238,7 @@ func (s AccountController) Me(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
info, err := reqctx.LoginUser(c)
if err != nil {
c.JSON(401, resp.CodeMsg(40003, err.Error()))
c.JSON(401, resp.CodeMsg(401002, err.Error()))
return
}
@@ -146,7 +258,6 @@ func (s AccountController) Me(c *gin.Context) {
"roles": roles,
"permissions": perms,
}
if !isSystemUser {
// 强制改密码
forcePasswdChange, _ := s.accountService.PasswordCountOrExpireTime(info.User.LoginCount, info.User.PasswordUpdateTime)
@@ -170,12 +281,11 @@ func (s AccountController) Me(c *gin.Context) {
// @Description Login User Routing Information
// @Router /router [get]
func (s AccountController) Router(c *gin.Context) {
userId := reqctx.LoginUserToUserID(c)
loginUserId := reqctx.LoginUserToUserID(c)
// 前端路由,系统管理员拥有所有
isSystemUser := config.IsSystemUser(userId)
buildMenus := s.accountService.RouteMenus(userId, isSystemUser)
isSystemUser := config.IsSystemUser(loginUserId)
buildMenus := s.accountService.RouteMenus(loginUserId, isSystemUser)
// 闭包函数处理多语言
language := reqctx.AcceptLanguage(c)
var converI18n func(language string, arr *[]systemModelVO.Router)
@@ -191,36 +301,3 @@ func (s AccountController) Router(c *gin.Context) {
c.JSON(200, resp.OkData(buildMenus))
}
// Logout 系统登出
//
// POST /logout
//
// @Tags common/authorization
// @Accept json
// @Produce json
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary System Logout
// @Description System Logout
// @Router /logout [post]
func (s AccountController) Logout(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
tokenStr := reqctx.Authorization(c)
if tokenStr != "" {
// 存在token时记录退出信息
userName := token.Remove(tokenStr)
if userName != "" {
// 当前请求信息
ipaddr, location := reqctx.IPAddrLocation(c)
os, browser := reqctx.UaOsBrowser(c)
// 创建系统访问记录
s.sysLogLoginService.Insert(
userName, constants.STATUS_YES, "app.common.logoutSuccess",
[4]string{ipaddr, location, os, browser},
)
}
}
c.JSON(200, resp.OkMsg(i18n.TKey(language, "app.common.logoutSuccess")))
}

View File

@@ -1,10 +1,9 @@
package controller
import (
"strings"
"fmt"
"be.ems/src/framework/constants"
"be.ems/src/framework/i18n"
"be.ems/src/framework/reqctx"
"be.ems/src/framework/resp"
"be.ems/src/framework/token"
@@ -52,7 +51,7 @@ func (s *BootloaderController) Start(c *gin.Context) {
}
// 登录用户信息
loginUser := token.TokenInfo{
info := token.UserInfo{
UserId: sysUser.UserId,
DeptId: sysUser.DeptId,
User: sysUser,
@@ -60,23 +59,24 @@ func (s *BootloaderController) Start(c *gin.Context) {
}
// 当前请求信息
ipaddr, location := reqctx.IPAddrLocation(c)
os, browser := reqctx.UaOsBrowser(c)
deviceFingerprint := reqctx.DeviceFingerprint(c, info.UserId)
// 生成令牌,创建系统访问记录
tokenStr := token.Create(&loginUser, [4]string{ipaddr, location, os, browser})
if tokenStr == "" {
c.JSON(200, resp.Err(nil))
// 生成访问令牌
accessToken, expiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "access")
if accessToken == "" || expiresIn == 0 {
c.JSON(200, resp.ErrMsg("token generation failed"))
return
} else {
s.accountService.UpdateLoginDateAndIP(loginUser)
}
// 创建系统访问记录
s.accountService.UpdateLoginDateAndIP(info)
c.JSON(200, resp.OkData(map[string]any{
"accessToken": tokenStr,
"tokenType": strings.TrimRight(constants.HEADER_PREFIX, " "),
"expiresIn": (loginUser.ExpireTime - loginUser.LoginTime) / 1000,
"userId": loginUser.UserId,
"tokenType": constants.HEADER_PREFIX,
"accessToken": accessToken,
"expiresIn": expiresIn,
"refreshToken": "",
"refreshExpiresIn": 0,
"userId": info.UserId,
}))
}
@@ -102,7 +102,7 @@ func (s *BootloaderController) Done(c *gin.Context) {
}
// 清除授权信息
token.Remove(reqctx.Authorization(c))
token.UserInfoRemove(reqctx.Authorization(c))
c.JSON(200, resp.Ok(nil))
}
@@ -127,7 +127,7 @@ func (s *BootloaderController) Reset(c *gin.Context) {
}
// 清除授权信息
token.Remove(reqctx.Authorization(c))
token.UserInfoRemove(reqctx.Authorization(c))
c.JSON(200, resp.Ok(nil))
}
@@ -141,7 +141,8 @@ func (s *BootloaderController) Account(c *gin.Context) {
Password string `json:"password" binding:"required"`
}
if err := c.ShouldBindJSON(&body); err != nil {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}

View File

@@ -1,8 +1,12 @@
package controller
import (
"strings"
"time"
"github.com/gin-gonic/gin"
"github.com/mojocn/base64Captcha"
"be.ems/src/framework/config"
"be.ems/src/framework/constants"
"be.ems/src/framework/database/redis"
@@ -10,42 +14,30 @@ import (
"be.ems/src/framework/resp"
"be.ems/src/framework/utils/parse"
systemService "be.ems/src/modules/system/service"
"github.com/gin-gonic/gin"
"github.com/mojocn/base64Captcha"
)
// 实例化控制层 CaptchaController 结构体
// NewCaptcha 实例化控制层
var NewCaptcha = &CaptchaController{
sysConfigService: systemService.NewSysConfig,
}
// 验证码操作处理
// CaptchaController 验证码操作 控制层处理
//
// PATH /
type CaptchaController struct {
sysConfigService *systemService.SysConfig // 参数配置服务
}
// 获取验证码
// Image 获取验证码-图片
//
// GET /captchaImage
//
// @Tags common
// @Accept json
// @Produce json
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary Get CAPTCHA
// @Description Get CAPTCHA
// @Router /captchaImage [get]
func (s *CaptchaController) Image(c *gin.Context) {
// GET /captcha-image
func (s CaptchaController) Image(c *gin.Context) {
// 从数据库配置获取验证码开关 true开启false关闭
captchaEnabledStr := s.sysConfigService.FindValueByKey("sys.account.captchaEnabled")
captchaEnabled := parse.Boolean(captchaEnabledStr)
if !captchaEnabled {
c.JSON(200, resp.Ok(map[string]any{
"captchaEnabled": captchaEnabled,
c.JSON(200, resp.OkData(map[string]any{
"enabled": captchaEnabled,
}))
return
}
@@ -53,14 +45,16 @@ func (s *CaptchaController) Image(c *gin.Context) {
// 生成唯一标识
verifyKey := ""
data := map[string]any{
"captchaEnabled": captchaEnabled,
"uuid": "",
"img": "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",
"enabled": captchaEnabled,
"uuid": "",
"img": "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",
}
// 验证码有效期,单位秒
captchaExpiration := 2 * 60 * time.Second
// 从数据库配置获取验证码类型 math 数值计算 char 字符验证
captchaType := s.sysConfigService.FindValueByKey("sys.account.captchaType")
if captchaType == constants.CAPTCHA_TYPE_MATH {
if captchaType == "math" {
math := config.Get("mathCaptcha").(map[string]any)
driverCaptcha := &base64Captcha.DriverMath{
//Height png height in pixel.
@@ -81,16 +75,15 @@ func (s *CaptchaController) Image(c *gin.Context) {
// 验证码表达式解析输出
item, err := driverCaptcha.DrawCaptcha(question)
if err != nil {
logger.Infof("Generate Id Question Answer %s %s : %v", captchaType, question, err)
logger.Infof("generate id question answer %s %s : %v", captchaType, question, err)
} else {
data["uuid"] = id
data["img"] = item.EncodeB64string()
expiration := constants.CAPTCHA_EXPIRATION * time.Second
verifyKey = constants.CACHE_CAPTCHA_CODE + ":" + id
redis.SetByExpire("", verifyKey, answer, expiration)
_ = redis.Set("", verifyKey, answer, captchaExpiration)
}
}
if captchaType == constants.CAPTCHA_TYPE_CHAR {
if captchaType == "char" {
char := config.Get("charCaptcha").(map[string]any)
driverCaptcha := &base64Captcha.DriverString{
//Height png height in pixel.
@@ -115,13 +108,12 @@ func (s *CaptchaController) Image(c *gin.Context) {
// 验证码表达式解析输出
item, err := driverCaptcha.DrawCaptcha(question)
if err != nil {
logger.Infof("Generate Id Question Answer %s %s : %v", captchaType, question, err)
logger.Infof("generate id question answer %s %s : %v", captchaType, question, err)
} else {
data["uuid"] = id
data["img"] = item.EncodeB64string()
expiration := constants.CAPTCHA_EXPIRATION * time.Second
verifyKey = constants.CACHE_CAPTCHA_CODE + ":" + id
redis.SetByExpire("", verifyKey, answer, expiration)
_ = redis.Set("", verifyKey, strings.ToLower(answer), captchaExpiration)
}
}
@@ -129,8 +121,8 @@ func (s *CaptchaController) Image(c *gin.Context) {
if config.Env() == "local" {
text, _ := redis.Get("", verifyKey)
data["text"] = text
c.JSON(200, resp.Ok(data))
c.JSON(200, resp.OkData(data))
return
}
c.JSON(200, resp.Ok(data))
c.JSON(200, resp.OkData(data))
}

View File

@@ -29,15 +29,32 @@ type RegisterController struct {
sysLogLoginService *systemService.SysLogLogin // 系统登录访问服务
}
// 账号注册
// Register 账号注册
//
// GET /register
func (s *RegisterController) Register(c *gin.Context) {
// POST /auth/register
func (s RegisterController) Register(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body model.RegisterBody
if err := c.ShouldBindJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 当前请求信息
ipaddr, location := reqctx.IPAddrLocation(c)
os, browser := reqctx.UaOsBrowser(c)
// 校验验证码
err := s.registerService.ValidateCaptcha(body.Code, body.UUID)
// 根据错误信息,创建系统访问记录
if err != nil {
msg := fmt.Sprintf("%s code %s", err.Error(), body.Code)
s.sysLogLoginService.Insert(
body.Username, constants.STATUS_NO, msg,
[4]string{ipaddr, location, os, browser},
)
c.JSON(200, resp.ErrMsg(err.Error()))
return
}
@@ -47,15 +64,9 @@ func (s *RegisterController) Register(c *gin.Context) {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "register.errUsername")))
return
}
// if !regular.ValidPassword(body.Password) {
// // 登录密码至少包含大小写字母、数字、特殊符号且不少于6位
// c.JSON(200, resp.ErrMsg(i18n.TKey(language, "register.errPasswd")))
// return
// }
// 检查用户密码策略强度
ok, errMsg := s.registerService.ValidatePasswordPolicy(body.Password, language)
if !ok {
c.JSON(200, resp.ErrMsg(errMsg))
if !regular.ValidPassword(body.Password) {
// 登录密码至少包含大小写字母、数字、特殊符号且不少于6位
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "register.errPasswd")))
return
}
if body.Password != body.ConfirmPassword {
@@ -64,26 +75,7 @@ func (s *RegisterController) Register(c *gin.Context) {
return
}
// 当前请求信息
ipaddr, location := reqctx.IPAddrLocation(c)
os, browser := reqctx.UaOsBrowser(c)
// 校验验证码
err := s.registerService.ValidateCaptcha(
body.Code,
body.UUID,
)
// 根据错误信息,创建系统访问记录
if err != nil {
msg := err.Error() + " code: " + body.Code
s.sysLogLoginService.Insert(
body.Username, constants.STATUS_NO, msg,
[4]string{ipaddr, location, os, browser},
)
c.JSON(200, resp.ErrMsg(err.Error()))
return
}
// 进行注册
userId, err := s.registerService.ByUserName(body.Username, body.Password)
if err == nil {
msg := i18n.TTemplate(language, "register.successMsg", map[string]any{"name": body.Username, "id": userId})

View File

@@ -56,25 +56,25 @@ func (s *Account) ValidateCaptcha(code, uuid string) error {
}
// ByUsername 登录创建用户信息
func (s Account) ByUsername(username, password string) (token.TokenInfo, error) {
tokenInfo := token.TokenInfo{}
func (s Account) ByUsername(username, password string) (token.UserInfo, error) {
info := token.UserInfo{}
// 检查密码重试次数
retryKey, retryCount, lockTime, err := s.passwordRetryCount(username)
if err != nil {
return tokenInfo, err
return info, err
}
// 查询用户登录账号
sysUser := s.sysUserService.FindByUserName(username)
if sysUser.UserName != username {
return tokenInfo, fmt.Errorf("login.errNameOrPasswd")
return info, fmt.Errorf("login.errNameOrPasswd")
}
if sysUser.DelFlag == constants.STATUS_YES {
return tokenInfo, fmt.Errorf("login.errDelFlag")
return info, fmt.Errorf("login.errDelFlag")
}
if sysUser.StatusFlag == constants.STATUS_NO {
return tokenInfo, fmt.Errorf("login.errStatus")
return info, fmt.Errorf("login.errStatus")
}
// 检验用户密码
@@ -82,31 +82,61 @@ func (s Account) ByUsername(username, password string) (token.TokenInfo, error)
if compareBool {
s.CleanLoginRecordCache(sysUser.UserName) // 清除错误记录次数
} else {
_ = redis.SetByExpire("", retryKey, retryCount+1, lockTime)
return tokenInfo, fmt.Errorf("login.errNameOrPasswd")
_ = redis.Set("", retryKey, retryCount+1, lockTime)
return info, fmt.Errorf("login.errNameOrPasswd")
}
// 登录用户信息
tokenInfo.UserId = sysUser.UserId
tokenInfo.DeptId = sysUser.DeptId
tokenInfo.User = sysUser
info.UserId = sysUser.UserId
info.DeptId = sysUser.DeptId
info.User = sysUser
// 用户权限组标识
if config.IsSystemUser(sysUser.UserId) {
tokenInfo.Permissions = []string{constants.SYS_PERMISSION_SYSTEM}
info.Permissions = []string{constants.SYS_PERMISSION_SYSTEM}
} else {
perms := s.sysMenuService.FindPermsByUserId(sysUser.UserId)
tokenInfo.Permissions = parse.RemoveDuplicates(perms)
info.Permissions = parse.RemoveDuplicates(perms)
}
return tokenInfo, nil
return info, nil
}
// ByUserId 用户ID刷新令牌创建用户信息
func (s Account) ByUserId(userId int64) (token.UserInfo, error) {
info := token.UserInfo{}
// 查询用户登录账号
sysUser := s.sysUserService.FindById(userId)
if sysUser.UserId != userId {
return info, fmt.Errorf("user does not exist")
}
if sysUser.DelFlag == constants.STATUS_YES {
return info, fmt.Errorf("sorry, your account has been deleted. Sorry, your account has been deleted")
}
if sysUser.StatusFlag == constants.STATUS_NO {
return info, fmt.Errorf("sorry, your account has been disabled")
}
// 登录用户信息
info.UserId = sysUser.UserId
info.DeptId = sysUser.DeptId
info.User = sysUser
// 用户权限组标识
if config.IsSystemUser(sysUser.UserId) {
info.Permissions = []string{constants.SYS_PERMISSION_SYSTEM}
} else {
perms := s.sysMenuService.FindPermsByUserId(sysUser.UserId)
info.Permissions = parse.RemoveDuplicates(perms)
}
return info, nil
}
// UpdateLoginDateAndIP 更新登录时间和IP
func (s Account) UpdateLoginDateAndIP(tokenInfo token.TokenInfo) bool {
user := s.sysUserService.FindById(tokenInfo.UserId)
func (s Account) UpdateLoginDateAndIP(info token.UserInfo) bool {
user := s.sysUserService.FindById(info.UserId)
user.Password = "" // 密码不更新
user.LoginCount += 1
user.LoginIp = tokenInfo.LoginIp
user.LoginTime = tokenInfo.LoginTime
user.LoginIp = info.LoginIp
user.LoginTime = info.LoginTime
return s.sysUserService.Update(user) > 0
}

View File

@@ -1,13 +1,10 @@
package service
import (
"encoding/json"
"fmt"
"regexp"
"be.ems/src/framework/constants"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/i18n"
"be.ems/src/framework/utils/parse"
systemModel "be.ems/src/modules/system/model"
systemService "be.ems/src/modules/system/service"
@@ -81,7 +78,7 @@ func (s Register) ByUserName(username, password string) (int64, error) {
if insertId > 0 {
return insertId, nil
}
return 0, fmt.Errorf("failed to register user [%s]. Please contact the system administrator", username)
return 0, fmt.Errorf("failed to register user [%s]. Please contact the GM", username)
}
// registerRoleInit 注册初始角色
@@ -93,45 +90,3 @@ func (s Register) registerRoleInit() []int64 {
func (s Register) registerPostInit() []int64 {
return []int64{}
}
// ValidatePasswordPolicy 判断密码策略强度
func (s Register) ValidatePasswordPolicy(password string, errLang string) (bool, string) {
passwordPolicyStr := s.sysConfigService.FindValueByKey("sys.user.passwordPolicy")
if passwordPolicyStr == "" {
// 未配置密码策略
return false, i18n.TKey(errLang, "config.sys.user.passwordPolicyNot")
}
var policy struct {
MinLength int `json:"minLength"`
SpecialChars int `json:"specialChars"`
Uppercase int `json:"uppercase"`
Lowercase int `json:"lowercase"`
}
err := json.Unmarshal([]byte(passwordPolicyStr), &policy)
if err != nil {
return false, err.Error()
}
errMsg := i18n.TTemplate(errLang, "sys.user.passwordPolicyError", map[string]any{
"minLength": policy.MinLength,
"specialChars": policy.SpecialChars,
"uppercase": policy.Uppercase,
"lowercase": policy.Lowercase,
})
specialChars := len(regexp.MustCompile(`[!@#$%^&*(),.?":{}|<>]`).FindAllString(password, -1))
if specialChars < policy.SpecialChars {
return false, errMsg
}
uppercase := len(regexp.MustCompile(`[A-Z]`).FindAllString(password, -1))
if uppercase < policy.Uppercase {
return false, errMsg
}
lowercase := len(regexp.MustCompile(`[a-z]`).FindAllString(password, -1))
if lowercase < policy.Lowercase {
return false, errMsg
}
return true, ""
}

View File

@@ -17,20 +17,20 @@ func Setup(router *gin.Engine) {
chartGraphGroup := router.Group("/chart/graph")
{
chartGraphGroup.GET("",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewChartGraph.Load,
)
chartGraphGroup.GET("/groups",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewChartGraph.GroupNames,
)
chartGraphGroup.POST("",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.chartGraph", collectlogs.BUSINESS_TYPE_UPDATE)),
controller.NewChartGraph.Save,
)
chartGraphGroup.DELETE("/:group",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.chartGraph", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewChartGraph.Delete,
)

View File

@@ -3,8 +3,6 @@ package controller
import (
"fmt"
"be.ems/src/framework/i18n"
"be.ems/src/framework/reqctx"
"be.ems/src/framework/resp"
"be.ems/src/modules/chart/service"
@@ -62,7 +60,7 @@ func (s *ChartGraphController) Load(c *gin.Context) {
}
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -94,7 +92,7 @@ func (s *ChartGraphController) Save(c *gin.Context) {
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -125,10 +123,9 @@ func (s *ChartGraphController) Save(c *gin.Context) {
// @Description Deleting Relationship Diagram Data
// @Router /chart/graph/{group} [delete]
func (s *ChartGraphController) Delete(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
group := c.Param("group")
if group == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: group is empty"))
return
}

View File

@@ -25,21 +25,21 @@ func Setup(router *gin.Engine) {
// 通用请求
commonGroup := router.Group("/common")
{
commonGroup.POST("/hash", middleware.PreAuthorize(nil), controller.NewCommon.Hash)
commonGroup.POST("/hash", middleware.AuthorizeUser(nil), controller.NewCommon.Hash)
commonGroup.GET("/i18n", controller.NewCommon.I18n)
}
// 文件操作处理
fileGroup := router.Group("/file")
{
fileGroup.POST("/upload", middleware.PreAuthorize(nil), controller.NewFile.Upload)
fileGroup.POST("/chunk-check", middleware.PreAuthorize(nil), controller.NewFile.ChunkCheck)
fileGroup.POST("/chunk-upload", middleware.PreAuthorize(nil), controller.NewFile.ChunkUpload)
fileGroup.POST("/chunk-merge", middleware.PreAuthorize(nil), controller.NewFile.ChunkMerge)
fileGroup.GET("/download/:filePath", middleware.PreAuthorize(nil), controller.NewFile.Download)
fileGroup.GET("/list", middleware.PreAuthorize(nil), controller.NewFile.List)
fileGroup.GET("", middleware.PreAuthorize(nil), controller.NewFile.File)
fileGroup.DELETE("", middleware.PreAuthorize(nil), controller.NewFile.Remove)
fileGroup.POST("/transfer-static-file", middleware.PreAuthorize(nil), controller.NewFile.TransferStaticFile)
fileGroup.POST("/upload", middleware.AuthorizeUser(nil), controller.NewFile.Upload)
fileGroup.POST("/chunk-check", middleware.AuthorizeUser(nil), controller.NewFile.ChunkCheck)
fileGroup.POST("/chunk-upload", middleware.AuthorizeUser(nil), controller.NewFile.ChunkUpload)
fileGroup.POST("/chunk-merge", middleware.AuthorizeUser(nil), controller.NewFile.ChunkMerge)
fileGroup.GET("/download/:filePath", middleware.AuthorizeUser(nil), controller.NewFile.Download)
fileGroup.GET("/list", middleware.AuthorizeUser(nil), controller.NewFile.List)
fileGroup.GET("", middleware.AuthorizeUser(nil), controller.NewFile.File)
fileGroup.DELETE("", middleware.AuthorizeUser(nil), controller.NewFile.Remove)
fileGroup.POST("/transfer-static-file", middleware.AuthorizeUser(nil), controller.NewFile.TransferStaticFile)
}
}

View File

@@ -11,6 +11,7 @@ import (
"be.ems/src/framework/i18n"
"be.ems/src/framework/reqctx"
"be.ems/src/framework/resp"
"github.com/gin-gonic/gin"
)
@@ -31,10 +32,8 @@ func (s CommonController) Hash(c *gin.Context) {
Str string `json:"str" binding:"required"`
}
if err := c.ShouldBindJSON(&body); err != nil {
c.JSON(200, gin.H{
"code": 400,
"msg": "参数错误",
})
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}

View File

@@ -34,13 +34,13 @@ func (s *FileController) Download(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
filePath := c.Param("filePath")
if len(filePath) < 8 {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, i18n.TKey(language, "app.common.err400")))
return
}
// base64解析出地址
decodedBytes, err := base64.StdEncoding.DecodeString(filePath)
if err != nil {
c.JSON(400, resp.CodeMsg(400, err.Error()))
c.JSON(422, resp.CodeMsg(422002, err.Error()))
return
}
routerPath := string(decodedBytes)
@@ -87,14 +87,14 @@ func (s *FileController) Upload(c *gin.Context) {
// 上传的文件
formFile, err := c.FormFile("file")
if err != nil {
c.JSON(400, resp.CodeMsg(40010, "bind err: file is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: file is empty"))
return
}
// 子路径需要在指定范围内
subPath := c.PostForm("subPath")
_, ok := constants.UPLOAD_SUB_PATH[subPath]
if subPath != "" && !ok {
c.JSON(400, resp.CodeMsg(40010, "bind err: subPath not in range"))
c.JSON(422, resp.CodeMsg(422002, "bind err: subPath not in range"))
return
}
if subPath == "" {
@@ -134,9 +134,9 @@ func (s *FileController) ChunkCheck(c *gin.Context) {
Identifier string `json:"identifier" binding:"required"` // 唯一标识
FileName string `json:"fileName" binding:"required"` // 文件名
}
if err := c.ShouldBindJSON(&body); err != nil {
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -168,14 +168,14 @@ func (s *FileController) ChunkMerge(c *gin.Context) {
FileName string `json:"fileName" binding:"required"` // 文件名
SubPath string `json:"subPath"` // 子路径类型
}
if err := c.ShouldBindJSON(&body); err != nil {
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 子路径需要在指定范围内
if _, ok := constants.UPLOAD_SUB_PATH[body.SubPath]; body.SubPath != "" && !ok {
c.JSON(400, resp.CodeMsg(40010, "bind err: subPath not in range"))
c.JSON(422, resp.CodeMsg(422002, "bind err: subPath not in range"))
return
}
if body.SubPath == "" {
@@ -218,13 +218,13 @@ func (s *FileController) ChunkUpload(c *gin.Context) {
// 切片唯一标识
identifier := c.PostForm("identifier")
if index == "" || identifier == "" {
c.JSON(400, resp.CodeMsg(40010, "bind err: index and identifier must be set"))
c.JSON(422, resp.CodeMsg(422002, "bind err: index and identifier must be set"))
return
}
// 上传的文件
formFile, err := c.FormFile("file")
if err != nil {
c.JSON(400, resp.CodeMsg(40010, "bind err: file is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: file is empty"))
return
}
@@ -262,7 +262,7 @@ func (s *FileController) List(c *gin.Context) {
}
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -322,7 +322,7 @@ func (s *FileController) File(c *gin.Context) {
}
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -373,7 +373,7 @@ func (s *FileController) Remove(c *gin.Context) {
}
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -418,7 +418,7 @@ func (s *FileController) TransferStaticFile(c *gin.Context) {
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -429,7 +429,7 @@ func (s *FileController) TransferStaticFile(c *gin.Context) {
static := config.Get("staticFile.default").(map[string]any)
dir, err := filepath.Abs(static["dir"].(string))
if err != nil {
c.JSON(400, resp.CodeMsg(400, err.Error()))
c.JSON(200, resp.ErrMsg(err.Error()))
return
}
@@ -439,7 +439,7 @@ func (s *FileController) TransferStaticFile(c *gin.Context) {
err = file.CopyUploadFile(body.UploadPath, newFile)
if err != nil {
c.JSON(400, resp.CodeMsg(400, err.Error()))
c.JSON(200, resp.ErrMsg(err.Error()))
return
}

View File

@@ -50,7 +50,7 @@ func (s *MonitorController) Load(c *gin.Context) {
}
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}

View File

@@ -48,13 +48,15 @@ func (s *SysCacheController) Info(c *gin.Context) {
func (s SysCacheController) Names(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
caches := []model.SysCache{
model.NewNames(i18n.TKey(language, "cache.name.user"), constants.CACHE_LOGIN_TOKEN),
model.NewNames(i18n.TKey(language, "cache.name.token"), constants.CACHE_TOKEN_DEVICE),
model.NewNames(i18n.TKey(language, "cache.name.sys_config"), constants.CACHE_SYS_CONFIG),
model.NewNames(i18n.TKey(language, "cache.name.sys_dict"), constants.CACHE_SYS_DICT),
model.NewNames(i18n.TKey(language, "cache.name.captcha_codes"), constants.CACHE_CAPTCHA_CODE),
model.NewNames(i18n.TKey(language, "cache.name.repeat_submit"), constants.CACHE_REPEAT_SUBMIT),
model.NewNames(i18n.TKey(language, "cache.name.rate_limit"), constants.CACHE_RATE_LIMIT),
model.NewNames(i18n.TKey(language, "cache.name.pwd_err_cnt"), constants.CACHE_PWD_ERR_COUNT),
model.NewNames(i18n.TKey(language, "cache.name.oauth2_codes"), constants.CACHE_OAUTH2_CODE),
model.NewNames(i18n.TKey(language, "cache.name.oauth2_devices"), constants.CACHE_OAUTH2_DEVICE),
model.NewNames(i18n.TKey(language, "cache.name.i18n"), constants.CACHE_I18N),
model.NewNames(i18n.TKey(language, "cache.name.ne_info"), constants.CACHE_NE_INFO),
model.NewNames(i18n.TKey(language, "cache.name.ne_data"), constants.CACHE_NE_DATA),
@@ -71,7 +73,7 @@ func (s SysCacheController) Keys(c *gin.Context) {
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -94,7 +96,7 @@ func (s SysCacheController) Value(c *gin.Context) {
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -163,10 +165,10 @@ func (s SysCacheController) CleanKeys(c *gin.Context) {
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
if constants.CACHE_LOGIN_TOKEN == query.CacheName {
if constants.CACHE_TOKEN_DEVICE == query.CacheName {
c.JSON(200, resp.ErrMsg("Cannot delete user information cache"))
return
}
@@ -194,7 +196,7 @@ func (s SysCacheController) CleanValue(c *gin.Context) {
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}

View File

@@ -64,7 +64,7 @@ func (s *SysJobController) Info(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
jobId := parse.Number(c.Param("jobId"))
if jobId <= 0 {
c.JSON(400, resp.CodeMsg(40010, "bind err: jobId is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: jobId is empty"))
return
}
@@ -87,11 +87,11 @@ func (s *SysJobController) Add(c *gin.Context) {
var body model.SysJob
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
if body.JobId > 0 {
c.JSON(400, resp.CodeMsg(40010, "bind err: jobId not is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: jobId not is empty"))
return
}
@@ -143,11 +143,11 @@ func (s *SysJobController) Edit(c *gin.Context) {
var body model.SysJob
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
if body.JobId <= 0 {
c.JSON(400, resp.CodeMsg(40010, "bind err: jobId is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: jobId is empty"))
return
}
@@ -229,7 +229,7 @@ func (s *SysJobController) Remove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
jobId := c.Param("jobId")
if jobId == "" {
c.JSON(400, resp.CodeMsg(40010, "bind err: jobId is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: jobId is empty"))
return
}
@@ -261,7 +261,7 @@ func (s *SysJobController) Status(c *gin.Context) {
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -299,7 +299,7 @@ func (s *SysJobController) Run(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
jobId := parse.Number(c.Param("jobId"))
if jobId <= 0 {
c.JSON(400, resp.CodeMsg(40010, "bind err: jobId is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: jobId is empty"))
return
}

View File

@@ -73,7 +73,7 @@ func (s *SysJobLogController) List(c *gin.Context) {
func (s *SysJobLogController) Info(c *gin.Context) {
logId := parse.Number(c.Param("logId"))
if logId <= 0 {
c.JSON(400, resp.CodeMsg(40010, "bind err: logId is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: logId is empty"))
return
}
@@ -92,7 +92,7 @@ func (s *SysJobLogController) Remove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
logId := c.Param("logId")
if logId == "" {
c.JSON(400, resp.CodeMsg(40010, "bind err: logId is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: logId is empty"))
return
}
@@ -143,13 +143,6 @@ func (s *SysJobLogController) Export(c *gin.Context) {
return
}
// rows := s.sysJobLogService.SelectJobLogList(model.SysJobLog{})
if len(rows) <= 0 {
// 导出数据记录为空
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty")))
return
}
// 闭包函数处理多语言
converI18n := func(language string, arr *[]model.SysJobLog) {
for i := range *arr {

View File

@@ -46,7 +46,7 @@ func (s *SysUserOnlineController) List(c *gin.Context) {
userName := c.Query("userName")
// 获取所有在线用户key
keys, _ := redis.GetKeys("", constants.CACHE_LOGIN_TOKEN+":*")
keys, _ := redis.GetKeys("", constants.CACHE_TOKEN_DEVICE+":*")
// 分批获取
arr := make([]string, 0)
@@ -69,13 +69,13 @@ func (s *SysUserOnlineController) List(c *gin.Context) {
continue
}
var tokenInfo token.TokenInfo
err := json.Unmarshal([]byte(str), &tokenInfo)
var info token.UserInfo
err := json.Unmarshal([]byte(str), &info)
if err != nil {
continue
}
onlineUser := s.sysUserOnlineService.TokenInfoToUserOnline(tokenInfo)
onlineUser := s.sysUserOnlineService.UserInfoToUserOnline(info)
if onlineUser.TokenID != "" {
userOnlines = append(userOnlines, onlineUser)
}
@@ -122,15 +122,14 @@ func (s *SysUserOnlineController) List(c *gin.Context) {
func (s SysUserOnlineController) Logout(c *gin.Context) {
tokenIdStr := c.Param("tokenId")
if tokenIdStr == "" || strings.Contains(tokenIdStr, "*") {
c.JSON(400, resp.CodeMsg(40010, "bind err: tokenId is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: tokenId is empty"))
return
}
// 处理字符转id数组后去重
ids := strings.Split(tokenIdStr, ",")
uniqueIDs := parse.RemoveDuplicates(ids)
uniqueIDs := parse.RemoveDuplicatesToArray(tokenIdStr, ",")
for _, v := range uniqueIDs {
key := constants.CACHE_LOGIN_TOKEN + ":" + v
key := constants.CACHE_TOKEN_DEVICE + ":" + v
if err := redis.Del("", key); err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return

View File

@@ -23,15 +23,14 @@ func Setup(router *gin.Engine) {
monitorGroup := router.Group("/monitor")
{
monitorGroup.GET("/load",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewMonitor.Load,
)
}
// 服务器信息
router.GET("/monitor/system",
// middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:system:info"}}),
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:system:info"}}),
controller.NewSystem.Info,
)
@@ -39,11 +38,11 @@ func Setup(router *gin.Engine) {
sysUserOnlineGroup := router.Group("/monitor/user-online")
{
sysUserOnlineGroup.GET("/list",
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:online:list"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:online:list"}}),
controller.NewSysUserOnline.List,
)
sysUserOnlineGroup.DELETE("/logout/:tokenId",
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:online:logout"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:online:logout"}}),
controller.NewSysUserOnline.Logout,
)
}
@@ -52,32 +51,31 @@ func Setup(router *gin.Engine) {
sysCacheGroup := router.Group("/monitor/cache")
{
sysCacheGroup.GET("",
// middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:cache:info"}}),
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:cache:info"}}),
controller.NewSysCache.Info,
)
sysCacheGroup.GET("/names",
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:cache:list"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:cache:list"}}),
controller.NewSysCache.Names,
)
sysCacheGroup.GET("/keys",
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:cache:list"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:cache:list"}}),
controller.NewSysCache.Keys,
)
sysCacheGroup.GET("/value",
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:cache:query"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:cache:query"}}),
controller.NewSysCache.Value,
)
sysCacheGroup.DELETE("/names",
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:cache:remove"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:cache:remove"}}),
controller.NewSysCache.CleanNames,
)
sysCacheGroup.DELETE("/keys",
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:cache:remove"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:cache:remove"}}),
controller.NewSysCache.CleanKeys,
)
sysCacheGroup.DELETE("/value",
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:cache:remove"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:cache:remove"}}),
controller.NewSysCache.CleanValue,
)
}
@@ -86,26 +84,26 @@ func Setup(router *gin.Engine) {
sysJobLogGroup := router.Group("/monitor/job/log")
{
sysJobLogGroup.GET("/list",
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:job:list"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:job:list"}}),
controller.NewSysJobLog.List,
)
sysJobLogGroup.GET("/:logId",
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:job:query"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:job:query"}}),
controller.NewSysJobLog.Info,
)
sysJobLogGroup.DELETE("/:logId",
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:job:remove"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:job:remove"}}),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysJobLog", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewSysJobLog.Remove,
)
sysJobLogGroup.DELETE("/clean",
repeat.RepeatSubmit(5),
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:job:remove"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:job:remove"}}),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysJobLog", collectlogs.BUSINESS_TYPE_CLEAN)),
controller.NewSysJobLog.Clean,
)
sysJobLogGroup.GET("/export",
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:job:export"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:job:export"}}),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysJobLog", collectlogs.BUSINESS_TYPE_EXPORT)),
controller.NewSysJobLog.Export,
)
@@ -115,47 +113,47 @@ func Setup(router *gin.Engine) {
sysJobGroup := router.Group("/monitor/job")
{
sysJobGroup.GET("/list",
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:job:list"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:job:list"}}),
controller.NewSysJob.List,
)
sysJobGroup.GET("/:jobId",
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:job:query"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:job:query"}}),
controller.NewSysJob.Info,
)
sysJobGroup.POST("",
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:job:add"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:job:add"}}),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysJob", collectlogs.BUSINESS_TYPE_INSERT)),
controller.NewSysJob.Add,
)
sysJobGroup.PUT("",
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:job:edit"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:job:edit"}}),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysJob", collectlogs.BUSINESS_TYPE_UPDATE)),
controller.NewSysJob.Edit,
)
sysJobGroup.DELETE("/:jobId",
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:job:remove"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:job:remove"}}),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysJob", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewSysJob.Remove,
)
sysJobGroup.PUT("/status",
repeat.RepeatSubmit(5),
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:job:changeStatus"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:job:changeStatus"}}),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysJob", collectlogs.BUSINESS_TYPE_UPDATE)),
controller.NewSysJob.Status,
)
sysJobGroup.PUT("/run/:jobId",
repeat.RepeatSubmit(10),
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:job:changeStatus"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:job:changeStatus"}}),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysJob", collectlogs.BUSINESS_TYPE_UPDATE)),
controller.NewSysJob.Run,
)
sysJobGroup.PUT("/reset",
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:job:changeStatus"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:job:changeStatus"}}),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysJob", collectlogs.BUSINESS_TYPE_CLEAN)),
controller.NewSysJob.ResetQueueJob,
)
sysJobGroup.GET("/export",
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:job:export"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"monitor:job:export"}}),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysJob", collectlogs.BUSINESS_TYPE_EXPORT)),
controller.NewSysJob.Export,
)

View File

@@ -11,23 +11,23 @@ var NewSysUserOnline = &SysUserOnline{}
// SysUserOnline 在线用户 服务层处理
type SysUserOnline struct{}
// TokenInfoToUserOnline 在线用户信息
func (s SysUserOnline) TokenInfoToUserOnline(tokenInfo token.TokenInfo) model.SysUserOnline {
if tokenInfo.UserId <= 0 {
// UserInfoToUserOnline 在线用户信息
func (s SysUserOnline) UserInfoToUserOnline(info token.UserInfo) model.SysUserOnline {
if info.UserId <= 0 {
return model.SysUserOnline{}
}
sysUserOnline := model.SysUserOnline{
TokenID: tokenInfo.UUID,
UserName: tokenInfo.User.UserName,
LoginIp: tokenInfo.LoginIp,
LoginLocation: tokenInfo.LoginLocation,
Browser: tokenInfo.Browser,
OS: tokenInfo.OS,
LoginTime: tokenInfo.LoginTime,
TokenID: info.DeviceId,
UserName: info.User.UserName,
LoginIp: info.LoginIp,
LoginLocation: info.LoginLocation,
Browser: info.Browser,
OS: info.OS,
LoginTime: info.LoginTime,
}
if tokenInfo.User.DeptId > 0 {
sysUserOnline.DeptName = tokenInfo.User.Dept.DeptName
if info.User.DeptId > 0 {
sysUserOnline.DeptName = info.User.Dept.DeptName
}
return sysUserOnline
}

View File

@@ -57,7 +57,7 @@ func (s AlarmController) List(c *gin.Context) {
var query model.AlarmQuery
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 查询数据
@@ -72,7 +72,7 @@ func (s AlarmController) Remove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
id := c.Param("id")
if id == "" {
c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: id is empty"))
return
}
@@ -102,7 +102,7 @@ func (s AlarmController) Clear(c *gin.Context) {
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -125,7 +125,7 @@ func (s AlarmController) Ack(c *gin.Context) {
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -168,7 +168,7 @@ func (s AlarmController) Export(c *gin.Context) {
var query model.AlarmQuery
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 限制导出数据集

View File

@@ -43,7 +43,7 @@ func (s AlarmForwardController) List(c *gin.Context) {
var query model.AlarmForwardLogQuery
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 查询数据

View File

@@ -49,7 +49,7 @@ func (s AlarmLogController) List(c *gin.Context) {
var query model.AlarmLogQuery
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 查询数据
@@ -82,7 +82,7 @@ func (s AlarmLogController) Event(c *gin.Context) {
var query model.AlarmEventQuery
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 查询数据

View File

@@ -35,7 +35,7 @@ func (s BackupController) FTPUpdate(c *gin.Context) {
var body model.BackupDataFTP
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -72,7 +72,7 @@ func (s BackupController) FTPPush(c *gin.Context) {
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 判断路径是否合法

View File

@@ -49,7 +49,7 @@ func (s KPIController) KPIData(c *gin.Context) {
var querys model.KPIQuery
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -82,7 +82,7 @@ func (s KPIController) KPIData(c *gin.Context) {
func (s KPIController) KPITitle(c *gin.Context) {
neType := c.Query("neType")
if neType == "" {
c.JSON(400, resp.CodeMsg(40010, "bind err: neType is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: neType is empty"))
return
}
kpiTitles := s.kpiReportService.FindTitle(neType)

View File

@@ -53,7 +53,7 @@ func (s NBStateController) List(c *gin.Context) {
var query model.NBStateQuery
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -89,7 +89,7 @@ func (s NBStateController) Export(c *gin.Context) {
var querys model.NBStateQuery
if err := c.ShouldBindBodyWithJSON(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 限制导出数据集

View File

@@ -52,7 +52,7 @@ func (s *AMFController) UEList(c *gin.Context) {
var querys model.UEEventAMFQuery
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -86,7 +86,7 @@ func (s *AMFController) UERemove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
id := c.Param("id")
if id == "" {
c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: id is empty"))
return
}
@@ -126,7 +126,7 @@ func (s *AMFController) UEExport(c *gin.Context) {
var querys model.UEEventAMFQuery
if err := c.ShouldBindBodyWithJSON(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 限制导出数据集
@@ -181,7 +181,7 @@ func (s *AMFController) NbInfoList(c *gin.Context) {
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -221,7 +221,7 @@ func (s *AMFController) NbStateList(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
neId := c.Query("neId")
if neId == "" {
c.JSON(400, resp.CodeMsg(40010, "bind err: neId is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId is empty"))
return
}

View File

@@ -53,7 +53,7 @@ func (s *IMSController) CDRList(c *gin.Context) {
var querys model.CDREventIMSQuery
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -87,7 +87,7 @@ func (s *IMSController) CDRRemove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
id := c.Param("id")
if id == "" {
c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty"))
c.JSON(422, resp.CodeMsg(442002, "bind err: id is empty"))
return
}
@@ -127,7 +127,7 @@ func (s *IMSController) CDRExport(c *gin.Context) {
var querys model.CDREventIMSQuery
if err := c.ShouldBindBodyWithJSON(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 限制导出数据集
@@ -177,7 +177,7 @@ func (s *IMSController) UeSessionNum(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
neId := c.Query("neId")
if neId == "" {
c.JSON(400, resp.CodeMsg(40010, "bind err: neId is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId is empty"))
return
}
@@ -222,7 +222,7 @@ func (s *IMSController) UeSessionList(c *gin.Context) {
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}

View File

@@ -52,7 +52,7 @@ func (s *MMEController) UEList(c *gin.Context) {
var querys model.UEEventMMEQuery
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -86,7 +86,7 @@ func (s *MMEController) UERemove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
id := c.Param("id")
if id == "" {
c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: id is empty"))
return
}
@@ -126,7 +126,7 @@ func (s *MMEController) UEExport(c *gin.Context) {
var querys model.UEEventMMEQuery
if err := c.ShouldBindBodyWithJSON(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 限制导出数据集
@@ -181,7 +181,7 @@ func (s *MMEController) NbInfoList(c *gin.Context) {
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -221,7 +221,7 @@ func (s *MMEController) NbStateList(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
neId := c.Query("neId")
if neId == "" {
c.JSON(400, resp.CodeMsg(40010, "bind err: neId is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId is empty"))
return
}

View File

@@ -53,7 +53,7 @@ func (s *SGWCController) CDRList(c *gin.Context) {
var querys model.CDREventSGWCQuery
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -87,7 +87,7 @@ func (s *SGWCController) CDRRemove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
id := c.Param("id")
if id == "" {
c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: id is empty"))
return
}
@@ -127,7 +127,7 @@ func (s *SGWCController) CDRExport(c *gin.Context) {
var querys model.CDREventSGWCQuery
if err := c.ShouldBindBodyWithJSON(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 限制导出数据集

View File

@@ -55,7 +55,7 @@ func (s *SMFController) CDRList(c *gin.Context) {
var querys model.CDREventSMFQuery
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -89,7 +89,7 @@ func (s *SMFController) CDRRemove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
id := c.Param("id")
if id == "" {
c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: id is empty"))
return
}
@@ -129,7 +129,7 @@ func (s *SMFController) CDRExport(c *gin.Context) {
var querys model.CDREventSMFQuery
if err := c.ShouldBindBodyWithJSON(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 限制导出数据集
@@ -181,7 +181,8 @@ func (s *SMFController) SubUserNum(c *gin.Context) {
NeId string `form:"neId" binding:"required"`
}
if err := c.ShouldBindQuery(&query); err != nil {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -229,7 +230,8 @@ func (s *SMFController) SubUserList(c *gin.Context) {
PageNum string `form:"pageNum"`
}
if err := c.ShouldBindQuery(&query); err != nil {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}

View File

@@ -52,7 +52,7 @@ func (s *SMSCController) CDRList(c *gin.Context) {
var querys model.CDREventSMSCQuery
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -86,7 +86,7 @@ func (s *SMSCController) CDRRemove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
id := c.Param("id")
if id == "" {
c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: id is empty"))
return
}
@@ -126,7 +126,7 @@ func (s *SMSCController) CDRExport(c *gin.Context) {
var querys model.CDREventSMSCQuery
if err := c.ShouldBindBodyWithJSON(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 限制导出数据集

View File

@@ -49,10 +49,9 @@ type UDMAuthController struct {
// @Description UDM Authenticated User Data List Refresh Synchronization Latest
// @Router /neData/udm/auth/resetData/{neId} [put]
func (s *UDMAuthController) ResetData(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
neId := c.Param("neId")
if neId == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId is empty"))
return
}
@@ -101,7 +100,7 @@ func (s *UDMAuthController) Info(c *gin.Context) {
neId := c.Param("neId")
imsi := c.Param("imsi")
if neId == "" || imsi == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId/imsi is empty"))
return
}
@@ -156,14 +155,18 @@ func (s *UDMAuthController) Add(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
neId := c.Param("neId")
if neId == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId is empty"))
return
}
var body model.UDMAuthUser
err := c.ShouldBindBodyWithJSON(&body)
if err != nil || body.IMSI == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
if body.IMSI == "" {
c.JSON(422, resp.CodeMsg(422002, "bind err: imsi is empty"))
return
}
@@ -217,14 +220,18 @@ func (s *UDMAuthController) Adds(c *gin.Context) {
neId := c.Param("neId")
num := c.Param("num")
if neId == "" || num == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId/num is empty"))
return
}
var body model.UDMAuthUser
err := c.ShouldBindBodyWithJSON(&body)
if err != nil || body.IMSI == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
if body.IMSI == "" {
c.JSON(422, resp.CodeMsg(422002, "bind err: imsi is empty"))
return
}
@@ -276,14 +283,18 @@ func (s *UDMAuthController) Edit(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
neId := c.Param("neId")
if neId == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId is empty"))
return
}
var body model.UDMAuthUser
err := c.ShouldBindBodyWithJSON(&body)
if err != nil || body.IMSI == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
if body.IMSI == "" {
c.JSON(422, resp.CodeMsg(422002, "bind err: imsi is empty"))
return
}
@@ -336,7 +347,7 @@ func (s *UDMAuthController) Remove(c *gin.Context) {
neId := c.Param("neId")
imsi := c.Param("imsi")
if neId == "" || imsi == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId/imsi is empty"))
return
}
@@ -402,7 +413,7 @@ func (s *UDMAuthController) Removes(c *gin.Context) {
imsi := c.Param("imsi")
num := c.Param("num")
if neId == "" || imsi == "" || num == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId/imsi/num is empty"))
return
}
@@ -458,7 +469,7 @@ func (s *UDMAuthController) Export(c *gin.Context) {
neId := c.Query("neId")
fileType := c.Query("type")
if neId == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId is empty"))
return
}
if !(fileType == "csv" || fileType == "txt") {
@@ -546,7 +557,7 @@ func (s *UDMAuthController) Import(c *gin.Context) {
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}

View File

@@ -48,10 +48,9 @@ type UDMSubController struct {
// @Description UDM Subscriber User Reload Data
// @Router /neData/udm/sub/resetData/{neId} [put]
func (s *UDMSubController) ResetData(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
neId := c.Param("neId")
if neId == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId is empty"))
return
}
@@ -101,7 +100,7 @@ func (s *UDMSubController) Info(c *gin.Context) {
neId := c.Param("neId")
imsi := c.Param("imsi")
if neId == "" || imsi == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId or imsi is empty"))
return
}
@@ -156,18 +155,18 @@ func (s *UDMSubController) Add(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
neId := c.Param("neId")
if neId == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId is empty"))
return
}
var body model.UDMSubUser
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
if len(body.IMSI) != 15 {
c.JSON(400, resp.CodeMsg(40010, "bind err: IMSI length is not 15 bits"))
c.JSON(422, resp.CodeMsg(422002, "bind err: IMSI length is not 15 bits"))
return
}
@@ -222,18 +221,18 @@ func (s *UDMSubController) Adds(c *gin.Context) {
neId := c.Param("neId")
num := c.Param("num")
if neId == "" || num == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId/num is empty"))
return
}
var body model.UDMSubUser
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
if len(body.IMSI) != 15 {
c.JSON(400, resp.CodeMsg(40010, "bind err: IMSI length is not 15 bits"))
c.JSON(422, resp.CodeMsg(422002, "bind err: IMSI length is not 15 bits"))
return
}
@@ -288,18 +287,18 @@ func (s *UDMSubController) Edit(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
neId := c.Param("neId")
if neId == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId is empty"))
return
}
var body model.UDMSubUser
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
if len(body.IMSI) != 15 {
c.JSON(400, resp.CodeMsg(40010, "bind err: IMSI length is not 15 bits"))
c.JSON(422, resp.CodeMsg(422002, "bind err: IMSI length is not 15 bits"))
return
}
@@ -353,7 +352,7 @@ func (s *UDMSubController) Remove(c *gin.Context) {
neId := c.Param("neId")
imsi := c.Param("imsi")
if neId == "" || len(imsi) < 15 {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId/imsi is empty"))
return
}
@@ -419,7 +418,7 @@ func (s *UDMSubController) Removes(c *gin.Context) {
imsi := c.Param("imsi")
num := c.Param("num")
if neId == "" || len(imsi) < 15 || num == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId/imsi/num is empty"))
return
}
@@ -476,7 +475,7 @@ func (s *UDMSubController) Export(c *gin.Context) {
neId := c.Query("neId")
fileType := c.Query("type")
if neId == "" || fileType == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId or type is empty"))
return
}
if !(fileType == "csv" || fileType == "txt") {
@@ -556,7 +555,7 @@ func (s *UDMSubController) Import(c *gin.Context) {
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}

View File

@@ -48,10 +48,9 @@ type UDMVOIPController struct {
// @Description UDM VOIP User Data List Refresh Synchronization Latest
// @Router /neData/udm/voip/resetData/{neId} [put]
func (s *UDMVOIPController) ResetData(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
neId := c.Param("neId")
if neId == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId is empty"))
return
}
@@ -100,7 +99,7 @@ func (s *UDMVOIPController) Info(c *gin.Context) {
neId := c.Param("neId")
username := c.Param("username")
if neId == "" || username == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId or username is empty"))
return
}
@@ -159,14 +158,18 @@ func (s *UDMVOIPController) Add(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
neId := c.Param("neId")
if neId == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId is empty"))
return
}
var body model.UDMVOIPUser
err := c.ShouldBindBodyWithJSON(&body)
if err != nil || body.UserName == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
if body.UserName == "" {
c.JSON(422, resp.CodeMsg(422002, "bind err: username is empty"))
return
}
@@ -219,14 +222,18 @@ func (s *UDMVOIPController) Adds(c *gin.Context) {
neId := c.Param("neId")
num := c.Param("num")
if neId == "" || num == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId or num is empty"))
return
}
var body model.UDMVOIPUser
err := c.ShouldBindBodyWithJSON(&body)
if err != nil || body.UserName == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
if body.UserName == "" {
c.JSON(422, resp.CodeMsg(422002, "bind err: username is empty"))
return
}
@@ -278,7 +285,7 @@ func (s *UDMVOIPController) Remove(c *gin.Context) {
neId := c.Param("neId")
username := c.Param("username")
if neId == "" || username == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId or username is empty"))
return
}
@@ -344,7 +351,7 @@ func (s *UDMVOIPController) Removes(c *gin.Context) {
username := c.Param("username")
num := c.Param("num")
if neId == "" || username == "" || num == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId/username/num is empty"))
return
}
@@ -400,11 +407,11 @@ func (s *UDMVOIPController) Export(c *gin.Context) {
neId := c.Query("neId")
fileType := c.Query("type")
if neId == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId is empty"))
return
}
if !(fileType == "csv" || fileType == "txt") {
c.JSON(200, resp.ErrMsg("File Type Error, only support csv,txt"))
c.JSON(200, resp.ErrMsg("file type error, only support csv,txt"))
return
}
@@ -478,7 +485,7 @@ func (s *UDMVOIPController) Import(c *gin.Context) {
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}

View File

@@ -48,10 +48,9 @@ type UDMVolteIMSController struct {
// @Description UDM Authenticated User Data List Refresh Synchronization Latest
// @Router /neData/udm/volte-ims/resetData/{neId} [put]
func (s *UDMVolteIMSController) ResetData(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
neId := c.Param("neId")
if neId == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId is empty"))
return
}
@@ -102,11 +101,11 @@ func (s *UDMVolteIMSController) Info(c *gin.Context) {
imsi := c.Param("imsi")
msisdn := c.Query("msisdn")
if neId == "" || imsi == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId or imsi is empty"))
return
}
if msisdn == "" {
c.JSON(400, resp.CodeMsg(400, "msisdn is required"))
c.JSON(422, resp.CodeMsg(422002, "bind err: msisdn is required"))
return
}
@@ -165,14 +164,18 @@ func (s *UDMVolteIMSController) Add(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
neId := c.Param("neId")
if neId == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId is empty"))
return
}
var body model.UDMVolteIMSUser
err := c.ShouldBindBodyWithJSON(&body)
if err != nil || body.IMSI == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
if body.IMSI == "" {
c.JSON(422, resp.CodeMsg(422002, "bind err: imsi is empty"))
return
}
@@ -237,9 +240,13 @@ func (s *UDMVolteIMSController) Adds(c *gin.Context) {
}
var body model.UDMVolteIMSUser
err := c.ShouldBindBodyWithJSON(&body)
if err != nil || body.IMSI == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
if body.IMSI == "" {
c.JSON(422, resp.CodeMsg(422002, "bind err: imsi is empty"))
return
}
@@ -375,7 +382,7 @@ func (s *UDMVolteIMSController) Removes(c *gin.Context) {
imsi := c.Param("imsi")
num := c.Param("num")
if neId == "" || imsi == "" || num == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId/imsi/num is empty"))
return
}
@@ -431,7 +438,7 @@ func (s *UDMVolteIMSController) Export(c *gin.Context) {
neId := c.Query("neId")
fileType := c.Query("type")
if neId == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neId is empty"))
return
}
if !(fileType == "csv" || fileType == "txt") {
@@ -507,7 +514,7 @@ func (s *UDMVolteIMSController) Import(c *gin.Context) {
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}

View File

@@ -1,6 +1,8 @@
package controller
import (
"fmt"
"be.ems/src/framework/i18n"
"be.ems/src/framework/reqctx"
"be.ems/src/framework/resp"
@@ -46,7 +48,8 @@ func (s UPFController) FlowTotal(c *gin.Context) {
Day int `form:"day"`
}
if err := c.ShouldBindQuery(&querys); querys.Day < 0 || err != nil {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}

View File

@@ -24,11 +24,11 @@ func Setup(router *gin.Engine) {
kpiGroup := neDataGroup.Group("/kpi")
{
kpiGroup.GET("/title",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewKPI.KPITitle,
)
kpiGroup.GET("/data",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewKPI.KPIData,
)
}
@@ -37,25 +37,25 @@ func Setup(router *gin.Engine) {
alarmGroup := neDataGroup.Group("/alarm")
{
alarmGroup.GET("/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewAlarm.List,
)
alarmGroup.DELETE("/:id",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewAlarm.Remove,
)
alarmGroup.PUT("/clear",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.alarm", collectlogs.BUSINESS_TYPE_UPDATE)),
controller.NewAlarm.Clear,
)
alarmGroup.PUT("/ack",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.alarm", collectlogs.BUSINESS_TYPE_UPDATE)),
controller.NewAlarm.Ack,
)
alarmGroup.GET("/export",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.alarm", collectlogs.BUSINESS_TYPE_EXPORT)),
controller.NewAlarm.Export,
)
@@ -65,12 +65,12 @@ func Setup(router *gin.Engine) {
alarmLogGroup := neDataGroup.Group("/alarm/log")
{
alarmLogGroup.GET("/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewAlarmLog.List,
)
alarmLogGroup.GET("/event",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewAlarmLog.Event,
)
}
@@ -79,7 +79,7 @@ func Setup(router *gin.Engine) {
alarmForwardGroup := neDataGroup.Group("/alarm/forward")
{
alarmForwardGroup.GET("/log/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewAlarmForward.List,
)
}
@@ -88,11 +88,11 @@ func Setup(router *gin.Engine) {
nbStateGroup := neDataGroup.Group("/nb-state")
{
nbStateGroup.GET("/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNBState.List,
)
nbStateGroup.POST("/export",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNBState.Export,
)
}
@@ -101,25 +101,25 @@ func Setup(router *gin.Engine) {
imsGroup := neDataGroup.Group("/ims")
{
imsGroup.GET("/cdr/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewIMS.CDRList,
)
imsGroup.DELETE("/cdr/:id",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.imsCDR", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewIMS.CDRRemove,
)
imsGroup.POST("/cdr/export",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.imsCDR", collectlogs.BUSINESS_TYPE_EXPORT)),
controller.NewIMS.CDRExport,
)
imsGroup.GET("/session/num",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewIMS.UeSessionNum,
)
imsGroup.GET("/session/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewIMS.UeSessionList,
)
}
@@ -128,16 +128,16 @@ func Setup(router *gin.Engine) {
smscGroup := neDataGroup.Group("/smsc")
{
smscGroup.GET("/cdr/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewSMSC.CDRList,
)
smscGroup.DELETE("/cdr/:id",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smscCDR", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewSMSC.CDRRemove,
)
smscGroup.POST("/cdr/export",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smscCDR", collectlogs.BUSINESS_TYPE_EXPORT)),
controller.NewSMSC.CDRExport,
)
@@ -147,25 +147,25 @@ func Setup(router *gin.Engine) {
smfGroup := neDataGroup.Group("/smf")
{
smfGroup.GET("/cdr/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewSMF.CDRList,
)
smfGroup.DELETE("/cdr/:id",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smfCDR", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewSMF.CDRRemove,
)
smfGroup.POST("/cdr/export",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smfCDR", collectlogs.BUSINESS_TYPE_EXPORT)),
controller.NewSMF.CDRExport,
)
smfGroup.GET("/sub/num",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewSMF.SubUserNum,
)
smfGroup.GET("/sub/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewSMF.SubUserList,
)
}
@@ -174,25 +174,25 @@ func Setup(router *gin.Engine) {
amfGroup := neDataGroup.Group("/amf")
{
amfGroup.GET("/ue/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewAMF.UEList,
)
amfGroup.DELETE("/ue/:id",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.amfUE", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewAMF.UERemove,
)
amfGroup.POST("/ue/export",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.amfUE", collectlogs.BUSINESS_TYPE_EXPORT)),
controller.NewAMF.UEExport,
)
amfGroup.GET("/nb/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewAMF.NbInfoList,
)
amfGroup.GET("/nb/list-cfg",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewAMF.NbStateList,
)
}
@@ -201,7 +201,7 @@ func Setup(router *gin.Engine) {
upfGroup := neDataGroup.Group("/upf")
{
upfGroup.GET("/flow-total",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewUPF.FlowTotal,
)
}
@@ -210,16 +210,16 @@ func Setup(router *gin.Engine) {
backupGroup := neDataGroup.Group("/backup")
{
backupGroup.GET("/ftp",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewBackup.FTPInfo,
)
backupGroup.PUT("/ftp",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.backup", collectlogs.BUSINESS_TYPE_OTHER)),
controller.NewBackup.FTPUpdate,
)
backupGroup.POST("/ftp",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.backup", collectlogs.BUSINESS_TYPE_OTHER)),
controller.NewBackup.FTPPush,
)
@@ -230,50 +230,50 @@ func Setup(router *gin.Engine) {
{
udmAuthGroup.PUT("/resetData/:neId",
repeat.RepeatSubmit(5),
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmAuth", collectlogs.BUSINESS_TYPE_CLEAN)),
controller.NewUDMAuth.ResetData,
)
udmAuthGroup.GET("/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewUDMAuth.List,
)
udmAuthGroup.GET("/:neId/:imsi",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewUDMAuth.Info,
)
udmAuthGroup.POST("/:neId",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmAuth", collectlogs.BUSINESS_TYPE_INSERT)),
controller.NewUDMAuth.Add,
)
udmAuthGroup.POST("/:neId/:num",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmAuth", collectlogs.BUSINESS_TYPE_INSERT)),
controller.NewUDMAuth.Adds,
)
udmAuthGroup.PUT("/:neId",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmAuth", collectlogs.BUSINESS_TYPE_UPDATE)),
controller.NewUDMAuth.Edit,
)
udmAuthGroup.DELETE("/:neId/:imsi",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmAuth", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewUDMAuth.Remove,
)
udmAuthGroup.DELETE("/:neId/:imsi/:num",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmAuth", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewUDMAuth.Removes,
)
udmAuthGroup.GET("/export",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmAuth", collectlogs.BUSINESS_TYPE_EXPORT)),
controller.NewUDMAuth.Export,
)
udmAuthGroup.POST("/import",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmAuth", collectlogs.BUSINESS_TYPE_IMPORT)),
controller.NewUDMAuth.Import,
)
@@ -284,50 +284,50 @@ func Setup(router *gin.Engine) {
{
udmSubGroup.PUT("/resetData/:neId",
repeat.RepeatSubmit(5),
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmSub", collectlogs.BUSINESS_TYPE_CLEAN)),
controller.NewUDMSub.ResetData,
)
udmSubGroup.GET("/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewUDMSub.List,
)
udmSubGroup.GET("/:neId/:imsi",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewUDMSub.Info,
)
udmSubGroup.POST("/:neId",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmSub", collectlogs.BUSINESS_TYPE_INSERT)),
controller.NewUDMSub.Add,
)
udmSubGroup.POST("/:neId/:num",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmSub", collectlogs.BUSINESS_TYPE_INSERT)),
controller.NewUDMSub.Adds,
)
udmSubGroup.PUT("/:neId",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmSub", collectlogs.BUSINESS_TYPE_UPDATE)),
controller.NewUDMSub.Edit,
)
udmSubGroup.DELETE("/:neId/:imsi",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmSub", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewUDMSub.Remove,
)
udmSubGroup.DELETE("/:neId/:imsi/:num",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmSub", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewUDMSub.Removes,
)
udmSubGroup.GET("/export",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmSub", collectlogs.BUSINESS_TYPE_EXPORT)),
controller.NewUDMSub.Export,
)
udmSubGroup.POST("/import",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmSub", collectlogs.BUSINESS_TYPE_IMPORT)),
controller.NewUDMSub.Import,
)
@@ -338,45 +338,45 @@ func Setup(router *gin.Engine) {
{
udmVOIPGroup.PUT("/resetData/:neId",
repeat.RepeatSubmit(5),
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVOIP", collectlogs.BUSINESS_TYPE_CLEAN)),
controller.NewUDMVOIP.ResetData,
)
udmVOIPGroup.GET("/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewUDMVOIP.List,
)
udmVOIPGroup.GET("/:neId/:username",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewUDMVOIP.Info,
)
udmVOIPGroup.POST("/:neId",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVOIP", collectlogs.BUSINESS_TYPE_INSERT)),
controller.NewUDMVOIP.Add,
)
udmVOIPGroup.POST("/:neId/:num",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVOIP", collectlogs.BUSINESS_TYPE_INSERT)),
controller.NewUDMVOIP.Adds,
)
udmVOIPGroup.DELETE("/:neId/:username",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVOIP", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewUDMVOIP.Remove,
)
udmVOIPGroup.DELETE("/:neId/:username/:num",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVOIP", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewUDMVOIP.Removes,
)
udmVOIPGroup.GET("/export",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVOIP", collectlogs.BUSINESS_TYPE_EXPORT)),
controller.NewUDMVOIP.Export,
)
udmVOIPGroup.POST("/import",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVOIP", collectlogs.BUSINESS_TYPE_IMPORT)),
controller.NewUDMVOIP.Import,
)
@@ -387,45 +387,45 @@ func Setup(router *gin.Engine) {
{
udmVolteIMSGroup.PUT("/resetData/:neId",
repeat.RepeatSubmit(5),
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVolteIMS", collectlogs.BUSINESS_TYPE_CLEAN)),
controller.NewUDMVolteIMS.ResetData,
)
udmVolteIMSGroup.GET("/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewUDMVolteIMS.List,
)
udmVolteIMSGroup.GET("/:neId/:imsi",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewUDMVolteIMS.Info,
)
udmVolteIMSGroup.POST("/:neId",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVolteIMS", collectlogs.BUSINESS_TYPE_INSERT)),
controller.NewUDMVolteIMS.Add,
)
udmVolteIMSGroup.POST("/:neId/:num",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVolteIMS", collectlogs.BUSINESS_TYPE_INSERT)),
controller.NewUDMVolteIMS.Adds,
)
udmVolteIMSGroup.DELETE("/:neId/:imsi",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVolteIMS", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewUDMVolteIMS.Remove,
)
udmVolteIMSGroup.DELETE("/:neId/:imsi/:num",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVolteIMS", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewUDMVolteIMS.Removes,
)
udmVolteIMSGroup.GET("/export",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVolteIMS", collectlogs.BUSINESS_TYPE_EXPORT)),
controller.NewUDMVolteIMS.Export,
)
udmVolteIMSGroup.POST("/import",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVolteIMS", collectlogs.BUSINESS_TYPE_IMPORT)),
controller.NewUDMVolteIMS.Import,
)
@@ -435,25 +435,25 @@ func Setup(router *gin.Engine) {
mmeGroup := neDataGroup.Group("/mme")
{
mmeGroup.GET("/ue/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewMME.UEList,
)
mmeGroup.DELETE("/ue/:id",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.mmeUE", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewMME.UERemove,
)
mmeGroup.POST("/ue/export",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.mmeUE", collectlogs.BUSINESS_TYPE_EXPORT)),
controller.NewMME.UEExport,
)
mmeGroup.GET("/nb/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewMME.NbInfoList,
)
mmeGroup.GET("/nb/list-cfg",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewMME.NbStateList,
)
}
@@ -462,16 +462,16 @@ func Setup(router *gin.Engine) {
sgwcGroup := neDataGroup.Group("/sgwc")
{
sgwcGroup.GET("/cdr/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewSGWC.CDRList,
)
sgwcGroup.DELETE("/cdr/:id",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sgwcCDR", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewSGWC.CDRRemove,
)
sgwcGroup.POST("/cdr/export",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sgwcCDR", collectlogs.BUSINESS_TYPE_EXPORT)),
controller.NewSGWC.CDRExport,
)

View File

@@ -54,7 +54,7 @@ func (s *NeActionController) PushFile(c *gin.Context) {
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -127,7 +127,7 @@ func (s *NeActionController) PullFile(c *gin.Context) {
}
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -199,7 +199,7 @@ func (s *NeActionController) PullDirZip(c *gin.Context) {
}
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -280,7 +280,7 @@ func (s *NeActionController) ViewFile(c *gin.Context) {
}
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -341,7 +341,7 @@ func (s *NeActionController) Files(c *gin.Context) {
}
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -413,7 +413,7 @@ func (s *NeActionController) Service(c *gin.Context) {
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}

View File

@@ -46,7 +46,7 @@ func (s NeConfigController) Info(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
id := parse.Number(c.Query("id"))
if id <= 0 {
c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: id is empty"))
return
}
@@ -72,14 +72,14 @@ func (s NeConfigController) Add(c *gin.Context) {
var body model.NeConfig
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 将json数据转字符串存储
paramDataByte, err := json.Marshal(body.ParamData)
if err != nil {
c.JSON(400, resp.CodeMsg(400, err.Error()))
c.JSON(200, resp.ErrMsg(err.Error()))
return
}
body.ParamJson = string(paramDataByte)
@@ -100,7 +100,7 @@ func (s NeConfigController) Edit(c *gin.Context) {
var body model.NeConfig
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -115,7 +115,7 @@ func (s NeConfigController) Edit(c *gin.Context) {
// 将json数据转字符串存储
paramDataByte, err := json.Marshal(body.ParamData)
if err != nil {
c.JSON(400, resp.CodeMsg(400, err.Error()))
c.JSON(200, resp.ErrMsg(err.Error()))
return
}
body.ParamJson = string(paramDataByte)
@@ -135,7 +135,7 @@ func (s NeConfigController) Remove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
id := c.Query("id")
if id == "" {
c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: id is empty"))
return
}
@@ -170,10 +170,9 @@ func (s NeConfigController) Remove(c *gin.Context) {
// @Description Network Element Parameter Configuration Available Attribute Values List Specify Network Element Type All Unpaged
// @Router /ne/config/list/{neType} [get]
func (s NeConfigController) ListByNeType(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
neType := c.Param("neType")
if neType == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(422, resp.CodeMsg(422002, "bind err: neType is empty"))
return
}
data := s.neConfigService.FindByNeType(neType)
@@ -204,7 +203,7 @@ func (s NeConfigController) DataInfo(c *gin.Context) {
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -259,7 +258,7 @@ func (s NeConfigController) DataEdit(c *gin.Context) {
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -312,20 +311,20 @@ func (s NeConfigController) DataAdd(c *gin.Context) {
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 检查是否array
info := s.neConfigService.FindByNeTypeAndParamName(body.NeType, body.ParamName)
if info.ParamType != "array" {
c.JSON(400, resp.CodeMsg(400, "this attribute does not support adding"))
c.JSON(200, resp.ErrMsg("this attribute does not support adding"))
return
}
// 必须含有index
_, idxOk := body.ParamData["index"]
if info.ParamType == "array" && !idxOk {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
c.JSON(200, resp.ErrMsg("array data must contain index"))
return
}
@@ -369,14 +368,15 @@ func (s NeConfigController) DataRemove(c *gin.Context) {
Loc string `form:"loc" binding:"required"` // 与数据对象内index一致,有多层时划分嵌套层(index/subParamName/index)
}
if err := c.ShouldBindQuery(&query); err != nil {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 检查是否array
info := s.neConfigService.FindByNeTypeAndParamName(query.NeType, query.ParamName)
if info.ParamType != "array" {
c.JSON(400, resp.CodeMsg(400, "this attribute does not support adding"))
c.JSON(200, resp.ErrMsg("this attribute does not support adding"))
return
}

View File

@@ -50,7 +50,7 @@ func (s NeConfigBackupController) Download(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
id := parse.Number(c.Query("id"))
if id <= 0 {
c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: id is empty"))
return
}
@@ -80,7 +80,7 @@ func (s NeConfigBackupController) Edit(c *gin.Context) {
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -110,7 +110,7 @@ func (s NeConfigBackupController) Remove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
id := c.Query("id")
if id == "" {
c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: id is empty"))
return
}
@@ -144,7 +144,7 @@ func (s NeConfigBackupController) Import(c *gin.Context) {
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
if !strings.HasSuffix(body.Path, ".zip") {
@@ -181,7 +181,7 @@ func (s NeConfigBackupController) Export(c *gin.Context) {
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 查网元

View File

@@ -75,11 +75,11 @@ func (s NeHostController) Add(c *gin.Context) {
var body model.NeHost
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
if body.ID == 0 {
c.JSON(400, resp.CodeMsg(40010, "bind err: id not is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: id not is empty"))
return
}
@@ -116,11 +116,11 @@ func (s NeHostController) Edit(c *gin.Context) {
var body model.NeHost
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
if body.ID <= 0 {
c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: id is empty"))
return
}
@@ -196,7 +196,7 @@ func (s NeHostController) Test(c *gin.Context) {
var body model.NeHost
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -278,7 +278,7 @@ func (s NeHostController) Cmd(c *gin.Context) {
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -358,7 +358,7 @@ func (s NeHostController) CheckBySSH(c *gin.Context) {
var body model.NeHost
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -460,11 +460,11 @@ func (s NeHostController) AuthorizedBySSH(c *gin.Context) {
var body model.NeHost
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
if body.AuthMode == "2" {
c.JSON(400, resp.CodeMsg(40010, "bind err: auth mode not equals 2"))
c.JSON(422, resp.CodeMsg(422002, "bind err: auth mode not equals 2"))
return
}

View File

@@ -41,7 +41,7 @@ func (s NeHostCmdController) Info(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
id := parse.Number(c.Param("id"))
if id <= 0 {
c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: id is empty"))
return
}
@@ -63,7 +63,7 @@ func (s NeHostCmdController) Add(c *gin.Context) {
var body model.NeHostCmd
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -93,7 +93,7 @@ func (s NeHostCmdController) Edit(c *gin.Context) {
var body model.NeHostCmd
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -130,7 +130,7 @@ func (s NeHostCmdController) Remove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
id := c.Param("id")
if id == "" {
c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: id is empty"))
return
}

View File

@@ -58,7 +58,7 @@ func (s NeInfoController) State(c *gin.Context) {
}
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -122,7 +122,7 @@ func (s NeInfoController) NeTypeAndID(c *gin.Context) {
}
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -160,7 +160,7 @@ func (s NeInfoController) ListAll(c *gin.Context) {
}
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -202,7 +202,7 @@ func (s NeInfoController) Para5GFileWrite(c *gin.Context) {
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -224,7 +224,7 @@ func (s NeInfoController) OAMFileRead(c *gin.Context) {
}
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -249,7 +249,7 @@ func (s NeInfoController) OAMFileWrite(c *gin.Context) {
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -312,7 +312,7 @@ func (s NeInfoController) Info(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
id := parse.Number(c.Param("id"))
if id <= 0 {
c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: id is empty"))
return
}
@@ -345,11 +345,11 @@ func (s NeInfoController) Add(c *gin.Context) {
err := c.ShouldBindBodyWithJSON(&body)
if err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
if body.ID != 0 {
c.JSON(400, resp.CodeMsg(40010, "bind err: id not is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: id not is empty"))
return
}
@@ -438,11 +438,11 @@ func (s NeInfoController) Edit(c *gin.Context) {
err := c.ShouldBindBodyWithJSON(&body)
if err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
if body.ID <= 0 {
c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: id is empty"))
return
}
@@ -549,7 +549,7 @@ func (s NeInfoController) Remove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
id := c.Param("id")
if id == "" {
c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: id is empty"))
return
}

View File

@@ -66,7 +66,7 @@ func (s *NeLicenseController) Info(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
id := parse.Number(c.Param("id"))
if id <= 0 {
c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: id is empty"))
return
}
@@ -102,7 +102,7 @@ func (s *NeLicenseController) NeTypeAndID(c *gin.Context) {
}
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -137,7 +137,8 @@ func (s *NeLicenseController) Code(c *gin.Context) {
NeId string `form:"neId" binding:"required"`
}
if err := c.ShouldBindQuery(&querys); err != nil {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
@@ -183,7 +184,8 @@ func (s *NeLicenseController) Change(c *gin.Context) {
var body model.NeLicense
err := c.ShouldBindBodyWithJSON(&body)
if err != nil || body.LicensePath == "" {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}

View File

@@ -55,7 +55,7 @@ func (s NeSoftwareController) Info(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
id := parse.Number(c.Param("id"))
if id <= 0 {
c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: id is empty"))
return
}
@@ -86,11 +86,11 @@ func (s NeSoftwareController) Add(c *gin.Context) {
var body model.NeSoftware
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
if body.Path == "" || body.ID > 0 {
c.JSON(400, resp.CodeMsg(40010, "bind err: path is empty or id is not empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: path is empty or id is not empty"))
return
}
// 找到已存在的删除后重新添加
@@ -130,11 +130,11 @@ func (s NeSoftwareController) Edit(c *gin.Context) {
var body model.NeSoftware
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
if body.Path == "" || body.ID == 0 {
c.JSON(400, resp.CodeMsg(40010, "bind err: path or id is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: path or id is empty"))
return
}
@@ -171,7 +171,7 @@ func (s NeSoftwareController) Remove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
id := c.Param("id")
if id == "" {
c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: id is empty"))
return
}
@@ -209,7 +209,7 @@ func (s NeSoftwareController) NewNeVersion(c *gin.Context) {
var body model.NeSoftware
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}

View File

@@ -40,7 +40,7 @@ func (s *NeVersionController) Info(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
id := parse.Number(c.Param("id"))
if id <= 0 {
c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty"))
c.JSON(422, resp.CodeMsg(422002, "bind err: id is empty"))
return
}
@@ -77,7 +77,7 @@ func (s *NeVersionController) Operate(c *gin.Context) {
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}

View File

@@ -21,28 +21,28 @@ func Setup(router *gin.Engine) {
neActionGroup := router.Group("/ne/action")
{
neActionGroup.GET("/files",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeAction.Files,
)
neActionGroup.GET("/pullFile",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeAction.PullFile,
)
neActionGroup.POST("/pushFile",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neAction", collectlogs.BUSINESS_TYPE_IMPORT)),
controller.NewNeAction.PushFile,
)
neActionGroup.GET("/pullDirZip",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeAction.PullDirZip,
)
neActionGroup.GET("/viewFile",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeAction.ViewFile,
)
neActionGroup.PUT("/service",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neAction", collectlogs.BUSINESS_TYPE_OTHER)),
controller.NewNeAction.Service,
)
@@ -52,58 +52,58 @@ func Setup(router *gin.Engine) {
neInfoGroup := router.Group("/ne/info")
{
neInfoGroup.GET("/state",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeInfo.State,
)
neInfoGroup.GET("/byTypeAndID",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeInfo.NeTypeAndID,
)
neInfoGroup.GET("/listAll",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeInfo.ListAll,
)
neInfoGroup.GET("/para5GFile",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeInfo.Para5GFileRead,
)
neInfoGroup.PUT("/para5GFile",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neInfo", collectlogs.BUSINESS_TYPE_OTHER)),
controller.NewNeInfo.Para5GFileWrite,
)
neInfoGroup.GET("/oamFile",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeInfo.OAMFileRead,
)
neInfoGroup.PUT("/oamFile",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neInfo", collectlogs.BUSINESS_TYPE_OTHER)),
controller.NewNeInfo.OAMFileWrite,
)
neInfoGroup.GET("/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeInfo.List,
)
neInfoGroup.GET("/:id",
middleware.CryptoApi(false, true),
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeInfo.Info,
)
neInfoGroup.POST("",
middleware.CryptoApi(true, true),
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neInfo", collectlogs.BUSINESS_TYPE_INSERT)),
controller.NewNeInfo.Add,
)
neInfoGroup.PUT("",
middleware.CryptoApi(true, true),
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neInfo", collectlogs.BUSINESS_TYPE_UPDATE)),
controller.NewNeInfo.Edit,
)
neInfoGroup.DELETE(":id",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neInfo", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewNeInfo.Remove,
)
@@ -113,46 +113,46 @@ func Setup(router *gin.Engine) {
neHostGroup := router.Group("/ne/host")
{
neHostGroup.GET("/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeHost.List,
)
neHostGroup.GET("/:id",
middleware.CryptoApi(false, true),
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeHost.Info,
)
neHostGroup.POST("",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHost", collectlogs.BUSINESS_TYPE_INSERT)),
controller.NewNeHost.Add,
)
neHostGroup.PUT("",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHost", collectlogs.BUSINESS_TYPE_UPDATE)),
controller.NewNeHost.Edit,
)
neHostGroup.DELETE("/:id",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHost", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewNeHost.Remove,
)
neHostGroup.POST("/test",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHost", collectlogs.BUSINESS_TYPE_OTHER)),
controller.NewNeHost.Test,
)
neHostGroup.POST("/cmd",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHost", collectlogs.BUSINESS_TYPE_OTHER)),
controller.NewNeHost.Cmd,
)
neHostGroup.POST("/checkBySSH",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHost", collectlogs.BUSINESS_TYPE_OTHER)),
controller.NewNeHost.CheckBySSH,
)
neHostGroup.POST("/authorizedBySSH",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHost", collectlogs.BUSINESS_TYPE_OTHER)),
controller.NewNeHost.AuthorizedBySSH,
)
@@ -162,25 +162,25 @@ func Setup(router *gin.Engine) {
neHostCmdGroup := router.Group("/ne/hostCmd")
{
neHostCmdGroup.GET("/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeHostCmd.List,
)
neHostCmdGroup.GET("/:id",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeHostCmd.Info,
)
neHostCmdGroup.POST("",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHostCmd", collectlogs.BUSINESS_TYPE_INSERT)),
controller.NewNeHostCmd.Add,
)
neHostCmdGroup.PUT("",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHostCmd", collectlogs.BUSINESS_TYPE_UPDATE)),
controller.NewNeHostCmd.Edit,
)
neHostCmdGroup.DELETE(":id",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHostCmd", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewNeHostCmd.Remove,
)
@@ -190,15 +190,15 @@ func Setup(router *gin.Engine) {
neVersionGroup := router.Group("/ne/version")
{
neVersionGroup.GET("/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeVersion.List,
)
neVersionGroup.GET("/:id",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeVersion.Info,
)
neVersionGroup.POST("/operate",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neVersion", collectlogs.BUSINESS_TYPE_OTHER)),
controller.NewNeVersion.Operate,
)
@@ -208,30 +208,30 @@ func Setup(router *gin.Engine) {
neSoftwareGroup := router.Group("/ne/software")
{
neSoftwareGroup.GET("/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeSoftware.List,
)
neSoftwareGroup.GET("/:id",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeSoftware.Info,
)
neSoftwareGroup.POST("",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neSoftware", collectlogs.BUSINESS_TYPE_INSERT)),
controller.NewNeSoftware.Add,
)
neSoftwareGroup.PUT("",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neSoftware", collectlogs.BUSINESS_TYPE_UPDATE)),
controller.NewNeSoftware.Edit,
)
neSoftwareGroup.DELETE(":id",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neSoftware", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewNeSoftware.Remove,
)
neSoftwareGroup.POST("/newNeVersion",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neSoftware", collectlogs.BUSINESS_TYPE_OTHER)),
controller.NewNeSoftware.NewNeVersion,
)
@@ -241,28 +241,28 @@ func Setup(router *gin.Engine) {
neLicenseGroup := router.Group("/ne/license")
{
neLicenseGroup.GET("/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeLicense.List,
)
neLicenseGroup.GET("/:id",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeLicense.Info,
)
neLicenseGroup.GET("/byTypeAndID",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeLicense.NeTypeAndID,
)
neLicenseGroup.GET("/code",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeLicense.Code,
)
neLicenseGroup.POST("/change",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neLicense", collectlogs.BUSINESS_TYPE_OTHER)),
controller.NewNeLicense.Change,
)
neLicenseGroup.GET("/state",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeLicense.State,
)
}
@@ -272,49 +272,49 @@ func Setup(router *gin.Engine) {
{
// 网元参数配置可用属性值
neConfigGroup.GET("/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeConfig.List,
)
neConfigGroup.GET("/info/:id",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeConfig.Info,
)
neConfigGroup.POST("",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neConfig", collectlogs.BUSINESS_TYPE_INSERT)),
controller.NewNeConfig.Add,
)
neConfigGroup.PUT("",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neConfig", collectlogs.BUSINESS_TYPE_UPDATE)),
controller.NewNeConfig.Edit,
)
neConfigGroup.DELETE("",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neConfig", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewNeConfig.Remove,
)
neConfigGroup.GET("/list/:neType",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeConfig.ListByNeType,
)
// 网元参数配置数据
neConfigGroup.GET("/data",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeConfig.DataInfo,
)
neConfigGroup.PUT("/data",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neConfig", collectlogs.BUSINESS_TYPE_UPDATE)),
controller.NewNeConfig.DataEdit,
)
neConfigGroup.POST("/data",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neConfig", collectlogs.BUSINESS_TYPE_INSERT)),
controller.NewNeConfig.DataAdd,
)
neConfigGroup.DELETE("/data",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neConfig", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewNeConfig.DataRemove,
)
@@ -324,30 +324,30 @@ func Setup(router *gin.Engine) {
neConfigBackupGroup := router.Group("/ne/config/backup")
{
neConfigBackupGroup.GET("/list",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeConfigBackup.List,
)
neConfigBackupGroup.GET("/download",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
controller.NewNeConfigBackup.Download,
)
neConfigBackupGroup.PUT("",
middleware.PreAuthorize(map[string][]string{"hasPerms": {"ne:neConfigBackup:edit"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"ne:neConfigBackup:edit"}}),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neConfigBackup", collectlogs.BUSINESS_TYPE_UPDATE)),
controller.NewNeConfigBackup.Edit,
)
neConfigBackupGroup.DELETE("",
middleware.PreAuthorize(map[string][]string{"hasPerms": {"ne:neConfigBackup:remove"}}),
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"ne:neConfigBackup:remove"}}),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neConfigBackup", collectlogs.BUSINESS_TYPE_DELETE)),
controller.NewNeConfigBackup.Remove,
)
neConfigBackupGroup.POST("/import",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neConfigBackup", collectlogs.BUSINESS_TYPE_IMPORT)),
controller.NewNeConfigBackup.Import,
)
neConfigBackupGroup.POST("/export",
middleware.PreAuthorize(nil),
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neConfigBackup", collectlogs.BUSINESS_TYPE_EXPORT)),
controller.NewNeConfigBackup.Export,
)

View File

@@ -46,7 +46,7 @@ func (r *NeConfig) RefreshByNeTypeAndNeID(neType string) []model.NeConfig {
v[i] = item
}
values, _ := json.Marshal(v)
redis.Set("", key, string(values))
redis.Set("", key, string(values), 0)
}
}
}
@@ -66,7 +66,7 @@ func (r *NeConfig) RefreshByNeTypeAndNeID(neType string) []model.NeConfig {
neConfigList[i] = v
}
values, _ := json.Marshal(neConfigList)
redis.Set("", key, string(values))
redis.Set("", key, string(values), 0)
}
return neConfigList
}

View File

@@ -50,7 +50,7 @@ func (r NeInfo) FindByNeTypeAndNeID(neType, neID string) model.NeInfo {
if neInfo.ID != 0 && neInfo.NeId == neID {
redis.Del("", key)
values, _ := json.Marshal(neInfo)
redis.Set("", key, string(values))
redis.Set("", key, string(values), 0)
}
}
return neInfo
@@ -64,7 +64,7 @@ func (r NeInfo) RefreshByNeTypeAndNeID(neType, neID string) model.NeInfo {
neInfo = r.neInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID)
if neInfo.ID != 0 && neInfo.NeId == neID {
values, _ := json.Marshal(neInfo)
redis.Set("", key, string(values))
redis.Set("", key, string(values), 0)
}
return neInfo
}
@@ -103,7 +103,7 @@ func (r NeInfo) FindByNeType(neType string) []model.NeInfo {
key := fmt.Sprintf("%s:%s:%s", constants.CACHE_NE_INFO, strings.ToUpper(v.NeType), v.NeId)
redis.Del("", key)
values, _ := json.Marshal(v)
redis.Set("", key, string(values))
redis.Set("", key, string(values), 0)
}
}
return neInfo
@@ -131,7 +131,7 @@ func (r NeInfo) FindByRmuid(rmUid string) model.NeInfo {
key := fmt.Sprintf("%s:%s:%s", constants.CACHE_NE_INFO, strings.ToUpper(v.NeType), v.NeId)
redis.Del("", key)
values, _ := json.Marshal(v)
redis.Set("", key, string(values))
redis.Set("", key, string(values), 0)
if v.RmUID == rmUid {
neInfo = v
}

Some files were not shown because too many files have changed in this diff Show More