diff --git a/Yi.BBS.Vue3/package-lock.json b/Yi.BBS.Vue3/package-lock.json
index 1b88bd6c..7ac0aef1 100644
--- a/Yi.BBS.Vue3/package-lock.json
+++ b/Yi.BBS.Vue3/package-lock.json
@@ -10,6 +10,7 @@
"dependencies": {
"@element-plus/icons-vue": "^2.1.0",
"axios": "^1.3.4",
+ "echarts": "^5.4.2",
"element-plus": "^2.2.32",
"highlight": "^0.2.4",
"marked": "^4.2.12",
@@ -1876,6 +1877,15 @@
"node": ">=12"
}
},
+ "node_modules/echarts": {
+ "version": "5.4.2",
+ "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.4.2.tgz",
+ "integrity": "sha512-2W3vw3oI2tWJdyAz+b8DuWS0nfXtSDqlDmqgin/lfzbkB01cuMEN66KWBlmur3YMp5nEDEEt5s23pllnAzB4EA==",
+ "dependencies": {
+ "tslib": "2.3.0",
+ "zrender": "5.4.3"
+ }
+ },
"node_modules/electron-to-chromium": {
"version": "1.4.311",
"resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.311.tgz",
@@ -3366,6 +3376,11 @@
"node": ">=8.0"
}
},
+ "node_modules/tslib": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
+ "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+ },
"node_modules/ufo": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.1.0.tgz",
@@ -3836,6 +3851,14 @@
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/yarm/-/yarm-0.4.0.tgz",
"integrity": "sha512-yCoX5QCA5Upb+VP7/UBuNGBz7MO5oWyc6degv5AifeGnakpaHeNwE/SNOPMefFKpQBionZyUeRdBo63Dl+awDQ=="
+ },
+ "node_modules/zrender": {
+ "version": "5.4.3",
+ "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.4.3.tgz",
+ "integrity": "sha512-DRUM4ZLnoaT0PBVvGBDO9oWIDBKFdAVieNWxWwK0niYzJCMwGchRk21/hsE+RKkIveH3XHCyvXcJDkgLVvfizQ==",
+ "dependencies": {
+ "tslib": "2.3.0"
+ }
}
},
"dependencies": {
@@ -5246,6 +5269,15 @@
"integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==",
"dev": true
},
+ "echarts": {
+ "version": "5.4.2",
+ "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.4.2.tgz",
+ "integrity": "sha512-2W3vw3oI2tWJdyAz+b8DuWS0nfXtSDqlDmqgin/lfzbkB01cuMEN66KWBlmur3YMp5nEDEEt5s23pllnAzB4EA==",
+ "requires": {
+ "tslib": "2.3.0",
+ "zrender": "5.4.3"
+ }
+ },
"electron-to-chromium": {
"version": "1.4.311",
"resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.311.tgz",
@@ -6413,6 +6445,11 @@
"is-number": "^7.0.0"
}
},
+ "tslib": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
+ "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+ },
"ufo": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.1.0.tgz",
@@ -6776,6 +6813,14 @@
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/yarm/-/yarm-0.4.0.tgz",
"integrity": "sha512-yCoX5QCA5Upb+VP7/UBuNGBz7MO5oWyc6degv5AifeGnakpaHeNwE/SNOPMefFKpQBionZyUeRdBo63Dl+awDQ=="
+ },
+ "zrender": {
+ "version": "5.4.3",
+ "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.4.3.tgz",
+ "integrity": "sha512-DRUM4ZLnoaT0PBVvGBDO9oWIDBKFdAVieNWxWwK0niYzJCMwGchRk21/hsE+RKkIveH3XHCyvXcJDkgLVvfizQ==",
+ "requires": {
+ "tslib": "2.3.0"
+ }
}
}
}
diff --git a/Yi.BBS.Vue3/package.json b/Yi.BBS.Vue3/package.json
index 331b5631..fc0b4646 100644
--- a/Yi.BBS.Vue3/package.json
+++ b/Yi.BBS.Vue3/package.json
@@ -10,6 +10,7 @@
"dependencies": {
"@element-plus/icons-vue": "^2.1.0",
"axios": "^1.3.4",
+ "echarts": "^5.4.2",
"element-plus": "^2.2.32",
"highlight": "^0.2.4",
"marked": "^4.2.12",
diff --git a/Yi.BBS.Vue3/src/components/CommentInfo.vue b/Yi.BBS.Vue3/src/components/CommentInfo.vue
index 67c98f99..fc262af8 100644
--- a/Yi.BBS.Vue3/src/components/CommentInfo.vue
+++ b/Yi.BBS.Vue3/src/components/CommentInfo.vue
@@ -14,13 +14,14 @@
{{ discuss.title }}
+@@ -79,9 +82,9 @@ v-hasPer="['bbs:discuss:remove']" @click="delHander(route.params.discussId)">删除 -- 分类: 文章
+ - 分类: 主题
标签:
- 文章
+ 主题
资源
> GetAllAsync([FromRoute] long discussId) { - if (!await _discussRepository.IsAnyAsync(x => x.Id == discussId)) - { - throw new UserFriendlyException(DiscussConst.主题不存在); - } + await _discussService.VerifyDiscussPermissionAsync(discussId); + var entities = await _articleRepository.GetTreeAsync(x => x.DiscussId == discussId); //var result = entities.Tile(); @@ -72,7 +78,8 @@ namespace Yi.BBS.Application.Forum ///
public async override Task CreateAsync(ArticleCreateInputVo input)
{
- if (!await _discussRepository.IsAnyAsync(x => x.Id == input.DiscussId))
+ var discuss = await _discussRepository.GetFirstAsync(x => x.Id == input.DiscussId);
+ if (discuss is null)
{
throw new UserFriendlyException(DiscussConst.主题不存在);
}
@@ -80,7 +87,27 @@ namespace Yi.BBS.Application.Forum
{
throw new UserFriendlyException(ArticleConst.文章不存在);
}
+ await VerifyDiscussCreateIdAsync(discuss.CreatorId);
return await base.CreateAsync(input);
}
+
+
+ ///
+ /// 效验创建权限
+ ///
+ ///
+ ///
+ public async Task VerifyDiscussCreateIdAsync(long? userId)
+ {
+ //只有文章是特殊的,不能在其他主题下创建
+ //主题的创建者不是当前用户,同时,没有权限或者超级管理
+
+ //false & true & false ,三个条件任意满意一个,即可成功使用||,最后取反,一个都不满足
+ //
+ if (userId != _currentUser.Id && !UserConst.Admin.Equals( _currentUser.UserName)&& !_currentUser.Permission.Contains("bbs:discuss:add"))
+ {
+ throw new UserFriendlyException("无权限在其他用户主题中创建子文章");
+ }
+ }
}
}
diff --git a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/CommentService.cs b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/CommentService.cs
index f47fec52..6dd7b8cc 100644
--- a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/CommentService.cs
+++ b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/CommentService.cs
@@ -34,7 +34,8 @@ namespace Yi.BBS.Application.Forum
[Autowired]
private IRepository _discussRepository { get; set; }
-
+ [Autowired]
+ private IDiscussService _discussService { get; set; }
///
/// 获取改主题下的评论,结构为二维列表,该查询无分页
///
@@ -43,6 +44,7 @@ namespace Yi.BBS.Application.Forum
///
public async Task> GetDiscussIdAsync([FromRoute] long discussId, [FromQuery] CommentGetListInputVo input)
{
+ await _discussService.VerifyDiscussPermissionAsync(discussId);
var entities = await _DbQueryable.WhereIF(!string.IsNullOrEmpty(input.Content), x => x.Content.Contains(input.Content))
.Where(x => x.DiscussId == discussId)
diff --git a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/DiscussService.cs b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/DiscussService.cs
index 9bb79847..4e1d1a84 100644
--- a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/DiscussService.cs
+++ b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/DiscussService.cs
@@ -29,6 +29,10 @@ namespace Yi.BBS.Application.Forum
public class DiscussService : CrudAppService,
IDiscussService, IAutoApiService
{
+ public DiscussService(ICurrentUser currentUser)
+ {
+ _currentUser = currentUser;
+ }
[Autowired]
private ForumManager _forumManager { get; set; }
@@ -38,7 +42,7 @@ namespace Yi.BBS.Application.Forum
[Autowired]
private IDistributedEventBus _distributedEventBus { get; set; }
- [Autowired]
+ //[Autowired]
private ICurrentUser _currentUser { get; set; }
///
/// 单查
@@ -47,12 +51,16 @@ namespace Yi.BBS.Application.Forum
///
public async override Task GetAsync(long id)
{
+
//查询主题发布 浏览主题 事件,浏览数+1
var item = await _DbQueryable.LeftJoin((discuss, user) => discuss.CreatorId == user.Id)
.Select((discuss, user) => new DiscussGetOutputDto
{
User = new UserGetListOutputDto() { UserName = user.UserName, Nick = user.Nick, Icon = user.Icon }
}, true).SingleAsync(discuss => discuss.Id == id);
+
+ await VerifyDiscussPermissionAsync(item.Id);
+
if (item is not null)
{
_distributedEventBus.PublishAsync(new SeeDiscussEventArgs { DiscussId = item.Id, OldSeeNum = item.SeeNum });
@@ -84,9 +92,14 @@ namespace Yi.BBS.Application.Forum
{
Id=discuss.Id,
IsAgree = SqlFunc.Subqueryable().Where(x => x.CreatorId == _currentUser.Id && x.DiscussId == discuss.Id).Any(),
- User = new UserGetListOutputDto() { UserName = user.UserName, Nick = user.Nick, Icon = user.Icon }
+
+ User = new UserGetListOutputDto() { Id=user.Id, UserName = user.UserName, Nick = user.Nick, Icon = user.Icon }
+
}, true)
.ToPageListAsync(input.PageNum, input.PageSize, total);
+
+ //查询完主题之后,要过滤一下私有的主题信息
+ items.ApplyPermissionTypeFilter(_currentUser.Id);
return new PagedResultDto(total, items);
}
@@ -101,8 +114,33 @@ namespace Yi.BBS.Application.Forum
{
throw new UserFriendlyException(PlateConst.板块不存在);
}
- var entity = await _forumManager.CreateDiscussAsync(input.plateId, input.Title, input.Types, input.Content, input.Introduction);
+ var entity = await _forumManager.CreateDiscussAsync(await MapToEntityAsync(input));
return await MapToGetOutputDtoAsync(entity);
}
+
+
+
+
+ ///
+ /// 效验主题查询权限
+ ///
+ ///
+ ///
+ ///
+ public async Task VerifyDiscussPermissionAsync(long discussId)
+ {
+ var discuss = await _repository.GetFirstAsync(x => x.Id == discussId);
+ if (discuss is null)
+ {
+ throw new UserFriendlyException(DiscussConst.主题不存在);
+ }
+ if (discuss.PermissionType == DiscussPermissionTypeEnum.Oneself)
+ {
+ if (discuss.CreatorId != _currentUser.Id)
+ {
+ throw new UserFriendlyException(DiscussConst.私密);
+ }
+ }
+ }
}
}
diff --git a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Domain.Shared/Forum/ConstClasses/ArticleConst.cs b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Domain.Shared/Forum/ConstClasses/ArticleConst.cs
index b44ef841..2f676c81 100644
--- a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Domain.Shared/Forum/ConstClasses/ArticleConst.cs
+++ b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Domain.Shared/Forum/ConstClasses/ArticleConst.cs
@@ -13,5 +13,7 @@ namespace Yi.BBS.Domain.Shared.Forum.ConstClasses
public class ArticleConst
{
public const string 文章不存在 = "传入的文章id不存在";
+
+ public const string 文章无权限 = "该文章无权限";
}
}
diff --git a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Domain.Shared/Forum/ConstClasses/DiscussConst.cs b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Domain.Shared/Forum/ConstClasses/DiscussConst.cs
index ca1b491b..99c57c46 100644
--- a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Domain.Shared/Forum/ConstClasses/DiscussConst.cs
+++ b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Domain.Shared/Forum/ConstClasses/DiscussConst.cs
@@ -13,5 +13,7 @@ namespace Yi.BBS.Domain.Shared.Forum.ConstClasses
public class DiscussConst
{
public const string 主题不存在 = "传入的主题id不存在";
+
+ public const string 私密 = "【私密】您无该主题权限";
}
}
diff --git a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Domain/DataSeeds/BbsMenuDataSeed.cs b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Domain/DataSeeds/BbsMenuDataSeed.cs
index 055cd097..381192ca 100644
--- a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Domain/DataSeeds/BbsMenuDataSeed.cs
+++ b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Domain/DataSeeds/BbsMenuDataSeed.cs
@@ -24,6 +24,7 @@ namespace Yi.BBS.Domain.DataSeed
public override List GetSeedData()
{
List entities = new List();
+
//BBS
MenuEntity bbs = new MenuEntity()
{
@@ -39,6 +40,76 @@ namespace Yi.BBS.Domain.DataSeed
IsDeleted = false
};
entities.Add(bbs);
+
+
+ //评论管理
+ MenuEntity comment = new MenuEntity()
+ {
+ Id = SnowflakeHelper.NextId,
+ MenuName = "评论管理",
+ PermissionCode = "bbs:comment:list",
+ MenuType = MenuTypeEnum.Menu,
+ Router = "comment",
+ IsShow = true,
+ IsLink = false,
+ IsCache = true,
+ Component = "bbs/comment/index",
+ MenuIcon = "education",
+ OrderNum = 100,
+ ParentId = bbs.Id,
+ IsDeleted = false
+ };
+ entities.Add(comment);
+
+ MenuEntity commentQuery = new MenuEntity()
+ {
+ Id = SnowflakeHelper.NextId,
+ MenuName = "评论查询",
+ PermissionCode = "bbs:comment:query",
+ MenuType = MenuTypeEnum.Component,
+ OrderNum = 100,
+ ParentId = comment.Id,
+ IsDeleted = false
+ };
+ entities.Add(commentQuery);
+
+ MenuEntity commentAdd = new MenuEntity()
+ {
+ Id = SnowflakeHelper.NextId,
+ MenuName = "评论新增",
+ PermissionCode = "bbs:comment:add",
+ MenuType = MenuTypeEnum.Component,
+ OrderNum = 100,
+ ParentId = comment.Id,
+ IsDeleted = false
+ };
+ entities.Add(commentAdd);
+
+ MenuEntity commentEdit = new MenuEntity()
+ {
+ Id = SnowflakeHelper.NextId,
+ MenuName = "评论修改",
+ PermissionCode = "bbs:comment:edit",
+ MenuType = MenuTypeEnum.Component,
+ OrderNum = 100,
+ ParentId = comment.Id,
+ IsDeleted = false
+ };
+ entities.Add(commentEdit);
+
+ MenuEntity commentRemove = new MenuEntity()
+ {
+ Id = SnowflakeHelper.NextId,
+ MenuName = "评论删除",
+ PermissionCode = "bbs:comment:remove",
+ MenuType = MenuTypeEnum.Component,
+ OrderNum = 100,
+ ParentId = comment.Id,
+ IsDeleted = false
+ };
+ entities.Add(commentRemove);
+
+
//文章管理
MenuEntity article = new MenuEntity()
{
diff --git a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Domain/DomainSwaggerDoc.xml b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Domain/DomainSwaggerDoc.xml
index fc516425..7331f9e1 100644
--- a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Domain/DomainSwaggerDoc.xml
+++ b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Domain/DomainSwaggerDoc.xml
@@ -46,6 +46,11 @@
被评论的用户信息