数据人与超自然意识 发表于 2024-8-9 05:18:11

基于web的图书管理系统

因为是本人本科阶段某课程的课程操持,以是并不得当全部人,仅供参考。
由于本人水平,可能会有地方有误,望以指正。
一、系统概要操持

    序号
功能
功能说明
1
登录
借阅人、管理员均可用自己的账户信息可以登录系统
2
图书查询
借阅人、管理员登录系统可以查询图书情况
3
图书录入
管理员登录系统后可以录入图书
4
图书修改
管理员登录系统后可以修改图书的信息
5
删除图书
管理员登录系统后可以删除图书的信息
6
修改密码
借阅人、管理员登录系统后可以修改自己账号的密码
7
读者管理
管理员登录系统后对读者信息悉心举行管理,包括添加借阅人信息、图书信息和删除
8
分类管理(附加)
对图书举行分类,举行分类管理
9
主动识别(附加)
登录系统时会识别是管理人员或者是借阅人
10
退出功能(附加)
将自己的账号退出
11
判定输入的信息是否合法(附加)
在注册,登录时判定输入的信息是否合法

二、数据库操持

   2.1 数据库逻辑结构操持

   管理员管理关系:admin(aid,username,name,password,emali,phone,status,lend_num,max_num)
   图书管理关系:book(bid,name,card,author,num,press,type)
   图书分类管理:book type(tid,name)
   图书归还管理:history(hid,aid,bid,card,bookname,adminname,username,begintime,endtime,status)
   2.2 数据库表

   (1)管理员表(admin)

   属性:aid,username,name,password,emali,phone,status,lend_num,max_num
       (2)图书管理关系 (book)

    属性:bid,name,card,author,num,press,type
         (3)图书分类管理

   属性:book type(tid,name)
         (4)图书归还(history)

      属性:hid,aid,bid,card,bookname,adminname,username,begintime,endtime,status
      三、系统实现

      3.1 功能1登录注册

      3.1.1流程操持

      
[*]进入图书管理系统的注册页面
[*]进入图书管理系统的登录页面
[*]填写登录者的登录信息,点击按钮将信息提交给数据库
[*]检索图书管理系统数据库信息,对比信息是否和数据库一致
[*]登录者输入的登录信息通过系统数据库验证,系统会主动识别是管理员或者是借阅人,进入相应的页面页面
      3.1.2技能应用

      在实现登录功能中,主要由项目中的login.jsp,来实现。在login.jsp中我们主要来实现登陆界面的操持和判定账号密码不能为空。在判定账号密码不能为空上,我使用了javascript来实现,起首获取账号和密码的内容,然后判定账号和密码是否为空,如果为空的话弹出一个警告窗口信息为“这是必填字段”,然后输入核心或者光标定位到这个为空的文本框里。我们用HTML的相干技能来实现登录页面的操持,先使用<form></form>创建一个HTML 表单,第一行是标题“欢迎使用图书管理系统”,然后使用<table></table>标签创建一个表格,表格分四行,第一行是账号,第二行是密码,第三行是没有账号可以自行再去注册的跳转,第四行是登录键。接着在登录键上实现登录。最后使用css样式来美化我们的界面。
      3.1.3技能选择分析

      页面跳转,我用的是在button标签中加上onclick属性,赋值为Javascript,
      3.1.4关键代码

          (1)查询信息是否正确
        ①有关读者账号的连接数据库操纵,登录验证,注册,修改账号,修改密码
       public class AdminDao {
       
        /**
       * 登录验证功能,传入用户名和密码,在数据库中查找,如果找到了,返回true,没找到则返回false
       * @param username
       * @param password
       * @return
       */
        public boolean Login_verify(String username,String password){
                Connection conn = DBUtil.getConnectDb();
                String sql = "select * from admin where username="+username+" and password="+password;
                PreparedStatement stm = null;
                ResultSet rs = null;
                try {
                        stm = conn.prepareStatement(sql);
                        rs = stm.executeQuery();
                        if(rs.next()){
                                return true;
                        }
                } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }finally{
                        DBUtil.CloseDB(rs, stm, conn);
                }
                return false;
        }
②注册的代码
/**
       * 注册账号的函数,传入账号,密码,姓名,邮箱,手机号,借阅天数,可借阅数
       * @param username
       * @param password
       * @param name
       * @param email
       * @param phone
       * @param lend_num
       * @param max_num
       */
        public void Register(String username, String password, String name, String email, String phone,int lend_num,int max_num) {
                // TODO Auto-generated method stub
                                Connection conn = DBUtil.getConnectDb();
                                String sql = "insertinto admin(status,username,password,name,email,phone,lend_num,max_num) values(?,?,?,?,?,?,?,?)";
                                int rs = 0;
                                PreparedStatement stm = null;
                                try {
                                        stm = conn.prepareStatement(sql);
                                        stm.setInt(1, 1);
                                        stm.setString(2, username);
                                        stm.setString(3, password);
                                        stm.setString(4, name);
                                        stm.setString(5, email);
                                        stm.setString(6, phone);
                                        stm.setInt(7, lend_num);
                                        stm.setInt(8, max_num);
                                        rs = stm.executeUpdate();
                                } catch (SQLException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
        }      5.实现
      https://img-blog.csdnimg.cn/direct/5ff3ff9b535e4fa98a008c3faeef443f.png
      图3.1.1注册界面
      https://img-blog.csdnimg.cn/direct/68ba3d855eb74a3cb76d303e0a8666e3.png
      图3.1.2登录界面
      3.2 功能2查看图书信息

      3.2.1流程操持(借阅人模块)

      
[*]借阅人登陆系统后点击图书查询可以查询图书信息
[*]点击借阅信息后后,可以查看借阅的信息
[*]点击借阅历史,可以对书籍的借阅历史举行了解
[*]在整体的右上方可以查看个人资料、修改自己的密码、还可以退出系统
      3.2.2技能应用

      ①图书查询

      学天生绩查询功能主要是由/books/select.jsp来实现的。在这里,使用row举行页面结构,使用panel举行控件,使它们在一个界面。
      <tbody>
                                                  <td><%= bean.getCard() %></td>
                                        <td><%= bean.getType() %></td>
                                        <td><%= bean.getName() %></td>
                                        <td><%= bean.getAutho() %></td>
                                        <td><%= bean.getPress() %></td>
                                        <td><%= bean.getNum() %></td>
<td><button type="button" class="btn btn-info btn-xs" data-toggle="modal" onclick="borrowbook(<%= bean.getBid() %>)" >借阅</button>           </td>                                          
                                          
                                  </tbody>      ②借阅信息与借阅历史

      学生留言功能主要是由borrow.jsp完成、借阅历史由history.jsp完成
      ③修改密码

      修改图书系统账号密码功能主要是由项目中的updatepwd完成来实现。。
      让它存储通过调用数据库中的getstudent()方法查询出来的相干信息。接下来我们要设置密码不能为空,在设置密码不能为空,我使用了javascript来实现,起首使用getElementById ()方法获取密码的内容,然后判定密码是否为空,如果为空的话使用alert ()弹出一个警告窗口信息为“这是必填字段”,然后输入核心或者光标定位到这个为空的文本框里,用username.focus();最后返回一个失败。然后,我们可以在文本框中输入新的密码点击生存,之后新密码会被同步到数据库中。我是使用的<input>文本框并设置οnclick="savestudent()" value="生存"属性来实现将新密码生存到数据库中的。
      3.2.3技能选择分析

      采用了javascript中focus()的语句,文本输入框要鼠标点击下输入框,等光标在内里之后再敲键盘输入。
   focus()的作用就是将光标放在输入框中,省掉了你点击的那一下,直接输入你要输入的内容。可以注意下百度的首页,你打开页面之后光标就直接在输入框里了,直接敲键盘输入你要搜索的内容就行了,省掉了还要用鼠标点击下输入框才能输入的步调,非凡人性化的考虑。
      3.2.4关键代码

      ①图书查询

      (1)查询语句
      ①查看全部图书信息
      返回的是ArrayList数组形式
      try {
                        stm = conn.prepareStatement(sql);
                        rs = stm.executeQuery();
                        while(rs.next()){
                                BookBean tag = new BookBean();
                                tag.setBid(rs.getInt("bid"));
                                tag.setName(rs.getString("name"));
                                tag.setCard(rs.getString("card"));
                                tag.setType(rs.getString("type"));
                                tag.setAutho(rs.getString("autho"));
                                tag.setPress(rs.getString("press"));
                                tag.setNum(rs.getInt("num"));
                                tag_Array.add(tag);
                        }
                } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }finally{
                        DBUtil.CloseDB(rs, stm, conn);
                }      ②获取用户想要的单个图书/**
       * 用户查找图书,根据输入的名称,使用like举行模糊查询,然后返回一个ArrayList数组类型
       */
      public ArrayList<BookBean> getLikeList(String name) {                // TODO Auto-generated method stub                ArrayList<BookBean> tag_Array = new ArrayList<BookBean>();                Connection conn = DBUtil.getConnectDb();                String sql = "select * from book where name like '%"+name+"%'";                PreparedStatement stm = null;                ResultSet rs = null;                try {
                        stm = conn.prepareStatement(sql);
                        rs = stm.executeQuery();
                        while(rs.next()){
                                BookBean tag = new BookBean();
                                tag.setBid(rs.getInt("bid"));
                                tag.setName(rs.getString("name"));
                                tag.setCard(rs.getString("card"));
                                tag.setType(rs.getString("type"));
                                tag.setAutho(rs.getString("autho"));
                                tag.setPress(rs.getString("press"));
                                tag.setNum(rs.getInt("num"));
                                tag_Array.add(tag);
                        }
                } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }finally{
                        DBUtil.CloseDB(rs, stm, conn);
                }                return tag_Array;        }      ②图书借阅信息

       * 获取借阅记录的全部信息,传入的条件有status,aid,表示搜索正在借阅的,或者已经还书的信息,aid代表当前登录用户
      try {
                        stm = conn.prepareStatement(sql);
                        rs = stm.executeQuery();
                        while(rs.next()){
                                HistoryBean tag = new HistoryBean();
                                tag.setHid(rs.getInt("hid"));
                                tag.setAid(rs.getInt("aid"));
                                tag.setBid(rs.getInt("bid"));
                                tag.setBookname(rs.getString("bookname"));
                                tag.setCard(rs.getString("card"));
                                tag.setAdminname(rs.getString("adminname"));
                                tag.setUsername(rs.getString("username"));
                                tag.setBegintime(rs.getString("begintime"));
                                tag.setEndtime(rs.getString("endtime"));
                                tag.setStatus(rs.getInt("status"));
                                tag_Array.add(tag);
                        }
                } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }finally{
                        DBUtil.CloseDB(rs, stm, conn);
                }      ③查看借阅历史

      public void setHid(int hid) {
                this.hid = hid;
        }
        public int getAid() {
                return aid;
        }
        public void setAid(int aid) {
                this.aid = aid;
        }
        public int getBid() {
                return bid;
        }
        public void setBid(int bid) {
                this.bid = bid;
        }
        public String getCard() {
                return card;
        }
        public void setCard(String card) {
                this.card = card;
        }
        public String getBookname() {
                return bookname;
        }
        public void setBookname(String bookname) {
                this.bookname = bookname;
        }
        public String getAdminname() {
                return adminname;
        }
        public void setAdminname(String adminname) {
                this.adminname = adminname;
        }
        public String getUsername() {
                return username;
        }
        public void setUsername(String username) {
                this.username = username;
        }
        public String getBegintime() {
                return begintime;
        }
        public void setBegintime(String begintime) {
                this.begintime = begintime;
        }
        public String getEndtime() {
                return endtime;
        }
        public void setEndtime(String endtime) {
                this.endtime = endtime;
        }
        public int getStatus() {
                return status;
        }
        public void setStatus(int status) {
                this.status = status;
        }      ④修改密码

      public boolean Login_verify(String username,String password){
                Connection conn = DBUtil.getConnectDb();
                String sql = "select * from admin where username="+username+" and password="+password;
                PreparedStatement stm = null;
                ResultSet rs = null;
                try {
                        stm = conn.prepareStatement(sql);
                        rs = stm.executeQuery();
                        if(rs.next()){
                                return true;
                        }
                } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }finally{
                        DBUtil.CloseDB(rs, stm, conn);
                }
                return false;      3.2.5实现

      https://img-blog.csdnimg.cn/direct/201603fd3279429d97f0a4046e671223.png
      图3.2.1 读者登陆系统的主页面
      
https://img-blog.csdnimg.cn/direct/243ca84c8dfa4cd187f0d7d3074d101c.png
      图3.2.2 借阅信息查询页面
https://img-blog.csdnimg.cn/direct/eaf3684811c044d8ad950d54f437a762.png
      图3.2.3 借阅历史页面
https://img-blog.csdnimg.cn/direct/9c7283247a8e4d1dbd78d3916a08863e.png
      图3.2.4 个人资料页面
https://img-blog.csdnimg.cn/direct/87bff108f1a94af7865d3f6243be548b.png
      图3.2.5 修改密码
      3.3 功能3对图书和借阅者增长、删除、修改

      3.3.1流程操持

      
[*]管理员进入系统后可以对图书举行管理
[*]可以查看读者信息,对读者信息举行修改和删除
[*]管理员可以对图书举行分类
[*]管理员可以查看借阅信息
[*]同时,管理员可以查看图书归还信息
[*]管理员同样可以对密码和个人资料举行修改
      3.3.2技能应用

      ①管理员管理图书

      在管理员管理图书功能中主要由AdminDao.jsp来实现。
      在AdminDao.jsp中,起首要判定登陆账号的角色是否为管理员。定义了一个role,而且令它等于从session中生存的数据的role。接下来判定,如果role不为空,接着判定如果角色为借阅者则乐成进入借阅者主页面。反之则返回登陆页面。接下来是构思页面的结构。在这个页面中有表头、主体、分割线、内容、表单和表尾这几个部门。我重点介绍主体中的内容部门。在内容中我创建了一个表单,又使用css相干知识操持样式。
      ②管理员删除相干信息

      在管理员删除相干信息功能中主要是由admin_user.jsp、admin_book.jsp来实现的。
      <ul class="dropdown-menu">
                                     <li><a href="#updateinfo" data-toggle="modal">个人资料</a></li>
                                    <li role="presentation" class="divider"></li>
                                       <li><a href="#updatepwd" data-toggle="modal">修改密码</a></li>
                                        <li role="presentation" class="divider"></li>
                                     <!-- href="#identifier"来指定要切换的特定的模态框(带有 id="identifier")。-->
                                    <li><a href="/books/login.jsp">退出</a></li>      ③管理员可以对图书举行分类

      在管理员对图书分类的功能中主要由admin_booktype.jsp来实现。
      <!---------------------表单-------------------->
                                                                               
                                                                               <div class="form-group">
                                                                                        <label for="firstname" class="col-sm-3 control-label">分类名称</label>
                                                                                                <div class="col-sm-7">
                                                                                                        <input type="text" class="form-control" id="addBookName" required="required" name="name"placeholder="请输入图书分类名称">
                                                                                                        <label class="control-label" for="addBookName" style="display: none;"></label>       
                                                                                                </div>
                                                                                </div>
                                                                               
                                                                                <!---------------------表单-------------------->
                                                                        </div>

try {
                        stm = conn.prepareStatement(sql);
                        rs = stm.executeQuery();
                        while(rs.next()){
                                TypeBean tag = new TypeBean();
                                tag.setTid(rs.getInt("tid"));
                                tag.setName(rs.getString("name"));
                                tag_Array.add(tag);
                        }
                } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }finally{
                        DBUtil.CloseDB(rs, stm, conn);
                }      在admin_booktype.jsp中,起首定义一个JDBCUtil.java的名称db。定义一个teachername并让它等于获取生存在 session 对象中名称为 name的属性信息。再定义一个sql,来存储查询对应的msg表和student表的sql语句。定义一个map集合data,让它存储通过调用数据库中的comminlist()方法查询出来的相干信息。接下来使用HTML技能来创建一个表格,表头为“图书分类、操纵、增长分类”然后通过循环来获取data中存储的对应信息并填到列表中。
      在huifu.jsp中,我们要使回复内容不能为空并把回复内容生存进grademanage数据库的msg表中。在实现这些功能前我们要先定义一个JDBCUtil.java的名称db。定义一个msgid并让它等于使用request.getParameter()方法获取的id。再定义一个sql,来存储查询对应的msg表和student表的sql语句。定义一个map集合data,让它存储通过调用数据库中的comminlist()方法查询出来的相干信息。
      接下来是构思页面的结构。在这个页面中有表头、主体、分割线、内容、表单和表尾这几个部门。我重点介绍主体中的内容部门。在内容中我创建了一个表单,又使用css相干知识操持样式。
      3.3.3技能选择分析

      在页面传值时采用了session页面取值传值,这种传值方式优点在于使用简朴,不仅能传递简朴数据类型,还能传递对象。同时,数据量巨细是不限制的。缺点在于在Session变量存储大量的数据会消耗较多的服务器资源。容易丢失。
    在使用时要注意,session不用时可以销毁它,销毁的方法是:打扫一个:Session.Remove("session名");
      3.3.4实现

      https://img-blog.csdnimg.cn/direct/10f21349d53b4bb0bad8e9df24544cc5.png
      
图3.3.1 管理员登录进入的主页面
https://img-blog.csdnimg.cn/direct/cb19a97e57c44e64a745bf12fba411a4.png
      图3.3.2 管理员修改图书信息
https://img-blog.csdnimg.cn/direct/e6c49c2e69f24b6195f3010843f8fffa.png
      图3.3.3 管理员删除图书信息
https://img-blog.csdnimg.cn/direct/7a2dcc40267b45e196a012ed92ba3237.png
      图3.3.4 管理员添加图书
https://img-blog.csdnimg.cn/direct/de78007001c44a1d911ab884e81d5837.png
      图3.3.5 管理员添加读者
https://img-blog.csdnimg.cn/direct/8d105ddb7ec14c58bf1bd041bb0d25a0.png
      图3.3.6 管理员删除读者
https://img-blog.csdnimg.cn/direct/045e7db5c78f47c3902568fc9d318498.png
      图3.3.7 管理员添加、修改、删除图书分类信息
      https://img-blog.csdnimg.cn/direct/24945eec3ca8479c8ffa9ced6acabe98.png
      图3.3.8管理员查看图书归还信息
      3.4 功能4连接数据库(附加)

      3.4.1流程操持

      (1)用数据库创建管理员信息的管理
      (2)用数据库创建图书信息的管理
      3.4.2技能应用

      该功能主要由BookDao.java和AdminDao.java文件实现。
      Book.java中起首通过获取数据库连接对象,调用PreparedStatement的executeQuery方法和相应的SQL语句,执行查询操纵。然后通过while循环遍历查询结果集ResultSet,将结果封装到UserBean对象中,并返回该对象。如果没有符合条件的结果,直接返回null。
      AdminDao.java实现了用户注册时的数据库操纵,包括添加用户、查询用户是否存在等功能.加载MySQL的JDBC驱动,DriverManager的getConnection方法获得连接对象,通过PreparedStatement执行insert语句,将用户输入的信息插入到数据库中。调用方法实现用户名的查询操纵,判定输入的用户名或用户名和密码是否存在。然后调用方法实现用户信息的插入操纵,将用户输入的用户名、密码、邮箱和手机号码插入到用户表中
      3.4.3技能选择分析

      (1)加载MySQL的JDBC驱动:通过Class.forName(“com.mysql.jdbc.Driver”)方法加载MySQL的JDBC驱动。
      (2)通过PreparedStatement的executeUpdate方法和相应的SQL语句,向数据库中添加用户信息并更新数据。
      第四章项目测试与评价

      测试是开发一个系统的重要环节,是对软件最后的完成起至关重要的作用。随着新技能的出现,软件测试的方法也变得越来越多,对系统整体的功能和性能需求也渐渐提高。测试的目标保证系统的完备性,克制某些功能影响其他功能的运行,保证了系统的独立性。
      4.1功能测试

      
[*]用户登录注册模块测试
      登录测试主要测试用户名和密码是否正确。登录功能测试用比方表2-1所示。
      表4-1 用户登录注册功能测试用例
       表格编号:001
项目名称:基于Javaweb的图书管理系统的操持与实现

模块
编号
序号
测试用例描述
操纵过程及数据
预期结果
验证结果
1.1
功能描述:登录功能
1
密码输错
用户名:202002
密码:1234
登录失败,请查抄用户名或密码

2
账号输错
用户名:527573
密码:123456
登录失败,请查抄用户名或密码


3
正常登录
用户名:123
密码:123
进入系统

      
[*]用户信息管理模块测试
      用户信息管理模块测试主要是测试管理员对用户的信息能否正常的举行管理。表2-2为用户信息管理功能测试的用例。
      表4-2 用户信息管理功能测试用例
       表格编号:002
项目名称:基于Javaweb的图书管理系统的操持与实现

模块
编号
序号
测试用例描述
操纵过程及数据
预期结果
验证结果
2.1
功能描述:添加用户
1
用户名为空
用户名:null
添加失败

2
密码为空
密码:null
添加失败 

      
3
正常添加
用户名:张三
账号:123
密码:123
添加用户乐成

2.2
功能描述:修改用户密码
1
修改用户密码
修改前:123456
修改后:123456
修改失败

2
修改用户密码
修改前:123
修改后:123456
修改乐成

2.3
功能描述:删除用户
1

删除用户
点击删除按钮,点击确定
删除用户乐成

      
      4.2 项目评价

      通过情况测试、功能测试、性能测试等测试环节,证实本系统可以或许满意用户的需求。可以或许保障管理数据的安全、正确;可以或许实现方便的扩展,满意图书馆发展的须要。
      易安装、部署;系统维护方便;对操纵人员的技能要求比较低,操纵方便。在高系统配置、高网络带宽和容易得到保证的情况下,我们最须要考虑的性能需求就是系统安全性问题。在开发系统的每个阶段,均须要考虑相互间的认证与授权。尤其要注意认证,简朴地说就是确定谁是特定用户,并针对安全源验证该用户的身份。在处理惩罚完识别用户的方法之后,必须使用一种方法以向用户授权,从而可以或许使用系统的特定功能。
      使用了css技能,设置页面的样式和结构。可以使登录页面的各个元素的结构和样式到达雅观和易用的要求,同时也可以提高用户的交互体验和操纵便利性。
    在安全问题上,前端和后端相分离,提高了代码的安全性和维护性,便于后期举行代码功能的完善和管理。
      
      第五章 结语

      5.1、出现的问题

      
[*]在我写添加图书的功能的时候我遇到了添加失败的情况,一直添加不乐成。
[*]我在写录入图书信息的时候,遇到了录入失败的情况。
[*]配置情况比较贫苦,尤其是之前的MySQL有些问题
[*]想添加一些新功能,但是总是出错
      5.2、办理方法

      
[*]重新配置了MySQL,然后乐成使用了数据库
[*]经过查抄发现录入失败是因为数据库中表的内容有误
[*]添加新功能出错,后来从网上查找资料,看视频,乐成办理
        5.3、项目总结

      经过这几周的积极,图书管理系统根本开发完毕。其功能根本到达预期目标,对于数据的一致性的问题也通过程序举行了有用的办理。但是由于系统操持时间较短,以是该系统还有很多不尽如人意的地方,有待进一步改善。
      我对系统中的列表分页功能比较满意,分页技能是把数据全部查询出来,然后再举行分页。本系统中含有不少的列表,对列表举行分页可以,降低带宽使用,提高访问速度。
      在这个图书管理系统中,登录功能、图书查询功能、图书增长、修改图书、修改密码功能、借阅者录入、查看已录入图书、查看已录入借阅者、修改密码功能、退出系统、主动识别功能均已实现
      但是,该程序也有不足的地方,由于我的水平不高,做出来的程序还是有很多问题存在。经过这次课程操持,通过对程序的编制,调试和运行,使我更好的把握了文件的输入输出流根本性质和有关它们之间关系使用问题的办理方法,认识了各种调用的数据类型,在调试和运行过程中使我更加的了解和认识程序运行的情况,提高了我对程序调试分析的能力和对错误的纠正能力。通过这次JavaWeb课程操持实行,使我可以或许综合运用所学知识,发现、提出、分析和办理实际问题,锻炼实践能力,此次课程操持是对我实际工作能力的具体训练和考察过程。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 基于web的图书管理系统