谈权限设计问题
2011-08-14 19:48
204 查看
前段时间,我们公司做了一个酒馆软件。里边设涉及到了权限方面的问题,这个模块是我负责开发的,我也对权限的表的设计和实现方法有了了解。
要实现权限需要4张表。
A.用户表:字段有用户名,密码,角色编号。。。
B.角色表:字段包括角色编号(自动增长编号),角色名称。
C.功能模块表:字段包括模块编号,模块名称。
D。权限关系表:字段有自动增长ID,角色id( 角色表外键),模块id(功能模块表外键)。
权限功能的设置我是通过tree控件实现的。
界面如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using BLL;
using System.Collections;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
namespace HotelCRM
{
public partial class setQuanxian : Form
{
public setQuanxian()
{
InitializeComponent();
bind();
bindtree(1);
}
SysBusiness sysbess = new SysBusiness();
System.Windows.Forms.TreeNode tn = new System.Windows.Forms.TreeNode();
List<System.Windows.Forms.TreeNode> _nodeList = new List<System.Windows.Forms.TreeNode>();
//修改角色
private void btupdate_Click(object sender, EventArgs e)
{
///先删除该角色有的所有功能模块,再重新插入一次
string name = this.listBox1.SelectedItem.ToString();
DataSet ds = sysbess.getRoleidbyrolename(name);
int roleid = Convert.ToInt32(ds.Tables[0].Rows[0][0].ToString());
int a = sysbess.delusermodel(roleid);
string str1 = "";
//选中的节点就插入数据库
str1 = GetCollection(roleid, this.treemenu);
str1 = str1.Substring(10);
string sql = " insert into Sys_Rank_Menu (rankid ,menuid) " + str1;
int a1 = sysbess.ADDrolemodel(sql);
LogMain lg = new LogMain();
lg.AddLog(" 修改了角色的权限", " 修改了角色拥有的模块信息 ", 1);//写入日志
if (a1 > 0)
{
MessageBox.Show(" 修改成功!");
}
else
{
MessageBox.Show(" 修改失败!");
}
}
//绑定角色到listview
public void bind()
{
DataSet ds = sysbess.getAlluserRole();
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
ListItem li = new ListItem();
li.Text = ds.Tables[0].Rows[i]["RankName"].ToString();
li.Value = ds.Tables[0].Rows[i]["Rankcode"].ToString();
this.listBox1.Items.Add(li);
}
}
//权限显示在treeview
public void bindtree(int roleid)
{
treemenu.CheckBoxes = true;//显示选择框
DataSet ds = sysbess.getallmenu();
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
System.Windows.Forms.TreeNode tn = this.treemenu.Nodes.Add(ds.Tables[0].Rows[i][0].ToString(), ds.Tables[0].Rows[i][1].ToString());
DataSet ds1= sysbess.getbianhaoBYid(Convert.ToInt32(tn.Name));
string bianhao = ds1.Tables[0].Rows[0][0].ToString();//标号
//判断角色是否有权限
if (sysbess.ifhavaModel(roleid, bianhao))
{ tn.Checked = true; }
//父节点编号查询所有子节点
DataSet dst = sysbess.getallmenuBypid(Convert.ToInt32(ds.Tables[0].Rows[i][0]));
for (int j = 0; j < dst.Tables[0].Rows.Count; j++)
{
System.Windows.Forms.TreeNode tl = tn.Nodes.Add(dst.Tables[0].Rows[j][0].ToString(), dst.Tables[0].Rows[j][1].ToString());
DataSet ds2 = sysbess.getbianhaoBYid(Convert.ToInt32(dst.Tables[0].Rows[j][0].ToString()));
string bianhao1 = ds2.Tables[0].Rows[0][0].ToString();//标号
if (sysbess.ifhavaModel(roleid, bianhao1))
{ tl.Checked = true; }
}
}
}
private string GetCollection(int rid, System.Windows.Forms.TreeView tv)
{
string str = "";
for (int i = 0; i < tv.Nodes.Count; i++)
{
System.Windows.Forms.TreeNode p_node = tv.Nodes[i];
if (p_node.Checked == true)
{
_nodeList.Add(p_node);
//str += p_node.Name + ";";
str += " union all select " + rid.ToString() + " , " + Convert.ToInt32(p_node.Name);
}
for (int j = 0; j < p_node.Nodes.Count; j++)
{
System.Windows.Forms.TreeNode item = p_node.Nodes[j];
if (item.Checked == true)
{
_nodeList.Add(item);
//str += item.Name + ";";
str += " union all select " + rid.ToString() + " , " + Convert.ToInt32(item.Name);
}
}
}
return str;
}
//加载
private void setQuanxian_Load(object sender, EventArgs e)
{
//this.skinEngine1.SkinFile = "skin//Midsummer.ssk";
}
//选项变化时选择框变化
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
this.treemenu.Nodes.Clear();
ListItem li = (ListItem)this.listBox1.SelectedItem;
bindtree(int.Parse(li.Value));
}
private bool updateTreeNode = false;
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
if (updateTreeNode) return; // 如果在刷新中
updateTreeNode = true;
try
{
TreeNodeChild(e.Node, e.Node.Checked); // 同步子节点
TreeNodeCheck(e.Node, e.Node.Checked);
}
finally
{
updateTreeNode = false;
}
}
private void TreeNodeChild(System.Windows.Forms.TreeNode ATreeNode, bool AChecked) // 同步子节点
{
if (ATreeNode == null) return;
ATreeNode.Checked = AChecked;
foreach (System.Windows.Forms.TreeNode vTreeNode in ATreeNode.Nodes)
{
TreeNodeChild(vTreeNode, AChecked);
}
}
private void TreeNodeCheck(System.Windows.Forms.TreeNode ATreeNode, bool AChecked)
{
if (ATreeNode == null) return;
ATreeNode.Checked = AChecked;
if (AChecked) // 如果选中本节点这就是选中全部上级节点
{
TreeNodeCheck(ATreeNode.Parent, AChecked);
}
else
{
if (ATreeNode.Parent != null && ATreeNode.Parent.Checked)
{
foreach (System.Windows.Forms.TreeNode vTreeNode in ATreeNode.Parent.Nodes)
if (vTreeNode.Checked) return;
TreeNodeCheck(ATreeNode.Parent, AChecked); // 判断是否所有的兄弟节点Checked都为false
}
}
}
//全选
private void Btselectall_Click(object sender, EventArgs e)
{
for (int i = 0; i < treemenu.Nodes.Count; i++) {
treemenu.Nodes[i].Checked = true;
}
}
}
}
要实现权限需要4张表。
A.用户表:字段有用户名,密码,角色编号。。。
B.角色表:字段包括角色编号(自动增长编号),角色名称。
C.功能模块表:字段包括模块编号,模块名称。
D。权限关系表:字段有自动增长ID,角色id( 角色表外键),模块id(功能模块表外键)。
权限功能的设置我是通过tree控件实现的。
界面如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using BLL;
using System.Collections;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
namespace HotelCRM
{
public partial class setQuanxian : Form
{
public setQuanxian()
{
InitializeComponent();
bind();
bindtree(1);
}
SysBusiness sysbess = new SysBusiness();
System.Windows.Forms.TreeNode tn = new System.Windows.Forms.TreeNode();
List<System.Windows.Forms.TreeNode> _nodeList = new List<System.Windows.Forms.TreeNode>();
//修改角色
private void btupdate_Click(object sender, EventArgs e)
{
///先删除该角色有的所有功能模块,再重新插入一次
string name = this.listBox1.SelectedItem.ToString();
DataSet ds = sysbess.getRoleidbyrolename(name);
int roleid = Convert.ToInt32(ds.Tables[0].Rows[0][0].ToString());
int a = sysbess.delusermodel(roleid);
string str1 = "";
//选中的节点就插入数据库
str1 = GetCollection(roleid, this.treemenu);
str1 = str1.Substring(10);
string sql = " insert into Sys_Rank_Menu (rankid ,menuid) " + str1;
int a1 = sysbess.ADDrolemodel(sql);
LogMain lg = new LogMain();
lg.AddLog(" 修改了角色的权限", " 修改了角色拥有的模块信息 ", 1);//写入日志
if (a1 > 0)
{
MessageBox.Show(" 修改成功!");
}
else
{
MessageBox.Show(" 修改失败!");
}
}
//绑定角色到listview
public void bind()
{
DataSet ds = sysbess.getAlluserRole();
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
ListItem li = new ListItem();
li.Text = ds.Tables[0].Rows[i]["RankName"].ToString();
li.Value = ds.Tables[0].Rows[i]["Rankcode"].ToString();
this.listBox1.Items.Add(li);
}
}
//权限显示在treeview
public void bindtree(int roleid)
{
treemenu.CheckBoxes = true;//显示选择框
DataSet ds = sysbess.getallmenu();
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
System.Windows.Forms.TreeNode tn = this.treemenu.Nodes.Add(ds.Tables[0].Rows[i][0].ToString(), ds.Tables[0].Rows[i][1].ToString());
DataSet ds1= sysbess.getbianhaoBYid(Convert.ToInt32(tn.Name));
string bianhao = ds1.Tables[0].Rows[0][0].ToString();//标号
//判断角色是否有权限
if (sysbess.ifhavaModel(roleid, bianhao))
{ tn.Checked = true; }
//父节点编号查询所有子节点
DataSet dst = sysbess.getallmenuBypid(Convert.ToInt32(ds.Tables[0].Rows[i][0]));
for (int j = 0; j < dst.Tables[0].Rows.Count; j++)
{
System.Windows.Forms.TreeNode tl = tn.Nodes.Add(dst.Tables[0].Rows[j][0].ToString(), dst.Tables[0].Rows[j][1].ToString());
DataSet ds2 = sysbess.getbianhaoBYid(Convert.ToInt32(dst.Tables[0].Rows[j][0].ToString()));
string bianhao1 = ds2.Tables[0].Rows[0][0].ToString();//标号
if (sysbess.ifhavaModel(roleid, bianhao1))
{ tl.Checked = true; }
}
}
}
private string GetCollection(int rid, System.Windows.Forms.TreeView tv)
{
string str = "";
for (int i = 0; i < tv.Nodes.Count; i++)
{
System.Windows.Forms.TreeNode p_node = tv.Nodes[i];
if (p_node.Checked == true)
{
_nodeList.Add(p_node);
//str += p_node.Name + ";";
str += " union all select " + rid.ToString() + " , " + Convert.ToInt32(p_node.Name);
}
for (int j = 0; j < p_node.Nodes.Count; j++)
{
System.Windows.Forms.TreeNode item = p_node.Nodes[j];
if (item.Checked == true)
{
_nodeList.Add(item);
//str += item.Name + ";";
str += " union all select " + rid.ToString() + " , " + Convert.ToInt32(item.Name);
}
}
}
return str;
}
//加载
private void setQuanxian_Load(object sender, EventArgs e)
{
//this.skinEngine1.SkinFile = "skin//Midsummer.ssk";
}
//选项变化时选择框变化
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
this.treemenu.Nodes.Clear();
ListItem li = (ListItem)this.listBox1.SelectedItem;
bindtree(int.Parse(li.Value));
}
private bool updateTreeNode = false;
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
if (updateTreeNode) return; // 如果在刷新中
updateTreeNode = true;
try
{
TreeNodeChild(e.Node, e.Node.Checked); // 同步子节点
TreeNodeCheck(e.Node, e.Node.Checked);
}
finally
{
updateTreeNode = false;
}
}
private void TreeNodeChild(System.Windows.Forms.TreeNode ATreeNode, bool AChecked) // 同步子节点
{
if (ATreeNode == null) return;
ATreeNode.Checked = AChecked;
foreach (System.Windows.Forms.TreeNode vTreeNode in ATreeNode.Nodes)
{
TreeNodeChild(vTreeNode, AChecked);
}
}
private void TreeNodeCheck(System.Windows.Forms.TreeNode ATreeNode, bool AChecked)
{
if (ATreeNode == null) return;
ATreeNode.Checked = AChecked;
if (AChecked) // 如果选中本节点这就是选中全部上级节点
{
TreeNodeCheck(ATreeNode.Parent, AChecked);
}
else
{
if (ATreeNode.Parent != null && ATreeNode.Parent.Checked)
{
foreach (System.Windows.Forms.TreeNode vTreeNode in ATreeNode.Parent.Nodes)
if (vTreeNode.Checked) return;
TreeNodeCheck(ATreeNode.Parent, AChecked); // 判断是否所有的兄弟节点Checked都为false
}
}
}
//全选
private void Btselectall_Click(object sender, EventArgs e)
{
for (int i = 0; i < treemenu.Nodes.Count; i++) {
treemenu.Nodes[i].Checked = true;
}
}
}
}
相关文章推荐
- 换位思考权限设计(把复杂的问题,简单化才是水平,用简单的道理解决复杂的问题)
- 权限系统的设计之本质问题
- 关于权限管理设计的问题
- 权限系统设计问题
- 角色权限中窗体的继承问题即窗体设计器打开异常现象
- 关于权限的 数据库设计问题!
- 企业网站权限设计实现:问题修复
- 权限设计问题,即C#实现上的设想[供讨论]
- 设计角色状态权限控制问题
- 数据库权限问题以及设计的一些原则,转自牛人--狼
- 事务,索引,连接查询,权限设计(面试问题)
- 换位思考权限设计(把复杂的问题,简单化才是水平,用简单的道理解决复杂的问题)
- 换位思考权限设计(把复杂的问题,简单化才是水平,用简单的道理解决复杂的问题)
- 换位思考权限设计(把复杂的问题,简单化才是水平,用简单的道理解决复杂的问题)
- 换位思考权限设计(把复杂的问题,简单化才是水平,用简单的道理解决复杂的问题)
- 换位思考权限设计(把复杂的问题,简单化才是水平,用简单的道理解决复杂的问题)
- 基于角色的用户权限设计的问题,大家探讨下
- 关于系统中权限和角色设计的问题
- 多用户分组权限管理问题的数据库设计
- 数据库表设计权限问题