feat:完成权限相关、全局配置、优化细节

This commit is contained in:
橙子
2023-03-26 16:22:49 +08:00
parent b6f4cbfb4f
commit e5460ae3cc
55 changed files with 386 additions and 51 deletions

View File

@@ -7,10 +7,21 @@
</el-config-provider> </el-config-provider>
</template> </template>
<script setup> <script setup>
import { ElConfigProvider } from 'element-plus' import useConfigStore from "@/stores/config";
import { ElConfigProvider } from 'element-plus'
import {onMounted } from "vue";
import zhCn from 'element-plus/dist/locale/zh-cn.mjs' import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
const locale= zhCn; const locale= zhCn;
const configStore = useConfigStore();
//加载全局信息
onMounted(async()=>{
await configStore.getConfig();
})
</script> </script>
<style scoped> <style scoped>

View File

@@ -0,0 +1,9 @@
import myaxios from '@/utils/request'
//获取配置
export function getAll(){
return myaxios({
url: '/config',
method: 'get'
})
};

View File

@@ -0,0 +1,55 @@
<template>
<el-button text @click="agree">
<el-icon v-if="data.isAgree" color="#409EFF">
<CircleCheckFilled />
</el-icon>
<el-icon v-else color="#1E1E1E">
<Pointer />
</el-icon> 点赞:{{ data.agreeNum ?? 0 }}</el-button>
</template>
<script setup>
import {onMounted,reactive,watch} from 'vue'
import { operate } from '@/apis/agreeApi'
//'isAgree','agreeNum','id'
const props = defineProps([ 'data'])
watch(()=>props,(n)=>{
data.id=n.data.id;
data.isAgree=n.data.isAgree;
data.agreeNum=n.data.agreeNum;
},{deep:true})
const data=reactive({
id:'',
isAgree:false,
agreeNum:0
})
// onMounted(()=>{
// })
//点赞操作
const agree = async () => {
const response = await operate(data.id)
const res = response.data;
//提示框,颜色区分
if (res.isAgree) {
data.isAgree = true;
data.agreeNum += 1;
ElMessage({
message: res.message,
type: 'success',
})
}
else {
data.isAgree = false;
data.agreeNum-= 1;
ElMessage({
message: res.message,
type: 'warning',
})
}
}
</script>

View File

@@ -1,14 +1,16 @@
<template> <template>
<div class="botton-div"> <div class="botton-div">
<a><el-icon><UserFilled /></el-icon>站长橙子</a> <a><el-icon><UserFilled /></el-icon>站长{{configStore.author}}</a>
<a><el-icon><Search /></el-icon>YiFramework意框架</a> <a><el-icon><Search /></el-icon>{{configStore.bottom}}</a>
<a><el-icon><View /></el-icon>关于本站</a> <a><el-icon><View /></el-icon>关于本站</a>
<a><el-icon><Message /></el-icon>建议反馈</a> <a><el-icon><Message /></el-icon>建议反馈</a>
<p></p> <p></p>
<a><el-icon><Position /></el-icon>2023 <span style="color: #40a9ff ;">意社区</span> | 赣ICP备xxxxxx号-4</a> <a ><el-icon><Position /></el-icon>{{configStore.icp}}</a>
</div> </div>
</template> </template>
<script setup> <script setup>
import useConfigStore from "@/stores/config";
const configStore= useConfigStore();
</script> </script>
<style scoped> <style scoped>
.el-icon .el-icon
@@ -31,6 +33,6 @@ a:hover {
height: auto; height: auto;
width: auto; width: auto;
justify-content: center; justify-content: center;
margin: 1rem auto; margin: 0.5rem auto;
} }
</style> </style>

View File

@@ -41,8 +41,8 @@
<div class="item-description"> <div class="item-description">
{{ discuss.creationTime }} {{ discuss.creationTime }}
</div> </div>
<AgreeInfo :data="discuss"/>
<!--
<el-button text @click="agree"> <el-button text @click="agree">
<el-icon v-if="discuss.isAgree" color="#409EFF"> <el-icon v-if="discuss.isAgree" color="#409EFF">
<CircleCheckFilled /> <CircleCheckFilled />
@@ -51,7 +51,7 @@
<Pointer /> <Pointer />
</el-icon> 点赞:{{ discuss.agreeNum ?? 0 }}</el-button> </el-icon> 点赞:{{ discuss.agreeNum ?? 0 }}</el-button>
<el-button icon="Star" text> <el-button icon="Star" text>
收藏</el-button> 收藏</el-button> -->
<el-button icon="View" text> <el-button icon="View" text>
浏览数:{{ discuss.seeNum ?? 0 }}</el-button> 浏览数:{{ discuss.seeNum ?? 0 }}</el-button>
@@ -69,6 +69,7 @@
import { h, ref, toRef, onMounted ,reactive} from 'vue' import { h, ref, toRef, onMounted ,reactive} from 'vue'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import AvatarInfo from './AvatarInfo.vue'; import AvatarInfo from './AvatarInfo.vue';
import AgreeInfo from './AgreeInfo.vue'
import { operate } from '@/apis/agreeApi' import { operate } from '@/apis/agreeApi'
const props = defineProps(['discuss','badge']) const props = defineProps(['discuss','badge'])

View File

@@ -0,0 +1,129 @@
<template>
<el-select
style="width: 600px;"
v-model="value"
multiple
filterable
remote
reserve-keyword
placeholder="请输入用户账号(可多选)"
remote-show-suffix
:remote-method="remoteMethod"
:loading="loading"
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</template>
<script setup>
import { onMounted, ref,computed } from 'vue'
import {listUser} from '@/apis/userApi'
const props = defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])
//这个为可选择的列表,{value,label},value为用户idlabel为账号名称不可重复
const options = ref([])
const value = computed({
get() {
return props.modelValue
},
set(value) {
emit('update:modelValue', value)
}
})
const loading = ref(false)
onMounted( async()=>{
const response= await listUser({ids:value.value.join()});
const res=response.data.items;
//下拉列表
options.value = res
.map((item) => {
return { value: `${item.id}`, label: `用户:${item.userName}` }
})
})
const loadUser=async(query)=>{
const response= await listUser({userName:query});
const res=response.data.items;
//下拉列表
options.value = res
.map((item) => {
return { value: `${item.id}`, label: `用户:${item.userName}` }
})
}
const remoteMethod =async (query) => {
if (query) {
loading.value = true
await loadUser(query);
loading.value = false
} else {
options.value = []
}
}
const states = [
'Alabama',
'Alaska',
'Arizona',
'Arkansas',
'California',
'Colorado',
'Connecticut',
'Delaware',
'Florida',
'Georgia',
'Hawaii',
'Idaho',
'Illinois',
'Indiana',
'Iowa',
'Kansas',
'Kentucky',
'Louisiana',
'Maine',
'Maryland',
'Massachusetts',
'Michigan',
'Minnesota',
'Mississippi',
'Missouri',
'Montana',
'Nebraska',
'Nevada',
'New Hampshire',
'New Jersey',
'New Mexico',
'New York',
'North Carolina',
'North Dakota',
'Ohio',
'Oklahoma',
'Oregon',
'Pennsylvania',
'Rhode Island',
'South Carolina',
'South Dakota',
'Tennessee',
'Texas',
'Utah',
'Vermont',
'Virginia',
'Washington',
'West Virginia',
'Wisconsin',
'Wyoming',
]
</script>

View File

@@ -8,7 +8,7 @@
> >
<el-menu-item class="logo" index="" @click="enterIndex" > <el-menu-item class="logo" index="" @click="enterIndex" >
<img class="img-icon" style="width: 35px; height: 35px" src="@/assets/logo.ico" />Yi意社区</el-menu-item> <img class="img-icon" style="width: 35px; height: 35px" src="@/assets/logo.ico" />{{configStore.name}}</el-menu-item>
<el-menu-item index="1" @click="enterIndex">主页</el-menu-item> <el-menu-item index="1" @click="enterIndex">主页</el-menu-item>
<el-sub-menu index="2"> <el-sub-menu index="2">
<template #title>学习</template> <template #title>学习</template>
@@ -56,6 +56,8 @@ import AvatarInfo from '@/components/AvatarInfo.vue'
import { ref } from 'vue' import { ref } from 'vue'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import useUserStore from '@/stores/user.js' import useUserStore from '@/stores/user.js'
import useConfigStore from "@/stores/config";
const configStore= useConfigStore();
const router = useRouter() const router = useRouter()
const userStore =useUserStore(); const userStore =useUserStore();
const activeIndex = ref('1') const activeIndex = ref('1')

View File

@@ -0,0 +1,22 @@
import {getAll} from '@/apis/configApi'
import { defineStore } from 'pinia'
const useConfigStore = defineStore('config',
{
state: () => ({
data: []
}),
getters: {
name:(state)=>state.data.filter(s=> s.configKey=='bbs.site.name').map(x=>x.configValue)[0],
author:(state)=>state.data.filter(s=> s.configKey=='bbs.site.author').map(x=>x.configValue)[0],
icp:(state)=>state.data.filter(s=> s.configKey=='bbs.site.icp').map(x=>x.configValue)[0],
bottom:(state)=>state.data.filter(s=>s.configKey=='bbs.site.bottom').map(x=>x.configValue)[0]
},
actions: {
// 登录
async getConfig() {
const response = await getAll();
this.data = response.data.items;
},
},
})
export default useConfigStore;

View File

@@ -20,11 +20,15 @@ const myaxios = axios.create({
// } // }
// }], // }],
}) })
// 请求拦截器 // 请求拦截器
myaxios.interceptors.request.use(function (config) { myaxios.interceptors.request.use(function (config) {
if (getToken()) { if (getToken()) {
config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改 config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
} }
return config; return config;
}, function (error) { }, function (error) {
return Promise.reject(error); return Promise.reject(error);

View File

@@ -49,7 +49,7 @@
<el-divider class="tab-divider" /> <el-divider class="tab-divider" />
<el-space :size="10" :spacer="spacer"> <el-space :size="10" :spacer="spacer">
<el-button icon="Pointer" text> 4</el-button> <AgreeInfo :data="discuss"/>
<el-button icon="Star" text> 0</el-button> <el-button icon="Star" text> 0</el-button>
<el-button icon="Share" text> 分享</el-button> <el-button icon="Share" text> 分享</el-button>
<el-button icon="Operation" text> 操作</el-button> <el-button icon="Operation" text> 操作</el-button>
@@ -134,7 +134,7 @@ import CommentInfo from "@/components/CommentInfo.vue";
import BottomInfo from '@/components/BottomInfo.vue' import BottomInfo from '@/components/BottomInfo.vue'
import TreeArticleInfo from "@/components/TreeArticleInfo.vue"; import TreeArticleInfo from "@/components/TreeArticleInfo.vue";
import { useRoute, useRouter } from "vue-router"; import { useRoute, useRouter } from "vue-router";
import AgreeInfo from '@/components/AgreeInfo.vue'
import { get as discussGet, del as discussDel } from "@/apis/discussApi.js"; import { get as discussGet, del as discussDel } from "@/apis/discussApi.js";
import { all as articleall, del as articleDel, get as articleGet } from "@/apis/articleApi.js"; import { all as articleall, del as articleDel, get as articleGet } from "@/apis/articleApi.js";
//数据定义 //数据定义

View File

@@ -213,4 +213,9 @@ display: flex;
.collapse-list >>> .el-collapse-item__header { .collapse-list >>> .el-collapse-item__header {
border-bottom-color: #F0F2F5 !important; border-bottom-color: #F0F2F5 !important;
} }
.el-divider
{
margin: 0.5rem 0;
}
</style> </style>

View File

@@ -18,6 +18,10 @@
<el-radio-button label="User">部分用户可见</el-radio-button> <el-radio-button label="User">部分用户可见</el-radio-button>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="可见用户:" v-if="route.query.artType == 'discuss' && perRadio=='User'">
<UserSelectInfo v-model="editForm.permissionUserIds"/>
</el-form-item>
<el-form-item v-if="route.query.artType == 'article'" label="子文章名称:" prop="name"> <el-form-item v-if="route.query.artType == 'article'" label="子文章名称:" prop="name">
@@ -59,6 +63,7 @@
</template> </template>
<script setup> <script setup>
import MavonEdit from "@/components/MavonEdit.vue"; import MavonEdit from "@/components/MavonEdit.vue";
import UserSelectInfo from '@/components/UserSelectInfo.vue'
import { ref, reactive, onMounted } from "vue"; import { ref, reactive, onMounted } from "vue";
import { useRoute, useRouter } from "vue-router"; import { useRoute, useRouter } from "vue-router";
@@ -103,6 +108,7 @@ const editForm = reactive({
introduction: "", introduction: "",
content: "", content: "",
name: "", name: "",
permissionUserIds:[]
}); });
//组装主题内容: 需要更新主题信息 //组装主题内容: 需要更新主题信息
@@ -145,6 +151,8 @@ const submit = async (formEl) => {
discuss.plateId = discuss.plateId ?? route.query.plateId discuss.plateId = discuss.plateId ?? route.query.plateId
discuss.cover=dialogImageUrl.value; discuss.cover=dialogImageUrl.value;
discuss.permissionType=perRadio.value; discuss.permissionType=perRadio.value;
discuss.permissionUserIds=editForm.permissionUserIds;
//主题创建 //主题创建
if (route.query.operType == "create") { if (route.query.operType == "create") {
const response = await discussAdd(discuss); const response = await discussAdd(discuss);
@@ -231,6 +239,7 @@ const loadDiscuss = async () => {
discuss.plateId = res.plateId; discuss.plateId = res.plateId;
dialogImageUrl.value= res.cover; dialogImageUrl.value= res.cover;
perRadio.value=res.permissionType; perRadio.value=res.permissionType;
editForm.permissionUserIds=res.permissionUserIds;
}; };
//加载文章 //加载文章
const loadArticle = async () => { const loadArticle = async () => {

View File

@@ -1,6 +1,6 @@
<template> <template>
<div class="login-wrapper"> <div class="login-wrapper">
<h1>意社区-登录</h1> <h1>{{configStore.name}}-登录</h1>
<div class="login-form"> <div class="login-form">
<div class="username form-item"> <div class="username form-item">
<span>使用邮箱或者手机号</span> <span>使用邮箱或者手机号</span>
@@ -38,6 +38,8 @@
import { reactive } from 'vue'; import { reactive } from 'vue';
import { useRouter, useRoute } from 'vue-router'; import { useRouter, useRoute } from 'vue-router';
import useUserStore from '@/stores/user.js' import useUserStore from '@/stores/user.js'
import useConfigStore from "@/stores/config";
const configStore= useConfigStore();
const userStore = useUserStore(); const userStore = useUserStore();
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();

View File

@@ -14,8 +14,8 @@
</el-form-item> </el-form-item>
<el-form-item label="性别"> <el-form-item label="性别">
<el-radio-group v-model="user.sex"> <el-radio-group v-model="user.sex">
<el-radio :label="0"></el-radio> <el-radio :label="'Male'"></el-radio>
<el-radio :label="1"></el-radio> <el-radio :label="'Woman'"></el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>

View File

@@ -5,6 +5,7 @@ using Yi.Framework.Ddd.Dtos;
using Yi.Framework.DictionaryManager.Entities; using Yi.Framework.DictionaryManager.Entities;
using Yi.Framework.DictionaryManager.Dtos.Dictionary; using Yi.Framework.DictionaryManager.Dtos.Dictionary;
using Yi.Framework.Core.Attributes; using Yi.Framework.Core.Attributes;
using SqlSugar;
namespace Yi.Framework.DictionaryManager namespace Yi.Framework.DictionaryManager
{ {
@@ -21,7 +22,7 @@ namespace Yi.Framework.DictionaryManager
public override async Task<PagedResultDto<DictionaryGetListOutputDto>> GetListAsync(DictionaryGetListInputVo input) public override async Task<PagedResultDto<DictionaryGetListOutputDto>> GetListAsync(DictionaryGetListInputVo input)
{ {
int total = 0; RefAsync<int> total = 0;
var entities = await _DbQueryable.WhereIF(input.DictType is not null, x => x.DictType == input.DictType) var entities = await _DbQueryable.WhereIF(input.DictType is not null, x => x.DictType == input.DictType)
.WhereIF(input.DictLabel is not null, x => x.DictLabel!.Contains(input.DictLabel!)) .WhereIF(input.DictLabel is not null, x => x.DictLabel!.Contains(input.DictLabel!))
.WhereIF(input.State is not null, x => x.State == input.State) .WhereIF(input.State is not null, x => x.State == input.State)

View File

@@ -20,7 +20,7 @@ namespace Yi.Framework.DictionaryManager
public async override Task<PagedResultDto<DictionaryTypeGetListOutputDto>> GetListAsync(DictionaryTypeGetListInputVo input) public async override Task<PagedResultDto<DictionaryTypeGetListOutputDto>> GetListAsync(DictionaryTypeGetListInputVo input)
{ {
int total = 0; RefAsync<int> total = 0;
var entities = await _DbQueryable.WhereIF(input.DictName is not null, x => x.DictName.Contains(input.DictName!)) var entities = await _DbQueryable.WhereIF(input.DictName is not null, x => x.DictName.Contains(input.DictName!))
.WhereIF(input.DictType is not null, x => x.DictType!.Contains(input.DictType!)) .WhereIF(input.DictType is not null, x => x.DictType!.Contains(input.DictType!))
.WhereIF(input.State is not null, x => x.State == input.State) .WhereIF(input.State is not null, x => x.State == input.State)

View File

@@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Yi.Framework.Data.DataSeeds;
using Yi.Framework.Ddd.Repositories;
using Yi.RBAC.Domain.Identity.Entities;
using Yi.RBAC.Domain.Setting.Entities;
using Yi.RBAC.Domain.Shared.Identity.EnumClasses;
namespace Yi.BBS.Domain.DataSeed
{
[AppService(typeof(IDataSeed))]
public class BbsConfigDataSeed : AbstractDataSeed<ConfigEntity>
{
public BbsConfigDataSeed(IRepository<ConfigEntity> repository) : base(repository)
{
}
public override async Task<bool> IsInvoker()
{
return !await _repository.IsAnyAsync(x => x.ConfigKey == "ConfigEntity");
}
public override List<ConfigEntity> GetSeedData()
{
List<ConfigEntity> entities = new List<ConfigEntity>()
{
new ConfigEntity { Id = SnowflakeHelper.NextId, ConfigKey = "bbs.site.name", ConfigValue = "Yi意社区", ConfigName = "bbs站点名称" },
new ConfigEntity { Id = SnowflakeHelper.NextId, ConfigKey = "bbs.site.author", ConfigValue = "橙子", ConfigName = "bbs站点作者" },
new ConfigEntity { Id = SnowflakeHelper.NextId, ConfigKey = "bbs.site.icp", ConfigValue = "2023 意社区 | 赣ICP备xxxxxx号-4", ConfigName = "bbs备案号" },
new ConfigEntity { Id = SnowflakeHelper.NextId, ConfigKey = "bbs.site.bottom", ConfigValue = "YiFramework意框架", ConfigName = "bbs底部信息" },
};
return entities;
}
}
}

View File

@@ -51,6 +51,11 @@
封面 封面
</summary> </summary>
</member> </member>
<member name="P:Yi.BBS.Domain.Forum.Entities.DiscussEntity.PermissionUserIds">
<summary>
当PermissionType为部分用户时候以下列表中的用户+创建者 代表拥有权限
</summary>
</member>
<member name="T:Yi.BBS.Domain.Forum.ForumManager"> <member name="T:Yi.BBS.Domain.Forum.ForumManager">
<summary> <summary>
论坛模块的领域服务 论坛模块的领域服务

View File

@@ -48,9 +48,18 @@ namespace Yi.BBS.Application.Contracts.Forum.Dtos.Discuss
public string? PrivateCode { get; set; } public string? PrivateCode { get; set; }
public DateTime CreationTime { get; set; } public DateTime CreationTime { get; set; }
public List<long> PermissionUserIds { get; set; }
public UserGetListOutputDto User { get; set; } public UserGetListOutputDto User { get; set; }
public void SetBan()
{
this.Title = DiscussConst.˽<EFBFBD><EFBFBD>;
this.Introduction = "";
this.Cover = null;
//<2F><><EFBFBD><EFBFBD>ֹ
this.IsBan = true;
}
} }
@@ -69,20 +78,19 @@ namespace Yi.BBS.Application.Contracts.Forum.Dtos.Discuss
//<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><C7BD>Լ<EFBFBD><D4BC>ɼ<EFBFBD><C9BC><EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD>ǵ<EFBFBD>ǰ<EFBFBD><C7B0>¼<EFBFBD>û<EFBFBD> //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><C7BD>Լ<EFBFBD><D4BC>ɼ<EFBFBD><C9BC><EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD>ǵ<EFBFBD>ǰ<EFBFBD><C7B0>¼<EFBFBD>û<EFBFBD>
if (dto.User.Id != userId) if (dto.User.Id != userId)
{ {
dto.Title = DiscussConst.˽<EFBFBD><EFBFBD>; dto.SetBan();
dto.Introduction= "";
dto.Cover = null;
//<2F><><EFBFBD><EFBFBD>ֹ
dto.IsBan = true;
} }
break; break;
case DiscussPermissionTypeEnum.User: case DiscussPermissionTypeEnum.User:
//<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ֿɼ<D6BF><C9BC><EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD>ǵ<EFBFBD>ǰ<EFBFBD><C7B0>¼<EFBFBD>û<EFBFBD> Ҳ <20><><EFBFBD>ڿɼ<DABF><C9BC>û<EFBFBD><C3BB>б<EFBFBD><D0B1><EFBFBD>
if (dto.User.Id != userId && !dto.PermissionUserIds.Contains(userId))
{
dto.SetBan();
}
break; break;
default: default:
break; break;
} }
}); });
} }

View File

@@ -37,6 +37,8 @@ namespace Yi.BBS.Application.Contracts.Forum.Dtos
public string? PrivateCode { get; set; } public string? PrivateCode { get; set; }
public DateTime CreationTime { get; set; } public DateTime CreationTime { get; set; }
public DiscussPermissionTypeEnum PermissionType { get; set; } public DiscussPermissionTypeEnum PermissionType { get; set; }
public List<long> PermissionUserIds { get; set; }
public UserGetListOutputDto User { get; set; } public UserGetListOutputDto User { get; set; }
} }
} }

View File

@@ -17,6 +17,7 @@ namespace Yi.BBS.Application.Contracts.Forum.Dtos.Discuss
public string Content { get; set; } public string Content { get; set; }
public string? Color { get; set; } public string? Color { get; set; }
public List<long> PermissionUserIds { get; set; }
public DiscussPermissionTypeEnum PermissionType { get; set; } public DiscussPermissionTypeEnum PermissionType { get; set; }

View File

@@ -141,6 +141,13 @@ namespace Yi.BBS.Application.Forum
throw new UserFriendlyException(DiscussConst.); throw new UserFriendlyException(DiscussConst.);
} }
} }
if (discuss.PermissionType == DiscussPermissionTypeEnum.User)
{
if (discuss.CreatorId != _currentUser.Id && !discuss.PermissionUserIds.Contains(_currentUser.Id))
{
throw new UserFriendlyException(DiscussConst.);
}
}
} }
} }
} }

View File

@@ -14,6 +14,6 @@ namespace Yi.BBS.Domain.Shared.Forum.ConstClasses
{ {
public const string = "传入的主题id不存在"; public const string = "传入的主题id不存在";
public const string = "【私密】您无该主题权限"; public const string = "【私密】您无该主题权限,可联系作者申请开放";
} }
} }

View File

@@ -51,6 +51,11 @@
封面 封面
</summary> </summary>
</member> </member>
<member name="P:Yi.BBS.Domain.Forum.Entities.DiscussEntity.PermissionUserIds">
<summary>
当PermissionType为部分用户时候以下列表中的用户+创建者 代表拥有权限
</summary>
</member>
<member name="T:Yi.BBS.Domain.Forum.ForumManager"> <member name="T:Yi.BBS.Domain.Forum.ForumManager">
<summary> <summary>
论坛模块的领域服务 论坛模块的领域服务

View File

@@ -54,5 +54,12 @@ namespace Yi.BBS.Domain.Forum.Entities
public long? LastModifierId { get; set; } public long? LastModifierId { get; set; }
public DateTime? LastModificationTime { get; set; } public DateTime? LastModificationTime { get; set; }
/// <summary>
/// 当PermissionType为部分用户时候以下列表中的用户+创建者 代表拥有权限
/// </summary>
[SugarColumn(IsJson = true)]//使用json处理
public List<long> PermissionUserIds { get; set; }
} }
} }

View File

@@ -18,5 +18,7 @@ namespace Yi.RBAC.Application.Contracts.Identity.Dtos
public long? DeptId { get; set; } public long? DeptId { get; set; }
public string? Ids { get; set; }
} }
} }

View File

@@ -48,6 +48,8 @@ namespace Yi.RBAC.Application.Identity
RefAsync<int> total = 0; RefAsync<int> total = 0;
List<long>? ids = input.Ids?.Split(",").Select(x=>long.Parse(x)).ToList();
var outPut = await _DbQueryable.WhereIF(!string.IsNullOrEmpty(input.UserName), x => x.UserName.Contains(input.UserName!)) var outPut = await _DbQueryable.WhereIF(!string.IsNullOrEmpty(input.UserName), x => x.UserName.Contains(input.UserName!))
.WhereIF(input.Phone is not null, x => x.Phone.ToString()!.Contains(input.Phone.ToString()!)) .WhereIF(input.Phone is not null, x => x.Phone.ToString()!.Contains(input.Phone.ToString()!))
.WhereIF(!string.IsNullOrEmpty(input.Name), x => x.Name!.Contains(input.Name!)) .WhereIF(!string.IsNullOrEmpty(input.Name), x => x.Name!.Contains(input.Name!))
@@ -56,6 +58,9 @@ namespace Yi.RBAC.Application.Identity
//这个为过滤当前部门,加入数据权限后,将由数据权限控制 //这个为过滤当前部门,加入数据权限后,将由数据权限控制
.WhereIF(input.DeptId is not null, x => x.DeptId == input.DeptId) .WhereIF(input.DeptId is not null, x => x.DeptId == input.DeptId)
.WhereIF(ids is not null,x=> ids.Contains(x.Id))
.LeftJoin<DeptEntity>((user, dept) => user.DeptId == dept.Id) .LeftJoin<DeptEntity>((user, dept) => user.DeptId == dept.Id)
.Select((user, dept) => new UserGetListOutputDto(), true) .Select((user, dept) => new UserGetListOutputDto(), true)

View File

@@ -7,7 +7,7 @@
:layout="layout" :layout="layout"
:page-sizes="pageSizes" :page-sizes="pageSizes"
:pager-count="pagerCount" :pager-count="pagerCount"
:total="total" :total="Number(total)"
@size-change="handleSizeChange" @size-change="handleSizeChange"
@current-change="handleCurrentChange" @current-change="handleCurrentChange"
/> />

View File

@@ -28,6 +28,9 @@ const service = axios.create({
}], }],
}) })
// request拦截器 // request拦截器
service.interceptors.request.use(config => { service.interceptors.request.use(config => {
// 是否需要设置 token // 是否需要设置 token

View File

@@ -180,7 +180,7 @@
<pagination <pagination
v-show="total > 0" v-show="total > 0"
:total="total" :total="Number(total)"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
@pagination="getList" @pagination="getList"

View File

@@ -250,7 +250,7 @@
<pagination <pagination
v-show="total > 0" v-show="total > 0"
:total="total" :total="Number(total)"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
@pagination="getList" @pagination="getList"
@@ -424,7 +424,7 @@
</el-table> </el-table>
<pagination <pagination
v-show="materialTotal > 0" v-show="materialTotal > 0"
:total="materialTotal" :total="Number(materialTotal) "
v-model:page="queryMaterialParams.pageNum" v-model:page="queryMaterialParams.pageNum"
v-model:limit="queryMaterialParams.pageSize" v-model:limit="queryMaterialParams.pageSize"
@pagination="getMaterialList" @pagination="getMaterialList"

View File

@@ -174,7 +174,7 @@
<pagination <pagination
v-show="total > 0" v-show="total > 0"
:total="total" :total="Number(total)"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
@pagination="getList" @pagination="getList"

View File

@@ -182,7 +182,7 @@
<pagination <pagination
v-show="total > 0" v-show="total > 0"
:total="total" :total="Number(total)"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
@pagination="getList" @pagination="getList"

View File

@@ -174,7 +174,7 @@
<pagination <pagination
v-show="total > 0" v-show="total > 0"
:total="total" :total="Number(total)"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
@pagination="getList" @pagination="getList"

View File

@@ -174,7 +174,7 @@
<pagination <pagination
v-show="total > 0" v-show="total > 0"
:total="total" :total="Number(total)"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
@pagination="getList" @pagination="getList"

View File

@@ -188,7 +188,7 @@
<pagination <pagination
v-show="total > 0" v-show="total > 0"
:total="total" :total="Number(total)"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
@pagination="getList" @pagination="getList"

View File

@@ -155,7 +155,7 @@
<pagination <pagination
v-show="total > 0" v-show="total > 0"
:total="total" :total="Number(total)"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
@pagination="getList" @pagination="getList"

View File

@@ -131,7 +131,7 @@
<pagination <pagination
v-show="total > 0" v-show="total > 0"
:total="total" :total="Number(total)"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
@pagination="getList" @pagination="getList"

View File

@@ -115,7 +115,7 @@
<pagination <pagination
v-show="total > 0" v-show="total > 0"
:total="total" :total="Number(total)"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
@pagination="getList" @pagination="getList"

View File

@@ -55,7 +55,7 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" /> <pagination v-show="total > 0" :total="Number(total)" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" />
</div> </div>
</template> </template>

View File

@@ -124,7 +124,7 @@
<pagination <pagination
v-show="total > 0" v-show="total > 0"
:total="total" :total="Number(total)"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
@pagination="getList" @pagination="getList"

View File

@@ -133,7 +133,7 @@
<pagination <pagination
v-show="total > 0" v-show="total > 0"
:total="total" :total="Number(total)"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
@pagination="getList" @pagination="getList"

View File

@@ -127,7 +127,7 @@
<pagination <pagination
v-show="total > 0" v-show="total > 0"
:total="total" :total="Number(total)"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
@pagination="getList" @pagination="getList"

View File

@@ -141,9 +141,10 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination <pagination
v-show="total > 0" v-show="total > 0"
:total="total" :total="Number(total)"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
@pagination="getList" @pagination="getList"

View File

@@ -111,7 +111,7 @@
<pagination <pagination
v-show="total > 0" v-show="total > 0"
:total="total" :total="Number(total)"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
@pagination="getList" @pagination="getList"

View File

@@ -111,7 +111,7 @@
<pagination <pagination
v-show="total > 0" v-show="total > 0"
:total="total" :total="Number(total)"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
@pagination="getList" @pagination="getList"

View File

@@ -87,7 +87,7 @@
<pagination <pagination
v-show="total > 0" v-show="total > 0"
:total="total" :total="Number(total)"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
@pagination="getList" @pagination="getList"

View File

@@ -82,7 +82,7 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" <pagination v-show="total > 0" :total="Number(total)" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
@pagination="getList" /> @pagination="getList" />
<!-- 添加或修改角色配置对话框 --> <!-- 添加或修改角色配置对话框 -->

View File

@@ -43,7 +43,7 @@
</el-table> </el-table>
<pagination <pagination
v-show="total > 0" v-show="total > 0"
:total="total" :total="Number(total)"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
@pagination="getList" @pagination="getList"

View File

@@ -34,7 +34,7 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination v-show="total > 0" :total="total" v-model:page="pageNum" v-model:limit="pageSize" /> <pagination v-show="total > 0" :total="Number(total)" v-model:page="pageNum" v-model:limit="pageSize" />
<el-form label-width="100px"> <el-form label-width="100px">
<div style="text-align: center;margin-left:-120px;margin-top:30px;"> <div style="text-align: center;margin-left:-120px;margin-top:30px;">

View File

@@ -107,7 +107,7 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" <pagination v-show="total > 0" :total="Number(total)" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" @pagination="getList" /> v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-col> </el-col>
</el-row> </el-row>

View File

@@ -33,7 +33,7 @@
</el-table> </el-table>
<pagination <pagination
v-show="total>0" v-show="total>0"
:total="total" :total="Number(total)"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
@pagination="getList" @pagination="getList"

View File

@@ -149,7 +149,7 @@
</el-table> </el-table>
<pagination <pagination
v-show="total>0" v-show="total>0"
:total="total" :total="Number(total)"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
@pagination="getList" @pagination="getList"