Merge branch 'lichang' into lite
This commit is contained in:
@@ -22,3 +22,4 @@ CREATE TABLE "oauth2_client" (
|
|||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of oauth2_client
|
-- Records of oauth2_client
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
|
INSERT INTO "oauth2_client" VALUES (1, 'omc5y0j15emByauth2', 'omcl28ybn6y4w9y9ntzsv88hyByauth2', 'Local', '127.0.0.1', '0', '', 0, 'system', 1745919659089, 'system', 1745920239962, '');
|
||||||
|
|||||||
@@ -313,8 +313,8 @@ INSERT INTO "sys_i18n" VALUES (277, 'config..export.key', '参数键名', 'Confi
|
|||||||
INSERT INTO "sys_i18n" VALUES (278, 'config..export.value', '参数键值', 'Config Value');
|
INSERT INTO "sys_i18n" VALUES (278, 'config..export.value', '参数键值', 'Config Value');
|
||||||
INSERT INTO "sys_i18n" VALUES (279, 'config..export.type', '系统内置', 'Built In');
|
INSERT INTO "sys_i18n" VALUES (279, 'config..export.type', '系统内置', 'Built In');
|
||||||
INSERT INTO "sys_i18n" VALUES (280, 'config..export.remark', '参数说明', 'Config Description');
|
INSERT INTO "sys_i18n" VALUES (280, 'config..export.remark', '参数说明', 'Config Description');
|
||||||
INSERT INTO "sys_i18n" VALUES (281, 'config.sys.titleValue', '5G Core Network', '5G Core Network');
|
INSERT INTO "sys_i18n" VALUES (281, 'config.sys.titleValue', 'Core Network', 'Core Network');
|
||||||
INSERT INTO "sys_i18n" VALUES (282, 'config.sys.copyrightValue', 'Copyright ©2025 5G Core Network', 'Copyright ©2025 5G Core Network');
|
INSERT INTO "sys_i18n" VALUES (282, 'config.sys.copyrightValue', 'Copyright ©2025 Core Network', 'Copyright ©2025 Core Network');
|
||||||
INSERT INTO "sys_i18n" VALUES (283, 'config.noData', '没有可访问参数配置数据!', 'No parameter configuration data is accessible!');
|
INSERT INTO "sys_i18n" VALUES (283, 'config.noData', '没有可访问参数配置数据!', 'No parameter configuration data is accessible!');
|
||||||
INSERT INTO "sys_i18n" VALUES (284, 'config.errKey', '无效 key', 'Invalid key');
|
INSERT INTO "sys_i18n" VALUES (284, 'config.errKey', '无效 key', 'Invalid key');
|
||||||
INSERT INTO "sys_i18n" VALUES (285, 'config.errValueEq', '变更状态与旧值相等!', 'Change state is equal to the old value!');
|
INSERT INTO "sys_i18n" VALUES (285, 'config.errValueEq', '变更状态与旧值相等!', 'Change state is equal to the old value!');
|
||||||
|
|||||||
@@ -24,4 +24,9 @@ CREATE TABLE `oauth2_client` (
|
|||||||
|
|
||||||
SET FOREIGN_KEY_CHECKS = 1;
|
SET FOREIGN_KEY_CHECKS = 1;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Dumping data for table `oauth2_client`
|
||||||
|
--
|
||||||
|
INSERT INTO `oauth2_client` VALUES (1, 'omc5y0j15emByauth2', 'omcl28ybn6y4w9y9ntzsv88hyByauth2', 'Local', '127.0.0.1', '0', '', 0, 'system', 1745919659089, 'system', 1745920239962, '');
|
||||||
|
|
||||||
-- Dump completed on 2025-04-25 15:26:56
|
-- Dump completed on 2025-04-25 15:26:56
|
||||||
|
|||||||
@@ -295,8 +295,8 @@ INSERT INTO `sys_i18n` VALUES (277, 'config..export.key', '参数键名', 'Confi
|
|||||||
INSERT INTO `sys_i18n` VALUES (278, 'config..export.value', '参数键值', 'Config Value');
|
INSERT INTO `sys_i18n` VALUES (278, 'config..export.value', '参数键值', 'Config Value');
|
||||||
INSERT INTO `sys_i18n` VALUES (279, 'config..export.type', '系统内置', 'Built In');
|
INSERT INTO `sys_i18n` VALUES (279, 'config..export.type', '系统内置', 'Built In');
|
||||||
INSERT INTO `sys_i18n` VALUES (280, 'config..export.remark', '参数说明', 'Config Description');
|
INSERT INTO `sys_i18n` VALUES (280, 'config..export.remark', '参数说明', 'Config Description');
|
||||||
INSERT INTO `sys_i18n` VALUES (281, 'config.sys.titleValue', '5G Core Network', '5G Core Network');
|
INSERT INTO `sys_i18n` VALUES (281, 'config.sys.titleValue', '5G Core Network', 'Core Network');
|
||||||
INSERT INTO `sys_i18n` VALUES (282, 'config.sys.copyrightValue', 'Copyright ©2025 5G Core Network', 'Copyright ©2025 5G Core Network');
|
INSERT INTO `sys_i18n` VALUES (282, 'config.sys.copyrightValue', 'Copyright ©2025 Core Network', 'Copyright ©2025 Core Network');
|
||||||
INSERT INTO `sys_i18n` VALUES (283, 'config.noData', '没有可访问参数配置数据!', 'No parameter configuration data is accessible!');
|
INSERT INTO `sys_i18n` VALUES (283, 'config.noData', '没有可访问参数配置数据!', 'No parameter configuration data is accessible!');
|
||||||
INSERT INTO `sys_i18n` VALUES (284, 'config.errKey', '无效 key', 'Invalid key');
|
INSERT INTO `sys_i18n` VALUES (284, 'config.errKey', '无效 key', 'Invalid key');
|
||||||
INSERT INTO `sys_i18n` VALUES (285, 'config.errValueEq', '变更状态与旧值相等!', 'Change state is equal to the old value!');
|
INSERT INTO `sys_i18n` VALUES (285, 'config.errValueEq', '变更状态与旧值相等!', 'Change state is equal to the old value!');
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
-- sys_config
|
-- sys_config
|
||||||
UPDATE `sys_config` SET `config_value` = 'https://www.omc.com' WHERE `config_id` = 6;
|
UPDATE `sys_config` SET `config_value` = '#' WHERE `config_id` = 6;
|
||||||
UPDATE `sys_config` SET `config_value` = 'true' WHERE `config_id` = 28;
|
UPDATE `sys_config` SET `config_value` = 'true' WHERE `config_id` = 28;
|
||||||
UPDATE `sys_config` SET `config_value` = 'en_US' WHERE `config_id` = 29;
|
UPDATE `sys_config` SET `config_value` = 'en_US' WHERE `config_id` = 29;
|
||||||
|
|
||||||
-- sys_i18n
|
-- sys_i18n
|
||||||
UPDATE `sys_i18n` SET `value_zh` = 'OMC', `value_en` = 'OMC' WHERE `id` = 281;
|
UPDATE `sys_i18n` SET `value_zh` = 'Core Network', `value_en` = 'Core Network' WHERE `id` = 281;
|
||||||
UPDATE `sys_i18n` SET `value_zh` = 'Copyright ©2024 OMC', `value_en` = 'Copyright ©2024 OMC' WHERE `id` = 282;
|
UPDATE `sys_i18n` SET `value_zh` = 'Copyright ©2025 Core Network', `value_en` = 'Copyright ©2025 Core Network' WHERE `id` = 282;
|
||||||
|
|
||||||
-- set internationalization switching to ON
|
-- set internationalization switching to ON
|
||||||
UPDATE `sys_menu` SET `status_flag` = '1' WHERE `menu_id` = 2122;
|
UPDATE `sys_menu` SET `status_flag` = '1' WHERE `menu_id` = 2122;
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ UPDATE `sys_config` SET `config_value` = 'true' WHERE `config_id` = 28;
|
|||||||
UPDATE `sys_config` SET `config_value` = 'en_US' WHERE `config_id` = 29;
|
UPDATE `sys_config` SET `config_value` = 'en_US' WHERE `config_id` = 29;
|
||||||
|
|
||||||
-- sys_i18n
|
-- sys_i18n
|
||||||
UPDATE `sys_i18n` SET `value_zh` = '5G Core Network', `value_en` = '5G Core Network' WHERE `id` = 281;
|
UPDATE `sys_i18n` SET `value_zh` = 'Core Network', `value_en` = 'Core Network' WHERE `id` = 281;
|
||||||
UPDATE `sys_i18n` SET `value_zh` = 'Copyright ©2025 5G Core Network', `value_en` = 'Copyright ©2025 5G Core Network' WHERE `id` = 282;
|
UPDATE `sys_i18n` SET `value_zh` = 'Copyright ©2025 Core Network', `value_en` = 'Copyright ©2025 Core Network' WHERE `id` = 282;
|
||||||
|
|
||||||
-- set internationalization switching to ON
|
-- set internationalization switching to ON
|
||||||
UPDATE `sys_menu` SET `status_flag` = '1' WHERE `menu_id` = 2122;
|
UPDATE `sys_menu` SET `status_flag` = '1' WHERE `menu_id` = 2122;
|
||||||
|
|||||||
@@ -22,6 +22,16 @@ func Setup(router *gin.Engine) {
|
|||||||
controller.NewIndex.Handler,
|
controller.NewIndex.Handler,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// 路由服务器时间
|
||||||
|
router.GET("/time",
|
||||||
|
middleware.RateLimit(middleware.LimitOption{
|
||||||
|
Time: 60,
|
||||||
|
Count: 10,
|
||||||
|
Type: middleware.LIMIT_IP,
|
||||||
|
}),
|
||||||
|
controller.NewTimestamp.Handler,
|
||||||
|
)
|
||||||
|
|
||||||
// 通用请求
|
// 通用请求
|
||||||
commonGroup := router.Group("/common")
|
commonGroup := router.Group("/common")
|
||||||
{
|
{
|
||||||
|
|||||||
46
src/modules/common/controller/timestamp.go
Normal file
46
src/modules/common/controller/timestamp.go
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
package controller
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"be.ems/src/framework/resp"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 实例化控制层 TimestampController 结构体
|
||||||
|
var NewTimestamp = &TimestampController{}
|
||||||
|
|
||||||
|
// 服务器时间
|
||||||
|
//
|
||||||
|
// PATH /time
|
||||||
|
type TimestampController struct{}
|
||||||
|
|
||||||
|
// Handler 路由
|
||||||
|
//
|
||||||
|
// GET /
|
||||||
|
//
|
||||||
|
// @Tags common
|
||||||
|
// @Accept json
|
||||||
|
// @Produce json
|
||||||
|
// @Success 200 {object} object "Response Results"
|
||||||
|
// @Summary Server Time
|
||||||
|
// @Description Server Time
|
||||||
|
// @Router / [get]
|
||||||
|
func (s TimestampController) Handler(c *gin.Context) {
|
||||||
|
now := time.Now()
|
||||||
|
// 获取当前时间戳
|
||||||
|
timestamp := now.UnixMilli()
|
||||||
|
// 获取时区
|
||||||
|
timezone := now.Format("-0700")
|
||||||
|
// 获取时区名称
|
||||||
|
timezoneName := now.Format("MST")
|
||||||
|
// 获取 RFC3339 格式的时间
|
||||||
|
rfc3339 := now.Format(time.RFC3339)
|
||||||
|
c.JSON(200, resp.OkData(map[string]any{
|
||||||
|
"timestamp": timestamp,
|
||||||
|
"timezone": timezone,
|
||||||
|
"timezoneName": timezoneName,
|
||||||
|
"rfc3339": rfc3339,
|
||||||
|
}))
|
||||||
|
}
|
||||||
@@ -51,7 +51,7 @@ func (s Oauth2Controller) Authorize(c *gin.Context) {
|
|||||||
|
|
||||||
// 判断IP白名单
|
// 判断IP白名单
|
||||||
if !strings.Contains(info.IPWhite, c.ClientIP()) {
|
if !strings.Contains(info.IPWhite, c.ClientIP()) {
|
||||||
c.JSON(200, resp.ErrMsg("IP whitelist mismatch"))
|
c.JSON(200, resp.ErrMsg("ip whitelist mismatch"))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,7 +93,7 @@ func (s Oauth2Controller) Token(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 登录客户端信息
|
// 登录客户端信息
|
||||||
info, err := s.oauth2Service.ByClient(body.ClientId, body.ClientSecret)
|
info, err := s.oauth2Service.ByClient(body.ClientId, body.ClientSecret, ipaddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.oauth2LogLoginService.Insert(
|
s.oauth2LogLoginService.Insert(
|
||||||
body.ClientId, constants.STATUS_NO, err.Error(),
|
body.ClientId, constants.STATUS_NO, err.Error(),
|
||||||
@@ -153,8 +153,12 @@ func (s Oauth2Controller) RefreshToken(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
clientId := fmt.Sprint(claims[constants.JWT_CLIENT_ID])
|
clientId := fmt.Sprint(claims[constants.JWT_CLIENT_ID])
|
||||||
|
|
||||||
|
// 当前请求信息
|
||||||
|
ipaddr, location := reqctx.IPAddrLocation(c)
|
||||||
|
os, browser := reqctx.UaOsBrowser(c)
|
||||||
|
|
||||||
// 客户端信息
|
// 客户端信息
|
||||||
info, err := s.oauth2Service.ByClient(body.ClientId, body.ClientSecret)
|
info, err := s.oauth2Service.ByClient(body.ClientId, body.ClientSecret, ipaddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(200, resp.ErrMsg(err.Error()))
|
c.JSON(200, resp.ErrMsg(err.Error()))
|
||||||
return
|
return
|
||||||
@@ -192,9 +196,6 @@ func (s Oauth2Controller) RefreshToken(c *gin.Context) {
|
|||||||
refreshToken, refreshExpiresIn = token.Oauth2TokenCreate(clientId, deviceFingerprint, "refresh")
|
refreshToken, refreshExpiresIn = token.Oauth2TokenCreate(clientId, deviceFingerprint, "refresh")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 当前请求信息
|
|
||||||
ipaddr, location := reqctx.IPAddrLocation(c)
|
|
||||||
os, browser := reqctx.UaOsBrowser(c)
|
|
||||||
// 记录令牌,创建系统访问记录
|
// 记录令牌,创建系统访问记录
|
||||||
token.Oauth2InfoCreate(&info, deviceFingerprint, [4]string{ipaddr, location, os, browser})
|
token.Oauth2InfoCreate(&info, deviceFingerprint, [4]string{ipaddr, location, os, browser})
|
||||||
s.oauth2Service.UpdateLoginDateAndIP(info)
|
s.oauth2Service.UpdateLoginDateAndIP(info)
|
||||||
|
|||||||
@@ -46,11 +46,11 @@ func (s Oauth2ClientController) Info(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
info := s.oauth2ClientService.FindByClientId(clientId)
|
info := s.oauth2ClientService.FindByClientId(clientId)
|
||||||
if info.ClientId == "" || info.ClientId != clientId {
|
if info.ClientId == clientId {
|
||||||
c.JSON(200, resp.ErrMsg("clientId does not exist"))
|
c.JSON(200, resp.OkData(info))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
c.JSON(200, resp.OkData(info))
|
c.JSON(200, resp.ErrMsg("clientId does not exist"))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add 新增
|
// Add 新增
|
||||||
@@ -68,8 +68,16 @@ func (s Oauth2ClientController) Add(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
localHost := strings.Contains(body.IPWhite, "127.0.0.1") || strings.Contains(body.IPWhite, "localhost") || strings.Contains(body.IPWhite, "::1")
|
// 本地IP地址不支持
|
||||||
if localHost || strings.Contains(body.IPWhite, "::ffff:") {
|
localHosts := []string{"127.0.0.1", "localhost", "::ffff:", "::1"}
|
||||||
|
localHost := false
|
||||||
|
for _, host := range localHosts {
|
||||||
|
if strings.Contains(body.IPWhite, host) {
|
||||||
|
localHost = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if localHost {
|
||||||
c.JSON(200, resp.ErrMsg("no support local host"))
|
c.JSON(200, resp.ErrMsg("no support local host"))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -98,8 +106,16 @@ func (s Oauth2ClientController) Edit(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
localHost := strings.Contains(body.IPWhite, "127.0.0.1") || strings.Contains(body.IPWhite, "localhost") || strings.Contains(body.IPWhite, "::1")
|
// 本地IP地址不支持
|
||||||
if localHost || strings.Contains(body.IPWhite, "::ffff:") {
|
localHosts := []string{"127.0.0.1", "localhost", "::ffff:", "::1"}
|
||||||
|
localHost := false
|
||||||
|
for _, host := range localHosts {
|
||||||
|
if strings.Contains(body.IPWhite, host) {
|
||||||
|
localHost = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if localHost {
|
||||||
c.JSON(200, resp.ErrMsg("no support local host"))
|
c.JSON(200, resp.ErrMsg("no support local host"))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import (
|
|||||||
|
|
||||||
"be.ems/src/framework/logger"
|
"be.ems/src/framework/logger"
|
||||||
"be.ems/src/framework/middleware"
|
"be.ems/src/framework/middleware"
|
||||||
monitorController "be.ems/src/modules/monitor/controller"
|
|
||||||
"be.ems/src/modules/oauth2/controller"
|
"be.ems/src/modules/oauth2/controller"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -70,14 +69,6 @@ func Setup(router *gin.Engine) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ==== 开放接口 ====
|
// ==== 授权认证的开放接口 ====
|
||||||
|
openAPI(router)
|
||||||
openApiGroup := router.Group("/open-api")
|
|
||||||
{
|
|
||||||
openApiGroup.GET("/monitor/system",
|
|
||||||
middleware.AuthorizeOauth2(nil),
|
|
||||||
monitorController.NewSystem.Info,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
33
src/modules/oauth2/open_api.go
Normal file
33
src/modules/oauth2/open_api.go
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
package oauth2
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
|
||||||
|
"be.ems/src/framework/middleware"
|
||||||
|
monitorController "be.ems/src/modules/monitor/controller"
|
||||||
|
neController "be.ems/src/modules/network_element/controller"
|
||||||
|
)
|
||||||
|
|
||||||
|
// openAPI 客户端授权开放接口
|
||||||
|
func openAPI(router *gin.Engine) {
|
||||||
|
openApiGroup := router.Group("/open-api")
|
||||||
|
|
||||||
|
// 监控
|
||||||
|
monitorGroup := openApiGroup.Group("/monitor")
|
||||||
|
{
|
||||||
|
monitorGroup.GET("/system",
|
||||||
|
middleware.AuthorizeOauth2(nil),
|
||||||
|
monitorController.NewSystem.Info,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 网元
|
||||||
|
neGroup := openApiGroup.Group("/ne")
|
||||||
|
{
|
||||||
|
neGroup.GET("/state",
|
||||||
|
middleware.AuthorizeOauth2(nil),
|
||||||
|
neController.NewNeInfo.State,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -54,7 +54,7 @@ func (s Oauth2Service) ValidateCode(code string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ByClient 客户端信息
|
// ByClient 客户端信息
|
||||||
func (s Oauth2Service) ByClient(clientId, clientSecret string) (token.Oauth2Info, error) {
|
func (s Oauth2Service) ByClient(clientId, clientSecret, ipaddr string) (token.Oauth2Info, error) {
|
||||||
info := token.Oauth2Info{}
|
info := token.Oauth2Info{}
|
||||||
|
|
||||||
// 查询用户登录账号
|
// 查询用户登录账号
|
||||||
@@ -66,9 +66,13 @@ func (s Oauth2Service) ByClient(clientId, clientSecret string) (token.Oauth2Info
|
|||||||
if len(rows) > 0 {
|
if len(rows) > 0 {
|
||||||
item = rows[0]
|
item = rows[0]
|
||||||
}
|
}
|
||||||
if item.ClientId == "" {
|
if item.ClientId == "" || item.ClientSecret == "" {
|
||||||
return info, fmt.Errorf("clientId or clientSecret is not exist")
|
return info, fmt.Errorf("clientId or clientSecret is not exist")
|
||||||
}
|
}
|
||||||
|
// 判断IP白名单
|
||||||
|
if !strings.Contains(item.IPWhite, ipaddr) {
|
||||||
|
return info, fmt.Errorf("ip whitelist mismatch")
|
||||||
|
}
|
||||||
|
|
||||||
info.ClientId = clientId
|
info.ClientId = clientId
|
||||||
// 用户权限组标识
|
// 用户权限组标识
|
||||||
|
|||||||
Reference in New Issue
Block a user