package pack.y2.hibernate.serviceimpl;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import pack.y2.hibernate.daoimpl.MenusDaoImpl;
import pack.y2.hibernate.daoimpl.RolesDaoImpl;
import pack.y2.hibernate.daoimpl.UserDaoImpl;
import pack.y2.hibernate.idao.IMenusDao;
import pack.y2.hibernate.idao.IRolesDao;
import pack.y2.hibernate.idao.IUsersDao;
import pack.y2.hibernate.iservice.IUserService;
import pack.y2.hibernate.pojo.Menus;
import pack.y2.hibernate.pojo.Roles;
import pack.y2.hibernate.pojo.Users;

public class UserServiceImpl implements IUserService{
	IUsersDao iuser=new UserDaoImpl(); 
	IMenusDao imeus=new MenusDaoImpl();
	IRolesDao irole=new RolesDaoImpl();
	/**
	 * 根据用户名得到权限;
	 */
	public Set selectByName(String name) {
		// TODO Auto-generated method stub
		  String hql="From Menus as M join fetch M.roleses R join fetch R.userses U where U.username=?";
		List list=iuser.pageQuery(hql, null, null,name);
		//把list转成set集合;
		Set set=new HashSet(list);
		return set;
	}
	
	//得到所有的用户;
	public Map selectAll(Integer page) {
		// TODO Auto-generated method stub
		String hql="From Users";
		List list=iuser.pageQuery(hql,page,8);
		
		Map map=new HashMap();
		map.put("UserList", list);
		
		String hql2="select count(*) From Users";
		//得到总页数;
		List list2=iuser.pageQuery(hql2, null, null);
		
		Object obj=list2.get(0);
		int sum=Integer.parseInt(obj.toString());
		//添加总记录数;
		map.put("Sum",sum);
		
		//添加总页数;
		Integer sumPage=sum%8==0?sum/8:sum/8+1;
		map.put("SumPage",sumPage);
		
		return map;
	}

	//查询用户已有的权限;
	public List findGrant_UserById(Long userid) {
		// TODO Auto-generated method stub
		String hql="From Roles r where r.userses.userid=?";
		List list=iuser.pageQuery(hql, null, null,userid);
		return list;
	}

	//查询用户没有的权限;
	public List findNotGrant_UserById(Long userid) {
		// TODO Auto-generated method stub
		String hql="From Roles where rolesid not in(select r.rolesid From Roles r where r.userses.userid=?)";
		List list=iuser.pageQuery(hql, null, null, userid);
		return list;
	}

	//保存用户角色的方法;
	public void saveUserGrant(Long userid, String rolesid) {
		//根据用户编号查找出用户对象;
		Users users=(Users)iuser.selectById(userid);
		System.out.println("roles字符串为:"+rolesid);
		
		if(rolesid==null || rolesid.length()<1){
			//清除所有的集合;
			users.getRoleses().clear();
		}else{
			StringBuffer sb=new StringBuffer("From Roles r where r.rolesid in(");
			sb.append(rolesid);
			sb.setCharAt(sb.toString().length()-1, ')');
			
			String hql=sb.toString();
			List list=iuser.pageQuery(hql, null, null);
			Set set=new HashSet(list);
			
			System.out.println("list大小:"+list.size());
			//把角色重新放入集合中;
			users.setRoleses(set);
		}
		
		//最后更新用户;
		iuser.add(users);
	}

	//得到所有的菜单项;
	public List getMenusAll() {
		// TODO Auto-generated method stub
		List list=imeus.selectAll();
		return list;
	}
	
	public static void main(String[] args) {
		Set list=new UserServiceImpl().getUsersByRolesId(new Long(1));
		for(Object obj:list){
			Users u=(Users)obj;
			System.out.println(u.getUsername());
		}
		
	}
	
	//根据角色编号查找出菜单编号;
	public List getRoleAllByRoleId(Long roleid){
		String hql="From Menus m where m.roleses.rolesid=?";
		List list=imeus.pageQuery(hql, null, null, roleid);
		return list;

	}
	
	//得到所有的角色;
	public List getRolesAll(){
		String hql="From Roles";
		List list=irole.selectAll();
		return list;
		
	}

	//根据穿过来的角色编号查找出角色对象;角色对象中有一个菜单对象的集合;
	//首先清除所有的菜单权限;然后在判断menusid是否为空;如果不为空,则用StringBuffer sb=new StringBuffer("From Roles where r .menus.memusid in(");
	//然后在把menusid传入到in里面;拼成sql语句;执行后返回List结果集;把结果集放入set集合中;
	//最后调用更新方法进行更新操作;
	public void saveMenusByRolesId(Long rolesId, String menusId) {
		String hql="From Roles r where r.rolesid=?";
		List list=irole.pageQuery(hql, null, null, rolesId);
		//得到一个角色对象;
		Roles role=(Roles)list.get(0);
		
		
		//清除角色对象中的所有菜单;
		role.getMenuses().clear();
		
		if(menusId!=null && menusId.length()>0){
			//根据menusId查找出所有的菜单出来;	
			StringBuffer sb=new StringBuffer("From Menus s where s.menusid in(");
			sb.append(menusId);
			//把菜单编号最后一个,替换成")";
			sb.setCharAt(sb.length()-1, ')');
	
			List menus=imeus.pageQuery(sb.toString(), null, null, null);
			Set set=new HashSet(menus);
			
			//然后把,菜单集合重新放入到角色对象中;
			role.setMenuses(set);
		}
		//最后,进行更新;
		irole.update(role);	
		System.out.println("菜单更新完成!。");
	}
	
	
	public Set getUsersByRolesId(Long rolesid) {
		// TODO Auto-generated method stub
		String hql="From Roles r where r.rolesid=?";
		List list=imeus.pageQuery(hql, null, null,rolesid);
		Set set=new HashSet();
		for (Object obj : list) {
			Roles role=(Roles)obj;
			set=role.getUserses();
		}
		return set;
	}
}

 

 

创建角色的数据库脚本,

--创建用户表;
drop table users;
create table users(
     --主键,
     userid number primary key not null,
     username varchar2(50)not null,
     userpass varchar2(20)not null,
     --外键,所属部门;
     deptid number not null,  
     --生日;
     birthday date not null,
     sex varchar2(4)not null,
     age number not null,
     --手机;
     combine varchar2(11)null,
     email varchar2(50)null,
     address varchar2(50)null,
     zipcode varchar2(8)null,
     remark varchar2(50)null,
     --创建users表的所属部门的外键;
     foreign key(deptid) references dept(deptid)
)

--创建序列;
drop sequence seq_users;
create sequence seq_users;
insert into users values(seq_users.nextval,'雪见','123456',3,sysdate,'女',23,'13459858985','xuejian@163.com','北京市','0101000','暂无备注');
insert into users values(seq_users.nextval,'李逍遥','123456',1,sysdate,'男',27,'15973556785','huge@126.com','北京市','014502','暂无备注');
insert into users values(seq_users.nextval,'龙葵','123456',2,sysdate,'男',20,'18978985858','longkui@126.com','湖南长沙','314502','暂无备注');


--创建角色表;
drop table roles;
create table roles(
	rolesid number primary key not null,                --主键角色编号;
	rolename varchar2(20)not null                       --角色名称;  
)
drop sequence seq_roles;
create sequence seq_roles;

insert into roles values(seq_roles.nextVal,'管理员');
insert into roles values(seq_roles.nextVal,'程序员');
insert into roles values(seq_roles.nextVal,'项目经理');
insert into roles values(seq_roles.nextVal,'公司总裁');

--用户角色中间表;
drop table user_roles;
create table user_roles(
	urId number references users(userid),     --<外键>用户编号;
	rolesid number references roles(rolesid)  --<外键>角色编号;
);

insert into user_roles values(1,1);
insert into user_roles values(2,2);
insert into user_roles values(3,3);


--菜单表;
drop table menus;
create table menus(                 
	menusid number primary key not null,                          --菜单编号; 
	menusname varchar2(20)not null,                               --菜单姓名; 
	menusparent number not null,                                  --父菜单编号;
	menusurl varchar2(150) null,                                  --菜单链接;
	isshow number not null                                        --是否显示;
)
drop sequence seq_menus;
create sequence seq_menus;

--'-1'代表根目录 ; --1代表根目录下; 2--代表1的跟目下, --3代表-同级目录;
insert into menus values(seq_menus.nextVal,'功能菜单',-1,'',1);
insert into menus values(seq_menus.nextVal,'系统管理',1,'',1);
insert into menus values(seq_menus.nextVal,'用户管理',2,'',1);

insert into menus values(seq_menus.nextVal,'考勤管理',3,'',1);
insert into menus values(seq_menus.nextVal,'个人设置',3,'',1);
insert into menus values(seq_menus.nextVal,'短信管理',3,'',1);
insert into menus values(seq_menus.nextVal,'通讯录管理',3,'',1);
insert into menus values(seq_menus.nextVal,'权限管理',3,'',1);
insert into menus values(seq_menus.nextVal,'公告管理',3,'',1);


--角色菜单中间表;
drop table rols_menus;
create table rols_menus(
	rolesid number references roles(rolesid), --<外键>角色编号;
	menusid number references menus(menusid)  --<外键>菜单编号;
)


drop sequence seq_rols_menus;
create sequence seq_rols_menus;

insert into rols_menus values(1,1);
insert into rols_menus values(1,2);
insert into rols_menus values(2,1);
insert into rols_menus values(2,2);
insert into rols_menus values(3,1);
insert into rols_menus values(4,2);