基于SpringBoot的公益慈善平台

news2024/12/23 6:09:22

✌全网粉丝20W+,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌

🍅文末获取项目下载方式🍅


一、项目背景介绍:

基于SpringBoot的公益慈善平台是一款致力于为社会所有人带来便利服务的B/S架构的应用程序。随着网络技术的发展,公益慈善网站已经逐渐成为公益行动的主要信息载体。在这个平台上,主要有管理员、捐赠者和志愿者三种角色,他们各自拥有不同的权限和功能。

管理员作为平台的运营者,主要负责管理整个平台的运行情况,包括用户信息管理、项目管理等。而捐赠者则是为公益事业做出贡献的人,他们可以浏览平台上的各种公益项目,并选择自己感兴趣的项目进行捐赠。此外,他们还可以在平台上查看自己的捐赠记录和捐赠的项目进展情况。

志愿者是公益事业的重要推动力,他们在平台上可以找到自己感兴趣的志愿者活动,并进行报名参与。同时,他们也可以在平台上查看自己的志愿服务记录和参与的活动信息。

在技术实现上,该平台采用了SpringBoot整合Mybatis、Redis等主流开发技术,以提供高效、稳定的服务。此外,还整合了支付宝支付、websocket聊天室等功能,为用户提供更便捷的操作体验。

二、项目技术简介:

  1. JAVA:Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
  2. SpringBoot:Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
  3. Mybatis:MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。
    iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)。
  4. Spring-Mvc:Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框。
  5. Bootstrap:Bootstrap是美国Twitter公司的设计师Mark Otto和Jacob Thornton合作基于HTML、CSS、JavaScript 开发的简洁、直观、强悍的前端开发框架,使得 Web 开发更加快捷。Bootstrap提供了优雅的HTML和CSS规范,它即是由动态CSS语言Less写成。Bootstrap一经推出后颇受欢迎,一直是GitHub上的热门开源项目,包括NASA的MSNBC(微软全国广播公司)的Breaking News都使用了该项目。 国内一些移动开发者较为熟悉的框架,如WeX5前端开源框架等,也是基于Bootstrap源码进行性能优化而来。
  6. Html:HTML的全称为超文本标记语言,是一种标记语言。它包括一系列标签.通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字,图形、动画、声音、表格、链接等。
    超文本是一种组织信息的方式,它通过超级链接方法将文本中的文字、图表与其他信息媒体相关联。这些相互关联的信息媒体可能在同一文本中,也可能是其他文件,或是地理位置相距遥远的某台计算机上的文件。这种组织信息方式将分布在不同位置的信息资源用随机方式进行连接,为人们查找,检索信息提供方便。

三、系统功能模块介绍:

功能模块图

四、数据库设计:

1:article(article)

字段名类型默认值列注释
idintNULL文章ID
user_idintNULL作者用户ID
titlevarcharNULL文章标题
contentlongtextNULL文章正文
statusintNULL文章状态:发布(1),回收站(2)
read_countintNULL阅读量
imgvarcharNULL封面图片
typeintNULL类型:文章由普通用户发布(1),活动由管理员发表(2)
is_checkedintNULL文章审核,0:未审核,1:审核通过,2:审核不通过
infovarcharNULL审核未通过返回的消息
gmt_createdatetimeNULL数据插入时间,即发布时间
gmt_modifieddatetimeNULL更新时间

2:article_activity(article_activity)

字段名类型默认值列注释
idintNULL主键ID
article_idintNULL文章的ID
activity_article_idintNULL活动文章的ID
gmt_createdatetimeNULL插入数据的时间
gmt_modifieddatetimeNULL更新的时间

3:certification(certification)

字段名类型默认值列注释
idintNULL主键ID
user_idintNULL用户ID
namevarcharNULL机构名称
leader_namevarcharNULL领导者姓名
id_cardvarcharNULL领导者身份证号码
typevarcharNULL机构类型
show_namevarcharNULL认证称号(XXX官方账户)
prove_imgvarcharNULL单位证明/营业执照图片地址
id_card_img0varcharNULL领导者身份证照片(反面)
id_card_img1varcharNULL领导者身份证照片(正面)
is_checkedintNULL审核(0),成功(1),失败(2)
infovarcharNULL认证未通过返回的消息
gmt_createdatetimeNULL插入数据的时间
gmt_modifieddatetimeNULL更新的时间

4:comment(comment)

字段名类型默认值列注释
idintNULL主键ID
user_idintNULL发表评论用户的ID
user_namevarcharNULL用户名
imgvarcharNULL用户头像地址
target_idintNULL目标ID:可以是项目ID 、文章ID
typeintNULL类型:项目(1),文章(2)
contentvarcharNULL评论内容
reply_idintNULL回复评论的ID
is_firstintNULL是否置顶:置顶(1),不置顶(0)
gmt_createdatetimeNULL插入数据的时间,即发表评论的时间
gmt_modifieddatetimeNULL更新的时间

5:feedback(feedback)

字段名类型默认值列注释
idintNULL主键ID
user_idintNULL反馈的用户的ID
user_namevarcharNULL用户名
imgvarcharNULL用户头像地址
contentvarcharNULL评论内容
gmt_createdatetimeNULL插入数据的时间,即发表评论的时间
gmt_modifieddatetimeNULL更新的时间

6:link(link)

字段名类型默认值列注释
idintNULL主键ID
namevarcharNULL名称
target_urlvarcharNULL链接地址
typeintNULL类型:顶部菜单(1),友情链接(2)
gmt_createdatetimeNULL插入数据的时间
gmt_modifieddatetimeNULL更新的时间

7:message(message)

字段名类型默认值列注释
idintNULL主键ID
receive_user_idintNULL接收消息的用户ID
sent_user_idintNULL发送消息的用户ID
typeintNULL类型:项目评论(1)/文章评论(2)/审核 (3)
target_idintNULL目标ID:公益项目/文章ID
titlevarcharNULL标题
contentvarcharNULL消息的内容
is_readintNULL是否已读:未读(0),已读(1)
gmt_createdatetimeNULL插入数据的时间,即发表评论的时间
gmt_modifieddatetimeNULL更新的时间
sent_user_imgvarcharNULL发送消息的用户头像

8:message_board(message_board)

字段名类型默认值列注释
idintNULL主键ID
namevarcharNULL昵称
emailvarcharNULL邮件地址
contentvarcharNULL留言内容
gmt_createdatetimeNULL插入数据的时间
gmt_modifieddatetimeNULL更新的时间

9:project(project)

字段名类型默认值列注释
idintNULL主键ID
namevarcharNULL名称
backgroundvarcharNULL背景
targetvarcharNULL目的
themevarcharNULL主题
sponsorvarcharNULL赞助
contentlongtextNULL内容
imgvarcharNULL公益项目的封面
gmt_createdatetimeNULL插入数据的时间
gmt_modifieddatetimeNULL更新的时间

10:user(user)

字段名类型默认值列注释
idintNULL主键ID
namevarcharNULL姓名
passwordvarcharNULL密码
emailvarcharNULL邮箱地址
phonecharNULL手机号码
addressvarcharNULL地址
sexintNULL性别:女(0)男(1)
birthdaydateNULL出生年月
careervarcharNULL职业
certification_idintNULL认证类型ID
imgvarcharNULL头像地址
statusintNULL状态:正常(0),封禁(1)
gmt_createdatetimeNULL注册时间
gmt_modifieddatetimeNULL最近更新
roleintNULL角色:普通用户(0)管理员(1)

五、功能模块:

  1. 系统主页:浏览系统主页、留言、浏览公益项目、浏览平台活动、浏览求助文章,每次浏览都会累积访问量

    系统主页

  2. 用户登录注册:填写用户信息进行账号注册(邮箱验证码)、使用邮箱密码进行登录、忘记密码(邮箱验证码并重置)、退出登录

    用户登录注册

  3. 公益项目:包括项目标题、内容(Markdown)、封面、背景、主题、目的、赞助

    公益项目

  4. 平台活动:

    平台活动

  5. 留言:

    留言

  6. 普通用户后台:| 仪表盘 | 数据统计、最新活动、最新求助文章 |
    | ---------- | ------------------------------------------------------------ |
    | 求助文章 | 标题、编写求助文章(Markdown编辑器)、上传封面、关联平台活动、文章搜索、重新编辑 |
    | 审核队列 | 等待审核、已审核 |
    | 文章回收站 | 删除文章后自动加入回收站,可再次删除、移出回收站 |
    | 评论管理 | 置顶评论、删除评论、查询详情 |
    | 通知消息 | 查看消息、全部已读 |

    普通用户后台

  7. 管理员用户管理:

    管理员用户管理

  8. 管理员公益项目发布:

    管理员公益项目发布

  9. 管理员认证审核:

    管理员认证审核

  10. 管理员评论管理:

    ### 管理员评论管理

六、代码示例:

 /**
     * 发布求助文章
     */
    @PostMapping("/publishArticle")
    @ResponseBody
    public String publishArticle(String title, String content, String imgPath, Integer activityId) {
        // 生成文章对象
        Article article = Article.builder()
                .title(title).content(content).userId(loginUser.getId())
                .type(TypeStatus.ARTICLE).readCount(0).status(TrashStatus.NOT_IN).isChecked(CheckStatus.WAIT)
                .gmtCreate(new Date()).gmtModified(new Date())
                .build();
        // 为文章设置封面,如果为空就生成随机封面
        article.setImg(StringUtils.isEmpty(imgPath) ? OssUtils.getRandomFace() : imgPath);
        if (articleService.insert(article)) {
            if (activityId != -1) {
                articleService.insertArticleActivity(article.getId(), activityId);
                logger.info("【成功】:添加文章活动");
            }
            result.setCode(200);
            logger.info("【成功】:添加文章");
        } else {
            result.setCode(500);
            logger.info("【失败】:添加文章");
        }
        return JSONObject.toJSONString(result);
    }

    /**
     * 更新文章
     */
    @PostMapping("/updateArticle")
    @ResponseBody
    public String updateArticle(Integer id, String title, String content, String imgPath, int activityId) {
        // 生成文章对象
        Article article = Article.builder()
                .id(id).title(title).content(content).status(TrashStatus.NOT_IN).isChecked(CheckStatus.WAIT)
                .gmtModified(new Date())
                .build();
        // 为文章设置封面,如果为空就生成随机封面
        article.setImg(StringUtils.isEmpty(imgPath) ? OssUtils.getRandomFace() : imgPath);
        if (articleService.update(article)) {
            if (activityId != -1) {
                // 获取原来参加的活动
                Article activity = articleService.getActivityByArticleId(id);
                if (activity == null || activity.getId() != activityId) {
                    // 删除参与的活动
                    articleService.deleteArticleActivity(id);
                    // 添加新的活动
                    articleService.insertArticleActivity(article.getId(), activityId);
                    logger.info("【成功】:更新文章活动");
                }
            }
            result.setCode(200);
            logger.info("【成功】:更新文章");
        } else {
            result.setCode(500);
            logger.info("【失败】:更新文章");
        }
        return JSONObject.toJSONString(result);
    }

    /**
     * 将文章移到回收站
     */
    @GetMapping("/putIntoTrash")
    public String putIntoTrash(@RequestParam("id") Integer id, @RequestParam("checked") Integer checked) {
        // 获取文章
        Article article = articleService.getById(id);
        if (article.getType() == TypeStatus.ACTIVITY) {
            logger.info("【失败】:将文章移到回收站,类型错误");
            return "error/400";
        }
        if (article.getUserId() != loginUser.getId()) {
            logger.info("【失败】:将文章移到回收站,无权限");
            return "error/401";
        }
        article.setStatus(TrashStatus.IS_IN);
        if (articleService.update(article)) {
            logger.info("【成功】:将文字移到回收站");
        } else {
            logger.info("【失败】:将文字移到回收站");
        }
        return "redirect:/my-articles?checked=" + checked;
    }

七、项目总结:

之前在教材内容读书过程中开发设计技术专业知识,对研究过程的认知,对开发设计设计课程学习,及其如何有效开展系统的市场分析和设计。老师还选了更具有标志性管理方案系统来解读教学过程,课下安排工作使们进行练习。在这段时间,老师还应当掌握系统地完成和测试。应对餐厅点餐管理系统的开发,的脑海里的确有一个清晰的认知。在系统制做及配套文本文件撰写中,按照软件开发流程一步步做好本职工作。

从系统的角度看,依据餐厅点餐管理系统生产,其艰难在于功能清楚、系统构造设计、设计使用性能数据库系统、挑选核心技术进行系统功能等,这种都是自己的难题。针对这一艰难,实行了一些防范措施。当也不知道系统的功能时,在网上找到很多相似的系统,做好记录了一些系统的一般功能,并用了这一系统的高效功能的一部分。除此之外,在在网络上得到了很多关于系统设计的前提知识,包含系统模块划分、设计规范、数据库表的设计和创建,及其程序流程编码的专业技能知识,包含撰写与使用数据和信息加上、删掉和变更编码控制器。在系统序号进行相关功能后,认真的试了系统中所有功能,最后发现自己研发的系统符合规定,能接受。系统功能与系统剖析设计高度一致,系统质量稳定。为应对客户的实际操作不正确,还设有不恰当反馈机制,系统性能稳定。唯一的最大的缺点是系统数据报表的设计不健全,字段名称相匹配的引用类型不正确,一部分系统编码很多地方并没有注解,编码不足简易。

从文本文件的角度看,依据基于SpringBoot的公益慈善平台生产后,应叙述生产过程的需求,包含怎样进行数据分析报告、怎样进行系统设计及其系统功能的具体运作实际效果。在这期间,用了接近一个月的时间来做。要实现院校标准化的文档排版标准,多次在老师的建议下学习办公软件使用和排版设计设计。坚持就是收益。经过长时间的的撰写和优化,的文档终于完成。

总而言之,尽管制做经历了太多阶段,但如果认真完成这件事情,们将在每一个环节得到许多知识,在每一个环节的操作过程中锻练们自己的实践技能。根据该项目的制做,开始明白,许多知识不但来源于书籍,来源于教师在课堂教学中讲的知识,还来源于各种网络学习平台和社会实践。到现在为止,将继续努力,维持新知识的深入学习习惯性

八、源码获取:

大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻获取项目下载链接,博主联系方式👇🏻👇🏻👇🏻

链接点击直达:下载链接

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

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

相关文章

【上海大学数字逻辑实验报告】三、组合电路(二)

一、实验目的 掌握8421码到余3码的转换。掌握2421码到格雷码的转换。进一步熟悉组合电路的分析和设计方法。学会使用Quartus II设计8421码到余3码的转换电路逻辑图。学会使用Quartus II设计2421码到格雷码的转换电路逻辑图。 二、实验原理 8421码是最常用的BCD码&#xff0c…

YOLOv5算法进阶改进(7)— 将主干网络SPPF更换为SimSPPF / SPP-CSPC / SPPF-CSPC

前言:Hello大家好,我是小哥谈。SimSPPF是YOLOv6中提出的一种改进的空间金字塔池化方法,它是SPPF的升级版。SimSPPF通过在不同尺度上使用不同大小的池化核来提取特征,从而提高了检测器的性能。与SPPF相比,SimSPPF可以在不增加计算成本的情况下提高检测器的性能。本节课就教…

Nacos源码解读01——服务注册

Nacos 2.0 架构设计及新模型 参考 https://zhuanlan.zhihu.com/p/344572647 使用GRPC注册临时实例流程图 SpringBoot自动注入 注入对应服务注册的Bean 监听Tomcat启动事件 NacosAutoServiceRegistration 继承了AbstractAutoServiceRegistration 而 AbstractAutoServiceR…

Oracle忘记所有密码怎么办

最近遇到一个Oracle的问题,密码要过期了,但是除了用户密码,其他密码都不知道了,修改不了密码怎么办呢? 试了各种方法,最终下面的方式生效了: 首先,使用orapwd生成新的密码文件&…

NIO网络编程

Netty学习之NIO基础 - Nyimas Blog 1、阻塞 阻塞模式下,相关方法都会导致线程暂停 ServerSocketChannel.accept 会在没有连接建立时让线程暂停SocketChannel.read 会在通道中没有数据可读时让线程暂停阻塞的表现其实就是线程暂停了,暂停期间不会占用 c…

说一说Java中的JUC

JUC 1.什么是JUC 2.进程和线程 进程 : cpu资源分配的最小单位 线程 : cpu调度和执行的最小单位 并发是指多个任务在同一个时间段内交替执行,通过时间片轮转等方式实现任务间的切换。换句话说,并发是指多个任务能够同时存在,但不一定同时…

树和二叉树的基本概念和堆的实现

树的概念及结构 树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 1.有一个特殊的结点&#…

深度学习 -- 卷积神经网络

1、卷积神经网络的结构 大卫休伯尔( David Hunter Hubel ) 等人研究发现,猫的视皮层上 存在简单细胞( simple cell )和复杂细胞( complex cell ),简单细胞会对 感受野中特定朝向的线段做出反应,而复杂细胞对于特定朝向的钱段移动也能做出反应…

使用mybatis-plus框架:@Autowired报错Could not autowire. No beans of ‘XXX‘ type found

使用mybatis-plus框架,使用xxmapper报错: 解决办法是:在mapper中添加注解: Repository Mapper 也可以使用 AutowiredSysRoleMenuService sysRoleMenuService;替代 AutowiredSysRoleMenuMapper sysRoleMenuMapper;方法名不同,但…

工业机器视觉megauging(向光有光)使用说明书(十三,资源发现bug,已经更新)

megauging(向光有光)旧资源有bug,已经更新,如下: 第一工具,combox默认0,选择后,鼠标点击“获取结果”,相机就取一帧图像处理后显示出来: 第一工具&#xff0…

计算机网络之网络传输,三次握手和四次挥手

网络传输通过高低电压 流 基本类型数组 低电压转高电压,通过网卡 传输模式: 全双工:互相传输且能同时传输 半双工:互相传输但是不能同时传输 单工:单向传输,(键盘,显示器&#…

LIN TP

LIN总线为了解决多帧场景,也像CAN一样有TP协议。 主机发送请求PDU,从机发送应答PDU。 分为单帧(Single Frame,SF)、首帧(First Frame,FF)和续帧(Consecutive Frames,CF)三种。 PDU结构 包含节点地址(NAD)、协议控制…

C语言-预处理与库

预处理、动态库、静态库 1. 声明与定义分离 一个源文件对应一个头文件 注意&#xff1a; 头文件名以 .h 作为后缀头文件名要与对应的原文件名 一致 例&#xff1a; 源文件&#xff1a;01_code.c #include <stdio.h> int num01 10; int num02 20; void add(int a, in…

08-中介者模式-C语言实现

中介者模式&#xff1a; Define an object that encapsulates how a set of objects interact.Mediator promotes loose coupling by keeping objects from referring to each other explicitly,and it lets you vary their interaction independently.&#xff08;用一个中介对…

【Python3】【力扣题】383. 赎金信

【力扣题】题目描述&#xff1a; 题解&#xff1a; 两个字符串ransomNote和magazine&#xff0c;ransomNote中每个字母都在magazine中一一对应&#xff08;顺序可以不同&#xff09;。 即分别统计两个字符串中每个字母出现的次数&#xff0c;ransomNote中每个字母的个数小于等…

分享83个节日PPT,总有一款适合您

分享83个节日PPT&#xff0c;总有一款适合您 83个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1xX4tVpl3sSW-d2nlFzN-mg?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

openGauss学习笔记-137 openGauss 数据库运维-例行维护-检查和清理日志

文章目录 openGauss学习笔记-137 openGauss 数据库运维-例行维护-检查和清理日志137.1 检查操作系统日志137.2 检查openGauss运行日志137.3 清理运行日志 openGauss学习笔记-137 openGauss 数据库运维-例行维护-检查和清理日志 日志是检查系统运行及故障定位的关键手段。建议按…

R语言实验三

1、读取一个文件并进行如下操作。 ①使用命令清空工作空间&#xff0c;使用read.table读取exam_1.txt文件&#xff0c;将文件保存到data变量中&#xff0c;数据第一行设置为列名&#xff0c;第一列是行名。 ②判断对象data是否为矩阵。 ③将对象转换为矩阵&#xff0c;记为d…

pyqt5使用pyqtgraph实现动态热力图

pyqt5使用pyqtgraph实现动态热力图 一、效果图 二、流程 1、打开Designer创建一个UI界面 2、把UI转成py 3、创建一个main.py文件 4、在main文件中渲染画布、创建初始数据、画热力图、创建更新数据线程、绑定按钮触发事件三、UI界面 其中h_map.py代码如下: # -*- coding: ut…

【多线程】-- 09 线程同步之三大不安全案例举例

多线程 6 线程同步 “多个线程操作同一个资源” 处理多线程问题时&#xff0c;多个线程访问同一个对象&#xff0c;并且某些线程还想修改这个对象&#xff0c;这时候就需要线程同步。线程同步其实就是一种等待机制&#xff0c;多个需要同时访问此对象的线程进入这个对象的等…