基于java springboot的小说阅读微信小程序含后台管理系统源码
系统运行环境
开发工具
eclipse(idea),mysql5.7(大于5.5),navicat,小程序开发工具
硬件要求
windows操作系统
cpu:2.4GHz
内存:4G
硬盘:100G
开发及运行环境
windows10操作系统
jdk1.8
mysql5.7
谷歌浏览器
详细设计
系统架构
后台开发语言选用java,采用maven构建项目,maven有很多优点,最大得优点就是模块化,依赖自动下载,主要用到springboot框架,springboot框架的有点很多,封装了servlet,提高了开发效率,集成了servlet容器,简单的配置,灵活的应用。还用到了mybatis,mybatis主要封装了jdbc,提供了灵活的sql配置文件。后台管理界面则采用了bootstrap框架,bootstrap扁平化设计,使得界面整体美观大方。js用到vue.js,数据dom绑定,操作更加简单方便。小程序则只用了自身的标签去实现,样式采用了微信官方提供weui样式库。数据库采用mysql,mysql体积小,安装方便灵活,适合中小型项目开发。
数据库设计
会员表(base_member)
字段名称 |
数据类型 |
必填 |
注释 |
id |
int(11) |
是 |
|
openid |
varchar(255) |
否 |
微信openid |
nickname |
varchar(255) |
否 |
昵称 |
avatar_url |
varchar(255) |
否 |
头像 |
gender |
char(1) |
否 |
性别 |
real_name |
varchar(50) |
否 |
姓名 |
mobile |
varchar(50) |
否 |
手机号码 |
login_name |
varchar(50) |
否 |
登录账号 |
password |
varchar(100) |
否 |
密码 |
integral |
int(11) |
否 |
积分 |
create_time |
datetime |
否 |
创建时间 |
图书表(book_book)
字段名称 |
数据类型 |
必填 |
注释 |
id |
int(11) |
是 |
|
book_name |
varchar(255) |
否 |
图书名称 |
category_id |
int(11) |
否 |
分类ID |
press |
varchar(50) |
否 |
出版社 |
author |
varchar(20) |
否 |
作者 |
price |
decimal(10,2) |
否 |
价格 |
pic_url |
varchar(255) |
否 |
图片 |
status |
tinyint(2) |
否 |
上下架 |
stock |
int(11) |
否 |
库存 |
describe |
text |
否 |
描述 |
create_time |
datetime |
否 |
创建时间 |
分类表(book_category)
字段名称 |
数据类型 |
必填 |
注释 |
id |
int(11) |
是 |
|
category_name |
varchar(255) |
否 |
分类名称 |
pic_url |
varchar(255) |
否 |
图片 |
sort |
int(11) |
否 |
排序 |
type |
tinyint(255) |
否 |
类型 |
create_time |
datetime |
否 |
创建时间 |
章节表(book_chapter)
字段名称 |
数据类型 |
必填 |
注释 |
id |
int(11) |
是 |
|
title |
varchar(50) |
否 |
标题 |
content |
longtext |
否 |
内容 |
book_id |
int(11) |
否 |
图书id |
sort |
int(11) |
否 |
排序 |
create_time |
datetime |
否 |
创建时间 |
评价表(book_evaluation)
字段名称 |
数据类型 |
必填 |
注释 |
id |
int(11) |
是 |
主键 |
order_id |
int(11) |
否 |
订单id |
member_id |
int(11) |
否 |
用户id |
content |
varchar(255) |
否 |
评价内容 |
star |
int(11) |
否 |
|
book_id |
int(11) |
否 |
图书id |
create_time |
datetime |
否 |
评价时间 |
阅读历史表(book_history)
字段名称 |
数据类型 |
必填 |
注释 |
id |
int(11) |
是 |
|
book_id |
int(11) |
否 |
图书id |
member_id |
int(11) |
否 |
会员id |
create_time |
datetime |
否 |
创建时间 |
管理员表(sys_user)
字段名称 |
数据类型 |
必填 |
注释 |
id |
bigint(20) |
是 |
|
username |
varchar(50) |
是 |
用户名 |
password |
varchar(100) |
否 |
密码 |
salt |
varchar(20) |
否 |
盐 |
|
varchar(100) |
否 |
邮箱 |
mobile |
varchar(100) |
否 |
手机号 |
status |
tinyint(4) |
否 |
状态 0:禁用 1:正常 |
create_time |
datetime |
否 |
创建时间 |
难点解答
小程序和后台通信通过wx.request方式
演示视频:
基于springboot小说阅读微信小程序源码
后台管理功能截图:
微信小程序:
后端关键代码:
package com.wfuhui.modules.wechat.controller;import java.util.Date;
import java.util.HashMap;
import java.util.Map;import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
import me.chanjar.weixin.common.error.WxErrorException;import com.wfuhui.common.annotation.AuthIgnore;
import com.wfuhui.web.utils.JwtUtils;
import com.wfuhui.common.utils.R;
import com.wfuhui.modules.member.entity.MemberEntity;
import com.wfuhui.modules.member.service.MemberService;/*** 微信小程序用户接口*/
@RestController
@RequestMapping("/api/wechat")
public class WxMaUserController {private final Logger logger = LoggerFactory.getLogger(this.getClass());@Autowiredprivate WxMaService wxService;@Autowiredprivate MemberService memberService;@Autowiredprivate JwtUtils jwtUtils;/*** 登陆接口*/@AuthIgnore@GetMapping("login")public R login(String code) {if (StringUtils.isBlank(code)) {return R.error("empty jscode");}try {WxMaJscode2SessionResult session = this.wxService.getUserService().getSessionInfo(code);this.logger.info(session.getSessionKey());this.logger.info(session.getOpenid());//查询用户信息MemberEntity user = memberService.queryByOpenid(session.getOpenid());if(user == null) {String sessionKey = session.getSessionKey();return R.error(1, "未注册").put("sessionKey", sessionKey);}//生成tokenString token = jwtUtils.generateToken(user.getId());Map<String, Object> map = new HashMap<String, Object>();map.put("token", token);map.put("userInfo", user);return R.ok(map);} catch (Exception e) {this.logger.error(e.getMessage(), e);return R.error();}}/*** 用户注册*/@AuthIgnore@GetMapping("register")public R register(String avatarUrl, String nickname, String gender, String code) {try {String openid = this.wxService.getUserService().getSessionInfo(code).getOpenid();//查询用户信息MemberEntity user = memberService.queryByOpenid(openid);if(user != null) {return R.ok();}//注册MemberEntity member = new MemberEntity();member.setAvatarUrl(avatarUrl);member.setOpenid(openid);member.setNickname(filterUtf8mb4(nickname));member.setGender(gender);member.setCreateTime(new Date());memberService.save(member);return R.ok();} catch (WxErrorException e) {e.printStackTrace();return R.error();}}public static String filterUtf8mb4(String str) {final int LAST_BMP = 0xFFFF;StringBuilder sb = new StringBuilder(str.length());for (int i = 0; i < str.length(); i++) {int codePoint = str.codePointAt(i);if (codePoint < LAST_BMP) {sb.appendCodePoint(codePoint);} else {i++;}}return sb.toString();}}
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.wfuhui</groupId><artifactId>novel-server</artifactId><version>0.0.1-SNAPSHOT</version><name>novel-server</name><description>novel project for Spring Boot</description><properties><java.version>1.8</java.version><maven-jar-plugin.version>3.1.1</maven-jar-plugin.version><druid.version>1.0.28</druid.version><mysql.version>8.0.16</mysql.version><mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version><commons.lang.version>2.6</commons.lang.version><commons.fileupload.version>1.3.1</commons.fileupload.version><commons.io.version>2.5</commons.io.version><commons.codec.version>1.10</commons.codec.version><shiro.version>1.3.2</shiro.version><jwt.version>0.7.0</jwt.version><kaptcha.version>0.0.9</kaptcha.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.spring.boot.version}</version></dependency><!--devtools热部署--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional><scope>true</scope></dependency><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>${commons.lang.version}</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>${commons.fileupload.version}</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>${commons.io.version}</version></dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>${shiro.version}</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>${shiro.version}</version></dependency><dependency><groupId>com.github.axet</groupId><artifactId>kaptcha</artifactId><version>${kaptcha.version}</version></dependency><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.3.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>${druid.version}</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-miniapp</artifactId><version>3.4.0</version></dependency><dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-pay</artifactId><version>3.4.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><repositories><repository><id>public</id><name>aliyun nexus</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><releases><enabled>true</enabled></releases></repository></repositories><pluginRepositories><pluginRepository><id>public</id><name>aliyun nexus</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>false</enabled></snapshots></pluginRepository></pluginRepositories></project>
//index.js
//获取应用实例
const app = getApp()
var sliderWidth = 57.6; // 需要设置slider的宽度,用于计算中间位置
Page({data: {autoplay: true,interval: 3000,duration: 1000,bannerList: [],categoryList: [{id: 1,categoryName: '男生'},{id: 2,categoryName: '女生'}],bookList: [],recommendList: [],bookEvaluateList: [],bookHistoryList: [],isLoad: false,page: 1,pageSize: 9,tabs: ["最新上架", '最多阅读', '最多评价'],activeIndex: 0},onLoad: function() {this.getAdvert();//this.getCategory();//this.getBook();this.getRecommend();var that = this;wx.getSystemInfo({success: function (res) {that.setData({sliderLeft: (res.windowWidth / that.data.tabs.length - sliderWidth) / 2,sliderOffset: res.windowWidth / that.data.tabs.length * that.data.activeIndex});}});},onShow: function(){},tabClick: function (e) {this.setData({activeIndex: e.currentTarget.id,sliderOffset: e.currentTarget.offsetLeft,page: 1});if(e.currentTarget.id == 0){this.getBook()}else if(e.currentTarget.id == 1){this.getBookHistory();}else if(e.currentTarget.id == 2){this.getBookEvaluate();}},showInput: function () {wx.navigateTo({url: '/pages/book/book-list/index',})},getAdvert: function() {var that = this;wx.request({url: app.globalData.domain + '/api/advert/list',data: {position: 'shop'},success: function(res) {that.setData({bannerList: res.data.advertList});}})},getCategory(){var that = this;wx.request({url: app.globalData.domain + '/api/category/list',data: {},success: function (res) {var categoryList = res.data.categoryList;var categories = ['全部'];for(var i = 0; i < categoryList.length; i++){categories.push(categoryList[i].categoryName)}that.setData({categoryList: res.data.categoryList,tabs: categories});wx.getSystemInfo({success: function (res) {that.setData({sliderLeft: (res.windowWidth / that.data.tabs.length - sliderWidth) / 2,sliderOffset: res.windowWidth / that.data.tabs.length * that.data.activeIndex});}});}})},getRecommend(){var that = this;var categoryId = '';if (this.data.activeIndex != 0){categoryId = this.data.categoryList[this.data.activeIndex - 1].id}wx.request({url: app.globalData.domain + '/api/book/list',data: {type: categoryId,page: that.data.page,limit: that.data.pageSize,recommend: 1},success: function(res) {that.setData({recommendList: res.data.bookList})}})},getBookEvaluate(){var that = this;wx.request({url: app.globalData.domain + '/api/book/listEvaluate',data: {page: that.data.page,limit: that.data.pageSize},success: function(res) {that.setData({bookList: res.data.bookList})}})},getBookHistory(){var that = this;wx.request({url: app.globalData.domain + '/api/book/listHistory',data: {page: that.data.page,limit: that.data.pageSize},success: function(res) {that.setData({bookList: res.data.bookList})}})},getBook: function() {var that = this;var categoryId = '';if (this.data.activeIndex != 0){categoryId = this.data.categoryList[this.data.activeIndex - 1].id}wx.request({url: app.globalData.domain + '/api/book/list',data: {type: categoryId,page: that.data.page,limit: that.data.pageSize},success: function(res) {that.setData({bookList: res.data.bookList})return;if (that.data.page == 1) {that.setData({bookList: []});}if (res.data.code != 0) {that.setData({isLoad: false});return;}if (res.data.bookList.length == 0) {that.setData({isLoad: true});return;}var book = that.data.bookList;for (var i = 0; i < res.data.bookList.length; i++) {book.push(res.data.bookList[i]);}that.setData({bookList: book,isLoad: false});}})},loadMore: function () {return;console.log("load more")var that = this;var isLoad = this.data.isLoad;console.log(isLoad)if (!isLoad) {this.setData({page: that.data.page + 1});this.getBook();}},onPullDownRefresh: function() {this.setData({page: 1});wx.showNavigationBarLoading()this.getAdvert();//this.getCategory();this.getBook();setTimeout(function() {wx.hideNavigationBarLoading() //完成停止加载wx.stopPullDownRefresh() //停止下拉刷新}, 1000);},onShareAppMessage: function() {var path = '/pages/index/index';if (app.globalData.distributor) {path = path + "?distributor=" + app.globalData.distributor;}return {title: wx.getStorageSync('storeName'),path: path,success: function(res) {// 转发成功},fail: function(res) {// 转发失败}}},/*** 页面上拉触底事件的处理函数*/onReachBottom: function () {this.loadMore();}
})
基于java springboot的小说阅读微信小程序含后台管理系统源码
基于java springboot的小说阅读微信小程序含后台管理系统源码相关推荐
- 基于olami开放语义平台的微信小程序遥知之源码实现
概述 实现一个智能生活信息查询的小秘书功能,支持查天气.新闻.日历.汇率.笑话.故事.百科.诗词.邮编.区号.菜谱.股票.节目预告,还支持闲聊.算24点.数学计算.单位换算.购物.搜索等功能. 使用方 ...
- 基于JAVA+SpringMVC+Mybatis+MYSQL的微信小程序图书借阅管理系统
项目介绍 一款用于图书推荐.搜索.借阅.交流的微信小程序 使用技术 前端 微信小程序 UI框架: Amaze UI 数据可视化处理库: Highcharts.js 后端 Web MVC框架: Spri ...
- 基于java springboot的生鲜配送微信小程序源码
近几年线下生鲜超市得到迅速发展,加上互联网的冲击,很多生鲜超市向上转型,依托于互联网技术来开发线上配送业务,主要功能我列了个框架,近期到了毕业季,所以选择了该题目弄了个生鲜配送小程序,后台选择了jav ...
- 基于java springboot 社区团购微信小程序源码
去年火了一整年的社区团购,一直将战火烧到了2021年春节.春节期间,一些菜市场和小店暂停营业,居民置办年货和买菜的需求剧增,各大以买菜为主要卖点的社区团购平台,盯上了这个难得的冲单时机. 后台主要用到 ...
- 基于微信小程序的家教管理系统源码
目录 一.整体目录(示范): 文档含项目技术介绍.E-R图.数据字典.项目功能介绍与截图等 二.运行截图 三.代码部分(示范): 四.数据库表(示范): 数据库表有注释,可以导出数据字典及更新数据库时 ...
- 微信小程序记事本+后台管理系统
<微信小程序记事本+后台管理系统>该项目含有源码.论文等资料.配套开发软件.软件安装教程.项目发布教程等 本系统包含微信小程序做的记事本前台和Java做的后台管理系统: 微信小程序--记事 ...
- 微信小程序宠物商城项目源码来了~
微信小程序蒙服汇项目源码来了~ 微信小程序垃圾分类项目源码来了~ 微信小程序校园社团管理系统项目源码来了~ 团队承接各类小程序定制,需要加微 code_gg_boy .小商城,购物,公司的一些管理,流 ...
- 微信小程序菜谱+后台管理系统
<微信小程序菜谱+后台管理系统>该项目含有源码.论文等资料.配套开发软件.软件安装教程.项目发布教程等 本系统包含微信小程序做的菜谱前台和Java做的后台管理系统: 微信小程序--菜谱前台 ...
- 微信小程序盲盒系统源码 附带教程
微信小程序盲盒系统源码 可对接微信支付 附带教程 盲盒小程序的教学 服务器安装宝塔面板 设置好网站 数据库 设置好SSL证书 上传微擎框架 框架安装好 上传小程序后台 /addons 这个目录是放置后 ...
最新文章
- (万字长文)Spring的核心知识尽揽其中
- Android必知必会-Android Studio下配置和使用Lambda
- 洛谷 P1067 多项式输出
- 机器博弈 (四)博弈规则的设计
- ES6、7学习笔记(尚硅谷)-2-let和const
- 沿着哈勃望远,看清MyBatis整体架构
- 3D打印技术到底有多强大?
- 前端加速必备之BootCDN
- MySQL 5.5.62 一键安装包
- 【echarts应用】---pie饼图篇
- win7 找不到 计算机策略组,win7打开组策略提示无权限怎么解决 win7系统组策略如何开启...
- h5小游戏在线玩:万圣节互动游戏《逃离禁闭岛》通关完全攻略
- 张艾迪(创始人):世界前三大互联网公司
- 【BYM】Android 仿百度搜索列表滑动效果,写的太详细了
- A Convolutional Neural Network Model for Predicting a Product’s Function, Given Its Form
- c语言机器人编程软件,诺宝RC|免费版机器人编程软件下载_最火软件站
- n-grams语言模型——【torch学习笔记】
- 几个不为人知的手机实用技巧,你肯定没用过!一般人我不告诉他
- MT5交易平台下载(外汇MT5软件的优势)
- magento1中的eav模式讲解(入表)