3.关于图书表功能

由于在admin.py中的功能较为复杂,我在这里选择分开讲解,我们先讲述图书功能。
那么图书功能分为两个表,作者与图书,我们先给出图书表具体的展示:

@admin.register(book)
class BookAdmin(ImportExportModelAdmin,AjaxAdmin):
    # 页面上展示的内容
    list_display = ("book_name","author", "book_price", "book_info","book_img", "book_press","book_address", "book_time","book_status")

    # 用于搜索的字段
    search_fields = ("book_name", "book_price", "book_press")

    # 排序字段
    ordering = ("book_price", "book_time")

    #按钮
    actions = ['lend','ret']

我们先给出需要展示的数据中的字段以及我们应该需要的按钮数量,按钮的功能其实我们在一开始的项目创立时就应该理清楚按钮逻辑,在这里两个按钮我分别赋予其lend(上架),ret(下架)两个按钮什么功能呢?
lend:

  • 改变书籍在架状态
  • 判断书籍状态,反馈行为是否成功并给出提示
 #上架按钮
    def lend(self,request,queryset):
        book = tuple(queryset.filter(book_status="0"))
        if not book:
            return messages.add_message(request=request, level=messages.ERROR, message="已经在架")
        else:
            # 修改为已经借出状态
            queryset.update(book_status="1")
            return messages.add_message(request=request,level=messages.SUCCESS,message="上架成功")
    lend.short_description = '上架'
    lend.icon = 'fas fa-audio-description'
    lend.type = 'warning'

ret:

  • 弹出表单以方便操作数据
  • 如果行为操作成功会自动将信息在借出表中生成一条数据
  • 行为不论是否操作成功都会给出提示
  • 表单中信息可以自动读取到表中数据
# 下架按钮
    def ret(self, request, queryset):
        #获取弹窗内容
        book_id = request.POST.get("book_id")
        taker_number = request.POST.get("taker_number")
        #转换时间格式
        lend_time1 = request.POST.get("lend_time")
        date_obj1 = datetime.strptime(lend_time1, "%a %b %d %Y %H:%M:%S GMT%z (%Z)")
        lend_time = date_obj1.strftime("%Y-%m-%d %H:%M:%S")
        # 转换时间格式
        back_time1 = request.POST.get("back_time")
        date_obj2 = datetime.strptime(back_time1, "%a %b %d %Y %H:%M:%S GMT%z (%Z)")
        back_time = date_obj2.strftime("%Y-%m-%d %H:%M:%S")

        status = request.POST.get("status")

        #获取书籍
        select_book = book.objects.filter(id=book_id)
        # 获取书籍的状态
        book_status = [i.book_status for i in select_book][0]

        #判断书籍是否已经借阅
        if book_status == '0':
           return JsonResponse(data={'status': 'error',
                                     'msg': '借阅的书籍不能再借阅!'})
        else:
        #用户存在的情况下新增一条借阅记录,修改书籍的借阅状态
           # 查询用户是否存在
            tak = taker.objects.filter(id=taker_number)
            if tak:
                # 修改借出的状态
                book.objects.filter(id=book_id).update(book_status=0)
                # 新增一条借阅记录
                bore.objects.create(#指定写入的顺序与记录来源
                                    bore_taker_name=taker.objects.get(id=taker_number),
                                    bore_book_name=book.objects.get(id=book_id),
                                    bore_lend_time=lend_time,
                                    bore_back_time=back_time,
                                    bore_status=status)
                return JsonResponse(data={
                    'status': 'success',
                    'msg': '借阅成功'
                })
            else:
                return JsonResponse(data={
                'status': 'error',
                'msg': '用户不存在'
            })

    ret.short_description = '下架'
    ret.icon = 'fas fa-audio-description'
    ret.type = 'danger'
    ret.layer = {
        'title': "借阅图书",
        "tips": "借阅图书,注意已经借阅过的图书不能再次借阅",
        "confirm_button": "确认提交",
        "cancel_button": "取消",
        "params": [{
            'type': 'select',
            'key': 'book_id',
            'label': '选择书籍',
            'width': '200px',
            # size对应elementui的size,取值为:medium / small / mini
            'size': 'small',
            # value字段可以指定默认值
            'value': '0',
            'options': get_book()
        },

            {
                'type': 'select',
                'key': 'taker_number',
                'label': '选择学生',
                'width': '200px',
                # size对应elementui的size,取值为:medium / small / mini
                'size': 'small',
                # value字段可以指定默认值
                'value': '0',
                'options': get_taker()
            },
            {
                'type': 'datetime',
                'key': 'lend_time',
                'label': '借出时间',
                'width': '200px',
                # size对应elementui的size,取值为:medium / small / mini
                'size': 'small'
            },
            {
                'type': 'datetime',
                'key': 'back_time',
                'label': '归还时间',
                'width': '200px',
                # size对应elementui的size,取值为:medium / small / mini
                'size': 'small'
            },
            {
                'type': 'select',
                'key': 'status',
                'label': '现在书籍状态',
                'width': '200px',
                # size对应elementui的size,取值为:medium / small / mini
                'size': 'small',
                # value字段可以指定默认值
                'value': '1',
                'options':[{
                    'key':'0',
                    'label':'已归还'
                },
                    {
                        'key': '1',
                        'label': '未归还'
                    },
                          ]
            },
        ]
    }

现在两个按钮功能其实都给出来了,大家可以具体参考,我们现在还应该考虑一个问题,这两个按钮如果不是管理员登录,是不是就应该无法使用,又或者说不会展示给普通用户?如何操作?

好的,下面是一个简单的图书信息管理系统的代码,实现了您所需的功能。请注意,这只是一个示例,可能需要根据您的具体需求进行修改和完善。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_BOOKS 100 // 最大书籍数量 struct book { char title[50]; // 书名 char author[20]; // 作者 char publisher[20]; // 出版社 float price; // 价格 int year; // 出版年份 }; struct book books[MAX_BOOKS]; // 存放书籍信息的数组 int book_count = 0; // 当前书籍数量 void show_menu(); // 显示菜单 void add_book(); // 添加书籍 void show_books(); // 浏览书籍 void search_book(); // 查询书籍 int main() { int choice; do { show_menu(); // 显示菜单 printf("请输入您的选择:"); scanf("%d", &choice); switch (choice) { case 1: add_book(); // 添加书籍 break; case 2: show_books(); // 浏览书籍 break; case 3: search_book(); // 查询书籍 break; case 4: printf("感谢使用图书信息管理系统,再见!\n"); break; default: printf("错误的选择,请重新输入!\n"); } } while (choice != 4); return 0; } void show_menu() { printf("**********图书信息管理系统**********\n"); printf("1. 添加书籍\n"); printf("2. 浏览书籍\n"); printf("3. 查询书籍\n"); printf("4. 退出系统\n"); printf("************************************\n"); } void add_book() { if (book_count >= MAX_BOOKS) { printf("书籍数量已达到上限,无法添加!\n"); return; } struct book new_book; printf("请输入书名:"); scanf("%s", new_book.title); printf("请输入作者:"); scanf("%s", new_book.author); printf("请输入出版社:"); scanf("%s", new_book.publisher); printf("请输入价格:"); scanf("%f", &new_book.price); printf("请输入出版年份:"); scanf("%d", &new_book.year); books[book_count] = new_book; book_count++; printf("添加成功!\n"); } void show_books() { if (book_count == 0) { printf("暂无书籍信息!\n"); return; } printf("共有 %d 本书:\n", book_count); for (int i = 0; i < book_count; i++) { printf("书名:%s,作者:%s,出版社:%s,价格:%.2f,出版年份:%d\n", books[i].title, books[i].author, books[i].publisher, books[i].price, books[i].year); } } void search_book() { if (book_count == 0) { printf("暂无书籍信息!\n"); return; } char keyword[50]; printf("请输入要查询的书名或作者:"); scanf("%s", keyword); int count = 0; // 记录匹配到的书籍数量 for (int i = 0; i < book_count; i++) { if (strstr(books[i].title, keyword) || strstr(books[i].author, keyword)) { printf("书名:%s,作者:%s,出版社:%s,价格:%.2f,出版年份:%d\n", books[i].title, books[i].author, books[i].publisher, books[i].price, books[i].year); count++; } } if (count == 0) { printf("没有匹配到任何书籍!\n"); } else { printf("共匹配到 %d 本书!\n", count); } } ``` 以上代码实现了一个简单的图书信息管理系统,包含添加书籍、浏览书籍、查询书籍等功能。您可以根据需要进行修改和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不是少爷.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值