java+mysql+ssm开发的公司财务管理系统
MoneyManager
财务管理系统简介
Bootstrap前端框架, 后端用的是ssm,数据库持久化部分是自己写的
代码已经上传github,下载地址: https://github.com/21503882/companyfinancial-
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.google.gson.Gson;
import com.ming.entity.BillForOut;
import com.ming.entity.Message;
import com.ming.entity.User;
import com.ming.service.BillForInService;
import com.ming.service.BillForOutService;
import com.ming.service.IBillForInService;
import com.ming.service.IBillForOutService;
import com.ming.service.IMessageService;
import com.ming.service.IUserService;
import com.ming.service.MessageService;
import com.ming.service.UserService;
import com.ming.util.Condition;
import com.ming.util.DataUtil;
import com.ming.util.KaptchaUtil;
import com.ming.util.MailUtil;
import com.ming.util.Permission;
import com.ming.util.WebUtil;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class BillForOutAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private static final Gson GSON = new Gson();
private static final IBillForOutService billForOutService = new BillForOutService();
private static final IMessageService messageService = new MessageService();
private static final IUserService userService = new UserService();
private static final IBillForInService billForInService = new BillForInService();
/* 开始配置数据接收 */
private String id;
private String billForOut;
private int curPage;
private int limit;
private String condition;
private String validCode;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getBillForOut() {
return billForOut;
}
public void setBillForOut(String billForOut) {
this.billForOut = billForOut;
}
public int getCurPage() {
return curPage;
}
public void setCurPage(int curPage) {
this.curPage = curPage;
}
public int getLimit() {
return limit;
}
public void setLimit(int limit) {
this.limit = limit;
}
public String getCondition() {
return condition;
}
public void setCondition(String condition) {
this.condition = condition;
}
public String getValidCode() {
return validCode;
}
public void setValidCode(String validCode) {
this.validCode = validCode;
}
/* 结束配置数据接收 */
/**
* 读取多条数据
*/
@Permission
public void load() {
try {
List<Map<String, Object>> datas = billForOutService.loadSpecial(conditionString(), curPage, limit);
if (datas != null) {
String json = GSON.toJson(datas);
WebUtil.writeJson(json);
} else {
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
/**
* 获取数据条数
*/
@Permission
public void count() {
try {
int length = billForOutService.countSpecial(conditionString());
if (length != -1) {
String json = "{\"count\":" + length + "}";
WebUtil.writeJson(json);
} else {
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
/**
* 读取一条数据
*/
@Permission
public void loadOne() {
try {
String[] params = new String[] {"id", "date", "event", "amount", "payId", "status", "recordId", "createDate", "remark"};
Map<String, Object> data = billForOutService.loadOne(params, "id = '" + id + "'");
if (data != null) {
String json = GSON.toJson(data);
WebUtil.writeJson(json);
} else {
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
/**
* 保存一条数据
*/
@Permission
public void save() {
try {
BillForOut billForOutObject = GSON.fromJson(billForOut, BillForOut.class);
billForOutObject.setId(DataUtil.getUUID());
billForOutObject.setCreateDate(Double.parseDouble(DataUtil.getDateString(new Date(), "yyyyMMdd")));
boolean isSucceed = billForOutService.save(billForOutObject);
if (isSucceed) {
WebUtil.writeJson(WebUtil.JSON_SUCCESS);
} else {
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
/**
* 修改一条数据
*/
@Permission
public void edit() {
try {
BillForOut billForOutObject = GSON.fromJson(billForOut, BillForOut.class);
boolean isSucceed = billForOutService.update(billForOutObject);
if (isSucceed) {
WebUtil.writeJson(WebUtil.JSON_SUCCESS);
} else {
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
/**
* 删除一条数据
*/
@Permission
public void delete() {
try {
BillForOut billForOutObject = new BillForOut(id);
boolean isSucceed = billForOutService.delete(billForOutObject);
if (isSucceed) {
WebUtil.writeJson(WebUtil.JSON_SUCCESS);
} else {
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
/**
* 组合条件
* @return 条件SQL语句
*/
private String conditionString() {
try {
if (condition != null) {
Condition conditionObject = GSON.fromJson(condition, Condition.class);
String conditionString = "";
if (conditionObject.getPayName() != null)
conditionString += "payName LIKE '%" + conditionObject.getPayName() + "%' AND ";
if (conditionObject.getStatus() != null)
conditionString += "status = '" + conditionObject.getStatus() + "' AND ";
if (conditionString.length() > 5)
conditionString = conditionString.substring(0, conditionString.length() - 5);
return conditionString;
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 读取个人报账数据
*/
@Permission
public void loadMine() {
try {
Map<String, Object> session = ActionContext.getContext().getSession();
String userId = (String) session.get("userId");
List<Map<String, Object>> datas = billForOutService.loadMineSpecial(userId, conditionMineString(), curPage, limit);
if (datas != null) {
String json = GSON.toJson(datas);
WebUtil.writeJson(json);
} else {
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
/**
* 获取个人报账数据条数
*/
@Permission
public void countMine() {
try {
Map<String, Object> session = ActionContext.getContext().getSession();
String userId = (String) session.get("userId");
int length = billForOutService.countMineSpecial(userId, conditionMineString());
if (length != -1) {
String json = "{\"count\":" + length + "}";
WebUtil.writeJson(json);
} else {
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
/**
* 个人报账数据组合条件
* @return 条件SQL语句
*/
private String conditionMineString() {
try {
if (condition != null) {
Condition conditionObject = GSON.fromJson(condition, Condition.class);
String conditionString = "";
if (conditionObject.getStatus() != null)
conditionString += "status = '" + conditionObject.getStatus() + "' AND ";
if (conditionString.length() > 5)
conditionString = conditionString.substring(0, conditionString.length() - 5);
return conditionString;
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 读取多条报账数据
*/
@Permission
public void loadReview() {
try {
List<Map<String, Object>> datas = billForOutService.loadReviewSpecial(conditionReviewString(), curPage, limit);
if (datas != null) {
String json = GSON.toJson(datas);
WebUtil.writeJson(json);
} else {
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
/**
* 获取报账数据条数
*/
@Permission
public void countReview() {
try {
int length = billForOutService.countReviewSpecial(conditionReviewString());
if (length != -1) {
String json = "{\"count\":" + length + "}";
WebUtil.writeJson(json);
} else {
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
/**
* 读取一条报账数据
*/
@Permission
public void loadOneReview() {
try {
Map<String, Object> data = billForOutService.loadOneReviewSpecial("id = '" + id + "'");
if (data != null) {
String json = GSON.toJson(data);
WebUtil.writeJson(json);
} else {
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
/**
* 组合报账条件
* @return 条件SQL语句
*/
private String conditionReviewString() {
try {
if (condition != null) {
Condition conditionObject = GSON.fromJson(condition, Condition.class);
String conditionString = "";
if (conditionObject.getPayName() != null)
conditionString += "payName LIKE '%" + conditionObject.getPayName() + "%' AND ";
if (conditionString.length() > 5)
conditionString = conditionString.substring(0, conditionString.length() - 5);
return conditionString;
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 审核通过
*/
@Permission
public void reviewOk() {
try {
Map<String, Object> session = ActionContext.getContext().getSession();
String userId = (String) session.get("userId");
String userName = (String) session.get("userName");
BillForOut billForOutObject = GSON.fromJson(billForOut, BillForOut.class);
billForOutObject.setPayId(null);
billForOutObject.setRecordId(userId);
billForOutObject.setCreateDate(null);
if (billForOutObject.getStatus() == BillForOut.STATUS_PAID) {
double amount = billForOutObject.getAmount();
double money = billForInService.sumUpMoney();
if (amount > money) {
WebUtil.writeJson("{\"result\":\"记录更新失败,财务余额不足\"}");
return;
}
}
boolean isSucceed = billForOutService.update(billForOutObject);
if (isSucceed) {
WebUtil.writeJson(WebUtil.JSON_SUCCESS);
} else {
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
String[] params = new String[] {"payId", "createDate"};
Map<String, Object> data = billForOutService.loadOne(params, "id = '" + billForOutObject.getId() + "'");
String payId = (String) data.get("payId");
Double createDate = (Double) data.get("createDate");
/* 生成消息 */
String messageContent = "您在" + DataUtil.dateFormat(createDate) + "提交的报账申请经" + userName + "审核已通过";
double messageDate = Double.parseDouble(DataUtil.getDateString(new Date(), "yyyyMMddHHmmss"));
Map<String, Object> payUserData = userService.loadOne(new String[] {"userName", "email"}, "id = '" + payId + "'");
String payUserUserName = (String) payUserData.get("userName");
String payUserEmail = (String) payUserData.get("email");
/* 向支付人发送一条消息 */
Message messageObject = new Message();
messageObject.setId(DataUtil.getUUID());
messageObject.setType(Message.TYPE_INFO);
messageObject.setContent(messageContent);
messageObject.setCreateTime(messageDate);
messageObject.setUserId(payId);
messageService.save(messageObject);
/* 向支付人发送一条邮件 */
MailUtil.sendInBackground(payUserEmail, "财务管理系统", "<p>尊敬的" + payUserUserName + ":</p><p>" + messageContent + "</p><p>" + DataUtil.dateTimeFormat(messageDate) + "</p>");
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
/**
* 审核不通过
*/
@Permission
public void reviewNo() {
try {
Map<String, Object> session = ActionContext.getContext().getSession();
String userId = (String) session.get("userId");
String userName = (String) session.get("userName");
BillForOut billForOutObject = GSON.fromJson(billForOut, BillForOut.class);
billForOutObject.setPayId(null);
billForOutObject.setRecordId(userId);
billForOutObject.setCreateDate(null);
billForOutObject.setStatus(BillForOut.STATUS_FAILED);
boolean isSucceed = billForOutService.update(billForOutObject);
if (isSucceed) {
WebUtil.writeJson(WebUtil.JSON_SUCCESS);
} else {
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
String[] params = new String[] {"payId", "createDate"};
Map<String, Object> data = billForOutService.loadOne(params, "id = '" + billForOutObject.getId() + "'");
String payId = (String) data.get("payId");
Double createDate = (Double) data.get("createDate");
/* 生成消息 */
String messageContent = "您在" + DataUtil.dateFormat(createDate) + "提交的报账申请经" + userName + "审核不通过";
double messageDate = Double.parseDouble(DataUtil.getDateString(new Date(), "yyyyMMddHHmmss"));
Map<String, Object> payUserData = userService.loadOne(new String[] {"userName", "email"}, "id = '" + payId + "'");
String payUserUserName = (String) payUserData.get("userName");
String payUserEmail = (String) payUserData.get("email");
/* 向支付人发送一条消息 */
Message messageObject = new Message();
messageObject.setId(DataUtil.getUUID());
messageObject.setType(Message.TYPE_DANGER);
messageObject.setContent(messageContent);
messageObject.setCreateTime(messageDate);
messageObject.setUserId(payId);
messageService.save(messageObject);
/* 向支付人发送一条邮件 */
MailUtil.sendInBackground(payUserEmail, "财务管理系统", "<p>尊敬的" + payUserUserName + ":</p><p>" + messageContent + "</p><p>" + DataUtil.dateTimeFormat(messageDate) + "</p>");
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
/**
* 个人报账
*/
@Permission
public void apply() {
try {
if (!KaptchaUtil.checkCode(validCode)) {
WebUtil.writeJson(WebUtil.JSON_WRONG_VALIDCODE);
return;
}
Map<String, Object> session = ActionContext.getContext().getSession();
String userId = (String) session.get("userId");
String userName = (String) session.get("userName");
BillForOut billForOutObject = GSON.fromJson(billForOut, BillForOut.class);
billForOutObject.setId(DataUtil.getUUID());
billForOutObject.setPayId(userId);
billForOutObject.setStatus(2); // 2表示待审核
billForOutObject.setRecordId(null);
billForOutObject.setCreateDate(Double.parseDouble(DataUtil.getDateString(new Date(), "yyyyMMdd")));
boolean isSucceed = billForOutService.save(billForOutObject);
if (isSucceed) {
WebUtil.writeJson(WebUtil.JSON_SUCCESS);
} else {
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
String[] params = new String[] {"id", "userName", "email"};
List<Map<String, Object>> datas = userService.load(params, "roleId = '" + User.ROLEID_SUPER_MANAGER + "'");
/* 生成消息 */
String messageContent = userName + "报账,等待您的审核";
double messageDate = Double.parseDouble(DataUtil.getDateString(new Date(), "yyyyMMddHHmmss"));
/* 向所有超级管理员发送一条消息 */
Message messageObject = new Message();
messageObject.setId(DataUtil.getUUID());
messageObject.setType(Message.TYPE_WARNING);
messageObject.setContent(messageContent);
messageObject.setCreateTime(messageDate);
for (int i = 0, length = datas.size(); i < length; i++) {
String currentUserId = (String) datas.get(i).get("id");
String currentUserName = (String) datas.get(i).get("userName");
String currentUserEmail = (String) datas.get(i).get("email");
messageObject.setUserId(currentUserId);
messageService.save(messageObject);
/* 向所有超级管理员发送一条邮件 */
MailUtil.sendInBackground(currentUserEmail, "财务管理系统", "<p>尊敬的" + currentUserName + ":</p><p>" + messageContent + "</p><p>" + DataUtil.dateTimeFormat(messageDate) + "</p>");
}
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
/**
* 读取个人报账数据
*/
@Permission
public void loadPay() {
try {
Map<String, Object> session = ActionContext.getContext().getSession();
String userId = (String) session.get("userId");
List<Map<String, Object>> datas = billForOutService.loadPaySpecial(userId, conditionPayString(), curPage, limit);
if (datas != null) {
String json = GSON.toJson(datas);
WebUtil.writeJson(json);
} else {
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
/**
* 获取个人报账数据条数
*/
@Permission
public void countPay() {
try {
Map<String, Object> session = ActionContext.getContext().getSession();
String userId = (String) session.get("userId");
int length = billForOutService.countPaySpecial(userId, conditionPayString());
if (length != -1) {
String json = "{\"count\":" + length + "}";
WebUtil.writeJson(json);
} else {
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
/**
* 个人报账数据组合条件
* @return 条件SQL语句
*/
private String conditionPayString() {
try {
if (condition != null) {
Condition conditionObject = GSON.fromJson(condition, Condition.class);
String conditionString = "";
if (conditionObject.getPayName() != null)
conditionString += "payName LIKE '%" + conditionObject.getPayName() + "%' AND ";
if (conditionObject.getStatus() != null)
conditionString += "status = '" + conditionObject.getStatus() + "' AND ";
if (conditionString.length() > 5)
conditionString = conditionString.substring(0, conditionString.length() - 5);
return conditionString;
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 更改状态为已支付
*/
@Permission
public void paid() {
try {
Map<String, Object> session = ActionContext.getContext().getSession();
String userId = (String) session.get("userId");
String userName = (String) session.get("userName");
String[] params = new String[] {"amount", "payId", "createDate"};
Map<String, Object> data = billForOutService.loadOne(params, "id = '" + id + "' AND recordId = '" + userId + "'");
if (data != null) {
double amount = (Double) data.get("amount");
double money = billForInService.sumUpMoney();
if (amount > money) {
WebUtil.writeJson("{\"result\":\"记录更新失败,财务余额不足\"}");
return;
}
BillForOut billForOutObject = new BillForOut(id);
billForOutObject.setStatus(BillForOut.STATUS_PAID);
boolean isSucceed = billForOutService.update(billForOutObject);
if (isSucceed) {
WebUtil.writeJson(WebUtil.JSON_SUCCESS);
} else {
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
String payId = (String) data.get("payId");
Double createDate = (Double) data.get("createDate");
/* 生成消息 */
String messageContent = "您在" + DataUtil.dateFormat(createDate) + "提交的报账记录被" + userName + "标记为已支付";
double messageDate = Double.parseDouble(DataUtil.getDateString(new Date(), "yyyyMMddHHmmss"));
Map<String, Object> payUserData = userService.loadOne(new String[] {"userName", "email"}, "id = '" + payId + "'");
String payUserUserName = (String) payUserData.get("userName");
String payUserEmail = (String) payUserData.get("email");
/* 向支付人发送一条消息 */
Message messageObject = new Message();
messageObject.setId(DataUtil.getUUID());
messageObject.setType(Message.TYPE_SUCCESS);
messageObject.setContent(messageContent);
messageObject.setCreateTime(messageDate);
messageObject.setUserId(payId);
messageService.save(messageObject);
/* 向支付人发送一条邮件 */
MailUtil.sendInBackground(payUserEmail, "财务管理系统", "<p>尊敬的" + payUserUserName + ":</p><p>" + messageContent + "</p><p>" + DataUtil.dateTimeFormat(messageDate) + "</p>");
} else {
WebUtil.writeJson("{\"result\":\"非法注入\"}");
}
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
/**
* 更改状态为未支付
*/
@Permission
public void unpaid() {
try {
Map<String, Object> session = ActionContext.getContext().getSession();
String userId = (String) session.get("userId");
String userName = (String) session.get("userName");
Map<String, Object> data = billForOutService.loadOne("id = '" + id + "' AND recordId = '" + userId + "'");
if (data != null) {
BillForOut billForOutObject = new BillForOut(id);
billForOutObject.setStatus(BillForOut.STATUS_UNPAID);
boolean isSucceed = billForOutService.update(billForOutObject);
if (isSucceed) {
WebUtil.writeJson(WebUtil.JSON_SUCCESS);
} else {
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
String payId = (String) data.get("payId");
Double createDate = (Double) data.get("createDate");
/* 生成消息 */
String messageContent = "您在" + DataUtil.dateFormat(createDate) + "提交的报账记录被" + userName + "标记为未支付";
double messageDate = Double.parseDouble(DataUtil.getDateString(new Date(), "yyyyMMddHHmmss"));
Map<String, Object> payUserData = userService.loadOne(new String[] {"userName", "email"}, "id = '" + payId + "'");
String payUserUserName = (String) payUserData.get("userName");
String payUserEmail = (String) payUserData.get("email");
/* 向支付人发送一条消息 */
Message messageObject = new Message();
messageObject.setId(DataUtil.getUUID());
messageObject.setType(Message.TYPE_WARNING);
messageObject.setContent(messageContent);
messageObject.setCreateTime(messageDate);
messageObject.setUserId(payId);
messageService.save(messageObject);
/* 向支付人发送一条邮件 */
MailUtil.sendInBackground(payUserEmail, "财务管理系统", "<p>尊敬的" + payUserUserName + ":</p><p>" + messageContent + "</p><p>" + DataUtil.dateTimeFormat(messageDate) + "</p>");
} else {
WebUtil.writeJson("{\"result\":\"非法注入\"}");
}
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
/**
* 支出金额统计
*/
@Permission
public void sumUp() {
try {
double sum = billForOutService.sumUp(conditionString());
String json = "{\"amount\":" + sum + "}";
WebUtil.writeJson(json);
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
/**
* 个人报账金额统计
*/
@Permission
public void sumUpMine() {
try {
Map<String, Object> session = ActionContext.getContext().getSession();
String userId = (String) session.get("userId");
double sum = billForOutService.sumUpMine(userId, conditionMineString());
String json = "{\"amount\":" + sum + "}";
WebUtil.writeJson(json);
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
/**
* 报账金额统计
*/
@Permission
public void sumUpReview() {
try {
double sum = billForOutService.sumUpReview(conditionMineString());
String json = "{\"amount\":" + sum + "}";
WebUtil.writeJson(json);
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
/**
* 支付金额统计
*/
@Permission
public void sumUpPay() {
try {
Map<String, Object> session = ActionContext.getContext().getSession();
String userId = (String) session.get("userId");
double sum = billForOutService.sumUpPay(userId, conditionMineString());
String json = "{\"amount\":" + sum + "}";
WebUtil.writeJson(json);
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
/**
* 支付管理查看还需金额
*/
@Permission
public void sumUpNeed() {
try {
Map<String, Object> session = ActionContext.getContext().getSession();
String userId = (String) session.get("userId");
double leftMoney = billForInService.sumUpMoney();
double unpaidMoney = billForOutService.sumUpPay(userId, "status = " + BillForOut.STATUS_UNPAID);
if (unpaidMoney > leftMoney)
WebUtil.writeJson("{\"amount\":" + (unpaidMoney - leftMoney) + "}");
else
WebUtil.writeJson("{\"amount\":null}");
} catch (Exception e) {
e.printStackTrace();
WebUtil.writeJson(WebUtil.JSON_ERROR);
}
}
}
<!DOCTYPE html>
<html lang="zh-CN" ng-app="app">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<title>财务管理系统</title>
<link rel="stylesheet" type="text/css" href="plugins/bootstrap-3.3.2/css/bootstrap.min.css" />
<link rel="stylesheet" type="text/css" href="css/common/custom.css" />
<link rel="stylesheet" type="text/css" href="css/main.css" />
</head>
<body ng-controller="mainController">
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">切换导航</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#/"><span class="glyphicon glyphicon-piggy-bank"></span> 财务管理系统</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li ng-class="{true:'active'}['/'+menu.href==currentPage]" ng-repeat="menu in menus"><a href="#/{{menu.href}}" ng-bind="menu.name"></a></li>
</ul>
<div class="navbar-right">
<div class="btn-group" role="group">
<button type="button" class="btn btn-default navbar-btn" title="报账" data-toggle="modal" data-target="#apply-modal" ng-click="resetBillForOut()">
<span class="glyphicon glyphicon-pencil"></span>
</button>
<button class="btn btn-default navbar-btn" title="消息中心" data-toggle="modal" data-target="#message-modal" ng-click="loadMessages()">
<span class="glyphicon glyphicon-comment"></span> <span ng-bind="messageNumber"></span>
</button>
<button class="btn btn-default navbar-btn" title="个人中心" data-toggle="modal" data-target="#self-modal" ng-click="loadSelf()">
<span class="glyphicon glyphicon-user"></span>
</button>
<button class="btn btn-default navbar-btn" title="注销" ng-click="logout()">
<span class="glyphicon glyphicon-log-out"></span>
</button>
</div>
</div>
</div>
</div>
</nav>
<div class="container" id="main">
<!-- <div class="alert" id="message-alert" style="display:none;"></div> -->
<div ng-view></div>
</div>
<footer class="footer">
<div class="container">
<p class="text-center text-muted">财务管理系统 © 2015</p>
</div>
</footer>
<div class="modal fade" id="apply-modal" tabindex="-1" role="dialog" aria-labelledby="报账模态框">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title" id="applyModalTitle">报账</h4>
</div>
<div class="modal-body">
<form class="form" name="applyForm">
<div class="form-group has-feedback" ng-class="{true:'has-error',false:'has-success'}[applyForm.date.$invalid]">
<label for="dateApply">日期</label>
<input type="date" class="form-control" id="dateApply" name="date" required ng-model="apply.date" />
<span class="glyphicon form-control-feedback" ng-class="{true:'glyphicon-remove',false:'glyphicon-ok'}[applyForm.date.$invalid]"></span>
<p class="help-block" ng-show="applyForm.date.$invalid">必填项</p>
</div>
<div class="form-group has-feedback" ng-class="{true:'has-error',false:'has-success'}[applyForm.event.$invalid]">
<label for="eventApply">事项</label>
<input type="text" class="form-control" id="eventApply" name="event" maxlength="127" required ng-model="apply.event" />
<span class="glyphicon form-control-feedback" ng-class="{true:'glyphicon-remove',false:'glyphicon-ok'}[applyForm.event.$invalid]"></span>
<p class="help-block" ng-show="applyForm.event.$invalid">必填项</p>
</div>
<div class="form-group has-feedback" ng-class="{true:'has-error',false:'has-success'}[applyForm.amount.$invalid]">
<label for="amountApply">金额(元)</label>
<input type="number" class="form-control" id="amountApply" name="amount" maxlength="10" required ng-model="apply.amount" />
<span class="glyphicon form-control-feedback" ng-class="{true:'glyphicon-remove',false:'glyphicon-ok'}[applyForm.amount.$invalid]"></span>
<p class="help-block" ng-show="applyForm.amount.$invalid">必填项,只允许数值</p>
</div>
<div class="form-group has-feedback" ng-class="{true:'has-error',false:'has-success'}[applyForm.remark.$invalid]">
<label for="remarkApply">备注</label>
<input type="text" class="form-control" id="remarkApply" name="remark" placeholder="选填项" maxlength="127" ng-model="apply.remark" />
<span class="glyphicon form-control-feedback" ng-class="{true:'glyphicon-remove',false:'glyphicon-ok'}[applyForm.remark.$invalid]"></span>
<p class="help-block" ng-show="applyForm.remark.$invalid">选填项</p>
</div>
<div class="form-group has-feedback" ng-class="{true:'has-error'}[applyForm.validCode.$invalid]">
<label for="validCodeApply">验证码</label>
<div class="input-group">
<input type="text" class="form-control" id="validCodeApply" name="validCode" maxlength="5" minlength="5" required ng-model="apply.validCode" />
<div class="input-group-addon" title="看不清,换一张" ng-click="changeValidCode()">
<img src="kaptcha.jpg?timestamp={{timestamp}}" alt="验证码" width="80" height="20" />
</div>
</div>
<p class="help-block" ng-show="applyForm.validCode.$invalid">必填项,请输入5位验证码</p>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" ng-disabled="applyForm.$invalid" ng-click="applyBillForOut()">提交</button>
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="message-modal" tabindex="-1" role="dialog" aria-labelledby="消息中心模态框">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title" id="messageModalTitle">消息中心</h4>
</div>
<div class="modal-body">
<div class="alert fade in" ng-class="alertType(message.type)" ng-repeat="message in messages">
<button type="button" class="close" data-dismiss="alert" aria-label="删除" title="删除" ng-click="deleteMessage(message.id)">
<span aria-hidden="true">×</span>
</button>
<p><span ng-bind="dateTimeFormat(message.createTime)"></span> <strong ng-bind="message.content"></strong></p>
</div>
<p class="text-center text-muted" ng-show="messages&&messages.length==0">无未读信息</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="self-modal" tabindex="-1" role="dialog" aria-labelledby="个人中心模态框">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title" id="selfModalTitle">个人中心</h4>
</div>
<div class="modal-body">
<form class="form" name="selfForm">
<div class="form-group">
<label for="userNameSelf">用户名</label>
<input type="text" class="form-control" id="userNameSelf" disabled ng-model="self.userName" />
</div>
<div class="form-group">
<label for="sexSelf">性别</label>
<select class="form-control" id="sexSelf" name="sex" ng-model="self.sex">
<option value="0">男</option>
<option value="1">女</option>
</select>
</div>
<div class="form-group has-feedback" ng-class="{true:'has-error',false:'has-success'}[selfForm.birthday.$invalid]">
<label for="birthdaySelf">生日</label>
<input type="date" class="form-control" id="birthdaySelf" name="birthday" required ng-model="self.birthday" />
<span class="glyphicon form-control-feedback" ng-class="{true:'glyphicon-remove',false:'glyphicon-ok'}[selfForm.birthday.$invalid]"></span>
<p class="help-block" ng-show="selfForm.birthday.$invalid">必填项</p>
</div>
<div class="form-group has-feedback" ng-class="{true:'has-error',false:'has-success'}[selfForm.email.$invalid]">
<label for="emailSelf">Email</label>
<input type="email" class="form-control" id="emailSelf" name="email" maxlength="127" required ng-model="self.email" />
<span class="glyphicon form-control-feedback" ng-class="{true:'glyphicon-remove',false:'glyphicon-ok'}[selfForm.email.$invalid]"></span>
<p class="help-block" ng-show="selfForm.email.$invalid">必填项,注意Email格式</p>
</div>
<div class="form-group has-feedback" ng-class="{true:'has-error',false:'has-success'}[selfForm.qq.$invalid]">
<label for="qqSelf">QQ</label>
<input type="text" class="form-control" id="qqSelf" name="qq" placeholder="选填项" maxlength="25" ng-pattern="/[1-9][0-9]{4,}/" ng-model="self.qq" />
<span class="glyphicon form-control-feedback" ng-class="{true:'glyphicon-remove',false:'glyphicon-ok'}[selfForm.qq.$invalid]"></span>
<p class="help-block" ng-show="selfForm.qq.$invalid">选填项,注意QQ格式</p>
</div>
<div class="form-group">
<label for="roleIdSelf">用户角色</label>
<select class="form-control" id="roleIdSelf" disabled ng-options="role.roleId as role.roleName for role in roles" ng-model="self.roleId"></select>
</div>
<div class="form-group has-feedback" ng-class="{true:'has-error',false:'has-success'}[selfForm.oldPassword.$invalid]" ng-show="changePassword">
<label for="oldPasswordSelf">旧密码</label>
<input type="password" class="form-control" id="oldPasswordSelf" name="oldPassword" maxlength="16" ng-required="changePassword" ng-pattern="/^\w+$/" ng-model="self.oldPassword" />
<span class="glyphicon form-control-feedback" ng-class="{true:'glyphicon-remove',false:'glyphicon-ok'}[selfForm.oldPassword.$invalid]"></span>
<p class="help-block" ng-show="selfForm.oldPassword.$invalid">必填项,只允许数字、英文和下划线</p>
</div>
<div class="form-group has-feedback" ng-class="{true:'has-error',false:'has-success'}[selfForm.newPassword.$invalid]" ng-show="changePassword">
<label for="newPasswordSelf">新密码</label>
<input type="password" class="form-control" id="newPasswordSelf" name="newPassword" maxlength="16" ng-required="changePassword" ng-pattern="/^\w+$/" ng-model="self.newPassword" />
<span class="glyphicon form-control-feedback" ng-class="{true:'glyphicon-remove',false:'glyphicon-ok'}[selfForm.newPassword.$invalid]"></span>
<p class="help-block" ng-show="selfForm.newPassword.$invalid">必填项,只允许数字、英文和下划线</p>
</div>
<div class="form-group has-feedback" ng-class="{true:'has-error',false:'has-success'}[selfForm.againPassword.$invalid||self.newPassword!=self.againPassword]" ng-show="changePassword">
<label for="againPasswordSelf">确认密码</label>
<input type="password" class="form-control" id="againPasswordSelf" name="againPassword" maxlength="16" ng-required="changePassword" ng-pattern="/^\w+$/" ng-model="self.againPassword" />
<span class="glyphicon form-control-feedback" ng-class="{true:'glyphicon-remove',false:'glyphicon-ok'}[selfForm.againPassword.$invalid||self.newPassword!=self.againPassword]"></span>
<p class="help-block" ng-show="selfForm.againPassword.$invalid||self.newPassword!=self.againPassword">必填项,注意要与新密码一致</p>
</div>
<div class="form-group has-feedback" ng-class="{true:'has-error'}[selfForm.validCode.$invalid]">
<label for="validCodeSelf">验证码</label>
<div class="input-group">
<input type="text" class="form-control" id="validCodeSelf" name="validCode" maxlength="5" minlength="5" required ng-model="self.validCode" />
<div class="input-group-addon" title="看不清,换一张" ng-click="changeValidCode()">
<img src="kaptcha.jpg?timestamp={{timestamp}}" alt="验证码" width="80" height="20" />
</div>
</div>
<p class="help-block" ng-show="selfForm.validCode.$invalid">必填项,请输入5位验证码</p>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-warning" ng-show="changePassword" ng-click="toggleChangePassword()">取消修改密码</button>
<button type="button" class="btn btn-danger" ng-hide="changePassword" ng-click="toggleChangePassword()">修改密码</button>
<button type="button" class="btn btn-primary" ng-disabled="selfForm.$invalid" ng-click="saveSelf()">保存</button>
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
</div>
</div>
</div>
</div>
<script type="text/javascript" src="plugins/angularjs/angular.min.js"></script>
<script type="text/javascript" src="plugins/angularjs/angular-route.min.js"></script>
<script type="text/javascript" src="plugins/jquery/jquery-1.11.3.min.js"></script>
<script type="text/javascript" src="plugins/bootstrap-3.3.2/js/bootstrap.min.js"></script>
<script type="text/javascript" src="plugins/security/md5.js"></script>
<script type="text/javascript" src="js/main.js"></script>
<script type="text/javascript" src="js/view/welcome.js"></script>
<script type="text/javascript" src="js/view/user.js"></script>
<script type="text/javascript" src="js/view/billforin.js"></script>
<script type="text/javascript" src="js/view/billforout.js"></script>
<script type="text/javascript" src="js/view/apply.js"></script>
<script type="text/javascript" src="js/view/review.js"></script>
<script type="text/javascript" src="js/view/pay.js"></script>
<script type="text/javascript" src="js/view/about.js"></script>
</body>
</html>