Java Web财务信息管理系统

版权声明:欢迎转载,转载请注明原博客网址 https://blog.csdn.net/qq_37497322/article/details/83029390

数据库课设,然后想了一会就写了,写的比较简单,用的是SpringMVC+Mybatis,前端不是很厉害的我使用Jquery+Bootstarp+JSP来做视图层(在全栈的路上越行越远),下面是从报告里摘录中的一些东西:

系统功能模块图:

E-R图

使用的数据库是mysql,数据库名称为finance,使用UTF-8编码。

数据表信息:

(1)login

id:主键,登录账号。

pwd:登录密码。

(2)tab

id:与login表中的id连接的外键。

tab_no:主键自增,表的编号。

tab_name:表名。

(3)Info

tab_no:信息所属表的编号,与tab表中的tab_no连接的外键,级联修改,删除。

Info_no:信息的编号,主键自增。

id:与login表中的id连接的外键。

tab_name:与tab中相对应的表名。

amount:交易金额。

dat:交易日期。

detail:交易明细备注,选填。

表1 账号信息login

属性名

含义

类型

说明

id

登录账号

varchar

主键,最长长度为20

pwd

登录密码

varchar

非空,最长长度为20

2报表信息表tab

属性名

含义

类型

说明

tab_no

表单编号

int

主键,自增

id

登录账号

varchar

外键,最长长度为20

tab_name

报表名称

varchar

非空,最长长度为20

表3表内信息表info

属性名

含义

类型

说明

tab_no

表单编号

int

外键

id

登录账号

varchar

外键,最长长度为20

tab_name

报表名称

varchar

非空,最长长度为20

Info_no

信息编号

int

主键,自增

amount

交易金额

double

10位,小数点后2位

dat

交易日期

date

格式yyyy-mm-dd

detail

交易备注

varchar

最长长度为100

创建数据库脚本:

CREATE DATABASE IF NOT EXISTS finance DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

use finance

create table login

(

id varchar(20) not null primary key,

pwd varchar(20) not null 

)engine innodb default charset=utf8;

create table tab

(

id varchar(20)not null,

tab_no int primary key auto_increment,

tab_name varchar(20),

foreign key(id) references login(id)

)engine innodb default charset=utf8;

create table info

(

tab_no int,

info_no int primary key auto_increment,

id varchar(20),

tab_name varchar(20) not null,

amount double(10,2) default 0,

dat date,

detail varchar(100),

foreign key(id) references login(id),

foreign key(tab_no) references tab(tab_no) on delete cascade on update cascade

)engine innodb default charset=utf8;

项目文件基本框架:

概述:

controller包存放MVC框架中的控制器类,处理请求拦截,调用服务,页面跳转的作用。

dao包存放与数据库操作相关的类。

entity包存放实体类,也是POJO类,只有其对应的属性和get,set方法。

service包存放所进行的服务类。

resources中存放项目相关的Mybatis配置文件。

webapp中css,js,img为jsp中要用到的静态资源,jsp中存放着jsp页面,spring-servlet.xml为springMVC 的配置文件

核心代码:

(1)service包中Finance类:存放与主页效果的业务代码.

@Service
public class Finance {
    public static Reaction adjPWd(String id,String bpwd,String npwd)//修改密码
    {
        Reaction reaction=new Reaction();
        if(bpwd.equals(LoginDao.checkLogin(id)))
        {
            Login login=new Login();
            login.setId(id);
            login.setPwd(npwd);
            LoginDao.updatePwd(login);
            reaction.setTag(0);
            reaction.setWords("密码修改成功!");
        }
        else
        {
            reaction.setTag(1);
            reaction.setWords("密码修改失败,原密码不正确");
        }
        return reaction;
    }
    public static void deleteTable(Integer table_no)//删除报表
    {
        TabDao.deleteTab(table_no);
    }
    public static List<Info> findAllInfoByNo(Integer tab_no)//通过表名来查找属于id的表信息
    {
        Info info=new Info();
        List<Info>l=InfoDao.findAllInfo(tab_no);
        Collections.sort(l);
        return l;
    }
    public static List<Info> findInfoByMessage(String id,String year,String month,String table_name)//通过年月和表名查找该年月的交易信息
    {
        Message message=new Message();
        message.setName(table_name);
        message.setId(id);
        message.setYear(year);
        message.setMonth(month);
        List<Info>l=InfoDao.findInfoByMessage(message);
        Collections.sort(l);
        return l;
    }
    public static void adjTable(Integer table_no,String table_name)//修改报表信息
    {
        Tab tab=new Tab();
        tab.setTab_no(table_no);
        tab.setTab_name(table_name);
        TabDao.updateTab(tab);
        InfoDao.updateInfoName(tab);//对info进行级联修改
    }
    public static void insertTable(String id,String table_name)//添加一张表格
    {
        Tab tab=new Tab();
        tab.setTab_name(table_name);
        tab.setId(id);
        TabDao.insertTab(tab);
    }
}

(2)resources中的Tab.xml配置文件,配置着Mybatis中与info表相关的数据库操作信息。

<mapper namespace="domain2">
    <resultMap type="entity.Tab" id="tab">
        <result column="id" property="id" javaType="string"/>
        <result column="tab_no" property="tab_no" javaType="int"/>
        <result column="tab_name" property="tab_name" javaType="string"/>
    </resultMap>
    <!--查询一个用户拥有的报表-->
    <select id="findTabById" parameterType="java.lang.String" resultMap="tab">
        select * from tab where id = '${value}'
    </select>
    <!--根据报表名称和id查询no-->
    <select id="findTabByName" parameterType="entity.Tab" resultType="Integer">
        select tab_no from tab where id = #{id} and tab_name = #{tab_name}
    </select>
    <!--插入一份报表-->
    <insert id="insertTab" parameterType="entity.Tab">
        insert into tab values(#{id},default,#{tab_name})
    </insert>
    <!--删除一份报表-->
    <delete id="deleteTab" parameterType="java.lang.Integer">
        delete from tab where tab_no ='${value}'
    </delete>
    <!--更新报表信息-->
    <update id="updateTab" parameterType="entity.Tab">
        update tab set tab_name = #{tab_name} where tab_no = #{tab_no}
    </update>
</mapper>

(3)resources中的Info.xml配置文件,配置着Mybatis中与info表相关的数据库操作信息。

<mapper namespace="domain3">
    <resultMap type="entity.Info" id="info">
        <result column="tab_no" property="tab_no" javaType="int"/>
        <result column="info_no" property="info_no" javaType="int"/>
        <result column="id" property="id" javaType="string"/>
        <result column="tab_name" property="tab_name" javaType="string"/>
        <result column="dat" property="dat" jdbcType="DATE" javaType="string"/>
        <result column="amount" property="amount" javaType="double"/>
        <result column="detail" property="detail" javaType="string"/>
    </resultMap>
    <!--查询一个用户报表中所有的交易记录 -->
    <select id="findAllInfo" parameterType="java.lang.Integer" resultMap="info">
        select * from info where tab_no ='${value}'
    </select>
    <!--通过年份和月份查询一份表的交易记录-->
    <select id="findInfoByMessage" parameterType="entity.Message" resultMap="info">
        select * from info where id = #{id} and tab_name = #{name} and year(dat) = #{year} and month(dat) = #{month}
    </select>
    <!--插入交易信息-->
    <insert id="insertInfo" parameterType="entity.Info">
        insert into info values(#{tab_no},default,#{id},#{tab_name},#{amount},str_to_date(#{dat},'%Y-%m-%d'),#{detail})
    </insert>
    <!--删除交易信息-->
    <delete id="deleteOneInfo" parameterType="java.lang.Integer">
        delete from info where info_no = '${value}'
    </delete>
    <!--更新报表信息-->
    <update id="updateInfo" parameterType="entity.Info">
        update info set detail = #{detail},dat = #{dat} ,amount = #{amount},tab_name=#{tab_name } where info_no = #{info_no}
    </update>
    <!--级联更新表名-->
    <update id="updateInfoName" parameterType="entity.Tab">
        update info set tab_name = #{tab_name} where tab_no = #{tab_no}
    </update>
</mapper>

 

效果图:

(1)登录界面

(2)个人主页

(3)报表管理

(4)报表查询

(5)报表修改

(6)导出报表

本次课设学习的地方:

1.SpringMVC访问静态资源方法

在web.xml中添加

  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
    <url-pattern>*.css</url-pattern>
    <url-pattern>/assets/*"</url-pattern>
    <url-pattern>/img/*</url-pattern>
  </servlet-mapping>

大体就是这些结尾的文件跳过拦截转发使用原来路径进行访问,注意要添加在DispatcherServlet之前,要不然会失效

还有就是静态资源不能放在WEB-INF下,因为原路径无法访问其中资源

2.SpringMVC处理中文乱码问题

把这段代码加入到

web.xml中

<filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

3.外键声明级联修改方法

foreign key(tab_no) references tab(tab_no) on delete cascade on update cascade

4.Mybatis对日期类的处理

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="domain3">
    <resultMap type="entity.Info" id="info">
        <result column="tab_no" property="tab_no" javaType="int"/>
        <result column="info_no" property="info_no" javaType="int"/>
        <result column="id" property="id" javaType="string"/>
        <result column="tab_name" property="tab_name" javaType="string"/>
        <result column="dat" property="dat" jdbcType="DATE" javaType="string"/>
        <result column="amount" property="amount" javaType="double"/>
        <result column="detail" property="detail" javaType="string"/>
    </resultMap>
    <!--查询一个用户报表中所有的交易记录 -->
    <select id="findAllInfo" parameterType="java.lang.Integer" resultMap="info">
        select * from info where tab_no ='${value}'
    </select>
    <!--通过年份和月份查询一份表的交易记录-->
    <select id="findInfoByMessage" parameterType="entity.Message" resultMap="info">
        select * from info where id = #{id} and tab_name = #{name} and year(dat) = #{year} and month(dat) = #{month}
    </select>
    <!--插入交易信息-->
    <insert id="insertInfo" parameterType="entity.Info">
        insert into info values(#{tab_no},default,#{id},#{tab_name},#{amount},str_to_date(#{dat},'%Y-%m-%d'),#{detail})
    </insert>
    <!--删除交易信息-->
    <delete id="deleteOneInfo" parameterType="java.lang.Integer">
        delete from info where info_no = '${value}'
    </delete>
    <!--更新报表信息-->
    <update id="updateInfo" parameterType="entity.Info">
        update info set detail = #{detail},dat = #{dat} ,amount = #{amount},tab_name=#{tab_name } where info_no = #{info_no}
    </update>
    <!--级联更新表名-->
    <update id="updateInfoName" parameterType="entity.Tab">
        update info set tab_name = #{tab_name} where tab_no = #{tab_no}
    </update>
</mapper>

其中日期类我在pojo中使用的是string来储存,在mysql中却用的是date类,要特殊处理下:

<insert id="insertInfo" parameterType="entity.Info">
        insert into info values(#{tab_no},default,#{id},#{tab_name},#{amount},str_to_date(#{dat},'%Y-%m-%d'),#{detail})
 </insert>

使用str_to_date方法对字符串进行转化存储。

然后此处我写的不够好,可以使用jqueryUI中的日历插件可以简化而且更美观进行日期的输入

5.使用Collections.sort排序

想要按照指定要求对一个类的List进行排序,则要重写类的CompareTo函数:

此处我根据两字符串的字典序大小进行了排序:

    public int compareTo(Info info) {
        String s1=dat;
        String s2=info.getDat();
        if(s1.compareTo(s2)<0)
        {
            return -1;
        }
        return 0;
    }

github源码:https://github.com/iunique/IdeaProject/tree/abc

猜你喜欢

转载自blog.csdn.net/qq_37497322/article/details/83029390