基于SpringBoot的美食点评系统

news2024/12/30 2:17:35

1.引言

随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。

美食点评管理系统,主要的模块包括首页、个人中心、用户管理、餐厅管理、美食餐厅管理、地区管理、菜系管理、餐厅点评管理、系统管理等功能。系统中管理员主要是为了安全有效地存储和管理各类信息,还可以对系统进行管理与更新维护等操作,并且对后台有相应的操作权限。

要想实现美食点评管理系统的各项功能,需要后台数据库的大力支持。管理员验证注册信息,收集的信息,并由此分析得出的关联信息等大量的数据都由数据库管理。本文中数据库服务器端采用了Mysql作为后台数据库,使Web与数据库紧密联系起来。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。

本系统的开发使获取美食点评管理系统信息能够更加方便快捷,同时也使美食点评管理系统管理信息变的更加系统化、有序化。系统界面较友好,易于操作。

2.开发技术

2.1 Spring Boot框架

Spring框架是Java平台上的一种开源应用框架,提供具有控制反转特性的容器。尽管Spring框架自身对编程模型没有限制,但其在Java应用中的频繁使用让它备受青睐,以至于后来让它作为EJB(EnterpriseJavaBeans)模型的补充,甚至是替补。Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供大量优秀的Web框架方便开发等等。Spring框架具有控制反转(IOC)特性,IOC旨在方便项目维护和测试,它提供了一种通过Java的反射机制对Java对象进行统一的配置和管理的方法。Spring框架利用容器管理对象的生命周期,容器可以通过扫描XML文件或类上特定Java注解来配置对象,开发者可以通过依赖查找或依赖注入来获得对象。Spring框架具有面向切面编程(AOP)框架,SpringAOP框架基于代理模式,同时运行时可配置;AOP框架主要针对模块之间的交叉关注点进行模块化。Spring框架的AOP框架仅提供基本的AOP特性,虽无法与AspectJ框架相比,但通过与AspectJ的集成,也可以满足基本需求。Spring框架下的事务管理、远程访问等功能均可以通过使用SpringAOP技术实现。Spring的事务管理框架为Java平台带来了一种抽象机制,使本地和全局事务以及嵌套事务能够与保存点一起工作,并且几乎可以在Java平台的任何环境中工作。

2.2 Java语言简介

Java是由SUN公司推出,该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称,也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备了显著的优势和广阔的前景,它是面向对象的,分布式的,动态的,具有平台无关性、安全性、健壮性。Java语言的基本语句语法和C++一样,但是它面向对象的技术更加彻底,因为Java要求将所有的内容都必须封装成类,把类作为程序的基本单位。由于不允许类外有变量、方法。 Java语言的分布式体现在数据分布和操作分布,它是面向网络的语言,可以处理TCP/IP协议,它也支持客户机/服务器的计算模式。Java语言的动态性是指类在运行时是动态安装的,使得Java可以动态的维护程序。Java不支持指针,对内存访问的所有操作都是通过对象实例化实现的,这样就避免了指针操作中易产生的错误,同时也预防了病毒对系统的破坏和威胁。

Java语言的编程风格与C语言非常接近,它继承了C++面向对象技术的核心,它面世之后发展迅速,非常流行,对高级C语言形成了很大的冲击。业内人士称之为“一次编译、到处执行”。当然java也有缺点,在每次执行编译后,字节码都需要消耗一定的时间,在某些程度上降低了性能。但是这并不影响java成为此次设计语言的选择。Java语言简单易学,使用它的编程时间短,功能性强,开发者学习起来更简便、更快。Java的主要特性有以下几个:

1.面向对象

面向对象有四个特点:封装、继承、多态、抽象。抽象是指忽略一个问题中的次要部分,关注主要部分。多态是指对同一种消息做出的不同反应。继承是指在原有的父类方法基础上增加自己独有的方法,而不改变原来父类。

2.平台无关性、

Java编译出来的是字节码,直接由虚拟机执行。在任何平台上,只要有Java虚拟机,Java代码都能运行。

3.可靠性和安全性

Java对内存的访问都必须通过对象的实例变量来实现,避免了指针中出现的错误。

4. 多线程

Java提供了多线程功能,利用编程实现同一时间同时工作的功能。

2.3访问数据库实现方法

(1)首先介绍一下web数据库搜索网络上的基本步骤:

第一步:检查消费者的数据,

第二步:你必须建立与数据库的连接;

第三步:搜索数据库;

第四步:数据的结构;

第五步:该用户的结果被示出。

(2)系统,直到我MYSQL5.0 PHP集成开发环境,如使用WAMP服务器处于开机状态,并且更容易访问数据库的报告开发环境:

一个连接到MySQL数据库服务器Mysql_connect-;

语法:资源的mysql_connect(主机,用户名,密码);

请选择数据库:mysql_select_db(数据库链接标识的名称);

关闭数据库:则mysql_close();

2.4系统对MySQL数据库的两种连接方式

活动的MySQL/ MySQL库,或使用ODBC接口,MySQL数据库是一个双向链接。永久及非永久连接。

(1)永久连接:一个更永久的连接请求的最大优点是可以非常有效的客户站在密切的联系,当连接到MySQL服务器,就更好了。在起草该页面每一个孩子在这个过程中,而不是仅仅在任何时候,只有在到MySQL服务器请求连接的生命周期,一旦连接。此子过程是建立到服务器的单独连接可以是永久性的。

(2)非永久连接:他是短路。提交顺路到Web服务器,服务器处理请求并请求的页面,你要发送的浏览器客户端,然后连接断开。对于大多数网站,它经常通过有效高效率有关,但在大多数情况下,所使用的连接,但它是一个完整的时间,以避免出现任何问题,并可以增加的容量服务器承载。

2.5 MySql数据库

Mysql的语言是非结构化的,用户可以在数据上进行工作。因为Mysql的语言和结构比较简单,但是功能和存储信息量很强大,其速度、可靠性和适应性而备受关注并得到了普遍的应用。Mysql数据库在编程过程中的作用是很广泛的,为用户进行数据查询带来了方便。Mysql数据库的应用特点:灵活性强,功能强大,语言相对要简洁很多。 

数据流程分析主要就是数据存储的储藏室,它是在计算机上进行的,而不是现实中的储藏室。数据库管理主要是数据存储、修改和增加以及数据表的建立。数据表的建立,可以对数据表中的数据进行调整,数据的重新组合及重新构造,保证数据的安全性。介于数据库的功能强大等特点,本系统的开发主要应用了Mysql进行对数据的管理。

3.功能设计

系统架构图属于系统设计阶段,系统架构图只是这个阶段一个产物,系统的总体架构决定了整个系统的模式,是系统的基础。美食点评管理系统的整体结构设计如图所示。

4.功能效果图

4.1系统功能模块

美食点评管理系统,在系统的首页可以查看首页、美食餐厅、网站公告、个人中心、后台管理等信息进行详细操作,如图4-1所示。 

图4-1系统首页界面图

美食餐厅,在美食餐厅页面中可以查看餐厅名称、菜系、地区、具体地址、人均消费、总评分、营业时间、点击次数等信息,并进行立即点评、特色美食或评论操作;如图4-2所示。

图4-2美食餐厅界面图

用户注册,在用户注册页面通过填写用户账号、密码、确认密码、用户姓名、联系方式等信息完成用户注册,如图4-3所示。

图4-3用户注册界面图

在个人中心页面通过填写用户账号、密码、用户姓名、上传图片、性别、联系方式等信息进行个人信息修改操作,并根据需要对我的收藏进行操作,如图4-4所示。

图4-4个人中心界面图

4.2管理员功能模块

管理员登录,管理员通过输入用户名、密码、选择角色等信息,然后点击登录就能登录到系统进行系统的使用了,如图4-5所示。

图4-5管理员登录界面图

管理员登录进入系统之后,就可以对所有的信息进行查看,可以查看到首页、个人中心、用户管理、餐厅管理、美食餐厅管理、地区管理、菜系管理、餐厅点评管理、系统管理等,并且还可以对其进行相应的操作管理,如图4-6所示。

图4-6管理员功能界面图

用户管理,在用户管理页面中可以对索引、用户账号、用户姓名、照片、性别、联系方式等信息进行详情,修改或删除等操作,如图4-7所示。

图4-7用户管理界面图

餐厅管理,在餐厅管理页面中可以对索引、餐厅名称、餐厅图片、具体地址、联系人、联系电话、经营范围、审核回复、审核状态、审核等信息进行详情,修改或删除等操作,如图5-8所示。

图4-8餐厅管理界面图

美食餐厅管理,在美食餐厅管理页面中可以对索引、餐厅名称、环境图片、菜系、地区、具体地址、人均消费、总评分、营业时间等信息进行详情、修改、查看评论或删除等操作,如图5-9所示。

图4-9美食餐厅管理界面图

地区管理,在地区管理页面中可以对索引、地区等信息进行详情、修改或删除等操作,如图4-10所示。

图4-10地区管理界面图

菜系管理,在菜系管理页面中可以对索引、菜系等信息进行详情、修改或删除等操作,如图4-11所示。

图4-11菜系管理界面图

系统管理,在轮播图管理页面中可以对索引、名称、值等信息进行详情,修改等操作,并根据需要对网站公告进行操作,如图4-12所示。

图4-12系统管理界面图

4.3用户功能模块

用户登录进入系统可以查看首页、个人中心、餐厅点评管理等信息进行详细操作,如图5-13所示。

图4-13用户功能界面图 

个人中心,在个人中心页面中通过填写用户账号、照片、性别、用户姓名、联系方式等信息进行个人信息修改,如图4-14所示。

图4-14个人中心界面图

餐厅点评管理,在餐厅点评管理页面中可以对索引、餐厅名称、环境图片、口味、服务、环境、总评分、评价时间、用户账号、用户姓名等信息进行详情或删除等操作,如图4-15所示。

图4-15餐厅点评管理界面图

4.4餐厅功能模块

餐厅登录进入系统可以查看首页、个人中心、美食餐厅管理、餐厅点评管理等信息进行详细操作,如图4-16所示。

图4-16餐厅功能界面图

餐厅点评管理,在餐厅点评管理页面中可以对索引、餐厅名称、环境图片、口味、服务、环境、总评分、评价时间、用户账号、用户姓名等信息进行详情或删除等操作,如图4-17所示。

图4-17餐厅点评管理界面图

5.核心代码

/**
 * 菜系
 * 后端接口
 * @author 
 * @email 
 * @date 2022-08-01 21:25:36
 */
@RestController
@RequestMapping("/caixi")
public class CaixiController {
    @Autowired
    private CaixiService caixiService;


    


    /**
     * 后端列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,CaixiEntity caixi,
		HttpServletRequest request){
        EntityWrapper<CaixiEntity> ew = new EntityWrapper<CaixiEntity>();

		PageUtils page = caixiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, caixi), params), params));

        return R.ok().put("data", page);
    }
    
    /**
     * 前端列表
     */
	@IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params,CaixiEntity caixi, 
		HttpServletRequest request){
        EntityWrapper<CaixiEntity> ew = new EntityWrapper<CaixiEntity>();

		PageUtils page = caixiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, caixi), params), params));
        return R.ok().put("data", page);
    }

	/**
     * 列表
     */
    @RequestMapping("/lists")
    public R list( CaixiEntity caixi){
       	EntityWrapper<CaixiEntity> ew = new EntityWrapper<CaixiEntity>();
      	ew.allEq(MPUtil.allEQMapPre( caixi, "caixi")); 
        return R.ok().put("data", caixiService.selectListView(ew));
    }

	 /**
     * 查询
     */
    @RequestMapping("/query")
    public R query(CaixiEntity caixi){
        EntityWrapper< CaixiEntity> ew = new EntityWrapper< CaixiEntity>();
 		ew.allEq(MPUtil.allEQMapPre( caixi, "caixi")); 
		CaixiView caixiView =  caixiService.selectView(ew);
		return R.ok("查询菜系成功").put("data", caixiView);
    }
	
    /**
     * 后端详情
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id){
        CaixiEntity caixi = caixiService.selectById(id);
        return R.ok().put("data", caixi);
    }

    /**
     * 前端详情
     */
	@IgnoreAuth
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") Long id){
        CaixiEntity caixi = caixiService.selectById(id);
        return R.ok().put("data", caixi);
    }
    



    /**
     * 后端保存
     */
    @RequestMapping("/save")
    public R save(@RequestBody CaixiEntity caixi, HttpServletRequest request){
    	caixi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(caixi);
        caixiService.insert(caixi);
        return R.ok();
    }
    
    /**
     * 前端保存
     */
    @RequestMapping("/add")
    public R add(@RequestBody CaixiEntity caixi, HttpServletRequest request){
    	caixi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(caixi);
        caixiService.insert(caixi);
        return R.ok();
    }

    /**
     * 修改
     */
    @RequestMapping("/update")
    @Transactional
    public R update(@RequestBody CaixiEntity caixi, HttpServletRequest request){
        //ValidatorUtils.validateEntity(caixi);
        caixiService.updateById(caixi);//全部更新
        return R.ok();
    }
    

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        caixiService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
    
    /**
     * 提醒接口
     */
	@RequestMapping("/remind/{columnName}/{type}")
	public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, 
						 @PathVariable("type") String type,@RequestParam Map<String, Object> map) {
		map.put("column", columnName);
		map.put("type", type);
		
		if(type.equals("2")) {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			Calendar c = Calendar.getInstance();
			Date remindStartDate = null;
			Date remindEndDate = null;
			if(map.get("remindstart")!=null) {
				Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
				c.setTime(new Date()); 
				c.add(Calendar.DAY_OF_MONTH,remindStart);
				remindStartDate = c.getTime();
				map.put("remindstart", sdf.format(remindStartDate));
			}
			if(map.get("remindend")!=null) {
				Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
				c.setTime(new Date());
				c.add(Calendar.DAY_OF_MONTH,remindEnd);
				remindEndDate = c.getTime();
				map.put("remindend", sdf.format(remindEndDate));
			}
		}
		
		Wrapper<CaixiEntity> wrapper = new EntityWrapper<CaixiEntity>();
		if(map.get("remindstart")!=null) {
			wrapper.ge(columnName, map.get("remindstart"));
		}
		if(map.get("remindend")!=null) {
			wrapper.le(columnName, map.get("remindend"));
		}


		int count = caixiService.selectCount(wrapper);
		return R.ok().put("count", count);
	}

}
/**
 * 餐厅
 * 后端接口
 * @author 
 * @email 
 * @date 2022-08-01 21:25:36
 */
@RestController
@RequestMapping("/canting")
public class CantingController {
    @Autowired
    private CantingService cantingService;


    
	@Autowired
	private TokenService tokenService;
	
	/**
	 * 登录
	 */
	@IgnoreAuth
	@RequestMapping(value = "/login")
	public R login(String username, String password, String captcha, HttpServletRequest request) {
		CantingEntity user = cantingService.selectOne(new EntityWrapper<CantingEntity>().eq("cantingmingcheng", username));
		if(user==null || !user.getMima().equals(password)) {
			return R.error("账号或密码不正确");
		}
		
                if("否".equals(user.getSfsh())) return R.error("账号已锁定,请联系管理员审核。");
		String token = tokenService.generateToken(user.getId(), username,"canting",  "餐厅" );
		return R.ok().put("token", token);
	}
	
	/**
     * 注册
     */
	@IgnoreAuth
    @RequestMapping("/register")
    public R register(@RequestBody CantingEntity canting){
    	//ValidatorUtils.validateEntity(canting);
    	CantingEntity user = cantingService.selectOne(new EntityWrapper<CantingEntity>().eq("cantingmingcheng", canting.getCantingmingcheng()));
		if(user!=null) {
			return R.error("注册用户已存在");
		}
		Long uId = new Date().getTime();
		canting.setId(uId);
        cantingService.insert(canting);
        return R.ok();
    }

	
	/**
	 * 退出
	 */
	@RequestMapping("/logout")
	public R logout(HttpServletRequest request) {
		request.getSession().invalidate();
		return R.ok("退出成功");
	}
	
	/**
     * 获取用户的session用户信息
     */
    @RequestMapping("/session")
    public R getCurrUser(HttpServletRequest request){
    	Long id = (Long)request.getSession().getAttribute("userId");
        CantingEntity user = cantingService.selectById(id);
        return R.ok().put("data", user);
    }
    
    /**
     * 密码重置
     */
    @IgnoreAuth
	@RequestMapping(value = "/resetPass")
    public R resetPass(String username, HttpServletRequest request){
    	CantingEntity user = cantingService.selectOne(new EntityWrapper<CantingEntity>().eq("cantingmingcheng", username));
    	if(user==null) {
    		return R.error("账号不存在");
    	}
        user.setMima("123456");
        cantingService.updateById(user);
        return R.ok("密码已重置为:123456");
    }


    /**
     * 后端列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,CantingEntity canting,
		HttpServletRequest request){
        EntityWrapper<CantingEntity> ew = new EntityWrapper<CantingEntity>();

		PageUtils page = cantingService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, canting), params), params));

        return R.ok().put("data", page);
    }
    
    /**
     * 前端列表
     */
	@IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params,CantingEntity canting, 
		HttpServletRequest request){
        EntityWrapper<CantingEntity> ew = new EntityWrapper<CantingEntity>();

		PageUtils page = cantingService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, canting), params), params));
        return R.ok().put("data", page);
    }

	/**
     * 列表
     */
    @RequestMapping("/lists")
    public R list( CantingEntity canting){
       	EntityWrapper<CantingEntity> ew = new EntityWrapper<CantingEntity>();
      	ew.allEq(MPUtil.allEQMapPre( canting, "canting")); 
        return R.ok().put("data", cantingService.selectListView(ew));
    }

	 /**
     * 查询
     */
    @RequestMapping("/query")
    public R query(CantingEntity canting){
        EntityWrapper< CantingEntity> ew = new EntityWrapper< CantingEntity>();
 		ew.allEq(MPUtil.allEQMapPre( canting, "canting")); 
		CantingView cantingView =  cantingService.selectView(ew);
		return R.ok("查询餐厅成功").put("data", cantingView);
    }
	
    /**
     * 后端详情
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id){
        CantingEntity canting = cantingService.selectById(id);
        return R.ok().put("data", canting);
    }

    /**
     * 前端详情
     */
	@IgnoreAuth
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") Long id){
        CantingEntity canting = cantingService.selectById(id);
        return R.ok().put("data", canting);
    }
    



    /**
     * 后端保存
     */
    @RequestMapping("/save")
    public R save(@RequestBody CantingEntity canting, HttpServletRequest request){
    	canting.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(canting);
    	CantingEntity user = cantingService.selectOne(new EntityWrapper<CantingEntity>().eq("cantingmingcheng", canting.getCantingmingcheng()));
		if(user!=null) {
			return R.error("用户已存在");
		}
		canting.setId(new Date().getTime());
        cantingService.insert(canting);
        return R.ok();
    }
    
    /**
     * 前端保存
     */
    @RequestMapping("/add")
    public R add(@RequestBody CantingEntity canting, HttpServletRequest request){
    	canting.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(canting);
    	CantingEntity user = cantingService.selectOne(new EntityWrapper<CantingEntity>().eq("cantingmingcheng", canting.getCantingmingcheng()));
		if(user!=null) {
			return R.error("用户已存在");
		}
		canting.setId(new Date().getTime());
        cantingService.insert(canting);
        return R.ok();
    }

    /**
     * 修改
     */
    @RequestMapping("/update")
    @Transactional
    public R update(@RequestBody CantingEntity canting, HttpServletRequest request){
        //ValidatorUtils.validateEntity(canting);
        cantingService.updateById(canting);//全部更新
        return R.ok();
    }
    

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        cantingService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
    
    /**
     * 提醒接口
     */
	@RequestMapping("/remind/{columnName}/{type}")
	public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, 
						 @PathVariable("type") String type,@RequestParam Map<String, Object> map) {
		map.put("column", columnName);
		map.put("type", type);
		
		if(type.equals("2")) {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			Calendar c = Calendar.getInstance();
			Date remindStartDate = null;
			Date remindEndDate = null;
			if(map.get("remindstart")!=null) {
				Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
				c.setTime(new Date()); 
				c.add(Calendar.DAY_OF_MONTH,remindStart);
				remindStartDate = c.getTime();
				map.put("remindstart", sdf.format(remindStartDate));
			}
			if(map.get("remindend")!=null) {
				Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
				c.setTime(new Date());
				c.add(Calendar.DAY_OF_MONTH,remindEnd);
				remindEndDate = c.getTime();
				map.put("remindend", sdf.format(remindEndDate));
			}
		}
		
		Wrapper<CantingEntity> wrapper = new EntityWrapper<CantingEntity>();
		if(map.get("remindstart")!=null) {
			wrapper.ge(columnName, map.get("remindstart"));
		}
		if(map.get("remindend")!=null) {
			wrapper.le(columnName, map.get("remindend"));
		}


		int count = cantingService.selectCount(wrapper);
		return R.ok().put("count", count);
	}
	

}

/**
 * 餐厅点评
 * 后端接口
 * @author 
 * @email 
 * @date 2022-08-01 21:25:36
 */
@RestController
@RequestMapping("/cantingdianping")
public class CantingdianpingController {
    @Autowired
    private CantingdianpingService cantingdianpingService;


    


    /**
     * 后端列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,CantingdianpingEntity cantingdianping,
		HttpServletRequest request){
		String tableName = request.getSession().getAttribute("tableName").toString();
		if(tableName.equals("canting")) {
			cantingdianping.setCantingmingcheng((String)request.getSession().getAttribute("username"));
		}
		if(tableName.equals("yonghu")) {
			cantingdianping.setYonghuzhanghao((String)request.getSession().getAttribute("username"));
		}
        EntityWrapper<CantingdianpingEntity> ew = new EntityWrapper<CantingdianpingEntity>();

		PageUtils page = cantingdianpingService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, cantingdianping), params), params));

        return R.ok().put("data", page);
    }
    
    /**
     * 前端列表
     */
	@IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params,CantingdianpingEntity cantingdianping, 
		HttpServletRequest request){
        EntityWrapper<CantingdianpingEntity> ew = new EntityWrapper<CantingdianpingEntity>();

		PageUtils page = cantingdianpingService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, cantingdianping), params), params));
        return R.ok().put("data", page);
    }

	/**
     * 列表
     */
    @RequestMapping("/lists")
    public R list( CantingdianpingEntity cantingdianping){
       	EntityWrapper<CantingdianpingEntity> ew = new EntityWrapper<CantingdianpingEntity>();
      	ew.allEq(MPUtil.allEQMapPre( cantingdianping, "cantingdianping")); 
        return R.ok().put("data", cantingdianpingService.selectListView(ew));
    }

	 /**
     * 查询
     */
    @RequestMapping("/query")
    public R query(CantingdianpingEntity cantingdianping){
        EntityWrapper< CantingdianpingEntity> ew = new EntityWrapper< CantingdianpingEntity>();
 		ew.allEq(MPUtil.allEQMapPre( cantingdianping, "cantingdianping")); 
		CantingdianpingView cantingdianpingView =  cantingdianpingService.selectView(ew);
		return R.ok("查询餐厅点评成功").put("data", cantingdianpingView);
    }
	
    /**
     * 后端详情
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id){
        CantingdianpingEntity cantingdianping = cantingdianpingService.selectById(id);
        return R.ok().put("data", cantingdianping);
    }

    /**
     * 前端详情
     */
	@IgnoreAuth
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") Long id){
        CantingdianpingEntity cantingdianping = cantingdianpingService.selectById(id);
        return R.ok().put("data", cantingdianping);
    }
    



    /**
     * 后端保存
     */
    @RequestMapping("/save")
    public R save(@RequestBody CantingdianpingEntity cantingdianping, HttpServletRequest request){
    	cantingdianping.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(cantingdianping);
        cantingdianpingService.insert(cantingdianping);
        return R.ok();
    }
    
    /**
     * 前端保存
     */
    @RequestMapping("/add")
    public R add(@RequestBody CantingdianpingEntity cantingdianping, HttpServletRequest request){
    	cantingdianping.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(cantingdianping);
        cantingdianpingService.insert(cantingdianping);
        return R.ok();
    }

    /**
     * 修改
     */
    @RequestMapping("/update")
    @Transactional
    public R update(@RequestBody CantingdianpingEntity cantingdianping, HttpServletRequest request){
        //ValidatorUtils.validateEntity(cantingdianping);
        cantingdianpingService.updateById(cantingdianping);//全部更新
        return R.ok();
    }
    

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        cantingdianpingService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
    
    /**
     * 提醒接口
     */
	@RequestMapping("/remind/{columnName}/{type}")
	public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, 
						 @PathVariable("type") String type,@RequestParam Map<String, Object> map) {
		map.put("column", columnName);
		map.put("type", type);
		
		if(type.equals("2")) {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			Calendar c = Calendar.getInstance();
			Date remindStartDate = null;
			Date remindEndDate = null;
			if(map.get("remindstart")!=null) {
				Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
				c.setTime(new Date()); 
				c.add(Calendar.DAY_OF_MONTH,remindStart);
				remindStartDate = c.getTime();
				map.put("remindstart", sdf.format(remindStartDate));
			}
			if(map.get("remindend")!=null) {
				Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
				c.setTime(new Date());
				c.add(Calendar.DAY_OF_MONTH,remindEnd);
				remindEndDate = c.getTime();
				map.put("remindend", sdf.format(remindEndDate));
			}
		}
		
		Wrapper<CantingdianpingEntity> wrapper = new EntityWrapper<CantingdianpingEntity>();
		if(map.get("remindstart")!=null) {
			wrapper.ge(columnName, map.get("remindstart"));
		}
		if(map.get("remindend")!=null) {
			wrapper.le(columnName, map.get("remindend"));
		}

		String tableName = request.getSession().getAttribute("tableName").toString();
		if(tableName.equals("canting")) {
			wrapper.eq("cantingmingcheng", (String)request.getSession().getAttribute("username"));
		}
		if(tableName.equals("yonghu")) {
			wrapper.eq("yonghuzhanghao", (String)request.getSession().getAttribute("username"));
		}

		int count = cantingdianpingService.selectCount(wrapper);
		return R.ok().put("count", count);
	}


}

6.参考论文

摘  要

1 系统概述

1.1 概述

1.2课题意义

1.3 主要内容

2 系统开发环境

2.1 Spring Boot框架

2.2 Java语言简介

2.3访问数据库实现方法

2.4系统对MySQL数据库的两种连接方式

2.5 MySql数据库

3 需求分析

3.1技术可行性:技术背景

3.2经济可行性

3.3操作可行性

3.4系统设计规则

3.5系统流程和逻辑

4系统概要设计

4.1 概述

4.2 系统结构

4.3. 数据库设计

4.3.1 数据库实体

4.3.2 数据库设计表

5系统详细设计

5.1系统功能模块

5.2管理员功能模块

5.3用户功能模块

5.4餐厅功能模块

6 系统测试

6.1系统测试的目的

6.2系统测试方法

6.3 测试结果

结论

致 谢

7.总结

本系统通过对java和Mysql数据库的简介,从硬件和软件两反面说明了美食点评管理系统的可行性,本文结论及研究成果如下:实现了java与Mysql相结合构建的美食点评管理系统,网站可以响应式展示。通过本次美食点评管理系统的研究与实现,我感到学海无涯,学习是没有终点的,而且实践出真知,只有多动手才能尽快掌握它,经验对系统的开发非常重要,经验不足,就难免会有许多考虑不周之处。比如要有美观的界面,更完善的功能,才能吸引更多的用户。

由于在此之前对于java知识没有深入了解,所以从一开始就碰到许多困难,例如一开始的页面显示不规范、数据库连接有问题已经无法实现参数的传递等等,不过通过在网上寻找有关资料以及同学的帮助下最后都得到了解决,在此过程中,我不仅学到了很多知识,也提高了自己解决问题的能力,尤其是学会如何从大量的信息中筛选出所需有用的信息,同时我更加深刻的体会到了,虽然书本上的大部分知识都是有价值,正确的,但实际上每个人编程的思路和对数据处理的方法、思想都是不同的,这就要求我们一定要通过实践才能找到解决问题的方案。在此次毕业设计活动中,我不断的提高了自己,也得到了宝贵的经验,我相信这些对我以后的发展都会有很大帮助。

通过这次美食点评管理系统的开发,我参考了很多相关系统的例子,取长补短,吸取了其他系统的长处,逐步对该系统进行了完善,但是该系统还是有很多的不足之处,有待以后进一步学习。

实践证明,美食点评管理系统有着非常好的发展前景,经过测试运行,系统各项功能都十分完善,界面漂亮,使用方便,操作容易,在技术理论上已经成熟。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/698477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

短视频矩阵抖音账号矩阵系统源码开发者自研(一)

一、短视频矩阵系统源码框架建模搭建 目录 一、短视频矩阵系统源码框架建模搭建 1.抖音账号矩阵系统功能模型建模 2.短视频账号矩阵系统接口开发规则 二、短视频矩阵系统源码视频剪辑转码处理 短视频矩阵系统是一个多功能的视频内容管理系统&#xff0c;用于创建、剪辑发布…

vue3-多人聊天室角色识别(全栈)

文章目录 主要技术栈目的实现步骤1. 前端发送信息2. 后端处理数据3. 前端渲染数据4. store 主要技术栈 主要技术栈是vue3&#xff0c;springboot&#xff0c;websocket&#xff0c;element-plus 目的 主要目的是复习和梳理 实现步骤 1. 前端发送信息 发送信息&#xff0c…

【Spring Cloud系列】-负载均衡(Load Balancer,LB)

【Spring Cloud系列】-负载均衡&#xff08;Load Balancer&#xff0c;LB&#xff09; 文章目录 【Spring Cloud系列】-负载均衡&#xff08;Load Balancer&#xff0c;LB&#xff09;一、什么是负载均衡&#xff08;Load Balancer&#xff0c;LB&#xff09;二、负载均衡的主要…

【MySQL】MySQL中SQL执行流程

文章目录 一、MySQL语句执行流程1.1、主要的原因有以下几点1.2、具体执行流程图如下 二、存储引擎三、MySQL的架构与内部模块四、崩溃恢复时如何判断事务是否需要提交 一、MySQL语句执行流程 连接器&#xff08;Connector&#xff09;&#xff1a; 当客户端发送一个连接请求时…

设计模式学习之观察者模式

设计模式系列往期文章 设计模式学习之策略模式设计模式学习之策略模式在前端的应用设计模式学习之简单工厂模式设计模式学习之工厂方法模式设计模式学习之抽象工厂模式设计模式学习之策略模式和简单工厂模式的对比 这是设计模式系列的第7篇文章&#xff0c;在这之前我们已经介…

React函数式组件

1. 创建函数式组件 我们可以通过所定义的函数来进行react中组件的定义。首先我们可以定义一个函数&#xff0c;然后通过函数的返回值来进行相关组件的定义。例如下面这张写法&#xff0c;我们可以通过调用一个函数&#xff0c;通过其返回值来进行相关的操作。 function Test()…

chatgpt赋能python:Python遍历A到Z:SEO优化的关键

Python遍历A到Z&#xff1a;SEO优化的关键 对于任何一家网站来说&#xff0c;SEO (Search Engine Optimization, 搜索引擎优化)都是至关重要的&#xff0c;特别是在当今数字时代&#xff0c;人们常常会在搜索引擎中查找信息并浏览不同网站。其中一个重要的SEO策略是为每个网站…

笔记本安装双系统ubuntu时踩的坑——戴尔

如果你遇到以下的这些问题&#xff0c;不要直接装了&#xff0c;无解&#xff01;&#xff01;&#xff01; 建议看我另一篇教程&#xff0c;把硬盘取出来在另外的电脑上装好系统再放回去&#xff0c;这样嘎嘎快。 移动硬盘中安装Ubuntu 20.04系统——立省99%的问题_放风筝的…

水质监测的重要性及应用

水质监测是保障水环境安全和人民健康的重要手段。随着城市化进程的加速和工业化程度的提高&#xff0c;水污染问题日益严重&#xff0c;水质监测的重要性也越来越凸显。水质监测是指对水体中的各种物理、化学和生物参数进行监测和分析&#xff0c;以评估水体的质量和污染程度。…

概率论--随机事件与概率--贝叶斯公式--随机变量

目录 随机事件与概率 概念 为什么要学习概率论 随机事件与随机事件概率 随机事件 随机事件概率 贝叶斯公式 概念 条件概率 概率乘法公式 贝叶斯公式 举个栗子 随机变量 随机变量的定义 随机变量的分类 离散型随机变量 连续型随机变量 随机事件与概率 概念 …

和Git相关的一些问题

1. Git拉取项目的两种方式以及区别 方式 Http&#xff1a;通过http方式的clone项目&#xff0c;不需要在git上手动绑定ssh&#xff0c;只需要在clone的时候输入账号&#xff0c;密码即可&#xff1b;SSH&#xff1a;通过ssh方式clone项目&#xff0c;需要手动绑定ssh密钥 区别 …

Linux——从零到精通

目录 前言&#xff1a; 一.Linux介绍 二.Linux基础命令 三.链接和文章从零到实战 基本信息介绍 Linux 操作系统的诞生、发展和成长过程始终依赖着五个重要支柱&#xff1a; 桌面环境 Linux为什么象征着企鹅 命名与读法 前言&#xff1a; 本篇文章结合所有从零到精通 Linux…

如何在jupyter notebook 中添加虚拟环境

一&#xff0e;如何在jupyter notebook 中添加虚拟环境 假设在D:\tf_training\envTraining创建了名为env_training的虚拟环境。 1.安装IPykernel < python2 > pip install ipykernel < python3 > pip install ipykernel 说明&#xff1a;最好进入到虚拟环境…

STM32单片机(九)USART串口----第九节:STLINK Utility

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

第24天-订单服务(订单确认、订单接口幂等、订单验价、锁定库存)

f# 1.Docker安装RabbitMQ docker run -d --name rabbitmq \ -p 5672:5672 -p 25672:25672 -p 15672:15672 \ -e RABBITMQ_DEFAULT_USERadmin -e RABBITMQ_DEFAULT_PASSadmin \ --restartalways \ rabbitmq:management5672&#xff1a;AMQP端口25672&#xff1a;集群端口15672&…

和Cookie相关的一些问题

目录 1. Cookie储存在哪里&#xff1f; 2. 不同网站可以互相访问对方的Cookie吗&#xff1f; 3.二级域名能够读到一级域名的Cookie吗&#xff1f; 1. Cookie储存在哪里&#xff1f; Cookie是前后端共享的&#xff0c;故肯定是存在浏览器的。 在浏览器开发者工具中可以找到C…

### 4.1 Hadoop生态系统

狭义的Hadoop VS 广义的Hadoop 广义的Hadoop&#xff1a;指的是Hadoop生态系统&#xff0c;Hadoop生态系统是一个很庞大的概念&#xff0c;hadoop是其中最重要最基础的一个部分&#xff0c;生态系统中每一子系统只解决某一个特定的问题域&#xff08;甚至可能更窄&#xff09;…

UE5.2 Mobile安卓游戏 Graphics Profile工具使用总结

Android Graphics Profile工具 Android游戏Profile 图形帧的常用工具有: snapdragon profiler, renderdoc, 手机游戏APP环境 (1)opengl es3.1/3.2或者vulkan (2)UE5 Android 打Debug包 (3)USB连接电脑的设置: 手机连接电脑&#xff0c;开启USB传输文件模式&#xff0c;开…

全志V3S嵌入式驱动开发(解决32M spi-nor无法复位问题)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 之前制作spi-nor image的时候&#xff0c;就发现v3s存在无法复位的问题。只要进入linux之后&#xff0c;不管是console输入reboot指令&#xff0c;…

【C/C++解决读者-写者问题】

目录 一、问题描述二、问题分析三、三种策略实现1.读者优先策略2. 读写公平策略3.写者优先策略&#xff08;后续更新&#xff09; 一、问题描述 有读者和写者两组并发进程&#xff0c;共享一个文件&#xff0c;当两个或两个以上的读进程&#xff08;只是读数据&#xff0c;不会…