From 85d2e75e35ddeee238095b19a4cee62ad5f7e61c Mon Sep 17 00:00:00 2001 From: mayiming <1627832236@qq.com> Date: Mon, 27 Oct 2025 11:01:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=80=BB=E4=BD=93=E7=9A=84sq?= =?UTF-8?q?l=E6=95=B0=E6=8D=AE=E5=BA=93=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../devproject/etc/devproject-api.yaml | 3 - .../devproject/getdevprojecthandler.go | 24 ++++- .../devproject/savedevprojecthandler.go | 23 ++++- .../devproject/internal/config/config.go | 10 --- .../devproject/internal/handler/routes.go | 31 ------- .../logic/devproject/getdevprojectlogic.go | 40 +++++++-- .../logic/devproject/savedevprojectlogic.go | 85 ++++++++++++++++-- .../internal/model/devprojectmodel.go | 29 ++++++ .../internal/model/devprojectmodel_gen.go | 88 +++++++++++++++++++ .../devproject/internal/model/vars.go | 5 ++ .../devproject/internal/svc/servicecontext.go | 18 ---- .../devproject/internal/types/types.go | 3 +- server/router/router.go | 10 +++ server/sql/devproject.sql | 10 +++ web/package-lock.json | 56 +++++++++--- 15 files changed, 341 insertions(+), 94 deletions(-) delete mode 100644 server/internal/devproject/etc/devproject-api.yaml rename server/internal/devproject/{internal => }/handler/devproject/getdevprojecthandler.go (53%) rename server/internal/devproject/{internal => }/handler/devproject/savedevprojecthandler.go (53%) delete mode 100644 server/internal/devproject/internal/config/config.go delete mode 100644 server/internal/devproject/internal/handler/routes.go create mode 100644 server/internal/devproject/internal/model/devprojectmodel.go create mode 100644 server/internal/devproject/internal/model/devprojectmodel_gen.go create mode 100644 server/internal/devproject/internal/model/vars.go delete mode 100644 server/internal/devproject/internal/svc/servicecontext.go diff --git a/server/internal/devproject/etc/devproject-api.yaml b/server/internal/devproject/etc/devproject-api.yaml deleted file mode 100644 index f5648757..00000000 --- a/server/internal/devproject/etc/devproject-api.yaml +++ /dev/null @@ -1,3 +0,0 @@ -Name: devproject-api -Host: 0.0.0.0 -Port: 8888 diff --git a/server/internal/devproject/internal/handler/devproject/getdevprojecthandler.go b/server/internal/devproject/handler/devproject/getdevprojecthandler.go similarity index 53% rename from server/internal/devproject/internal/handler/devproject/getdevprojecthandler.go rename to server/internal/devproject/handler/devproject/getdevprojecthandler.go index 833d9686..9146895a 100644 --- a/server/internal/devproject/internal/handler/devproject/getdevprojecthandler.go +++ b/server/internal/devproject/handler/devproject/getdevprojecthandler.go @@ -4,23 +4,41 @@ package devproject import ( + "fmt" "net/http" + "github.com/JACKYMYPERSON/hldrCenter/config" "github.com/JACKYMYPERSON/hldrCenter/internal/devproject/internal/logic/devproject" - "github.com/JACKYMYPERSON/hldrCenter/internal/devproject/internal/svc" + "github.com/JACKYMYPERSON/hldrCenter/internal/devproject/internal/model" "github.com/JACKYMYPERSON/hldrCenter/internal/devproject/internal/types" + "github.com/zeromicro/go-zero/core/stores/sqlx" "github.com/zeromicro/go-zero/rest/httpx" ) -func GetDevProjectHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func GetDevProjectHandler(cfg *config.Config) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var req types.GetDevProjectReq if err := httpx.Parse(r, &req); err != nil { httpx.ErrorCtx(r.Context(), w, err) return } + mysqlCfg := cfg.MySQL + dsn := fmt.Sprintf( + "%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=true&loc=Local", + mysqlCfg.Username, + mysqlCfg.Password, + mysqlCfg.Host, + mysqlCfg.Port, + mysqlCfg.Database, + mysqlCfg.Charset, + ) + fmt.Println("接收到articlePost请求") - l := devproject.NewGetDevProjectLogic(r.Context(), svcCtx) + conn := sqlx.NewSqlConn("mysql", dsn) + + DevProjectModel := model.NewDevprojectModel(conn) + + l := devproject.NewGetDevProjectLogic(r.Context(), cfg, DevProjectModel) resp, err := l.GetDevProject(&req) if err != nil { httpx.ErrorCtx(r.Context(), w, err) diff --git a/server/internal/devproject/internal/handler/devproject/savedevprojecthandler.go b/server/internal/devproject/handler/devproject/savedevprojecthandler.go similarity index 53% rename from server/internal/devproject/internal/handler/devproject/savedevprojecthandler.go rename to server/internal/devproject/handler/devproject/savedevprojecthandler.go index 5eb6f94c..9dcbc395 100644 --- a/server/internal/devproject/internal/handler/devproject/savedevprojecthandler.go +++ b/server/internal/devproject/handler/devproject/savedevprojecthandler.go @@ -4,23 +4,40 @@ package devproject import ( + "fmt" "net/http" + "github.com/JACKYMYPERSON/hldrCenter/config" "github.com/JACKYMYPERSON/hldrCenter/internal/devproject/internal/logic/devproject" - "github.com/JACKYMYPERSON/hldrCenter/internal/devproject/internal/svc" + "github.com/JACKYMYPERSON/hldrCenter/internal/devproject/internal/model" "github.com/JACKYMYPERSON/hldrCenter/internal/devproject/internal/types" + "github.com/zeromicro/go-zero/core/stores/sqlx" "github.com/zeromicro/go-zero/rest/httpx" ) -func SaveDevProjectHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func SaveDevProjectHandler(cfg *config.Config) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var req types.SaveDevProjectReq if err := httpx.Parse(r, &req); err != nil { httpx.ErrorCtx(r.Context(), w, err) return } + mysqlCfg := cfg.MySQL + dsn := fmt.Sprintf( + "%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=true&loc=Local", + mysqlCfg.Username, + mysqlCfg.Password, + mysqlCfg.Host, + mysqlCfg.Port, + mysqlCfg.Database, + mysqlCfg.Charset, + ) + fmt.Println("接收到articlePost请求") - l := devproject.NewSaveDevProjectLogic(r.Context(), svcCtx) + conn := sqlx.NewSqlConn("mysql", dsn) + DevProjectModel := model.NewDevprojectModel(conn) + + l := devproject.NewSaveDevProjectLogic(r.Context(), cfg, DevProjectModel) resp, err := l.SaveDevProject(&req) if err != nil { httpx.ErrorCtx(r.Context(), w, err) diff --git a/server/internal/devproject/internal/config/config.go b/server/internal/devproject/internal/config/config.go deleted file mode 100644 index 9b36470a..00000000 --- a/server/internal/devproject/internal/config/config.go +++ /dev/null @@ -1,10 +0,0 @@ -// Code scaffolded by goctl. Safe to edit. -// goctl 1.9.2 - -package config - -import "github.com/zeromicro/go-zero/rest" - -type Config struct { - rest.RestConf -} diff --git a/server/internal/devproject/internal/handler/routes.go b/server/internal/devproject/internal/handler/routes.go deleted file mode 100644 index 726dcacb..00000000 --- a/server/internal/devproject/internal/handler/routes.go +++ /dev/null @@ -1,31 +0,0 @@ -// Code generated by goctl. DO NOT EDIT. -// goctl 1.9.2 - -package handler - -import ( - "net/http" - - devproject "github.com/JACKYMYPERSON/hldrCenter/internal/devproject/internal/handler/devproject" - "github.com/JACKYMYPERSON/hldrCenter/internal/devproject/internal/svc" - - "github.com/zeromicro/go-zero/rest" -) - -func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { - server.AddRoutes( - []rest.Route{ - { - Method: http.MethodGet, - Path: "/devproject/get", - Handler: devproject.GetDevProjectHandler(serverCtx), - }, - { - Method: http.MethodPost, - Path: "/devproject/save", - Handler: devproject.SaveDevProjectHandler(serverCtx), - }, - }, - rest.WithPrefix("/api/devproject"), - ) -} diff --git a/server/internal/devproject/internal/logic/devproject/getdevprojectlogic.go b/server/internal/devproject/internal/logic/devproject/getdevprojectlogic.go index ed67ae47..fe5dd0a2 100644 --- a/server/internal/devproject/internal/logic/devproject/getdevprojectlogic.go +++ b/server/internal/devproject/internal/logic/devproject/getdevprojectlogic.go @@ -6,7 +6,8 @@ package devproject import ( "context" - "github.com/JACKYMYPERSON/hldrCenter/internal/devproject/internal/svc" + "github.com/JACKYMYPERSON/hldrCenter/config" + "github.com/JACKYMYPERSON/hldrCenter/internal/devproject/internal/model" "github.com/JACKYMYPERSON/hldrCenter/internal/devproject/internal/types" "github.com/zeromicro/go-zero/core/logx" @@ -14,20 +15,45 @@ import ( type GetDevProjectLogic struct { logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext + ctx context.Context + cfg *config.Config + model model.DevprojectModel } -func NewGetDevProjectLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetDevProjectLogic { +func NewGetDevProjectLogic(ctx context.Context, cfg *config.Config, model model.DevprojectModel) *GetDevProjectLogic { return &GetDevProjectLogic{ Logger: logx.WithContext(ctx), ctx: ctx, - svcCtx: svcCtx, + cfg: cfg, + model: model, } } func (l *GetDevProjectLogic) GetDevProject(req *types.GetDevProjectReq) (resp *types.GetDevProjectResp, err error) { - // todo: add your logic here and delete this line + project, err := l.model.FindOne(l.ctx, 1) + if err != nil { + // 处理"记录不存在"错误(id=1可能未创建) + if err == model.ErrNotFound { + return &types.GetDevProjectResp{ + DevProject: types.DevProject{}, // 返回空结构体 + Msg: "未找到id=1的基地开放项目", + }, nil + } + // 其他数据库错误(如连接失败)返回错误 + return nil, err + } - return + // 组装响应:映射模型数据到API响应结构体 + resp = &types.GetDevProjectResp{ + DevProject: types.DevProject{ + Id: project.Id, // 实际返回的是id=1的数据 + BasicDevProjectManagementSystem: project.BasicDevProjectManagementSystem.String, + BasicDevProjectInitiationResult: project.BasicDevProjectInitiationResult.String, + BasicDevProjectMidtermInspection: project.BasicDevProjectMidtermInspection.String, + BasicDevProjectAchievements: project.BasicDevProjectAchievements.String, + }, + Msg: "查询成功", + } + + return resp, nil } diff --git a/server/internal/devproject/internal/logic/devproject/savedevprojectlogic.go b/server/internal/devproject/internal/logic/devproject/savedevprojectlogic.go index da982a7a..f37d8ff3 100644 --- a/server/internal/devproject/internal/logic/devproject/savedevprojectlogic.go +++ b/server/internal/devproject/internal/logic/devproject/savedevprojectlogic.go @@ -5,8 +5,11 @@ package devproject import ( "context" + "database/sql" + "strconv" - "github.com/JACKYMYPERSON/hldrCenter/internal/devproject/internal/svc" + "github.com/JACKYMYPERSON/hldrCenter/config" + "github.com/JACKYMYPERSON/hldrCenter/internal/devproject/internal/model" "github.com/JACKYMYPERSON/hldrCenter/internal/devproject/internal/types" "github.com/zeromicro/go-zero/core/logx" @@ -14,20 +17,88 @@ import ( type SaveDevProjectLogic struct { logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext + ctx context.Context + cfg *config.Config + model model.DevprojectModel } -func NewSaveDevProjectLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SaveDevProjectLogic { +func NewSaveDevProjectLogic(ctx context.Context, cfg *config.Config, model model.DevprojectModel) *SaveDevProjectLogic { return &SaveDevProjectLogic{ Logger: logx.WithContext(ctx), ctx: ctx, - svcCtx: svcCtx, + cfg: cfg, + model: model, } } func (l *SaveDevProjectLogic) SaveDevProject(req *types.SaveDevProjectReq) (resp *types.SaveDevProjectResp, err error) { - // todo: add your logic here and delete this line + // 固定操作 id=1,无需前端传递id + fixedId := int64(1) - return + // 1. 检查 id=1 的记录是否存在(存在则更新,不存在则新增) + existProject, err := l.model.FindOne(l.ctx, fixedId) + if err != nil && err != model.ErrNotFound { + // 排除"记录不存在"的其他错误(如数据库连接失败) + return &types.SaveDevProjectResp{ + Success: false, + Msg: "查询项目失败:" + err.Error(), + }, nil + } + + // 2. 构造模型数据(统一转换为 sql.NullString) + projectData := &model.Devproject{ + Id: fixedId, + BasicDevProjectManagementSystem: sql.NullString{String: req.BasicDevProjectManagementSystem, Valid: req.BasicDevProjectManagementSystem != ""}, + BasicDevProjectInitiationResult: sql.NullString{String: req.BasicDevProjectInitiationResult, Valid: req.BasicDevProjectInitiationResult != ""}, + BasicDevProjectMidtermInspection: sql.NullString{String: req.BasicDevProjectMidtermInspection, Valid: req.BasicDevProjectMidtermInspection != ""}, + BasicDevProjectAchievements: sql.NullString{String: req.BasicDevProjectAchievements, Valid: req.BasicDevProjectAchievements != ""}, + } + + // 3. 记录存在则更新,不存在则新增 + if existProject != nil { + // 更新逻辑 + err = l.model.Update(l.ctx, projectData) + if err != nil { + return &types.SaveDevProjectResp{ + Success: false, + Msg: "更新 id=1 的项目失败:" + err.Error(), + }, nil + } + return &types.SaveDevProjectResp{ + Success: true, + Msg: "更新 id=1 的项目成功", + Id: fixedId, + }, nil + } else { + // 新增逻辑(插入 id=1 的记录) + // 注意:需确保模型层 Insert 方法支持手动指定 id(而非仅自增) + result, err := l.model.Insert(l.ctx, projectData) + if err != nil { + return &types.SaveDevProjectResp{ + Success: false, + Msg: "新增 id=1 的项目失败:" + err.Error(), + }, nil + } + + // 验证插入后的 id 是否为 1(可选,确保数据正确性) + lastId, err := result.LastInsertId() + if err != nil { + return &types.SaveDevProjectResp{ + Success: false, + Msg: "新增项目成功,但验证ID失败:" + err.Error(), + }, nil + } + if lastId != fixedId { + return &types.SaveDevProjectResp{ + Success: false, + Msg: "新增项目ID异常,预期 id=1,实际 id=" + strconv.FormatInt(lastId, 10), + }, nil + } + + return &types.SaveDevProjectResp{ + Success: true, + Msg: "新增 id=1 的项目成功", + Id: fixedId, + }, nil + } } diff --git a/server/internal/devproject/internal/model/devprojectmodel.go b/server/internal/devproject/internal/model/devprojectmodel.go new file mode 100644 index 00000000..de45f328 --- /dev/null +++ b/server/internal/devproject/internal/model/devprojectmodel.go @@ -0,0 +1,29 @@ +package model + +import "github.com/zeromicro/go-zero/core/stores/sqlx" + +var _ DevprojectModel = (*customDevprojectModel)(nil) + +type ( + // DevprojectModel is an interface to be customized, add more methods here, + // and implement the added methods in customDevprojectModel. + DevprojectModel interface { + devprojectModel + withSession(session sqlx.Session) DevprojectModel + } + + customDevprojectModel struct { + *defaultDevprojectModel + } +) + +// NewDevprojectModel returns a model for the database table. +func NewDevprojectModel(conn sqlx.SqlConn) DevprojectModel { + return &customDevprojectModel{ + defaultDevprojectModel: newDevprojectModel(conn), + } +} + +func (m *customDevprojectModel) withSession(session sqlx.Session) DevprojectModel { + return NewDevprojectModel(sqlx.NewSqlConnFromSession(session)) +} diff --git a/server/internal/devproject/internal/model/devprojectmodel_gen.go b/server/internal/devproject/internal/model/devprojectmodel_gen.go new file mode 100644 index 00000000..668279ba --- /dev/null +++ b/server/internal/devproject/internal/model/devprojectmodel_gen.go @@ -0,0 +1,88 @@ +// Code generated by goctl. DO NOT EDIT. +// versions: +// goctl version: 1.9.2 + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" +) + +var ( + devprojectFieldNames = builder.RawFieldNames(&Devproject{}) + devprojectRows = strings.Join(devprojectFieldNames, ",") + devprojectRowsExpectAutoSet = strings.Join(stringx.Remove(devprojectFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",") + devprojectRowsWithPlaceHolder = strings.Join(stringx.Remove(devprojectFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?" +) + +type ( + devprojectModel interface { + Insert(ctx context.Context, data *Devproject) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*Devproject, error) + Update(ctx context.Context, data *Devproject) error + Delete(ctx context.Context, id int64) error + } + + defaultDevprojectModel struct { + conn sqlx.SqlConn + table string + } + + Devproject struct { + Id int64 `db:"id"` // 基地开放项目ID + BasicDevProjectManagementSystem sql.NullString `db:"basic_dev_project_management_system"` // 基础开发项目管理制度 + BasicDevProjectInitiationResult sql.NullString `db:"basic_dev_project_initiation_result"` // 基础开发项目立项结果 + BasicDevProjectMidtermInspection sql.NullString `db:"basic_dev_project_midterm_inspection"` // 基础开发项目中期检查 + BasicDevProjectAchievements sql.NullString `db:"basic_dev_project_achievements"` // 基础开发项目成果 + } +) + +func newDevprojectModel(conn sqlx.SqlConn) *defaultDevprojectModel { + return &defaultDevprojectModel{ + conn: conn, + table: "`devproject`", + } +} + +func (m *defaultDevprojectModel) Delete(ctx context.Context, id int64) error { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + _, err := m.conn.ExecCtx(ctx, query, id) + return err +} + +func (m *defaultDevprojectModel) FindOne(ctx context.Context, id int64) (*Devproject, error) { + query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", devprojectRows, m.table) + var resp Devproject + err := m.conn.QueryRowCtx(ctx, &resp, query, id) + switch err { + case nil: + return &resp, nil + case sqlx.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultDevprojectModel) Insert(ctx context.Context, data *Devproject) (sql.Result, error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?)", m.table, devprojectRowsExpectAutoSet) + ret, err := m.conn.ExecCtx(ctx, query, data.BasicDevProjectManagementSystem, data.BasicDevProjectInitiationResult, data.BasicDevProjectMidtermInspection, data.BasicDevProjectAchievements) + return ret, err +} + +func (m *defaultDevprojectModel) Update(ctx context.Context, data *Devproject) error { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, devprojectRowsWithPlaceHolder) + _, err := m.conn.ExecCtx(ctx, query, data.BasicDevProjectManagementSystem, data.BasicDevProjectInitiationResult, data.BasicDevProjectMidtermInspection, data.BasicDevProjectAchievements, data.Id) + return err +} + +func (m *defaultDevprojectModel) tableName() string { + return m.table +} diff --git a/server/internal/devproject/internal/model/vars.go b/server/internal/devproject/internal/model/vars.go new file mode 100644 index 00000000..69ca814e --- /dev/null +++ b/server/internal/devproject/internal/model/vars.go @@ -0,0 +1,5 @@ +package model + +import "github.com/zeromicro/go-zero/core/stores/sqlx" + +var ErrNotFound = sqlx.ErrNotFound diff --git a/server/internal/devproject/internal/svc/servicecontext.go b/server/internal/devproject/internal/svc/servicecontext.go deleted file mode 100644 index 19253b83..00000000 --- a/server/internal/devproject/internal/svc/servicecontext.go +++ /dev/null @@ -1,18 +0,0 @@ -// Code scaffolded by goctl. Safe to edit. -// goctl 1.9.2 - -package svc - -import ( - "github.com/JACKYMYPERSON/hldrCenter/internal/devproject/internal/config" -) - -type ServiceContext struct { - Config config.Config -} - -func NewServiceContext(c config.Config) *ServiceContext { - return &ServiceContext{ - Config: c, - } -} diff --git a/server/internal/devproject/internal/types/types.go b/server/internal/devproject/internal/types/types.go index 69eed916..3aa1e70c 100644 --- a/server/internal/devproject/internal/types/types.go +++ b/server/internal/devproject/internal/types/types.go @@ -12,7 +12,7 @@ type DevProject struct { } type GetDevProjectReq struct { - Id int64 `json:"id" form:"id" validate:"required"` // 基地开放项目ID(必传) + //Id int64 `json:"id" form:"id" validate:"required"` } type GetDevProjectResp struct { @@ -21,7 +21,6 @@ type GetDevProjectResp struct { } type SaveDevProjectReq struct { - Id int64 `json:"id,omitempty"` // 可选:更新时需传入ID BasicDevProjectManagementSystem string `json:"basic_dev_project_management_system"` // 基础开发项目管理制度 BasicDevProjectInitiationResult string `json:"basic_dev_project_initiation_result"` // 基础开发项目立项结果 BasicDevProjectMidtermInspection string `json:"basic_dev_project_midterm_inspection"` // 基础开发项目中期检查 diff --git a/server/router/router.go b/server/router/router.go index 6cbdfd19..95bef67c 100644 --- a/server/router/router.go +++ b/server/router/router.go @@ -4,6 +4,7 @@ import ( "github.com/JACKYMYPERSON/hldrCenter/config" "github.com/JACKYMYPERSON/hldrCenter/internal/article/handler/article" "github.com/JACKYMYPERSON/hldrCenter/internal/baseoverview/handler/baseOverview" + "github.com/JACKYMYPERSON/hldrCenter/internal/devproject/handler/devproject" ping "github.com/JACKYMYPERSON/hldrCenter/internal/ping/handler/ping" uploadimg "github.com/JACKYMYPERSON/hldrCenter/internal/upload/handler/upload" "github.com/JACKYMYPERSON/hldrCenter/middleware" @@ -49,6 +50,15 @@ func SetupRouter(cfg *config.Config) *gin.Engine { // 部分更新基地概况(对应 service 中的 PATCH /) baseOverviewapi.PATCH("", gin.WrapH(baseOverview.UpdateBaseOverviewPartialHandler(cfg))) } + + devprojects := api.Group("/devproject") + { + // 新增或修改项目(POST /api/devproject/save) + devprojects.POST("/save", gin.WrapH(devproject.SaveDevProjectHandler(cfg))) + + // 查询项目详情(GET /api/devproject/get) + devprojects.GET("/get", gin.WrapH(devproject.GetDevProjectHandler(cfg))) + } } return r diff --git a/server/sql/devproject.sql b/server/sql/devproject.sql index e69de29b..54239d87 100644 --- a/server/sql/devproject.sql +++ b/server/sql/devproject.sql @@ -0,0 +1,10 @@ +create table devproject +( + id int not null auto_increment comment '基地开放项目ID', -- 建议加auto_increment(主键自增) + basic_dev_project_management_system text null comment '基础开发项目管理制度', + basic_dev_project_initiation_result text null comment '基础开发项目立项结果', + basic_dev_project_midterm_inspection text null comment '基础开发项目中期检查', + basic_dev_project_achievements text null comment '基础开发项目成果', + primary key (id) -- 独立显式声明主键 +) + comment '基地开放项目表'; \ No newline at end of file diff --git a/web/package-lock.json b/web/package-lock.json index 329a6c48..4b434085 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -63,6 +63,7 @@ "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.28.4.tgz", "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "dev": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -1596,6 +1597,7 @@ "version": "4.17.12", "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz", "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "peer": true, "dependencies": { "@types/lodash": "*" } @@ -1605,6 +1607,7 @@ "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.18.8.tgz", "integrity": "sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==", "dev": true, + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -1657,6 +1660,7 @@ "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.45.0.tgz", "integrity": "sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==", "dev": true, + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.45.0", "@typescript-eslint/types": "8.45.0", @@ -2305,6 +2309,7 @@ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2447,6 +2452,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", @@ -2787,6 +2793,7 @@ "resolved": "https://registry.npmmirror.com/eslint/-/eslint-9.36.0.tgz", "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", "dev": true, + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -2847,6 +2854,7 @@ "resolved": "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, + "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -2892,6 +2900,7 @@ "resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-10.4.0.tgz", "integrity": "sha512-K6tP0dW8FJVZLQxa2S7LcE1lLw3X8VvB3t887Q6CLrFVxHYBXGANbXvwNzYIu6Ughx1bSJ5BDT0YB3ybPT39lw==", "dev": true, + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "natural-compare": "^1.4.0", @@ -3475,6 +3484,7 @@ "resolved": "https://registry.npmmirror.com/jiti/-/jiti-2.6.1.tgz", "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "dev": true, + "peer": true, "bin": { "jiti": "lib/jiti-cli.mjs" } @@ -3594,12 +3604,14 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "peer": true }, "node_modules/lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "peer": true }, "node_modules/lodash-unified": { "version": "1.0.3", @@ -4113,6 +4125,7 @@ "resolved": "https://registry.npmmirror.com/prettier/-/prettier-3.6.2.tgz", "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -4479,6 +4492,7 @@ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, + "peer": true, "engines": { "node": ">=12" }, @@ -4536,6 +4550,7 @@ "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -4664,6 +4679,7 @@ "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -4891,6 +4907,7 @@ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, + "peer": true, "engines": { "node": ">=12" }, @@ -4908,6 +4925,7 @@ "version": "3.5.22", "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.22.tgz", "integrity": "sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==", + "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.22", "@vue/compiler-sfc": "3.5.22", @@ -5096,6 +5114,7 @@ "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.28.4.tgz", "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -6047,6 +6066,7 @@ "version": "4.17.12", "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz", "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "peer": true, "requires": { "@types/lodash": "*" } @@ -6056,6 +6076,7 @@ "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.18.8.tgz", "integrity": "sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==", "dev": true, + "peer": true, "requires": { "undici-types": "~6.21.0" } @@ -6095,6 +6116,7 @@ "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.45.0.tgz", "integrity": "sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==", "dev": true, + "peer": true, "requires": { "@typescript-eslint/scope-manager": "8.45.0", "@typescript-eslint/types": "8.45.0", @@ -6535,7 +6557,8 @@ "version": "8.15.0", "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true + "dev": true, + "peer": true }, "acorn-jsx": { "version": "5.3.2", @@ -6634,6 +6657,7 @@ "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.26.3.tgz", "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", "dev": true, + "peer": true, "requires": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", @@ -6867,6 +6891,7 @@ "resolved": "https://registry.npmmirror.com/eslint/-/eslint-9.36.0.tgz", "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", "dev": true, + "peer": true, "requires": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -6937,6 +6962,7 @@ "resolved": "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, + "peer": true, "requires": {} }, "eslint-plugin-prettier": { @@ -6954,6 +6980,7 @@ "resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-10.4.0.tgz", "integrity": "sha512-K6tP0dW8FJVZLQxa2S7LcE1lLw3X8VvB3t887Q6CLrFVxHYBXGANbXvwNzYIu6Ughx1bSJ5BDT0YB3ybPT39lw==", "dev": true, + "peer": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "natural-compare": "^1.4.0", @@ -7324,7 +7351,8 @@ "version": "2.6.1", "resolved": "https://registry.npmmirror.com/jiti/-/jiti-2.6.1.tgz", "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "dev": true + "dev": true, + "peer": true }, "js-tokens": { "version": "4.0.0", @@ -7414,12 +7442,14 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "peer": true }, "lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "peer": true }, "lodash-unified": { "version": "1.0.3", @@ -7763,7 +7793,8 @@ "version": "3.6.2", "resolved": "https://registry.npmmirror.com/prettier/-/prettier-3.6.2.tgz", "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", - "dev": true + "dev": true, + "peer": true }, "prettier-linter-helpers": { "version": "1.0.0", @@ -7982,7 +8013,8 @@ "version": "4.0.3", "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true + "dev": true, + "peer": true } } }, @@ -8021,7 +8053,8 @@ "version": "5.9.3", "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "devOptional": true + "devOptional": true, + "peer": true }, "typescript-eslint": { "version": "8.45.0", @@ -8095,6 +8128,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.12.tgz", "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==", "dev": true, + "peer": true, "requires": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -8116,7 +8150,8 @@ "version": "4.0.3", "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true + "dev": true, + "peer": true } } }, @@ -8236,6 +8271,7 @@ "version": "3.5.22", "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.22.tgz", "integrity": "sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==", + "peer": true, "requires": { "@vue/compiler-dom": "3.5.22", "@vue/compiler-sfc": "3.5.22",