diff --git a/server/internal/meetingspeaker/internal/meetingmodel/meetingmodel.go b/server/internal/meetingspeaker/internal/meetingmodel/meetingmodel.go new file mode 100644 index 00000000..c49602c2 --- /dev/null +++ b/server/internal/meetingspeaker/internal/meetingmodel/meetingmodel.go @@ -0,0 +1,31 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ MeetingModel = (*customMeetingModel)(nil) + +type ( + // MeetingModel is an interface to be customized, add more methods here, + // and implement the added methods in customMeetingModel. + MeetingModel interface { + meetingModel + withSession(session sqlx.Session) MeetingModel + } + + customMeetingModel struct { + *defaultMeetingModel + } +) + +// NewMeetingModel returns a model for the database table. +func NewMeetingModel(conn sqlx.SqlConn) MeetingModel { + return &customMeetingModel{ + defaultMeetingModel: newMeetingModel(conn), + } +} + +func (m *customMeetingModel) withSession(session sqlx.Session) MeetingModel { + return NewMeetingModel(sqlx.NewSqlConnFromSession(session)) +} diff --git a/server/internal/meetingspeaker/internal/meetingmodel/meetingmodel_gen.go b/server/internal/meetingspeaker/internal/meetingmodel/meetingmodel_gen.go new file mode 100644 index 00000000..f99e8a51 --- /dev/null +++ b/server/internal/meetingspeaker/internal/meetingmodel/meetingmodel_gen.go @@ -0,0 +1,123 @@ +// Code generated by goctl. DO NOT EDIT. +// versions: +// goctl version: 1.9.2 + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + "time" + + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" +) + +var ( + meetingFieldNames = builder.RawFieldNames(&Meeting{}) + meetingRows = strings.Join(meetingFieldNames, ",") + meetingRowsExpectAutoSet = strings.Join(stringx.Remove(meetingFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",") + meetingRowsWithPlaceHolder = strings.Join(stringx.Remove(meetingFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?" +) + +type ( + meetingModel interface { + Insert(ctx context.Context, data *Meeting) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*Meeting, error) + Update(ctx context.Context, data *Meeting) error + Delete(ctx context.Context, id int64) error + FindPage(ctx context.Context, page, pageSize int) ([]*Meeting, int64, error) + SoftDelete(ctx context.Context, id int64) error + } + + defaultMeetingModel struct { + conn sqlx.SqlConn + table string + } + + Meeting struct { + Id int64 `db:"id"` // 会议ID(主键) + Theme string `db:"theme"` // 会议主题 + Subtitle string `db:"subtitle"` // 会议副标题(允许为空) + Intro sql.NullString `db:"intro"` // 会议简介(支持长文本,可存Markdown) + CoverUrl string `db:"cover_url"` // 会议封面图片URL(允许为空) + ScheduleImageUrl string `db:"schedule_image_url"` // 会议日程图片URL(允许为空,无日程图时存空字符串) + StartTime time.Time `db:"start_time"` // 会议开始时间 + EndTime time.Time `db:"end_time"` // 会议结束时间 + CreateTime time.Time `db:"create_time"` // 创建时间 + UpdateTime time.Time `db:"update_time"` // 更新时间 + IsDelete int64 `db:"is_delete"` // 软删除(0-未删,1-已删) + } +) + +func newMeetingModel(conn sqlx.SqlConn) *defaultMeetingModel { + return &defaultMeetingModel{ + conn: conn, + table: "`meeting`", + } +} + +func (m *defaultMeetingModel) 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 *defaultMeetingModel) FindOne(ctx context.Context, id int64) (*Meeting, error) { + query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", meetingRows, m.table) + var resp Meeting + 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 *defaultMeetingModel) Insert(ctx context.Context, data *Meeting) (sql.Result, error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?)", m.table, meetingRowsExpectAutoSet) + ret, err := m.conn.ExecCtx(ctx, query, data.Theme, data.Subtitle, data.Intro, data.CoverUrl, data.ScheduleImageUrl, data.StartTime, data.EndTime, data.IsDelete) + return ret, err +} + +func (m *defaultMeetingModel) Update(ctx context.Context, data *Meeting) error { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, meetingRowsWithPlaceHolder) + _, err := m.conn.ExecCtx(ctx, query, data.Theme, data.Subtitle, data.Intro, data.CoverUrl, data.ScheduleImageUrl, data.StartTime, data.EndTime, data.IsDelete, data.Id) + return err +} + +func (m *defaultMeetingModel) FindPage(ctx context.Context, page, pageSize int) ([]*Meeting, int64, error) { + // 计算偏移量(分页公式:offset = (page-1) * pageSize) + offset := (page - 1) * pageSize + // 1. 查询当前页数据(过滤软删除,按创建时间倒序,最新的在前) + query := fmt.Sprintf("select %s from %s where is_delete = 0 order by create_time desc limit ?, ?", meetingRows, m.table) + var meetings []*Meeting + err := m.conn.QueryRowsCtx(ctx, &meetings, query, offset, pageSize) + if err != nil { + return nil, 0, err + } + // 2. 查询总条数(用于计算总页数) + countQuery := fmt.Sprintf("select count(1) from %s where is_delete = 0", m.table) + var total int64 + err = m.conn.QueryRowCtx(ctx, &total, countQuery) + if err != nil { + return nil, 0, err + } + return meetings, total, nil +} + +func (m *defaultMeetingModel) SoftDelete(ctx context.Context, id int64) error { + query := fmt.Sprintf("update %s set `is_delete` = 1 where `id` = ?", m.table) + _, err := m.conn.ExecCtx(ctx, query, id) + return err +} + +func (m *defaultMeetingModel) tableName() string { + return m.table +} diff --git a/server/internal/meetingspeaker/internal/model/meetingspeakermodel_gen.go b/server/internal/meetingspeaker/internal/model/meetingspeakermodel_gen.go index 935f5212..55ac3d72 100644 --- a/server/internal/meetingspeaker/internal/model/meetingspeakermodel_gen.go +++ b/server/internal/meetingspeaker/internal/model/meetingspeakermodel_gen.go @@ -28,6 +28,8 @@ type ( FindOne(ctx context.Context, id int64) (*MeetingSpeaker, error) Update(ctx context.Context, data *MeetingSpeaker) error Delete(ctx context.Context, id int64) error + SoftDelete(ctx context.Context, id int64) (int64, error) + ListByMeetingId(ctx context.Context, meetingId int64, page, pageSize int) ([]*MeetingSpeaker, int64, error) } defaultMeetingSpeakerModel struct { @@ -85,6 +87,50 @@ func (m *defaultMeetingSpeakerModel) Update(ctx context.Context, data *MeetingSp return err } +func (m *defaultMeetingSpeakerModel) SoftDelete(ctx context.Context, id int64) (int64, error) { + query := fmt.Sprintf(` + update %s + set is_delete=1 + where id=? and is_delete=0`, m.table) + result, err := m.conn.ExecCtx(ctx, query, id) + if err != nil { + return 0, err + } + return result.RowsAffected() // 返回受影响行数,判断是否删除成功 +} + +func (m *defaultMeetingSpeakerModel) ListByMeetingId(ctx context.Context, meetingId int64, page, pageSize int) ([]*MeetingSpeaker, int64, error) { + // 分页参数计算 + offset := (page - 1) * pageSize + if offset < 0 { + offset = 0 + } + + // 1. 查询当前页嘉宾数据(过滤软删除,按Sort升序,相同Sort按ID升序) + query := fmt.Sprintf(` + select %s from %s + where meeting_id = ? and is_delete = 0 + order by sort asc, id asc + limit ?, ?`, meetingSpeakerRows, m.table) + var speakers []*MeetingSpeaker + err := m.conn.QueryRowsCtx(ctx, &speakers, query, meetingId, offset, pageSize) + if err != nil { + return nil, 0, err + } + + // 2. 查询该会议下未删除的嘉宾总条数(用于分页计算) + countQuery := fmt.Sprintf(` + select count(1) from %s + where meeting_id = ? and is_delete = 0`, m.table) + var total int64 + err = m.conn.QueryRowCtx(ctx, &total, countQuery, meetingId) + if err != nil { + return nil, 0, err + } + + return speakers, total, nil +} + func (m *defaultMeetingSpeakerModel) tableName() string { return m.table }