当前位置: 首页 > news >正文

儿童绘本馆图书借阅租赁知识付费小程序源码交流

1.分类图书

2.书单推荐

4.会员卡次、期限购买

5.借阅时间选择

6.积分签到

7.优惠Q领取

前端uniapp开发   后端thinkphp开发 完全开源

 

 

 

 

<template>
    <view class="sp-section sp-index">
        <!-- search -->
        <view class="sp-index__search" @click="jumpTo('pages/index/search')">
            <input
                type="text"
                placeholder="书籍名称/作者名称"
                placeholder-class="sp-index__search-desc"
                readonly
            />
        </view>
        
        <!-- back -->
        <view class="sp-index__back"></view>
        
        <!-- banner -->
        <view class="sp-index__swiper">
            <swiper
                :indicator-dots="swiper.indicatorDots"
                :autoplay="swiper.autoplay"
                :interval="swiper.interval"
                :duration="swiper.duration"
            >
                <swiper-item v-for="(item, $index) in info.rotation_chart" :key="$index">
                    <image :src="item.rotation_image" @click="jumpToDetail(item)"></image>
                </swiper-item>
            </swiper>
        </view>
        
        <!-- grid -->
        <view class="sp-index__menu">
            <view
                class="sp-index__menu-item"
                v-for="(item, $index) in info.age"
                :key="$index"
                @click="setCategory($index)"
            >
                <image :src="item.age_img"></image>
                <text>{{ item.age }}</text>
            </view>
        </view>
        
        <!-- ads -->
        <view class="sp-index__link">
            <view class="sp-index__link-item" @click="jumpTo('pages/mine/member')">
                <text>成为会员</text>
                <text>畅享多重特权福利</text>
            </view>
            <view class="sp-index__link-item" @click="jumpTo('pages/mine/article')">
                <text>租借流程</text>
                <text>便捷租书运送快</text>
            </view>
        </view>
        
        <!-- ads -->
        <view class="sp-index__ad" v-if="info.index_img && info.index_img.index_img">
            <image :src="info.index_img.index_img" @click="jumpTo('pages/mine/member')"></image>
        </view>
        
        <!-- 推荐书单 -->
        <view class="sp-index__boxes">
            <view class="sp-index__title">
                <text class="sp-index__title-main">推荐书单</text>
                <text class="sp-index__title-more" @click="jumpTo('pages/book/series')">更多&gt;</text>
            </view>
            <scroll-view :scroll-x="true" class="sp-index__hot">
                <view class="sp-index__hot-item" v-for="(item, $index) in info.book_menu" :key="$index" @click="jumpTo('pages/book/list?id=' + item.id)">
                    <view class="sp-index__hot-back"></view>
                    <view class="sp-index__hot-pics">
                        <image v-for="(book, $book) in item.book_list" :key="$book" :src="book.book_img"></image>
                    </view>
                    <view class="sp-index__hot-info">{{ item.menu_name }}</view>
                </view>
            </scroll-view>
        </view>
        
        <!-- 系列精品 -->
        <view class="sp-index__boxes">
            <view class="sp-index__title">
                <text class="sp-index__title-main">系列精品</text>
            </view>
            <view class="sp-index__list">
                <view class="sp-index__list-item" v-for="item in info.book_series" :key="item.id" @click="jumpTo('pages/book/series?id=' + item.id)">
                    <view class="sp-index__list-info">
                        <text>{{ item.series_name }}</text>
                        <text>{{ item.series_synopsis }}</text>
                    </view>
                    <view class="sp-index__list-pics">
                        <image :src="item.series_img"></image>
                    </view>
                </view>
            </view>
        </view>
        
        <!-- 推荐图书 -->
        <view class="sp-index__boxes">
            <view class="sp-index__title">
                <text class="sp-index__title-main">推荐图书</text>
            </view>
            <view class="sp-index__goods">
                <sp-goods v-for="(item, $index) in info.books" :key="$index" :index="$index" :info="item" />
            </view>
        </view>
        <!-- <section class="sp-groods__row sp-index__goods">
            <sp-goods />
        </section> -->
        
        <!-- 用户信息 -->
        <view class="sp-index__user" v-if="showUsers && !info.users || info.users.age == 0">
            <view class="sp-index__user-content">
                <view class="sp-index__user-icon"></view>
                <image src="../../static/images/index/back.png" mode="widthFix"></image>
                <view class="sp-index__user-title">填写宝贝信息</view>
                <view class="sp-index__user-form">
                    <view class="sp-index__user-item">
                        <label>宝贝昵称</label>
                        <input type="text" placeholder="请输入宝贝昵称" v-model="user.username">
                    </view>
                    <view class="sp-index__user-item">
                        <label>宝贝性别</label>
                        <view class="sp-index__user-sex">
                            <view
                                class="sp-index__user-man"
                                :class="{ 'active': user.sex == '男' }"
                                @click="() => { user.sex = '男' }"
                            ></view>
                            <view
                                class="sp-index__user-woman"
                                :class="{ 'active': user.sex == '女' }"
                                @click="() => { user.sex = '女' }"
                            ></view>
                        </view>
                    </view>
                    <view class="sp-index__user-item">
                        <label>宝贝年龄</label>
                        <input type="text" placeholder="请输入宝贝年龄" v-model="user.age">
                    </view>
                    <view class="sp-index__user-type">
                        <label>喜欢的图书类型</label>
                        <view class="sp-index__user-classify">
                            <text
                                v-for="(item, $index) in navs"
                                :key="$index"
                                :class="{ 'checked': item.checked }"
                                @click="setNavsChecked($index)"
                            >{{ item.class_name }}</text>
                        </view>
                    </view>
                </view>
                <view class="sp-index__user-button" @click="saveUserInfo">完成</view>
            </view>
        </view>
        
        <!-- 碳层 -->
        <view class="sp-index__mask" v-if="showPopup">
            <view class="sp-index__mask-image">
                <image :src="info.index_img.index_popup" @click="toPopupDetail"></image>
                <view class="sp-index__mask-close" @click="closePopup"></view>
            </view>
        </view>
        
        <!-- fixed 客服 -->
        <sp-contact />
        
        <!-- 登录  -->
        <u-popup v-model="show" mode="bottom" borderRadius="24" :closeable="true">
            <sp-login v-if="!isUser" @complete="getLoginComplete" />
        </u-popup>
    </view>
</template>

<script>
    export default {
        name: 'MemberIndex',
        data () {
            return {
                show: false,
                info: {},
                isUser: true,
                swiper: {
                    indicatorDots: true,
                    autoplay: true,
                    interval: 2000,
                    duration: 500
                },
                navs: [],
                user: {
                    username: '',
                    sex: '',
                    age: '',
                    id: ''
                },
                showUsers: false,
                showPopup: false
            }
        },
        onLoad () {
            // this.setLogin()
        },
        onShow () {
            // this.getInitData()
            const userId = uni.getStorageSync('userId')
            this.isUser = userId ? true : false
            this.show = userId ? false : true
            if (this.isUser) {
                this.getInitData(userId)
            }
            this.getCategory()
            setTimeout(() => {
                this.showPopup = uni.getStorageSync('showPopup') ? uni.getStorageSync('showPopup') : false
            }, 500)
        },
        created () {},
        mounted () {
        },
        methods: {
            // 点击年龄跳转
            setCategory (index) {
                uni.setStorageSync('ageIndex', index)
                uni.switchTab({
                    url: '/pages/book/category'
                })
            },
            // popup跳转
            toPopupDetail () {
                uni.navigateTo({
                    url: this.info.index_img.index_popup_url
                })
            },
            // 关闭popup
            closePopup () {
                this.showPopup = false
                uni.setStorageSync('showPopup', false)
            },
            // 保存
            async saveUserInfo() {
                const params = this.user
                params.book_interest = this.navs.filter(item => item.checked).map(item => item.id)
                if (params.username === '') {
                    this.$u.toast('请填写宝宝昵称')
                    return false
                }
                if (params.sex === '') {
                    this.$u.toast('请选择宝宝性别')
                    return false
                }
                if (params.age === '') {
                    this.$u.toast('请选择宝宝年龄')
                    return false
                }
                if (params.book_interest === '') {
                    this.$u.toast('请选择图书类型')
                    return false
                }
                const userId = uni.getStorageSync('userId')
                params.user_id = userId
                delete params.id
                const { code, data } = await this.$u.api.IndexApi.setModalInfo(params)
                console.log('saveUsers', code, data)
                if (code === 200) {
                    const userId = uni.getStorageSync('userId') 
                    this.getInitData(userId)
                }
            },
            // 获取1级分类
            async getCategory () {
                const { code, data } = await this.$u.api.IndexApi.getFirsetCategory()
                if (code === 200) {
                    this.navs = data.first_class.map(item => {
                        item.checked = false
                        return item
                    })
                }
            },
            setNavsChecked(index) {
                this.navs[index].checked = !this.navs[index].checked
            },
            jumpTo(val) {
                this.$u.route(val)
            },
            // 跳转到书籍详情
            jumpToDetail (item) {
                // "join_type": 1, // 0=不关联,1=书籍详情,2=推荐书单详情,3=系列精品详情,4=推广页面
                if (item.join_type == 0 || item.book_id == 0) {
                    return false
                } else if (item.join_type == 1) {
                    uni.navigateTo({
                        url: '/pages/book/detail?id=' + item.book_id
                    })
                } else if (item.join_type == 2) {
                    uni.navigateTo({
                        url: '/pages/book/list?id=' + item.book_id
                    })
                } else if (item.join_type == 3) {
                    uni.navigateTo({
                        url: '/pages/book/series?id=' + item.book_id
                    })
                } else if (item.join_type == 4) {
                    uni.navigateTo({
                        url: '/pages/mine/qrcodeExtension'
                    })
                } else {
                    return false
                }
            },
            // 出发获取首页
            getLoginComplete () {
                const userId = uni.getStorageSync('userId') 
                this.isUser = userId ? true : false
                this.show = userId ? false : true
                // this.isUser = true
                this.getInitData(userId)
            },
            // 获取首页信息
            async getInitData (id) {
                const { code, data } = await this.$u.api.IndexApi.getIndexInfo(id)
                if (code === 200) {
                    this.info = data
                    this.showUsers = this.info.users.age == 0
                    this.showPopup = this.info.users.age < 1
                }
            }
        },
        onShareAppMessage () {}
    }

相关文章:

儿童绘本馆图书借阅租赁知识付费小程序源码交流

1.分类图书 2.书单推荐 4.会员卡次、期限购买 5.借阅时间选择 6.积分签到 7.优惠Q领取 前端uniapp开发 后端thinkphp开发 完全开源 <template> <view class"sp-section sp-index"> <!-- search --> <view class&qu…...

Vue3 中 axios 的安装及使用

目录前言&#xff1a;一、什么是 axios &#xff1f;二、Axios 的配置项三、Axios 的请求方式四、自定义创建实例五、Axios 请求错误处理六、Axios 解决跨域问题七、Axios 请求案例随机笑话大全总结&#xff1a;前言&#xff1a; 在编写vue里的项目时&#xff0c;必须要用和后台…...

Django设计模式以及模板层介绍

MVC和MTV 传统的MVC作用&#xff1a;降低模块间的耦合度&#xff08;解耦&#xff09;Django的MTV模式 作用&#xff1a;降低模块间的耦合度&#xff08;解耦&#xff09;什么是模板 1、模板是可以根据字典数据动态变化的html网页2、模板可以根据视图中传递的字典数据动态生成相…...

Linux信号一门搞定

1.信号是什么&#xff1f; 信号其实就是一个软件中断。 例&#xff1a; 输入命令&#xff0c;在Shell下启动一个前台进程。用户按下Ctrl-C&#xff0c;键盘输入产生一个硬件中断。如果CPU当前正在执行这个进程的代码&#xff0c;则该进程的用户空间代码暂停执行&#xff0c;…...

手撸一个动态Feign,实现一个“万能”接口调用

Feign&#xff0c;在微服务框架中&#xff0c;是的服务直接的调用变得很简洁、简单&#xff0c;而不需要再编写Java Http调用其他微服务的接口。 动态feign 对于fegin调用&#xff0c;我们一般的用法&#xff1a;为每个微服务都创建对应的feignclient接口&#xff0c;然后为每…...

Linux Capabilities 入门

目录 Linux capabilities 是什么&#xff1f; capabilities 的赋予和继承 线程的 capabilities Permitted Effective Inheritable Bounding Ambient 文件的 capabilities Permitted Inheritable Effective 运行 execve() 后 capabilities 的变化 案例 Linux capab…...

驱动 day6

关于设备树的理解&#xff1a; 设备树&#xff08;Device Tree&#xff09;是一种用于特定硬件设备的解释语法树。它用来表示存储有关主板硬件和CPU架构信息的数据在内核中的传递格式&#xff0c;使内核可以更好地了解硬件并支持它们&#xff0c;而不必编写固定的代码。设备节点…...

附录2-tensorflow目标检测

源码来自作者Bubbliiiing&#xff0c;我对参考链接的代码略有修改&#xff0c;网盘地址 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;dvb1 目录 1 参考链接 2 环境 3 数据集准备 3.1 VOCdevkit/VOC2007 3.2 model_data/voc_classes.txt 3.3 voc_an…...

常见的EMC问题

电磁兼容设计的目的就在于满足产品功能要求、减少调试时间&#xff0c;使产品满足电磁兼容标准的要求&#xff0c;并且使产品不会对系统中的其它设备产生电磁干扰。 电磁兼容设计中常见的问题有哪些&#xff1f; 1、电磁兼容设计可以从电路设计&#xff08;包括器件选择&…...

Redis内存存储效率问题

目录 内存碎片是如何形成的&#xff1f; 如何判断是否有内存碎片&#xff1f; 如何清理内存碎片&#xff1f; INFO命令 面向 Prometheus 的 Redis-exporter 监控 实习期间&#xff0c;了解到&#xff0c;企业级开发中多个项目使用Redis&#xff0c;运行Redis实例的有可能是…...

3.28 haas506 2.0开发教程-example-蓝牙多设备扫描(仅支持M320,HD1)

haas506 2.0开发教程-example-蓝牙多设备扫描案例说明蓝牙信息克隆1.手机蓝牙改名信息克隆代码测试案例说明 开发板扫描蓝牙设备&#xff0c;获取并打印蓝牙设备mac地址。mac地址每个设备不同&#xff0c;且不能更改。本案例仅适用于M320开发板和HD1-RTU。案例使用手机与iBeac…...

C语言经典编程题100例(41~60)

目录41、习题4-4 特殊a串数列求和42、习题4-6 水仙花数43、习题4-7 最大公约数和最小公倍数44、习题7-5 找鞍点45、练习5-1 求m到n之和46、练习5-2 找两个数中最大者47、练习5-3 数字金字塔48、习题5-1 符号函数49、习题5-2 使用函数求奇数和50、习题5-3 使用函数计算两点间的距…...

git日常使用命令

实习这段时间使用了很多git指令来提交代码&#xff0c;简单记录一下日常使用的指令&#xff1a; 提交代码通常顺序&#xff1a; 1.git status 查看本地修改项 2.git add . 提交全部文件 &#xff08;这个 .是全部文件&#xff09;到暂存区 3.git commit -m ‘本次提交的说明’…...

ES6对象展开运算符浅拷贝or深拷贝

ES6中提出的对象展开运算符“…”就是用来展开元素的。有了它就不用代码循环遍历了&#xff0c;偷懒专用。 1. 合并数组 展开原有数组中的所有元素&#xff0c;可以合并成一个新的数组。 var a[1,2,3]; var b[4,5,6]; var c[...a,...b]; console.log(c) // 输出&#xff1a;…...

leaflet 上传包含shp的zip文件,在map上解析显示图形(059)

第059个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中本地上传包含shp的zip文件,利用shapefile读取shp数据,并在地图上显示图形。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果加载shapefile.js方式安装引用jszip(…...

CAN总线详细介绍

1.1 CAN是什么&#xff1f; CAN 最终成为国际标准 &#xff08; ISO11898(高速应用)和 ISO11519&#xff08;低速应用&#xff09;&#xff09;&#xff0c;是国际上应用最广泛的现场总线之一。 1.2 CAN总线特点 多主方式: 可以多主方式工作&#xff0c;网络上任意一个节点…...

python如何完成对 Excel文件的解密后读取?

通常为了防止重要的Excel文件数据内容的泄露&#xff0c;需要对文件整体进行加密与解密的操作。 对于文件的加解密过程&#xff0c;python也有很多非标准库来帮助我们完成操作&#xff0c;这里主要说明如何完成对Excel文件的解密与读取操作。 这里我们使用到的是msoffcrypto-…...

微服务实战--高级篇:RabbitMQ高级

服务异步通信-高级篇 消息队列在使用过程中&#xff0c;面临着很多实际问题需要思考&#xff1a; 1.消息可靠性 消息从发送&#xff0c;到消费者接收&#xff0c;会经理多个过程&#xff1a; 其中的每一步都可能导致消息丢失&#xff0c;常见的丢失原因包括&#xff1a; 发送…...

autoCAD2022 - 设置新的原点

文章目录autoCAD2022 - 设置新的原点概述笔记UCS原点设置功能的菜单位置ENDautoCAD2022 - 设置新的原点 概述 上次整板子的dxf时, 原来的原点不合适, 想调整一下. 当时整完了, 没记录. 这次用的时候, 又找半天… 设置新原点的功能, 不在顶部菜单中, 而是在视图右上角的UCS图标…...

spring boot 配置 mybatis-plus多数据源

简介Mybatis-puls 多数据源的使用&#xff0c;采用的是官方提供的dynamic-datasource-spring-boot-starter包的 DS 注解&#xff0c;具体可以参考官网&#xff1a;https://gitee.com/baomidou/dynamic-datasource-spring-boot-starterpom.xml文件引入如下依赖主要引入dynamic-d…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

【实施指南】Android客户端HTTPS双向认证实施指南

&#x1f510; 一、所需准备材料 证书文件&#xff08;6类核心文件&#xff09; 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...

Python爬虫实战:研究Restkit库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...