完成总体的sql数据库创建

This commit is contained in:
2025-10-27 11:01:49 +08:00
parent e087a78387
commit 85d2e75e35
15 changed files with 341 additions and 94 deletions

View File

@@ -1,3 +0,0 @@
Name: devproject-api
Host: 0.0.0.0
Port: 8888

View File

@@ -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)

View File

@@ -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)

View File

@@ -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
}

View File

@@ -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"),
)
}

View File

@@ -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
}

View File

@@ -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
}
}

View File

@@ -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))
}

View File

@@ -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
}

View File

@@ -0,0 +1,5 @@
package model
import "github.com/zeromicro/go-zero/core/stores/sqlx"
var ErrNotFound = sqlx.ErrNotFound

View File

@@ -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,
}
}

View File

@@ -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"` // 基础开发项目中期检查

View File

@@ -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

View File

@@ -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 '基地开放项目表';