開發技術
后端 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;
}