开发技术
后端 SpringMVC SpringData JPA
前端 Ext.js Ajax
数据库 MySQL
模块设计
数据库设计
(1)用户表
(2)资源表
(3)角色信息表
(4)楼盘信息表
(5)客户信息表
(6)房源信息表
(7)业主信息表
(8)交易信息表
流程设计
1.用户注册功能模块
用户必须登录才能使用该系统的功能,假若用户没有帐号,则需要用户在该模块中提供的注册页面中注册帐号。用户填完注册所需的信息点击注册后,会向注册的邮箱发送验证码,页面会验证用户编号是否存在,如已存在,返回对应的提示信息到页面,提示用户需要重新输入,接着验证是否所有必须的信息都已经填完并且有没有符合要求。若页面验证通过,用户所填的信息就会提交到后台,后台再验证邮箱验证码是否正确。符合的话,则系统保存用户信息到数据库中,跳转回登录页面。
2.用户登录功能模块
用户注册帐号成功,就可以在登录模块里登录成为用户,系统通过验证用户输入的登录信息,判断是否允许用户登录。
3.房源信息管理模块
进入主界面后,系统管理人员或经理可以选择对房源信息进行管理,包括增删改查操作,业务员只能查看或搜索房源信息。
4.客源信息管理模块
在主页中,可以通过点击左侧列表进入客户信息管理的界面,系统管理人员或经理可以选择对客户信息进行管理,包括增删改查操作,业务员只能查看自己被分配到的客户信息。
5.交易信息管理模块
在主页中,可以通过点击左侧列表进入客户信息管理的界面,系统管理人员或经理可以选择对交易信息进行管理,包括删改操作,业务员只能查看自己相关的交易信息。
6.业务分配模块
系统管理员与经理可以对业务员进行业务分配,为业务员增添负责的客户,或除去负责的客户,系统管理员还可以对业务员的信息进行修改。
7.统计模块
统计管理模块分为房源信息统计模块,交易统计模块,该模块只有系统管理员与经理能访问。进入房源统计模块。点击楼盘列表中任一楼盘项,即可显示该楼盘业务类型、房屋类型的数量统计报表。
进入交易信息统计模块,柱状图会根据当前操作系统的时间统计本年度之前的月份的净营业收入;雷达图会显示本年度的交易额统计,分别按照房屋类型、厅室类型、装修情况进行交易额统计,可以通过雷达图左边的按钮进行切换;选中左边柱状图的任一月份的柱子,雷达图会统计该月份的交易额情况。
程序运行截图
部分代码:
//登录
public ExtjsAjaxResult login(User user) {
User user2 = userDao.findByUserNumber(user.getUserNumber());
if (user2 == null)
return new ExtjsAjaxResult(false, "员工编号不存在");
else {
if (!user.getPassword().equals(user2.getPassword()))
return new ExtjsAjaxResult(false, "密码不匹配");
return new ExtjsAjaxResult(true, "");
}
}
//注册
public ExtjsAjaxResult register(UserDTO dto, String verificationCode) {
User user = userDao.findByUserNumber(dto.getUserNumber());
if (user != null)
return new ExtjsAjaxResult(false, "员工编号已存在");
else {
if (dto.getVerificationCode().equals(verificationCode)) {
User user2 = new User();
UserDTO.dtoToEntity(dto, user2);
Role role = roleDao.findOne(3l);
user2.setCreateTime(new Date());
user2.setRole(role);
userDao.save(user2);
return new ExtjsAjaxResult(true, "注册成功");
} else {
return new ExtjsAjaxResult(false, "验证码不正确");
}
}
}
部分代码:
public void save(HouseDTO houseDTO) {
House house = new House();
HouseDTO.dtoToEntity(houseDTO, house);
house.setBuilding(buildingDao.findOne(houseDTO.getBid()));
house.setOwner(ownerDao.findOne(houseDTO.getOid()));
if(house.getId()==null){
Building b = buildingDao.findOne(houseDTO.getBid());
int num = b.getHouseNumber()+1;
b.setHouseNumber(num);
buildingService.save(b);
}
houseDao.save(house);
}
public void delete(Long[] ids, String imagePath) {
for (Long id : ids) {
String picture = houseDao.findOne(id).getPicture();
String path = imagePath + "/" + picture;
File file = new File(path);
...
Building b =houseDao.findOne(id).getBuilding();
int num = b.getHouseNumber()-1;
b.setHouseNumber(num);
buildingService.save(b);
houseDao.delete(id);
}
}
@Override
public Page<HouseDTO> findAll(HouseDTO dto, Pageable pageable) {
List<HouseDTO> dtoList = new ArrayList<HouseDTO>();
Page<House> houseList = null;
houseList = houseDao.findAll(HouseDTO.getWhereClause(dto),pageable);
if(houseList.getSize()>0) {
for (House house : houseList) {
HouseDTO dto2 = new HouseDTO();
HouseDTO.entityToDto(house, dto2);
dtoList.add(dto2);
}
return new PageImpl<HouseDTO>(dtoList, pageable, houseList.getTotalElements());
}else
return null;
}
部分代码
@Override
public void save(CustomerDTO customerDTO) {
Customer customer = new Customer();
CustomerDTO.dtoToEntity(customerDTO, customer);
customerDao.save(customer);
}
@Override
public void delete(Long[] ids, String imagePath) {
for(Long id:ids){
Customer customer = customerDao.findOne(id);
String picture = customer.getPicture();
String path = imagePath+"/"+picture;
....
customerDao.delete(id);
}
}
@Override
public Page<CustomerDTO> findAll(CustomerDTO dto, Pageable pageable) {
List<CustomerDTO> dtoList = new ArrayList<CustomerDTO>();
Page<Customer> customerList = null;
UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
User user = userDao.findByUserNumber(userDetails.getUsername());
...
return new PageImpl<CustomerDTO>(dtoList, pageable, customerList.getTotalElements());
}
else
return null;
}
部分代码:
@Override
public Page<TransactionDTO> findAll(Pageable pageable) {
List<TransactionDTO> dtoList = new ArrayList<TransactionDTO>();
Page<Transaction> transactionList = null;
UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
User user = userDao.findByUserNumber(userDetails.getUsername());
if(user.getRole().getRoleName().equals("ROLE_SALESMAN")) {
transactionList = this.findAll(TransactionDTO.getWhereClaus(user), pageable);
}
else {
transactionList = transactionDao.findAll(pageable);
}
if(transactionList.getSize()>0) {
for(Transaction transaction : transactionList) {
TransactionDTO dto = new TransactionDTO();
TransactionDTO.entityToDto(transaction, dto);
dtoList.add(dto);
}
return new PageImpl<TransactionDTO>(dtoList, pageable, transactionList.getTotalElements());
}
return null;
}
部分代码
@Override
public Map<String, List<Map<String, Object>>> statisticsSalesOfMonthByUserId(Long userId) {
int monthNum = 4;
Double[] rent = new Double[monthNum];
Double[] sell = new Double[monthNum];
Date now = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(now);
int currentMonth = calendar.get(Calendar.MONTH);
String[] month = new String[monthNum];
for (int i = 0; i < monthNum; i++) {
if(currentMonth-i>0) {
month[monthNum-i-1] = currentMonth-i+"月份";
}else {
month[monthNum-i-1] = currentMonth-i+12 + "月份";
}
}
for(int i=0; i<monthNum; i++) {
calendar.add(Calendar.MONTH, -1);
Double[] monthlySalesOfSellOrRent = getMonthlySalesOfSellAndRent(calendar.getTime(),userId);
sell[monthNum-i-1] = monthlySalesOfSellOrRent[0];
rent[monthNum-i-1] = monthlySalesOfSellOrRent[1];
}
Map<String, List<Map<String, Object>>> outMap = new HashMap<String, List< Map<String, Object>>>();
List<Map<String,Object>> list = new ArrayList<Map<String, Object>>();
for (int i = 0; i < monthNum; i++) {
Map<String,Object> map = new HashMap<String, Object>();
map.put("month", month[i]);
map.put("rent", rent[i]);
map.put("sell", sell[i]);
list.add(map);
}
outMap.put("data", list);
return outMap;
}
部分代码:
Override
public Map<String, List<Map<String, Object>>> statisticsSalesTableOfMonth() {
String[] category = new String[] {"营业收入","营业税税额","市维护建设税","净营收","员工月薪","企业所得税","净利润"
};
Date now = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(now);
int monthCount = calendar.get(Calendar.MONTH);
//调用Dao层的方法获取统计数据
Double[][] beforeMothsSales = new Double[category.length][monthCount+1]; //在月份的基础上增加小计列
...
//将数据封装到适合转化为JSON格式的对象
Map<String, List<Map<String, Object>>> outMap = new HashMap<String, List< Map<String, Object>>>();
List<Map<String,Object>> list = new ArrayList<Map<String, Object>>();
String[] monthArr = new String[] {"January","February","March","April","May",
"June","July","August","September","October","November","December"};
for (int i = 0; i < beforeMothsSales.length; i++) {
Map<String,Object> map = new HashMap<String, Object>();
map.put("id", i+1);
map.put("category", category[i]);
for (int j = 0; j < monthCount; j++) {
map.put(monthArr[j], beforeMothsSales[i][j]);
}
map.put("subtotal", beforeMothsSales[i][monthCount]);
list.add(map);
}
outMap.put("data", list);
return outMap;
}