百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

SpringBoot学习笔记十三之项目发起

toyiye 2024-06-30 09:50 14 浏览 0 评论

创建数据库

分类表

CREATE TABLE `t_type` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL COMMENT '分类名称',
`remark` varchar(255) DEFAULT NULL COMMENT '分类介绍',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8


项目分类中间表

CREATE TABLE `t_project_type` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`projectid` int(11) DEFAULT NULL,
`typeid` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8


标签表

CREATE TABLE `t_tag` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pid` int(11) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8


项目标签中间表

CREATE TABLE `t_project_tag` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`projectid` int(11) DEFAULT NULL,
`tagid` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8


项目表

CREATE TABLE `t_project` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `project_name` varchar(255) DEFAULT NULL COMMENT '项目名称',  `project_description` varchar(255) DEFAULT NULL COMMENT '项目描述',  `money` bigint(11) DEFAULT NULL COMMENT '筹集金额',  `day` int(11) DEFAULT NULL COMMENT '筹集天数',  `status` int(4) DEFAULT NULL COMMENT '0-即将开始,1-众筹中,2-众筹成功,3-众筹失败\n',  `deploydate` varchar(10) DEFAULT NULL COMMENT '项目发起时间',  `supportmoney` bigint(11) DEFAULT NULL COMMENT '已筹集到的金额',  `supporter` int(11) DEFAULT NULL COMMENT '支持人数',  `completion` int(3) DEFAULT NULL COMMENT '百分比完成度',  `memberid` int(11) DEFAULT NULL COMMENT '发起人的会员 id',  `createdate` varchar(19) DEFAULT NULL COMMENT '项目创建时间',  `follower` int(11) DEFAULT NULL COMMENT '关注人数',  `header_picture_path` varchar(255) DEFAULT NULL COMMENT '头图路径',  PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8


项目表项目详情图片表

CREATE TABLE `t_project_item_pic` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`projectid` int(11) DEFAULT NULL,
`item_pic_path` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8


项目发起人信息表

CREATE TABLE `t_member_launch_info` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `memberid` int(11) DEFAULT NULL COMMENT '会员 id',  `description_simple` varchar(255) DEFAULT NULL COMMENT '简单介绍',  `description_detail` varchar(255) DEFAULT NULL COMMENT '详细介绍',  `phone_num` varchar(255) DEFAULT NULL COMMENT '联系电话',  `service_num` varchar(255) DEFAULT NULL COMMENT '客服电话',  PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8


回报信息表

CREATE TABLE `t_return` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `projectid` int(11) DEFAULT NULL,  `type` int(4) DEFAULT NULL COMMENT '0 - 实物回报, 1 虚拟物品回报',  `supportmoney` int(11) DEFAULT NULL COMMENT '支持金额',  `content` varchar(255) DEFAULT NULL COMMENT '回报内容',  `count` int(11) DEFAULT NULL COMMENT '回报产品限额,“0”为不限回报数量',  `signalpurchase` int(11) DEFAULT NULL COMMENT '是否设置单笔限购',  `purchase` int(11) DEFAULT NULL COMMENT '具体限购数量',  `freight` int(11) DEFAULT NULL COMMENT '运费,“0”为包邮',  `invoice` int(4) DEFAULT NULL COMMENT '0 - 不开发票, 1 - 开发票',  `returndate` int(11) DEFAULT NULL COMMENT '项目结束后多少天向支持者发送回报',  `describ_pic_path` varchar(255) DEFAULT NULL COMMENT '说明图片路径',  PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8

发起人确认信息表

CREATE TABLE `t_member_confirm_info` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `memberid` int(11) DEFAULT NULL COMMENT '会员 id',  `paynum` varchar(200) DEFAULT NULL COMMENT '易付宝企业账号',  `cardnum` varchar(200) DEFAULT NULL COMMENT '法人身份证号',  PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8

逆向工程

生成的数据

各归各位

再建一个ProjectService、ProjectServiceImpl、ProjectProviderHandler

创建 VO 对象

ProjectVO、ReturnVO、MemberConfirmInfoVO、MemberLauchInfoVO

代码

配置文件

创建类

代码

Constants

新建类

代码

package com.xlgl.wzy.handler;
 
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
 
import javax.servlet.http.HttpSession;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
 
import com.xlgl.wzy.config.OSSProperties;
import com.xlgl.wzy.constant.Constants;
import com.xlgl.wzy.entity.vo.ProjectVO;
import com.xlgl.wzy.utils.CasUtils;
import com.xlgl.wzy.utils.ResultEntity;
 
 
@Controller
public class ProjectConsumerHandler {
 
@Autowired
private OSSProperties ossProperties;
 
@RequestMapping("/create/project/information")
public String saveProjectBasicInfo(
 
// 接收除了上传图片之外的其他普通数据
ProjectVO projectVO,
 
// 接收上传的头图
MultipartFile headerPicture,
 
// 接收上传的详情图片
List<MultipartFile> detailPictureList,
 
// 用来将收集了一部分数据的ProjectVO对象存入Session域
HttpSession session,
 
// 用来在当前操作失败后返回上一个表单页面时携带提示消息
ModelMap modelMap
) throws IOException {
 
// 一、完成头图上传
// 1.获取当前headerPicture对象是否为空
boolean headerPictureIsEmpty = headerPicture.isEmpty();
 
if(headerPictureIsEmpty) {
 
// 2.如果没有上传头图则返回到表单页面并显示错误消息
modelMap.addAttribute(Constants.ATTR_NAME_MESSAGE, Constants.MESSAGE_HEADER_PIC_EMPTY);
 
return "project-launch";
 
}
// 3.如果用户确实上传了有内容的文件,则执行上传
ResultEntity<String> uploadHeaderPicResultEntity = CasUtils.uploadFileToOss(
ossProperties.getEndPoint(),
ossProperties.getAccessKeyId(),
ossProperties.getAccessKeySecret(),
headerPicture.getInputStream(),
ossProperties.getBucketName(),
ossProperties.getBucketDomain(),
headerPicture.getOriginalFilename());
 
String result = uploadHeaderPicResultEntity.getResult();
 
// 4.判断头图是否上传成功
if(ResultEntity.SUCCESS.equals(result)) {
 
// 5.如果成功则从返回的数据中获取图片访问路径
String headerPicturePath = uploadHeaderPicResultEntity.getData();
 
// 6.存入ProjectVO对象中
projectVO.setHeaderPicturePath(headerPicturePath);
} else {
 
// 7.如果上传失败则返回到表单页面并显示错误消息
modelMap.addAttribute(Constants.ATTR_NAME_MESSAGE, Constants.MESSAGE_HEADER_PIC_UPLOAD_FAILED);
 
return "project-launch";
 
}
 
// 二、上传详情图片
// 1.创建一个用来存放详情图片路径的集合
List<String> detailPicturePathList = new ArrayList<String>();
 
// 2.检查detailPictureList是否有效
if(detailPictureList == null || detailPictureList.size() == 0) {
modelMap.addAttribute(Constants.ATTR_NAME_MESSAGE, Constants.MESSAGE_DETAIL_PIC_EMPTY);
 
return "project-launch";
}
 
// 3.遍历detailPictureList集合
for (MultipartFile detailPicture : detailPictureList) {
 
// 4.当前detailPicture是否为空
if(detailPicture.isEmpty()) {
 
// 5.检测到详情图片中单个文件为空也是回去显示错误消息
modelMap.addAttribute(Constants.ATTR_NAME_MESSAGE, Constants.MESSAGE_DETAIL_PIC_EMPTY);
 
return "project-launch";
}
 
// 6.执行上传
ResultEntity<String> detailUploadResultEntity = CasUtils.uploadFileToOss(
ossProperties.getEndPoint(),
ossProperties.getAccessKeyId(),
ossProperties.getAccessKeySecret(),
detailPicture.getInputStream(),
ossProperties.getBucketName(),
ossProperties.getBucketDomain(),
detailPicture.getOriginalFilename());
 
// 7.检查上传结果
String detailUploadResult = detailUploadResultEntity.getResult();
 
if(ResultEntity.SUCCESS.equals(detailUploadResult)) {
 
String detailPicturePath = detailUploadResultEntity.getData();
 
// 8.收集刚刚上传的图片的访问路径
detailPicturePathList.add(detailPicturePath);
} else {
 
// 9.如果上传失败则返回到表单页面并显示错误消息
modelMap.addAttribute(Constants.ATTR_NAME_MESSAGE, Constants.MESSAGE_DETAIL_PIC_UPLOAD_FAILED);
 
return "project-launch";
}
 
}
 
// 10.将存放了详情图片访问路径的集合存入ProjectVO中
projectVO.setDetailPicturePathList(detailPicturePathList);
 
// 三、后续操作
// 1.将ProjectVO对象存入Session域
session.setAttribute(Constants.ATTR_NAME_TEMPLE_PROJECT, projectVO);
 
// 2.以完整的访问路径前往下一个收集回报信息的页面
return "redirect:http:// localhost/project/return/info/page";
}
 
}

页面代码添加后,启动测试,出现的问题


缺少

写错

继续完成代码

Constants添加内容

ProjectPOMapper添加方法

ProjectPOMapper.xml添加

ReturnPOMapper添加

ReturnPOMapper.xml添加

<insert id="insertReturnPOBatch">
insert into t_return (
projectid,
type,
supportmoney,
content,
count,
signalpurchase,
purchase,
freight,
invoice,
returndate,
describ_pic_path
)
values
<foreach collection="returnPOList" item="returnPO" separator=",">
(
#{projectId},
#{returnPO.type},
#{returnPO.supportmoney},
#{returnPO.content},
#{returnPO.count},
#{returnPO.signalpurchase},
#{returnPO.purchase},
#{returnPO.freight},
#{returnPO.invoice},
#{returnPO.returndate},
#{returnPO.describPicPath}
)
</foreach>
</insert>

ProjectItemPicPOMapper添加

ProjectItemPicPOMapper.xml添加

MySQLRemoteService添加接口

ProjectService接口添加

接口实现

@Transactional(readOnly = true)
@Service
public class ProjectServiceImpl implements ProjectService {
@Autowired
private ReturnPOMapper returnPOMapper;
 
@Autowired
private MemberConfirmInfoPOMapper memberConfirmInfoPOMapper;
 
@Autowired
private MemberLaunchInfoPOMapper memberLaunchInfoPOMapper;
 
@Autowired
private ProjectPOMapper projectPOMapper;
 
@Autowired
private ProjectItemPicPOMapper projectItemPicPOMapper;
 
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
@Override
public void saveProject(ProjectVO projectVO, Integer memberId) {
 
// 一、保存ProjectPO对象
// 1.创建空的ProjectPO对象
ProjectPO projectPO = new ProjectPO();
 
// 2.把projectVO中的属性复制到projectPO中
BeanUtils.copyProperties(projectVO, projectPO);
 
// 修复bug:把memberId设置到projectPO中
projectPO.setMemberid(memberId);
 
// 修复bug:生成创建时间存入
String createdate = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
projectPO.setCreatedate(createdate);
 
// 修复bug:status设置成0,表示即将开始
projectPO.setStatus(0);
 
// 3.保存projectPO
// 为了能够获取到projectPO保存后的自增主键,需要到ProjectPOMapper.xml文件中进行相关设置
// <insert id="insertSelective" useGeneratedKeys="true" keyProperty="id" ……
projectPOMapper.insertSelective(projectPO);
 
// 4.从projectPO对象这里获取自增主键
Integer projectId = projectPO.getId();
 
// 二、保存项目、分类的关联关系信息
// 1.从ProjectVO对象中获取typeIdList
List<Integer> typeIdList = projectVO.getTypeIdList();
projectPOMapper.insertTypeRelationship(typeIdList, projectId);
 
// 三、保存项目、标签的关联关系信息
List<Integer> tagIdList = projectVO.getTagIdList();
projectPOMapper.insertTagRelationship(tagIdList, projectId);
 
// 四、保存项目中详情图片路径信息
List<String> detailPicturePathList = projectVO.getDetailPicturePathList();
projectItemPicPOMapper.insertPathList(projectId, detailPicturePathList);
 
// 五、保存项目发起人信息
MemberLauchInfoVO memberLauchInfoVO = projectVO.getMemberLauchInfoVO();
MemberLaunchInfoPO memberLaunchInfoPO = new MemberLaunchInfoPO();
BeanUtils.copyProperties(memberLauchInfoVO, memberLaunchInfoPO);
memberLaunchInfoPO.setMemberid(memberId);
 
memberLaunchInfoPOMapper.insert(memberLaunchInfoPO);
 
// 六、保存项目回报信息
List<ReturnVO> returnVOList = projectVO.getReturnVOList();
 
List<ReturnPO> returnPOList = new ArrayList<>();
 
for (ReturnVO returnVO : returnVOList) {
 
ReturnPO returnPO = new ReturnPO();
 
BeanUtils.copyProperties(returnVO, returnPO);
 
returnPOList.add(returnPO);
}
 
returnPOMapper.insertReturnPOBatch(returnPOList, projectId);
 
// 七、保存项目确认信息
MemberConfirmInfoVO memberConfirmInfoVO = projectVO.getMemberConfirmInfoVO();
MemberConfirmInfoPO memberConfirmInfoPO = new MemberConfirmInfoPO();
BeanUtils.copyProperties(memberConfirmInfoVO, memberConfirmInfoPO);
memberConfirmInfoPO.setMemberid(memberId);
memberConfirmInfoPOMapper.insert(memberConfirmInfoPO);
}
}

ProjectConsumerHandler添加方法

ProjectConsumerHandler添加方法

@Autowired
private MySQLRemoteService mySQLRemoteService;
 
@RequestMapping("/create/confirm")
public String saveConfirm(ModelMap modelMap, HttpSession session, MemberConfirmInfoVO memberConfirmInfoVO) {
 
// 1.从Session域读取之前临时存储的ProjectVO对象
ProjectVO projectVO = (ProjectVO) session.getAttribute(Constants.ATTR_NAME_TEMPLE_PROJECT);
 
// 2.如果projectVO为null
if(projectVO == null) {
throw new RuntimeException(Constants.MESSAGE_TEMPLE_PROJECT_MISSING);
}
 
// 3.将确认信息数据设置到projectVO对象中
projectVO.setMemberConfirmInfoVO(memberConfirmInfoVO);
 
// 4.从Session域读取当前登录的用户
MemberLoginVO memberLoginVO = (MemberLoginVO) session.getAttribute(Constants.ATTR_NAME_LOGIN_MEMBER);
 
Integer memberId = memberLoginVO.getId();
 
// 5.调用远程方法保存projectVO对象
ResultEntity<String> saveResultEntity = mySQLRemoteService.saveProjectVORemote(projectVO, memberId);
 
// 6.判断远程的保存操作是否成功
String result = saveResultEntity.getResult();
if(ResultEntity.FAILED.equals(result)) {
 
modelMap.addAttribute(Constants.ATTR_NAME_MESSAGE, saveResultEntity.getMessage());
 
return "project-confirm";
}
 
// 7.将临时的ProjectVO对象从Session域移除
session.removeAttribute(Constants.ATTR_NAME_TEMPLE_PROJECT);
 
// 8.如果远程保存成功则跳转到最终完成页面
return "redirect:http://localhost/project/create/success";
}
 
@ResponseBody
@RequestMapping("/create/save/return.json")
public ResultEntity<String> saveReturn(ReturnVO returnVO, HttpSession session) {
 
try {
// 1.从session域中读取之前缓存的ProjectVO对象
ProjectVO projectVO = (ProjectVO) session.getAttribute(Constants.ATTR_NAME_TEMPLE_PROJECT);
 
// 2.判断projectVO是否为null
if(projectVO == null) {
return ResultEntity.failed(Constants.MESSAGE_TEMPLE_PROJECT_MISSING);
}
 
// 3.从projectVO对象中获取存储回报信息的集合
List<ReturnVO> returnVOList = projectVO.getReturnVOList();
 
// 4.判断returnVOList集合是否有效
if(returnVOList == null || returnVOList.size() == 0) {
 
// 5.创建集合对象对returnVOList进行初始化
returnVOList = new ArrayList<>();
// 6.为了让以后能够正常使用这个集合,设置到projectVO对象中
projectVO.setReturnVOList(returnVOList);
}
 
// 7.将收集了表单数据的returnVO对象存入集合
returnVOList.add(returnVO);
 
// 8.把数据有变化的ProjectVO对象重新存入Session域,以确保新的数据最终能够存入Redis
session.setAttribute(Constants.ATTR_NAME_TEMPLE_PROJECT, projectVO);
 
// 9.所有操作成功完成返回成功
return ResultEntity.successWithoutData();
} catch (Exception e) {
e.printStackTrace();
 
return ResultEntity.failed(e.getMessage());
}
 
}
 
// JavaScript代码:formData.append("returnPicture", file);
// returnPicture是请求参数的名字
// file是请求参数的值,也就是要上传的文件
@ResponseBody
@RequestMapping("/create/upload/return/picture.json")
public ResultEntity<String> uploadReturnPicture(
 
// 接收用户上传的文件
@RequestParam("returnPicture") MultipartFile returnPicture) throws IOException {
 
// 1.执行文件上传
ResultEntity<String> uploadReturnPicResultEntity = CasUtils.uploadFileToOss(
ossProperties.getEndPoint(),
ossProperties.getAccessKeyId(),
ossProperties.getAccessKeySecret(),
returnPicture.getInputStream(),
ossProperties.getBucketName(),
ossProperties.getBucketDomain(),
returnPicture.getOriginalFilename());
 
// 2.返回上传的结果
return uploadReturnPicResultEntity;
}

ProjectProviderHandler添加方法

这个地方ProjectPOMapper.xml改了一下

WebMvcConfig添加

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码