精华内容
下载资源
问答
  • 图书管理数据库系统

    万次阅读 多人点赞 2020-01-29 19:22:44
    发本文的原因:本文是一个很经典的图书管理系统设计,大学本科实验,用...该实验设计开发一个简单的图书管理数据库系统,包括图书馆内书籍的信息、学校在校师生的信息以及师生的借阅信息。此系统用户面向图书管理员...

    发本文的原因:本文是一个很经典的图书管理系统设计,大学本科实验,用例图,流程图真香!包含全部设计架构和源代码 ,可直接使用。

    链接:https://pan.baidu.com/s/16Wda96TQ_4MWHj5cXNhZaA 
    提取码:ug6z

    1  系统简介

    该实验设计开发一个简单的图书管理数据库系统,包括图书馆内书籍的信息、学校在校师生的信息以及师生的借阅信息。此系统用户面向图书管理员和借阅读者,图书馆管理员可以完成图书、读者、图书类型、学科类型、读者类型等基本信息的增加、删除和修改,可以制定借阅规则;读者可以进行图书的借阅、续借、归还、预约的确认等操作。

    系统开发技术及工具:Java JSP HTML Oracle数据库 tomcat服务器 Windows10系统  PC机

    2  系统分析

    2.1 功能模块简介

     

    2.2 功能需求描述

    • 借阅功能:

    图书出借时考虑三个问题:

    1. 读者是否因为超期、罚款等情况被关闭了借阅权限;
    2. 读者是否已经借满其限额。
    3. 该书是否不在库中;

    如果不存在以上情况,则可以出借。

    • 预约功能:

    读者想借的书如果不在库中(已经被出借),读者可以预约该图书,当该图书被归还时系统给读者发送邮件,提醒他来借阅,此时其他读者也可以借阅该书。

    • 续借功能:

    读者还书的时候可以续借该图书,续借的过程包括先执行还书操作,再执行借阅操作。

    • 发送催还邮件:

    管理员可以发送邮件提醒读者到期还书。

    • 读者管理功能:

    对读者信息进行查看、添加、修改、删除。将读者分为不同类别,赋以不同权限。

    • 系统管理功能:

    对管理员的登录账号、密码进行添加、修改、删除。

    • 借阅规则管理功能:

    对图书借阅规则进行查看、添加、修改、删除。

    2.3 系统用例图

     

    3 系统数据库设计

    3.1 系统概念模型设计

    数据库需要描述的数据信息包括以下几种:

    (1)读者信息

    (2)书籍信息

    (3)管理员信息

    (4)藏书分类信息

    (5)图书学科分类信息

    (6)读者分类信息

    (7)读者与书籍之间的关系(借阅关系E-R图)

    (8) 读者类型与书籍类型之间的关系(规则关系E-R图)

    这些数据项之间的关系可以用下列E-R图表示:

     

    3.2 数据库详细设计

    本系统共设计9个表、6个序列、4个存储过程、3个函数、4个触发器。

    针对一般图书管理信息系统的需求,通过对图书管理工作过程的内容和数据流程分析,设计如下面所示的9个数据表

    1. 读者信息

    属性:读者编号,读者姓名,联系电话,邮箱地址,所在系,权限状况,读者类型,备注

    主键:读者编号

    2.书籍信息

    属性:图书编号,ISBN,书名,作者,出版社,出版日期,简介,封面图片,价格,学科类型,藏书类型

    主键:图书编号

    3.管理员信息

    属性:编号,账号,密码

    主键:编号

    4)读者类型

    属性:编号,类型,说明

    主键:编号

    5)藏书类型

    属性:编号,类型,说明

    主键:编号

    6)学科类型

    属性:编号,类型,说明

    主键:编号

    7)借阅信息

    属性:图书编号,读者编号,借阅日期,应还日期

    主键:图书编号,读者编号

    8)预约信息

    属性:图书编号,读者编号,预约日期

    主键:图书编号,读者编号

    9)借阅规则

    属性:图书类型,读者类型,期限,册数,续借次数,逾期罚款

    主键:图书类型,读者类型

    6个序列:

    读者编号、图书编号、读者类型编号、藏书类型编号、学科编号、管理员编号

    4个存储过程:

      • 检查借阅是否超期的存储过程;
      • 判断读者可否进行借阅的存储过程;
      • 计算超期罚款的存储过程;
      • 将超期未还的读者借阅权限关闭的存储过程;

    4个函数:

      • 计算图书应归还日期的函数;
      • 计算读者可借阅图书册书的函数;
      • 计算读者已经借阅某类型图书的册数的函数;
      • 计算读者应交欠费的函数。

    4个触发器:

      • 删除藏书类型的触发器;
      • 删除读者类型的触发器;
      • 删除图书的触发器;
      • 删除读者的触发器。

     

    3.3 表设计

    1、数据库表逻辑结构设计。

    表1 读者表(reader)

     

    列名

    类型

    长度

    约束

    备注

    readerid

    number

    11

    主键

    读者编号

    name

    varchar2

    10

    非空

    读者姓名

    telephone

    varchar2

    15

     

    联系电话

    email

    varchar2

    30

     

    邮箱地址

    dept

    varchar2

    20

     

    所在院系

    right

    number

    1

    取值为0或1

    借阅权限

    readertype

    number

    11

    外键

    读者类型

    demo

    varchar2

    1000

     

    说明

    2 图书表(book)

     

    列名

    类型

    长度

    约束

    备注

    bookid

    number

    11

    主键

    书籍编号

    bookname

    varchar2

    20

    非空

    书籍名称

    author1

    varchar2

    20

    非空

    书籍作者

    author2

    varchar2

    20

     

    书籍作者

    author3

    varchar2

    20

     

    书籍作者

    pubdate

    date

     

     

    出版日期

    publish

    varchar2

    30

     

    出版社

    photo

    varchar2

    100

     

    图片地址

    abstract

    varchar2

    4000

     

    内容简介

    Price

    number

    7,2

    非空

    价格

    ISBN

    varchar2

    17

    非空

    书籍ISBN码

    bookclass

    number

    11

    外键

    学科类型

    booktype

    number

    11

    外键

    藏书类型

     

    表3 管理员用户表(admin)

    列名

    类型

    长度

    约束

    备注

    Id

    number

    11

    主键

    管理员编号

    username

    varchar2

    10

    非空

    管理员帐号

    password

    varchar2

    11

    非空

    帐号密码

    4 读者类型(reader_type)

    列名

    类型

    长度

    约束

    备注

    typeid

    number

    11

    主键

    类型编号

    typename

    varchar2

    20

    非空

    类型名称

    demo

    varchar2

    100

     

    说明

    5 藏书类型表(book_type)

    列名

    类型

    长度

    约束

    备注

    typeid

    number

    11

    主键

    类型编号

    typename

    varchar2

    20

    非空

    类型名称

    demo

     varchar2

    100

     

    说明

    6 学科类型表(book_class)

    列名

    类型

    长度

    约束

    备注

    classid

    number

    11

    主键

    类型编号

    classname

    varchar2

    20

    非空

    类型名称

    demo

     varchar2

    100

     

    说明

     

    表7 借阅表(borrow)

    列名

    类型

    长度

    约束

    备注

    readerid

    number

    11

    联合主键,外键

    读者编号

    bookid

    number

    11

    联合主键,外键

    图书编号

    borrowdate

    date

     

     

    出借日期

    due

    date

     

     

    应还日期

    8 预约表(preconcert)

    列名

    类型

    长度

    约束

    备注

    readerid

    number

    11

    联合主键,外键

    读者编号

    bookid

    number

    11

    联合主键,外键

    图书编号

    predate

    date

     

     

    预约日期

    9 规则表(rule)

    列名

    类型

    长度

    约束

    备注

    booktype

    number

    11

    联合主键,外键

    藏书类型号

    readertype

    number

    11

    联合主键,外键

    读者类型号

    days

    number

    5

    非空

    期限(天)

    num

    number

    5

    非空

    册数(本)

    renew

    number

    5

    非空

    续借次数(次)

    overtime

    number

    5,2

    非空

    逾期处罚(元/册/天)

     

     

    2、创建数据库表的脚本。

    (1)创建BOOK_ClASS

    create table book_class(

    classid number(11) primary key,

    classname varchar2(20) not null,

    demo varchar2(100) 

    );

    (2)创建admin

    create table admin(

    id number(11) primary key,

    username varchar2(10) not null,

    password varchar2(11) not null

    );

    (3)创建reader_type

    create table reader_type(

    typeid number(11) primary key,

    typename varchar2(20) not null,

    demo varchar2(100)

    );

    (4)创建reader

    create table reader(

    readerid number(11) primary key,

    name varchar2(10) not null,

    telephone varchar2(15),

    email varchar2(30),

    dept varchar2(20),

    right number(1) check(right=0 or right=1),

    readertype number(11) references reader_type(typeid),

    demo varchar2(1000)

    );

    (5)创建book_type

    create table book_type(

    typeid number(11) primary key,

    typename varchar2(20) not null,

    demo varchar2(100)

    );

    (6)创建book

    create table book(

    bookid number(11) primary key,

    bookname varchar2(20) not null,

    author1 varchar2(20) not null,

    author2 varchar2(20),

    author3 varchar2(20),

    pubdate date,

    publish varchar2(30),

    photo varchar2(100),

    abstract varchar2(4000),

    price number(7,2) not null,

    isbn varchar2(17) not null,

    bookclass number(11) references book_class(classid),

    booktype number(11) references book_type(typeid)

    );

    (7)创建borrow

    create table borrow(

    readerid number(11),

    bookid number(11),

    borrowdate date,

    due date,

    primary key(readerid,bookid),

    foreign key (readerid) references reader(readerid),

    foreign key (bookid) references book(bookid)

    );

    (8)创建preconcert

    create table preconcert(

    readerid number(11),

    bookid number(11),

    predate date,

    primary key(readerid,bookid),

    foreign key (readerid) references reader(readerid),

    foreign key (bookid) references book(bookid)

    );

    (9)创建rule

    create table rule(

    booktype number(11),

    readertype number(11),

    days number(5) not null,

    num number(5) not null,

    renew number(5) not null,

    overtime number(5,2) not null,

    primary key(booktype,readertype),

    foreign key (booktype) references book_type(typeid),

    foreign key (readertype) references reader_type(typeid)

    );

     

    3.4 序列设计

    为了方便自动产生连续的读者编号、图书编号、读者类型编号、藏书类型编号、学科编号、管理员编号等字段,在数据库中分别用下列序列产生相应的编号。

    (1)create sequence seq_reader start with 1 increment by 1;

    (2)create sequence seq_book start with 1 increment by 1;

    (3)create sequence seq_reader_type start with 1 increment by 1;

    (4)create sequence seq_book_type start with 1 increment by 1;

    (5)create sequence seq_book_class start with 1 increment by 1;

    (6)create sequence seq_admin start with 1 increment by 1;

    3.5 视图设计

    为了方便查询读者借阅图书的情况及图书的借阅统计,创建下列视图。

    1. 创建名为“READER_BOOK_VIEW”的视图,包括读者信息、所借图书信息及借阅信息。

    CREATE OR REPLACE VIEW reader_book_view

    AS

    SELECT name,bookname,borrowdate,due,last_due  FROM readet,book,borrow

    WHWER reader.teadid=borrow.readid AND borrow.bookid=book.bookid;

    1. 创建名为“BOOK_TYPE_STAT_VIEW”的视图,包括各类图书的借阅统计信息。

    CREATE OR REPLACE VIEW book_type_stat_view

    AS

    SELECT booktype,COUNT(booktype)  FROM (

    SELECT readerid,borrow.booktype,booktype,borrowdate,due,last_due

    FROW borrow,book WHWER book.bookid=borrow.bookid)

    1. 存储过程设计

      1. 检查借阅是否超期的存储过程

    Create or replace procedure p_days_from_due(v_readerid number,v_bookid number,v_days out number)

    As

    Begin

    Select due –sysdate into v_days from borrow where readerid=v_readerid and bookid=v_bookid;

    Exception

    When others then

    v_days:=0;

    End;

    2.判断读者可否进行借阅的存储过程

    Create or replace procedure p_can_borrow(v_readerid in number, v_bookid in number, v_num out number)

    As

    V_right number;

    V_borrowed_num number;

    V_rule_num number;

    Begin

    Select right into v_right from reader where readerid=v_readerid;

    v_borrowed_num:=f_borrowed_num(v_readerid,v_bookid);

    v_rule_num:=f_rule_num(v_readerid,v_bookid);

    If v_right=1 then v_num:=0;

    Else

    v_num:=v_rule_num-v_borrowed_num;

    End if;

    Exception

     When others then

       v_num:=0;

    End;

    3.计算超期罚款的存储过程;

    Create or replace procedure p_timeover_money(v_readerid number,v_bookid number ,v_money out number)

    As

    V_days number;

    V_readertype number;

    V_booktype number;

    Begin

    p_days_from_due(v_readerid,v_bookid,v_days);

    Select booktype into v_booktype from book where bookid=v_bookid;

    Select readertype into v_readertype from reader where readerid=v_readerid;

    Select overtime*floor(abs(v_days)) into v_money from rule where readertype=v_readertype and booktype=v_booktype;

    Exception

    When others then

    v_money:=0;

    End;

    4.将超期未还的读者借阅权限关闭的存储过程

    Create or replace procedure p_cant_borrow(v_readerid in number, v_bookid in number, v_right out number)

    As

    V_right number;

    V_due date;

    V_next_date num;

    Begin

    Select right into v_right from reader where readerid=v_readerid;

    v_due:=f_borrowed_num(v_readerid,v_bookid);

    v_next_date:= to_date(sysdate,'yyyymmdd')-to_date(v_due,'yyyymmdd');

    If v_next_date >=0 then v_right=0;

    Else

    v_right=1;

    End if;

    Exception

    When others then

    v_right=0;

     

    3.7函数设计

    (1)计算图书应归还日期的函数。

    Create or replace function f_date_is_due(v_readerid number,v_bookid number)

    Return varchar2 as

    V_booktype number;

    V_readertype number;

    V_date varchar2(10);

    Begin

    Select booktype into v_booktype from book where bookid=v_bookid;

    Select readertype into v_readertype from reader where readerid=v_readerid;

    Select to_char(sysdate+days, 'yyyy-mm-dd') into v_date from rule where readertype=v_readertype and booktype=v_booktype;

    Return v_date;

    Exception

    /*尚未制定该类图书借阅规则*/

    When no_data_found then

    Select to_char(sysdate+30,’yyyy-mm-dd’) into v_date from dual;

    Return v_date;

    End;

     

    (2)计算读者可借阅图书册数的函数

    Create or replace function f_rule_num(v_readerid in number,v_bookid in number) return number

    As

    V_booktype number;

    V_readertype number;

    V_num number;

    Begin

    Select booktype into v_booktype from book where bookid=v_bookid;

    Select readertype into v_readertype from reader where readerid=v_readerid;

    Select num into v_num from rule where readertype=v_readertype and booktype=v_booktype;

    Return v_num;

    Exception

    /*尚未制定该类图书借阅规则*/

    When no_data_found then

    select max(num) into v_num from rule;

    return v_num;

    End;

     

    (3)计算读者已经借阅某类型图书的册数的函数

    Create or replace function f_borrowed_num(v_readerid number,v_bookid number)return number as

    V_num number;

    V_type number;

    Begin

    Select booktype into v_type from book where bookid=v_bookid;

    Select count(*) into v_num from book,borrow where book.bookid=borrow.bookid and readerid=v_readerid and booktype=v_type;

    Return v_num;

    End;

     

    (4)计算读者应交欠费的函数。

    create or replace function f_owned_money(v_readerid number)return number

    As

    v_fine number:=0.0;

    v_money number:=0.0;

    v_days number;

    v_borrow borrow%ROWTYPE;

    cursor c_borrow is select * from borrow where readerid=v_readerid;

    Begin

      for v_borrow in c_borrow loop

         p_days_from_due(v_borrow.readerid,v_borrow.bookid,v_days);

         if (v_days<0) then

            p_timeover_money(v_borrow.readerid,v_borrow.bookid,v_money);

            v_fine:=v_fine+v_money;

         end if;

      end loop;

      Return v_fine;

    End;

     

    3.8触发器设计

    (1)删除藏书类型的触发器。

    Create or replace trigger tr_delete_booktype

    Before delete on book_type for each row

    begin

    delete from book where booktype=:old.typeid;

    delete from rule where booktype=:old.typeid;

    End;

     

    (2)删除读者类型的触发器。

    Create or replace trigger tr_delete_readerype

    Before delete on reader_type for each row

    begin

    delete from reader where readertype=:old.typeid;

    delete from rule where readertype=:old.typeid;

    End;

     

    (3)删除图书的触发器。

    Create or replace trigger tr_delete_book

    Before delete on book for each row

    begin

    delete from borrow where bookid=:old.bookid;

    delete from preconcert where bookid=:old.bookid;

    End;

     

    (4)删除读者的触发器。

    Create or replace trigger tr_delete_reader

    Before delete on reader for each row

    begin

    delete from borrow where readerid=:old.readerid;

    delete from preconcert where readerid=:old.readerid;

    End;

     

    4.系统主要功能模块设计与实现

    4.1数据库的连接与访问

    1.注册驱动通过Class.forName()获取Oracle数据库驱动

    2.获取连接DriverManager.getConnection()

    3.获取数据库操作对象

    4.执行sql   executeQuery(sql); executeUpdate(sql); executeDelete(sql);

    5.处理查询结果集

    关键代码:

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); //通过Class.forName()获取Oracle数据库驱动

    String url="jdbc:oracle:thin:@localhost:1521:orcl"; //数据库名,端口号

    String user="scott";        //用户名

    String password="tiger";     //密码

    conn=DriverManager.getConnection(url, user, password);  //建立连接

    5.1借书管理

    (1)功能页面列表

    (2)业务流程图 

    (3)核心代码

    String sql1="select * from borrow where bookid="+bookid;

    ResultSet rs1=dbCon.executeQuery(sql1);

    rs1.next();

    int y=rs1.getRow();

    if(y>0)

    {

    //该书未还

    out.print("<center>该书未还!<a href=javascript:history.go(-1)>后退</a></center>");

    out.print("<br><center><a href=..\\main.jsp>〈〈返回首页</a></center>");

    }

    else

    {

    //判断该读者还能借几本书

    CallableStatement a=con.prepareCall("{call p_can_borrow(?,?,?)}");

    a.setInt(1,readerid.intValue()); 

    a.setInt(2, bookid.intValue());   

    a.registerOutParameter(3, Types.INTEGER);//输出

    a.execute(); 

    int  num=a.getInt(3);

     if(num>0)

     {

     

     //计算到期日期

     

    // 调用有一个in参数的函数; the function returns a VARCHAR

    CallableStatement cs = con.prepareCall("{? = call f_date_is_due(?,?)}");

    cs.registerOutParameter(1, Types.VARCHAR);

     

    cs.setInt(2, readerid.intValue());

    cs.setInt(3, bookid.intValue());

     

    cs.execute();

    String due = cs.getString(1);

     

    String sql="insert into borrow(readerid,bookid,borrowdate,due) values("+

    readerid+","+bookid+",sysdate,to_date('"+due+"','yyyy-mm-dd'))";

    System.out.println(sql);

     

    dbCon.executeUpdate(sql);

     

    out.print("<center>出借成功!<a href=javascript:history.go(-1)>继续借书</a></center>");

    out.print("<br><center><a href=..\\main.jsp>〈〈返回首页</a></center>");

    }

     else

    {

    //该书不能出借

    out.print("<center>出借限额已满或读者无权限!<a href=javascript:history.go(-1)>后退</a></center>");

    out.print("<br><center><a href=..\\main.jsp>〈〈返回首页</a></center>");}}
    (4)界面实现

    5.2还书管理

    1. 功能页面列表

    (2) 业务流程图 

    3)核心代码

    //还书入库

    String sql1="delete from borrow where bookid="+bookid+" and readerid="+readerid;

            dbCon.executeUpdate(sql1);

    //判断该书是否超期

    CallableStatement  a=con.prepareCall("{call p_days_from_due(?,?,?)}");

    a.setInt(1,readerid.intValue()); 

    a.setInt(2, bookid.intValue());   

    a.registerOutParameter(3, Types.INTEGER);//输出

    a.execute(); 

    int  num=a.getInt(3);

     if(num>=0)

     {

     //还书未超期

    dbCon.executeUpdate(sql);

    out.print("<center>还书成功!<a href=javascript:history.go(-1)>后退</a></center>");

    out.print("<br><center><a href=..\\main.jsp>〈〈返回首页</a></center>");

    }

     else

    {

     

    //计算超期罚款金额

    // 调用有一个OUT参数的存储过程; the procedure returns a NUMBER

    CallableStatement cs = con.prepareCall("{ call p_timeover_money(?,?,?)}");

    cs.setInt(1, readerid.intValue());

    cs.setInt(2, bookid.intValue());

    cs.registerOutParameter(3, Types.INTEGER);

    cs.execute();

    int m = cs.getInt(3);

    dbCon.executeUpdate(sql);

    out.print("<center>出借已超期!需缴纳罚款"+m+"元<a href=javascript:history.go(-1)>后退</a></center>");

    out.print("<br><center><a href=..\\main.jsp>〈〈返回首页</a></center>");

    }


     
    6.总结 

      本次综合实验让我深刻的体会到 Oracle 的魅力所在,加深了我对 Oracle 数 据库的理解,提升了我对 Oracle 数据库的综合运用能力。例如,我是在本次实 验中才理解了序列的用法,并真正用到实践中来。Oracle 的索引、视图等提高 了 orale 的访问速度,序列提高了数据插入的速度。函数和存储过程简化了后端 代码的量同时提高了稳定性和安全性,触发器的设计保证了数据的一致性。一个 完整的开发流程让我看到了 Oracle 数据库在实际开发过程中相比 MySQL 的优势 所在。 本次实验同样用到了 tomcat 服务器、JSP 技术。作为一个轻量级的服务器 tomcat 较为适合小型项目部署。JSP 技术对于小型项目也挺适用,虽然没有实现 前后端分离,但是可以让功能的实现变得易于完成代码的编写,也易于理解。本 次实验所用图书管理系统数据库模型数据库表设计等很经典,其价值值得深入挖 掘探索,完全可以称为我们今后数据库设计的入门案例。 

    展开全文
  • 用户登录系统数据库表设计 最近看了看公司后台用户登录系统的设计, 比较混乱, 主要还是因为URS和Oauth以及URS第三方这三个登录形式各不相同导致的。 下面着重介绍一下涉及到第三方登录中需要注意的...

    最近看了看公司后台用户登录系统的设计, 比较混乱, 主要还是因为URS和Oauth以及URS第三方这三个登录形式各不相同导致的。

    下面着重介绍一下涉及到第三方登录中需要注意的问题

     

     

    在一个新项目中, 如果是要建立自己的登录体系的话, 那么直接创建一个Users表,包含usernamepassword两列,这样,就可以实现登录了:

     id | username | password | name等其他字段
    ----+----------+----------+----------------
     A1 | bob      | a1b23f2c | ...
     A2 | adam     | c0932f32 | ...
    

    如果要让用户通过第三方登录,比如微博登录或QQ登录,怎么集成进来呢?

    以微博登录为例,由于微博使用OAuth2协议登录,所以,一个登录用户会包含他的微博身份的ID,一个Access Token用于代表该用户访问微博的API和一个过期时间。

    要集成微博登录,很多童鞋立刻想到把Users表扩展几列,记录下微博的信息:

     id | username | password | weibo_id | weibo_access_token | weibo_expires | name等其他字段
    ----+----------+----------+----------+--------------------+---------------+----------------
     A1 | bob      | a1b23f2c | W-012345 | xxxxxxxxxx         | 604800        | ...
     A2 | adam     | c0932f32 | W-234567 | xxxxxxxxxx         | 604800        | ...
    

    加一个QQ登录Users表就又需要加3列,非常不灵活

     

    那么我们需要对这个表进行拆分。当用户以任意一种方式登录成功后,我们读取到的总是Users表对应的一行记录,它实际上是用户的个人资料(Profile),而登录过程只是为了认证用户(Authenticate),无论是本地用密码验证,还是委托第三方登录,这个过程本质上都是认证。

    所以,如果把Profile和Authenticate分开,就十分容易理解了。Users表本身只存储用户的Profile, 其中ID为关联不同登录方式的外键。

     id | name | birth等其他字段
    ----+------+-----------------
     A1 | Bob  |  ...
     A2 | Adam | ...
    

    而通过用户名口令登录可视为一种Authenticate的方式,利用LocalAuth表维护:

     id | user_id | username | password
    ----+---------+----------+-----------
     01 | A1      | bob      | a1b23f2c
     02 | A2      | adam     | c0932f32

    通过微博登录可视为另一种Authenticate方式,利用OAuth表维护, 但是access_token一般情况也只有几个小时的时效, 所以存储它是没有意义的, 每次登录的时候去微博后台验证一下客户端传来的token就行了。 如果用户只用了第三方登录, 那就拿第三方数据来填充刚才的User表即可。

     id | user_id | weibo_id |
    ----+---------+----------+
     11 | A1      | W-012345 |
     12 | A2      | W-234567 |
    

    如果要添加另一种OAuth登录,比如QQ登录,那就再加一个列标示不同站点也就OK了, 但是要注意用户在不同登录方式的用户名和photo一般不一样, 所以也单独存起来

     id | user_id | oauth_name | oauth_id | nick_name| photo|
    ----+---------+------------+----------+----------+------+
     11 | A1      | weibo      | W-012345 | 
     12 | A2      | weibo      | W-234567 |
     13 | A1      | qq         | Q-090807 |
     14 | A2      | qq         | Q-807060 |
    

    通过这种方式, 无论用户采用哪种方式登录, 都可以锁定到用户的user_id。

    下面再说一下网易的URS登录, 因为我们要直接采用网易通行证, 所以也就不需自己存储密码, 因此我们的架构应该设为User表

     id | user_Email | username | birth
    ----+------------+----------+-----------
     01 | aa@126.com | bob      | 
     02 | bb@126.com | adam     | 

    如果用户只用第三方登录, 显然无法填充user_Email这个字段, 因此userEmail可以为空。 如果第三方登录采用的是URS第三方的接口, 它返回的oauth_id 是aa@wx.163.com这种形式。 具体设计和上面也类似。 整体上使用这种方式比现在后台的逻辑要清晰很多

    转载于:https://www.cnblogs.com/ysq2018China/p/10291779.html

    展开全文
  • MySQL创建数据库和创建数据表

    万次阅读 多人点赞 2019-10-20 23:44:40
    MySQL 创建数据库和创建数据表 MySQL 是最常用的数据库,在数据库操作中,基本都是增删改查操作,简称CRUD。 在这之前,需要先安装好 MySQL ,然后创建好数据库、数据表、操作用户。 一、数据库操作语言 数据库...

    MySQL 创建数据库和创建数据表

    MySQL 是最常用的数据库,在数据库操作中,基本都是增删改查操作,简称CRUD。

    在这之前,需要先安装好 MySQL ,然后创建好数据库、数据表、操作用户。

    一、数据库操作语言

    数据库在操作时,需要使用专门的数据库操作规则和语法,这个语法就是 SQL(Structured Query Language) 结构化查询语言。

    SQL 的主要功能是和数据库建立连接,进行增删改查的操作。SQL是关系型数据库管理系统的标准语言。

    SQL 语言的作用:

    1. 数据定义语言 DDL(Data Definition Language) 。用于创建数据库,数据表。

    2. 数据操作语言 DML(Data Manipulation Language) 。用于从数据表中插入、修改、删除数据。

    3. 数据查询语言 DQL(Data Query Language) 。用于从数据表中查询数据。

    4. 数据控制语言 DCL(Data Control Language) 。用来设置或修改数据库用户或角色的权限。

    使用 SQL 操作数据库时,所有的 SQL 语句都以分号结束。(切换数据库时可以不用分号)

    在 SQL 语句中,不区分大小写,编写 SQL 语句时可以根据情况用大小写的区别来增加可读性。

    二、创建数据库

    1. 连接 MySQL

    输入 mysql -u root -p 命令,回车,然后输入 MySQL 的密码(不要忘记了密码),再回车,就连接上 MySQL 了。

    mysql -u root -p

    最初,都是使用 root 用户登录,工作中如果一直用 root 用户登录,因为权限太大,风险是很大的,所以等创建好权限适合的用户后,就不要经常登录 root 用户了。

    2. 查看当前的数据库

    使用 show databases; 查看当前安装的 MySQL 中有哪些数据库。

    show databases;

    刚安装 MySQL 时,默认有四个数据库,information_schema,mysql,perfomance_schema,sys 。通常情况下,我们不会直接使用这四个数据库,但千万不要把这四个数据库删了,否则会带来很多不必要的麻烦。如果不小心删了,建议是重新安装 MySQL ,在重装之前把自己的数据迁移出来备份好,或者从其他服务器上迁移一个相同的数据库过来。

    3. 创建数据库

    使用 create database 数据库名; 创建数据库。

    create database MyDB_one;

    创建数据库成功后,数据库的数量变成了5个,多了刚才创建的 MyDB_one 。

    4. 创建数据库时设置字符编码

    使用 create database 数据库名 character set utf8; 创建数据库并设置数据库的字符编码。

    create database MyDB_two character set utf8;
    

    直接创建的数据库,数据库的编码方式是 MySQL 默认的编码方式 latin1 (单字节编码) ,通常我们会在数据库中存放中文数据,所以最好把数据库的编码方式设置成 utf-8 ,这样中文才能正常显示。

    create database MyDB_three charset utf8;

    character set 可以缩写成 charset ,效果是一样的。

    5. 查看和显示数据库的编码方式

    使用 show create database 数据库名; 显示数据库的创建信息。

    show create database MyDB_one;
    show create database MyDB_two;

    如果不知道一个数据库的编码方式是什么,可以使用 show create database 数据库名 来查看数据库的编码方式。可以看到刚才创建的 MyDB_one 的编码方式是 MySQL 的默认编码 latin1 ,MyDB_two 的编码方式是 utf-8 。

    当然,这种方式不能在创建的同时显示,只能查看一个已经存在的数据库的编码方式。

    6. 使用 alter database 数据库名 character set utf8; 修改数据库编码

    alter database MyDB_one character set utf8;

    如果一个数据库的编码方式不符合使用需求,可以进行修改。刚才创建的 MyDB_one 经过修改后,编码方式也变成了 utf-8 。

    7. 进入或切换数据库

    使用 use 数据库名 进入或切换数据库。

    use MyDB_one
    use MyDB_two;

    刚连接上 MySQL 时,没有处于任何一个数据库中,如果要使用某一个数据库,就需要进入到这个数据库中。

    use 数据库名 这个命令后面的分号可以省略,这是 SQL 语句中唯一可以省略分号的语句。

    8. 显示当前数据库 select database();

    select database();

    进入数据库中,可以使用 select database(); 来查看当前处于哪个数据库中。长时间操作数据库时,在很多数据库中来回切换后,查看当前的数据库,避免操作错了数据库。

    三、创建数据表

    1. 查看当前数据库中的表

    使用 show tables;查看当前数据库中有哪些表。

    show tables;
    

    在刚才创建的数据库 MyDB_one 中,还没有创建任何表,所以当前是空的。

    2. 创建表

    使用 create table 表名(字段1 字段类型,字段2 字段类型,字段3 字段类型,…); 来创建一张表。

    create table Phone_table(pid INT, name CHAR(20), price INT);

    在 MyDB_one 中创建了一个叫 Phone_table 的数据表,这张表有三个字段 pid,name,price 。为了增加 SQL 的可读性,字段名我用的是小写,字段类型用大写。

    3. 显示表信息

    用 show create table 表名; 来显示已创建的表的信息。

    show create table Phone_table;

    使用 show create table 表名;  可以显示表的字段信息, MySQL 的引擎,和默认的字符编码等信息。与显示数据库信息一样,show 只能显示已经创建了的数据表的信息,不能在创建的同时显示信息。

    如果想更好地展示表的字段信息,可以使用 desc 表名; 来显示表的字段信息。

    4. 给表增加字段

    使用 alter table 表名 add 字段名 数据类型; 为已存在的表添加一个新字段。

    alter table Phone_table add color CHAR(20);

    添加后,刚才的表中多了一个字段,新增成功。

    5. 删除表的字段

    使用 alter table 表名 drop 字段名; 删除一个表中已存在的字段。

    alter table Phone_table drop price;

    删除字段后,表中不再有该字段。

    6. 修改字段的数据类型

    使用 alter table 表名 modify 字段名 数据类型; 修改表中现有字段的数据类型。

    alter table Phone_table modify name VARCHAR(12);

    修改之后,该字段的数据类型发生改变。

    7. 修改字段的数据类型并且改名

    使用 alter table 表名 change 原字段名 新字段名 数据类型; 修改表中现有字段的字段名和类型。

    alter table Phone_table change name pname CHAR(18);

    现在,将表的 name 改成了 pname ,同时修改了 pname 的数据类型。

    四、MySQL 常用字段类型

    一个数据表是由若干个字段组成的,一个表十几个字段也很正常,每个字段表示不同的信息,需要使用不同类型的数据。

    所以在创建表的时候,要为每个字段指定适合的数据类型。

    MySQL 中常用的字段类型有以下这些:

    1. 整数类型

    数据类型数据范围
    TINYINT-128 -- 127
    SMALLINT-32768 -- 32767
    MEDIUMINT-2^23 -- 2^23-1
    INT-2^31 -- 2^31-1
    BIGINT-2^63 -- 2^63-1

    2. 字符串类型

    数据类型字节范围用途
    CHAR(n)0 -- 255字节定长字符串
    VARCHAR(n)0 -- 65535字节变长字符串
    TEXT0 -- 65535字节长文本数据
    LONGTEXT0 -- 2^32-1字节极大文本数据
    BLOB0 -- 65535字节二进制长文本数据
    LONGBLOB0 -- 2^32-1字节二进制极大文本数据

    3. 小数类型

    m 表示浮点数的总长度,n 表示小数点后有效位数。

    数据类型数据用法数据范围
    FloatFloat(m,n)7位有效数
    DoubleDouble(m,n)15位有效数
    DecimalDecimal(m,n)28位有效数

    4. 时间类型

    数据类型格式用途
    DATEYYYY-MM-DD日期
    TIMEHH:MM:SS时间
    YEARYYYY年份
    DATETIMEYYYY-MM-DD HH:MM:SS日期和时间
    TIMESTAMP10位或13位整数(秒数)时间戳

    5. 枚举类型

    enum(枚举值1,枚举值2,...)

    枚举类型只能在列出的值中选择一个,如性别。

     

     

    展开全文
  • 微信小程序云数据库实现登录

    千次阅读 热门讨论 2019-04-14 17:49:53
    微信小程序自带的云数据库的优势在于,不用搭建服务器...微信小程序自带的云数据库可以生成登录注册系统,以下是简单实现功能的示例代码: 登录界面如下: login.wxml页面: <view class='username_it...

    微信小程序自带的云数据库的优势在于,不用搭建服务器和后端就可以直接调用数据库

    云数据库配置:

    例如上图,环境名称为:ksyueying 环境ID为: ksyueying-xxxxxxxxx(输入环境ID)

    假设环境ID:abss    数据库名为:abc

     

    微信小程序自带的云数据库可以生成登录注册系统,以下是简单实现功能的示例代码:

             登录界面如下:

    login.wxml页面:

             

        <view class='username_item'>
          <input class='bussiness_input' name="username"  
          bindinput='userNameInput' placeholder='输入帐号' />
        </view>
        <view class='password_item'>
          <input class='bussiness_input' password type="text" name="password" 
           bindinput='passWordInput' placeholder='输入密码' '/>
        </view>
        <button form-type='submit' class='login_submit' bindtap="loginBtnClick" >
          登录
        </button> 

     login.js页面:

       

    wx.cloud.init({
      env: 'abss'  //数据库ID
    })
    
    const db = wx.cloud.database({
      env: 'abss'
    })
    Page({
      data: {
        userInfo: {},
        userN: '',
        passW: ''
      },
      userNameInput: function (e) {
        this.setData({
          userN: e.detail.value
        })
      },
      passWordInput: function (e) {
        this.setData({
          passW: e.detail.value
        })
      },
     loginBtnClick: function (a) {
        var that = this
        if (that.data.userN.length == 0 || that.data.passW.length == 0) {
          wx.showModal({
            title: '温馨提示:',
            content:'用户名或密码不能为空!',
            showCancel:false
          })
        } else {
          db.collection('abc').where({username:that.data.userN}).get({//这里的abc就是数据库名
            success:function(res){
    
              if (that.data.passW == res.data[0].password){
                wx.redirectTo({
                   url: '/pages/index/index'//[主页面]
                }) 
              }
              else{
                wx.showModal({
                  title: '密码错误',
                  content: '密码错误'//session中用户名和密码不为空触发
                });
              }
             }
          })
        }
      }
    })

    login.wxss页面

    .username_item{
      position: absolute;
      left: 48px;
      top: 168px;
      width: 240px;
      height: 50px;
      line-height: 26px;
      border-radius: 8px;
      color: rgba(16, 16, 16, 1);
      font-size: 18px;
      text-align: center;
      font-family: Arial;
      border: 1px solid rgba(187, 187, 187, 1);
      background-color: rgba(255, 255, 255, 1);
    }
    
    .password_item{
      position: absolute;
      left: 46px;
      top: 248px;
      width: 243px;
      height: 50px;
      line-height: 26px;
      border-radius: 8px;
      color: rgba(16, 16, 16, 1);
      font-size: 18px;
      text-align: center;
      font-family: Arial;
      border: 1px solid rgba(187, 187, 187, 1);
      background-color: rgba(255, 255, 255, 1);
    }
    
    .bussiness_input {
      left: 143px;
      top: 221px;
      width: 80px;
      height: 28px;
      opacity: 0.3;
      color: rgba(16, 16, 16, 1);
      font-size: 20px;
      text-align: left;
      font-family: PingFangSC-regular;
    }
    
    .login_submit {
      position: absolute;
      left: 80px;
      top: 350px;
      width: 175px;
      height: 50px;
      line-height: 20px;
      border-radius: 16px;
      background-color: rgba(62, 68, 105, 1);
      color: rgba(255, 255, 255, 1);
      border: 1px solid rgba(187, 187, 187, 1);
      font-size: 28px;
      text-align: center;
      font-family: PingFangSC-regular;
    }

    最近,数据库要进行调试可能要,详情—本地设置—调试数据库要用最高版本

    展开全文
  • 方法2:对于一些支持安全验证的数据库管理系统,如SQL可将系统用户定义为数据库用户,再设计登录对话框时使用输入的用户名和登录口令来连接数据库,让数据库管理系统完成验证.   技术要领 设置默认按钮:将命令按钮...
  • Java实现登录[数据库]

    千次阅读 多人点赞 2019-08-06 19:47:26
    和上篇的随机点名系统一样,都是使用MySQL数据库来实现,因为刚学所以写点简单例子满足下自己; 需求分析: 1、输入用户名和密码 2、与数据库中的记录进行比较 原理比较 简单,直接贴代码吧。 import java.sql...
  • SQL Server 2012数据库 系统数据库介绍

    千次阅读 2019-03-31 19:37:07
        在SQL Server中,数据库可分为用户数据库系统数据库。用户数据库是用户为实现特定用户需求而创建的数据库,主要用来存储用户的应用数据。系统数据库是在安装SQL Server时自动创建的,主要用来完成特定的...
  • 使用struts2技术,实现登录功能(连接数据库)。
  • 数据库审计系统简介 什么是数据库审计? 数据库审计是记录数据库被访问行为的日志系统。 访问数据库的一般有两种行为,一种是应用服务区的访问,一种是数据库运维人员的访问。 数据库审计(简称DBAudit)能够实时...
  • 系统登录,系统登录是和数据库连接的登录,输入用户名和口令(VB6.0源代码编写)
  • 数据库系统设计】数据库安全性

    千次阅读 2020-04-04 22:46:24
    数据库安全性4.1 数据库安全性概述4.1.1 数据库的不安全因素4.2 数据库安全性控制4.2.1 用户身份鉴别4.2.2 存取控制4.2.3 自主存取控制方法4.2.4 授权:授予与...数据库系统中的数据共享不能是无条件的共享 => ...
  • 数据库管理系统MySQL(一)

    千次阅读 2019-10-09 15:00:37
    数据库MySQL入门视频,MySQL是数据库管理系统,且MySQL代码开源。 保存数据的容器:数组、集合和文件等。其中数组和集合都是将数据存储在内存中,具有易失性(断电丢失),但是程序中的很多数据是希望被永久地存储...
  • MySQL数据库审计系统

    万次阅读 2018-08-06 10:49:33
    数据库审计 数据库审计(简称DBAudit)能够实时记录网络上的数据库活动,对数据库操作进行细粒度审计的合规性管理,对...数据库审计是数据库安全技术之一,数据库安全技术主要包括:数据库漏扫、数据库加密、数...
  • 大家好,我是魔王哪吒,话不多说,今天带来的是一篇《考前复习必备MySQL数据库(关系型数据库管理系统)》文章,欢迎大家喜欢。前言MySQL是一个关系型数据库管理系统,在web应用方面,M...
  • 数据库管理系统(DBMS)

    千次阅读 2020-02-28 22:36:09
    是一个由用户使用的数据库管理软件,其目的就是让用户通过操作数据库管理系统完成对数据库数据的处理 DBMS的功能 创建数据库:能够提供数据定义语言(Data Defination Language,简称DDL),利用数据定义语言可以方便...
  • SqlServer系统数据库

    千次阅读 2020-01-07 11:19:15
    SqlServer系统数据库分为五个,默认...1、Master数据库:记录了所有系统级别的信息,包括用户的登录信息、端点、链接服务器和系统的配置,该数据库不能删除,否则SqlServer实例就无法启动。 2、Model数据库:看英文...
  • 功能需求分析 本系统的功能就两个:用户登录和注册。a.用户登录需要我们根据用户的输入的信息到数据查询用户的账号密码是否能够匹配的上。b.用户注册需要我们将用户的信息加入到数据库中。2.架构设计:MVC的...
  • 我们可以很容易地用Python实现一个用户登录系统,相信这即使是对编程新手来说也是小菜一碟。 作为Python的小萌新,今天我想记录下来的是如何实现一个连接了MySQL数据库的用户登录注册系统,它的效果图大概如下: ...
  • 这篇文章的前提是Linux系统已经装好了oracle数据库,只需要简单的几个步骤登录oracle中的用户。 一般我们用到oracle数据库都是使用HR用户和SCOTT用户居多,登录这两个用户的方法也十分简单。 1.首先需要从root切换...
  • 大学《数据库系统》课程设计报告

    万次阅读 多人点赞 2019-01-03 16:02:29
    湖南科技大学计算机科学与工程学院 《数据库系统》 课 程 设 计 题 目: 教学管理系统 专 业:计算机科学与技术 年 级: 2017级 班 级: 计科三班 学 号: 170510323 姓 名: 雨 萱 完成时间:2019年1月3日 教务管理...
  • 数据库《小型超市管理系统

    热门讨论 2011-01-21 13:17:36
    应用JSP开发工具实践了《学生选课管理系统》的数据库应用系统的设计方法、开发过程和SQL SERVER数据库的管理与维护。最终达到掌握数据库管理系统的使用和开发,提高分析问题、解决问题和实践应用能力。 1.3本选题的...
  • 数据库宿舍管理系统

    千次阅读 2020-07-08 17:25:34
    C/S结构设计数据库宿舍管理系统 主要利用Java.swing与sql server设计的宿舍管理系统,存在一些问题欢迎指正。 数据库设置 连接数据库(JDBC) 如何连接数据库请看:...
  • 在SQL sever系统中,系统运行时会用到的相关信息,如系统对象的组态设置等,都是以系统的形式存在,而存放这些系统信息的数据库成为系统数据库。成功安装SQL sever后,系统会自动建立master、model、msdb、tempdb及...
  • 数据库课程设计-题库管理系统

    千次阅读 多人点赞 2020-07-10 20:39:27
    ## 数据库课程设计-题库管理系统* 这里写我的思路及其功能展示,希望帮到你,如果想要全部的源代码及其课程设计报告,请来我的主页下载 目录 1.需求分析. 3 2.数据库设计以及E-R分析. 4 3.结构设计. 4 (1)表结构...
  • 简要说明 我的审美能力不差,但是前端没学好,界面写的很差,所以这里我用的登录注册界面是慕课网里面开源的一段代码。 登录界面如下,先看看效果图吧。2.welcome.jsp界面:登录注册主界面&lt;%@ page langu.....
  • 使用Python中的pymysql包实现连接数据库操作 本项目较小,适用于零基础Python初学者,不会的百度,很快就能理解本文思路 文末有参考资料,里边大概列举了做出此系统需要的材料 一、需求分析 1.1 背景 软件名称:批发...
  • 学习数据库系统概论这一篇就够了

    万次阅读 多人点赞 2020-11-25 15:31:07
    目录第一章 数据库绪论1.1、数据库系统概述1.1.1、数据库的四个概念1.1.2、数据库系统的特点1.2、数据库数据模型1.2.1、数据模型的概述1.2.2、数据模型的要求1.2.3、数据模型的分类1.2.4、概念模型的概述1.2.5、数据...
  • C# 实现 MySql数据库连接 登录并跳转界面

    万次阅读 多人点赞 2018-02-06 21:19:48
    前言:连接上篇文章,在上文C#登录并跳转界面基础上,修改登录窗口用户信息的验证方式,从简单字符串匹配判断,改进到连接MySql数据库进行验证。 正文: 1.Mysql数据库的建立 2.Visual Studio 2017 的设置 ...
  • 数据库登录账号和密码的验证

    千次阅读 2020-01-15 01:17:49
    易语言数据库密码验证 1,首先我们需要创建一个用来存储密码的数据库 分别在数据库中建立一个存储账号和密码的名称,类型为文本型, 2,数据库创建好了以后,我们需要手动把原始账号和密码添加到数据库里,打开...
  • 数据库

    千次阅读 2019-02-23 17:44:47
    1. 云数据库概述 1.1. 云计算是云数据库兴起的基础 1.2. 云数据库概念 云数据库是部署和虚拟化在云计算环境中的数据库。云数据库是在云计算的大背景下发展起来的一种新兴的共享基础架构的方法,它极大地增强了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 500,544
精华内容 200,217
关键字:

数据库登陆系统