作者 yangfu

标签分类修改

正在显示 36 个修改的文件 包含 3470 行增加36 行删除
... ... @@ -1748,6 +1748,58 @@
}
},
"v1/system/article": {
"delete": {
"summary": "管理后台删除文章",
"operationId": "SystemDeleteArticle",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/SystemArticleDeleteResponse"
}
}
},
"parameters": [
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/SystemArticleDeleteRequest"
}
}
],
"requestBody": {},
"tags": [
"article"
]
},
"post": {
"summary": "管理后台新增文章",
"operationId": "SystemCreateArticle",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/SystemArticleCreateResponse"
}
}
},
"parameters": [
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/SystemArticleCreateRequest"
}
}
],
"requestBody": {},
"tags": [
"article"
]
},
"put": {
"summary": "管理后台编辑帖子",
"operationId": "SystemUpdateArticle",
... ... @@ -1776,6 +1828,196 @@
]
}
},
"v1/system/article/deleted/list": {
"post": {
"summary": "管理后台已删除列表",
"operationId": "SystemArticleSearchDeleted",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/SystemArticleSearchDeletedResponse"
}
}
},
"parameters": [
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/SystemArticleSearchDeletedRequest"
}
}
],
"requestBody": {},
"tags": [
"article"
]
}
},
"v1/system/article/deleted/restore": {
"put": {
"summary": "管理后台文章删除恢复",
"operationId": "SystemRestoreArticleDeleted",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/SystemArticleDeletedRestoreResponse"
}
}
},
"parameters": [
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/SystemArticleDeletedRestoreRequest"
}
}
],
"requestBody": {},
"tags": [
"article"
]
}
},
"v1/system/article/draft": {
"delete": {
"summary": "管理后台删除草稿",
"operationId": "SystemDeleteArticleDraft",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/SystemArticleDraftDeleteResponse"
}
}
},
"parameters": [
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/SystemArticleDraftDeleteRequest"
}
}
],
"requestBody": {},
"tags": [
"article"
]
},
"post": {
"summary": "管理后台新增草稿",
"operationId": "SystemCreateArticleDraft",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/SystemArticleDraftCreateResponse"
}
}
},
"parameters": [
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/SystemArticleDraftCreateRequest"
}
}
],
"requestBody": {},
"tags": [
"article"
]
},
"put": {
"summary": "管理后台编辑草稿",
"operationId": "SystemUpdateArticleDraft",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/SystemArticleDraftUpdateResponse"
}
}
},
"parameters": [
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/SystemArticleDraftUpdateRequest"
}
}
],
"requestBody": {},
"tags": [
"article"
]
}
},
"v1/system/article/draft/search": {
"post": {
"summary": "管理后台草稿列表",
"operationId": "SystemSearchArticleDraft",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/SystemArticleDraftSearchResponse"
}
}
},
"parameters": [
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/SystemArticleDraftSearchRequest"
}
}
],
"requestBody": {},
"tags": [
"article"
]
}
},
"v1/system/article/draft/{id}": {
"get": {
"summary": "管理后台获取草稿",
"operationId": "SystemGetArticleDraft",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/SystemArticleDraftGetResponse"
}
}
},
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"type": "string"
}
],
"requestBody": {},
"tags": [
"article"
]
}
},
"v1/system/article/history": {
"post": {
"summary": "管理后台编辑历史",
... ... @@ -6650,6 +6892,25 @@
"comment"
]
},
"Operator": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": " 人员id"
},
"name": {
"type": "string",
"description": " 人员的名字"
}
},
"title": "Operator",
"required": [
"id",
"name"
]
},
"Position": {
"type": "object",
"properties": {
... ... @@ -7234,39 +7495,884 @@
"list"
]
},
"SystemArticleGetHistoryRequest": {
"SystemArticleCreateRequest": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "id"
},
"": {
"type": "integer",
"format": "int64"
}
"title": {
"type": "string",
"description": "标题"
},
"title": "SystemArticleGetHistoryRequest",
"required": [
"id"
]
"content": {
"type": "string",
"description": "文章的文本内容"
},
"SystemArticleGetHistoryResponse": {
"type": "object",
"properties": {
"id": {
"authorId": {
"type": "integer",
"format": "int64",
"description": " id"
"description": "发布人id"
},
"articleId": {
"type": "integer",
"format": "int64",
"description": " 文章ID"
"images": {
"type": "array",
"items": {
"type": "string"
},
"title": {
"type": "string",
"description": "图片"
},
"video": {
"type": "array",
"items": {
"$ref": "#/definitions/Video"
},
"description": " 视频"
},
"targetUser": {
"type": "integer",
"format": "int32",
"description": " 分发方式 [0分发给所有人、1分发给指定的人]"
},
"whoRead": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
},
"description": "谁可查看"
},
"whoReview": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
},
"description": "谁可评论"
},
"matchUrl": {
"type": "object",
"description": " 匹配文章内容中的url文本"
},
"articleDraftId": {
"type": "integer",
"format": "int64",
"description": " 草稿ID"
},
"AccessToken": {
"type": "string",
"description": " 授权token"
}
},
"title": "SystemArticleCreateRequest",
"required": [
"title",
"content",
"authorId",
"targetUser",
"articleDraftId",
"x-mmm-accesstoken"
]
},
"SystemArticleCreateResponse": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "id"
},
"title": {
"type": "string",
"description": "标题"
},
"content": {
"type": "string",
"description": "文章的文本内容"
},
"authorId": {
"type": "integer",
"format": "int64",
"description": "发布人id"
},
"images": {
"type": "array",
"items": {
"type": "string"
},
"description": "图片"
},
"video": {
"type": "array",
"items": {
"$ref": "#/definitions/Video"
},
"description": " 视频"
},
"targetUser": {
"type": "integer",
"format": "int32",
"description": " 分发方式 [0分发给所有人、1分发给指定的人]"
},
"whoRead": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
},
"description": "谁可查看"
},
"whoReview": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
},
"description": "谁可评论"
},
"matchUrl": {
"type": "object",
"description": " 匹配文章内容中的url文本"
}
},
"title": "SystemArticleCreateResponse",
"required": [
"id",
"title",
"content",
"targetUser",
"matchUrl"
]
},
"SystemArticleDeleteRequest": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "id"
}
},
"title": "SystemArticleDeleteRequest",
"required": [
"id"
]
},
"SystemArticleDeleteResponse": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "id"
},
"title": {
"type": "string",
"description": "标题"
},
"authorId": {
"type": "integer",
"format": "int64",
"description": "发布人id"
}
},
"title": "SystemArticleDeleteResponse",
"required": [
"id",
"title"
]
},
"SystemArticleDeletedRestoreRequest": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "ID"
}
},
"title": "SystemArticleDeletedRestoreRequest",
"required": [
"id"
]
},
"SystemArticleDeletedRestoreResponse": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "ID"
},
"title": {
"type": "string",
"description": "标题"
},
"authorId": {
"type": "integer",
"format": "int64",
"description": "发布人id"
}
},
"title": "SystemArticleDeletedRestoreResponse",
"required": [
"id",
"title",
"authorId"
]
},
"SystemArticleDraftCreateRequest": {
"type": "object",
"properties": {
"title": {
"type": "string",
"description": "标题"
},
"content": {
"type": "string",
"description": "文章的文本内容"
},
"authorId": {
"type": "integer",
"format": "int64",
"description": "发布人id"
},
"images": {
"type": "array",
"items": {
"type": "string"
},
"description": "图片"
},
"video": {
"type": "array",
"items": {
"$ref": "#/definitions/Video"
},
"description": " 视频"
},
"targetUser": {
"type": "integer",
"format": "int32",
"description": " 分发方式 [0分发给所有人、1分发给指定的人]"
},
"whoRead": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
},
"description": "谁可查看"
},
"whoReview": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
},
"description": "谁可评论"
},
"matchUrl": {
"type": "object",
"description": " 匹配文章内容中的url文本"
},
"tags": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
},
"description": " 标签"
},
"AccessToken": {
"type": "string",
"description": " 授权token"
}
},
"title": "SystemArticleDraftCreateRequest",
"required": [
"title",
"content",
"authorId",
"targetUser",
"tags",
"x-mmm-accesstoken"
]
},
"SystemArticleDraftCreateResponse": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "ID"
},
"title": {
"type": "string",
"description": "标题"
},
"content": {
"type": "string",
"description": "文章的文本内容"
},
"authorId": {
"type": "integer",
"format": "int64",
"description": "发布人id"
},
"images": {
"type": "array",
"items": {
"type": "string"
},
"description": "图片"
},
"video": {
"type": "array",
"items": {
"$ref": "#/definitions/Video"
},
"description": " 视频"
},
"targetUser": {
"type": "integer",
"format": "int32",
"description": " 分发方式 [0分发给所有人、1分发给指定的人]"
},
"whoRead": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
},
"description": "谁可查看"
},
"whoReview": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
},
"description": "谁可评论"
},
"matchUrl": {
"type": "object",
"description": " 匹配文章内容中的url文本"
},
"tags": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
},
"description": " 标签"
}
},
"title": "SystemArticleDraftCreateResponse",
"required": [
"id",
"title",
"content",
"authorId",
"targetUser",
"tags"
]
},
"SystemArticleDraftDeleteRequest": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "ID"
}
},
"title": "SystemArticleDraftDeleteRequest",
"required": [
"id"
]
},
"SystemArticleDraftDeleteResponse": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "ID"
},
"title": {
"type": "string",
"description": "标题"
},
"content": {
"type": "string",
"description": "文章的文本内容"
},
"authorId": {
"type": "integer",
"format": "int64",
"description": "发布人id"
},
"images": {
"type": "array",
"items": {
"type": "string"
},
"description": "图片"
},
"video": {
"type": "array",
"items": {
"$ref": "#/definitions/Video"
},
"description": " 视频"
},
"targetUser": {
"type": "integer",
"format": "int32",
"description": " 分发方式 [0分发给所有人、1分发给指定的人]"
},
"whoRead": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
},
"description": "谁可查看"
},
"whoReview": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
},
"description": "谁可评论"
},
"matchUrl": {
"type": "object",
"description": " 匹配文章内容中的url文本"
},
"tags": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
},
"description": " 标签"
}
},
"title": "SystemArticleDraftDeleteResponse",
"required": [
"id",
"title",
"content",
"authorId",
"targetUser",
"tags"
]
},
"SystemArticleDraftGetRequest": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "id"
},
"": {
"type": "integer",
"format": "int64",
"description": "公司ID(前端不传)"
}
},
"title": "SystemArticleDraftGetRequest",
"required": [
"id"
]
},
"SystemArticleDraftGetResponse": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "ID"
},
"title": {
"type": "string",
"description": "标题"
},
"content": {
"type": "string",
"description": "文章的文本内容"
},
"authorId": {
"type": "integer",
"format": "int64",
"description": "发布人id"
},
"images": {
"type": "array",
"items": {
"type": "string"
},
"description": "图片"
},
"video": {
"type": "array",
"items": {
"$ref": "#/definitions/Video"
},
"description": " 视频"
},
"targetUser": {
"type": "integer",
"format": "int32",
"description": " 分发方式 [0分发给所有人、1分发给指定的人]"
},
"whoRead": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
},
"description": "谁可查看"
},
"whoReview": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
},
"description": "谁可评论"
},
"matchUrl": {
"type": "object",
"description": " 匹配文章内容中的url文本"
},
"tags": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
},
"description": " 标签"
}
},
"title": "SystemArticleDraftGetResponse",
"required": [
"id",
"title",
"content",
"authorId",
"targetUser",
"tags"
]
},
"SystemArticleDraftSearch": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "ID"
},
"title": {
"type": "string",
"description": "标题"
},
"images": {
"type": "array",
"items": {
"type": "string"
},
"description": "图片"
},
"operator": {
"type": "string",
"description": "操作人"
},
"authorId": {
"type": "integer",
"format": "int64",
"description": "发布人id"
},
"author": {
"type": "string",
"description": "发布人"
},
"updatedAt": {
"type": "integer",
"format": "int64",
"description": "编辑时间"
}
},
"title": "SystemArticleDraftSearch",
"required": [
"id",
"title",
"images",
"operator",
"authorId",
"author",
"updatedAt"
]
},
"SystemArticleDraftSearchRequest": {
"type": "object",
"properties": {
"page": {
"type": "integer",
"format": "int32",
"description": "页码"
},
"size": {
"type": "integer",
"format": "int32",
"description": "每页行数"
},
"companyId": {
"type": "integer",
"format": "int64",
"description": "公司ID(前端不传)"
},
"title": {
"type": "string",
"description": "标题"
},
"operator": {
"type": "string",
"description": "编辑人"
},
"beginTime": {
"type": "integer",
"format": "int64",
"description": "开始时间"
},
"endTime": {
"type": "integer",
"format": "int64",
"description": "结束时间"
}
},
"title": "SystemArticleDraftSearchRequest",
"required": [
"page",
"size"
]
},
"SystemArticleDraftSearchResponse": {
"type": "object",
"properties": {
"total": {
"type": "integer",
"format": "int32"
},
"list": {
"type": "array",
"items": {
"$ref": "#/definitions/SystemArticleDraftSearch"
}
}
},
"title": "SystemArticleDraftSearchResponse",
"required": [
"total",
"list"
]
},
"SystemArticleDraftUpdateRequest": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": " ID"
},
"title": {
"type": "string",
"description": "标题"
},
"content": {
"type": "string",
"description": "文章的文本内容"
},
"authorId": {
"type": "integer",
"format": "int64",
"description": "发布人id"
},
"images": {
"type": "array",
"items": {
"type": "string"
},
"description": "图片"
},
"video": {
"type": "array",
"items": {
"$ref": "#/definitions/Video"
},
"description": " 视频"
},
"targetUser": {
"type": "integer",
"format": "int32",
"description": " 分发方式 [0分发给所有人、1分发给指定的人]"
},
"whoRead": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
},
"description": "谁可查看"
},
"whoReview": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
},
"description": "谁可评论"
},
"matchUrl": {
"type": "object",
"description": " 匹配文章内容中的url文本"
},
"tags": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
},
"description": " 标签"
},
"AccessToken": {
"type": "string",
"description": " 授权token"
}
},
"title": "SystemArticleDraftUpdateRequest",
"required": [
"id",
"title",
"content",
"authorId",
"targetUser",
"tags",
"x-mmm-accesstoken"
]
},
"SystemArticleDraftUpdateResponse": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "ID"
},
"title": {
"type": "string",
"description": "标题"
},
"content": {
"type": "string",
"description": "文章的文本内容"
},
"authorId": {
"type": "integer",
"format": "int64",
"description": "发布人id"
},
"images": {
"type": "array",
"items": {
"type": "string"
},
"description": "图片"
},
"video": {
"type": "array",
"items": {
"$ref": "#/definitions/Video"
},
"description": " 视频"
},
"targetUser": {
"type": "integer",
"format": "int32",
"description": " 分发方式 [0分发给所有人、1分发给指定的人]"
},
"whoRead": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
},
"description": "谁可查看"
},
"whoReview": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
},
"description": "谁可评论"
},
"matchUrl": {
"type": "object",
"description": " 匹配文章内容中的url文本"
},
"tags": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
},
"description": " 标签"
}
},
"title": "SystemArticleDraftUpdateResponse",
"required": [
"id",
"title",
"content",
"authorId",
"targetUser",
"tags"
]
},
"SystemArticleGetHistoryRequest": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "id"
},
"": {
"type": "integer",
"format": "int64"
}
},
"title": "SystemArticleGetHistoryRequest",
"required": [
"id"
]
},
"SystemArticleGetHistoryResponse": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": " id"
},
"articleId": {
"type": "integer",
"format": "int64",
"description": " 文章ID"
},
"title": {
"type": "string",
"description": " 标题"
},
"createdAt": {
... ... @@ -7677,6 +8783,11 @@
"format": "int64",
"description": "文章的创建日期"
},
"updatedAt": {
"type": "integer",
"format": "int64",
"description": "文章的编辑日期"
},
"countLove": {
"type": "integer",
"format": "int32",
... ... @@ -7703,6 +8814,15 @@
"type": "integer",
"format": "int32",
"description": "分发方式 [0分发给所有人、1分发给指定的人]"
},
"operator": {
"$ref": "#/definitions/Operator",
"description": "运营操作人"
},
"source": {
"type": "integer",
"format": "int32",
"description": "来源[1用户发布、2运营发布]"
}
},
"title": "SystemArticleSearch",
... ... @@ -7713,11 +8833,134 @@
"author",
"images",
"createdAt",
"updatedAt",
"countLove",
"countComment",
"show",
"tags",
"targetUser"
"targetUser",
"operator",
"source"
]
},
"SystemArticleSearchDeletedItem": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "ID"
},
"title": {
"type": "string",
"description": "标题"
},
"images": {
"type": "array",
"items": {
"type": "string"
},
"description": "图片"
},
"authorId": {
"type": "integer",
"format": "int64",
"description": "发布人id"
},
"author": {
"type": "string",
"description": "发布人"
},
"source": {
"type": "integer",
"format": "int32",
"description": "来源 1-用户发布 2-运营发布"
},
"deletedType": {
"type": "integer",
"format": "int32",
"description": "类型 1-运营删除 2-用户删除"
},
"deletedAt": {
"type": "integer",
"format": "int64",
"description": "删除时间"
}
},
"title": "SystemArticleSearchDeletedItem",
"required": [
"id",
"title",
"images",
"authorId",
"author",
"source",
"deletedType",
"deletedAt"
]
},
"SystemArticleSearchDeletedRequest": {
"type": "object",
"properties": {
"page": {
"type": "integer",
"format": "int32",
"description": "页码"
},
"size": {
"type": "integer",
"format": "int32",
"description": "每页行数"
},
"title": {
"type": "string",
"description": "标题"
},
"author": {
"type": "integer",
"format": "int64",
"description": "发布人"
},
"deletedType": {
"type": "integer",
"format": "int32",
"description": "类型 1-运营删除 2-用户删除"
},
"beginTime": {
"type": "integer",
"format": "int64",
"description": "开始时间"
},
"endTime": {
"type": "integer",
"format": "int64",
"description": "结束时间"
}
},
"title": "SystemArticleSearchDeletedRequest",
"required": [
"page",
"size"
]
},
"SystemArticleSearchDeletedResponse": {
"type": "object",
"properties": {
"total": {
"type": "integer",
"format": "int32"
},
"list": {
"type": "array",
"items": {
"$ref": "#/definitions/SystemArticleSearchDeletedItem"
}
}
},
"title": "SystemArticleSearchDeletedResponse",
"required": [
"total",
"list"
]
},
"SystemArticleSearchMeRequest": {
... ...
... ... @@ -121,4 +121,40 @@ service Core {
@doc "管理后台文章恢复"
@handler SystemArticleRestore
post /article/restore (SystemArticleRestoreRequest) returns (SystemArticleRestoreResponse)
@doc "管理后台删除文章"
@handler SystemDeleteArticle
delete /article (SystemArticleDeleteRequest) returns (SystemArticleDeleteResponse)
@doc "管理后台新增文章"
@handler SystemCreateArticle
post /article (SystemArticleCreateRequest) returns (SystemArticleCreateResponse)
@doc "管理后台新增草稿"
@handler SystemCreateArticleDraft
post /article/draft (SystemArticleDraftCreateRequest) returns (SystemArticleDraftCreateResponse)
@doc "管理后台编辑草稿"
@handler SystemUpdateArticleDraft
put /article/draft (SystemArticleDraftUpdateRequest) returns (SystemArticleDraftUpdateResponse)
@doc "管理后台草稿列表"
@handler SystemSearchArticleDraft
post /article/draft/search (SystemArticleDraftSearchRequest) returns (SystemArticleDraftSearchResponse)
@doc "管理后台删除草稿"
@handler SystemDeleteArticleDraft
delete /article/draft (SystemArticleDraftDeleteRequest) returns (SystemArticleDraftDeleteResponse)
@doc "管理后台获取草稿"
@handler SystemGetArticleDraft
get /article/draft/:id (SystemArticleDraftGetRequest) returns (SystemArticleDraftGetResponse)
@doc "管理后台已删除列表"
@handler SystemArticleSearchDeleted
post /article/deleted/list (SystemArticleSearchDeletedRequest) returns (SystemArticleSearchDeletedResponse)
@doc "管理后台文章删除恢复"
@handler SystemRestoreArticleDeleted
put /article/deleted/restore (SystemArticleDeletedRestoreRequest) returns (SystemArticleDeletedRestoreResponse)
}
\ No newline at end of file
... ...
... ... @@ -25,6 +25,11 @@ type ArticleAuthor {
Company string `json:"company"` // 公司
}
type Operator {
Id int64 `json:"id,string"`// 人员id
Name string `json:"name"` // 人员的名字
}
//小程序端创建发布文章
type (
MiniArticleCreateRequest {
... ... @@ -431,11 +436,14 @@ type (
Author string `json:"author"` //发布人
Images []string `json:"images"` //图片
CreatedAt int64 `json:"createdAt"` //文章的创建日期
UpdatedAt int64 `json:"updatedAt"` //文章的编辑日期
CountLove int `json:"countLove"` //点赞数量
CountComment int `json:"countComment"` //评论数量
Show int `json:"show"` //是否隐藏 [0显示、1不显示]
Tags []string `json:"tags"` //标签
TargetUser int `json:"targetUser"` //分发方式 [0分发给所有人、1分发给指定的人]
Operator Operator `json:"operator"` //运营操作人
Source int `json:"source"` //来源[1用户发布、2运营发布]
}
)
// 管理后台编辑文章
... ... @@ -469,6 +477,45 @@ type (
TargetUser int `json:"targetUser"` //分发方式 [0分发给所有人、1分发给指定的人]
}
)
// 管理后台新增文章
type (
SystemArticleCreateRequest {
Title string `json:"title"` //标题
Content string `json:"content"` //文章的文本内容
AuthorId int64 `json:"authorId"` //发布人id
Images []string `json:"images,optional"` //图片
Videos []Video `json:"video,optional"` // 视频
TargetUser int `json:"targetUser"` // 分发方式 [0分发给所有人、1分发给指定的人]
WhoRead []int64 `json:"whoRead,optional"` //谁可查看
WhoReview []int64 `json:"whoReview,optional"` //谁可评论
MatchUrl map[string]string `json:"matchUrl,optional"` // 匹配文章内容中的url文本
ArticleDraftId int64 `json:"articleDraftId"` // 草稿ID
AccessToken string `header:"x-mmm-accesstoken"` // 授权token
}
SystemArticleCreateResponse {
Id int64 `json:"id"` //id
Title string `json:"title"` //标题
Content string `json:"content"` //文章的文本内容
AuthorId int64 `json:"authorId,optional"` //发布人id
Images []string `json:"images,optional"` //图片
Videos []Video `json:"video,optional"` // 视频
TargetUser int `json:"targetUser"` // 分发方式 [0分发给所有人、1分发给指定的人]
WhoRead []int64 `json:"whoRead,optional"` //谁可查看
WhoReview []int64 `json:"whoReview,optional"` //谁可评论
MatchUrl map[string]string `json:"matchUrl"` // 匹配文章内容中的url文本
}
)
//管理后台删除文章
type (
SystemArticleDeleteRequest {
Id int64 `json:"id"` //id
}
SystemArticleDeleteResponse {
Id int64 `json:"id"` //id
Title string `json:"title"` //标题
AuthorId int64 `json:"authorId,optional"` //发布人id
}
)
// 管理后台编辑历史列表
type (
//历史
... ... @@ -579,3 +626,170 @@ type (
MeReadFlag int `json:"meReadFlag"` //已读标识 [0:未读] [1:已读]
}
)
//后台新增文章草稿
type (
SystemArticleDraftCreateRequest {
Title string `json:"title"` //标题
Content string `json:"content"` //文章的文本内容
AuthorId int64 `json:"authorId"` //发布人id
Images []string `json:"images,optional"` //图片
Videos []Video `json:"video,optional"` // 视频
TargetUser int `json:"targetUser"` // 分发方式 [0分发给所有人、1分发给指定的人]
WhoRead []int64 `json:"whoRead,optional"` //谁可查看
WhoReview []int64 `json:"whoReview,optional"` //谁可评论
MatchUrl map[string]string `json:"matchUrl,optional"` // 匹配文章内容中的url文本
Tags []int64 `json:"tags"` // 标签
AccessToken string `header:"x-mmm-accesstoken"` // 授权token
}
SystemArticleDraftCreateResponse {
Id int64 `json:"id"` //ID
Title string `json:"title"` //标题
Content string `json:"content"` //文章的文本内容
AuthorId int64 `json:"authorId"` //发布人id
Images []string `json:"images,optional"` //图片
Videos []Video `json:"video,optional"` // 视频
TargetUser int `json:"targetUser"` // 分发方式 [0分发给所有人、1分发给指定的人]
WhoRead []int64 `json:"whoRead,optional"` //谁可查看
WhoReview []int64 `json:"whoReview,optional"` //谁可评论
MatchUrl map[string]string `json:"matchUrl,optional"` // 匹配文章内容中的url文本
Tags []int64 `json:"tags"` // 标签
}
)
//后台编辑文章草稿
type (
SystemArticleDraftUpdateRequest {
Id int64 `json:"id"` // ID
Title string `json:"title"` //标题
Content string `json:"content"` //文章的文本内容
AuthorId int64 `json:"authorId"` //发布人id
Images []string `json:"images,optional"` //图片
Videos []Video `json:"video,optional"` // 视频
TargetUser int `json:"targetUser"` // 分发方式 [0分发给所有人、1分发给指定的人]
WhoRead []int64 `json:"whoRead,optional"` //谁可查看
WhoReview []int64 `json:"whoReview,optional"` //谁可评论
MatchUrl map[string]string `json:"matchUrl,optional"` // 匹配文章内容中的url文本
Tags []int64 `json:"tags"` // 标签
AccessToken string `header:"x-mmm-accesstoken"` // 授权token
}
SystemArticleDraftUpdateResponse {
Id int64 `json:"id"` //ID
Title string `json:"title"` //标题
Content string `json:"content"` //文章的文本内容
AuthorId int64 `json:"authorId"` //发布人id
Images []string `json:"images,optional"` //图片
Videos []Video `json:"video,optional"` // 视频
TargetUser int `json:"targetUser"` // 分发方式 [0分发给所有人、1分发给指定的人]
WhoRead []int64 `json:"whoRead,optional"` //谁可查看
WhoReview []int64 `json:"whoReview,optional"` //谁可评论
MatchUrl map[string]string `json:"matchUrl,optional"` // 匹配文章内容中的url文本
Tags []int64 `json:"tags"` // 标签
}
)
//管理后台文章草稿列表
type (
SystemArticleDraftSearchRequest {
Page int `json:"page"` //页码
Size int `json:"size"` //每页行数
CompanyId int64 `json:"companyId,optional"` //公司ID(前端不传)
Title string `json:"title,optional"` //标题
Operator string `json:"operator,optional"` //编辑人
BeginTime int64 `json:"beginTime,optional"`//开始时间
EndTime int64 `json:"endTime,optional"` //结束时间
}
SystemArticleDraftSearchResponse {
Total int `json:"total"`
List []SystemArticleDraftSearch `json:"list"`
}
SystemArticleDraftSearch {
Id int64 `json:"id"` //ID
Title string `json:"title"` //标题
Images []string `json:"images"` //图片
Operator string `json:"operator"` //操作人
AuthorId int64 `json:"authorId"` //发布人id
Author string `json:"author"` //发布人
UpdatedAt int64 `json:"updatedAt"` //编辑时间
}
)
//管理后台删除草稿
type (
SystemArticleDraftDeleteRequest {
Id int64 `json:"id"` //ID
}
SystemArticleDraftDeleteResponse {
Id int64 `json:"id"` //ID
Title string `json:"title"` //标题
Content string `json:"content"` //文章的文本内容
AuthorId int64 `json:"authorId"` //发布人id
Images []string `json:"images,optional"` //图片
Videos []Video `json:"video,optional"` // 视频
TargetUser int `json:"targetUser"` // 分发方式 [0分发给所有人、1分发给指定的人]
WhoRead []int64 `json:"whoRead,optional"` //谁可查看
WhoReview []int64 `json:"whoReview,optional"` //谁可评论
MatchUrl map[string]string `json:"matchUrl,optional"` // 匹配文章内容中的url文本
Tags []int64 `json:"tags"` // 标签
}
)
//管理后台获取草稿
type (
SystemArticleDraftGetRequest {
Id int64 `path:"id"` //id
CompanyId int64 `path:",optional"` //公司ID(前端不传)
}
SystemArticleDraftGetResponse {
Id int64 `json:"id"` //ID
Title string `json:"title"` //标题
Content string `json:"content"` //文章的文本内容
AuthorId int64 `json:"authorId"` //发布人id
Images []string `json:"images,optional"` //图片
Videos []Video `json:"video,optional"` // 视频
TargetUser int `json:"targetUser"` // 分发方式 [0分发给所有人、1分发给指定的人]
WhoRead []int64 `json:"whoRead,optional"` //谁可查看
WhoReview []int64 `json:"whoReview,optional"` //谁可评论
MatchUrl map[string]string `json:"matchUrl,optional"` // 匹配文章内容中的url文本
Tags []int64 `json:"tags"` // 标签
}
)
//管理后台已删除列表
type (
SystemArticleSearchDeletedRequest {
Page int `json:"page"` //页码
Size int `json:"size"` //每页行数
Title string `json:"title,optional"` //标题
Author int64 `json:"author,optional"` //发布人
DeletedType int `json:"deletedType,optional"`//类型 1-运营删除 2-用户删除
BeginTime int64 `json:"beginTime,optional"`//开始时间
EndTime int64 `json:"endTime,optional"` //结束时间
}
SystemArticleSearchDeletedResponse {
Total int `json:"total"`
List []SystemArticleSearchDeletedItem `json:"list"`
}
SystemArticleSearchDeletedItem {
Id int64 `json:"id"` //ID
Title string `json:"title"` //标题
Images []string `json:"images"` //图片
AuthorId int64 `json:"authorId"` //发布人id
Author string `json:"author"` //发布人
Source int `json:"source"` //来源 1-用户发布 2-运营发布
DeletedType int `json:"deletedType"` //类型 1-运营删除 2-用户删除
DeletedAt int64 `json:"deletedAt"` //删除时间
}
)
//管理后台已删除文章恢复
type (
SystemArticleDeletedRestoreRequest {
Id int64 `json:"id"` //ID
}
SystemArticleDeletedRestoreResponse {
Id int64 `json:"id"` //ID
Title string `json:"title"` //标题
AuthorId int64 `json:"authorId"` //发布人id
}
)
\ No newline at end of file
... ...
package article
import (
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/article"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
)
func SystemArticleSearchDeletedHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.SystemArticleSearchDeletedRequest
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
l := article.NewSystemArticleSearchDeletedLogic(r.Context(), svcCtx)
resp, err := l.SystemArticleSearchDeleted(&req)
result.HttpResult(r, w, resp, err)
}
}
... ...
package article
import (
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/article"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
)
func SystemCreateArticleDraftHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.SystemArticleDraftCreateRequest
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
l := article.NewSystemCreateArticleDraftLogic(r.Context(), svcCtx)
resp, err := l.SystemCreateArticleDraft(&req)
result.HttpResult(r, w, resp, err)
}
}
... ...
package article
import (
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/article"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
)
func SystemCreateArticleHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.SystemArticleCreateRequest
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
l := article.NewSystemCreateArticleLogic(r.Context(), svcCtx)
resp, err := l.SystemCreateArticle(&req)
result.HttpResult(r, w, resp, err)
}
}
... ...
package article
import (
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/article"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
)
func SystemDeleteArticleDraftHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.SystemArticleDraftDeleteRequest
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
l := article.NewSystemDeleteArticleDraftLogic(r.Context(), svcCtx)
resp, err := l.SystemDeleteArticleDraft(&req)
result.HttpResult(r, w, resp, err)
}
}
... ...
package article
import (
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/article"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
)
func SystemDeleteArticleHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.SystemArticleDeleteRequest
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
l := article.NewSystemDeleteArticleLogic(r.Context(), svcCtx)
resp, err := l.SystemDeleteArticle(&req)
result.HttpResult(r, w, resp, err)
}
}
... ...
package article
import (
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/article"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
)
func SystemGetArticleDraftHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.SystemArticleDraftGetRequest
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
l := article.NewSystemGetArticleDraftLogic(r.Context(), svcCtx)
resp, err := l.SystemGetArticleDraft(&req)
result.HttpResult(r, w, resp, err)
}
}
... ...
package article
import (
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/article"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
)
func SystemRestoreArticleDeletedHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.SystemArticleDeletedRestoreRequest
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
l := article.NewSystemRestoreArticleDeletedLogic(r.Context(), svcCtx)
resp, err := l.SystemRestoreArticleDeleted(&req)
result.HttpResult(r, w, resp, err)
}
}
... ...
package article
import (
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/article"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
)
func SystemSearchArticleDraftHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.SystemArticleDraftSearchRequest
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
userToken := contextdata.GetUserTokenFromCtx(r.Context())
req.CompanyId = userToken.CompanyId
l := article.NewSystemSearchArticleDraftLogic(r.Context(), svcCtx)
resp, err := l.SystemSearchArticleDraft(&req)
result.HttpResult(r, w, resp, err)
}
}
... ...
package article
import (
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/article"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
)
func SystemUpdateArticleDraftHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.SystemArticleDraftUpdateRequest
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
l := article.NewSystemUpdateArticleDraftLogic(r.Context(), svcCtx)
resp, err := l.SystemUpdateArticleDraft(&req)
result.HttpResult(r, w, resp, err)
}
}
... ...
... ... @@ -603,6 +603,51 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
Path: "/article/restore",
Handler: article.SystemArticleRestoreHandler(serverCtx),
},
{
Method: http.MethodDelete,
Path: "/article",
Handler: article.SystemDeleteArticleHandler(serverCtx),
},
{
Method: http.MethodPost,
Path: "/article",
Handler: article.SystemCreateArticleHandler(serverCtx),
},
{
Method: http.MethodPost,
Path: "/article/draft",
Handler: article.SystemCreateArticleDraftHandler(serverCtx),
},
{
Method: http.MethodPut,
Path: "/article/draft",
Handler: article.SystemUpdateArticleDraftHandler(serverCtx),
},
{
Method: http.MethodPost,
Path: "/article/draft/search",
Handler: article.SystemSearchArticleDraftHandler(serverCtx),
},
{
Method: http.MethodDelete,
Path: "/article/draft",
Handler: article.SystemDeleteArticleDraftHandler(serverCtx),
},
{
Method: http.MethodGet,
Path: "/article/draft/:id",
Handler: article.SystemGetArticleDraftHandler(serverCtx),
},
{
Method: http.MethodPost,
Path: "/article/deleted/list",
Handler: article.SystemArticleSearchDeletedHandler(serverCtx),
},
{
Method: http.MethodPut,
Path: "/article/deleted/restore",
Handler: article.SystemRestoreArticleDeletedHandler(serverCtx),
},
}...,
),
rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret),
... ...
package article
import (
"context"
"github.com/samber/lo"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type SystemArticleSearchDeletedLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
conn transaction.Conn
}
func NewSystemArticleSearchDeletedLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemArticleSearchDeletedLogic {
return &SystemArticleSearchDeletedLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
conn: svcCtx.DefaultDBConn(),
}
}
func (l *SystemArticleSearchDeletedLogic) SystemArticleSearchDeleted(req *types.SystemArticleSearchDeletedRequest) (resp *types.SystemArticleSearchDeletedResponse, err error) {
queryOptions := domain.NewQueryOptions().
WithOffsetLimit(req.Page, req.Size).
WithKV("isDel", 1).
WithKV("title", req.Title).
WithKV("authorId", req.Author).
WithKV("beginDeletedAt", req.BeginTime).
WithKV("endDeletedAt", req.EndTime).
WithKV("deletedType", req.DeletedType).
WithKV("orderMode", "deletedAt descending")
userToken := contextdata.GetUserTokenFromCtx(l.ctx)
total, articles, err := l.svcCtx.ArticleRepository.Find(l.ctx, l.conn, userToken.CompanyId, queryOptions)
if err != nil {
return nil, xerr.NewErrMsgErr("搜索已删除列表异常", err)
}
resp = &types.SystemArticleSearchDeletedResponse{
Total: int(total),
List: make([]types.SystemArticleSearchDeletedItem, 0),
}
authorIds := make([]int64, 0)
lo.ForEach(articles, func(item *domain.Article, index int) {
authorIds = append(authorIds, item.AuthorId)
})
//查询用户数据,重新赋值更新用户名称
_, users, _ := l.svcCtx.UserRepository.Find(l.ctx, l.conn, domain.NewQueryOptions().WithFindOnly().WithKV("ids", authorIds))
lo.ForEach(articles, func(item *domain.Article, index int) {
//图片
images := make([]string, 0)
lo.ForEach(item.Images, func(img domain.Image, n int) {
images = append(images, img.Url)
})
//发布人
author := item.Author.Name
for _, user := range users {
if user.Id == item.AuthorId {
author = user.Name
}
}
resp.List = append(resp.List, types.SystemArticleSearchDeletedItem{
Id: item.Id,
Title: item.Title,
Images: images,
AuthorId: item.AuthorId,
Author: author,
Source: item.Source,
DeletedType: item.DeletedType,
DeletedAt: item.DeletedAt,
})
})
return
}
... ...
package article
import (
"context"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/gateway/authlib"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/tool/oss"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
"strconv"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type SystemCreateArticleDraftLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
conn transaction.Conn
}
func NewSystemCreateArticleDraftLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemCreateArticleDraftLogic {
return &SystemCreateArticleDraftLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
conn: svcCtx.DefaultDBConn(),
}
}
func (l *SystemCreateArticleDraftLogic) SystemCreateArticleDraft(req *types.SystemArticleDraftCreateRequest) (resp *types.SystemArticleDraftCreateResponse, err error) {
// 检查发布人
author, err := l.svcCtx.UserRepository.FindOne(l.ctx, l.conn, req.AuthorId)
if err != nil {
return nil, xerr.NewErrMsgErr("创建草稿失败", err)
}
companyInfo, err := l.svcCtx.CompanyRepository.FindOne(l.ctx, l.conn, author.CompanyId)
if err != nil {
return nil, xerr.NewErrMsgErr("创建草稿失败", err)
}
//图片
images, err := getImages(req.Images)
if err != nil {
return nil, xerr.NewErrMsg(err.Error())
}
//视频
videos, err := getVideos(req.Videos)
if err != nil {
return nil, xerr.NewErrMsg(err.Error())
}
userToken := contextdata.GetUserTokenFromCtx(l.ctx)
// 获取当前用户信息
userMe, err := l.svcCtx.ApiAuthService.MeInfo(l.ctx, authlib.RequestUserMeQuery{Token: req.AccessToken})
if err != nil {
return nil, xerr.NewErrMsgErr("获取当前用户信息失败", err)
}
articleDraft := &domain.ArticleDraftOperation{
CompanyId: companyInfo.Id,
AuthorId: req.AuthorId,
Title: req.Title,
Content: req.Content,
Images: images,
Videos: videos,
TargetUser: domain.ArticleTarget(req.TargetUser),
WhoRead: req.WhoRead,
WhoReview: req.WhoReview,
MatchUrl: req.MatchUrl,
Source: domain.ArticleSourceOperator,
Operator: domain.Operator{
Id: userToken.UserId,
Name: userMe.User.NickName,
},
Tags: req.Tags,
}
err = transaction.UseTrans(l.ctx, l.conn.DB(), func(ctx context.Context, conn transaction.Conn) error {
_, err := l.svcCtx.ArticleDraftOperationRepository.Insert(ctx, conn, articleDraft)
if err != nil {
return err
}
return nil
}, true)
resp = &types.SystemArticleDraftCreateResponse{
Id: articleDraft.Id,
Title: articleDraft.Title,
Content: articleDraft.Content,
AuthorId: articleDraft.AuthorId,
Images: req.Images,
Videos: req.Videos,
TargetUser: req.TargetUser,
WhoRead: req.WhoRead,
WhoReview: req.WhoReview,
MatchUrl: req.MatchUrl,
Tags: req.Tags,
}
return
}
// getImages 获取图片信息
func getImages(imgs []string) ([]domain.Image, error) {
// 获取图片的尺寸大小
images := make([]domain.Image, 0)
if len(imgs) <= 0 {
return images, nil
}
for _, val := range imgs {
fInfo, err := oss.GetImageInfo(val)
if err != nil {
return images, xerr.NewErrMsg("获取图片失败")
}
w, _ := strconv.Atoi(fInfo.ImageWidth.Value)
h, _ := strconv.Atoi(fInfo.ImageHeight.Value)
images = append(images, domain.Image{
Url: val,
Width: w,
Height: h,
})
}
return images, nil
}
// getVideos 获取视频信息
func getVideos(list []types.Video) ([]domain.Video, error) {
videos := make([]domain.Video, 0)
if len(list) <= 0 {
return videos, nil
}
if len(list) > 0 {
for _, item := range list {
cover, w, h, err := oss.GetVideoCover(item.Url)
if err != nil {
return videos, xerr.NewErrMsg("获取视频信息失败")
}
videos = append(videos, domain.Video{
Url: item.Url,
Cover: cover,
Width: w,
Height: h,
})
}
}
return videos, nil
}
... ...
package article
import (
"context"
"github.com/pkg/errors"
"github.com/samber/lo"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/gateway/authlib"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/tool/oss"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
"strconv"
"strings"
"unicode/utf8"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type SystemCreateArticleLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
conn transaction.Conn
}
func NewSystemCreateArticleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemCreateArticleLogic {
return &SystemCreateArticleLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
conn: svcCtx.DefaultDBConn(),
}
}
func (l *SystemCreateArticleLogic) SystemCreateArticle(req *types.SystemArticleCreateRequest) (resp *types.SystemArticleCreateResponse, err error) {
err = l.validate(req)
if err != nil {
return nil, xerr.NewErrMsg(err.Error())
}
// 检查发布人
author, err := l.svcCtx.UserRepository.FindOne(l.ctx, l.conn, req.AuthorId)
if err != nil {
return nil, xerr.NewErrMsgErr("创建文章内容失败", err)
}
companyInfo, err := l.svcCtx.CompanyRepository.FindOne(l.ctx, l.conn, author.CompanyId)
if err != nil {
return nil, xerr.NewErrMsgErr("创建文章内容失败", err)
}
//文章作者
articleAuthor := domain.UserSimple{
Id: author.Id,
Name: author.Name,
Avatar: author.Avatar,
Position: author.Position,
Company: companyInfo.Name,
CompanyId: author.CompanyId,
}
//图片
images, err := l.getImages(req)
if err != nil {
return nil, xerr.NewErrMsg(err.Error())
}
//视频
videos, err := l.getVideos(req)
if err != nil {
return nil, xerr.NewErrMsg(err.Error())
}
userToken := contextdata.GetUserTokenFromCtx(l.ctx)
// 获取当前用户信息
userMe, err := l.svcCtx.ApiAuthService.MeInfo(l.ctx, authlib.RequestUserMeQuery{Token: req.AccessToken})
if err != nil {
return nil, xerr.NewErrMsgErr("获取当前用户信息失败", err)
}
article := &domain.Article{
CompanyId: companyInfo.Id,
AuthorId: req.AuthorId,
Author: articleAuthor,
Title: req.Title,
Images: images,
Videos: videos,
WhoRead: make([]int64, 0),
WhoReview: make([]int64, 0),
Location: domain.Location{},
TargetUser: domain.ArticleTarget(req.TargetUser),
Show: domain.ArticleShowEnable,
Tags: make([]int64, 0),
MatchUrl: make(map[string]string),
Source: domain.ArticleSourceOperator,
Operator: domain.Operator{
Id: userToken.UserId,
Name: userMe.User.NickName,
},
}
if len(req.MatchUrl) > 0 {
article.MatchUrl = req.MatchUrl
}
//检查文章可被哪些人查看
whoRead, err := l.validateAndGetWhoRead(req, article)
if err != nil {
return nil, err
}
//检查文章可被哪些人评论
whoReview := []int64{}
if len(req.WhoReview) > 0 {
whoReview = lo.Uniq(req.WhoReview)
}
//验证可评论
if err = l.validateWhoReview(whoRead, whoReview, article); err != nil {
return nil, err
}
article.WhoRead = whoRead
article.WhoReview = whoReview
sections := l.getSections(req, article)
//设置内容摘要
article.SetSummary(sections)
//草稿ID
if req.ArticleDraftId > 0 {
articleDraft, err := l.svcCtx.ArticleDraftOperationRepository.FindOne(l.ctx, l.conn, req.ArticleDraftId)
if err != nil {
return nil, xerr.NewErrMsg("草稿不存在")
}
if articleDraft.CompanyId != userToken.CompanyId {
return nil, xerr.NewErrMsg("您没有权限")
}
}
//保存数据
err = transaction.UseTrans(l.ctx, l.conn.DB(), func(ctx context.Context, conn transaction.Conn) error {
_, err = l.svcCtx.ArticleRepository.Insert(ctx, conn, article)
if err != nil {
return xerr.NewErrMsgErr("创建文章失败", err)
}
for i := range sections {
sections[i].ArticleId = article.Id
_, err = l.svcCtx.ArticleSectionRepository.Insert(ctx, conn, sections[i])
if err != nil {
return xerr.NewErrMsgErr("创建文章内容失败", err)
}
}
// 生成 备份数据
var backupData domain.ArticleBackup
backupData.MakeBackup(articleAuthor, article, sections, "原始版本")
_, err = l.svcCtx.ArticleBackupRepository.Insert(l.ctx, conn, &backupData)
if err != nil {
return xerr.NewErrMsgErr("创建文章失败", err)
}
//删除草稿
if req.ArticleDraftId > 0 {
_, err = l.svcCtx.ArticleDraftOperationRepository.Delete(l.ctx, conn, &domain.ArticleDraftOperation{Id: req.ArticleDraftId})
if err != nil {
return xerr.NewErrMsg("删除草稿失败")
}
}
return nil
}, true)
if err != nil {
return nil, xerr.NewErrMsgErr("创建文章失败", err)
}
resp = &types.SystemArticleCreateResponse{
Id: article.Id,
Title: article.Title,
Content: req.Content,
AuthorId: req.AuthorId,
Images: req.Images,
Videos: req.Videos,
TargetUser: req.TargetUser,
WhoRead: whoRead,
WhoReview: whoReview,
}
return
}
// validate 验证
func (l *SystemCreateArticleLogic) validate(req *types.SystemArticleCreateRequest) error {
//文章标题
if utf8.RuneCountInString(req.Title) > 64 {
return errors.New("标题最多只能输入64字")
}
//文章内容
if utf8.RuneCountInString(req.Content) > 1000 {
return errors.New("内容最多只能输入1000字")
}
//图片
if len(req.Images) > 9 {
return errors.New("图片数量最多9张")
}
return nil
}
// getImages 获取图片信息
func (l *SystemCreateArticleLogic) getImages(req *types.SystemArticleCreateRequest) ([]domain.Image, error) {
// 获取图片的尺寸大小
images := make([]domain.Image, 0)
for _, val := range req.Images {
fInfo, err := oss.GetImageInfo(val)
if err != nil {
return images, xerr.NewErrMsg("获取图片失败")
}
w, _ := strconv.Atoi(fInfo.ImageWidth.Value)
h, _ := strconv.Atoi(fInfo.ImageHeight.Value)
images = append(images, domain.Image{
Url: val,
Width: w,
Height: h,
})
}
return images, nil
}
// getVideo 获取视频信息
func (l *SystemCreateArticleLogic) getVideos(req *types.SystemArticleCreateRequest) ([]domain.Video, error) {
videos := make([]domain.Video, 0)
if len(req.Videos) > 0 {
for _, item := range req.Videos {
cover, w, h, err := oss.GetVideoCover(item.Url)
if err != nil {
return videos, xerr.NewErrMsg("获取视频信息失败")
}
videos = append(videos, domain.Video{
Url: item.Url,
Cover: cover,
Width: w,
Height: h,
})
}
}
return videos, nil
}
// validateAndGetWhoRead 验证并获取可阅读
func (l *SystemCreateArticleLogic) validateAndGetWhoRead(req *types.SystemArticleCreateRequest, article *domain.Article) ([]int64, error) {
whoRead := make([]int64, 0)
if len(req.WhoRead) > 0 {
whoRead = lo.Uniq(req.WhoRead)
var u *domain.User
var err error
for _, val := range whoRead {
u, err = l.svcCtx.UserRepository.FindOne(l.ctx, l.conn, val)
if err != nil {
return whoRead, xerr.NewErrMsgErr("文章可查看人设置错误", err)
}
if u.CompanyId != article.CompanyId {
return whoRead, xerr.NewErrMsg("文章可查看人设置错误")
}
}
}
return whoRead, nil
}
// validateWhoReview 验证可评论
func (l *SystemCreateArticleLogic) validateWhoReview(whoRead []int64, whoReview []int64, article *domain.Article) error {
//有指定可查看人的情况
if len(whoRead) > 0 {
if len(whoReview) > 0 {
// 检查 whoRead 是否 完全包含 whoReview
ok := lo.Every(whoRead, whoReview)
if !ok {
return xerr.NewErrMsg("文章可评论人设置错误")
}
}
if len(whoReview) == 0 {
//有指定可查看人 ,但未指定可评论人
return xerr.NewErrMsg("文章可评论人设置错误")
}
}
//没有指定可查看人的情况
if len(whoRead) == 0 {
if len(whoReview) > 0 {
// 未指定可查看人(全员可看),有指定可评论人,
var u *domain.User
var err error
for _, val := range whoReview {
u, err = l.svcCtx.UserRepository.FindOne(l.ctx, l.conn, val)
if err != nil {
return xerr.NewErrMsgErr("文章可评论人设置错误", err)
}
if u.CompanyId != article.CompanyId {
return xerr.NewErrMsg("文章可评论人设置错误")
}
}
}
}
return nil
}
// getSections 文章内容
func (l *SystemCreateArticleLogic) getSections(req *types.SystemArticleCreateRequest, article *domain.Article) []*domain.ArticleSection {
articleSections := make([]*domain.ArticleSection, 0)
sortBy := 1
sections := strings.Split(req.Content, "\n")
lo.ForEach(sections, func(item string, index int) {
section := domain.ArticleSection{
CompanyId: article.CompanyId,
Version: article.Version,
ArticleId: article.Id,
Content: item,
SortBy: sortBy,
}
articleSections = append(articleSections, &section)
sortBy++
})
return articleSections
}
... ...
package article
import (
"context"
"github.com/samber/lo"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type SystemDeleteArticleDraftLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
conn transaction.Conn
}
func NewSystemDeleteArticleDraftLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemDeleteArticleDraftLogic {
return &SystemDeleteArticleDraftLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
conn: svcCtx.DefaultDBConn(),
}
}
func (l *SystemDeleteArticleDraftLogic) SystemDeleteArticleDraft(req *types.SystemArticleDraftDeleteRequest) (resp *types.SystemArticleDraftDeleteResponse, err error) {
// 草稿数据
articleDraft, err := l.svcCtx.ArticleDraftOperationRepository.FindOne(l.ctx, l.conn, req.Id)
if err != nil {
return nil, xerr.NewErrMsg("草稿不存在")
}
//操作人
userToken := contextdata.GetUserTokenFromCtx(l.ctx)
if userToken.CompanyId != articleDraft.CompanyId {
return nil, xerr.NewErrMsg("您没有权限删除")
}
_, err = l.svcCtx.ArticleDraftOperationRepository.Delete(l.ctx, l.conn, articleDraft)
if err != nil {
return nil, xerr.NewErrMsg("删除草稿失败")
}
//图片
images := make([]string, 0)
lo.ForEach(articleDraft.Images, func(img domain.Image, n int) {
images = append(images, img.Url)
})
//视频
videos := make([]types.Video, 0)
lo.ForEach(articleDraft.Videos, func(video domain.Video, n int) {
videos = append(videos, types.Video{
Url: video.Url,
Cover: video.Cover,
Width: video.Width,
Height: video.Height,
})
})
resp = &types.SystemArticleDraftDeleteResponse{
Id: articleDraft.Id,
Title: articleDraft.Title,
Content: articleDraft.Content,
AuthorId: articleDraft.AuthorId,
Images: images,
Videos: videos,
TargetUser: int(articleDraft.TargetUser),
WhoRead: articleDraft.WhoRead,
WhoReview: articleDraft.WhoReview,
MatchUrl: articleDraft.MatchUrl,
Tags: articleDraft.Tags,
}
return
}
... ...
package article
import (
"context"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type SystemDeleteArticleLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
conn transaction.Conn
}
func NewSystemDeleteArticleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemDeleteArticleLogic {
return &SystemDeleteArticleLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
conn: svcCtx.DefaultDBConn(),
}
}
func (l *SystemDeleteArticleLogic) SystemDeleteArticle(req *types.SystemArticleDeleteRequest) (resp *types.SystemArticleDeleteResponse, err error) {
// 文章数据
article, err := l.svcCtx.ArticleRepository.FindOne(l.ctx, l.conn, req.Id)
if err != nil {
return nil, xerr.NewErrMsgErr("帖子不存在", err)
}
userToken := contextdata.GetUserTokenFromCtx(l.ctx)
if userToken.CompanyId != article.CompanyId {
return nil, xerr.NewErrMsg("您没有权限")
}
article.DeletedType = domain.ArticleDeletedTypeOperator
err = transaction.UseTrans(l.ctx, l.conn.DB(), func(ctx context.Context, conn transaction.Conn) error {
//更新删除类型
_, err = l.svcCtx.ArticleRepository.Update(l.ctx, conn, article)
if err != nil {
return err
}
_, err = l.svcCtx.ArticleRepository.Delete(l.ctx, l.conn, article)
if err != nil {
return err
}
return nil
}, true)
if err != nil {
return nil, xerr.NewErrMsgErr("删除失败", err)
}
resp = &types.SystemArticleDeleteResponse{
Id: article.Id,
Title: article.Title,
AuthorId: article.AuthorId,
}
return
}
... ...
package article
import (
"context"
"github.com/samber/lo"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type SystemGetArticleDraftLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
conn transaction.Conn
}
func NewSystemGetArticleDraftLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemGetArticleDraftLogic {
return &SystemGetArticleDraftLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
conn: svcCtx.DefaultDBConn(),
}
}
func (l *SystemGetArticleDraftLogic) SystemGetArticleDraft(req *types.SystemArticleDraftGetRequest) (resp *types.SystemArticleDraftGetResponse, err error) {
// 草稿数据
articleDraft, err := l.svcCtx.ArticleDraftOperationRepository.FindOne(l.ctx, l.conn, req.Id)
if err != nil {
return nil, xerr.NewErrMsg("草稿不存在")
}
//操作人
userToken := contextdata.GetUserTokenFromCtx(l.ctx)
//不同公司不能获取数据
if userToken.CompanyId != articleDraft.CompanyId {
return nil, xerr.NewErrMsg("您没有权限查看该数据")
}
//图片
images := make([]string, 0)
lo.ForEach(articleDraft.Images, func(img domain.Image, n int) {
images = append(images, img.Url)
})
//视频
videos := make([]types.Video, 0)
lo.ForEach(articleDraft.Videos, func(video domain.Video, n int) {
videos = append(videos, types.Video{
Url: video.Url,
Cover: video.Cover,
Width: video.Width,
Height: video.Height,
})
})
resp = &types.SystemArticleDraftGetResponse{
Id: articleDraft.Id,
Title: articleDraft.Title,
Content: articleDraft.Content,
AuthorId: articleDraft.AuthorId,
Images: images,
Videos: videos,
TargetUser: int(articleDraft.TargetUser),
WhoRead: articleDraft.WhoRead,
WhoReview: articleDraft.WhoReview,
MatchUrl: articleDraft.MatchUrl,
Tags: articleDraft.Tags,
}
return
}
... ...
package article
import (
"context"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type SystemRestoreArticleDeletedLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
conn transaction.Conn
}
func NewSystemRestoreArticleDeletedLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemRestoreArticleDeletedLogic {
return &SystemRestoreArticleDeletedLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
conn: svcCtx.DefaultDBConn(),
}
}
func (l *SystemRestoreArticleDeletedLogic) SystemRestoreArticleDeleted(req *types.SystemArticleDeletedRestoreRequest) (resp *types.SystemArticleDeletedRestoreResponse, err error) {
// 文章数据
article, err := l.svcCtx.ArticleRepository.FindOneWithUnscoped(l.ctx, l.conn, req.Id)
if err != nil {
return nil, xerr.NewErrMsgErr("帖子不存在", err)
}
_, err = l.svcCtx.ArticleRepository.Restore(l.ctx, l.conn, article)
if err != nil {
return nil, xerr.NewErrMsg("恢复帖子失败")
}
resp = &types.SystemArticleDeletedRestoreResponse{
Id: article.Id,
Title: article.Title,
AuthorId: article.AuthorId,
}
return
}
... ...
package article
import (
"context"
"github.com/samber/lo"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type SystemSearchArticleDraftLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
conn transaction.Conn
}
func NewSystemSearchArticleDraftLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemSearchArticleDraftLogic {
return &SystemSearchArticleDraftLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
conn: svcCtx.DefaultDBConn(),
}
}
func (l *SystemSearchArticleDraftLogic) SystemSearchArticleDraft(req *types.SystemArticleDraftSearchRequest) (resp *types.SystemArticleDraftSearchResponse, err error) {
queryOptions := domain.NewQueryOptions().
WithOffsetLimit(req.Page, req.Size).
WithKV("companyId", req.CompanyId).
WithKV("title", req.Title).
WithKV("operator", req.Operator).
WithKV("beginTime", req.BeginTime).
WithKV("endTime", req.EndTime)
total, articleDrafts, err := l.svcCtx.ArticleDraftOperationRepository.Find(l.ctx, l.conn, queryOptions)
if err != nil {
return nil, xerr.NewErrMsgErr("搜索草稿异常", err)
}
resp = &types.SystemArticleDraftSearchResponse{
Total: int(total),
List: make([]types.SystemArticleDraftSearch, 0),
}
authorIds := make([]int64, 0)
lo.ForEach(articleDrafts, func(item *domain.ArticleDraftOperation, index int) {
authorIds = append(authorIds, item.AuthorId)
})
//查询用户数据,重新赋值更新用户名称
_, users, _ := l.svcCtx.UserRepository.Find(l.ctx, l.conn, domain.NewQueryOptions().WithFindOnly().WithKV("ids", authorIds))
lo.ForEach(articleDrafts, func(item *domain.ArticleDraftOperation, index int) {
//图片
images := make([]string, 0)
lo.ForEach(item.Images, func(img domain.Image, n int) {
images = append(images, img.Url)
})
//发布人
author := ""
for _, user := range users {
if user.Id == item.AuthorId {
author = user.Name
}
}
resp.List = append(resp.List, types.SystemArticleDraftSearch{
Id: item.Id,
Title: item.Title,
Images: images,
Operator: item.Operator.Name,
AuthorId: item.AuthorId,
Author: author,
UpdatedAt: item.UpdatedAt,
})
})
return
}
... ...
... ... @@ -82,11 +82,17 @@ func (l *SystemSearchArticleLogic) SystemSearchArticle(req *types.SystemArticleS
Author: author,
Images: images,
CreatedAt: item.CreatedAt,
UpdatedAt: item.UpdatedAt,
CountLove: item.CountLove,
CountComment: item.CountComment,
Show: int(item.Show),
Tags: articleTags,
TargetUser: int(item.TargetUser),
Source: item.Source,
Operator: types.Operator{
Id: item.Operator.Id,
Name: item.Operator.Name,
},
})
})
return
... ...
package article
import (
"context"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/gateway/authlib"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type SystemUpdateArticleDraftLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
conn transaction.Conn
}
func NewSystemUpdateArticleDraftLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemUpdateArticleDraftLogic {
return &SystemUpdateArticleDraftLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
conn: svcCtx.DefaultDBConn(),
}
}
func (l *SystemUpdateArticleDraftLogic) SystemUpdateArticleDraft(req *types.SystemArticleDraftUpdateRequest) (resp *types.SystemArticleDraftUpdateResponse, err error) {
// 草稿数据
articleDraft, err := l.svcCtx.ArticleDraftOperationRepository.FindOne(l.ctx, l.conn, req.Id)
if err != nil {
return nil, xerr.NewErrMsgErr("草稿不存在", err)
}
articleDraft.Title = req.Title
articleDraft.Content = req.Content
articleDraft.AuthorId = req.AuthorId
articleDraft.TargetUser = domain.ArticleTarget(req.TargetUser)
articleDraft.WhoRead = req.WhoRead
articleDraft.WhoReview = req.WhoReview
articleDraft.Tags = req.Tags
articleDraft.Source = domain.ArticleSourceOperator
articleDraft.MatchUrl = req.MatchUrl
//图片
images, err := getImages(req.Images)
if err != nil {
return nil, xerr.NewErrMsg(err.Error())
}
articleDraft.Images = images
//视频
videos, err := getVideos(req.Videos)
if err != nil {
return nil, xerr.NewErrMsg(err.Error())
}
articleDraft.Videos = videos
//操作人
userToken := contextdata.GetUserTokenFromCtx(l.ctx)
// 获取当前用户信息
userMe, err := l.svcCtx.ApiAuthService.MeInfo(l.ctx, authlib.RequestUserMeQuery{Token: req.AccessToken})
if err != nil {
return nil, xerr.NewErrMsgErr("获取当前用户信息失败", err)
}
articleDraft.Operator = domain.Operator{
Id: userToken.UserId,
Name: userMe.User.NickName,
}
err = transaction.UseTrans(l.ctx, l.conn.DB(), func(ctx context.Context, conn transaction.Conn) error {
_, err := l.svcCtx.ArticleDraftOperationRepository.Update(ctx, conn, articleDraft)
if err != nil {
return err
}
return nil
}, true)
if err != nil {
return nil, xerr.NewErrMsg("保存草稿失败")
}
resp = &types.SystemArticleDraftUpdateResponse{
Id: articleDraft.Id,
Title: articleDraft.Title,
Content: articleDraft.Content,
AuthorId: articleDraft.AuthorId,
Images: req.Images,
Videos: req.Videos,
TargetUser: int(articleDraft.TargetUser),
WhoRead: articleDraft.WhoRead,
WhoReview: articleDraft.WhoReview,
MatchUrl: articleDraft.MatchUrl,
Tags: articleDraft.Tags,
}
return
}
... ...
... ... @@ -35,6 +35,7 @@ type ServiceContext struct {
ArticleTagRepository domain.ArticleTagRepository
ArticleCategoryRepository domain.ArticleCategoryRepository
ArticleAndTagRepository domain.ArticleAndTagRepository
ArticleDraftOperationRepository domain.ArticleDraftOperationRepository
CompanyRepository domain.CompanyRepository
DepartmentRepository domain.DepartmentRepository
... ... @@ -99,7 +100,6 @@ func NewServiceContext(c config.Config) *ServiceContext {
UserRepository: repository.NewUserRepository(cache.NewCachedRepository(mlCache)),
UserReadArticleRepository: repository.NewUserReadArticleRepository(cache.NewCachedRepository(mlCache)),
ArticleTagRepository: repository.NewArticleTagRepository(cache.NewCachedRepository(mlCache)),
ArticleCategoryRepository: repository.NewArticleCategoryRepository(cache.NewCachedRepository(mlCache)),
UserRoleRepository: repository.NewUserRoleRepository(cache.NewCachedRepository(mlCache)),
}
}
... ...
... ... @@ -906,6 +906,11 @@ type ArticleAuthor struct {
Company string `json:"company"` // 公司
}
type Operator struct {
Id int64 `json:"id,string"` // 人员id
Name string `json:"name"` // 人员的名字
}
type MiniArticleCreateRequest struct {
Title string `json:"title"` //标题
Section []string `json:"section"` //文章的文本内容
... ... @@ -1274,11 +1279,14 @@ type SystemArticleSearch struct {
Author string `json:"author"` //发布人
Images []string `json:"images"` //图片
CreatedAt int64 `json:"createdAt"` //文章的创建日期
UpdatedAt int64 `json:"updatedAt"` //文章的编辑日期
CountLove int `json:"countLove"` //点赞数量
CountComment int `json:"countComment"` //评论数量
Show int `json:"show"` //是否隐藏 [0显示、1不显示]
Tags []string `json:"tags"` //标签
TargetUser int `json:"targetUser"` //分发方式 [0分发给所有人、1分发给指定的人]
Operator Operator `json:"operator"` //运营操作人
Source int `json:"source"` //来源[1用户发布、2运营发布]
}
type SystemArticleUpdateRequest struct {
... ... @@ -1310,6 +1318,43 @@ type SystemArticleUpdateResponse struct {
TargetUser int `json:"targetUser"` //分发方式 [0分发给所有人、1分发给指定的人]
}
type SystemArticleCreateRequest struct {
Title string `json:"title"` //标题
Content string `json:"content"` //文章的文本内容
AuthorId int64 `json:"authorId"` //发布人id
Images []string `json:"images,optional"` //图片
Videos []Video `json:"video,optional"` // 视频
TargetUser int `json:"targetUser"` // 分发方式 [0分发给所有人、1分发给指定的人]
WhoRead []int64 `json:"whoRead,optional"` //谁可查看
WhoReview []int64 `json:"whoReview,optional"` //谁可评论
MatchUrl map[string]string `json:"matchUrl,optional"` // 匹配文章内容中的url文本
ArticleDraftId int64 `json:"articleDraftId"` // 草稿ID
AccessToken string `header:"x-mmm-accesstoken"` // 授权token
}
type SystemArticleCreateResponse struct {
Id int64 `json:"id"` //id
Title string `json:"title"` //标题
Content string `json:"content"` //文章的文本内容
AuthorId int64 `json:"authorId,optional"` //发布人id
Images []string `json:"images,optional"` //图片
Videos []Video `json:"video,optional"` // 视频
TargetUser int `json:"targetUser"` // 分发方式 [0分发给所有人、1分发给指定的人]
WhoRead []int64 `json:"whoRead,optional"` //谁可查看
WhoReview []int64 `json:"whoReview,optional"` //谁可评论
MatchUrl map[string]string `json:"matchUrl"` // 匹配文章内容中的url文本
}
type SystemArticleDeleteRequest struct {
Id int64 `json:"id"` //id
}
type SystemArticleDeleteResponse struct {
Id int64 `json:"id"` //id
Title string `json:"title"` //标题
AuthorId int64 `json:"authorId,optional"` //发布人id
}
type SystemArticleHistoryRequest struct {
ArticleId int64 `json:"articleId"` //文章ID
Author string `json:"author,optional"` //发布人
... ... @@ -1412,6 +1457,161 @@ type MiniSearchArticleItem struct {
MeReadFlag int `json:"meReadFlag"` //已读标识 [0:未读] [1:已读]
}
type SystemArticleDraftCreateRequest struct {
Title string `json:"title"` //标题
Content string `json:"content"` //文章的文本内容
AuthorId int64 `json:"authorId"` //发布人id
Images []string `json:"images,optional"` //图片
Videos []Video `json:"video,optional"` // 视频
TargetUser int `json:"targetUser"` // 分发方式 [0分发给所有人、1分发给指定的人]
WhoRead []int64 `json:"whoRead,optional"` //谁可查看
WhoReview []int64 `json:"whoReview,optional"` //谁可评论
MatchUrl map[string]string `json:"matchUrl,optional"` // 匹配文章内容中的url文本
Tags []int64 `json:"tags"` // 标签
AccessToken string `header:"x-mmm-accesstoken"` // 授权token
}
type SystemArticleDraftCreateResponse struct {
Id int64 `json:"id"` //ID
Title string `json:"title"` //标题
Content string `json:"content"` //文章的文本内容
AuthorId int64 `json:"authorId"` //发布人id
Images []string `json:"images,optional"` //图片
Videos []Video `json:"video,optional"` // 视频
TargetUser int `json:"targetUser"` // 分发方式 [0分发给所有人、1分发给指定的人]
WhoRead []int64 `json:"whoRead,optional"` //谁可查看
WhoReview []int64 `json:"whoReview,optional"` //谁可评论
MatchUrl map[string]string `json:"matchUrl,optional"` // 匹配文章内容中的url文本
Tags []int64 `json:"tags"` // 标签
}
type SystemArticleDraftUpdateRequest struct {
Id int64 `json:"id"` // ID
Title string `json:"title"` //标题
Content string `json:"content"` //文章的文本内容
AuthorId int64 `json:"authorId"` //发布人id
Images []string `json:"images,optional"` //图片
Videos []Video `json:"video,optional"` // 视频
TargetUser int `json:"targetUser"` // 分发方式 [0分发给所有人、1分发给指定的人]
WhoRead []int64 `json:"whoRead,optional"` //谁可查看
WhoReview []int64 `json:"whoReview,optional"` //谁可评论
MatchUrl map[string]string `json:"matchUrl,optional"` // 匹配文章内容中的url文本
Tags []int64 `json:"tags"` // 标签
AccessToken string `header:"x-mmm-accesstoken"` // 授权token
}
type SystemArticleDraftUpdateResponse struct {
Id int64 `json:"id"` //ID
Title string `json:"title"` //标题
Content string `json:"content"` //文章的文本内容
AuthorId int64 `json:"authorId"` //发布人id
Images []string `json:"images,optional"` //图片
Videos []Video `json:"video,optional"` // 视频
TargetUser int `json:"targetUser"` // 分发方式 [0分发给所有人、1分发给指定的人]
WhoRead []int64 `json:"whoRead,optional"` //谁可查看
WhoReview []int64 `json:"whoReview,optional"` //谁可评论
MatchUrl map[string]string `json:"matchUrl,optional"` // 匹配文章内容中的url文本
Tags []int64 `json:"tags"` // 标签
}
type SystemArticleDraftSearchRequest struct {
Page int `json:"page"` //页码
Size int `json:"size"` //每页行数
CompanyId int64 `json:"companyId,optional"` //公司ID(前端不传)
Title string `json:"title,optional"` //标题
Operator string `json:"operator,optional"` //编辑人
BeginTime int64 `json:"beginTime,optional"` //开始时间
EndTime int64 `json:"endTime,optional"` //结束时间
}
type SystemArticleDraftSearchResponse struct {
Total int `json:"total"`
List []SystemArticleDraftSearch `json:"list"`
}
type SystemArticleDraftSearch struct {
Id int64 `json:"id"` //ID
Title string `json:"title"` //标题
Images []string `json:"images"` //图片
Operator string `json:"operator"` //操作人
AuthorId int64 `json:"authorId"` //发布人id
Author string `json:"author"` //发布人
UpdatedAt int64 `json:"updatedAt"` //编辑时间
}
type SystemArticleDraftDeleteRequest struct {
Id int64 `json:"id"` //ID
}
type SystemArticleDraftDeleteResponse struct {
Id int64 `json:"id"` //ID
Title string `json:"title"` //标题
Content string `json:"content"` //文章的文本内容
AuthorId int64 `json:"authorId"` //发布人id
Images []string `json:"images,optional"` //图片
Videos []Video `json:"video,optional"` // 视频
TargetUser int `json:"targetUser"` // 分发方式 [0分发给所有人、1分发给指定的人]
WhoRead []int64 `json:"whoRead,optional"` //谁可查看
WhoReview []int64 `json:"whoReview,optional"` //谁可评论
MatchUrl map[string]string `json:"matchUrl,optional"` // 匹配文章内容中的url文本
Tags []int64 `json:"tags"` // 标签
}
type SystemArticleDraftGetRequest struct {
Id int64 `path:"id"` //id
CompanyId int64 `path:",optional"` //公司ID(前端不传)
}
type SystemArticleDraftGetResponse struct {
Id int64 `json:"id"` //ID
Title string `json:"title"` //标题
Content string `json:"content"` //文章的文本内容
AuthorId int64 `json:"authorId"` //发布人id
Images []string `json:"images,optional"` //图片
Videos []Video `json:"video,optional"` // 视频
TargetUser int `json:"targetUser"` // 分发方式 [0分发给所有人、1分发给指定的人]
WhoRead []int64 `json:"whoRead,optional"` //谁可查看
WhoReview []int64 `json:"whoReview,optional"` //谁可评论
MatchUrl map[string]string `json:"matchUrl,optional"` // 匹配文章内容中的url文本
Tags []int64 `json:"tags"` // 标签
}
type SystemArticleSearchDeletedRequest struct {
Page int `json:"page"` //页码
Size int `json:"size"` //每页行数
Title string `json:"title,optional"` //标题
Author int64 `json:"author,optional"` //发布人
DeletedType int `json:"deletedType,optional"` //类型 1-运营删除 2-用户删除
BeginTime int64 `json:"beginTime,optional"` //开始时间
EndTime int64 `json:"endTime,optional"` //结束时间
}
type SystemArticleSearchDeletedResponse struct {
Total int `json:"total"`
List []SystemArticleSearchDeletedItem `json:"list"`
}
type SystemArticleSearchDeletedItem struct {
Id int64 `json:"id"` //ID
Title string `json:"title"` //标题
Images []string `json:"images"` //图片
AuthorId int64 `json:"authorId"` //发布人id
Author string `json:"author"` //发布人
Source int `json:"source"` //来源 1-用户发布 2-运营发布
DeletedType int `json:"deletedType"` //类型 1-运营删除 2-用户删除
DeletedAt int64 `json:"deletedAt"` //删除时间
}
type SystemArticleDeletedRestoreRequest struct {
Id int64 `json:"id"` //ID
}
type SystemArticleDeletedRestoreResponse struct {
Id int64 `json:"id"` //ID
Title string `json:"title"` //标题
AuthorId int64 `json:"authorId"` //发布人id
}
type RoleGetRequest struct {
Id int64 `path:"id"`
}
... ...
syntax = "v1"
info(
title: "xx实例"
desc: "xx实例"
author: "author"
email: "email"
version: "v1"
)
@server(
prefix: article_draft_operation/v1
group: article_draft_operation
jwt: JwtAuth
)
service Core {
@handler getArticleDraftOperation
post /article_draft_operation/:id (ArticleDraftOperationGetRequest) returns (ArticleDraftOperationGetResponse)
@handler saveArticleDraftOperation
post /article_draft_operation (ArticleDraftOperationSaveRequest) returns (ArticleDraftOperationSaveResponse)
@handler deleteArticleDraftOperation
delete /article_draft_operation/:id (ArticleDraftOperationDeleteRequest) returns (ArticleDraftOperationDeleteResponse)
@handler updateArticleDraftOperation
put /article_draft_operation/:id (ArticleDraftOperationUpdateRequest) returns (ArticleDraftOperationUpdateResponse)
@handler searchArticleDraftOperation
post /article_draft_operation/search (ArticleDraftOperationSearchRequest) returns (ArticleDraftOperationSearchResponse)
}
type (
ArticleDraftOperationGetRequest {
Id int64 `path:"id"`
}
ArticleDraftOperationGetResponse struct{
ArticleDraftOperation ArticleDraftOperationItem `json:"article_draft_operation"`
}
ArticleDraftOperationSaveRequest struct{
ArticleDraftOperation ArticleDraftOperationItem `json:"article_draft_operation"`
}
ArticleDraftOperationSaveResponse struct{}
ArticleDraftOperationDeleteRequest struct{
Id int64 `path:"id"`
}
ArticleDraftOperationDeleteResponse struct{}
ArticleDraftOperationUpdateRequest struct{
Id int64 `path:"id"`
ArticleDraftOperation ArticleDraftOperationItem `json:"article_draft_operation"`
}
ArticleDraftOperationUpdateResponse struct{}
ArticleDraftOperationSearchRequest struct{
Page int `json:"page"`
Size int `json:"size"`
}
ArticleDraftOperationSearchResponse{
List []ArticleDraftOperationItem `json:"list"`
Total int64 `json:"total"`
}
ArticleDraftOperationItem struct{
}
)
... ...
syntax = "proto3";
option go_package ="./pb";
package pb;
message ArticleDraftOperationGetReq {
int64 Id = 1;
}
message ArticleDraftOperationGetResp{
ArticleDraftOperationItem User = 1;
}
message ArticleDraftOperationSaveReq {
}
message ArticleDraftOperationSaveResp{
}
message ArticleDraftOperationDeleteReq {
int64 Id = 1;
}
message ArticleDraftOperationDeleteResp{
}
message ArticleDraftOperationUpdateReq {
int64 Id = 1;
}
message ArticleDraftOperationUpdateResp{
}
message ArticleDraftOperationSearchReq {
int64 PageNumber = 1;
int64 PageSize = 2;
}
message ArticleDraftOperationSearchResp{
repeated ArticleDraftOperationItem List =1;
int64 Total =2;
}
message ArticleDraftOperationItem {
}
service ArticleDraftOperationService {
rpc ArticleDraftOperationGet(ArticleDraftOperationGetReq) returns(ArticleDraftOperationGetResp);
rpc ArticleDraftOperationSave(ArticleDraftOperationSaveReq) returns(ArticleDraftOperationSaveResp);
rpc ArticleDraftOperationDelete(ArticleDraftOperationDeleteReq) returns(ArticleDraftOperationDeleteResp);
rpc ArticleDraftOperationUpdate(ArticleDraftOperationUpdateReq) returns(ArticleDraftOperationUpdateResp);
rpc ArticleDraftOperationSearch(ArticleDraftOperationSearchReq) returns(ArticleDraftOperationSearchResp);
}
... ...
... ... @@ -24,6 +24,7 @@ func Migrate(db *gorm.DB) {
//&models.MessageBusiness{},
//&models.Department{},
//&models.ArticleAndTag{},
&models.ArticleDraftOperation{},
&models.ArticleCategory{},
}
... ...
... ... @@ -2,11 +2,10 @@ package models
import (
"fmt"
"time"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
"gorm.io/gorm"
"gorm.io/plugin/soft_delete"
"time"
)
type Article struct {
... ... @@ -33,6 +32,9 @@ type Article struct {
Show int // 评论的展示状态(1显示、2不显示)
Summary string // 内容概要
MatchUrl map[string]string `gorm:"type:jsonb;serializer:json"` // 匹配文章内容中的url文本
Source int `gorm:"default:1"` // 来源 1-用户发布 2-运营发布
Operator domain.Operator `gorm:"type:jsonb;serializer:json"` // 运营操作人
DeletedType int `json:"deletedType"` // 删除类型 1-运营删除 2-用户删除
}
func (m *Article) TableName() string {
... ...
package models
import (
"fmt"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
"gorm.io/gorm"
"gorm.io/plugin/soft_delete"
"time"
)
// ArticleDraftOperation 运营草稿
type ArticleDraftOperation struct {
Id int64 `gorm:"primaryKey"` // 唯一标识
CompanyId int64 `gorm:"comment:公司ID"` // 公司ID
AuthorId int64 `gorm:"comment:发布人ID"` // 发布人
Title string `gorm:"comment:标题"` // 文章标题
Content string `json:"content"` // 文章内容
Images []domain.Image `gorm:"type:jsonb;serializer:json"` // 图片
Videos []domain.Video `gorm:"type:jsonb;serializer:json"` // 视频
TargetUser domain.ArticleTarget `gorm:"comment:分发方式 0所有人 1指定人"` // 分发方式 0 分发给所有人 1 分发给指定的人
WhoRead []int64 `gorm:"type:jsonb;serializer:json"` // 谁可以看
WhoReview []int64 `gorm:"type:jsonb;serializer:json"` // 评论人
Tags []int64 `gorm:"type:jsonb;serializer:json"` //定性标签
MatchUrl map[string]string `gorm:"type:jsonb;serializer:json"` // 匹配文章内容中的url文本
Source int `gorm:"default:1"` // 来源 1-用户发布 2-运营发布
Operator domain.Operator `gorm:"type:jsonb;serializer:json"` // 运营操作人
Version int `gorm:"comment:版本号"` // 版本号
CreatedAt int64 `gorm:"comment:创建时间"` // 创建时间
UpdatedAt int64 `gorm:"comment:编辑时间"` // 编辑时间
IsDel soft_delete.DeletedAt `gorm:"softDelete:flag,DeletedAtField:DeletedAt"` // 删除标记
DeletedAt int64 `gorm:"comment:删除时间"` // 删除时间
}
func (m *ArticleDraftOperation) TableName() string {
return "article_draft_operation"
}
func (m *ArticleDraftOperation) BeforeCreate(tx *gorm.DB) (err error) {
nowTime := time.Now().Unix()
m.CreatedAt = nowTime
m.UpdatedAt = nowTime
return
}
func (m *ArticleDraftOperation) BeforeUpdate(tx *gorm.DB) (err error) {
m.UpdatedAt = time.Now().Unix()
m.Version += 1
return
}
func (m *ArticleDraftOperation) CacheKeyFunc() string {
if m.Id == 0 {
return ""
}
return fmt.Sprintf("%v:cache:%v:id:%v", domain.ProjectName, m.TableName(), m.Id)
}
func (m *ArticleDraftOperation) CacheKeyFuncByObject(obj interface{}) string {
if v, ok := obj.(*ArticleDraftOperation); ok {
return v.CacheKeyFunc()
}
return ""
}
func (m *ArticleDraftOperation) CachePrimaryKeyFunc() string {
if len("") == 0 {
return ""
}
return fmt.Sprintf("%v:cache:%v:primarykey:%v", domain.ProjectName, m.TableName(), "key")
}
... ...
package repository
import (
"context"
"github.com/jinzhu/copier"
"github.com/pkg/errors"
"github.com/tiptok/gocomm/pkg/cache"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/models"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
"gorm.io/gorm"
)
type ArticleDraftOperationRepository struct {
*cache.CachedRepository
}
func (repository *ArticleDraftOperationRepository) Insert(ctx context.Context, conn transaction.Conn, dm *domain.ArticleDraftOperation) (*domain.ArticleDraftOperation, error) {
var (
err error
m = &models.ArticleDraftOperation{}
tx = conn.DB()
)
if m, err = repository.DomainModelToModel(dm); err != nil {
return nil, err
}
if tx = tx.Model(m).Save(m); tx.Error != nil {
return nil, tx.Error
}
dm.Id = m.Id
return repository.ModelToDomainModel(m)
}
func (repository *ArticleDraftOperationRepository) Update(ctx context.Context, conn transaction.Conn, dm *domain.ArticleDraftOperation) (*domain.ArticleDraftOperation, error) {
var (
err error
m *models.ArticleDraftOperation
tx = conn.DB()
)
if m, err = repository.DomainModelToModel(dm); err != nil {
return nil, err
}
queryFunc := func() (interface{}, error) {
tx = tx.Model(m).Updates(m)
return nil, tx.Error
}
if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
return nil, err
}
return repository.ModelToDomainModel(m)
}
func (repository *ArticleDraftOperationRepository) UpdateWithVersion(ctx context.Context, transaction transaction.Conn, dm *domain.ArticleDraftOperation) (*domain.ArticleDraftOperation, error) {
var (
err error
m *models.ArticleDraftOperation
tx = transaction.DB()
)
if m, err = repository.DomainModelToModel(dm); err != nil {
return nil, err
}
oldVersion := dm.Version
m.Version += 1
queryFunc := func() (interface{}, error) {
tx = tx.Model(m).Select("*").Where("id = ?", m.Id).Where("version = ?", oldVersion).Updates(m)
if tx.RowsAffected == 0 {
return nil, domain.ErrUpdateFail
}
return nil, tx.Error
}
if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
return nil, err
}
return repository.ModelToDomainModel(m)
}
func (repository *ArticleDraftOperationRepository) Delete(ctx context.Context, conn transaction.Conn, dm *domain.ArticleDraftOperation) (*domain.ArticleDraftOperation, error) {
var (
tx = conn.DB()
m = &models.ArticleDraftOperation{Id: dm.Identify().(int64)}
)
queryFunc := func() (interface{}, error) {
tx = tx.Where("id = ?", m.Id).Delete(m)
return m, tx.Error
}
if _, err := repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
return dm, err
}
return repository.ModelToDomainModel(m)
}
func (repository *ArticleDraftOperationRepository) FindOne(ctx context.Context, conn transaction.Conn, id int64) (*domain.ArticleDraftOperation, error) {
var (
err error
tx = conn.DB()
m = new(models.ArticleDraftOperation)
)
queryFunc := func() (interface{}, error) {
tx = tx.Model(m).Where("id = ?", id).First(m)
if errors.Is(tx.Error, gorm.ErrRecordNotFound) {
return nil, domain.ErrNotFound
}
return m, tx.Error
}
cacheModel := new(models.ArticleDraftOperation)
cacheModel.Id = id
if err = repository.QueryCache(cacheModel.CacheKeyFunc, m, queryFunc); err != nil {
return nil, err
}
return repository.ModelToDomainModel(m)
}
func (repository *ArticleDraftOperationRepository) Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*domain.ArticleDraftOperation, error) {
var (
tx = conn.DB()
ms []*models.ArticleDraftOperation
dms = make([]*domain.ArticleDraftOperation, 0)
total int64
)
queryFunc := func() (interface{}, error) {
tx = tx.Model(&ms).Order("updated_at desc")
//标题
if v, ok := queryOptions["title"]; ok {
tx = tx.Where("title like ?", "%"+v.(string)+"%")
}
//公司ID
if v, ok := queryOptions["companyId"]; ok {
tx = tx.Where("company_id = ?", v)
}
//最近修改时间
if v, ok := queryOptions["beginTime"]; ok {
tx = tx.Where("updated_at >= ?", v)
}
if v, ok := queryOptions["endTime"]; ok {
tx = tx.Where("updated_at <= ?", v)
}
//操作人
if v, ok := queryOptions["operator"]; ok {
tx = tx.Where(`"operator" ->> 'name' like ?`, "%"+v.(string)+"%")
}
if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
return dms, tx.Error
}
return dms, nil
}
if _, err := repository.Query(queryFunc); err != nil {
return 0, nil, err
}
for _, item := range ms {
if dm, err := repository.ModelToDomainModel(item); err != nil {
return 0, dms, err
} else {
dms = append(dms, dm)
}
}
return total, dms, nil
}
func (repository *ArticleDraftOperationRepository) ModelToDomainModel(from *models.ArticleDraftOperation) (*domain.ArticleDraftOperation, error) {
to := &domain.ArticleDraftOperation{}
err := copier.Copy(to, from)
return to, err
}
func (repository *ArticleDraftOperationRepository) DomainModelToModel(from *domain.ArticleDraftOperation) (*models.ArticleDraftOperation, error) {
to := &models.ArticleDraftOperation{}
err := copier.Copy(to, from)
return to, err
}
func NewArticleDraftOperationRepository(cache *cache.CachedRepository) domain.ArticleDraftOperationRepository {
return &ArticleDraftOperationRepository{CachedRepository: cache}
}
... ...
... ... @@ -3,6 +3,7 @@ package repository
import (
"context"
"fmt"
"gorm.io/plugin/soft_delete"
"strings"
"github.com/pkg/errors"
... ... @@ -53,6 +54,28 @@ func (repository *ArticleRepository) Update(ctx context.Context, conn transactio
return repository.ModelToDomainModel(m)
}
func (repository *ArticleRepository) Restore(ctx context.Context, conn transaction.Conn, dm *domain.Article) (*domain.Article, error) {
var (
err error
m *models.Article
tx = conn.DB()
)
if m, err = repository.DomainModelToModel(dm); err != nil {
return nil, err
}
m.DeletedAt = 0
m.IsDel = soft_delete.DeletedAt(soft_delete.FlagActived)
m.DeletedType = 0
queryFunc := func() (interface{}, error) {
tx = tx.Model(m).Unscoped().Select("*").Updates(m)
return nil, tx.Error
}
if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
return nil, err
}
return repository.ModelToDomainModel(m)
}
func (repository *ArticleRepository) UpdateWithVersion(ctx context.Context, transaction transaction.Conn, dm *domain.Article) (*domain.Article, error) {
var (
err error
... ... @@ -113,6 +136,27 @@ func (repository *ArticleRepository) FindOne(ctx context.Context, conn transacti
return repository.ModelToDomainModel(m)
}
func (repository *ArticleRepository) FindOneWithUnscoped(ctx context.Context, conn transaction.Conn, id int64) (*domain.Article, error) {
var (
err error
tx = conn.DB()
m = new(models.Article)
)
queryFunc := func() (interface{}, error) {
tx = tx.Model(m).Unscoped().Where("id = ?", id).First(m)
if errors.Is(tx.Error, gorm.ErrRecordNotFound) {
return nil, domain.ErrNotFound
}
return m, tx.Error
}
cacheModel := new(models.Article)
cacheModel.Id = id
if err = repository.QueryCache(cacheModel.CacheKeyFunc, m, queryFunc); err != nil {
return nil, err
}
return repository.ModelToDomainModel(m)
}
func (repository *ArticleRepository) Find(ctx context.Context, conn transaction.Conn, companyId int64, queryOptions map[string]interface{}) (int64, []*domain.Article, error) {
var (
tx = conn.DB()
... ... @@ -133,6 +177,8 @@ func (repository *ArticleRepository) Find(ctx context.Context, conn transaction.
tx = tx.Order("count_love asc")
case "countLove descending":
tx = tx.Order("count_love desc")
case "deletedAt descending":
tx = tx.Order("deleted_at desc")
default:
tx = tx.Order("created_at desc")
}
... ... @@ -154,6 +200,20 @@ func (repository *ArticleRepository) Find(ctx context.Context, conn transaction.
if v, ok := queryOptions["authorId"]; ok {
tx = tx.Where("author_id=?", v)
}
if v, ok := queryOptions["deletedType"]; ok {
tx = tx.Where("deleted_type = ?", v)
}
//删除
if v, ok := queryOptions["isDel"]; ok {
tx = tx.Unscoped().Where("is_del = ?", v)
}
//删除时间
if v, ok := queryOptions["beginDeletedAt"]; ok {
tx = tx.Where("deleted_at >= ?", v)
}
if v, ok := queryOptions["endDeletedAt"]; ok {
tx = tx.Where("deleted_at < ?", v)
}
if v, ok := queryOptions["tags"]; ok && len(v.([]int64)) > 0 {
values := make([]string, 0)
for _, item := range v.([]int64) {
... ... @@ -384,6 +444,9 @@ func (repository *ArticleRepository) ModelToDomainModel(from *models.Article) (*
Summary: from.Summary,
MatchUrl: from.MatchUrl,
Videos: from.Videos,
Source: from.Source,
Operator: from.Operator,
DeletedType: from.DeletedType,
}
return to, nil
}
... ... @@ -413,6 +476,9 @@ func (repository *ArticleRepository) DomainModelToModel(from *domain.Article) (*
Summary: from.Summary,
MatchUrl: from.MatchUrl,
Videos: from.Videos,
Source: from.Source,
Operator: from.Operator,
DeletedType: from.DeletedType,
}
// err := copier.Copy(to, from)
return to, nil
... ...
... ... @@ -31,6 +31,9 @@ type Article struct {
Tags []int64 `json:"tags"` // 定性标签
Summary string `json:"summary"` // 内容概要
MatchUrl map[string]string `json:"matchUrl"` // 匹配文章内容中的url文本
Source int `gorm:"default:1"` // 来源 1-用户发布 2-运营发布
Operator Operator `gorm:"type:jsonb;serializer:json"` // 运营操作人
DeletedType int `json:"deletedType"` // 删除类型 1-运营删除 2-用户删除
// ...more
}
... ... @@ -38,8 +41,10 @@ type ArticleRepository interface {
Insert(ctx context.Context, conn transaction.Conn, dm *Article) (*Article, error)
Update(ctx context.Context, conn transaction.Conn, dm *Article) (*Article, error)
Delete(ctx context.Context, conn transaction.Conn, dm *Article) (*Article, error)
Restore(ctx context.Context, conn transaction.Conn, dm *Article) (*Article, error)
UpdateWithVersion(ctx context.Context, conn transaction.Conn, dm *Article) (*Article, error)
FindOne(ctx context.Context, conn transaction.Conn, id int64) (*Article, error)
FindOneWithUnscoped(ctx context.Context, conn transaction.Conn, id int64) (*Article, error)
Find(ctx context.Context, conn transaction.Conn, companyId int64, queryOptions map[string]interface{}) (int64, []*Article, error)
FindAuthorsLatestFirstArticle(ctx context.Context, conn transaction.Conn, companyId int64, authors []int64, whoRead int64, limit int) (int64, []*Article, error)
FindAuthorsLatestFirstUnreadArticle(ctx context.Context, conn transaction.Conn, companyId int64, authors []int64, whoRead int64, limit int) (int64, []*Article, error)
... ... @@ -65,6 +70,12 @@ type ArticleTarget int
const (
ArticleTargetAll ArticleTarget = 0 //内容分发给所有人
ArticleTargetLimit ArticleTarget = 1 //分发给指定的人
ArticleSourceUser int = 1 //文章来源 用户发布
ArticleSourceOperator int = 2 //文章来源 运营发布
ArticleDeletedTypeOperator int = 1 // 文章删除类型 运营删除
ArticleDeletedTypeUser int = 2 // 文章删除类型 用户删除
)
func (a ArticleTarget) Named() string {
... ...
package domain
import (
"context"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
"gorm.io/plugin/soft_delete"
)
// ArticleDraftOperation 运营草稿
type ArticleDraftOperation struct {
Id int64 `json:"id"` // 唯一标识
CompanyId int64 `json:"companyId,string"` // 公司ID
AuthorId int64 `json:"authorId"` // 发布人
Title string `json:"title"` // 文章标题
Content string `json:"content"` // 文章内容
Images []Image `json:"images"` // 图片
Videos []Video `json:"videos"` // 视频
TargetUser ArticleTarget `json:"targetUser"` // 分发方式 0 分发给所有人 1 分发给指定的人
WhoRead []int64 `json:"whoRead"` // 谁可以看
WhoReview []int64 `json:"whoReview"` // 评论人
Tags []int64 `json:"tags"` //定性标签
MatchUrl map[string]string `json:"matchUrl"` // 匹配文章内容中的url文本
Source int `json:"source"` // 来源 1-用户发布 2-运营发布
Operator Operator `json:"operator"` // 运营操作人
Version int `json:"version,omitempty"` // 版本号
CreatedAt int64 `json:"createdAt,omitempty"` // 创建时间
UpdatedAt int64 `json:"updatedAt,omitempty"` // 编辑时间
IsDel soft_delete.DeletedAt `json:"isDel,omitempty"` // 删除标记
DeletedAt int64 `json:"deletedAt,omitempty"` // 删除时间
}
type ArticleDraftOperationRepository interface {
Insert(ctx context.Context, conn transaction.Conn, dm *ArticleDraftOperation) (*ArticleDraftOperation, error)
Update(ctx context.Context, conn transaction.Conn, dm *ArticleDraftOperation) (*ArticleDraftOperation, error)
UpdateWithVersion(ctx context.Context, conn transaction.Conn, dm *ArticleDraftOperation) (*ArticleDraftOperation, error)
Delete(ctx context.Context, conn transaction.Conn, dm *ArticleDraftOperation) (*ArticleDraftOperation, error)
FindOne(ctx context.Context, conn transaction.Conn, id int64) (*ArticleDraftOperation, error)
Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*ArticleDraftOperation, error)
}
func (m *ArticleDraftOperation) Identify() interface{} {
if m.Id == 0 {
return nil
}
return m.Id
}
... ...
... ... @@ -45,10 +45,8 @@ type UserSimple struct {
CompanyId int64 `json:"companyId"`
}
// 记录数据的操作人
// type Operator struct {
// From string `json:"from"` // 操作来源
// Id int `json:"id"` // 人员id
// Name string `json:"name"` // 人员名字
// UpdatedAt int64 `json:"updatedAt"` // 时间
// }
// 运营操作人
type Operator struct {
Id int64 `json:"id,string"` // 人员id
Name string `json:"name"` // 人员名字
}
... ...
... ... @@ -28,6 +28,11 @@ CREATE TABLE `user_follow` (
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
CREATE TABLE `article_draft_operation` (
`id` int(0) NOT NULL COMMENT '唯一标识',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
CREATE TABLE `article_category` (
`id` int(0) NOT NULL COMMENT '唯一标识',
PRIMARY KEY (`id`) USING BTREE
... ...