后端: 1. 本地后端启动体系收口到 `backend/scripts`,移除 `cmd/all` 聚合入口,并将仓库根兼容启动语义收敛为 `StartAPI` 别名;新增 dev-up / dev-down / services-up / services-down / dev-status / dev-logs / service-restart 脚本,统一托管多服务进程、日志、PID 与基础设施启动。 2. 课表服务超时口径统一放宽到 5 分钟,覆盖 gateway / client / rpc server / config example,避免课表导入与图片识别在长耗时场景下被内层提前截断。 3. `today` 课表查询修正为读取真实当前日期,不再使用硬编码测试日期;同时剔除旧缓存与返回结果里的 `empty` 占位事件,后端只返回真实日程,空档改由前端时间轴自行补齐。 前端: 4. 首页路由切回改为复用 `DashboardView` 实例,补 `keep-alive`、`onActivated` 与双帧缩放重算,修复从侧栏返回首页时首帧布局放大与重复加载闪动问题。 5. 首页加载态与今日时间线口径收口:移除额外 800ms `pageLoading` 人为延迟,task / schedule 改为分开驱动;时间线忽略 `empty` 事件,并统一空档文案为“无课”。 6. 收敛助手页与首页若干进场/弹性动画,降低结果卡片、微调弹窗、思考区与面板切换时的抖动感。 仓库: 7. README 补充后端本地快速启动说明,`.gitignore` 忽略 `backend/.dev` 脚本运行态产物。
79 lines
2.2 KiB
Go
79 lines
2.2 KiB
Go
package rpc
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/LoveLosita/smartflow/backend/services/course/rpc/pb"
|
|
coursesv "github.com/LoveLosita/smartflow/backend/services/course/sv"
|
|
"github.com/zeromicro/go-zero/core/service"
|
|
"github.com/zeromicro/go-zero/zrpc"
|
|
"google.golang.org/grpc"
|
|
)
|
|
|
|
const (
|
|
defaultListenOn = "0.0.0.0:9087"
|
|
// 课表导入与图片识别都可能持续较久,服务端默认超时统一放宽到 5 分钟,避免 zrpc 提前取消上下文。
|
|
defaultTimeout = 5 * time.Minute
|
|
defaultMaxRPCMessageSize = 8 * 1024 * 1024
|
|
rpcMessageSizePadding = 1024 * 1024
|
|
)
|
|
|
|
type ServerOptions struct {
|
|
ListenOn string
|
|
Timeout time.Duration
|
|
MaxImageBytes int64
|
|
Service *coursesv.CourseService
|
|
}
|
|
|
|
// NewServer 创建 course zrpc 服务端。
|
|
//
|
|
// 职责边界:
|
|
// 1. 只负责 zrpc server 配置与 gRPC handler 注册;
|
|
// 2. 不创建数据库、模型客户端或业务服务,它们由 cmd/course 管理;
|
|
// 3. 图片解析走 bytes 请求,需按 maxImageBytes 抬高 gRPC 消息上限。
|
|
func NewServer(opts ServerOptions) (*zrpc.RpcServer, string, error) {
|
|
if opts.Service == nil {
|
|
return nil, "", errors.New("course service dependency not initialized")
|
|
}
|
|
|
|
listenOn := strings.TrimSpace(opts.ListenOn)
|
|
if listenOn == "" {
|
|
listenOn = defaultListenOn
|
|
}
|
|
timeout := opts.Timeout
|
|
if timeout <= 0 {
|
|
timeout = defaultTimeout
|
|
}
|
|
|
|
server, err := zrpc.NewServer(zrpc.RpcServerConf{
|
|
ServiceConf: service.ServiceConf{
|
|
Name: "course.rpc",
|
|
Mode: service.DevMode,
|
|
},
|
|
ListenOn: listenOn,
|
|
Timeout: int64(timeout / time.Millisecond),
|
|
}, func(grpcServer *grpc.Server) {
|
|
pb.RegisterCourseServer(grpcServer, NewHandler(opts.Service))
|
|
})
|
|
if err != nil {
|
|
return nil, "", err
|
|
}
|
|
|
|
maxMessageSize := normalizeMaxRPCMessageSize(opts.MaxImageBytes)
|
|
server.AddOptions(grpc.MaxRecvMsgSize(maxMessageSize), grpc.MaxSendMsgSize(maxMessageSize))
|
|
return server, listenOn, nil
|
|
}
|
|
|
|
func normalizeMaxRPCMessageSize(maxImageBytes int64) int {
|
|
if maxImageBytes <= 0 {
|
|
return defaultMaxRPCMessageSize
|
|
}
|
|
size := maxImageBytes + rpcMessageSizePadding
|
|
if size < defaultMaxRPCMessageSize {
|
|
return defaultMaxRPCMessageSize
|
|
}
|
|
return int(size)
|
|
}
|