赞
踩
由于之前的Java后台微信点餐小程序有些知识点过时了,所以今天重新出一版,把里面过时的知识点更新下
前五章是部署笔记,后面是知识点的详细讲解,大家可以先看部署笔记,部署起来后,再跟着详细知识学习。
在开始学习之前,要记得安装jdk8和mysql8,后面的笔记里也会具体讲解怎么安装,但是jdk8和mysql8必须和石头哥保持一致。

登录成功后如下










可以在后台送客户金额,用于模拟支付


如上图,目前实现了如下功能。
1,扫码点餐
2,菜品浏览
3,餐厅电话
4,在线客服
5,排号等位
6,顶部轮播图
7,搜索功能
8,购物车页面
9,会员功能




这里新加了会员8折优惠的功能

学习版只提供模拟支付,这里的模拟是否使用用户的积分来支付。支付之前可以实时显示用户当前余额。



1,可以注册用户
2,可以注册会员
3,可以查看我的订单
4,可以查看我的评价
5,可以查看我的排号
6,可以拨打饭店电话



可以排大桌和小桌

过号后可以重新排号

我们每次排号时可以获取订阅消息,排到自己时可以收到微信消息

当管理员点击当前用户入座时

用户会收到如下消息


jdk8和MySQL8的安装与使用,网上很多教程的,可以自己去网上随便找一个跟着安装即可

关于源码的导入,我这里说下,只要大家认真跟着笔记或者视频走,都可以跑起来的,如果你实在不想看笔记或者视频,可以找石头哥付费部署,石头哥可以远程协助你在10-30分钟内把项目完整的运行起来。
这里先说明下,我的源码会不断的更新,建议大家用最新的代码,历史文件忽略就行了

把上图所示的以Java-diancan开头的源码下载到桌面并解压



这里要说明下,我源码可能会更新,记得去网盘里下载最新的源码,解压后导入即可。
导入成功后如下图

这里我们需要配置APPID和APPSECRET,记得把这两个换成你自己的。

这两个的获取,需要你先去注册小程序,下面小程序部分的章节会具体讲小程序的注册。这里先教大家怎么拿到APPID和APPSECRET

有的同学导入项目后会报下面这个错误,如果报的话,可以忽略不用管,当然没报肯定更好了。

确认下项目是不是使用的jdk8,有时候不用jdk8有可能会报如下错误

解决方法如下图

记得要使用Java8

我们这里要安装的是mysql8.0数据库。只要是8.0开头的,不管是8.0.11还是8.0.19都可以。
数据库的安装,我在点餐视频的第3章的2,3,4节里都有讲。

接下来,我们就要关联mysql数据库了,方便后面的可视化管理

然后选择Mysql 如下图

接下来就要进行数据库的配置了,这里如实的输入自己的数据库名和密码就行

这里要强调下,mysql数据库默认端口是3306,如果你有变过,记得把下面这里的端口号改为你最新的。一般不建议改变mysql的端口号的。

如果运气好的话,你点完Test Connection后会出现下面的绿色对勾。

链接成功后,不要忘记点ok

这就说明你关联成功了,但是好多同学会出现以下错误。

时区错误,MySQL默认的时区是UTC时区,比北京时间晚8个小时。所以要修改mysql的时区。
解决:
找到mysql安装目录并进入bin文件夹,我的是安装在c盘

然后输入cmd,回车

输入:mysql -uroot -p123456进入mysql命令模式

然后输入
set persist time_zone='+8:00';
再次连接成功

配置完后,点击下test,如果出现绿色对勾,即代表链接成功。然后点击ok



这是因为驱动没有安装的问题。
解决

问题出在了上图所示的地方。这个地方你如果有看我视频,肯定知道在哪里的。
我们下面就来说下怎么解决吧。

一定要注意,上图我使用的是com.mysql.jdbc.Driver这个数据库驱动。
然后下面的8.0.15的添加是先点加号,然后再如下图所示。

如果下面第3步箭头是灰色无法点击,说明你mysql数据库没有链接成功,去看下上面第三步里提到的视频。

idea链接数据库成功后,我们再来执行qcl.sql文件。

正常来说,点完run就可以直接执行sql了,但是由于idea做了升级,上面直接右键可能不是直接执行,当然了,如果你是老一点版本的idea,就会直接执行,但是如果你是新版的就会变成了下面所示。

这个时候,也不用害怕,只需要简单配置即可

然后就可以看到控制台打印下面日志

到这里我们数据相关的配置就完成了。
启动项目有两种方法
如下图所示

点击下图绿色箭头,运行项目

因为之前我们执行了sql,可能有的同学是这样的。

这里要记得切换成这个

我们上面点完运行,日志台会出现下面字样,就代表启动成功了

然后输入下面网址,如果返回下面文字,就代表启动成功了

也可以通过url.md里存的这个链接

输入下面网址,即可进入登陆后台页面。

注意端口号要和你设置页里的保持一致

有好多同学说执行项目后为啥只有一个表,如下

这是因为我们用的是jpa,项目运行的时候,会自动建表,当然创建后的表,需要你点击一下刷新才可以看得到。

刷新后如下

导入菜品后,有的图片可能因为时间太久失效了,记得自己去网上找下对应的图片链接来替换下失效的菜品图片链接。

如果不存在下面错误,直接跳过即可

通常报这个错误,是因为,我们的开发者工具idea没有安装lombok库导致的
提示我们没有安装,我们就安装一个不就行了,下面来教大家如何安装。
mac电脑点击扳手进入设置页

window电脑点击file----》settings

点击plugins,然后搜索lombok,点击install即可安装

安装完成后,重启idea开发工具即可

问题如下图所示:
产生这个问题的原因就是因为,你项目相关类库没有加载成功。或者说你的默认maven是国外链接,加载的比较慢,甚至没有加载下来。所以我们最好使用国内镜像的maven仓库。
1,先去我们的网盘里下载下图这个xml文件,下载后放到桌面
2,去配置maven
然后就是静静的等待了,快的话1分钟,慢的话5-10分钟。就可以把所有类库加载完了。
可以到网盘里找到下面红框里的讲解视频
有些同学的电脑,使用1-1的解决方法还是不行,通常是因为这些同学的电脑上不能使用阿里云镜像。所以这个时候我们就要换个解决思路了。这些同学常见的问题如下
这个时候我们就要使用默认的settings.xml了,下面教大家解决思路。
然后右键pom.xml如下
新建sttings.xml后重新导入下依赖包即可。
如果上面操作还不能加载类库,就如下图所示点击下clean
SQLException: Access denied for user ‘root’@‘localhost’ (using password: YES)
其实出现这个错误的主要原因,是因为你不细心,数据库的密码没有输入对。所以解决的方法就是数据库密码要输对。
问题原因:
时区错误,MySQL默认的时区是UTC时区,比北京时间晚8个小时。所以要修改mysql的时区。
找到mysql安装目录并进入bin文件夹,我的是安装在c盘
然后输入cmd,回车
输入:mysql -uroot -p123456进入mysql命令模式
然后输入
set persist time_zone='+8:00';
注意,上面的mysql> 不用输入的。只需要输入set persist time_zone=‘+8:00’; 后面这个分号不要忘记。
flush privileges;
做权限刷新,这样你设置的新的时区才会起效果。
再次连接成功
配置完后,点击下test,如果出现绿色对勾,即代表链接成功。然后点击ok
问题截图如下


出现这种问题是因为jdbc驱动问题,解决方案就是把默认的驱动删除,重新加载一个。解决方案如下
1,删除默认的驱动

2,重新添加jdbc驱动8.0.15
这里使用com.mysql.jdbc.Driver
这个问题呢,是你重启电脑后,再来启动项目时,会报的一个错误,如下图所示。
这是mysql8才会出现的一个问题,如果你出现了这个问题,解起来也很简单,只需要在链接数据库的url后面追加一个 allowPublicKeyRetrieval=true
你如果没有小程序开发基础,只需要看下这个视频学习下如何导入小程序源码到开发者工具即可
https://edu.csdn.net/course/play/9531
我们在开发小程序之前,首先需要安装小程序开发者工具,今天就来教大家安装小程序开发者工具。
一,其实很简单,只需要进入小程序官网,然后点击工具,如下图所示。


当然了,也可以直接通过下面链接去下载
https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html
二,下载安装包如下

不管你是window还是mac电脑,只需要双击安装包实现安装即可。

等待安装即可

安装完成

三,进入开发者工具

第一次进入时,如下

点击上图的加号,我们来创建一个新项目

完成上图的配置后,点击新建。即可创建项目。创建好以后的项目如下图所示。

这样我们就完成了小程序开发者工具的安装了,后面我们就可以开始小程序的代码编写了。
我们前面虽然可以用测试号创建小程序,但是测试号有很多功能会受限,比如我们后面讲的云开发,必须是注册小程序后才可以使用,所以今天我们就来讲讲小程序的注册.
其实官方给的注册步骤很详细了

官方注册地址:https://mp.weixin.qq.com/wxopen/waregister?action=step1
进入注册页面时,跟着提示一步步来就可以了

注意点:
如果只是学习的话,注册个人小程序即可.
如果想商用,想使用微信支付,取用户手机号等复杂功能,可以注册企业小程序,不过企业小程序必须有营业执照才可以注册
大家去网盘里把对应的代码下载下来即可。

1,点击加号创建小程序项目

2,导入源码,填写自己的appid
点击导入

然后选择下载并解压好的小程序源码

这里一定要用自己appid,不要用石头哥的。

至于appid如何获取,我这里不做讲解了,我零基础入门小程序的视频里都有讲解的:https://edu.csdn.net/course/detail/25749
和创建普通小程序一样,如上图所示,需要注意的就是这里必须要填写自己的appid,不可以用测试号. appid的获取如下图所示.



这和你上面java的运行要保持一致,如果是本地的java项目运行你就用 localhost

如果你是真机调试就用下面这个。


如果上述菜品栏没有数据,记得去自己的管理后台,先添加类目,再添加菜品


上面两步操作,可以批量导入,相应的数据,我也再网盘里给大家准备好了。

到这里我们点餐系统的java后台和微信小程序就完整的部署了。后面再有问题,我也会持续在这里给大家更新出来的。
正常情况下,我们的本地模拟器运行小程序是没问题的。如果想在手机上运行小程序。就只有两种方式了
1,部署Java后台到线上服务器(比较麻烦后面讲解)
2,运用真机调试
所以我们接下来重点讲解下真机调试
1,手机和电脑必须在同一个wifi下(也可以手机开热点)电脑链接热点
2,电脑防火墙要关掉
3,小程序代码app.js里要做如下处理

下面教大家如何获取自己的电脑ip
首先随便打开自己电脑的一个文件

输入cmd然后按回车键

然后就会出现下图所示的命令行窗口

然后输入ipconfig

这样就拿到我们需要的电脑ip了,然后去app.js里把ip换成你自己电脑的ip就行了。

记得把本地调试注释掉,把真机调试解开注释

真机调试前,一定记得把Java后台运行起来,然后点击真机调试

点完真机调试会出现一个二维码,然后用手机微信去扫描即可。
这里再次强调下
1,手机和电脑必须在同一个wifi下(也可以手机开热点)电脑链接热点
2,电脑防火墙要关掉
3,小程序代码app.js里要用你自己电脑的ip
IntelliJ IDEA是我们使用的Java开发者工具,后面简称idea,我们先教大家如何下载并破解idea,由于官方是收费的,只能免费试用30天,所以今天我会教大家如何破解。我们破解的话必须和我的版本一致,我用的是2019.2或者2019.3 最新的版本基本上很难破解的,所以不建议用最新版
我们这里以2019.2为例



不同电脑上安装步骤可能有些差异,下面步骤仅供参考。














由于这里存在法律风险,我这里不再教大家如何破解,大家去网上搜索即可,网上很多破解教程的。
今天来教大家如何安装Java开发环境jdk,我们这里以jdk8为例。
目前有3种方式























重新打开cmd命令行,输入javac,如果出现下面一大串提示就代表Java环境变量配置成功了。

上一节带领大家成功安装的java开发工具IntelliJ IDEA,这一节就来教大家如何创建自己的第一个java项目。
所用技术
同样本节课程会配套一个视频讲解。我们每节图文教程后面都会配套一个视频讲解,方便大家更直观的学习。
话不多说,我们就来教大家如何快速创建我们的第一个java项目。

我们工具第一次打开,可能会等待几分钟。

就是点击 我们上图箭头所指的 Create New Project
跟着下面图片一步一步来就行





到这里我们项目就创建完成了

我们开发java项目的时候,只需要关心src目录和pom.xml文件即可,别的都可以先不用管。


名字这里你可以随便取,但是有两点要求

代码如下
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Created by qcl on 2019-06-05
* desc:
*/
@RestController
public class Hello {
@GetMapping("/hello")
public String hello() {
return "欢迎访问我的网站";
}
}
到这里我们的第一个java项目就成功创建了,接下来我们运行项目看下效果


这里如果出现 Started DemoApplication in 3.426 seconds (JVM running for 4.769)
就代表项目成功运行起来了。
我们这里在浏览器里输入下面网址

到这里我们就完整的实现了自己的第一个可以访问的java项目。
如果觉得图文不太好理解,请查看本专栏下一节。老师下一节会用录制视频来讲解本节课程。
本节课是《手把手带你零基础入门java开发》系列课程的一节,如果你想快速入门java开发,想开发一款属于自己的java项目,想学习springboot,想了解小程序,想了解全栈开发,想开发自己的网站,可以跟着石头哥来零基础入门。
上一节给大家讲了mysql5.7的安装,有好多同学反应,在使用5.7安装包时,最终系统却安装成了mysql8.0。这是因为现在官方也提倡我们用最新版本的,所以今天我们就再来教下大家8.0的安装。在安装8.0之前,建议大家先把之前安装的5.7卸载了。
如果这种方式安装不成功,可以试下1-2的压缩包安装( 个人推荐压缩安装,Msi安装如果出现错误,容易安装失败。)

点击 No thanks

如果觉得官网下载有点慢,可以去我网盘里下载

注意:这里只要是8.0开头的就可以了,不管是8.0.11,8.0.18,8.0.19都可以的。
我这里以mysql8.0.11为例,如果你电脑上有安装过mysql,记得卸载干净。


























1.首先需要下载压缩包8.0版,下载过程我就不多赘述了(在此须特别注意压缩包的解压路径,后面步骤会用到)

2,以管理员身份进入命令提示符

进入到CMD环境后,输入mysql所在盘符d:后回车,进入d盘

然后输入命令:cd D:\mysql-8.0.29-winx64\mysql-8.0.29-winx64\bin
也就是你mysql安包的路径

以管理员身份进入命令提示符后,执行命令。
mysqld --initialize-insecure

(这里特别提一下,Mysql8.0版压缩包安装有很多方式,其中网上有些坑说要配置.ini文件和新建data文件夹,其实都不用,你会发现,如果你按照他们的说法去做,你的服务是无法启动的,还是那种不报错误的无法启动。)
然后再执行 mysqld -install

安装成功后,运行mysql 执行 net start mysql

(注意,上面的,命令行一个符号都不能少,后面的-insecure是初始化的时候,密码默认为空就是无密码,如果你不加。执行完后会随机生成一个密码,随机密码会在执行完后下面显示)
如果提示net不是内容命令,要记得用管理身份启动cmd命令行,然后再执行net start mysql

然后就可以登录mysql,并修改密码。
mysql -u root -p
set password for root@localhost='123456';
出现下面语句则修改成功。
Query OK, 0 rows affected (0.02 sec)
至此,Mysql8.0压缩包版就安装好了
两种方式,建议用第一种方式即可。如果第一种不行,再用第二种。
1,mysql自带客户端。

输入密码,成功进入







如果能出现版本号,就代表环境变量配置完成。
mysql -uroot -p123456
这里的root是mysql的用户名,123456是密码

上一节,我们讲了mysql5.7可视化操作,今天再来讲下mysql8的可视化操作,后面我们的课程,都用mysql8来讲,所以这一节很重要,一定要跟着老师一步步配置。






1,如下图所示,点击最右侧的DataBase,然后点击Data Source
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NhHNb1o9-1616120369963)(https://upload-images.jianshu.io/upload_images/6273713-1d5f493478fbe870.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
然后选择mysql

2,配置数据库


如果出现下面错误

时区错误,MySQL默认的时区是UTC时区,比北京时间晚8个小时。所以要修改mysql的时区。
解决:
找到mysql安装目录并进入bin文件夹,我的是安装在c盘

然后输入cmd,回车

输入:mysql -uroot -p123456进入mysql命令模式

然后输入
set persist time_zone='+8:00';
再次连接成功

配置完后,点击下test,如果出现绿色对勾,即代表链接成功。然后点击ok

create database test default character set utf8 collate utf8_general_ci;
use test;
create table user
(
id int null,
name varchar(20) null
);
创建好以后的user表,如下图。



到这里我们就可以成功的借助idea来可视化的操作mysql8了。后面我会讲解更多Java和小程序的知识,敬请关注。
我们经过前面的学习,已经可以正式操作mysql数据库,进行增删改查了。今天就来讲讲通过JPA来操作mysql数据库。学完本节,你会感慨springboot结合jpa操作数据库是如此的简单。好了,话不多说,我们开始在springboot中使用jpa。
1,创建一个新项目

2,定义项目名称,点击next

3,勾选Spring Web

4,勾选jpa和mysql驱动

5,点击finish

到这里我们就成功的创建springboot项目,并在项目里引入jpa了。下面我们就来讲解下怎么使用jpa操作数据库。
我们需要在配置文件里配置数据相关的信息。

完整配置代码如下
# 数据库驱动
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 数据库用户名
spring.datasource.username=root
# 数据库密码
spring.datasource.password=123456
# 链接本地数据库
spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&useSSL=false
# 每次启动项目时更新数据库
spring.jpa.hibernate.ddl-auto=update
我们这里用到了test数据库,所以我们要先新建一个test数据库。
创建test数据库的sql语句。如果你还不知道怎么使用idea链接mysql并创建数据库,可以去看下我前面的文章或者看下配套视频。
create database test default character set utf8 collate utf8_general_ci;
如下图所示,即代表我们创建test数据库成功

我们这里编写一个 Test类,这个test类会和我们的数据表test一一对应。然后表里有一个自增的id字段,和一个name字段。

/** * 作者:编程小石头 */ @Entity public class Test { @Id @GeneratedValue private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }

@Repository
public interface TestDao extends JpaRepository<Test,Integer> {
}
@RestController public class TestController { @Resource TestDao dao; @GetMapping("/add") public Test add() { Test test = new Test(); test.setName("编程小石头"); Test save = dao.save(test); return save; } @GetMapping("/list") public List<Test> list() { List<Test> all = dao.findAll(); return all; } }
执行下面操作之前,别忘记先启动项目



今天我就要正式学习Java后台页面编写了,通常我们应该用html直接编写,也可以用前后端分离的方式,比如vue来编写后台网页,但是呢,作为Java后端开发来所,有一个很方便的模板,可以快速实现Java后台页面的开发,这就是我们今天要讲的freemarker.
这里默认你已经新建了一个spingboot项目,我们这里直接引入类库.

<!--freemarker-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
在resources里新建templates文件,默认freemarker页面都是放在templates里.

如果又同学学过freemarker,肯定会问,这里为什么是ftlh结尾,而不是ftl结尾呢,因为spingboot2.2以后默认使用ftlh来表示freemarker文件了,所以我们以后都用.ftlh结尾

这样我们运行项目,然后访问效果如下

到这里我们就成功的在springboot里引入freemarker里,后面我们就可以愉快的编写后台网页了.
<#list nameList as names>
${names}
</#list>
<#if (age>=18)>
成年人
</#if>
<#if (age>=18)>
成年人
<#else>
未成年人
</#if>
<#if (age>=18)>
年龄大于等于18
<#elseif (age>12)>
年龄大于12
<#else>
年龄小于12
</#if>
<#include "left.ftlh">
我们做后台开发时,难免会要开发管理后台。如下面这样的管理后台,我们完全可以不用h5同学,自己快速开发管理web后台的。
所以接下来我会用几节来教大家如何快速实现管理后台。
本节知识点

所以本节就来教大家如何快速实现管理后台表格数据的展示与操作。
这节课是建立在你已经会创建springboot项目的基础上,如果你还不知道怎么创建一个springboot项目请异步到这里:https://edu.csdn.net/course/detail/23443
好了,下面就来讲解,如何使用springboot+freemarker+bootstrap快速实现管理后台表格数据的展示。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
我们freemarker使用的是 .ftl结尾的模版文件

list.ftl完整代码如下
<html> <head> <meta charset="utf-8"> <title>freemarker+bootstrap学习</title> <#--本地引入--> <#--<link href="bootstrap/css/bootstrap.min.css" rel="stylesheet">--> <!-- 新 Bootstrap4 核心 CSS 文件 --> <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/css/bootstrap .min.css"> </head> <body> <div class="container-fluid"> <div class="table-responsive"> <table id="dataGrid" class="table table-striped table-bordered"> <thead> <tr> <th width="50"><input type="checkbox" class="checkall"></th> <th>标题</th> <th>姓名</th> <th>微信</th> <th width="50">操作</th> </tr> </thead> <tbody> <#list demoList as row> <tr> <td> <input type="checkbox" name="id" value="${row.id}"> </td> <td>${row.title}</td> <td>${row.name}</td> <td>${row.wechat}</td> <td> <button class="btn btn-xs btn-primary" onclick="deleteRow(${row.id})">删除 </button> </td> </tr> </#list> </tbody> </table> </div> </div> <script type="text/javascript"> function deleteRow(rowId) { console.log("点击了删除", rowId); } </script> </body> </html>
这里需要讲下,我们引入bootstrap有两种方式,大家学习阶段推荐用第一种方式。
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/css/bootstrap
.min.css">
<link href="bootstrap/css/bootstrap.min.css" rel="stylesheet">

这里我们定义一个DemoController如下
package com.qcl.demo.controller; import com.qcl.demo.bean.Demo; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.ModelAndView; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * Created by qcl on 2019-04-29 * weixin:2501902696 * desc:freemarker学习 */ @RestController public class DemoController { @GetMapping("/demoList") public ModelAndView list(Map<String, Object> map) { List<Demo> demoList = new ArrayList<>(4); demoList.add(new Demo(1, "标题1", "编程小石头1", "2501902696")); demoList.add(new Demo(2, "标题2", "编程小石头2", "2501902696")); demoList.add(new Demo(3, "标题3", "编程小石头3", "2501902696")); demoList.add(new Demo(4, "标题4", "编程小石头4", "2501902696")); map.put("demoList", demoList); return new ModelAndView("demo/list", map); } }
这里我们先模拟4条数据,然后把数据传到我们的list.ftl页面,正常数据都应该是从数据库里取的,后面会做讲解。
这就是用freemarker模版的好处。可以直接在页面里使用我们的java数据。
<table id="dataGrid" class="table table-striped table-bordered"> <thead> <tr> <th width="50"><input type="checkbox" class="checkall"></th> <th>标题</th> <th>姓名</th> <th>微信</th> <th width="50">操作</th> </tr> </thead> <tbody> <#list demoList as row> <tr> <td> <input type="checkbox" name="id" value="${row.id}"> </td> <td>${row.title}</td> <td>${row.name}</td> <td>${row.wechat}</td> <td> <button class="btn btn-xs btn-primary" onclick="deleteRow(${row.id})">删除 </button> </td> </tr> </#list> </tbody> </table>
这样我们运行项目,然后进入web后台,就可以看到了,我们这里点击删除时,是可以拿到每行的id的,这样我们就可以根据id删除具体数据,然后再重新刷新下页面就可以了。后面会给大家讲解通过web后台操作数据库的。

到这里我们就实现了管理后台表格数据的展示与操作了,是不是很简单啊。
我会把10小时实战入门java系列课程录制成视频,如果你看文章不能很好的理解,可以去看下视频:https://edu.csdn.net/course/detail/23443
编程小石头,码农一枚,非著名全栈开发人员。分享自己的一些经验,学习心得,希望后来人少走弯路,少填坑。
本节是建立在上节的基础上,上一节给大家讲了管理后台表格如何展示数据,但是当我们的数据比较多的时候我们就需要做分页处理了。这一节给大家讲解如何实现表格数据的分页显示。
准备工作
还是老规矩,看效果图

可以看出我们实现了如下功能
下面来看实现步骤
简单说说代码
<html> <head> <meta charset="utf-8"> <title>freemarker+bootstrap学习</title> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <!-- 新 Bootstrap4 核心 CSS 文件 --> <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/css/bootstrap.min.css"> </head> <body> <div class="container-fluid"> <div class="row clearfix"> <div class="col-md-12 column"> <table class="table table-bordered table-condensed table-striped"> <thead> <tr> <th>id</th> <th>姓名</th> <th>微信</th> <th colspan="2">操作</th> </tr> </thead> <tbody> <#list productInfoPage as productInfo> <tr> <td>${productInfo.id}</td> <td>${productInfo.name}</td> <td>${productInfo.wechat}</td> <td> <#if productInfo.id%2 == 0> <a href="#">下架</a> <#else> <a href="">上架</a> </#if> </td> </tr> </#list> </tbody> </table> </div> <#--分页--> <div class="col-md-12 column"> <ul class="pagination "> <#if currentPage lte 1> <li class="disabled "><a class="page-link" href="#">上一页</a></li> <#else> <li> <a class="page-link" href="/pageList?page=${currentPage - 1}&size=${size}">上一页</a> </li> </#if> <#list 1..totalPage as index> <#if currentPage == index> <li class="page-item active "><a class="page-link" href="#">${index}</a> </li> <#else> <li> <a class="page-link" href="/pageList?page=${index}&size=${size}"> ${index}</a> </li> </#if> </#list> <#if currentPage gte totalPage> <li class="disabled "><a class="page-link" href="#">下一页</a></li> <#else> <li> <a class="page-link" href="/pageList?page=${currentPage + 1}&size=${size}">下一页</a> </li> </#if> </ul> </div> </div> </div> </body> </html>
同样这里的数据我们先用模拟数据,后面会用数据库里的数据。
看下面代码可以看出来,我们模拟了6条数据,然后每页显示2条数据。
package com.qcl.demo.controller; import com.qcl.demo.bean.Demo; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.ModelAndView; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * Created by qcl on 2019-04-29 * weixin:2501902696 * desc:freemarker学习 */ @RestController public class DemoController { /* * 分页效果的实现 * */ @GetMapping("/pageList") public ModelAndView list(@RequestParam(value = "page", defaultValue = "1") Integer page, @RequestParam(value = "size", defaultValue = "2") Integer size, Map<String, Object> map) { List<Demo> demoList = new ArrayList<>(4); demoList.add(new Demo(1, "标题1", "编程小石头1", "2501902696")); demoList.add(new Demo(2, "标题2", "编程小石头2", "2501902696")); demoList.add(new Demo(3, "标题3", "编程小石头3", "2501902696")); demoList.add(new Demo(4, "标题4", "编程小石头4", "2501902696")); demoList.add(new Demo(5, "标题5", "编程小石头4", "2501902696")); demoList.add(new Demo(6, "标题6", "编程小石头4", "2501902696")); demoList.add(new Demo(7, "标题7", "编程小石头7", "2501902696")); int start = (page - 1) * 2; int end = start + size; List<Demo> subList = demoList.subList(start, end); int totalPage = (int) Math.ceil(demoList.size() / size); map.put("productInfoPage", subList); map.put("totalPage", totalPage); map.put("currentPage", page); map.put("size", size); return new ModelAndView("demo/list", map); } }
注意每一页地址栏的url



可以看出,我们第一次访问时,默认显示第一页,url里没有page和size字段。
访问第2页和第3页时,url里就有了page和size。page是显示那一页,size是每页显示多少条数据。
到这里我们就实现的管理后台的分页效果。
我会把10小时实战入门java系列课程录制成视频,如果你看文章不能很好的理解,可以去看下视频:https://edu.csdn.net/course/detail/23443
最近忙着创业,好久没有写文章了。今天就抽空给点餐系统加一个排号等位功能,想加这个功能很久了,一直没有瞅到时间写。今天就把这个功能实现了,顺便写个文章出来。





只顾实现功能了,ui没怎么美化,后面有时间再做下ui美化吧。下面就来给大家讲解下。
讲之前,先给大家看一个简单的流程图。

流程其实很简单,就是客户端(小程序端)操作,点击排位。

然后Java后台,入库,并生成排位的号码,用户端可以看到自己当前排在第几号。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cZLe34d2-1616120369987)(https://upload-images.jianshu.io/upload_images/6273713-f5a1d2cbcbb46bdc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
然后管理员在后台操作,排到位的客户可以入座。

等到号的用户,就会出现可入座的标识。后面会增加排到号的用户接受微信订阅消息通知的功能。敬请期待。

流程基本上讲完了,接下来就给大家讲解代码部分。这里只把重要的代码贴出来给到大家,顺便给大家讲下思路。后面也会录制完整的讲解视频:《点餐系统,java后台+点餐小程序》

我们先来讲讲排号相关的代码,从上图可以看出,我们排号的wxml文件里可以显示两种状态,未排号和已排号。上图展示的是未排号的状态,用户点击完取号以后,就可以展示已排号状态了。

其实排号的小程序端代码很简单。下面再把paihao.js的代码贴出来给到大家。
let app = getApp() Page({ data: { num: 1111, //当前排号 type: 1, currentSmall: -1, currentBig: -1 }, onShow: function () { this.getNum() }, //取号 quhao(event) { let type = event.currentTarget.dataset.type let that = this; //如果openid不存在,就重新请求接口获取openid var openid = app.globalData.openid; if (openid === null || openid === undefined) { app.getOpenid(); wx.showToast({ //这里提示失败原因 title: 'openid为空!', duration: 1500 }) return; } wx.request({ url: app.globalData.baseUrl + '/paihao/quhao', method: "POST", header: { "Content-Type": "application/x-www-form-urlencoded" }, data: { openid: openid, type: type, }, success(res) { if (res && res.data && res.data.data) { wx.showToast({ title: '排号成功', }) console.log(res) that.setData({ type: res.data.data.type, num: res.data.data.num }) } }, fail(res) { console.log("排号失败", res) } }) }, //查询我的排号 getNum() { let that = this; //如果openid不存在,就重新请求接口获取openid var openid = app.globalData.openid; if (openid === null || openid === undefined) { app.getOpenid(); wx.showToast({ //这里提示失败原因 title: 'openid为空!', duration: 1500 }) return; } wx.request({ url: app.globalData.baseUrl + '/paihao/getNum', data: { openid: openid }, success: function (res) { if (res && res.data && res.data.data) { let dataList = res.data.data; console.log("请求到的排号情况", dataList) that.setData({ type: dataList.type, num: dataList.num, smallOkNum: dataList.smallOkNum, bigOkNum: dataList.bigOkNum, }) } else { that.setData({ num: -1 }) } }, fail(res) { console.log("查询排号失败", res) } }) } })
这里需要注意一点,就是一定要先获取用户的openid,因为openid是用户的唯一标识。每人每天只能排一次号。买我点餐系统这门课的同学,都知道如何获取openid,我课程配套的视频也有讲。
如果有仔细看上面第一步小程序端代码,应该可以看到wx.request网络请求部分,其实这个网络请求就是请求的我们Java后台。下面先把Java后台源码贴出来。
/** * 小程序端排号相关接口 */ @RestController @RequestMapping("/paihao") @Slf4j public class WxPaihaoController { @Autowired PaihaoRepository repository; /* * 取号 * */ @PostMapping("/quhao") public ResultVO quhao(@RequestParam(value = "type") Integer type, @RequestParam("openid") String openid) { int size = repository.findByDayAndType(TimeUtils.getYMD(), type).size(); log.info("当前排号数={}", size); Paihao paihao = new Paihao(); paihao.setDay(TimeUtils.getYMD()); paihao.setNum(size + 1); paihao.setType(type); paihao.setOpenid(openid); paihao.setRuzuo(false); return ApiUtil.success(repository.save(paihao)); } /* * 查询当前排号 * */ @GetMapping("/getNum") public ResultVO getNum(@RequestParam("openid") String openid) { //获取当前小桌入座情况 List<Paihao> listSmall = repository.findByDayAndRuzuoAndTypeOrderByNum(TimeUtils.getYMD(), true, 0); //获取当前大桌入座情况 List<Paihao> listBig = repository.findByDayAndRuzuoAndTypeOrderByNum(TimeUtils.getYMD(), true, 1); //查询当前客户的排号情况 List<Paihao> listKeHu = repository.findByOpenidAndDay(openid,TimeUtils.getYMD()); //组装数据返回给小程序端 PaihaoVO paihao = new PaihaoVO(); if (listSmall != null && listSmall.size() > 0) { paihao.setSmallOkNum(listSmall.get(listSmall.size() - 1).getNum()); } else { paihao.setSmallOkNum(0); } if (listBig != null && listBig.size() > 0) { paihao.setBigOkNum(listBig.get(listBig.size() - 1).getNum()); } else { paihao.setBigOkNum(0); } if (listKeHu != null && listKeHu.size() > 0) { paihao.setNum(listKeHu.get(listKeHu.size() - 1).getNum()); paihao.setType(listKeHu.get(listKeHu.size() - 1).getType()); } else { paihao.setNum(0); paihao.setType(0); } return ApiUtil.success(paihao); } }
可以看到我们一共给小程序前端提供两个接口,一个是取号,一个是查询当前排号状态。
/* * 取号 * */ @PostMapping("/quhao") public ResultVO quhao(@RequestParam(value = "type") Integer type, @RequestParam("openid") String openid) { int size = repository.findByDayAndType(TimeUtils.getYMD(), type).size(); log.info("当前排号数={}", size); Paihao paihao = new Paihao(); paihao.setDay(TimeUtils.getYMD()); paihao.setNum(size + 1); paihao.setType(type); paihao.setOpenid(openid); paihao.setRuzuo(false); return ApiUtil.success(repository.save(paihao)); }
取号其实很简单,就是先查询当前已经排到第几号,然后新排号的客户号码再前面排号的基础上加一。然后数据入库就可以了。
@GetMapping("/getNum") public ResultVO getNum(@RequestParam("openid") String openid) { //获取当前小桌入座情况 List<Paihao> listSmall = repository.findByDayAndRuzuoAndTypeOrderByNum(TimeUtils.getYMD(), true, 0); //获取当前大桌入座情况 List<Paihao> listBig = repository.findByDayAndRuzuoAndTypeOrderByNum(TimeUtils.getYMD(), true, 1); //查询当前客户的排号情况 List<Paihao> listKeHu = repository.findByOpenidAndDay(openid,TimeUtils.getYMD()); //组装数据返回给小程序端 PaihaoVO paihao = new PaihaoVO(); if (listSmall != null && listSmall.size() > 0) { paihao.setSmallOkNum(listSmall.get(listSmall.size() - 1).getNum()); } else { paihao.setSmallOkNum(0); } if (listBig != null && listBig.size() > 0) { paihao.setBigOkNum(listBig.get(listBig.size() - 1).getNum()); } else { paihao.setBigOkNum(0); } if (listKeHu != null && listKeHu.size() > 0) { paihao.setNum(listKeHu.get(listKeHu.size() - 1).getNum()); paihao.setType(listKeHu.get(listKeHu.size() - 1).getType()); } else { paihao.setNum(0); paihao.setType(0); } return ApiUtil.success(paihao); }
这一步稍微复杂一点。这一步的主要就是给小程序端返回所需的数据,比如当前大桌排到了第几号,小桌排到了第几号,当前用户的排号,当前用户是否被叫到。代码里注释都很清楚了,感兴趣的同学仔细看下上面代码即可。
管理员就是用来操作谁可以入座的。

这个页面主要是用freemarker写的前端页面。代码如下图。

对应的后台接口。
/** * 排号相关 */ @Controller @RequestMapping("/adminPaihao") @Slf4j public class AdminPaihaoController { @Autowired PaihaoRepository repository; /* * 页面相关 * */ @GetMapping("/list") public String list(ModelMap map) { //获取小桌未入座的用户 List<Paihao> listSmall = repository.findByDayAndRuzuoAndTypeOrderByNum(TimeUtils.getYMD(), false, 0); //获取大桌未入座的用户 List<Paihao> listBig = repository.findByDayAndRuzuoAndTypeOrderByNum(TimeUtils.getYMD(), false, 1); map.put("listSmall", listSmall); map.put("listBig", listBig); return "paihao/list"; } @GetMapping("/ruzhuo") public String ruzhuo(@RequestParam("id") int id, ModelMap map) { try { Paihao paihao = repository.findById(id).orElse(null); if (paihao == null) { throw new DianCanException(ResultEnum.PAIHAO_NOT_EXIST); } if (paihao.getRuzuo()) { throw new DianCanException(ResultEnum.PAIHAO_STATUS_ERROR); } paihao.setRuzuo(true); repository.save(paihao); } catch (DianCanException e) { map.put("msg", e.getMessage()); map.put("url", "/diancan/adminPaihao/list"); return "zujian/error"; } map.put("url", "/diancan/adminPaihao/list"); return "zujian/success"; } }
管理页对应的代码很简单,就是一个显示当前排号数据列表,另外一个就是操作到号用户入座,后面还会添加到号后微信订阅消息通知相应用户的功能。
到这里完整的点餐排号等位功能就差不多实现了,相应的讲解视频和源码我会放到网盘,感兴趣的同学可以联系石头哥vx: 2501902696

其实想给点餐系统加推送很久了,之前也有单门写过Java版的微信消息推送和云开发版的微信消息推送。之所以一直没有加,也是考虑到大家的学习接受度,因为做订阅消息推送是一个综合性的开发工作。
需要你既要会小程序端开发,又要会Java端开发,还要会web网页端开发。还要懂得小程序公众号后台操作,还要自己去申请消息模板,自己配置appid,模板id,模板内容。就是因为怕大家一上来被这么多问题吓到,所以一直没有搞点餐系统的消息推送。
我们今天就以排号入座为例,当排号等位的用户被叫号时,会给用户发送一条微信订阅消息。就是在管理点击下图的可入座时,发送订阅消息给用户。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QHdft1kj-1616120369993)(https://upload-images.jianshu.io/upload_images/6273713-8bd91ecb9666ba7a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

至于如何创建模板消息,如果获取模板id我这节就不再讲解,不知道的同学可以查看我上篇文章《借助云开发实现小程序订阅消息和模板消息的推送功能》里面有详细的讲解。
今天呢就来重点讲下如何在Java后台编写小程序订阅消息推送的知识。
其实我很早之前有写过一篇Java实现模板消息推送的,但是小程序后面用订阅消息替换了模板推送,所以我也会根据最新的知识点不定期的更新文章的。
发送订阅消息三步走
1,拿到用户的openid
2,获取access_token
3,调用小程序消息推送的接口
关于用户openid的获取,我写过很多篇文章了,也有录过视频出来的,还不知道怎么获取的同学,可以取翻看下我之前的文章,或者看下我录制的零基础入门小程序的视频:《5小时零基础入门小程序云开发》 所以这一步不是今天的重点。
我们点餐系统里前面的排号功能讲解里也已经成功的存入了我们的openid到数据库了。

官方文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html
首先来看下access_token是什么,下图是官方给出的

其实通俗的讲,access_token就是小程序官方给我们提供的一个凭证,你要调用小程序官方的接口,就必须先拿到access_token。所以下面先讲下如果获取access_token


我们这里用的是springboot,这里涉及到一个请求小程序官方接口,所以我们这里用了springboot自带的RestTemplate来做网络请求。具体代码如下。

可以看出代码很简单,就是用RestTemplate来实现一个get请求,这样我们就可以轻松的获取到了access_token。获取到的access_token返回数据如下图。

请求上面代码,返回的数据如下。

关于这个access_token,是存在有效期的,来看下官方给出的提示

所以我要在获取到access_token的时候,把access_token存到数据库,或者存到本地缓存,并且还要记录当前时间,后面再用的时候先判断这个access_token有没有超过2个小时,如果超过2个小时的话,就要重新获取了。由于这里不是本节的重点,我这里只给大家说下原理。
我们通过上面第二步,成功的获取到了access_token。下面就要调用小程序官方为我们提供的发送消息的接口了。先看下官方文档。

上面的参数都是我们发送消息时需要的。这些参数的定义和设置我在前面的文章里也都讲过了,不知道的同学可以去看下我前面写的这篇文章 《借助云开发实现小程序订阅消息和模板消息的推送功能》
这里需要注意的一点是,我们要给用户发送消息,就必须引导用户授权,就是下面这个图

因为用户不点击允许,你是没有办法给用户推送消息的。每一次授权只允许发送一条消息,所以如果你想尽量多的发送消息,就得尽量多的引导用户授权。
推送的Java代码如下

可以看到,我们这里需要定义用户的openid,模板id,跳转路径,模板消息内容。。。
这些都定义好以后,我们就可以提供一个服务给到Java的其他代码调用,或者提供一个接口供外界传入openid,然后给对应的用户推送消息了。
我们在浏览器里调用上面接口,可以看到下图所示,这样就代表我们消息推送成功了。

这里要注意,我们要把openid和一些参数动态的获取到,然后封装到模板里。
我们既然要获取一些用户的信息,比如openid,桌号,排队开始时间等,我们一个个传进来就有些太麻烦了,所以最简单的方式,就是把排号表里对应的id拿过来。所以我们只需要知道用户当前排号的id,就可以拿到所有需要的信息。
改造后的发送订阅消息的方法如下:

这个时候,如果我们直接调用发送,会报下面这个错误。

仔细看下错误,就可以知道,我们的模板id不正确,所以,我们要配置我们自己的模板id。我们可以去小程序后台获取到我们自己的模板id。

填入我们的模板id后,还会报下面的错误。

上面的这个错误,就是因为我们在小程序端没有做授权。所以授权这一步也必不可少的。而这个授权应该在用户点击取号的时候,就应该弹出来询问用户授权的。
授权代码的官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/subscribe-message/wx.requestSubscribeMessage.html

我们在用户取号时,不仅要请求取号接口,还要获取用户授权。

这个模板id为了方便管理,我写在了app.js里了,方便全局使用。

其实小程序端只需要做这些就可以了,无非在取号时,我们要把模板id传给后台,存到数据库,方便后台Java后台调用消息发送时使用。

//获取AccessToken
public String getAccessToken() {
RestTemplate restTemplate = new RestTemplate();
Map<String, String> params = new HashMap<>();
params.put("APPID", GlobalConst.APPID); //这里替换成你的appid
params.put("APPSECRET", GlobalConst.APPSECRET); //这里替换成你的appsecret
ResponseEntity<String> responseEntity = restTemplate.getForEntity(
"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}", String.class, params);
String body = responseEntity.getBody();
AccessToken object = new Gson().fromJson(body, AccessToken.class);
log.info("返回的AccessToken={}", object);
String Access_Token = object.getAccess_token();
return Access_Token;
}
package com.qcl.push; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.qcl.bean.Paihao; import com.qcl.global.GlobalConst; import com.qcl.repository.PaihaoRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 作者:编程小石头 * 发送小程序订阅消息 */ @Service @Slf4j public class SendWxMessage { @Autowired private PaihaoRepository repository; //发送订阅消息 public String pushOneUser(Integer id) { Paihao paihao = repository.findById(id).orElse(null); RestTemplate restTemplate = new RestTemplate(); //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取) String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + getAccessToken(); //拼接推送的模版 WxMssVo wxMssVo = new WxMssVo(); wxMssVo.setTouser(paihao.getOpenid());//用户的openid(要发送给那个用户,通常这里应该动态传进来的) wxMssVo.setTemplate_id(paihao.getTemplateid());//订阅消息模板id wxMssVo.setPage("pages/index/index"); //封装模板消息内容。必须和你申请的小程序模板格式一模一样。 Map<String, TemplateData> m = new HashMap<>(2); //A小桌,B大桌 String num = (paihao.getType() == 1 ? "B" : "A") + paihao.getNum(); m.put("phrase1", new TemplateData("您可入座啦")); m.put("character_string5", new TemplateData(num)); wxMssVo.setData(m); ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, wxMssVo, String.class); log.info("推送返回的信息 ={}", responseEntity.getBody()); return responseEntity.getBody(); } //获取AccessToken public String getAccessToken() { RestTemplate restTemplate = new RestTemplate(); Map<String, String> params = new HashMap<>(); params.put("APPID", GlobalConst.APPID); //这里替换成你的appid params.put("APPSECRET", GlobalConst.APPSECRET); //这里替换成你的appsecret ResponseEntity<String> responseEntity = restTemplate.getForEntity( "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}", String.class, params); String body = responseEntity.getBody(); AccessToken object = new Gson().fromJson(body, AccessToken.class); log.info("返回的AccessToken={}", object); String Access_Token = object.getAccess_token(); return Access_Token; } }
package com.qcl.push; import java.util.Map; /* * 小程序推送所需数据 * 编程小石头 * */ public class WxMssVo { private String touser;//用户openid private String template_id;//订阅消息模版id private String page = "pages/index/index";//默认跳到小程序首页 private Map<String, TemplateData> data;//推送文字 public String getTouser() { return touser; } public void setTouser(String touser) { this.touser = touser; } public String getTemplate_id() { return template_id; } public void setTemplate_id(String template_id) { this.template_id = template_id; } public String getPage() { return page; } public void setPage(String page) { this.page = page; } public Map<String, TemplateData> getData() { return data; } public void setData(Map<String, TemplateData> data) { this.data = data; } }
package com.qcl.push; import lombok.Data; /* * 编程小石头 * 用来封装订阅消息内容 * */ @Data public class TemplateData { private String value;// public TemplateData(String value) { this.value = value; } }
package com.qcl.push;
import lombok.Data;
/**
* 作者:编程小石头
* 微信返回的Access_Token对应的bean
*/
@Data
public class AccessToken {
private String access_token;
private String expires_in;
}
前面给大家讲了一个点餐系统的开发,包括java点餐后台和微信点餐小程序。可是都是教大家如何在本地把项目跑起来。今天就来教大家如何把这个点餐系统部署到服务器,实现商用。
我们默认你上面的准备工作都做好了,下面我们就来开始学习把后台项目部署到服务器,让所有人都可以访问到你的服务器。
1,创建springboot项目,选用jdk1.8

2,填写包名,选择配置,这些保持默认即可

3,添加一些项目依赖,使用最新springboot版本

4,项目名,项目目录设置。可以保持默认

5,导入依赖,下面两种方式都可以。

6,实现一个简单的后台数据接口

如果上面这些简单的创建一个项目的步骤你不是很懂,可以看下我录制的java零基础视频:https://edu.csdn.net/course/detail/23443



上面给大家演示的是在idea开发者工具里启动的项目,我们正常部署服务器的时候,肯定不会有开发者工具的,所以我们接下来要先学会项目打包,然后在本地通过命令行的方式运行后台项目。




我们前面三步,都是在自己的本地电脑启动的后台项目,这样我们只能在自己的电脑浏览器访问到,别人是访问不到的,如果想让别人访问,就需要把我的qcl80.jar这个文件传到服务器上,并且在服务器上通过命令行启动这个java项目,这样别人才可以访问到





yum search java|grep jdk

安装jdk8
yum -y install java-1.8.0-openjdk*

耐心的等待jdk的安装,大概2分钟左右,出现下面标志,即代表安装成功


我们第五步已经在linux服务器上成功的安装了jdk,接下来就是要想办法把qcl80.jar传到服务器了。可能有同学要问了,你部署服务器,不要在linux服务器里安装tomcat吗,其实我们用springboot开发出来的jar包,已经有内置的tomcat了。所以我们不用再部署tomcat了,只需要把qcl80.jar这个文件上传到服务器,然后用java命令启动即可。
我们上传文件到Linux服务器用下面这个软件

你只需要去百度下你电脑对应系统的安装包,安装即可。具体怎么安装这里就不教大家了。
1,打开FileZilla软件, 链接服务器

2,去服务器根目录看看


3,上传文件到home文件里,如果在父亲根目录没有home文件,可以自己新建。

到这里我们就成功的上传qcl80.jar到服务器了。下面就教大家如何在服务器里启动我们的项目。
1,首先重复上面第四步登录服务器。然后在服务器里输入
cd.. #用来返回服务器根目录
ls #显示当前根目录有那些文件

cd home #进入home文件
ls #显示home文件里都有那些子文件,可以看到我们的qcl80.jar

2,启动java项目
java -jar qcl80.jar

3,项目启动成功,出现下面的标示,即代表项目启动成功

4,访问我们服务器的项目

通过上图可以看到,我们通过公网ip+8080端口,可以成功的访问到我们服务器的数据了。

我会把这些录制成视频来给大家做讲解,
我们在做域名绑定之前,需要你先自己去注册一个域名,比如我注册的域名是:“www.saibanmall.com”,我这里还是以腾讯云为例







到这里我们就成功的部署好我的后台服务器了,但是还有几个问题
我们通过上面的方法,会有一个问题,就是我们命令行窗口关闭时,会导致java项目停止,所以我们要通过脚本实现java项目在后台长期运行。

通过创建stop.sh , start.sh ,run.sh这三个脚本文件来实现后台长久运行springboot
这里我把运行的qcl80.jar ,start .sh,stop.sh ,run.sh都放在home下的jar目录下
vim stop.sh 创建文件然后把下面内容复制进去,一定要把qcl80.jar替换成你的jar
#!/bin/bash
PID=$(ps -ef | grep qcl80.jar | grep -v grep | awk '{ print $2 }')
if [ -z "$PID" ]
then
echo Application is already stopped
else
echo kill $PID
kill $PID
fi
这里我们用80端口,这样可以直接通过ip访问,不用再输端口了
vim start.sh 输入这个命令后然后把下面的内容复制进去
#!/bin/bash
nohup java -jar qcl80.jar --server.port=80 &
整合了关闭和启动的脚本:run.sh,由于会先执行关闭应用,然后再启动应用,这样不会引起端口冲突等问题,适合在持续集成系统中进行反复调用。
把下面内容复制进去,一定要注意复制时不能少东西
#!/bin/bash
echo stop application
source stop.sh
echo start application
source start.sh
./run.sh 运行run.sh脚本
如果遇到没有权限运行的问题,就在run.sh所在目录下执行
chmod u+x *.sh 这样就ok了。
执行完以后,我们可以去nohup.out文件中查看启动的log
cat nohup.out 这个命令可以查看jar启动的log

这个时候我们的项目就启动了,就可以通过下面这个网址访问项目了:http://saibanmall.com/
上面start.sh,stop.sh,run.sh如果觉得写起来麻烦的话,也可以直接获取我写好的。


有问题可以加我微信:2501902696
上一节给大家讲了服务器的部署,正常的http请求都可以实现了,但是我们做小程序开发时需要用到https,所以这一节要教大家如何让自己的后台服务器实现https请求。这节是以java部署服务器并配置https为例,别的语言可以把这篇文章作为参考。
1,申请一个ssl证书(阿里云腾讯云都可以免费申请)
2,有一台自己的服务器(阿里云腾讯云都可以)
这里以腾讯云为例,我们首先要登录自己的腾讯云服务器,然后进入ssl证书申请页。

然后选择免费的ssl证书,申请即可

给证书绑定域名,一个证书只能绑定一个顶级域名或者二级域名。

证书申请成功

点击下载证书后,会得到一个压缩包,解压后可以看到每种服务器对应的证书,选择自己的即可。

我们看下tomcat对应的文件都有什么



代码给大家贴出来
#https加密端口号 443
server.port=443
#SSL证书路径 一定要加上classpath:
server.ssl.key-store=classpath:2501902696.jks
#SSL证书密码(密码在第一步的keystorePass.txt中)
server.ssl.key-store-password=x6qm42y4auvhh
#证书类型
server.ssl.key-store-type=JKS
配置好以后,我们就可以使用maven打包了。

打包完成后,我们把打包好的jar包改下名字

改名完成后,我们通过FileZilla 把这个jar包上传到服务器。

上面上个脚本是我提前定义好的,我的上一篇文章里有讲怎么定义脚本文件,这三个脚本是为了我们的项目可以长期运行在后台用的。
点击登录,登录服务器

进入服务器对应的目录

我们通过执行 ./run.sh 来运行项目, 如果遇到没有权限运行的问题,就在run.sh所在目录下执行 chmod u+x *.sh 这样就ok了。

通过上图可以看到,我们成功执行来 run.sh脚本。
然后执行下面命令可以查看我们项目是否成功启动
tail -f nohup.out


通过上图我们可以看到,我们成功的访问到了https。到这里我们的https就配置好了,然后把我们的域名配置到小程序里就可以直接在小程序里使用https了。
上一节已经给大家讲解了我们java项目,也就是微信小程序后台项目部署到腾讯云服务器,但是呢,我们服务器肯定要装mysql数据库吧,要不然我们的数据放哪里呢,所以这一节来教大家如何在linux服务器里安装mysql数据库,并做一些数据库常见的配置。
服务器如何登录我在上一节已经讲过了,大家只需要去看我上一节课程即可。

然后通过下面命令行,检测服务器上是否安装过mysql
rpm -qa|grep mysql
如果安装过,可以通过下面命令卸载删除
rpm -e --nodeps mysql-libs
yum list installed mysql*
出现下图所示,代表没有安装过

sudo wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm
wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm

sudo rpm -ivh mysql80-community-release-el7-1.noarch.rpm

sudo yum install mysql-server


凡是让输入的地方,都输入y




有的地区服务器安装mysql比较慢,只能耐心等待了

出现下面标志,代表安装成功

mysql -V

可以看出我们安装的mysql版本是5.7.27
service mysqld start

查看是否启动
service mysqld status
出现下面箭头所示,代表已经启动mysql

grep "password" /var/log/mysqld.log

可以看到我们的初始密码是 l>KbWhk6K&+Y
mysql -uroot -p'l>KbWhk6K&+Y'
记得把l>KbWhk6K&+Y换成你自己的密码。下面代表登录成功。

alter user user() identified by '你的新密码';
(“需要带数字,大写字母,小写字母,特殊符号”)如我设置密码为 Qc123456!

设置密码永不过期
ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;

一定要记得执行下面代码刷新MySQL的系统权限相关表
flush privileges;

默认情况下,我们的mysql只可以在服务器的本地访问,远程是没法访问的,今天就来教大家如何设置mysql的远程访问。







我们上面直接用root来操作数据库,有些危险,所以我们再来教大家添加一个子管理员。

如上图所示:
1,添加用户名为xiaoshitou,密码为Xiaoshitou123!的子用户
create user 'xiaoshitou'@'%' identified with mysql_native_password by 'Xiaoshitou123!';
2,设置xiaoshitou这个用户可供远程访问
grant all privileges on *.* to 'xiaoshitou'@'%' with grant option;
3,刷新权限
flush privileges;
可以看到我们的xiaoshitou用户的host也变成了 %

4,可以看到我们的xiaoshitou子用户也可以供远程访问了(远程访问前,要记得设置下服务器的安全组,下面第五步有讲)

后面的生产环境里我们也可以给这个xiaoshitou用户设置一些权限,比如只可以增加和修改mysql数据库,不可以删除数据。。。。
出站和入站规则都要设置3306端口





到这里我们就完整的在linux服务器里安装好mysql了,并且可以通过远程访问到。
有任何问题可以加我微信询问:2501902696(只限年卡用户奥)
经过前面几节的学习,我们在腾讯云Linux服务器上成功的安装了jdk8,mysql8,并且教会了大家如何配置ssl证书实现https,今天我们就来正式的部署点餐系统到linux服务器,这里以腾讯云服务器为例。
这里以腾讯云为例,我们首先要登录自己的腾讯云服务器,然后进入ssl证书申请页。

然后选择免费的ssl证书,申请即可

给证书绑定域名,一个证书只能绑定一个顶级域名或者二级域名。

等待审核,证书申请成功后点击下载

下载解压后有下面几个,我们使用Tomcat


把证书放到我们项目里的resources目录下


把上图的配置代码贴出来给大家,一定要注意,根据代码上的注释来配置。
server:
#https加密端口号 443
port: 443
#SSL证书路径 一定要加上classpath:
ssl:
key-store: classpath:xiaoshitou.jks
#SSL证书密码(密码在第一步的keystorePass.txt中)
key-store-password: pa2pzzb8436
#证书类型
key-store-type: JKS
同时数据库的账号和密码记得改下

我们这里使用maven打包

等待项目打包

打包成功


把jar包改名为qcl443,为后面部署做准备

通常服务器有个home目里,我们把jar包和脚本文件放到home目里下

1,到服务器后台,点击登陆

2,登陆mysql

qcl.sql里的语句

3,把我们qcl.sql里的sql语句复制到控制台,执行如下

然后按ctrl+z,退出mysql命令行

然后cd …回到我们的跟目里

也可以直接 cd …/home 进入我们的home目录里

进入home目里后,可以看到我们之前传的qcl443.jar和脚本文件,然后执行 ./run.sh

通常会遇到上图所示,没有权限的问题,这个时候我们 在目录下执行 chmod u+x *.sh 这样就ok了。

然后再执行 ./run.sh 就可以执行脚本,启动项目了

然后再输入 tail -f nohup.out查看执行日志

在安全组里添加443端口的出站和入站规则




这些都处理好以后,就可以通过https链接访问点餐后台了
这样我们熟悉的登陆页面,就部署成功了,外界就可以访问我的程序了。

登陆后台后,记得添加一个轮播图片,下面小程序演示时会用到

https://www.pyjwyx.com/diancan/leimu/list这个是我一个学生的,大家可以用这个访问下点餐后台试试。你自己部署的时候,一定要记得把下面的XXX换成你自己的域名 https://XXX/diancan/leimu/list
1,在app.js里把baseUrl配置为
https://你的域名/diancan

2,先勾选不校验https

3,然后就可以看到我们访问到了后台配置的轮播图数据


如果我们的不校验https没有勾选,就会报下面的错误

本地调试不校验https没事,但是我们要上线小程序的话,必须校验小程序,所以,我接下来需要把我们的域名配置到小程序安全域名里。

添加域名到request里,如我的是 www.pyjwyx.com和pyjwyx.com


可以看到我们的域名已经添加到了request合法域名里

这样我们就可以成功的加载到数据了

然后点餐系统就可以提交发布了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。