作者 庄敏学

解决冲突

正在显示 91 个修改的文件 包含 4111 行增加479 行删除
@@ -127,6 +127,34 @@ @@ -127,6 +127,34 @@
127 ] 127 ]
128 } 128 }
129 }, 129 },
  130 + "v1/mini/article/set_tag": {
  131 + "post": {
  132 + "summary": "小程序设置文章的定性标签",
  133 + "operationId": "MiniArticleSetTag",
  134 + "responses": {
  135 + "200": {
  136 + "description": "A successful response.",
  137 + "schema": {
  138 + "$ref": "#/definitions/MiniArticleSetTagResponse"
  139 + }
  140 + }
  141 + },
  142 + "parameters": [
  143 + {
  144 + "name": "body",
  145 + "in": "body",
  146 + "required": true,
  147 + "schema": {
  148 + "$ref": "#/definitions/MiniArticleSetTagRequest"
  149 + }
  150 + }
  151 + ],
  152 + "requestBody": {},
  153 + "tags": [
  154 + "article"
  155 + ]
  156 + }
  157 + },
130 "v1/mini/article/user_like/list": { 158 "v1/mini/article/user_like/list": {
131 "post": { 159 "post": {
132 "summary": "小程序获取文章的点赞人员列表", 160 "summary": "小程序获取文章的点赞人员列表",
@@ -293,6 +321,151 @@ @@ -293,6 +321,151 @@
293 ] 321 ]
294 } 322 }
295 }, 323 },
  324 +<<<<<<< HEAD
  325 +=======
  326 + "v1/mini/article_comment/at_who/list": {
  327 + "post": {
  328 + "summary": "小程序展示评论时@人可选列表",
  329 + "operationId": "MiniArticleCommentAtWho",
  330 + "responses": {
  331 + "200": {
  332 + "description": "A successful response.",
  333 + "schema": {
  334 + "$ref": "#/definitions/MiniArticleCommentAtWhoResponse"
  335 + }
  336 + }
  337 + },
  338 + "parameters": [
  339 + {
  340 + "name": "body",
  341 + "in": "body",
  342 + "required": true,
  343 + "schema": {
  344 + "$ref": "#/definitions/MiniArticleCommentAtWhoRequest"
  345 + }
  346 + }
  347 + ],
  348 + "requestBody": {},
  349 + "tags": [
  350 + "comment"
  351 + ]
  352 + }
  353 + },
  354 + "v1/mini/article_comment/list": {
  355 + "post": {
  356 + "summary": "小程序展示文章的评论列表",
  357 + "operationId": "MiniListArticleComment",
  358 + "responses": {
  359 + "200": {
  360 + "description": "A successful response.",
  361 + "schema": {
  362 + "$ref": "#/definitions/MiniListArticleCommentResponse"
  363 + }
  364 + }
  365 + },
  366 + "parameters": [
  367 + {
  368 + "name": "body",
  369 + "in": "body",
  370 + "required": true,
  371 + "schema": {
  372 + "$ref": "#/definitions/MiniListArticleCommentRequest"
  373 + }
  374 + }
  375 + ],
  376 + "requestBody": {},
  377 + "tags": [
  378 + "comment"
  379 + ]
  380 + }
  381 + },
  382 + "v1/mini/article_comment/top5": {
  383 + "post": {
  384 + "summary": "小程序展示文章的评论列表TOP5",
  385 + "operationId": "MiniTop5ArticleComment",
  386 + "responses": {
  387 + "200": {
  388 + "description": "A successful response.",
  389 + "schema": {
  390 + "$ref": "#/definitions/MiniTop5ArticleCommentResponse"
  391 + }
  392 + }
  393 + },
  394 + "parameters": [
  395 + {
  396 + "name": "body",
  397 + "in": "body",
  398 + "required": true,
  399 + "schema": {
  400 + "$ref": "#/definitions/MiniTop5ArticleCommentRequest"
  401 + }
  402 + }
  403 + ],
  404 + "requestBody": {},
  405 + "tags": [
  406 + "comment"
  407 + ]
  408 + }
  409 + },
  410 + "v1/mini/article_comment/{id}": {
  411 + "get": {
  412 + "summary": "小程序展示单个文章的评论",
  413 + "operationId": "MiniGetArticleComment",
  414 + "responses": {
  415 + "200": {
  416 + "description": "A successful response.",
  417 + "schema": {
  418 + "$ref": "#/definitions/MiniGetArticleCommentResponse"
  419 + }
  420 + }
  421 + },
  422 + "parameters": [
  423 + {
  424 + "name": "id",
  425 + "in": "path",
  426 + "required": true,
  427 + "type": "string"
  428 + }
  429 + ],
  430 + "requestBody": {},
  431 + "tags": [
  432 + "comment"
  433 + ]
  434 + },
  435 + "delete": {
  436 + "summary": "小程序展示删除文章评论",
  437 + "operationId": "MiniDeleteArticleComment",
  438 + "responses": {
  439 + "200": {
  440 + "description": "A successful response.",
  441 + "schema": {
  442 + "$ref": "#/definitions/MiniDeleteArticleCommentResponse"
  443 + }
  444 + }
  445 + },
  446 + "parameters": [
  447 + {
  448 + "name": "id",
  449 + "in": "path",
  450 + "required": true,
  451 + "type": "string"
  452 + },
  453 + {
  454 + "name": "body",
  455 + "in": "body",
  456 + "required": true,
  457 + "schema": {
  458 + "$ref": "#/definitions/MiniDeleteArticleCommentRequest"
  459 + }
  460 + }
  461 + ],
  462 + "requestBody": {},
  463 + "tags": [
  464 + "comment"
  465 + ]
  466 + }
  467 + },
  468 +>>>>>>> 77e95275539c30c5787295a0b7f7cd16a3263567
296 "v1/mini/article_draft": { 469 "v1/mini/article_draft": {
297 "post": { 470 "post": {
298 "summary": "小程序创建文章进草稿箱", 471 "summary": "小程序创建文章进草稿箱",
@@ -430,6 +603,61 @@ @@ -430,6 +603,61 @@
430 "requestBody": {}, 603 "requestBody": {},
431 "tags": [ 604 "tags": [
432 "article" 605 "article"
  606 +<<<<<<< HEAD
  607 +=======
  608 + ]
  609 + }
  610 + },
  611 + "v1/mini/article_tag/list/all": {
  612 + "get": {
  613 + "summary": "小程序所有的定性标签",
  614 + "operationId": "MiniAllArticleTag",
  615 + "responses": {
  616 + "200": {
  617 + "description": "A successful response.",
  618 + "schema": {
  619 + "$ref": "#/definitions/MiniAllArticleTagResponse"
  620 + }
  621 + }
  622 + },
  623 + "parameters": [
  624 + {
  625 + "name": "",
  626 + "description": " 公司id",
  627 + "in": "query",
  628 + "required": false,
  629 + "type": "integer",
  630 + "format": "int64"
  631 + },
  632 + {
  633 + "name": "",
  634 + "description": " 公司id",
  635 + "in": "query",
  636 + "required": false,
  637 + "type": "integer",
  638 + "format": "int64"
  639 + },
  640 + {
  641 + "name": "articleId",
  642 + "description": " 文章id",
  643 + "in": "query",
  644 + "required": true,
  645 + "type": "integer",
  646 + "format": "int64"
  647 + },
  648 + {
  649 + "name": "tagId",
  650 + "description": " 标签id",
  651 + "in": "query",
  652 + "required": true,
  653 + "type": "integer",
  654 + "format": "int64"
  655 + }
  656 + ],
  657 + "requestBody": {},
  658 + "tags": [
  659 + "article"
  660 +>>>>>>> 77e95275539c30c5787295a0b7f7cd16a3263567
433 ] 661 ]
434 } 662 }
435 }, 663 },
@@ -1075,6 +1303,34 @@ @@ -1075,6 +1303,34 @@
1075 ] 1303 ]
1076 } 1304 }
1077 }, 1305 },
  1306 + "v1/system/article/search/me": {
  1307 + "post": {
  1308 + "summary": "管理后台获取我发布的文章",
  1309 + "operationId": "SystemArticleSearchMe",
  1310 + "responses": {
  1311 + "200": {
  1312 + "description": "A successful response.",
  1313 + "schema": {
  1314 + "$ref": "#/definitions/SystemArticleSearchMeResponse"
  1315 + }
  1316 + }
  1317 + },
  1318 + "parameters": [
  1319 + {
  1320 + "name": "body",
  1321 + "in": "body",
  1322 + "required": true,
  1323 + "schema": {
  1324 + "$ref": "#/definitions/SystemArticleSearchMeRequest"
  1325 + }
  1326 + }
  1327 + ],
  1328 + "requestBody": {},
  1329 + "tags": [
  1330 + "article"
  1331 + ]
  1332 + }
  1333 + },
1078 "v1/system/article/{id}": { 1334 "v1/system/article/{id}": {
1079 "get": { 1335 "get": {
1080 "summary": "管理后台获取文章内容详情", 1336 "summary": "管理后台获取文章内容详情",
@@ -1101,6 +1357,34 @@ @@ -1101,6 +1357,34 @@
1101 ] 1357 ]
1102 } 1358 }
1103 }, 1359 },
  1360 + "v1/system/article_comment/search/me": {
  1361 + "post": {
  1362 + "summary": "小程序获取回复@人可选列表",
  1363 + "operationId": "SystemArticleCommentSearchMe",
  1364 + "responses": {
  1365 + "200": {
  1366 + "description": "A successful response.",
  1367 + "schema": {
  1368 + "$ref": "#/definitions/SystemArticleCommentSearchMeResponse"
  1369 + }
  1370 + }
  1371 + },
  1372 + "parameters": [
  1373 + {
  1374 + "name": "body",
  1375 + "in": "body",
  1376 + "required": true,
  1377 + "schema": {
  1378 + "$ref": "#/definitions/SystemArticleCommentSearchMeRequest"
  1379 + }
  1380 + }
  1381 + ],
  1382 + "requestBody": {},
  1383 + "tags": [
  1384 + "comment"
  1385 + ]
  1386 + }
  1387 + },
1104 "v1/system/article_tag": { 1388 "v1/system/article_tag": {
1105 "post": { 1389 "post": {
1106 "summary": "后台创建文章标签", 1390 "summary": "后台创建文章标签",
@@ -1350,6 +1634,41 @@ @@ -1350,6 +1634,41 @@
1350 "department" 1634 "department"
1351 ] 1635 ]
1352 }, 1636 },
  1637 +<<<<<<< HEAD
  1638 +=======
  1639 + "delete": {
  1640 + "summary": "部门-删除",
  1641 + "operationId": "systemDelete",
  1642 + "responses": {
  1643 + "200": {
  1644 + "description": "A successful response.",
  1645 + "schema": {
  1646 + "$ref": "#/definitions/DepartmentGetResponse"
  1647 + }
  1648 + }
  1649 + },
  1650 + "parameters": [
  1651 + {
  1652 + "name": "id",
  1653 + "in": "path",
  1654 + "required": true,
  1655 + "type": "string"
  1656 + },
  1657 + {
  1658 + "name": "body",
  1659 + "in": "body",
  1660 + "required": true,
  1661 + "schema": {
  1662 + "$ref": "#/definitions/DepartmentGetRequest"
  1663 + }
  1664 + }
  1665 + ],
  1666 + "requestBody": {},
  1667 + "tags": [
  1668 + "department"
  1669 + ]
  1670 + },
  1671 +>>>>>>> 77e95275539c30c5787295a0b7f7cd16a3263567
1353 "put": { 1672 "put": {
1354 "summary": "部门-更新", 1673 "summary": "部门-更新",
1355 "operationId": "systemUpdate", 1674 "operationId": "systemUpdate",
@@ -1385,6 +1704,7 @@ @@ -1385,6 +1704,7 @@
1385 }, 1704 },
1386 "v1/system/role": { 1705 "v1/system/role": {
1387 "post": { 1706 "post": {
  1707 + "summary": "角色新增",
1388 "operationId": "systemSaveRole", 1708 "operationId": "systemSaveRole",
1389 "responses": { 1709 "responses": {
1390 "200": { 1710 "200": {
@@ -1412,6 +1732,7 @@ @@ -1412,6 +1732,7 @@
1412 }, 1732 },
1413 "v1/system/role/search": { 1733 "v1/system/role/search": {
1414 "post": { 1734 "post": {
  1735 + "summary": "角色列表搜索",
1415 "operationId": "systemSearchRole", 1736 "operationId": "systemSearchRole",
1416 "responses": { 1737 "responses": {
1417 "200": { 1738 "200": {
@@ -1439,6 +1760,7 @@ @@ -1439,6 +1760,7 @@
1439 }, 1760 },
1440 "v1/system/role/{id}": { 1761 "v1/system/role/{id}": {
1441 "get": { 1762 "get": {
  1763 + "summary": "角色详情",
1442 "operationId": "systemGetRole", 1764 "operationId": "systemGetRole",
1443 "responses": { 1765 "responses": {
1444 "200": { 1766 "200": {
@@ -1462,6 +1784,7 @@ @@ -1462,6 +1784,7 @@
1462 ] 1784 ]
1463 }, 1785 },
1464 "delete": { 1786 "delete": {
  1787 + "summary": "角色删除",
1465 "operationId": "systemDeleteRole", 1788 "operationId": "systemDeleteRole",
1466 "responses": { 1789 "responses": {
1467 "200": { 1790 "200": {
@@ -1493,6 +1816,7 @@ @@ -1493,6 +1816,7 @@
1493 ] 1816 ]
1494 }, 1817 },
1495 "put": { 1818 "put": {
  1819 + "summary": "角色更新",
1496 "operationId": "systemUpdateRole", 1820 "operationId": "systemUpdateRole",
1497 "responses": { 1821 "responses": {
1498 "200": { 1822 "200": {
@@ -1770,12 +2094,146 @@ @@ -1770,12 +2094,146 @@
1770 "company" 2094 "company"
1771 ] 2095 ]
1772 }, 2096 },
1773 - "ArticleSearchMe": { 2097 +<<<<<<< HEAD
  2098 +=======
  2099 + "ArticleCommentAndReply": {
1774 "type": "object", 2100 "type": "object",
1775 "properties": { 2101 "properties": {
1776 - "id": {  
1777 - "type": "integer",  
1778 - "format": "int64", 2102 + "comment": {
  2103 + "$ref": "#/definitions/ArticleCommentItem",
  2104 + "description": "评论"
  2105 + },
  2106 + "reply": {
  2107 + "type": "array",
  2108 + "items": {
  2109 + "$ref": "#/definitions/ArticleCommentItem"
  2110 + },
  2111 + "description": "回复的评论"
  2112 + },
  2113 + "totalReply": {
  2114 + "type": "integer",
  2115 + "format": "int64",
  2116 + "description": "回复的评论数量"
  2117 + }
  2118 + },
  2119 + "title": "ArticleCommentAndReply",
  2120 + "required": [
  2121 + "comment",
  2122 + "reply",
  2123 + "totalReply"
  2124 + ]
  2125 + },
  2126 + "ArticleCommentItem": {
  2127 + "type": "object",
  2128 + "properties": {
  2129 + "id": {
  2130 + "type": "integer",
  2131 + "format": "int64"
  2132 + },
  2133 + "pid": {
  2134 + "type": "integer",
  2135 + "format": "int64"
  2136 + },
  2137 + "topId": {
  2138 + "type": "integer",
  2139 + "format": "int64"
  2140 + },
  2141 + "articleId": {
  2142 + "type": "integer",
  2143 + "format": "int64",
  2144 + "description": " 文章id"
  2145 + },
  2146 + "sectionId": {
  2147 + "type": "integer",
  2148 + "format": "int64",
  2149 + "description": " 段落id"
  2150 + },
  2151 + "fromUserId": {
  2152 + "type": "integer",
  2153 + "format": "int64",
  2154 + "description": " 填写评论的人"
  2155 + },
  2156 + "fromUser": {
  2157 + "$ref": "#/definitions/CommentAuthor",
  2158 + "description": " 填写评论的人"
  2159 + },
  2160 + "toUserId": {
  2161 + "type": "integer",
  2162 + "format": "int64",
  2163 + "description": " 回复哪个人"
  2164 + },
  2165 + "toUser": {
  2166 + "$ref": "#/definitions/CommentAuthor",
  2167 + "description": " 回复哪个人"
  2168 + },
  2169 + "sectionContent": {
  2170 + "type": "string",
  2171 + "description": " 引用的文章内容文本"
  2172 + },
  2173 + "countReply": {
  2174 + "type": "integer",
  2175 + "format": "int32",
  2176 + "description": " 回复数量"
  2177 + },
  2178 + "countUserLove": {
  2179 + "type": "integer",
  2180 + "format": "int32",
  2181 + "description": " 用户点赞数量"
  2182 + },
  2183 + "countAdminLove": {
  2184 + "type": "integer",
  2185 + "format": "int32",
  2186 + "description": " 运营点赞数量"
  2187 + },
  2188 + "atWho": {
  2189 + "type": "array",
  2190 + "items": {
  2191 + "$ref": "#/definitions/CommentAtWho"
  2192 + },
  2193 + "description": " 填写评论时@的人"
  2194 + },
  2195 + "createdAt": {
  2196 + "type": "integer",
  2197 + "format": "int64"
  2198 + },
  2199 + "meLoveFlag": {
  2200 + "type": "integer",
  2201 + "format": "int32",
  2202 + "description": "当前人员对评论的点赞标识 (0 没有点赞 1有点赞)"
  2203 + },
  2204 + "content": {
  2205 + "type": "string",
  2206 + "description": " 评论的内容"
  2207 + }
  2208 + },
  2209 + "title": "ArticleCommentItem",
  2210 + "required": [
  2211 + "id",
  2212 + "pid",
  2213 + "topId",
  2214 + "articleId",
  2215 + "sectionId",
  2216 + "fromUserId",
  2217 + "fromUser",
  2218 + "toUserId",
  2219 + "toUser",
  2220 + "sectionContent",
  2221 + "countReply",
  2222 + "countUserLove",
  2223 + "countAdminLove",
  2224 + "atWho",
  2225 + "createdAt",
  2226 + "meLoveFlag",
  2227 + "content"
  2228 + ]
  2229 + },
  2230 +>>>>>>> 77e95275539c30c5787295a0b7f7cd16a3263567
  2231 + "ArticleSearchMe": {
  2232 + "type": "object",
  2233 + "properties": {
  2234 + "id": {
  2235 + "type": "integer",
  2236 + "format": "int64",
1779 "description": "id" 2237 "description": "id"
1780 }, 2238 },
1781 "title": { 2239 "title": {
@@ -1852,6 +2310,27 @@ @@ -1852,6 +2310,27 @@
1852 "totalComment" 2310 "totalComment"
1853 ] 2311 ]
1854 }, 2312 },
  2313 + "ArticleTagItem": {
  2314 + "type": "object",
  2315 + "properties": {
  2316 + "id": {
  2317 + "type": "integer",
  2318 + "format": "int64"
  2319 + },
  2320 + "group": {
  2321 + "type": "string"
  2322 + },
  2323 + "name": {
  2324 + "type": "string"
  2325 + }
  2326 + },
  2327 + "title": "ArticleTagItem",
  2328 + "required": [
  2329 + "id",
  2330 + "group",
  2331 + "name"
  2332 + ]
  2333 + },
1855 "Auth": { 2334 "Auth": {
1856 "type": "object", 2335 "type": "object",
1857 "properties": { 2336 "properties": {
@@ -1876,6 +2355,25 @@ @@ -1876,6 +2355,25 @@
1876 "code" 2355 "code"
1877 ] 2356 ]
1878 }, 2357 },
  2358 +<<<<<<< HEAD
  2359 +=======
  2360 + "CommentAtWho": {
  2361 + "type": "object",
  2362 + "properties": {
  2363 + "id": {
  2364 + "type": "integer",
  2365 + "format": "int64"
  2366 + },
  2367 + "name": {
  2368 + "type": "string"
  2369 + }
  2370 + },
  2371 + "title": "CommentAtWho",
  2372 + "required": [
  2373 + "id"
  2374 + ]
  2375 + },
  2376 +>>>>>>> 77e95275539c30c5787295a0b7f7cd16a3263567
1879 "CommentAuthor": { 2377 "CommentAuthor": {
1880 "type": "object", 2378 "type": "object",
1881 "properties": { 2379 "properties": {
@@ -1904,10 +2402,14 @@ @@ -1904,10 +2402,14 @@
1904 "title": "CommentAuthor", 2402 "title": "CommentAuthor",
1905 "required": [ 2403 "required": [
1906 "id", 2404 "id",
  2405 +<<<<<<< HEAD
1907 "name", 2406 "name",
1908 "avatar", 2407 "avatar",
1909 "position", 2408 "position",
1910 "company" 2409 "company"
  2410 +=======
  2411 + "name"
  2412 +>>>>>>> 77e95275539c30c5787295a0b7f7cd16a3263567
1911 ] 2413 ]
1912 }, 2414 },
1913 "Company": { 2415 "Company": {
@@ -2112,12 +2614,28 @@ @@ -2112,12 +2614,28 @@
2112 }, 2614 },
2113 "name": { 2615 "name": {
2114 "type": "string" 2616 "type": "string"
  2617 +<<<<<<< HEAD
  2618 +=======
  2619 + },
  2620 + "ids": {
  2621 + "type": "array",
  2622 + "items": {
  2623 + "type": "integer",
  2624 + "format": "int64"
  2625 + },
  2626 + "description": " 用户ID"
  2627 +>>>>>>> 77e95275539c30c5787295a0b7f7cd16a3263567
2115 } 2628 }
2116 }, 2629 },
2117 "title": "DepartmentUpdateRequest", 2630 "title": "DepartmentUpdateRequest",
2118 "required": [ 2631 "required": [
2119 "id", 2632 "id",
  2633 +<<<<<<< HEAD
2120 "name" 2634 "name"
  2635 +=======
  2636 + "name",
  2637 + "ids"
  2638 +>>>>>>> 77e95275539c30c5787295a0b7f7cd16a3263567
2121 ] 2639 ]
2122 }, 2640 },
2123 "FollowRequest": { 2641 "FollowRequest": {
@@ -2363,6 +2881,58 @@ @@ -2363,6 +2881,58 @@
2363 "total" 2881 "total"
2364 ] 2882 ]
2365 }, 2883 },
  2884 + "MiniAllArticleTagRequest": {
  2885 + "type": "object",
  2886 + "properties": {
  2887 + "": {
  2888 + "type": "integer",
  2889 + "format": "int64",
  2890 + "description": " 公司id"
  2891 + },
  2892 + "": {
  2893 + "type": "integer",
  2894 + "format": "int64",
  2895 + "description": " 公司id"
  2896 + },
  2897 + "articleId": {
  2898 + "type": "integer",
  2899 + "format": "int64",
  2900 + "description": " 文章id"
  2901 + },
  2902 + "tagId": {
  2903 + "type": "integer",
  2904 + "format": "int64",
  2905 + "description": " 标签id"
  2906 + }
  2907 + },
  2908 + "title": "MiniAllArticleTagRequest",
  2909 + "required": [
  2910 + "articleId",
  2911 + "tagId"
  2912 + ]
  2913 + },
  2914 + "MiniAllArticleTagResponse": {
  2915 + "type": "object",
  2916 + "properties": {
  2917 + "tagGroup": {
  2918 + "type": "array",
  2919 + "items": {
  2920 + "type": "string"
  2921 + }
  2922 + },
  2923 + "tags": {
  2924 + "type": "array",
  2925 + "items": {
  2926 + "$ref": "#/definitions/ArticleTagItem"
  2927 + }
  2928 + }
  2929 + },
  2930 + "title": "MiniAllArticleTagResponse",
  2931 + "required": [
  2932 + "tagGroup",
  2933 + "tags"
  2934 + ]
  2935 + },
2366 "MiniArticleBackupItem": { 2936 "MiniArticleBackupItem": {
2367 "type": "object", 2937 "type": "object",
2368 "properties": { 2938 "properties": {
@@ -2465,6 +3035,45 @@ @@ -2465,6 +3035,45 @@
2465 "type": "object", 3035 "type": "object",
2466 "title": "MiniArticleCommentAtUserResponse" 3036 "title": "MiniArticleCommentAtUserResponse"
2467 }, 3037 },
  3038 +<<<<<<< HEAD
  3039 +=======
  3040 + "MiniArticleCommentAtWhoRequest": {
  3041 + "type": "object",
  3042 + "properties": {
  3043 + "": {
  3044 + "type": "integer",
  3045 + "format": "int64"
  3046 + },
  3047 + "": {
  3048 + "type": "integer",
  3049 + "format": "int64"
  3050 + },
  3051 + "articleId": {
  3052 + "type": "integer",
  3053 + "format": "int64"
  3054 + }
  3055 + },
  3056 + "title": "MiniArticleCommentAtWhoRequest",
  3057 + "required": [
  3058 + "articleId"
  3059 + ]
  3060 + },
  3061 + "MiniArticleCommentAtWhoResponse": {
  3062 + "type": "object",
  3063 + "properties": {
  3064 + "list": {
  3065 + "type": "array",
  3066 + "items": {
  3067 + "$ref": "#/definitions/CommentAtWho"
  3068 + }
  3069 + }
  3070 + },
  3071 + "title": "MiniArticleCommentAtWhoResponse",
  3072 + "required": [
  3073 + "list"
  3074 + ]
  3075 + },
  3076 +>>>>>>> 77e95275539c30c5787295a0b7f7cd16a3263567
2468 "MiniArticleCreateRequest": { 3077 "MiniArticleCreateRequest": {
2469 "type": "object", 3078 "type": "object",
2470 "properties": { 3079 "properties": {
@@ -3023,7 +3632,11 @@ @@ -3023,7 +3632,11 @@
3023 "meLoveFlag": { 3632 "meLoveFlag": {
3024 "type": "integer", 3633 "type": "integer",
3025 "format": "int32", 3634 "format": "int32",
  3635 +<<<<<<< HEAD
3026 "description": "当前人员对文章的点赞标识" 3636 "description": "当前人员对文章的点赞标识"
  3637 +=======
  3638 + "description": " 当前人员对文章的点赞标识 (0 没有点赞 1有点赞)"
  3639 +>>>>>>> 77e95275539c30c5787295a0b7f7cd16a3263567
3027 } 3640 }
3028 }, 3641 },
3029 "title": "MiniArticleGetResponse", 3642 "title": "MiniArticleGetResponse",
@@ -3209,6 +3822,52 @@ @@ -3209,6 +3822,52 @@
3209 "list" 3822 "list"
3210 ] 3823 ]
3211 }, 3824 },
  3825 +<<<<<<< HEAD
  3826 +=======
  3827 + "MiniArticleSetTagRequest": {
  3828 + "type": "object",
  3829 + "properties": {
  3830 + "": {
  3831 + "type": "integer",
  3832 + "format": "int64",
  3833 + "description": " 公司id"
  3834 + },
  3835 + "": {
  3836 + "type": "integer",
  3837 + "format": "int64",
  3838 + "description": " 公司id"
  3839 + },
  3840 + "articleId": {
  3841 + "type": "integer",
  3842 + "format": "int64",
  3843 + "description": " 文章id"
  3844 + },
  3845 + "tagId": {
  3846 + "type": "integer",
  3847 + "format": "int64",
  3848 + "description": " 标签id"
  3849 + }
  3850 + },
  3851 + "title": "MiniArticleSetTagRequest",
  3852 + "required": [
  3853 + "articleId",
  3854 + "tagId"
  3855 + ]
  3856 + },
  3857 + "MiniArticleSetTagResponse": {
  3858 + "type": "object",
  3859 + "properties": {
  3860 + "id": {
  3861 + "type": "integer",
  3862 + "format": "int64"
  3863 + }
  3864 + },
  3865 + "title": "MiniArticleSetTagResponse",
  3866 + "required": [
  3867 + "id"
  3868 + ]
  3869 + },
  3870 +>>>>>>> 77e95275539c30c5787295a0b7f7cd16a3263567
3212 "MiniCreateArticleCommentRequest": { 3871 "MiniCreateArticleCommentRequest": {
3213 "type": "object", 3872 "type": "object",
3214 "properties": { 3873 "properties": {
@@ -3232,7 +3891,11 @@ @@ -3232,7 +3891,11 @@
3232 "format": "int64", 3891 "format": "int64",
3233 "description": " 服务端自动获取" 3892 "description": " 服务端自动获取"
3234 }, 3893 },
  3894 +<<<<<<< HEAD
3235 "commnet": { 3895 "commnet": {
  3896 +=======
  3897 + "pid": {
  3898 +>>>>>>> 77e95275539c30c5787295a0b7f7cd16a3263567
3236 "type": "integer", 3899 "type": "integer",
3237 "format": "int64", 3900 "format": "int64",
3238 "description": " 回复那个评论的id" 3901 "description": " 回复那个评论的id"
@@ -3244,8 +3907,12 @@ @@ -3244,8 +3907,12 @@
3244 "atWho": { 3907 "atWho": {
3245 "type": "array", 3908 "type": "array",
3246 "items": { 3909 "items": {
  3910 +<<<<<<< HEAD
3247 "type": "integer", 3911 "type": "integer",
3248 "format": "int64" 3912 "format": "int64"
  3913 +=======
  3914 + "$ref": "#/definitions/CommentAtWho"
  3915 +>>>>>>> 77e95275539c30c5787295a0b7f7cd16a3263567
3249 }, 3916 },
3250 "description": " 填写评论时@的人" 3917 "description": " 填写评论时@的人"
3251 } 3918 }
@@ -3254,97 +3921,235 @@ @@ -3254,97 +3921,235 @@
3254 "required": [ 3921 "required": [
3255 "articleId", 3922 "articleId",
3256 "sectionId", 3923 "sectionId",
  3924 +<<<<<<< HEAD
3257 "commnet", 3925 "commnet",
  3926 +=======
  3927 + "pid",
  3928 +>>>>>>> 77e95275539c30c5787295a0b7f7cd16a3263567
3258 "content", 3929 "content",
3259 "atWho" 3930 "atWho"
3260 ] 3931 ]
3261 }, 3932 },
3262 - "MiniCreateArticleCommentResponse": { 3933 + "MiniCreateArticleCommentResponse": {
  3934 + "type": "object",
  3935 + "properties": {
  3936 + "id": {
  3937 + "type": "integer",
  3938 + "format": "int64"
  3939 + },
  3940 + "pid": {
  3941 + "type": "integer",
  3942 + "format": "int64"
  3943 + },
  3944 + "topId": {
  3945 + "type": "integer",
  3946 + "format": "int64"
  3947 + },
  3948 + "articleId": {
  3949 + "type": "integer",
  3950 + "format": "int64",
  3951 + "description": " 文章id"
  3952 + },
  3953 + "sectionId": {
  3954 + "type": "integer",
  3955 + "format": "int64",
  3956 + "description": " 段落id"
  3957 + },
  3958 + "fromUserId": {
  3959 + "type": "integer",
  3960 + "format": "int64",
  3961 + "description": " 填写评论的人"
  3962 + },
  3963 + "fromUser": {
  3964 + "$ref": "#/definitions/CommentAuthor",
  3965 + "description": " 填写评论的人"
  3966 + },
  3967 + "toUserId": {
  3968 + "type": "integer",
  3969 + "format": "int64",
  3970 + "description": " 回复哪个人"
  3971 + },
  3972 + "toUser": {
  3973 + "$ref": "#/definitions/CommentAuthor",
  3974 + "description": " 回复哪个人"
  3975 + },
  3976 + "sectionContent": {
  3977 + "type": "string",
  3978 + "description": " 引用的文章内容文本"
  3979 + },
  3980 + "countReply": {
  3981 + "type": "integer",
  3982 + "format": "int32",
  3983 + "description": " 回复数量"
  3984 + },
  3985 + "countUserLove": {
  3986 + "type": "integer",
  3987 + "format": "int32",
  3988 + "description": " 用户点赞数量"
  3989 + },
  3990 + "countAdminLove": {
  3991 + "type": "integer",
  3992 + "format": "int32",
  3993 + "description": " 运营点赞数量"
  3994 + },
  3995 + "atWho": {
  3996 + "type": "array",
  3997 + "items": {
  3998 +<<<<<<< HEAD
  3999 + "$ref": "#/definitions/CommentAuthor"
  4000 + },
  4001 + "description": " 填写评论时@的人"
  4002 +=======
  4003 + "$ref": "#/definitions/CommentAtWho"
  4004 + },
  4005 + "description": " 填写评论时@的人"
  4006 + },
  4007 + "createdAt": {
  4008 + "type": "integer",
  4009 + "format": "int64"
  4010 +>>>>>>> 77e95275539c30c5787295a0b7f7cd16a3263567
  4011 + }
  4012 + },
  4013 + "title": "MiniCreateArticleCommentResponse",
  4014 + "required": [
  4015 + "id",
  4016 + "pid",
  4017 + "topId",
  4018 + "articleId",
  4019 + "sectionId",
  4020 + "fromUserId",
  4021 + "fromUser",
  4022 + "toUserId",
  4023 + "toUser",
  4024 + "sectionContent",
  4025 + "countReply",
  4026 + "countUserLove",
  4027 + "countAdminLove",
  4028 +<<<<<<< HEAD
  4029 + "atWho"
  4030 +=======
  4031 + "atWho",
  4032 + "createdAt"
  4033 + ]
  4034 + },
  4035 + "MiniDeleteArticleCommentRequest": {
  4036 + "type": "object",
  4037 + "properties": {
  4038 + "id": {
  4039 + "type": "integer",
  4040 + "format": "int64"
  4041 + },
  4042 + "": {
  4043 + "type": "integer",
  4044 + "format": "int64"
  4045 + },
  4046 + "": {
  4047 + "type": "integer",
  4048 + "format": "int64"
  4049 + }
  4050 + },
  4051 + "title": "MiniDeleteArticleCommentRequest",
  4052 + "required": [
  4053 + "id"
  4054 + ]
  4055 + },
  4056 + "MiniDeleteArticleCommentResponse": {
  4057 + "type": "object",
  4058 + "properties": {
  4059 + "id": {
  4060 + "type": "integer",
  4061 + "format": "int64"
  4062 + }
  4063 + },
  4064 + "title": "MiniDeleteArticleCommentResponse",
  4065 + "required": [
  4066 + "id"
  4067 + ]
  4068 + },
  4069 + "MiniGetArticleCommentRequest": {
3263 "type": "object", 4070 "type": "object",
3264 "properties": { 4071 "properties": {
3265 "id": { 4072 "id": {
3266 "type": "integer", 4073 "type": "integer",
3267 "format": "int64" 4074 "format": "int64"
3268 }, 4075 },
3269 - "pid": { 4076 + "": {
3270 "type": "integer", 4077 "type": "integer",
3271 "format": "int64" 4078 "format": "int64"
3272 }, 4079 },
3273 - "topId": { 4080 + "": {
3274 "type": "integer", 4081 "type": "integer",
3275 "format": "int64" 4082 "format": "int64"
3276 - },  
3277 - "articleId": { 4083 + }
  4084 + },
  4085 + "title": "MiniGetArticleCommentRequest",
  4086 + "required": [
  4087 + "id"
  4088 + ]
  4089 + },
  4090 + "MiniGetArticleCommentResponse": {
  4091 + "type": "object",
  4092 + "properties": {
  4093 + "": {
  4094 + "$ref": "#/definitions/ArticleCommentAndReply"
  4095 + }
  4096 + },
  4097 + "title": "MiniGetArticleCommentResponse"
  4098 + },
  4099 + "MiniListArticleCommentRequest": {
  4100 + "type": "object",
  4101 + "properties": {
  4102 + "page": {
3278 "type": "integer", 4103 "type": "integer",
3279 - "format": "int64",  
3280 - "description": " 文章id" 4104 + "format": "int32"
3281 }, 4105 },
3282 - "sectionId": { 4106 + "size": {
3283 "type": "integer", 4107 "type": "integer",
3284 - "format": "int64",  
3285 - "description": " 段落id" 4108 + "format": "int32"
3286 }, 4109 },
3287 - "fromUserId": { 4110 + "": {
3288 "type": "integer", 4111 "type": "integer",
3289 - "format": "int64",  
3290 - "description": " 填写评论的人"  
3291 - },  
3292 - "fromUser": {  
3293 - "$ref": "#/definitions/CommentAuthor",  
3294 - "description": " 填写评论的人" 4112 + "format": "int64"
3295 }, 4113 },
3296 - "toUserId": { 4114 + "": {
3297 "type": "integer", 4115 "type": "integer",
3298 - "format": "int64",  
3299 - "description": " 回复哪个人"  
3300 - },  
3301 - "toUser": {  
3302 - "$ref": "#/definitions/CommentAuthor",  
3303 - "description": " 回复哪个人"  
3304 - },  
3305 - "sectionContent": {  
3306 - "type": "string",  
3307 - "description": " 引用的文章内容文本" 4116 + "format": "int64"
3308 }, 4117 },
3309 - "countReply": { 4118 + "articleId": {
3310 "type": "integer", 4119 "type": "integer",
3311 - "format": "int32",  
3312 - "description": " 回复数量" 4120 + "format": "int64"
3313 }, 4121 },
3314 - "countUserLove": { 4122 + "sectionId": {
3315 "type": "integer", 4123 "type": "integer",
3316 - "format": "int32",  
3317 - "description": " 用户点赞数量"  
3318 - },  
3319 - "countAdminLove": { 4124 + "format": "int64"
  4125 + }
  4126 + },
  4127 + "title": "MiniListArticleCommentRequest",
  4128 + "required": [
  4129 + "page",
  4130 + "size",
  4131 + "articleId"
  4132 + ]
  4133 + },
  4134 + "MiniListArticleCommentResponse": {
  4135 + "type": "object",
  4136 + "properties": {
  4137 + "total": {
3320 "type": "integer", 4138 "type": "integer",
3321 - "format": "int32",  
3322 - "description": " 运营点赞数量" 4139 + "format": "int64"
3323 }, 4140 },
3324 - "atWho": { 4141 + "list": {
3325 "type": "array", 4142 "type": "array",
3326 "items": { 4143 "items": {
3327 - "$ref": "#/definitions/CommentAuthor"  
3328 - },  
3329 - "description": " 填写评论时@的人" 4144 + "$ref": "#/definitions/ArticleCommentAndReply"
  4145 + }
3330 } 4146 }
3331 }, 4147 },
3332 - "title": "MiniCreateArticleCommentResponse", 4148 + "title": "MiniListArticleCommentResponse",
3333 "required": [ 4149 "required": [
3334 - "id",  
3335 - "pid",  
3336 - "topId",  
3337 - "articleId",  
3338 - "sectionId",  
3339 - "fromUserId",  
3340 - "fromUser",  
3341 - "toUserId",  
3342 - "toUser",  
3343 - "sectionContent",  
3344 - "countReply",  
3345 - "countUserLove",  
3346 - "countAdminLove",  
3347 - "atWho" 4150 + "total",
  4151 + "list"
  4152 +>>>>>>> 77e95275539c30c5787295a0b7f7cd16a3263567
3348 ] 4153 ]
3349 }, 4154 },
3350 "MiniMyLikeRequest": { 4155 "MiniMyLikeRequest": {
@@ -3442,6 +4247,42 @@ @@ -3442,6 +4247,42 @@
3442 "count" 4247 "count"
3443 ] 4248 ]
3444 }, 4249 },
  4250 + "MiniTop5ArticleCommentRequest": {
  4251 + "type": "object",
  4252 + "properties": {
  4253 + "": {
  4254 + "type": "integer",
  4255 + "format": "int64"
  4256 + },
  4257 + "": {
  4258 + "type": "integer",
  4259 + "format": "int64"
  4260 + },
  4261 + "articleId": {
  4262 + "type": "integer",
  4263 + "format": "int64"
  4264 + }
  4265 + },
  4266 + "title": "MiniTop5ArticleCommentRequest",
  4267 + "required": [
  4268 + "articleId"
  4269 + ]
  4270 + },
  4271 + "MiniTop5ArticleCommentResponse": {
  4272 + "type": "object",
  4273 + "properties": {
  4274 + "list": {
  4275 + "type": "array",
  4276 + "items": {
  4277 + "$ref": "#/definitions/ArticleCommentItem"
  4278 + }
  4279 + }
  4280 + },
  4281 + "title": "MiniTop5ArticleCommentResponse",
  4282 + "required": [
  4283 + "list"
  4284 + ]
  4285 + },
3445 "MiniUserApplyJoinCompanyRequest": { 4286 "MiniUserApplyJoinCompanyRequest": {
3446 "type": "object", 4287 "type": "object",
3447 "properties": { 4288 "properties": {
@@ -4114,6 +4955,60 @@ @@ -4114,6 +4955,60 @@
4114 "value" 4955 "value"
4115 ] 4956 ]
4116 }, 4957 },
  4958 + "SystemArticleCommentSearchMeRequest": {
  4959 + "type": "object",
  4960 + "properties": {
  4961 + "page": {
  4962 + "type": "integer",
  4963 + "format": "int32"
  4964 + },
  4965 + "size": {
  4966 + "type": "integer",
  4967 + "format": "int32"
  4968 + },
  4969 + "authorId": {
  4970 + "type": "integer",
  4971 + "format": "int64",
  4972 + "description": " 用户"
  4973 + },
  4974 + "beginTime": {
  4975 + "type": "integer",
  4976 + "format": "int64",
  4977 + "description": " 开始时间"
  4978 + },
  4979 + "endTime": {
  4980 + "type": "integer",
  4981 + "format": "int64",
  4982 + "description": " 结束时间"
  4983 + }
  4984 + },
  4985 + "title": "SystemArticleCommentSearchMeRequest",
  4986 + "required": [
  4987 + "page",
  4988 + "size",
  4989 + "authorId"
  4990 + ]
  4991 + },
  4992 + "SystemArticleCommentSearchMeResponse": {
  4993 + "type": "object",
  4994 + "properties": {
  4995 + "list": {
  4996 + "type": "array",
  4997 + "items": {
  4998 + "$ref": "#/definitions/ArticleCommentItem"
  4999 + }
  5000 + },
  5001 + "total": {
  5002 + "type": "integer",
  5003 + "format": "int64"
  5004 + }
  5005 + },
  5006 + "title": "SystemArticleCommentSearchMeResponse",
  5007 + "required": [
  5008 + "list",
  5009 + "total"
  5010 + ]
  5011 + },
4117 "SystemArticleGetRequest": { 5012 "SystemArticleGetRequest": {
4118 "type": "object", 5013 "type": "object",
4119 "properties": { 5014 "properties": {
@@ -4368,6 +5263,60 @@ @@ -4368,6 +5263,60 @@
4368 "targetUser" 5263 "targetUser"
4369 ] 5264 ]
4370 }, 5265 },
  5266 + "SystemArticleSearchMeRequest": {
  5267 + "type": "object",
  5268 + "properties": {
  5269 + "page": {
  5270 + "type": "integer",
  5271 + "format": "int32"
  5272 + },
  5273 + "size": {
  5274 + "type": "integer",
  5275 + "format": "int32"
  5276 + },
  5277 + "authorId": {
  5278 + "type": "integer",
  5279 + "format": "int64",
  5280 + "description": " 用户"
  5281 + },
  5282 + "beginTime": {
  5283 + "type": "integer",
  5284 + "format": "int64",
  5285 + "description": " 开始时间"
  5286 + },
  5287 + "endTime": {
  5288 + "type": "integer",
  5289 + "format": "int64",
  5290 + "description": " 结束时间"
  5291 + }
  5292 + },
  5293 + "title": "SystemArticleSearchMeRequest",
  5294 + "required": [
  5295 + "page",
  5296 + "size",
  5297 + "authorId"
  5298 + ]
  5299 + },
  5300 + "SystemArticleSearchMeResponse": {
  5301 + "type": "object",
  5302 + "properties": {
  5303 + "total": {
  5304 + "type": "integer",
  5305 + "format": "int32"
  5306 + },
  5307 + "list": {
  5308 + "type": "array",
  5309 + "items": {
  5310 + "$ref": "#/definitions/ArticleSearchMe"
  5311 + }
  5312 + }
  5313 + },
  5314 + "title": "SystemArticleSearchMeResponse",
  5315 + "required": [
  5316 + "total",
  5317 + "list"
  5318 + ]
  5319 + },
4371 "SystemArticleSearchRequest": { 5320 "SystemArticleSearchRequest": {
4372 "type": "object", 5321 "type": "object",
4373 "properties": { 5322 "properties": {
@@ -4848,7 +5797,15 @@ @@ -4848,7 +5797,15 @@
4848 }, 5797 },
4849 "SystemUserInfoRequest": { 5798 "SystemUserInfoRequest": {
4850 "type": "object", 5799 "type": "object",
4851 - "title": "SystemUserInfoRequest" 5800 + "properties": {
  5801 + "Token": {
  5802 + "type": "string"
  5803 + }
  5804 + },
  5805 + "title": "SystemUserInfoRequest",
  5806 + "required": [
  5807 + "x-mmm-accesstoken"
  5808 + ]
4852 }, 5809 },
4853 "SystemUserInfoResponse": { 5810 "SystemUserInfoResponse": {
4854 "type": "object", 5811 "type": "object",
@@ -4869,6 +5826,9 @@ @@ -4869,6 +5826,9 @@
4869 }, 5826 },
4870 "companyName": { 5827 "companyName": {
4871 "type": "string" 5828 "type": "string"
  5829 + },
  5830 + "code": {
  5831 + "type": "string"
4872 } 5832 }
4873 }, 5833 },
4874 "title": "SystemUserInfoResponse", 5834 "title": "SystemUserInfoResponse",
@@ -4877,7 +5837,8 @@ @@ -4877,7 +5837,8 @@
4877 "userName", 5837 "userName",
4878 "avatar", 5838 "avatar",
4879 "companyId", 5839 "companyId",
4880 - "companyName" 5840 + "companyName",
  5841 + "code"
4881 ] 5842 ]
4882 }, 5843 },
4883 "SystemUserSearchRequest": { 5844 "SystemUserSearchRequest": {
@@ -5443,28 +6404,35 @@ @@ -5443,28 +6404,35 @@
5443 "itemFlag": { 6404 "itemFlag": {
5444 "type": "integer", 6405 "type": "integer",
5445 "format": "int32", 6406 "format": "int32",
5446 - "description": " 1:他的帖子 2:他的评论/回复 4:他收到的赞 8:TA的圆桌讨论 16:被采纳" 6407 + "description": "0:默认查询所有 1:他的帖子 2:他的评论/回复 4:他收到的赞 8:TA的圆桌讨论 16:被采纳"
5447 } 6408 }
5448 }, 6409 },
5449 "title": "UserStatisticsRequest", 6410 "title": "UserStatisticsRequest",
5450 "required": [ 6411 "required": [
5451 - "userId",  
5452 "itemFlag" 6412 "itemFlag"
5453 ] 6413 ]
5454 }, 6414 },
5455 "UserStatisticsResponse": { 6415 "UserStatisticsResponse": {
5456 "type": "object", 6416 "type": "object",
5457 "properties": { 6417 "properties": {
5458 - "list": {  
5459 - "type": "array",  
5460 - "items": {  
5461 - "$ref": "#/definitions/StatisticsItem"  
5462 - } 6418 + "totalArticle": {
  6419 + "type": "integer",
  6420 + "format": "int32"
  6421 + },
  6422 + "totalComment": {
  6423 + "type": "integer",
  6424 + "format": "int32"
  6425 + },
  6426 + "totalLoved": {
  6427 + "type": "integer",
  6428 + "format": "int32"
5463 } 6429 }
5464 }, 6430 },
5465 "title": "UserStatisticsResponse", 6431 "title": "UserStatisticsResponse",
5466 "required": [ 6432 "required": [
5467 - "list" 6433 + "totalArticle",
  6434 + "totalComment",
  6435 + "totalLoved"
5468 ] 6436 ]
5469 }, 6437 },
5470 "WhichUserLikeArticle": { 6438 "WhichUserLikeArticle": {
@@ -63,6 +63,15 @@ service Core { @@ -63,6 +63,15 @@ service Core {
63 @doc "小程序获取文章的编辑记录" 63 @doc "小程序获取文章的编辑记录"
64 @handler MiniArticleBackupSearch 64 @handler MiniArticleBackupSearch
65 post /article_backup/search (MiniArticleBackupSearchRequest) returns (MiniArticleBackupSearchResponse) 65 post /article_backup/search (MiniArticleBackupSearchRequest) returns (MiniArticleBackupSearchResponse)
  66 +
  67 +
  68 + @doc "小程序设置文章的定性标签"
  69 + @handler MiniArticleSetTag
  70 + post /article/set_tag (MiniArticleSetTagRequest) returns (MiniArticleSetTagResponse)
  71 +
  72 + @doc "小程序所有的定性标签"
  73 + @handler MiniAllArticleTag
  74 + get /article_tag/list/all (MiniAllArticleTagRequest) returns (MiniAllArticleTagResponse)
66 } 75 }
67 76
68 // 管理后台接口 77 // 管理后台接口
@@ -87,4 +96,9 @@ service Core { @@ -87,4 +96,9 @@ service Core {
87 @doc "管理后台编辑历史" 96 @doc "管理后台编辑历史"
88 @handler SystemHistoryArticle 97 @handler SystemHistoryArticle
89 post /article/history (SystemArticleHistoryRequest) returns (SystemArticleHistoryResponse) 98 post /article/history (SystemArticleHistoryRequest) returns (SystemArticleHistoryResponse)
  99 +
  100 + @doc "管理后台获取我发布的文章"
  101 + @handler SystemArticleSearchMe
  102 + post /article/search/me (SystemArticleSearchMeRequest) returns (SystemArticleSearchMeResponse)
  103 +
90 } 104 }
@@ -8,14 +8,42 @@ info( @@ -8,14 +8,42 @@ info(
8 version: "v1" 8 version: "v1"
9 ) 9 )
10 10
  11 +@server(
  12 + prefix: v1/system
  13 + group: tags
  14 + jwt: SystemAuth
  15 +)
  16 +service Core {
  17 + @doc "后台创建文章标签"
  18 + @handler CreateTag
  19 + post /article_tag (TagCreateRequest) returns (TagCreateResponse)
  20 +
  21 + @doc "后台编辑文章标签"
  22 + @handler EditTag
  23 + put /article_tag (TagEditRequest) returns (TagEditResponse)
  24 +
  25 + @doc "后台获取文章标签"
  26 + @handler GetTag
  27 + get /article_tag/:id (TagGetRequest) returns (TagGetResponse)
  28 +
  29 + @doc "后台删除文章标签"
  30 + @handler DeleteTag
  31 + delete /article_tag/:id (TagDeleteRequest) returns (TagDeleteResponse)
  32 +
  33 + @doc "后台搜索标签"
  34 + @handler SearchTag
  35 + post/article_tag/search (TagListRequest) returns (TagListResponse)
  36 +}
  37 +
11 // 创建标签 38 // 创建标签
12 type ( 39 type (
13 TagCreateRequest { 40 TagCreateRequest {
14 - CompanyId int64 `json:"companyId"` 41 + CompanyId int64 `json:",optional"`
15 Image string `json:"image"` 42 Image string `json:"image"`
16 Name string `json:"name"` // 标签名称 43 Name string `json:"name"` // 标签名称
17 - Group string `json:"group"` // 标签分类 44 + Category string `json:"category"` // 标签分类
18 Remark string `json:"remark,optional"` // 备注 45 Remark string `json:"remark,optional"` // 备注
  46 + Other string `json:"other"`
19 } 47 }
20 48
21 TagCreateResponse { 49 TagCreateResponse {
@@ -27,11 +55,12 @@ type ( @@ -27,11 +55,12 @@ type (
27 type ( 55 type (
28 TagEditRequest { 56 TagEditRequest {
29 Id int64 `json:"id"` 57 Id int64 `json:"id"`
30 - CompanyId int64 `json:"-"` 58 + CompanyId int64 `json:",optional"`
31 Image string `json:"image"` 59 Image string `json:"image"`
32 Name string `json:"name"` // 标签名称 60 Name string `json:"name"` // 标签名称
33 - Group string `json:"group"` // 标签分类 61 + Category string `json:"category"` // 标签分类
34 Remark string `json:"remark,optional"` // 备注 62 Remark string `json:"remark,optional"` // 备注
  63 + Other string `json:"other"`
35 } 64 }
36 65
37 TagEditResponse { 66 TagEditResponse {
@@ -43,14 +72,15 @@ type ( @@ -43,14 +72,15 @@ type (
43 type ( 72 type (
44 TagGetRequest { 73 TagGetRequest {
45 Id int64 `path:"id"` 74 Id int64 `path:"id"`
46 - CompanyId int64 `path:"-"` 75 + CompanyId int64 `path:",optional"`
47 } 76 }
48 TagGetResponse { 77 TagGetResponse {
49 - Id int64 `json:"id"`  
50 - Image string `json:"image"`  
51 - Name string `json:"name"` // 标签名称  
52 - Group string `json:"group"` // 标签分类  
53 - Remark string `json:"remark"` // 备注 78 + Id int64 `json:"id"`
  79 + Image string `json:"image"`
  80 + Name string `json:"name"` // 标签名称
  81 + Category string `json:"category"` // 标签分类
  82 + Remark string `json:"remark"` // 备注
  83 + Other string `json:"other"`
54 } 84 }
55 ) 85 )
56 86
@@ -59,9 +89,9 @@ type ( @@ -59,9 +89,9 @@ type (
59 TagListRequest { 89 TagListRequest {
60 Page int `json:"page"` 90 Page int `json:"page"`
61 Size int `json:"size"` 91 Size int `json:"size"`
62 - CompanyId int64 `json:"-"` 92 + CompanyId int64 `json:",optional"`
63 TagName string `json:"tagName,optional"` 93 TagName string `json:"tagName,optional"`
64 - Group string `json:"group,optional"` 94 + Category string `json:"category,optional"`
65 Remark string `json:"remark,optional"` 95 Remark string `json:"remark,optional"`
66 } 96 }
67 TagListResponse { 97 TagListResponse {
@@ -71,9 +101,9 @@ type ( @@ -71,9 +101,9 @@ type (
71 TagItem { 101 TagItem {
72 Id int64 `json:"id"` 102 Id int64 `json:"id"`
73 Image string `json:"image"` 103 Image string `json:"image"`
74 - Name string `json:"name"` // 标签名称  
75 - Group string `json:"group"` // 标签分类  
76 - Remark string `json:"remark"` // 备注 104 + Name string `json:"name"` // 标签名称
  105 + Category string `json:"category"` // 标签分类
  106 + Remark string `json:"remark"` // 备注
77 CreatedAt int64 `json:"createdAt"` 107 CreatedAt int64 `json:"createdAt"`
78 } 108 }
79 ) 109 )
@@ -82,36 +112,9 @@ type ( @@ -82,36 +112,9 @@ type (
82 type ( 112 type (
83 TagDeleteRequest { 113 TagDeleteRequest {
84 Id int64 `path:"id"` 114 Id int64 `path:"id"`
85 - CompanyId int64 `path:"-"` 115 + CompanyId int64 `path:",optional"`
86 } 116 }
87 TagDeleteResponse { 117 TagDeleteResponse {
88 Id int64 `json:"id"` 118 Id int64 `json:"id"`
89 } 119 }
90 -)  
91 -  
92 -@server(  
93 - prefix: v1/system  
94 - group: tags  
95 - jwt: MiniAuth  
96 -)  
97 -service Core {  
98 - @doc "后台创建文章标签"  
99 - @handler CreateTag  
100 - post /article_tag (TagCreateRequest) returns (TagCreateResponse)  
101 -  
102 - @doc "后台编辑文章标签"  
103 - @handler EditTag  
104 - put /article_tag (TagEditRequest) returns (TagEditResponse)  
105 -  
106 - @doc "后台获取文章标签"  
107 - @handler GetTag  
108 - get /article_tag/:id (TagGetRequest) returns (TagGetResponse)  
109 -  
110 - @doc "后台删除文章标签"  
111 - @handler DeleteTag  
112 - delete /article_tag/:id (TagDeleteRequest) returns (TagDeleteResponse)  
113 -  
114 - @doc "后台搜索标签"  
115 - @handler SearchTag  
116 - post/article_tag/search (TagListRequest) returns (TagListResponse)  
117 -}  
  120 +)
@@ -55,7 +55,7 @@ type ( @@ -55,7 +55,7 @@ type (
55 CountRead int `json:"countRead"` // 浏览数量 55 CountRead int `json:"countRead"` // 浏览数量
56 Show int `json:"show"` // 评论的展示状态(0显示、1不显示) 56 Show int `json:"show"` // 评论的展示状态(0显示、1不显示)
57 Edit int `json:"edit"` // 文章是否存在变更记录 (0 不存在 1存在) 57 Edit int `json:"edit"` // 文章是否存在变更记录 (0 不存在 1存在)
58 - MeLoveFlag int `json:"meLoveFlag"` //当前人员对文章的点赞标识 58 + MeLoveFlag int `json:"meLoveFlag"` // 当前人员对文章的点赞标识 (0 没有点赞 1有点赞)
59 } 59 }
60 ArticleSection { 60 ArticleSection {
61 Id int64 `json:"id"` //段落id 61 Id int64 `json:"id"` //段落id
@@ -88,6 +88,18 @@ type ( @@ -88,6 +88,18 @@ type (
88 CountComment int `json:"CountComment"` //评论数量 88 CountComment int `json:"CountComment"` //评论数量
89 Show int `json:"show"` //是否隐藏 [0显示、1不显示] 89 Show int `json:"show"` //是否隐藏 [0显示、1不显示]
90 } 90 }
  91 +
  92 + SystemArticleSearchMeRequest {
  93 + Page int `json:"page"`
  94 + Size int `json:"size"`
  95 + AuthorId int64 `json:"authorId"` // 用户
  96 + BeginTime int64 `json:"beginTime,optional"` // 开始时间
  97 + EndTime int64 `json:"endTime,optional"` // 结束时间
  98 + }
  99 + SystemArticleSearchMeResponse {
  100 + Total int `json:"total"`
  101 + List []ArticleSearchMe `json:"list"`
  102 + }
91 ) 103 )
92 104
93 //小程序端获取文章有哪些人进行了点赞 105 //小程序端获取文章有哪些人进行了点赞
@@ -107,6 +119,7 @@ type ( @@ -107,6 +119,7 @@ type (
107 UserId int64 `json:"userId"` // 人员id 119 UserId int64 `json:"userId"` // 人员id
108 Name string `json:"name"` // 人员名称 120 Name string `json:"name"` // 人员名称
109 Avatar string `json:"avatar"` // 人员头像 121 Avatar string `json:"avatar"` // 人员头像
  122 + Position string `json:"position"` // 职位
110 CreatedAt int64 `json:"createdAt"` // 点赞记录的时间 123 CreatedAt int64 `json:"createdAt"` // 点赞记录的时间
111 } 124 }
112 ) 125 )
@@ -278,6 +291,40 @@ type ( @@ -278,6 +291,40 @@ type (
278 } 291 }
279 ) 292 )
280 293
  294 +//小程序端设置文章的定性标签
  295 +type (
  296 + MiniArticleSetTagRequest{
  297 + CompanyId int64 `json:",optional"` // 公司id
  298 + UserId int64 `json:",optional"` // 公司id
  299 + ArticleId int64 `json:"articleId"` // 文章id
  300 + TagId int64 `json:"tagId"` // 标签id
  301 + }
  302 + MiniArticleSetTagResponse{
  303 + Id int64 `json:"id"`
  304 + }
  305 +)
  306 +
  307 +
  308 +//小程序端获取所有的定性标签
  309 +type (
  310 + MiniAllArticleTagRequest{
  311 + CompanyId int64 `json:",optional"` // 公司id
  312 + UserId int64 `json:",optional"` // 公司id
  313 + }
  314 + MiniAllArticleTagResponse{
  315 + TagGroup []ArticleTagGroup `json:"tagGroup"`
  316 + }
  317 + ArticleTagGroup {
  318 + Group string `json:"group"`
  319 + Tags []ArticleTagItem `json:"tags"`
  320 + }
  321 + ArticleTagItem {
  322 + Id int64 `json:"id"`
  323 + Group string `json:"group"`
  324 + Name string `json:"name"`
  325 + Image string `json:"image"`
  326 + }
  327 +)
281 328
282 329
283 330
@@ -23,6 +23,39 @@ service Core { @@ -23,6 +23,39 @@ service Core {
23 @doc "小程序填写文章的评论" 23 @doc "小程序填写文章的评论"
24 @handler MiniCreateArticleComment 24 @handler MiniCreateArticleComment
25 post /article_comment (MiniCreateArticleCommentRequest) returns (MiniCreateArticleCommentResponse) 25 post /article_comment (MiniCreateArticleCommentRequest) returns (MiniCreateArticleCommentResponse)
  26 +
  27 + @doc "小程序展示文章的评论列表"
  28 + @handler MiniListArticleComment
  29 + post /article_comment/list (MiniListArticleCommentRequest) returns (MiniListArticleCommentResponse)
  30 +
  31 + @doc "小程序展示文章的评论列表TOP5"
  32 + @handler MiniTop5ArticleComment
  33 + post /article_comment/top5 (MiniTop5ArticleCommentRequest) returns (MiniTop5ArticleCommentResponse)
  34 +
  35 + @doc "小程序展示单个文章的评论"
  36 + @handler MiniGetArticleComment
  37 + get /article_comment/:id (MiniGetArticleCommentRequest) returns (MiniGetArticleCommentResponse)
  38 +
  39 + @doc "小程序展示删除文章评论"
  40 + @handler MiniDeleteArticleComment
  41 + delete /article_comment/:id (MiniDeleteArticleCommentRequest) returns (MiniDeleteArticleCommentResponse)
  42 +
  43 + @doc "小程序展示评论时@人可选列表"
  44 + @handler MiniArticleCommentAtWho
  45 + post /article_comment/at_who/list (MiniArticleCommentAtWhoRequest) returns (MiniArticleCommentAtWhoResponse)
  46 +}
  47 +
  48 +// 后台接口
  49 +@server(
  50 + prefix: v1/system
  51 + group: comment
  52 + middleware: LoginStatusCheck
  53 + jwt: SystemAuth
  54 +)
  55 +service Core {
  56 + @doc "小程序获取回复@人可选列表"
  57 + @handler SystemArticleCommentSearchMe
  58 + post /article_comment/search/me (SystemArticleCommentSearchMeRequest) returns (SystemArticleCommentSearchMeResponse)
26 } 59 }
27 60
28 // 61 //
@@ -38,39 +71,151 @@ type ( @@ -38,39 +71,151 @@ type (
38 71
39 //评论的填写人 72 //评论的填写人
40 type CommentAuthor { 73 type CommentAuthor {
41 - Id int64 `json:"id"` // 人员id  
42 - Name string `json:"name"` // 人员的名字  
43 - Avatar string `json:"avatar"` // 人员头像URL  
44 - Position string `json:"position"` // 职位  
45 - Company string `json:"company"` // 公司 74 + Id int64 `json:"id"` // 人员id
  75 + Name string `json:"name"` // 人员的名字
  76 + Avatar string `json:"avatar,optional"` // 人员头像URL
  77 + Position string `json:"position,optional"` // 职位
  78 + Company string `json:"company,optional"` // 公司
46 } 79 }
47 80
48 // 小程序填写文章的评论 81 // 小程序填写文章的评论
49 type ( 82 type (
50 MiniCreateArticleCommentRequest { 83 MiniCreateArticleCommentRequest {
51 - ArtitcleId int64 `json:"articleId"` // 文章id  
52 - SectionId int64 `json:"sectionId"` // 段落id  
53 - FromUserId int64 `json:",optional"` // 填写文章的人,服务端自动获取  
54 - CompanyId int64 `json:",optional"` // 服务端自动获取  
55 - Pid int64 `json:"commnet"` // 回复那个评论的id  
56 - Content string `json:"content"` // 评论的内容  
57 - AtWho []int64 `json:"atWho"` // 填写评论时@的人 84 + ArtitcleId int64 `json:"articleId"` // 文章id
  85 + SectionId int64 `json:"sectionId"` // 段落id
  86 + FromUserId int64 `json:",optional"` // 填写文章的人,服务端自动获取
  87 + CompanyId int64 `json:",optional"` // 服务端自动获取
  88 + Pid int64 `json:"pid"` // 回复那个评论的id
  89 + Content string `json:"content"` // 评论的内容
  90 + AtWho []CommentAtWho `json:"atWho"` // 填写评论时@的人
58 } 91 }
59 92
  93 + CommentAtWho {
  94 + Id int64 `json:"id"`
  95 + Name string `json:"name,optional"`
  96 + FirstLetter string `json:"firstLetter,optional"`
  97 + }
60 MiniCreateArticleCommentResponse { 98 MiniCreateArticleCommentResponse {
61 - Id int64 `json:"id"`  
62 - Pid int64 `json:"pid"`  
63 - TopId int64 `json:"topId"`  
64 - ArtitcleId int64 `json:"articleId"` // 文章id  
65 - SectionId int64 `json:"sectionId"` // 段落id  
66 - FromUserId int64 `json:"fromUserId"` // 填写评论的人  
67 - FromUser CommentAuthor `json:"fromUser"` // 填写评论的人  
68 - ToUserId int64 `json:"toUserId"` // 回复哪个人  
69 - ToUser CommentAuthor `json:"toUser"` // 回复哪个人  
70 - SectionContent string `json:"sectionContent"` // 引用的文章内容文本  
71 - CountReply int `json:"countReply"` // 回复数量  
72 - CountUserLove int `json:"countUserLove"` // 用户点赞数量  
73 - CountAdminLove int `json:"countAdminLove"` // 运营点赞数量  
74 - AtWho []CommentAuthor `json:"atWho"` // 填写评论时@的人 99 + Id int64 `json:"id"`
  100 + Pid int64 `json:"pid"`
  101 + TopId int64 `json:"topId"`
  102 + ArtitcleId int64 `json:"articleId"` // 文章id
  103 + SectionId int64 `json:"sectionId"` // 段落id
  104 + FromUserId int64 `json:"fromUserId"` // 填写评论的人
  105 + FromUser CommentAuthor `json:"fromUser"` // 填写评论的人
  106 + ToUserId int64 `json:"toUserId"` // 回复哪个人
  107 + ToUser CommentAuthor `json:"toUser"` // 回复哪个人
  108 + SectionContent string `json:"sectionContent"` // 引用的文章内容文本
  109 + CountReply int `json:"countReply"` // 回复数量
  110 + CountUserLove int `json:"countUserLove"` // 用户点赞数量
  111 + CountAdminLove int `json:"countAdminLove"` // 运营点赞数量
  112 + AtWho []CommentAtWho `json:"atWho"` // 填写评论时@的人
  113 + CreatedAt int64 `json:"createdAt"` //
  114 + }
  115 +)
  116 +
  117 +// 小程序获取文章的评论列表
  118 +type (
  119 + MiniListArticleCommentRequest {
  120 + Page int `json:"page"`
  121 + Size int `json:"size"`
  122 + CompanyId int64 `json:",optional"`
  123 + UserId int64 `json:",optional"`
  124 + ArticleId int64 `json:"articleId"`
  125 + SectionId int64 `json:"sectionId,optional"`
  126 + }
  127 + MiniListArticleCommentResponse {
  128 + Total int64 `json:"total"`
  129 + List []ArticleCommentAndReply `json:"list"`
  130 + }
  131 +
  132 + ArticleCommentAndReply {
  133 + Comment ArticleCommentItem `json:"comment"` //评论
  134 + Reply []ArticleCommentItem `json:"reply"` //回复的评论
  135 + TotalReply int64 `json:"totalReply"` //回复的评论数量
  136 + }
  137 +
  138 + ArticleCommentItem {
  139 + Id int64 `json:"id"`
  140 + Pid int64 `json:"pid"`
  141 + TopId int64 `json:"topId"`
  142 + ArtitcleId int64 `json:"articleId"` // 文章id
  143 + SectionId int64 `json:"sectionId"` // 段落id
  144 + FromUserId int64 `json:"fromUserId"` // 填写评论的人
  145 + FromUser CommentAuthor `json:"fromUser"` // 填写评论的人
  146 + ToUserId int64 `json:"toUserId"` // 回复哪个人
  147 + ToUser CommentAuthor `json:"toUser"` // 回复哪个人
  148 + SectionContent string `json:"sectionContent"` // 引用的文章内容文本
  149 + CountReply int `json:"countReply"` // 回复数量
  150 + CountUserLove int `json:"countUserLove"` // 用户点赞数量
  151 + CountAdminLove int `json:"countAdminLove"` // 运营点赞数量
  152 + AtWho []CommentAtWho `json:"atWho"` // 填写评论时@的人
  153 + CreatedAt int64 `json:"createdAt"` //
  154 + MeLoveFlag int `json:"meLoveFlag"` //当前人员对评论的点赞标识 (0 没有点赞 1有点赞)
  155 + Content string `json:"content"` // 评论的内容
  156 + }
  157 +)
  158 +
  159 +// 小程序获取单个文章的评论
  160 +type (
  161 + MiniGetArticleCommentRequest {
  162 + CommentId int64 `path:"id"`
  163 + CompanyId int64 `path:",optional"`
  164 + UserId int64 `path:",optional"`
  165 + }
  166 + MiniGetArticleCommentResponse {
  167 + ArticleCommentAndReply
  168 + }
  169 +)
  170 +
  171 +// 小程序删除单个文章的评论
  172 +type (
  173 + MiniDeleteArticleCommentRequest {
  174 + CommentId int64 `path:"id"`
  175 + UserId int64 `path:",optional"`
  176 + CompanyId int64 `path:",optional"`
  177 + }
  178 + MiniDeleteArticleCommentResponse {
  179 + Id int64 `json:"id"`
  180 + }
  181 +)
  182 +
  183 +// 热门前5的评论列表
  184 +type (
  185 + MiniTop5ArticleCommentRequest {
  186 + CompanyId int64 `json:",optional"`
  187 + UserId int64 `json:",optional"`
  188 + ArticleId int64 `json:"articleId"`
  189 + }
  190 +
  191 + MiniTop5ArticleCommentResponse {
  192 + List []ArticleCommentItem `json:"list"`
  193 + }
  194 +)
  195 +
  196 +// 填写评论时选择@人
  197 +type (
  198 + MiniArticleCommentAtWhoRequest {
  199 + CompanyId int64 `json:",optional"`
  200 + UserId int64 `json:",optional"`
  201 + ArticleId int64 `json:"articleId"`
  202 + }
  203 +
  204 + MiniArticleCommentAtWhoResponse {
  205 + List []CommentAtWho `json:"list"`
  206 + }
  207 +)
  208 +
  209 +type(
  210 + SystemArticleCommentSearchMeRequest{
  211 + Page int `json:"page"`
  212 + Size int `json:"size"`
  213 + AuthorId int64 `json:"authorId"` // 用户
  214 + BeginTime int64 `json:"beginTime,optional"` // 开始时间
  215 + EndTime int64 `json:"endTime,optional"` // 结束时间
  216 + }
  217 + SystemArticleCommentSearchMeResponse{
  218 + List []ArticleCommentItem `json:"list"`
  219 + Total int64 `json:"total"`
75 } 220 }
76 ) 221 )
@@ -11,6 +11,7 @@ info( @@ -11,6 +11,7 @@ info(
11 @server( 11 @server(
12 prefix: v1 12 prefix: v1
13 group: department 13 group: department
  14 + middleware: LoginStatusCheck
14 jwt: SystemAuth 15 jwt: SystemAuth
15 ) 16 )
16 service Core { 17 service Core {
@@ -29,6 +30,10 @@ service Core { @@ -29,6 +30,10 @@ service Core {
29 @doc "部门-更新" 30 @doc "部门-更新"
30 @handler systemUpdate 31 @handler systemUpdate
31 put /system/department/:id (DepartmentUpdateRequest) returns (DepartmentGetResponse) 32 put /system/department/:id (DepartmentUpdateRequest) returns (DepartmentGetResponse)
  33 +
  34 + @doc "部门-删除"
  35 + @handler systemDelete
  36 + delete /system/department/:id (DepartmentGetRequest) returns (DepartmentGetResponse)
32 } 37 }
33 38
34 type ( 39 type (
@@ -48,6 +53,7 @@ type ( @@ -48,6 +53,7 @@ type (
48 DepartmentUpdateRequest { 53 DepartmentUpdateRequest {
49 Id int64 `path:"id"` 54 Id int64 `path:"id"`
50 Name string `json:"name"` 55 Name string `json:"name"`
  56 + Ids []int64 `json:"ids"` // 用户ID
51 } 57 }
52 58
53 DepartmentListRequest { 59 DepartmentListRequest {
@@ -9,21 +9,27 @@ info( @@ -9,21 +9,27 @@ info(
9 ) 9 )
10 10
11 @server( 11 @server(
12 - prefix: v1  
13 - group: role  
14 - jwt: SystemAuth 12 + prefix: v1
  13 + group: role
  14 + middleware: LoginStatusCheck
  15 + jwt: SystemAuth
15 ) 16 )
16 service Core { 17 service Core {
17 - @handler systemGetRole  
18 - get /system/role/:id (RoleGetRequest) returns (RoleGetResponse)  
19 - @handler systemSaveRole  
20 - post /system/role (RoleSaveRequest) returns (RoleSaveResponse)  
21 - @handler systemDeleteRole  
22 - delete /system/role/:id (RoleDeleteRequest) returns (RoleDeleteResponse)  
23 - @handler systemUpdateRole  
24 - put /system/role/:id (RoleUpdateRequest) returns (RoleUpdateResponse)  
25 - @handler systemSearchRole  
26 - post /system/role/search (RoleSearchRequest) returns (RoleSearchResponse) 18 + @doc "角色详情"
  19 + @handler systemGetRole
  20 + get /system/role/:id (RoleGetRequest) returns (RoleGetResponse)
  21 + @doc "角色新增"
  22 + @handler systemSaveRole
  23 + post /system/role (RoleSaveRequest) returns (RoleSaveResponse)
  24 + @doc "角色删除"
  25 + @handler systemDeleteRole
  26 + delete /system/role/:id (RoleDeleteRequest) returns (RoleDeleteResponse)
  27 + @doc "角色更新"
  28 + @handler systemUpdateRole
  29 + put /system/role/:id (RoleUpdateRequest) returns (RoleUpdateResponse)
  30 + @doc "角色列表搜索"
  31 + @handler systemSearchRole
  32 + post /system/role/search (RoleSearchRequest) returns (RoleSearchResponse)
27 } 33 }
28 34
29 type ( 35 type (
@@ -209,6 +209,7 @@ type ( @@ -209,6 +209,7 @@ type (
209 @server( 209 @server(
210 prefix: v1 210 prefix: v1
211 group: user 211 group: user
  212 + middleware: LoginStatusCheck
212 jwt: SystemAuth 213 jwt: SystemAuth
213 ) 214 )
214 service Core { 215 service Core {
@@ -249,7 +250,7 @@ service Core { @@ -249,7 +250,7 @@ service Core {
249 250
250 type( 251 type(
251 SystemUserInfoRequest{ 252 SystemUserInfoRequest{
252 - 253 + Token string `header:"x-mmm-accesstoken"`
253 } 254 }
254 SystemUserInfoResponse{ 255 SystemUserInfoResponse{
255 UserId int64 `json:"userId"` 256 UserId int64 `json:"userId"`
@@ -257,13 +258,16 @@ type( @@ -257,13 +258,16 @@ type(
257 Avatar string `json:"avatar"` 258 Avatar string `json:"avatar"`
258 CompanyId int64 `json:"companyId"` 259 CompanyId int64 `json:"companyId"`
259 CompanyName string `json:"companyName"` 260 CompanyName string `json:"companyName"`
  261 + Code string `json:"code"`
260 } 262 }
261 UserStatisticsRequest{ 263 UserStatisticsRequest{
262 - UserId int64 `json:"userId"`  
263 - ItemFlag int `json:"itemFlag"` // 1:他的帖子 2:他的评论/回复 4:他收到的赞 8:TA的圆桌讨论 16:被采纳 264 + UserId int64 `json:"userId,optional"`
  265 + ItemFlag int `json:"itemFlag"` //0:默认查询所有 1:他的帖子 2:他的评论/回复 4:他收到的赞 8:TA的圆桌讨论 16:被采纳
264 } 266 }
265 UserStatisticsResponse{ 267 UserStatisticsResponse{
266 - List []StatisticsItem `json:"list"` 268 + TotalArticle int `json:"totalArticle"`
  269 + TotalComment int `json:"totalComment"`
  270 + TotalLoved int `json:"totalLoved"`
267 } 271 }
268 StatisticsItem{ 272 StatisticsItem{
269 ItemFlag int `json:"itemFlag"` // 1:他的帖子 2:他的评论/回复 4:他收到的赞 8:TA的圆桌讨论 16:被采纳 273 ItemFlag int `json:"itemFlag"` // 1:他的帖子 2:他的评论/回复 4:他收到的赞 8:TA的圆桌讨论 16:被采纳
1 Name: discuss 1 Name: discuss
2 Host: 0.0.0.0 2 Host: 0.0.0.0
3 Port: 8081 3 Port: 8081
4 -Verbose: true 4 +Verbose: false
5 Migrate: false 5 Migrate: false
6 Timeout: 30000 6 Timeout: 30000
7 Log: 7 Log:
@@ -12,7 +12,7 @@ Log: @@ -12,7 +12,7 @@ Log:
12 TimeFormat: 2006-01-02 15:04:05.000 12 TimeFormat: 2006-01-02 15:04:05.000
13 13
14 SystemAuth: 14 SystemAuth:
15 - AccessSecret: discuss-secret 15 + AccessSecret: digital-platform
16 AccessExpire: 360000 16 AccessExpire: 360000
17 17
18 MiniAuth: 18 MiniAuth:
@@ -25,3 +25,8 @@ Redis: @@ -25,3 +25,8 @@ Redis:
25 Pass: 25 Pass:
26 DB: 26 DB:
27 DataSource: host=114.55.200.59 user=postgres password=eagle1010 dbname=sumifcc-discuss-dev port=31543 sslmode=disable TimeZone=Asia/Shanghai 27 DataSource: host=114.55.200.59 user=postgres password=eagle1010 dbname=sumifcc-discuss-dev port=31543 sslmode=disable TimeZone=Asia/Shanghai
  28 +
  29 +ApiAuth:
  30 + Name: ApiAuth
  31 + Host: http://digital-platform-dev.fjmaimaimai.com
  32 + Timeout: 0s
@@ -4,6 +4,7 @@ import ( @@ -4,6 +4,7 @@ import (
4 "github.com/zeromicro/go-zero/core/stores/redis" 4 "github.com/zeromicro/go-zero/core/stores/redis"
5 "github.com/zeromicro/go-zero/rest" 5 "github.com/zeromicro/go-zero/rest"
6 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/config" 6 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/config"
  7 + "time"
7 ) 8 )
8 9
9 type Config struct { 10 type Config struct {
@@ -13,4 +14,11 @@ type Config struct { @@ -13,4 +14,11 @@ type Config struct {
13 SystemAuth config.Auth 14 SystemAuth config.Auth
14 MiniAuth config.Auth 15 MiniAuth config.Auth
15 Migrate bool `json:",optional,default=true"` 16 Migrate bool `json:",optional,default=true"`
  17 + ApiAuth ApiService
  18 +}
  19 +
  20 +type ApiService struct {
  21 + Name string
  22 + Host string
  23 + Timeout time.Duration
16 } 24 }
  1 +package article
  2 +
  3 +import (
  4 + "net/http"
  5 +
  6 + "github.com/zeromicro/go-zero/rest/httpx"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/article"
  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 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
  12 +)
  13 +
  14 +func MiniAllArticleTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  15 + return func(w http.ResponseWriter, r *http.Request) {
  16 + var req types.MiniAllArticleTagRequest
  17 + if err := httpx.Parse(r, &req); err != nil {
  18 + httpx.ErrorCtx(r.Context(), w, err)
  19 + return
  20 + }
  21 +
  22 + l := article.NewMiniAllArticleTagLogic(r.Context(), svcCtx)
  23 + token := contextdata.GetUserTokenFromCtx(r.Context())
  24 + req.CompanyId = token.CompanyId
  25 + req.UserId = token.UserId
  26 + resp, err := l.MiniAllArticleTag(&req)
  27 + result.HttpResult(r, w, resp, err)
  28 + }
  29 +}
  1 +package article
  2 +
  3 +import (
  4 + "net/http"
  5 +
  6 + "github.com/zeromicro/go-zero/rest/httpx"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/article"
  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 +
  12 +func MiniArticleSetTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.MiniArticleSetTagRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := article.NewMiniArticleSetTagLogic(r.Context(), svcCtx)
  21 + resp, err := l.MiniArticleSetTag(&req)
  22 + if err != nil {
  23 + httpx.ErrorCtx(r.Context(), w, err)
  24 + } else {
  25 + httpx.OkJsonCtx(r.Context(), w, resp)
  26 + }
  27 + }
  28 +}
  1 +package article
  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/article"
  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 SystemArticleSearchMeHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.SystemArticleSearchMeRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := article.NewSystemArticleSearchMeLogic(r.Context(), svcCtx)
  22 + resp, err := l.SystemArticleSearchMe(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
  1 +package comment
  2 +
  3 +import (
  4 + "net/http"
  5 +
  6 + "github.com/zeromicro/go-zero/rest/httpx"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/comment"
  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 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
  12 +)
  13 +
  14 +func MiniArticleCommentAtWhoHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  15 + return func(w http.ResponseWriter, r *http.Request) {
  16 + var req types.MiniArticleCommentAtWhoRequest
  17 + if err := httpx.Parse(r, &req); err != nil {
  18 + httpx.ErrorCtx(r.Context(), w, err)
  19 + return
  20 + }
  21 +
  22 + l := comment.NewMiniArticleCommentAtWhoLogic(r.Context(), svcCtx)
  23 + token := contextdata.GetUserTokenFromCtx(r.Context())
  24 + req.CompanyId = token.CompanyId
  25 + req.UserId = token.UserId
  26 + resp, err := l.MiniArticleCommentAtWho(&req)
  27 + result.HttpResult(r, w, resp, err)
  28 + }
  29 +}
  1 +package comment
  2 +
  3 +import (
  4 + "net/http"
  5 +
  6 + "github.com/zeromicro/go-zero/rest/httpx"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/comment"
  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 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
  12 +)
  13 +
  14 +func MiniDeleteArticleCommentHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  15 + return func(w http.ResponseWriter, r *http.Request) {
  16 + var req types.MiniDeleteArticleCommentRequest
  17 + if err := httpx.Parse(r, &req); err != nil {
  18 + httpx.ErrorCtx(r.Context(), w, err)
  19 + return
  20 + }
  21 +
  22 + l := comment.NewMiniDeleteArticleCommentLogic(r.Context(), svcCtx)
  23 + token := contextdata.GetUserTokenFromCtx(r.Context())
  24 + req.CompanyId = token.CompanyId
  25 + req.UserId = token.UserId
  26 + resp, err := l.MiniDeleteArticleComment(&req)
  27 + result.HttpResult(r, w, resp, err)
  28 + }
  29 +}
  1 +package comment
  2 +
  3 +import (
  4 + "net/http"
  5 +
  6 + "github.com/zeromicro/go-zero/rest/httpx"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/comment"
  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 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
  12 +)
  13 +
  14 +func MiniGetArticleCommentHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  15 + return func(w http.ResponseWriter, r *http.Request) {
  16 + var req types.MiniGetArticleCommentRequest
  17 + if err := httpx.Parse(r, &req); err != nil {
  18 + httpx.ErrorCtx(r.Context(), w, err)
  19 + return
  20 + }
  21 +
  22 + l := comment.NewMiniGetArticleCommentLogic(r.Context(), svcCtx)
  23 + token := contextdata.GetUserTokenFromCtx(r.Context())
  24 + req.CompanyId = token.CompanyId
  25 + req.UserId = token.UserId
  26 + resp, err := l.MiniGetArticleComment(&req)
  27 + result.HttpResult(r, w, resp, err)
  28 + }
  29 +}
  1 +package comment
  2 +
  3 +import (
  4 + "net/http"
  5 +
  6 + "github.com/zeromicro/go-zero/rest/httpx"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/comment"
  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 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
  12 +)
  13 +
  14 +func MiniListArticleCommentHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  15 + return func(w http.ResponseWriter, r *http.Request) {
  16 + var req types.MiniListArticleCommentRequest
  17 + if err := httpx.Parse(r, &req); err != nil {
  18 + httpx.ErrorCtx(r.Context(), w, err)
  19 + return
  20 + }
  21 + l := comment.NewMiniListArticleCommentLogic(r.Context(), svcCtx)
  22 + token := contextdata.GetUserTokenFromCtx(r.Context())
  23 + req.CompanyId = token.CompanyId
  24 + req.UserId = token.UserId
  25 + resp, err := l.MiniListArticleComment(&req)
  26 + result.HttpResult(r, w, resp, err)
  27 + }
  28 +}
  1 +package comment
  2 +
  3 +import (
  4 + "net/http"
  5 +
  6 + "github.com/zeromicro/go-zero/rest/httpx"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/comment"
  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 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
  12 +)
  13 +
  14 +func MiniTop5ArticleCommentHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  15 + return func(w http.ResponseWriter, r *http.Request) {
  16 + var req types.MiniTop5ArticleCommentRequest
  17 + if err := httpx.Parse(r, &req); err != nil {
  18 + httpx.ErrorCtx(r.Context(), w, err)
  19 + return
  20 + }
  21 +
  22 + l := comment.NewMiniTop5ArticleCommentLogic(r.Context(), svcCtx)
  23 + token := contextdata.GetUserTokenFromCtx(r.Context())
  24 + req.CompanyId = token.CompanyId
  25 + req.UserId = token.UserId
  26 + resp, err := l.MiniTop5ArticleComment(&req)
  27 + result.HttpResult(r, w, resp, err)
  28 + }
  29 +}
  1 +package comment
  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/comment"
  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 SystemArticleCommentSearchMeHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.SystemArticleCommentSearchMeRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := comment.NewSystemArticleCommentSearchMeLogic(r.Context(), svcCtx)
  22 + resp, err := l.SystemArticleCommentSearchMe(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
  1 +package department
  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/department"
  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 SystemDeleteHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.DepartmentGetRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := department.NewSystemDeleteLogic(r.Context(), svcCtx)
  22 + resp, err := l.SystemDelete(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
@@ -30,12 +30,52 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { @@ -30,12 +30,52 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
30 Path: "/article_comment", 30 Path: "/article_comment",
31 Handler: comment.MiniCreateArticleCommentHandler(serverCtx), 31 Handler: comment.MiniCreateArticleCommentHandler(serverCtx),
32 }, 32 },
  33 + {
  34 + Method: http.MethodPost,
  35 + Path: "/article_comment/list",
  36 + Handler: comment.MiniListArticleCommentHandler(serverCtx),
  37 + },
  38 + {
  39 + Method: http.MethodPost,
  40 + Path: "/article_comment/top5",
  41 + Handler: comment.MiniTop5ArticleCommentHandler(serverCtx),
  42 + },
  43 + {
  44 + Method: http.MethodGet,
  45 + Path: "/article_comment/:id",
  46 + Handler: comment.MiniGetArticleCommentHandler(serverCtx),
  47 + },
  48 + {
  49 + Method: http.MethodDelete,
  50 + Path: "/article_comment/:id",
  51 + Handler: comment.MiniDeleteArticleCommentHandler(serverCtx),
  52 + },
  53 + {
  54 + Method: http.MethodPost,
  55 + Path: "/article_comment/at_who/list",
  56 + Handler: comment.MiniArticleCommentAtWhoHandler(serverCtx),
  57 + },
33 }, 58 },
34 rest.WithJwt(serverCtx.Config.MiniAuth.AccessSecret), 59 rest.WithJwt(serverCtx.Config.MiniAuth.AccessSecret),
35 rest.WithPrefix("/v1/mini"), 60 rest.WithPrefix("/v1/mini"),
36 ) 61 )
37 62
38 server.AddRoutes( 63 server.AddRoutes(
  64 + rest.WithMiddlewares(
  65 + []rest.Middleware{serverCtx.LoginStatusCheck},
  66 + []rest.Route{
  67 + {
  68 + Method: http.MethodPost,
  69 + Path: "/article_comment/search/me",
  70 + Handler: comment.SystemArticleCommentSearchMeHandler(serverCtx),
  71 + },
  72 + }...,
  73 + ),
  74 + rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret),
  75 + rest.WithPrefix("/v1/system"),
  76 + )
  77 +
  78 + server.AddRoutes(
39 []rest.Route{ 79 []rest.Route{
40 { 80 {
41 Method: http.MethodPost, 81 Method: http.MethodPost,
@@ -80,7 +120,7 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { @@ -80,7 +120,7 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
80 Handler: tags.SearchTagHandler(serverCtx), 120 Handler: tags.SearchTagHandler(serverCtx),
81 }, 121 },
82 }, 122 },
83 - rest.WithJwt(serverCtx.Config.MiniAuth.AccessSecret), 123 + rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret),
84 rest.WithPrefix("/v1/system"), 124 rest.WithPrefix("/v1/system"),
85 ) 125 )
86 126
@@ -158,58 +198,61 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { @@ -158,58 +198,61 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
158 ) 198 )
159 199
160 server.AddRoutes( 200 server.AddRoutes(
161 - []rest.Route{  
162 - {  
163 - Method: http.MethodPost,  
164 - Path: "/system/user/info",  
165 - Handler: user.SystemUserInfoHandler(serverCtx),  
166 - },  
167 - {  
168 - Method: http.MethodPost,  
169 - Path: "/system/user/statistics",  
170 - Handler: user.SystemUserStatisticsHandler(serverCtx),  
171 - },  
172 - {  
173 - Method: http.MethodGet,  
174 - Path: "/system/user/:id",  
175 - Handler: user.SystemUserGetHandler(serverCtx),  
176 - },  
177 - {  
178 - Method: http.MethodPut,  
179 - Path: "/system/user/:id",  
180 - Handler: user.SystemUserUpdateHandler(serverCtx),  
181 - },  
182 - {  
183 - Method: http.MethodPost,  
184 - Path: "/system/user/search",  
185 - Handler: user.SystemUserSearchHandler(serverCtx),  
186 - },  
187 - {  
188 - Method: http.MethodGet,  
189 - Path: "/system/account/:id",  
190 - Handler: user.SystemUserAccountGetHandler(serverCtx),  
191 - },  
192 - {  
193 - Method: http.MethodPost,  
194 - Path: "/system/account",  
195 - Handler: user.SystemUserAccountSaveHandler(serverCtx),  
196 - },  
197 - {  
198 - Method: http.MethodPost,  
199 - Path: "/system/account/enable",  
200 - Handler: user.SystemUserAccountEnableHandler(serverCtx),  
201 - },  
202 - {  
203 - Method: http.MethodPut,  
204 - Path: "/system/account/:id",  
205 - Handler: user.SystemUserAccountUpdateHandler(serverCtx),  
206 - },  
207 - {  
208 - Method: http.MethodPost,  
209 - Path: "/system/account/search",  
210 - Handler: user.SystemUserAccountSearchHandler(serverCtx),  
211 - },  
212 - }, 201 + rest.WithMiddlewares(
  202 + []rest.Middleware{serverCtx.LoginStatusCheck},
  203 + []rest.Route{
  204 + {
  205 + Method: http.MethodPost,
  206 + Path: "/system/user/info",
  207 + Handler: user.SystemUserInfoHandler(serverCtx),
  208 + },
  209 + {
  210 + Method: http.MethodPost,
  211 + Path: "/system/user/statistics",
  212 + Handler: user.SystemUserStatisticsHandler(serverCtx),
  213 + },
  214 + {
  215 + Method: http.MethodGet,
  216 + Path: "/system/user/:id",
  217 + Handler: user.SystemUserGetHandler(serverCtx),
  218 + },
  219 + {
  220 + Method: http.MethodPut,
  221 + Path: "/system/user/:id",
  222 + Handler: user.SystemUserUpdateHandler(serverCtx),
  223 + },
  224 + {
  225 + Method: http.MethodPost,
  226 + Path: "/system/user/search",
  227 + Handler: user.SystemUserSearchHandler(serverCtx),
  228 + },
  229 + {
  230 + Method: http.MethodGet,
  231 + Path: "/system/account/:id",
  232 + Handler: user.SystemUserAccountGetHandler(serverCtx),
  233 + },
  234 + {
  235 + Method: http.MethodPost,
  236 + Path: "/system/account",
  237 + Handler: user.SystemUserAccountSaveHandler(serverCtx),
  238 + },
  239 + {
  240 + Method: http.MethodPost,
  241 + Path: "/system/account/enable",
  242 + Handler: user.SystemUserAccountEnableHandler(serverCtx),
  243 + },
  244 + {
  245 + Method: http.MethodPut,
  246 + Path: "/system/account/:id",
  247 + Handler: user.SystemUserAccountUpdateHandler(serverCtx),
  248 + },
  249 + {
  250 + Method: http.MethodPost,
  251 + Path: "/system/account/search",
  252 + Handler: user.SystemUserAccountSearchHandler(serverCtx),
  253 + },
  254 + }...,
  255 + ),
213 rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret), 256 rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret),
214 rest.WithPrefix("/v1"), 257 rest.WithPrefix("/v1"),
215 ) 258 )
@@ -316,6 +359,16 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { @@ -316,6 +359,16 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
316 Path: "/article_backup/search", 359 Path: "/article_backup/search",
317 Handler: article.MiniArticleBackupSearchHandler(serverCtx), 360 Handler: article.MiniArticleBackupSearchHandler(serverCtx),
318 }, 361 },
  362 + {
  363 + Method: http.MethodPost,
  364 + Path: "/article/set_tag",
  365 + Handler: article.MiniArticleSetTagHandler(serverCtx),
  366 + },
  367 + {
  368 + Method: http.MethodGet,
  369 + Path: "/article_tag/list/all",
  370 + Handler: article.MiniAllArticleTagHandler(serverCtx),
  371 + },
319 }, 372 },
320 rest.WithJwt(serverCtx.Config.MiniAuth.AccessSecret), 373 rest.WithJwt(serverCtx.Config.MiniAuth.AccessSecret),
321 rest.WithPrefix("/v1/mini"), 374 rest.WithPrefix("/v1/mini"),
@@ -343,66 +396,82 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { @@ -343,66 +396,82 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
343 Path: "/article/history", 396 Path: "/article/history",
344 Handler: article.SystemHistoryArticleHandler(serverCtx), 397 Handler: article.SystemHistoryArticleHandler(serverCtx),
345 }, 398 },
  399 + {
  400 + Method: http.MethodPost,
  401 + Path: "/article/search/me",
  402 + Handler: article.SystemArticleSearchMeHandler(serverCtx),
  403 + },
346 }, 404 },
347 rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret), 405 rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret),
348 rest.WithPrefix("/v1/system"), 406 rest.WithPrefix("/v1/system"),
349 ) 407 )
350 408
351 server.AddRoutes( 409 server.AddRoutes(
352 - []rest.Route{  
353 - {  
354 - Method: http.MethodGet,  
355 - Path: "/system/role/:id",  
356 - Handler: role.SystemGetRoleHandler(serverCtx),  
357 - },  
358 - {  
359 - Method: http.MethodPost,  
360 - Path: "/system/role",  
361 - Handler: role.SystemSaveRoleHandler(serverCtx),  
362 - },  
363 - {  
364 - Method: http.MethodDelete,  
365 - Path: "/system/role/:id",  
366 - Handler: role.SystemDeleteRoleHandler(serverCtx),  
367 - },  
368 - {  
369 - Method: http.MethodPut,  
370 - Path: "/system/role/:id",  
371 - Handler: role.SystemUpdateRoleHandler(serverCtx),  
372 - },  
373 - {  
374 - Method: http.MethodPost,  
375 - Path: "/system/role/search",  
376 - Handler: role.SystemSearchRoleHandler(serverCtx),  
377 - },  
378 - }, 410 + rest.WithMiddlewares(
  411 + []rest.Middleware{serverCtx.LoginStatusCheck},
  412 + []rest.Route{
  413 + {
  414 + Method: http.MethodGet,
  415 + Path: "/system/role/:id",
  416 + Handler: role.SystemGetRoleHandler(serverCtx),
  417 + },
  418 + {
  419 + Method: http.MethodPost,
  420 + Path: "/system/role",
  421 + Handler: role.SystemSaveRoleHandler(serverCtx),
  422 + },
  423 + {
  424 + Method: http.MethodDelete,
  425 + Path: "/system/role/:id",
  426 + Handler: role.SystemDeleteRoleHandler(serverCtx),
  427 + },
  428 + {
  429 + Method: http.MethodPut,
  430 + Path: "/system/role/:id",
  431 + Handler: role.SystemUpdateRoleHandler(serverCtx),
  432 + },
  433 + {
  434 + Method: http.MethodPost,
  435 + Path: "/system/role/search",
  436 + Handler: role.SystemSearchRoleHandler(serverCtx),
  437 + },
  438 + }...,
  439 + ),
379 rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret), 440 rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret),
380 rest.WithPrefix("/v1"), 441 rest.WithPrefix("/v1"),
381 ) 442 )
382 443
383 server.AddRoutes( 444 server.AddRoutes(
384 - []rest.Route{  
385 - {  
386 - Method: http.MethodPost,  
387 - Path: "/system/department/list",  
388 - Handler: department.SystemListHandler(serverCtx),  
389 - },  
390 - {  
391 - Method: http.MethodPost,  
392 - Path: "/system/department/add",  
393 - Handler: department.SystemAddHandler(serverCtx),  
394 - },  
395 - {  
396 - Method: http.MethodGet,  
397 - Path: "/system/department/:id",  
398 - Handler: department.SystemGetHandler(serverCtx),  
399 - },  
400 - {  
401 - Method: http.MethodPut,  
402 - Path: "/system/department/:id",  
403 - Handler: department.SystemUpdateHandler(serverCtx),  
404 - },  
405 - }, 445 + rest.WithMiddlewares(
  446 + []rest.Middleware{serverCtx.LoginStatusCheck},
  447 + []rest.Route{
  448 + {
  449 + Method: http.MethodPost,
  450 + Path: "/system/department/list",
  451 + Handler: department.SystemListHandler(serverCtx),
  452 + },
  453 + {
  454 + Method: http.MethodPost,
  455 + Path: "/system/department/add",
  456 + Handler: department.SystemAddHandler(serverCtx),
  457 + },
  458 + {
  459 + Method: http.MethodGet,
  460 + Path: "/system/department/:id",
  461 + Handler: department.SystemGetHandler(serverCtx),
  462 + },
  463 + {
  464 + Method: http.MethodPut,
  465 + Path: "/system/department/:id",
  466 + Handler: department.SystemUpdateHandler(serverCtx),
  467 + },
  468 + {
  469 + Method: http.MethodDelete,
  470 + Path: "/system/department/:id",
  471 + Handler: department.SystemDeleteHandler(serverCtx),
  472 + },
  473 + }...,
  474 + ),
406 rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret), 475 rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret),
407 rest.WithPrefix("/v1"), 476 rest.WithPrefix("/v1"),
408 ) 477 )
@@ -7,6 +7,8 @@ import ( @@ -7,6 +7,8 @@ import (
7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/tags" 7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/tags"
8 "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"
9 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" 9 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
10 ) 12 )
11 13
12 func CreateTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { 14 func CreateTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
@@ -18,11 +20,9 @@ func CreateTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { @@ -18,11 +20,9 @@ func CreateTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
18 } 20 }
19 21
20 l := tags.NewCreateTagLogic(r.Context(), svcCtx) 22 l := tags.NewCreateTagLogic(r.Context(), svcCtx)
  23 + token := contextdata.GetUserTokenFromCtx(r.Context())
  24 + req.CompanyId = token.CompanyId
21 resp, err := l.CreateTag(&req) 25 resp, err := l.CreateTag(&req)
22 - if err != nil {  
23 - httpx.ErrorCtx(r.Context(), w, err)  
24 - } else {  
25 - httpx.OkJsonCtx(r.Context(), w, resp)  
26 - } 26 + result.HttpResult(r, w, resp, err)
27 } 27 }
28 } 28 }
@@ -7,6 +7,8 @@ import ( @@ -7,6 +7,8 @@ import (
7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/tags" 7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/tags"
8 "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"
9 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" 9 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
10 ) 12 )
11 13
12 func DeleteTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { 14 func DeleteTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
@@ -18,11 +20,9 @@ func DeleteTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { @@ -18,11 +20,9 @@ func DeleteTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
18 } 20 }
19 21
20 l := tags.NewDeleteTagLogic(r.Context(), svcCtx) 22 l := tags.NewDeleteTagLogic(r.Context(), svcCtx)
  23 + token := contextdata.GetUserTokenFromCtx(r.Context())
  24 + req.CompanyId = token.CompanyId
21 resp, err := l.DeleteTag(&req) 25 resp, err := l.DeleteTag(&req)
22 - if err != nil {  
23 - httpx.ErrorCtx(r.Context(), w, err)  
24 - } else {  
25 - httpx.OkJsonCtx(r.Context(), w, resp)  
26 - } 26 + result.HttpResult(r, w, resp, err)
27 } 27 }
28 } 28 }
@@ -7,6 +7,8 @@ import ( @@ -7,6 +7,8 @@ import (
7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/tags" 7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/tags"
8 "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"
9 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" 9 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
10 ) 12 )
11 13
12 func EditTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { 14 func EditTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
@@ -18,11 +20,9 @@ func EditTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { @@ -18,11 +20,9 @@ func EditTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
18 } 20 }
19 21
20 l := tags.NewEditTagLogic(r.Context(), svcCtx) 22 l := tags.NewEditTagLogic(r.Context(), svcCtx)
  23 + token := contextdata.GetUserTokenFromCtx(r.Context())
  24 + req.CompanyId = token.CompanyId
21 resp, err := l.EditTag(&req) 25 resp, err := l.EditTag(&req)
22 - if err != nil {  
23 - httpx.ErrorCtx(r.Context(), w, err)  
24 - } else {  
25 - httpx.OkJsonCtx(r.Context(), w, resp)  
26 - } 26 + result.HttpResult(r, w, resp, err)
27 } 27 }
28 } 28 }
@@ -7,6 +7,8 @@ import ( @@ -7,6 +7,8 @@ import (
7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/tags" 7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/tags"
8 "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"
9 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" 9 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
10 ) 12 )
11 13
12 func GetTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { 14 func GetTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
@@ -16,13 +18,10 @@ func GetTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { @@ -16,13 +18,10 @@ func GetTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
16 httpx.ErrorCtx(r.Context(), w, err) 18 httpx.ErrorCtx(r.Context(), w, err)
17 return 19 return
18 } 20 }
19 - 21 + token := contextdata.GetUserTokenFromCtx(r.Context())
  22 + req.CompanyId = token.CompanyId
20 l := tags.NewGetTagLogic(r.Context(), svcCtx) 23 l := tags.NewGetTagLogic(r.Context(), svcCtx)
21 resp, err := l.GetTag(&req) 24 resp, err := l.GetTag(&req)
22 - if err != nil {  
23 - httpx.ErrorCtx(r.Context(), w, err)  
24 - } else {  
25 - httpx.OkJsonCtx(r.Context(), w, resp)  
26 - } 25 + result.HttpResult(r, w, resp, err)
27 } 26 }
28 } 27 }
@@ -7,6 +7,8 @@ import ( @@ -7,6 +7,8 @@ import (
7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/tags" 7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/tags"
8 "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"
9 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" 9 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
10 ) 12 )
11 13
12 func SearchTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { 14 func SearchTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
@@ -18,11 +20,9 @@ func SearchTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { @@ -18,11 +20,9 @@ func SearchTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
18 } 20 }
19 21
20 l := tags.NewSearchTagLogic(r.Context(), svcCtx) 22 l := tags.NewSearchTagLogic(r.Context(), svcCtx)
  23 + token := contextdata.GetUserTokenFromCtx(r.Context())
  24 + req.CompanyId = token.CompanyId
21 resp, err := l.SearchTag(&req) 25 resp, err := l.SearchTag(&req)
22 - if err != nil {  
23 - httpx.ErrorCtx(r.Context(), w, err)  
24 - } else {  
25 - httpx.OkJsonCtx(r.Context(), w, resp)  
26 - } 26 + result.HttpResult(r, w, resp, err)
27 } 27 }
28 } 28 }
  1 +package article
  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 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
  10 +
  11 + "github.com/zeromicro/go-zero/core/logx"
  12 +)
  13 +
  14 +type MiniAllArticleTagLogic struct {
  15 + logx.Logger
  16 + ctx context.Context
  17 + svcCtx *svc.ServiceContext
  18 +}
  19 +
  20 +func NewMiniAllArticleTagLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniAllArticleTagLogic {
  21 + return &MiniAllArticleTagLogic{
  22 + Logger: logx.WithContext(ctx),
  23 + ctx: ctx,
  24 + svcCtx: svcCtx,
  25 + }
  26 +}
  27 +
  28 +func (l *MiniAllArticleTagLogic) MiniAllArticleTag(req *types.MiniAllArticleTagRequest) (resp *types.MiniAllArticleTagResponse, err error) {
  29 + var conn = l.svcCtx.DefaultDBConn()
  30 + queryOption := domain.NewQueryOptions().WithFindOnly()
  31 + _, tagList, err := l.svcCtx.ArticleTagRepository.Find(l.ctx, conn, req.CompanyId, queryOption)
  32 + if err != nil {
  33 + return nil, xerr.NewErrMsgErr("获取标签列表失败", err)
  34 + }
  35 + // 合并输出数据
  36 + var group []string
  37 + tagMap := map[string][]types.ArticleTagItem{}
  38 + for _, val := range tagList {
  39 + if m, ok := tagMap[val.Category]; ok {
  40 + m = append(m, types.ArticleTagItem{
  41 + Id: val.Id,
  42 + Group: val.Category,
  43 + Name: val.Name,
  44 + Image: val.Image.Url,
  45 + })
  46 + tagMap[val.Category] = m
  47 + } else {
  48 + group = append(group, val.Category)
  49 + tagMap[val.Category] = []types.ArticleTagItem{
  50 + {
  51 + Id: val.Id,
  52 + Group: val.Category,
  53 + Name: val.Name,
  54 + Image: val.Image.Url,
  55 + },
  56 + }
  57 + }
  58 + }
  59 + resp = &types.MiniAllArticleTagResponse{
  60 + TagGroup: make([]types.ArticleTagGroup, 0),
  61 + }
  62 + for i := range group {
  63 + resp.TagGroup = append(resp.TagGroup, types.ArticleTagGroup{
  64 + Group: group[i],
  65 + Tags: tagMap[group[i]],
  66 + })
  67 + }
  68 + return resp, nil
  69 +}
@@ -26,6 +26,7 @@ func NewMiniArticleMarkUserReadLogic(ctx context.Context, svcCtx *svc.ServiceCon @@ -26,6 +26,7 @@ func NewMiniArticleMarkUserReadLogic(ctx context.Context, svcCtx *svc.ServiceCon
26 } 26 }
27 } 27 }
28 28
  29 +// 记录人员浏览的文章
29 func (l *MiniArticleMarkUserReadLogic) MiniArticleMarkUserRead(req *types.MiniArticleMarkUserReadRequest) (resp *types.MiniArticleMarkUserReadResponse, err error) { 30 func (l *MiniArticleMarkUserReadLogic) MiniArticleMarkUserRead(req *types.MiniArticleMarkUserReadRequest) (resp *types.MiniArticleMarkUserReadResponse, err error) {
30 var conn = l.svcCtx.DefaultDBConn() 31 var conn = l.svcCtx.DefaultDBConn()
31 32
@@ -84,7 +85,7 @@ func (l *MiniArticleMarkUserReadLogic) MiniArticleMarkUserRead(req *types.MiniAr @@ -84,7 +85,7 @@ func (l *MiniArticleMarkUserReadLogic) MiniArticleMarkUserRead(req *types.MiniAr
84 return err 85 return err
85 } 86 }
86 //增加浏览计数 87 //增加浏览计数
87 - err = l.svcCtx.ArticleRepository.IncreaseCountRead(ctx, c, 1, articleInfo) 88 + err = l.svcCtx.ArticleRepository.IncreaseCountRead(ctx, c, 1, articleInfo.Id)
88 return err 89 return err
89 }, true) 90 }, true)
90 if err != nil { 91 if err != nil {
@@ -42,19 +42,24 @@ func (l *MiniArticleSearchMeLogic) MiniArticleSearchMe(req *types.MiniArticleSea @@ -42,19 +42,24 @@ func (l *MiniArticleSearchMeLogic) MiniArticleSearchMe(req *types.MiniArticleSea
42 List: make([]types.ArticleSearchMe, len(articleList)), 42 List: make([]types.ArticleSearchMe, len(articleList)),
43 } 43 }
44 for i := range articleList { 44 for i := range articleList {
45 - images := []string{}  
46 - for _, val2 := range articleList[i].Images {  
47 - images = append(images, val2.Url)  
48 - }  
49 - resp.List[i] = types.ArticleSearchMe{  
50 - Id: articleList[i].Id,  
51 - Title: articleList[i].Title,  
52 - Images: images,  
53 - CreatedAt: articleList[i].CreatedAt,  
54 - CountLove: articleList[i].CountLove,  
55 - CountComment: articleList[i].CountComment,  
56 - Show: int(articleList[i].Show),  
57 - } 45 + resp.List[i] = NewArticle(articleList[i])
58 } 46 }
59 return 47 return
60 } 48 }
  49 +
  50 +func NewArticle(article *domain.Article) types.ArticleSearchMe {
  51 + images := []string{}
  52 + for _, val2 := range article.Images {
  53 + images = append(images, val2.Url)
  54 + }
  55 + articleSearchMe := types.ArticleSearchMe{
  56 + Id: article.Id,
  57 + Title: article.Title,
  58 + Images: images,
  59 + CreatedAt: article.CreatedAt,
  60 + CountLove: article.CountLove,
  61 + CountComment: article.CountComment,
  62 + Show: int(article.Show),
  63 + }
  64 + return articleSearchMe
  65 +}
  1 +package article
  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 MiniArticleSetTagLogic struct {
  13 + logx.Logger
  14 + ctx context.Context
  15 + svcCtx *svc.ServiceContext
  16 +}
  17 +
  18 +func NewMiniArticleSetTagLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniArticleSetTagLogic {
  19 + return &MiniArticleSetTagLogic{
  20 + Logger: logx.WithContext(ctx),
  21 + ctx: ctx,
  22 + svcCtx: svcCtx,
  23 + }
  24 +}
  25 +
  26 +func (l *MiniArticleSetTagLogic) MiniArticleSetTag(req *types.MiniArticleSetTagRequest) (resp *types.MiniArticleSetTagResponse, err error) {
  27 + // todo: add your logic here and delete this line
  28 +
  29 + return
  30 +}
@@ -2,6 +2,7 @@ package article @@ -2,6 +2,7 @@ package article
2 2
3 import ( 3 import (
4 "context" 4 "context"
  5 + "text/template"
5 6
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/svc"
7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" 8 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
@@ -29,6 +30,10 @@ func NewMiniCreateArticleDraftLogic(ctx context.Context, svcCtx *svc.ServiceCont @@ -29,6 +30,10 @@ func NewMiniCreateArticleDraftLogic(ctx context.Context, svcCtx *svc.ServiceCont
29 func (l *MiniCreateArticleDraftLogic) MiniCreateArticleDraft(req *types.MiniArticleDraftCreateRequest) (resp *types.MiniArticleDraftCreateResponse, err error) { 30 func (l *MiniCreateArticleDraftLogic) MiniCreateArticleDraft(req *types.MiniArticleDraftCreateRequest) (resp *types.MiniArticleDraftCreateResponse, err error) {
30 var conn = l.svcCtx.DefaultDBConn() 31 var conn = l.svcCtx.DefaultDBConn()
31 32
  33 + for i := range req.Section {
  34 + req.Section[i] = template.HTMLEscapeString(req.Section[i])
  35 + }
  36 +
32 newDraft := domain.ArticleDraft{ 37 newDraft := domain.ArticleDraft{
33 Id: 0, 38 Id: 0,
34 CompanyId: req.CompanyId, 39 CompanyId: req.CompanyId,
@@ -3,6 +3,7 @@ package article @@ -3,6 +3,7 @@ package article
3 import ( 3 import (
4 "context" 4 "context"
5 "strings" 5 "strings"
  6 + "text/template"
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"
8 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" 9 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
@@ -28,6 +29,7 @@ func NewMiniCreateArticleLogic(ctx context.Context, svcCtx *svc.ServiceContext) @@ -28,6 +29,7 @@ func NewMiniCreateArticleLogic(ctx context.Context, svcCtx *svc.ServiceContext)
28 } 29 }
29 } 30 }
30 31
  32 +// 创建新文章
31 func (l *MiniCreateArticleLogic) MiniCreateArticle(req *types.MiniArticleCreateRequest) (resp *types.MiniArticleCreateResponse, err error) { 33 func (l *MiniCreateArticleLogic) MiniCreateArticle(req *types.MiniArticleCreateRequest) (resp *types.MiniArticleCreateResponse, err error) {
32 var conn = l.svcCtx.DefaultDBConn() 34 var conn = l.svcCtx.DefaultDBConn()
33 // 检查发布人 35 // 检查发布人
@@ -123,6 +125,8 @@ func (l *MiniCreateArticleLogic) MiniCreateArticle(req *types.MiniArticleCreateR @@ -123,6 +125,8 @@ func (l *MiniCreateArticleLogic) MiniCreateArticle(req *types.MiniArticleCreateR
123 if len(newStr) == 0 { 125 if len(newStr) == 0 {
124 continue 126 continue
125 } 127 }
  128 + newStr = template.HTMLEscapeString(newStr)
  129 +
126 newSection := domain.ArticleSection{ 130 newSection := domain.ArticleSection{
127 Id: 0, 131 Id: 0,
128 CompanyId: author.CompanyId, 132 CompanyId: author.CompanyId,
@@ -26,6 +26,7 @@ func NewMiniGetArticleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Mi @@ -26,6 +26,7 @@ func NewMiniGetArticleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Mi
26 } 26 }
27 } 27 }
28 28
  29 +// 小程序端展示文章内容
29 func (l *MiniGetArticleLogic) MiniGetArticle(req *types.MiniArticleGetRequest) (resp *types.MiniArticleGetResponse, err error) { 30 func (l *MiniGetArticleLogic) MiniGetArticle(req *types.MiniArticleGetRequest) (resp *types.MiniArticleGetResponse, err error) {
30 // 获取文章内容 31 // 获取文章内容
31 var conn = l.svcCtx.DefaultDBConn() 32 var conn = l.svcCtx.DefaultDBConn()
@@ -88,10 +89,9 @@ func (l *MiniGetArticleLogic) MiniGetArticle(req *types.MiniArticleGetRequest) ( @@ -88,10 +89,9 @@ func (l *MiniGetArticleLogic) MiniGetArticle(req *types.MiniArticleGetRequest) (
88 Title: articleInfo.Title, 89 Title: articleInfo.Title,
89 AuthorId: articleInfo.AuthorId, 90 AuthorId: articleInfo.AuthorId,
90 Author: types.ArticleAuthor{ 91 Author: types.ArticleAuthor{
91 - Id: articleInfo.Author.Id,  
92 - Name: articleInfo.Author.Name,  
93 - Avatar: articleInfo.Author.Avatar,  
94 - // Group: articleInfo.Author.Group, 92 + Id: articleInfo.Author.Id,
  93 + Name: articleInfo.Author.Name,
  94 + Avatar: articleInfo.Author.Avatar,
95 Position: articleInfo.Author.Position, 95 Position: articleInfo.Author.Position,
96 Company: articleInfo.Author.Company, 96 Company: articleInfo.Author.Company,
97 }, 97 },
@@ -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/message"
5 6
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/svc"
7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" 8 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
@@ -93,10 +94,18 @@ func (l *MiniSetUserLikeLogic) cancelSetUserLikeArticle(req *types.MiniSetUserLi @@ -93,10 +94,18 @@ func (l *MiniSetUserLikeLogic) cancelSetUserLikeArticle(req *types.MiniSetUserLi
93 return err 94 return err
94 } 95 }
95 // 减少文章的点赞数量 96 // 减少文章的点赞数量
96 - err = l.svcCtx.ArticleRepository.IncreaseCountLove(ctx, c, -1, articleInfo) 97 + err = l.svcCtx.ArticleRepository.IncreaseCountLove(ctx, c, -1, articleInfo.Id)
97 if err != nil { 98 if err != nil {
98 return err 99 return err
99 } 100 }
  101 +
  102 + // 删除点赞文章消息
  103 + var messageLogic = message.NewMiniBusinessLogic(l.ctx, l.svcCtx)
  104 + err = messageLogic.UnLikeArticle(c, articleInfo.Id)
  105 + if err != nil {
  106 + return err
  107 + }
  108 +
100 return nil 109 return nil
101 }, true) 110 }, true)
102 if err != nil { 111 if err != nil {
@@ -166,10 +175,18 @@ func (l *MiniSetUserLikeLogic) cancelSetUserLikeComment(req *types.MiniSetUserLi @@ -166,10 +175,18 @@ func (l *MiniSetUserLikeLogic) cancelSetUserLikeComment(req *types.MiniSetUserLi
166 return err 175 return err
167 } 176 }
168 // 减少评论的点赞数量 177 // 减少评论的点赞数量
169 - err = l.svcCtx.ArticleCommentRepository.IncreaseCountUserLove(ctx, c, -1, commentInfo) 178 + err = l.svcCtx.ArticleCommentRepository.IncreaseCountUserLove(ctx, c, -1, commentInfo.Id)
170 if err != nil { 179 if err != nil {
171 return err 180 return err
172 } 181 }
  182 +
  183 + // 删除点赞评论消息
  184 + var messageLogic = message.NewMiniBusinessLogic(l.ctx, l.svcCtx)
  185 + err = messageLogic.UnLikeComment(c, commentInfo.ArticleId, commentInfo.Id)
  186 + if err != nil {
  187 + return err
  188 + }
  189 +
173 return nil 190 return nil
174 }, true) 191 }, true)
175 if err != nil { 192 if err != nil {
@@ -239,10 +256,18 @@ func (l *MiniSetUserLikeLogic) setUserLikeArticle(req *types.MiniSetUserLikeRequ @@ -239,10 +256,18 @@ func (l *MiniSetUserLikeLogic) setUserLikeArticle(req *types.MiniSetUserLikeRequ
239 return err 256 return err
240 } 257 }
241 // 增加文章的点赞数量 258 // 增加文章的点赞数量
242 - err = l.svcCtx.ArticleRepository.IncreaseCountLove(ctx, c, 1, articleInfo) 259 + err = l.svcCtx.ArticleRepository.IncreaseCountLove(ctx, c, 1, articleInfo.Id)
243 if err != nil { 260 if err != nil {
244 return err 261 return err
245 } 262 }
  263 +
  264 + // 创建点赞消息
  265 + var messageLogic = message.NewMiniBusinessLogic(l.ctx, l.svcCtx)
  266 + err = messageLogic.LikeArticle(c, articleInfo.Id, articleInfo.AuthorId)
  267 + if err != nil {
  268 + return err
  269 + }
  270 +
246 return nil 271 return nil
247 }, true) 272 }, true)
248 if err != nil { 273 if err != nil {
@@ -320,10 +345,18 @@ func (l *MiniSetUserLikeLogic) setUserLikeComment(req *types.MiniSetUserLikeRequ @@ -320,10 +345,18 @@ func (l *MiniSetUserLikeLogic) setUserLikeComment(req *types.MiniSetUserLikeRequ
320 return err 345 return err
321 } 346 }
322 // 增加评论的点赞数量 347 // 增加评论的点赞数量
323 - err = l.svcCtx.ArticleCommentRepository.IncreaseCountUserLove(ctx, c, 1, commentInfo) 348 + err = l.svcCtx.ArticleCommentRepository.IncreaseCountUserLove(ctx, c, 1, commentInfo.Id)
324 if err != nil { 349 if err != nil {
325 return err 350 return err
326 } 351 }
  352 +
  353 + // 创建点赞消息
  354 + var messageLogic = message.NewMiniBusinessLogic(l.ctx, l.svcCtx)
  355 + err = messageLogic.LikeComment(c, commentInfo.ArticleId, commentInfo.Id, commentInfo.FromUserId)
  356 + if err != nil {
  357 + return err
  358 + }
  359 +
327 return nil 360 return nil
328 }, true) 361 }, true)
329 if err != nil { 362 if err != nil {
@@ -2,6 +2,7 @@ package article @@ -2,6 +2,7 @@ package article
2 2
3 import ( 3 import (
4 "context" 4 "context"
  5 + "text/template"
5 6
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/svc"
7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" 8 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
@@ -37,6 +38,10 @@ func (l *MiniUpdateArticleDraftLogic) MiniUpdateArticleDraft(req *types.MiniArti @@ -37,6 +38,10 @@ func (l *MiniUpdateArticleDraftLogic) MiniUpdateArticleDraft(req *types.MiniArti
37 return nil, xerr.NewErrMsg("更新草稿失败") 38 return nil, xerr.NewErrMsg("更新草稿失败")
38 } 39 }
39 } 40 }
  41 + for i := range req.Section {
  42 + req.Section[i] = template.HTMLEscapeString(req.Section[i])
  43 + }
  44 +
40 draftInfo.Content = req.Section 45 draftInfo.Content = req.Section
41 draftInfo.Title = req.Title 46 draftInfo.Title = req.Title
42 draftInfo.Location = domain.Location{ 47 draftInfo.Location = domain.Location{
@@ -71,6 +71,7 @@ func (l *MiniUserLikeArticleLogic) MiniUserLikeArticle(req *types.MiniUserLikeAr @@ -71,6 +71,7 @@ func (l *MiniUserLikeArticleLogic) MiniUserLikeArticle(req *types.MiniUserLikeAr
71 if u, ok := userMap[val.UserId]; ok { 71 if u, ok := userMap[val.UserId]; ok {
72 item.Name = u.Name 72 item.Name = u.Name
73 item.Avatar = u.Avatar 73 item.Avatar = u.Avatar
  74 + item.Position = u.Position
74 } 75 }
75 resp.List[i] = item 76 resp.List[i] = item
76 } 77 }
  1 +package article
  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/contextdata"
  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 SystemArticleSearchMeLogic struct {
  16 + logx.Logger
  17 + ctx context.Context
  18 + svcCtx *svc.ServiceContext
  19 +}
  20 +
  21 +func NewSystemArticleSearchMeLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemArticleSearchMeLogic {
  22 + return &SystemArticleSearchMeLogic{
  23 + Logger: logx.WithContext(ctx),
  24 + ctx: ctx,
  25 + svcCtx: svcCtx,
  26 + }
  27 +}
  28 +
  29 +func (l *SystemArticleSearchMeLogic) SystemArticleSearchMe(req *types.SystemArticleSearchMeRequest) (resp *types.SystemArticleSearchMeResponse, err error) {
  30 + var (
  31 + conn = l.svcCtx.DefaultDBConn()
  32 + userToken = contextdata.GetUserTokenFromCtx(l.ctx)
  33 + )
  34 + queryOptions := domain.NewQueryOptions().
  35 + WithOffsetLimit(req.Page, req.Size).
  36 + MustWithKV("authorId", req.AuthorId).
  37 + WithKV("beginCreatedAt", req.BeginTime).
  38 + WithKV("endCreatedAt", req.EndTime)
  39 +
  40 + cnt, articleList, err := l.svcCtx.ArticleRepository.Find(l.ctx, conn, userToken.CompanyId, queryOptions)
  41 + if err != nil {
  42 + return &types.SystemArticleSearchMeResponse{}, xerr.NewErrMsgErr("获取文章列表失败", err)
  43 + }
  44 +
  45 + resp = &types.SystemArticleSearchMeResponse{
  46 + Total: int(cnt),
  47 + List: make([]types.ArticleSearchMe, len(articleList)),
  48 + }
  49 + for i := range articleList {
  50 + resp.List[i] = NewArticle(articleList[i])
  51 + }
  52 + return
  53 +}
  1 +package comment
  2 +
  3 +import (
  4 + "context"
  5 + "sort"
  6 + "strings"
  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 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
  12 +
  13 + "github.com/zeromicro/go-zero/core/logx"
  14 +)
  15 +
  16 +type MiniArticleCommentAtWhoLogic struct {
  17 + logx.Logger
  18 + ctx context.Context
  19 + svcCtx *svc.ServiceContext
  20 +}
  21 +
  22 +func NewMiniArticleCommentAtWhoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniArticleCommentAtWhoLogic {
  23 + return &MiniArticleCommentAtWhoLogic{
  24 + Logger: logx.WithContext(ctx),
  25 + ctx: ctx,
  26 + svcCtx: svcCtx,
  27 + }
  28 +}
  29 +
  30 +// MiniArticleCommentAtWho 填写评估时@谁 的可选择者列表
  31 +func (l *MiniArticleCommentAtWhoLogic) MiniArticleCommentAtWho(req *types.MiniArticleCommentAtWhoRequest) (resp *types.MiniArticleCommentAtWhoResponse, err error) {
  32 + var conn = l.svcCtx.DefaultDBConn()
  33 + articleInfo, err := l.svcCtx.ArticleRepository.FindOne(l.ctx, conn, req.ArticleId)
  34 + if err != nil {
  35 + return nil, xerr.NewErrMsgErr("获取评论人信息失败", err)
  36 + }
  37 + if articleInfo.CompanyId != req.CompanyId {
  38 + resp = &types.MiniArticleCommentAtWhoResponse{}
  39 + return resp, nil
  40 + }
  41 +
  42 + var userList []*domain.User
  43 + if len(articleInfo.WhoRead) == 0 {
  44 + //获取所有人
  45 + queryOption := domain.NewQueryOptions().WithFindOnly().MustWithKV("companyId", articleInfo.CompanyId)
  46 + _, userList, err = l.svcCtx.UserRepository.Find(l.ctx, conn, queryOption)
  47 + if err != nil {
  48 + resp = &types.MiniArticleCommentAtWhoResponse{}
  49 + return resp, nil
  50 + }
  51 + } else {
  52 + queryOption := domain.NewQueryOptions().WithFindOnly().MustWithKV("ids", articleInfo.WhoRead)
  53 + _, userList, err = l.svcCtx.UserRepository.Find(l.ctx, conn, queryOption)
  54 + if err != nil {
  55 + resp = &types.MiniArticleCommentAtWhoResponse{}
  56 + return resp, nil
  57 + }
  58 + }
  59 +
  60 + uList := make([]types.CommentAtWho, len(userList))
  61 +
  62 + for i := range userList {
  63 + uList[i] = types.CommentAtWho{
  64 + Id: userList[i].Id,
  65 + Name: userList[i].Name,
  66 + FirstLetter: "",
  67 + }
  68 + for _, val := range userList[i].PinYinName {
  69 + uList[i].FirstLetter = strings.ToUpper(string(val))
  70 + break
  71 + }
  72 + }
  73 + sort.Slice(uList, func(i, j int) bool {
  74 + return uList[i].FirstLetter < uList[j].FirstLetter
  75 + })
  76 + resp = &types.MiniArticleCommentAtWhoResponse{
  77 + List: uList,
  78 + }
  79 + return resp, nil
  80 +}
@@ -3,6 +3,8 @@ package comment @@ -3,6 +3,8 @@ package comment
3 import ( 3 import (
4 "context" 4 "context"
5 5
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/message"
  7 +
6 "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"
7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" 9 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
8 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction" 10 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
@@ -11,6 +13,7 @@ import ( @@ -11,6 +13,7 @@ import (
11 13
12 "text/template" 14 "text/template"
13 15
  16 + "github.com/samber/lo"
14 "github.com/zeromicro/go-zero/core/logx" 17 "github.com/zeromicro/go-zero/core/logx"
15 ) 18 )
16 19
@@ -49,13 +52,12 @@ func (l *MiniCreateArticleCommentLogic) MiniCreateArticleComment(req *types.Mini @@ -49,13 +52,12 @@ func (l *MiniCreateArticleCommentLogic) MiniCreateArticleComment(req *types.Mini
49 return nil, xerr.NewErrMsg("没有评论权限") 52 return nil, xerr.NewErrMsg("没有评论权限")
50 } 53 }
51 //查看评论权限, 54 //查看评论权限,
52 - //临时注释  
53 - // if len(articleInfo.WhoReview) > 0 {  
54 - // ok := lo.IndexOf(articleInfo.WhoReview, req.FromUserId)  
55 - // if ok < 0 {  
56 - // return nil, xerr.NewErrMsg("没有评论权限")  
57 - // }  
58 - // } 55 + if len(articleInfo.WhoReview) > 0 {
  56 + ok := lo.IndexOf(articleInfo.WhoReview, req.FromUserId)
  57 + if ok < 0 {
  58 + return nil, xerr.NewErrMsg("没有评论权限")
  59 + }
  60 + }
59 // 对段落进行评论 61 // 对段落进行评论
60 var selctionInfo *domain.ArticleSection 62 var selctionInfo *domain.ArticleSection
61 if req.SectionId > 0 { 63 if req.SectionId > 0 {
@@ -83,15 +85,22 @@ func (l *MiniCreateArticleCommentLogic) MiniCreateArticleComment(req *types.Mini @@ -83,15 +85,22 @@ func (l *MiniCreateArticleCommentLogic) MiniCreateArticleComment(req *types.Mini
83 } 85 }
84 } 86 }
85 var atWhoList []*domain.User 87 var atWhoList []*domain.User
  88 + var atWhoIds = make([]int64, 0)
86 if len(req.AtWho) > 0 { 89 if len(req.AtWho) > 0 {
87 - queryOption := domain.NewQueryOptions().WithFindOnly().WithKV("ids", req.AtWho) 90 + for _, val := range req.AtWho {
  91 + atWhoIds = append(atWhoIds, val.Id)
  92 + }
  93 + atWhoIds = lo.Uniq(atWhoIds)
  94 + queryOption := domain.NewQueryOptions().WithFindOnly().WithKV("ids", atWhoIds)
88 _, atWhoList, err = l.svcCtx.UserRepository.Find(l.ctx, conn, queryOption) 95 _, atWhoList, err = l.svcCtx.UserRepository.Find(l.ctx, conn, queryOption)
89 if err != nil { 96 if err != nil {
90 return nil, xerr.NewErrMsgErr("检查@的人员失败", err) 97 return nil, xerr.NewErrMsgErr("检查@的人员失败", err)
91 } 98 }
  99 + if len(atWhoIds) != len(atWhoList) {
  100 + return nil, xerr.NewErrMsg("检查@的人员失败")
  101 + }
92 } 102 }
93 // 处理文本内容 103 // 处理文本内容
94 - // content:=  
95 content := template.HTMLEscapeString(req.Content) 104 content := template.HTMLEscapeString(req.Content)
96 105
97 newComment := domain.ArticleComment{ 106 newComment := domain.ArticleComment{
@@ -149,16 +158,52 @@ func (l *MiniCreateArticleCommentLogic) MiniCreateArticleComment(req *types.Mini @@ -149,16 +158,52 @@ func (l *MiniCreateArticleCommentLogic) MiniCreateArticleComment(req *types.Mini
149 } 158 }
150 //保存数据 159 //保存数据
151 err = transaction.UseTrans(l.ctx, conn.DB(), func(ctx context.Context, c transaction.Conn) error { 160 err = transaction.UseTrans(l.ctx, conn.DB(), func(ctx context.Context, c transaction.Conn) error {
152 - // 增加平评论计数  
153 - err = l.svcCtx.ArticleRepository.IncreaseCountComment(ctx, c, 1, articleInfo) 161 + //保存评论
  162 + _, err = l.svcCtx.ArticleCommentRepository.Insert(ctx, c, &newComment)
154 if err != nil { 163 if err != nil {
155 return err 164 return err
156 } 165 }
157 - //保存评论  
158 - _, err = l.svcCtx.ArticleCommentRepository.Insert(ctx, c, &newComment) 166 + // 增加文章评论计数
  167 + err = l.svcCtx.ArticleRepository.IncreaseCountComment(ctx, c, 1, articleInfo.Id)
  168 + if err != nil {
  169 + return err
  170 + }
  171 + //增加段落评论计数
  172 + if newComment.SectionId > 0 {
  173 + err = l.svcCtx.ArticleSectionRepository.IncreaseCountComment(ctx, c, 1, newComment.SectionId)
  174 + if err != nil {
  175 + return err
  176 + }
  177 + }
  178 + //增加评论回复计数
  179 + if pComment != nil {
  180 + err = l.svcCtx.ArticleCommentRepository.IncreaseCountReply(l.ctx, c, 1, pComment.Id)
  181 + if err != nil {
  182 + return err
  183 + }
  184 + }
  185 + // 增加最顶层的评论回复计数
  186 + if newComment.TopId != 0 && newComment.Pid != newComment.TopId {
  187 + err = l.svcCtx.ArticleCommentRepository.IncreaseCountReply(l.ctx, c, 1, newComment.TopId)
  188 + if err != nil {
  189 + return err
  190 + }
  191 + }
  192 +
  193 + // 创建回复消息
  194 + var atAllIds = make([]int64, 0)
  195 + atAllIds = append(atAllIds, newComment.ToUserId)
  196 + atAllIds = append(atAllIds, atWhoIds...)
  197 + var messageLogic = message.NewMiniBusinessLogic(l.ctx, l.svcCtx)
  198 + if pComment != nil {
  199 + err = messageLogic.CommentReply(c, pComment.ArticleId, pComment.SectionId, pComment.Id, req.Content, atAllIds) // 对评论回复
  200 + } else {
  201 + err = messageLogic.CommentArticle(c, req.ArtitcleId, req.SectionId, req.Content, atAllIds) // 对文章回复
  202 + }
159 if err != nil { 203 if err != nil {
160 return err 204 return err
161 } 205 }
  206 +
162 return nil 207 return nil
163 }, true) 208 }, true)
164 209
@@ -171,7 +216,7 @@ func (l *MiniCreateArticleCommentLogic) MiniCreateArticleComment(req *types.Mini @@ -171,7 +216,7 @@ func (l *MiniCreateArticleCommentLogic) MiniCreateArticleComment(req *types.Mini
171 Pid: newComment.Pid, 216 Pid: newComment.Pid,
172 TopId: newComment.TopId, 217 TopId: newComment.TopId,
173 ArtitcleId: newComment.ArticleId, 218 ArtitcleId: newComment.ArticleId,
174 - SectionId: newComment.ArticleId, 219 + SectionId: newComment.SectionId,
175 FromUserId: newComment.FromUserId, 220 FromUserId: newComment.FromUserId,
176 FromUser: types.CommentAuthor{ 221 FromUser: types.CommentAuthor{
177 Id: newComment.FromUser.Id, 222 Id: newComment.FromUser.Id,
@@ -192,16 +237,14 @@ func (l *MiniCreateArticleCommentLogic) MiniCreateArticleComment(req *types.Mini @@ -192,16 +237,14 @@ func (l *MiniCreateArticleCommentLogic) MiniCreateArticleComment(req *types.Mini
192 CountReply: 0, 237 CountReply: 0,
193 CountUserLove: 0, 238 CountUserLove: 0,
194 CountAdminLove: 0, 239 CountAdminLove: 0,
195 - AtWho: []types.CommentAuthor{}, 240 + AtWho: []types.CommentAtWho{},
  241 + CreatedAt: newComment.CreatedAt,
196 } 242 }
197 243
198 for _, val := range newComment.AtWho { 244 for _, val := range newComment.AtWho {
199 - resp.AtWho = append(resp.AtWho, types.CommentAuthor{  
200 - Id: val.Id,  
201 - Name: val.Name,  
202 - Avatar: val.Avatar,  
203 - Position: val.Position,  
204 - Company: val.Company, 245 + resp.AtWho = append(resp.AtWho, types.CommentAtWho{
  246 + Id: val.Id,
  247 + Name: val.Name,
205 }) 248 })
206 } 249 }
207 250
  1 +package comment
  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 + "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/pkg/xerr"
  11 +
  12 + "github.com/zeromicro/go-zero/core/logx"
  13 +)
  14 +
  15 +type MiniDeleteArticleCommentLogic struct {
  16 + logx.Logger
  17 + ctx context.Context
  18 + svcCtx *svc.ServiceContext
  19 +}
  20 +
  21 +func NewMiniDeleteArticleCommentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniDeleteArticleCommentLogic {
  22 + return &MiniDeleteArticleCommentLogic{
  23 + Logger: logx.WithContext(ctx),
  24 + ctx: ctx,
  25 + svcCtx: svcCtx,
  26 + }
  27 +}
  28 +
  29 +// 小程序端人人员删除评论
  30 +func (l *MiniDeleteArticleCommentLogic) MiniDeleteArticleComment(req *types.MiniDeleteArticleCommentRequest) (resp *types.MiniDeleteArticleCommentResponse, err error) {
  31 + var conn = l.svcCtx.DefaultDBConn()
  32 + commetInfo, err := l.svcCtx.ArticleCommentRepository.FindOne(l.ctx, conn, req.CommentId)
  33 + if err != nil {
  34 + return nil, xerr.NewErrMsgErr("删除评论信息失败", err)
  35 + }
  36 +
  37 + if commetInfo.FromUserId != req.UserId {
  38 + return nil, xerr.NewErrMsg("没有操作权限")
  39 + }
  40 +
  41 + commetInfo.Show = domain.CommentShowDisable
  42 +
  43 + // 变更回复数量
  44 + err = transaction.UseTrans(l.ctx, conn.DB(), func(ctx context.Context, c transaction.Conn) error {
  45 + _, err = l.svcCtx.ArticleCommentRepository.Update(ctx, c, commetInfo)
  46 + if err != nil {
  47 + return err
  48 + }
  49 + // 减少上级评论的回复数量
  50 + if commetInfo.Pid != 0 {
  51 + err = l.svcCtx.ArticleCommentRepository.IncreaseCountReply(l.ctx, c, -1, commetInfo.Pid)
  52 + if err != nil {
  53 + return err
  54 + }
  55 + }
  56 + // 减少最顶层的评论回复计数
  57 + if commetInfo.TopId != 0 && commetInfo.Pid != commetInfo.TopId {
  58 + err = l.svcCtx.ArticleCommentRepository.IncreaseCountReply(l.ctx, c, -1, commetInfo.TopId)
  59 + if err != nil {
  60 + return err
  61 + }
  62 + }
  63 + //减少加段落评论计数
  64 + if commetInfo.SectionId > 0 {
  65 + err = l.svcCtx.ArticleSectionRepository.IncreaseCountComment(ctx, c, -1, commetInfo.SectionId)
  66 + if err != nil {
  67 + return err
  68 + }
  69 + }
  70 + // 减少文章的评论数
  71 + err = l.svcCtx.ArticleRepository.IncreaseCountComment(ctx, c, -1, commetInfo.ArticleId)
  72 + if err != nil {
  73 + return err
  74 + }
  75 + return nil
  76 + }, true)
  77 +
  78 + if err != nil {
  79 + return nil, xerr.NewErrMsgErr("删除评论信息失败", err)
  80 + }
  81 + resp = &types.MiniDeleteArticleCommentResponse{Id: commetInfo.Id}
  82 + return resp, nil
  83 +}
  1 +package comment
  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 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
  10 +
  11 + "github.com/zeromicro/go-zero/core/logx"
  12 +)
  13 +
  14 +type MiniGetArticleCommentLogic struct {
  15 + logx.Logger
  16 + ctx context.Context
  17 + svcCtx *svc.ServiceContext
  18 +}
  19 +
  20 +func NewMiniGetArticleCommentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniGetArticleCommentLogic {
  21 + return &MiniGetArticleCommentLogic{
  22 + Logger: logx.WithContext(ctx),
  23 + ctx: ctx,
  24 + svcCtx: svcCtx,
  25 + }
  26 +}
  27 +
  28 +// 获取单条评论详情
  29 +func (l *MiniGetArticleCommentLogic) MiniGetArticleComment(req *types.MiniGetArticleCommentRequest) (resp *types.MiniGetArticleCommentResponse, err error) {
  30 + var conn = l.svcCtx.DefaultDBConn()
  31 + //获取主评论
  32 + commentInfo, err := l.svcCtx.ArticleCommentRepository.FindOne(l.ctx, conn, req.CommentId)
  33 + if err != nil {
  34 + return nil, xerr.NewErrMsgErr("获取评论信息失败", err)
  35 + }
  36 + if commentInfo.CompanyId != req.CompanyId {
  37 + return nil, xerr.NewErrMsg("没有查看权限")
  38 + }
  39 +
  40 + if commentInfo.Show == domain.CommentShowDisable {
  41 + return nil, xerr.NewErrMsg("没有查看权限")
  42 + }
  43 + queryOption := domain.NewQueryOptions().WithFindOnly().MustWithKV("topId", commentInfo.Id).MustWithKV("show", domain.CommentShowEnable)
  44 + //获取回复的评论
  45 + _, replyCommenList, err := l.svcCtx.ArticleCommentRepository.Find(l.ctx, conn, queryOption)
  46 +
  47 + if err != nil {
  48 + return nil, xerr.NewErrMsgErr("获取评论信息失败", err)
  49 + }
  50 + queryOption = domain.NewQueryOptions().WithFindOnly().
  51 + MustWithKV("articleId", commentInfo.ArticleId).
  52 + MustWithKV("userId", req.UserId)
  53 + // 获取我点赞的评论
  54 + _, userFlagList, err := l.svcCtx.UserLoveFlagRepository.Find(l.ctx, conn, queryOption)
  55 + if err != nil {
  56 + return nil, xerr.NewErrMsgErr("获取评论信息失败", err)
  57 + }
  58 + // 我点赞的
  59 + flagMap := map[int64]struct{}{}
  60 + for _, val := range userFlagList {
  61 + flagMap[val.CommentId] = struct{}{}
  62 + }
  63 +
  64 + //混合数据
  65 + commentResp := types.ArticleCommentItem{
  66 + Id: commentInfo.Id,
  67 + Pid: commentInfo.Pid,
  68 + TopId: commentInfo.TopId,
  69 + ArtitcleId: commentInfo.ArticleId,
  70 + SectionId: commentInfo.ArticleId,
  71 + FromUserId: commentInfo.FromUserId,
  72 + FromUser: types.CommentAuthor{
  73 + Id: commentInfo.FromUser.Id,
  74 + Name: commentInfo.FromUser.Name,
  75 + Avatar: commentInfo.FromUser.Avatar,
  76 + Position: commentInfo.FromUser.Position,
  77 + Company: commentInfo.FromUser.Company,
  78 + },
  79 + ToUserId: commentInfo.ToUserId,
  80 + ToUser: types.CommentAuthor{
  81 + Id: commentInfo.ToUser.Id,
  82 + Name: commentInfo.ToUser.Name,
  83 + Avatar: commentInfo.ToUser.Avatar,
  84 + Position: commentInfo.ToUser.Position,
  85 + Company: commentInfo.ToUser.Company,
  86 + },
  87 + SectionContent: commentInfo.SectionContent,
  88 + CountReply: commentInfo.CountReply,
  89 + CountUserLove: commentInfo.CountUserLove,
  90 + CountAdminLove: commentInfo.CountAdminLove,
  91 + AtWho: []types.CommentAtWho{},
  92 + CreatedAt: commentInfo.CreatedAt,
  93 + MeLoveFlag: 0,
  94 + }
  95 + if _, ok := flagMap[commentInfo.Id]; ok {
  96 + commentResp.MeLoveFlag = 1
  97 + }
  98 + for _, val := range commentInfo.AtWho {
  99 + commentResp.AtWho = append(commentResp.AtWho, types.CommentAtWho{
  100 + Id: val.Id,
  101 + Name: val.Name,
  102 + })
  103 + }
  104 + // 回复的评论
  105 + allReply := []types.ArticleCommentItem{}
  106 + for _, val := range replyCommenList {
  107 + reply := types.ArticleCommentItem{
  108 + Id: val.Id,
  109 + Pid: val.Pid,
  110 + TopId: val.TopId,
  111 + ArtitcleId: val.ArticleId,
  112 + SectionId: val.SectionId,
  113 + FromUserId: val.FromUserId,
  114 + FromUser: types.CommentAuthor{
  115 + Id: val.FromUser.Id,
  116 + Name: val.FromUser.Name,
  117 + Avatar: val.FromUser.Avatar,
  118 + Position: val.FromUser.Position,
  119 + Company: val.FromUser.Company,
  120 + },
  121 + ToUserId: val.ToUserId,
  122 + ToUser: types.CommentAuthor{
  123 + Id: val.ToUser.Id,
  124 + Name: val.ToUser.Name,
  125 + Avatar: val.ToUser.Avatar,
  126 + Position: val.ToUser.Position,
  127 + Company: val.ToUser.Company,
  128 + },
  129 + SectionContent: val.SectionContent,
  130 + CountReply: val.CountReply,
  131 + CountUserLove: val.CountUserLove,
  132 + CountAdminLove: val.CountAdminLove,
  133 + AtWho: []types.CommentAtWho{},
  134 + CreatedAt: val.CreatedAt,
  135 + MeLoveFlag: 0,
  136 + }
  137 + if _, ok := flagMap[val.Id]; ok {
  138 + reply.MeLoveFlag = 1
  139 + }
  140 + for _, val2 := range val.AtWho {
  141 + reply.AtWho = append(reply.AtWho, types.CommentAtWho{
  142 + Id: val2.Id,
  143 + Name: val2.Name,
  144 + })
  145 + }
  146 + allReply = append(allReply, reply)
  147 + }
  148 + resp = &types.MiniGetArticleCommentResponse{
  149 + ArticleCommentAndReply: types.ArticleCommentAndReply{
  150 + Comment: commentResp,
  151 + Reply: allReply,
  152 + TotalReply: int64(len(replyCommenList)),
  153 + },
  154 + }
  155 + return
  156 +}
  1 +package comment
  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 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
  10 +
  11 + "github.com/zeromicro/go-zero/core/logx"
  12 +)
  13 +
  14 +type MiniListArticleCommentLogic struct {
  15 + logx.Logger
  16 + ctx context.Context
  17 + svcCtx *svc.ServiceContext
  18 +}
  19 +
  20 +func NewMiniListArticleCommentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniListArticleCommentLogic {
  21 + return &MiniListArticleCommentLogic{
  22 + Logger: logx.WithContext(ctx),
  23 + ctx: ctx,
  24 + svcCtx: svcCtx,
  25 + }
  26 +}
  27 +
  28 +func (l *MiniListArticleCommentLogic) MiniListArticleComment(req *types.MiniListArticleCommentRequest) (resp *types.MiniListArticleCommentResponse, err error) {
  29 + // 先获取最顶层的评论
  30 + var conn = l.svcCtx.DefaultDBConn()
  31 + if req.Page > 40 {
  32 + req.Page = 40
  33 + }
  34 +
  35 + queryOption := domain.NewQueryOptions().
  36 + WithOffsetLimit(req.Page, req.Size).
  37 + MustWithKV("topId", 0).
  38 + MustWithKV("articleId", req.ArticleId).
  39 + MustWithKV("sectionId", req.SectionId).
  40 + MustWithKV("show", domain.CommentShowEnable).
  41 + MustWithKV("companyId", req.CompanyId)
  42 +
  43 + cnt, commentList, err := l.svcCtx.ArticleCommentRepository.Find(l.ctx, conn, queryOption)
  44 + if err != nil {
  45 + return nil, xerr.NewErrMsgErr("获取评论信息失败", err)
  46 + }
  47 + if cnt == 0 {
  48 + resp = &types.MiniListArticleCommentResponse{
  49 + Total: 0,
  50 + List: make([]types.ArticleCommentAndReply, 0),
  51 + }
  52 + return
  53 + }
  54 +
  55 + queryOption = domain.NewQueryOptions().WithFindOnly().
  56 + MustWithKV("articleId", req.ArticleId).
  57 + MustWithKV("userId", req.UserId)
  58 + // 获取我点赞的评论
  59 + _, userFlagList, err := l.svcCtx.UserLoveFlagRepository.Find(l.ctx, conn, queryOption)
  60 + if err != nil {
  61 + return nil, xerr.NewErrMsgErr("获取评论信息失败", err)
  62 + }
  63 + // 我点赞的
  64 + flagMap := map[int64]struct{}{}
  65 + for _, val := range userFlagList {
  66 + flagMap[val.CommentId] = struct{}{}
  67 + }
  68 + resp = &types.MiniListArticleCommentResponse{
  69 + Total: cnt,
  70 + List: make([]types.ArticleCommentAndReply, len(commentList)),
  71 + }
  72 + // 获取回复的评论
  73 + for i, val := range commentList {
  74 + item := types.ArticleCommentAndReply{
  75 + Comment: types.ArticleCommentItem{
  76 + Id: val.Id,
  77 + Pid: val.Pid,
  78 + TopId: val.TopId,
  79 + ArtitcleId: val.ArticleId,
  80 + SectionId: val.SectionId,
  81 + FromUserId: val.FromUserId,
  82 + FromUser: types.CommentAuthor{
  83 + Id: val.FromUser.Id,
  84 + Name: val.FromUser.Name,
  85 + Avatar: val.FromUser.Avatar,
  86 + Position: val.FromUser.Position,
  87 + Company: val.FromUser.Company,
  88 + },
  89 + ToUserId: val.ToUserId,
  90 + ToUser: types.CommentAuthor{
  91 + Id: val.ToUser.Id,
  92 + Name: val.ToUser.Name,
  93 + Avatar: val.ToUser.Avatar,
  94 + Position: val.ToUser.Position,
  95 + Company: val.ToUser.Company,
  96 + },
  97 + SectionContent: val.SectionContent,
  98 + CountReply: val.CountReply,
  99 + CountUserLove: val.CountUserLove,
  100 + CountAdminLove: val.CountAdminLove,
  101 + AtWho: []types.CommentAtWho{},
  102 + CreatedAt: val.CreatedAt,
  103 + MeLoveFlag: 0,
  104 + },
  105 + Reply: []types.ArticleCommentItem{},
  106 + TotalReply: int64(val.CountReply),
  107 + }
  108 +
  109 + if _, ok := flagMap[val.Id]; ok {
  110 + item.Comment.MeLoveFlag = 1
  111 + }
  112 +
  113 + for _, val2 := range val.AtWho {
  114 + item.Comment.AtWho = append(item.Comment.AtWho, types.CommentAtWho{
  115 + Id: val2.Id,
  116 + Name: val2.Name,
  117 + })
  118 + }
  119 +
  120 + //获取回复的评论
  121 + cntReply, reply := l.listCommentReply(item.Comment.Id, flagMap)
  122 +
  123 + resp.List[i] = item
  124 + resp.List[i].Reply = reply
  125 + resp.List[i].TotalReply = cntReply
  126 + }
  127 + return resp, nil
  128 +}
  129 +
  130 +// listCommentReply
  131 +func (l *MiniListArticleCommentLogic) listCommentReply(commentId int64, loveFlagMap map[int64]struct{}) (cnt int64, replyList []types.ArticleCommentItem) {
  132 + var conn = l.svcCtx.DefaultDBConn()
  133 + queryOption := domain.NewQueryOptions().
  134 + WithOffsetLimit(1, 2).
  135 + MustWithKV("topId", commentId).
  136 + MustWithKV("show", domain.CommentShowEnable)
  137 +
  138 + cnt, commentList, err := l.svcCtx.ArticleCommentRepository.Find(l.ctx, conn, queryOption)
  139 + if err != nil {
  140 + return cnt, []types.ArticleCommentItem{}
  141 + }
  142 + if cnt == 0 {
  143 + replyList = []types.ArticleCommentItem{}
  144 + return cnt, replyList
  145 + }
  146 +
  147 + for _, val := range commentList {
  148 + item := types.ArticleCommentItem{
  149 + Id: val.Id,
  150 + Pid: val.Pid,
  151 + TopId: val.TopId,
  152 + ArtitcleId: val.ArticleId,
  153 + SectionId: val.SectionId,
  154 + FromUserId: val.FromUserId,
  155 + FromUser: types.CommentAuthor{
  156 + Id: val.FromUser.Id,
  157 + Name: val.FromUser.Name,
  158 + Avatar: val.FromUser.Avatar,
  159 + Position: val.FromUser.Position,
  160 + Company: val.FromUser.Company,
  161 + },
  162 + ToUserId: val.ToUserId,
  163 + ToUser: types.CommentAuthor{
  164 + Id: val.ToUser.Id,
  165 + Name: val.ToUser.Name,
  166 + Avatar: val.ToUser.Avatar,
  167 + Position: val.ToUser.Position,
  168 + Company: val.ToUser.Company,
  169 + },
  170 + SectionContent: val.SectionContent,
  171 + CountReply: val.CountReply,
  172 + CountUserLove: val.CountUserLove,
  173 + CountAdminLove: val.CountAdminLove,
  174 + AtWho: []types.CommentAtWho{},
  175 + CreatedAt: val.CreatedAt,
  176 + MeLoveFlag: 0,
  177 + }
  178 +
  179 + if _, ok := loveFlagMap[val.Id]; ok {
  180 + item.MeLoveFlag = 1
  181 + }
  182 + for _, val2 := range val.AtWho {
  183 + item.AtWho = append(item.AtWho, types.CommentAtWho{
  184 + Id: val2.Id,
  185 + Name: val2.Name,
  186 + })
  187 + }
  188 + replyList = append(replyList, item)
  189 + }
  190 + return cnt, replyList
  191 +}
  1 +package comment
  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 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
  10 +
  11 + "github.com/zeromicro/go-zero/core/logx"
  12 +)
  13 +
  14 +type MiniTop5ArticleCommentLogic struct {
  15 + logx.Logger
  16 + ctx context.Context
  17 + svcCtx *svc.ServiceContext
  18 +}
  19 +
  20 +func NewMiniTop5ArticleCommentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniTop5ArticleCommentLogic {
  21 + return &MiniTop5ArticleCommentLogic{
  22 + Logger: logx.WithContext(ctx),
  23 + ctx: ctx,
  24 + svcCtx: svcCtx,
  25 + }
  26 +}
  27 +
  28 +// 获取前5的评论
  29 +func (l *MiniTop5ArticleCommentLogic) MiniTop5ArticleComment(req *types.MiniTop5ArticleCommentRequest) (resp *types.MiniTop5ArticleCommentResponse, err error) {
  30 + var conn = l.svcCtx.DefaultDBConn()
  31 + commentList, err := l.svcCtx.ArticleCommentRepository.Top5Comment(l.ctx, conn, req.CompanyId, req.ArticleId)
  32 + if err != nil {
  33 + return nil, xerr.NewErrMsgErr("获取评论信息失败", err)
  34 + }
  35 +
  36 + queryOption := domain.NewQueryOptions().WithFindOnly().
  37 + MustWithKV("articleId", req.ArticleId).
  38 + MustWithKV("userId", req.UserId)
  39 + // 获取我点赞的评论
  40 + _, userFlagList, err := l.svcCtx.UserLoveFlagRepository.Find(l.ctx, conn, queryOption)
  41 + if err != nil {
  42 + return nil, xerr.NewErrMsgErr("获取评论信息失败", err)
  43 + }
  44 + // 我点赞的
  45 + flagMap := map[int64]struct{}{}
  46 + for _, val := range userFlagList {
  47 + flagMap[val.CommentId] = struct{}{}
  48 + }
  49 +
  50 + resp = &types.MiniTop5ArticleCommentResponse{
  51 + List: make([]types.ArticleCommentItem, len(commentList)),
  52 + }
  53 + for i, val := range commentList {
  54 + item := NewArticleCommentItem(val)
  55 +
  56 + if _, ok := flagMap[val.Id]; ok {
  57 + item.MeLoveFlag = 1
  58 + }
  59 + for _, val2 := range val.AtWho {
  60 + item.AtWho = append(item.AtWho, types.CommentAtWho{
  61 + Id: val2.Id,
  62 + Name: val2.Name,
  63 + })
  64 + }
  65 + resp.List[i] = item
  66 + }
  67 + return
  68 +}
  69 +
  70 +func NewArticleCommentItem(val *domain.ArticleComment) types.ArticleCommentItem {
  71 + item := types.ArticleCommentItem{
  72 + Id: val.Id,
  73 + Pid: val.Pid,
  74 + TopId: val.TopId,
  75 + ArtitcleId: val.ArticleId,
  76 + SectionId: val.SectionId,
  77 + FromUserId: val.FromUserId,
  78 + FromUser: types.CommentAuthor{
  79 + Id: val.FromUser.Id,
  80 + Name: val.FromUser.Name,
  81 + Avatar: val.FromUser.Avatar,
  82 + Position: val.FromUser.Position,
  83 + Company: val.FromUser.Company,
  84 + },
  85 + ToUserId: val.ToUserId,
  86 + ToUser: types.CommentAuthor{
  87 + Id: val.ToUser.Id,
  88 + Name: val.ToUser.Name,
  89 + Avatar: val.ToUser.Avatar,
  90 + Position: val.ToUser.Position,
  91 + Company: val.ToUser.Company,
  92 + },
  93 + SectionContent: val.SectionContent,
  94 + CountReply: val.CountReply,
  95 + CountUserLove: val.CountUserLove,
  96 + CountAdminLove: val.CountAdminLove,
  97 + AtWho: []types.CommentAtWho{},
  98 + CreatedAt: val.CreatedAt,
  99 + MeLoveFlag: 0,
  100 + Content: val.Content,
  101 + }
  102 + return item
  103 +}
  1 +package comment
  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/contextdata"
  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 SystemArticleCommentSearchMeLogic struct {
  16 + logx.Logger
  17 + ctx context.Context
  18 + svcCtx *svc.ServiceContext
  19 +}
  20 +
  21 +func NewSystemArticleCommentSearchMeLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemArticleCommentSearchMeLogic {
  22 + return &SystemArticleCommentSearchMeLogic{
  23 + Logger: logx.WithContext(ctx),
  24 + ctx: ctx,
  25 + svcCtx: svcCtx,
  26 + }
  27 +}
  28 +
  29 +func (l *SystemArticleCommentSearchMeLogic) SystemArticleCommentSearchMe(req *types.SystemArticleCommentSearchMeRequest) (resp *types.SystemArticleCommentSearchMeResponse, err error) {
  30 + var (
  31 + conn = l.svcCtx.DefaultDBConn()
  32 + userToken = contextdata.GetUserTokenFromCtx(l.ctx)
  33 + )
  34 + queryOptions := domain.IndexCompanyId(userToken.CompanyId)().
  35 + WithOffsetLimit(req.Page, req.Size).
  36 + MustWithKV("fromUserId", req.AuthorId).
  37 + WithKV("beginCreatedAt", req.BeginTime).
  38 + WithKV("endCreatedAt", req.EndTime)
  39 +
  40 + cnt, articleList, err := l.svcCtx.ArticleCommentRepository.Find(l.ctx, conn, queryOptions)
  41 + if err != nil {
  42 + return &types.SystemArticleCommentSearchMeResponse{}, xerr.NewErrMsgErr("获取评论回复列表失败", err)
  43 + }
  44 +
  45 + resp = &types.SystemArticleCommentSearchMeResponse{
  46 + Total: cnt,
  47 + List: make([]types.ArticleCommentItem, len(articleList)),
  48 + }
  49 + for i := range articleList {
  50 + resp.List[i] = NewArticleCommentItem(articleList[i])
  51 + }
  52 + return
  53 +}
@@ -31,14 +31,14 @@ func (l *SystemAddLogic) SystemAdd(req *types.DepartmentAddRequest) (resp *types @@ -31,14 +31,14 @@ func (l *SystemAddLogic) SystemAdd(req *types.DepartmentAddRequest) (resp *types
31 var userToken = contextdata.GetUserTokenFromCtx(l.ctx) 31 var userToken = contextdata.GetUserTokenFromCtx(l.ctx)
32 var conn = l.svcCtx.DefaultDBConn() 32 var conn = l.svcCtx.DefaultDBConn()
33 33
34 - _, list, err := l.svcCtx.DepartmentRepository.Find(l.ctx, conn, domain.NewQueryOptions().  
35 - WithOffsetLimit(1, 1).WithFindOnly(). 34 + total, _, err := l.svcCtx.DepartmentRepository.Find(l.ctx, conn, domain.NewQueryOptions().
  35 + WithCountOnly().
36 WithKV("companyId", userToken.CompanyId). 36 WithKV("companyId", userToken.CompanyId).
37 WithKV("name", req.Name)) 37 WithKV("name", req.Name))
38 if err != nil { 38 if err != nil {
39 return nil, err 39 return nil, err
40 } 40 }
41 - if len(list) > 0 { 41 + if total > 0 {
42 return nil, xerr.NewErrMsg("该分组名称已存在(不能重复)") 42 return nil, xerr.NewErrMsg("该分组名称已存在(不能重复)")
43 } 43 }
44 44
@@ -48,7 +48,7 @@ func (l *SystemAddLogic) SystemAdd(req *types.DepartmentAddRequest) (resp *types @@ -48,7 +48,7 @@ func (l *SystemAddLogic) SystemAdd(req *types.DepartmentAddRequest) (resp *types
48 CompanyId: userToken.CompanyId, 48 CompanyId: userToken.CompanyId,
49 Name: req.Name, 49 Name: req.Name,
50 } 50 }
51 - err = transaction.UseTrans(l.ctx, conn.DB(), func(ctx context.Context, c transaction.Conn) error { 51 + err = transaction.UseTrans(l.ctx, conn.DB(), func(ctx context.Context, conn transaction.Conn) error {
52 _, err = l.svcCtx.DepartmentRepository.Insert(l.ctx, conn, insert) 52 _, err = l.svcCtx.DepartmentRepository.Insert(l.ctx, conn, insert)
53 if err != nil { 53 if err != nil {
54 return err 54 return err
  1 +package department
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  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 +
  10 + "github.com/zeromicro/go-zero/core/logx"
  11 +)
  12 +
  13 +type SystemDeleteLogic struct {
  14 + logx.Logger
  15 + ctx context.Context
  16 + svcCtx *svc.ServiceContext
  17 +}
  18 +
  19 +func NewSystemDeleteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemDeleteLogic {
  20 + return &SystemDeleteLogic{
  21 + Logger: logx.WithContext(ctx),
  22 + ctx: ctx,
  23 + svcCtx: svcCtx,
  24 + }
  25 +}
  26 +
  27 +func (l *SystemDeleteLogic) SystemDelete(req *types.DepartmentGetRequest) (resp *types.DepartmentGetResponse, err error) {
  28 + var conn = l.svcCtx.DefaultDBConn()
  29 +
  30 + one, err := l.svcCtx.DepartmentRepository.FindOne(l.ctx, conn, req.Id)
  31 + if err != nil {
  32 + return nil, err
  33 + }
  34 +
  35 + // 获取公司下的所有用户
  36 + _, users, err := l.svcCtx.UserRepository.Find(l.ctx, conn, domain.NewQueryOptions().
  37 + WithFindOnly().
  38 + WithKV(" companyId", one.CompanyId))
  39 + if err != nil {
  40 + return nil, err
  41 + }
  42 +
  43 + err = transaction.UseTrans(l.ctx, conn.DB(), func(ctx context.Context, conn transaction.Conn) error {
  44 + _, err = l.svcCtx.DepartmentRepository.Delete(l.ctx, conn, one)
  45 + if err != nil {
  46 + return err
  47 + }
  48 +
  49 + // 移除用户中关联的分组
  50 + if len(users) > 0 {
  51 + var findIndex = func(ids []int64, id int64) int {
  52 + for i, _ := range ids {
  53 + if ids[i] == id {
  54 + return i
  55 + }
  56 + }
  57 + return -1
  58 + }
  59 + for i := range users {
  60 + user := users[i]
  61 + var targetIndex = findIndex(user.Departments, req.Id)
  62 + if targetIndex != -1 { // 归属分组存在,则移除
  63 + user.Departments = append(user.Departments[:targetIndex], user.Departments[targetIndex+1:]...) // 移除分组ID
  64 + _, err = l.svcCtx.UserRepository.UpdateWithVersion(l.ctx, conn, user)
  65 + if err != nil {
  66 + return err
  67 + }
  68 + }
  69 + }
  70 + }
  71 + return nil
  72 + }, true)
  73 +
  74 + return
  75 +}
@@ -31,15 +31,15 @@ func (l *SystemUpdateLogic) SystemUpdate(req *types.DepartmentUpdateRequest) (re @@ -31,15 +31,15 @@ func (l *SystemUpdateLogic) SystemUpdate(req *types.DepartmentUpdateRequest) (re
31 var userToken = contextdata.GetUserTokenFromCtx(l.ctx) 31 var userToken = contextdata.GetUserTokenFromCtx(l.ctx)
32 var conn = l.svcCtx.DefaultDBConn() 32 var conn = l.svcCtx.DefaultDBConn()
33 33
34 - _, list, err := l.svcCtx.DepartmentRepository.Find(l.ctx, conn, domain.NewQueryOptions().  
35 - WithOffsetLimit(1, 1).WithCountOnly(). 34 + total, _, err := l.svcCtx.DepartmentRepository.Find(l.ctx, conn, domain.NewQueryOptions().
  35 + WithCountOnly().
36 WithKV("companyId", userToken.CompanyId). 36 WithKV("companyId", userToken.CompanyId).
37 WithKV("notId", req.Id). // 排除自己 37 WithKV("notId", req.Id). // 排除自己
38 WithKV("name", req.Name)) 38 WithKV("name", req.Name))
39 if err != nil { 39 if err != nil {
40 return nil, err 40 return nil, err
41 } 41 }
42 - if len(list) > 0 { 42 + if total > 0 {
43 return nil, xerr.NewErrMsg("该分组名称已存在(不能重复)") 43 return nil, xerr.NewErrMsg("该分组名称已存在(不能重复)")
44 } 44 }
45 45
@@ -49,10 +49,59 @@ func (l *SystemUpdateLogic) SystemUpdate(req *types.DepartmentUpdateRequest) (re @@ -49,10 +49,59 @@ func (l *SystemUpdateLogic) SystemUpdate(req *types.DepartmentUpdateRequest) (re
49 } 49 }
50 one.Name = req.Name 50 one.Name = req.Name
51 51
  52 + // 更新分组中的用户Id
  53 + var newIdMap = map[int64]int{}
  54 + for i := range req.Ids {
  55 + newIdMap[req.Ids[i]] = 0
  56 + }
  57 +
  58 + // 获取公司下的所有用户
  59 + _, users, err := l.svcCtx.UserRepository.Find(l.ctx, conn, domain.NewQueryOptions().
  60 + WithFindOnly().
  61 + WithKV(" companyId", one.CompanyId))
  62 + if err != nil {
  63 + return nil, err
  64 + }
  65 +
52 // 更新 66 // 更新
53 - err = transaction.UseTrans(l.ctx, conn.DB(), func(ctx context.Context, c transaction.Conn) error { 67 + err = transaction.UseTrans(l.ctx, conn.DB(), func(ctx context.Context, conn transaction.Conn) error {
54 _, err = l.svcCtx.DepartmentRepository.UpdateWithVersion(l.ctx, conn, one) 68 _, err = l.svcCtx.DepartmentRepository.UpdateWithVersion(l.ctx, conn, one)
55 - return err 69 + if err != nil {
  70 + return err
  71 + }
  72 +
  73 + var findIndex = func(ids []int64, id int64) int {
  74 + for i, _ := range ids {
  75 + if ids[i] == id {
  76 + return i
  77 + }
  78 + }
  79 + return -1
  80 + }
  81 + for i := range users {
  82 + var user = users[i]
  83 + if _, ok := newIdMap[user.Id]; ok {
  84 + var targetIndex = findIndex(user.Departments, req.Id)
  85 + if targetIndex == -1 { // 归属分组不存在,则新增
  86 + user.Departments = append(user.Departments)
  87 + _, err = l.svcCtx.UserRepository.UpdateWithVersion(l.ctx, conn, user)
  88 + if err != nil {
  89 + return err
  90 + }
  91 + }
  92 + } else {
  93 + var targetIndex = findIndex(user.Departments, req.Id)
  94 + if targetIndex != -1 { // 归属分组存在,则移除
  95 + user.Departments = append(user.Departments[:targetIndex], user.Departments[targetIndex+1:]...) // 移除分组ID
  96 + _, err = l.svcCtx.UserRepository.UpdateWithVersion(l.ctx, conn, user)
  97 + if err != nil {
  98 + return err
  99 + }
  100 + }
  101 + }
  102 + }
  103 +
  104 + return nil
56 }, true) 105 }, true)
57 if err != nil { 106 if err != nil {
58 return nil, xerr.NewErrMsgErr("分组修改失败", err) 107 return nil, xerr.NewErrMsgErr("分组修改失败", err)
@@ -207,23 +207,33 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageBusinessRequest) (res @@ -207,23 +207,33 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageBusinessRequest) (res
207 } 207 }
208 208
209 // CommentArticle 评论文章 209 // CommentArticle 评论文章
210 -func (l *MiniBusinessLogic) CommentArticle(conn transaction.Conn, articleId int64, content string, at []int64) (err error) {  
211 - return l.createMessage(conn, domain.MsgTypeReply, domain.OptTypeArticle, articleId, 0, content, at) 210 +func (l *MiniBusinessLogic) CommentArticle(conn transaction.Conn, articleId int64, sectionId int64, content string, at []int64) (err error) {
  211 + return l.createMessage(conn, domain.MsgTypeReply, domain.OptTypeArticle, articleId, sectionId, 0, content, at)
212 } 212 }
213 213
214 // CommentReply 评论回复 214 // CommentReply 评论回复
215 -func (l *MiniBusinessLogic) CommentReply(conn transaction.Conn, articleId int64, commentId int64, content string, at []int64) (err error) {  
216 - return l.createMessage(conn, domain.MsgTypeReply, domain.OptTypeComment, articleId, commentId, content, at) 215 +func (l *MiniBusinessLogic) CommentReply(conn transaction.Conn, articleId int64, sectionId int64, commentId int64, content string, at []int64) (err error) {
  216 + return l.createMessage(conn, domain.MsgTypeReply, domain.OptTypeComment, articleId, sectionId, commentId, content, at)
217 } 217 }
218 218
219 // LikeArticle 点赞文章 219 // LikeArticle 点赞文章
220 func (l *MiniBusinessLogic) LikeArticle(conn transaction.Conn, articleId int64, at int64) (err error) { 220 func (l *MiniBusinessLogic) LikeArticle(conn transaction.Conn, articleId int64, at int64) (err error) {
221 - return l.createMessage(conn, domain.MsgTypeLike, domain.OptTypeArticle, articleId, 0, "", []int64{at}) 221 + return l.createMessage(conn, domain.MsgTypeLike, domain.OptTypeArticle, articleId, 0, 0, "", []int64{at})
222 } 222 }
223 223
224 // LikeComment 点赞评论 224 // LikeComment 点赞评论
225 func (l *MiniBusinessLogic) LikeComment(conn transaction.Conn, articleId int64, commentId int64, at int64) (err error) { 225 func (l *MiniBusinessLogic) LikeComment(conn transaction.Conn, articleId int64, commentId int64, at int64) (err error) {
226 - return l.createMessage(conn, domain.MsgTypeLike, domain.OptTypeComment, articleId, commentId, "", []int64{at}) 226 + return l.createMessage(conn, domain.MsgTypeLike, domain.OptTypeComment, articleId, 0, commentId, "", []int64{at})
  227 +}
  228 +
  229 +// UnLikeArticle 取消点赞文章
  230 +func (l *MiniBusinessLogic) UnLikeArticle(conn transaction.Conn, articleId int64) (err error) {
  231 + return l.deleteMessage(conn, domain.OptTypeArticle, articleId, 0)
  232 +}
  233 +
  234 +// UnLikeComment 取消点赞评论
  235 +func (l *MiniBusinessLogic) UnLikeComment(conn transaction.Conn, articleId int64, commentId int64) (err error) {
  236 + return l.deleteMessage(conn, domain.OptTypeComment, articleId, commentId)
227 } 237 }
228 238
229 func (l *MiniBusinessLogic) createMessage( 239 func (l *MiniBusinessLogic) createMessage(
@@ -231,6 +241,7 @@ func (l *MiniBusinessLogic) createMessage( @@ -231,6 +241,7 @@ func (l *MiniBusinessLogic) createMessage(
231 msgType domain.MsgBusinessType, 241 msgType domain.MsgBusinessType,
232 optType domain.MsgBusinessOpt, 242 optType domain.MsgBusinessOpt,
233 articleId int64, 243 articleId int64,
  244 + sectionId int64,
234 commentId int64, 245 commentId int64,
235 content string, 246 content string,
236 at []int64) (err error) { 247 at []int64) (err error) {
@@ -245,6 +256,7 @@ func (l *MiniBusinessLogic) createMessage( @@ -245,6 +256,7 @@ func (l *MiniBusinessLogic) createMessage(
245 UserId: userToken.UserId, 256 UserId: userToken.UserId,
246 RecipientId: at[i], 257 RecipientId: at[i],
247 ArticleId: articleId, 258 ArticleId: articleId,
  259 + SectionId: sectionId,
248 CommentId: commentId, 260 CommentId: commentId,
249 Content: content, 261 Content: content,
250 } 262 }
@@ -255,3 +267,27 @@ func (l *MiniBusinessLogic) createMessage( @@ -255,3 +267,27 @@ func (l *MiniBusinessLogic) createMessage(
255 } 267 }
256 return nil 268 return nil
257 } 269 }
  270 +
  271 +func (l *MiniBusinessLogic) deleteMessage(conn transaction.Conn, optType domain.MsgBusinessOpt, articleId int64, commentId int64) (err error) {
  272 + var userToken = contextdata.GetUserTokenFromCtx(l.ctx)
  273 +
  274 + queryOption := domain.NewQueryOptions().WithFindOnly().WithOffsetLimit(1, 1).
  275 + MustWithKV("type", domain.MsgTypeLike).
  276 + MustWithKV("optType", optType).
  277 + MustWithKV("companyId", userToken.CompanyId).
  278 + MustWithKV("recipientId", userToken.UserId).
  279 + MustWithKV("articleId", articleId).
  280 + MustWithKV("commentId", commentId)
  281 +
  282 + _, list, err := l.svcCtx.MessageBusinessRepository.Find(l.ctx, conn, queryOption)
  283 + if err != nil {
  284 + return err
  285 + }
  286 + for i := range list {
  287 + _, err = l.svcCtx.MessageBusinessRepository.Delete(l.ctx, conn, list[i])
  288 + if err != nil {
  289 + return err
  290 + }
  291 + }
  292 + return nil
  293 +}
@@ -32,14 +32,14 @@ func (l *CreateTagLogic) CreateTag(req *types.TagCreateRequest) (resp *types.Tag @@ -32,14 +32,14 @@ func (l *CreateTagLogic) CreateTag(req *types.TagCreateRequest) (resp *types.Tag
32 //检查重复 32 //检查重复
33 cnt, _, err := l.svcCtx.ArticleTagRepository.Find(l.ctx, conn, req.CompanyId, map[string]interface{}{ 33 cnt, _, err := l.svcCtx.ArticleTagRepository.Find(l.ctx, conn, req.CompanyId, map[string]interface{}{
34 "name": req.Name, 34 "name": req.Name,
35 - "group": req.Group, 35 + "category": req.Category,
36 "countOnly": true, 36 "countOnly": true,
37 }) 37 })
38 if err != nil { 38 if err != nil {
39 return nil, xerr.NewErrMsgErr("添加标签失败", err) 39 return nil, xerr.NewErrMsgErr("添加标签失败", err)
40 } 40 }
41 if cnt > 0 { 41 if cnt > 0 {
42 - return nil, xerr.NewErrMsg(fmt.Sprintf("已存在标签 分类[%s]名称[%s]", req.Group, req.Name)) 42 + return nil, xerr.NewErrMsg(fmt.Sprintf("已存在标签 分类[%s]名称[%s]", req.Category, req.Name))
43 } 43 }
44 //TODO 获取图片的尺寸大小 44 //TODO 获取图片的尺寸大小
45 45
@@ -55,9 +55,10 @@ func (l *CreateTagLogic) CreateTag(req *types.TagCreateRequest) (resp *types.Tag @@ -55,9 +55,10 @@ func (l *CreateTagLogic) CreateTag(req *types.TagCreateRequest) (resp *types.Tag
55 Width: 0, 55 Width: 0,
56 Height: 0, 56 Height: 0,
57 }, 57 },
58 - Name: req.Name,  
59 - Group: req.Group,  
60 - Remark: req.Remark, 58 + Name: req.Name,
  59 + Category: req.Category,
  60 + Remark: req.Remark,
  61 + Other: req.Other,
61 } 62 }
62 63
63 newTag, err = l.svcCtx.ArticleTagRepository.Insert(l.ctx, conn, newTag) 64 newTag, err = l.svcCtx.ArticleTagRepository.Insert(l.ctx, conn, newTag)
@@ -33,7 +33,7 @@ func (l *EditTagLogic) EditTag(req *types.TagEditRequest) (resp *types.TagEditRe @@ -33,7 +33,7 @@ func (l *EditTagLogic) EditTag(req *types.TagEditRequest) (resp *types.TagEditRe
33 queryOptions := domain.NewQueryOptions(). 33 queryOptions := domain.NewQueryOptions().
34 WithFindOnly(). 34 WithFindOnly().
35 MustWithKV("name", req.Name). 35 MustWithKV("name", req.Name).
36 - MustWithKV("group", req.Group). 36 + MustWithKV("category", req.Category).
37 WithOffsetLimit(1, 1) 37 WithOffsetLimit(1, 1)
38 38
39 _, tagList, err := l.svcCtx.ArticleTagRepository.Find(l.ctx, conn, req.CompanyId, queryOptions) 39 _, tagList, err := l.svcCtx.ArticleTagRepository.Find(l.ctx, conn, req.CompanyId, queryOptions)
@@ -42,7 +42,7 @@ func (l *EditTagLogic) EditTag(req *types.TagEditRequest) (resp *types.TagEditRe @@ -42,7 +42,7 @@ func (l *EditTagLogic) EditTag(req *types.TagEditRequest) (resp *types.TagEditRe
42 } 42 }
43 if len(tagList) > 0 { 43 if len(tagList) > 0 {
44 if tagList[0].Id != req.Id { 44 if tagList[0].Id != req.Id {
45 - return nil, xerr.NewErrMsg(fmt.Sprintf("已存在标签 分类[%s]名称[%s]", req.Group, req.Name)) 45 + return nil, xerr.NewErrMsg(fmt.Sprintf("已存在标签 分类[%s]名称[%s]", req.Category, req.Name))
46 } 46 }
47 } 47 }
48 oldTag, err := l.svcCtx.ArticleTagRepository.FindOne(l.ctx, conn, req.Id) 48 oldTag, err := l.svcCtx.ArticleTagRepository.FindOne(l.ctx, conn, req.Id)
@@ -55,11 +55,11 @@ func (l *EditTagLogic) EditTag(req *types.TagEditRequest) (resp *types.TagEditRe @@ -55,11 +55,11 @@ func (l *EditTagLogic) EditTag(req *types.TagEditRequest) (resp *types.TagEditRe
55 55
56 //TODO 获取图片的尺寸大小 56 //TODO 获取图片的尺寸大小
57 57
58 - oldTag.Group = req.Group 58 + oldTag.Category = req.Category
59 oldTag.Image.Url = req.Image 59 oldTag.Image.Url = req.Image
60 oldTag.Name = req.Name 60 oldTag.Name = req.Name
61 oldTag.Remark = req.Remark 61 oldTag.Remark = req.Remark
62 - 62 + oldTag.Other = req.Other
63 oldTag, err = l.svcCtx.ArticleTagRepository.Update(l.ctx, conn, oldTag) 63 oldTag, err = l.svcCtx.ArticleTagRepository.Update(l.ctx, conn, oldTag)
64 if err != nil { 64 if err != nil {
65 return nil, xerr.NewErrMsgErr("添加标签失败", err) 65 return nil, xerr.NewErrMsgErr("添加标签失败", err)
@@ -35,11 +35,12 @@ func (l *GetTagLogic) GetTag(req *types.TagGetRequest) (resp *types.TagGetRespon @@ -35,11 +35,12 @@ func (l *GetTagLogic) GetTag(req *types.TagGetRequest) (resp *types.TagGetRespon
35 return nil, xerr.NewErrMsg("获取标签失败") 35 return nil, xerr.NewErrMsg("获取标签失败")
36 } 36 }
37 resp = &types.TagGetResponse{ 37 resp = &types.TagGetResponse{
38 - Id: oldTag.Id,  
39 - Image: oldTag.Image.Url,  
40 - Name: oldTag.Name,  
41 - Group: oldTag.Group,  
42 - Remark: oldTag.Remark, 38 + Id: oldTag.Id,
  39 + Image: oldTag.Image.Url,
  40 + Name: oldTag.Name,
  41 + Category: oldTag.Category,
  42 + Remark: oldTag.Remark,
  43 + Other: oldTag.Other,
43 } 44 }
44 return 45 return
45 } 46 }
@@ -27,8 +27,8 @@ func (l *SearchTagLogic) SearchTag(req *types.TagListRequest) (resp *types.TagLi @@ -27,8 +27,8 @@ func (l *SearchTagLogic) SearchTag(req *types.TagListRequest) (resp *types.TagLi
27 var conn = l.svcCtx.DefaultDBConn() 27 var conn = l.svcCtx.DefaultDBConn()
28 queryOptions := domain.NewQueryOptions().WithOffsetLimit(req.Page, req.Size) 28 queryOptions := domain.NewQueryOptions().WithOffsetLimit(req.Page, req.Size)
29 29
30 - if len(req.Group) > 0 {  
31 - queryOptions = queryOptions.MustWithKV("group", req.Group) 30 + if len(req.Category) > 0 {
  31 + queryOptions = queryOptions.MustWithKV("group", req.Category)
32 } 32 }
33 if len(req.TagName) > 0 { 33 if len(req.TagName) > 0 {
34 queryOptions = queryOptions.MustWithKV("name", req.TagName) 34 queryOptions = queryOptions.MustWithKV("name", req.TagName)
@@ -50,10 +50,10 @@ func (l *SearchTagLogic) SearchTag(req *types.TagListRequest) (resp *types.TagLi @@ -50,10 +50,10 @@ func (l *SearchTagLogic) SearchTag(req *types.TagListRequest) (resp *types.TagLi
50 Id: tagList[i].Id, 50 Id: tagList[i].Id,
51 Image: tagList[i].Image.Url, 51 Image: tagList[i].Image.Url,
52 Name: tagList[i].Name, 52 Name: tagList[i].Name,
53 - Group: tagList[i].Group, 53 + Category: tagList[i].Category,
54 Remark: tagList[i].Remark, 54 Remark: tagList[i].Remark,
55 CreatedAt: tagList[i].CreatedAt, 55 CreatedAt: tagList[i].CreatedAt,
56 } 56 }
57 } 57 }
58 - return 58 + return resp, nil
59 } 59 }
@@ -33,9 +33,10 @@ func (l *MiniUserDepartmentUsersLogic) MiniUserDepartmentUsers(req *types.MiniUs @@ -33,9 +33,10 @@ func (l *MiniUserDepartmentUsersLogic) MiniUserDepartmentUsers(req *types.MiniUs
33 userToken = contextdata.GetUserTokenFromCtx(l.ctx) 33 userToken = contextdata.GetUserTokenFromCtx(l.ctx)
34 users []*domain.User 34 users []*domain.User
35 departments []*domain.Department 35 departments []*domain.Department
  36 + groups = make([]DepartmentUser, 0)
36 ) 37 )
37 resp = map[string]interface{}{ 38 resp = map[string]interface{}{
38 - "list": make([]DepartmentUser, 0), 39 + "list": groups,
39 } 40 }
40 _, departments, err = l.svcCtx.DepartmentRepository.Find(l.ctx, conn, domain.IndexCompanyId(userToken.CompanyId)().WithFindOnly()) 41 _, departments, err = l.svcCtx.DepartmentRepository.Find(l.ctx, conn, domain.IndexCompanyId(userToken.CompanyId)().WithFindOnly())
41 if err != nil { 42 if err != nil {
@@ -58,13 +59,17 @@ func (l *MiniUserDepartmentUsersLogic) MiniUserDepartmentUsers(req *types.MiniUs @@ -58,13 +59,17 @@ func (l *MiniUserDepartmentUsersLogic) MiniUserDepartmentUsers(req *types.MiniUs
58 } 59 }
59 if lo.Contains(user.Departments, item.Id) && !groupUserSet.Contains(user.Id) { 60 if lo.Contains(user.Departments, item.Id) && !groupUserSet.Contains(user.Id) {
60 group.Users = append(group.Users, &domain.User{ 61 group.Users = append(group.Users, &domain.User{
61 - Id: user.Id,  
62 - Name: user.Name, 62 + Id: user.Id,
  63 + Name: user.Name,
  64 + PinYinName: user.PinYinName,
63 }) 65 })
64 } 66 }
65 } 67 }
  68 + groups = append(groups, group)
66 }) 69 })
67 - 70 + resp = map[string]interface{}{
  71 + "list": groups,
  72 + }
68 return 73 return
69 } 74 }
70 75
@@ -2,6 +2,7 @@ package user @@ -2,6 +2,7 @@ package user
2 2
3 import ( 3 import (
4 "context" 4 "context"
  5 + "github.com/samber/lo"
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/db/transaction"
6 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain" 7 "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/contextdata"
@@ -33,6 +34,9 @@ func (l *SystemUserAccountEnableLogic) SystemUserAccountEnable(req *types.System @@ -33,6 +34,9 @@ func (l *SystemUserAccountEnableLogic) SystemUserAccountEnable(req *types.System
33 users []*domain.User 34 users []*domain.User
34 userToken = contextdata.GetUserTokenFromCtx(l.ctx) 35 userToken = contextdata.GetUserTokenFromCtx(l.ctx)
35 ) 36 )
  37 + if !lo.Contains([]int{domain.UserEnable, domain.UserDisable}, req.Status) {
  38 + return nil, xerr.NewErrMsg("启用状态有误")
  39 + }
36 if _, users, err = l.svcCtx.UserRepository.Find(l.ctx, conn, domain.IndexCompanyId(userToken.CompanyId)().MustWithKV("ids", req.UserIds).WithFindOnly()); err != nil { 40 if _, users, err = l.svcCtx.UserRepository.Find(l.ctx, conn, domain.IndexCompanyId(userToken.CompanyId)().MustWithKV("ids", req.UserIds).WithFindOnly()); err != nil {
37 return nil, xerr.NewErrMsgErr("公司不存在", err) 41 return nil, xerr.NewErrMsgErr("公司不存在", err)
38 } 42 }
@@ -50,5 +54,6 @@ func (l *SystemUserAccountEnableLogic) SystemUserAccountEnable(req *types.System @@ -50,5 +54,6 @@ func (l *SystemUserAccountEnableLogic) SystemUserAccountEnable(req *types.System
50 }, true); err != nil { 54 }, true); err != nil {
51 return nil, xerr.NewErrMsgErr("更新启用状态失败", err) 55 return nil, xerr.NewErrMsgErr("更新启用状态失败", err)
52 } 56 }
  57 + resp = &types.SystemUserAccountEnableResponse{}
53 return 58 return
54 } 59 }
@@ -2,8 +2,15 @@ package user @@ -2,8 +2,15 @@ package user
2 2
3 import ( 3 import (
4 "context" 4 "context"
  5 + "fmt"
5 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc" 6 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
6 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" 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/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/tool"
  12 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
  13 + "strconv"
7 14
8 "github.com/zeromicro/go-zero/core/logx" 15 "github.com/zeromicro/go-zero/core/logx"
9 ) 16 )
@@ -23,6 +30,67 @@ func NewSystemUserInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Sy @@ -23,6 +30,67 @@ func NewSystemUserInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Sy
23 } 30 }
24 31
25 func (l *SystemUserInfoLogic) SystemUserInfo(req *types.SystemUserInfoRequest) (resp *types.SystemUserInfoResponse, err error) { 32 func (l *SystemUserInfoLogic) SystemUserInfo(req *types.SystemUserInfoRequest) (resp *types.SystemUserInfoResponse, err error) {
  33 + var (
  34 + conn = l.svcCtx.DefaultDBConn()
  35 + userToken = contextdata.GetUserTokenFromCtx(l.ctx)
  36 + response *authlib.DataUserMe
  37 + company *domain.Company
  38 + companyId int64
  39 + code = tool.Krand(6, tool.KC_RAND_KIND_ALL)
  40 + )
  41 + if response, err = l.svcCtx.ApiAuthService.MeInfo(l.ctx, authlib.RequestUserMeQuery{
  42 + Token: req.Token,
  43 + }); err != nil {
  44 + return nil, xerr.NewErrMsgErr("获取用户资料失败", err)
  45 + }
  46 +
  47 + companyId, _ = strconv.ParseInt(response.CurrentCompany.ID, 10, 64)
  48 + resp = &types.SystemUserInfoResponse{}
  49 + resp.UserName = response.User.NickName
  50 + resp.UserId, _ = strconv.ParseInt(response.User.ID, 10, 64)
  51 + resp.Avatar = response.User.Avatar
  52 + resp.CompanyName = response.CurrentCompany.Name
  53 + resp.CompanyId = companyId
  54 + resp.Code = code
26 55
  56 + if companyId != userToken.CompanyId {
  57 + return nil, xerr.NewErrMsgErr("获取用户资料失败", fmt.Errorf("当前登录公司信息不匹配"))
  58 + }
  59 + company, err = l.svcCtx.CompanyRepository.FindOne(l.ctx, conn, userToken.CompanyId)
  60 + // 新建公司
  61 + if err == domain.ErrNotFound {
  62 + company = &domain.Company{
  63 + Id: companyId,
  64 + Name: response.CurrentCompany.Name,
  65 + Logo: response.CurrentCompany.Logo,
  66 + Code: code,
  67 + }
  68 + if company, err = l.svcCtx.CompanyRepository.Insert(l.ctx, conn, company); err != nil {
  69 + return nil, xerr.NewErrMsgErr("获取用户资料失败", err)
  70 + }
  71 + err = nil
  72 + return
  73 + }
  74 + if err != nil {
  75 + return nil, xerr.NewErrMsgErr("获取用户资料失败", err)
  76 + }
  77 + resp.Code = company.Code
  78 + // 更新公司
  79 + if response.CurrentCompany != nil {
  80 + var changed bool
  81 + if response.CurrentCompany.Name != "" && response.CurrentCompany.Name != company.Name {
  82 + company.Name = response.CurrentCompany.Name
  83 + changed = true
  84 + }
  85 + if response.CurrentCompany.Logo != "" && response.CurrentCompany.Logo != company.Logo {
  86 + company.Logo = response.CurrentCompany.Logo
  87 + changed = true
  88 + }
  89 + if changed {
  90 + if company, err = l.svcCtx.CompanyRepository.UpdateWithVersion(l.ctx, conn, company); err != nil {
  91 + return nil, xerr.NewErrMsgErr("获取用户资料失败", err)
  92 + }
  93 + }
  94 + }
27 return 95 return
28 } 96 }
@@ -2,6 +2,8 @@ package user @@ -2,6 +2,8 @@ package user
2 2
3 import ( 3 import (
4 "context" 4 "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
5 7
6 "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"
7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" 9 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
@@ -24,7 +26,58 @@ func NewSystemUserStatisticsLogic(ctx context.Context, svcCtx *svc.ServiceContex @@ -24,7 +26,58 @@ func NewSystemUserStatisticsLogic(ctx context.Context, svcCtx *svc.ServiceContex
24 } 26 }
25 27
26 func (l *SystemUserStatisticsLogic) SystemUserStatistics(req *types.UserStatisticsRequest) (resp *types.UserStatisticsResponse, err error) { 28 func (l *SystemUserStatisticsLogic) SystemUserStatistics(req *types.UserStatisticsRequest) (resp *types.UserStatisticsResponse, err error) {
27 - // todo: add your logic here and delete this line 29 + var (
  30 + userId = req.UserId
  31 + userToken = contextdata.GetUserTokenFromCtx(l.ctx)
  32 + )
  33 + s := StatisticsItems(l.ctx, l.svcCtx, userToken.CompanyId, userId, req.ItemFlag)
  34 + resp = &types.UserStatisticsResponse{
  35 + TotalArticle: s.TotalArticle,
  36 + TotalComment: s.TotalComment,
  37 + TotalLoved: s.TotalLoved,
  38 + }
  39 + return
  40 +}
28 41
  42 +func StatisticsItems(ctx context.Context, svcCtx *svc.ServiceContext, companyId, userId int64, itemFlag int) (s Statistics) {
  43 + var conn = svcCtx.DefaultDBConn()
  44 + s = Statistics{}
  45 + if itemFlag == 0 {
  46 + itemFlag = -1
  47 + }
  48 + if (itemFlag & TotalArticle) > 0 {
  49 + var total int64
  50 + total, _, _ = svcCtx.ArticleRepository.Find(ctx, conn, companyId, domain.NewQueryOptions().WithCountOnly().MustWithKV("authorId", userId))
  51 + s.TotalArticle = int(total)
  52 + }
  53 + if (itemFlag & TotalComment) > 0 {
  54 + var total int64
  55 + total, _, _ = svcCtx.ArticleCommentRepository.Find(ctx, conn, domain.IndexCompanyId(companyId)().WithCountOnly().MustWithKV("fromUserId", userId))
  56 + s.TotalComment = int(total)
  57 + }
  58 + if (itemFlag & TotalLoved) > 0 {
  59 + var total int64
  60 + total, _, _ = svcCtx.UserLoveFlagRepository.Find(ctx, conn, domain.IndexCompanyId(companyId)().WithCountOnly().MustWithKV("userId", userId))
  61 + s.TotalComment = int(total)
  62 + }
29 return 63 return
30 } 64 }
  65 +
  66 +type Statistics struct {
  67 + TotalArticle int `json:"totalArticle"`
  68 + TotalComment int `json:"totalComment"`
  69 + TotalLoved int `json:"totalLoved"`
  70 +}
  71 +
  72 +const (
  73 + TotalArticle = 1
  74 + TotalComment = 2
  75 + TotalLoved = 4
  76 +)
  77 +
  78 +func NewStatisticsItem(itemFlag int, value float64) types.StatisticsItem {
  79 + return types.StatisticsItem{
  80 + ItemFlag: itemFlag,
  81 + Value: value,
  82 + }
  83 +}
  1 +package middleware
  2 +
  3 +import (
  4 + "github.com/zeromicro/go-zero/rest/httpx"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/gateway"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/gateway/authlib"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
  9 + "net/http"
  10 +)
  11 +
  12 +type LoginStatusCheckMiddleware struct {
  13 + apiAuth authlib.ApiAuthService
  14 +}
  15 +
  16 +func NewLoginStatusCheckMiddleware(apiAuth authlib.ApiAuthService) *LoginStatusCheckMiddleware {
  17 + return &LoginStatusCheckMiddleware{
  18 + apiAuth: apiAuth,
  19 + }
  20 +}
  21 +
  22 +func (m *LoginStatusCheckMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc {
  23 + return func(w http.ResponseWriter, r *http.Request) {
  24 + token := r.Header.Get("x-mmm-accesstoken")
  25 + if len(token) > 0 {
  26 + _, err := m.apiAuth.LoginCheck(r.Context(), authlib.RequestLoginCheck{
  27 + Token: token,
  28 + })
  29 + if err != nil {
  30 + gatewayError, ok := err.(gateway.HttpError)
  31 + if ok {
  32 + unAuthResponse(w, gatewayError.Base.Code, gatewayError.Base.Msg)
  33 + return
  34 + }
  35 + result.HttpResult(r, w, struct{}{}, xerr.NewErr(err))
  36 + return
  37 + }
  38 + }
  39 + next(w, r)
  40 + }
  41 +}
  42 +
  43 +func unAuthResponse(w http.ResponseWriter, code int, msg string) {
  44 + data := map[string]interface{}{
  45 + "msg": msg,
  46 + "code": code,
  47 + "data": struct{}{},
  48 + }
  49 + httpx.WriteJson(w, http.StatusUnauthorized, data)
  50 +}
@@ -2,10 +2,14 @@ package svc @@ -2,10 +2,14 @@ package svc
2 2
3 import ( 3 import (
4 "github.com/zeromicro/go-zero/core/stores/redis" 4 "github.com/zeromicro/go-zero/core/stores/redis"
  5 + "github.com/zeromicro/go-zero/rest"
5 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/config" 6 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/config"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/middleware"
6 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/repository" 8 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/repository"
7 "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"
8 "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 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/gateway"
  12 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/gateway/authlib"
9 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/cache" 13 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/cache"
10 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/database" 14 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/database"
11 "gorm.io/gorm" 15 "gorm.io/gorm"
@@ -33,6 +37,10 @@ type ServiceContext struct { @@ -33,6 +37,10 @@ type ServiceContext struct {
33 UserLoveFlagRepository domain.UserLoveFlagRepository 37 UserLoveFlagRepository domain.UserLoveFlagRepository
34 UserReadArticleRepository domain.UserReadArticleRepository 38 UserReadArticleRepository domain.UserReadArticleRepository
35 UserRepository domain.UserRepository 39 UserRepository domain.UserRepository
  40 +
  41 + ApiAuthService authlib.ApiAuthService
  42 +
  43 + LoginStatusCheck rest.Middleware
36 } 44 }
37 45
38 func NewServiceContext(c config.Config) *ServiceContext { 46 func NewServiceContext(c config.Config) *ServiceContext {
@@ -41,11 +49,16 @@ func NewServiceContext(c config.Config) *ServiceContext { @@ -41,11 +49,16 @@ func NewServiceContext(c config.Config) *ServiceContext {
41 49
42 mlCache := cache.NewMultiLevelCache([]string{c.Redis.Host}, c.Redis.Pass) 50 mlCache := cache.NewMultiLevelCache([]string{c.Redis.Host}, c.Redis.Pass)
43 redis, _ := redis.NewRedis(redis.RedisConf{Host: c.Redis.Host, Pass: c.Redis.Pass, Type: "node"}) 51 redis, _ := redis.NewRedis(redis.RedisConf{Host: c.Redis.Host, Pass: c.Redis.Pass, Type: "node"})
44 - 52 + apiAuth := authlib.ApiAuthService{
  53 + Service: gateway.NewService(c.ApiAuth.Name, c.ApiAuth.Host, c.ApiAuth.Timeout),
  54 + }
45 return &ServiceContext{ 55 return &ServiceContext{
46 - Config: c,  
47 - DB: db,  
48 - Redis: redis, 56 + Config: c,
  57 + DB: db,
  58 + Redis: redis,
  59 + ApiAuthService: apiAuth,
  60 + LoginStatusCheck: middleware.NewLoginStatusCheckMiddleware(apiAuth).Handle,
  61 +
49 CommentRepository: repository.NewCommentRepository(cache.NewCachedRepository(mlCache)), 62 CommentRepository: repository.NewCommentRepository(cache.NewCachedRepository(mlCache)),
50 ArticleBackupRepository: repository.NewArticleBackupRepository(cache.NewCachedRepository(mlCache)), 63 ArticleBackupRepository: repository.NewArticleBackupRepository(cache.NewCachedRepository(mlCache)),
51 ArticleCommentRepository: repository.NewArticleCommentRepository(cache.NewCachedRepository(mlCache)), 64 ArticleCommentRepository: repository.NewArticleCommentRepository(cache.NewCachedRepository(mlCache)),
@@ -9,38 +9,138 @@ type MiniArticleCommentAtUserResponse struct { @@ -9,38 +9,138 @@ type MiniArticleCommentAtUserResponse struct {
9 } 9 }
10 10
11 type CommentAuthor struct { 11 type CommentAuthor struct {
12 - Id int64 `json:"id"` // 人员id  
13 - Name string `json:"name"` // 人员的名字  
14 - Avatar string `json:"avatar"` // 人员头像URL  
15 - Position string `json:"position"` // 职位  
16 - Company string `json:"company"` // 公司 12 + Id int64 `json:"id"` // 人员id
  13 + Name string `json:"name"` // 人员的名字
  14 + Avatar string `json:"avatar,optional"` // 人员头像URL
  15 + Position string `json:"position,optional"` // 职位
  16 + Company string `json:"company,optional"` // 公司
17 } 17 }
18 18
19 type MiniCreateArticleCommentRequest struct { 19 type MiniCreateArticleCommentRequest struct {
20 - ArtitcleId int64 `json:"articleId"` // 文章id  
21 - SectionId int64 `json:"sectionId"` // 段落id  
22 - FromUserId int64 `json:",optional"` // 填写文章的人,服务端自动获取  
23 - CompanyId int64 `json:",optional"` // 服务端自动获取  
24 - Pid int64 `json:"commnet"` // 回复那个评论的id  
25 - Content string `json:"content"` // 评论的内容  
26 - AtWho []int64 `json:"atWho"` // 填写评论时@的人 20 + ArtitcleId int64 `json:"articleId"` // 文章id
  21 + SectionId int64 `json:"sectionId"` // 段落id
  22 + FromUserId int64 `json:",optional"` // 填写文章的人,服务端自动获取
  23 + CompanyId int64 `json:",optional"` // 服务端自动获取
  24 + Pid int64 `json:"pid"` // 回复那个评论的id
  25 + Content string `json:"content"` // 评论的内容
  26 + AtWho []CommentAtWho `json:"atWho"` // 填写评论时@的人
  27 +}
  28 +
  29 +type CommentAtWho struct {
  30 + Id int64 `json:"id"`
  31 + Name string `json:"name,optional"`
  32 + FirstLetter string `json:"firstLetter,optional"`
27 } 33 }
28 34
29 type MiniCreateArticleCommentResponse struct { 35 type MiniCreateArticleCommentResponse struct {
30 - Id int64 `json:"id"`  
31 - Pid int64 `json:"pid"`  
32 - TopId int64 `json:"topId"`  
33 - ArtitcleId int64 `json:"articleId"` // 文章id  
34 - SectionId int64 `json:"sectionId"` // 段落id  
35 - FromUserId int64 `json:"fromUserId"` // 填写评论的人  
36 - FromUser CommentAuthor `json:"fromUser"` // 填写评论的人  
37 - ToUserId int64 `json:"toUserId"` // 回复哪个人  
38 - ToUser CommentAuthor `json:"toUser"` // 回复哪个人  
39 - SectionContent string `json:"sectionContent"` // 引用的文章内容文本  
40 - CountReply int `json:"countReply"` // 回复数量  
41 - CountUserLove int `json:"countUserLove"` // 用户点赞数量  
42 - CountAdminLove int `json:"countAdminLove"` // 运营点赞数量  
43 - AtWho []CommentAuthor `json:"atWho"` // 填写评论时@的人 36 + Id int64 `json:"id"`
  37 + Pid int64 `json:"pid"`
  38 + TopId int64 `json:"topId"`
  39 + ArtitcleId int64 `json:"articleId"` // 文章id
  40 + SectionId int64 `json:"sectionId"` // 段落id
  41 + FromUserId int64 `json:"fromUserId"` // 填写评论的人
  42 + FromUser CommentAuthor `json:"fromUser"` // 填写评论的人
  43 + ToUserId int64 `json:"toUserId"` // 回复哪个人
  44 + ToUser CommentAuthor `json:"toUser"` // 回复哪个人
  45 + SectionContent string `json:"sectionContent"` // 引用的文章内容文本
  46 + CountReply int `json:"countReply"` // 回复数量
  47 + CountUserLove int `json:"countUserLove"` // 用户点赞数量
  48 + CountAdminLove int `json:"countAdminLove"` // 运营点赞数量
  49 + AtWho []CommentAtWho `json:"atWho"` // 填写评论时@的人
  50 + CreatedAt int64 `json:"createdAt"` //
  51 +}
  52 +
  53 +type MiniListArticleCommentRequest struct {
  54 + Page int `json:"page"`
  55 + Size int `json:"size"`
  56 + CompanyId int64 `json:",optional"`
  57 + UserId int64 `json:",optional"`
  58 + ArticleId int64 `json:"articleId"`
  59 + SectionId int64 `json:"sectionId,optional"`
  60 +}
  61 +
  62 +type MiniListArticleCommentResponse struct {
  63 + Total int64 `json:"total"`
  64 + List []ArticleCommentAndReply `json:"list"`
  65 +}
  66 +
  67 +type ArticleCommentAndReply struct {
  68 + Comment ArticleCommentItem `json:"comment"` //评论
  69 + Reply []ArticleCommentItem `json:"reply"` //回复的评论
  70 + TotalReply int64 `json:"totalReply"` //回复的评论数量
  71 +}
  72 +
  73 +type ArticleCommentItem struct {
  74 + Id int64 `json:"id"`
  75 + Pid int64 `json:"pid"`
  76 + TopId int64 `json:"topId"`
  77 + ArtitcleId int64 `json:"articleId"` // 文章id
  78 + SectionId int64 `json:"sectionId"` // 段落id
  79 + FromUserId int64 `json:"fromUserId"` // 填写评论的人
  80 + FromUser CommentAuthor `json:"fromUser"` // 填写评论的人
  81 + ToUserId int64 `json:"toUserId"` // 回复哪个人
  82 + ToUser CommentAuthor `json:"toUser"` // 回复哪个人
  83 + SectionContent string `json:"sectionContent"` // 引用的文章内容文本
  84 + CountReply int `json:"countReply"` // 回复数量
  85 + CountUserLove int `json:"countUserLove"` // 用户点赞数量
  86 + CountAdminLove int `json:"countAdminLove"` // 运营点赞数量
  87 + AtWho []CommentAtWho `json:"atWho"` // 填写评论时@的人
  88 + CreatedAt int64 `json:"createdAt"` //
  89 + MeLoveFlag int `json:"meLoveFlag"` //当前人员对评论的点赞标识 (0 没有点赞 1有点赞)
  90 + Content string `json:"content"` // 评论的内容
  91 +}
  92 +
  93 +type MiniGetArticleCommentRequest struct {
  94 + CommentId int64 `path:"id"`
  95 + CompanyId int64 `path:",optional"`
  96 + UserId int64 `path:",optional"`
  97 +}
  98 +
  99 +type MiniGetArticleCommentResponse struct {
  100 + ArticleCommentAndReply
  101 +}
  102 +
  103 +type MiniDeleteArticleCommentRequest struct {
  104 + CommentId int64 `path:"id"`
  105 + UserId int64 `path:",optional"`
  106 + CompanyId int64 `path:",optional"`
  107 +}
  108 +
  109 +type MiniDeleteArticleCommentResponse struct {
  110 + Id int64 `json:"id"`
  111 +}
  112 +
  113 +type MiniTop5ArticleCommentRequest struct {
  114 + CompanyId int64 `json:",optional"`
  115 + UserId int64 `json:",optional"`
  116 + ArticleId int64 `json:"articleId"`
  117 +}
  118 +
  119 +type MiniTop5ArticleCommentResponse struct {
  120 + List []ArticleCommentItem `json:"list"`
  121 +}
  122 +
  123 +type MiniArticleCommentAtWhoRequest struct {
  124 + CompanyId int64 `json:",optional"`
  125 + UserId int64 `json:",optional"`
  126 + ArticleId int64 `json:"articleId"`
  127 +}
  128 +
  129 +type MiniArticleCommentAtWhoResponse struct {
  130 + List []CommentAtWho `json:"list"`
  131 +}
  132 +
  133 +type SystemArticleCommentSearchMeRequest struct {
  134 + Page int `json:"page"`
  135 + Size int `json:"size"`
  136 + AuthorId int64 `json:"authorId"` // 用户
  137 + BeginTime int64 `json:"beginTime,optional"` // 开始时间
  138 + EndTime int64 `json:"endTime,optional"` // 结束时间
  139 +}
  140 +
  141 +type SystemArticleCommentSearchMeResponse struct {
  142 + List []ArticleCommentItem `json:"list"`
  143 + Total int64 `json:"total"`
44 } 144 }
45 145
46 type MessageSystemRequest struct { 146 type MessageSystemRequest struct {
@@ -109,11 +209,12 @@ type SimpleArticle struct { @@ -109,11 +209,12 @@ type SimpleArticle struct {
109 } 209 }
110 210
111 type TagCreateRequest struct { 211 type TagCreateRequest struct {
112 - CompanyId int64 `json:"companyId"` 212 + CompanyId int64 `json:",optional"`
113 Image string `json:"image"` 213 Image string `json:"image"`
114 Name string `json:"name"` // 标签名称 214 Name string `json:"name"` // 标签名称
115 - Group string `json:"group"` // 标签分类 215 + Category string `json:"category"` // 标签分类
116 Remark string `json:"remark,optional"` // 备注 216 Remark string `json:"remark,optional"` // 备注
  217 + Other string `json:"other"`
117 } 218 }
118 219
119 type TagCreateResponse struct { 220 type TagCreateResponse struct {
@@ -122,11 +223,12 @@ type TagCreateResponse struct { @@ -122,11 +223,12 @@ type TagCreateResponse struct {
122 223
123 type TagEditRequest struct { 224 type TagEditRequest struct {
124 Id int64 `json:"id"` 225 Id int64 `json:"id"`
125 - CompanyId int64 `json:"-"` 226 + CompanyId int64 `json:",optional"`
126 Image string `json:"image"` 227 Image string `json:"image"`
127 Name string `json:"name"` // 标签名称 228 Name string `json:"name"` // 标签名称
128 - Group string `json:"group"` // 标签分类 229 + Category string `json:"category"` // 标签分类
129 Remark string `json:"remark,optional"` // 备注 230 Remark string `json:"remark,optional"` // 备注
  231 + Other string `json:"other"`
130 } 232 }
131 233
132 type TagEditResponse struct { 234 type TagEditResponse struct {
@@ -135,23 +237,24 @@ type TagEditResponse struct { @@ -135,23 +237,24 @@ type TagEditResponse struct {
135 237
136 type TagGetRequest struct { 238 type TagGetRequest struct {
137 Id int64 `path:"id"` 239 Id int64 `path:"id"`
138 - CompanyId int64 `path:"-"` 240 + CompanyId int64 `path:",optional"`
139 } 241 }
140 242
141 type TagGetResponse struct { 243 type TagGetResponse struct {
142 - Id int64 `json:"id"`  
143 - Image string `json:"image"`  
144 - Name string `json:"name"` // 标签名称  
145 - Group string `json:"group"` // 标签分类  
146 - Remark string `json:"remark"` // 备注 244 + Id int64 `json:"id"`
  245 + Image string `json:"image"`
  246 + Name string `json:"name"` // 标签名称
  247 + Category string `json:"category"` // 标签分类
  248 + Remark string `json:"remark"` // 备注
  249 + Other string `json:"other"`
147 } 250 }
148 251
149 type TagListRequest struct { 252 type TagListRequest struct {
150 Page int `json:"page"` 253 Page int `json:"page"`
151 Size int `json:"size"` 254 Size int `json:"size"`
152 - CompanyId int64 `json:"-"` 255 + CompanyId int64 `json:",optional"`
153 TagName string `json:"tagName,optional"` 256 TagName string `json:"tagName,optional"`
154 - Group string `json:"group,optional"` 257 + Category string `json:"category,optional"`
155 Remark string `json:"remark,optional"` 258 Remark string `json:"remark,optional"`
156 } 259 }
157 260
@@ -163,15 +266,15 @@ type TagListResponse struct { @@ -163,15 +266,15 @@ type TagListResponse struct {
163 type TagItem struct { 266 type TagItem struct {
164 Id int64 `json:"id"` 267 Id int64 `json:"id"`
165 Image string `json:"image"` 268 Image string `json:"image"`
166 - Name string `json:"name"` // 标签名称  
167 - Group string `json:"group"` // 标签分类  
168 - Remark string `json:"remark"` // 备注 269 + Name string `json:"name"` // 标签名称
  270 + Category string `json:"category"` // 标签分类
  271 + Remark string `json:"remark"` // 备注
169 CreatedAt int64 `json:"createdAt"` 272 CreatedAt int64 `json:"createdAt"`
170 } 273 }
171 274
172 type TagDeleteRequest struct { 275 type TagDeleteRequest struct {
173 Id int64 `path:"id"` 276 Id int64 `path:"id"`
174 - CompanyId int64 `path:"-"` 277 + CompanyId int64 `path:",optional"`
175 } 278 }
176 279
177 type TagDeleteResponse struct { 280 type TagDeleteResponse struct {
@@ -329,6 +432,7 @@ type SimpleComment struct { @@ -329,6 +432,7 @@ type SimpleComment struct {
329 } 432 }
330 433
331 type SystemUserInfoRequest struct { 434 type SystemUserInfoRequest struct {
  435 + Token string `header:"x-mmm-accesstoken"`
332 } 436 }
333 437
334 type SystemUserInfoResponse struct { 438 type SystemUserInfoResponse struct {
@@ -337,15 +441,18 @@ type SystemUserInfoResponse struct { @@ -337,15 +441,18 @@ type SystemUserInfoResponse struct {
337 Avatar string `json:"avatar"` 441 Avatar string `json:"avatar"`
338 CompanyId int64 `json:"companyId"` 442 CompanyId int64 `json:"companyId"`
339 CompanyName string `json:"companyName"` 443 CompanyName string `json:"companyName"`
  444 + Code string `json:"code"`
340 } 445 }
341 446
342 type UserStatisticsRequest struct { 447 type UserStatisticsRequest struct {
343 - UserId int64 `json:"userId"`  
344 - ItemFlag int `json:"itemFlag"` // 1:他的帖子 2:他的评论/回复 4:他收到的赞 8:TA的圆桌讨论 16:被采纳 448 + UserId int64 `json:"userId,optional"`
  449 + ItemFlag int `json:"itemFlag"` //0:默认查询所有 1:他的帖子 2:他的评论/回复 4:他收到的赞 8:TA的圆桌讨论 16:被采纳
345 } 450 }
346 451
347 type UserStatisticsResponse struct { 452 type UserStatisticsResponse struct {
348 - List []StatisticsItem `json:"list"` 453 + TotalArticle int `json:"totalArticle"`
  454 + TotalComment int `json:"totalComment"`
  455 + TotalLoved int `json:"totalLoved"`
349 } 456 }
350 457
351 type StatisticsItem struct { 458 type StatisticsItem struct {
@@ -520,7 +627,7 @@ type MiniArticleGetResponse struct { @@ -520,7 +627,7 @@ type MiniArticleGetResponse struct {
520 CountRead int `json:"countRead"` // 浏览数量 627 CountRead int `json:"countRead"` // 浏览数量
521 Show int `json:"show"` // 评论的展示状态(0显示、1不显示) 628 Show int `json:"show"` // 评论的展示状态(0显示、1不显示)
522 Edit int `json:"edit"` // 文章是否存在变更记录 (0 不存在 1存在) 629 Edit int `json:"edit"` // 文章是否存在变更记录 (0 不存在 1存在)
523 - MeLoveFlag int `json:"meLoveFlag"` //当前人员对文章的点赞标识 630 + MeLoveFlag int `json:"meLoveFlag"` // 当前人员对文章的点赞标识 (0 没有点赞 1有点赞)
524 } 631 }
525 632
526 type ArticleSection struct { 633 type ArticleSection struct {
@@ -552,6 +659,19 @@ type ArticleSearchMe struct { @@ -552,6 +659,19 @@ type ArticleSearchMe struct {
552 Show int `json:"show"` //是否隐藏 [0显示、1不显示] 659 Show int `json:"show"` //是否隐藏 [0显示、1不显示]
553 } 660 }
554 661
  662 +type SystemArticleSearchMeRequest struct {
  663 + Page int `json:"page"`
  664 + Size int `json:"size"`
  665 + AuthorId int64 `json:"authorId"` // 用户
  666 + BeginTime int64 `json:"beginTime,optional"` // 开始时间
  667 + EndTime int64 `json:"endTime,optional"` // 结束时间
  668 +}
  669 +
  670 +type SystemArticleSearchMeResponse struct {
  671 + Total int `json:"total"`
  672 + List []ArticleSearchMe `json:"list"`
  673 +}
  674 +
555 type MiniUserLikeArticleRequest struct { 675 type MiniUserLikeArticleRequest struct {
556 ArticleId int64 `json:"articleId"` // 文章id 676 ArticleId int64 `json:"articleId"` // 文章id
557 CompanyId int64 `json:",optional"` //公司id 677 CompanyId int64 `json:",optional"` //公司id
@@ -569,6 +689,7 @@ type WhichUserLikeArticle struct { @@ -569,6 +689,7 @@ type WhichUserLikeArticle struct {
569 UserId int64 `json:"userId"` // 人员id 689 UserId int64 `json:"userId"` // 人员id
570 Name string `json:"name"` // 人员名称 690 Name string `json:"name"` // 人员名称
571 Avatar string `json:"avatar"` // 人员头像 691 Avatar string `json:"avatar"` // 人员头像
  692 + Position string `json:"position"` // 职位
572 CreatedAt int64 `json:"createdAt"` // 点赞记录的时间 693 CreatedAt int64 `json:"createdAt"` // 点赞记录的时间
573 } 694 }
574 695
@@ -717,6 +838,38 @@ type MiniArticleMarkItem struct { @@ -717,6 +838,38 @@ type MiniArticleMarkItem struct {
717 UpdatedAt int64 `json:"updatedAt"` 838 UpdatedAt int64 `json:"updatedAt"`
718 } 839 }
719 840
  841 +type MiniArticleSetTagRequest struct {
  842 + CompanyId int64 `json:",optional"` // 公司id
  843 + UserId int64 `json:",optional"` // 公司id
  844 + ArticleId int64 `json:"articleId"` // 文章id
  845 + TagId int64 `json:"tagId"` // 标签id
  846 +}
  847 +
  848 +type MiniArticleSetTagResponse struct {
  849 + Id int64 `json:"id"`
  850 +}
  851 +
  852 +type MiniAllArticleTagRequest struct {
  853 + CompanyId int64 `json:",optional"` // 公司id
  854 + UserId int64 `json:",optional"` // 公司id
  855 +}
  856 +
  857 +type MiniAllArticleTagResponse struct {
  858 + TagGroup []ArticleTagGroup `json:"tagGroup"`
  859 +}
  860 +
  861 +type ArticleTagGroup struct {
  862 + Group string `json:"group"`
  863 + Tags []ArticleTagItem `json:"tags"`
  864 +}
  865 +
  866 +type ArticleTagItem struct {
  867 + Id int64 `json:"id"`
  868 + Group string `json:"group"`
  869 + Name string `json:"name"`
  870 + Image string `json:"image"`
  871 +}
  872 +
720 type SystemArticleGetRequest struct { 873 type SystemArticleGetRequest struct {
721 Id int64 `path:"id"` //id 874 Id int64 `path:"id"` //id
722 CompanyId int64 `path:",optional"` 875 CompanyId int64 `path:",optional"`
@@ -891,8 +1044,9 @@ type DepartmentGetResponse struct { @@ -891,8 +1044,9 @@ type DepartmentGetResponse struct {
891 } 1044 }
892 1045
893 type DepartmentUpdateRequest struct { 1046 type DepartmentUpdateRequest struct {
894 - Id int64 `path:"id"`  
895 - Name string `json:"name"` 1047 + Id int64 `path:"id"`
  1048 + Name string `json:"name"`
  1049 + Ids []int64 `json:"ids"` // 用户ID
896 } 1050 }
897 1051
898 type DepartmentListRequest struct { 1052 type DepartmentListRequest struct {
@@ -22,6 +22,7 @@ func Migrate(db *gorm.DB) { @@ -22,6 +22,7 @@ func Migrate(db *gorm.DB) {
22 &models.MessageSystem{}, 22 &models.MessageSystem{},
23 &models.MessageBusiness{}, 23 &models.MessageBusiness{},
24 &models.Department{}, 24 &models.Department{},
  25 + &models.ArticleAndTag{},
25 } 26 }
26 27
27 db.AutoMigrate(modelsList...) 28 db.AutoMigrate(modelsList...)
  1 +package models
  2 +
  3 +import (
  4 + "fmt"
  5 + "time"
  6 +
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  8 + "gorm.io/gorm"
  9 +)
  10 +
  11 +// 保存文章和标签的关系,主要用于分组统计用
  12 +type ArticleAndTag struct {
  13 + Id int64 `gorm:"primaryKey"` // 唯一标识
  14 + CompanyId int64
  15 + CreatedAt int64
  16 + UpdatedAt int64
  17 + ArticleId int64
  18 + TagId int64
  19 +}
  20 +
  21 +func (m *ArticleAndTag) TableName() string {
  22 + return "article_and_tag"
  23 +}
  24 +
  25 +func (m *ArticleAndTag) BeforeCreate(tx *gorm.DB) (err error) {
  26 + m.CreatedAt = time.Now().Unix()
  27 + m.UpdatedAt = time.Now().Unix()
  28 + return
  29 +}
  30 +
  31 +func (m *ArticleAndTag) BeforeUpdate(tx *gorm.DB) (err error) {
  32 + m.UpdatedAt = time.Now().Unix()
  33 + return
  34 +}
  35 +
  36 +func (m *ArticleAndTag) CacheKeyFunc() string {
  37 + if m.Id == 0 {
  38 + return ""
  39 + }
  40 + return fmt.Sprintf("%v:cache:%v:id:%v", domain.ProjectName, m.TableName(), m.Id)
  41 +}
  42 +
  43 +func (m *ArticleAndTag) CacheKeyFuncByObject(obj interface{}) string {
  44 + if v, ok := obj.(*ArticleAndTag); ok {
  45 + return v.CacheKeyFunc()
  46 + }
  47 + return ""
  48 +}
  49 +
  50 +func (m *ArticleAndTag) CachePrimaryKeyFunc() string {
  51 + if len("") == 0 {
  52 + return ""
  53 + }
  54 + return fmt.Sprintf("%v:cache:%v:primarykey:%v", domain.ProjectName, m.TableName(), "key")
  55 +}
@@ -9,6 +9,7 @@ import ( @@ -9,6 +9,7 @@ import (
9 "gorm.io/plugin/soft_delete" 9 "gorm.io/plugin/soft_delete"
10 ) 10 )
11 11
  12 +// 文章的所有标签
12 type ArticleTag struct { 13 type ArticleTag struct {
13 Id int64 `gorm:"primaryKey"` // 唯一标识 14 Id int64 `gorm:"primaryKey"` // 唯一标识
14 CompanyId int64 15 CompanyId int64
@@ -19,8 +20,10 @@ type ArticleTag struct { @@ -19,8 +20,10 @@ type ArticleTag struct {
19 Version int 20 Version int
20 Image domain.Image `gorm:"type:jsonb;serializer:json"` // 图片 21 Image domain.Image `gorm:"type:jsonb;serializer:json"` // 图片
21 Name string // 标签名称 22 Name string // 标签名称
22 - Group string // 标签分类  
23 Remark string // 备注 23 Remark string // 备注
  24 + Category string // 标签分类
  25 + SortBy int64 // 顺序
  26 + Other string // 其他
24 } 27 }
25 28
26 func (m *ArticleTag) TableName() string { 29 func (m *ArticleTag) TableName() string {
@@ -10,7 +10,7 @@ import ( @@ -10,7 +10,7 @@ import (
10 type Company struct { 10 type Company struct {
11 Id int64 // 唯一标识 11 Id int64 // 唯一标识
12 Name string // 名称 12 Name string // 名称
13 - Code string // 编码(搜索使用,4位字母数字) 13 + Code string `gorm:"uniqueIndex:idx_company_code"` // 编码(搜索使用,4位字母数字)
14 Logo string // 公司LOGO 14 Logo string // 公司LOGO
15 15
16 CreatedAt int64 16 CreatedAt int64
@@ -17,6 +17,7 @@ type MessageBusiness struct { @@ -17,6 +17,7 @@ type MessageBusiness struct {
17 UserId int64 `json:"userId"` // 操作人用户ID 17 UserId int64 `json:"userId"` // 操作人用户ID
18 RecipientId int64 `json:"recipientId"` // 接收人用户ID 18 RecipientId int64 `json:"recipientId"` // 接收人用户ID
19 ArticleId int64 `json:"articleId,omitempty"` // 文章ID 19 ArticleId int64 `json:"articleId,omitempty"` // 文章ID
  20 + SectionId int64 `json:"sectionId,omitempty"` // 段落ID
20 CommentId int64 `json:"commentId,omitempty"` // 评论ID 21 CommentId int64 `json:"commentId,omitempty"` // 评论ID
21 Content string `json:"content,omitempty"` // 消息内容 22 Content string `json:"content,omitempty"` // 消息内容
22 CreatedAt int64 `json:",omitempty"` 23 CreatedAt int64 `json:",omitempty"`
@@ -2,9 +2,10 @@ package models @@ -2,9 +2,10 @@ package models
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
  5 + "time"
  6 +
5 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain" 7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
6 "gorm.io/gorm" 8 "gorm.io/gorm"
7 - "time"  
8 ) 9 )
9 10
10 type UserFollow struct { 11 type UserFollow struct {
  1 +package repository
  2 +
  3 +import (
  4 + "context"
  5 +
  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 ArticleAndTagRepository struct {
  16 + *cache.CachedRepository
  17 +}
  18 +
  19 +func (repository *ArticleAndTagRepository) Insert(ctx context.Context, conn transaction.Conn, dm *domain.ArticleAndTag) (*domain.ArticleAndTag, error) {
  20 + var (
  21 + err error
  22 + m = &models.ArticleAndTag{}
  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 *ArticleAndTagRepository) Update(ctx context.Context, conn transaction.Conn, dm *domain.ArticleAndTag) (*domain.ArticleAndTag, error) {
  37 + var (
  38 + err error
  39 + m *models.ArticleAndTag
  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 *ArticleAndTagRepository) Delete(ctx context.Context, conn transaction.Conn, dm *domain.ArticleAndTag) (*domain.ArticleAndTag, error) {
  56 + var (
  57 + tx = conn.DB()
  58 + m = &models.ArticleAndTag{Id: dm.Id}
  59 + )
  60 + queryFunc := func() (interface{}, error) {
  61 + tx = tx.Where("id = ?", m.Id).Delete(m)
  62 + return m, tx.Error
  63 + }
  64 + if _, err := repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
  65 + return dm, err
  66 + }
  67 + return repository.ModelToDomainModel(m)
  68 +}
  69 +
  70 +func (repository *ArticleAndTagRepository) FindOne(ctx context.Context, conn transaction.Conn, id int64) (*domain.ArticleAndTag, error) {
  71 + var (
  72 + err error
  73 + tx = conn.DB()
  74 + m = new(models.ArticleAndTag)
  75 + )
  76 + queryFunc := func() (interface{}, error) {
  77 + tx = tx.Model(m).Where("id = ?", id).First(m)
  78 + if errors.Is(tx.Error, gorm.ErrRecordNotFound) {
  79 + return nil, domain.ErrNotFound
  80 + }
  81 + return m, tx.Error
  82 + }
  83 + cacheModel := new(models.ArticleAndTag)
  84 + cacheModel.Id = id
  85 + if err = repository.QueryCache(cacheModel.CacheKeyFunc, m, queryFunc); err != nil {
  86 + return nil, err
  87 + }
  88 + return repository.ModelToDomainModel(m)
  89 +}
  90 +
  91 +func (repository *ArticleAndTagRepository) Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*domain.ArticleAndTag, error) {
  92 + var (
  93 + tx = conn.DB()
  94 + ms []*models.ArticleAndTag
  95 + dms = make([]*domain.ArticleAndTag, 0)
  96 + total int64
  97 + )
  98 + queryFunc := func() (interface{}, error) {
  99 + tx = tx.Model(&ms).Order("id desc")
  100 + if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
  101 + return dms, tx.Error
  102 + }
  103 + return dms, nil
  104 + }
  105 +
  106 + if _, err := repository.Query(queryFunc); err != nil {
  107 + return 0, nil, err
  108 + }
  109 +
  110 + for _, item := range ms {
  111 + if dm, err := repository.ModelToDomainModel(item); err != nil {
  112 + return 0, dms, err
  113 + } else {
  114 + dms = append(dms, dm)
  115 + }
  116 + }
  117 + return total, dms, nil
  118 +}
  119 +
  120 +func (repository *ArticleAndTagRepository) ModelToDomainModel(from *models.ArticleAndTag) (*domain.ArticleAndTag, error) {
  121 + to := &domain.ArticleAndTag{}
  122 + err := copier.Copy(to, from)
  123 + return to, err
  124 +}
  125 +
  126 +func (repository *ArticleAndTagRepository) DomainModelToModel(from *domain.ArticleAndTag) (*models.ArticleAndTag, error) {
  127 + to := &models.ArticleAndTag{}
  128 + err := copier.Copy(to, from)
  129 + return to, err
  130 +}
  131 +
  132 +func NewArticleAndTagRepository(cache *cache.CachedRepository) domain.ArticleAndTagRepository {
  133 + return &ArticleAndTagRepository{CachedRepository: cache}
  134 +}
@@ -21,9 +21,13 @@ func (repository *ArticleCommentRepository) Insert(ctx context.Context, conn tra @@ -21,9 +21,13 @@ func (repository *ArticleCommentRepository) Insert(ctx context.Context, conn tra
21 m = &models.ArticleComment{} 21 m = &models.ArticleComment{}
22 tx = conn.DB() 22 tx = conn.DB()
23 ) 23 )
  24 + if len(dm.AtWho) == 0 {
  25 + dm.AtWho = make([]domain.UserSimple, 0)
  26 + }
24 if m, err = repository.DomainModelToModel(dm); err != nil { 27 if m, err = repository.DomainModelToModel(dm); err != nil {
25 return nil, err 28 return nil, err
26 } 29 }
  30 +
27 if tx = tx.Model(m).Save(m); tx.Error != nil { 31 if tx = tx.Model(m).Save(m); tx.Error != nil {
28 return nil, tx.Error 32 return nil, tx.Error
29 } 33 }
@@ -120,6 +124,32 @@ func (repository *ArticleCommentRepository) Find(ctx context.Context, conn trans @@ -120,6 +124,32 @@ func (repository *ArticleCommentRepository) Find(ctx context.Context, conn trans
120 ) 124 )
121 queryFunc := func() (interface{}, error) { 125 queryFunc := func() (interface{}, error) {
122 tx = tx.Model(&ms).Order("id desc") 126 tx = tx.Model(&ms).Order("id desc")
  127 + if v, ok := queryOptions["topId"]; ok {
  128 + tx = tx.Where("top_id=?", v)
  129 + }
  130 + if v, ok := queryOptions["show"]; ok {
  131 + tx = tx.Where("show=?", v)
  132 + }
  133 + if v, ok := queryOptions["articleId"]; ok {
  134 + tx = tx.Where("article_id=?", v)
  135 + }
  136 +
  137 + if v, ok := queryOptions["sectionId"]; ok {
  138 + tx = tx.Where("section_id=?", v)
  139 + }
  140 + if v, ok := queryOptions["companyId"]; ok {
  141 + tx = tx.Where("company_id=?", v)
  142 + }
  143 + if v, ok := queryOptions["fromUserId"]; ok {
  144 + tx = tx.Where("from_user_id=?", v)
  145 + }
  146 + if v, ok := queryOptions["beginCreatedAt"]; ok {
  147 + tx = tx.Where("created_at >= ?", v)
  148 + }
  149 + if v, ok := queryOptions["endCreatedAt"]; ok {
  150 + tx = tx.Where("created_at < ?", v)
  151 + }
  152 +
123 if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil { 153 if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
124 return dms, tx.Error 154 return dms, tx.Error
125 } 155 }
@@ -162,6 +192,7 @@ func (repository *ArticleCommentRepository) ModelToDomainModel(from *models.Arti @@ -162,6 +192,7 @@ func (repository *ArticleCommentRepository) ModelToDomainModel(from *models.Arti
162 CountUserLove: from.CountUserLove, 192 CountUserLove: from.CountUserLove,
163 CountAdminLove: from.CountAdminLove, 193 CountAdminLove: from.CountAdminLove,
164 Show: domain.CommentShow(from.Show), 194 Show: domain.CommentShow(from.Show),
  195 + AtWho: from.AtWho,
165 } 196 }
166 // err := copier.Copy(to, from) 197 // err := copier.Copy(to, from)
167 return to, nil 198 return to, nil
@@ -173,6 +204,7 @@ func (repository *ArticleCommentRepository) DomainModelToModel(from *domain.Arti @@ -173,6 +204,7 @@ func (repository *ArticleCommentRepository) DomainModelToModel(from *domain.Arti
173 CompanyId: from.CompanyId, 204 CompanyId: from.CompanyId,
174 CreatedAt: from.CreatedAt, 205 CreatedAt: from.CreatedAt,
175 UpdatedAt: from.UpdatedAt, 206 UpdatedAt: from.UpdatedAt,
  207 + IsDel: 0,
176 DeletedAt: from.DeletedAt, 208 DeletedAt: from.DeletedAt,
177 Version: from.Version, 209 Version: from.Version,
178 Pid: from.Pid, 210 Pid: from.Pid,
@@ -184,6 +216,7 @@ func (repository *ArticleCommentRepository) DomainModelToModel(from *domain.Arti @@ -184,6 +216,7 @@ func (repository *ArticleCommentRepository) DomainModelToModel(from *domain.Arti
184 FromUser: from.FromUser, 216 FromUser: from.FromUser,
185 ToUserId: from.ToUser.Id, 217 ToUserId: from.ToUser.Id,
186 ToUser: from.ToUser, 218 ToUser: from.ToUser,
  219 + AtWho: from.AtWho,
187 Content: from.Content, 220 Content: from.Content,
188 CountReply: from.CountReply, 221 CountReply: from.CountReply,
189 CountUserLove: from.CountUserLove, 222 CountUserLove: from.CountUserLove,
@@ -195,17 +228,40 @@ func (repository *ArticleCommentRepository) DomainModelToModel(from *domain.Arti @@ -195,17 +228,40 @@ func (repository *ArticleCommentRepository) DomainModelToModel(from *domain.Arti
195 } 228 }
196 229
197 // 点赞数量变动 230 // 点赞数量变动
198 -func (repository *ArticleCommentRepository) IncreaseCountUserLove(ctx context.Context, conn transaction.Conn, incr int, dm *domain.ArticleComment) error { 231 +func (repository *ArticleCommentRepository) IncreaseCountUserLove(ctx context.Context, conn transaction.Conn, incr int, commnetId int64) error {
199 var ( 232 var (
200 err error 233 err error
201 m *models.ArticleComment 234 m *models.ArticleComment
202 tx = conn.DB() 235 tx = conn.DB()
203 ) 236 )
204 - if m, err = repository.DomainModelToModel(dm); err != nil { 237 + m = &models.ArticleComment{Id: commnetId}
  238 + queryFunc := func() (interface{}, error) {
  239 + tx = tx.Model(m).Updates(map[string]interface{}{
  240 + "count_user_love": gorm.Expr("count_user_love+?", incr),
  241 + "version": gorm.Expr("version+1"),
  242 + })
  243 + return nil, tx.Error
  244 + }
  245 + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
205 return err 246 return err
206 } 247 }
  248 + return nil
  249 +
  250 +}
  251 +
  252 +// 点赞数量变动
  253 +func (repository *ArticleCommentRepository) IncreaseCountReply(ctx context.Context, conn transaction.Conn, incr int, commnetId int64) error {
  254 + var (
  255 + err error
  256 + m *models.ArticleComment
  257 + tx = conn.DB()
  258 + )
  259 + m = &models.ArticleComment{Id: commnetId}
207 queryFunc := func() (interface{}, error) { 260 queryFunc := func() (interface{}, error) {
208 - tx = tx.Model(m).Update("count_user_love", gorm.Expr("count_user_love+?", incr)) 261 + tx = tx.Model(m).Updates(map[string]interface{}{
  262 + "count_reply": gorm.Expr("count_reply+?", incr),
  263 + "version": gorm.Expr("version+1"),
  264 + })
209 return nil, tx.Error 265 return nil, tx.Error
210 } 266 }
211 if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil { 267 if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
@@ -215,6 +271,60 @@ func (repository *ArticleCommentRepository) IncreaseCountUserLove(ctx context.Co @@ -215,6 +271,60 @@ func (repository *ArticleCommentRepository) IncreaseCountUserLove(ctx context.Co
215 271
216 } 272 }
217 273
  274 +// 获取热度前5的
  275 +// 规则 热门=(回复数+赞数量+运营点赞)Top5
  276 +func (repository *ArticleCommentRepository) Top5Comment(ctx context.Context, conn transaction.Conn, companyId int64, articleId int64) ([]*domain.ArticleComment, error) {
  277 +
  278 + sql1 := `select
  279 + article_comment.id ,
  280 + (article_comment.count_reply +article_comment.count_user_love +article_comment.count_admin_love ) cnt
  281 + from article_comment
  282 + where top_id =0 and article_id =? and deleted_at=0 and show=0 and company_id=?
  283 + order by cnt desc,article_comment.id desc
  284 + limit 5 `
  285 + db := conn.DB()
  286 + rows, err := db.Raw(sql1, articleId, companyId).Rows()
  287 + if err != nil {
  288 + return nil, err
  289 + }
  290 + defer rows.Close()
  291 + commentIds := []int64{}
  292 + var cid int64
  293 + var cnt int64
  294 + for rows.Next() {
  295 + err = rows.Scan(&cid, &cnt)
  296 + if err != nil {
  297 + return nil, err
  298 + }
  299 + commentIds = append(commentIds, cid)
  300 + }
  301 + if len(commentIds) == 0 {
  302 + return nil, nil
  303 + }
  304 + ms := make([]*models.ArticleComment, 0)
  305 + dms := make([]*domain.ArticleComment, 0)
  306 + queryFunc := func() (interface{}, error) {
  307 + tx := db.Model(&ms).Where("id in(?)", commentIds)
  308 + queryOptions := domain.NewQueryOptions().WithFindOnly()
  309 + if _, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
  310 + return dms, tx.Error
  311 + }
  312 + return dms, nil
  313 + }
  314 +
  315 + if _, err := repository.Query(queryFunc); err != nil {
  316 + return nil, err
  317 + }
  318 +
  319 + for _, item := range ms {
  320 + if dm, err := repository.ModelToDomainModel(item); err != nil {
  321 + return dms, err
  322 + } else {
  323 + dms = append(dms, dm)
  324 + }
  325 + }
  326 + return dms, nil
  327 +}
218 func NewArticleCommentRepository(cache *cache.CachedRepository) domain.ArticleCommentRepository { 328 func NewArticleCommentRepository(cache *cache.CachedRepository) domain.ArticleCommentRepository {
219 return &ArticleCommentRepository{CachedRepository: cache} 329 return &ArticleCommentRepository{CachedRepository: cache}
220 } 330 }
@@ -127,6 +127,12 @@ func (repository *ArticleRepository) Find(ctx context.Context, conn transaction. @@ -127,6 +127,12 @@ func (repository *ArticleRepository) Find(ctx context.Context, conn transaction.
127 if v, ok := queryOptions["authorId"]; ok { 127 if v, ok := queryOptions["authorId"]; ok {
128 tx = tx.Where("author_id = ?", v) 128 tx = tx.Where("author_id = ?", v)
129 } 129 }
  130 + if v, ok := queryOptions["beginCreatedAt"]; ok {
  131 + tx = tx.Where("created_at >= ?", v)
  132 + }
  133 + if v, ok := queryOptions["endCreatedAt"]; ok {
  134 + tx = tx.Where("created_at < ?", v)
  135 + }
130 136
131 if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil { 137 if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
132 return dms, tx.Error 138 return dms, tx.Error
@@ -203,16 +209,14 @@ func (repository *ArticleRepository) DomainModelToModel(from *domain.Article) (* @@ -203,16 +209,14 @@ func (repository *ArticleRepository) DomainModelToModel(from *domain.Article) (*
203 } 209 }
204 210
205 // 点赞数量变动 211 // 点赞数量变动
206 -func (repository *ArticleRepository) IncreaseCountLove(ctx context.Context, conn transaction.Conn, incr int, dm *domain.Article) error { 212 +func (repository *ArticleRepository) IncreaseCountLove(ctx context.Context, conn transaction.Conn, incr int, articleId int64) error {
207 // 213 //
208 var ( 214 var (
209 err error 215 err error
210 m *models.Article 216 m *models.Article
211 tx = conn.DB() 217 tx = conn.DB()
212 ) 218 )
213 - if m, err = repository.DomainModelToModel(dm); err != nil {  
214 - return err  
215 - } 219 + m = &models.Article{Id: articleId}
216 queryFunc := func() (interface{}, error) { 220 queryFunc := func() (interface{}, error) {
217 tx = tx.Model(m).Updates(map[string]interface{}{ 221 tx = tx.Model(m).Updates(map[string]interface{}{
218 "count_love": gorm.Expr("count_love+?", incr), 222 "count_love": gorm.Expr("count_love+?", incr),
@@ -227,15 +231,13 @@ func (repository *ArticleRepository) IncreaseCountLove(ctx context.Context, conn @@ -227,15 +231,13 @@ func (repository *ArticleRepository) IncreaseCountLove(ctx context.Context, conn
227 } 231 }
228 232
229 // 浏览数量变动 233 // 浏览数量变动
230 -func (repository *ArticleRepository) IncreaseCountRead(ctx context.Context, conn transaction.Conn, incr int, dm *domain.Article) error { 234 +func (repository *ArticleRepository) IncreaseCountRead(ctx context.Context, conn transaction.Conn, incr int, articleId int64) error {
231 var ( 235 var (
232 err error 236 err error
233 m *models.Article 237 m *models.Article
234 tx = conn.DB() 238 tx = conn.DB()
235 ) 239 )
236 - if m, err = repository.DomainModelToModel(dm); err != nil {  
237 - return err  
238 - } 240 + m = &models.Article{Id: articleId}
239 queryFunc := func() (interface{}, error) { 241 queryFunc := func() (interface{}, error) {
240 tx = tx.Model(m).Updates(map[string]interface{}{ 242 tx = tx.Model(m).Updates(map[string]interface{}{
241 "version": gorm.Expr("version+1"), 243 "version": gorm.Expr("version+1"),
@@ -250,15 +252,13 @@ func (repository *ArticleRepository) IncreaseCountRead(ctx context.Context, conn @@ -250,15 +252,13 @@ func (repository *ArticleRepository) IncreaseCountRead(ctx context.Context, conn
250 } 252 }
251 253
252 // 评论数量变动 254 // 评论数量变动
253 -func (repository *ArticleRepository) IncreaseCountComment(ctx context.Context, conn transaction.Conn, incr int, dm *domain.Article) error { 255 +func (repository *ArticleRepository) IncreaseCountComment(ctx context.Context, conn transaction.Conn, incr int, articleId int64) error {
254 var ( 256 var (
255 err error 257 err error
256 m *models.Article 258 m *models.Article
257 tx = conn.DB() 259 tx = conn.DB()
258 ) 260 )
259 - if m, err = repository.DomainModelToModel(dm); err != nil {  
260 - return err  
261 - } 261 + m = &models.Article{Id: articleId}
262 queryFunc := func() (interface{}, error) { 262 queryFunc := func() (interface{}, error) {
263 tx = tx.Model(m).Updates(map[string]interface{}{ 263 tx = tx.Model(m).Updates(map[string]interface{}{
264 "version": gorm.Expr("version+1"), 264 "version": gorm.Expr("version+1"),
@@ -200,6 +200,27 @@ func (repository *ArticleSectionRepository) DomainModelToModel(from *domain.Arti @@ -200,6 +200,27 @@ func (repository *ArticleSectionRepository) DomainModelToModel(from *domain.Arti
200 return to, nil 200 return to, nil
201 } 201 }
202 202
  203 +// 评论数量变动
  204 +func (repository *ArticleSectionRepository) IncreaseCountComment(ctx context.Context, conn transaction.Conn, incr int, sectionId int64) error {
  205 + var (
  206 + err error
  207 + m *models.ArticleSection
  208 + tx = conn.DB()
  209 + )
  210 + m = &models.ArticleSection{Id: sectionId}
  211 + queryFunc := func() (interface{}, error) {
  212 + tx = tx.Model(m).Updates(map[string]interface{}{
  213 + "total_comment": gorm.Expr("total_comment+?", incr),
  214 + "version": gorm.Expr("version+1"),
  215 + })
  216 + return nil, tx.Error
  217 + }
  218 + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
  219 + return err
  220 + }
  221 + return nil
  222 +}
  223 +
203 func NewArticleSectionRepository(cache *cache.CachedRepository) domain.ArticleSectionRepository { 224 func NewArticleSectionRepository(cache *cache.CachedRepository) domain.ArticleSectionRepository {
204 return &ArticleSectionRepository{CachedRepository: cache} 225 return &ArticleSectionRepository{CachedRepository: cache}
205 } 226 }
@@ -122,13 +122,13 @@ func (repository *ArticleTagRepository) Find(ctx context.Context, conn transacti @@ -122,13 +122,13 @@ func (repository *ArticleTagRepository) Find(ctx context.Context, conn transacti
122 queryFunc := func() (interface{}, error) { 122 queryFunc := func() (interface{}, error) {
123 tx = tx.Model(&ms). 123 tx = tx.Model(&ms).
124 Where("company_id=?", companyId). 124 Where("company_id=?", companyId).
125 - Order("id desc") 125 + Order("id asc")
126 126
127 if v, ok := queryOptions["name"]; ok { 127 if v, ok := queryOptions["name"]; ok {
128 tx = tx.Where("name like ?", v) 128 tx = tx.Where("name like ?", v)
129 } 129 }
130 - if v, ok := queryOptions["group"]; ok {  
131 - tx = tx.Where("group like ?", v) 130 + if v, ok := queryOptions["category"]; ok {
  131 + tx = tx.Where("category like ?", v)
132 } 132 }
133 133
134 if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil { 134 if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
@@ -121,9 +121,24 @@ func (repository *MessageBusinessRepository) Find(ctx context.Context, conn tran @@ -121,9 +121,24 @@ func (repository *MessageBusinessRepository) Find(ctx context.Context, conn tran
121 ) 121 )
122 queryFunc := func() (interface{}, error) { 122 queryFunc := func() (interface{}, error) {
123 tx = tx.Model(&ms).Order("id desc") 123 tx = tx.Model(&ms).Order("id desc")
  124 + if v, ok := queryOptions["type"]; ok {
  125 + tx.Where("type = ?", v)
  126 + }
  127 + if v, ok := queryOptions["optType"]; ok {
  128 + tx.Where("opt_type = ?", v)
  129 + }
124 if v, ok := queryOptions["companyId"]; ok { 130 if v, ok := queryOptions["companyId"]; ok {
125 tx.Where("company_id = ?", v) 131 tx.Where("company_id = ?", v)
126 } 132 }
  133 + if v, ok := queryOptions["recipientId"]; ok {
  134 + tx.Where("recipient_id = ?", v)
  135 + }
  136 + if v, ok := queryOptions["articleId"]; ok {
  137 + tx.Where("article_id = ?", v)
  138 + }
  139 + if v, ok := queryOptions["commentId"]; ok {
  140 + tx.Where("comment_id = ?", v)
  141 + }
127 if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil { 142 if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
128 return dms, tx.Error 143 return dms, tx.Error
129 } 144 }
@@ -126,6 +126,9 @@ func (repository *UserLoveFlagRepository) Find(ctx context.Context, conn transac @@ -126,6 +126,9 @@ func (repository *UserLoveFlagRepository) Find(ctx context.Context, conn transac
126 if v, ok := queryOptions["commentId"]; ok { 126 if v, ok := queryOptions["commentId"]; ok {
127 tx = tx.Where("comment_id=?", v) 127 tx = tx.Where("comment_id=?", v)
128 } 128 }
  129 + if v, ok := queryOptions["companyId"]; ok {
  130 + tx = tx.Where("company_id=?", v)
  131 + }
129 if v, ok := queryOptions["userId"]; ok { 132 if v, ok := queryOptions["userId"]; ok {
130 tx = tx.Where("user_id=?", v) 133 tx = tx.Where("user_id=?", v)
131 } 134 }
@@ -211,8 +211,8 @@ func (repository *UserRepository) FindDepartmentUsers(ctx context.Context, conn @@ -211,8 +211,8 @@ func (repository *UserRepository) FindDepartmentUsers(ctx context.Context, conn
211 total int64 211 total int64
212 ) 212 )
213 queryFunc := func() (interface{}, error) { 213 queryFunc := func() (interface{}, error) {
214 - tx = tx.Model(&ms).Order("id desc")  
215 - tx.Select("id", "name", "departments") 214 + tx = tx.Model(&ms).Order("pin_yin_name asc")
  215 + tx.Select("id", "name", "departments", "pin_yin_name")
216 tx.Where("company_id = ?", companyId) 216 tx.Where("company_id = ?", companyId)
217 tx.Where("audit_status in (?)", domain.UserAuditStatusPassed) 217 tx.Where("audit_status in (?)", domain.UserAuditStatusPassed)
218 tx.Where("enable = ?", domain.UserEnable) 218 tx.Where("enable = ?", domain.UserEnable)
@@ -38,9 +38,9 @@ type ArticleRepository interface { @@ -38,9 +38,9 @@ type ArticleRepository interface {
38 UpdateWithVersion(ctx context.Context, conn transaction.Conn, dm *Article) (*Article, error) 38 UpdateWithVersion(ctx context.Context, conn transaction.Conn, dm *Article) (*Article, error)
39 FindOne(ctx context.Context, conn transaction.Conn, id int64) (*Article, error) 39 FindOne(ctx context.Context, conn transaction.Conn, id int64) (*Article, error)
40 Find(ctx context.Context, conn transaction.Conn, companyId int64, queryOptions map[string]interface{}) (int64, []*Article, error) 40 Find(ctx context.Context, conn transaction.Conn, companyId int64, queryOptions map[string]interface{}) (int64, []*Article, error)
41 - IncreaseCountLove(ctx context.Context, conn transaction.Conn, incr int, dm *Article) error //点赞数量变动  
42 - IncreaseCountComment(ctx context.Context, conn transaction.Conn, incr int, dm *Article) error //评论数量变动  
43 - IncreaseCountRead(ctx context.Context, conn transaction.Conn, incr int, dm *Article) error //浏览数量变动 41 + IncreaseCountLove(ctx context.Context, conn transaction.Conn, incr int, articleId int64) error //点赞数量变动
  42 + IncreaseCountComment(ctx context.Context, conn transaction.Conn, incr int, articleId int64) error //评论数量变动
  43 + IncreaseCountRead(ctx context.Context, conn transaction.Conn, incr int, articleId int64) error //浏览数量变动
44 } 44 }
45 45
46 type ArticleTarget int 46 type ArticleTarget int
  1 +package domain
  2 +
  3 +import (
  4 + "context"
  5 +
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
  7 +)
  8 +
  9 +// 保存文章和标签的关系,主要用于分组统计用
  10 +type ArticleAndTag struct {
  11 + Id int64 `json:"id"`
  12 + CompanyId int64 `json:"companyId"`
  13 + CreatedAt int64 `json:"createdAt"`
  14 + UpdatedAt int64 `json:"updatedAt"`
  15 + ArticleId int64 `json:"articleId"`
  16 + TagId int64 `json:"tagId"`
  17 +}
  18 +
  19 +type ArticleAndTagRepository interface {
  20 + Insert(ctx context.Context, conn transaction.Conn, dm *ArticleAndTag) (*ArticleAndTag, error)
  21 + Update(ctx context.Context, conn transaction.Conn, dm *ArticleAndTag) (*ArticleAndTag, error)
  22 + Delete(ctx context.Context, conn transaction.Conn, dm *ArticleAndTag) (*ArticleAndTag, error)
  23 + FindOne(ctx context.Context, conn transaction.Conn, id int64) (*ArticleAndTag, error)
  24 + Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*ArticleAndTag, error)
  25 +}
@@ -40,6 +40,16 @@ const ( @@ -40,6 +40,16 @@ const (
40 CommentShowDisable CommentShow = 1 40 CommentShowDisable CommentShow = 1
41 ) 41 )
42 42
  43 +func (show CommentShow) Named() string {
  44 + switch show {
  45 + case CommentShowEnable:
  46 + return "显示"
  47 + case CommentShowDisable:
  48 + return "隐藏"
  49 + }
  50 + return ""
  51 +}
  52 +
43 type ArticleCommentRepository interface { 53 type ArticleCommentRepository interface {
44 Insert(ctx context.Context, conn transaction.Conn, dm *ArticleComment) (*ArticleComment, error) 54 Insert(ctx context.Context, conn transaction.Conn, dm *ArticleComment) (*ArticleComment, error)
45 Update(ctx context.Context, conn transaction.Conn, dm *ArticleComment) (*ArticleComment, error) 55 Update(ctx context.Context, conn transaction.Conn, dm *ArticleComment) (*ArticleComment, error)
@@ -47,5 +57,7 @@ type ArticleCommentRepository interface { @@ -47,5 +57,7 @@ type ArticleCommentRepository interface {
47 Delete(ctx context.Context, conn transaction.Conn, dm *ArticleComment) (*ArticleComment, error) 57 Delete(ctx context.Context, conn transaction.Conn, dm *ArticleComment) (*ArticleComment, error)
48 FindOne(ctx context.Context, conn transaction.Conn, id int64) (*ArticleComment, error) 58 FindOne(ctx context.Context, conn transaction.Conn, id int64) (*ArticleComment, error)
49 Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*ArticleComment, error) 59 Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*ArticleComment, error)
50 - IncreaseCountUserLove(ctx context.Context, conn transaction.Conn, incr int, dm *ArticleComment) error //点赞数量变动 60 + IncreaseCountUserLove(ctx context.Context, conn transaction.Conn, incr int, commentId int64) error //点赞数量变动
  61 + IncreaseCountReply(ctx context.Context, conn transaction.Conn, incr int, commentId int64) error // 评论回复数量变动
  62 + Top5Comment(ctx context.Context, conn transaction.Conn, companyId int64, articleId int64) ([]*ArticleComment, error)
51 } 63 }
@@ -28,6 +28,7 @@ type ArticleSectionRepository interface { @@ -28,6 +28,7 @@ type ArticleSectionRepository interface {
28 DeleteBy(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) error 28 DeleteBy(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) error
29 FindOne(ctx context.Context, conn transaction.Conn, id int64) (*ArticleSection, error) 29 FindOne(ctx context.Context, conn transaction.Conn, id int64) (*ArticleSection, error)
30 Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*ArticleSection, error) 30 Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*ArticleSection, error)
  31 + IncreaseCountComment(ctx context.Context, conn transaction.Conn, incr int, sectionId int64) error //评论数量变动
31 } 32 }
32 33
33 // 排序文章分段列表 34 // 排序文章分段列表
@@ -15,10 +15,12 @@ type ArticleTag struct { @@ -15,10 +15,12 @@ type ArticleTag struct {
15 UpdatedAt int64 `json:"updatedAt,omitempty"` 15 UpdatedAt int64 `json:"updatedAt,omitempty"`
16 DeletedAt int64 `json:"deletedAt,omitempty"` 16 DeletedAt int64 `json:"deletedAt,omitempty"`
17 Version int `json:"version,omitempty"` 17 Version int `json:"version,omitempty"`
18 - Image Image `json:"image"` // 图片  
19 - Name string `json:"name"` // 标签名称  
20 - Group string `json:"group"` // 标签分类  
21 - Remark string `json:"remark"` // 备注 18 + Image Image `json:"image"` // 图片
  19 + Name string `json:"name"` // 标签名称
  20 + Category string `json:"category"` // 标签分类 [紧急重要]、[机会风险]
  21 + Remark string `json:"remark"` // 备注
  22 + SortBy int64 `json:"sortBy"` // 顺序
  23 + Other string `json:"other"` //
22 } 24 }
23 type ArticleTagRepository interface { 25 type ArticleTagRepository interface {
24 Insert(ctx context.Context, conn transaction.Conn, dm *ArticleTag) (*ArticleTag, error) 26 Insert(ctx context.Context, conn transaction.Conn, dm *ArticleTag) (*ArticleTag, error)
@@ -13,6 +13,7 @@ type MessageBusiness struct { @@ -13,6 +13,7 @@ type MessageBusiness struct {
13 UserId int64 `json:"userId"` // 操作人用户ID 13 UserId int64 `json:"userId"` // 操作人用户ID
14 RecipientId int64 `json:"recipientId"` // 接收人用户ID 14 RecipientId int64 `json:"recipientId"` // 接收人用户ID
15 ArticleId int64 `json:"articleId"` // 文章ID 15 ArticleId int64 `json:"articleId"` // 文章ID
  16 + SectionId int64 `json:"sectionId"` // 段落ID
16 CommentId int64 `json:"commentId"` // 评论ID 17 CommentId int64 `json:"commentId"` // 评论ID
17 Content string `json:"content"` // 消息内容 18 Content string `json:"content"` // 消息内容
18 CreatedAt int64 `json:",omitempty"` 19 CreatedAt int64 `json:",omitempty"`
  1 +package authlib
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/gateway"
  6 + "net/http"
  7 +)
  8 +
  9 +type ApiAuthService struct {
  10 + gateway.Service
  11 +}
  12 +
  13 +func (svc *ApiAuthService) MeInfo(ctx context.Context, request RequestUserMeQuery) (*DataUserMe, error) {
  14 + var result DataUserMe
  15 + if err := svc.Do(ctx, "/v1/user/me", http.MethodGet, request, &result); err != nil {
  16 + return nil, err
  17 + }
  18 + return &result, nil
  19 +}
  20 +
  21 +func (svc *ApiAuthService) MeAppInfo(ctx context.Context, request RequestUserMeQuery) (*DataUserAppInfo, error) {
  22 + var result DataUserAppInfo
  23 + if err := svc.Do(ctx, "/v1/user/me-app-info", http.MethodGet, request, &result); err != nil {
  24 + return nil, err
  25 + }
  26 + return &result, nil
  27 +}
  28 +
  29 +func (svc *ApiAuthService) LoginCheck(ctx context.Context, request RequestLoginCheck) (*DataLoginCheck, error) {
  30 + var (
  31 + result DataLoginCheck
  32 + err error
  33 + )
  34 + if err = svc.Do(ctx, "/v1/login/check?token="+request.Token, http.MethodGet, request, &result); err != nil {
  35 + return nil, err
  36 + }
  37 + if errCodeMsg, ok := err.(gateway.HttpError); ok {
  38 + return &DataLoginCheck{
  39 + Code: errCodeMsg.Base.Code,
  40 + Msg: errCodeMsg.Base.Msg,
  41 + }, nil
  42 + }
  43 + return &result, nil
  44 +}
  45 +
  46 +func (svc *ApiAuthService) AppLogin(ctx context.Context, request RequestAppLogin) (*DataAppLogin, error) {
  47 + var result DataAppLogin
  48 + if err := svc.Do(ctx, "/v1/login/check?token="+request.Token, http.MethodGet, request, &result); err != nil {
  49 + return nil, err
  50 + }
  51 + return &result, nil
  52 +}
  1 +package authlib
  2 +
  3 +type RequestUserMeQuery struct {
  4 + Token string `header:"x-mmm-accesstoken"`
  5 + //UserId int
  6 + //CompanyId int
  7 +}
  8 +
  9 +type DataUserMe struct {
  10 + User *struct {
  11 + ID string `json:"id"`
  12 + Phone string `json:"phone"`
  13 + NickName string `json:"nickName"`
  14 + Avatar string `json:"avatar"`
  15 + } `json:"user,optional"`
  16 + CompanyList []*struct {
  17 + ID string `json:"id"`
  18 + Name string `json:"name"`
  19 + Logo string `json:"logo"`
  20 + DefaultLogin int `json:"defaultLogin"`
  21 + Types int `json:"types"`
  22 + } `json:"companyList,optional"`
  23 + CurrentCompany *struct {
  24 + ID string `json:"id"`
  25 + Name string `json:"name"`
  26 + Logo string `json:"logo"`
  27 + DefaultLogin int `json:"defaultLogin"`
  28 + Types int `json:"types"`
  29 + } `json:"currentCompany,optional"`
  30 + Workbench []*struct {
  31 + ID int `json:"id"`
  32 + Name string `json:"name"`
  33 + Code string `json:"code"`
  34 + CoverImage string `json:"coverImage"`
  35 + URL string `json:"url"`
  36 + } `json:"workbench,optional"`
  37 + Menus []*struct {
  38 + MenuID int `json:"menuId"`
  39 + ParentID int `json:"parentId"`
  40 + MenuName string `json:"menuName"`
  41 + Code string `json:"code"`
  42 + Types string `json:"types"`
  43 + } `json:"menus,optional"`
  44 +}
  45 +
  46 +type RequestLoginCheck struct {
  47 + Token string
  48 +}
  49 +type DataLoginCheck struct {
  50 + Code int `json:"code,optional"`
  51 + Msg string `json:"msg,optional"`
  52 +}
  53 +
  54 +type (
  55 + RequestAppLogin struct {
  56 + AppKey string `json:"appKey" valid:"Required"` // 应用键值
  57 + Token string `json:"token" valid:"Required"` // 凭证
  58 + }
  59 + DataAppLogin struct {
  60 + AppEnabled bool `json:"appEnabled"`
  61 + }
  62 +)
  63 +
  64 +type (
  65 + DataUserAppInfo struct {
  66 + Apps []AppItem `json:"apps"`
  67 + }
  68 + AppItem struct {
  69 + AppId int64
  70 + AppKey string
  71 + AppName string
  72 + }
  73 +)
  1 +package gateway
  2 +
  3 +import (
  4 + "encoding/json"
  5 + "fmt"
  6 +)
  7 +
  8 +// Response 统一消息返回格式
  9 +type Response struct {
  10 + Code int `json:"code,optional"`
  11 + Msg string `json:"msg,optional"`
  12 + Data json.RawMessage `json:"data,optional"`
  13 +}
  14 +
  15 +//
  16 +//type Request struct {
  17 +// Url string
  18 +// Method string
  19 +// Param interface{}
  20 +//}
  21 +
  22 +type HttpError struct {
  23 + Base Response
  24 +}
  25 +
  26 +func (e HttpError) Error() string {
  27 + return fmt.Sprintf("HttpError code:%d msg:%s", e.Base.Code, e.Base.Msg)
  28 +}
  1 +package gateway
  2 +
  3 +import (
  4 + "context"
  5 + "encoding/json"
  6 + "fmt"
  7 + "github.com/zeromicro/go-zero/core/mapping"
  8 + "github.com/zeromicro/go-zero/rest/httpc"
  9 + "io/ioutil"
  10 + "net/http"
  11 + "strings"
  12 + "time"
  13 +)
  14 +
  15 +type Service struct {
  16 + Timeout time.Duration
  17 + host string
  18 + Interceptor func(msg string)
  19 + ServiceName string
  20 + service httpc.Service
  21 +}
  22 +
  23 +func NewService(name string, host string, timeout time.Duration, opts ...httpc.Option) Service {
  24 + client := &http.Client{}
  25 + //client.Timeout = timeout
  26 +
  27 + service := Service{
  28 + host: host,
  29 + service: httpc.NewServiceWithClient(name, client, opts...),
  30 + }
  31 + return service
  32 +}
  33 +
  34 +func (gateway Service) Do(ctx context.Context, url string, method string, val interface{}, result interface{}) error {
  35 + var (
  36 + baseResponse = Response{}
  37 + begin = time.Now()
  38 + body []byte
  39 + )
  40 + response, err := gateway.service.Do(ctx, method, gateway.host+url, val)
  41 + defer func() {
  42 + jsonParam, _ := json.Marshal(val)
  43 + jsonData, _ := json.Marshal(result)
  44 + if err != nil {
  45 + result = err.Error()
  46 + }
  47 + if gateway.Interceptor != nil {
  48 + gateway.Interceptor(fmt.Sprintf("【网关】%v | %v%v | %v : %v \n-->> %v \n<<-- %v", time.Since(begin), gateway.host, url, strings.ToUpper(method),
  49 + result,
  50 + string(jsonParam),
  51 + string(jsonData),
  52 + ))
  53 + }
  54 + }()
  55 + if err != nil {
  56 + return err
  57 + }
  58 + if response.StatusCode != http.StatusOK {
  59 + return HttpError{
  60 + Base: Response{
  61 + Code: response.StatusCode,
  62 + Msg: response.Status,
  63 + },
  64 + }
  65 + }
  66 + body, err = Bytes(response)
  67 + if err != nil {
  68 + return err
  69 + }
  70 + if err = json.Unmarshal(body, &baseResponse); err != nil {
  71 + return err
  72 + }
  73 + if baseResponse.Code != 0 {
  74 + return HttpError{
  75 + Base: Response{
  76 + Code: baseResponse.Code,
  77 + Msg: baseResponse.Msg,
  78 + },
  79 + }
  80 + }
  81 + if err = mapping.UnmarshalJsonBytes(baseResponse.Data, result); err != nil {
  82 + return err
  83 + }
  84 + return nil
  85 +}
  86 +
  87 +func Bytes(resp *http.Response) ([]byte, error) {
  88 + var body []byte
  89 + if resp.Body == nil {
  90 + return nil, nil
  91 + }
  92 + defer resp.Body.Close()
  93 +
  94 + body, err := ioutil.ReadAll(resp.Body)
  95 + return body, err
  96 +}
  1 +package gateway
  2 +
  3 +import "net/http"
  4 +
  5 +type RequestOptions struct {
  6 + Header http.Header
  7 + // key:form key value:path
  8 + FileMap map[string]string
  9 +}
  10 +
  11 +type Option func(o *RequestOptions)
  12 +
  13 +func WithHeader(header http.Header) Option {
  14 + return func(o *RequestOptions) {
  15 + o.Header = header
  16 + }
  17 +}
  18 +
  19 +func WithFileMap(v map[string]string) Option {
  20 + return func(o *RequestOptions) {
  21 + o.FileMap = v
  22 + }
  23 +}
@@ -9,8 +9,8 @@ import ( @@ -9,8 +9,8 @@ import (
9 ) 9 )
10 10
11 var ( 11 var (
12 - CtxKeyJwtUserId = "UserId"  
13 - CtxKeyJwtCompanyId = "CompanyId" 12 + CtxKeyJwtUserId = "userId"
  13 + CtxKeyJwtCompanyId = "companyId"
14 ) 14 )
15 15
16 func GetInt64FromCtx(ctx context.Context, key string) int64 { 16 func GetInt64FromCtx(ctx context.Context, key string) int64 {
@@ -37,7 +37,7 @@ func HttpResult(r *http.Request, w http.ResponseWriter, resp interface{}, err er @@ -37,7 +37,7 @@ func HttpResult(r *http.Request, w http.ResponseWriter, resp interface{}, err er
37 } 37 }
38 } else { 38 } else {
39 if grpcStatus, ok := status.FromError(causeErr); ok { // grpc err错误 39 if grpcStatus, ok := status.FromError(causeErr); ok { // grpc err错误
40 - grpcCode := uint32(grpcStatus.Code()) 40 + grpcCode := int(grpcStatus.Code())
41 if xerr.IsCodeErr(grpcCode) { 41 if xerr.IsCodeErr(grpcCode) {
42 errCode = grpcCode 42 errCode = grpcCode
43 errMsg = grpcStatus.Message() 43 errMsg = grpcStatus.Message()
@@ -12,11 +12,11 @@ func Success(data interface{}) *ResponseSuccessBean { @@ -12,11 +12,11 @@ func Success(data interface{}) *ResponseSuccessBean {
12 } 12 }
13 13
14 type ResponseErrorBean struct { 14 type ResponseErrorBean struct {
15 - Code uint32 `json:"code"` 15 + Code int `json:"code"`
16 Msg string `json:"msg"` 16 Msg string `json:"msg"`
17 Error string `json:"err"` 17 Error string `json:"err"`
18 } 18 }
19 19
20 -func Error(errCode uint32, errMsg string) *ResponseErrorBean { 20 +func Error(errCode int, errMsg string) *ResponseErrorBean {
21 return &ResponseErrorBean{Code: errCode, Msg: errMsg} 21 return &ResponseErrorBean{Code: errCode, Msg: errMsg}
22 } 22 }
@@ -16,10 +16,10 @@ func (tk UserToken) GenerateToken(secret string, expire int64) (string, error) { @@ -16,10 +16,10 @@ func (tk UserToken) GenerateToken(secret string, expire int64) (string, error) {
16 claims := make(jwt.MapClaims) 16 claims := make(jwt.MapClaims)
17 claims["exp"] = time.Now().Unix() + expire 17 claims["exp"] = time.Now().Unix() + expire
18 claims["iat"] = time.Now().Unix() 18 claims["iat"] = time.Now().Unix()
19 - claims["UserId"] = tk.UserId  
20 - claims["AdminId"] = tk.AdminId  
21 - claims["CompanyId"] = tk.CompanyId  
22 - claims["ClientType"] = tk.ClientType 19 + claims["userId"] = tk.UserId
  20 + claims["adminId"] = tk.AdminId
  21 + claims["companyId"] = tk.CompanyId
  22 + claims["clientType"] = tk.ClientType
23 token := jwt.New(jwt.SigningMethodHS256) 23 token := jwt.New(jwt.SigningMethodHS256)
24 token.Claims = claims 24 token.Claims = claims
25 25
@@ -16,10 +16,10 @@ func NewErrMsgErr(errMsg string, internalError error) *CodeError { @@ -16,10 +16,10 @@ func NewErrMsgErr(errMsg string, internalError error) *CodeError {
16 16
17 /**指定错误码的错误**/ 17 /**指定错误码的错误**/
18 18
19 -func NewCodeErr(errCode uint32, err error) *CodeError { 19 +func NewCodeErr(errCode int, err error) *CodeError {
20 return &CodeError{errCode: errCode, errMsg: MapErrMsg(errCode), InternalError: err} 20 return &CodeError{errCode: errCode, errMsg: MapErrMsg(errCode), InternalError: err}
21 } 21 }
22 22
23 -func NewCodeErrMsg(errCode uint32, err error, msg string) *CodeError { 23 +func NewCodeErrMsg(errCode int, err error, msg string) *CodeError {
24 return &CodeError{errCode: errCode, errMsg: msg, InternalError: err} 24 return &CodeError{errCode: errCode, errMsg: msg, InternalError: err}
25 } 25 }
@@ -4,34 +4,34 @@ import "fmt" @@ -4,34 +4,34 @@ import "fmt"
4 4
5 const ( 5 const (
6 // OK 成功返回 6 // OK 成功返回
7 - OK uint32 = 200 7 + OK int = 200
8 ) 8 )
9 9
10 // 全局错误码 10 // 全局错误码
11 // 系统错误前3位代表业务,后三位代表具体功能 11 // 系统错误前3位代表业务,后三位代表具体功能
12 const ( 12 const (
13 - ServerCommonError uint32 = 100001 // 系统错误  
14 - RequestParamError uint32 = 100002 // 参数请求错误  
15 - TokenExpireError uint32 = 100003 // token失效  
16 - TokenGenerateError uint32 = 100004 // 生成token失败  
17 - DbError uint32 = 100005 // 数据库错误  
18 - DbUpdateAffectedZeroError uint32 = 100006 // 数据库更新错误 13 + ServerCommonError int = 100001 // 系统错误
  14 + RequestParamError int = 100002 // 参数请求错误
  15 + TokenExpireError int = 100003 // token失效
  16 + TokenGenerateError int = 100004 // 生成token失败
  17 + DbError int = 100005 // 数据库错误
  18 + DbUpdateAffectedZeroError int = 100006 // 数据库更新错误
19 ) 19 )
20 20
21 /**微信模块**/ 21 /**微信模块**/
22 const ( 22 const (
23 - ErrWxMiniAuthFailError uint32 = 500001  
24 - ErrUserNoAuth uint32 = 500002 23 + ErrWxMiniAuthFailError int = 500001
  24 + ErrUserNoAuth int = 500002
25 ) 25 )
26 26
27 type CodeError struct { 27 type CodeError struct {
28 - errCode uint32 28 + errCode int
29 errMsg string 29 errMsg string
30 InternalError error 30 InternalError error
31 } 31 }
32 32
33 // GetErrCode 返回给前端的错误码 33 // GetErrCode 返回给前端的错误码
34 -func (e *CodeError) GetErrCode() uint32 { 34 +func (e *CodeError) GetErrCode() int {
35 return e.errCode 35 return e.errCode
36 } 36 }
37 37
1 package xerr 1 package xerr
2 2
3 -var message map[uint32]string 3 +var message map[int]string
4 4
5 func init() { 5 func init() {
6 - message = make(map[uint32]string) 6 + message = make(map[int]string)
7 message[OK] = "SUCCESS" 7 message[OK] = "SUCCESS"
8 message[ServerCommonError] = "服务器开小差啦,稍后再来试一试" 8 message[ServerCommonError] = "服务器开小差啦,稍后再来试一试"
9 message[RequestParamError] = "参数错误" 9 message[RequestParamError] = "参数错误"
@@ -15,7 +15,7 @@ func init() { @@ -15,7 +15,7 @@ func init() {
15 message[ErrWxMiniAuthFailError] = "微信授权失败" 15 message[ErrWxMiniAuthFailError] = "微信授权失败"
16 } 16 }
17 17
18 -func MapErrMsg(errCode uint32) string { 18 +func MapErrMsg(errCode int) string {
19 if msg, ok := message[errCode]; ok { 19 if msg, ok := message[errCode]; ok {
20 return msg 20 return msg
21 } else { 21 } else {
@@ -23,7 +23,7 @@ func MapErrMsg(errCode uint32) string { @@ -23,7 +23,7 @@ func MapErrMsg(errCode uint32) string {
23 } 23 }
24 } 24 }
25 25
26 -func IsCodeErr(errCode uint32) bool { 26 +func IsCodeErr(errCode int) bool {
27 if _, ok := message[errCode]; ok { 27 if _, ok := message[errCode]; ok {
28 return true 28 return true
29 } else { 29 } else {