作者 yangfu

app page

正在显示 36 个修改的文件 包含 2009 行增加2 行删除
  1 +package page
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/result"
  5 + "net/http"
  6 +
  7 + "github.com/zeromicro/go-zero/rest/httpx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/logic/page"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types"
  11 +)
  12 +
  13 +func CreateAppPageShareUrlHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.AppPageCreateShareRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := page.NewCreateAppPageShareUrlLogic(r.Context(), svcCtx)
  22 + resp, err := l.CreateAppPageShareUrl(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
  1 +package page
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/result"
  5 + "net/http"
  6 +
  7 + "github.com/zeromicro/go-zero/rest/httpx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/logic/page"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types"
  11 +)
  12 +
  13 +func DeleteAppPageHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.AppPageDeleteRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := page.NewDeleteAppPageLogic(r.Context(), svcCtx)
  22 + resp, err := l.DeleteAppPage(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
  1 +package page
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/result"
  5 + "net/http"
  6 +
  7 + "github.com/zeromicro/go-zero/rest/httpx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/logic/page"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types"
  11 +)
  12 +
  13 +func GetAppPageHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.AppPageGetRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := page.NewGetAppPageLogic(r.Context(), svcCtx)
  22 + resp, err := l.GetAppPage(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
  1 +package page
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/result"
  5 + "net/http"
  6 +
  7 + "github.com/zeromicro/go-zero/rest/httpx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/logic/page"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types"
  11 +)
  12 +
  13 +func GetAppPageShareDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.GetAppPageShareDetailRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := page.NewGetAppPageShareDetailLogic(r.Context(), svcCtx)
  22 + resp, err := l.GetAppPageShareDetail(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
  1 +package page
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/result"
  5 + "net/http"
  6 +
  7 + "github.com/zeromicro/go-zero/rest/httpx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/logic/page"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types"
  11 +)
  12 +
  13 +func SaveAppPageHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.AppPageSaveRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := page.NewSaveAppPageLogic(r.Context(), svcCtx)
  22 + resp, err := l.SaveAppPage(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
  1 +package page
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/result"
  5 + "net/http"
  6 +
  7 + "github.com/zeromicro/go-zero/rest/httpx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/logic/page"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types"
  11 +)
  12 +
  13 +func SaveAsAppPageHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.AppPageSaveAsRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := page.NewSaveAsAppPageLogic(r.Context(), svcCtx)
  22 + resp, err := l.SaveAsAppPage(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
  1 +package page
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/result"
  5 + "net/http"
  6 +
  7 + "github.com/zeromicro/go-zero/rest/httpx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/logic/page"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types"
  11 +)
  12 +
  13 +func SearchAppPageHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.AppPageSearchRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := page.NewSearchAppPageLogic(r.Context(), svcCtx)
  22 + resp, err := l.SearchAppPage(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
  1 +package page
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/result"
  5 + "net/http"
  6 +
  7 + "github.com/zeromicro/go-zero/rest/httpx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/logic/page"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types"
  11 +)
  12 +
  13 +func UpdateAppPageHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.AppPageUpdateRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := page.NewUpdateAppPageLogic(r.Context(), svcCtx)
  22 + resp, err := l.UpdateAppPage(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
@@ -5,6 +5,7 @@ import ( @@ -5,6 +5,7 @@ import (
5 "net/http" 5 "net/http"
6 6
7 chart "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/handler/chart" 7 chart "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/handler/chart"
  8 + page "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/handler/page"
8 table "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/handler/table" 9 table "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/handler/table"
9 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc" 10 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"
10 11
@@ -107,4 +108,57 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { @@ -107,4 +108,57 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
107 rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), 108 rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret),
108 rest.WithPrefix("/v1"), 109 rest.WithPrefix("/v1"),
109 ) 110 )
  111 +
  112 + server.AddRoutes(
  113 + []rest.Route{
  114 + {
  115 + Method: http.MethodGet,
  116 + Path: "/app-page/:id",
  117 + Handler: page.GetAppPageHandler(serverCtx),
  118 + },
  119 + {
  120 + Method: http.MethodPost,
  121 + Path: "/app-page",
  122 + Handler: page.SaveAppPageHandler(serverCtx),
  123 + },
  124 + {
  125 + Method: http.MethodPost,
  126 + Path: "/app-page/saveas",
  127 + Handler: page.SaveAsAppPageHandler(serverCtx),
  128 + },
  129 + {
  130 + Method: http.MethodDelete,
  131 + Path: "/app-page/:id",
  132 + Handler: page.DeleteAppPageHandler(serverCtx),
  133 + },
  134 + {
  135 + Method: http.MethodPut,
  136 + Path: "/app-page/:id",
  137 + Handler: page.UpdateAppPageHandler(serverCtx),
  138 + },
  139 + {
  140 + Method: http.MethodPost,
  141 + Path: "/app-page/search",
  142 + Handler: page.SearchAppPageHandler(serverCtx),
  143 + },
  144 + {
  145 + Method: http.MethodPost,
  146 + Path: "/app-page/create-share",
  147 + Handler: page.CreateAppPageShareUrlHandler(serverCtx),
  148 + },
  149 + },
  150 + rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret),
  151 + rest.WithPrefix("/v1"),
  152 + )
  153 +
  154 + server.AddRoutes(
  155 + []rest.Route{
  156 + {
  157 + Method: http.MethodGet,
  158 + Path: "/api/app-page/get-share-detail/:key",
  159 + Handler: page.GetAppPageShareDetailHandler(serverCtx),
  160 + },
  161 + },
  162 + rest.WithPrefix("/v1"),
  163 + )
110 } 164 }
  1 +package page
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/db/transaction"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/tool"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/xerr"
  9 +
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types"
  12 +
  13 + "github.com/zeromicro/go-zero/core/logx"
  14 +)
  15 +
  16 +type CreateAppPageShareUrlLogic struct {
  17 + logx.Logger
  18 + ctx context.Context
  19 + svcCtx *svc.ServiceContext
  20 +}
  21 +
  22 +func NewCreateAppPageShareUrlLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateAppPageShareUrlLogic {
  23 + return &CreateAppPageShareUrlLogic{
  24 + Logger: logx.WithContext(ctx),
  25 + ctx: ctx,
  26 + svcCtx: svcCtx,
  27 + }
  28 +}
  29 +
  30 +func (l *CreateAppPageShareUrlLogic) CreateAppPageShareUrl(req *types.AppPageCreateShareRequest) (resp *types.AppPageCreateShareResponse, err error) {
  31 + var (
  32 + conn = l.svcCtx.DefaultDBConn()
  33 + appPage *domain.AppPage
  34 + )
  35 + if appPage, err = l.svcCtx.AppPageRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  36 + return nil, xerr.NewErr(err)
  37 + }
  38 + resp = &types.AppPageCreateShareResponse{}
  39 + if appPage.Key != "" {
  40 + return
  41 + }
  42 +
  43 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  44 + appPage.Key = tool.Krand(18, tool.KC_RAND_KIND_ALL)
  45 + if appPage, err = l.svcCtx.AppPageRepository.UpdateWithVersion(l.ctx, conn, appPage); err != nil {
  46 + return err
  47 + }
  48 + return nil
  49 + }, true); err != nil {
  50 + return nil, xerr.NewErrMsgErr("创建页面分享链接失败", err)
  51 + }
  52 +
  53 + resp = &types.AppPageCreateShareResponse{
  54 + Key: appPage.Key,
  55 + }
  56 + return
  57 +}
  1 +package page
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/db/transaction"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/xerr"
  8 +
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types"
  11 +
  12 + "github.com/zeromicro/go-zero/core/logx"
  13 +)
  14 +
  15 +type DeleteAppPageLogic struct {
  16 + logx.Logger
  17 + ctx context.Context
  18 + svcCtx *svc.ServiceContext
  19 +}
  20 +
  21 +func NewDeleteAppPageLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeleteAppPageLogic {
  22 + return &DeleteAppPageLogic{
  23 + Logger: logx.WithContext(ctx),
  24 + ctx: ctx,
  25 + svcCtx: svcCtx,
  26 + }
  27 +}
  28 +
  29 +func (l *DeleteAppPageLogic) DeleteAppPage(req *types.AppPageDeleteRequest) (resp *types.AppPageDeleteResponse, err error) {
  30 + var (
  31 + conn = l.svcCtx.DefaultDBConn()
  32 + appPage *domain.AppPage
  33 + )
  34 + if appPage, err = l.svcCtx.AppPageRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  35 + return nil, xerr.NewErr(err)
  36 + }
  37 + resp = &types.AppPageDeleteResponse{}
  38 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  39 + if appPage, err = l.svcCtx.AppPageRepository.Delete(l.ctx, conn, appPage); err != nil {
  40 + return err
  41 + }
  42 + return nil
  43 + }, true); err != nil {
  44 + return nil, xerr.NewErrMsgErr("删除页面失败", err)
  45 + }
  46 +
  47 + return
  48 +}
  1 +package page
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/contextdata"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/xerr"
  8 +
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types"
  11 +
  12 + "github.com/zeromicro/go-zero/core/logx"
  13 +)
  14 +
  15 +type GetAppPageLogic struct {
  16 + logx.Logger
  17 + ctx context.Context
  18 + svcCtx *svc.ServiceContext
  19 +}
  20 +
  21 +func NewGetAppPageLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAppPageLogic {
  22 + return &GetAppPageLogic{
  23 + Logger: logx.WithContext(ctx),
  24 + ctx: ctx,
  25 + svcCtx: svcCtx,
  26 + }
  27 +}
  28 +
  29 +func (l *GetAppPageLogic) GetAppPage(req *types.AppPageGetRequest) (resp *types.AppPageGetResponse, err error) {
  30 + var (
  31 + conn = l.svcCtx.DefaultDBConn()
  32 + appPage *domain.AppPage
  33 + charts []*domain.Chart
  34 + tenantId = contextdata.GetTenantFromCtx(l.ctx)
  35 + )
  36 + if appPage, err = l.svcCtx.AppPageRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  37 + return nil, xerr.NewErr(err)
  38 + }
  39 + queryOptions := domain.IndexTenantId(tenantId)().WithKV("ids", appPage.Charts)
  40 + if _, charts, err = l.svcCtx.ChartRepository.Find(l.ctx, conn, queryOptions); err != nil {
  41 + return nil, xerr.NewErr(err)
  42 + }
  43 + resp = &types.AppPageGetResponse{
  44 + AppPage: types.NewAppPageItem(appPage, charts),
  45 + }
  46 + return
  47 +}
  1 +package page
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/contextdata"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/xerr"
  8 +
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types"
  11 +
  12 + "github.com/zeromicro/go-zero/core/logx"
  13 +)
  14 +
  15 +type GetAppPageShareDetailLogic struct {
  16 + logx.Logger
  17 + ctx context.Context
  18 + svcCtx *svc.ServiceContext
  19 +}
  20 +
  21 +func NewGetAppPageShareDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAppPageShareDetailLogic {
  22 + return &GetAppPageShareDetailLogic{
  23 + Logger: logx.WithContext(ctx),
  24 + ctx: ctx,
  25 + svcCtx: svcCtx,
  26 + }
  27 +}
  28 +
  29 +func (l *GetAppPageShareDetailLogic) GetAppPageShareDetail(req *types.GetAppPageShareDetailRequest) (resp *types.GetAppPageShareDetailResponse, err error) {
  30 + var (
  31 + conn = l.svcCtx.DefaultDBConn()
  32 + appPage *domain.AppPage
  33 + charts []*domain.Chart
  34 + tenantId = contextdata.GetTenantFromCtx(l.ctx)
  35 + )
  36 + if appPage, err = l.svcCtx.AppPageRepository.FindOneByKey(l.ctx, conn, req.Key); err != nil {
  37 + return nil, xerr.NewErr(err)
  38 + }
  39 + queryOptions := domain.IndexTenantId(tenantId)().WithKV("ids", appPage.Charts)
  40 + if _, charts, err = l.svcCtx.ChartRepository.Find(l.ctx, conn, queryOptions); err != nil {
  41 + return nil, xerr.NewErr(err)
  42 + }
  43 + resp = &types.GetAppPageShareDetailResponse{
  44 + AppPage: types.NewAppPageItem(appPage, charts),
  45 + }
  46 + return
  47 +}
  1 +package page
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/db/transaction"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/contextdata"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/xerr"
  9 +
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types"
  12 +
  13 + "github.com/zeromicro/go-zero/core/logx"
  14 +)
  15 +
  16 +type SaveAppPageLogic struct {
  17 + logx.Logger
  18 + ctx context.Context
  19 + svcCtx *svc.ServiceContext
  20 +}
  21 +
  22 +func NewSaveAppPageLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SaveAppPageLogic {
  23 + return &SaveAppPageLogic{
  24 + Logger: logx.WithContext(ctx),
  25 + ctx: ctx,
  26 + svcCtx: svcCtx,
  27 + }
  28 +}
  29 +
  30 +func (l *SaveAppPageLogic) SaveAppPage(req *types.AppPageSaveRequest) (resp *types.AppPageSaveResponse, err error) {
  31 + var (
  32 + //conn = l.svcCtx.DefaultDBConn()
  33 + appPage *domain.AppPage
  34 + tenantId = contextdata.GetTenantFromCtx(l.ctx)
  35 + )
  36 + appPage = &domain.AppPage{
  37 + Name: req.Name,
  38 + Charts: req.Charts,
  39 + TenantId: tenantId,
  40 + }
  41 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  42 + if appPage, err = l.svcCtx.AppPageRepository.Insert(l.ctx, conn, appPage); err != nil {
  43 + return err
  44 + }
  45 + return nil
  46 + }, true); err != nil {
  47 + return nil, xerr.NewErrMsgErr("创建页面失败", err)
  48 + }
  49 + resp = &types.AppPageSaveResponse{
  50 + Id: appPage.Id,
  51 + }
  52 + return
  53 +}
  1 +package page
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/db/transaction"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/contextdata"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/xerr"
  9 +
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types"
  12 +
  13 + "github.com/zeromicro/go-zero/core/logx"
  14 +)
  15 +
  16 +type SaveAsAppPageLogic struct {
  17 + logx.Logger
  18 + ctx context.Context
  19 + svcCtx *svc.ServiceContext
  20 +}
  21 +
  22 +func NewSaveAsAppPageLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SaveAsAppPageLogic {
  23 + return &SaveAsAppPageLogic{
  24 + Logger: logx.WithContext(ctx),
  25 + ctx: ctx,
  26 + svcCtx: svcCtx,
  27 + }
  28 +}
  29 +
  30 +func (l *SaveAsAppPageLogic) SaveAsAppPage(req *types.AppPageSaveAsRequest) (resp *types.AppPageSaveAsResponse, err error) {
  31 + var (
  32 + conn = l.svcCtx.DefaultDBConn()
  33 + appPage *domain.AppPage
  34 + tenantId = contextdata.GetTenantFromCtx(l.ctx)
  35 + fromAppPage *domain.AppPage
  36 + )
  37 + if fromAppPage, err = l.svcCtx.AppPageRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  38 + return nil, xerr.NewErr(err)
  39 + }
  40 + appPage = &domain.AppPage{
  41 + Name: req.Name,
  42 + Charts: fromAppPage.Charts,
  43 + TenantId: tenantId,
  44 + }
  45 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  46 + if appPage, err = l.svcCtx.AppPageRepository.Insert(l.ctx, conn, appPage); err != nil {
  47 + return err
  48 + }
  49 + return nil
  50 + }, true); err != nil {
  51 + return nil, xerr.NewErrMsgErr("创建页面失败", err)
  52 + }
  53 + resp = &types.AppPageSaveAsResponse{
  54 + Id: appPage.Id,
  55 + }
  56 + return
  57 +}
  1 +package page
  2 +
  3 +import (
  4 + "context"
  5 + "github.com/samber/lo"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/contextdata"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/xerr"
  9 +
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types"
  12 +
  13 + "github.com/zeromicro/go-zero/core/logx"
  14 +)
  15 +
  16 +type SearchAppPageLogic struct {
  17 + logx.Logger
  18 + ctx context.Context
  19 + svcCtx *svc.ServiceContext
  20 +}
  21 +
  22 +func NewSearchAppPageLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SearchAppPageLogic {
  23 + return &SearchAppPageLogic{
  24 + Logger: logx.WithContext(ctx),
  25 + ctx: ctx,
  26 + svcCtx: svcCtx,
  27 + }
  28 +}
  29 +
  30 +func (l *SearchAppPageLogic) SearchAppPage(req *types.AppPageSearchRequest) (resp *types.AppPageSearchResponse, err error) {
  31 + var (
  32 + conn = l.svcCtx.DefaultDBConn()
  33 + appPages []*domain.AppPage
  34 + charts []*domain.Chart
  35 + tenantId = contextdata.GetTenantFromCtx(l.ctx)
  36 + total int64
  37 + chartIds []int64
  38 + )
  39 + if total, appPages, err = l.svcCtx.AppPageRepository.Find(l.ctx, conn, domain.IndexTenantId(tenantId)().WithOffsetLimit(req.Page, req.Size)); err != nil {
  40 + return nil, xerr.NewErr(err)
  41 + }
  42 + lo.ForEach(appPages, func(item *domain.AppPage, index int) {
  43 + chartIds = append(chartIds, item.Charts...)
  44 + })
  45 +
  46 + queryOptions := domain.IndexTenantId(tenantId)().WithKV("ids", chartIds)
  47 + if _, charts, err = l.svcCtx.ChartRepository.Find(l.ctx, conn, queryOptions); err != nil {
  48 + return nil, xerr.NewErr(err)
  49 + }
  50 + resp = &types.AppPageSearchResponse{
  51 + Total: total,
  52 + }
  53 + for _, page := range appPages {
  54 + resp.List = append(resp.List, types.NewAppPageItem(page, charts))
  55 + }
  56 + return
  57 +}
  1 +package page
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/db/transaction"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/xerr"
  8 +
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types"
  11 +
  12 + "github.com/zeromicro/go-zero/core/logx"
  13 +)
  14 +
  15 +type UpdateAppPageLogic struct {
  16 + logx.Logger
  17 + ctx context.Context
  18 + svcCtx *svc.ServiceContext
  19 +}
  20 +
  21 +func NewUpdateAppPageLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UpdateAppPageLogic {
  22 + return &UpdateAppPageLogic{
  23 + Logger: logx.WithContext(ctx),
  24 + ctx: ctx,
  25 + svcCtx: svcCtx,
  26 + }
  27 +}
  28 +
  29 +func (l *UpdateAppPageLogic) UpdateAppPage(req *types.AppPageUpdateRequest) (resp *types.AppPageUpdateResponse, err error) {
  30 + var (
  31 + conn = l.svcCtx.DefaultDBConn()
  32 + appPage *domain.AppPage
  33 + )
  34 + if appPage, err = l.svcCtx.AppPageRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  35 + return nil, xerr.NewErr(err)
  36 + }
  37 + resp = &types.AppPageUpdateResponse{}
  38 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  39 + appPage.Name = req.Name
  40 + appPage.Charts = req.Charts
  41 + if appPage, err = l.svcCtx.AppPageRepository.UpdateWithVersion(l.ctx, conn, appPage); err != nil {
  42 + return err
  43 + }
  44 + return nil
  45 + }, true); err != nil {
  46 + return nil, xerr.NewErrMsgErr("更新页面失败", err)
  47 + }
  48 + return
  49 +}
@@ -21,6 +21,7 @@ type ServiceContext struct { @@ -21,6 +21,7 @@ type ServiceContext struct {
21 RedisCache gzcache.GZCache 21 RedisCache gzcache.GZCache
22 ChartRepository domain.ChartRepository 22 ChartRepository domain.ChartRepository
23 ChartSettingRepository domain.ChartSettingRepository 23 ChartSettingRepository domain.ChartSettingRepository
  24 + AppPageRepository domain.AppPageRepository
24 25
25 ByteMetadataService bytelib.ByteMetadataService 26 ByteMetadataService bytelib.ByteMetadataService
26 } 27 }
@@ -38,6 +39,7 @@ func NewServiceContext(c config.Config) *ServiceContext { @@ -38,6 +39,7 @@ func NewServiceContext(c config.Config) *ServiceContext {
38 Redis: redis, 39 Redis: redis,
39 ChartRepository: repository.NewChartRepository(cache.NewCachedRepository(mlCache)), 40 ChartRepository: repository.NewChartRepository(cache.NewCachedRepository(mlCache)),
40 ChartSettingRepository: repository.NewChartSettingRepository(cache.NewCachedRepository(mlCache)), 41 ChartSettingRepository: repository.NewChartSettingRepository(cache.NewCachedRepository(mlCache)),
  42 + AppPageRepository: repository.NewAppPageRepository(cache.NewCachedRepository(mlCache)),
41 43
42 ByteMetadataService: bytelib.ByteMetadataService{ 44 ByteMetadataService: bytelib.ByteMetadataService{
43 Service: gateway.NewService(c.ByteMetadata.Name, c.ByteMetadata.Host, c.ByteMetadata.Timeout), 45 Service: gateway.NewService(c.ByteMetadata.Name, c.ByteMetadata.Host, c.ByteMetadata.Timeout),
@@ -2,6 +2,7 @@ package types @@ -2,6 +2,7 @@ package types
2 2
3 import ( 3 import (
4 "github.com/jinzhu/copier" 4 "github.com/jinzhu/copier"
  5 + "github.com/samber/lo"
5 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain" 6 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain"
6 ) 7 )
7 8
@@ -32,3 +33,23 @@ func NewPropertyItem(property domain.ChartProperty) ChartProperty { @@ -32,3 +33,23 @@ func NewPropertyItem(property domain.ChartProperty) ChartProperty {
32 copier.Copy(&chartProperty, property) 33 copier.Copy(&chartProperty, property)
33 return chartProperty 34 return chartProperty
34 } 35 }
  36 +
  37 +func NewAppPageItem(appPage *domain.AppPage, charts []*domain.Chart) AppPageItem {
  38 + chartsMap := lo.SliceToMap(charts, func(item *domain.Chart) (int64, *domain.Chart) {
  39 + return item.Id, item
  40 + })
  41 + item := AppPageItem{
  42 + Id: appPage.Id,
  43 + Name: appPage.Name,
  44 + }
  45 + for _, id := range appPage.Charts {
  46 + if v, ok := chartsMap[id]; ok {
  47 + item.Charts = append(item.Charts, AppPageChartItem{
  48 + ChartId: v.Id,
  49 + Name: v.Name,
  50 + Cover: v.Cover,
  51 + })
  52 + }
  53 + }
  54 + return item
  55 +}
@@ -110,6 +110,20 @@ type ChartProperty struct { @@ -110,6 +110,20 @@ type ChartProperty struct {
110 TableAbility TableAbility `json:"table,optional"` // 表筛选功能 110 TableAbility TableAbility `json:"table,optional"` // 表筛选功能
111 Series []Series `json:"series,optional"` // 系列(数据源) 111 Series []Series `json:"series,optional"` // 系列(数据源)
112 Cover string `json:"cover,optional"` // 封面 112 Cover string `json:"cover,optional"` // 封面
  113 + Other Other `json:"other,optional"` // 其他额外配置
  114 +}
  115 +
  116 +type Other struct {
  117 + Quarter *Quarter `json:"quarter,optional,omitempty"` // 四分图
  118 +}
  119 +
  120 +type Quarter struct {
  121 + XAxisLabel string `json:"xAxisLabel"` // x轴标签名
  122 + XAxisLabelList []string `json:"xAxisLabelList"` // 标签名
  123 + YAxisLabel string `json:"yAxisLabel"` // x轴标签名
  124 + YAxisLabelList []string `json:"yAxisLabelList"` // 标签名
  125 + Area string `json:"area"` // 图形面积
  126 + SeriesList string `json:"seriesList"` // 图形系列
113 } 127 }
114 128
115 type Title struct { 129 type Title struct {
@@ -121,6 +135,7 @@ type Title struct { @@ -121,6 +135,7 @@ type Title struct {
121 ExplainType string `json:"explainType,optional,options=[text,file]"` // text file 135 ExplainType string `json:"explainType,optional,options=[text,file]"` // text file
122 ExplainTxt string `json:"explainTxt,optional"` // 文字说明 136 ExplainTxt string `json:"explainTxt,optional"` // 文字说明
123 FileUrl string `json:"fileUrl,optional"` // 组件图片/视频 137 FileUrl string `json:"fileUrl,optional"` // 组件图片/视频
  138 + Align string `json:"align,optional"` // 文本对齐方式 left center right
124 } 139 }
125 140
126 type TableAbility struct { 141 type TableAbility struct {
@@ -134,6 +149,9 @@ type Series struct { @@ -134,6 +149,9 @@ type Series struct {
134 DataSourceId int64 `json:"dataSourceId,optional,omitempty"` // 数据源ID(from值为ByteBank时有值) 149 DataSourceId int64 `json:"dataSourceId,optional,omitempty"` // 数据源ID(from值为ByteBank时有值)
135 CustomText string `json:"customText,optional,omitempty"` // 自定义数据文本(from值为User时有值) 150 CustomText string `json:"customText,optional,omitempty"` // 自定义数据文本(from值为User时有值)
136 MatchExpressions []Expression `json:"matchExpressions,optional,omitempty"` // 条件匹配表达式(总体指标) 151 MatchExpressions []Expression `json:"matchExpressions,optional,omitempty"` // 条件匹配表达式(总体指标)
  152 + TargetText string `json:"targetText,optional,omitempty"` // 指标名文本
  153 + TargetNum string `json:"targetNum,optional,omitempty"` // 指标数值
  154 + TargetUnit string `json:"targetUnit,optional,omitempty"` // 指标单位
137 } 155 }
138 156
139 type Expression struct { 157 type Expression struct {
@@ -193,3 +211,85 @@ type SearchTableDataRequest struct { @@ -193,3 +211,85 @@ type SearchTableDataRequest struct {
193 211
194 type SearchTableDataResponse struct { 212 type SearchTableDataResponse struct {
195 } 213 }
  214 +
  215 +type AppPageGetRequest struct {
  216 + Id int64 `path:"id"`
  217 +}
  218 +
  219 +type AppPageGetResponse struct {
  220 + AppPage AppPageItem `json:"page"`
  221 +}
  222 +
  223 +type AppPageSaveRequest struct {
  224 + Name string `json:"name"` // 名称
  225 + Charts []int64 `json:"charts"` // 图表
  226 +}
  227 +
  228 +type AppPageSaveResponse struct {
  229 + Id int64 `json:"id"`
  230 +}
  231 +
  232 +type AppPageSaveAsRequest struct {
  233 + Id int64 `json:"id"` // 页面ID
  234 + Name string `json:"name"` // 名称
  235 +}
  236 +
  237 +type AppPageSaveAsResponse struct {
  238 + Id int64 `path:"id"`
  239 + Name string `json:"name"` // 名称
  240 + Charts []int64 `json:"charts"` // 图表
  241 +}
  242 +
  243 +type AppPageCreateShareRequest struct {
  244 + Id int64 `json:"id"` // 页面ID
  245 +}
  246 +
  247 +type AppPageCreateShareResponse struct {
  248 + Key string `json:"key,optional"` // 分享,预览时绑定映射到Id
  249 +}
  250 +
  251 +type AppPageDeleteRequest struct {
  252 + Id int64 `path:"id"` // 页面ID
  253 +}
  254 +
  255 +type AppPageDeleteResponse struct {
  256 +}
  257 +
  258 +type AppPageUpdateRequest struct {
  259 + Id int64 `path:"id"`
  260 + Name string `json:"name"` // 名称
  261 + Charts []int64 `json:"charts"` // 图表
  262 +}
  263 +
  264 +type AppPageUpdateResponse struct {
  265 +}
  266 +
  267 +type AppPageSearchRequest struct {
  268 + Page int `json:"page"`
  269 + Size int `json:"size"`
  270 +}
  271 +
  272 +type AppPageSearchResponse struct {
  273 + List []AppPageItem `json:"list"`
  274 + Total int64 `json:"total"`
  275 +}
  276 +
  277 +type AppPageItem struct {
  278 + Id int64 `json:"id,optional"` // 唯一标识
  279 + Name string `json:"name,optional"` // 名称
  280 + Charts []AppPageChartItem `json:"charts,optional"` // 图表
  281 +}
  282 +
  283 +type AppPageChartItem struct {
  284 + ChartId int64 `json:"chartId"` // 图表ID
  285 + Name string `json:"name"` // 图表名称
  286 + Cover string `json:"cover"` // 图表封面
  287 +}
  288 +
  289 +type GetAppPageShareDetailRequest struct {
  290 + Key string `path:"key"`
  291 +}
  292 +
  293 +type GetAppPageShareDetailResponse struct {
  294 + AppPage AppPageItem `json:"page"`
  295 +}
  1 +
  2 +syntax = "v1"
  3 +
  4 +info(
  5 + title: "xx实例"
  6 + desc: "xx实例"
  7 + author: "author"
  8 + email: "email"
  9 + version: "v1"
  10 +)
  11 +
  12 +@server(
  13 + prefix: app_page/v1
  14 + group: app_page
  15 + jwt: JwtAuth
  16 +)
  17 +service Core {
  18 + @handler getAppPage
  19 + post /app_page/:id (AppPageGetRequest) returns (AppPageGetResponse)
  20 + @handler saveAppPage
  21 + post /app_page (AppPageSaveRequest) returns (AppPageSaveResponse)
  22 + @handler deleteAppPage
  23 + delete /app_page/:id (AppPageDeleteRequest) returns (AppPageDeleteResponse)
  24 + @handler updateAppPage
  25 + put /app_page/:id (AppPageUpdateRequest) returns (AppPageUpdateResponse)
  26 + @handler searchAppPage
  27 + post /app_page/search (AppPageSearchRequest) returns (AppPageSearchResponse)
  28 +}
  29 +
  30 +type (
  31 + AppPageGetRequest {
  32 + Id int64 `path:"id"`
  33 + }
  34 + AppPageGetResponse struct{
  35 + AppPage AppPageItem `json:"app_page"`
  36 + }
  37 +
  38 + AppPageSaveRequest struct{
  39 + AppPage AppPageItem `json:"app_page"`
  40 + }
  41 + AppPageSaveResponse struct{}
  42 +
  43 + AppPageDeleteRequest struct{
  44 + Id int64 `path:"id"`
  45 + }
  46 + AppPageDeleteResponse struct{}
  47 +
  48 + AppPageUpdateRequest struct{
  49 + Id int64 `path:"id"`
  50 + AppPage AppPageItem `json:"app_page"`
  51 + }
  52 + AppPageUpdateResponse struct{}
  53 +
  54 + AppPageSearchRequest struct{
  55 + Page int `json:"page"`
  56 + Size int `json:"size"`
  57 + }
  58 + AppPageSearchResponse{
  59 + List []AppPageItem `json:"list"`
  60 + Total int64 `json:"total"`
  61 + }
  62 + AppPageItem struct{
  63 +
  64 + }
  65 +)
  1 +
  2 +syntax = "proto3";
  3 +
  4 +option go_package ="./pb";
  5 +
  6 +package pb;
  7 +
  8 +message AppPageGetReq {
  9 + int64 Id = 1;
  10 +}
  11 +message AppPageGetResp{
  12 + AppPageItem User = 1;
  13 +}
  14 +
  15 +message AppPageSaveReq {
  16 +
  17 +}
  18 +message AppPageSaveResp{
  19 +
  20 +}
  21 +
  22 +message AppPageDeleteReq {
  23 + int64 Id = 1;
  24 +}
  25 +message AppPageDeleteResp{
  26 +
  27 +}
  28 +
  29 +message AppPageUpdateReq {
  30 + int64 Id = 1;
  31 +}
  32 +message AppPageUpdateResp{
  33 +
  34 +}
  35 +
  36 +message AppPageSearchReq {
  37 + int64 PageNumber = 1;
  38 + int64 PageSize = 2;
  39 +}
  40 +message AppPageSearchResp{
  41 + repeated AppPageItem List =1;
  42 + int64 Total =2;
  43 +}
  44 +message AppPageItem {
  45 +
  46 +}
  47 +
  48 +service AppPageService {
  49 + rpc AppPageGet(AppPageGetReq) returns(AppPageGetResp);
  50 + rpc AppPageSave(AppPageSaveReq) returns(AppPageSaveResp);
  51 + rpc AppPageDelete(AppPageDeleteReq) returns(AppPageDeleteResp);
  52 + rpc AppPageUpdate(AppPageUpdateReq) returns(AppPageUpdateResp);
  53 + rpc AppPageSearch(AppPageSearchReq) returns(AppPageSearchResp);
  54 +}
@@ -9,5 +9,6 @@ func Migrate(db *gorm.DB) { @@ -9,5 +9,6 @@ func Migrate(db *gorm.DB) {
9 db.AutoMigrate( 9 db.AutoMigrate(
10 &models.Chart{}, 10 &models.Chart{},
11 &models.ChartSetting{}, 11 &models.ChartSetting{},
  12 + &models.AppPage{},
12 ) 13 )
13 } 14 }
  1 +package models
  2 +
  3 +import (
  4 + "fmt"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain"
  6 + "gorm.io/gorm"
  7 + "gorm.io/plugin/soft_delete"
  8 +)
  9 +
  10 +type AppPage struct {
  11 + Id int64 // 唯一标识
  12 + Name string // 名称
  13 + Charts []int64 `gorm:"serializer:json"` // 图表
  14 + Key string // 分享,预览时绑定映射到Id
  15 +
  16 + TenantId int64 // 租户ID
  17 + CreatedAt int64 `json:",omitempty"`
  18 + UpdatedAt int64 `json:",omitempty"`
  19 + DeletedAt int64 `json:",omitempty"`
  20 + Version int `json:",omitempty"`
  21 + IsDel soft_delete.DeletedAt `gorm:"softDelete:flag,DeletedAtField:DeletedAt"`
  22 +}
  23 +
  24 +func (m *AppPage) TableName() string {
  25 + return "app_page"
  26 +}
  27 +
  28 +func (m *AppPage) BeforeCreate(tx *gorm.DB) (err error) {
  29 + // m.CreatedAt = time.Now().Unix()
  30 + // m.UpdatedAt = time.Now().Unix()
  31 + return
  32 +}
  33 +
  34 +func (m *AppPage) BeforeUpdate(tx *gorm.DB) (err error) {
  35 + // m.UpdatedAt = time.Now().Unix()
  36 + return
  37 +}
  38 +
  39 +func (m *AppPage) CacheKeyFunc() string {
  40 + if m.Id == 0 {
  41 + return ""
  42 + }
  43 + return fmt.Sprintf("%v:cache:%v:id:%v", domain.ProjectName, m.TableName(), m.Id)
  44 +}
  45 +
  46 +func (m *AppPage) CacheKeyFuncByObject(obj interface{}) string {
  47 + if v, ok := obj.(*AppPage); ok {
  48 + return v.CacheKeyFunc()
  49 + }
  50 + return ""
  51 +}
  52 +
  53 +func (m *AppPage) CachePrimaryKeyFunc() string {
  54 + if len(m.Key) == 0 {
  55 + return ""
  56 + }
  57 + return fmt.Sprintf("%v:cache:%v:primarykey:%v", domain.ProjectName, m.TableName(), m.Key)
  58 +}
@@ -15,6 +15,7 @@ type Chart struct { @@ -15,6 +15,7 @@ type Chart struct {
15 Sort int `gorm:"index:idx_chart_t_pid_sort"` // 排序 15 Sort int `gorm:"index:idx_chart_t_pid_sort"` // 排序
16 Name string // 名称 16 Name string // 名称
17 Group string `gorm:"index:idx_chart_group"` // 分组 17 Group string `gorm:"index:idx_chart_group"` // 分组
  18 + Cover string // 封面
18 ChartType string 19 ChartType string
19 20
20 TenantId int64 `gorm:"index:idx_chart_t_pid_sort"` // 租户ID 21 TenantId int64 `gorm:"index:idx_chart_t_pid_sort"` // 租户ID
@@ -17,6 +17,7 @@ type ChartSetting struct { @@ -17,6 +17,7 @@ type ChartSetting struct {
17 Title domain.Title `gorm:"serializer:json"` 17 Title domain.Title `gorm:"serializer:json"`
18 TableAbility domain.TableAbility `gorm:"serializer:json"` // 表格能力 18 TableAbility domain.TableAbility `gorm:"serializer:json"` // 表格能力
19 Series []domain.Series `gorm:"serializer:json"` // 系列值-数据绑定 19 Series []domain.Series `gorm:"serializer:json"` // 系列值-数据绑定
  20 + Other domain.Other `gorm:"serializer:json"`
20 21
21 TenantId int64 `gorm:"index:idx_chart_setting_t_id"` // 租户ID 22 TenantId int64 `gorm:"index:idx_chart_setting_t_id"` // 租户ID
22 CreatedAt int64 `json:",omitempty"` 23 CreatedAt int64 `json:",omitempty"`
  1 +package repository
  2 +
  3 +import (
  4 + "context"
  5 + "github.com/jinzhu/copier"
  6 + "github.com/pkg/errors"
  7 + "github.com/tiptok/gocomm/pkg/cache"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/db/models"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/db/transaction"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain"
  11 + "gorm.io/gorm"
  12 +)
  13 +
  14 +type AppPageRepository struct {
  15 + *cache.CachedRepository
  16 +}
  17 +
  18 +func (repository *AppPageRepository) Insert(ctx context.Context, conn transaction.Conn, dm *domain.AppPage) (*domain.AppPage, error) {
  19 + var (
  20 + err error
  21 + m = &models.AppPage{}
  22 + tx = conn.DB()
  23 + )
  24 + if m, err = repository.DomainModelToModel(dm); err != nil {
  25 + return nil, err
  26 + }
  27 + if tx = tx.Model(m).Save(m); tx.Error != nil {
  28 + return nil, tx.Error
  29 + }
  30 + dm.Id = m.Id
  31 + return repository.ModelToDomainModel(m)
  32 +
  33 +}
  34 +
  35 +func (repository *AppPageRepository) Update(ctx context.Context, conn transaction.Conn, dm *domain.AppPage) (*domain.AppPage, error) {
  36 + var (
  37 + err error
  38 + m *models.AppPage
  39 + tx = conn.DB()
  40 + )
  41 + if m, err = repository.DomainModelToModel(dm); err != nil {
  42 + return nil, err
  43 + }
  44 + queryFunc := func() (interface{}, error) {
  45 + tx = tx.Model(m).Updates(m)
  46 + return nil, tx.Error
  47 + }
  48 + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
  49 + return nil, err
  50 + }
  51 + return repository.ModelToDomainModel(m)
  52 +}
  53 +
  54 +func (repository *AppPageRepository) UpdateWithVersion(ctx context.Context, transaction transaction.Conn, dm *domain.AppPage) (*domain.AppPage, error) {
  55 + var (
  56 + err error
  57 + m *models.AppPage
  58 + tx = transaction.DB()
  59 + )
  60 + if m, err = repository.DomainModelToModel(dm); err != nil {
  61 + return nil, err
  62 + }
  63 + oldVersion := dm.Version
  64 + m.Version += 1
  65 + queryFunc := func() (interface{}, error) {
  66 + tx = tx.Model(m).Select("*").Where("id = ?", m.Id).Where("version = ?", oldVersion).Updates(m)
  67 + if tx.RowsAffected == 0 {
  68 + return nil, domain.ErrUpdateFail
  69 + }
  70 + return nil, tx.Error
  71 + }
  72 + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
  73 + return nil, err
  74 + }
  75 + return repository.ModelToDomainModel(m)
  76 +}
  77 +
  78 +func (repository *AppPageRepository) Delete(ctx context.Context, conn transaction.Conn, dm *domain.AppPage) (*domain.AppPage, error) {
  79 + var (
  80 + tx = conn.DB()
  81 + m = &models.AppPage{Id: dm.Identify().(int64)}
  82 + )
  83 + queryFunc := func() (interface{}, error) {
  84 + tx = tx.Where("id = ?", m.Id).Delete(m)
  85 + return m, tx.Error
  86 + }
  87 + if _, err := repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
  88 + return dm, err
  89 + }
  90 + return repository.ModelToDomainModel(m)
  91 +}
  92 +
  93 +func (repository *AppPageRepository) FindOne(ctx context.Context, conn transaction.Conn, id int64) (*domain.AppPage, error) {
  94 + var (
  95 + err error
  96 + tx = conn.DB()
  97 + m = new(models.AppPage)
  98 + )
  99 + queryFunc := func() (interface{}, error) {
  100 + tx = tx.Model(m).Where("id = ?", id).First(m)
  101 + if errors.Is(tx.Error, gorm.ErrRecordNotFound) {
  102 + return nil, domain.ErrNotFound
  103 + }
  104 + return m, tx.Error
  105 + }
  106 + cacheModel := new(models.AppPage)
  107 + cacheModel.Id = id
  108 + if err = repository.QueryCache(cacheModel.CacheKeyFunc, m, queryFunc); err != nil {
  109 + return nil, err
  110 + }
  111 + return repository.ModelToDomainModel(m)
  112 +}
  113 +
  114 +func (repository *AppPageRepository) FindOneByKey(ctx context.Context, conn transaction.Conn, key string) (*domain.AppPage, error) {
  115 + var (
  116 + err error
  117 + tx = conn.DB()
  118 + m = new(models.AppPage)
  119 + )
  120 + queryFunc := func() (interface{}, error) {
  121 + tx = tx.Model(m).Where("key = ?", key).First(m)
  122 + if errors.Is(tx.Error, gorm.ErrRecordNotFound) {
  123 + return nil, domain.ErrNotFound
  124 + }
  125 + return m, tx.Error
  126 + }
  127 + cacheModel := new(models.AppPage)
  128 + cacheModel.Key = key
  129 + if err = repository.QueryUniqueIndexCache(cacheModel.CachePrimaryKeyFunc, m, m.CacheKeyFuncByObject, queryFunc); err != nil {
  130 + return nil, err
  131 + }
  132 + return repository.ModelToDomainModel(m)
  133 +}
  134 +
  135 +func (repository *AppPageRepository) Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*domain.AppPage, error) {
  136 + var (
  137 + tx = conn.DB()
  138 + ms []*models.AppPage
  139 + dms = make([]*domain.AppPage, 0)
  140 + total int64
  141 + )
  142 + queryFunc := func() (interface{}, error) {
  143 + tx = tx.Model(&ms).Order("id desc")
  144 + if v, ok := queryOptions["ids"]; ok {
  145 + tx.Where("id in (?)", v)
  146 + }
  147 + if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
  148 + return dms, tx.Error
  149 + }
  150 + return dms, nil
  151 + }
  152 +
  153 + if _, err := repository.Query(queryFunc); err != nil {
  154 + return 0, nil, err
  155 + }
  156 +
  157 + for _, item := range ms {
  158 + if dm, err := repository.ModelToDomainModel(item); err != nil {
  159 + return 0, dms, err
  160 + } else {
  161 + dms = append(dms, dm)
  162 + }
  163 + }
  164 + return total, dms, nil
  165 +}
  166 +
  167 +func (repository *AppPageRepository) ModelToDomainModel(from *models.AppPage) (*domain.AppPage, error) {
  168 + to := &domain.AppPage{}
  169 + err := copier.Copy(to, from)
  170 + return to, err
  171 +}
  172 +
  173 +func (repository *AppPageRepository) DomainModelToModel(from *domain.AppPage) (*models.AppPage, error) {
  174 + to := &models.AppPage{}
  175 + err := copier.Copy(to, from)
  176 + return to, err
  177 +}
  178 +
  179 +func NewAppPageRepository(cache *cache.CachedRepository) domain.AppPageRepository {
  180 + return &AppPageRepository{CachedRepository: cache}
  181 +}
@@ -120,6 +120,9 @@ func (repository *ChartRepository) Find(ctx context.Context, conn transaction.Co @@ -120,6 +120,9 @@ func (repository *ChartRepository) Find(ctx context.Context, conn transaction.Co
120 ) 120 )
121 queryFunc := func() (interface{}, error) { 121 queryFunc := func() (interface{}, error) {
122 tx = tx.Model(&ms).Order("id desc") //.Order("pid asc").Order("sort asc") 122 tx = tx.Model(&ms).Order("id desc") //.Order("pid asc").Order("sort asc")
  123 + if v, ok := queryOptions["ids"]; ok {
  124 + tx.Where("id in (?)", v)
  125 + }
123 if v, ok := queryOptions["tenantId"]; ok { 126 if v, ok := queryOptions["tenantId"]; ok {
124 tx.Where("tenant_id = ?", v) 127 tx.Where("tenant_id = ?", v)
125 } 128 }
  1 +package domain
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/db/transaction"
  6 +)
  7 +
  8 +type AppPage struct {
  9 + Id int64 // 唯一标识
  10 + Name string // 名称
  11 + Charts []int64 // 图表
  12 + Key string // 分享,预览时绑定映射到Id
  13 + TenantId int64 // 租户ID
  14 + CreatedAt int64 `json:",omitempty"`
  15 + UpdatedAt int64 `json:",omitempty"`
  16 + DeletedAt int64 `json:",omitempty"`
  17 + Version int `json:",omitempty"`
  18 +}
  19 +
  20 +type AppPageRepository interface {
  21 + Insert(ctx context.Context, conn transaction.Conn, dm *AppPage) (*AppPage, error)
  22 + Update(ctx context.Context, conn transaction.Conn, dm *AppPage) (*AppPage, error)
  23 + UpdateWithVersion(ctx context.Context, conn transaction.Conn, dm *AppPage) (*AppPage, error)
  24 + Delete(ctx context.Context, conn transaction.Conn, dm *AppPage) (*AppPage, error)
  25 + FindOne(ctx context.Context, conn transaction.Conn, id int64) (*AppPage, error)
  26 + FindOneByKey(ctx context.Context, conn transaction.Conn, key string) (*AppPage, error)
  27 + Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*AppPage, error)
  28 +}
  29 +
  30 +func (m *AppPage) Identify() interface{} {
  31 + if m.Id == 0 {
  32 + return nil
  33 + }
  34 + return m.Id
  35 +}
@@ -19,10 +19,21 @@ type ChartProperty struct { @@ -19,10 +19,21 @@ type ChartProperty struct {
19 TableAbility TableAbility `json:"table,optional"` // 表筛选功能 19 TableAbility TableAbility `json:"table,optional"` // 表筛选功能
20 Series []Series `json:"series,optional"` // 系列(数据源) 20 Series []Series `json:"series,optional"` // 系列(数据源)
21 Cover string `json:"cover,optional"` // 封面 21 Cover string `json:"cover,optional"` // 封面
22 - 22 + Other Other `json:"other,optional"` // 其他额外配置
23 //XAxis interface{} `json:"xAxis"` // X轴 23 //XAxis interface{} `json:"xAxis"` // X轴
24 //YAxis interface{} `json:"yAxis"` // Y轴 24 //YAxis interface{} `json:"yAxis"` // Y轴
25 } 25 }
  26 +type Other struct {
  27 + Quarter *Quarter `json:"quarter,optional,omitempty"` // 四分图
  28 +}
  29 +type Quarter struct {
  30 + XAxisLabel string `json:"xAxisLabel"` // x轴标签名
  31 + XAxisLabelList []string `json:"xAxisLabelList"` // 标签名
  32 + YAxisLabel string `json:"yAxisLabel"` // x轴标签名
  33 + YAxisLabelList []string `json:"yAxisLabelList"` // 标签名
  34 + Area string `json:"area"` // 图形面积
  35 + SeriesList string `json:"seriesList"` // 图形系列
  36 +}
26 type Title struct { 37 type Title struct {
27 TitleSwitch bool `json:"titleSwitch,optional"` // 组件标题开关 38 TitleSwitch bool `json:"titleSwitch,optional"` // 组件标题开关
28 IntroduceSwitch bool `json:"introduceSwitch,optional"` // 组件说明开关 39 IntroduceSwitch bool `json:"introduceSwitch,optional"` // 组件说明开关
@@ -32,6 +43,7 @@ type Title struct { @@ -32,6 +43,7 @@ type Title struct {
32 ExplainType string `json:"explainType,optional,options=[text,file]"` // text file 43 ExplainType string `json:"explainType,optional,options=[text,file]"` // text file
33 ExplainTxt string `json:"explainTxt,optional"` // 文字说明 44 ExplainTxt string `json:"explainTxt,optional"` // 文字说明
34 FileUrl string `json:"fileUrl,optional"` // 组件图片/视频 45 FileUrl string `json:"fileUrl,optional"` // 组件图片/视频
  46 + Align string `json:"align,optional"` // 文本对齐方式 left center right
35 } 47 }
36 48
37 type TableAbility struct { 49 type TableAbility struct {
@@ -46,6 +58,9 @@ type Series struct { @@ -46,6 +58,9 @@ type Series struct {
46 DataSourceId int64 `json:"dataSourceId,optional,omitempty"` // 数据源ID(from值为ByteBank时有值) 58 DataSourceId int64 `json:"dataSourceId,optional,omitempty"` // 数据源ID(from值为ByteBank时有值)
47 CustomText string `json:"customText,optional,omitempty"` // 自定义数据文本(from值为User时有值) 59 CustomText string `json:"customText,optional,omitempty"` // 自定义数据文本(from值为User时有值)
48 MatchExpressions []Expression `json:"matchExpressions,omitempty"` // 条件匹配表达式(总体指标) 60 MatchExpressions []Expression `json:"matchExpressions,omitempty"` // 条件匹配表达式(总体指标)
  61 + TargetText string `json:"targetText,optional,omitempty"` // 指标名文本
  62 + TargetNum string `json:"targetNum,optional,omitempty"` // 指标数值
  63 + TargetUnit string `json:"targetUnit,optional,omitempty"` // 指标单位
49 } 64 }
50 65
51 type Expression struct { 66 type Expression struct {
@@ -14,6 +14,7 @@ type ChartSetting struct { @@ -14,6 +14,7 @@ type ChartSetting struct {
14 Title Title 14 Title Title
15 TableAbility TableAbility // 表格能力 15 TableAbility TableAbility // 表格能力
16 Series []Series // 系列值-数据绑定 16 Series []Series // 系列值-数据绑定
  17 + Other Other
17 18
18 TenantId int64 // 租户ID 19 TenantId int64 // 租户ID
19 CreatedAt int64 `json:",omitempty"` 20 CreatedAt int64 `json:",omitempty"`
@@ -44,5 +45,6 @@ func (m *ChartSetting) ChartProperty(cover string) ChartProperty { @@ -44,5 +45,6 @@ func (m *ChartSetting) ChartProperty(cover string) ChartProperty {
44 TableAbility: m.TableAbility, 45 TableAbility: m.TableAbility,
45 Series: m.Series, 46 Series: m.Series,
46 Cover: cover, 47 Cover: cover,
  48 + Other: m.Other,
47 } 49 }
48 } 50 }
1 import "core/chart.api" 1 import "core/chart.api"
2 import "core/table.api" 2 import "core/table.api"
  3 +import "core/app_page.api"
3 // import "./core/chart_stting.api" 4 // import "./core/chart_stting.api"
@@ -15,6 +15,234 @@ @@ -15,6 +15,234 @@
15 "application/json" 15 "application/json"
16 ], 16 ],
17 "paths": { 17 "paths": {
  18 + "v1/api/app-page/get-share-detail/{key}": {
  19 + "get": {
  20 + "summary": "开放接口-获取应用页详情通过KEY",
  21 + "operationId": "getAppPageShareDetail",
  22 + "responses": {
  23 + "200": {
  24 + "description": "A successful response.",
  25 + "schema": {
  26 + "$ref": "#/definitions/GetAppPageShareDetailResponse"
  27 + }
  28 + }
  29 + },
  30 + "parameters": [
  31 + {
  32 + "name": "key",
  33 + "in": "path",
  34 + "required": true,
  35 + "type": "string"
  36 + }
  37 + ],
  38 + "requestBody": {},
  39 + "tags": [
  40 + "page"
  41 + ]
  42 + }
  43 + },
  44 + "v1/app-page": {
  45 + "post": {
  46 + "summary": "保存应用页",
  47 + "operationId": "saveAppPage",
  48 + "responses": {
  49 + "200": {
  50 + "description": "A successful response.",
  51 + "schema": {
  52 + "$ref": "#/definitions/AppPageSaveResponse"
  53 + }
  54 + }
  55 + },
  56 + "parameters": [
  57 + {
  58 + "name": "body",
  59 + "in": "body",
  60 + "required": true,
  61 + "schema": {
  62 + "$ref": "#/definitions/AppPageSaveRequest"
  63 + }
  64 + }
  65 + ],
  66 + "requestBody": {},
  67 + "tags": [
  68 + "page"
  69 + ]
  70 + }
  71 + },
  72 + "v1/app-page/create-share": {
  73 + "post": {
  74 + "summary": "创建应用页分享",
  75 + "operationId": "createAppPageShareUrl",
  76 + "responses": {
  77 + "200": {
  78 + "description": "A successful response.",
  79 + "schema": {
  80 + "$ref": "#/definitions/AppPageCreateShareResponse"
  81 + }
  82 + }
  83 + },
  84 + "parameters": [
  85 + {
  86 + "name": "body",
  87 + "in": "body",
  88 + "required": true,
  89 + "schema": {
  90 + "$ref": "#/definitions/AppPageCreateShareRequest"
  91 + }
  92 + }
  93 + ],
  94 + "requestBody": {},
  95 + "tags": [
  96 + "page"
  97 + ]
  98 + }
  99 + },
  100 + "v1/app-page/saveas": {
  101 + "post": {
  102 + "summary": "应用页另存为",
  103 + "operationId": "saveAsAppPage",
  104 + "responses": {
  105 + "200": {
  106 + "description": "A successful response.",
  107 + "schema": {
  108 + "$ref": "#/definitions/AppPageSaveAsResponse"
  109 + }
  110 + }
  111 + },
  112 + "parameters": [
  113 + {
  114 + "name": "body",
  115 + "in": "body",
  116 + "required": true,
  117 + "schema": {
  118 + "$ref": "#/definitions/AppPageSaveAsRequest"
  119 + }
  120 + }
  121 + ],
  122 + "requestBody": {},
  123 + "tags": [
  124 + "page"
  125 + ]
  126 + }
  127 + },
  128 + "v1/app-page/search": {
  129 + "post": {
  130 + "summary": "搜索",
  131 + "operationId": "searchAppPage",
  132 + "responses": {
  133 + "200": {
  134 + "description": "A successful response.",
  135 + "schema": {
  136 + "$ref": "#/definitions/AppPageSearchResponse"
  137 + }
  138 + }
  139 + },
  140 + "parameters": [
  141 + {
  142 + "name": "body",
  143 + "in": "body",
  144 + "required": true,
  145 + "schema": {
  146 + "$ref": "#/definitions/AppPageSearchRequest"
  147 + }
  148 + }
  149 + ],
  150 + "requestBody": {},
  151 + "tags": [
  152 + "page"
  153 + ]
  154 + }
  155 + },
  156 + "v1/app-page/{id}": {
  157 + "get": {
  158 + "summary": "获取应用页详情",
  159 + "operationId": "getAppPage",
  160 + "responses": {
  161 + "200": {
  162 + "description": "A successful response.",
  163 + "schema": {
  164 + "$ref": "#/definitions/AppPageGetResponse"
  165 + }
  166 + }
  167 + },
  168 + "parameters": [
  169 + {
  170 + "name": "id",
  171 + "in": "path",
  172 + "required": true,
  173 + "type": "string"
  174 + }
  175 + ],
  176 + "requestBody": {},
  177 + "tags": [
  178 + "page"
  179 + ]
  180 + },
  181 + "delete": {
  182 + "summary": "删除应用页",
  183 + "operationId": "deleteAppPage",
  184 + "responses": {
  185 + "200": {
  186 + "description": "A successful response.",
  187 + "schema": {
  188 + "$ref": "#/definitions/AppPageDeleteResponse"
  189 + }
  190 + }
  191 + },
  192 + "parameters": [
  193 + {
  194 + "name": "id",
  195 + "in": "path",
  196 + "required": true,
  197 + "type": "string"
  198 + },
  199 + {
  200 + "name": "body",
  201 + "in": "body",
  202 + "required": true,
  203 + "schema": {
  204 + "$ref": "#/definitions/AppPageDeleteRequest"
  205 + }
  206 + }
  207 + ],
  208 + "requestBody": {},
  209 + "tags": [
  210 + "page"
  211 + ]
  212 + },
  213 + "put": {
  214 + "summary": "更新应用页",
  215 + "operationId": "updateAppPage",
  216 + "responses": {
  217 + "200": {
  218 + "description": "A successful response.",
  219 + "schema": {
  220 + "$ref": "#/definitions/AppPageUpdateResponse"
  221 + }
  222 + }
  223 + },
  224 + "parameters": [
  225 + {
  226 + "name": "id",
  227 + "in": "path",
  228 + "required": true,
  229 + "type": "string"
  230 + },
  231 + {
  232 + "name": "body",
  233 + "in": "body",
  234 + "required": true,
  235 + "schema": {
  236 + "$ref": "#/definitions/AppPageUpdateRequest"
  237 + }
  238 + }
  239 + ],
  240 + "requestBody": {},
  241 + "tags": [
  242 + "page"
  243 + ]
  244 + }
  245 + },
18 "v1/chart": { 246 "v1/chart": {
19 "post": { 247 "post": {
20 "summary": "保存图表", 248 "summary": "保存图表",
@@ -155,6 +383,34 @@ @@ -155,6 +383,34 @@
155 ] 383 ]
156 } 384 }
157 }, 385 },
  386 + "v1/chart/saveas": {
  387 + "post": {
  388 + "summary": "图表另存为",
  389 + "operationId": "saveAsChart",
  390 + "responses": {
  391 + "200": {
  392 + "description": "A successful response.",
  393 + "schema": {
  394 + "$ref": "#/definitions/ChartSaveAsResponse"
  395 + }
  396 + }
  397 + },
  398 + "parameters": [
  399 + {
  400 + "name": "body",
  401 + "in": "body",
  402 + "required": true,
  403 + "schema": {
  404 + "$ref": "#/definitions/ChartSaveAsRequest"
  405 + }
  406 + }
  407 + ],
  408 + "requestBody": {},
  409 + "tags": [
  410 + "chart"
  411 + ]
  412 + }
  413 + },
158 "v1/chart/search": { 414 "v1/chart/search": {
159 "post": { 415 "post": {
160 "summary": "搜索图表", 416 "summary": "搜索图表",
@@ -391,6 +647,269 @@ @@ -391,6 +647,269 @@
391 } 647 }
392 }, 648 },
393 "definitions": { 649 "definitions": {
  650 + "AppPageChartItem": {
  651 + "type": "object",
  652 + "properties": {
  653 + "chartId": {
  654 + "type": "integer",
  655 + "format": "int64",
  656 + "description": " 图表ID"
  657 + },
  658 + "name": {
  659 + "type": "string",
  660 + "description": " 图表名称"
  661 + },
  662 + "cover": {
  663 + "type": "string",
  664 + "description": " 图表封面"
  665 + }
  666 + },
  667 + "title": "AppPageChartItem",
  668 + "required": [
  669 + "chartId",
  670 + "name",
  671 + "cover"
  672 + ]
  673 + },
  674 + "AppPageCreateShareRequest": {
  675 + "type": "object",
  676 + "properties": {
  677 + "id": {
  678 + "type": "integer",
  679 + "format": "int64",
  680 + "description": " 页面ID"
  681 + }
  682 + },
  683 + "title": "AppPageCreateShareRequest",
  684 + "required": [
  685 + "id"
  686 + ]
  687 + },
  688 + "AppPageCreateShareResponse": {
  689 + "type": "object",
  690 + "properties": {
  691 + "key": {
  692 + "type": "string",
  693 + "description": " 分享,预览时绑定映射到Id"
  694 + }
  695 + },
  696 + "title": "AppPageCreateShareResponse"
  697 + },
  698 + "AppPageDeleteRequest": {
  699 + "type": "object",
  700 + "properties": {
  701 + "id": {
  702 + "type": "integer",
  703 + "format": "int64",
  704 + "description": " 页面ID"
  705 + }
  706 + },
  707 + "title": "AppPageDeleteRequest",
  708 + "required": [
  709 + "id"
  710 + ]
  711 + },
  712 + "AppPageDeleteResponse": {
  713 + "type": "object",
  714 + "title": "AppPageDeleteResponse"
  715 + },
  716 + "AppPageGetRequest": {
  717 + "type": "object",
  718 + "properties": {
  719 + "id": {
  720 + "type": "integer",
  721 + "format": "int64"
  722 + }
  723 + },
  724 + "title": "AppPageGetRequest",
  725 + "required": [
  726 + "id"
  727 + ]
  728 + },
  729 + "AppPageGetResponse": {
  730 + "type": "object",
  731 + "properties": {
  732 + "page": {
  733 + "$ref": "#/definitions/AppPageItem"
  734 + }
  735 + },
  736 + "title": "AppPageGetResponse",
  737 + "required": [
  738 + "page"
  739 + ]
  740 + },
  741 + "AppPageItem": {
  742 + "type": "object",
  743 + "properties": {
  744 + "id": {
  745 + "type": "integer",
  746 + "format": "int64",
  747 + "description": " 唯一标识"
  748 + },
  749 + "name": {
  750 + "type": "string",
  751 + "description": " 名称"
  752 + },
  753 + "charts": {
  754 + "type": "array",
  755 + "items": {
  756 + "$ref": "#/definitions/AppPageChartItem"
  757 + },
  758 + "description": " 图表"
  759 + }
  760 + },
  761 + "title": "AppPageItem"
  762 + },
  763 + "AppPageSaveAsRequest": {
  764 + "type": "object",
  765 + "properties": {
  766 + "id": {
  767 + "type": "integer",
  768 + "format": "int64",
  769 + "description": " 页面ID"
  770 + },
  771 + "name": {
  772 + "type": "string",
  773 + "description": " 名称"
  774 + }
  775 + },
  776 + "title": "AppPageSaveAsRequest",
  777 + "required": [
  778 + "id",
  779 + "name"
  780 + ]
  781 + },
  782 + "AppPageSaveAsResponse": {
  783 + "type": "object",
  784 + "properties": {
  785 + "id": {
  786 + "type": "integer",
  787 + "format": "int64"
  788 + },
  789 + "name": {
  790 + "type": "string",
  791 + "description": " 名称"
  792 + },
  793 + "charts": {
  794 + "type": "array",
  795 + "items": {
  796 + "type": "integer",
  797 + "format": "int64"
  798 + },
  799 + "description": " 图表"
  800 + }
  801 + },
  802 + "title": "AppPageSaveAsResponse",
  803 + "required": [
  804 + "id",
  805 + "name",
  806 + "charts"
  807 + ]
  808 + },
  809 + "AppPageSaveRequest": {
  810 + "type": "object",
  811 + "properties": {
  812 + "name": {
  813 + "type": "string",
  814 + "description": " 名称"
  815 + },
  816 + "charts": {
  817 + "type": "array",
  818 + "items": {
  819 + "type": "integer",
  820 + "format": "int64"
  821 + },
  822 + "description": " 图表"
  823 + }
  824 + },
  825 + "title": "AppPageSaveRequest",
  826 + "required": [
  827 + "name",
  828 + "charts"
  829 + ]
  830 + },
  831 + "AppPageSaveResponse": {
  832 + "type": "object",
  833 + "properties": {
  834 + "id": {
  835 + "type": "integer",
  836 + "format": "int64"
  837 + }
  838 + },
  839 + "title": "AppPageSaveResponse",
  840 + "required": [
  841 + "id"
  842 + ]
  843 + },
  844 + "AppPageSearchRequest": {
  845 + "type": "object",
  846 + "properties": {
  847 + "page": {
  848 + "type": "integer",
  849 + "format": "int32"
  850 + },
  851 + "size": {
  852 + "type": "integer",
  853 + "format": "int32"
  854 + }
  855 + },
  856 + "title": "AppPageSearchRequest",
  857 + "required": [
  858 + "page",
  859 + "size"
  860 + ]
  861 + },
  862 + "AppPageSearchResponse": {
  863 + "type": "object",
  864 + "properties": {
  865 + "list": {
  866 + "type": "array",
  867 + "items": {
  868 + "$ref": "#/definitions/AppPageItem"
  869 + }
  870 + },
  871 + "total": {
  872 + "type": "integer",
  873 + "format": "int64"
  874 + }
  875 + },
  876 + "title": "AppPageSearchResponse",
  877 + "required": [
  878 + "list",
  879 + "total"
  880 + ]
  881 + },
  882 + "AppPageUpdateRequest": {
  883 + "type": "object",
  884 + "properties": {
  885 + "id": {
  886 + "type": "integer",
  887 + "format": "int64"
  888 + },
  889 + "name": {
  890 + "type": "string",
  891 + "description": " 名称"
  892 + },
  893 + "charts": {
  894 + "type": "array",
  895 + "items": {
  896 + "type": "integer",
  897 + "format": "int64"
  898 + },
  899 + "description": " 图表"
  900 + }
  901 + },
  902 + "title": "AppPageUpdateRequest",
  903 + "required": [
  904 + "id",
  905 + "name",
  906 + "charts"
  907 + ]
  908 + },
  909 + "AppPageUpdateResponse": {
  910 + "type": "object",
  911 + "title": "AppPageUpdateResponse"
  912 + },
394 "ChartComponentItem": { 913 "ChartComponentItem": {
395 "type": "object", 914 "type": "object",
396 "properties": { 915 "properties": {
@@ -541,6 +1060,10 @@ @@ -541,6 +1060,10 @@
541 "cover": { 1060 "cover": {
542 "type": "string", 1061 "type": "string",
543 "description": " 封面" 1062 "description": " 封面"
  1063 + },
  1064 + "other": {
  1065 + "$ref": "#/definitions/Other",
  1066 + "description": " 其他额外配置"
544 } 1067 }
545 }, 1068 },
546 "title": "ChartProperty" 1069 "title": "ChartProperty"
@@ -567,6 +1090,37 @@ @@ -567,6 +1090,37 @@
567 "type": "object", 1090 "type": "object",
568 "title": "ChartRenameResponse" 1091 "title": "ChartRenameResponse"
569 }, 1092 },
  1093 + "ChartSaveAsRequest": {
  1094 + "type": "object",
  1095 + "properties": {
  1096 + "chartId": {
  1097 + "type": "integer",
  1098 + "format": "int64",
  1099 + "description": " 图表Id"
  1100 + },
  1101 + "name": {
  1102 + "type": "string",
  1103 + "description": " 名称"
  1104 + }
  1105 + },
  1106 + "title": "ChartSaveAsRequest",
  1107 + "required": [
  1108 + "chartId",
  1109 + "name"
  1110 + ]
  1111 + },
  1112 + "ChartSaveAsResponse": {
  1113 + "type": "object",
  1114 + "properties": {
  1115 + "chart": {
  1116 + "$ref": "#/definitions/ChartItem"
  1117 + }
  1118 + },
  1119 + "title": "ChartSaveAsResponse",
  1120 + "required": [
  1121 + "chart"
  1122 + ]
  1123 + },
570 "ChartSaveRequest": { 1124 "ChartSaveRequest": {
571 "type": "object", 1125 "type": "object",
572 "properties": { 1126 "properties": {
@@ -776,6 +1330,30 @@ @@ -776,6 +1330,30 @@
776 "toValue" 1330 "toValue"
777 ] 1331 ]
778 }, 1332 },
  1333 + "GetAppPageShareDetailRequest": {
  1334 + "type": "object",
  1335 + "properties": {
  1336 + "key": {
  1337 + "type": "string"
  1338 + }
  1339 + },
  1340 + "title": "GetAppPageShareDetailRequest",
  1341 + "required": [
  1342 + "key"
  1343 + ]
  1344 + },
  1345 + "GetAppPageShareDetailResponse": {
  1346 + "type": "object",
  1347 + "properties": {
  1348 + "page": {
  1349 + "$ref": "#/definitions/AppPageItem"
  1350 + }
  1351 + },
  1352 + "title": "GetAppPageShareDetailResponse",
  1353 + "required": [
  1354 + "page"
  1355 + ]
  1356 + },
779 "GetTableDetailRequest": { 1357 "GetTableDetailRequest": {
780 "type": "object", 1358 "type": "object",
781 "properties": { 1359 "properties": {
@@ -814,6 +1392,63 @@ @@ -814,6 +1392,63 @@
814 "type": "object", 1392 "type": "object",
815 "title": "LoadChartDataResponse" 1393 "title": "LoadChartDataResponse"
816 }, 1394 },
  1395 + "Other": {
  1396 + "type": "object",
  1397 + "properties": {
  1398 + "quarter": {
  1399 + "$ref": "#/definitions/Quarter",
  1400 + "description": " 四分图"
  1401 + }
  1402 + },
  1403 + "title": "Other",
  1404 + "required": [
  1405 + "quarter"
  1406 + ]
  1407 + },
  1408 + "Quarter": {
  1409 + "type": "object",
  1410 + "properties": {
  1411 + "xAxisLabel": {
  1412 + "type": "string",
  1413 + "description": " x轴标签名"
  1414 + },
  1415 + "xAxisLabelList": {
  1416 + "type": "array",
  1417 + "items": {
  1418 + "type": "string"
  1419 + },
  1420 + "description": " 标签名"
  1421 + },
  1422 + "yAxisLabel": {
  1423 + "type": "string",
  1424 + "description": " x轴标签名"
  1425 + },
  1426 + "yAxisLabelList": {
  1427 + "type": "array",
  1428 + "items": {
  1429 + "type": "string"
  1430 + },
  1431 + "description": " 标签名"
  1432 + },
  1433 + "area": {
  1434 + "type": "string",
  1435 + "description": " 图形面积"
  1436 + },
  1437 + "seriesList": {
  1438 + "type": "string",
  1439 + "description": " 图形系列"
  1440 + }
  1441 + },
  1442 + "title": "Quarter",
  1443 + "required": [
  1444 + "xAxisLabel",
  1445 + "xAxisLabelList",
  1446 + "yAxisLabel",
  1447 + "yAxisLabelList",
  1448 + "area",
  1449 + "seriesList"
  1450 + ]
  1451 + },
817 "SearchTableByModuleRequest": { 1452 "SearchTableByModuleRequest": {
818 "type": "object", 1453 "type": "object",
819 "properties": { 1454 "properties": {
@@ -945,6 +1580,18 @@ @@ -945,6 +1580,18 @@
945 "$ref": "#/definitions/Expression" 1580 "$ref": "#/definitions/Expression"
946 }, 1581 },
947 "description": " 条件匹配表达式(总体指标)" 1582 "description": " 条件匹配表达式(总体指标)"
  1583 + },
  1584 + "targetText": {
  1585 + "type": "string",
  1586 + "description": " 指标名文本"
  1587 + },
  1588 + "targetNum": {
  1589 + "type": "string",
  1590 + "description": " 指标数值"
  1591 + },
  1592 + "targetUnit": {
  1593 + "type": "string",
  1594 + "description": " 指标单位"
948 } 1595 }
949 }, 1596 },
950 "title": "Series", 1597 "title": "Series",
@@ -953,7 +1600,10 @@ @@ -953,7 +1600,10 @@
953 "from", 1600 "from",
954 "dataSourceId", 1601 "dataSourceId",
955 "customText", 1602 "customText",
956 - "matchExpressions" 1603 + "matchExpressions",
  1604 + "targetText",
  1605 + "targetNum",
  1606 + "targetUnit"
957 ] 1607 ]
958 }, 1608 },
959 "TableAbility": { 1609 "TableAbility": {
@@ -1010,6 +1660,10 @@ @@ -1010,6 +1660,10 @@
1010 "fileUrl": { 1660 "fileUrl": {
1011 "type": "string", 1661 "type": "string",
1012 "description": " 组件图片/视频" 1662 "description": " 组件图片/视频"
  1663 + },
  1664 + "align": {
  1665 + "type": "string",
  1666 + "description": " 文本对齐方式 left center right"
1013 } 1667 }
1014 }, 1668 },
1015 "title": "Title", 1669 "title": "Title",
  1 +
  2 +syntax = "v1"
  3 +
  4 +info(
  5 + title: "天联字库图表模板"
  6 + desc: "图表模板"
  7 + author: "小火箭"
  8 + email: "email"
  9 + version: "v1"
  10 +)
  11 +
  12 +@server(
  13 + prefix: v1
  14 + group: page
  15 + jwt: JwtAuth
  16 +)
  17 +service Core {
  18 + @doc "获取应用页详情"
  19 + @handler getAppPage
  20 + get /app-page/:id (AppPageGetRequest) returns (AppPageGetResponse)
  21 + @doc "保存应用页"
  22 + @handler saveAppPage
  23 + post /app-page (AppPageSaveRequest) returns (AppPageSaveResponse)
  24 + @doc "应用页另存为"
  25 + @handler saveAsAppPage
  26 + post /app-page/saveas (AppPageSaveAsRequest) returns (AppPageSaveAsResponse)
  27 + @doc "删除应用页"
  28 + @handler deleteAppPage
  29 + delete /app-page/:id (AppPageDeleteRequest) returns (AppPageDeleteResponse)
  30 + @doc "更新应用页"
  31 + @handler updateAppPage
  32 + put /app-page/:id (AppPageUpdateRequest) returns (AppPageUpdateResponse)
  33 + @doc "搜索"
  34 + @handler searchAppPage
  35 + post /app-page/search (AppPageSearchRequest) returns (AppPageSearchResponse)
  36 + @doc "创建应用页分享"
  37 + @handler createAppPageShareUrl
  38 + post /app-page/create-share (AppPageCreateShareRequest) returns (AppPageCreateShareResponse)
  39 +}
  40 +
  41 +
  42 +type (
  43 + AppPageGetRequest {
  44 + Id int64 `path:"id"`
  45 + }
  46 + AppPageGetResponse struct{
  47 + AppPage AppPageItem `json:"page"`
  48 + }
  49 +
  50 + AppPageSaveRequest struct{
  51 + Name string `json:"name"` // 名称
  52 + Charts []int64 `json:"charts"`// 图表
  53 + }
  54 + AppPageSaveResponse struct{
  55 + Id int64 `json:"id"`
  56 + }
  57 +
  58 + AppPageSaveAsRequest struct{
  59 + Id int64 `json:"id"` // 页面ID
  60 + Name string `json:"name"` // 名称
  61 + }
  62 + AppPageSaveAsResponse struct{
  63 + Id int64 `path:"id"`
  64 + Name string `json:"name"` // 名称
  65 + Charts []int64 `json:"charts"`// 图表
  66 + }
  67 + AppPageCreateShareRequest struct{
  68 + Id int64 `json:"id"` // 页面ID
  69 + }
  70 + AppPageCreateShareResponse struct{
  71 + Key string `json:"key,optional"` // 分享,预览时绑定映射到Id
  72 + }
  73 + AppPageDeleteRequest struct{
  74 + Id int64 `path:"id"` // 页面ID
  75 + }
  76 + AppPageDeleteResponse struct{}
  77 +
  78 + AppPageUpdateRequest struct{
  79 + Id int64 `path:"id"`
  80 + Name string `json:"name"` // 名称
  81 + Charts []int64 `json:"charts"`// 图表
  82 + }
  83 + AppPageUpdateResponse struct{}
  84 +
  85 + AppPageSearchRequest struct{
  86 + Page int `json:"page"`
  87 + Size int `json:"size"`
  88 + }
  89 + AppPageSearchResponse{
  90 + List []AppPageItem `json:"list"`
  91 + Total int64 `json:"total"`
  92 + }
  93 + AppPageItem struct{
  94 + Id int64 `json:"id,optional"` // 唯一标识
  95 + Name string `json:"name,optional"` // 名称
  96 + Charts []AppPageChartItem `json:"charts,optional"`// 图表
  97 + }
  98 + AppPageChartItem struct{
  99 + ChartId int64 `json:"chartId"` // 图表ID
  100 + Name string `json:"name"` // 图表名称
  101 + Cover string `json:"cover"` // 图表封面
  102 + }
  103 +)
  104 +
  105 +
  106 +@server(
  107 + prefix: v1
  108 + group: page
  109 +)
  110 +service Core {
  111 + @doc "开放接口-获取应用页详情通过KEY"
  112 + @handler getAppPageShareDetail
  113 + get /api/app-page/get-share-detail/:key (GetAppPageShareDetailRequest) returns (GetAppPageShareDetailResponse)
  114 +}
  115 +
  116 +type (
  117 + GetAppPageShareDetailRequest struct{
  118 + Key string `path:"key"`
  119 + }
  120 + GetAppPageShareDetailResponse struct{
  121 + AppPage AppPageItem `json:"page"`
  122 + }
  123 +)
@@ -155,6 +155,18 @@ type( @@ -155,6 +155,18 @@ type(
155 TableAbility TableAbility `json:"table,optional"` // 表筛选功能 155 TableAbility TableAbility `json:"table,optional"` // 表筛选功能
156 Series []Series `json:"series,optional"` // 系列(数据源) 156 Series []Series `json:"series,optional"` // 系列(数据源)
157 Cover string `json:"cover,optional"` // 封面 157 Cover string `json:"cover,optional"` // 封面
  158 + Other Other `json:"other,optional"` // 其他额外配置
  159 + }
  160 + Other struct {
  161 + Quarter *Quarter `json:"quarter,optional,omitempty"` // 四分图
  162 + }
  163 + Quarter struct {
  164 + XAxisLabel string `json:"xAxisLabel"` // x轴标签名
  165 + XAxisLabelList []string `json:"xAxisLabelList"` // 标签名
  166 + YAxisLabel string `json:"yAxisLabel"` // x轴标签名
  167 + YAxisLabelList []string `json:"yAxisLabelList"` // 标签名
  168 + Area string `json:"area"` // 图形面积
  169 + SeriesList string `json:"seriesList"` // 图形系列
158 } 170 }
159 Title struct { 171 Title struct {
160 TitleSwitch bool `json:"titleSwitch,optional"` // 组件标题开关 172 TitleSwitch bool `json:"titleSwitch,optional"` // 组件标题开关
@@ -165,6 +177,7 @@ type( @@ -165,6 +177,7 @@ type(
165 ExplainType string `json:"explainType,optional,options=[text,file]"` // text file 177 ExplainType string `json:"explainType,optional,options=[text,file]"` // text file
166 ExplainTxt string `json:"explainTxt,optional"` // 文字说明 178 ExplainTxt string `json:"explainTxt,optional"` // 文字说明
167 FileUrl string `json:"fileUrl,optional"` // 组件图片/视频 179 FileUrl string `json:"fileUrl,optional"` // 组件图片/视频
  180 + Align string `json:"align,optional"` // 文本对齐方式 left center right
168 } 181 }
169 TableAbility struct { 182 TableAbility struct {
170 FilterSwitch bool `json:"filterSwitch,optional"` // 表筛选功能开关 183 FilterSwitch bool `json:"filterSwitch,optional"` // 表筛选功能开关
@@ -176,6 +189,9 @@ type( @@ -176,6 +189,9 @@ type(
176 DataSourceId int64 `json:"dataSourceId,optional,omitempty"` // 数据源ID(from值为ByteBank时有值) 189 DataSourceId int64 `json:"dataSourceId,optional,omitempty"` // 数据源ID(from值为ByteBank时有值)
177 CustomText string `json:"customText,optional,omitempty"` // 自定义数据文本(from值为User时有值) 190 CustomText string `json:"customText,optional,omitempty"` // 自定义数据文本(from值为User时有值)
178 MatchExpressions []Expression `json:"matchExpressions,optional,omitempty"` // 条件匹配表达式(总体指标) 191 MatchExpressions []Expression `json:"matchExpressions,optional,omitempty"` // 条件匹配表达式(总体指标)
  192 + TargetText string `json:"targetText,optional,omitempty"` // 指标名文本
  193 + TargetNum string `json:"targetNum,optional,omitempty"` // 指标数值
  194 + TargetUnit string `json:"targetUnit,optional,omitempty"` // 指标单位
179 } 195 }
180 Expression struct { 196 Expression struct {
181 Operator string `json:"operator"` // 操作符号 <,>,==,<>,<=,>= 197 Operator string `json:"operator"` // 操作符号 <,>,==,<>,<=,>=
@@ -16,3 +16,8 @@ CREATE TABLE `chart_setting` ( @@ -16,3 +16,8 @@ CREATE TABLE `chart_setting` (
16 `series` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '系列值-数据绑定', 16 `series` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '系列值-数据绑定',
17 PRIMARY KEY (`id`) USING BTREE 17 PRIMARY KEY (`id`) USING BTREE
18 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; 18 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  19 +
  20 +CREATE TABLE `app_page` (
  21 + `id` int(0) NOT NULL COMMENT '唯一标识',
  22 + PRIMARY KEY (`id`) USING BTREE
  23 +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;