feat:完成点赞功能

This commit is contained in:
橙子
2023-03-20 23:43:49 +08:00
parent b3b3ca3fe4
commit 2d31aeecd1
14 changed files with 238 additions and 11 deletions

View File

@@ -0,0 +1,11 @@
import myaxios from '@/utils/request'
export function operate(discussId){
if(discussId==undefined)
{
return;
}
return myaxios({
url: `/agree/operate/${discussId}`,
method: 'post'
})
};

View File

@@ -19,8 +19,8 @@
</div> </div>
<el-button icon="Pointer" text> <el-button icon="Pointer" text @click="agree">
点赞</el-button> 点赞:{{ agreeNum??0 }}</el-button>
<el-button icon="Star" text> <el-button icon="Star" text>
收藏</el-button> 收藏</el-button>
@@ -34,17 +34,38 @@
</el-badge> </el-badge>
</template> </template>
<script setup> <script setup>
import { h, ref } from 'vue' import { h, ref ,toRef,onMounted} from 'vue'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import AvatarInfo from './AvatarInfo.vue'; import AvatarInfo from './AvatarInfo.vue';
import {operate} from '@/apis/agreeApi'
const props = defineProps(['title','introduction','creationTime','id','user','badge',"color","seeNum"]) const props = defineProps(['title','introduction','creationTime','id','user','badge',"color","seeNum","agreeNum"])
const router = useRouter() const router = useRouter()
const spacer = h(ElDivider, { direction: 'vertical' }) const spacer = h(ElDivider, { direction: 'vertical' })
const enterDiscuss = (id) => { const enterDiscuss = (id) => {
router.push(`/article/${id}`) router.push(`/article/${id}`)
} }
const agreeNum=ref(0)
//点赞操作
const agree=async ()=>{
const response= await operate(props.id)
const res=response.data;
//提示框,颜色区分
if(res.isArgee)
{
agreeNum.value+=1;
alert(res.message)
}
else
{
agreeNum.value-=1;
alert(res.message)
}
}
onMounted(()=>{
agreeNum.value=props.agreeNum;
})
</script> </script>
<style scoped> <style scoped>
.el-card{ .el-card{

View File

@@ -58,14 +58,14 @@
</div> </div>
</template> </template>
<div class="div-item" v-for="i in topDiscussList" > <div class="div-item" v-for="i in topDiscussList" >
<DisscussCard :title="i.title" :introduction="i.introduction" :creationTime="i.creationTime" :id="i.id" :user="i.user" :color="i.color" :seeNum="i.seeNum" badge="置顶"/> <DisscussCard :title="i.title" :introduction="i.introduction" :creationTime="i.creationTime" :agreeNum="i.agreeNum" :id="i.id" :user="i.user" :color="i.color" :seeNum="i.seeNum" badge="置顶"/>
</div> </div>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
<el-divider v-show="topDiscussList.length>0" /> <el-divider v-show="topDiscussList.length>0" />
<div class="div-item" v-for="i in discussList" > <div class="div-item" v-for="i in discussList" >
<DisscussCard :title="i.title" :introduction="i.introduction" :creationTime="i.creationTime" :id="i.id" :color="i.color" :seeNum="i.seeNum" :user="i.user"/> <DisscussCard :title="i.title" :introduction="i.introduction" :creationTime="i.creationTime" :agreeNum="i.agreeNum" :id="i.id" :color="i.color" :seeNum="i.seeNum" :user="i.user"/>
</div> </div>
<div> <div>
<el-pagination <el-pagination

View File

@@ -14,7 +14,7 @@
</el-col> </el-col>
<el-col :span="24" v-for="i in discussList"> <el-col :span="24" v-for="i in discussList">
<DisscussCard :title="i.title" :introduction="i.introduction" :creationTime="i.creationTime" :id="i.id" :user="i.user" :seeNum="i.seeNum"/> <DisscussCard :title="i.title" :introduction="i.introduction" :creationTime="i.creationTime" :agreeNum="i.agreeNum" :id="i.id" :user="i.user" :seeNum="i.seeNum"/>
</el-col> </el-col>
</el-row> </el-row>

View File

@@ -20,10 +20,12 @@ TemplateFactory templateFactory = new();
//string modelName = "Dictionary"; //string modelName = "Dictionary";
//string nameSpaces = "Yi.RBAC"; //string nameSpaces = "Yi.RBAC";
//List<string> entityNames = new() { "_", "_" }; //List<string> entityNames = new() { "_", "_" };
string modelName = "Setting"; //string modelName = "Setting";
string nameSpaces = "Yi.RBAC"; //string nameSpaces = "Yi.RBAC";
List<string> entityNames = new() { "File" }; //List<string> entityNames = new() { "File" };
string modelName = "Exhibition";
string nameSpaces = "Yi.BBS";
List<string> entityNames = new() { "Agree" };
foreach (var entityName in entityNames) foreach (var entityName in entityNames)
{ {

View File

@@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.BBS.Application.Contracts.Exhibition.Dtos.Argee
{
public class ArgeeDto
{
public ArgeeDto(bool isArgee)
{
IsArgee = isArgee;
if (isArgee)
{
Message = "点赞成功,点赞+1";
}
else
{
Message = "取消点赞,点赞-1";
}
}
public bool IsArgee { get; set; }
public string Message { get; set; }
}
}

View File

@@ -4,6 +4,17 @@
<name>Yi.BBS.Application</name> <name>Yi.BBS.Application</name>
</assembly> </assembly>
<members> <members>
<member name="T:Yi.BBS.Application.Exhibition.AgreeService">
<summary>
点赞功能
</summary>
</member>
<member name="M:Yi.BBS.Application.Exhibition.AgreeService.PostOperateAsync(System.Int64)">
<summary>
点赞,返回true为点赞+1返回false为点赞-1
</summary>
<returns></returns>
</member>
<member name="T:Yi.BBS.Application.Exhibition.BannerService"> <member name="T:Yi.BBS.Application.Exhibition.BannerService">
<summary> <summary>
Banner服务实现 Banner服务实现

View File

@@ -0,0 +1,82 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Cike.AutoWebApi.Setting;
using Yi.BBS.Application.Contracts.Exhibition.Dtos.Argee;
using Yi.BBS.Domain.Exhibition.Entities;
using Yi.BBS.Domain.Forum.Entities;
using Yi.Framework.Core.CurrentUsers;
using Yi.Framework.Ddd.Repositories;
using Yi.Framework.Ddd.Services;
using Yi.Framework.Ddd.Services.Abstract;
using Yi.Framework.Uow;
namespace Yi.BBS.Application.Exhibition
{
/// <summary>
/// 点赞功能
/// </summary>
[AppService]
public class AgreeService : ApplicationService, IApplicationService, IAutoApiService
{
[Autowired]
private IRepository<AgreeEntity> _repository { get; set; }
[Autowired]
private IRepository<DiscussEntity> _discssRepository { get; set; }
[Autowired]
private ICurrentUser _currentUser { get; set; }
[Autowired]
private IUnitOfWorkManager _unitOfWorkManager { get; set; }
/// <summary>
/// 点赞,返回true为点赞+1返回false为点赞-1
/// </summary>
/// <returns></returns>
public async Task<ArgeeDto> PostOperateAsync(long discussId)
{
var entity = await _repository.GetFirstAsync(x => x.DiscussId == discussId && x.CreatorId == _currentUser.Id);
//判断是否已经点赞过
if (entity is null)
{
using (var uow = _unitOfWorkManager.CreateContext())
{
//没点赞过,添加记录即可,,修改总点赞数量
await _repository.InsertAsync(new AgreeEntity(discussId));
var discussEntity = await _discssRepository.GetByIdAsync(discussId);
if (discussEntity is null)
{
throw new UserFriendlyException("主题为空");
}
discussEntity.AgreeNum += 1;
await _discssRepository.UpdateAsync(discussEntity);
uow.Commit();
}
return new ArgeeDto(true);
}
else
{
using (var uow = _unitOfWorkManager.CreateContext())
{
//点赞过,删除即可,修改总点赞数量
await _repository.DeleteByIdAsync(entity.Id);
var discussEntity = await _discssRepository.GetByIdAsync(discussId);
if (discussEntity is null)
{
throw new UserFriendlyException("主题为空");
}
discussEntity.AgreeNum -= 1;
await _discssRepository.UpdateAsync(discussEntity);
uow.Commit();
}
return new ArgeeDto(false);
}
}
}
}

View File

@@ -4,6 +4,16 @@
<name>Yi.BBS.Domain</name> <name>Yi.BBS.Domain</name>
</assembly> </assembly>
<members> <members>
<member name="P:Yi.BBS.Domain.Exhibition.Entities.AgreeEntity.DiscussId">
<summary>
主题id
</summary>
</member>
<member name="P:Yi.BBS.Domain.Exhibition.Entities.AgreeEntity.CreatorId">
<summary>
创建者
</summary>
</member>
<member name="M:Yi.BBS.Domain.Forum.Entities.ArticleEntityExtensions.Tile(System.Collections.Generic.List{Yi.BBS.Domain.Forum.Entities.ArticleEntity})"> <member name="M:Yi.BBS.Domain.Forum.Entities.ArticleEntityExtensions.Tile(System.Collections.Generic.List{Yi.BBS.Domain.Forum.Entities.ArticleEntity})">
<summary> <summary>
平铺自己 平铺自己

View File

@@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SqlSugar;
using Yi.Framework.Data.Auditing;
using Yi.Framework.Data.Entities;
using Yi.Framework.Ddd.Entities;
namespace Yi.BBS.Domain.Exhibition.Entities
{
[SugarTable("Agree")]
public class AgreeEntity : IEntity<long>, ICreationAuditedObject
{
public AgreeEntity()
{
}
public AgreeEntity(long discussId)
{
DiscussId = discussId;
}
[SugarColumn(IsPrimaryKey = true)]
public long Id { get; set; } = SnowflakeHelper.NextId;
public DateTime CreationTime { get; set; }
/// <summary>
/// 主题id
/// </summary>
public long DiscussId { get; set; }
/// <summary>
/// 创建者
/// </summary>
public long? CreatorId { get; set; }
}
}

View File

@@ -4,6 +4,17 @@
<name>Yi.BBS.Application</name> <name>Yi.BBS.Application</name>
</assembly> </assembly>
<members> <members>
<member name="T:Yi.BBS.Application.Exhibition.AgreeService">
<summary>
点赞功能
</summary>
</member>
<member name="M:Yi.BBS.Application.Exhibition.AgreeService.PostOperateAsync(System.Int64)">
<summary>
点赞,返回true为点赞+1返回false为点赞-1
</summary>
<returns></returns>
</member>
<member name="T:Yi.BBS.Application.Exhibition.BannerService"> <member name="T:Yi.BBS.Application.Exhibition.BannerService">
<summary> <summary>
Banner服务实现 Banner服务实现

View File

@@ -4,6 +4,16 @@
<name>Yi.BBS.Domain</name> <name>Yi.BBS.Domain</name>
</assembly> </assembly>
<members> <members>
<member name="P:Yi.BBS.Domain.Exhibition.Entities.AgreeEntity.DiscussId">
<summary>
主题id
</summary>
</member>
<member name="P:Yi.BBS.Domain.Exhibition.Entities.AgreeEntity.CreatorId">
<summary>
创建者
</summary>
</member>
<member name="M:Yi.BBS.Domain.Forum.Entities.ArticleEntityExtensions.Tile(System.Collections.Generic.List{Yi.BBS.Domain.Forum.Entities.ArticleEntity})"> <member name="M:Yi.BBS.Domain.Forum.Entities.ArticleEntityExtensions.Tile(System.Collections.Generic.List{Yi.BBS.Domain.Forum.Entities.ArticleEntity})">
<summary> <summary>
平铺自己 平铺自己