毕设所有选题:
https://blog.csdn.net/2303_76227485/article/details/131104075
基于Java+Springboot+vue的智能景区旅游规划管理系统(源代码+数据库)172
一、系统介绍
本项目前后端分离(可以改为ssm版本),分为用户、管理员两种角色
1、用户:
- 注册、登录、景点信息(购票、评论、收藏、地图浏览)、美食推荐、服务预约、酒店预订和评论、旅游攻略、交流论坛、新闻、订单管理、在线聊天、个人信息、密码修改
2、管理员:
- 用户管理、省份管理、美食分类管理、景点类型管理、景点管理、门票预定管理、美食管理、酒店管理、酒店预定管理、旅游攻略管理、论坛管理、新闻管理、轮播图管理
二、所用技术
后端技术栈:
- Springboot
- mybatisPlus
- Mysql
- Maven
前端技术栈:
- Vue
- Vue-router
- axios
- elementUi
三、环境介绍
基础环境 :IDEA/eclipse, JDK1.8, Mysql5.7及以上, Maven3.6, node14, navicat
所有项目以及源代码本人均调试运行无问题 可支持远程调试运行
四、页面截图
1、用户:
2、管理员:
五、浏览地址
前台地址:http://localhost:8081
用户账号密码:用户账号1/123456
后台地址:http://localhost:8082
管理员账户密码:admin/admin
六、部署教程
-
使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并执行项目的sql文件
-
使用IDEA/Eclipse导入项目,若为maven项目请选择maven,等待依赖下载完成
-
修改application.yml里面的数据库配置,src/main/java/com/SpringbootSchemaApplication.java启动后端项目
-
vscode或idea打开src/main/resources/front/front项目
-
在编译器中打开terminal,执行npm install 依赖下载完成后执行 npm run serve,执行成功后会显示前台访问地址
-
vscode或idea打开src/main/resources/admin/admin项目
-
在编译器中打开terminal,执行npm install 依赖下载完成后执行 npm run serve,执行成功后会显示后台访问地址
七、亮点
1、使用了协同过滤推荐算法
八、核心代码
@RestController
@RequestMapping("/news")
public class NewsController {
@Autowired
private NewsService newsService;
@Autowired
private StoreupService storeupService;
/**
* 协同算法(按收藏推荐)
*/
@RequestMapping("/autoSort2")
public R autoSort2(@RequestParam Map<String, Object> params,NewsEntity news, HttpServletRequest request){
String userId = request.getSession().getAttribute("userId").toString();
String inteltypeColumn = "typename";
List<StoreupEntity> storeups = storeupService.selectList(new EntityWrapper<StoreupEntity>().eq("type", 1).eq("userid", userId).eq("tablename", "news").orderBy("addtime", false));
List<String> inteltypes = new ArrayList<String>();
Integer limit = params.get("limit")==null?10:Integer.parseInt(params.get("limit").toString());
List<NewsEntity> newsList = new ArrayList<NewsEntity>();
//去重
if(storeups!=null && storeups.size()>0) {
for(StoreupEntity s : storeups) {
newsList.addAll(newsService.selectList(new EntityWrapper<NewsEntity>().eq(inteltypeColumn, s.getInteltype())));
}
}
EntityWrapper<NewsEntity> ew = new EntityWrapper<NewsEntity>();
params.put("sort", "id");
params.put("order", "desc");
PageUtils page = newsService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, news), params), params));
List<NewsEntity> pageList = (List<NewsEntity>)page.getList();
if(newsList.size()<limit) {
int toAddNum = (limit-newsList.size())<=pageList.size()?(limit-newsList.size()):pageList.size();
for(NewsEntity o1 : pageList) {
boolean addFlag = true;
for(NewsEntity o2 : newsList) {
if(o1.getId().intValue()==o2.getId().intValue()) {
addFlag = false;
break;
}
}
if(addFlag) {
newsList.add(o1);
if(--toAddNum==0) break;
}
}
} else if(newsList.size()>limit) {
newsList = newsList.subList(0, limit);
}
page.setList(newsList);
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( NewsEntity news){
EntityWrapper<NewsEntity> ew = new EntityWrapper<NewsEntity>();
ew.allEq(MPUtil.allEQMapPre( news, "news"));
return R.ok().put("data", newsService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(NewsEntity news){
EntityWrapper< NewsEntity> ew = new EntityWrapper< NewsEntity>();
ew.allEq(MPUtil.allEQMapPre( news, "news"));
NewsView newsView = newsService.selectView(ew);
return R.ok("查询旅游资讯成功").put("data", newsView);
}
/**
* 前台详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
NewsEntity news = newsService.selectById(id);
news.setClicknum(news.getClicknum()+1);
news.setClicktime(new Date());
newsService.updateById(news);
news = newsService.selectView(new EntityWrapper<NewsEntity>().eq("id", id));
return R.ok().put("data", news);
}
/**
* 赞或踩
*/
@RequestMapping("/thumbsup/{id}")
public R vote(@PathVariable("id") String id,String type){
NewsEntity news = newsService.selectById(id);
if(type.equals("1")) {
news.setThumbsupnum(news.getThumbsupnum()+1);
} else {
news.setCrazilynum(news.getCrazilynum()+1);
}
newsService.updateById(news);
return R.ok("投票成功");
}
/**
* 后台保存
*/
@RequestMapping("/save")
public R save(@RequestBody NewsEntity news, HttpServletRequest request){
//ValidatorUtils.validateEntity(news);
newsService.insert(news);
return R.ok();
}
/**
* 前台保存
*/
@RequestMapping("/add")
public R add(@RequestBody NewsEntity news, HttpServletRequest request){
//ValidatorUtils.validateEntity(news);
newsService.insert(news);
return R.ok();
}
/**
* 获取用户密保
*/
@RequestMapping("/security")
@IgnoreAuth
public R security(@RequestParam String username){
NewsEntity news = newsService.selectOne(new EntityWrapper<NewsEntity>().eq("", username));
return R.ok().put("data", news);
}
/**
* 修改
*/
@RequestMapping("/update")
@Transactional
@IgnoreAuth
public R update(@RequestBody NewsEntity news, HttpServletRequest request){
//ValidatorUtils.validateEntity(news);
newsService.updateById(news);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
newsService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 前台智能排序
*/
@IgnoreAuth
@RequestMapping("/autoSort")
public R autoSort(@RequestParam Map<String, Object> params,NewsEntity news, HttpServletRequest request,String pre){
EntityWrapper<NewsEntity> ew = new EntityWrapper<NewsEntity>();
Map<String, Object> newMap = new HashMap<String, Object>();
Map<String, Object> param = new HashMap<String, Object>();
Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Object> entry = it.next();
String key = entry.getKey();
String newKey = entry.getKey();
if (pre.endsWith(".")) {
newMap.put(pre + newKey, entry.getValue());
} else if (StringUtils.isEmpty(pre)) {
newMap.put(newKey, entry.getValue());
} else {
newMap.put(pre + "." + newKey, entry.getValue());
}
}
params.put("sort", "clicknum");
params.put("order", "desc");
PageUtils page = newsService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, news), params), params));
return R.ok().put("data", page);
}
}