慈善募捐系统的设计与实现

本文档详述了一个基于Java和SpringBoot开发的慈善募捐系统,利用区块链技术提升透明度和安全性。系统涵盖用户注册登录、求助、投票、物流追踪等功能,数据库设计包括用户、交互信息、求助信息等多个表。通过Vue框架进行前端开发,实现用户界面交互。系统集成MySQL数据库,利用存储过程优化业务逻辑,确保数据一致性。
摘要由CSDN通过智能技术生成

慈善募捐系统是针对慈善事业的统计,和大数据检索的分析,以及爬取网站慈善事业的功绩做的慈善数据的统计分析,针对各地的人文需求设计的一款公开的慈善募捐平台,将人们在进行慈善事业或发展的流程交于平台管理,可以解决传统存在的信任问题,使募捐的过程中实现可信、可控、可管,提高募捐过程的透明性、高效性、高安全性、隐私保密性。
本系统基于java语言开发,对外开放式接口模式
区块链是一种比较特殊的分布式数据库。分布式数据库就是将数据信息单独放在每台计算机,且存储的信息的一致的,如果有一两台计算机坏掉了,信息也不会丢失,你还可以在其他计算机上查看到。
区块链是一种分布式的,所以它是没有中心点的,信息存储在所有加入到区块链网络的节点当中,节点的数据是同步的。节点可以是一台服务器,笔记本电脑,手机等。
什么是区块链?从科技层面来看,区块链涉及数学、密码学、互联网和计算机编程等很多科学技术问题。从应用视角来看,简单来说,区块链是一个分布式的共享账本和数据库,具有去中心化、不可篡改、全程留痕、可以追溯、集体维护、公开透明等特点。这些特点保证了区块链的“诚实”与“透明”,为区块链创造信任奠定基础。区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。区块链(Blockchain),是比特币的一个重要概念,它本质上是一个去中心化的数据库,同时作为比特币的底层技术,是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一批次比特币网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块 。

一、系统开发与模块设计
1.1设计主要功能要点
主要实现系统功能设计,开发工具选择,功能模块设计和主要功能。
1.1.1、主要功能模块
实现用户注册、登录、上传图片功能;
实现用户求助功能;
实现用户投票功能;
实现系统分享功能;
实现慈善榜单;
实现查看物流功能;
实现受助者反馈信息功能。
1.1.2、开发工具选择
开发平台及工具:Intellij idea作为代码平台开发工具、采用MySQ数据库做持久层数据存储。Maven作为代码管理工具。
平台采用windows作为开发版平台,linux作为服务部署平台。
主要是用java目前最为流行的框架springboot作为开发架构,前端使用目前最热门的vue框架作为前端开发平台,同时给区块链模式提供更好的支持和展示。
1.1.2、数据库设计
数据库采用mysql数据库设计开发,user表实现用户存储,设计自增长id,设置主键,包括密码加密字段,状态字段,用户切换字段,用户图片信息等。(表1)

表 1
Server表记录交互逻辑,用户的操作信息,用户的数据信息,用户的内容摘要信息等,同时可以关联日志表,排名表的基础信息id字段。(表2)

表 2
用户求助中间表component,记录用户求助信息表和求助内容排行主题表,同时存储求助内容,求助明细和排行。(表三)

表 3
日志表show_log,日志表记录系统内的登录信息,浏览内容信息,用户求助投票分享信息,慈善地区地位信息,物流反馈功能信息,用户信息表日志表是系统内的整体监控,支撑前端日志板块展示信息,日志表的内容关联系统主要模块,几乎涉及到所用模块和功能,是系统开发和设计中不断完善的表结构和模块,同时又是开发时期最长的模块。(表4)
表 4
交互信息表db,开发量和占用模块最大的表之一,该功能记录了用户处理的业务信息,和各个模块展示的内容设计,主要存储servers层操作数据库时存储表逻辑和业务逻辑,此模块不作为展示内容,但在系统中起了比较关键的作用。(表5)

表 5
以上是数据库设计中比较重要的几个表的基本信息字段和描述,下图是展示建立的数据库表和名称汇总图数据。

表 6
2.1业务逻辑与功能设计
2.2.1页面布局设计
用户的登录注册是每个管理系统必不可少的模块,也是设计模块的门户,登录模块主要包括用户的注册,用户登录,验证等等。后端控制用户密码加密,sql的防止注入来完善登录模块的整体功能,并且返回前端验证消息,来通知前端用户的登录活注册成功并且进入网站门户的功能。详细见下图设计模块。

用户登录成功后进入界面主页,也是最丰富的功能页面,展示用户主题信息,慈善列表,大数据检索查询列表,也包括功能设置,用户信息管理订单,地域管理,地域名称管理,慈善地域地区排名等等。日志基础信息统计用户的访问量,用户浏览量,和用户在线数,同时对慈善订单系统进行统计,观测每日针对慈善榜单和针对慈善物品的需求分析,以便后期物流模块使用和计算陪选物流公司等等。

数据分析模块,此模块是根据系统和用户需求针对性直观的展示,分析图形魔板,按照天时月来计算魔板数量,用户能够清晰直观的看出用户的体验量,用户的操作量,折线图能够分析直观分析时段的趋势变化,饼图能够直观的分析数据源和数据使用量分析量测试流程量以及基本日志统计量,和用户的关注程度等等。

地域趋势图,根据中国地理图作为底层统计基础,并且是唯一一个分享公开模块,分享给用户观察地域信息,和订单发放量信息,以地域区域颜色做统计展示趋势变化魔板,后端使用json模式格式传送数据,匹配各地需求变化趋势等等。

同时系统当然也是必要的提供了很多基础信息列表,包括慈善地区性列表,用户列表,基础信息列表等等,支撑系统数据丰富和展示设计的必要性。

2.2.2数据库逻辑语句的编写
数据库安装与配置,配置本地系统访问的MySQL数据库,并且根据数据库基本信息参照本地文件配置,添加文件配置路径,和端口号设置等等。
[mysqld]
port=3306
basedir=C:\Program Files\MySQL
datadir=C:\Program Files\MySQL\Data
max_connections=200
max_connect_errors=10
character-set-server=utf8mb4
default-storage-engine=INNODB
#mysql_native_password
default_authentication_plugin=mysql_native_password
[mysql]
default-character-set=utf8mb4
[client]
port=3306
default-character-set=utf8mb4
表中增加字段文本设计,文件位置调整等。
1 add 增加在表尾. 2 change/modify 不该表字段位置. 3 修改字段可以带上以下参数进行位置调整(frist/after column_name); alter table emp change age age int(2) after ename; alter table emp change age age int(3) first;
在建立数据库表时都约定主键和唯一键,自增长建,进行更方便的存储和使用数据文本。
表关联与约束设计,唯一性约束即UNIQUE用于保证数据表中字段的唯一性,即表中字段的值不能重复出现,其基本的语法格式如下所示:
create table student04( id int, name varchar(20) unique );
外键约束即FOREIGN KEY常用于多张表之间的约束
create table student05( id int primary key, name varchar(20) );
create table class( classid int primary key, studentid int );
alter table class add constraint fk_class_studentid foreign key(studentid) references student(id);
建立外键是为了保证数据的完整和统一性。但是,如果主表中的数据被删除或修改从表中对应的数据该怎么办呢?很明显,从表中对应的数据也应该被删除,否则数据库中会存在很多无意义的垃圾数据。
create table student( id int, name varchar(30), age int, gender varchar(30) );
– 创建数用户库,给程序开放程序登录和进行数据库链接。
DROP DATABASE IF EXISTS mydb;
CREATE DATABASE mydb;
USE mydb;
建表语句,以user表为魔板进行建立user表内容,并且明确字段类型,字段属性,同时可以给字段添加注释等等。
– 创建user表
CREATE TABLE user(
sid CHAR(6),
sname VARCHAR(50),
age INT,
gender VARCHAR(50) DEFAULT ‘male’
);
建立基础数据,批量导入所需要的数据库字段数据。完成数据库的字段录入和魔板排列表使用。
– 向user表插入数据
INSERT INTO user(sid,sname,age,gender) VALUES (‘S_1001’, ‘lili’, 14, ‘male’);
INSERT INTO user(sid,sname,age,gender) VALUES (‘S_1002’, ‘wang’, 15, ‘female’);
INSERT INTO user(sid,sname,age,gender) VALUES (‘S_1003’, ‘tywd’, 16, ‘male’);
INSERT INTO user(sid,sname,age,gender) VALUES (‘S_1004’, ‘hfgs’, 17, ‘female’);
INSERT INTO user(sid,sname,age,gender) VALUES (‘S_1005’, ‘qwer’, 18, ‘male’);
INSERT INTO user(sid,sname,age,gender) VALUES (‘S_1006’, ‘zxsd’, 19, ‘female’);
INSERT INTO user(sid,sname,age,gender) VALUES (‘S_1007’, ‘hjop’, 16, ‘male’);
INSERT INTO user(sid,sname,age,gender) VALUES (‘S_1008’, ‘tyop’, 15, ‘female’);
INSERT INTO user(sid,sname,age,gender) VALUES (‘S_1009’, ‘nhmk’, 13, ‘male’);
INSERT INTO user(sid,sname,age,gender) VALUES (‘S_1010’, ‘xdfv’, 17, ‘female’);
以user表和员工信息表为示例存储。
DROP DATABASE IF EXISTS mydb;
CREATE DATABASE mydb;
USE mydb;

– 创建员工表
CREATE TABLE employee (
id int,
name varchar(50),
salary int,
departmentnumber int
);
– 向员工表中插入数据
INSERT INTO employee values(1,‘tome’,2000,1001);
INSERT INTO employee values(2,‘lucy’,9000,1002);
INSERT INTO employee values(3,‘joke’,5000,1003);
INSERT INTO employee values(4,‘wang’,3000,1004);
INSERT INTO employee values(5,‘chen’,3000,1001);
INSERT INTO employee values(6,‘yukt’,7000,1002);
INSERT INTO employee values(7,‘rett’,6000,1003);
INSERT INTO employee values(8,‘mujk’,4000,1004);
INSERT INTO employee values(9,‘poik’,3000,1001);
select count(*), departmentnumber from employee group by departmentnumber;
业务关联查新示例,查询是支撑系统运行和展示的关键语句,查询能包含复杂的业务逻辑和复杂的条件查询,查询速度的快慢不只是数据量多少,还跟查询的条件以及优化的方式有关。
//=, != select * from emp where deptno = (select deptno from dept where deptname=“技术部”); select * from emp where deptno != (select deptno from dept where deptname=“技术部”); //in, not in //当需要使用里面的结果集的时候必须用in(); select * from emp where deptno in (select deptno from dept where deptname=“技术部”); select * from emp where deptno not in (select deptno from dept where deptname=“技术部”); //exists , not exists //当需要判断后面的查询结果是否存在时使用exists(); select * from emp where exists (select deptno from dept where deptno > 5); select * from emp where not exists (select deptno from dept where deptno > 5);
数据库操作中还是用了大量的mysql存储过程,存储过程的优势有
A、 存储过程允许标准组件式编程
存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。
B、 存储过程能够实现较快的执行速度
    如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T-SQL语句每次运行都需要预编译和优化,所以速度就要慢一些。
C、 存储过程减轻网络流量
对于同一个针对数据库对象的操作,如果这一操作所涉及到的T-SQL语句被组织成一存储过程,那么当在客户机上调用该存储过程时,网络中传递的只是该调用语句,否则将会是多条SQL语句。从而减轻了网络流量,降低了网络负载。
 D、 存储过程可被作为一种安全机制来充分利用
系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,保证数据的安全。
使用基本程序示例:
DELIMITER //
CREATE PROCEDURE pro_withdraw()
COMMENT ‘=—’
BEGIN
DECLARE Done INT DEFAULT 0
DECLARE serverOrder VARCHAR(50);
DECLARE wstatus VARCHAR(10);
DECLARE failRe VARCHAR(200);
DECLARE mbn VARCHAR(50);
DECLARE orderList CURSOR FOR SELECT serverFlow,withdrawStatus,failReason,merBillNo from withdraw_balance where status=‘0’;
DECLARE CONTINUE HANDLER FOR SQLSTATE ‘02000’ SET Done = 1;
OPEN orderList;
FETCH NEXT FROM orderList INTO serverOrder,wstatus,failRe,mbn;
REPEAT
IF NOT Done THEN
start transaction;
IF wstatus=‘F1’ THEN
update withdraw_confirm set status = -1 ,respCode=‘100000’,summary=failRe where serverFlow=serverOrder and status =‘1’;
Update user_withdraw set accept_result=‘N’,accept_summary=failRe,opt_user=‘balance’ where order_id=mbn;
Update account_confirm set enable=-1 where serverFlow = serverFlow and enable=‘1’ and trade_classify=‘cash’;
END IF;
update  withdraw_balance set status =1 where serverFlow=serverOrder and status=0;
END IF;
commit;
FETCH NEXT FROM orderList INTO serverOrder,wstatus,failRe,mbn;
UNTIL Done END REPEAT;
CLOSE orderList;
END
DELIMITER ;
2.2.3java后端设计编写
后端java代码采用springboot矿建开发,采用springboot的优势是快速创建独立运行的Spring项目以及与主流框架集成,使用嵌入式的Servlet容器,应用无需打成WAR包,starters自动依赖与版本控制,大量的自动配置,简化开发,也可以修改默认值,无需配置XML,无代码生成,开箱即用,准生产环境的运行时应用监控,与云计算的天然集成,同时采用微服务形势微服务是一种架构风格,可以理解成小型服务,这些服务通过HTTP的方式进行互通。微服务并没有一个官方的定义,想要直接描述微服务比较困难,我们可以通过对比传统WEB应用,来理解什么是微服务,传统的应用成为“单体应用”
单体应用就是那种,核心分为业务逻辑、适配器以及API或通过UI访问的WEB界面。业务逻辑定义业务流程、业务规则以及领域实体。适配器包括数据库访问组件、消息组件以及访问接口等,所有的这些东西都集成在一起,看着很强大,其实很乱。
而微服务架构有很多重要的优点,它解决的就是复杂性问题。它将单体应用分解为一组服务。虽然功能总量不变,但应用程序已被分解为可管理的模块或服务。这些服务定义了明确的RPC或消息驱动的API边界。微服务架构强化了应用模块化的水平,而这通过单体代码库很难实现。因此,微服务开发的速度要快很多,更容易理解和维护。
Jdk选用的是1.8并且由maven来进行构建项目

<?xml version="1.0" encoding="UTF-8"?>


4.0.0


org.springframework.boot
spring-boot-starter-parent
2.1.1.RELEASE


com.microservice
hello
0.0.1-SNAPSHOT
hello
Demo project for Spring Boot

<properties>
    <java.version>1.8</java.version>
</properties>

<dependencies>
	<!--  这里使用到Web 所以引入了web starter,版本号由于在上面的parent中已包含 dependency-management,所以不需要指定 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

<!-- 测试相关依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <!--  创建可执行jar -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
初始化程序入口; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class DemoApplication {
public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
}

@GetMapping("/hello")
public String hello(@RequestParam(value = "name", defaultValue = "World") String name) {
    return String.format("Hello %s!", name);
}

}
配置文件编写:

端口号

server.port=8080

true开启调试模式,日志模式降为debug级别 默认false不开启

debug=true

应用上下文

server.servlet.context-path=/SpringBootDemo

默认字符集编码

spring.http.encoding.charset=UTF-8
整合实体层
@Configuration
public class JfinalActiveRecordPluginConfig {
/** 记录是否已经初始化了 /
public boolean is_init = false;
/
* 数据库整体连接情况 */
public boolean is_conn = false;

public  void configEngine(ActiveRecordPlugin arp){
    //设置之后可以直接在sql文件中使用isBlank、notBlank等命令
    Engine me = arp.getSqlKit().getEngine();
    me.addSharedMethod(new com.jfinal.kit.StrKit());
}
@Bean
public  void init(){
    if(is_init){
        return;
    }
    /** -----第一个数据源配置开始----- */
    String alias = "ds1";
    DruidPlugin ds1 = new DruidPlugin(
            "jdbc:mysql://localhost:3306/travelsystame?useUnicode=true&characterEncoding=UTF8&useSSL=false",
            "root",
            "123456",
            "com.mysql.jdbc.Driver");
    //ds1.setValidationQuery("select 1 from dual");
    ds1.start();
    // 配置ActiveRecord插件
    ActiveRecordPlugin arp1 = new ActiveRecordPlugin(alias,ds1);
    arp1.setShowSql(false);
    arp1.setDialect(new MysqlDialect());
    configEngine(arp1);
    arp1.start();
    /** -----第一个数据源配置结束----- */
    is_init = true;
    checkConn();
}
public  boolean checkConn(){
    String sql = "select 1";
    try {
        Db.use("ds1").find(sql);
        System.out.println("数据库连接正常");
        is_conn = true;
    } catch (Exception e) {
        is_conn = false;
        System.out.println("数据库连接异常");
    }
    return is_conn;
},

文件上传入口:
public void upload(){
try {
UploadFile file = getFile();
System.out.println("--------file--------");
File delfile = new File(file.getUploadPath()+"\"+file.getFileName());
System.out.println("=========="+delfile.getPath());
setAttr(“info”, true);
Map<String ,String> map = new HashMap<String, String>();
map.put(“filePath”, delfile.getPath());
map.put(“fileSize”, delfile.length()/1024+"");
setAttr(“data”, map);
} catch (Exception e) {
e.printStackTrace();
setAttr(“info”, “文件上传失败”);
}
renderJson();
}
登录逻辑处理,登陆模板采用魔板基础板块,使用springboot中的控制语句业务处里controller进行处理数据,完成参数接收和数据库信息验证,完成登录功能。
@RequestMapping("/login")
public String getLogin(HttpServletRequest request){
boolean flages = true;
Record record = new Record();
String userid = request.getParameter(“userid”);
String password = request.getParameter(“password”);
System.out.println(userid+"```");
Map<String,Boolean> map = new HashMap<>();
try {
record = Db.findFirst(“SELECT * FROM USER WHERE USERID=’”+userid+"’ AND PASSWORD=’"+password+"’");
if (record == null){
flages = false;
}else{
flages = true;
}
map.put(“info”,flages);
}catch (Exception e){
e.printStackTrace();
}finally {
if (flages) {
return “index”;
} else {
return “密码错误”;
}
}
}
前端代码编写,前段主要采用vue框架进行编写,能够快速生成接口采集和接口模式进行开发和设计,编写内容,同时vue又是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
var getChildrenTextContent = function (children) { return children.map(function (node) { return node.children ? getChildrenTextContent(node.children) : node.text }).join(’’) } Vue.component(‘anchored-heading’, { render: function (createElement) {    // 创建 kebab-case 风格的 ID   var headingId = getChildrenTextContent(this.KaTeX parse error: Undefined control sequence: \W at position 41: …se() .replace(/\̲W̲+/g, '-') .repl…)/g, ‘’) return createElement( ‘h’ + this.level, [ createElement(‘a’, { attrs: { name: headingId, href: ‘#’ + headingId } }, this.$slots.default) ] ) }, props: { level: { type: Number, required: true } } })

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值