作者 yangfu

feat: 内容模板

正在显示 54 个修改的文件 包含 3176 行增加167 行删除
@@ -11,4 +11,5 @@ import "core/article.api" @@ -11,4 +11,5 @@ import "core/article.api"
11 import "core/role.api" 11 import "core/role.api"
12 import "core/department.api" 12 import "core/department.api"
13 import "core/article_category.api" 13 import "core/article_category.api"
14 -import "core/article_security.api"  
  14 +import "core/article_security.api"
  15 +import "core/article_template.api"
@@ -789,6 +789,184 @@ @@ -789,6 +789,184 @@
789 ] 789 ]
790 } 790 }
791 }, 791 },
  792 + "v1/mini/article_template": {
  793 + "post": {
  794 + "summary": "模板管理-保存",
  795 + "operationId": "miniArticleTemplateSave",
  796 + "responses": {
  797 + "200": {
  798 + "description": "A successful response.",
  799 + "schema": {
  800 + "$ref": "#/definitions/ArticleTemplateSaveResponse"
  801 + }
  802 + }
  803 + },
  804 + "parameters": [
  805 + {
  806 + "name": "body",
  807 + "in": "body",
  808 + "required": true,
  809 + "schema": {
  810 + "$ref": "#/definitions/ArticleTemplateSaveRequest"
  811 + }
  812 + }
  813 + ],
  814 + "requestBody": {},
  815 + "tags": [
  816 + "template"
  817 + ]
  818 + }
  819 + },
  820 + "v1/mini/article_template/search": {
  821 + "post": {
  822 + "summary": "模板搜索",
  823 + "operationId": "miniArticleTemplateSearch",
  824 + "responses": {
  825 + "200": {
  826 + "description": "A successful response.",
  827 + "schema": {
  828 + "$ref": "#/definitions/ArticleTemplateSearchResponse"
  829 + }
  830 + }
  831 + },
  832 + "parameters": [
  833 + {
  834 + "name": "body",
  835 + "in": "body",
  836 + "required": true,
  837 + "schema": {
  838 + "$ref": "#/definitions/ArticleTemplateSearchRequest"
  839 + }
  840 + }
  841 + ],
  842 + "requestBody": {},
  843 + "tags": [
  844 + "template"
  845 + ]
  846 + }
  847 + },
  848 + "v1/mini/article_template/search-mine": {
  849 + "post": {
  850 + "summary": "我的模板搜索",
  851 + "operationId": "miniArticleTemplateSearchMine",
  852 + "responses": {
  853 + "200": {
  854 + "description": "A successful response.",
  855 + "schema": {
  856 + "$ref": "#/definitions/ArticleTemplateSearchResponse"
  857 + }
  858 + }
  859 + },
  860 + "parameters": [
  861 + {
  862 + "name": "body",
  863 + "in": "body",
  864 + "required": true,
  865 + "schema": {
  866 + "$ref": "#/definitions/ArticleTemplateSearchRequest"
  867 + }
  868 + }
  869 + ],
  870 + "requestBody": {},
  871 + "tags": [
  872 + "template"
  873 + ]
  874 + }
  875 + },
  876 + "v1/mini/article_template/{id}": {
  877 + "delete": {
  878 + "summary": "模板管理-删除",
  879 + "operationId": "miniArticleTemplateDelete",
  880 + "responses": {
  881 + "200": {
  882 + "description": "A successful response.",
  883 + "schema": {
  884 + "$ref": "#/definitions/ArticleTemplateDeleteResponse"
  885 + }
  886 + }
  887 + },
  888 + "parameters": [
  889 + {
  890 + "name": "id",
  891 + "in": "path",
  892 + "required": true,
  893 + "type": "string"
  894 + },
  895 + {
  896 + "name": "body",
  897 + "in": "body",
  898 + "required": true,
  899 + "schema": {
  900 + "$ref": "#/definitions/ArticleTemplateDeleteRequest"
  901 + }
  902 + }
  903 + ],
  904 + "requestBody": {},
  905 + "tags": [
  906 + "template"
  907 + ]
  908 + },
  909 + "put": {
  910 + "summary": "模板管理-更新",
  911 + "operationId": "miniArticleTemplateUpdate",
  912 + "responses": {
  913 + "200": {
  914 + "description": "A successful response.",
  915 + "schema": {
  916 + "$ref": "#/definitions/ArticleTemplateUpdateResponse"
  917 + }
  918 + }
  919 + },
  920 + "parameters": [
  921 + {
  922 + "name": "id",
  923 + "in": "path",
  924 + "required": true,
  925 + "type": "string"
  926 + },
  927 + {
  928 + "name": "body",
  929 + "in": "body",
  930 + "required": true,
  931 + "schema": {
  932 + "$ref": "#/definitions/ArticleTemplateUpdateRequest"
  933 + }
  934 + }
  935 + ],
  936 + "requestBody": {},
  937 + "tags": [
  938 + "template"
  939 + ]
  940 + }
  941 + },
  942 + "v1/mini/article_template_class/search": {
  943 + "post": {
  944 + "summary": "模板分类搜索",
  945 + "operationId": "miniArticleTemplateClassSearch",
  946 + "responses": {
  947 + "200": {
  948 + "description": "A successful response.",
  949 + "schema": {
  950 + "$ref": "#/definitions/ArticleTemplateClassSearchResponse"
  951 + }
  952 + }
  953 + },
  954 + "parameters": [
  955 + {
  956 + "name": "body",
  957 + "in": "body",
  958 + "required": true,
  959 + "schema": {
  960 + "$ref": "#/definitions/ArticleTemplateClassSearchRequest"
  961 + }
  962 + }
  963 + ],
  964 + "requestBody": {},
  965 + "tags": [
  966 + "template"
  967 + ]
  968 + }
  969 + },
792 "v1/mini/company/search": { 970 "v1/mini/company/search": {
793 "post": { 971 "post": {
794 "summary": "公司搜索(公开的)", 972 "summary": "公司搜索(公开的)",
@@ -2968,6 +3146,208 @@ @@ -2968,6 +3146,208 @@
2968 ] 3146 ]
2969 } 3147 }
2970 }, 3148 },
  3149 + "v1/system/article_template": {
  3150 + "post": {
  3151 + "summary": "模板管理-保存",
  3152 + "operationId": "systemArticleTemplateSave",
  3153 + "responses": {
  3154 + "200": {
  3155 + "description": "A successful response.",
  3156 + "schema": {
  3157 + "$ref": "#/definitions/ArticleTemplateSaveResponse"
  3158 + }
  3159 + }
  3160 + },
  3161 + "parameters": [
  3162 + {
  3163 + "name": "body",
  3164 + "in": "body",
  3165 + "required": true,
  3166 + "schema": {
  3167 + "$ref": "#/definitions/ArticleTemplateSaveRequest"
  3168 + }
  3169 + }
  3170 + ],
  3171 + "requestBody": {},
  3172 + "tags": [
  3173 + "template"
  3174 + ]
  3175 + }
  3176 + },
  3177 + "v1/system/article_template/batch_delete": {
  3178 + "delete": {
  3179 + "summary": "模板管理-批量删除",
  3180 + "operationId": "systemArticleTemplateBatchDelete",
  3181 + "responses": {
  3182 + "200": {
  3183 + "description": "A successful response.",
  3184 + "schema": {
  3185 + "$ref": "#/definitions/ArticleTemplateBatchResponse"
  3186 + }
  3187 + }
  3188 + },
  3189 + "parameters": [
  3190 + {
  3191 + "name": "body",
  3192 + "in": "body",
  3193 + "required": true,
  3194 + "schema": {
  3195 + "$ref": "#/definitions/ArticleTemplateBatchDeleteRequest"
  3196 + }
  3197 + }
  3198 + ],
  3199 + "requestBody": {},
  3200 + "tags": [
  3201 + "template"
  3202 + ]
  3203 + }
  3204 + },
  3205 + "v1/system/article_template/search": {
  3206 + "post": {
  3207 + "summary": "模板管理-搜索",
  3208 + "operationId": "systemArticleTemplateSearch",
  3209 + "responses": {
  3210 + "200": {
  3211 + "description": "A successful response.",
  3212 + "schema": {
  3213 + "$ref": "#/definitions/ArticleTemplateSearchResponse"
  3214 + }
  3215 + }
  3216 + },
  3217 + "parameters": [
  3218 + {
  3219 + "name": "body",
  3220 + "in": "body",
  3221 + "required": true,
  3222 + "schema": {
  3223 + "$ref": "#/definitions/ArticleTemplateSearchRequest"
  3224 + }
  3225 + }
  3226 + ],
  3227 + "requestBody": {},
  3228 + "tags": [
  3229 + "template"
  3230 + ]
  3231 + }
  3232 + },
  3233 + "v1/system/article_template/{id}": {
  3234 + "get": {
  3235 + "summary": "模板管理-详情",
  3236 + "operationId": "systemArticleTemplateGet",
  3237 + "responses": {
  3238 + "200": {
  3239 + "description": "A successful response.",
  3240 + "schema": {
  3241 + "$ref": "#/definitions/ArticleTemplateGetResponse"
  3242 + }
  3243 + }
  3244 + },
  3245 + "parameters": [
  3246 + {
  3247 + "name": "id",
  3248 + "in": "path",
  3249 + "required": true,
  3250 + "type": "string"
  3251 + }
  3252 + ],
  3253 + "requestBody": {},
  3254 + "tags": [
  3255 + "template"
  3256 + ]
  3257 + },
  3258 + "delete": {
  3259 + "summary": "模板管理-删除",
  3260 + "operationId": "systemArticleTemplateDelete",
  3261 + "responses": {
  3262 + "200": {
  3263 + "description": "A successful response.",
  3264 + "schema": {
  3265 + "$ref": "#/definitions/ArticleTemplateDeleteResponse"
  3266 + }
  3267 + }
  3268 + },
  3269 + "parameters": [
  3270 + {
  3271 + "name": "id",
  3272 + "in": "path",
  3273 + "required": true,
  3274 + "type": "string"
  3275 + },
  3276 + {
  3277 + "name": "body",
  3278 + "in": "body",
  3279 + "required": true,
  3280 + "schema": {
  3281 + "$ref": "#/definitions/ArticleTemplateDeleteRequest"
  3282 + }
  3283 + }
  3284 + ],
  3285 + "requestBody": {},
  3286 + "tags": [
  3287 + "template"
  3288 + ]
  3289 + },
  3290 + "put": {
  3291 + "summary": "模板管理-更新",
  3292 + "operationId": "systemArticleTemplateUpdate",
  3293 + "responses": {
  3294 + "200": {
  3295 + "description": "A successful response.",
  3296 + "schema": {
  3297 + "$ref": "#/definitions/ArticleTemplateUpdateResponse"
  3298 + }
  3299 + }
  3300 + },
  3301 + "parameters": [
  3302 + {
  3303 + "name": "id",
  3304 + "in": "path",
  3305 + "required": true,
  3306 + "type": "string"
  3307 + },
  3308 + {
  3309 + "name": "body",
  3310 + "in": "body",
  3311 + "required": true,
  3312 + "schema": {
  3313 + "$ref": "#/definitions/ArticleTemplateUpdateRequest"
  3314 + }
  3315 + }
  3316 + ],
  3317 + "requestBody": {},
  3318 + "tags": [
  3319 + "template"
  3320 + ]
  3321 + }
  3322 + },
  3323 + "v1/system/article_template_class/search": {
  3324 + "post": {
  3325 + "summary": "模板管理-分类搜索",
  3326 + "operationId": "systemArticleTemplateClassSearch",
  3327 + "responses": {
  3328 + "200": {
  3329 + "description": "A successful response.",
  3330 + "schema": {
  3331 + "$ref": "#/definitions/ArticleTemplateClassSearchResponse"
  3332 + }
  3333 + }
  3334 + },
  3335 + "parameters": [
  3336 + {
  3337 + "name": "body",
  3338 + "in": "body",
  3339 + "required": true,
  3340 + "schema": {
  3341 + "$ref": "#/definitions/ArticleTemplateClassSearchRequest"
  3342 + }
  3343 + }
  3344 + ],
  3345 + "requestBody": {},
  3346 + "tags": [
  3347 + "template"
  3348 + ]
  3349 + }
  3350 + },
2971 "v1/system/company/positions/search": { 3351 "v1/system/company/positions/search": {
2972 "post": { 3352 "post": {
2973 "summary": "公司职位搜索", 3353 "summary": "公司职位搜索",
@@ -4094,7 +4474,8 @@ @@ -4094,7 +4474,8 @@
4094 "description": " 发布人" 4474 "description": " 发布人"
4095 }, 4475 },
4096 "releaseAt": { 4476 "releaseAt": {
4097 - "type": "string", 4477 + "type": "integer",
  4478 + "format": "int64",
4098 "description": " 发布时间" 4479 "description": " 发布时间"
4099 }, 4480 },
4100 "reviewStatus": { 4481 "reviewStatus": {
@@ -4162,35 +4543,207 @@ @@ -4162,35 +4543,207 @@
4162 }, 4543 },
4163 "authorName": { 4544 "authorName": {
4164 "type": "string", 4545 "type": "string",
4165 - "description": " 作者名称"  
4166 - },  
4167 - "beginTime": { 4546 + "description": " 作者名称"
  4547 + },
  4548 + "beginTime": {
  4549 + "type": "integer",
  4550 + "format": "int64",
  4551 + "description": " 开始时间"
  4552 + },
  4553 + "endTime": {
  4554 + "type": "integer",
  4555 + "format": "int64",
  4556 + "description": " 结束时间"
  4557 + }
  4558 + },
  4559 + "title": "ArticleSecuritySearchRequest",
  4560 + "required": [
  4561 + "suggest",
  4562 + "contentType",
  4563 + "authorName",
  4564 + "beginTime",
  4565 + "endTime"
  4566 + ]
  4567 + },
  4568 + "ArticleSecuritySearchResponse": {
  4569 + "type": "object",
  4570 + "properties": {
  4571 + "list": {
  4572 + "type": "array",
  4573 + "items": {
  4574 + "$ref": "#/definitions/ArticleSecurityItem"
  4575 + }
  4576 + },
  4577 + "total": {
  4578 + "type": "integer",
  4579 + "format": "int64"
  4580 + }
  4581 + },
  4582 + "title": "ArticleSecuritySearchResponse",
  4583 + "required": [
  4584 + "list",
  4585 + "total"
  4586 + ]
  4587 + },
  4588 + "ArticleTagCount": {
  4589 + "type": "object",
  4590 + "properties": {
  4591 + "tagCategory": {
  4592 + "type": "string",
  4593 + "description": " 标签分组"
  4594 + },
  4595 + "tagId": {
  4596 + "type": "integer",
  4597 + "format": "int64",
  4598 + "description": " 标签id"
  4599 + },
  4600 + "tagImage": {
  4601 + "type": "string",
  4602 + "description": " 对应的图标"
  4603 + },
  4604 + "tagName": {
  4605 + "type": "string",
  4606 + "description": " 标签名称"
  4607 + },
  4608 + "tagRemark": {
  4609 + "type": "string",
  4610 + "description": " 标签备注"
  4611 + },
  4612 + "totalArticle": {
  4613 + "type": "integer",
  4614 + "format": "int32",
  4615 + "description": " 总的文章数量"
  4616 + },
  4617 + "readArticle": {
  4618 + "type": "integer",
  4619 + "format": "int32",
  4620 + "description": " 已读的标签数量"
  4621 + },
  4622 + "sortBy": {
  4623 + "type": "integer",
  4624 + "format": "int32",
  4625 + "description": " 排序"
  4626 + }
  4627 + },
  4628 + "title": "ArticleTagCount",
  4629 + "required": [
  4630 + "tagCategory",
  4631 + "tagId",
  4632 + "tagImage",
  4633 + "tagName",
  4634 + "tagRemark",
  4635 + "totalArticle",
  4636 + "readArticle",
  4637 + "sortBy"
  4638 + ]
  4639 + },
  4640 + "ArticleTagGroup": {
  4641 + "type": "object",
  4642 + "properties": {
  4643 + "category": {
  4644 + "type": "string"
  4645 + },
  4646 + "tags": {
  4647 + "type": "array",
  4648 + "items": {
  4649 + "$ref": "#/definitions/ArticleTagItem"
  4650 + }
  4651 + }
  4652 + },
  4653 + "title": "ArticleTagGroup",
  4654 + "required": [
  4655 + "category",
  4656 + "tags"
  4657 + ]
  4658 + },
  4659 + "ArticleTagItem": {
  4660 + "type": "object",
  4661 + "properties": {
  4662 + "id": {
  4663 + "type": "integer",
  4664 + "format": "int64"
  4665 + },
  4666 + "category": {
  4667 + "type": "string"
  4668 + },
  4669 + "name": {
  4670 + "type": "string"
  4671 + },
  4672 + "image": {
  4673 + "type": "string"
  4674 + },
  4675 + "sortBy": {
  4676 + "type": "integer",
  4677 + "format": "int32"
  4678 + }
  4679 + },
  4680 + "title": "ArticleTagItem",
  4681 + "required": [
  4682 + "id",
  4683 + "category",
  4684 + "name",
  4685 + "image",
  4686 + "sortBy"
  4687 + ]
  4688 + },
  4689 + "ArticleTemplateBatchDeleteRequest": {
  4690 + "type": "object",
  4691 + "properties": {
  4692 + "ids": {
  4693 + "type": "array",
  4694 + "items": {
  4695 + "type": "integer",
  4696 + "format": "int64"
  4697 + }
  4698 + }
  4699 + },
  4700 + "title": "ArticleTemplateBatchDeleteRequest",
  4701 + "required": [
  4702 + "ids"
  4703 + ]
  4704 + },
  4705 + "ArticleTemplateBatchResponse": {
  4706 + "type": "object",
  4707 + "title": "ArticleTemplateBatchResponse"
  4708 + },
  4709 + "ArticleTemplateClassItem": {
  4710 + "type": "object",
  4711 + "properties": {
  4712 + "name": {
  4713 + "type": "string",
  4714 + "description": " 名称"
  4715 + }
  4716 + },
  4717 + "title": "ArticleTemplateClassItem",
  4718 + "required": [
  4719 + "name"
  4720 + ]
  4721 + },
  4722 + "ArticleTemplateClassSearchRequest": {
  4723 + "type": "object",
  4724 + "properties": {
  4725 + "page": {
4168 "type": "integer", 4726 "type": "integer",
4169 - "format": "int64",  
4170 - "description": " 开始时间" 4727 + "format": "int32"
4171 }, 4728 },
4172 - "endTime": { 4729 + "size": {
4173 "type": "integer", 4730 "type": "integer",
4174 - "format": "int64",  
4175 - "description": " 结束时间" 4731 + "format": "int32"
  4732 + },
  4733 + "name": {
  4734 + "type": "string",
  4735 + "description": " 模板名称"
4176 } 4736 }
4177 }, 4737 },
4178 - "title": "ArticleSecuritySearchRequest",  
4179 - "required": [  
4180 - "suggest",  
4181 - "contentType",  
4182 - "authorName",  
4183 - "beginTime",  
4184 - "endTime"  
4185 - ] 4738 + "title": "ArticleTemplateClassSearchRequest"
4186 }, 4739 },
4187 - "ArticleSecuritySearchResponse": { 4740 + "ArticleTemplateClassSearchResponse": {
4188 "type": "object", 4741 "type": "object",
4189 "properties": { 4742 "properties": {
4190 "list": { 4743 "list": {
4191 "type": "array", 4744 "type": "array",
4192 "items": { 4745 "items": {
4193 - "$ref": "#/definitions/ArticleSecurityItem" 4746 + "$ref": "#/definitions/ArticleTemplateClassItem"
4194 } 4747 }
4195 }, 4748 },
4196 "total": { 4749 "total": {
@@ -4198,113 +4751,227 @@ @@ -4198,113 +4751,227 @@
4198 "format": "int64" 4751 "format": "int64"
4199 } 4752 }
4200 }, 4753 },
4201 - "title": "ArticleSecuritySearchResponse", 4754 + "title": "ArticleTemplateClassSearchResponse",
4202 "required": [ 4755 "required": [
4203 "list", 4756 "list",
4204 "total" 4757 "total"
4205 ] 4758 ]
4206 }, 4759 },
4207 - "ArticleTagCount": { 4760 + "ArticleTemplateDeleteRequest": {
4208 "type": "object", 4761 "type": "object",
4209 "properties": { 4762 "properties": {
4210 - "tagCategory": {  
4211 - "type": "string",  
4212 - "description": " 标签分组"  
4213 - },  
4214 - "tagId": { 4763 + "id": {
  4764 + "type": "integer",
  4765 + "format": "int64"
  4766 + }
  4767 + },
  4768 + "title": "ArticleTemplateDeleteRequest",
  4769 + "required": [
  4770 + "id"
  4771 + ]
  4772 + },
  4773 + "ArticleTemplateDeleteResponse": {
  4774 + "type": "object",
  4775 + "title": "ArticleTemplateDeleteResponse"
  4776 + },
  4777 + "ArticleTemplateGetRequest": {
  4778 + "type": "object",
  4779 + "properties": {
  4780 + "id": {
  4781 + "type": "integer",
  4782 + "format": "int64"
  4783 + }
  4784 + },
  4785 + "title": "ArticleTemplateGetRequest",
  4786 + "required": [
  4787 + "id"
  4788 + ]
  4789 + },
  4790 + "ArticleTemplateGetResponse": {
  4791 + "type": "object",
  4792 + "properties": {
  4793 + "item": {
  4794 + "$ref": "#/definitions/ArticleTemplateItem"
  4795 + }
  4796 + },
  4797 + "title": "ArticleTemplateGetResponse",
  4798 + "required": [
  4799 + "item"
  4800 + ]
  4801 + },
  4802 + "ArticleTemplateItem": {
  4803 + "type": "object",
  4804 + "properties": {
  4805 + "id": {
4215 "type": "integer", 4806 "type": "integer",
4216 "format": "int64", 4807 "format": "int64",
4217 - "description": " 标签id" 4808 + "description": " 唯一标识"
4218 }, 4809 },
4219 - "tagImage": { 4810 + "name": {
4220 "type": "string", 4811 "type": "string",
4221 - "description": " 对应的图标" 4812 + "description": " 模板名称"
4222 }, 4813 },
4223 - "tagName": { 4814 + "templateClass": {
4224 "type": "string", 4815 "type": "string",
4225 - "description": " 标签名称" 4816 + "description": " 模板分类"
4226 }, 4817 },
4227 - "tagRemark": { 4818 + "paragraphs": {
  4819 + "type": "array",
  4820 + "items": {
  4821 + "$ref": "#/definitions/Paragraph"
  4822 + },
  4823 + "description": " 段落列表"
  4824 + },
  4825 + "icon": {
4228 "type": "string", 4826 "type": "string",
4229 - "description": " 标签备注" 4827 + "description": " 图标地址"
4230 }, 4828 },
4231 - "totalArticle": { 4829 + "targetWhoRead": {
4232 "type": "integer", 4830 "type": "integer",
4233 "format": "int32", 4831 "format": "int32",
4234 - "description": " 总的文章数量" 4832 + "description": " 分发方式 0 分发给所有人 1 分发给指定的人"
4235 }, 4833 },
4236 - "readArticle": { 4834 + "targetWhoReview": {
4237 "type": "integer", 4835 "type": "integer",
4238 "format": "int32", 4836 "format": "int32",
4239 - "description": " 已读的标签数量" 4837 + "description": " 分发方式 0 分发给所有人 1 分发给指定的人"
4240 }, 4838 },
4241 - "sortBy": { 4839 + "whoRead": {
  4840 + "type": "array",
  4841 + "items": {
  4842 + "type": "integer",
  4843 + "format": "int64"
  4844 + },
  4845 + "description": " 谁可以看"
  4846 + },
  4847 + "whoReview": {
  4848 + "type": "array",
  4849 + "items": {
  4850 + "type": "integer",
  4851 + "format": "int64"
  4852 + },
  4853 + "description": " 查看、评论人"
  4854 + },
  4855 + "whoReadInfo": {
  4856 + "type": "array",
  4857 + "items": {
  4858 + "$ref": "#/definitions/TargetUser"
  4859 + },
  4860 + "description": " 谁可查看"
  4861 + },
  4862 + "whoReviewInfo": {
  4863 + "type": "array",
  4864 + "items": {
  4865 + "$ref": "#/definitions/TargetUser"
  4866 + },
  4867 + "description": " 谁可评论"
  4868 + },
  4869 + "": {
  4870 + "type": "string",
  4871 + "description": " 操作人"
  4872 + },
  4873 + "": {
4242 "type": "integer", 4874 "type": "integer",
4243 - "format": "int32",  
4244 - "description": " 排序" 4875 + "format": "int64",
  4876 + "description": " 更新时间戳"
4245 } 4877 }
4246 }, 4878 },
4247 - "title": "ArticleTagCount", 4879 + "title": "ArticleTemplateItem",
4248 "required": [ 4880 "required": [
4249 - "tagCategory",  
4250 - "tagId",  
4251 - "tagImage",  
4252 - "tagName",  
4253 - "tagRemark",  
4254 - "totalArticle",  
4255 - "readArticle",  
4256 - "sortBy" 4881 + "name",
  4882 + "templateClass",
  4883 + "paragraphs",
  4884 + ""
4257 ] 4885 ]
4258 }, 4886 },
4259 - "ArticleTagGroup": { 4887 + "ArticleTemplateSaveRequest": {
4260 "type": "object", 4888 "type": "object",
4261 "properties": { 4889 "properties": {
4262 - "category": {  
4263 - "type": "string" 4890 + "AccessToken": {
  4891 + "type": "string",
  4892 + "description": " 授权token"
4264 }, 4893 },
4265 - "tags": {  
4266 - "type": "array",  
4267 - "items": {  
4268 - "$ref": "#/definitions/ArticleTagItem"  
4269 - } 4894 + "item": {
  4895 + "$ref": "#/definitions/ArticleTemplateItem"
4270 } 4896 }
4271 }, 4897 },
4272 - "title": "ArticleTagGroup", 4898 + "title": "ArticleTemplateSaveRequest",
4273 "required": [ 4899 "required": [
4274 - "category",  
4275 - "tags" 4900 + "x-mmm-accesstoken",
  4901 + "item"
4276 ] 4902 ]
4277 }, 4903 },
4278 - "ArticleTagItem": { 4904 + "ArticleTemplateSaveResponse": {
  4905 + "type": "object",
  4906 + "title": "ArticleTemplateSaveResponse"
  4907 + },
  4908 + "ArticleTemplateSearchRequest": {
4279 "type": "object", 4909 "type": "object",
4280 "properties": { 4910 "properties": {
4281 - "id": { 4911 + "page": {
4282 "type": "integer", 4912 "type": "integer",
4283 - "format": "int64" 4913 + "format": "int32"
4284 }, 4914 },
4285 - "category": {  
4286 - "type": "string" 4915 + "size": {
  4916 + "type": "integer",
  4917 + "format": "int32"
4287 }, 4918 },
4288 "name": { 4919 "name": {
4289 - "type": "string" 4920 + "type": "string",
  4921 + "description": " 模板名称"
4290 }, 4922 },
4291 - "image": {  
4292 - "type": "string" 4923 + "templateClass": {
  4924 + "type": "string",
  4925 + "description": " 模板分类"
4293 }, 4926 },
4294 - "sortBy": { 4927 + "target": {
  4928 + "$ref": "#/definitions/int",
  4929 + "description": " 目标 0 全员 1 指定人"
  4930 + }
  4931 + },
  4932 + "title": "ArticleTemplateSearchRequest"
  4933 + },
  4934 + "ArticleTemplateSearchResponse": {
  4935 + "type": "object",
  4936 + "properties": {
  4937 + "list": {
  4938 + "type": "array",
  4939 + "items": {
  4940 + "$ref": "#/definitions/ArticleTemplateItem"
  4941 + }
  4942 + },
  4943 + "total": {
4295 "type": "integer", 4944 "type": "integer",
4296 - "format": "int32" 4945 + "format": "int64"
4297 } 4946 }
4298 }, 4947 },
4299 - "title": "ArticleTagItem", 4948 + "title": "ArticleTemplateSearchResponse",
  4949 + "required": [
  4950 + "list",
  4951 + "total"
  4952 + ]
  4953 + },
  4954 + "ArticleTemplateUpdateRequest": {
  4955 + "type": "object",
  4956 + "properties": {
  4957 + "id": {
  4958 + "type": "integer",
  4959 + "format": "int64"
  4960 + },
  4961 + "item": {
  4962 + "$ref": "#/definitions/ArticleTemplateItem"
  4963 + }
  4964 + },
  4965 + "title": "ArticleTemplateUpdateRequest",
4300 "required": [ 4966 "required": [
4301 "id", 4967 "id",
4302 - "category",  
4303 - "name",  
4304 - "image",  
4305 - "sortBy" 4968 + "item"
4306 ] 4969 ]
4307 }, 4970 },
  4971 + "ArticleTemplateUpdateResponse": {
  4972 + "type": "object",
  4973 + "title": "ArticleTemplateUpdateResponse"
  4974 + },
4308 "Auth": { 4975 "Auth": {
4309 "type": "object", 4976 "type": "object",
4310 "properties": { 4977 "properties": {
@@ -7716,6 +8383,49 @@ @@ -7716,6 +8383,49 @@
7716 "name" 8383 "name"
7717 ] 8384 ]
7718 }, 8385 },
  8386 + "Paragraph": {
  8387 + "type": "object",
  8388 + "properties": {
  8389 + "id": {
  8390 + "type": "string",
  8391 + "description": " 唯一标识"
  8392 + },
  8393 + "title": {
  8394 + "type": "string",
  8395 + "description": " 标题"
  8396 + },
  8397 + "prompt": {
  8398 + "type": "string",
  8399 + "description": " 文本提示"
  8400 + },
  8401 + "required": {
  8402 + "type": "boolean",
  8403 + "format": "boolean",
  8404 + "description": " 必填"
  8405 + },
  8406 + "type": {
  8407 + "type": "integer",
  8408 + "format": "int32",
  8409 + "description": " 段落类型 1:文本 2:图片"
  8410 + },
  8411 + "text": {
  8412 + "type": "string",
  8413 + "description": " 文本内容"
  8414 + },
  8415 + "images": {
  8416 + "type": "array",
  8417 + "items": {
  8418 + "type": "string"
  8419 + },
  8420 + "description": " 图片地址列表"
  8421 + }
  8422 + },
  8423 + "title": "Paragraph",
  8424 + "required": [
  8425 + "text",
  8426 + "images"
  8427 + ]
  8428 + },
7719 "Position": { 8429 "Position": {
7720 "type": "object", 8430 "type": "object",
7721 "properties": { 8431 "properties": {
@@ -11304,6 +12014,23 @@ @@ -11304,6 +12014,23 @@
11304 "options" 12014 "options"
11305 ] 12015 ]
11306 }, 12016 },
  12017 + "TargetUser": {
  12018 + "type": "object",
  12019 + "properties": {
  12020 + "id": {
  12021 + "type": "integer",
  12022 + "format": "int64"
  12023 + },
  12024 + "name": {
  12025 + "type": "string"
  12026 + }
  12027 + },
  12028 + "title": "TargetUser",
  12029 + "required": [
  12030 + "id",
  12031 + "name"
  12032 + ]
  12033 + },
11307 "UserFollowItem": { 12034 "UserFollowItem": {
11308 "type": "object", 12035 "type": "object",
11309 "properties": { 12036 "properties": {
  1 +@server(
  2 + prefix: v1/system
  3 + group: template
  4 + middleware: LoginStatusCheck,LogRequest
  5 + jwt: SystemAuth
  6 +)
  7 +service Core {
  8 + @doc "模板管理-详情"
  9 + @handler systemArticleTemplateGet
  10 + get /article_template/:id (ArticleTemplateGetRequest) returns (ArticleTemplateGetResponse)
  11 + @doc "模板管理-保存"
  12 + @handler systemArticleTemplateSave
  13 + post /article_template (ArticleTemplateSaveRequest) returns (ArticleTemplateSaveResponse)
  14 + @doc "模板管理-删除"
  15 + @handler systemArticleTemplateDelete
  16 + delete /article_template/:id (ArticleTemplateDeleteRequest) returns (ArticleTemplateDeleteResponse)
  17 + @doc "模板管理-批量删除"
  18 + @handler systemArticleTemplateBatchDelete
  19 + delete /article_template/batch_delete (ArticleTemplateBatchDeleteRequest) returns (ArticleTemplateBatchResponse)
  20 + @doc "模板管理-更新"
  21 + @handler systemArticleTemplateUpdate
  22 + put /article_template/:id (ArticleTemplateUpdateRequest) returns (ArticleTemplateUpdateResponse)
  23 + @doc "模板管理-搜索"
  24 + @handler systemArticleTemplateSearch
  25 + post /article_template/search (ArticleTemplateSearchRequest) returns (ArticleTemplateSearchResponse)
  26 + @doc "模板管理-分类搜索"
  27 + @handler systemArticleTemplateClassSearch
  28 + post /article_template_class/search (ArticleTemplateClassSearchRequest) returns (ArticleTemplateClassSearchResponse)
  29 +}
  30 +
  31 +@server(
  32 + prefix: v1/mini
  33 + group: template
  34 + middleware: LogRequest
  35 + jwt: MiniAuth
  36 +)
  37 +service Core {
  38 + @doc "模板搜索"
  39 + @handler miniArticleTemplateSearch
  40 + post /article_template/search (ArticleTemplateSearchRequest) returns (ArticleTemplateSearchResponse)
  41 + @doc "我的模板搜索"
  42 + @handler miniArticleTemplateSearchMine
  43 + post /article_template/search-mine (ArticleTemplateSearchRequest) returns (ArticleTemplateSearchResponse)
  44 + @doc "模板分类搜索"
  45 + @handler miniArticleTemplateClassSearch
  46 + post /article_template_class/search (ArticleTemplateClassSearchRequest) returns (ArticleTemplateClassSearchResponse)
  47 + @doc "模板管理-保存"
  48 + @handler miniArticleTemplateSave
  49 + post /article_template (ArticleTemplateSaveRequest) returns (ArticleTemplateSaveResponse)
  50 + @doc "模板管理-删除"
  51 + @handler miniArticleTemplateDelete
  52 + delete /article_template/:id (ArticleTemplateDeleteRequest) returns (ArticleTemplateDeleteResponse)
  53 + @doc "模板管理-更新"
  54 + @handler miniArticleTemplateUpdate
  55 + put /article_template/:id (ArticleTemplateUpdateRequest) returns (ArticleTemplateUpdateResponse)
  56 +}
  57 +
  58 +type (
  59 + ArticleTemplateGetRequest {
  60 + Id int64 `path:"id"`
  61 + }
  62 + ArticleTemplateGetResponse struct{
  63 + ArticleTemplate ArticleTemplateItem `json:"item"`
  64 + }
  65 +
  66 + ArticleTemplateSaveRequest struct{
  67 + AccessToken string `header:"x-mmm-accesstoken"` // 授权token
  68 + ArticleTemplate ArticleTemplateItem `json:"item"`
  69 + BelongTo int `json:"belongTo,optional,default=2"` // 模板属于: 1:企业 、2:个人
  70 + }
  71 + ArticleTemplateSaveResponse struct{}
  72 +
  73 + ArticleTemplateDeleteRequest struct{
  74 + Id int64 `path:"id"`
  75 + }
  76 + ArticleTemplateDeleteResponse struct{}
  77 +
  78 + ArticleTemplateBatchDeleteRequest struct{
  79 + Ids []int64 `json:"ids"`
  80 + }
  81 + ArticleTemplateBatchResponse struct{
  82 +
  83 + }
  84 +
  85 + ArticleTemplateUpdateRequest struct{
  86 + Id int64 `path:"id"`
  87 + ArticleTemplate ArticleTemplateItem `json:"item"`
  88 + }
  89 + ArticleTemplateUpdateResponse struct{}
  90 +
  91 + ArticleTemplateSearchRequest struct{
  92 + Page int `json:"page,optional"`
  93 + Size int `json:"size,optional"`
  94 + Name string `json:"name,optional"` // 模板名称
  95 + TemplateClass string `json:"templateClass,optional"` // 模板分类
  96 + Target *int `json:"target,optional"` // 目标 0 全员 1 指定人
  97 +// BelongTos []int `json:"belongTos,optional"` // 归属
  98 + CompanyId int64 `json:",optional"` // 属于企业时有值
  99 + UserId int64 `json:",optional"` // 属于个人时有值
  100 + }
  101 + ArticleTemplateSearchResponse{
  102 + List []ArticleTemplateItem `json:"list"`
  103 + Total int64 `json:"total"`
  104 + }
  105 + ArticleTemplateClassSearchRequest struct{
  106 + Page int `json:"page,optional"`
  107 + Size int `json:"size,optional"`
  108 + Name string `json:"name,optional"` // 模板名称
  109 + CompanyId int64 `json:",optional"` // 属于企业时有值
  110 + UserId int64 `json:",optional"` // 属于个人时有值
  111 + }
  112 + ArticleTemplateClassSearchResponse{
  113 + List []ArticleTemplateClassItem `json:"list"`
  114 + Total int64 `json:"total"`
  115 + }
  116 + ArticleTemplateClassItem struct{
  117 + Name string `json:"name"` // 名称
  118 + }
  119 + ArticleTemplateItem struct{
  120 + Id int64 `json:"id,optional"` // 唯一标识
  121 + //CompanyId int64 `json:",optional"` // 属于企业时有值
  122 + //UserId int64 `json:",optional"` // 属于个人时有值
  123 + //BelongTo int `json:"belongTo,optional"` // 模板属于: 1:企业 、2:个人
  124 + Name string `json:"name"` // 模板名称
  125 + TemplateClass string `json:"templateClass"` // 模板分类
  126 + Paragraphs []Paragraph `json:"paragraphs"` // 段落列表
  127 + Icon string `json:"icon,optional"` // 图标地址
  128 + TargetWhoRead int `json:"targetWhoRead,optional"` // 分发方式 0 分发给所有人 1 分发给指定的人
  129 + TargetWhoReview int `json:"targetWhoReview,optional"` // 分发方式 0 分发给所有人 1 分发给指定的人
  130 + WhoRead []int64 `json:"whoRead,optional"` // 谁可以看
  131 + WhoReview []int64 `json:"whoReview,optional"` // 查看、评论人
  132 + WhoReadInfo []TargetUser `json:"whoReadInfo,optional"` // 谁可查看
  133 + WhoReviewInfo []TargetUser `json:"whoReviewInfo,optional"` // 谁可评论
  134 + Operator string `json:"operator,omitempty,optional"` // 操作人
  135 + UpdatedAt int64 `json:"updatedAt,omitempty,optional"` // 更新时间戳
  136 + }
  137 + Paragraph struct {
  138 + ID string `json:"id,optional"` // 唯一标识
  139 + Title string `json:"title,optional"` // 标题
  140 + Prompt string `json:"prompt,optional"` // 文本提示
  141 + Required bool `json:"required,optional"` // 必填
  142 + Type int `json:"type,optional"` // 段落类型 1:文本 2:图片
  143 +
  144 + Text string `json:"text,optional,omitempty"` // 文本内容
  145 + Images []string `json:"images,optional,omitempty"` // 图片地址列表
  146 + }
  147 + TargetUser struct{
  148 + Id int64 `json:"id"`
  149 + Name string `json:"name"`
  150 + }
  151 +)
@@ -34,13 +34,15 @@ type Operator { @@ -34,13 +34,15 @@ type Operator {
34 type ( 34 type (
35 MiniArticleCreateRequest { 35 MiniArticleCreateRequest {
36 Title string `json:"title"` //标题 36 Title string `json:"title"` //标题
37 - Section []string `json:"section"` //文章的文本内容 37 + Section []string `json:"section"` //文章的文本内容
38 AuthorId int64 `json:"authorId,optional"` //发布人id 38 AuthorId int64 `json:"authorId,optional"` //发布人id
39 Images []string `json:"images,optional"` //图片 39 Images []string `json:"images,optional"` //图片
40 WhoRead []int64 `json:"whoRead,optional"` //谁可查看 40 WhoRead []int64 `json:"whoRead,optional"` //谁可查看
41 WhoReview []int64 `json:"whoReview,optional"` //谁可评论 41 WhoReview []int64 `json:"whoReview,optional"` //谁可评论
42 Location Location `json:"location,optional"` //定位坐标 42 Location Location `json:"location,optional"` //定位坐标
43 MatchUrl map[string]string `json:"matchUrl"` // 匹配文章内容中的url文本 43 MatchUrl map[string]string `json:"matchUrl"` // 匹配文章内容中的url文本
  44 +
  45 + Paragraphs []Paragraph `json:"paragraphs,optional"` // 段落
44 } 46 }
45 MiniArticleCreateResponse { 47 MiniArticleCreateResponse {
46 Id int64 `json:"id"` 48 Id int64 `json:"id"`
@@ -81,6 +83,9 @@ type ( @@ -81,6 +83,9 @@ type (
81 Content string `json:"content"` // 文本内容 83 Content string `json:"content"` // 文本内容
82 SortBy int `json:"sortBy"` // 排序 84 SortBy int `json:"sortBy"` // 排序
83 TotalComment int `json:"totalComment"` // 评论的数量 85 TotalComment int `json:"totalComment"` // 评论的数量
  86 + Images []string `json:"images"` // 照片列表
  87 + ParagraphType int `json:"paragraphType"` // 段落类型 0:无样式 1:模板文本 2:模板图片
  88 + ParagraphTemplate Paragraph `json:"paragraphTemplate"` // 段落模板
84 } 89 }
85 ) 90 )
86 91
@@ -261,6 +266,8 @@ type ( @@ -261,6 +266,8 @@ type (
261 WhoReview []int64 `json:"whoReview"` // 评论人 266 WhoReview []int64 `json:"whoReview"` // 评论人
262 Location Location `json:"location"` // 坐标 267 Location Location `json:"location"` // 坐标
263 MatchUrl map[string]string `json:"matchUrl"` // 匹配文章内容中的url文本 268 MatchUrl map[string]string `json:"matchUrl"` // 匹配文章内容中的url文本
  269 +
  270 + Paragraphs []Paragraph `json:"paragraphs,optional"` // 段落
264 } 271 }
265 272
266 MiniArticleDraftCreateResponse { 273 MiniArticleDraftCreateResponse {
@@ -282,6 +289,8 @@ type ( @@ -282,6 +289,8 @@ type (
282 WhoReview []int64 `json:"whoReview"` // 评论人 289 WhoReview []int64 `json:"whoReview"` // 评论人
283 Location Location `json:"location"` // 坐标 290 Location Location `json:"location"` // 坐标
284 MatchUrl map[string]string `json:"matchUrl"` // 匹配文章内容中的url文本 291 MatchUrl map[string]string `json:"matchUrl"` // 匹配文章内容中的url文本
  292 +
  293 + Paragraphs []Paragraph `json:"paragraphs,optional"` // 段落
285 } 294 }
286 295
287 MiniArticleDraftUpdateResponse { 296 MiniArticleDraftUpdateResponse {
@@ -519,6 +528,8 @@ type ( @@ -519,6 +528,8 @@ type (
519 MatchUrl map[string]string `json:"matchUrl,optional"` // 匹配文章内容中的url文本 528 MatchUrl map[string]string `json:"matchUrl,optional"` // 匹配文章内容中的url文本
520 ArticleDraftId int64 `json:"articleDraftId"` // 草稿ID 529 ArticleDraftId int64 `json:"articleDraftId"` // 草稿ID
521 AccessToken string `header:"x-mmm-accesstoken"` // 授权token 530 AccessToken string `header:"x-mmm-accesstoken"` // 授权token
  531 +
  532 + Paragraphs []Paragraph `json:"paragraphs,optional"` // 段落
522 } 533 }
523 SystemArticleCreateResponse { 534 SystemArticleCreateResponse {
524 Id int64 `json:"id"` //id 535 Id int64 `json:"id"` //id
@@ -13,6 +13,7 @@ import ( @@ -13,6 +13,7 @@ import (
13 role "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/handler/role" 13 role "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/handler/role"
14 secuirty "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/handler/secuirty" 14 secuirty "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/handler/secuirty"
15 tags "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/handler/tags" 15 tags "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/handler/tags"
  16 + template "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/handler/template"
16 user "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/handler/user" 17 user "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/handler/user"
17 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc" 18 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
18 19
@@ -835,4 +836,89 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { @@ -835,4 +836,89 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
835 rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret), 836 rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret),
836 rest.WithPrefix("/v1/system"), 837 rest.WithPrefix("/v1/system"),
837 ) 838 )
  839 +
  840 + server.AddRoutes(
  841 + rest.WithMiddlewares(
  842 + []rest.Middleware{serverCtx.LoginStatusCheck, serverCtx.LogRequest},
  843 + []rest.Route{
  844 + {
  845 + Method: http.MethodGet,
  846 + Path: "/article_template/:id",
  847 + Handler: template.SystemArticleTemplateGetHandler(serverCtx),
  848 + },
  849 + {
  850 + Method: http.MethodPost,
  851 + Path: "/article_template",
  852 + Handler: template.SystemArticleTemplateSaveHandler(serverCtx),
  853 + },
  854 + {
  855 + Method: http.MethodDelete,
  856 + Path: "/article_template/:id",
  857 + Handler: template.SystemArticleTemplateDeleteHandler(serverCtx),
  858 + },
  859 + {
  860 + Method: http.MethodDelete,
  861 + Path: "/article_template/batch_delete",
  862 + Handler: template.SystemArticleTemplateBatchDeleteHandler(serverCtx),
  863 + },
  864 + {
  865 + Method: http.MethodPut,
  866 + Path: "/article_template/:id",
  867 + Handler: template.SystemArticleTemplateUpdateHandler(serverCtx),
  868 + },
  869 + {
  870 + Method: http.MethodPost,
  871 + Path: "/article_template/search",
  872 + Handler: template.SystemArticleTemplateSearchHandler(serverCtx),
  873 + },
  874 + {
  875 + Method: http.MethodPost,
  876 + Path: "/article_template_class/search",
  877 + Handler: template.SystemArticleTemplateClassSearchHandler(serverCtx),
  878 + },
  879 + }...,
  880 + ),
  881 + rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret),
  882 + rest.WithPrefix("/v1/system"),
  883 + )
  884 +
  885 + server.AddRoutes(
  886 + rest.WithMiddlewares(
  887 + []rest.Middleware{serverCtx.LogRequest},
  888 + []rest.Route{
  889 + {
  890 + Method: http.MethodPost,
  891 + Path: "/article_template/search",
  892 + Handler: template.MiniArticleTemplateSearchHandler(serverCtx),
  893 + },
  894 + {
  895 + Method: http.MethodPost,
  896 + Path: "/article_template/search-mine",
  897 + Handler: template.MiniArticleTemplateSearchMineHandler(serverCtx),
  898 + },
  899 + {
  900 + Method: http.MethodPost,
  901 + Path: "/article_template_class/search",
  902 + Handler: template.MiniArticleTemplateClassSearchHandler(serverCtx),
  903 + },
  904 + {
  905 + Method: http.MethodPost,
  906 + Path: "/article_template",
  907 + Handler: template.MiniArticleTemplateSaveHandler(serverCtx),
  908 + },
  909 + {
  910 + Method: http.MethodDelete,
  911 + Path: "/article_template/:id",
  912 + Handler: template.MiniArticleTemplateDeleteHandler(serverCtx),
  913 + },
  914 + {
  915 + Method: http.MethodPut,
  916 + Path: "/article_template/:id",
  917 + Handler: template.MiniArticleTemplateUpdateHandler(serverCtx),
  918 + },
  919 + }...,
  920 + ),
  921 + rest.WithJwt(serverCtx.Config.MiniAuth.AccessSecret),
  922 + rest.WithPrefix("/v1/mini"),
  923 + )
838 } 924 }
  1 +package template
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
  5 + "net/http"
  6 +
  7 + "github.com/zeromicro/go-zero/rest/httpx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/template"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  11 +)
  12 +
  13 +func MiniArticleTemplateClassSearchHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.ArticleTemplateClassSearchRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := template.NewMiniArticleTemplateClassSearchLogic(r.Context(), svcCtx)
  22 + resp, err := l.MiniArticleTemplateClassSearch(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
  1 +package template
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
  5 + "net/http"
  6 +
  7 + "github.com/zeromicro/go-zero/rest/httpx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/template"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  11 +)
  12 +
  13 +func MiniArticleTemplateDeleteHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.ArticleTemplateDeleteRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := template.NewMiniArticleTemplateDeleteLogic(r.Context(), svcCtx)
  22 + resp, err := l.MiniArticleTemplateDelete(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
  1 +package template
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
  5 + "net/http"
  6 +
  7 + "github.com/zeromicro/go-zero/rest/httpx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/template"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  11 +)
  12 +
  13 +func MiniArticleTemplateSaveHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.ArticleTemplateSaveRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := template.NewMiniArticleTemplateSaveLogic(r.Context(), svcCtx)
  22 + resp, err := l.MiniArticleTemplateSave(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
  1 +package template
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
  5 + "net/http"
  6 +
  7 + "github.com/zeromicro/go-zero/rest/httpx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/template"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  11 +)
  12 +
  13 +func MiniArticleTemplateSearchHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.ArticleTemplateSearchRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := template.NewMiniArticleTemplateSearchLogic(r.Context(), svcCtx)
  22 + resp, err := l.MiniArticleTemplateSearch(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
  1 +package template
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
  5 + "net/http"
  6 +
  7 + "github.com/zeromicro/go-zero/rest/httpx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/template"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  11 +)
  12 +
  13 +func MiniArticleTemplateSearchMineHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.ArticleTemplateSearchRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := template.NewMiniArticleTemplateSearchMineLogic(r.Context(), svcCtx)
  22 + resp, err := l.MiniArticleTemplateSearchMine(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
  1 +package template
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
  5 + "net/http"
  6 +
  7 + "github.com/zeromicro/go-zero/rest/httpx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/template"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  11 +)
  12 +
  13 +func MiniArticleTemplateUpdateHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.ArticleTemplateUpdateRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := template.NewMiniArticleTemplateUpdateLogic(r.Context(), svcCtx)
  22 + resp, err := l.MiniArticleTemplateUpdate(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
  1 +package template
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
  5 + "net/http"
  6 +
  7 + "github.com/zeromicro/go-zero/rest/httpx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/template"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  11 +)
  12 +
  13 +func SystemArticleTemplateBatchDeleteHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.ArticleTemplateBatchDeleteRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := template.NewSystemArticleTemplateBatchDeleteLogic(r.Context(), svcCtx)
  22 + resp, err := l.SystemArticleTemplateBatchDelete(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
  1 +package template
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
  5 + "net/http"
  6 +
  7 + "github.com/zeromicro/go-zero/rest/httpx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/template"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  11 +)
  12 +
  13 +func SystemArticleTemplateClassSearchHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.ArticleTemplateClassSearchRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := template.NewSystemArticleTemplateClassSearchLogic(r.Context(), svcCtx)
  22 + resp, err := l.SystemArticleTemplateClassSearch(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
  1 +package template
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
  5 + "net/http"
  6 +
  7 + "github.com/zeromicro/go-zero/rest/httpx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/template"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  11 +)
  12 +
  13 +func SystemArticleTemplateDeleteHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.ArticleTemplateDeleteRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := template.NewSystemArticleTemplateDeleteLogic(r.Context(), svcCtx)
  22 + resp, err := l.SystemArticleTemplateDelete(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
  1 +package template
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
  5 + "net/http"
  6 +
  7 + "github.com/zeromicro/go-zero/rest/httpx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/template"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  11 +)
  12 +
  13 +func SystemArticleTemplateGetHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.ArticleTemplateGetRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := template.NewSystemArticleTemplateGetLogic(r.Context(), svcCtx)
  22 + resp, err := l.SystemArticleTemplateGet(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
  1 +package template
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
  5 + "net/http"
  6 +
  7 + "github.com/zeromicro/go-zero/rest/httpx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/template"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  11 +)
  12 +
  13 +func SystemArticleTemplateSaveHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.ArticleTemplateSaveRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := template.NewSystemArticleTemplateSaveLogic(r.Context(), svcCtx)
  22 + resp, err := l.SystemArticleTemplateSave(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
  1 +package template
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
  6 + "net/http"
  7 +
  8 + "github.com/zeromicro/go-zero/rest/httpx"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/template"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  12 +)
  13 +
  14 +func SystemArticleTemplateSearchHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  15 + return func(w http.ResponseWriter, r *http.Request) {
  16 + var req types.ArticleTemplateSearchRequest
  17 + if err := httpx.Parse(r, &req); err != nil {
  18 + httpx.ErrorCtx(r.Context(), w, err)
  19 + return
  20 + }
  21 +
  22 + l := template.NewSystemArticleTemplateSearchLogic(r.Context(), svcCtx)
  23 + userToken := contextdata.GetUserTokenFromCtx(r.Context())
  24 + req.CompanyId = userToken.CompanyId
  25 + resp, err := l.SystemArticleTemplateSearch(&req)
  26 + result.HttpResult(r, w, resp, err)
  27 + }
  28 +}
  1 +package template
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
  5 + "net/http"
  6 +
  7 + "github.com/zeromicro/go-zero/rest/httpx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/template"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  11 +)
  12 +
  13 +func SystemArticleTemplateUpdateHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.ArticleTemplateUpdateRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := template.NewSystemArticleTemplateUpdateLogic(r.Context(), svcCtx)
  22 + resp, err := l.SystemArticleTemplateUpdate(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
@@ -54,6 +54,7 @@ func (l *MiniCreateArticleDraftLogic) MiniCreateArticleDraft(req *types.MiniArti @@ -54,6 +54,7 @@ func (l *MiniCreateArticleDraftLogic) MiniCreateArticleDraft(req *types.MiniArti
54 Descript: req.Location.Descript, 54 Descript: req.Location.Descript,
55 }, 55 },
56 MatchUrl: map[string]string{}, 56 MatchUrl: map[string]string{},
  57 + Section: NewArticleSectionFromParagraphs(req.Paragraphs, req.CompanyId, 0),
57 } 58 }
58 for _, val := range req.Images { 59 for _, val := range req.Images {
59 newDraft.Images = append(newDraft.Images, domain.Image{ 60 newDraft.Images = append(newDraft.Images, domain.Image{
@@ -129,6 +129,202 @@ func (l *MiniCreateArticleLogic) MiniCreateArticle(req *types.MiniArticleCreateR @@ -129,6 +129,202 @@ func (l *MiniCreateArticleLogic) MiniCreateArticle(req *types.MiniArticleCreateR
129 } 129 }
130 130
131 //切分文章分段 131 //切分文章分段
  132 + sectionList := NewArticleSectionFromParagraphs(req.Paragraphs, author.CompanyId, 0)
  133 + //newStr := ""
  134 + //for _, paragraph := range req.Paragraphs {
  135 + // strList := []string{paragraph.Text}
  136 + // // 无模板样式的
  137 + // if paragraph.Type == 0 {
  138 + // strList = strings.Split(paragraph.Text, "\n")
  139 + // }
  140 + // for i2 := range strList {
  141 + // newStr = template.HTMLEscapeString(strList[i2])
  142 + // newSection := domain.ArticleSection{
  143 + // Id: 0,
  144 + // CompanyId: author.CompanyId,
  145 + // ArticleId: 0,
  146 + // Content: newStr,
  147 + // SortBy: len(sectionList),
  148 + // TotalComment: 0,
  149 + //
  150 + // Images: paragraph.Images,
  151 + // ParagraphType: paragraph.Type,
  152 + // ParagraphTemplate: core.NewDomainParagraph(paragraph),
  153 + // }
  154 + // sectionList = append(sectionList, &newSection)
  155 + // }
  156 + //}
  157 +
  158 + newArticle := &domain.Article{
  159 + Id: 0,
  160 + CompanyId: author.CompanyId,
  161 + AuthorId: author.Id,
  162 + Author: articleAuthor,
  163 + Title: req.Title,
  164 + Images: images,
  165 + WhoRead: whoRead,
  166 + WhoReview: whoReview,
  167 + Location: domain.Location{
  168 + Longitude: req.Location.Longitude,
  169 + Latitude: req.Location.Latitude,
  170 + Descript: req.Location.Descript,
  171 + },
  172 + TargetUser: domain.ArticleTargetAll,
  173 + CountLove: 0,
  174 + CountComment: 0,
  175 + CountRead: 0,
  176 + Show: domain.ArticleShowEnable,
  177 + Tags: []int64{},
  178 + MatchUrl: map[string]string{},
  179 + Videos: []domain.Video{},
  180 + }
  181 + if len(whoRead) > 0 {
  182 + newArticle.TargetUser = domain.ArticleTargetLimit
  183 + }
  184 + for k, v := range req.MatchUrl {
  185 + newArticle.MatchUrl[k] = v
  186 + }
  187 + //设置内容概要
  188 + newArticle.SetSummary(sectionList)
  189 +
  190 + err = transaction.UseTrans(l.ctx, conn.DB(), func(ctx context.Context, c transaction.Conn) error {
  191 + newArticle, err = l.svcCtx.ArticleRepository.Insert(ctx, c, newArticle)
  192 + if err != nil {
  193 + return xerr.NewErrMsgErr("创建文章失败", err)
  194 + }
  195 +
  196 + for i := range sectionList {
  197 + sectionList[i].ArticleId = newArticle.Id
  198 + _, err = l.svcCtx.ArticleSectionRepository.Insert(ctx, c, sectionList[i])
  199 + if err != nil {
  200 + return xerr.NewErrMsgErr("创建文章内容失败", err)
  201 + }
  202 + }
  203 +
  204 + // 生成 备份数据
  205 + var backupData domain.ArticleBackup
  206 + backupData.MakeBackup(articleAuthor, newArticle, sectionList, "原始版本")
  207 + _, err = l.svcCtx.ArticleBackupRepository.Insert(l.ctx, conn, &backupData)
  208 + if err != nil {
  209 + return xerr.NewErrMsgErr("创建文章失败", err)
  210 + }
  211 +
  212 + //发送订阅消息
  213 + err = message.NewMiniSubscribeLogic(l.ctx, l.svcCtx).FollowArticle(conn, newArticle)
  214 + if err != nil {
  215 + return xerr.NewErrMsgErr("创建文章失败", err)
  216 + }
  217 +
  218 + // 内容安全检查
  219 + if err = core.ContentSecurityCheck(l.ctx, l.svcCtx, c, author, core.NewContentFromArticle(newArticle, sectionList)); err != nil {
  220 + return err
  221 + }
  222 + return nil
  223 + }, true)
  224 + if err != nil {
  225 + return nil, xerr.NewErrMsgErr("创建文章失败", err)
  226 + }
  227 +
  228 + resp = &types.MiniArticleCreateResponse{
  229 + Id: newArticle.Id,
  230 + }
  231 + return
  232 +}
  233 +
  234 +func (l *MiniCreateArticleLogic) MiniCreateArticleBak(req *types.MiniArticleCreateRequest) (resp *types.MiniArticleCreateResponse, err error) {
  235 + var conn = l.svcCtx.DefaultDBConn()
  236 + err = l.validateTextLimit(req)
  237 + if err != nil {
  238 + return nil, err
  239 + }
  240 + // 检查发布人
  241 + author, err := l.svcCtx.UserRepository.FindOne(l.ctx, conn, req.AuthorId)
  242 + if err != nil {
  243 + return nil, xerr.NewErrMsgErr("创建文章内容失败", err)
  244 + }
  245 + companyInfo, err := l.svcCtx.CompanyRepository.FindOne(l.ctx, conn, author.CompanyId)
  246 + if err != nil {
  247 + return nil, xerr.NewErrMsgErr("创建文章内容失败", err)
  248 + }
  249 + articleAuthor := domain.UserSimple{
  250 + Id: author.Id,
  251 + Name: author.Name,
  252 + Avatar: author.Avatar,
  253 + Position: author.Position,
  254 + Company: companyInfo.Name,
  255 + CompanyId: author.CompanyId,
  256 + }
  257 + if len(req.Images) > 9 {
  258 + return nil, xerr.NewErrMsg("图片数量最多9张")
  259 + }
  260 + //获取图片的尺寸大小
  261 + images := []domain.Image{}
  262 + for _, val := range req.Images {
  263 + fInfo, _ := oss.GetImageInfo(val)
  264 + w, _ := strconv.Atoi(fInfo.ImageWidth.Value)
  265 + h, _ := strconv.Atoi(fInfo.ImageHeight.Value)
  266 + images = append(images, domain.Image{
  267 + Url: val,
  268 + Width: w,
  269 + Height: h,
  270 + })
  271 + }
  272 +
  273 + //检查文章可被哪些人查看
  274 + whoRead := []int64{}
  275 + if len(req.WhoRead) > 0 {
  276 + whoRead = lo.Uniq(req.WhoRead)
  277 + var u *domain.User
  278 + for _, val := range whoRead {
  279 + u, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, val)
  280 + if err != nil {
  281 + return nil, xerr.NewErrMsgErr("文章可查看人设置错误", err)
  282 + }
  283 + if u.CompanyId != author.CompanyId {
  284 + return nil, xerr.NewErrMsg("文章可查看人设置错误")
  285 + }
  286 + }
  287 + }
  288 + //检查文章可被哪些人评论
  289 + whoReview := []int64{}
  290 + if len(req.WhoReview) > 0 {
  291 + whoReview = lo.Uniq(req.WhoReview)
  292 + }
  293 + //有指定可查看人的情况
  294 + if len(whoRead) > 0 {
  295 + if len(whoReview) > 0 {
  296 + // 检查 whoRead 是否 完全包含 whoReview
  297 + ok := lo.Every(whoRead, whoReview)
  298 + if !ok {
  299 + return nil, xerr.NewErrMsg("文章可评论人设置错误")
  300 + }
  301 + }
  302 + if len(whoReview) == 0 {
  303 + //有指定可查看人 ,但未指定可评论人
  304 + return nil, xerr.NewErrMsg("文章可评论人设置错误")
  305 + }
  306 + }
  307 + //没有指定可查看人的情况
  308 + if len(whoRead) == 0 {
  309 + if len(whoReview) > 0 {
  310 + // 未指定可查看人(全员可看),有指定可评论人,
  311 + var u *domain.User
  312 + for _, val := range whoReview {
  313 + u, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, val)
  314 + if err != nil {
  315 + return nil, xerr.NewErrMsgErr("文章可评论人设置错误", err)
  316 + }
  317 + if u.CompanyId != author.CompanyId {
  318 + return nil, xerr.NewErrMsg("文章可评论人设置错误")
  319 + }
  320 + }
  321 + }
  322 + // if len(whoReview) == 0 {
  323 + // 未指定可查看人(全员可看),未指定可评论人 ,忽略判断
  324 + // }
  325 + }
  326 +
  327 + //切分文章分段
132 sectionList := []*domain.ArticleSection{} 328 sectionList := []*domain.ArticleSection{}
133 newStr := "" 329 newStr := ""
134 for i := range req.Section { 330 for i := range req.Section {
@@ -2,6 +2,7 @@ package article @@ -2,6 +2,7 @@ package article
2 2
3 import ( 3 import (
4 "context" 4 "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/core"
5 "sort" 6 "sort"
6 7
7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc" 8 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
@@ -102,10 +103,13 @@ func (l *MiniGetArticleLogic) MiniGetArticle(req *types.MiniArticleGetRequest) ( @@ -102,10 +103,13 @@ func (l *MiniGetArticleLogic) MiniGetArticle(req *types.MiniArticleGetRequest) (
102 103
103 for _, val := range sortBy { 104 for _, val := range sortBy {
104 articleSection = append(articleSection, types.ArticleSection{ 105 articleSection = append(articleSection, types.ArticleSection{
105 - Id: val.Id,  
106 - Content: val.Content,  
107 - SortBy: val.SortBy,  
108 - TotalComment: val.TotalComment, 106 + Id: val.Id,
  107 + Content: val.Content,
  108 + SortBy: val.SortBy,
  109 + TotalComment: val.TotalComment,
  110 + Images: val.Images,
  111 + ParagraphTemplate: core.NewTypesParagraph(val.ParagraphTemplate),
  112 + ParagraphType: val.ParagraphType,
109 }) 113 })
110 } 114 }
111 resp = &types.MiniArticleGetResponse{ 115 resp = &types.MiniArticleGetResponse{
@@ -62,6 +62,7 @@ func (l *MiniUpdateArticleDraftLogic) MiniUpdateArticleDraft(req *types.MiniArti @@ -62,6 +62,7 @@ func (l *MiniUpdateArticleDraftLogic) MiniUpdateArticleDraft(req *types.MiniArti
62 for k, v := range req.MatchUrl { 62 for k, v := range req.MatchUrl {
63 draftInfo.MatchUrl[k] = v 63 draftInfo.MatchUrl[k] = v
64 } 64 }
  65 + draftInfo.Section = NewArticleSectionFromParagraphs(req.Paragraphs, req.CompanyId, 0)
65 _, err = l.svcCtx.ArticleDraftRepository.Update(l.ctx, conn, draftInfo) 66 _, err = l.svcCtx.ArticleDraftRepository.Update(l.ctx, conn, draftInfo)
66 if err != nil { 67 if err != nil {
67 return nil, xerr.NewErrMsgErr("更新草稿失败", err) 68 return nil, xerr.NewErrMsgErr("更新草稿失败", err)
@@ -4,6 +4,7 @@ import ( @@ -4,6 +4,7 @@ import (
4 "context" 4 "context"
5 "github.com/pkg/errors" 5 "github.com/pkg/errors"
6 "github.com/samber/lo" 6 "github.com/samber/lo"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/core"
7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/message" 8 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/message"
8 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction" 9 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
9 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain" 10 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
@@ -11,6 +12,7 @@ import ( @@ -11,6 +12,7 @@ import (
11 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata" 12 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
12 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/tool/oss" 13 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/tool/oss"
13 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr" 14 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
  15 + "html/template"
14 "strconv" 16 "strconv"
15 "strings" 17 "strings"
16 "unicode/utf8" 18 "unicode/utf8"
@@ -115,7 +117,7 @@ func (l *SystemCreateArticleLogic) SystemCreateArticle(req *types.SystemArticleC @@ -115,7 +117,7 @@ func (l *SystemCreateArticleLogic) SystemCreateArticle(req *types.SystemArticleC
115 } 117 }
116 article.WhoRead = whoRead 118 article.WhoRead = whoRead
117 article.WhoReview = whoReview 119 article.WhoReview = whoReview
118 - sections := l.getSections(req, article) 120 + sections := NewArticleSectionFromParagraphs(req.Paragraphs, author.CompanyId, 0) //l.getSections(req, article)
119 //设置内容摘要 121 //设置内容摘要
120 article.SetSummary(sections) 122 article.SetSummary(sections)
121 //草稿ID 123 //草稿ID
@@ -296,17 +298,54 @@ func (l *SystemCreateArticleLogic) validateWhoReview(whoRead []int64, whoReview @@ -296,17 +298,54 @@ func (l *SystemCreateArticleLogic) validateWhoReview(whoRead []int64, whoReview
296 func (l *SystemCreateArticleLogic) getSections(req *types.SystemArticleCreateRequest, article *domain.Article) []*domain.ArticleSection { 298 func (l *SystemCreateArticleLogic) getSections(req *types.SystemArticleCreateRequest, article *domain.Article) []*domain.ArticleSection {
297 articleSections := make([]*domain.ArticleSection, 0) 299 articleSections := make([]*domain.ArticleSection, 0)
298 sortBy := 1 300 sortBy := 1
299 - sections := strings.Split(req.Content, "\n")  
300 - lo.ForEach(sections, func(item string, index int) { 301 + lo.ForEach(req.Paragraphs, func(paragraph types.Paragraph, index int) {
301 //去除空 302 //去除空
302 - item = strings.TrimSpace(item)  
303 - if item != "" { 303 + strList := []string{paragraph.Text}
  304 + // 无模板样式的
  305 + if paragraph.Type == 0 {
  306 + strList = strings.Split(paragraph.Text, "\n")
  307 + }
  308 + for i2 := range strList {
  309 + newStr := template.HTMLEscapeString(strList[i2])
304 section := domain.ArticleSection{ 310 section := domain.ArticleSection{
305 CompanyId: article.CompanyId, 311 CompanyId: article.CompanyId,
306 Version: article.Version, 312 Version: article.Version,
307 ArticleId: article.Id, 313 ArticleId: article.Id,
308 - Content: item, 314 + Content: newStr,
309 SortBy: sortBy, 315 SortBy: sortBy,
  316 +
  317 + Images: paragraph.Images,
  318 + ParagraphType: paragraph.Type,
  319 + ParagraphTemplate: core.NewDomainParagraph(paragraph),
  320 + }
  321 + articleSections = append(articleSections, &section)
  322 + sortBy++
  323 + }
  324 + })
  325 + return articleSections
  326 +}
  327 +
  328 +func NewArticleSectionFromParagraphs(paragraphs []types.Paragraph, companyId int64, articleId int64) []*domain.ArticleSection {
  329 + articleSections := make([]*domain.ArticleSection, 0)
  330 + sortBy := 1
  331 + lo.ForEach(paragraphs, func(paragraph types.Paragraph, index int) {
  332 + //去除空
  333 + strList := []string{paragraph.Text}
  334 + // 无模板样式的
  335 + if paragraph.Type == 0 {
  336 + strList = strings.Split(paragraph.Text, "\n")
  337 + }
  338 + for i2 := range strList {
  339 + newStr := template.HTMLEscapeString(strList[i2])
  340 + section := domain.ArticleSection{
  341 + CompanyId: companyId,
  342 + ArticleId: articleId,
  343 + Content: newStr,
  344 + SortBy: sortBy,
  345 +
  346 + Images: paragraph.Images,
  347 + ParagraphType: paragraph.Type,
  348 + ParagraphTemplate: core.NewDomainParagraph(paragraph),
310 } 349 }
311 articleSections = append(articleSections, &section) 350 articleSections = append(articleSections, &section)
312 sortBy++ 351 sortBy++
@@ -2,6 +2,7 @@ package article @@ -2,6 +2,7 @@ package article
2 2
3 import ( 3 import (
4 "context" 4 "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/core"
5 "strconv" 6 "strconv"
6 "unicode/utf8" 7 "unicode/utf8"
7 8
@@ -139,6 +140,9 @@ func (l *SystemUpdateArticleLogic) SystemUpdateArticle(req *types.SystemArticleU @@ -139,6 +140,9 @@ func (l *SystemUpdateArticleLogic) SystemUpdateArticle(req *types.SystemArticleU
139 section.ArticleId = item.ArticleId 140 section.ArticleId = item.ArticleId
140 section.Version = item.Version 141 section.Version = item.Version
141 section.SortBy = item.SortBy 142 section.SortBy = item.SortBy
  143 + section.Images = item.Images
  144 + section.ParagraphType = item.ParagraphType
  145 + section.ParagraphTemplate = item.ParagraphTemplate
142 section.CompanyId = item.CompanyId 146 section.CompanyId = item.CompanyId
143 _, err = l.svcCtx.ArticleSectionRepository.Update(ctx, c, section) 147 _, err = l.svcCtx.ArticleSectionRepository.Update(ctx, c, section)
144 if err != nil { 148 if err != nil {
@@ -327,11 +331,14 @@ func (l *SystemUpdateArticleLogic) getSections(req *types.SystemArticleUpdateReq @@ -327,11 +331,14 @@ func (l *SystemUpdateArticleLogic) getSections(req *types.SystemArticleUpdateReq
327 continue 331 continue
328 } 332 }
329 section := domain.ArticleSection{ 333 section := domain.ArticleSection{
330 - CompanyId: article.CompanyId,  
331 - Version: article.Version,  
332 - ArticleId: article.Id,  
333 - Content: value,  
334 - SortBy: sortBy, 334 + CompanyId: article.CompanyId,
  335 + Version: article.Version,
  336 + ArticleId: article.Id,
  337 + Content: value,
  338 + SortBy: sortBy,
  339 + Images: item.Images,
  340 + ParagraphType: item.ParagraphType,
  341 + ParagraphTemplate: core.NewDomainParagraph(item.ParagraphTemplate),
335 } 342 }
336 if key == 0 { 343 if key == 0 {
337 section.Id = item.Id 344 section.Id = item.Id
  1 +package core
  2 +
  3 +import (
  4 + "github.com/google/uuid"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  7 +)
  8 +
  9 +func NewDomainParagraph(item types.Paragraph) domain.Paragraph {
  10 + id := item.ID
  11 + if item.ID == "" {
  12 + idGen, _ := uuid.NewUUID()
  13 + id = idGen.String()
  14 + }
  15 + return domain.Paragraph{
  16 + ID: id,
  17 + Title: item.Title,
  18 + Prompt: item.Prompt,
  19 + Required: item.Required,
  20 + Type: item.Type,
  21 + }
  22 +}
  23 +
  24 +func NewTypesParagraph(item domain.Paragraph) types.Paragraph {
  25 + return types.Paragraph{
  26 + ID: item.ID,
  27 + Title: item.Title,
  28 + Prompt: item.Prompt,
  29 + Required: item.Required,
  30 + Type: item.Type,
  31 + }
  32 +}
  1 +package template
  2 +
  3 +import (
  4 + "context"
  5 + "github.com/samber/lo"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
  9 +
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  12 +
  13 + "github.com/zeromicro/go-zero/core/logx"
  14 +)
  15 +
  16 +type MiniArticleTemplateClassSearchLogic struct {
  17 + logx.Logger
  18 + ctx context.Context
  19 + svcCtx *svc.ServiceContext
  20 +}
  21 +
  22 +func NewMiniArticleTemplateClassSearchLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniArticleTemplateClassSearchLogic {
  23 + return &MiniArticleTemplateClassSearchLogic{
  24 + Logger: logx.WithContext(ctx),
  25 + ctx: ctx,
  26 + svcCtx: svcCtx,
  27 + }
  28 +}
  29 +
  30 +func (l *MiniArticleTemplateClassSearchLogic) MiniArticleTemplateClassSearch(req *types.ArticleTemplateClassSearchRequest) (resp *types.ArticleTemplateClassSearchResponse, err error) {
  31 + var (
  32 + conn = l.svcCtx.DefaultDBConn()
  33 + dms []*domain.ArticleTemplate
  34 + userToken = contextdata.GetUserTokenFromCtx(l.ctx)
  35 + user *domain.User
  36 + )
  37 + if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, userToken.UserId); err != nil {
  38 + return nil, xerr.NewErrMsgErr("用户不存在", err)
  39 + }
  40 + // 企业有的类目
  41 + queryOptions := domain.NewQueryOptions().WithKV("name", req.Name).
  42 + MustWithKV("companyId", userToken.CompanyId)
  43 + _, dms, err = l.svcCtx.ArticleTemplateRepository.Find(l.ctx, conn, queryOptions)
  44 + class := domain.Values(dms, func(item *domain.ArticleTemplate) string {
  45 + return item.TemplateClass
  46 + })
  47 +
  48 + // 个人有的类目
  49 + queryOptions = domain.NewQueryOptions().WithKV("name", req.Name).
  50 + MustWithKV("userId", user.Id)
  51 + _, dms, err = l.svcCtx.ArticleTemplateRepository.Find(l.ctx, conn, queryOptions)
  52 + class = append(class, domain.Values(dms, func(item *domain.ArticleTemplate) string {
  53 + return item.TemplateClass
  54 + })...)
  55 + class = lo.Uniq(class)
  56 +
  57 + resp = &types.ArticleTemplateClassSearchResponse{
  58 + Total: int64(len(class)),
  59 + }
  60 + lo.ForEach(class, func(item string, index int) {
  61 + resp.List = append(resp.List, types.ArticleTemplateClassItem{
  62 + Name: item,
  63 + })
  64 + })
  65 +
  66 + return
  67 +}
  1 +package template
  2 +
  3 +import (
  4 + "context"
  5 +
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  8 +
  9 + "github.com/zeromicro/go-zero/core/logx"
  10 +)
  11 +
  12 +type MiniArticleTemplateDeleteLogic struct {
  13 + logx.Logger
  14 + ctx context.Context
  15 + svcCtx *svc.ServiceContext
  16 +}
  17 +
  18 +func NewMiniArticleTemplateDeleteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniArticleTemplateDeleteLogic {
  19 + return &MiniArticleTemplateDeleteLogic{
  20 + Logger: logx.WithContext(ctx),
  21 + ctx: ctx,
  22 + svcCtx: svcCtx,
  23 + }
  24 +}
  25 +
  26 +func (l *MiniArticleTemplateDeleteLogic) MiniArticleTemplateDelete(req *types.ArticleTemplateDeleteRequest) (resp *types.ArticleTemplateDeleteResponse, err error) {
  27 + logic := NewSystemArticleTemplateDeleteLogic(l.ctx, l.svcCtx)
  28 + return logic.SystemArticleTemplateDelete(req)
  29 +}
  1 +package template
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
  9 +
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  12 +
  13 + "github.com/zeromicro/go-zero/core/logx"
  14 +)
  15 +
  16 +type MiniArticleTemplateSaveLogic struct {
  17 + logx.Logger
  18 + ctx context.Context
  19 + svcCtx *svc.ServiceContext
  20 +}
  21 +
  22 +func NewMiniArticleTemplateSaveLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniArticleTemplateSaveLogic {
  23 + return &MiniArticleTemplateSaveLogic{
  24 + Logger: logx.WithContext(ctx),
  25 + ctx: ctx,
  26 + svcCtx: svcCtx,
  27 + }
  28 +}
  29 +
  30 +func (l *MiniArticleTemplateSaveLogic) MiniArticleTemplateSave(req *types.ArticleTemplateSaveRequest) (resp *types.ArticleTemplateSaveResponse, err error) {
  31 + var (
  32 + dm *domain.ArticleTemplate
  33 + userToken = contextdata.GetUserTokenFromCtx(l.ctx)
  34 + user *domain.User
  35 + conn = l.svcCtx.DefaultDBConn()
  36 + )
  37 +
  38 + // 唯一判断
  39 + // 获取当前用户信息
  40 + if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, userToken.UserId); err != nil {
  41 + return nil, xerr.NewErrMsgErr("用户不存在", err)
  42 + }
  43 +
  44 + dm = NewDomainArticleTemplate(req.ArticleTemplate)
  45 + dm.CompanyId = 0
  46 +
  47 + dm.Operator = domain.Operator{
  48 + Id: userToken.UserId,
  49 + Name: user.Name,
  50 + Type: 2,
  51 + }
  52 + if req.BelongTo == int(domain.BelongToCompany) {
  53 + dm.BelongTo = domain.BelongToCompany
  54 + dm.CompanyId = user.CompanyId
  55 + } else {
  56 + dm.BelongTo = domain.BelongToIndividual
  57 + dm.UserId = userToken.UserId
  58 + }
  59 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  60 + dm, err = l.svcCtx.ArticleTemplateRepository.Insert(l.ctx, conn, dm)
  61 + return err
  62 + }, true); err != nil {
  63 + return nil, xerr.NewErrMsg("保存失败")
  64 + }
  65 + resp = &types.ArticleTemplateSaveResponse{}
  66 + return
  67 +}
  1 +package template
  2 +
  3 +import (
  4 + "context"
  5 + "github.com/samber/lo"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
  9 +
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  12 +
  13 + "github.com/zeromicro/go-zero/core/logx"
  14 +)
  15 +
  16 +type MiniArticleTemplateSearchLogic struct {
  17 + logx.Logger
  18 + ctx context.Context
  19 + svcCtx *svc.ServiceContext
  20 +}
  21 +
  22 +func NewMiniArticleTemplateSearchLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniArticleTemplateSearchLogic {
  23 + return &MiniArticleTemplateSearchLogic{
  24 + Logger: logx.WithContext(ctx),
  25 + ctx: ctx,
  26 + svcCtx: svcCtx,
  27 + }
  28 +}
  29 +
  30 +func (l *MiniArticleTemplateSearchLogic) MiniArticleTemplateSearch(req *types.ArticleTemplateSearchRequest) (resp *types.ArticleTemplateSearchResponse, err error) {
  31 + var (
  32 + userToken = contextdata.GetUserTokenFromCtx(l.ctx)
  33 + conn = l.svcCtx.DefaultDBConn()
  34 + user *domain.User
  35 + )
  36 + if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, userToken.UserId); err != nil {
  37 + return nil, xerr.NewErrMsgErr("用户不存在", err)
  38 + }
  39 + req.CompanyId = user.CompanyId
  40 + logic := NewSystemArticleTemplateSearchLogic(l.ctx, l.svcCtx)
  41 + resp, err = logic.SystemArticleTemplateSearch(req)
  42 + if err != nil {
  43 + return nil, err
  44 + }
  45 + // 过滤可见性
  46 + list := make([]types.ArticleTemplateItem, 0)
  47 + lo.ForEach(resp.List, func(item types.ArticleTemplateItem, index int) {
  48 + if item.TargetWhoRead == int(domain.ArticleTemplateLimit) {
  49 + if !lo.Contains(item.WhoRead, user.Id) {
  50 + return
  51 + }
  52 + }
  53 + list = append(list, item)
  54 + })
  55 + resp.List = list
  56 + resp.Total = int64(len(list))
  57 + return
  58 +}
  1 +package template
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  6 +
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  9 +
  10 + "github.com/zeromicro/go-zero/core/logx"
  11 +)
  12 +
  13 +type MiniArticleTemplateSearchMineLogic struct {
  14 + logx.Logger
  15 + ctx context.Context
  16 + svcCtx *svc.ServiceContext
  17 +}
  18 +
  19 +func NewMiniArticleTemplateSearchMineLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniArticleTemplateSearchMineLogic {
  20 + return &MiniArticleTemplateSearchMineLogic{
  21 + Logger: logx.WithContext(ctx),
  22 + ctx: ctx,
  23 + svcCtx: svcCtx,
  24 + }
  25 +}
  26 +
  27 +func (l *MiniArticleTemplateSearchMineLogic) MiniArticleTemplateSearchMine(req *types.ArticleTemplateSearchRequest) (resp *types.ArticleTemplateSearchResponse, err error) {
  28 + var (
  29 + userToken = contextdata.GetUserTokenFromCtx(l.ctx)
  30 + )
  31 + req.UserId = userToken.UserId
  32 + logic := NewSystemArticleTemplateSearchLogic(l.ctx, l.svcCtx)
  33 + return logic.SystemArticleTemplateSearch(req)
  34 +}
  1 +package template
  2 +
  3 +import (
  4 + "context"
  5 +
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  8 +
  9 + "github.com/zeromicro/go-zero/core/logx"
  10 +)
  11 +
  12 +type MiniArticleTemplateUpdateLogic struct {
  13 + logx.Logger
  14 + ctx context.Context
  15 + svcCtx *svc.ServiceContext
  16 +}
  17 +
  18 +func NewMiniArticleTemplateUpdateLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniArticleTemplateUpdateLogic {
  19 + return &MiniArticleTemplateUpdateLogic{
  20 + Logger: logx.WithContext(ctx),
  21 + ctx: ctx,
  22 + svcCtx: svcCtx,
  23 + }
  24 +}
  25 +
  26 +func (l *MiniArticleTemplateUpdateLogic) MiniArticleTemplateUpdate(req *types.ArticleTemplateUpdateRequest) (resp *types.ArticleTemplateUpdateResponse, err error) {
  27 + logic := NewSystemArticleTemplateUpdateLogic(l.ctx, l.svcCtx)
  28 + return logic.SystemArticleTemplateUpdate(req)
  29 +}
  1 +package template
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
  8 +
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  11 +
  12 + "github.com/zeromicro/go-zero/core/logx"
  13 +)
  14 +
  15 +type SystemArticleTemplateBatchDeleteLogic struct {
  16 + logx.Logger
  17 + ctx context.Context
  18 + svcCtx *svc.ServiceContext
  19 +}
  20 +
  21 +func NewSystemArticleTemplateBatchDeleteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemArticleTemplateBatchDeleteLogic {
  22 + return &SystemArticleTemplateBatchDeleteLogic{
  23 + Logger: logx.WithContext(ctx),
  24 + ctx: ctx,
  25 + svcCtx: svcCtx,
  26 + }
  27 +}
  28 +
  29 +func (l *SystemArticleTemplateBatchDeleteLogic) SystemArticleTemplateBatchDelete(req *types.ArticleTemplateBatchDeleteRequest) (resp *types.ArticleTemplateBatchResponse, err error) {
  30 + var (
  31 + dm *domain.ArticleTemplate
  32 + )
  33 +
  34 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  35 + for _, id := range req.Ids {
  36 + if dm, err = l.svcCtx.ArticleTemplateRepository.FindOne(l.ctx, conn, int64(id)); err != nil {
  37 + return xerr.NewErrMsgErr("不存在", err)
  38 + }
  39 + if dm, err = l.svcCtx.ArticleTemplateRepository.Delete(l.ctx, conn, dm); err != nil {
  40 + return err
  41 + }
  42 + }
  43 + return nil
  44 + }, true); err != nil {
  45 + return nil, xerr.NewErrMsgErr("移除失败", err)
  46 + }
  47 + resp = &types.ArticleTemplateBatchResponse{}
  48 + return
  49 +}
  1 +package template
  2 +
  3 +import (
  4 + "context"
  5 + "github.com/samber/lo"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  10 +
  11 + "github.com/zeromicro/go-zero/core/logx"
  12 +)
  13 +
  14 +type SystemArticleTemplateClassSearchLogic struct {
  15 + logx.Logger
  16 + ctx context.Context
  17 + svcCtx *svc.ServiceContext
  18 +}
  19 +
  20 +func NewSystemArticleTemplateClassSearchLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemArticleTemplateClassSearchLogic {
  21 + return &SystemArticleTemplateClassSearchLogic{
  22 + Logger: logx.WithContext(ctx),
  23 + ctx: ctx,
  24 + svcCtx: svcCtx,
  25 + }
  26 +}
  27 +
  28 +func (l *SystemArticleTemplateClassSearchLogic) SystemArticleTemplateClassSearch(req *types.ArticleTemplateClassSearchRequest) (resp *types.ArticleTemplateClassSearchResponse, err error) {
  29 + var (
  30 + conn = l.svcCtx.DefaultDBConn()
  31 + dms []*domain.ArticleTemplate
  32 + userToken = contextdata.GetUserTokenFromCtx(l.ctx)
  33 + )
  34 + queryOptions := domain.NewQueryOptions()
  35 + queryOptions.WithKV("name", req.Name).
  36 + MustWithKV("companyId", userToken.CompanyId)
  37 + _, dms, err = l.svcCtx.ArticleTemplateRepository.Find(l.ctx, conn, queryOptions)
  38 + class := lo.Uniq(domain.Values(dms, func(item *domain.ArticleTemplate) string {
  39 + return item.TemplateClass
  40 + }))
  41 + resp = &types.ArticleTemplateClassSearchResponse{
  42 + Total: int64(len(class)),
  43 + }
  44 + lo.ForEach(class, func(item string, index int) {
  45 + resp.List = append(resp.List, types.ArticleTemplateClassItem{
  46 + Name: item,
  47 + })
  48 + })
  49 + return
  50 +}
  1 +package template
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
  8 +
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  11 +
  12 + "github.com/zeromicro/go-zero/core/logx"
  13 +)
  14 +
  15 +type SystemArticleTemplateDeleteLogic struct {
  16 + logx.Logger
  17 + ctx context.Context
  18 + svcCtx *svc.ServiceContext
  19 +}
  20 +
  21 +func NewSystemArticleTemplateDeleteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemArticleTemplateDeleteLogic {
  22 + return &SystemArticleTemplateDeleteLogic{
  23 + Logger: logx.WithContext(ctx),
  24 + ctx: ctx,
  25 + svcCtx: svcCtx,
  26 + }
  27 +}
  28 +
  29 +func (l *SystemArticleTemplateDeleteLogic) SystemArticleTemplateDelete(req *types.ArticleTemplateDeleteRequest) (resp *types.ArticleTemplateDeleteResponse, err error) {
  30 + var (
  31 + conn = l.svcCtx.DefaultDBConn()
  32 + dm *domain.ArticleTemplate
  33 + )
  34 + if dm, err = l.svcCtx.ArticleTemplateRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  35 + return nil, xerr.NewErrMsgErr("不存在", err)
  36 + }
  37 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  38 + if dm, err = l.svcCtx.ArticleTemplateRepository.Delete(l.ctx, conn, dm); err != nil {
  39 + return err
  40 + }
  41 + return nil
  42 + }, true); err != nil {
  43 + return nil, xerr.NewErrMsgErr("移除失败", err)
  44 + }
  45 + resp = &types.ArticleTemplateDeleteResponse{}
  46 + return
  47 +}
  1 +package template
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
  7 +
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  10 +
  11 + "github.com/zeromicro/go-zero/core/logx"
  12 +)
  13 +
  14 +type SystemArticleTemplateGetLogic struct {
  15 + logx.Logger
  16 + ctx context.Context
  17 + svcCtx *svc.ServiceContext
  18 +}
  19 +
  20 +func NewSystemArticleTemplateGetLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemArticleTemplateGetLogic {
  21 + return &SystemArticleTemplateGetLogic{
  22 + Logger: logx.WithContext(ctx),
  23 + ctx: ctx,
  24 + svcCtx: svcCtx,
  25 + }
  26 +}
  27 +
  28 +func (l *SystemArticleTemplateGetLogic) SystemArticleTemplateGet(req *types.ArticleTemplateGetRequest) (resp *types.ArticleTemplateGetResponse, err error) {
  29 + var (
  30 + conn = l.svcCtx.DefaultDBConn()
  31 + dm *domain.ArticleTemplate
  32 + userMap = make(map[int64]*domain.User)
  33 + )
  34 + // 货号唯一
  35 + if dm, err = l.svcCtx.ArticleTemplateRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  36 + return nil, xerr.NewErrMsgErr("不存在", err)
  37 + }
  38 + item := NewTypesArticleTemplate(dm)
  39 + for _, id := range dm.WhoRead {
  40 + if user, _ := domain.LazyLoad(userMap, l.ctx, conn, id, l.svcCtx.UserRepository.FindOne); user != nil {
  41 + item.WhoReadInfo = append(item.WhoReadInfo, types.TargetUser{
  42 + Id: user.Id,
  43 + Name: user.Name,
  44 + })
  45 + }
  46 + }
  47 + for _, id := range dm.WhoReview {
  48 + if user, _ := domain.LazyLoad(userMap, l.ctx, conn, id, l.svcCtx.UserRepository.FindOne); user != nil {
  49 + item.WhoReviewInfo = append(item.WhoReviewInfo, types.TargetUser{
  50 + Id: user.Id,
  51 + Name: user.Name,
  52 + })
  53 + }
  54 + }
  55 + resp = &types.ArticleTemplateGetResponse{
  56 + ArticleTemplate: item,
  57 + }
  58 + return
  59 +}
  1 +package template
  2 +
  3 +import (
  4 + "context"
  5 + "github.com/google/uuid"
  6 + "github.com/samber/lo"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/gateway/authlib"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
  12 +
  13 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  14 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  15 +
  16 + "github.com/zeromicro/go-zero/core/logx"
  17 +)
  18 +
  19 +type SystemArticleTemplateSaveLogic struct {
  20 + logx.Logger
  21 + ctx context.Context
  22 + svcCtx *svc.ServiceContext
  23 +}
  24 +
  25 +func NewSystemArticleTemplateSaveLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemArticleTemplateSaveLogic {
  26 + return &SystemArticleTemplateSaveLogic{
  27 + Logger: logx.WithContext(ctx),
  28 + ctx: ctx,
  29 + svcCtx: svcCtx,
  30 + }
  31 +}
  32 +
  33 +func (l *SystemArticleTemplateSaveLogic) SystemArticleTemplateSave(req *types.ArticleTemplateSaveRequest) (resp *types.ArticleTemplateSaveResponse, err error) {
  34 + var (
  35 + dm *domain.ArticleTemplate
  36 + userToken = contextdata.GetUserTokenFromCtx(l.ctx)
  37 + )
  38 + // 唯一判断
  39 + // 获取当前用户信息
  40 + userMe, err := l.svcCtx.ApiAuthService.MeInfo(l.ctx, authlib.RequestUserMeQuery{Token: req.AccessToken})
  41 + if err != nil {
  42 + return nil, xerr.NewErrMsgErr("获取当前用户信息失败", err)
  43 + }
  44 +
  45 + dm = NewDomainArticleTemplate(req.ArticleTemplate)
  46 + dm.CompanyId = userToken.CompanyId
  47 + dm.UserId = 0
  48 + dm.BelongTo = domain.BelongToCompany
  49 + dm.Operator = domain.Operator{
  50 + Id: userToken.UserId,
  51 + Name: userMe.User.NickName,
  52 + Type: 1,
  53 + }
  54 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  55 + dm, err = l.svcCtx.ArticleTemplateRepository.Insert(l.ctx, conn, dm)
  56 + return err
  57 + }, true); err != nil {
  58 + return nil, xerr.NewErrMsg("保存失败")
  59 + }
  60 + resp = &types.ArticleTemplateSaveResponse{}
  61 + return
  62 +}
  63 +
  64 +func NewDomainArticleTemplate(item types.ArticleTemplateItem) *domain.ArticleTemplate {
  65 + var paragraphs = make([]domain.Paragraph, 0)
  66 + lo.ForEach(item.Paragraphs, func(p types.Paragraph, index int) {
  67 + paragraphs = append(paragraphs, NewDomainParagraph(p))
  68 + })
  69 + return &domain.ArticleTemplate{
  70 + Name: item.Name,
  71 + TemplateClass: item.TemplateClass,
  72 + Paragraphs: paragraphs,
  73 + Icon: item.Icon,
  74 + TargetWhoRead: domain.ArticleTemplateTarget(item.TargetWhoRead),
  75 + TargetWhoReview: domain.ArticleTemplateTarget(item.TargetWhoReview),
  76 + WhoRead: item.WhoRead,
  77 + WhoReview: item.WhoReview,
  78 + }
  79 +}
  80 +
  81 +func NewTypesArticleTemplate(item *domain.ArticleTemplate) types.ArticleTemplateItem {
  82 + var paragraphs = make([]types.Paragraph, 0)
  83 + lo.ForEach(item.Paragraphs, func(p domain.Paragraph, index int) {
  84 + paragraphs = append(paragraphs, NewTypesParagraph(p))
  85 + })
  86 + return types.ArticleTemplateItem{
  87 + Id: item.Id,
  88 + Name: item.Name,
  89 + TemplateClass: item.TemplateClass,
  90 + Paragraphs: paragraphs,
  91 + Icon: item.Icon,
  92 + TargetWhoRead: int(item.TargetWhoRead),
  93 + TargetWhoReview: int(item.TargetWhoReview),
  94 + WhoRead: item.WhoRead,
  95 + WhoReview: item.WhoReview,
  96 + Operator: item.Operator.Name,
  97 + WhoReadInfo: make([]types.TargetUser, 0),
  98 + WhoReviewInfo: make([]types.TargetUser, 0),
  99 + UpdatedAt: item.UpdatedAt,
  100 + }
  101 +}
  102 +
  103 +func NewDomainParagraph(item types.Paragraph) domain.Paragraph {
  104 + idGen, _ := uuid.NewUUID()
  105 + return domain.Paragraph{
  106 + ID: idGen.String(),
  107 + Title: item.Title,
  108 + Prompt: item.Prompt,
  109 + Required: item.Required,
  110 + Type: item.Type,
  111 + }
  112 +}
  113 +
  114 +func NewTypesParagraph(item domain.Paragraph) types.Paragraph {
  115 + return types.Paragraph{
  116 + ID: item.ID,
  117 + Title: item.Title,
  118 + Prompt: item.Prompt,
  119 + Required: item.Required,
  120 + Type: item.Type,
  121 + }
  122 +}
  1 +package template
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  6 +
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  9 +
  10 + "github.com/zeromicro/go-zero/core/logx"
  11 +)
  12 +
  13 +type SystemArticleTemplateSearchLogic struct {
  14 + logx.Logger
  15 + ctx context.Context
  16 + svcCtx *svc.ServiceContext
  17 +}
  18 +
  19 +func NewSystemArticleTemplateSearchLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemArticleTemplateSearchLogic {
  20 + return &SystemArticleTemplateSearchLogic{
  21 + Logger: logx.WithContext(ctx),
  22 + ctx: ctx,
  23 + svcCtx: svcCtx,
  24 + }
  25 +}
  26 +
  27 +func (l *SystemArticleTemplateSearchLogic) SystemArticleTemplateSearch(req *types.ArticleTemplateSearchRequest) (resp *types.ArticleTemplateSearchResponse, err error) {
  28 + var (
  29 + conn = l.svcCtx.DefaultDBConn()
  30 + dms []*domain.ArticleTemplate
  31 + total int64
  32 + userMap = make(map[int64]*domain.User)
  33 + )
  34 +
  35 + queryOptions := domain.NewQueryOptions()
  36 + if req.Page > 0 && req.Size > 0 {
  37 + queryOptions.WithOffsetLimit(req.Page, req.Size)
  38 + }
  39 + queryOptions.WithKV("name", req.Name).WithKV("templateClass", req.TemplateClass).
  40 + WithKV("companyId", req.CompanyId).WithKV("userId", req.UserId)
  41 + if req.Target != nil {
  42 + queryOptions.MustWithKV("target", *req.Target)
  43 + }
  44 +
  45 + total, dms, err = l.svcCtx.ArticleTemplateRepository.Find(l.ctx, conn, queryOptions)
  46 + list := make([]types.ArticleTemplateItem, 0)
  47 + for i := range dms {
  48 + item := NewTypesArticleTemplate(dms[i])
  49 + for _, id := range dms[i].WhoRead {
  50 + if user, _ := domain.LazyLoad(userMap, l.ctx, conn, id, l.svcCtx.UserRepository.FindOne); user != nil {
  51 + item.WhoReadInfo = append(item.WhoReadInfo, types.TargetUser{
  52 + Id: user.Id,
  53 + Name: user.Name,
  54 + })
  55 + }
  56 + }
  57 + for _, id := range dms[i].WhoReview {
  58 + if user, _ := domain.LazyLoad(userMap, l.ctx, conn, id, l.svcCtx.UserRepository.FindOne); user != nil {
  59 + item.WhoReviewInfo = append(item.WhoReviewInfo, types.TargetUser{
  60 + Id: user.Id,
  61 + Name: user.Name,
  62 + })
  63 + }
  64 + }
  65 + list = append(list, item)
  66 + }
  67 + resp = &types.ArticleTemplateSearchResponse{
  68 + List: list,
  69 + Total: total,
  70 + }
  71 + return
  72 +}
  1 +package template
  2 +
  3 +import (
  4 + "context"
  5 + "github.com/samber/lo"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
  9 +
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  12 +
  13 + "github.com/zeromicro/go-zero/core/logx"
  14 +)
  15 +
  16 +type SystemArticleTemplateUpdateLogic struct {
  17 + logx.Logger
  18 + ctx context.Context
  19 + svcCtx *svc.ServiceContext
  20 +}
  21 +
  22 +func NewSystemArticleTemplateUpdateLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemArticleTemplateUpdateLogic {
  23 + return &SystemArticleTemplateUpdateLogic{
  24 + Logger: logx.WithContext(ctx),
  25 + ctx: ctx,
  26 + svcCtx: svcCtx,
  27 + }
  28 +}
  29 +
  30 +func (l *SystemArticleTemplateUpdateLogic) SystemArticleTemplateUpdate(req *types.ArticleTemplateUpdateRequest) (resp *types.ArticleTemplateUpdateResponse, err error) {
  31 + var (
  32 + conn = l.svcCtx.DefaultDBConn()
  33 + dm *domain.ArticleTemplate
  34 + )
  35 + if dm, err = l.svcCtx.ArticleTemplateRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  36 + return nil, xerr.NewErrMsgErr("不存在", err)
  37 + }
  38 + // 不可编辑判断
  39 +
  40 + // 赋值
  41 + item := req.ArticleTemplate
  42 + var paragraphs = make([]domain.Paragraph, 0)
  43 + lo.ForEach(item.Paragraphs, func(p types.Paragraph, index int) {
  44 + paragraphs = append(paragraphs, NewDomainParagraph(p))
  45 + })
  46 + dm.Name = item.Name
  47 + dm.TemplateClass = item.TemplateClass
  48 + dm.Paragraphs = paragraphs
  49 + dm.Icon = item.Icon
  50 + dm.TargetWhoRead = domain.ArticleTemplateTarget(item.TargetWhoRead)
  51 + dm.TargetWhoReview = domain.ArticleTemplateTarget(item.TargetWhoReview)
  52 + dm.WhoRead = item.WhoRead
  53 + dm.WhoReview = item.WhoReview
  54 +
  55 + // 更新
  56 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  57 + dm, err = l.svcCtx.ArticleTemplateRepository.UpdateWithVersion(l.ctx, conn, dm)
  58 + return err
  59 + }, true); err != nil {
  60 + return nil, xerr.NewErrMsg("更新失败")
  61 + }
  62 + resp = &types.ArticleTemplateUpdateResponse{}
  63 + return
  64 +}
@@ -37,6 +37,7 @@ type ServiceContext struct { @@ -37,6 +37,7 @@ type ServiceContext struct {
37 ArticleAndTagRepository domain.ArticleAndTagRepository 37 ArticleAndTagRepository domain.ArticleAndTagRepository
38 ArticleDraftOperationRepository domain.ArticleDraftOperationRepository 38 ArticleDraftOperationRepository domain.ArticleDraftOperationRepository
39 ArticleSecurityRepository domain.ArticleSecurityRepository 39 ArticleSecurityRepository domain.ArticleSecurityRepository
  40 + ArticleTemplateRepository domain.ArticleTemplateRepository
40 41
41 CompanyRepository domain.CompanyRepository 42 CompanyRepository domain.CompanyRepository
42 DepartmentRepository domain.DepartmentRepository 43 DepartmentRepository domain.DepartmentRepository
@@ -96,6 +97,7 @@ func NewServiceContext(c config.Config) *ServiceContext { @@ -96,6 +97,7 @@ func NewServiceContext(c config.Config) *ServiceContext {
96 ArticleCategoryRepository: repository.NewArticleCategoryRepository(cache.NewCachedRepository(mlCache)), 97 ArticleCategoryRepository: repository.NewArticleCategoryRepository(cache.NewCachedRepository(mlCache)),
97 ArticleDraftOperationRepository: repository.NewArticleDraftOperationRepository(cache.NewCachedRepository(mlCache)), 98 ArticleDraftOperationRepository: repository.NewArticleDraftOperationRepository(cache.NewCachedRepository(mlCache)),
98 ArticleSecurityRepository: repository.NewArticleSecurityRepository(cache.NewCachedRepository(mlCache)), 99 ArticleSecurityRepository: repository.NewArticleSecurityRepository(cache.NewCachedRepository(mlCache)),
  100 + ArticleTemplateRepository: repository.NewArticleTemplateRepository(cache.NewCachedRepository(mlCache)),
99 101
100 CompanyRepository: repository.NewCompanyRepository(cache.NewCachedRepository(mlCache)), 102 CompanyRepository: repository.NewCompanyRepository(cache.NewCachedRepository(mlCache)),
101 DepartmentRepository: repository.NewDepartmentRepository(cache.NewCachedRepository(mlCache)), 103 DepartmentRepository: repository.NewDepartmentRepository(cache.NewCachedRepository(mlCache)),
@@ -958,14 +958,15 @@ type Operator struct { @@ -958,14 +958,15 @@ type Operator struct {
958 } 958 }
959 959
960 type MiniArticleCreateRequest struct { 960 type MiniArticleCreateRequest struct {
961 - Title string `json:"title"` //标题  
962 - Section []string `json:"section"` //文章的文本内容  
963 - AuthorId int64 `json:"authorId,optional"` //发布人id  
964 - Images []string `json:"images,optional"` //图片  
965 - WhoRead []int64 `json:"whoRead,optional"` //谁可查看  
966 - WhoReview []int64 `json:"whoReview,optional"` //谁可评论  
967 - Location Location `json:"location,optional"` //定位坐标  
968 - MatchUrl map[string]string `json:"matchUrl"` // 匹配文章内容中的url文本 961 + Title string `json:"title"` //标题
  962 + Section []string `json:"section"` //文章的文本内容
  963 + AuthorId int64 `json:"authorId,optional"` //发布人id
  964 + Images []string `json:"images,optional"` //图片
  965 + WhoRead []int64 `json:"whoRead,optional"` //谁可查看
  966 + WhoReview []int64 `json:"whoReview,optional"` //谁可评论
  967 + Location Location `json:"location,optional"` //定位坐标
  968 + MatchUrl map[string]string `json:"matchUrl"` // 匹配文章内容中的url文本
  969 + Paragraphs []Paragraph `json:"paragraphs,optional"` // 段落
969 } 970 }
970 971
971 type MiniArticleCreateResponse struct { 972 type MiniArticleCreateResponse struct {
@@ -1002,10 +1003,13 @@ type MiniArticleGetResponse struct { @@ -1002,10 +1003,13 @@ type MiniArticleGetResponse struct {
1002 } 1003 }
1003 1004
1004 type ArticleSection struct { 1005 type ArticleSection struct {
1005 - Id int64 `json:"id"` //段落id  
1006 - Content string `json:"content"` // 文本内容  
1007 - SortBy int `json:"sortBy"` // 排序  
1008 - TotalComment int `json:"totalComment"` // 评论的数量 1006 + Id int64 `json:"id"` //段落id
  1007 + Content string `json:"content"` // 文本内容
  1008 + SortBy int `json:"sortBy"` // 排序
  1009 + TotalComment int `json:"totalComment"` // 评论的数量
  1010 + Images []string `json:"images"` // 照片列表
  1011 + ParagraphType int `json:"paragraphType"` // 段落类型 0:无样式 1:模板文本 2:模板图片
  1012 + ParagraphTemplate Paragraph `json:"paragraphTemplate"` // 段落模板
1009 } 1013 }
1010 1014
1011 type MiniArticleSearchMeRequest struct { 1015 type MiniArticleSearchMeRequest struct {
@@ -1156,16 +1160,17 @@ type MiniArticleMarkUserReadResponse struct { @@ -1156,16 +1160,17 @@ type MiniArticleMarkUserReadResponse struct {
1156 } 1160 }
1157 1161
1158 type MiniArticleDraftCreateRequest struct { 1162 type MiniArticleDraftCreateRequest struct {
1159 - CompanyId int64 `json:",optional"`  
1160 - AuthorId int64 `json:",optional"` // 发布人  
1161 - Template int `json:"template"` // 使用哪个模板进行编辑 0、无 1、演绎式 2、归纳式  
1162 - Section []string `json:"section"` // 填写的内容  
1163 - Title string `json:"title"` // 标题  
1164 - Images []string `json:"images"` // 图片  
1165 - WhoRead []int64 `json:"whoRead"` // 谁可以看  
1166 - WhoReview []int64 `json:"whoReview"` // 评论人  
1167 - Location Location `json:"location"` // 坐标  
1168 - MatchUrl map[string]string `json:"matchUrl"` // 匹配文章内容中的url文本 1163 + CompanyId int64 `json:",optional"`
  1164 + AuthorId int64 `json:",optional"` // 发布人
  1165 + Template int `json:"template"` // 使用哪个模板进行编辑 0、无 1、演绎式 2、归纳式
  1166 + Section []string `json:"section"` // 填写的内容
  1167 + Title string `json:"title"` // 标题
  1168 + Images []string `json:"images"` // 图片
  1169 + WhoRead []int64 `json:"whoRead"` // 谁可以看
  1170 + WhoReview []int64 `json:"whoReview"` // 评论人
  1171 + Location Location `json:"location"` // 坐标
  1172 + MatchUrl map[string]string `json:"matchUrl"` // 匹配文章内容中的url文本
  1173 + Paragraphs []Paragraph `json:"paragraphs,optional"` // 段落
1169 } 1174 }
1170 1175
1171 type MiniArticleDraftCreateResponse struct { 1176 type MiniArticleDraftCreateResponse struct {
@@ -1173,17 +1178,18 @@ type MiniArticleDraftCreateResponse struct { @@ -1173,17 +1178,18 @@ type MiniArticleDraftCreateResponse struct {
1173 } 1178 }
1174 1179
1175 type MiniArticleDraftUpdateRequest struct { 1180 type MiniArticleDraftUpdateRequest struct {
1176 - Id int64 `json:"id"`  
1177 - CompanyId int64 `json:",optional"`  
1178 - AuthorId int64 `json:",optional"` // 发布人  
1179 - Template int `json:"template"` // 使用哪个模板进行编辑 0、无 1、演绎式 2、归纳式  
1180 - Section []string `json:"section"` // 填写的内容  
1181 - Title string `json:"title"` // 标题  
1182 - Images []string `json:"images"` // 图片  
1183 - WhoRead []int64 `json:"whoRead"` // 谁可以看  
1184 - WhoReview []int64 `json:"whoReview"` // 评论人  
1185 - Location Location `json:"location"` // 坐标  
1186 - MatchUrl map[string]string `json:"matchUrl"` // 匹配文章内容中的url文本 1181 + Id int64 `json:"id"`
  1182 + CompanyId int64 `json:",optional"`
  1183 + AuthorId int64 `json:",optional"` // 发布人
  1184 + Template int `json:"template"` // 使用哪个模板进行编辑 0、无 1、演绎式 2、归纳式
  1185 + Section []string `json:"section"` // 填写的内容
  1186 + Title string `json:"title"` // 标题
  1187 + Images []string `json:"images"` // 图片
  1188 + WhoRead []int64 `json:"whoRead"` // 谁可以看
  1189 + WhoReview []int64 `json:"whoReview"` // 评论人
  1190 + Location Location `json:"location"` // 坐标
  1191 + MatchUrl map[string]string `json:"matchUrl"` // 匹配文章内容中的url文本
  1192 + Paragraphs []Paragraph `json:"paragraphs,optional"` // 段落
1187 } 1193 }
1188 1194
1189 type MiniArticleDraftUpdateResponse struct { 1195 type MiniArticleDraftUpdateResponse struct {
@@ -1400,6 +1406,7 @@ type SystemArticleCreateRequest struct { @@ -1400,6 +1406,7 @@ type SystemArticleCreateRequest struct {
1400 MatchUrl map[string]string `json:"matchUrl,optional"` // 匹配文章内容中的url文本 1406 MatchUrl map[string]string `json:"matchUrl,optional"` // 匹配文章内容中的url文本
1401 ArticleDraftId int64 `json:"articleDraftId"` // 草稿ID 1407 ArticleDraftId int64 `json:"articleDraftId"` // 草稿ID
1402 AccessToken string `header:"x-mmm-accesstoken"` // 授权token 1408 AccessToken string `header:"x-mmm-accesstoken"` // 授权token
  1409 + Paragraphs []Paragraph `json:"paragraphs,optional"` // 段落
1403 } 1410 }
1404 1411
1405 type SystemArticleCreateResponse struct { 1412 type SystemArticleCreateResponse struct {
@@ -1908,3 +1915,105 @@ type ContentDetailItem struct { @@ -1908,3 +1915,105 @@ type ContentDetailItem struct {
1908 Type int `json:"type"` // 内容类型 (1:文章 2:评论) 1915 Type int `json:"type"` // 内容类型 (1:文章 2:评论)
1909 Text string `json:"text"` // 内容文本 1916 Text string `json:"text"` // 内容文本
1910 } 1917 }
  1918 +
  1919 +type ArticleTemplateGetRequest struct {
  1920 + Id int64 `path:"id"`
  1921 +}
  1922 +
  1923 +type ArticleTemplateGetResponse struct {
  1924 + ArticleTemplate ArticleTemplateItem `json:"item"`
  1925 +}
  1926 +
  1927 +type ArticleTemplateSaveRequest struct {
  1928 + AccessToken string `header:"x-mmm-accesstoken"` // 授权token
  1929 + ArticleTemplate ArticleTemplateItem `json:"item"`
  1930 + BelongTo int `json:"belongTo,optional,default=2"` // 模板属于: 1:企业 、2:个人
  1931 +}
  1932 +
  1933 +type ArticleTemplateSaveResponse struct {
  1934 +}
  1935 +
  1936 +type ArticleTemplateDeleteRequest struct {
  1937 + Id int64 `path:"id"`
  1938 +}
  1939 +
  1940 +type ArticleTemplateDeleteResponse struct {
  1941 +}
  1942 +
  1943 +type ArticleTemplateBatchDeleteRequest struct {
  1944 + Ids []int64 `json:"ids"`
  1945 +}
  1946 +
  1947 +type ArticleTemplateBatchResponse struct {
  1948 +}
  1949 +
  1950 +type ArticleTemplateUpdateRequest struct {
  1951 + Id int64 `path:"id"`
  1952 + ArticleTemplate ArticleTemplateItem `json:"item"`
  1953 +}
  1954 +
  1955 +type ArticleTemplateUpdateResponse struct {
  1956 +}
  1957 +
  1958 +type ArticleTemplateSearchRequest struct {
  1959 + Page int `json:"page,optional"`
  1960 + Size int `json:"size,optional"`
  1961 + Name string `json:"name,optional"` // 模板名称
  1962 + TemplateClass string `json:"templateClass,optional"` // 模板分类
  1963 + Target *int `json:"target,optional"` // 目标 0 全员 1 指定人
  1964 + CompanyId int64 `json:",optional"` // 属于企业时有值
  1965 + UserId int64 `json:",optional"` // 属于个人时有值
  1966 +}
  1967 +
  1968 +type ArticleTemplateSearchResponse struct {
  1969 + List []ArticleTemplateItem `json:"list"`
  1970 + Total int64 `json:"total"`
  1971 +}
  1972 +
  1973 +type ArticleTemplateClassSearchRequest struct {
  1974 + Page int `json:"page,optional"`
  1975 + Size int `json:"size,optional"`
  1976 + Name string `json:"name,optional"` // 模板名称
  1977 + CompanyId int64 `json:",optional"` // 属于企业时有值
  1978 + UserId int64 `json:",optional"` // 属于个人时有值
  1979 +}
  1980 +
  1981 +type ArticleTemplateClassSearchResponse struct {
  1982 + List []ArticleTemplateClassItem `json:"list"`
  1983 + Total int64 `json:"total"`
  1984 +}
  1985 +
  1986 +type ArticleTemplateClassItem struct {
  1987 + Name string `json:"name"` // 名称
  1988 +}
  1989 +
  1990 +type ArticleTemplateItem struct {
  1991 + Id int64 `json:"id,optional"` // 唯一标识
  1992 + Name string `json:"name"` // 模板名称
  1993 + TemplateClass string `json:"templateClass"` // 模板分类
  1994 + Paragraphs []Paragraph `json:"paragraphs"` // 段落列表
  1995 + Icon string `json:"icon,optional"` // 图标地址
  1996 + TargetWhoRead int `json:"targetWhoRead,optional"` // 分发方式 0 分发给所有人 1 分发给指定的人
  1997 + TargetWhoReview int `json:"targetWhoReview,optional"` // 分发方式 0 分发给所有人 1 分发给指定的人
  1998 + WhoRead []int64 `json:"whoRead,optional"` // 谁可以看
  1999 + WhoReview []int64 `json:"whoReview,optional"` // 查看、评论人
  2000 + WhoReadInfo []TargetUser `json:"whoReadInfo,optional"` // 谁可查看
  2001 + WhoReviewInfo []TargetUser `json:"whoReviewInfo,optional"` // 谁可评论
  2002 + Operator string `json:"operator,omitempty,optional"` // 操作人
  2003 + UpdatedAt int64 `json:"updatedAt,omitempty,optional"` // 更新时间戳
  2004 +}
  2005 +
  2006 +type Paragraph struct {
  2007 + ID string `json:"id,optional"` // 唯一标识
  2008 + Title string `json:"title,optional"` // 标题
  2009 + Prompt string `json:"prompt,optional"` // 文本提示
  2010 + Required bool `json:"required,optional"` // 必填
  2011 + Type int `json:"type,optional"` // 段落类型 1:文本 2:图片
  2012 + Text string `json:"text,optional,omitempty"` // 文本内容
  2013 + Images []string `json:"images,optional,omitempty"` // 图片地址列表
  2014 +}
  2015 +
  2016 +type TargetUser struct {
  2017 + Id int64 `json:"id"`
  2018 + Name string `json:"name"`
  2019 +}
  1 +
  2 +syntax = "v1"
  3 +
  4 +info(
  5 + title: "xx实例"
  6 + desc: "xx实例"
  7 + author: "author"
  8 + email: "email"
  9 + version: "v1"
  10 +)
  11 +
  12 +@server(
  13 + prefix: article_template/v1
  14 + group: article_template
  15 + jwt: JwtAuth
  16 +)
  17 +service Core {
  18 + @doc "详情"
  19 + @handler article_templateGet
  20 + get /article_template/:id (ArticleTemplateGetRequest) returns (ArticleTemplateGetResponse)
  21 + @doc "保存"
  22 + @handler article_templateSave
  23 + post /article_template (ArticleTemplateSaveRequest) returns (ArticleTemplateSaveResponse)
  24 + @doc "删除"
  25 + @handler article_templateDelete
  26 + delete /article_template/:id (ArticleTemplateDeleteRequest) returns (ArticleTemplateDeleteResponse)
  27 + @doc "更新"
  28 + @handler article_templateUpdate
  29 + put /article_template/:id (ArticleTemplateUpdateRequest) returns (ArticleTemplateUpdateResponse)
  30 + @doc "搜索"
  31 + @handler article_templateSearch
  32 + post /article_template/search (ArticleTemplateSearchRequest) returns (ArticleTemplateSearchResponse)
  33 +}
  34 +
  35 +type (
  36 + ArticleTemplateGetRequest {
  37 + Id int64 `path:"id"`
  38 + }
  39 + ArticleTemplateGetResponse struct{
  40 + ArticleTemplate ArticleTemplateItem `json:"article_template"`
  41 + }
  42 +
  43 + ArticleTemplateSaveRequest struct{
  44 + ArticleTemplate ArticleTemplateItem `json:"article_template"`
  45 + }
  46 + ArticleTemplateSaveResponse struct{}
  47 +
  48 + ArticleTemplateDeleteRequest struct{
  49 + Id int64 `path:"id"`
  50 + }
  51 + ArticleTemplateDeleteResponse struct{}
  52 +
  53 + ArticleTemplateUpdateRequest struct{
  54 + Id int64 `path:"id"`
  55 + ArticleTemplate ArticleTemplateItem `json:"article_template"`
  56 + }
  57 + ArticleTemplateUpdateResponse struct{}
  58 +
  59 + ArticleTemplateSearchRequest struct{
  60 + Page int `json:"page"`
  61 + Size int `json:"size"`
  62 + }
  63 + ArticleTemplateSearchResponse{
  64 + List []ArticleTemplateItem `json:"list"`
  65 + Total int64 `json:"total"`
  66 + }
  67 + ArticleTemplateItem struct{
  68 +
  69 + }
  70 +)
  71 +
  72 +// logic CRUD
  73 +// Save
  74 + //var (
  75 + // conn = l.svcCtx.DefaultDBConn()
  76 + // dm *domain.ArticleTemplate
  77 + //)
  78 + //// 唯一判断
  79 +
  80 + //dm = NewDomainArticleTemplate(req.ArticleTemplate)
  81 + //if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  82 + // dm, err = l.svcCtx.ArticleTemplateRepository.Insert(l.ctx, conn, dm)
  83 + // return err
  84 + //}, true); err != nil {
  85 + // return nil, xerr.NewErrMsg("保存失败")
  86 + //}
  87 + ////resp = &types.ArticleTemplateSaveResponse{}
  88 + //return
  89 +
  90 +//func NewDomainArticleTemplate(item types.ArticleTemplateItem) *domain.ArticleTemplate {
  91 +// return &domain.ArticleTemplate{
  92 +
  93 +// }
  94 +//}
  95 +//
  96 +//func NewTypesArticleTemplate(item *domain.ArticleTemplate) types.ArticleTemplateItem {
  97 +// return types.ArticleTemplateItem{
  98 +// Id: item.Id,
  99 +// }
  100 +//}
  101 +
  102 +// Get
  103 + //var (
  104 + // conn = l.svcCtx.DefaultDBConn()
  105 + // dm *domain.ArticleTemplate
  106 + //)
  107 + //// 货号唯一
  108 + //if dm, err = l.svcCtx.ArticleTemplateRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  109 + // return nil, xerr.NewErrMsgErr("不存在", err)
  110 + //}
  111 + //resp = &types.ArticleTemplateGetResponse{
  112 + // ArticleTemplate: NewTypesArticleTemplate(dm),
  113 + //}
  114 + //return
  115 +
  116 +// Delete
  117 + //var (
  118 + // conn = l.svcCtx.DefaultDBConn()
  119 + // dm *domain.ArticleTemplate
  120 + //)
  121 + //if dm, err = l.svcCtx.ArticleTemplateRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  122 + // return nil, xerr.NewErrMsgErr("不存在", err)
  123 + //}
  124 + //if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  125 + // if dm, err = l.svcCtx.ArticleTemplateRepository.Delete(l.ctx, conn, dm); err != nil {
  126 + // return err
  127 + // }
  128 + // return nil
  129 + //}, true); err != nil {
  130 + // return nil, xerr.NewErrMsgErr("移除失败", err)
  131 + //}
  132 + //return
  133 +
  134 +// Search
  135 + //var (
  136 + // conn = l.svcCtx.DefaultDBConn()
  137 + // dms []*domain.ArticleTemplate
  138 + // total int64
  139 + //)
  140 + //
  141 + //queryOptions := domain.NewQueryOptions().WithOffsetLimit(req.Page, req.Size).
  142 + // WithKV("", "")
  143 +
  144 + //total, dms, err = l.svcCtx.ArticleTemplateRepository.Find(l.ctx, conn, queryOptions)
  145 + //list := make([]types.ArticleTemplateItem, 0)
  146 + //for i := range dms {
  147 + // list = append(list, NewTypesArticleTemplate(dms[i]))
  148 + //}
  149 + //resp = &types.ArticleTemplateSearchResponse{
  150 + // List: list,
  151 + // Total: total,
  152 + //}
  153 + //return
  154 +
  155 +// Update
  156 + //var (
  157 + // conn = l.svcCtx.DefaultDBConn()
  158 + // dm *domain.ArticleTemplate
  159 + //)
  160 + //if dm, err = l.svcCtx.ArticleTemplateRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  161 + // return nil, xerr.NewErrMsgErr("不存在", err)
  162 + //}
  163 + //// 不可编辑判断
  164 +
  165 + //// 赋值
  166 +
  167 + //// 更新
  168 + //if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  169 + // dm, err = l.svcCtx.ArticleTemplateRepository.UpdateWithVersion(l.ctx, conn, dm)
  170 + // return err
  171 + //}, true); err != nil {
  172 + // return nil, xerr.NewErrMsg("更新失败")
  173 + //}
  174 + //resp = &types.ArticleTemplateUpdateResponse{}
  175 + //return
  1 +
  2 +syntax = "proto3";
  3 +
  4 +option go_package ="./pb";
  5 +
  6 +package pb;
  7 +
  8 +message ArticleTemplateGetReq {
  9 + int64 Id = 1;
  10 +}
  11 +message ArticleTemplateGetResp{
  12 + ArticleTemplateItem User = 1;
  13 +}
  14 +
  15 +message ArticleTemplateSaveReq {
  16 +
  17 +}
  18 +message ArticleTemplateSaveResp{
  19 +
  20 +}
  21 +
  22 +message ArticleTemplateDeleteReq {
  23 + int64 Id = 1;
  24 +}
  25 +message ArticleTemplateDeleteResp{
  26 +
  27 +}
  28 +
  29 +message ArticleTemplateUpdateReq {
  30 + int64 Id = 1;
  31 +}
  32 +message ArticleTemplateUpdateResp{
  33 +
  34 +}
  35 +
  36 +message ArticleTemplateSearchReq {
  37 + int64 PageNumber = 1;
  38 + int64 PageSize = 2;
  39 +}
  40 +message ArticleTemplateSearchResp{
  41 + repeated ArticleTemplateItem List =1;
  42 + int64 Total =2;
  43 +}
  44 +message ArticleTemplateItem {
  45 +
  46 +}
  47 +
  48 +service ArticleTemplateService {
  49 + rpc ArticleTemplateGet(ArticleTemplateGetReq) returns(ArticleTemplateGetResp);
  50 + rpc ArticleTemplateSave(ArticleTemplateSaveReq) returns(ArticleTemplateSaveResp);
  51 + rpc ArticleTemplateDelete(ArticleTemplateDeleteReq) returns(ArticleTemplateDeleteResp);
  52 + rpc ArticleTemplateUpdate(ArticleTemplateUpdateReq) returns(ArticleTemplateUpdateResp);
  53 + rpc ArticleTemplateSearch(ArticleTemplateSearchReq) returns(ArticleTemplateSearchResp);
  54 +}
@@ -32,6 +32,7 @@ func Migrate(db *gorm.DB) { @@ -32,6 +32,7 @@ func Migrate(db *gorm.DB) {
32 //&models.ArticleDraftOperation{}, 32 //&models.ArticleDraftOperation{},
33 //&models.ArticleCategory{}, 33 //&models.ArticleCategory{},
34 &models.ArticleSecurity{}, 34 &models.ArticleSecurity{},
  35 + &models.ArticleTemplate{},
35 } 36 }
36 37
37 db.AutoMigrate(modelsList...) 38 db.AutoMigrate(modelsList...)
@@ -26,6 +26,8 @@ type ArticleDraft struct { @@ -26,6 +26,8 @@ type ArticleDraft struct {
26 WhoReview []int64 `gorm:"type:jsonb;serializer:json"` // 评论人 26 WhoReview []int64 `gorm:"type:jsonb;serializer:json"` // 评论人
27 Location domain.Location `gorm:"type:jsonb;serializer:json"` // 坐标 27 Location domain.Location `gorm:"type:jsonb;serializer:json"` // 坐标
28 MatchUrl map[string]string `gorm:"type:jsonb;serializer:json"` // 匹配文章内容中的url文本 28 MatchUrl map[string]string `gorm:"type:jsonb;serializer:json"` // 匹配文章内容中的url文本
  29 +
  30 + Section []domain.ArticleSection `gorm:"type:jsonb;serializer:json"`
29 } 31 }
30 32
31 func (m *ArticleDraft) TableName() string { 33 func (m *ArticleDraft) TableName() string {
@@ -10,17 +10,20 @@ import ( @@ -10,17 +10,20 @@ import (
10 ) 10 )
11 11
12 type ArticleSection struct { 12 type ArticleSection struct {
13 - Id int64 `gorm:"primaryKey"` // 唯一标识  
14 - CompanyId int64  
15 - CreatedAt int64  
16 - UpdatedAt int64  
17 - DeletedAt int64  
18 - IsDel soft_delete.DeletedAt `gorm:"softDelete:flag,DeletedAtField:DeletedAt"`  
19 - Version int  
20 - ArticleId int64 // 文章id  
21 - Content string // 文本内容  
22 - SortBy int // 排序  
23 - TotalComment int // 评论的数量 13 + Id int64 `gorm:"primaryKey"` // 唯一标识
  14 + CompanyId int64
  15 + CreatedAt int64
  16 + UpdatedAt int64
  17 + DeletedAt int64
  18 + IsDel soft_delete.DeletedAt `gorm:"softDelete:flag,DeletedAtField:DeletedAt"`
  19 + Version int
  20 + ArticleId int64 // 文章id
  21 + Content string // 文本内容
  22 + SortBy int // 排序
  23 + TotalComment int // 评论的数量
  24 + ParagraphType int
  25 + ParagraphTemplate domain.Paragraph `gorm:"type:jsonb;serializer:json"`
  26 + Images []string `gorm:"type:jsonb;serializer:json"`
24 } 27 }
25 28
26 func (m *ArticleSection) TableName() string { 29 func (m *ArticleSection) TableName() string {
  1 +package models
  2 +
  3 +import (
  4 + "fmt"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  6 + "gorm.io/gorm"
  7 + "gorm.io/plugin/soft_delete"
  8 +)
  9 +
  10 +type ArticleTemplate struct {
  11 + Id int64 `json:",omitempty"` // 唯一标识
  12 + CompanyId int64 `json:",omitempty"` // 属于企业时有值
  13 + UserId int64 `json:",omitempty"` // 属于个人时有值
  14 + BelongTo int `json:",omitempty"` // 模板属于: 1:企业 、2:个人
  15 + TemplateClass string `json:",omitempty"` // 模板分类
  16 + Name string `json:",omitempty"` // 模板名称
  17 + Paragraphs []domain.Paragraph `gorm:"type:jsonb;serializer:json" json:",omitempty"` // 段落列表
  18 + Icon string `json:",omitempty"` // 图标地址
  19 + TargetWhoRead int `json:",omitempty"` // 分发方式 0 分发给所有人 1 分发给指定的人
  20 + TargetWhoReview int `json:",omitempty"` // 分发方式 0 分发给所有人 1 分发给指定的人
  21 + WhoRead []int64 `gorm:"type:jsonb;serializer:json" json:",omitempty"` // 谁可以看
  22 + WhoReview []int64 `gorm:"type:jsonb;serializer:json" json:",omitempty"` // 查看、评论人
  23 + Operator domain.Operator `gorm:"type:jsonb;serializer:json" json:",omitempty"`
  24 + CreatedAt int64 `json:",omitempty"`
  25 + UpdatedAt int64 `json:",omitempty"`
  26 + DeletedAt int64 `json:",omitempty"`
  27 + Version int `json:",omitempty"`
  28 + IsDel soft_delete.DeletedAt `gorm:"softDelete:flag,DeletedAtField:DeletedAt"`
  29 +}
  30 +
  31 +func (m *ArticleTemplate) TableName() string {
  32 + return "article_template"
  33 +}
  34 +
  35 +func (m *ArticleTemplate) BeforeCreate(tx *gorm.DB) (err error) {
  36 + // m.CreatedAt = time.Now().Unix()
  37 + // m.UpdatedAt = time.Now().Unix()
  38 + return
  39 +}
  40 +
  41 +func (m *ArticleTemplate) BeforeUpdate(tx *gorm.DB) (err error) {
  42 + // m.UpdatedAt = time.Now().Unix()
  43 + return
  44 +}
  45 +
  46 +func (m *ArticleTemplate) CacheKeyFunc() string {
  47 + if m.Id == 0 {
  48 + return ""
  49 + }
  50 + return fmt.Sprintf("%v:cache:%v:id:%v", domain.ProjectName, m.TableName(), m.Id)
  51 +}
  52 +
  53 +func (m *ArticleTemplate) CacheKeyFuncByObject(obj interface{}) string {
  54 + if v, ok := obj.(*ArticleTemplate); ok {
  55 + return v.CacheKeyFunc()
  56 + }
  57 + return ""
  58 +}
  59 +
  60 +func (m *ArticleTemplate) CachePrimaryKeyFunc() string {
  61 + if len("") == 0 {
  62 + return ""
  63 + }
  64 + return fmt.Sprintf("%v:cache:%v:primarykey:%v", domain.ProjectName, m.TableName(), "key")
  65 +}
@@ -167,16 +167,19 @@ func (repository *ArticleSectionRepository) Find(ctx context.Context, conn trans @@ -167,16 +167,19 @@ func (repository *ArticleSectionRepository) Find(ctx context.Context, conn trans
167 167
168 func (repository *ArticleSectionRepository) ModelToDomainModel(from *models.ArticleSection) (*domain.ArticleSection, error) { 168 func (repository *ArticleSectionRepository) ModelToDomainModel(from *models.ArticleSection) (*domain.ArticleSection, error) {
169 to := &domain.ArticleSection{ 169 to := &domain.ArticleSection{
170 - Id: from.Id,  
171 - CompanyId: from.CompanyId,  
172 - CreatedAt: from.CreatedAt,  
173 - UpdatedAt: from.UpdatedAt,  
174 - DeletedAt: from.DeletedAt,  
175 - Version: from.Version,  
176 - ArticleId: from.ArticleId,  
177 - Content: from.Content,  
178 - SortBy: from.SortBy,  
179 - TotalComment: from.TotalComment, 170 + Id: from.Id,
  171 + CompanyId: from.CompanyId,
  172 + CreatedAt: from.CreatedAt,
  173 + UpdatedAt: from.UpdatedAt,
  174 + DeletedAt: from.DeletedAt,
  175 + Version: from.Version,
  176 + ArticleId: from.ArticleId,
  177 + Content: from.Content,
  178 + SortBy: from.SortBy,
  179 + TotalComment: from.TotalComment,
  180 + ParagraphType: from.ParagraphType,
  181 + ParagraphTemplate: from.ParagraphTemplate,
  182 + Images: from.Images,
180 } 183 }
181 // err := copier.Copy(to, from) 184 // err := copier.Copy(to, from)
182 return to, nil 185 return to, nil
@@ -184,16 +187,19 @@ func (repository *ArticleSectionRepository) ModelToDomainModel(from *models.Arti @@ -184,16 +187,19 @@ func (repository *ArticleSectionRepository) ModelToDomainModel(from *models.Arti
184 187
185 func (repository *ArticleSectionRepository) DomainModelToModel(from *domain.ArticleSection) (*models.ArticleSection, error) { 188 func (repository *ArticleSectionRepository) DomainModelToModel(from *domain.ArticleSection) (*models.ArticleSection, error) {
186 to := &models.ArticleSection{ 189 to := &models.ArticleSection{
187 - Id: from.Id,  
188 - CompanyId: from.CompanyId,  
189 - CreatedAt: from.CreatedAt,  
190 - UpdatedAt: from.UpdatedAt,  
191 - DeletedAt: from.DeletedAt,  
192 - Version: from.Version,  
193 - ArticleId: from.ArticleId,  
194 - Content: from.Content,  
195 - SortBy: from.SortBy,  
196 - TotalComment: from.TotalComment, 190 + Id: from.Id,
  191 + CompanyId: from.CompanyId,
  192 + CreatedAt: from.CreatedAt,
  193 + UpdatedAt: from.UpdatedAt,
  194 + DeletedAt: from.DeletedAt,
  195 + Version: from.Version,
  196 + ArticleId: from.ArticleId,
  197 + Content: from.Content,
  198 + SortBy: from.SortBy,
  199 + TotalComment: from.TotalComment,
  200 + ParagraphType: from.ParagraphType,
  201 + ParagraphTemplate: from.ParagraphTemplate,
  202 + Images: from.Images,
197 } 203 }
198 // err := copier.Copy(to, from) 204 // err := copier.Copy(to, from)
199 return to, nil 205 return to, nil
  1 +package repository
  2 +
  3 +import (
  4 + "context"
  5 + "fmt"
  6 + "github.com/jinzhu/copier"
  7 + "github.com/pkg/errors"
  8 + "github.com/tiptok/gocomm/pkg/cache"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/models"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  12 + "gorm.io/gorm"
  13 +)
  14 +
  15 +type ArticleTemplateRepository struct {
  16 + *cache.CachedRepository
  17 +}
  18 +
  19 +func (repository *ArticleTemplateRepository) Insert(ctx context.Context, conn transaction.Conn, dm *domain.ArticleTemplate) (*domain.ArticleTemplate, error) {
  20 + var (
  21 + err error
  22 + m = &models.ArticleTemplate{}
  23 + tx = conn.DB()
  24 + )
  25 + if m, err = repository.DomainModelToModel(dm); err != nil {
  26 + return nil, err
  27 + }
  28 + if tx = tx.Model(m).Save(m); tx.Error != nil {
  29 + return nil, tx.Error
  30 + }
  31 + dm.Id = m.Id
  32 + return repository.ModelToDomainModel(m)
  33 +
  34 +}
  35 +
  36 +func (repository *ArticleTemplateRepository) Update(ctx context.Context, conn transaction.Conn, dm *domain.ArticleTemplate) (*domain.ArticleTemplate, error) {
  37 + var (
  38 + err error
  39 + m *models.ArticleTemplate
  40 + tx = conn.DB()
  41 + )
  42 + if m, err = repository.DomainModelToModel(dm); err != nil {
  43 + return nil, err
  44 + }
  45 + queryFunc := func() (interface{}, error) {
  46 + tx = tx.Model(m).Updates(m)
  47 + return nil, tx.Error
  48 + }
  49 + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
  50 + return nil, err
  51 + }
  52 + return repository.ModelToDomainModel(m)
  53 +}
  54 +
  55 +func (repository *ArticleTemplateRepository) UpdateWithVersion(ctx context.Context, transaction transaction.Conn, dm *domain.ArticleTemplate) (*domain.ArticleTemplate, error) {
  56 + var (
  57 + err error
  58 + m *models.ArticleTemplate
  59 + tx = transaction.DB()
  60 + )
  61 + if m, err = repository.DomainModelToModel(dm); err != nil {
  62 + return nil, err
  63 + }
  64 + oldVersion := dm.Version
  65 + m.Version += 1
  66 + queryFunc := func() (interface{}, error) {
  67 + tx = tx.Model(m).Select("*").Where("id = ?", m.Id).Where("version = ?", oldVersion).Updates(m)
  68 + if tx.RowsAffected == 0 {
  69 + return nil, domain.ErrUpdateFail
  70 + }
  71 + return nil, tx.Error
  72 + }
  73 + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
  74 + return nil, err
  75 + }
  76 + return repository.ModelToDomainModel(m)
  77 +}
  78 +
  79 +func (repository *ArticleTemplateRepository) Delete(ctx context.Context, conn transaction.Conn, dm *domain.ArticleTemplate) (*domain.ArticleTemplate, error) {
  80 + var (
  81 + tx = conn.DB()
  82 + m = &models.ArticleTemplate{Id: dm.Identify().(int64)}
  83 + )
  84 + queryFunc := func() (interface{}, error) {
  85 + tx = tx.Where("id = ?", m.Id).Delete(m)
  86 + return m, tx.Error
  87 + }
  88 + if _, err := repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
  89 + return dm, err
  90 + }
  91 + return repository.ModelToDomainModel(m)
  92 +}
  93 +
  94 +func (repository *ArticleTemplateRepository) FindOne(ctx context.Context, conn transaction.Conn, id int64) (*domain.ArticleTemplate, error) {
  95 + var (
  96 + err error
  97 + tx = conn.DB()
  98 + m = new(models.ArticleTemplate)
  99 + )
  100 + queryFunc := func() (interface{}, error) {
  101 + tx = tx.Model(m).Where("id = ?", id).First(m)
  102 + if errors.Is(tx.Error, gorm.ErrRecordNotFound) {
  103 + return nil, domain.ErrNotFound
  104 + }
  105 + return m, tx.Error
  106 + }
  107 + cacheModel := new(models.ArticleTemplate)
  108 + cacheModel.Id = id
  109 + if err = repository.QueryCache(cacheModel.CacheKeyFunc, m, queryFunc); err != nil {
  110 + return nil, err
  111 + }
  112 + return repository.ModelToDomainModel(m)
  113 +}
  114 +
  115 +func (repository *ArticleTemplateRepository) Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*domain.ArticleTemplate, error) {
  116 + var (
  117 + tx = conn.DB()
  118 + ms []*models.ArticleTemplate
  119 + dms = make([]*domain.ArticleTemplate, 0)
  120 + total int64
  121 + )
  122 + queryFunc := func() (interface{}, error) {
  123 + tx = tx.Model(&ms).Order("id desc")
  124 + if v, ok := queryOptions["companyId"]; ok {
  125 + tx.Where("company_id = ? ", v)
  126 + }
  127 + if v, ok := queryOptions["userId"]; ok {
  128 + tx.Where("user_id = ? ", v)
  129 + }
  130 + if v, ok := queryOptions["name"]; ok {
  131 + tx.Where("name like ? ", fmt.Sprintf("%%%v%%", v))
  132 + }
  133 + if v, ok := queryOptions["templateClass"]; ok {
  134 + tx.Where("template_class = ? ", v)
  135 + }
  136 + if v, ok := queryOptions["target"]; ok {
  137 + tx.Where("target_who_read = ? ", v)
  138 + }
  139 + if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
  140 + return dms, tx.Error
  141 + }
  142 + return dms, nil
  143 + }
  144 +
  145 + if _, err := repository.Query(queryFunc); err != nil {
  146 + return 0, nil, err
  147 + }
  148 +
  149 + for _, item := range ms {
  150 + if dm, err := repository.ModelToDomainModel(item); err != nil {
  151 + return 0, dms, err
  152 + } else {
  153 + dms = append(dms, dm)
  154 + }
  155 + }
  156 + return total, dms, nil
  157 +}
  158 +
  159 +func (repository *ArticleTemplateRepository) ModelToDomainModel(from *models.ArticleTemplate) (*domain.ArticleTemplate, error) {
  160 + to := &domain.ArticleTemplate{}
  161 + err := copier.Copy(to, from)
  162 + return to, err
  163 +}
  164 +
  165 +func (repository *ArticleTemplateRepository) DomainModelToModel(from *domain.ArticleTemplate) (*models.ArticleTemplate, error) {
  166 + to := &models.ArticleTemplate{}
  167 + err := copier.Copy(to, from)
  168 + return to, err
  169 +}
  170 +
  171 +func NewArticleTemplateRepository(cache *cache.CachedRepository) domain.ArticleTemplateRepository {
  172 + return &ArticleTemplateRepository{CachedRepository: cache}
  173 +}
@@ -24,6 +24,8 @@ type ArticleDraft struct { @@ -24,6 +24,8 @@ type ArticleDraft struct {
24 WhoReview []int64 `json:"whoReview"` // 评论人 24 WhoReview []int64 `json:"whoReview"` // 评论人
25 Location Location `json:"location"` // 坐标 25 Location Location `json:"location"` // 坐标
26 MatchUrl map[string]string `json:"matchUrl"` // 匹配文章内容中的url文本 26 MatchUrl map[string]string `json:"matchUrl"` // 匹配文章内容中的url文本
  27 +
  28 + Section []*ArticleSection `json:"section"` // 分段内容
27 } 29 }
28 type ArticleDraftRepository interface { 30 type ArticleDraftRepository interface {
29 Insert(ctx context.Context, conn transaction.Conn, dm *ArticleDraft) (*ArticleDraft, error) 31 Insert(ctx context.Context, conn transaction.Conn, dm *ArticleDraft) (*ArticleDraft, error)
@@ -8,16 +8,19 @@ import ( @@ -8,16 +8,19 @@ import (
8 8
9 // 文章段落内容 9 // 文章段落内容
10 type ArticleSection struct { 10 type ArticleSection struct {
11 - Id int64 `json:"id"`  
12 - CompanyId int64 `json:"companyId"`  
13 - CreatedAt int64 `json:"createdAt,omitempty"`  
14 - UpdatedAt int64 `json:"updatedAt,omitempty"`  
15 - DeletedAt int64 `json:"deletedAt,omitempty"`  
16 - Version int `json:"version,omitempty"`  
17 - ArticleId int64 `json:"articleId"` // 文章id  
18 - Content string `json:"content"` // 文本内容  
19 - SortBy int `json:"sortBy"` // 排序  
20 - TotalComment int `json:"totalComment"` // 评论的数量 11 + Id int64 `json:"id"`
  12 + CompanyId int64 `json:"companyId"`
  13 + CreatedAt int64 `json:"createdAt,omitempty"`
  14 + UpdatedAt int64 `json:"updatedAt,omitempty"`
  15 + DeletedAt int64 `json:"deletedAt,omitempty"`
  16 + Version int `json:"version,omitempty"`
  17 + ArticleId int64 `json:"articleId"` // 文章id
  18 + Content string `json:"content"` // 文本内容
  19 + SortBy int `json:"sortBy"` // 排序
  20 + TotalComment int `json:"totalComment"` // 评论的数量
  21 + Images []string `json:"images"` // 照片列表
  22 + ParagraphType int `json:"paragraphType"` // 段落类型 1:文本 2:图片
  23 + ParagraphTemplate Paragraph `json:"paragraphTemplate"` // 段落模板
21 } 24 }
22 25
23 type ArticleSectionRepository interface { 26 type ArticleSectionRepository interface {
  1 +package domain
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
  6 +)
  7 +
  8 +type ArticleTemplate struct {
  9 + Id int64 `json:",omitempty"` // 唯一标识
  10 + CompanyId int64 `json:",omitempty"` // 属于企业时有值
  11 + UserId int64 `json:",omitempty"` // 属于个人时有值
  12 + BelongTo TemplateBelongToType `json:",omitempty"` // 模板属于: 1:企业 、2:个人
  13 + TemplateClass string `json:",omitempty"` // 模板分类
  14 + Name string `json:",omitempty"` // 模板名称
  15 + Paragraphs []Paragraph `json:",omitempty"` // 段落列表
  16 + Icon string `json:",omitempty"` // 图标地址
  17 + TargetWhoRead ArticleTemplateTarget `json:",omitempty"` // 分发方式 0 分发给所有人 1 分发给指定的人
  18 + TargetWhoReview ArticleTemplateTarget `json:",omitempty"` // 分发方式 0 分发给所有人 1 分发给指定的人
  19 + WhoRead []int64 `json:",omitempty"` // 谁可以看
  20 + WhoReview []int64 `json:",omitempty"` // 查看、评论人
  21 + Operator Operator `json:",omitempty"` // 操作人(企业时有值)
  22 + CreatedAt int64 `json:",omitempty"`
  23 + UpdatedAt int64 `json:",omitempty"`
  24 + DeletedAt int64 `json:",omitempty"`
  25 + Version int `json:",omitempty"`
  26 +}
  27 +
  28 +type ArticleTemplateRepository interface {
  29 + Insert(ctx context.Context, conn transaction.Conn, dm *ArticleTemplate) (*ArticleTemplate, error)
  30 + Update(ctx context.Context, conn transaction.Conn, dm *ArticleTemplate) (*ArticleTemplate, error)
  31 + UpdateWithVersion(ctx context.Context, conn transaction.Conn, dm *ArticleTemplate) (*ArticleTemplate, error)
  32 + Delete(ctx context.Context, conn transaction.Conn, dm *ArticleTemplate) (*ArticleTemplate, error)
  33 + FindOne(ctx context.Context, conn transaction.Conn, id int64) (*ArticleTemplate, error)
  34 + Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*ArticleTemplate, error)
  35 +}
  36 +
  37 +func (m *ArticleTemplate) Identify() interface{} {
  38 + if m.Id == 0 {
  39 + return nil
  40 + }
  41 + return m.Id
  42 +}
  43 +
  44 +type Paragraph struct {
  45 + ID string `json:",omitempty"` // 唯一标识
  46 + Title string `json:",omitempty"` // 标题
  47 + Prompt string `json:",omitempty"` // 文本提示
  48 + Required bool `json:",omitempty"` // 必填
  49 + Type int `json:",omitempty"` // 段落类型 0:未使用模板 1:模板文本 2:模板图片
  50 +}
  51 +
  52 +type TemplateBelongToType int
  53 +
  54 +const (
  55 + // BelongToCompany 属于公司
  56 + BelongToCompany TemplateBelongToType = 1
  57 + // BelongToIndividual 属于个人
  58 + BelongToIndividual TemplateBelongToType = 2
  59 +)
  60 +
  61 +type ArticleTemplateTarget int
  62 +
  63 +const (
  64 + ArticleTemplateAll ArticleTarget = 0 //所有人
  65 + ArticleTemplateLimit ArticleTarget = 1 //指定的人
  66 +)
@@ -45,8 +45,9 @@ type UserSimple struct { @@ -45,8 +45,9 @@ type UserSimple struct {
45 CompanyId int64 `json:"companyId"` 45 CompanyId int64 `json:"companyId"`
46 } 46 }
47 47
48 -// 运营操作人 48 +// Operator 运营操作人
49 type Operator struct { 49 type Operator struct {
50 Id int64 `json:"id,string"` // 人员id 50 Id int64 `json:"id,string"` // 人员id
51 Name string `json:"name"` // 人员名字 51 Name string `json:"name"` // 人员名字
  52 + Type int `json:"type"` // 1:系统管理员 2:个人
52 } 53 }
@@ -67,4 +67,14 @@ CREATE TABLE `user_wechat` @@ -67,4 +67,14 @@ CREATE TABLE `user_wechat`
67 CREATE TABLE `article_security` ( 67 CREATE TABLE `article_security` (
68 `id` int(0) NOT NULL COMMENT '唯一标识', 68 `id` int(0) NOT NULL COMMENT '唯一标识',
69 PRIMARY KEY (`id`) USING BTREE 69 PRIMARY KEY (`id`) USING BTREE
  70 +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  71 +
  72 +CREATE TABLE `article_template` (
  73 + `id` int(0) NOT NULL COMMENT '唯一标识',
  74 + PRIMARY KEY (`id`) USING BTREE
  75 +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  76 +
  77 +CREATE TABLE `article_template` (
  78 + `id` int(0) NOT NULL COMMENT '唯一标识',
  79 + PRIMARY KEY (`id`) USING BTREE
70 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; 80 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  1 +alter table article_draft add column section jsonb;
  2 +
  3 +alter table article_section add column paragraph_template jsonb;
  4 +alter table article_section add column paragraph_type int8;
  5 +alter table article_section add column images jsonb;
  6 +update article_section set paragraph_type = 0;