基于角色權(quán)限系統(tǒng)(第一節(jié))-用戶登錄實(shí)現(xiàn)

一竖配、表的設(shè)計(jì)


二何址、需求分析

1、用戶登錄

2进胯、用戶管理:用戶角色動(dòng)態(tài)分析

3用爪、角色管理:角色權(quán)限動(dòng)態(tài)分析

4、菜單管理

三胁镐、數(shù)據(jù)表的設(shè)計(jì)

1偎血、用戶、角色、權(quán)限菜單關(guān)系

2、用戶和角色是一對(duì)多的關(guān)系

3蝇棉、角色和權(quán)限菜單是多對(duì)多的關(guān)系

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?'菜單權(quán)限ID集合',

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

PRIMARY?KEY?(`roleId`)

)?ENGINE=InnoDB?AUTO_INCREMENT=19?DEFAULT?CHARSET=utf8

t_ruth權(quán)限菜單表

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?'父級(jí)id',

`authDescription`?varchar(200)?DEFAULT?NULL?COMMENT?'資源備注',

`state`?varchar(20)?DEFAULT?NULL?COMMENT?'狀態(tài)',

`iconCls`?varchar(20)?DEFAULT?NULL?COMMENT?'菜單圖標(biāo)',

PRIMARY?KEY?(`authId`)

)?ENGINE=InnoDB?AUTO_INCREMENT=26?DEFAULT?CHARSET=utf8

四、開(kāi)發(fā)環(huán)境搭建

4.1制跟、使用到技術(shù):jsp+servlet+mysql+easyui

4.2、web環(huán)境搭建

點(diǎn)擊下一步


點(diǎn)擊下一步


點(diǎn)擊下一步


點(diǎn)擊finish

4.3、創(chuàng)建好的web項(xiàng)目工程結(jié)構(gòu)


4.4、導(dǎo)入相關(guān)的jar包


4.5空郊、引入jquery-easyui框架


4.6、編寫(xiě)JSP頁(yè)面代碼

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">驗(yàn)證碼:"text"value="${imageCode }"name="imageCode"class="txtCode"id="imageCode"size="10"onkeydown="if(event.keyCode==13)form1.submit()"/> "換一張?jiān)囋?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羞延、編寫(xiě)相關(guān)后端代碼

    實(shí)體類

    packagecom.xiaowen.model;

    importjava.io.Serializable;

    /**

    * 用戶實(shí)體類

    *@authorxiaowen

    */

    publicclassUserimplementsSerializable {

    privatestaticfinallongserialVersionUID= 1L;

    privateIntegeruserId;//用戶ID

    privateStringuserName;//用戶名

    privateStringpassword;//密碼

    privateIntegeruserType;//用戶類型

    privateIntegerroleId=1;//角色I(xiàn)D

    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數(shù)據(jù)層

    *@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;

    /**

    * 數(shù)據(jù)庫(kù)工具類

    *@authorxiaowen

    */

    publicclassDbUtil {

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

    privateStringdbUserName="root";

    privateStringdbPassword="123456";

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

    /**

    * 數(shù)據(jù)庫(kù)連接

    *@return

    *@throwsException

    */

    publicConnection getCon()throwsException{

    Class.forName(dbDriver);

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

    returncon;

    }

    /**

    * 數(shù)據(jù)庫(kù)關(guān)閉

    *@paramcon

    *@throwsException

    */

    publicvoidcloseCon(Connectioncon)throwsException{

    if(con!=null){

    con.close();

    }

    }

    publicstaticvoidmain(String[]args) {

    DbUtildbUtil=newDbUtil();

    try{

    dbUtil.getCon();

    System.out.println("數(shù)據(jù)庫(kù)連接成功!");

    }catch(Exceptione) {

    e.printStackTrace();

    System.out.println("數(shù)據(jù)庫(kù)連接失斊⒒埂伴箩!");

    }

    }

    }

    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","用戶名或密碼錯(cuò)誤!");

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

    return;

    }

    if(StringUtil.isEmpty(imageCode)){

    request.setAttribute("error","驗(yàn)證碼為空鄙漏!");

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

    return;

    }

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

    request.setAttribute("error","驗(yàn)證碼錯(cuò)誤");

    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","用戶名或密碼錯(cuò)誤嗤谚!");

    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();

    }

    }

    }

    }

    最后編輯于
    ?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
    • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市怔蚌,隨后出現(xiàn)的幾起案子巩步,更是在濱河造成了極大的恐慌,老刑警劉巖桦踊,帶你破解...
      沈念sama閱讀 206,723評(píng)論 6 481
    • 序言:濱河連續(xù)發(fā)生了三起死亡事件椅野,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)竟闪,發(fā)現(xiàn)死者居然都...
      沈念sama閱讀 88,485評(píng)論 2 382
    • 文/潘曉璐 我一進(jìn)店門(mén)离福,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人炼蛤,你說(shuō)我怎么就攤上這事妖爷。” “怎么了理朋?”我有些...
      開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
    • 文/不壞的土叔 我叫張陵絮识,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我嗽上,道長(zhǎng)次舌,這世上最難降的妖魔是什么? 我笑而不...
      開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
    • 正文 為了忘掉前任炸裆,我火速辦了婚禮垃它,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烹看。我一直安慰自己国拇,他們只是感情好,可當(dāng)我...
      茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
    • 文/花漫 我一把揭開(kāi)白布惯殊。 她就那樣靜靜地躺著酱吝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪土思。 梳的紋絲不亂的頭發(fā)上务热,一...
      開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
    • 那天,我揣著相機(jī)與錄音己儒,去河邊找鬼崎岂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛闪湾,可吹牛的內(nèi)容都是我干的冲甘。 我是一名探鬼主播,決...
      沈念sama閱讀 38,389評(píng)論 3 400
    • 文/蒼蘭香墨 我猛地睜開(kāi)眼途样,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼江醇!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起何暇,我...
      開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
    • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤陶夜,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后裆站,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體条辟,經(jīng)...
      沈念sama閱讀 43,519評(píng)論 1 300
    • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黔夭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
      茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
    • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捂贿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纠修。...
      茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
    • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖厂僧,靈堂內(nèi)的尸體忽然破棺而出扣草,到底是詐尸還是另有隱情,我是刑警寧澤颜屠,帶...
      沈念sama閱讀 33,738評(píng)論 4 324
    • 正文 年R本政府宣布辰妙,位于F島的核電站,受9級(jí)特大地震影響甫窟,放射性物質(zhì)發(fā)生泄漏密浑。R本人自食惡果不足惜,卻給世界環(huán)境...
      茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
    • 文/蒙蒙 一粗井、第九天 我趴在偏房一處隱蔽的房頂上張望尔破。 院中可真熱鬧,春花似錦浇衬、人聲如沸懒构。這莊子的主人今日做“春日...
      開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
    • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)胆剧。三九已至,卻和暖如春醉冤,著一層夾襖步出監(jiān)牢的瞬間秩霍,已是汗流浹背。 一陣腳步聲響...
      開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
    • 我被黑心中介騙來(lái)泰國(guó)打工蚁阳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铃绒,地道東北人。 一個(gè)月前我還...
      沈念sama閱讀 45,547評(píng)論 2 354
    • 正文 我出身青樓螺捐,卻偏偏與公主長(zhǎng)得像颠悬,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子归粉,可洞房花燭夜當(dāng)晚...
      茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

    推薦閱讀更多精彩內(nèi)容