基于角色权限系统(第一节)-用户登录实现

一、表的设计


二、需求分析

1、用户登录

2、用户管理:用户角色动态分析

3、角色管理:角色权限动态分析

4、菜单管理

三、数据表的设计

1、用户、角色、权限菜单关系

2、用户和角色是一对多的关系

3、角色和权限菜单是多对多的关系

t_user用户表

CREATE TABLE `t_user` (

`userId` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',

`userName` varchar(20) DEFAULT NULL COMMENT '用户名',

`password` varchar(20) DEFAULT NULL COMMENT '密码',

`userType` tinyint(4) DEFAULT NULL COMMENT '用户类型',

`roleId` int(11) DEFAULT NULL COMMENT '角色id(外键)',

`userDescription` varchar(200) DEFAULT NULL COMMENT '用户备注',

PRIMARY KEY (`userId`),

KEY `FK_t_user` (`roleId`),

CONSTRAINT `FK_t_user` FOREIGN KEY (`roleId`) REFERENCES `t_role` (`roleId`)

) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8

t_role角色表

CREATE TABLE `t_role` (

`roleId` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色id',

`roleName` varchar(20) DEFAULT NULL COMMENT '角色名称',

`authIds` varchar(50) DEFAULT NULL COMMENT '菜单权限ID集合',

`roleDescription` varchar(200) DEFAULT NULL COMMENT '角色备注',

PRIMARY KEY (`roleId`)

) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8

t_ruth权限菜单表

CREATE TABLE `t_auth` (

`authId` int(11) NOT NULL AUTO_INCREMENT COMMENT '菜单ID',

`authName` varchar(20) DEFAULT NULL COMMENT '菜单名称',

`authPath` varchar(100) DEFAULT NULL COMMENT '菜单路径',

`parentId` int(11) DEFAULT NULL COMMENT '父级id',

`authDescription` varchar(200) DEFAULT NULL COMMENT '资源备注',

`state` varchar(20) DEFAULT NULL COMMENT '状态',

`iconCls` varchar(20) DEFAULT NULL COMMENT '菜单图标',

PRIMARY KEY (`authId`)

) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8

四、开发环境搭建

4.1、使用到技术:jsp+servlet+mysql+easyui

4.2、web环境搭建

点击下一步


点击下一步


点击下一步


点击finish

4.3、创建好的web项目工程结构


4.4、导入相关的jar包


4.5、引入jquery-easyui框架


4.6、编写JSP页面代码

login.jsp

<%@pagelanguage="java"contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

"Content-Type"content="text/html; charset=UTF-8">

"style/login.css"rel="stylesheet"type="text/css">

用户登陆

"text/javascript">

functionloadimage(){

document.getElementById("randImage").src="images/image.jsp?"+Math.random();

}

"form1"name="form1"action="user?action=login"method="post">

"MAIN">

    "top">

    "top2">

    "topA">

    "topB">

    "http://www.baidu.com"target="_blank">"images/login/logo.gif"alt=""style=""/>

    "topC">

    "topD">

    "login">



  • "left">用户名:"userName"name="userName"type="text"class="txt"value="${userName }"/>
  • "left">密  码:"password"name="password"type="password"class="txt"value="${password }"onkeydown="if(event.keyCode==13)form1.submit()"/>
  • "left">验证码:"text"value="${imageCode }"name="imageCode"class="txtCode"id="imageCode"size="10"onkeydown="if(event.keyCode==13)form1.submit()"/> "换一张试试"name="randImage"id="randImage"src="images/image.jsp"width="60"height="20"border="1"align="absmiddle">
  • "topE">

    "middle_A">

    "middle_B">

    "middle_C">"btn">""src="images/login/btnlogin.gif"onclick="javascript:document.getElementById('form1').submit()"/>  "red">${error }

    "middle_D">

    "bottom_A">

    "bottom_B">

    login.css

    body

    {

    margin:0;

    padding:0;

    font-size:12px;

    background:#214D90url(../images/login/bg.gif)repeat-x;

    color:#999999;

    font-family:Tahoma,Verdana;

    }

    ul

    {

    list-style:none;

    margin:0;

    padding:0;

    }

    .Main

    {

    width:940px;

    margin:0auto;

    }

    .top

    {

    height:75px;

    background:url(../images/login/login_01.gif)no-repeat;

    }

    .top2

    {

    height:94px;

    background:url(../images/login/login_02.gif)no-repeat;

    }

    .topA

    {

    width:155px;

    height:140px;

    float:left;

    overflow:hidden;

    background:url(../images/login/login_03.gif)no-repeat;

    }

    .topB

    {

    width:282px;

    height:140px;

    float:left;

    overflow:hidden;

    background:url(../images/login/login_04.gif)no-repeat;

    }

    .topC

    {

    width:27px;

    height:140px;

    float:left;

    overflow:hidden;

    background:url(../images/login/login_05.gif)no-repeat;

    }

    .topD

    {

    width:318px;

    height:140px;

    float:left;

    overflow:hidden;

    background:url(../images/login/login_06.gif)no-repeat;

    }

    .topE

    {

    width:158px;

    height:140px;

    float:left;

    overflow:hidden;

    background:url(../images/login/login_07.gif)no-repeat;

    }

    .middle_A

    {

    width:155px;

    height:94px;

    float:left;

    overflow:hidden;

    background:url(../images/login/login_08.gif)no-repeat;

    }

    .middle_B

    {

    width:309px;

    height:94px;

    float:left;

    overflow:hidden;

    background:url(../images/login/login_09.gif)no-repeat;

    }

    .middle_C

    {

    width:318px;

    height:94px;

    float:left;

    overflow:hidden;

    background:url(../images/login/login_10.gif)no-repeat;

    }

    .middle_D

    {

    width:158px;

    height:94px;

    float:left;

    overflow:hidden;

    background:url(../images/login/login_11.gif)no-repeat;

    }

    .bottom_A

    {

    height:72px;

    clear:both;

    overflow:hidden;

    background:url(../images/login/login_12.gif)no-repeat;

    }

    .bottom_B

    {

    height:70px;

    overflow:hidden;

    text-align:center;

    background:url(../images/login/login_13.gif)no-repeat;

    }

    .login

    {

    }

    .loginli

    {

    line-height:35px;

    height:35px;

    overflow:hidden;

    }

    .left

    {line-height:35px;

    vertical-align:middle;

    width:50px;

    height:34px;

    text-align:right;

    display:-moz-inline-box;

    display:inline-block;

    padding-bottom:3px;

    }

    .txt

    {

    width:215px;

    height:30px;

    line-height:30px;

    overflow:hidden;

    border:0px;

    padding-left:3px;

    color:#999999;

    background:url(../images/login/txt.gif)no-repeatleftcenter;

    }

    .txtCode

    {

    line-height:30px;

    width:93px;

    height:30px;

    overflow:hidden;

    border:0px;

    padding-left:3px;

    color:#999999;

    background:url(../images/login/code.gif)no-repeatleftcenter;

    }

    .btn

    {

    margin-left:53px;

    }

    main.jsp注界面

    ${currentuser.userName},登陆成功

    4.7、编写相关后端代码

    实体类

    packagecom.xiaowen.model;

    importjava.io.Serializable;

    /**

    * 用户实体类

    *@authorxiaowen

    */

    publicclassUserimplementsSerializable {

    privatestaticfinallongserialVersionUID= 1L;

    privateIntegeruserId;//用户ID

    privateStringuserName;//用户名

    privateStringpassword;//密码

    privateIntegeruserType;//用户类型

    privateIntegerroleId=1;//角色ID

    privateStringuserDescription;//用户备注

    publicUser() {

    super();

    }

    publicUser(StringuserName, Stringpassword) {

    super();

    this.userName=userName;

    this.password=password;

    }

    publicInteger getUserId() {

    returnuserId;

    }

    publicvoidsetUserId(IntegeruserId) {

    this.userId=userId;

    }

    publicString getUserName() {

    returnuserName;

    }

    publicvoidsetUserName(StringuserName) {

    this.userName=userName;

    }

    publicString getPassword() {

    returnpassword;

    }

    publicvoidsetPassword(Stringpassword) {

    this.password=password;

    }

    publicInteger getUserType() {

    returnuserType;

    }

    publicvoidsetUserType(IntegeruserType) {

    this.userType=userType;

    }

    publicInteger getRoleId() {

    returnroleId;

    }

    publicvoidsetRoleId(IntegerroleId) {

    this.roleId=roleId;

    }

    publicString getUserDescription() {

    returnuserDescription;

    }

    publicvoidsetUserDescription(StringuserDescription) {

    this.userDescription=userDescription;

    }

    }

    dao类

    packagecom.xiaowen.dao;

    importjava.sql.Connection;

    importjava.sql.PreparedStatement;

    importjava.sql.ResultSet;

    importcom.xiaowen.model.User;

    /**

    * 用户的Dao数据层

    *@authorxiaowen

    */

    publicclassUserDao {

    /**

    * 用户登陆

    *@paramcon

    *@paramuser

    *@return

    *@throwsException

    */

    publicUserlogin(Connectioncon,Useruser)throwsException{

    UserresultUser=null;

    Stringsql="select * from t_user where userName=? and password=?";

    PreparedStatementpst=con.prepareStatement(sql);

    pst.setString(1,user.getUserName());

    pst.setString(2,user.getPassword());

    ResultSetrs=pst.executeQuery();

    if(rs.next()){

    resultUser=newUser();

    resultUser.setUserId(rs.getInt("userId"));

    resultUser.setUserName(rs.getString("userName"));

    resultUser.setPassword(rs.getString("password"));

    resultUser.setRoleId(rs.getInt("roleId"));

    }

    returnresultUser;

    }

    }

    工具类

    packagecom.xiaowen.util;

    importjava.sql.Connection;

    importjava.sql.DriverManager;

    /**

    * 数据库工具类

    *@authorxiaowen

    */

    publicclassDbUtil {

    privateStringdbUrl="jdbc:mysql://localhost:3306/db_rbps";

    privateStringdbUserName="root";

    privateStringdbPassword="123456";

    privateStringdbDriver="com.mysql.jdbc.Driver";

    /**

    * 数据库连接

    *@return

    *@throwsException

    */

    publicConnection getCon()throwsException{

    Class.forName(dbDriver);

    Connectioncon=DriverManager.getConnection(dbUrl,dbUserName,dbPassword);

    returncon;

    }

    /**

    * 数据库关闭

    *@paramcon

    *@throwsException

    */

    publicvoidcloseCon(Connectioncon)throwsException{

    if(con!=null){

    con.close();

    }

    }

    publicstaticvoidmain(String[]args) {

    DbUtildbUtil=newDbUtil();

    try{

    dbUtil.getCon();

    System.out.println("数据库连接成功!");

    }catch(Exceptione) {

    e.printStackTrace();

    System.out.println("数据库连接失败!");

    }

    }

    }

    service层

    packagecom.xiaowen.server;

    importjava.io.IOException;

    importjava.sql.Connection;

    importjavax.servlet.ServletException;

    importjavax.servlet.http.HttpServlet;

    importjavax.servlet.http.HttpServletRequest;

    importjavax.servlet.http.HttpServletResponse;

    importjavax.servlet.http.HttpSession;

    importcom.xiaowen.dao.UserDao;

    importcom.xiaowen.model.User;

    importcom.xiaowen.util.DbUtil;

    importcom.xiaowen.util.StringUtil;

    /**

    * 用户Server处理层

    *@authorxiaowen

    */

    publicclassUserServerextendsHttpServlet{

    privatestaticfinallongserialVersionUID= 1L;

    DbUtildbUtil=newDbUtil();

    UserDaouserDao=newUserDao();

    Connectioncon=null;

    @Override

    publicvoidservice(HttpServletRequestrequest, HttpServletResponseresponse)throwsServletException, IOException {

    response.setCharacterEncoding("utf-8");

    Stringaction=request.getParameter("action");

    if("login".equals(action)){

    login(request,response);

    }

    }

    privatevoidlogin(HttpServletRequestrequest, HttpServletResponseresponse)throwsServletException, IOException {

    HttpSessionsession=request.getSession();

    StringuserName=request.getParameter("userName");

    Stringpassword=request.getParameter("password");

    StringimageCode=request.getParameter("imageCode");

    request.setAttribute("userName",userName);

    request.setAttribute("password",password);

    request.setAttribute("imageCode",imageCode);

    if(StringUtil.isEmpty(userName)||StringUtil.isEmpty(password)){

    request.setAttribute("error","用户名或密码错误!");

    request.getRequestDispatcher("login.jsp").forward(request,response);

    return;

    }

    if(StringUtil.isEmpty(imageCode)){

    request.setAttribute("error","验证码为空!");

    request.getRequestDispatcher("login.jsp").forward(request,response);

    return;

    }

    if(!imageCode.equals(session.getAttribute("sRand"))){

    request.setAttribute("error","验证码错误");

    request.getRequestDispatcher("login.jsp").forward(request,response);

    return;

    }

    Useruser=newUser(userName,password);

    try{

    con=dbUtil.getCon();

    Usercurrentuser=userDao.login(con,user);

    if(currentuser==null){

    request.setAttribute("error","用户名或密码错误!");

    request.getRequestDispatcher("login.jsp").forward(request,response);

    }else{

    session.setAttribute("currentuser",currentuser);

    response.sendRedirect("main.jsp");

    }

    }catch(Exceptione) {

    e.printStackTrace();

    }finally{

    try{

    dbUtil.closeCon(con);

    }catch(Exceptione) {

    e.printStackTrace();

    }

    }

    }

    }

    最后编辑于
    ©著作权归作者所有,转载或内容合作请联系作者
    • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
      沈念sama阅读 194,242评论 5 459
    • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
      沈念sama阅读 81,769评论 2 371
    • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
      开封第一讲书人阅读 141,484评论 0 319
    • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
      开封第一讲书人阅读 52,133评论 1 263
    • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
      茶点故事阅读 61,007评论 4 355
    • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
      开封第一讲书人阅读 46,080评论 1 272
    • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
      沈念sama阅读 36,496评论 3 381
    • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
      开封第一讲书人阅读 35,190评论 0 253
    • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
      沈念sama阅读 39,464评论 1 290
    • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
      茶点故事阅读 34,549评论 2 309
    • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
      茶点故事阅读 36,330评论 1 326
    • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
      沈念sama阅读 32,205评论 3 312
    • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
      茶点故事阅读 37,567评论 3 298
    • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
      开封第一讲书人阅读 28,889评论 0 17
    • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
      开封第一讲书人阅读 30,160评论 1 250
    • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
      沈念sama阅读 41,475评论 2 341
    • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
      茶点故事阅读 40,650评论 2 335

    推荐阅读更多精彩内容