图书馆接口设计

任务需求:实现图书1.预定2.下单3.准备4.借书5.还书6.收藏几个相关功能接口;

一。需要的几个实体:

1.图书:本数据库中没有图书,每当预定或者收藏以及借书的时候,从数据库中看是否有,没有的话就往数据库中添加一本书。

2.借书卡:借书卡里面主要有userid,还有自身主键id,数据是从一卡通添加时添加(主要userID以及cardid)预定收藏以及其他的时候是通过userid获取的借书卡

3.订单:订单是下单后也就是提交预定时生成的订单。

4.预定:相当于购物车,在提交预定的时候购物车状态设为失效

5.借书:维护当前正在出借尚未归还的书,主要是一个cardID一个bookID

6.还书:当还书时,删除借书表对应信息,还书表中插入对应字段

没有用收藏表,直接把收藏的书id拼串到借书卡表里了

二。具体实现

(1)预定:分为1.添加预定。2.删除预定。3.预定列表。

添加预定:初始化购物车状态生效,书籍信息拼装id串放入购物车表也就是预定表中,可重复,考虑到借多本同一样书情况

预定列表:直接将书串查到对应信息拼装成接口需要的信息,传出;

(2)下单:就是提交预定,具体作用:生成订单,插入订单表,失效购物车。判断订单书数目与已借书数量和是否大于5

(3)准备:准备书的过程,管理员操作,当订单所有书籍都准备状态改为已处理,有的书籍可能馆藏没有(未准备好),未处理状态的订单也可提交借书,只不过没有准备好的书籍不能出借,但是订单状态改为已借出。具体策略:书本id前加标识位,想了想为方便用0。

(4)借书:两种状态,一种提交订单号借书,另外一种状态管理员直接提交书籍信息借书,订单要判断id有标识位的出借,没有的不借。每个借书卡最多只能借5本,需要效验。

(5)还书:从借书表移除,还书表添加。

(6)收藏:添加收藏,删除收藏,收藏列表

添加收藏:注意判断重复添加。

注:模糊查询均查最新一条数据。

数据库相关结构:

转载请附带网址:http://www.cnblogs.com/handsomecui

主要功能代码演示:

/**
     * 拼装id去重
     * @param bookIds
     * @param s
     * @return
     */
    private String handleBookIds(String bookIds, String s) {
        if(bookIds == null || "".equals(bookIds)){
            bookIds = s;
        }else{
            String[] needAdds = s.split(",");
            String[] bs = bookIds.split(",");
            for(int i = 0; i < needAdds.length; i++){
                boolean flag = true;
                for(int j = 0; j < bs.length; j++){
                    if(needAdds[i].equals(bs[j])){
                        flag = false;
                        break;
                    }
                }
                if(flag){
                    bookIds += needAdds[i]+",";
                }
            }
        }
        return bookIds;
    }

    /**
     * 获取借书卡id
     * @return
     */
    private String getCardId() {
        Card card = new Card();
        String user_ID = this.user.getUserId();
        card.setUserId(user_ID);
        Card card2 = cardService.selectBySelective(card);
        if(card2 == null){
            return null;
        }
        else{
            return card2.getId();
        }
    }

    /**
     * 拼装Book为book对象
     * @param bookMap
     * @return
     */
    private Book getBookObject(Map<String, Object> bookMap) {
        String title = (String)bookMap.get("title");
        String author = (String)bookMap.get("author");
        String number = (String)bookMap.get("number");
        String hold = (String)bookMap.get("hold");
        Book book = new Book();
        book.setAuther(author);
        book.setTitle(title);
        book.setNumber(number);
        book.setHold(hold);
        Book book2 = bookService.selectBySelective(book);
        return book2;
    }

    /**
     * 处理图书馆是否有这本书
     * @param bookMap
     */
    private void handleIsHaveBook(Map<String, Object> bookMap) {
        String title = (String)bookMap.get("title");
        String author = (String)bookMap.get("author");
        String number = (String)bookMap.get("number");
        String hold = (String)bookMap.get("hold");
        Book book = new Book();
        book.setAuther(author);
        book.setTitle(title);
        book.setNumber(number);
        book.setHold(hold);
        Book book2 = bookService.selectBySelective(book);
        if(book2 != null){//有书
            book2.setHold(hold);
            bookService.updateByPrimaryKey(book2);
        }else{//没
            bookService.insert(book);
        }

    }

    /**
     * 通过借书卡号获取预定信息
     * @param cardId
     * @return
     */
    private Reserve getReservebyCardId(String cardId) {
        Reserve reserve = new Reserve();
        reserve.setCardId(cardId);
        Reserve reserve2 = reserveService.selectBySelective(reserve);
        return reserve2;
    }

    /**
     * 通过id封装Book
     * @param bookIds
     * @return
     */
    private List<Map<String, Object>> putBookByIds(String bookIds) {
        List<Map<String,Object>> list = new ArrayList<Map<String, Object>>();
        if(bookIds != null){
            String[] ids = bookIds.split(",");
            for(String id : ids){
                Book book = bookService.selectByPrimaryKey(Long.valueOf(id));
                Map<String,Object> BOOK = new HashMap<String, Object>();
                BOOK.put("title", book.getTitle());
                BOOK.put("author", book.getAuther());
                BOOK.put("number", book.getNumber());
                BOOK.put("hold", book.getHold());
                list.add(BOOK);
            }
        }
        return list;
    }

    /**
     * 添加标识位,判断是否全部准备
     * @param order
     * @param bookId
     * @return 未准备书数量
     */
    private int addFlagToBookIdsAndJudgeIsFinish(Order order, Long bookId) {
        String bookIds = order.getBookIds();
        String[] split = bookIds.split(",");
        String newBookIds = "";
        int num = 0;
        boolean isFinish = true;
        if(split != null){
            boolean flag = false;
            for(String e : split){
                if(e.length() <= 1 || e.charAt(0) != ‘0‘){
                    num++;
                    isFinish = false;
                }
                String bookid = e;
                if(!flag&&(e.length() <= 1 || e.charAt(0) != ‘0‘)){
                    Long bid = Long.valueOf(e);
                    if(bid == bookId){
                        bookid = "0"+bookid;
                        flag = true;
                    }
                }
                newBookIds += bookid+",";
            }
            order.setBookIds(newBookIds);
        }
        if(isFinish){
            order.setType("1");
        }
        orderService.updateByPrimaryKeyWithBLOBs(order);
        return num;
    }
时间: 2024-10-08 11:13:06

图书馆接口设计的相关文章

微信小程序的Web API接口设计及常见接口实现

微信小程序给我们提供了一个很好的开发平台,可以用于展现各种数据和实现丰富的功能,通过小程序的请求Web API 平台获取JSON数据后,可以在小程序界面上进行数据的动态展示.在数据的关键 一环中,我们设计和编写Web API平台是非常重要的,通过这个我们可以实现数据的集中控制和管理,本篇随笔介绍基于Asp.NET MVC的Web API接口层的设计和常见接口代码的展示,以便展示我们常规Web API接口层的接口代码设计.参数的处理等内容. 1.Web API整体性的架构设计 我们整体性的架构设计

2.35 Java基础总结①抽象②接口③设计抽象类和接口的原则④接口和抽象类的区别

java基础总结①抽象②接口③设计抽象类和接口的原则④接口和抽象类的区别 一.抽象 abstract作用:不能产生对象,充当父类,强制子类正确实现重写方法和类相比仅有的改变是不能产生对象,其他的都有,包括构造.属性等等任何一个类只要有一个抽象的方法就成了抽象类 抽象方法 public abstract A();①方法是抽象的,这个类也是抽象的:②子类必须重写抽象方法,除非子类也是抽象类 抽象类可以没有抽象方法,但一般不这么设计 二.接口 interface 接口也是Java的一种引用数据类型(J

php后台对接ios,安卓,API接口设计和实践完全攻略,涨薪必备技能

2016年12月29日13:45:27 关于接口设计要说的东西很多,可能写一个系列都可以,vsd图都得画很多张,但是由于个人时间和精力有限,所有有些东西后面再补充 说道接口设计第一反应就是restful api 请明白一点,这个只是设计指导思想,也就是设计风格 ,比如你需要遵循这些原则 原则条件REST 指的是一组架构约束条件和原则.满足这些约束条件和原则的应用程序或设计就是 RESTful.Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的.从客户端到服务

App接口设计原则-b

1.记住密码不是真的让你记住密码,这里仅仅指的是一种自动登录的手段.不管在任何地方,明文存储的密码都是安全隐患,是必须尽量避免的.你可以采用某种方式对用户名.密码以及时间戳(重要)进行签名,再次登录时使用签名后的数据进行登录. 2.客户端要包含超时机制,见过不止一次的服务端设计是通过客户端发送的userid来区分用户的.对此我真的已经无力吐槽了.最简单的办法是用session来记录用户状态.当然,考虑到客户端的特性,用户可能好几天都没有关闭一次,必须配合自动登录机制来保证客户端的在线. 3.接口

蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例

本文从功能需求的角度分析一般蓝牙BLE单芯片的应用框架(SDK Framework)的接口设计过程,并以TI CC2541为例说明BLE的应用开发方法. 一.应用框架(Framework) 我们熟知的Framework包括Android Framework.Linux QT.Windows MFC.应用框架抽象并封装实现了一般应用场景的需求,完成应用开发的80%,剩下的20%则以回调(callback)和接口的方式供应用开发人员调用以完成具体的需求. 一般Framework完成的工作包括:任务分

C++ 11可变参数接口设计在模板编程中应用的一点点总结

概述 本人对模板编程的应用并非很深,若要用一句话总结我个人对模板编程的理解,我想说的是:模板编程是对类定义的弱化. 如何理解“类定义的弱化”? 一个完整的类有如下几部分组成: 类的名称: 类的成员变量(或属性,C#中属性和成员变量还是有区别的): 类的成员方法: 从编译器的角度看,我们必须明确指定以上3部分,才算完整地定义了一个类并且编译通过. 所谓的“类弱化”,是指类的设计者在定义类的时候,并没有完整定义一个类,而是把类的其中一部分的定义留给类的使用者. 从传统才c++98看,通过模板类,使用

Atitit.自定义存储引擎的接口设计&#160;api&#160;标准化&#160;attilax&#160;总结&#160;&#160;mysql

Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结  mysql 1. 图16.1:MySQL体系结构1 2. 16.7. 创建表create()虚拟函数:2 3. 16.8. 打开表 open()2 4. ---------------------------------------------------------------------------------------------------------------------2 5. 16.9. 实施基本的

PHP与Spring的强势接口设计_微课介绍

[back]  微课名称: PHP与Spring之间的强势接口设计  微课介绍:    PS.本頁建置中,請先閱讀博文:<<PHP与Spring之间的强势接口设计>> ~ End ~

【Android】透明状态栏在App中的实现与接口设计

By Sodino 文章目录 1. 认识透明状态栏 2. 透明状态栏Api及特性 3. 设置透明状态栏 4. 处理消失的系统状态栏区域 5. fitsSystemWindows 6. Activity中的接口设计 7. Fragment中的接口设计 8. 白色Titlebar的处理 9. 小米 与 魅族 与 (莫名其妙的)华为 10. 腾讯优测UTest GitHub源码:TransparentStatusbar源码中分两个app TestBasic: 透明状态栏实现的示例,方便debug 白色