From 6427a2290df9484e00dda5d3d6cb753a44545b5b Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 23 Nov 2024 10:44:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E8=AE=AD=E6=95=99=E5=AD=A6?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E6=9B=B4=E6=96=B0=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/practical_training/README.md | 28 +- .../practical_training/add_file/app.go | 158 ++++ .../excel/student_import_template_en.xlsx | Bin 0 -> 11077 bytes .../excel/student_import_template_zh.xlsx | Bin 0 -> 11094 bytes .../excel/user_import_template_en.xlsx | Bin 0 -> 11289 bytes .../excel/user_import_template_zh.xlsx | Bin 0 -> 11324 bytes .../add_file/database/install/README.md | 19 + .../database/install/pt_ne_config_apply.sql | 20 + .../database/install/pt_ne_config_data.sql | 96 +++ .../install/pt_ne_config_data_log.sql | 23 + .../add_file/database/install/sys_dept.sql | 59 ++ .../database/install/sys_dict_data0.sql | 179 +++++ .../install/sys_dict_data1_i18n_zh.sql | 747 ++++++++++++++++++ .../install/sys_dict_data2_i18n_en.sql | 747 ++++++++++++++++++ .../database/install/sys_dict_type.sql | 65 ++ .../add_file/database/install/sys_menu.sql | 219 +++++ .../add_file/database/install/sys_post.sql | 34 + .../add_file/database/install/sys_role.sql | 41 + .../database/install/sys_role_menu.sql | 233 ++++++ .../add_file/database/install/sys_user.sql | 50 ++ .../database/install/sys_user_post.sql | 24 + .../database/install/sys_user_role.sql | 24 + .../add_file/database/upgrade/readme.md | 1 + .../add_file/database/upgvue3/readme.md | 1 + 24 files changed, 2747 insertions(+), 21 deletions(-) create mode 100644 src/modules/practical_training/add_file/app.go create mode 100644 src/modules/practical_training/add_file/assets/template/excel/student_import_template_en.xlsx create mode 100644 src/modules/practical_training/add_file/assets/template/excel/student_import_template_zh.xlsx create mode 100644 src/modules/practical_training/add_file/assets/template/excel/user_import_template_en.xlsx create mode 100644 src/modules/practical_training/add_file/assets/template/excel/user_import_template_zh.xlsx create mode 100644 src/modules/practical_training/add_file/database/install/README.md create mode 100644 src/modules/practical_training/add_file/database/install/pt_ne_config_apply.sql create mode 100644 src/modules/practical_training/add_file/database/install/pt_ne_config_data.sql create mode 100644 src/modules/practical_training/add_file/database/install/pt_ne_config_data_log.sql create mode 100644 src/modules/practical_training/add_file/database/install/sys_dept.sql create mode 100644 src/modules/practical_training/add_file/database/install/sys_dict_data0.sql create mode 100644 src/modules/practical_training/add_file/database/install/sys_dict_data1_i18n_zh.sql create mode 100644 src/modules/practical_training/add_file/database/install/sys_dict_data2_i18n_en.sql create mode 100644 src/modules/practical_training/add_file/database/install/sys_dict_type.sql create mode 100644 src/modules/practical_training/add_file/database/install/sys_menu.sql create mode 100644 src/modules/practical_training/add_file/database/install/sys_post.sql create mode 100644 src/modules/practical_training/add_file/database/install/sys_role.sql create mode 100644 src/modules/practical_training/add_file/database/install/sys_role_menu.sql create mode 100644 src/modules/practical_training/add_file/database/install/sys_user.sql create mode 100644 src/modules/practical_training/add_file/database/install/sys_user_post.sql create mode 100644 src/modules/practical_training/add_file/database/install/sys_user_role.sql create mode 100644 src/modules/practical_training/add_file/database/upgrade/readme.md create mode 100644 src/modules/practical_training/add_file/database/upgvue3/readme.md diff --git a/src/modules/practical_training/README.md b/src/modules/practical_training/README.md index 8d32a7d1..735a6811 100644 --- a/src/modules/practical_training/README.md +++ b/src/modules/practical_training/README.md @@ -1,25 +1,11 @@ -# 实训教学 +# 实训教学模块 -网元固定一套,ne_id默认使用`001` +网元固定一套,ne_id 默认使用`001` -## 数据库 +## 静态资源 add_file -涉及新增修改的数据库表,大更新合并时检查 +将目录下文件放置到对应目录 -- database\install\pt_ne_config_apply.sql -- database\install\pt_ne_config_data.sql -- database\install\pt_ne_config_data_log.sql -- database\install\sys_user.sql -- database\install\sys_post.sql -- database\install\sys_role.sql -- database\install\sys_role_menu.sql -- database\install\sys_dict_type.sql -- database\install\sys_dict_data0.sql -- database\install\sys_dict_data1_i18n_zh.sql -- database\install\sys_dict_data2_i18n_en.sql - -初始网元 - -- database\install\ne_info.sql -- database\install\ne_host.sql -- database\install\ne_license.sql +- assets 对应覆盖 src\assets +- database 对应覆盖 database +- app.go 对应覆盖 app.go diff --git a/src/modules/practical_training/add_file/app.go b/src/modules/practical_training/add_file/app.go new file mode 100644 index 00000000..44480c6f --- /dev/null +++ b/src/modules/practical_training/add_file/app.go @@ -0,0 +1,158 @@ +package src + +import ( + "embed" + "fmt" + + "be.ems/src/framework/config" + "be.ems/src/framework/errorcatch" + "be.ems/src/framework/middleware" + "be.ems/src/framework/middleware/security" + "be.ems/src/framework/utils/machine" + "be.ems/src/modules/chart" + "be.ems/src/modules/common" + "be.ems/src/modules/crontask" + "be.ems/src/modules/monitor" + networkdata "be.ems/src/modules/network_data" + networkelement "be.ems/src/modules/network_element" + practicalTraining "be.ems/src/modules/practical_training" + "be.ems/src/modules/system" + "be.ems/src/modules/tool" + "be.ems/src/modules/trace" + "be.ems/src/modules/ws" + + "github.com/chenjiandongx/ginprom" + "github.com/gin-gonic/gin" + "github.com/prometheus/client_golang/prometheus/promhttp" +) + +//go:embed assets/* +var assetsDir embed.FS + +// 路由函数句柄,交给由 http.ListenAndServe(addr, router) +func AppEngine() *gin.Engine { + app := initAppEngine() + + // TODO 不建议在主分支中加入 + // 性能分析监控 + if promEnabled := config.Get("pprof.enabled"); promEnabled != nil && promEnabled.(bool) { + app.Use(ginprom.PromMiddleware(nil)) + app.GET("/metrics", ginprom.PromHandler(promhttp.Handler())) + } + + // 初始全局默认 + initDefeat(app) + + // 初始模块路由 + initModulesRoute(app) + + // 设置程序内全局资源访问 + config.SetAssetsDirFS(assetsDir) + + // 首次安装启动记录 + machine.Launch() + + // 读取服务配置 + app.ForwardedByClientIP = config.Get("server.proxy").(bool) + return app +} + +// 运行服务程序 main.go +// +// func main() { +// src.ConfigurationInit() +// if err := src.RunServer(); err != nil { +// src.ConfigurationClose() +// } +// } +func RunServer() error { + app := AppEngine() + + // 读取服务配置 + app.ForwardedByClientIP = config.Get("server.proxy").(bool) + addr := fmt.Sprintf(":%d", config.Get("server.port").(int)) + + // 启动服务 + fmt.Printf("\nopen http://localhost%s \n\n", addr) + return app.Run(addr) +} + +// 初始应用引擎 +func initAppEngine() *gin.Engine { + var app *gin.Engine + + // 禁止控制台日志输出的颜色 + gin.DisableConsoleColor() + + // 根据运行环境注册引擎 + if config.Env() == "prod" { + gin.SetMode(gin.ReleaseMode) + app = gin.New() + app.Use(gin.Recovery()) + } else { + app = gin.Default() + } + + return app +} + +// 初始全局默认 +func initDefeat(app *gin.Engine) { + // 全局中间件 + if config.Env() == "local" { + app.Use(middleware.Report()) + } + app.Use(errorcatch.ErrorCatch(), middleware.Cors(), security.Security()) + + // 静态目录-静态资源 + if v := config.Get("staticFile.default"); v != nil { + fsMap := v.(map[string]any) + prefix, dir := fsMap["prefix"], fsMap["dir"] + if prefix != nil && dir != nil { + app.StaticFS(prefix.(string), gin.Dir(dir.(string), true)) + } + } + + // 静态目录-上传资源 + if v := config.Get("staticFile.upload"); v != nil { + fsMap := v.(map[string]any) + prefix, dir := fsMap["prefix"], fsMap["dir"] + if prefix != nil && dir != nil { + app.StaticFS(prefix.(string), gin.Dir(dir.(string), true)) + } + } + + // 路由未找到时 + app.NoRoute(func(c *gin.Context) { + c.JSON(404, gin.H{ + "code": 404, + "msg": fmt.Sprintf("Not Found %s", c.Request.RequestURI), + }) + }) +} + +// 初始模块路由 +func initModulesRoute(app *gin.Engine) { + // 通用模块 + common.Setup(app) + // 系统模块 + system.Setup(app) + // 网元功能模块 + networkelement.Setup(app) + // 网元数据模块 + networkdata.Setup(app) + // 实训教学模块 + practicalTraining.Setup(app) + // 跟踪模块 + trace.Setup(app) + // 图表模块 + chart.Setup(app) + // 工具模块 + tool.Setup(app) + // ws 模块 + ws.Setup(app) + // 调度任务模块--暂无接口 + crontask.Setup(app) + // 监控模块 - 含调度处理加入队列,放最后 + monitor.Setup(app) +} diff --git a/src/modules/practical_training/add_file/assets/template/excel/student_import_template_en.xlsx b/src/modules/practical_training/add_file/assets/template/excel/student_import_template_en.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..54f1010f9ebfa22d4b2f82609d72cac8c407b0d1 GIT binary patch literal 11077 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 F_kT$0K*<0A literal 0 HcmV?d00001 diff --git a/src/modules/practical_training/add_file/assets/template/excel/user_import_template_zh.xlsx b/src/modules/practical_training/add_file/assets/template/excel/user_import_template_zh.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b51fd7ebb41f48b8c0b65651f8fa4aa4d36a8bf0 GIT binary patch literal 11324 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