基于javaweb+mysql的springboot旅游管理系统(java+springboot+maven+vue+elementui+javascript+mysql)
私信源码获取及调试交流
运行环境
Java≥8、MySQL≥5.7、Node.js≥10
开发工具
后端:eclipse/idea/myeclipse/sts等均可配置运行
前端:WebStorm/VSCode/HBuilderX等均可
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
基于javaweb的SpringBoot旅游管理系统(java+springboot+maven+vue+elementui+javascript+mysql)
管理员:
admin 123456
用户:
user1 123456
user2 123456
项目介绍
系统分为前台跟后台两个项目 前台: 展示旅游新闻、景区信息、美食信息、旅游线路、在线留言
后台管理员: 账号管理、地区管理、景点信息管理、地方美食管理、旅游线路管理、订单信息管理、新闻管理、系统管理 普通用户:旅游线路、订单信息
环境需要
1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 4.数据库:MySql 5.7/8.0版本均可; 5.是否Maven项目:是;
技术栈
后端框架:Springboot
前端技术:ElementUI、vue、css、JavaScript、axios
使用说明
项目运行: 1. 使用Navicat或者其它工具,在mysql中创建对应sql文件名称的数据库,并导入项目的sql文件; 2. 使用IDEA/Eclipse/MyEclipse导入项目,导入成功后请执行maven clean;maven install命令,然后运行; 3. 将项目中application.yml配置文件中的数据库配置改为自己的配置; 4. 运行项目,控制台提示运行成功后再去运行前端项目; 5. 管理员用户名密码:admin/admin 普通用户名密码:user/123456
文档介绍(项目研究背景、研究目的及意义、开发软件介绍、技术介绍、Mysql数据库、系统分析、可行性研究、经济上的可行性、技术上的可行性、操作上的可行性、开发结构分析、功能需求分析、数据流图、业务流程分析、数据字典、旅游网站总体设计、系统功能描述、系统界面设计、系统功能结构图、系统设计目标、系统实现的软硬件平台、数据库设计、数据库概念结构设计、数据库逻辑结构设计、系统详细设计):
景点列表展示:
人情景点列表展示:
旅游线路列表展示:
美食列表展示:
新闻信息列表展示:
登录管理展示页面:
后台功能管理-地方没事查询展示:
旅游线路查询页面展示:
// 获取行数据,并赋值给前台jsp页面
Admins mmm = service.find(id);
assign("mmm" , mmm);
assign("updtself" , 0);
return json(); // 将数据写给前端
}
@RequestMapping("/admins_updtself")
public String updtself()
{
_var = new LinkedHashMap(); // 重置数据
// 更新个人资料
int id = (int)request.getSession().getAttribute("id");
Admins mmm = service.find(id);
assign("mmm" , mmm);
assign("updtself" , 1);
return json(); // 将数据写给前端
}
/**
* 添加内容
* @return
*/
@RequestMapping("/adminsinsert")
public String insert()
{
_var = new LinkedHashMap(); // 重置数据
String tmp="";
Admins post = new Admins(); // 创建实体类
// 设置前台提交上来的数据到实体类中
post.setUsername(Request.get("username"));
post.setPwd(Request.get("pwd"));
post.setAddtime(Info.getDateStr());
service.insert(post); // 插入数据
int charuid = post.getId().intValue();
if(isAjax()){
return jsonResult(post);
}
return showSuccess("保存成功" , Request.get("referer").equals("") ? request.getHeader("referer") : Request.get("referer"));
}
if(isAjax()){
return jsonResult(post);
}
return showSuccess("保存成功" , Request.get("referer").equals("") ? request.getHeader("referer") : Request.get("referer"));
}
/**
* 更新内容
* @return
*/
@RequestMapping("/adminsupdate")
public String update()
{
_var = new LinkedHashMap(); // 重置数据
// 创建实体类
Admins post = new Admins();
// 将前台表单数据填充到实体类
if(!Request.get("username").equals(""))
post.setUsername(Request.get("username"));
if(!Request.get("pwd").equals(""))
post.setPwd(Request.get("pwd"));
if(!Request.get("addtime").equals(""))
post.setAddtime(Request.get("addtime"));
post.setId(Request.getInt("id"));
service.update(post); // 更新数据
int charuid = post.getId().intValue();
if(isAjax()){
return jsonResult(post);
}
if(Request.getInt("updtself") == 1){
return showSuccess("保存成功" , "admins_updtself.do");
}
return showSuccess("保存成功" , Request.get("referer")); // 弹出保存成功,并跳转到前台提交的 referer 页面
}
/**
* 删除
*/
@RequestMapping("/admins_delete")
public String delete()
{
/**
* 控制器基类
*/
abstract public class BaseController {
@Autowired
protected HttpServletRequest request; // 注入
@Autowired
protected HttpServletResponse response; // 注入
@Autowired
protected HttpSession session; // 注入
protected ModelAndView mView;
protected Map<Object,Object> _var;
/**
* 控制器
*/
public BaseController()
{
//request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
mView = new ModelAndView();
_var = new LinkedHashMap();
}
/**
* 往模板中写入数据
* @param name
* @param value
*/
protected void assign(String name , Object value)
{
request.setAttribute(name , value);
_var.put(name , value);
}
/**
* 弹出框
* @param message
* @param code
* @param jumpUrl
* @param jumpTime
* @return
*/
protected String showMessage( String message , int code , Object data , String jumpUrl , int jumpTime)
{
//request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
mView = new ModelAndView();
_var = new LinkedHashMap();
}
/**
* 往模板中写入数据
* @param name
* @param value
*/
protected void assign(String name , Object value)
{
request.setAttribute(name , value);
_var.put(name , value);
}
/**
* 弹出框
* @param message
* @param code
* @param jumpUrl
* @param jumpTime
* @return
*/
protected String showMessage( String message , int code , Object data , String jumpUrl , int jumpTime)
{
if(isAjax())
{
JsonResult jsonResult = new JsonResult(code , message , data);
return renderString(response , JSON.toJSONString(jsonResult));
}
assign("message" , message == null ? data : message);
assign("code" , code);
assign("jumpUrl" , jumpUrl);
assign("jumpTime" , jumpTime);
return "message";
}
/**
* 将写入json写到前端
* @return
*/
public String json()
{
int page = request.getParameter("page") == null ? 1 : Integer.valueOf(request.getParameter("page")); // 获取前台提交的URL参数 page 如果没有则设置为1
page = Math.max(1 , page); // 取两个数的最大值,防止page 小于1
List<Lvyouxianlu> list = service.selectPageExample(example , page , pagesize); // 获取当前页的行数
// 将列表写给界面使用
assign("totalCount" , request.getAttribute("totalCount"));
assign("list" , list);
assign("orderby" , order); // 把当前排序结果写进前台
assign("sort" , sort); // 把当前排序结果写进前台
return json(); // 将数据写给前端
}
public String getWhere()
{
_var = new LinkedHashMap(); // 重置数据
String where = " ";
// 以下也是一样的操作,判断是否符合条件,符合则写入sql 语句
if(!Request.get("xianlubianhao").equals("")) {
where += " AND xianlubianhao LIKE '%"+Request.get("xianlubianhao")+"%' ";
}
if(!Request.get("xianlumingcheng").equals("")) {
where += " AND xianlumingcheng LIKE '%"+Request.get("xianlumingcheng")+"%' ";
}
if(!Request.get("chufadi").equals("")) {
where += " AND chufadi LIKE '%"+Request.get("chufadi")+"%' ";
}
if(!Request.get("tujingdi").equals("")) {
where += " AND tujingdi LIKE '%"+Request.get("tujingdi")+"%' ";
}
if(!Request.get("zhongdian").equals("")) {
where += " AND zhongdian LIKE '%"+Request.get("zhongdian")+"%' ";
}
return where;
}
/**
* 前台列表页
*
*/
@RequestMapping("/lvyouxianlulist")
public String index()
{
String order = Request.get("order" , "id");
String sort = Request.get("sort" , "desc");
Example example = new Example(Lvyouxianlu.class);
Example.Criteria criteria = example.createCriteria();
String where = " 1=1 ";
where += getWhere();
criteria.andCondition(where);
if(sort.equals("desc")){
public String getOriginalName() {
return this.originalName;
}
}
/**
* 管理员 */
@Controller
public class AdminsController extends BaseController
{
@Autowired
private AdminsMapper dao;
@Autowired
private AdminsService service;
/**
* 后台列表页
*
*/
@RequestMapping("/admins_list")
public String list()
{
// 检测是否有登录,没登录则跳转到登录页面
if(!checkLogin()){
return showError("尚未登录" , "./login.do");
}
String order = Request.get("order" , "id"); // 获取前台提交的URL参数 order 如果没有则设置为id
String sort = Request.get("sort" , "desc"); // 获取前台提交的URL参数 sort 如果没有则设置为desc
return jsonReturn(msg , 1 , null);
}
public Object getRequestAttributeMap()
{
//Map<Object,Object> map = new LinkedHashMap();
Enumeration<String> names = request.getAttributeNames();
while (names.hasMoreElements())
{
String key = names.nextElement();
if(!_var.containsKey(key)){
// 没有,则写入
_var.put(key , request.getAttribute(key));
}
}
return _var;
}
public String getJson()
{
Map<Object,Object> map = new LinkedHashMap();
Enumeration<String> names = request.getAttributeNames();
while (names.hasMoreElements())
{
String key = names.nextElement();
Object value = request.getAttribute(key);
map.put(key , value);
}
return renderString(response , JSON.toJSONString(map));
}
/**
* 将字符串渲染到客户端
*
* @param response 渲染对象
* @param string 待渲染的字符串
* @return null
*/
*/
@RequestMapping("/lunbotuupdate")
public String update()
{
_var = new LinkedHashMap(); // 重置数据
// 创建实体类
Lunbotu post = new Lunbotu();
// 将前台表单数据填充到实体类
if(!Request.get("title").equals(""))
post.setTitle(Request.get("title"));
if(!Request.get("image").equals(""))
post.setImage(Request.get("image"));
if(!Request.get("url").equals(""))
post.setUrl(Request.get("url"));
if(!Request.get("addtime").equals(""))
post.setAddtime(Request.get("addtime"));
post.setId(Request.getInt("id"));
service.update(post); // 更新数据
int charuid = post.getId().intValue();
if(isAjax()){
return jsonResult(post);
}
return showSuccess("保存成功" , Request.get("referer")); // 弹出保存成功,并跳转到前台提交的 referer 页面
}
/**
* 删除
*/
@RequestMapping("/lunbotu_delete")
public String delete()
{
_var = new LinkedHashMap(); // 重置数据
if(!checkLogin()){
return showError("尚未登录");
}
int id = Request.getInt("id"); // 根据id 删除某行数据
HashMap map = Query.make("lunbotu").find(id);
service.delete(id);// 根据id 删除某行数据
return showSuccess("删除成功",request.getHeader("referer"));//弹出删除成功,并跳回上一页
}
}
if(sort.equals("desc")){
example.orderBy(order).desc();
}else{
example.orderBy(order).asc();
}
int page = request.getParameter("page") == null ? 1 : Integer.valueOf(request.getParameter("page"));
page = Math.max(1 , page);
List<Difangmeishi> list = service.selectPageExample(example , page , 12);
assign("mapmeishifenlei5" , new CommDAO().select("SELECT id,fenleimingcheng FROM meishifenlei")); assign("totalCount" , request.getAttribute("totalCount"));
assign("list" , list);
assign("where" , where);
assign("orderby" , order);
assign("sort" , sort);
return json();
}
@RequestMapping("/difangmeishi_add")
public String add()
{
_var = new LinkedHashMap(); // 重置数据
assign("jingdianxinxiList" , new CommDAO().select("SELECT * FROM jingdianxinxi ORDER BY id desc"));
assign("meishifenleiList" , new CommDAO().select("SELECT * FROM meishifenlei ORDER BY id desc"));
return json(); // 将数据写给前端
}
@RequestMapping("/difangmeishi_updt")
public String updt()
{
_var = new LinkedHashMap(); // 重置数据
int id = Request.getInt("id");
// 获取行数据,并赋值给前台jsp页面
Difangmeishi mmm = service.find(id);
assign("mmm" , mmm);
assign("updtself" , 0);
assign("jingdianxinxiList" , new CommDAO().select("SELECT * FROM jingdianxinxi ORDER BY id desc"));
assign("meishifenleiList" , new CommDAO().select("SELECT * FROM meishifenlei ORDER BY id desc"));
return json(); // 将数据写给前端
}
/**
* 添加内容
* @return
protected String authLoginUser(boolean isAdmin,String username , String pwd,String cx)
{
if(username == null || "".equals(username) ){
return showError( "账号不允许为空" );
}
if(pwd == null || "".equals(pwd) ){
return showError( "密码不允许为空" );
}
if(cx == null){
return showError( "请选中登录类型" );
}
String random;
// 获取 token方式的验证码值
if(isAjax() && request.getParameter("captchToken") != null ){
random = DESUtil.decrypt("CaptchControllerPassword" , request.getParameter("captchToken"));
}else{
random = (String) request.getSession().getAttribute("random");
}
String pagerandom = request.getParameter("pagerandom") == null ? "" : request.getParameter("pagerandom");
if (request.getParameter("a") != null && !pagerandom.equals(random)) {
return showError("验证码不正确" , 20);
}
if (cx.equals("管理员")) {
Admins user = adminsService.login(username , pwd);
if(user == null){
return showError("用户名或密码错误");
}
session.setAttribute("id" , user.getId());
session.setAttribute("username" , user.getUsername());
session.setAttribute("cx" , cx);
session.setAttribute("login" , cx);
session.setAttribute("username", user.getUsername());
session.setAttribute("pwd", user.getPwd());
session.setAttribute("addtime", user.getAddtime());
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(user));
jsonObject.put("cx" , session.getAttribute("cx"));
jsonObject.put("username" , session.getAttribute("username"));
jsonObject.put("login" , session.getAttribute("login"));
assign("session" , jsonObject);
}
if (cx.equals("用户")) {
Yonghu user = yonghuService.login(username , pwd);
if(user == null){
return showError("用户名或密码错误");
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
public void setAllowFiles(String[] allowFiles) {
this.allowFiles = allowFiles;
}
public void setMaxSize(int size) {
this.maxSize = size;
}
public long getSize() {
return this.size;
}
public String getUrl() {
return this.url;
}
public String getFileName() {
return this.fileName;
}
public String getState() {
return this.state;
}
public String getTitle() {
return this.title;
}
public String getType() {
return this.type;
}
public String getOriginalName() {
return this.originalName;
}
}
// 大于0 则写入条件
where += " AND lvyouxianluid='"+Request.getInt("lvyouxianluid")+"' ";
}
// 以下也是一样的操作,判断是否符合条件,符合则写入sql 语句
if(!Request.get("xianlubianhao").equals("")) {
where += " AND xianlubianhao LIKE '%"+Request.get("xianlubianhao")+"%' ";
}
if(!Request.get("xianlumingcheng").equals("")) {
where += " AND xianlumingcheng LIKE '%"+Request.get("xianlumingcheng")+"%' ";
}
if(!Request.get("tujingdi").equals("")) {
where += " AND tujingdi LIKE '%"+Request.get("tujingdi")+"%' ";
}
return where;
}
/**
* 预订人列表
*/
@RequestMapping("/yuding_list_yudingren")
public String listyudingren()
{
// 检测是否有登录,没登录则跳转到登录页面
if(!checkLogin()){
return showError("尚未登录" , "./login.do");
}
String order = Request.get("order" , "id"); // 获取前台提交的URL参数 order 如果没有则设置为id
String sort = Request.get("sort" , "desc"); // 获取前台提交的URL参数 sort 如果没有则设置为desc
int pagesize = Request.getInt("pagesize" , 12); // 获取前台一页多少行数据
Example example = new Example(Yuding.class); // 创建一个扩展搜索类
Example.Criteria criteria = example.createCriteria(); // 创建一个扩展搜索条件类
// 初始化一个条件,条件为:预订人=当前登录用户
String where = " yudingren='"+request.getSession().getAttribute("username")+"' ";
where += getWhere();
criteria.andCondition(where); // 将条件写入
if(sort.equals("desc")){ // 注释同list
example.orderBy(order).desc(); // 注释同list
}else{
try {
// 输出渲染好的内容到前端浏览器
ImageIO.write(image, "JPEG", stream);
stream.flush();
stream.close();
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 获取随机颜色
* @param fc
* @param bc
* @return
*/
protected Color getRandColor(int fc, int bc)
{
Random random = new Random();
if(fc>255) fc=255;
if(bc>255) bc=255;
int r=fc+random.nextInt(bc-fc);
int g=fc+random.nextInt(bc-fc);
int b=fc+random.nextInt(bc-fc);
return new Color(r,g,b);
}
}
/**
* 控制器基类
*/
abstract public class BaseController {
@Autowired
protected HttpServletRequest request; // 注入
@Autowired
protected HttpServletResponse response; // 注入
@Autowired
protected HttpSession session; // 注入
protected ModelAndView mView;
protected Map<Object,Object> _var;
/**
* 控制器
*/
public BaseController()
{
//request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
mView = new ModelAndView();
_var = new LinkedHashMap();
}
* 后台列表页
*
*/
@RequestMapping("/jingdianxinxi_list")
public String list()
{
// 检测是否有登录,没登录则跳转到登录页面
if(!checkLogin()){
return showError("尚未登录" , "./login.do");
}
String order = Request.get("order" , "id"); // 获取前台提交的URL参数 order 如果没有则设置为id
String sort = Request.get("sort" , "desc"); // 获取前台提交的URL参数 sort 如果没有则设置为desc
int pagesize = Request.getInt("pagesize" , 12); // 获取前台一页多少行数据
Example example = new Example(Jingdianxinxi.class); // 创建一个扩展搜索类
Example.Criteria criteria = example.createCriteria(); // 创建一个扩展搜索条件类
String where = " 1=1 "; // 创建初始条件为:1=1
where += getWhere(); // 从方法中获取url 上的参数,并写成 sql条件语句
criteria.andCondition(where); // 将条件写进上面的扩展条件类中
if(sort.equals("desc")){ // 判断前台提交的sort 参数是否等于 desc倒序 是则使用倒序,否则使用正序
example.orderBy(order).desc(); // 把sql 语句设置成倒序
}else{
example.orderBy(order).asc(); // 把 sql 设置成正序
}
int page = request.getParameter("page") == null ? 1 : Integer.valueOf(request.getParameter("page")); // 获取前台提交的URL参数 page 如果没有则设置为1
page = Math.max(1 , page); // 取两个数的最大值,防止page 小于1
List<Jingdianxinxi> list = service.selectPageExample(example , page , pagesize); // 获取当前页的行数
assign("diquList" , new CommDAO().select("SELECT * FROM diqu ORDER BY id desc"));
// 将列表写给界面使用
assign("totalCount" , request.getAttribute("totalCount"));
assign("list" , list);
assign("orderby" , order); // 把当前排序结果写进前台
assign("sort" , sort); // 把当前排序结果写进前台
return json(); // 将数据写给前端
}
public String getWhere()
{
_var = new LinkedHashMap(); // 重置数据
String where = " ";
// 以下也是一样的操作,判断是否符合条件,符合则写入sql 语句
if(!Request.get("jingdianbianhao").equals("")) {
where += " AND jingdianbianhao LIKE '%"+Request.get("jingdianbianhao")+"%' ";
}
if(!Request.get("jingdianmingcheng").equals("")) {
where += " AND jingdianmingcheng LIKE '%"+Request.get("jingdianmingcheng")+"%' ";
}
if(!Request.get("suoshudiqu").equals("")) {
where += " AND suoshudiqu ='"+Request.get("suoshudiqu")+"' ";
* @return
*/
public static String date(String format, Date time) {
if (time == null) {
time = new Date();
}
SimpleDateFormat formatter = new SimpleDateFormat(format);
return formatter.format(time);
}
}
/**
* 新闻信息 */
@Controller
public class XinwenxinxiController extends BaseController
{
@Autowired
private XinwenxinxiMapper dao;
@Autowired
private XinwenxinxiService service;
/**
* 后台列表页
*
*/
@RequestMapping("/xinwenxinxi_list")
public String list()
{
return authLoginUser(true , username,pwd,cx);
}
/**
* 修改登录密码页面
* @return
*/
@RequestMapping("/mod")
public String mod()
{
return "mod";
}
/**
* 保存修改密码
* @return
*/
@RequestMapping("/editPassword")
public String editPassword()
{
String username = request.getSession().getAttribute("username").toString();
String cx = request.getSession().getAttribute("login").toString();
String oldPassword = Request.get("oldPassword");
String newPwd = Request.get("newPwd");
String newPwd2 = Request.get("newPwd2");
if(!newPwd.equals(newPwd2)){
return showError("两次密码不一致");
}
if (cx.equals("管理员")) {
Admins user = adminsService.login(username , oldPassword);
if(user == null){
return showError("原密码不正确");
}
adminsService.updatePassword(user.getId() , newPwd);
}
if (cx.equals("用户")) {
Yonghu user = yonghuService.login(username , oldPassword);
if(user == null){
return showError("原密码不正确");
}
yonghuService.updatePassword(user.getId() , newPwd);
}
return showSuccess("修改密码成功" , "./mod.do");
}
}