Add 角色权限配置

This commit is contained in:
Ling 2024-05-22 17:19:22 +08:00
parent 5dd63e8c67
commit 81f6ac9523
8 changed files with 467 additions and 23 deletions

View File

@ -18,12 +18,12 @@
<StackPanel Margin="10" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Text="账号:" Width="50"/>
<TextBox x:Name="usernameBox" Text="" Width="100"/>
<TextBox x:Name="usernameBox" Text="admin" Width="100"/>
</StackPanel>
<StackPanel Margin="10" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Text="密码:" Width="50" />
<PasswordBox x:Name="passwdBox" Width="100" />
<PasswordBox x:Name="passwdBox" Password="111" Width="100" />
</StackPanel>
<Button x:Name="loginButton" Content="登录" Width="100" Margin="10" Click="loginButton_Click"/>

View File

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CeramicProjectTool.Model.ResultModel
{
public class RulePermissonResult
{
public int PermissonId { get; set; }
public int RuleId { get; set; }
public int FeatureId { get; set; }
public string RuleName { get; set; }
public string FeatureName { get; set; }
public bool IsEnabled { get; set; }
}
}

View File

@ -0,0 +1,32 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CeramicProjectTool.Model
{
/*
###CSharp Code Generate###
nr_z_quanxian
Create by User(EMAIL) 2024/5/22 14:11:44
nr_z_quanxian
----------------
id PKInteger //<<自增长>>
jsid Integer
gnid Integer
*/
[SugarTable("nr_z_quanxian")]
public class RulePermissonModel
{
[SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
[SugarColumn(ColumnName = "jsid")]
public int RuleId { get; set; }
[SugarColumn(ColumnName = "gnid")]
public int FeatureId { get; set; }
}
}

View File

@ -7,24 +7,92 @@
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800"
Title="权限配置" Loaded="Page_Loaded">
<Page.Resources>
<Style TargetType="CheckBox" >
<Setter Property="Margin" Value="5"/>
</Style>
</Page.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0">
<TextBox x:Name="searchBox" Height="40" TextInput="searchBox_TextInput" KeyDown="searchBox_KeyDown" />
</StackPanel>
<DataGrid Grid.Row="1" x:Name="permissonData" AutoGenerateColumns="False" IsReadOnly="True">
<DataGrid.Columns>
<DataGridTextColumn Header="功能Id" Binding="{Binding Id}"/>
<DataGridTextColumn Header="功能" Binding="{Binding Feature}"/>
<DataGridTextColumn Header="序号" Binding="{Binding SeqNo}"/>
<DataGridTextColumn Header="模块名称" Binding="{Binding ModuleName}" Width="100"/>
<DataGridTextColumn Header="表名" Binding="{Binding Table}" Width="100"/>
<DataGridTextColumn Header="备注" Binding="{Binding Remark}" Width="100"/>
</DataGrid.Columns>
</DataGrid>
<TabControl>
<TabItem Header="角色权限">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ListView x:Name="RuleListView" Grid.Column="0" SelectionChanged="RuleListView_SelectionChanged">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding RuleName}" FontSize="18"/>
<TextBlock Margin="10,0" Text="{Binding Id}" FontSize="18"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemContainerStyle>
<Style>
<Setter Property="Control.HorizontalContentAlignment" Value="Stretch"/>
</Style>
</ListView.ItemContainerStyle>
</ListView>
<StackPanel Grid.Column="1" >
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Horizontal" HorizontalAlignment="Center">
<ComboBox x:Name="ModuleList" Width="120"
SelectionChanged="ModuleList_SelectionChanged"
SelectedValuePath="Id"
DisplayMemberPath="ModuleName"
VerticalContentAlignment="Center"
>
</ComboBox>
<Button x:Name="invokePermissonBtn" Content="授予权限" Margin="5,0" Padding="10,0" Click="invokePermissonBtn_Click"/>
<Button x:Name="reinvokePermissonBtn" Content="撤销权限" Margin="5,0" Padding="10,0" Click="reinvokePermissonBtn_Click"/>
</StackPanel>
<GroupBox Grid.Row="1" Header="角色权限">
<WrapPanel x:Name="RulePermissonList"/>
</GroupBox>
<GroupBox Grid.Row="2" Header="模块权限">
<StackPanel>
<Button x:Name="selectAllModulePermissonBtn" Content="全选" Click="selectAllModulePermissonBtn_Click"/>
<WrapPanel x:Name="ModulePermissonList"/>
</StackPanel>
</GroupBox>
</Grid>
</StackPanel>
</Grid>
</TabItem>
<TabItem Header="权限项">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0">
<TextBox x:Name="searchBox" Height="40" TextInput="searchBox_TextInput" KeyDown="searchBox_KeyDown" />
</StackPanel>
<DataGrid Grid.Row="1" x:Name="permissonData" AutoGenerateColumns="False" IsReadOnly="True">
<DataGrid.Columns>
<DataGridTextColumn Header="功能Id" Binding="{Binding Id}"/>
<DataGridTextColumn Header="功能" Binding="{Binding Feature}"/>
<DataGridTextColumn Header="序号" Binding="{Binding SeqNo}"/>
<DataGridTextColumn Header="模块名称" Binding="{Binding ModuleName}" Width="100"/>
<DataGridTextColumn Header="表名" Binding="{Binding Table}" Width="100"/>
<DataGridTextColumn Header="备注" Binding="{Binding Remark}" Width="100"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</TabItem>
</TabControl>
</Grid>
</Page>

View File

@ -2,6 +2,7 @@
using CeramicProjectTool.ViewModel;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@ -35,7 +36,7 @@ namespace CeramicProjectTool.Pages
LoadData();
}
private void LoadData(string searchText = "")
private async void LoadData(string searchText = "")
{
Task<List<PermissonModel>> task;
if (string.IsNullOrWhiteSpace(searchText))
@ -48,13 +49,36 @@ namespace CeramicProjectTool.Pages
task = viewModel.GetPermissons(searchText);
}
task.ContinueWith((t) =>
_ = task.ContinueWith((t) =>
{
permissonData.Dispatcher.Invoke(() =>
{
permissonData.ItemsSource = t.Result;
});
});
await task;
var ruleTask = viewModel.GetRules();
_ = ruleTask.ContinueWith(ruleTask =>
{
RuleListView.Dispatcher.Invoke(() =>
{
RuleListView.ItemsSource = ruleTask.Result;
RuleListView.SelectedIndex = 0;
});
});
await ruleTask;
var moduleTask = viewModel.GetMkList();
_ = moduleTask.ContinueWith(muduleTask =>
{
ModuleList.Dispatcher.Invoke(() =>
{
ModuleList.ItemsSource = muduleTask.Result;
ModuleList.SelectedIndex = 0;
});
});
}
private void searchBox_TextInput(object sender, TextCompositionEventArgs e)
@ -74,5 +98,164 @@ namespace CeramicProjectTool.Pages
}
}
}
private void RuleListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var datas = ((ListView)sender).ItemsSource as List<RuleModel>;
var selectedIndex = ((ListView)sender).SelectedIndex;
if (selectedIndex != -1)
{
viewModel.selectRule = datas[selectedIndex];
LoadPermisson();
}
}
private void invokePermissonBtn_Click(object sender, RoutedEventArgs e)
{
var selected = ModulePermissonList.Children;
List<RulePermissonModel> rulePermissons = new List<RulePermissonModel>();
foreach (var item in selected)
{
if (item is CheckBox checkBox)
{
if (checkBox.IsChecked ?? false)
{
var featureId = (int)checkBox.Tag;
var rule = viewModel.selectRule;
//var module = viewModel.selectMudole;
var rulePermisson = new RulePermissonModel
{
RuleId = rule.Id,
FeatureId = featureId
};
rulePermissons.Add(rulePermisson);
}
}
}
if (rulePermissons.Count > 0)
{
viewModel.UpdateRulePermisson(rulePermissons);
LoadPermisson();
}
}
private void reinvokePermissonBtn_Click(object sender, RoutedEventArgs e)
{
var selected = RulePermissonList.Children;
List<int> rulePermissons = new List<int>();
foreach (var item in selected)
{
if (item is CheckBox checkBox)
{
if (checkBox.IsChecked ?? false)
{
var permissonId = (int)checkBox.Tag;
rulePermissons.Add(permissonId);
}
}
}
if (rulePermissons.Count > 0)
{
viewModel.DeleteRulePermisson(rulePermissons);
LoadPermisson();
}
}
private void ModuleList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var datas = ((ComboBox)sender).ItemsSource as List<ModuleModel>;
var selectedIndex = ((ComboBox)sender).SelectedIndex;
if (selectedIndex != -1)
{
var mkModel = datas?[selectedIndex == -1 ? 0 : selectedIndex];
viewModel.selectMudole = mkModel;
LoadPermisson();
}
}
private async void LoadPermisson()
{
viewModel.isSelectAll = false;
var rule = viewModel.selectRule;
var module = viewModel.selectMudole;
if (rule == null || module == null)
{
return;
}
var rulePremissonTask = viewModel.GetPermissonsByRule(rule.RuleName, module.ModuleName);
_ = rulePremissonTask.ContinueWith((t) =>
{
var result = t.Result;
viewModel.rulePermissons = result;
RulePermissonList.Dispatcher.Invoke(() =>
{
RulePermissonList.Children.Clear();
result.ForEach(item =>
{
var checkBox = new CheckBox
{
Tag = item.PermissonId,
Content = item.FeatureName,
//IsChecked = item.IsEnabled
};
RulePermissonList.Children.Add(checkBox);
});
});
});
await rulePremissonTask;
var modulePremissonTask = viewModel.GetPermissons(module.ModuleName);
_ = modulePremissonTask.ContinueWith((t) =>
{
var result = t.Result;
ModulePermissonList.Dispatcher.Invoke(() =>
{
ModulePermissonList.Children.Clear();
result.ForEach(item =>
{
var exist = viewModel.CheckPermissonExist(item.Feature);
if (!exist)
{
var checkBox = new CheckBox
{
Tag = item.Id,
Content = item.Feature,
IsChecked = false
};
ModulePermissonList.Children.Add(checkBox);
}
});
});
});
}
//private bool isAllSelected = false;
private void selectAllModulePermissonBtn_Click(object sender, RoutedEventArgs e)
{
viewModel.isSelectAll = !viewModel.isSelectAll;
foreach (var item in ModulePermissonList.Children)
{
if (item is CheckBox checkBox)
{
if (checkBox.IsEnabled)
{
ModulePermissonList.Dispatcher.Invoke(() =>
{
checkBox.IsChecked = viewModel.isSelectAll;
});
}
}
}
}
}
}

45
Util/DBHelper.Rule.cs Normal file
View File

@ -0,0 +1,45 @@
using CeramicProjectTool.Model;
using CeramicProjectTool.Model.ResultModel;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CeramicProjectTool.Util
{
public partial class DBHelper
{
public static async Task<List<RulePermissonResult>> GetPermissonsByRule(string ruleName, string moduleName)
{
/*
nr_z_quanxian rp
nr_sys_gn p
nr_z_yhjs r
select * from nr_z_quanxian a
left join nr_sys_gn b on a.gnid = b.id
left join nr_z_yhjs c on a.jsid = c.id
*/
var result = await _db.Queryable<RulePermissonModel, PermissonModel, RuleModel>((rp, p, r)
=> new JoinQueryInfos(
JoinType.Left, rp.FeatureId == p.Id,
JoinType.Left, rp.RuleId == r.Id))
.Where((rp, p, r) => r.RuleName == ruleName && p.ModuleName == moduleName)
.Select((rp, p, r) => new RulePermissonResult
{
FeatureId = p.Id,
RuleId = r.Id,
PermissonId = rp.Id,
RuleName = r.RuleName,
FeatureName = p.Feature,
IsEnabled = true
})
.ToListAsync();
return result;
}
}
}

View File

@ -1,4 +1,5 @@
using System;
using CeramicProjectTool.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@ -9,6 +10,17 @@ namespace CeramicProjectTool.Util
public static partial class DBHelper
{
private static SqlSugar.SqlSugarClient _db;
public static SqlSugar.SqlSugarClient Db
{
get
{
if (_db == null)
{
Init();
}
return _db;
}
}
public static bool isInit = false;
public static void Init()
{
@ -30,6 +42,7 @@ namespace CeramicProjectTool.Util
DBHelper.connStr = $"Data Source={dbConfig["dbSource"]};Initial Catalog={dbConfig["dbName"]};User ID={dbConfig["dbUserName"]};Password={dbConfig["dbUserPwd"]}";
}
public static string connStr = "";
}

View File

@ -1,5 +1,7 @@
using CeramicProjectTool.Model;
using CeramicProjectTool.Model.ResultModel;
using CeramicProjectTool.Util;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.ComponentModel;
@ -18,7 +20,12 @@ namespace CeramicProjectTool.ViewModel
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public ModuleModel selectMudole;
public RuleModel selectRule;
public bool isSelectAll = false;
public List<RulePermissonResult>? rulePermissons;
public Task<List<PermissonModel>> GetPermissons()
{
var result = DBHelper.GetPermissons();
@ -29,5 +36,81 @@ namespace CeramicProjectTool.ViewModel
var result = DBHelper.GetPermissonsByModule(searchText);
return result;
}
public Task<List<RuleModel>> GetRules()
{
var result = DBHelper.GetRules();
return result;
}
public async Task<List<RulePermissonResult>> GetPermissonsByRule(string ruleName, string moduleName)
{
var result = await DBHelper.GetPermissonsByRule(ruleName, moduleName);
return result;
}
public Task<List<ModuleModel>> GetMkList()
{
Task<List<ModuleModel>> modelList = DBHelper.GetModuleList();
return modelList;
//modelList.ContinueWith((task) =>
//{
// ModelListView.Dispatcher.Invoke(() =>
// {
// ModelListView.ItemsSource = task.Result;
// });
//});
}
internal void UpdateRulePermisson(List<RulePermissonModel> rulePermisson)
{
var _db = DBHelper.Db;
try
{
_db.Ado.BeginTran();
//_db.Deleteable<RulePermissonModel>().Where(x => x.RuleId == rulePermisson[0].RuleId).ExecuteCommand();
_db.Insertable(rulePermisson).ExecuteCommand();
_db.Ado.CommitTran();
}
catch (Exception ex)
{
_db.Ado.RollbackTran();
throw ex;
}
}
internal void DeleteRulePermisson(List<int> rulePermissonId)
{
var _db = DBHelper.Db;
try
{
_db.Ado.BeginTran();
_db.Deleteable<RulePermissonModel>().Where(x => rulePermissonId.Contains(x.Id)).ExecuteCommand();
//_db.Insertable(rulePermisson).ExecuteCommand();
_db.Ado.CommitTran();
}
catch (Exception ex)
{
_db.Ado.RollbackTran();
throw ex;
}
}
internal bool CheckPermissonExist(string featureName)
{
bool isExist = false;
//rulePermissons.ForEach(item =>
foreach (var item in rulePermissons)
{
if (item.FeatureName == featureName)
{
isExist = true;
break;
}
}
return isExist;
}
}
}