✨作者主页:IT研究室✨
个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。
☑文末获取源码☑
精彩专栏推荐⬇⬇⬇
Java项目
Python项目
安卓项目
微信小程序项目
文章目录
- 一、前言
- 二、开发环境
- 三、系统界面展示
- 四、代码参考
- 五、论文参考
- 六、系统视频
- 结语
一、前言
校园消费市场活跃,商家众多,但缺乏一个统一的平台供学生了解商家信息、分享消费体验和反馈意见。随着互联网技术的发展,特别是移动互联网的普及,建立一个校园消费点评系统,可以为学生提供更加直观、便捷的消费决策支持。
现有的校园消费信息分散,缺乏系统化管理,学生难以了解商家信息和服务质量。同时,学生反馈渠道不畅,意见和投诉处理效率不高,影响了学生的消费体验和权益保护。
本课题旨在设计并实现一个校园消费点评系统,通过系统化管理商家信息、提供透明的消费评价机制、建立便捷的反馈投诉处理流程,增强学生的消费透明度和满意度。
在校园消费点评系统中,管理人员负责系统的日常运维和信息管理,包括用户账户的创建与维护、商家类型的分类与更新、商家信息的审核与录入、用户反馈和投诉的收集与处理、以及公告内容的发布与管理,确保系统的有序运行和信息的准确性;用户则能够查看各类商家的详细信息、阅读系统公告、对商家服务进行投诉和反馈,享受便捷的消费信息查询和反馈服务。系统通过这些功能模块的整合,旨在为校园内消费者提供一个透明、公正的消费评价平台。
本课题的研究具有重要的理论意义和实际意义。从理论角度来看,它为校园消费市场管理提供了新的研究视角,即如何利用信息技术提升消费信息的透明度和互动性。从实际角度来看,校园消费点评系统的应用将有助于提高学生的消费决策质量,维护消费者权益,促进校园商家提升服务质量,推动校园消费市场的健康发展。此外,系统的推广应用还将为校园管理提供数据支持,为校园商业环境的优化提供决策依据。
二、开发环境
- 开发语言:Java/Python
- 数据库:MySQL
- 系统架构:B/S
- 后端:SpringBoot/SSM/Django/Flask
- 前端:Vue
三、系统界面展示
- 校园消费点评系统界面展示:
管理员-商家管理:
管理员-反馈投诉管理:
用户-查看商家信息:
用户-投诉反馈:
四、代码参考
- 项目实战代码参考:
@RestController
@Controller
@RequestMapping("/shangjia")
public class ShangjiaController {
private static final Logger logger = LoggerFactory.getLogger(ShangjiaController.class);
private static final String TABLE_NAME = "shangjia";
@Autowired
private ShangjiaService shangjiaService;
@Autowired
private TokenService tokenService;
@Autowired
private AddressService addressService;//收货地址
@Autowired
private CaipinService caipinService;//菜品
@Autowired
private CaipinCollectionService caipinCollectionService;//菜品收藏
@Autowired
private CaipinCommentbackService caipinCommentbackService;//菜品评价
@Autowired
private CaipinOrderService caipinOrderService;//菜品订单
@Autowired
private CartService cartService;//购物车
@Autowired
private DictionaryService dictionaryService;//字典
@Autowired
private GonggaoService gonggaoService;//公告
@Autowired
private YonghuService yonghuService;//用户
@Autowired
private UsersService usersService;//管理员
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永不会进入");
else if("用户".equals(role))
params.put("yonghuId",request.getSession().getAttribute("userId"));
else if("商家".equals(role))
params.put("shangjiaId",request.getSession().getAttribute("userId"));
params.put("shangjiaDeleteStart",1);params.put("shangjiaDeleteEnd",1);
CommonUtil.checkMap(params);
PageUtils page = shangjiaService.queryPage(params);
//字典表数据转换
List<ShangjiaView> list =(List<ShangjiaView>)page.getList();
for(ShangjiaView c:list){
//修改对应字典表字段
dictionaryService.dictionaryConvert(c, request);
}
return R.ok().put("data", page);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id, HttpServletRequest request){
logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
ShangjiaEntity shangjia = shangjiaService.selectById(id);
if(shangjia !=null){
//entity转view
ShangjiaView view = new ShangjiaView();
BeanUtils.copyProperties( shangjia , view );//把实体数据重构到view中
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody ShangjiaEntity shangjia, HttpServletRequest request){
logger.debug("save方法:,,Controller:{},,shangjia:{}",this.getClass().getName(),shangjia.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永远不会进入");
Wrapper<ShangjiaEntity> queryWrapper = new EntityWrapper<ShangjiaEntity>()
.eq("username", shangjia.getUsername())
.or()
.eq("shangjia_phone", shangjia.getShangjiaPhone())
.eq("shangjia_delete", 1)
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
ShangjiaEntity shangjiaEntity = shangjiaService.selectOne(queryWrapper);
if(shangjiaEntity==null){
shangjia.setShangjiaDelete(1);
shangjia.setCreateTime(new Date());
shangjia.setPassword("123456");
shangjiaService.insert(shangjia);
return R.ok();
}else {
return R.error(511,"账户或者联系方式已经被使用");
}
}
/**
* 后端修改
*/
@RequestMapping("/update")
public R update(@RequestBody ShangjiaEntity shangjia, HttpServletRequest request) throws NoSuchFieldException, ClassNotFoundException, IllegalAccessException, InstantiationException {
logger.debug("update方法:,,Controller:{},,shangjia:{}",this.getClass().getName(),shangjia.toString());
ShangjiaEntity oldShangjiaEntity = shangjiaService.selectById(shangjia.getId());//查询原先数据
String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false)
// return R.error(511,"永远不会进入");
if("".equals(shangjia.getShangjiaPhoto()) || "null".equals(shangjia.getShangjiaPhoto())){
shangjia.setShangjiaPhoto(null);
}
shangjiaService.updateById(shangjia);//根据id更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Integer[] ids, HttpServletRequest request){
logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
List<ShangjiaEntity> oldShangjiaList =shangjiaService.selectBatchIds(Arrays.asList(ids));//要删除的数据
ArrayList<ShangjiaEntity> list = new ArrayList<>();
for(Integer id:ids){
ShangjiaEntity shangjiaEntity = new ShangjiaEntity();
shangjiaEntity.setId(id);
shangjiaEntity.setShangjiaDelete(2);
list.add(shangjiaEntity);
}
if(list != null && list.size() >0){
shangjiaService.updateBatchById(list);
}
return R.ok();
}
/**
* 批量上传
*/
@RequestMapping("/batchInsert")
public R save( String fileName, HttpServletRequest request){
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
List<ShangjiaEntity> shangjiaList = new ArrayList<>();//上传的东西
Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段
Date date = new Date();
int lastIndexOf = fileName.lastIndexOf(".");
if(lastIndexOf == -1){
return R.error(511,"该文件没有后缀");
}else{
String suffix = fileName.substring(lastIndexOf);
if(!".xls".equals(suffix)){
return R.error(511,"只支持后缀为xls的excel文件");
}else{
URL resource = this.getClass().getClassLoader().getResource("../../upload/" + fileName);//获取文件路径
File file = new File(resource.getFile());
if(!file.exists()){
return R.error(511,"找不到上传文件,请联系管理员");
}else{
List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
dataList.remove(0);//删除第一行,因为第一行是提示
for(List<String> data:dataList){
//循环
ShangjiaEntity shangjiaEntity = new ShangjiaEntity();
// shangjiaEntity.setUsername(data.get(0)); //账户 要改的
// shangjiaEntity.setPassword("123456");//密码
// shangjiaEntity.setShangjiaName(data.get(0)); //商家名称 要改的
// shangjiaEntity.setShangjiaPhone(data.get(0)); //联系方式 要改的
// shangjiaEntity.setShangjiaEmail(data.get(0)); //邮箱 要改的
// shangjiaEntity.setShangjiaPhoto("");//详情和图片
// shangjiaEntity.setShangjiaGongzuoshijian(data.get(0)); //工作时间 要改的
// shangjiaEntity.setShangjiaPeisongfanwei(data.get(0)); //配送范围 要改的
// shangjiaEntity.setShangjiaZhuying(data.get(0)); //主营项目 要改的
// shangjiaEntity.setShangjiaAdress(data.get(0)); //店铺位置 要改的
// shangjiaEntity.setShangjiaXingjiTypes(Integer.valueOf(data.get(0))); //信用等级 要改的
// shangjiaEntity.setNewMoney(data.get(0)); //现有余额 要改的
// shangjiaEntity.setShangjiaContent("");//详情和图片
// shangjiaEntity.setShangjiaDelete(1);//逻辑删除字段
// shangjiaEntity.setCreateTime(date);//时间
shangjiaList.add(shangjiaEntity);
//把要查询是否重复的字段放入map中
//账户
if(seachFields.containsKey("username")){
List<String> username = seachFields.get("username");
username.add(data.get(0));//要改的
}else{
List<String> username = new ArrayList<>();
username.add(data.get(0));//要改的
seachFields.put("username",username);
}
//联系方式
if(seachFields.containsKey("shangjiaPhone")){
List<String> shangjiaPhone = seachFields.get("shangjiaPhone");
shangjiaPhone.add(data.get(0));//要改的
}else{
List<String> shangjiaPhone = new ArrayList<>();
shangjiaPhone.add(data.get(0));//要改的
seachFields.put("shangjiaPhone",shangjiaPhone);
}
}
//查询是否重复
//账户
List<ShangjiaEntity> shangjiaEntities_username = shangjiaService.selectList(new EntityWrapper<ShangjiaEntity>().in("username", seachFields.get("username")).eq("shangjia_delete", 1));
if(shangjiaEntities_username.size() >0 ){
ArrayList<String> repeatFields = new ArrayList<>();
for(ShangjiaEntity s:shangjiaEntities_username){
repeatFields.add(s.getUsername());
}
return R.error(511,"数据库的该表中的 [账户] 字段已经存在 存在数据为:"+repeatFields.toString());
}
//联系方式
List<ShangjiaEntity> shangjiaEntities_shangjiaPhone = shangjiaService.selectList(new EntityWrapper<ShangjiaEntity>().in("shangjia_phone", seachFields.get("shangjiaPhone")).eq("shangjia_delete", 1));
if(shangjiaEntities_shangjiaPhone.size() >0 ){
ArrayList<String> repeatFields = new ArrayList<>();
for(ShangjiaEntity s:shangjiaEntities_shangjiaPhone){
repeatFields.add(s.getShangjiaPhone());
}
return R.error(511,"数据库的该表中的 [联系方式] 字段已经存在 存在数据为:"+repeatFields.toString());
}
shangjiaService.insertBatch(shangjiaList);
return R.ok();
}
}
}
}catch (Exception e){
e.printStackTrace();
return R.error(511,"批量插入数据异常,请联系管理员");
}
}
/**
* 登录
*/
@IgnoreAuth
@RequestMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request) {
ShangjiaEntity shangjia = shangjiaService.selectOne(new EntityWrapper<ShangjiaEntity>().eq("username", username));
if(shangjia==null || !shangjia.getPassword().equals(password))
return R.error("账号或密码不正确");
else if(shangjia.getShangjiaDelete() != 1)
return R.error("账户已被删除");
String token = tokenService.generateToken(shangjia.getId(),username, "shangjia", "商家");
R r = R.ok();
r.put("token", token);
r.put("role","商家");
r.put("username",shangjia.getShangjiaName());
r.put("tableName","shangjia");
r.put("userId",shangjia.getId());
return r;
}
/**
* 注册
*/
@IgnoreAuth
@PostMapping(value = "/register")
public R register(@RequestBody ShangjiaEntity shangjia, HttpServletRequest request) {
// ValidatorUtils.validateEntity(user);
Wrapper<ShangjiaEntity> queryWrapper = new EntityWrapper<ShangjiaEntity>()
.eq("username", shangjia.getUsername())
.or()
.eq("shangjia_phone", shangjia.getShangjiaPhone())
.andNew()
.eq("shangjia_delete", 1)
;
ShangjiaEntity shangjiaEntity = shangjiaService.selectOne(queryWrapper);
if(shangjiaEntity != null)
return R.error("账户或者联系方式已经被使用");
shangjia.setShangjiaXingjiTypes(1);
shangjia.setNewMoney(0.0);
shangjia.setShangjiaDelete(1);
shangjia.setCreateTime(new Date());
shangjiaService.insert(shangjia);
return R.ok();
}
/**
* 重置密码
*/
@GetMapping(value = "/resetPassword")
public R resetPassword(Integer id, HttpServletRequest request) {
ShangjiaEntity shangjia = shangjiaService.selectById(id);
shangjia.setPassword("123456");
shangjiaService.updateById(shangjia);
return R.ok();
}
/**
* 修改密码
*/
@GetMapping(value = "/updatePassword")
public R updatePassword(String oldPassword, String newPassword, HttpServletRequest request) {
ShangjiaEntity shangjia = shangjiaService.selectById((Integer)request.getSession().getAttribute("userId"));
if(newPassword == null){
return R.error("新密码不能为空") ;
}
if(!oldPassword.equals(shangjia.getPassword())){
return R.error("原密码输入错误");
}
if(newPassword.equals(shangjia.getPassword())){
return R.error("新密码不能和原密码一致") ;
}
shangjia.setPassword(newPassword);
shangjiaService.updateById(shangjia);
return R.ok();
}
/**
* 忘记密码
*/
@IgnoreAuth
@RequestMapping(value = "/resetPass")
public R resetPass(String username, HttpServletRequest request) {
ShangjiaEntity shangjia = shangjiaService.selectOne(new EntityWrapper<ShangjiaEntity>().eq("username", username));
if(shangjia!=null){
shangjia.setPassword("123456");
shangjiaService.updateById(shangjia);
return R.ok();
}else{
return R.error("账号不存在");
}
}
/**
* 获取用户的session用户信息
*/
@RequestMapping("/session")
public R getCurrShangjia(HttpServletRequest request){
Integer id = (Integer)request.getSession().getAttribute("userId");
ShangjiaEntity shangjia = shangjiaService.selectById(id);
if(shangjia !=null){
//entity转view
ShangjiaView view = new ShangjiaView();
BeanUtils.copyProperties( shangjia , view );//把实体数据重构到view中
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
* 退出
*/
@GetMapping(value = "logout")
public R logout(HttpServletRequest request) {
request.getSession().invalidate();
return R.ok("退出成功");
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
CommonUtil.checkMap(params);
PageUtils page = shangjiaService.queryPage(params);
//字典表数据转换
List<ShangjiaView> list =(List<ShangjiaView>)page.getList();
for(ShangjiaView c:list)
dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段
return R.ok().put("data", page);
}
/**
* 前端详情
*/
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id, HttpServletRequest request){
logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
ShangjiaEntity shangjia = shangjiaService.selectById(id);
if(shangjia !=null){
//entity转view
ShangjiaView view = new ShangjiaView();
BeanUtils.copyProperties( shangjia , view );//把实体数据重构到view中
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody ShangjiaEntity shangjia, HttpServletRequest request){
logger.debug("add方法:,,Controller:{},,shangjia:{}",this.getClass().getName(),shangjia.toString());
Wrapper<ShangjiaEntity> queryWrapper = new EntityWrapper<ShangjiaEntity>()
.eq("username", shangjia.getUsername())
.or()
.eq("shangjia_phone", shangjia.getShangjiaPhone())
.andNew()
.eq("shangjia_delete", 1)
// .notIn("shangjia_types", new Integer[]{102})
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
ShangjiaEntity shangjiaEntity = shangjiaService.selectOne(queryWrapper);
if(shangjiaEntity==null){
shangjia.setShangjiaDelete(1);
shangjia.setCreateTime(new Date());
shangjia.setPassword("123456");
shangjiaService.insert(shangjia);
return R.ok();
}else {
return R.error(511,"账户或者联系方式已经被使用");
}
}
}
@RestController
@RequestMapping("/category")
@Slf4j
public class CategoryController {
@Autowired
private CategoryService categoryService;
/**
* 新增分类
* @param category
* @return
*/
@PostMapping
public R<String> save(@RequestBody Category category){
log.info("category:{}",category);
categoryService.save(category);
return R.success("新增分类成功");
}
/**
* 分页查询
* @param page
* @param pageSize
* @return
*/
@GetMapping("/page")
public R<Page> page(int page,int pageSize){
//分页构造器
Page<Category> pageInfo = new Page<>(page,pageSize);
//条件构造器
LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
//添加排序条件,根据sort进行排序
queryWrapper.orderByAsc(Category::getSort);
//分页查询
categoryService.page(pageInfo,queryWrapper);
return R.success(pageInfo);
}
/**
* 根据id删除分类
* @param id
* @return
*/
@DeleteMapping
public R<String> delete(Long id){
log.info("删除分类,id为:{}",id);
//categoryService.removeById(id);
categoryService.remove(id);
return R.success("分类信息删除成功");
}
/**
* 根据id修改分类信息
* @param category
* @return
*/
@PutMapping
public R<String> update(@RequestBody Category category){
log.info("修改分类信息:{}",category);
categoryService.updateById(category);
return R.success("修改分类信息成功");
}
/**
* 根据条件查询分类数据
* @param category
* @return
*/
@GetMapping("/list")
public R<List<Category>> list(Category category){
//条件构造器
LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
//添加条件
queryWrapper.eq(category.getType() != null,Category::getType,category.getType());
//添加排序条件
queryWrapper.orderByAsc(Category::getSort).orderByDesc(Category::getUpdateTime);
List<Category> list = categoryService.list(queryWrapper);
return R.success(list);
}
}
五、论文参考
- 计算机毕业设计选题推荐-校园消费点评系统论文参考:
六、系统视频
校园消费点评系统项目视频:
计算机毕业设计选题推荐-校园消费点评系统-项目实战
结语
计算机毕业设计选题推荐-校园消费点评系统-Java/Python项目实战
大家可以帮忙点赞、收藏、关注、评论啦~
源码获取:⬇⬇⬇
精彩专栏推荐⬇⬇⬇
Java项目
Python项目
安卓项目
微信小程序项目