Skip to content
DongJae92 edited this page Aug 7, 2023 · 20 revisions

📌 관리자

✔️ 관리자 메인

  • 고객관리 : 일반 회원 수, 기업 회원 수를 가져와 출력하고 총 합계를 구한다.
  • 오늘의 할 일 : 오늘까지 처리하지 않은 주문의 수를 가져와 출력한다.
  • 일별 매출 현황 : 총 7일의 주문, 결제, 환불 내역을 가져와 차트로 표현한다.
  • 오늘 날짜를 기준으로 3일 전, 최근 7일, 30일의 매출 현황을 표로 출력한다.

💻 code

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
    });
}

📷 View

Image

✔️ 일반 회원 관리

  • 회원정보 조회 : 이름, 아이디, 이메일을 검색하여 회원을 조회합니다.
  • 회원 목록 : 검색한 결과를 출력합니다. 총 회원 수와 검색 결과 건수를 보여주며, 체크 박스를 선택한 회원을 탈퇴 시킬 수 있습니다.

💻 code

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

    });

}

📷 View

Image

✔️ 기업 회원 관리

  • 회원정보 조회 : 기업이름, 아이디, 이메일을 검색하여 기업 회원을 조회합니다.
  • 회원 목록 : 검색한 결과를 출력합니다. 총 기업 회원 수와 검색 결과 건수를 보여주며, 체크 박스를 선택한 회원을 승인하거나 승인을 취소할 수 있습니다.
  • 상태 변경 : 상태 변경을 통해 화면 구성이 바뀌도록 동적인 처리를 했습니다.

💻 code

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

    });

}