Repository navigation
Home
DongJae92 edited this page Aug 7, 2023
·
20 revisions
- 고객관리 : 일반 회원 수, 기업 회원 수를 가져와 출력하고 총 합계를 구한다.
- 오늘의 할 일 : 오늘까지 처리하지 않은 주문의 수를 가져와 출력한다.
- 일별 매출 현황 : 총 7일의 주문, 결제, 환불 내역을 가져와 차트로 표현한다.
- 오늘 날짜를 기준으로 3일 전, 최근 7일, 30일의 매출 현황을 표로 출력한다.
AdminController.java
//관리자 - AdminController
@Controller
@RequestMapping("/admin/*")
@RequiredArgsConstructor
public class AdminController {
private final AdminService adminService;
private final ProductFileService productFileService;
@GetMapping("/adminMain")
public String adminMain(HttpServletRequest req){
// 세션체크
Long adminNumber = 0L;
if (AdminUtil.sessionCheck(req)==0L) {
return "/admin/adminLogin";
} else {
adminNumber = AdminUtil.sessionCheck(req);
}return "/admin/adminMain";
}
}
AdminRestController.java
//관리자 - AdminRestController
@RestController
@RequiredArgsConstructor
@RequestMapping("/admins/v1/*")
public class AdminRestController {
private final AdminService adminService;
private final ProductFileService productFileService;
private final OrderService orderService;
// 회원 수 조회
@GetMapping("/totalCount")
public UserTotalVo userTotalCount(){
return adminService.getUserTotal();
}
// 주문 상태 수 조회
@GetMapping("/statusCount")
public List<OrderDto> statusCount(){
List<OrderDto> statusCount = adminService.getStatusCount();
return statusCount;
}
// 7일 간 주문, 결제, 환불 내역 조회(chart)
@GetMapping("/weeklyChart")
public Map<String,Object> weeklyChart(){
List<DailyOrderVo> weeklyOrder = orderService.weeklyOrder();
List<DailyOrderVo> weeklyPayment = orderService.weeklyPayment();
List<DailyOrderVo> weeklyRefund = orderService.weeklyRefund();
Map<String,Object> weeklyTotal = new HashMap<>();
weeklyTotal.put("weeklyOrder", weeklyOrder);
weeklyTotal.put("weeklyPayment", weeklyPayment);
weeklyTotal.put("weeklyRefund", weeklyRefund);
return weeklyTotal;
}
// 최근 30일 간 주문, 결제, 환불 내역 조회
@GetMapping("/monthlyTotal")
public Map<String,Object> monthlyTotal(){
List<DailyOrderVo> monthlyOrder = orderService.monthlyOrder();
List<DailyOrderVo> monthlyPayment = orderService.monthlyPayment();
List<DailyOrderVo> monthlyRefund = orderService.monthlyRefund();
Map<String,Object> monthlyTotal = new HashMap<>();
monthlyTotal.put("monthlyOrder", monthlyOrder);
monthlyTotal.put("monthlyPayment", monthlyPayment);
monthlyTotal.put("monthlyRefund", monthlyRefund);
return monthlyTotal;
}
// 최근 4일 간 주문, 결제, 환불 내역 조회
@GetMapping("/dailyOrder")
public List<DailyOrderVo> dailyOrder(){
List<DailyOrderVo> dailyOrders = orderService.dailyOrder();
return dailyOrders;
}
@GetMapping("/dailyPayment")
public List<DailyOrderVo> dailyPayment(){
List<DailyOrderVo> dailyPayments = orderService.dailyPayment();
return dailyPayments;
}
@GetMapping("/dailyRefund")
public List<DailyOrderVo> dailyRefund(){
List<DailyOrderVo> dailyRefunds = orderService.dailyRefund();
return dailyRefunds;
}
}AdminMapper.java
@Mapper
public interface AdminMapper {
// 4일 간 주문, 결제, 환불 내역
List<DailyOrderVo> selectOrder();
List<DailyOrderVo> selectPayment();
List<DailyOrderVo> selectRefund();
// 7일 간 주문, 결제, 환불 내역
List<DailyOrderVo> weeklyOrder();
List<DailyOrderVo> weeklyPayment();
List<DailyOrderVo> weeklyRefund();
// 30일 간 주문, 결제, 환불 내역
List<DailyOrderVo> monthlyOrder();
List<DailyOrderVo> monthlyPayment();
List<DailyOrderVo> monthlyRefund();
// 주문 상태 별 수
List<OrderDto> statusCount();
// 회원 수
UserTotalVo userTotalCount();
}AdminService.java
@Service
@RequiredArgsConstructor
@Transactional
public class AdminService {
private final AdminMapper adminMapper;
private final ProductFileService productFileService;
// 일반, 기업회원 조회 및 총합
public UserTotalVo getUserTotal(){
return adminMapper.userTotalCount();
}
// 주문 상태 수 조회
public List<OrderDto> getStatusCount(){
return adminMapper.statusCount();
}
}OrderService.java
package com.example.mealme.service.admin;
import com.example.mealme.mapper.AdminMapper;
import com.example.mealme.mapper.OrderMapper;
import com.example.mealme.vo.DailyOrderVo;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
@Service
@RequiredArgsConstructor
@Transactional
public class OrderService {
private final AdminMapper adminMapper;
// 4일 간 주문, 결제, 환불 내역
public List<DailyOrderVo> dailyOrder(){
return adminMapper.selectOrder();
}
public List<DailyOrderVo> dailyPayment(){
return adminMapper.selectPayment();
}
public List<DailyOrderVo> dailyRefund(){
return adminMapper.selectRefund();
}
// 7일 간 주문, 결제, 환불 내역
public List<DailyOrderVo> weeklyOrder(){
return adminMapper.weeklyOrder();
}
public List<DailyOrderVo> weeklyPayment(){
return adminMapper.weeklyPayment();
}
public List<DailyOrderVo> weeklyRefund(){
return adminMapper.weeklyRefund();
}
// 30일 간 주문, 결제, 환불 내역
public List<DailyOrderVo> monthlyOrder(){
return adminMapper.monthlyOrder();
}
public List<DailyOrderVo> monthlyPayment(){
return adminMapper.monthlyPayment();
}
public List<DailyOrderVo> monthlyRefund(){
return adminMapper.monthlyRefund();
}
}AdminMapper.xml
<?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="com.example.mealme.mapper.AdminMapper">
// 회원 수 조회
<select id="userTotalCount" resultType="userTotalVo">
SELECT
(SELECT COUNT(USER_NUMBER) FROM TBL_USER) AS USER_COUNT,
(SELECT COUNT(COMPANY_NUMBER) FROM TBL_COMPANY) AS COMPANY_COUNT,
(SELECT COUNT(USER_NUMBER) FROM TBL_USER) + (SELECT COUNT(COMPANY_NUMBER) FROM TBL_COMPANY) AS TOTAL_COUNT
FROM DUAL
</select>
// 주문 상태 수 조회
<select id="statusCount" resultType="orderDto">
SELECT ORDER_CONDITION_CODE, COUNT(ORDER_NUMBER) AS ORDER_COUNT
FROM TBL_ORDER
WHERE ORDER_CONDITION_CODE IN (2, 5, 3, 8, 7) AND TRUNC(sysdate) >= TRUNC(ORDER_DATE)
GROUP BY ORDER_CONDITION_CODE
</select>
// 4일 간 주문 내역 조회
<select id="selectOrder" resultType="DailyOrderVo" >
WITH date_range AS (
SELECT TRUNC(sysdate) - LEVEL + 1 AS order_date
FROM dual
CONNECT BY 4 >= LEVEL
)
SELECT TO_CHAR(DR.order_date, 'YYYY-MM-DD') AS ORDER_DATE,
NVL(SUM(CASE WHEN O.ORDER_NUMBER IS NOT NULL AND (O.ORDER_CONDITION_CODE = 6 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_COUNT ELSE 0 END), 0) AS TOTAL_ORDER_COUNT,
NVL(SUM(CASE WHEN O.ORDER_NUMBER IS NOT NULL AND (O.ORDER_CONDITION_CODE = 6 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_COUNT * P.PRODUCT_PRICE ELSE 0 END), 0) AS TOTAL_PRICE,
COUNT(CASE WHEN O.ORDER_CONDITION_CODE IS NOT NULL AND (O.ORDER_CONDITION_CODE = 6 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_CONDITION_CODE END) AS ORDER_NUMBER_COUNT
FROM date_range DR
LEFT JOIN TBL_ORDER O ON TRUNC(O.ORDER_DATE) = TRUNC(DR.order_date)
LEFT JOIN TBL_PRODUCT P ON O.PRODUCT_NUMBER = P.PRODUCT_NUMBER
WHERE TRUNC(DR.order_date) BETWEEN TRUNC(sysdate) - 4 AND TRUNC(sysdate)
GROUP BY DR.order_date
ORDER BY DR.order_date
</select>
// 4일 간 결제 내역 조회
<select id="selectPayment" resultType="DailyOrderVo" >
WITH date_range AS (
SELECT TRUNC(sysdate) - LEVEL + 1 AS order_date
FROM dual
CONNECT BY 4 >= LEVEL
)
SELECT TO_CHAR(DR.order_date, 'YYYY-MM-DD') AS ORDER_DATE,
NVL(SUM(CASE WHEN O.ORDER_NUMBER IS NOT NULL AND (O.ORDER_CONDITION_CODE = 2 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_COUNT ELSE 0 END), 0) AS TOTAL_ORDER_COUNT,
NVL(SUM(CASE WHEN O.ORDER_NUMBER IS NOT NULL AND (O.ORDER_CONDITION_CODE = 2 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_COUNT * P.PRODUCT_PRICE ELSE 0 END), 0) AS TOTAL_PRICE,
COUNT(CASE WHEN O.ORDER_CONDITION_CODE IS NOT NULL AND (O.ORDER_CONDITION_CODE = 2 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_CONDITION_CODE END) AS ORDER_NUMBER_COUNT
FROM date_range DR
LEFT JOIN TBL_ORDER O ON TRUNC(O.ORDER_DATE) = TRUNC(DR.order_date)
LEFT JOIN TBL_PRODUCT P ON O.PRODUCT_NUMBER = P.PRODUCT_NUMBER
WHERE TRUNC(DR.order_date) BETWEEN TRUNC(sysdate) - 4 AND TRUNC(sysdate)
GROUP BY DR.order_date
ORDER BY DR.order_date
</select>
// 4일 간 환불 내역 조회
<select id="selectRefund" resultType="DailyOrderVo" >
WITH date_range AS (
SELECT TRUNC(sysdate) - LEVEL + 1 AS order_date
FROM dual
CONNECT BY 4 >= LEVEL
)
SELECT TO_CHAR(DR.order_date, 'YYYY-MM-DD') AS ORDER_DATE,
NVL(SUM(CASE WHEN O.ORDER_NUMBER IS NOT NULL AND (O.ORDER_CONDITION_CODE = 11 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_COUNT ELSE 0 END), 0) AS TOTAL_ORDER_COUNT,
NVL(SUM(CASE WHEN O.ORDER_NUMBER IS NOT NULL AND (O.ORDER_CONDITION_CODE = 11 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_COUNT * P.PRODUCT_PRICE ELSE 0 END), 0) AS TOTAL_PRICE,
COUNT(CASE WHEN O.ORDER_CONDITION_CODE IS NOT NULL AND (O.ORDER_CONDITION_CODE = 11 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_CONDITION_CODE END) AS ORDER_NUMBER_COUNT
FROM date_range DR
LEFT JOIN TBL_ORDER O ON TRUNC(O.ORDER_DATE) = TRUNC(DR.order_date)
LEFT JOIN TBL_PRODUCT P ON O.PRODUCT_NUMBER = P.PRODUCT_NUMBER
WHERE TRUNC(DR.order_date) BETWEEN TRUNC(sysdate) - 4 AND TRUNC(sysdate)
GROUP BY DR.order_date
ORDER BY DR.order_date
</select>
// 7일 간 주문 내역 조회
<select id="weeklyOrder" resultType="DailyOrderVo" >
WITH date_range AS (
SELECT TRUNC(sysdate) - LEVEL + 1 AS order_date
FROM dual
CONNECT BY 7 >= LEVEL
)
SELECT TO_CHAR(DR.order_date, 'YYYY-MM-DD') AS ORDER_DATE,
NVL(SUM(CASE WHEN O.ORDER_NUMBER IS NOT NULL AND (O.ORDER_CONDITION_CODE = 6 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_COUNT ELSE 0 END), 0) AS TOTAL_ORDER_COUNT,
NVL(SUM(CASE WHEN O.ORDER_NUMBER IS NOT NULL AND (O.ORDER_CONDITION_CODE = 6 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_COUNT * P.PRODUCT_PRICE ELSE 0 END), 0) AS TOTAL_PRICE,
COUNT(CASE WHEN O.ORDER_CONDITION_CODE IS NOT NULL AND (O.ORDER_CONDITION_CODE = 6 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_CONDITION_CODE END) AS ORDER_NUMBER_COUNT
FROM date_range DR
LEFT JOIN TBL_ORDER O ON TRUNC(O.ORDER_DATE) = TRUNC(DR.order_date)
LEFT JOIN TBL_PRODUCT P ON O.PRODUCT_NUMBER = P.PRODUCT_NUMBER
WHERE TRUNC(DR.order_date) BETWEEN TRUNC(sysdate) - 7 AND TRUNC(sysdate)
GROUP BY DR.order_date
ORDER BY DR.order_date
</select>
// 7일 간 결제 내역 조회
<select id="weeklyPayment" resultType="DailyOrderVo" >
WITH date_range AS (
SELECT TRUNC(sysdate) - LEVEL + 1 AS order_date
FROM dual
CONNECT BY 7 >= LEVEL
)
SELECT TO_CHAR(DR.order_date, 'YYYY-MM-DD') AS ORDER_DATE,
NVL(SUM(CASE WHEN O.ORDER_NUMBER IS NOT NULL AND (O.ORDER_CONDITION_CODE = 2 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_COUNT ELSE 0 END), 0) AS TOTAL_ORDER_COUNT,
NVL(SUM(CASE WHEN O.ORDER_NUMBER IS NOT NULL AND (O.ORDER_CONDITION_CODE = 2 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_COUNT * P.PRODUCT_PRICE ELSE 0 END), 0) AS TOTAL_PRICE,
COUNT(CASE WHEN O.ORDER_CONDITION_CODE IS NOT NULL AND (O.ORDER_CONDITION_CODE = 2 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_CONDITION_CODE END) AS ORDER_NUMBER_COUNT
FROM date_range DR
LEFT JOIN TBL_ORDER O ON TRUNC(O.ORDER_DATE) = TRUNC(DR.order_date)
LEFT JOIN TBL_PRODUCT P ON O.PRODUCT_NUMBER = P.PRODUCT_NUMBER
WHERE TRUNC(DR.order_date) BETWEEN TRUNC(sysdate) - 7 AND TRUNC(sysdate)
GROUP BY DR.order_date
ORDER BY DR.order_date
</select>
// 7일 간 환불 내역 조회
<select id="weeklyRefund" resultType="DailyOrderVo" >
WITH date_range AS (
SELECT TRUNC(sysdate) - LEVEL + 1 AS order_date
FROM dual
CONNECT BY 7 >= LEVEL
)
SELECT TO_CHAR(DR.order_date, 'YYYY-MM-DD') AS ORDER_DATE,
NVL(SUM(CASE WHEN O.ORDER_NUMBER IS NOT NULL AND (O.ORDER_CONDITION_CODE = 11 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_COUNT ELSE 0 END), 0) AS TOTAL_ORDER_COUNT,
NVL(SUM(CASE WHEN O.ORDER_NUMBER IS NOT NULL AND (O.ORDER_CONDITION_CODE = 11 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_COUNT * P.PRODUCT_PRICE ELSE 0 END), 0) AS TOTAL_PRICE,
COUNT(CASE WHEN O.ORDER_CONDITION_CODE IS NOT NULL AND (O.ORDER_CONDITION_CODE = 11 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_CONDITION_CODE END) AS ORDER_NUMBER_COUNT
FROM date_range DR
LEFT JOIN TBL_ORDER O ON TRUNC(O.ORDER_DATE) = TRUNC(DR.order_date)
LEFT JOIN TBL_PRODUCT P ON O.PRODUCT_NUMBER = P.PRODUCT_NUMBER
WHERE TRUNC(DR.order_date) BETWEEN TRUNC(sysdate) - 7 AND TRUNC(sysdate)
GROUP BY DR.order_date
ORDER BY DR.order_date
</select>
// 30일 간 주문 내역 조회
<select id="monthlyOrder" resultType="DailyOrderVo" >
WITH date_range AS (
SELECT TRUNC(sysdate) - LEVEL + 1 AS order_date
FROM dual
CONNECT BY 30 >= LEVEL
)
SELECT TO_CHAR(DR.order_date, 'YYYY-MM-DD') AS ORDER_DATE,
NVL(SUM(CASE WHEN O.ORDER_NUMBER IS NOT NULL AND (O.ORDER_CONDITION_CODE = 6 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_COUNT ELSE 0 END), 0) AS TOTAL_ORDER_COUNT,
NVL(SUM(CASE WHEN O.ORDER_NUMBER IS NOT NULL AND (O.ORDER_CONDITION_CODE = 6 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_COUNT * P.PRODUCT_PRICE ELSE 0 END), 0) AS TOTAL_PRICE,
COUNT(CASE WHEN O.ORDER_CONDITION_CODE IS NOT NULL AND (O.ORDER_CONDITION_CODE = 6 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_CONDITION_CODE END) AS ORDER_NUMBER_COUNT
FROM date_range DR
LEFT JOIN TBL_ORDER O ON TRUNC(O.ORDER_DATE) = TRUNC(DR.order_date)
LEFT JOIN TBL_PRODUCT P ON O.PRODUCT_NUMBER = P.PRODUCT_NUMBER
WHERE TRUNC(DR.order_date) BETWEEN TRUNC(sysdate) - 30 AND TRUNC(sysdate)
GROUP BY DR.order_date
ORDER BY DR.order_date
</select>
// 30일 간 결제 내역 조회
<select id="monthlyPayment" resultType="DailyOrderVo" >
WITH date_range AS (
SELECT TRUNC(sysdate) - LEVEL + 1 AS order_date
FROM dual
CONNECT BY 30 >= LEVEL
)
SELECT TO_CHAR(DR.order_date, 'YYYY-MM-DD') AS ORDER_DATE,
NVL(SUM(CASE WHEN O.ORDER_NUMBER IS NOT NULL AND (O.ORDER_CONDITION_CODE = 2 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_COUNT ELSE 0 END), 0) AS TOTAL_ORDER_COUNT,
NVL(SUM(CASE WHEN O.ORDER_NUMBER IS NOT NULL AND (O.ORDER_CONDITION_CODE = 2 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_COUNT * P.PRODUCT_PRICE ELSE 0 END), 0) AS TOTAL_PRICE,
COUNT(CASE WHEN O.ORDER_CONDITION_CODE IS NOT NULL AND (O.ORDER_CONDITION_CODE = 2 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_CONDITION_CODE END) AS ORDER_NUMBER_COUNT
FROM date_range DR
LEFT JOIN TBL_ORDER O ON TRUNC(O.ORDER_DATE) = TRUNC(DR.order_date)
LEFT JOIN TBL_PRODUCT P ON O.PRODUCT_NUMBER = P.PRODUCT_NUMBER
WHERE TRUNC(DR.order_date) BETWEEN TRUNC(sysdate) - 30 AND TRUNC(sysdate)
GROUP BY DR.order_date
ORDER BY DR.order_date
</select>
// 30일 간 환불 내역 조회
<select id="monthlyRefund" resultType="DailyOrderVo" >
WITH date_range AS (
SELECT TRUNC(sysdate) - LEVEL + 1 AS order_date
FROM dual
CONNECT BY 30 >= LEVEL
)
SELECT TO_CHAR(DR.order_date, 'YYYY-MM-DD') AS ORDER_DATE,
NVL(SUM(CASE WHEN O.ORDER_NUMBER IS NOT NULL AND (O.ORDER_CONDITION_CODE = 11 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_COUNT ELSE 0 END), 0) AS TOTAL_ORDER_COUNT,
NVL(SUM(CASE WHEN O.ORDER_NUMBER IS NOT NULL AND (O.ORDER_CONDITION_CODE = 11 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_COUNT * P.PRODUCT_PRICE ELSE 0 END), 0) AS TOTAL_PRICE,
COUNT(CASE WHEN O.ORDER_CONDITION_CODE IS NOT NULL AND (O.ORDER_CONDITION_CODE = 11 OR O.ORDER_CONDITION_CODE IS NULL) THEN O.ORDER_CONDITION_CODE END) AS ORDER_NUMBER_COUNT
FROM date_range DR
LEFT JOIN TBL_ORDER O ON TRUNC(O.ORDER_DATE) = TRUNC(DR.order_date)
LEFT JOIN TBL_PRODUCT P ON O.PRODUCT_NUMBER = P.PRODUCT_NUMBER
WHERE TRUNC(DR.order_date) BETWEEN TRUNC(sysdate) - 30 AND TRUNC(sysdate)
GROUP BY DR.order_date
ORDER BY DR.order_date
</select>
</mapper>
admin.js
import * as daily from '../module/daily.js';
daily.getDailyOrder(chartDate,dailyOrder,showError);
chartDate();
// 날짜 형식 변환
function chartDate() {
let today = new Date();
let todayDates = [];
for(let i = 0; i < 4; i++){
let date = new Date(today);
date.setDate(date.getDate()-i);
let month = String(date.getMonth()+1).padStart(2,'0');
let day = String(date.getDate()).padStart(2,'0');
let formattedDate = month + '월' + day + '일';
todayDates.push(formattedDate);
console.log(formattedDate);
}
console.log(todayDates);
// 차트
let dayOfWeek = today.getDay();
let weekdays = ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"];
let todayIs = weekdays[dayOfWeek];
document.getElementById("weekDay").textContent = todayIs;
$('#dailyCountTitle1').text(todayDates[3]);
$('#dailyCountTitle2').text(todayDates[2]);
$('#dailyCountTitle3').text(todayDates[1]);
$('.dailyCountTitleToday').text(todayDates[0]);
$('.todayDayIs').text(todayDates[0]);
}
// 주문
function dailyOrder(order) {
console.log(order);
$('.dailyCountOrderPrice1').text(order[0].totalPrice);
$('.dailyCountOrderPrice2').text(order[1].totalPrice);
$('.dailyCountOrderPrice3').text(order[2].totalPrice);
$('.dailyCountOrderPrice4').text(order[3].totalPrice);
console.log(order[3].totalOrderCount);
$('.dailyCountOrderCount1').text(order[0].orderNumberCount);
$('.dailyCountOrderCount2').text(order[1].orderNumberCount);
$('.dailyCountOrderCount3').text(order[2].orderNumberCount);
$('.dailyCountOrderCount4').text(order[3].orderNumberCount);
}
daily.getDailyOrder(chartDate,dailyOrder,showError);
//주간 주문,결제,환불
function weeklyTotal(order){
let avgPrice = (order.weeklyOrder[0].totalPrice + order.weeklyOrder[1].totalPrice + order.weeklyOrder[2].totalPrice + order.weeklyOrder[3].totalPrice + order.weeklyOrder[4].totalPrice + order.weeklyOrder[5].totalPrice + order.weeklyOrder[6].totalPrice)/7;
$('.weeklyCountOrderPriceAvg').text(Math.round(avgPrice));
let avgCount = (order.weeklyOrder[0].orderNumberCount + order.weeklyOrder[1].orderNumberCount + order.weeklyOrder[2].orderNumberCount + order.weeklyOrder[3].orderNumberCount + order.weeklyOrder[4].orderNumberCount + order.weeklyOrder[5].orderNumberCount + order.weeklyOrder[6].orderNumberCount)/7;
$('.weeklyCountOrderCountAvg').text(Math.round(avgCount));
let avgPrice2 = (order.weeklyPayment[0].totalPrice + order.weeklyPayment[1].totalPrice + order.weeklyPayment[2].totalPrice + order.weeklyPayment[3].totalPrice + order.weeklyPayment[4].totalPrice + order.weeklyPayment[5].totalPrice + order.weeklyPayment[6].totalPrice)/7;
$('.weeklyCountPayedPriceAvg').text(Math.round(avgPrice2));
let avgCount2 = (order.weeklyPayment[0].orderNumberCount + order.weeklyPayment[1].orderNumberCount + order.weeklyPayment[2].orderNumberCount + order.weeklyPayment[3].orderNumberCount + order.weeklyPayment[4].orderNumberCount + order.weeklyPayment[5].orderNumberCount + order.weeklyPayment[6].orderNumberCount)/7;
$('.weeklyCountPayedCountAvg').text(Math.round(avgCount2));
let avgPrice3 = (order.weeklyRefund[0].totalPrice + order.weeklyRefund[1].totalPrice + order.weeklyRefund[2].totalPrice + order.weeklyRefund[3].totalPrice + order.weeklyRefund[4].totalPrice + order.weeklyRefund[5].totalPrice + order.weeklyRefund[6].totalPrice)/7;
$('.weeklyCountRefundPriceAvg').text(Math.round(avgPrice3));
let avgCount3 = (order.weeklyRefund[0].orderNumberCount + order.weeklyRefund[1].orderNumberCount + order.weeklyRefund[2].orderNumberCount + order.weeklyRefund[3].orderNumberCount + order.weeklyRefund[4].orderNumberCount + order.weeklyRefund[5].orderNumberCount + order.weeklyRefund[6].orderNumberCount)/7;
$('.weeklyCountRefundCountAvg').text(Math.round(avgCount3));
let totalPrice = order.weeklyOrder[0].totalPrice + order.weeklyOrder[1].totalPrice + order.weeklyOrder[2].totalPrice + order.weeklyOrder[3].totalPrice + order.weeklyOrder[4].totalPrice + order.weeklyOrder[5].totalPrice + order.weeklyOrder[6].totalPrice;
let totalCount = order.weeklyOrder[0].orderNumberCount + order.weeklyOrder[1].orderNumberCount + order.weeklyOrder[2].orderNumberCount + order.weeklyOrder[3].orderNumberCount + order.weeklyOrder[4].orderNumberCount + order.weeklyOrder[5].orderNumberCount + order.weeklyOrder[6].orderNumberCount;
$('.weeklyCountOrderPriceTotal').text(totalPrice);
$('.weeklyCountOrderCountTotal').text(totalCount);
let totalPrice2 = order.weeklyPayment[0].totalPrice + order.weeklyPayment[1].totalPrice + order.weeklyPayment[2].totalPrice + order.weeklyPayment[3].totalPrice + order.weeklyPayment[4].totalPrice + order.weeklyPayment[5].totalPrice + order.weeklyPayment[6].totalPrice;
let totalCount2 = order.weeklyPayment[0].orderNumberCount + order.weeklyPayment[1].orderNumberCount + order.weeklyPayment[2].orderNumberCount + order.weeklyPayment[3].orderNumberCount + order.weeklyPayment[4].orderNumberCount + order.weeklyPayment[5].orderNumberCount + order.weeklyPayment[6].orderNumberCount;
$('.weeklyCountPayedPriceTotal').text(totalPrice2);
$('.weeklyCountPayedCountTotal').text(totalCount2);
let totalPrice3 = order.weeklyRefund[0].totalPrice + order.weeklyRefund[1].totalPrice + order.weeklyRefund[2].totalPrice + order.weeklyRefund[3].totalPrice + order.weeklyRefund[4].totalPrice + order.weeklyRefund[5].totalPrice + order.weeklyRefund[6].totalPrice;
let totalCount3 = order.weeklyRefund[0].orderNumberCount + order.weeklyRefund[1].orderNumberCount + order.weeklyRefund[2].orderNumberCount + order.weeklyRefund[3].orderNumberCount + order.weeklyRefund[4].orderNumberCount + order.weeklyRefund[5].orderNumberCount + order.weeklyRefund[6].orderNumberCount;
$('.weeklyCountRefundPriceTotal').text(totalPrice3);
$('.weeklyCountRefundCountTotal').text(totalCount3);
}
daily.getWeeklyTotal(weeklyTotal,showError);
//월간 주문,결제,환불
function monthlyTotal(order){
let sum = 0;
let sum2 = 0;
let sum3 = 0;
let sum4 = 0;
let sum5 = 0;
let sum6 = 0;
for (let i = 0; i < 30; i++) {
sum += order.monthlyOrder[i].totalPrice;
sum2 += order.monthlyOrder[i].orderNumberCount;
sum3 += order.monthlyPayment[i].totalPrice;
sum4 += order.monthlyPayment[i].orderNumberCount;
sum5 += order.monthlyRefund[i].totalPrice;
sum6 += order.monthlyRefund[i].orderNumberCount;
}
console.log(sum);
let avgPrice = sum/30;
$('.monthlyCountOrderPriceAvg').text(Math.round(avgPrice));
let avgCount = sum2/30;
$('.monthlyCountOrderCountAvg').text(Math.round(avgCount));
let avgPrice2 = sum3/30;
$('.monthlyCountPayedPriceAvg').text(Math.round(avgPrice2));
let avgCount2 = sum4/30;
$('.monthlyCountPayedCountAvg').text(Math.round(avgCount2));
let avgPrice3 = sum5/30;
$('.monthlyCountRefundPriceAvg').text(Math.round(avgPrice3));
let avgCount3 = sum6/30;
$('.monthlyCountRefundCountAvg').text(Math.round(avgCount3));
let totalPrice = sum;
let totalCount = sum2;
$('.monthlyCountOrderPriceTotal').text(totalPrice);
$('.monthlyCountOrderCountTotal').text(totalCount);
let totalPrice2 = sum3;
let totalCount2 = sum4;
$('.monthlyCountPayedPriceTotal').text(totalPrice2);
$('.monthlyCountPayedCountTotal').text(totalCount2);
let totalPrice3 = sum5;
let totalCount3 = sum6;
$('.monthlyCountRefundPriceTotal').text(totalPrice3);
$('.monthlyCountRefundCountTotal').text(totalCount3);
}
daily.getMonthlyTotal(monthlyTotal,showError);
//결제
function dailyPayment(order) {
console.log(order);
$('.dailyCountPayedPrice1').text(order[0].totalPrice);
$('.dailyCountPayedPrice2').text(order[1].totalPrice);
$('.dailyCountPayedPrice3').text(order[2].totalPrice);
$('.dailyCountPayedPrice4').text(order[3].totalPrice);
$('.dailyCountPayedCount1').text(order[0].orderNumberCount);
$('.dailyCountPayedCount2').text(order[1].orderNumberCount);
$('.dailyCountPayedCount3').text(order[2].orderNumberCount);
$('.dailyCountPayedCount4').text(order[3].orderNumberCount);
}
daily.getDailyPayment(chartDate,dailyPayment,showError);
//환불
function dailyRefund(order) {
console.log(order);
$('.dailyCountRefundPrice1').text(order[0].totalPrice);
$('.dailyCountRefundPrice2').text(order[1].totalPrice);
$('.dailyCountRefundPrice3').text(order[2].totalPrice);
$('.dailyCountRefundPrice4').text(order[3].totalPrice);
$('.dailyCountRefundCount1').text(order[0].orderNumberCount);
$('.dailyCountRefundCount2').text(order[1].orderNumberCount);
$('.dailyCountRefundCount3').text(order[2].orderNumberCount);
$('.dailyCountRefundCount4').text(order[3].orderNumberCount);
}
daily.getDailyRefund(chartDate,dailyRefund,showError);
// 상태에 따른 개수 뽑기
function statusCount(status){
console.log(status)
status.forEach((item) => {
const orderConditionCode = item.orderConditionCode;
const orderCount = item.orderCount;
const spanElement = $(`.status input[value="${orderConditionCode}"]`).parent();
spanElement.text(orderCount);
})
}
daily.getStatusCount(statusCount,showError);
//일반,기업 회원 조회 및 총합
function userTotal(user){
console.log(user)
$('#n-user').text(user.userCount);
$('#c-user').text(user.companyCount);
$('#user-total').text(user.totalCount);
}
daily.getUserTotal(userTotal,showError);
//차트
daily.getWeeklyChart(weeklyChart,showError);
function weeklyChart(order) {
console.log(order);
let today = new Date();
let todayDates = [];
for (let i = 0; i < 7; i++) {
let date = new Date(today);
date.setDate(date.getDate() - i);
let year = date.getFullYear();
let month = String(date.getMonth() + 1).padStart(2, '0');
let day = String(date.getDate()).padStart(2, '0');
let formattedDate = month + '월' + day + '일';
todayDates.push(formattedDate);
}
var ctx = document.getElementById('myChart');
var data = {
labels: [todayDates[6], todayDates[5], todayDates[4], todayDates[3], todayDates[2], todayDates[1], todayDates[0]],
datasets: [
{
label: '주문',
data: [order.weeklyOrder[0].totalPrice, order.weeklyOrder[1].totalPrice, order.weeklyOrder[2].totalPrice, order.weeklyOrder[3].totalPrice, order.weeklyOrder[4].totalPrice, order.weeklyOrder[5].totalPrice, order.weeklyOrder[6].totalPrice],
borderColor: 'rgba(32, 178, 170, 0.7)',
backgroundColor: 'transparent',
},
{
label: '결제',
data: [order.weeklyPayment[0].totalPrice, order.weeklyPayment[1].totalPrice, order.weeklyPayment[2].totalPrice, order.weeklyPayment[3].totalPrice, order.weeklyPayment[4].totalPrice, order.weeklyPayment[5].totalPrice, order.weeklyPayment[6].totalPrice],
borderColor: 'rgba(255, 26, 104, 0.7)',
backgroundColor: 'transparent',
},
{
label: '환불',
data: [order.weeklyRefund[0].totalPrice, order.weeklyRefund[1].totalPrice, order.weeklyRefund[2].totalPrice, order.weeklyRefund[3].totalPrice, order.weeklyRefund[4].totalPrice, order.weeklyRefund[5].totalPrice, order.weeklyRefund[6].totalPrice],
borderColor: 'rgba(255, 206, 86, 0.7)',
backgroundColor: 'transparent',
}
// Add more datasets if needed
],
};
new Chart(ctx, {
type: 'line',
data: data,
options: {
responsive: true,
plugins: {
legend: {
position: 'top',
},
title: {
display: true
},
},
scales:{
x:{
ticks:{
font:{
size: 10,
}
}
}
}
},
});
}
function showError(a, b, c){
console.log(c);
}daily.js
/**
* admin.js와 연결된 module입니다.
* @param callback chartDate 함수를 가져옵니다. order객체를 통해 날짜 정보를 가져옵니다.
* @param callbackOrder dailyOrder 함수를 가져옵니다. order객체를 통해
* 주문 내역과 관련된 totalPrice, orderNumberCount를 가져옵니다.
* @param error
*/
export function getDailyOrder(callback,callbackOrder,error){
$.ajax({
url : `/admins/v1/dailyOrder`,
type : 'get',
dataType : 'json',
success : function (order){
if(callback){
callback(order);
callbackOrder(order);
}
},
error : error
});
}
/**
*
* @param callback chartDate 함수를 가져옵니다. order객체를 통해 날짜 정보를 가져옵니다.
* @param callbackOrder dailyPayment 함수를 가져옵니다. order객체를 통해
* 결제 내역과 관련된 totalPrice, orderNumberCount를 가져옵니다.
* @param error
*/
export function getDailyPayment(callback,callbackOrder,error){
$.ajax({
url : `/admins/v1/dailyPayment`,
type : 'get',
dataType : 'json',
success : function (order){
if(callback){
callback(order);
callbackOrder(order);
}
},
error : error
});
}
/**
*
* @param callback chartDate 함수를 가져옵니다. order객체를 통해 날짜 정보를 가져옵니다.
* @param callbackOrder dailyRefund 함수를 가져옵니다. order객체를 통해
* 환불 내역과 관련된 totalPrice, orderNumberCount를 가져옵니다.
* @param error
*/
export function getDailyRefund(callback,callbackOrder,error){
$.ajax({
url : `/admins/v1/dailyRefund`,
type : 'get',
dataType : 'json',
success : function (order){
if(callback){
callback(order);
callbackOrder(order);
}
},
error : error
});
}
/**
*
* @param callback weeklyChart 함수를 가져옵니다.
* order객체를 통해 7일 간의 주문, 결제, 환불에 대한 totalPrice와
* 날짜 정보를 가져옵니다.
* chart.js를 활용했습니다.
* @param error
*/
export function getWeeklyChart(callback,error){
$.ajax({
url : `/admins/v1/weeklyChart`,
type : 'get',
dataType : 'json',
success : function (order){
if(callback){
callback(order);
}
},
error : error
});
}
/**
*
* @param callback weeklyTotal 함수를 불러옵니다.
* order객체를 통해 7일 간의 주문, 결제, 환불과 관련된 totalPrice와 orderNumberCount를 가져옵니다.
* 총 합과 평균을 구하여 출력합니다.
* @param error
*/
export function getWeeklyTotal(callback,error){
$.ajax({
url : `/admins/v1/weeklyTotal`,
type : 'get',
dataType : 'json',
success : function (order){
if(callback){
callback(order);
}
},
error : error
});
}
/**
*
* @param callback monthlyTotal 함수를 불러옵니다.
* order객체를 통해 30일 간의 주문, 결제, 환불과 관련된 totalPrice와 orderNumberCount를 가져옵니다.
* 총 합과 평균을 구하여 출력합니다.
* @param error
*/
export function getMonthlyTotal(callback,error){
$.ajax({
url : `/admins/v1/monthlyTotal`,
type : 'get',
dataType : 'json',
success : function (order){
if(callback){
callback(order);
}
},
error : error
});
}
/**
*
* @param callback statusCount 함수를 불러옵니다.
* order객체를 통해 주문 상태에 따른 orderCount를 가져옵니다.
* 주문 상태를 알려주는 orderConditionCode에 알맞은 orderCount가 출력됩니다.
* @param error
*/
export function getStatusCount(callback,error){
$.ajax({
url : `/admins/v1/statusCount`,
type : 'get',
dataType : 'json',
success : function (order){
if(callback){
callback(order);
}
},
error : error
});
}
/**
*
* @param callback userTotal 함수를 불러옵니다.
* order객체를 통해 일반 회원 수인 userCount, 기업 회원 수인 companyCount,
* 두 회원 수를 합한 totalCount를 출력합니다.
* @param error
*/
export function getUserTotal(callback,error){
$.ajax({
url : `/admins/v1/totalCount`,
type : 'get',
dataType : 'json',
success : function (order){
if(callback){
callback(order);
}
},
error : error
});
}Image
- 회원정보 조회 : 이름, 아이디, 이메일을 검색하여 회원을 조회합니다.
- 회원 목록 : 검색한 결과를 출력합니다. 총 회원 수와 검색 결과 건수를 보여주며, 체크 박스를 선택한 회원을 탈퇴 시킬 수 있습니다.
AdminController
@Controller
@RequestMapping("/admin/*")
@RequiredArgsConstructor
public class AdminController {
private final AdminService adminService;
private final ProductFileService productFileService;
@GetMapping("/userList")
public String userList(HttpServletRequest req){
// 세션체크
Long adminNumber = 0L;
if (AdminUtil.sessionCheck(req)==0L) {
return "/admin/adminLogin";
} else {
adminNumber = AdminUtil.sessionCheck(req);
}return "/admin/userList";
}
}AdminRestController
@RestController
@RequiredArgsConstructor
@RequestMapping("/admins/v1/*")
public class AdminRestController {
private final AdminService adminService;
private final ProductFileService productFileService;
private final OrderService orderService;
/**
*
* @param page -> @PathVariable을 이용하여 URI값에 page라는 변수를 전달하여 처리하였습니다.
* @param searchVo -> searchVo는 keyword, searchType, productType을 가지고 있으며
* 검색을 위해 만든 vo입니다.
* @return -> pageVo, userList(회원목록), userTotal(총 회원 수), searchTotal(검색 결과에 따른 회원 수)를
* findUser 객체에 넣어 return합니다.
*/
@GetMapping("/searchUserList/{page}")
public Map<String, Object> findUserList(@PathVariable("page") int page, SearchVo searchVo) {
Criteria criteria = new Criteria(page, 10);
PageVo pageVo = new PageVo(criteria, adminService.getTotal(searchVo));
List<UserDto> searchUser = adminService.searchUserList(searchVo, criteria);
int userTotal = adminService.userTotal();
int searchTotal = adminService.getTotal(searchVo);
Map<String, Object> findUser = new HashMap<>();
findUser.put("pageVo", pageVo);
findUser.put("userList", searchUser);
findUser.put("userTotal", userTotal);
findUser.put("searchTotal", searchTotal);
return findUser;
}
/**
*
* @param checkBoxArr -> RequestBody를 통해 JSON형태의 데이터를 checkBoxArr이라는 JAVA객체에 넣었습니다.
* @return -> checkBoxArr은 선택된 체크박스에 해당하는 userNumber을 가지고 있는 객체입니다.
* 한번에 여러 개를 선택할 수 있으며 배열 형태로 가져옵니다.
* 가져온 userNumber을 조회하여 회원탈퇴를 진행하는 과정입니다.
*/
@PostMapping(value = "/deleteUserList")
public Map<String, List<String>> deleteUserList(@RequestBody Map<String, List<String>> checkBoxArr) {
System.out.println("=============================================================");
System.out.println(checkBoxArr);
List<String> numberList = checkBoxArr.get("checkBoxArr");
String checkNum = "";
for (String str : numberList) {
checkNum = str;
adminService.deleteUserList(Collections.singletonList(checkNum));
}
return checkBoxArr;
}
}AdminMapper.java
@Mapper
public interface AdminMapper {
// 전체 회원 조회
List<UserDto> selectAll();
// 검색 회원 조회
List<UserDto> searchUser(@Param("searchVo") SearchVo searchVo , @Param("criteria") Criteria criteria);
// 회원 삭제
Long delete(String userNumber);
// 검색 결과에 따른 회원 수 조회
public int selectTotal(@Param("searchVo")SearchVo searchVo);
// 전체 회원 수
int userTotal();
}AdminService
@Service
@RequiredArgsConstructor
@Transactional
public class AdminService {
private final AdminMapper adminMapper;
private final ProductFileService productFileService;
// 검색 회원 조회
public List<UserDto> searchUserList(SearchVo searchVo, Criteria criteria){
return adminMapper.searchUser(searchVo, criteria);
}
// 유저 삭제
/**
*
* @param checkBoxArr -> 선택된 체크박스를 배열 형태로 담은 객체입니다.
* 체크박스마다 userNumber을 가지고 있으며 이를 조회하여
* 회원정보를 삭제하는 서비스입니다.
*/
public void deleteUserList(List<String> checkBoxArr){
if(checkBoxArr == null){
throw new IllegalArgumentException("회원을 선택하세요.");
}
for(int i=0; i<checkBoxArr.size(); i++){
adminMapper.delete(checkBoxArr.get(i));
}
}
}AdminMapper.xml
<?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="com.example.mealme.mapper.AdminMapper">
// 검색한 회원 조회
<select id="searchUser" resultType="userDto">
SELECT USER_NUMBER, USER_NAME, USER_BIRTH, USER_ID, USER_GENDER, USER_PHONE_NUMBER, USER_ADDRESS1, USER_EMAIL,
TO_CHAR(USER_JOIN_DATE, 'yyyy-mm-dd') USER_JOIN_DATE
FROM( SELECT ROWNUM AS RNUM, USER_NUMBER, USER_NAME, USER_BIRTH, USER_ID, USER_GENDER, USER_PHONE_NUMBER,
USER_ADDRESS1, USER_EMAIL, USER_JOIN_DATE
FROM( SELECT USER_NUMBER, USER_NAME, USER_BIRTH, USER_ID, USER_GENDER, USER_PHONE_NUMBER, USER_ADDRESS1,
USER_EMAIL, USER_JOIN_DATE
FROM TBL_USER where 1 = 1
<if test="!searchVo.keyword.equals('')">
<if test="searchVo.searchType.equals('name')">and USER_NAME like '%'|| #{searchVo.keyword}|| '%'
</if>
<if test="searchVo.searchType.equals('id')">
and USER_ID like '%'|| #{searchVo.keyword}|| '%'
</if>
<if test="searchVo.searchType.equals('email')">
and USER_EMAIL like '%'|| #{searchVo.keyword}|| '%'
</if>
</if>
)S1
<![CDATA[
WHERE ROWNUM <= #{criteria.page} * #{criteria.amount}
]]>
)S2
WHERE RNUM > (#{criteria.page} - 1) * #{criteria.amount}
</select>
// 회원 탈퇴
<delete id="delete">
DELETE
FROM TBL_USER
WHERE USER_NUMBER = #{userNumber}
</delete>
// 총 회원 수 조회
<select id="userTotal" resultType="_int">
SELECT COUNT(USER_NUMBER) FROM TBL_USER
</select>
// 검색 결과로 나온 회원 수 조회
<select id="selectTotal" resultType="_int">
SELECT COUNT(USER_NUMBER) FROM TBL_USER
<where>
<if test="!searchVo.keyword.equals('')">
<if test="searchVo.searchType.equals('name')">
USER_NAME like '%'|| #{searchVo.keyword}|| '%'
</if>
<if test="searchVo.searchType.equals('id')">
USER_ID like '%'|| #{searchVo.keyword}|| '%'
</if>
<if test="searchVo.searchType.equals('email')">
USER_EMAIL like '%'|| #{searchVo.keyword}|| '%'
</if>
</if>
</where>
</select>
</mapper>searchUser.js
import * as user from '../module/userList.js';
let page = 1;
user.searchUserList({searchType:'', keyword:'', page : page}, userList, paging, userTotal, showError);
// 전체 회원 리스트
function userList(map){
console.log(map);
let list ='';
map.forEach(u => {
list += `
<tr class="user-num" data-num="${u.userNumber}">
<th>
<input type="checkbox" name="chk" value="${u.userNumber}" data-idx="">
</th>
<th scope="col" style="font-size: 13px; font-weight: 10;">${u.userJoinDate}</th>
<th scope="col" style="font-size: 13px; font-weight: 10;">${u.userName}</th>
<th scope="col" style="font-size: 13px; font-weight: 10;">${u.userId}</th>
<th scope="col" style="font-size: 13px; font-weight: 10;">${u.userPhoneNumber}</th>
<th scope="col" style="font-size: 13px; font-weight: 10;">${u.userGender}</th>
<th scope="col" style="font-size: 13px; font-weight: 10;">${u.userAddress1}</th>
<th scope="col" style="font-size: 13px; font-weight: 10;">${u.userEmail}</th>
`;
list += `</tr>`;
});
$('.check').html(list);
}
//페이징 처리
function paging(pageInfo){
console.log("===========================");
console.log(pageInfo);
let page ='';
if(pageInfo.prev){
page += `
<a href="" data-page=${pageInfo.startPage-1} class="arrow prev"></a>
`}
for(let i = pageInfo.startPage; i<=pageInfo.endPage; i++){
if(i == pageInfo.criteria.page){
page += `
<a href="#" data-page="${i}" class="active">${i}</a>
`
}else{
page += `
<a href="#" data-page="${i}">${i}</a>
`
}
}
if(pageInfo.next) {
page += `
<a href="" data-page=${pageInfo.endPage + 1} class="arrow next""></a>
`
}
$(".page_nation").html(page);
}
//페이징 클릭 이벤트
$('.page_nation').on('click','a', function (e){
e.preventDefault();
let searchKeyword = $('#keyword').val();
let searchType = $('.fSelect').val();
let page = $(this).data('page');
console.log(page)
user.searchUserList({searchType:searchType, keyword:searchKeyword, page : page}, userList, paging, showError);
});
function userTotal(total) {
console.log(total);
$('.userTotal').text(total.userTotal);
$('.searchTotal').text(total.searchTotal);
}
// 검색 조건에 따른 회원 조회
$('.btn-image').on('click', function (){
let searchKeyword = $('#keyword').val();
let searchType = $('.fSelect').val();
let page = 1;
user.searchUserList({keyword : searchKeyword, searchType : searchType, page: page}, userList,paging,userTotal,showError);
user.userTotal({keyword : searchKeyword, searchType : searchType},userTotal,showError);
// $('#keyword').val('');
})
// 검색 input칸 엔터 이벤트
$('#keyword').on('keydown', function (e){
console.log('++++++++++++++++++++++++++++');
console.log(e.code);
console.log(e.keyCode);
if(e.keyCode == 13){
console.log('Enter');
let searchKeyword = $('#keyword').val();
let searchType = $('.fSelect').val();
let page = 1;
user.searchUserList({keyword : searchKeyword, searchType : searchType, page: page}, userList,paging,userTotal, showError);
}
});
// 체크박스 선택
$(document).ready(function() {
$("#cbx_chkAll").click(function() {
if($("#cbx_chkAll").is(":checked")) $("input[name=chk]").prop("checked", true);
else $("input[name=chk]").prop("checked", false);
});
$("input[name=chk]").click(function() {
var total = $("input[name=chk]").length;
var checked = $("input[name=chk]:checked").length;
if(total != checked) $("#cbx_chkAll").prop("checked", false);
else $("#cbx_chkAll").prop("checked", true);
});
});
$(".deleteBtn").on('click',function (){
let checkBoxArr = userDelete();
console.log(checkBoxArr);
var confirmAlert = confirm("정말로 삭제하시겠습니까?");
user.deleteUserList({checkBoxArr: checkBoxArr},confirmAlert ,showError);
user.findUserList(userList ,showError);
});
function userDelete(){
var checkBoxArr = [];
$("input:checkbox[name=chk]:checked").each(function (){
checkBoxArr.push($(this).val());
console.log("================================");
console.log(checkBoxArr);
console.log("================================");
});
console.log(checkBoxArr)
if(checkBoxArr==""){
alert("삭제할 회원을 선택해주세요.");
return false;
}
return checkBoxArr;
}
function showError(a, b, c){
console.error(c);
}userList.js
/**
* searchUser.js와 연결된 module입니다.
* @param obj -> obj 객체가 가지고 있는 data인 keyword, searchType를
* json 타입으로 보냅니다.
* @param callback ->
* @param error
*/
export function userTotal(obj,callback,error){
$.ajax({
url: '/admins/v1/userTotal',
type: 'get',
data: {keyword : obj.keyword, searchType : obj.searchType},
dataType: 'json',
success: function (map){
if(callback){
callback(map);userTotal 함수를 불러옵니다.
}
},
error: error
});
}
/**
*
* @param obj -> obj 객체가 가지고 있는 data인 keyword, searchType를
* json 타입으로 보냅니다.
* @param callback -> userList 함수를 불러옵니다. userNumber에 해당하는 회원을 뽑아옵니다.
* @param pageCallback -> paging 함수를 불러옵니다. 로직을 만들어 for문과 if문으로 페이징 처리를 했습니다.
* map 객체를 통해 page 정보를 가져옵니다.
* @param userTotal -> userTotal 함수를 불러옵니다. map 객체를 통해 회원의 수를 가져옵니다.
* @param error
*/
export function searchUserList(obj, callback, pageCallback,userTotal, error){
// let searchKeyword = $('#keyword').val()
$.ajax({
url: `/admins/v1/searchUserList/${obj.page}`,
type: 'get',
data: {keyword : obj.keyword, searchType : obj.searchType},
dataType: 'json',
success: function (map){
if(callback){
callback(map.userList);
pageCallback(map.pageVo);
userTotal(map);
}
},
error: error
});
}
/**
*
* @param checkBoxArr -> 선택된 체크박스를 배열 형태로 담은 객체입니다.
* 체크박스마다 userNumber을 가지고 있으며 이를 조회하여
* 회원정보를 삭제합니다.
* @param confirmAlert -> 정상적으로 삭제되면 alert가 화면에 출력됩니다.
* @param error
*/
export function deleteUserList(checkBoxArr,confirmAlert,error) {
console.log(JSON.stringify(checkBoxArr))
// if(comfirmAlert) {
$.ajax({
url: '/admins/v1/deleteUserList',
data: JSON.stringify(checkBoxArr),
type: 'post',
traditional: true,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (result) {
console.log(result);
alert("해당 회원이 정상적으로 삭제되었습니다.")
location.reload();
},
error: error
});
}Image
- 회원정보 조회 : 기업이름, 아이디, 이메일을 검색하여 기업 회원을 조회합니다.
- 회원 목록 : 검색한 결과를 출력합니다. 총 기업 회원 수와 검색 결과 건수를 보여주며, 체크 박스를 선택한 회원을 승인하거나 승인을 취소할 수 있습니다.
- 상태 변경 : 상태 변경을 통해 화면 구성이 바뀌도록 동적인 처리를 했습니다.
AdminController.java
@Controller
@RequestMapping("/admin/*")
@RequiredArgsConstructor
public class AdminController {
private final AdminService adminService;
private final ProductFileService productFileService;
@GetMapping("/companyList")
public String companyList(HttpServletRequest req){
// 세션체크
Long adminNumber = 0L;
if (AdminUtil.sessionCheck(req)==0L) {
return "/admin/adminLogin";
} else {
adminNumber = AdminUtil.sessionCheck(req);
}return "/admin/companyList";
}
}AdminRestController
@RestController
@RequiredArgsConstructor
@RequestMapping("/admins/v1/*")
public class AdminRestController {
private final AdminService adminService;
private final ProductFileService productFileService;
private final OrderService orderService;
/**
*
* @param companyNumber RequestBody를 통해 JSON형태의 데이터를 companyNumber라는 JAVA객체에 넣었습니다.
*/
@PostMapping("/modifyStatus")
public void statusModify(@RequestBody Map<String, Object> companyNumber){
System.out.println(companyNumber);
List<String> numberList = (List<String>) companyNumber.get("companyNumber");
Long companyStatus = Long.parseLong((String)companyNumber.get("companyStatus"));
adminService.modifyCompanyStatus(companyStatus,numberList);
}
/**
*
* @param companyNumber RequestBody를 통해 JSON형태의 데이터를 companyNumber라는 JAVA객체에 넣었습니다.
* 위의 statusModify는 승인된 기업을 나타내며 statusCancel은 미승인 기업을 나타냅니다.
* 페이지를 동적으로 표현하기 위해 status에 따라 다른 메소드를 만들었습니다.
*/
@PostMapping("/modifyStatus2")
public void statusCancel(@RequestBody Map<String, Object> companyNumber){
System.out.println(companyNumber);
List<String> numberList = (List<String>) companyNumber.get("companyNumber");
Long companyStatus = Long.parseLong((String)companyNumber.get("companyStatus"));
adminService.modifyCompanyStatus(companyStatus,numberList);
}
/**
*
* @param page @PathVariable을 이용하여 URI값에 page라는 변수를 전달하여 처리하였습니다.
* @param searchCompanyVo -> keyword, searchType, productType을 가지고 있으며
* 검색을 위해 만든 vo입니다.
* @return -> pageVo, companyList(기업회원 목록), companyTotal(총 기업 수), searchTotal(검색 결과에 따른 기업 수)를
* findCompany 객체에 넣어 return합니다.
*/
@GetMapping("/searchCompanyList/{page}")
public Map<String, Object> findCompanyList(@PathVariable("page") int page, SearchCompanyVo searchCompanyVo) {
Criteria criteria = new Criteria(page, 10);
System.out.println("====================================================================================");
System.out.println(searchCompanyVo);
System.out.println("====================================================================================");
PageVo pageVo = new PageVo(criteria, adminService.getCompanyTotal(searchCompanyVo));
List<CompanyDto> searchCompany = adminService.searchCompanyList(searchCompanyVo, criteria);
int companyTotal = adminService.companyCountTotal();
int searchTotal = adminService.getCompanyTotal(searchCompanyVo);
Map<String, Object> findCompany = new HashMap<>();
findCompany.put("pageVo", pageVo);
findCompany.put("companyList", searchCompany);
findCompany.put("companyTotal", companyTotal);
findCompany.put("searchTotal",searchTotal);
return findCompany;
}
}AdminMapper.java
@Mapper
public interface AdminMapper {
// 검색 기업 조회
List<CompanyDto> searchCompany(@Param("searchCompanyVo") SearchCompanyVo searchCompanyVo , @Param("criteria") Criteria criteria);
// 검색 결과로 나온 기업 수 조회
public int selectCompanyTotal(@Param("searchCompanyVo") SearchCompanyVo searchCompanyVo);
// 전체 기업 수 조회
int companyCountTotal();
}AdminService.java
@Service
@RequiredArgsConstructor
@Transactional
public class AdminService {
private final AdminMapper adminMapper;
private final ProductFileService productFileService;
// 기업 검색 조회
public List<CompanyDto> searchCompanyList(SearchCompanyVo searchCompanyVo, Criteria criteria){
return adminMapper.searchCompany(searchCompanyVo, criteria);
}
// 검색 결과로 나온 기업 수 조회
@Transactional(readOnly = true)
public int getCompanyTotal(SearchCompanyVo searchCompanyVo){
return adminMapper.selectCompanyTotal(searchCompanyVo);
}
// 전체 기업 수 조회
public int companyCountTotal(){
return adminMapper.companyCountTotal();
}
}
</details>
<details>
<summary>AdminMapper.xml</summary>
```xml
// 기업 검색
<select id="searchCompany" resultType="companyDto">
SELECT COMPANY_NUMBER,COMPANY_REGISTRATION_NUMBER, COMPANY_NAME, COMPANY_ID, COMPANY_CALL_NUMBER,
COMPANY_CEO_NAME, COMPANY_ADDRESS1, COMPANY_EMAIL, COMPANY_STATUS
FROM( SELECT ROWNUM AS RNUM,COMPANY_NUMBER, COMPANY_REGISTRATION_NUMBER, COMPANY_NAME, COMPANY_ID,
COMPANY_CALL_NUMBER, COMPANY_CEO_NAME, COMPANY_ADDRESS1, COMPANY_EMAIL, COMPANY_STATUS
FROM( SELECT COMPANY_NUMBER, COMPANY_REGISTRATION_NUMBER, COMPANY_NAME, COMPANY_ID, COMPANY_CALL_NUMBER,
COMPANY_CEO_NAME, COMPANY_ADDRESS1, COMPANY_EMAIL, COMPANY_STATUS
FROM TBL_COMPANY
<where>
<if test="!searchCompanyVo.keyword.equals('')">
<if test="searchCompanyVo.searchType.equals('name')">
and COMPANY_NAME like '%'|| #{searchCompanyVo.keyword}|| '%'
</if>
<if test="searchCompanyVo.searchType.equals('id')">
and COMPANY_ID like '%'|| #{searchCompanyVo.keyword}|| '%'
</if>
<if test="searchCompanyVo.searchType.equals('email')">
and COMPANY_EMAIL like '%'|| #{searchCompanyVo.keyword}|| '%'
</if>
</if>
<trim prefix="and">
<if test="searchCompanyVo.productType != null">
<if test="searchCompanyVo.productType == 0">
COMPANY_STATUS = 1
</if>
<if test="searchCompanyVo.productType == 1">
COMPANY_STATUS = 0
</if>
</if>
</trim>
</where>
)S1
<![CDATA[
WHERE ROWNUM <= #{criteria.page} * #{criteria.amount}
]]>
)S2
WHERE RNUM > (#{criteria.page} - 1) * #{criteria.amount}
</select>
// 총 기업 수 조회
<select id="companyCountTotal" resultType="_int">
SELECT COUNT(COMPANY_NUMBER) FROM TBL_COMPANY
</select>
// 검색 결과로 나온 기업 수 조회
<select id="selectCompanyTotal" resultType="_int">
SELECT COUNT(COMPANY_NUMBER) FROM TBL_COMPANY
<where>
<if test="!searchCompanyVo.keyword.equals('')">
<if test="searchCompanyVo.searchType.equals('name')">
and COMPANY_NAME like '%'|| #{searchCompanyVo.keyword}|| '%'
</if>
<if test="searchCompanyVo.searchType.equals('id')">
and COMPANY_ID like '%'|| #{searchCompanyVo.keyword}|| '%'
</if>
<if test="searchCompanyVo.searchType.equals('email')">
and COMPANY_EMAIL like '%'|| #{searchCompanyVo.keyword}|| '%'
</if>
</if>
<trim prefix="and">
<if test="searchCompanyVo.productType != null">
<if test="searchCompanyVo.productType == 0">
COMPANY_STATUS = 1
</if>
<if test="searchCompanyVo.productType == 1">
COMPANY_STATUS = 0
</if>
</if>
</trim>
</where>
</select>searchCompany.js
import * as company from '../module/companyList.js'
let productType = $('#productType').val();
console.log(productType);
let page = 1;
company.searchCompanyList({searchType:'', keyword:'', productType: productType, page : page}, companyList, paging, buttonChange,companyCount,showError);
// 전체 기업 리스트
function companyList(map){
console.log(map);
let list ='';
map.forEach(u => {
list += `
<tr class="company-num" data-num="${u.companyNumber}">
<th>
<input type="checkbox" name="chk" value="${u.companyNumber}">
</th>
<th scope="col" style="font-size: 13px; font-weight: 10;">${u.companyRegistrationNumber}</th>
<th scope="col" style="font-size: 13px; font-weight: 10;">
<a href="">${u.companyName}</a>
</th>
<th scope="col" style="font-size: 13px; font-weight: 10;">${u.companyId}</th>
<th scope="col" style="font-size: 13px; font-weight: 10;">${u.companyCallNumber}</th>
<th scope="col" style="font-size: 13px; font-weight: 10;">${u.companyCeoName}</th>
<th scope="col" style="font-size: 13px; font-weight: 10; overflow: hidden;">${u.companyAddress1}</th>
<th scope="col" style="font-size: 13px; font-weight: 10;">${u.companyEmail}</th>
<input type="hidden" name="status" value="${u.companyStatus}">
`;
list += `</tr>`;
});
$('.check').html(list);
}
//페이징 처리
function paging(pageInfo){
console.log("===========================");
console.log(pageInfo);
let page ='';
if(pageInfo.prev){
page += `
<a href="" data-page=${pageInfo.startPage-1} class="arrow prev"></a>
`}
for(let i = pageInfo.startPage; i<=pageInfo.endPage; i++){
if(i == pageInfo.criteria.page){
page += `
<a href="#" data-page="${i}" class="active">${i}</a>
`
}else{
page += `
<a href="#" data-page="${i}">${i}</a>
`
}
}
if(pageInfo.next) {
page += `
<a href="" data-page=${pageInfo.endPage + 1} class="arrow next""></a>
`
}
$(".page_nation").html(page);
}
//페이징 클릭 이벤트
$('.page_nation').on('click','a', function (e){
e.preventDefault();
let searchKeyword = $('#keyword').val();
let searchType = $('.fSelect').val();
let productType = $('#productType').val();
console.log("=======================");
console.log(productType);
let page = $(this).data('page');
console.log(page)
company.searchCompanyList({searchType:searchType, keyword:searchKeyword,productType: productType, page : page}, companyList,paging,buttonChange,companyCount,showError);
});
// 기업 수
function companyCount(count){
console.log(count);
$('.companyTotal').text(count.companyTotal);
$('.searchTotal').text(count.searchTotal);
}
// 검색 조건에 따른 회원 조회
$('.btn-image').on('click', function (){
let searchKeyword = $('#keyword').val();
let searchType = $('.fSelect').val();
let productType = $('#productType').val();
let page = 1;
company.searchCompanyList({keyword : searchKeyword, searchType : searchType,productType: productType, page: page}, companyList,paging,buttonChange,companyCount,showError);
// $('#keyword').val('');
})
// 검색 input칸 엔터 이벤트
$('#keyword').on('keydown', function (e){
console.log('++++++++++++++++++++++++++++');
console.log(e.code);
console.log(e.keyCode);
if(e.keyCode == 13){
console.log('Enter');
let searchKeyword = $('#keyword').val();
let searchType = $('.fSelect').val();
let productType = $('#productType').val();
let page = 1;
company.searchCompanyList({keyword : searchKeyword, searchType : searchType,productType: productType, page: page}, companyList,paging,buttonChange, companyCount,showError);
}
});
// 체크박스 선택
$(document).ready(function() {
$("#cbx_chkAll").click(function() {
if($("#cbx_chkAll").is(":checked")) $("input[name=chk]").prop("checked", true);
else $("input[name=chk]").prop("checked", false);
});
$("input[name=chk]").click(function() {
var total = $("input[name=chk]").length;
var checked = $("input[name=chk]:checked").length;
if(total != checked) $("#cbx_chkAll").prop("checked", false);
else $("#cbx_chkAll").prop("checked", true);
});
});
// 상태변경
$('.leftSide').on('click','.btnNormal', function() {
let companyStatus = $('#productType').val();
let companyNumber = productDeleteBtn();
// let conditionName = $(".status-select").text();
// let orderNumber2 = $(this).closest('tr').find('input[type="checkbox"]').val();
// let orderStatus = $(".orderStatus").text();
console.log(companyNumber);
let searchKeyword = $('#keyword').val();
let searchType = $('.fSelect').val();
let productType = $('#productType').val();
let page = 1;
company.searchCompanyList({searchType:searchType, keyword:searchKeyword,productType: productType, page : page}, companyList,paging, buttonChange,companyCount,showError);
company.orderStatusAjax({companyNumber: companyNumber, companyStatus: companyStatus},showError);
company.searchCompanyList({searchType:searchType, keyword:searchKeyword, productType: productType, page : page}, companyList,paging, buttonChange,companyCount,showError);
});
//수정, 취소 버튼
function buttonChange(){
let statusNumber = $('#productType').val();
if(statusNumber == 1){
$('.leftSide').html(`
<button type="button" class="btnNormal">
승인
</button>
`)
} else{
$('.leftSide').html(`
<button type="button" class="btnNormal">
취소
</button>
`)
}
}
//
// $('#btnCancel').on('click', function() {
// let companyStatus = '0';
// let companyNumber = productDeleteBtn();
// // let conditionName = $(".status-select").text();
// // let orderNumber2 = $(this).closest('tr').find('input[type="checkbox"]').val();
// // let orderStatus = $(".orderStatus").text();
// console.log(companyNumber);
// let searchKeyword = $('#keyword').val();
// let searchType = $('.fSelect').val();
// let productType = $('#productType').val();
// let page = 1;
//
//
//
// company.searchCompanyList({searchType:searchType, keyword:searchKeyword,productType: productType, page : page}, companyList,paging, buttonChange,companyCount,showError);
//
// company.changeStatusAjax({companyNumber: companyNumber, companyStatus: companyStatus},showError);
// company.searchCompanyList({searchType:searchType, keyword:searchKeyword,productType: productType, page : page}, companyList, paging,buttonChange,companyCount,showError);
//
// });
function productDeleteBtn() {
var companyNumber = [];
$("input:checkbox[name=chk]:checked").each(function () {
companyNumber.push($(this).val());
console.log("================================");
console.log(companyNumber);
console.log("================================");
});
console.log(companyNumber)
if (companyNumber == "") {
alert("수정할 기업을 선택해주세요.");
return false;
}
return companyNumber;
}
function showError(a, b, c){
console.error(c);
}companyList.js
export function searchCompanyList(obj, callback, pageCallback, btnCallback,countCallback,error){
// let searchKeyword = $('#keyword').val()
$.ajax({
url: `/admins/v1/searchCompanyList/${obj.page}`,
type: 'get',
data: {keyword : obj.keyword, searchType : obj.searchType, productType : obj.productType},
dataType: 'json',
success: function (map){
if(callback){
callback(map.companyList);
pageCallback(map.pageVo);
btnCallback(map.companyList);
countCallback(map)
}
},
error: error
});
}
export function deleteUserList(checkBoxArr,confirmAlert,error) {
console.log(JSON.stringify(checkBoxArr))
// if(comfirmAlert) {
$.ajax({
url: '/admins/v1/deleteUserList',
data: JSON.stringify(checkBoxArr),
type: 'post',
traditional: true,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (result) {
pageCallBack(map);
console.log(result);
alert("해당글이 정상적으로 삭제되었습니다.")
location.reload();
},
error: error
});
}
export function orderStatusAjax(obj,error) {
console.log(JSON.stringify(obj.companyNumber))
// if(comfirmAlert) {
$.ajax({
url: '/admins/v1/modifyStatus',
data: JSON.stringify(obj),
type: 'post',
traditional: true,
contentType: "application/json; charset=utf-8",
// dataType: "json",
success: function () {
window.alert("처리되었습니다.")
location.reload();
},
error: error
});
}
export function changeStatusAjax(obj,error) {
console.log(JSON.stringify(obj.companyNumber))
// if(comfirmAlert) {
$.ajax({
url: '/admins/v1/modifyStatus2',
data: JSON.stringify(obj),
type: 'post',
traditional: true,
contentType: "application/json; charset=utf-8",
// dataType: "json",
success: function () {
window.alert("승인이 취소되었습니다.")
},
error: error
});
}