최정임 최정임 2024-06-20
240620 최정임 예시페이지 추가
@2b959a6f57de0d6c03488b60f20c3038e69f4acd
 
client/resources/img/component/ex_img.png (Binary) (added)
+++ client/resources/img/component/ex_img.png
Binary file is not shown
client/views/pages/AppRouter.js
--- client/views/pages/AppRouter.js
+++ client/views/pages/AppRouter.js
@@ -14,6 +14,7 @@
 import bn014 from "../pages/Business/Bn014.vue";   //출고등록 (내수)
 import bn015 from "../pages/Business/Bn015.vue";   //공정등록 (타발)
 import bn016 from "../pages/Business/Bn016.vue";   //공정등록 (검수)
+import bn017 from "../pages/Business/Bn017.vue";   //컬러이미지 예시
 
 
 
@@ -34,6 +35,7 @@
   { path: "/bn014.page", name: "bn014", component: bn014 },   //출고등록 (내수)
   { path: "/bn015.page", name: "bn015", component: bn015 },   //공정등록 (타발)
   { path: "/bn016.page", name: "bn016", component: bn016 },   //공정등록 (검수)
+  { path: "/bn017.page", name: "bn017", component: bn017 },   //컬러이미지 예시
   
   
 ];
 
client/views/pages/Business/Bn017.vue (added)
+++ client/views/pages/Business/Bn017.vue
@@ -0,0 +1,753 @@
+<template>
+    <div class="">
+        <img src="../../../resources/img/component/ex_img.png" alt="" >
+    </div>
+
+
+</template>
+
+<script>
+import axios from "axios";
+import Autocomplete from '../component/Autocomplete.vue';
+import AutocompleteList from '../component/AutocompleteList.vue';
+import SvgIcon from '@jamescoyle/vue-icon';
+import { mdiArrowRightBold, mdiArrowLeftBold, mdiClose } from '@mdi/js';
+
+
+export default {
+    name: "#tabs",
+    data() {
+        return {
+            currentTab: 0,
+            tabs:['NO1','NO2','NO3','NO4','NO5'],
+            tabList:['1','2','3','4','5','6','7','8','9','10','11'],
+            mdiArrowRightBold: mdiArrowRightBold,
+            mdiArrowLeftBold: mdiArrowLeftBold,
+            mdiClose: mdiClose,
+            popupOpen: false,
+            popupOpen2: false,
+            selectedIndex: null,
+            selectedIndexPopup: null,
+            selectedIndexPopup2: null,
+            selectedListIndex: null,
+
+            // 인서트 업데이트 구분
+            isInsert: false,
+
+            selectedList: {
+                CUSTCD: "",
+                CUSTNM: "",
+            },
+            lists: [],
+            items: {
+                REMARK: "",
+                resbody: []
+            },
+            popupItems: [],
+            selectedPopupItems: [],
+            selectedCompany: {
+                COMPCD: "",
+                SANAME: ""
+            },
+            selectClient: {
+                CUSTCD: "",
+                JSNAME: "",
+                ITEMCD: "",
+                ITEMNM: "",
+                YNUSAG: ""
+            },
+            selectPopupClient: {
+                CUSTCD: "",
+                JSNAME: "",
+                ITEMCD: "",
+                ITEMNM: "",
+            },
+            compResult: [],
+            itemResult: [],
+            selectedStartDate: "",
+            selectedEndDate: "",
+            selectOption: false,
+            selectedOrder: "",
+
+            firstExec: true,
+            saleList: [],
+        };
+    },
+    methods: {
+        focusOnAutocomplete() {
+            this.$refs.autocomplete.$el.querySelector('input').focus();
+        },
+        focusOnAutocomplete3() {
+            this.$refs.autocomplete3.$el.querySelector('input').focus();
+        },
+        focusOnAutocompleteList() {
+            this.$refs.autocompleteList.$el.querySelector('input').focus();
+        },
+        focusOnNextInput() {
+            this.$refs.nextInput.focus();
+        },
+        focusOnPopAutocomplete() {
+            this.$refs.autocomplete2.$el.querySelector('input').focus();
+        },
+        focusOnPopAutocompleteList() {
+            this.$refs.autocompleteList2.$el.querySelector('input').focus();
+        },
+        focusOnNextPopInput() {
+            this.$refs.nextPopInput.focus();
+        },
+        openPopup() {
+            this.popupOpen = true;
+            this.searchSelOrder();
+        },
+        openPopup2() {
+            this.popupOpen2 = true;
+            this.searchSelOrder();
+        },
+        closePopup() {
+            this.popupOpen = false;
+            this.popupOpen2 = false;
+
+        },
+        selectRowPopup(index) {
+            this.selectedIndexPopup = index;
+        },
+        selectRowPopup2(index) {
+            this.selectedIndexPopup2 = index;
+        },
+        selectRow(index) {
+            this.selectedIndex = index;
+        },
+        selectList(list, index) {
+            this.selectedList = list;
+            this.selectedListIndex = index;
+            this.isInsert = false;
+            this.selectedOrder = "";
+            this.searchDetailOrder();
+        },
+
+        // 초기화 메소드
+        resetForm() {
+            // 거래처 및 품목 관련 정보 초기화
+            this.selectClient.CUSTCD = ''; // 거래처 코드 초기화
+            this.selectClient.ITEMCD = ''; // 품목 코드 초기화
+
+            if (this.$refs.autocomplete) {
+                this.$refs.autocomplete.resetAutocomplete();
+            }
+            if (this.$refs.autocompleteList) {
+                this.$refs.autocompleteList.resetAutocompleteList();
+            }
+
+            // 발주기간 초기화
+            this.getDaysOfMonth();
+
+        },
+
+        // 입력창 초기화
+        resetOrder() {
+            this.items = {
+                ORDDAT: "",
+                ORDNOX: "",
+                REMARK: "",
+                resbody: []
+            };
+            if (this.$refs.autocomplete3) {
+                this.$refs.autocomplete3.resetAutocomplete();
+            }
+            this.selectedList = {
+                CUSTCD: "",
+                CUSTNM: "",
+            };
+            this.selectedPopupItems = [];
+            this.selectedOrder = null;
+            this.isInsert = true;
+            this.getOneOfMonth();
+        },
+        // 공통 - 사업장목록
+        searchCompany() {
+            const vm = this;
+            axios({
+                url: "https://jv.ajinpaper.app/Common/comp_cm.do",
+                method: "post",
+            }).then(function (response) {
+                vm.selectedCompany = response.data.resultData[0];
+            }).catch(function (error) {
+                console.log(error);
+            });
+        },
+
+        // 거래처 검색에서 데이터 가져오기
+        handleResultSelected(result, identifier) {
+            if (identifier === 'search') {
+                this.selectClient.CUSTCD = result.CUSTCD;
+            } else if (identifier === 'popup') {
+                this.selectPopupClient.CUSTCD = result.CUSTCD;
+                this.selectPopupClient.JSNAME = result.JSNAME;
+            } else if (identifier === 'post') {
+                this.selectedList.CUSTCD = result.CUSTCD;
+            }
+        },
+        // 공통 품목에서 데이터 가져오기
+        handleItemSelected(result, identifier) {
+            if (identifier === 'search') {
+                this.selectClient.ITEMCD = result.ITEMCD;
+                this.selectClient.ITEMNM = result.ITEMNM;
+            } else if (identifier === 'popup') {
+                this.selectPopupClient.ITEMCD = result.ITEMCD;
+                this.selectPopupClient.ITEMNM = result.ITEMNM;
+            }
+        },
+        // 거래처 코드 입력 시 거래처 아이디 가져오기
+        lookupJSNAME(custcd, type) {
+            const matchedClient = this.compResult.find(client => client.CUSTCD === custcd);
+            if (matchedClient) {
+                if (type === "search") {
+                    this.$refs.autocomplete.search = matchedClient.JSNAME;
+                } else if (type === "popup") {
+                    this.$refs.autocomplete2.search = matchedClient.JSNAME;
+                } else if (type === "post") {
+                    this.$refs.autocomplete3.search = matchedClient.JSNAME;
+                }
+            } else {
+                if (type === "search") {
+                    this.$refs.autocomplete.search = "";
+                } else if (type === "popup") {
+                    this.$refs.autocomplete2.search = "";
+                } else if (type === "post") {
+                    this.$refs.autocomplete3.search = "";
+                }
+            }
+        },
+        // 품목 코드 입력 시 품목 아이디 가져오기
+        lookupITEMNM(itemcd, type) {
+            const lowerItemcd = itemcd.toLowerCase();
+            const matchedItem = this.itemResult.find(client => client.ITEMCD.toLowerCase() === lowerItemcd);
+
+            if (matchedItem) {
+                if (type === "search") {
+                    this.$refs.autocompleteList.searchList = matchedItem.ITEMNM;
+                } else if (type === "popup") {
+                    this.$refs.autocompleteList2.searchList = matchedItem.ITEMNM;
+                }
+            } else {
+                if (type === "search") {
+                    this.$refs.autocompleteList.searchList = "";
+                } else if (type === "popup") {
+                    this.$refs.autocompleteList2.searchList = "";
+                }
+            }
+        },
+
+        compResults(results) {
+            this.compResult = results;
+        },
+        itemResults(results) {
+            this.itemResult = results;
+        },
+
+        // 출고등록 – 출고 내역 조회
+        searchOrder() {
+            const vm = this;
+            let formattedStartDate = ""
+            let formattedEndDate = ""
+            if (vm.selectedStartDate.trim() && vm.selectedEndDate.trim()) {
+                let startParts = vm.selectedStartDate.split('-');
+                formattedStartDate = startParts[0] + startParts[1] + startParts[2];
+
+                let endParts = vm.selectedEndDate.split('-');
+                formattedEndDate = endParts[0] + endParts[1] + endParts[2];
+            } else {
+                alert("출고 내역 조회 오류 : 출고기간을 지정해주세요 !");
+                return;
+            }
+            axios({
+                url: "https://jv.ajinpaper.app/SD/sale_list_tot.do",
+                method: "post",
+                data: {
+                    compcd: vm.selectedCompany.COMPCD,
+                    custcd: vm.selectClient.CUSTCD,
+                    itemcd: vm.selectClient.ITEMCD,
+                    stdate: formattedStartDate,
+                    endate: formattedEndDate,
+                },
+            }).then(function (response) {
+                console.log(response);
+                if (response.data.resultData.length === 0) {
+                    if (!vm.firstExec) {
+                        alert("조회된 데이터가 없습니다!");
+                    }
+                    vm.firstExec = false;
+                    return;
+                }
+
+                vm.lists = response.data.resultData;
+                vm.firstExec = false;
+            }).catch(function (error) {
+                console.log(error);
+                vm.firstExec = false;
+            });
+        },
+
+        // 출고등록 – 출고 상세 조회
+        searchDetailOrder() {
+            const vm = this;
+            axios({
+                url: "https://jv.ajinpaper.app/SD/sale_list_detail.do",
+                method: "post",
+                data: {
+                    compcd: vm.selectedCompany.COMPCD,
+                    chdate: vm.selectedList.CHDATE,
+                    chnoxx: vm.selectedList.CHNOXX,
+                },
+            }).then(function (response) {
+                console.log(response);
+                if (response.data.resultData.resbody) {
+                    vm.items = response.data.resultData;
+                } else {
+                    vm.resetOrder();
+                }
+            }).catch(function (error) {
+                console.log(error);
+            });
+        },
+
+        // 출고등록 – 출고 대상 조회
+        searchSelOrder() {
+            const vm = this;
+            axios({
+                url: "https://jv.ajinpaper.app/SD/sale_sel_tot.do",
+                method: "post",
+                data: {
+                    itemcd: vm.selectPopupClient.ITEMCD,
+                },
+            }).then(function (response) {
+                console.log(response);
+                if (response.data.resultData.length === 0) {
+                    alert("조회된 데이터가 없습니다!");
+                    return;
+                }
+
+                vm.popupItems = response.data.resultData;
+                vm.filterPopupItems();
+            }).catch(function (error) {
+                console.log(error);
+            });
+        },
+
+        // 출고등록 – 출고구분
+        searchSaleList() {
+            const vm = this;
+            var itemUrl = "https://jv.ajinpaper.app/SD/sale_gubun_list.do?value=";
+
+            axios({
+                url: itemUrl,
+                method: "post",
+            }).then(function (response) {
+                vm.saleList = response.data.resultData;
+            }).catch(function (error) {
+                console.log(error);
+            });
+        },
+
+        // 출고 등록 - 출고 내역 저장
+        insertOrder() {
+            const vm = this;
+
+            if (vm.isInsert === false) {
+                alert("초기화 시켜주세요!")
+                return;
+            }
+
+            if (!vm.items.CHDATE) {
+                alert("출고 일자를 정해주세요!")
+                return;
+            }
+
+            if (!vm.selectedList.CUSTCD) {
+                alert("거래처를 정해주세요!")
+                return;
+            }
+            const hasInvalid = vm.items.resbody.some(item => {
+                return !item.ORDQTY || !item.NAPDAT;
+            });
+
+            if (hasInvalid) {
+                alert('발주수량 또는 최종납기일이 비어 있습니다.');
+                return;
+            }
+            const reqbody = vm.items.resbody.map(item => {
+                const newItem = {};
+                for (const key in item) {
+                    const lowerKey = key.toLowerCase();
+                    if (key !== 'orddat') {
+                        if (key === 'ORDQTY') {
+                            newItem[lowerKey] = Number(item[key]);
+                        } else {
+                            newItem[lowerKey] = item[key];
+                        }
+                    }
+                }
+                return newItem;
+            });
+
+            axios({
+                url: "",
+                method: "post",
+                data: {
+                    newynx: 'Y',
+                    compcd: vm.selectedCompany.COMPCD,
+                    orddat: vm.items.ORDDAT,
+                    custcd: vm.selectedList.CUSTCD,
+                    remark: vm.items.REMARK,
+                    reqbody: reqbody
+                },
+            }).then(function (response) {
+                console.log("저장 결과 : " + response);
+                if (response.data.resultCode === 200) {
+                    const orderInfo = response.data.resultData.ORDERINFO;
+                    const orderDate = orderInfo.substring(0, 8);
+                    const orderNum = orderInfo.substring(8);
+
+                    const formattedDate = `${orderDate.substring(0, 4)}-${orderDate.substring(4, 6)}-${orderDate.substring(6, 8)}`;
+
+                    vm.selectedList.ORDDAT = orderDate;
+                    vm.selectedList.ORDNOX = orderNum;
+                    vm.selectedStartDate = formattedDate;
+                    vm.selectedEndDate = formattedDate;
+                    vm.searchDetailOrder();
+
+                    vm.searchOrder();
+                    alert("항목이 성공적으로 신규 입력되었습니다.");
+                } else {
+                    alert("신규 입력에 실패했습니다.");
+
+                }
+            }).catch(function (error) {
+                alert("신규 입력에 실패했습니다.");
+                console.log(error);
+            });
+        },
+        // 발주 등록(제품) - 발주 내역 수정
+        updateOrder() {
+            const vm = this;
+            if (vm.items.ORDNOX === "") {
+                alert("수정할 데이터를 정해주세요!")
+                return;
+            }
+
+            if (!vm.items.ORDDAT) {
+                alert("발주 일자를 정해주세요!")
+                return;
+            }
+
+            if (!vm.selectedList.CUSTCD) {
+                alert("거래처를 정해주세요!")
+                return;
+            }
+            const hasInvalid = vm.items.resbody.some(item => {
+                return !item.ORDQTY || !item.NAPDAT;
+            });
+
+            if (hasInvalid) {
+                alert('발주수량 또는 최종납기일이 비어 있습니다.');
+                return;
+            }
+
+            const reqbody = (() => {
+                let maxSeq = 0;  // seqxxx를 넣기 위한 작업
+                vm.items.resbody.forEach(item => {
+                    if (item.SEQXXX && item.SEQXXX > maxSeq) {
+                        maxSeq = item.SEQXXX;
+                    }
+                });
+
+                return vm.items.resbody.map(item => {
+                    const newItem = {};
+                    const excludedKeys = ['custcd', 'ordnox', 'compcd', 'orddat']; // 제외할 키를 지정
+                    const defaultKeys = ['divdat', 'kukexx'];
+
+                    for (const key in item) {
+                        const lowerKey = key.toLowerCase();
+                        if (!excludedKeys.includes(lowerKey)) {
+                            if (key === 'ORDQTY') {
+                                newItem[lowerKey] = Number(item[key]);
+                            } else {
+                                newItem[lowerKey] = item[key];
+                            }
+
+                        }
+                    }
+                    defaultKeys.forEach(defaultKey => {
+                        if (!(defaultKey in newItem)) {
+                            newItem[defaultKey] = '';
+                        }
+                    });
+
+                    // seqxxx 처리
+                    if (!('seqxxx' in newItem)) {
+                        maxSeq += 1;
+                        newItem['seqxxx'] = maxSeq;
+                    }
+
+                    return newItem;
+                });
+            })();
+
+            axios({
+                url: "",
+                method: "post",
+                data: {
+                    newynx: 'N',
+                    compcd: vm.selectedCompany.COMPCD,
+                    orddat: vm.items.ORDDAT,
+                    ordnox: vm.items.ORDNOX,
+                    custcd: vm.selectedList.CUSTCD,
+                    remark: vm.items.REMARK,
+                    reqbody: reqbody
+                },
+            }).then(function (response) {
+                console.log("수정 결과 : " + response);
+                if (response.data.resultCode === 200) {
+                    vm.searchDetailOrder();
+                    alert("항목이 성공적으로 수정되었습니다.");
+                } else {
+                    alert("항목 수정에 실패했습니다.");
+                }
+
+            }).catch(function (error) {
+                alert("항목 수정에 실패했습니다.");
+                console.log(error);
+            });
+        },
+        // 발주 등록(제품) - 발주 상세 삭제
+        deleteDetailOrder() {
+            const vm = this;
+            if (!vm.selectedOrder) {
+                alert("삭제할 제품을 선택해주세요!");
+                return;
+            }
+            axios({
+                url: "",
+                method: "post",
+                data: {
+                    compcd: vm.selectedCompany.COMPCD,
+                    orddat: vm.items.ORDDAT,
+                    ordnox: vm.items.ORDNOX,
+                    seqxxx: vm.selectedOrder,
+                },
+            }).then(function (response) {
+                console.log(response);
+                if (response.data.resultCode === 200) {
+                    vm.searchDetailOrder();
+                    vm.searchOrder();
+                    alert("항목이 성공적으로 삭제되었습니다.");
+                } else {
+                    alert("항목 삭제에 실패했습니다.");
+                }
+            }).catch(function (error) {
+                alert("항목 삭제에 실패했습니다.");
+                console.log(error);
+            });
+        },
+
+        // 팝업 데이터 왼쪽에서 오른쪽으로 이동시키기
+        moveToSelectedItems() {
+            if (this.selectedIndexPopup !== null && this.popupItems[this.selectedIndexPopup]) {
+                if (this.selectedPopupItems.length < 15) {
+                    let selectedItem = this.popupItems.splice(this.selectedIndexPopup, 1)[0];
+                    this.selectedPopupItems.push(selectedItem);
+                    this.selectedIndexPopup = null;
+                    this.selectedPopupItems = [...this.selectedPopupItems.sort((a, b) => a.ITEMCD.localeCompare(b.ITEMCD))];
+                } else {
+                    alert("최대 15개의 품목만 선택할 수 있습니다.");
+                }
+            }
+        },
+        // 팝업 데이터 오른쪽에서 왼쪽으로 이동시키기
+        moveToPopupItems() {
+            if (this.selectedIndexPopup2 !== null && this.selectedPopupItems[this.selectedIndexPopup2]) {
+                let selectedItem = this.selectedPopupItems.splice(this.selectedIndexPopup2, 1)[0];
+                this.popupItems.push(selectedItem);
+                this.selectedIndexPopup2 = null;
+            }
+            this.popupItems = [...this.popupItems.sort((a, b) => a.ITEMCD.localeCompare(b.ITEMCD))];
+
+        },
+        // 팝업 데이터 저장
+        saveSelectItem() {
+            this.selectedPopupItems.forEach(item => {
+                const isExist = this.items.resbody.some(resItem => resItem.ITEMCD === item.ITEMCD);
+
+                // 동일한 ITEMCD를 가진 항목이 없으면 새 항목을 추가
+                if (!isExist) {
+                    this.items.resbody.push(item);
+                }
+            });
+            this.selectedPopupItems = [];
+            this.closePopup();
+
+        },
+        filterPopupItems() {
+            this.selectedPopupItems = [...this.items.resbody];
+
+            this.popupItems = this.popupItems.filter(popupItem => {
+                return !this.selectedPopupItems.some(selectedItem => selectedItem.ITEMCD === popupItem.ITEMCD);
+            });
+        },
+        // 삭제할 발주 지정
+        uncheckOrder(seqxxx) {
+            if (this.selectedOrder === seqxxx) {
+                this.selectedOrder = null;
+            } else {
+                this.selectedOrder = seqxxx;
+            }
+        },
+        // 발주기간 시작 날짜 지정
+        getDaysOfMonth() {
+            var date = new Date();
+
+            var today = date.getFullYear() + "-";
+            var firstday = date.getFullYear() + "-";
+            var todayMonth = date.getMonth() + 1;
+            if (todayMonth < 10) {
+                today += "0";
+                firstday += "0";
+            }
+            today += todayMonth + "-";
+            var todayDate = date.getDate();
+            if (todayDate < 10) {
+                today += "0";
+            }
+            today += todayDate;
+
+            firstday += todayMonth + "-01";
+
+            this.selectedStartDate = firstday;
+            this.selectedEndDate = today;
+        },
+        // 발주날짜 시작 날짜 지정
+        getOneOfMonth() {
+            var date = new Date();
+
+            this.items.ORDDAT = date.getFullYear();
+            var todayMonth = date.getMonth() + 1;
+            if (todayMonth < 10) {
+                this.items.ORDDAT += "0";
+            }
+            this.items.ORDDAT += todayMonth + "01";
+        },
+        // 조회 결과로 나오는 발주일 하이픈 추가
+        formatDATE(dateStr) {
+            if (dateStr) {
+                const year = dateStr.substring(0, 4);
+                const month = dateStr.substring(4, 6);
+                const day = dateStr.substring(6, 8);
+
+                return `${year}-${month}-${day}`;
+            }
+            return '';
+        },
+        parseDATE(formatDate) {
+            if (formatDate) {
+                const parts = formatDate.split('-');
+                return parts.join('');
+            }
+            return '';
+        },
+        updateNAPDAT(index, formatDate) {
+            this.items.resbody[index].NAPDAT = this.parseDATE(formatDate);
+        },
+    },
+    watch: {
+        'selectClient.CUSTCD'(newVal) {
+            if (newVal) {
+                this.lookupJSNAME(newVal, "search");
+            }
+        },
+        'selectPopupClient.CUSTCD'(newVal) {
+            if (newVal) {
+                this.lookupJSNAME(newVal, "popup");
+            }
+        },
+        'selectedList.CUSTCD'(newVal) {
+            if (newVal) {
+                this.lookupJSNAME(newVal, "post");
+            }
+        },
+
+        'selectClient.ITEMCD'(newVal) {
+            if (newVal) {
+                this.lookupITEMNM(newVal, "search");
+            }
+        },
+        'selectPopupClient.ITEMCD'(newVal) {
+            if (newVal) {
+                this.lookupITEMNM(newVal, "popup");
+            }
+        },
+    },
+    computed: {
+        // 입력창의 발주일 하이픈 조정
+        formattedCHDATE: {
+            get() {
+                if (this.items.CHDATE && this.items.CHDATE.length === 8) {
+                    return `${this.items.CHDATE.substring(0, 4)}-${this.items.CHDATE.substring(4, 6)}-${this.items.CHDATE.substring(6, 8)}`;
+                }
+                return this.items.CHDATE;
+            },
+            set(newValue) {
+                this.items.CHDATE = newValue.replace(/-/g, '');
+            }
+        },
+
+    },
+    components: {
+        Autocomplete,
+        AutocompleteList,
+        SvgIcon
+    },
+    mounted() {
+        this.searchCompany();
+        this.getDaysOfMonth();
+        this.getOneOfMonth();
+        this.searchOrder();
+    },
+
+};
+</script>
+<style scoped>
+input[ type="text"] {
+    width: 100%;
+    padding-left: 5px;
+}
+
+select {
+    width: 50%;
+}
+
+label {
+    margin-left: 10px;
+    vertical-align: middle;
+}
+
+p {
+    word-break: keep-all;
+
+}
+
+th {
+    padding: 5px;
+    word-break: keep-all;
+}
+.active{
+    color:var(--white) !important;
+    background-color:  var(--mainblue) !important;
+}
+
+.input-title {
+    font-size: 1.2rem;
+    font-weight: 500;
+}
+
+
+</style>(No newline at end of file)
node_modules/.package-lock.json
--- node_modules/.package-lock.json
+++ node_modules/.package-lock.json
@@ -3176,6 +3176,77 @@
         "punycode": "^2.1.0"
       }
     },
+    "node_modules/url-loader": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz",
+      "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
+      "dependencies": {
+        "loader-utils": "^2.0.0",
+        "mime-types": "^2.1.27",
+        "schema-utils": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "file-loader": "*",
+        "webpack": "^4.0.0 || ^5.0.0"
+      },
+      "peerDependenciesMeta": {
+        "file-loader": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/url-loader/node_modules/ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dependencies": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/url-loader/node_modules/ajv-keywords": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+      "peerDependencies": {
+        "ajv": "^6.9.1"
+      }
+    },
+    "node_modules/url-loader/node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+    },
+    "node_modules/url-loader/node_modules/schema-utils": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+      "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+      "dependencies": {
+        "@types/json-schema": "^7.0.8",
+        "ajv": "^6.12.5",
+        "ajv-keywords": "^3.5.2"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
     "node_modules/util-deprecate": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
package-lock.json
--- package-lock.json
+++ package-lock.json
@@ -18,6 +18,7 @@
         "file-loader": "^6.2.0",
         "fs": "^0.0.1-security",
         "new-line": "^1.1.1",
+        "url-loader": "^4.1.1",
         "vue": "^3.3.4",
         "vue-loader": "^17.2.2",
         "vue-router": "^4.2.4",
@@ -3213,6 +3214,77 @@
         "punycode": "^2.1.0"
       }
     },
+    "node_modules/url-loader": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz",
+      "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
+      "dependencies": {
+        "loader-utils": "^2.0.0",
+        "mime-types": "^2.1.27",
+        "schema-utils": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "file-loader": "*",
+        "webpack": "^4.0.0 || ^5.0.0"
+      },
+      "peerDependenciesMeta": {
+        "file-loader": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/url-loader/node_modules/ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dependencies": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/url-loader/node_modules/ajv-keywords": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+      "peerDependencies": {
+        "ajv": "^6.9.1"
+      }
+    },
+    "node_modules/url-loader/node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+    },
+    "node_modules/url-loader/node_modules/schema-utils": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+      "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+      "dependencies": {
+        "@types/json-schema": "^7.0.8",
+        "ajv": "^6.12.5",
+        "ajv-keywords": "^3.5.2"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
     "node_modules/util-deprecate": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -5934,6 +6006,50 @@
         "punycode": "^2.1.0"
       }
     },
+    "url-loader": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz",
+      "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
+      "requires": {
+        "loader-utils": "^2.0.0",
+        "mime-types": "^2.1.27",
+        "schema-utils": "^3.0.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "6.12.6",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "ajv-keywords": {
+          "version": "3.5.2",
+          "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+          "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+          "requires": {}
+        },
+        "json-schema-traverse": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+        },
+        "schema-utils": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+          "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+          "requires": {
+            "@types/json-schema": "^7.0.8",
+            "ajv": "^6.12.5",
+            "ajv-keywords": "^3.5.2"
+          }
+        }
+      }
+    },
     "util-deprecate": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
package.json
--- package.json
+++ package.json
@@ -13,6 +13,7 @@
     "file-loader": "^6.2.0",
     "fs": "^0.0.1-security",
     "new-line": "^1.1.1",
+    "url-loader": "^4.1.1",
     "vue": "^3.3.4",
     "vue-loader": "^17.2.2",
     "vue-router": "^4.2.4",
Add a comment
List