博主主页:猫头鹰源码
博主简介:Java领域优质创作者、博客专家、公司架构师、全网粉丝5万+、专注Java技术领域和毕业设计项目实战
主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询
项目介绍:
该系统基于springboot,数据层为MyBatis,mysql数据库,具有完整的业务逻辑。 适合选题:商城、水果商城、蔬菜、蔬菜商城、在线购物等。
项目功能:
果蔬商城网站,让优质新鲜的蔬菜水果在网站上直接面对消费者,一方面网站可以提供比在商店购物中更为详尽的资料、历史渊源以及顾客评论等信息,顾客可以方便地从琳琅满目的各类精品蔬菜水果中快速查询出需要的产品;另一方面也大大的减少商店运营成本,将价格实惠转让给顾客。使电子商务果蔬商城网站的发展成为必然。
前台包含:用户登录、注册、购物车管理、订单管理、收货地址管理、搜索商品信息、下单购物等
后台包括: 用户管理、收货地址管理、类型管理、商品管理、货单管理、订单管理、销售统计、系统管理等模块。
数据库表结构文档:
系统包含技术:
后端:SpringBoot+MyBatis
前端:bootstrap,js,css等
开发工具:idea
数据库:mysql 5.7
JDK版本:jdk1.8
部分截图说明:
下面是首页
用户如果想要看详情,可以进行登录
商品详情,可以进行选购,或加入购物车
查看购物车
结算订单
支付订单
用户登录后可以查看用户信息
查看我的订单
后台进行登录
后台查看首页
后台对分类进行管理
后台对商品维护
后台对轮播图管理
后台发布商品
后台对订单管理
部分代码:
拦截器操作
@Autowired
private AdminLoginInterceptor adminLoginInterceptor;
@Autowired
private NewBeeMallLoginInterceptor newBeeMallLoginInterceptor;
@Autowired
private NewBeeMallCartNumberInterceptor newBeeMallCartNumberInterceptor;
public void addInterceptors(InterceptorRegistry registry) {
// 添加一个拦截器,拦截以/admin为前缀的url路径(后台登陆拦截)
registry.addInterceptor(adminLoginInterceptor)
.addPathPatterns("/admin/**")
.excludePathPatterns("/admin/login")
.excludePathPatterns("/admin/dist/**")
.excludePathPatterns("/admin/plugins/**");
// 购物车中的数量统一处理
registry.addInterceptor(newBeeMallCartNumberInterceptor)
.excludePathPatterns("/admin/**")
.excludePathPatterns("/register")
.excludePathPatterns("/login")
.excludePathPatterns("/logout");
// 商城页面登陆拦截
registry.addInterceptor(newBeeMallLoginInterceptor)
.excludePathPatterns("/admin/**")
.excludePathPatterns("/register")
.excludePathPatterns("/login")
.excludePathPatterns("/logout")
.addPathPatterns("/goods/detail/**")
.addPathPatterns("/shop-cart")
.addPathPatterns("/shop-cart/**")
.addPathPatterns("/saveOrder")
.addPathPatterns("/orders")
.addPathPatterns("/orders/**")
.addPathPatterns("/personal")
.addPathPatterns("/personal/updateInfo")
.addPathPatterns("/selectPayType")
.addPathPatterns("/payPage");
}
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/upload/**").addResourceLocations("file:" + Constants.FILE_UPLOAD_DIC);
registry.addResourceHandler("/goods-img/**").addResourceLocations("file:" + Constants.FILE_UPLOAD_DIC);
}
上传操作
@Autowired
private StandardServletMultipartResolver standardServletMultipartResolver;
@PostMapping({"/upload/file"})
@ResponseBody
public Result upload(HttpServletRequest httpServletRequest, @RequestParam("file") MultipartFile file) throws URISyntaxException {
String fileName = file.getOriginalFilename();
String suffixName = fileName.substring(fileName.lastIndexOf("."));
//生成文件名称通用方法
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
Random r = new Random();
StringBuilder tempName = new StringBuilder();
tempName.append(sdf.format(new Date())).append(r.nextInt(100)).append(suffixName);
String newFileName = tempName.toString();
File fileDirectory = new File(Constants.FILE_UPLOAD_DIC);
//创建文件
File destFile = new File(Constants.FILE_UPLOAD_DIC + newFileName);
try {
if (!fileDirectory.exists()) {
if (!fileDirectory.mkdir()) {
throw new IOException("文件夹创建失败,路径为:" + fileDirectory);
}
}
file.transferTo(destFile);
Result resultSuccess = ResultGenerator.genSuccessResult();
resultSuccess.setData(AppUtils.getHost(new URI(httpServletRequest.getRequestURL() + "")) + "/upload/" + newFileName);
return resultSuccess;
} catch (IOException e) {
e.printStackTrace();
return ResultGenerator.genFailResult("文件上传失败");
}
}
@PostMapping({"/upload/files"})
@ResponseBody
public Result uploadV2(HttpServletRequest httpServletRequest) throws URISyntaxException {
List<MultipartFile> multipartFiles = new ArrayList<>(8);
if (standardServletMultipartResolver.isMultipart(httpServletRequest)) {
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) httpServletRequest;
Iterator<String> iter = multiRequest.getFileNames();
int total = 0;
while (iter.hasNext()) {
if (total > 5) {
return ResultGenerator.genFailResult("最多上传5张图片");
}
total += 1;
MultipartFile file = multiRequest.getFile(iter.next());
multipartFiles.add(file);
}
}
if (CollectionUtils.isEmpty(multipartFiles)) {
return ResultGenerator.genFailResult("参数异常");
}
if (multipartFiles != null && multipartFiles.size() > 5) {
return ResultGenerator.genFailResult("最多上传5张图片");
}
List<String> fileNames = new ArrayList(multipartFiles.size());
for (int i = 0; i < multipartFiles.size(); i++) {
String fileName = multipartFiles.get(i).getOriginalFilename();
String suffixName = fileName.substring(fileName.lastIndexOf("."));
//生成文件名称通用方法
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
Random r = new Random();
StringBuilder tempName = new StringBuilder();
tempName.append(sdf.format(new Date())).append(r.nextInt(100)).append(suffixName);
String newFileName = tempName.toString();
File fileDirectory = new File(Constants.FILE_UPLOAD_DIC);
//创建文件
File destFile = new File(Constants.FILE_UPLOAD_DIC + newFileName);
try {
if (!fileDirectory.exists()) {
if (!fileDirectory.mkdir()) {
throw new IOException("文件夹创建失败,路径为:" + fileDirectory);
}
}
multipartFiles.get(i).transferTo(destFile);
fileNames.add(AppUtils.getHost(new URI(httpServletRequest.getRequestURL() + "")) + "/upload/" + newFileName);
} catch (IOException e) {
e.printStackTrace();
return ResultGenerator.genFailResult("文件上传失败");
}
}
Result resultSuccess = ResultGenerator.genSuccessResult();
resultSuccess.setData(fileNames);
return resultSuccess;
}
以上就是部分功能展示,从整体上来看,本系统功能是十分完整的,界面设计简洁大方,交互友好,数据库设计也很合理,规模适中,代码工整,清晰,适合学习使用。
好了,今天就到这儿吧,小伙伴们点赞、收藏、评论,一键三连走起呀,下期见~~