diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..ff654f7 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,21 @@ +name: CI +on: + push: + branches: + - prod + - dev + pull_request: + +jobs: + sonarcloud: + name: SonarCloud + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: SonarCloud Scan + uses: SonarSource/sonarcloud-github-action@master + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} \ No newline at end of file diff --git a/index.html b/index.html index 99f583a..fc4efc6 100644 --- a/index.html +++ b/index.html @@ -2,9 +2,9 @@ - + - Vite App + Billing Wise
diff --git a/package-lock.json b/package-lock.json index 04c41c1..9ecbdc3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,13 +9,17 @@ "version": "0.0.0", "dependencies": { "axios": "^1.7.2", + "billing-wise": "file:", "bootstrap": "^5.3.3", "bootstrap-icons": "^1.11.3", + "chart.js": "^3.9.1", "pinia": "^2.1.7", "pinia-plugin-persist": "^1.0.0", "sass": "^1.77.6", "vue": "^3.4.29", - "vue-router": "^4.3.3" + "vue-chart-3": "^3.1.8", + "vue-router": "^4.3.3", + "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz" }, "devDependencies": { "@rushstack/eslint-patch": "^1.8.0", @@ -2387,6 +2391,10 @@ "tweetnacl": "^0.14.3" } }, + "node_modules/billing-wise": { + "resolved": "", + "link": true + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -2689,6 +2697,11 @@ "node": ">=8" } }, + "node_modules/chart.js": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.9.1.tgz", + "integrity": "sha512-Ro2JbLmvg83gXF5F4sniaQ+lTbSv18E+TIf2cOeiH1Iqd2PGFOtem+DUufMZsCJwFE7ywPOpfXFBwRTGq7dh6w==" + }, "node_modules/check-error": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", @@ -4912,6 +4925,11 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -7240,6 +7258,21 @@ } } }, + "node_modules/vue-chart-3": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/vue-chart-3/-/vue-chart-3-3.1.8.tgz", + "integrity": "sha512-zX5ajjQi/PocEqLETlej3vp92q/tnI/Fvu2RVb++Kap8qOrXu6PXCpodi73BFrWzEGZIAnqoUxC3OIkRWD657g==", + "dependencies": { + "@vue/runtime-core": "latest", + "@vue/runtime-dom": "latest", + "csstype": "latest", + "lodash-es": "latest" + }, + "peerDependencies": { + "chart.js": "=> ^3.1.0", + "vue": ">= 3" + } + }, "node_modules/vue-component-type-helpers": { "version": "2.0.24", "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.0.24.tgz", @@ -7531,6 +7564,18 @@ } } }, + "node_modules/xlsx": { + "version": "0.20.3", + "resolved": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz", + "integrity": "sha512-oLDq3jw7AcLqKWH2AhCpVTZl8mf6X2YReP+Neh0SJUzV/BdZYjth94tG5toiMB1PPrYtxOCfaoUCkvtuH+3AJA==", + "license": "Apache-2.0", + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", diff --git a/package.json b/package.json index 0cbc4b2..42267eb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "billing-wise", - "version": "0.0.0", + "version": "1.0.0", "private": true, "type": "module", "scripts": { @@ -15,13 +15,17 @@ }, "dependencies": { "axios": "^1.7.2", + "billing-wise": "file:", "bootstrap": "^5.3.3", "bootstrap-icons": "^1.11.3", + "chart.js": "^3.9.1", "pinia": "^2.1.7", "pinia-plugin-persist": "^1.0.0", "sass": "^1.77.6", "vue": "^3.4.29", - "vue-router": "^4.3.3" + "vue-chart-3": "^3.1.8", + "vue-router": "^4.3.3", + "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz" }, "devDependencies": { "@rushstack/eslint-patch": "^1.8.0", diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index df36fcf..0000000 Binary files a/public/favicon.ico and /dev/null differ diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000..ba1557b Binary files /dev/null and b/public/favicon.png differ diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 0000000..c1dac37 --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,13 @@ +sonar.projectKey=Billing-Wise_client +sonar.organization=billing-wise + +# This is the name and version displayed in the SonarCloud UI. +#sonar.projectName=client +#sonar.projectVersion=1.0 + + +# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. +#sonar.sources=. + +# Encoding of the source code. Default is default system encoding +#sonar.sourceEncoding=UTF-8 \ No newline at end of file diff --git "a/src/assets/excels/\352\263\204\354\225\275\353\223\261\353\241\235.xlsx" "b/src/assets/excels/\352\263\204\354\225\275\353\223\261\353\241\235.xlsx" new file mode 100644 index 0000000..088b2f9 Binary files /dev/null and "b/src/assets/excels/\352\263\204\354\225\275\353\223\261\353\241\235.xlsx" differ diff --git "a/src/assets/excels/\355\232\214\354\233\220\353\223\261\353\241\235.xlsx" "b/src/assets/excels/\355\232\214\354\233\220\353\223\261\353\241\235.xlsx" new file mode 100644 index 0000000..b957fb7 Binary files /dev/null and "b/src/assets/excels/\355\232\214\354\233\220\353\223\261\353\241\235.xlsx" differ diff --git a/src/assets/images/card-image.png b/src/assets/images/card-image.png new file mode 100644 index 0000000..93c9f3b Binary files /dev/null and b/src/assets/images/card-image.png differ diff --git a/src/assets/images/cms-image.png b/src/assets/images/cms-image.png new file mode 100644 index 0000000..cfc08d8 Binary files /dev/null and b/src/assets/images/cms-image.png differ diff --git a/src/assets/images/example_contract.png b/src/assets/images/example_contract.png new file mode 100644 index 0000000..6c8c288 Binary files /dev/null and b/src/assets/images/example_contract.png differ diff --git a/src/assets/images/example_member.png b/src/assets/images/example_member.png new file mode 100644 index 0000000..02af17f Binary files /dev/null and b/src/assets/images/example_member.png differ diff --git a/src/assets/images/icon_excel.png b/src/assets/images/icon_excel.png new file mode 100644 index 0000000..833ccda Binary files /dev/null and b/src/assets/images/icon_excel.png differ diff --git a/src/assets/images/loading.gif b/src/assets/images/loading.gif new file mode 100644 index 0000000..e1b07ea Binary files /dev/null and b/src/assets/images/loading.gif differ diff --git a/src/assets/images/loading.png b/src/assets/images/loading.png new file mode 100644 index 0000000..aa334d0 Binary files /dev/null and b/src/assets/images/loading.png differ diff --git a/src/assets/images/sign.gif b/src/assets/images/sign.gif new file mode 100644 index 0000000..3418144 Binary files /dev/null and b/src/assets/images/sign.gif differ diff --git a/src/assets/images/sign.png b/src/assets/images/sign.png new file mode 100644 index 0000000..6659e70 Binary files /dev/null and b/src/assets/images/sign.png differ diff --git a/src/assets/images/sign0.gif b/src/assets/images/sign0.gif new file mode 100644 index 0000000..27f3bbe Binary files /dev/null and b/src/assets/images/sign0.gif differ diff --git a/src/assets/images/success.png b/src/assets/images/success.png new file mode 100644 index 0000000..dd8bef5 Binary files /dev/null and b/src/assets/images/success.png differ diff --git a/src/assets/images/warn.png b/src/assets/images/warn.png new file mode 100644 index 0000000..596ce55 Binary files /dev/null and b/src/assets/images/warn.png differ diff --git "a/src/assets/images/\353\217\204\354\236\245.png" "b/src/assets/images/\353\217\204\354\236\245.png" new file mode 100644 index 0000000..b84dccb Binary files /dev/null and "b/src/assets/images/\353\217\204\354\236\245.png" differ diff --git "a/src/assets/images/\354\230\250\353\235\274\354\235\270\352\262\260\354\240\234.png" "b/src/assets/images/\354\230\250\353\235\274\354\235\270\352\262\260\354\240\234.png" new file mode 100644 index 0000000..e0644ba Binary files /dev/null and "b/src/assets/images/\354\230\250\353\235\274\354\235\270\352\262\260\354\240\234.png" differ diff --git a/src/assets/scss/common.scss b/src/assets/scss/common.scss index 4d36f11..30b37ff 100644 --- a/src/assets/scss/common.scss +++ b/src/assets/scss/common.scss @@ -1,11 +1,16 @@ $light-theme-color: rgba(130, 112, 190, 0.7); -$theme-color: #8270BE; +$theme-color: rgb(130, 112, 190); $input-color: #6C7F98; +$back-color: #EBEBEB; +$success-color: rgb(44, 128, 206); +$waiting-color: #DFD93B; +$warning-color: rgb(255, 99, 71); $base-shadow : 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); $nav-bar-height : 60px; $side-bar-width : 150px; +$mobile-header-height : 100px; @mixin flex-box($direction, $align, $gap) { display: flex; @@ -15,13 +20,10 @@ $side-bar-width : 150px; gap: $gap; } -@mixin base-button($width, $font-size) { - width: $width; +@mixin base-button() { box-shadow: 0 5px 10px rgba(0,0,0,0.16), 0 5px 10px rgba(0,0,0,0.23); box-sizing: border-box; - padding: 10px; border-radius: 10px; - font-size: $font-size; font-weight: bold; transition: all 0.3s cubic-bezier(.25,.8,.25,1); cursor: pointer; @@ -33,6 +35,14 @@ $side-bar-width : 150px; } } +@mixin base-icon() { + cursor: pointer; + transition: opacity 0.5s; + &:hover { + opacity: 0.5; + } +} + @mixin base-input($width, $font-size) { box-sizing: border-box; width: $width; @@ -49,6 +59,19 @@ $side-bar-width : 150px; } } +@mixin white-text($font-size) { + color: white; + font-weight: bold; + font-size: $font-size; +} + +@mixin root-container { + background: $back-color; + width: 100%; + min-height: 100%; + height: 100%; + overflow: auto; +} diff --git a/src/assets/scss/component/modal.scss b/src/assets/scss/component/modal.scss new file mode 100644 index 0000000..2892992 --- /dev/null +++ b/src/assets/scss/component/modal.scss @@ -0,0 +1,56 @@ +.modal-overlay { + position: fixed; + top: $nav-bar-height; + left: $side-bar-width; + width: calc(100vw - $side-bar-width); + height: calc(100vh - $nav-bar-height); + padding: 20px 0; + background: rgba(255, 255, 255, 0.8); + display: flex; + justify-content: center; + align-items: center; + z-index: 999 +} + +.modal-content { + @include flex-box(column, center, 20px); + width: 500px; + max-height: 100%; + padding: 0px 30px; + border-radius : 10px; + box-shadow: $base-shadow; + background-color: white; + .modal-main { + @include flex-box(column, center, 20px); + width: 100%; + max-height: 100%; + overflow: auto; + } +} + +.fade-enter-from, .fade-leave-to { + opacity: 0; +} + +.fade-enter-active, .fade-leave-active{ + transition: all 0.3s; +} + +.fade-enter-to, .fade-leave-from{ + opacity: 1; +} + +/* 웹킷 브라우저의 스크롤바 숨기기 */ +.modal-main::-webkit-scrollbar { + display: none; +} + +/* 파이어폭스의 스크롤바 숨기기 */ +.modal-main { + scrollbar-width: none; /* Firefox */ +} + +/* Edge, IE 10+, 및 최신 브라우저의 스크롤바 숨기기 */ +.modal-main { + -ms-overflow-style: none; /* IE 10+ */ +} \ No newline at end of file diff --git a/src/assets/scss/component/select.scss b/src/assets/scss/component/select.scss new file mode 100644 index 0000000..070b104 --- /dev/null +++ b/src/assets/scss/component/select.scss @@ -0,0 +1,43 @@ +@mixin select-btn { + border: $theme-color solid 2px; + border-radius: 20px; + width: 100%; + background-color: white; + font-weight: bold; + transition: all 0.5s; +} + +@mixin select-list { + z-index: 10; + position: absolute; + list-style: none; + width: 100%; + padding: 10px; + border-radius: 10px; + border: $theme-color solid 2px; + background-color: white; + li { + width: 100%; + padding: 5px 10px; + border-radius: 10px; + text-align: center; + font-weight: bold; + transition: all 0.3s; + cursor: pointer; + &:hover { + background-color: rgb(0, 0, 0, 0.1) + } + } +} + +.fade-enter-from, .fade-leave-to { + opacity: 0; +} + +.fade-enter-active, .fade-leave-active{ + transition: all 0.2s; +} + +.fade-enter-to, .fade-leave-from{ + opacity: 1; +} diff --git a/src/assets/scss/component/static-box.scss b/src/assets/scss/component/static-box.scss new file mode 100644 index 0000000..7b1e43c --- /dev/null +++ b/src/assets/scss/component/static-box.scss @@ -0,0 +1,14 @@ +.static-box { + @include flex-box(column, space-between, 30px); + padding: 30px; + background-color: white; + border-radius: 15px; + border: $theme-color 4px solid; + + .title-box { + @include flex-box(row, center, 0px); + width: 100%; + font-size: 20px; + font-weight: bolder; + } +} \ No newline at end of file diff --git a/src/assets/scss/component/table.scss b/src/assets/scss/component/table.scss new file mode 100644 index 0000000..22fb911 --- /dev/null +++ b/src/assets/scss/component/table.scss @@ -0,0 +1,59 @@ +@mixin base-table() { + width: 100%; + thead{ + position: sticky; + top: 0; + z-index: 1; + } +} + +.table-box { + @include flex-box(column, space-between, 0px); + position:relative; + box-shadow: $base-shadow; + background: white; + width: 100%; + flex-grow: 1; + overflow:auto; + border-radius: 5px; +} + +.table-row { + transition: all 0.3s; + border-bottom: 1px solid #ccc; + cursor: pointer; + + &:hover { + background-color: $back-color; + opacity: 0.5; + } + + .table-column { + // width: 100px; + font-weight: bold; + padding: 25px 20px; + } +} + +.status-sticker { + @include flex-box(row, center, 0px); + @include white-text(14px); + padding: 3px 5px; + border-radius: 20px; +} + + +/* 웹킷 브라우저의 스크롤바 숨기기 */ +.table-box::-webkit-scrollbar { + display: none; +} + +/* 파이어폭스의 스크롤바 숨기기 */ +.table-box { + scrollbar-width: none; /* Firefox */ +} + +/* Edge, IE 10+, 및 최신 브라우저의 스크롤바 숨기기 */ +.table-box { + -ms-overflow-style: none; /* IE 10+ */ +} \ No newline at end of file diff --git a/src/assets/scss/contract/choose-box.scss b/src/assets/scss/contract/choose-box.scss new file mode 100644 index 0000000..0604f44 --- /dev/null +++ b/src/assets/scss/contract/choose-box.scss @@ -0,0 +1,17 @@ +.right-side { + @include flex-box(column, space-between, 20px); + position: relative; + width: 100%; + min-width: 800px; +} + +.right-side-header { + @include flex-box(row, space-between, 20px); + width: 100%; + + .input-box{ + @include flex-box(row, space-between, 20px); + width: 50%; + } + +} \ No newline at end of file diff --git a/src/assets/scss/item.scss b/src/assets/scss/item.scss new file mode 100644 index 0000000..7567c6c --- /dev/null +++ b/src/assets/scss/item.scss @@ -0,0 +1,7 @@ +.root-container { + @include flex-box(column, space-between, 20px); + background: $back-color; + width: 100%; + min-height:100%; + padding: 30px 40px +} \ No newline at end of file diff --git a/src/components/auth/AuthBtnInput.vue b/src/components/auth/AuthBtnInput.vue index 09053ab..ca56744 100644 --- a/src/components/auth/AuthBtnInput.vue +++ b/src/components/auth/AuthBtnInput.vue @@ -38,10 +38,13 @@ .main-box { input { - @include base-input(70%, 16px) + @include base-input(70%, 16px); } button { - @include base-button(25%, 16px); + @include base-button(); + padding: 10px; + width: 25%; + font-size: 16px; background-color: $theme-color; border: none; color : white; diff --git a/src/components/auth/AuthButton.vue b/src/components/auth/AuthButton.vue index ff48ea7..4652570 100644 --- a/src/components/auth/AuthButton.vue +++ b/src/components/auth/AuthButton.vue @@ -14,7 +14,8 @@ export default { \ No newline at end of file diff --git a/src/components/common/Loading.vue b/src/components/common/Loading.vue new file mode 100644 index 0000000..c08b1f0 --- /dev/null +++ b/src/components/common/Loading.vue @@ -0,0 +1,28 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/PaginationBar.vue b/src/components/common/PaginationBar.vue new file mode 100644 index 0000000..660b667 --- /dev/null +++ b/src/components/common/PaginationBar.vue @@ -0,0 +1,48 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/TheNavBar.vue b/src/components/common/TheNavBar.vue index c09af11..7dbeefa 100644 --- a/src/components/common/TheNavBar.vue +++ b/src/components/common/TheNavBar.vue @@ -33,11 +33,11 @@ export default { .nav-bar { @include flex-box(row, space-between, 0px); background-color: $theme-color; - position: fixed; + position: absolute; top: 0px; left: 0px; height: $nav-bar-height; - width: 100vw; + width: 100%; padding: 0px 20px; z-index: 2; .nav-info { diff --git a/src/components/common/TheSideBar.vue b/src/components/common/TheSideBar.vue index 5484bcf..828fd82 100644 --- a/src/components/common/TheSideBar.vue +++ b/src/components/common/TheSideBar.vue @@ -40,11 +40,11 @@ export default { \ No newline at end of file diff --git a/src/components/common/btn/ResetIconBtn.vue b/src/components/common/btn/ResetIconBtn.vue new file mode 100644 index 0000000..9217005 --- /dev/null +++ b/src/components/common/btn/ResetIconBtn.vue @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/btn/SuccessWideBtn.vue b/src/components/common/btn/SuccessWideBtn.vue new file mode 100644 index 0000000..3f07a5f --- /dev/null +++ b/src/components/common/btn/SuccessWideBtn.vue @@ -0,0 +1,29 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/btn/ThemeBtn.vue b/src/components/common/btn/ThemeBtn.vue new file mode 100644 index 0000000..d8e0173 --- /dev/null +++ b/src/components/common/btn/ThemeBtn.vue @@ -0,0 +1,28 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/btn/ThemeIconBtn.vue b/src/components/common/btn/ThemeIconBtn.vue new file mode 100644 index 0000000..a40dc0e --- /dev/null +++ b/src/components/common/btn/ThemeIconBtn.vue @@ -0,0 +1,31 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/btn/ThemeWideBtn.vue b/src/components/common/btn/ThemeWideBtn.vue new file mode 100644 index 0000000..4555bf9 --- /dev/null +++ b/src/components/common/btn/ThemeWideBtn.vue @@ -0,0 +1,29 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/btn/WarningBtn.vue b/src/components/common/btn/WarningBtn.vue new file mode 100644 index 0000000..7b2fd05 --- /dev/null +++ b/src/components/common/btn/WarningBtn.vue @@ -0,0 +1,28 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/btn/WarningWideBtn.vue b/src/components/common/btn/WarningWideBtn.vue new file mode 100644 index 0000000..fecbcda --- /dev/null +++ b/src/components/common/btn/WarningWideBtn.vue @@ -0,0 +1,29 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/btn/WhiteIconBtn.vue b/src/components/common/btn/WhiteIconBtn.vue new file mode 100644 index 0000000..fb21484 --- /dev/null +++ b/src/components/common/btn/WhiteIconBtn.vue @@ -0,0 +1,30 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/info/DescriptionInfo.vue b/src/components/common/info/DescriptionInfo.vue new file mode 100644 index 0000000..ed33895 --- /dev/null +++ b/src/components/common/info/DescriptionInfo.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/src/components/common/info/IconInfo.vue b/src/components/common/info/IconInfo.vue new file mode 100644 index 0000000..3a23b01 --- /dev/null +++ b/src/components/common/info/IconInfo.vue @@ -0,0 +1,43 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/info/NoTitleInfo.vue b/src/components/common/info/NoTitleInfo.vue new file mode 100644 index 0000000..4550506 --- /dev/null +++ b/src/components/common/info/NoTitleInfo.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/components/common/info/TitleInfo.vue b/src/components/common/info/TitleInfo.vue new file mode 100644 index 0000000..ed55880 --- /dev/null +++ b/src/components/common/info/TitleInfo.vue @@ -0,0 +1,48 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/input/CalendarDateInput.vue b/src/components/common/input/CalendarDateInput.vue new file mode 100644 index 0000000..284cede --- /dev/null +++ b/src/components/common/input/CalendarDateInput.vue @@ -0,0 +1,36 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/input/FileInput.vue b/src/components/common/input/FileInput.vue new file mode 100644 index 0000000..32a4375 --- /dev/null +++ b/src/components/common/input/FileInput.vue @@ -0,0 +1,70 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/input/InfoInput.vue b/src/components/common/input/InfoInput.vue new file mode 100644 index 0000000..4ac74fd --- /dev/null +++ b/src/components/common/input/InfoInput.vue @@ -0,0 +1,58 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/input/SearchInput.vue b/src/components/common/input/SearchInput.vue new file mode 100644 index 0000000..042dc8e --- /dev/null +++ b/src/components/common/input/SearchInput.vue @@ -0,0 +1,47 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/input/SearchSmallInput.vue b/src/components/common/input/SearchSmallInput.vue new file mode 100644 index 0000000..6cb3c75 --- /dev/null +++ b/src/components/common/input/SearchSmallInput.vue @@ -0,0 +1,48 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/input/TextAreaInput.vue b/src/components/common/input/TextAreaInput.vue new file mode 100644 index 0000000..efaaf8a --- /dev/null +++ b/src/components/common/input/TextAreaInput.vue @@ -0,0 +1,30 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/modal/ModalFooter.vue b/src/components/common/modal/ModalFooter.vue new file mode 100644 index 0000000..b90abff --- /dev/null +++ b/src/components/common/modal/ModalFooter.vue @@ -0,0 +1,36 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/modal/ModalHeader.vue b/src/components/common/modal/ModalHeader.vue new file mode 100644 index 0000000..e5b84ca --- /dev/null +++ b/src/components/common/modal/ModalHeader.vue @@ -0,0 +1,34 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/pagination/PageChoice.vue b/src/components/common/pagination/PageChoice.vue new file mode 100644 index 0000000..7a50555 --- /dev/null +++ b/src/components/common/pagination/PageChoice.vue @@ -0,0 +1,91 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/pagination/SizeChoice.vue b/src/components/common/pagination/SizeChoice.vue new file mode 100644 index 0000000..5cc1b6c --- /dev/null +++ b/src/components/common/pagination/SizeChoice.vue @@ -0,0 +1,90 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/select/KeywordSelect.vue b/src/components/common/select/KeywordSelect.vue new file mode 100644 index 0000000..0d60d9f --- /dev/null +++ b/src/components/common/select/KeywordSelect.vue @@ -0,0 +1,72 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/select/SmallSelect.vue b/src/components/common/select/SmallSelect.vue new file mode 100644 index 0000000..273500b --- /dev/null +++ b/src/components/common/select/SmallSelect.vue @@ -0,0 +1,73 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/select/TitleSelect.vue b/src/components/common/select/TitleSelect.vue new file mode 100644 index 0000000..4c7bc60 --- /dev/null +++ b/src/components/common/select/TitleSelect.vue @@ -0,0 +1,109 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/table/TableHaeder.vue b/src/components/common/table/TableHaeder.vue new file mode 100644 index 0000000..7807481 --- /dev/null +++ b/src/components/common/table/TableHaeder.vue @@ -0,0 +1,84 @@ + + + + + \ No newline at end of file diff --git a/src/components/consent/modal/ConsentCreateModal.vue b/src/components/consent/modal/ConsentCreateModal.vue new file mode 100644 index 0000000..201f662 --- /dev/null +++ b/src/components/consent/modal/ConsentCreateModal.vue @@ -0,0 +1,127 @@ + + + + + \ No newline at end of file diff --git a/src/components/consent/modal/ConsentUpdateModal.vue b/src/components/consent/modal/ConsentUpdateModal.vue new file mode 100644 index 0000000..4490a03 --- /dev/null +++ b/src/components/consent/modal/ConsentUpdateModal.vue @@ -0,0 +1,145 @@ + + + + + \ No newline at end of file diff --git a/src/components/contract/ContractCreateInfo.vue b/src/components/contract/ContractCreateInfo.vue new file mode 100644 index 0000000..55df5ba --- /dev/null +++ b/src/components/contract/ContractCreateInfo.vue @@ -0,0 +1,90 @@ + + + + + \ No newline at end of file diff --git a/src/components/contract/ContractEditInfo.vue b/src/components/contract/ContractEditInfo.vue new file mode 100644 index 0000000..5878e3e --- /dev/null +++ b/src/components/contract/ContractEditInfo.vue @@ -0,0 +1,94 @@ + + + + + \ No newline at end of file diff --git a/src/components/contract/ContractInfo.vue b/src/components/contract/ContractInfo.vue new file mode 100644 index 0000000..3797bda --- /dev/null +++ b/src/components/contract/ContractInfo.vue @@ -0,0 +1,102 @@ + + + + + \ No newline at end of file diff --git a/src/components/contract/create/ContractChooseInfo.vue b/src/components/contract/create/ContractChooseInfo.vue new file mode 100644 index 0000000..560b504 --- /dev/null +++ b/src/components/contract/create/ContractChooseInfo.vue @@ -0,0 +1,145 @@ + + + + + diff --git a/src/components/contract/create/ContractChooseItem.vue b/src/components/contract/create/ContractChooseItem.vue new file mode 100644 index 0000000..a63c194 --- /dev/null +++ b/src/components/contract/create/ContractChooseItem.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/src/components/contract/create/ContractChooseMember.vue b/src/components/contract/create/ContractChooseMember.vue new file mode 100644 index 0000000..5aac439 --- /dev/null +++ b/src/components/contract/create/ContractChooseMember.vue @@ -0,0 +1,29 @@ + + + + + \ No newline at end of file diff --git a/src/components/contract/modal/ContractBulkErrorModal.vue b/src/components/contract/modal/ContractBulkErrorModal.vue new file mode 100644 index 0000000..527d10d --- /dev/null +++ b/src/components/contract/modal/ContractBulkErrorModal.vue @@ -0,0 +1,54 @@ + + + + + \ No newline at end of file diff --git a/src/components/contract/modal/ContractDeleteModal.vue b/src/components/contract/modal/ContractDeleteModal.vue new file mode 100644 index 0000000..4316fc2 --- /dev/null +++ b/src/components/contract/modal/ContractDeleteModal.vue @@ -0,0 +1,58 @@ + + + + + \ No newline at end of file diff --git a/src/components/contract/modal/InvoiceCreateModal.vue b/src/components/contract/modal/InvoiceCreateModal.vue new file mode 100644 index 0000000..ac77d32 --- /dev/null +++ b/src/components/contract/modal/InvoiceCreateModal.vue @@ -0,0 +1,104 @@ + + + + + \ No newline at end of file diff --git a/src/components/contract/table/ContractCreateTable.vue b/src/components/contract/table/ContractCreateTable.vue new file mode 100644 index 0000000..bed290c --- /dev/null +++ b/src/components/contract/table/ContractCreateTable.vue @@ -0,0 +1,82 @@ + + + + + \ No newline at end of file diff --git a/src/components/contract/table/ContractInvoiceTable.vue b/src/components/contract/table/ContractInvoiceTable.vue new file mode 100644 index 0000000..db0157b --- /dev/null +++ b/src/components/contract/table/ContractInvoiceTable.vue @@ -0,0 +1,67 @@ + + + + + \ No newline at end of file diff --git a/src/components/contract/table/ContractInvoiceTableFilter.vue b/src/components/contract/table/ContractInvoiceTableFilter.vue new file mode 100644 index 0000000..1021b1e --- /dev/null +++ b/src/components/contract/table/ContractInvoiceTableFilter.vue @@ -0,0 +1,117 @@ + + + + + \ No newline at end of file diff --git a/src/components/contract/table/ContractInvoiceTableRow.vue b/src/components/contract/table/ContractInvoiceTableRow.vue new file mode 100644 index 0000000..b9ef0d1 --- /dev/null +++ b/src/components/contract/table/ContractInvoiceTableRow.vue @@ -0,0 +1,58 @@ + + + + + \ No newline at end of file diff --git a/src/components/contract/table/ContractTable.vue b/src/components/contract/table/ContractTable.vue new file mode 100644 index 0000000..6da8fb5 --- /dev/null +++ b/src/components/contract/table/ContractTable.vue @@ -0,0 +1,41 @@ + + + + + \ No newline at end of file diff --git a/src/components/contract/table/ContractTableFilter.vue b/src/components/contract/table/ContractTableFilter.vue new file mode 100644 index 0000000..5bd2bca --- /dev/null +++ b/src/components/contract/table/ContractTableFilter.vue @@ -0,0 +1,114 @@ + + + + + \ No newline at end of file diff --git a/src/components/contract/table/ContractTableRow.vue b/src/components/contract/table/ContractTableRow.vue new file mode 100644 index 0000000..d0d88fe --- /dev/null +++ b/src/components/contract/table/ContractTableRow.vue @@ -0,0 +1,83 @@ + + + + + \ No newline at end of file diff --git a/src/components/contract/table/ItemSelectTable.vue b/src/components/contract/table/ItemSelectTable.vue new file mode 100644 index 0000000..8dca555 --- /dev/null +++ b/src/components/contract/table/ItemSelectTable.vue @@ -0,0 +1,59 @@ + + + + + \ No newline at end of file diff --git a/src/components/contract/table/ItemSelectTableRow.vue b/src/components/contract/table/ItemSelectTableRow.vue new file mode 100644 index 0000000..6114140 --- /dev/null +++ b/src/components/contract/table/ItemSelectTableRow.vue @@ -0,0 +1,47 @@ + + + + + \ No newline at end of file diff --git a/src/components/contract/table/MemberSelectTable.vue b/src/components/contract/table/MemberSelectTable.vue new file mode 100644 index 0000000..16c45d1 --- /dev/null +++ b/src/components/contract/table/MemberSelectTable.vue @@ -0,0 +1,60 @@ + + + + + \ No newline at end of file diff --git a/src/components/contract/table/MemberSelectTableRow.vue b/src/components/contract/table/MemberSelectTableRow.vue new file mode 100644 index 0000000..ac1e075 --- /dev/null +++ b/src/components/contract/table/MemberSelectTableRow.vue @@ -0,0 +1,41 @@ + + + + + \ No newline at end of file diff --git a/src/components/invoice/detail/InvoiceInfo.vue b/src/components/invoice/detail/InvoiceInfo.vue new file mode 100644 index 0000000..2d2afb4 --- /dev/null +++ b/src/components/invoice/detail/InvoiceInfo.vue @@ -0,0 +1,101 @@ + + + + + \ No newline at end of file diff --git a/src/components/invoice/detail/PaymentInfo.vue b/src/components/invoice/detail/PaymentInfo.vue new file mode 100644 index 0000000..4538b8a --- /dev/null +++ b/src/components/invoice/detail/PaymentInfo.vue @@ -0,0 +1,97 @@ + + + + + \ No newline at end of file diff --git a/src/components/invoice/detail/PaymentStatusBar.vue b/src/components/invoice/detail/PaymentStatusBar.vue new file mode 100644 index 0000000..24c7fe7 --- /dev/null +++ b/src/components/invoice/detail/PaymentStatusBar.vue @@ -0,0 +1,66 @@ + + + + + \ No newline at end of file diff --git a/src/components/invoice/modal/InvoiceDeleteModal.vue b/src/components/invoice/modal/InvoiceDeleteModal.vue new file mode 100644 index 0000000..eacedbb --- /dev/null +++ b/src/components/invoice/modal/InvoiceDeleteModal.vue @@ -0,0 +1,54 @@ + + + + + \ No newline at end of file diff --git a/src/components/invoice/modal/InvoiceUpdateModal.vue b/src/components/invoice/modal/InvoiceUpdateModal.vue new file mode 100644 index 0000000..f786fc9 --- /dev/null +++ b/src/components/invoice/modal/InvoiceUpdateModal.vue @@ -0,0 +1,103 @@ + + + + + \ No newline at end of file diff --git a/src/components/invoice/modal/PaymentDeleteModal .vue b/src/components/invoice/modal/PaymentDeleteModal .vue new file mode 100644 index 0000000..a7deddb --- /dev/null +++ b/src/components/invoice/modal/PaymentDeleteModal .vue @@ -0,0 +1,53 @@ + + + + + \ No newline at end of file diff --git a/src/components/invoice/table/InvoiceCreateTable.vue b/src/components/invoice/table/InvoiceCreateTable.vue new file mode 100644 index 0000000..bc1f971 --- /dev/null +++ b/src/components/invoice/table/InvoiceCreateTable.vue @@ -0,0 +1,42 @@ + + + + + \ No newline at end of file diff --git a/src/components/invoice/table/InvoiceCreateTableFilter.vue b/src/components/invoice/table/InvoiceCreateTableFilter.vue new file mode 100644 index 0000000..e8504d8 --- /dev/null +++ b/src/components/invoice/table/InvoiceCreateTableFilter.vue @@ -0,0 +1,113 @@ + + + + + \ No newline at end of file diff --git a/src/components/invoice/table/InvoiceCreateTableRow.vue b/src/components/invoice/table/InvoiceCreateTableRow.vue new file mode 100644 index 0000000..977b60a --- /dev/null +++ b/src/components/invoice/table/InvoiceCreateTableRow.vue @@ -0,0 +1,60 @@ + + + + + \ No newline at end of file diff --git a/src/components/invoice/table/InvoiceTable.vue b/src/components/invoice/table/InvoiceTable.vue new file mode 100644 index 0000000..ebc4d98 --- /dev/null +++ b/src/components/invoice/table/InvoiceTable.vue @@ -0,0 +1,42 @@ + + + + + \ No newline at end of file diff --git a/src/components/invoice/table/InvoiceTableFilter.vue b/src/components/invoice/table/InvoiceTableFilter.vue new file mode 100644 index 0000000..737ad0b --- /dev/null +++ b/src/components/invoice/table/InvoiceTableFilter.vue @@ -0,0 +1,173 @@ + + + + + \ No newline at end of file diff --git a/src/components/invoice/table/InvoiceTableRow.vue b/src/components/invoice/table/InvoiceTableRow.vue new file mode 100644 index 0000000..f852f24 --- /dev/null +++ b/src/components/invoice/table/InvoiceTableRow.vue @@ -0,0 +1,66 @@ + + + + + \ No newline at end of file diff --git a/src/components/item/ItemInfo.vue b/src/components/item/ItemInfo.vue new file mode 100644 index 0000000..1a2cbeb --- /dev/null +++ b/src/components/item/ItemInfo.vue @@ -0,0 +1,49 @@ + + + + + \ No newline at end of file diff --git a/src/components/item/ItemSearch.vue b/src/components/item/ItemSearch.vue new file mode 100644 index 0000000..4a48946 --- /dev/null +++ b/src/components/item/ItemSearch.vue @@ -0,0 +1,42 @@ + + + + + \ No newline at end of file diff --git a/src/components/item/modal/ItemCreateModal.vue b/src/components/item/modal/ItemCreateModal.vue new file mode 100644 index 0000000..fefb407 --- /dev/null +++ b/src/components/item/modal/ItemCreateModal.vue @@ -0,0 +1,111 @@ + + + + + \ No newline at end of file diff --git a/src/components/item/modal/ItemDeleteModal.vue b/src/components/item/modal/ItemDeleteModal.vue new file mode 100644 index 0000000..4b14b59 --- /dev/null +++ b/src/components/item/modal/ItemDeleteModal.vue @@ -0,0 +1,63 @@ + + + + + \ No newline at end of file diff --git a/src/components/item/modal/ItemUpdateModal.vue b/src/components/item/modal/ItemUpdateModal.vue new file mode 100644 index 0000000..8c32c83 --- /dev/null +++ b/src/components/item/modal/ItemUpdateModal.vue @@ -0,0 +1,141 @@ + + + + + \ No newline at end of file diff --git a/src/components/item/table/ItemContractTable.vue b/src/components/item/table/ItemContractTable.vue new file mode 100644 index 0000000..74b1d31 --- /dev/null +++ b/src/components/item/table/ItemContractTable.vue @@ -0,0 +1,41 @@ + + + + + \ No newline at end of file diff --git a/src/components/item/table/ItemContractTableFilter.vue b/src/components/item/table/ItemContractTableFilter.vue new file mode 100644 index 0000000..bdf2b05 --- /dev/null +++ b/src/components/item/table/ItemContractTableFilter.vue @@ -0,0 +1,109 @@ + + + + + \ No newline at end of file diff --git a/src/components/item/table/ItemContractTableRow.vue b/src/components/item/table/ItemContractTableRow.vue new file mode 100644 index 0000000..7fdbec1 --- /dev/null +++ b/src/components/item/table/ItemContractTableRow.vue @@ -0,0 +1,89 @@ + + + + + \ No newline at end of file diff --git a/src/components/item/table/ItemTable.vue b/src/components/item/table/ItemTable.vue new file mode 100644 index 0000000..c438991 --- /dev/null +++ b/src/components/item/table/ItemTable.vue @@ -0,0 +1,38 @@ + + + + + \ No newline at end of file diff --git a/src/components/item/table/ItemTableRow.vue b/src/components/item/table/ItemTableRow.vue new file mode 100644 index 0000000..65e94ae --- /dev/null +++ b/src/components/item/table/ItemTableRow.vue @@ -0,0 +1,46 @@ + + + + + \ No newline at end of file diff --git a/src/components/member/MemberInfo.vue b/src/components/member/MemberInfo.vue new file mode 100644 index 0000000..917a45e --- /dev/null +++ b/src/components/member/MemberInfo.vue @@ -0,0 +1,48 @@ + + + + + \ No newline at end of file diff --git a/src/components/member/MemberSearch.vue b/src/components/member/MemberSearch.vue new file mode 100644 index 0000000..4d446dc --- /dev/null +++ b/src/components/member/MemberSearch.vue @@ -0,0 +1,63 @@ + + + + + \ No newline at end of file diff --git a/src/components/member/modal/MemberBulkErrorModal.vue b/src/components/member/modal/MemberBulkErrorModal.vue new file mode 100644 index 0000000..c387a84 --- /dev/null +++ b/src/components/member/modal/MemberBulkErrorModal.vue @@ -0,0 +1,55 @@ + + + + + \ No newline at end of file diff --git a/src/components/member/modal/MemberCreateModal.vue b/src/components/member/modal/MemberCreateModal.vue new file mode 100644 index 0000000..a6dae0a --- /dev/null +++ b/src/components/member/modal/MemberCreateModal.vue @@ -0,0 +1,72 @@ + + + + + \ No newline at end of file diff --git a/src/components/member/modal/MemberDeleteModal.vue b/src/components/member/modal/MemberDeleteModal.vue new file mode 100644 index 0000000..83d281d --- /dev/null +++ b/src/components/member/modal/MemberDeleteModal.vue @@ -0,0 +1,62 @@ + + + + + \ No newline at end of file diff --git a/src/components/member/modal/MemberUpdateModal.vue b/src/components/member/modal/MemberUpdateModal.vue new file mode 100644 index 0000000..ec23e93 --- /dev/null +++ b/src/components/member/modal/MemberUpdateModal.vue @@ -0,0 +1,88 @@ + + + + + \ No newline at end of file diff --git a/src/components/member/table/MemberContractTable.vue b/src/components/member/table/MemberContractTable.vue new file mode 100644 index 0000000..562d9be --- /dev/null +++ b/src/components/member/table/MemberContractTable.vue @@ -0,0 +1,41 @@ + + + + + \ No newline at end of file diff --git a/src/components/member/table/MemberContractTableFilter.vue b/src/components/member/table/MemberContractTableFilter.vue new file mode 100644 index 0000000..dd3b2a5 --- /dev/null +++ b/src/components/member/table/MemberContractTableFilter.vue @@ -0,0 +1,106 @@ + + + + + \ No newline at end of file diff --git a/src/components/member/table/MemberContractTableRow.vue b/src/components/member/table/MemberContractTableRow.vue new file mode 100644 index 0000000..821f2c0 --- /dev/null +++ b/src/components/member/table/MemberContractTableRow.vue @@ -0,0 +1,89 @@ + + + + + \ No newline at end of file diff --git a/src/components/member/table/MemberCreateTable.vue b/src/components/member/table/MemberCreateTable.vue new file mode 100644 index 0000000..aa5f67f --- /dev/null +++ b/src/components/member/table/MemberCreateTable.vue @@ -0,0 +1,70 @@ + + + + + \ No newline at end of file diff --git a/src/components/member/table/MemberTable.vue b/src/components/member/table/MemberTable.vue new file mode 100644 index 0000000..8ebbdd0 --- /dev/null +++ b/src/components/member/table/MemberTable.vue @@ -0,0 +1,38 @@ + + + + + \ No newline at end of file diff --git a/src/components/member/table/MemberTableRow.vue b/src/components/member/table/MemberTableRow.vue new file mode 100644 index 0000000..25a4204 --- /dev/null +++ b/src/components/member/table/MemberTableRow.vue @@ -0,0 +1,40 @@ + + + + + \ No newline at end of file diff --git a/src/components/payment/AgreementBox.vue b/src/components/payment/AgreementBox.vue new file mode 100644 index 0000000..c12411f --- /dev/null +++ b/src/components/payment/AgreementBox.vue @@ -0,0 +1,175 @@ + + + + + \ No newline at end of file diff --git a/src/components/payment/ButtonContainer.vue b/src/components/payment/ButtonContainer.vue new file mode 100644 index 0000000..8d1ae9b --- /dev/null +++ b/src/components/payment/ButtonContainer.vue @@ -0,0 +1,88 @@ + + + + + \ No newline at end of file diff --git a/src/components/payment/DescriptionBox.vue b/src/components/payment/DescriptionBox.vue new file mode 100644 index 0000000..80319fe --- /dev/null +++ b/src/components/payment/DescriptionBox.vue @@ -0,0 +1,23 @@ + + + + + \ No newline at end of file diff --git a/src/components/payment/ErrorContainer.vue b/src/components/payment/ErrorContainer.vue new file mode 100644 index 0000000..41b21ef --- /dev/null +++ b/src/components/payment/ErrorContainer.vue @@ -0,0 +1,39 @@ + + + + + \ No newline at end of file diff --git a/src/components/payment/ItemContent.vue b/src/components/payment/ItemContent.vue new file mode 100644 index 0000000..81e3001 --- /dev/null +++ b/src/components/payment/ItemContent.vue @@ -0,0 +1,29 @@ + + + + + \ No newline at end of file diff --git a/src/components/payment/ItemTitle.vue b/src/components/payment/ItemTitle.vue new file mode 100644 index 0000000..3da01e6 --- /dev/null +++ b/src/components/payment/ItemTitle.vue @@ -0,0 +1,19 @@ + + + + + \ No newline at end of file diff --git a/src/components/payment/LoadingContainer.vue b/src/components/payment/LoadingContainer.vue new file mode 100644 index 0000000..780da63 --- /dev/null +++ b/src/components/payment/LoadingContainer.vue @@ -0,0 +1,33 @@ + + + + + \ No newline at end of file diff --git a/src/components/payment/NextPageButton.vue b/src/components/payment/NextPageButton.vue new file mode 100644 index 0000000..d66499c --- /dev/null +++ b/src/components/payment/NextPageButton.vue @@ -0,0 +1,88 @@ + + + + + \ No newline at end of file diff --git a/src/components/payment/PaymentContainer.vue b/src/components/payment/PaymentContainer.vue new file mode 100644 index 0000000..90c9f34 --- /dev/null +++ b/src/components/payment/PaymentContainer.vue @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/src/components/setting/SettingItemTable.vue b/src/components/setting/SettingItemTable.vue new file mode 100644 index 0000000..08dcf63 --- /dev/null +++ b/src/components/setting/SettingItemTable.vue @@ -0,0 +1,65 @@ + + + + + \ No newline at end of file diff --git a/src/components/setting/SettingItemTableRow.vue b/src/components/setting/SettingItemTableRow.vue new file mode 100644 index 0000000..20d538a --- /dev/null +++ b/src/components/setting/SettingItemTableRow.vue @@ -0,0 +1,94 @@ + + + + + \ No newline at end of file diff --git a/src/components/setting/SettingPaginationBar.vue b/src/components/setting/SettingPaginationBar.vue new file mode 100644 index 0000000..08707b2 --- /dev/null +++ b/src/components/setting/SettingPaginationBar.vue @@ -0,0 +1,41 @@ + + + + + \ No newline at end of file diff --git a/src/components/setting/SettingPaymentContent.vue b/src/components/setting/SettingPaymentContent.vue new file mode 100644 index 0000000..8947740 --- /dev/null +++ b/src/components/setting/SettingPaymentContent.vue @@ -0,0 +1,152 @@ + + + + + \ No newline at end of file diff --git a/src/components/setting/SettingTableHeader.vue b/src/components/setting/SettingTableHeader.vue new file mode 100644 index 0000000..7b70740 --- /dev/null +++ b/src/components/setting/SettingTableHeader.vue @@ -0,0 +1,98 @@ + + + + + \ No newline at end of file diff --git a/src/components/static/InvoiceAreaChart.vue b/src/components/static/InvoiceAreaChart.vue new file mode 100644 index 0000000..3773747 --- /dev/null +++ b/src/components/static/InvoiceAreaChart.vue @@ -0,0 +1,141 @@ + + + + + \ No newline at end of file diff --git a/src/components/static/InvoiceDoughnutChart.vue b/src/components/static/InvoiceDoughnutChart.vue new file mode 100644 index 0000000..25a0946 --- /dev/null +++ b/src/components/static/InvoiceDoughnutChart.vue @@ -0,0 +1,120 @@ + + + + \ No newline at end of file diff --git a/src/components/static/ProgressBox.vue b/src/components/static/ProgressBox.vue new file mode 100644 index 0000000..1ec4583 --- /dev/null +++ b/src/components/static/ProgressBox.vue @@ -0,0 +1,100 @@ + + + + + \ No newline at end of file diff --git a/src/components/static/ThisMonthStatic.vue b/src/components/static/ThisMonthStatic.vue new file mode 100644 index 0000000..35981cc --- /dev/null +++ b/src/components/static/ThisMonthStatic.vue @@ -0,0 +1,146 @@ + + + + + \ No newline at end of file diff --git a/src/main.js b/src/main.js index a22429c..e8b104b 100644 --- a/src/main.js +++ b/src/main.js @@ -9,6 +9,7 @@ import piniaPersist from 'pinia-plugin-persist' import App from './App.vue' import router from './router' +import { useLoadingStore } from './stores/error/loading' const app = createApp(App) const pinia = createPinia(); diff --git a/src/router/index.js b/src/router/index.js index fb20a5c..5222e11 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -1,15 +1,16 @@ import { createRouter, createWebHistory } from 'vue-router' import { useAuthStore } from '@/stores/auth'; - +import { useContractStore } from '@/stores/consent/non-member/contract'; const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), routes: [ { - path: '/', name: 'main', + path: '/', component: () => import('@/views/MainView.vue'), meta: { - requiresAuth: true + requiresAuth: true, + forMember: false, }, children: [ { @@ -22,25 +23,75 @@ const router = createRouter({ name:'item', component: () => import('@/views/item/ItemListView.vue') }, + { + path : '/item/:id', + name:'itemDetail', + component: () => import('@/views/item/ItemDetailView.vue') + }, { path : '/member', name:'member', component: () => import('@/views/member/MemberListView.vue') }, + { + path : '/member/bulk', + name:'memberBulk', + component: () => import('@/views/member/MemberBulkCreateView.vue') + }, + { + path : '/member/:id', + name:'memberDetail', + component: () => import('@/views/member/MemberDetailView.vue') + }, { path : '/contract', name:'contract', component: () => import('@/views/contract/ContractListView.vue') }, + { + path : '/contract/create', + name:'contractCreate', + component: () => import('@/views/contract/ContractCreateView.vue') + }, + { + path : '/contract/create/bulk', + name:'contractCreateBulk', + component: () => import('@/views/contract/ContractBulkCreateView.vue') + }, + { + path : '/contract/:id', + name:'contractDetail', + component: () => import('@/views/contract/ContractDetailView.vue') + }, + { + path : '/contract/:id/edit', + name:'contractEdit', + component: () => import('@/views/contract/ContractEditView.vue') + }, { path : '/invoice', name:'invoice', component: () => import('@/views/invoice/InvoiceListView.vue') }, + { + path : '/invoice/:id', + name:'invoiceDetail', + component: () => import('@/views/invoice/InvoiceDetailView.vue') + }, + { + path : '/invoice/create', + name:'invoiceCreate', + component: () => import('@/views/invoice/InvoiceCreateView.vue') + }, { path : '/setting', - name:'setting', - component: () => import('@/views/setting/SettingView.vue') + name:'settingItem', + component: () => import('@/views/setting/SettingItemView.vue') + }, + { + path : '/setting/payment', + name:'settingPayment', + component: () => import('@/views/setting/SettingPaymentView.vue') }, ] }, @@ -49,7 +100,8 @@ const router = createRouter({ path: '/auth', component: () => import('@/views/auth/AuthView.vue'), meta: { - requiresAuth: false + requiresAuth: false, + forMember: false, }, children: [ { @@ -64,6 +116,182 @@ const router = createRouter({ }, ] }, + { + name : 'mobile', + path: '/m', + component: () => import('@/views/MobileView.vue'), + meta: { + requiresAuth: false, + forMember: true, + }, + children: [ + { + path: '/m/consent/non-member/:clientId', + name: 'consent', + component: () => import('@/views/consent/non-member/ConsentItemView.vue'), + }, + { + path: '/m/consent/non-member/explanation/:clientId', + name: 'consentExplanation', + component: () => import('@/views/consent/non-member/ConsentExplanationView.vue'), + }, + { + path: '/m/consent/non-member/member-info/:clientId', + name: 'memberInfo', + component: () => import('@/views/consent/non-member/MemberInfoView.vue'), + }, + { + path: '/m/consent/non-member/contract-confirmation/:clientId', + name: 'contractInfoConfirmation', + component: () => import('@/views/consent/non-member/ContractInfoConfirmation.vue') + }, + { + path: '/m/consent/non-member/account-info/:clientId', + name: 'accountInfo', + component: () => import('@/views/consent/non-member/AccountInfoView.vue') + }, + { + path: '/m/consent/non-member/final-confirmation/:clientId', + name: 'finalConfirmation', + component: () => import('@/views/consent/non-member/FinalConfirmation.vue') + }, + { + path: '/m/consent/non-member/signature-input/:clientId', + name: 'signatureInput', + component: () => import('@/views/consent/non-member/SignatureInput.vue') + }, + { + path: '/m/consent/non-member/upload-signature/:clientId', + name: 'uploadSignature', + component: () => import('@/views/consent/non-member/UploadSignature.vue') + }, + { + path: '/m/consent/non-member/draw-signature/:clientId', + name: 'drawSignature', + component: () => import('@/views/consent/non-member/DrawSignature.vue') + }, + { + path: '/m/consent/non-member/payment-completion/:clientId', + name: 'paymentCompletion', + component: () => import('@/views/consent/non-member/PaymentCompletion.vue') + }, + { + path: '/m/consent/member/contract-confirmation/:contractId', + name: 'memberContractInfoConfirmation', + component: () => import('@/views/consent/member/ContractInfoConfirmation.vue') + }, + { + path: '/m/consent/member/account-info/:contractId', + name: 'memberAccountInfo', + component: () => import('@/views/consent/member/AccountInfoView.vue') + }, + { + path: '/m/consent/member/final-confirmation/:contractId', + name: 'memberFinalConfirmation', + component: () => import('@/views/consent/member/FinalConfirmation.vue') + }, + { + path: '/m/consent/member/signature-input/:contractId', + name: 'memberSignatureInput', + component: () => import('@/views/consent/member/SignatureInput.vue') + }, + { + path: '/m/consent/member/upload-signature/:contractId', + name: 'memberUploadSignature', + component: () => import('@/views/consent/member/UploadSignature.vue') + }, + { + path: '/m/consent/member/draw-signature/:contractId', + name: 'memberDrawSignature', + component: () => import('@/views/consent/member/DrawSignature.vue') + }, + { + path: '/m/consent/member/payment-completion/:contractId', + name: 'memberPaymentCompletion', + component: () => import('@/views/consent/member/PaymentCompletion.vue') + }, + { + path: '/m/payment/:invoiceId/info', + name: 'paymentInfo', + component: () => import('@/views/payment/PaymentInfoView.vue'), + }, + { + path: '/m/payment/:invoiceId/method', + name: 'paymentMethod', + component: () => import('@/views/payment/PaymentMethodView.vue'), + }, + { + path: '/m/payment/:invoiceId/card/agreement', + name: 'cardAgreement', + component: () => import('@/views/payment/card/CardPaymentAgreementView.vue'), + }, + { + path: '/m/payment/:invoiceId/card/input', + name: 'cardInput', + component: () => import('@/views/payment/card/CardPaymentInputView.vue'), + }, + { + path: '/m/payment/:invoiceId/card/confirm', + name: 'cardConfirm', + component: () => import('@/views/payment/card/CardPaymentConfirmView.vue'), + }, + { + path: '/m/payment/:invoiceId/account/agreement', + name: 'accountAgreement', + component: () => import('@/views/payment/account/AccountPaymentAgreementView.vue'), + }, + { + path: '/m/payment/:invoiceId/account/input', + name: 'accountInput', + component: () => import('@/views/payment/account/AccountPaymentInputView.vue'), + }, + { + path: '/m/payment/:invoiceId/account/confirm', + name: 'accountConfirm', + component: () => import('@/views/payment/account/AccountPaymentConfirmView.vue'), + }, + { + path: '/m/payment/:invoiceId/result', + name: 'paymentResult', + component: () => import('@/views/payment/PaymentResultView.vue'), + }, + ] + }, + { + path: "/server-error", + name: "serverError", + meta: { + requiresAuth: false, + forMember: true, + }, + component: () => import('@/views/error/ServerErrorView.vue') + }, + { + path: "/access-denied", + name: "accessDenied", + meta: { + requiresAuth: false, + forMember: true, + }, + component: () => import('@/views/error/AccessDeniedView.vue') + }, + { + path: "/not-found", + name: "notFound", + meta: { + requiresAuth: false, + forMember: true, + }, + component: () => import('@/views/error/NotFoundView.vue') + }, + { + path: "/:pathMatch(.*)*", + redirect: "/not-found", + meta: { + requiresAuth: false, + forMember: true, + }, + } ] }); @@ -72,11 +300,38 @@ router.beforeEach((to, from, next) => { if (to.meta.requiresAuth && !authStore.isLoggedIn) { next('/login'); - } else if (!to.meta.requiresAuth && authStore.isLoggedIn) { + } else if (!to.meta.forMember && !to.meta.requiresAuth && authStore.isLoggedIn) { next(''); } else { next(); } }); + +router.beforeEach((to, from, next) => { + const contractStore = useContractStore(); + + const protectedRoutes = [ + 'consentExplanation', + 'memberInfo', + 'contractInfoConfirmation', + 'accountInfo', + 'payment', + 'finalConfirmation', + 'signatureInput', + 'uploadSignature', + 'drawSignature', + 'paymentCompletion' + ]; + + + if (protectedRoutes.includes(to.name) && (!contractStore.clientId )) { + next({ name: 'consent', params: { clientId: to.params.clientId } }); + return; + } else { + next(); + } +}); + + export default router diff --git a/src/stores/consent/member/consentAccountInfo.js b/src/stores/consent/member/consentAccountInfo.js new file mode 100644 index 0000000..0a49173 --- /dev/null +++ b/src/stores/consent/member/consentAccountInfo.js @@ -0,0 +1,24 @@ +import { defineStore } from 'pinia' + +export const useConsentAccountInfoStore = defineStore('consentAccountInfo', { + state: () => ({ + infoMap: {} + }), + actions: { + setInfo(contractId, info) { + this.infoMap[contractId] = info + }, + getInfo(contractId) { + return this.infoMap[contractId] || null + } + }, + persist: { + enabled: true, + strategies: [ + { + storage: sessionStorage, + paths: ['infoMap'] + } + ] + } +}) \ No newline at end of file diff --git a/src/stores/consent/member/consentContractInfo.js b/src/stores/consent/member/consentContractInfo.js new file mode 100644 index 0000000..f71a42e --- /dev/null +++ b/src/stores/consent/member/consentContractInfo.js @@ -0,0 +1,24 @@ +import { defineStore } from 'pinia' + +export const useConsentContractInfoStore = defineStore('consentContractInfo', { + state: () => ({ + infoMap: {} + }), + actions: { + setInfo(contractId, info) { + this.infoMap[contractId] = info + }, + getInfo(contractId) { + return this.infoMap[contractId] || null + } + }, + persist: { + enabled: true, + strategies: [ + { + storage: sessionStorage, + paths: ['infoMap'] + } + ] + } +}) \ No newline at end of file diff --git a/src/stores/consent/member/consentResult.js b/src/stores/consent/member/consentResult.js new file mode 100644 index 0000000..bcd1abf --- /dev/null +++ b/src/stores/consent/member/consentResult.js @@ -0,0 +1,24 @@ +import { defineStore } from 'pinia' + +export const useConsentResultStore = defineStore('consentResult', { + state: () => ({ + infoMap: {} + }), + actions: { + setInfo(contractId, info) { + this.infoMap[contractId] = info + }, + getInfo(contractId) { + return this.infoMap[contractId] || null + } + }, + persist: { + enabled: true, + strategies: [ + { + storage: sessionStorage, + paths: ['infoMap'] + } + ] + } +}) \ No newline at end of file diff --git a/src/stores/consent/non-member/contract.js b/src/stores/consent/non-member/contract.js new file mode 100644 index 0000000..3ba6c73 --- /dev/null +++ b/src/stores/consent/non-member/contract.js @@ -0,0 +1,125 @@ +import { defineStore } from 'pinia' +import { fileAxios } from '@/utils/axios'; +export const useContractStore = defineStore('contract', { + + state: () => ({ + clientId: null, + memberInfo: { + name: '', + email: '', + phone: '' + }, + + productInfo: { + id: null, + name: '', + price: 0, + imageUrl: '', + amount: 1, + isSubscription: true + }, + + paymentInfo: { + totalAmount: 0, + accountBank: '', + accountOwner: '', + accountNumber: '', + paymentDate: null + }, + + contractInfo: { + contractCycle: null, + isSubscription: true + }, + + signImage: null + + }), + actions: { + setClientId(id) { + this.clientId = id; + }, + + setMemberInfo(info) { + this.memberInfo = { ...this.memberInfo, ...info }; + }, + + setProductInfo(info) { + this.productInfo = { ...this.productInfo, ...info }; + this.calculateTotalAmount(); + }, + + setPaymentInfo(info) { + this.paymentInfo = { ...this.paymentInfo, ...info }; + }, + + setContractInfo(info) { + this.contractInfo = { ...this.contractInfo, ...info }; + }, + + setSignImage(image) { + this.signImage = image; + }, + + calculateTotalAmount() { + this.paymentInfo.totalAmount = this.productInfo.price * this.productInfo.amount; + }, + + resetStore() { + // 초기화 하는 방법 + this.$reset(); + }, + + + async submitEasyConsent() { + const formData = new FormData(); + + + const requestData = { + memberName: this.memberInfo.name, + memberEmail: this.memberInfo.email, + memberPhone: this.memberInfo.phone, + itemId: this.productInfo.id, + itemAmount: this.productInfo.amount, + isSubscription: this.contractInfo.isSubscription, + contractCycle: this.contractInfo.contractCycle, + accountBank: this.paymentInfo.accountBank, + accountOwner: this.paymentInfo.accountOwner, + accountNumber: this.paymentInfo.accountNumber + }; + + formData.append('data', new Blob([JSON.stringify(requestData)], {type: 'application/json'})); + + if (this.signImage) { + + const signBlob = await fetch(this.signImage).then(r => r.blob()); + formData.append('signImage', signBlob, 'signature.png'); + } + + try { + const response = await fileAxios.post(`/easy-consent/non-member?clientId=${this.clientId}`, formData); + + if (response.code === 200) { + console.log('Easy consent submitted successfully:', response.message); + return response; + } else { + throw new Error(response.message || 'Easy consent submission failed'); + } + } catch (error) { + console.error('Easy consent submission failed:', error); + throw error; + } + } + }, + + persist: { + enabled: true, + strategies: [ + { + key: 'contract', + storage: sessionStorage, + + } + ] + } +}) diff --git a/src/stores/contract/consentDetail.js b/src/stores/contract/consentDetail.js new file mode 100644 index 0000000..874bf9c --- /dev/null +++ b/src/stores/contract/consentDetail.js @@ -0,0 +1,26 @@ +import { defineStore } from 'pinia' + +export const useConsentDetailStore = defineStore('consentDetail', { + state() { + return { + isExist: false, + data: { + memberId: null, + owner: null, + bank: null, + number: null, + signUrl: null, + createdAt: null, + updatedAt: null + } + } + }, + actions: { + setIsExist(value) { + this.isExist = value; + }, + setData(data) { + this.data = data; + }, + } +}) \ No newline at end of file diff --git a/src/stores/contract/contractBulk.js b/src/stores/contract/contractBulk.js new file mode 100644 index 0000000..88c5178 --- /dev/null +++ b/src/stores/contract/contractBulk.js @@ -0,0 +1,24 @@ +import { defineStore } from 'pinia' + +export const useContractBulkStore = defineStore('contractBulk', { + state() { + return { + exampleImg: 'example_contract.png', + download: '계약등록.xlsx', + file: null, + uploadData: null, + errorList: [], + } + }, + actions: { + setFile(file) { + this.file = file; + }, + setUploadData(uploadData) { + this.uploadData = uploadData; + }, + setErrorList(errorList) { + this.errorList = errorList; + } + } +}) diff --git a/src/stores/contract/contractCreate.js b/src/stores/contract/contractCreate.js new file mode 100644 index 0000000..802b415 --- /dev/null +++ b/src/stores/contract/contractCreate.js @@ -0,0 +1,118 @@ +import { defineStore } from 'pinia' + +export const useContractCreateStore = defineStore('contractCreate', { + state() { + return { + dataPassed: false, + step: 0, + member: { + id: '', + name: '', + email: '', + phone: '' + }, + item: { + id: '', + name: '', + price: 0, + count: 0 + }, + contractCycle: 1, + paymentDueCycle: 0, + isSubscriptionIdx: 0, + isSubscription: [ + { name: '정기', value: true }, + { name: '단기', value: false }, + ], + invoiceTypeIdx: 0, + invoiceType: [ + { name: '자동 청구', value: 1 }, + { name: '수동 청구', value: 2 }, + ], + paymentTypeIdx: 0, + paymentType: [ + { name: '납부자 결제', value: 1 }, + { name: '실시간 CMS', value: 2 }, + ], + isEasyConsentIdx: 0, + isEasyConsent: [ + { name: '미사용', value: false }, + { name: '사용', value: true }, + ] + } + }, + actions: { + setDataPassed(value) { + this.dataPassed = value + }, + setStep(value) { + this.step = value + }, + setMember(info) { + this.member.id = info.id + this.member.name = info.name + this.member.email = info.email + this.member.phone = info.phone + }, + setItem(info) { + this.item.id = info.id + this.item.name = info.name + this.item.price = info.price + this.item.count = info.amount? info.amount : 1 + }, + setContractCycle(info) { + this.contractCycle = info + }, + setPaymentDueCycle(info) { + this.paymentDueCycle = info + }, + setIsSubscription(idx) { + this.isSubscriptionIdx = idx + }, + setInvoiceType(idx) { + this.invoiceTypeIdx = idx + }, + setPaymentType(idx) { + this.paymentTypeIdx = idx; + }, + setIsEasyConsent(idx) { + this.isEasyConsentIdx = idx + }, + setAllDataFromDetailStore(data) { + this.setMember(data.member); + this.setItem(data.item); + this.setContractCycle(data.contractCycle); + this.setPaymentDueCycle(data.paymentDueCycle); + this.setIsSubscription(this.isSubscription.findIndex(i => i.value === data.subscription)); + this.setInvoiceType(this.invoiceType.findIndex(i => i.value === data.invoiceType.id)); + this.setPaymentType(this.paymentType.findIndex(i => i.value === data.paymentType.id)); + this.setIsEasyConsent(this.isEasyConsent.findIndex(i => i.value === data.easyConsent)); + } + }, + getters: { + isSubscriptionName(state) { + return state.isSubscription[state.isSubscriptionIdx].name; + }, + invoiceTypeName(state) { + return state.invoiceType[state.invoiceTypeIdx].name; + }, + paymentTypeName(state) { + return state.paymentType[state.paymentTypeIdx].name; + }, + isEasyConsentName(state) { + return state.isEasyConsent[state.isEasyConsentIdx].name; + }, + isSubscriptionValue(state) { + return state.isSubscription[state.isSubscriptionIdx].value; + }, + invoiceTypeValue(state) { + return state.invoiceType[state.invoiceTypeIdx].value; + }, + paymentTypeValue(state) { + return state.paymentType[state.paymentTypeIdx].value; + }, + isEasyConsentValue(state) { + return state.isEasyConsent[state.isEasyConsentIdx].value; + }, + } +}) diff --git a/src/stores/contract/contractDetail.js b/src/stores/contract/contractDetail.js new file mode 100644 index 0000000..c7b0cb7 --- /dev/null +++ b/src/stores/contract/contractDetail.js @@ -0,0 +1,45 @@ +import { defineStore } from 'pinia' + +export const useContractDetailStore = defineStore('contractDetail', { + state() { + return { + data: { + "id": null, + "member": { + "id": null, + "name": null, + "phone": null, + "email": null + }, + "item": { + "id": null, + "name": null, + "price": null, + "amount": null + }, + "chargeAmount": null, + "totalChargeAmount": null, + "totalUnpaidAmount": null, + "invoiceType": { + "id": null, + "name": null + }, + "paymentType": { + "id": null, + "name": null + }, + "contractCycle": null, + "paymentDueCycle": null, + "createdAt": null, + "updatedAt": null, + "subscription": null, + "easyConsent": null + } + } + }, + actions: { + setData(data) { + this.data = data; + }, + } +}) \ No newline at end of file diff --git a/src/stores/contract/contractList.js b/src/stores/contract/contractList.js new file mode 100644 index 0000000..e2bf4d5 --- /dev/null +++ b/src/stores/contract/contractList.js @@ -0,0 +1,66 @@ +import { defineStore } from 'pinia' + +export const useContractListStore = defineStore('contractList', { + state() { + return { + page: 0, + size: 10, + maxPage: 0, + contractList: [], + currentContract: {}, + columns: [ + { data: 'id', name: '계약번호',}, + { data: 'itemName', name: '상품명', }, + { data: 'memberName', name: '회원명', }, + { data: 'chargeAmount', name: '금액',}, + { data: 'contractCycle', name: '약정일',}, + { data: 'isSubscription', name: '구독 여부',}, + { data: 'invoiceType', name: '청구 생성',}, + { data: 'contractStatus', name: '계약 상태',}, + { data: 'paymentType', name: '결제 수단',}, + { data: 'totalUnpaidCount', name: '미납 여부',} + ], + filters: [ + {data: 'itemId', value: null}, + {data: 'memberId', value: null}, + {data: 'itemName', value: null}, + {data: 'memberName', value: null}, + {data: 'isSubscription', value: null}, + {data: 'invoiceTypeId', value: null}, + {data: 'contractStatusId', value: null}, + {data: 'paymentTypeId', value: null}, + ] + } + }, + actions: { + setSize(number) { + this.size = number + }, + setMaxPage(number) { + this.maxPage = number + }, + setPage(number) { + if (number <= this.maxPage && number >= 0) { + this.page = number + } + }, + setContractList(contractList) { + this.contractList = contractList + }, + setColumnSort(columnData, sortValue) { + const column = this.columns.find((col) => col.data === columnData) + if (column) { + column.sort = sortValue + } + }, + setFilter(name, value) { + const filterData = this.filters.find((filter) => filter.data === name) + if (filterData) { + filterData.value = value + } + }, + setCurrentContract(info) { + this.currentContract = info + } + } +}) diff --git a/src/stores/error/errorHandle.js b/src/stores/error/errorHandle.js new file mode 100644 index 0000000..5b436ae --- /dev/null +++ b/src/stores/error/errorHandle.js @@ -0,0 +1,25 @@ +import { defineStore } from 'pinia' + +export const useErrorHandleStore = defineStore('errorHandle', { + state() { + return { + notFound: false, + notAuthorized: false, + serverError: false, + } + }, + actions: { + // 404 에러 상태를 설정하는 액션 + setNotFound(value) { + this.notFound = value; + }, + // 권한 없음 에러 상태를 설정하는 액션 + setNotAuthorized(value) { + this.notAuthorized = value; + }, + // 서버 에러 상태를 설정하는 액션 + setServerError(value) { + this.serverError = value; + }, + }, +}) \ No newline at end of file diff --git a/src/stores/error/loading.js b/src/stores/error/loading.js new file mode 100644 index 0000000..2fb497c --- /dev/null +++ b/src/stores/error/loading.js @@ -0,0 +1,14 @@ +import { defineStore } from 'pinia' + +export const useLoadingStore = defineStore('loading', { + state() { + return { + isLoading: false, + } + }, + actions: { + setIsLoading(value) { + this.isLoading = value; + } + }, +}) \ No newline at end of file diff --git a/src/stores/invoice/invoiceCreate.js b/src/stores/invoice/invoiceCreate.js new file mode 100644 index 0000000..db23331 --- /dev/null +++ b/src/stores/invoice/invoiceCreate.js @@ -0,0 +1,35 @@ +import { toInputDateFromDateTime } from '@/utils/formatter' +import { defineStore } from 'pinia' + +const today = toInputDateFromDateTime(new Date()); + +export const useInvoiceCreateStore = defineStore('invoiceCreate', { + state() { + return { + paymentTypeIdx: 0, + paymentType: [ + { name: '납부자 결제', value: 1 }, + { name: '실시간 CMS', value: 2 }, + ], + data: { + contractId : null, + paymentTypeId: 1, + chargeAmount : 1, + contractDate : today, + dueDate : today + } + } + }, + actions: { + setContract(data) { + this.data.contractId = data.id; + this.data.chargeAmount = data.chargeAmount; + this.data.paymentTypeId = data.paymentType.id; + this.paymentTypeIdx = this.paymentType.findIndex((i) => i.value === data.paymentType.id); + }, + setPaymentTypeIdx(idx) { + this.paymentTypeIdx = idx; + this.data.paymentTypeId = this.paymentType[this.paymentTypeIdx].value; + } + } +}) diff --git a/src/stores/invoice/invoiceDetail.js b/src/stores/invoice/invoiceDetail.js new file mode 100644 index 0000000..11917b2 --- /dev/null +++ b/src/stores/invoice/invoiceDetail.js @@ -0,0 +1,47 @@ +import { defineStore } from 'pinia' + +export const useInvoiceDetailStore = defineStore('invoiceDetail', { + state() { + return { + data: { + contractId: null, + invoiceId: null, + paymentType: { + id: null, + name: null + }, + invoiceType: { + id: null, + name: null + }, + paymentStatus: { + id: null, + name: null + }, + item: { + itemId: null, + name: null, + price: null, + amount: null + }, + member: { + memberId: null, + name: null, + email: null, + phone: null + }, + chargeAmount: null, + isSubscription: null, + contractDate: null, + dueDate: null, + createdAt: null, + updatedAt: null + } + } + }, + actions: { + setData(data) { + this.data = data + } + } +}) diff --git a/src/stores/invoice/invoiceList.js b/src/stores/invoice/invoiceList.js new file mode 100644 index 0000000..d2ddb37 --- /dev/null +++ b/src/stores/invoice/invoiceList.js @@ -0,0 +1,69 @@ +import { defineStore } from 'pinia' + +export const useInvoiceListStore = defineStore('invoiceList', { + state() { + return { + page: 0, + size: 10, + maxPage: 0, + invoiceList: [], + currentInvoice: {}, + columns: [ + { data: 'id', name: '청구번호',}, + { data: 'contractId', name: '계약번호',}, + { data: 'itemName', name: '상품명', notSortable: true}, + { data: 'memberName', name: '회원명', notSortable: true}, + { data: 'chargeAmount', name: '금액',}, + { data: 'contractDate', name: '약정일',}, + { data: 'dueDate', name: '납부 기한',}, + { data: 'createdAt', name: '생성일',}, + { data: 'paymentType', name: '결제 수단',}, + { data: 'paymentStatus', name: '결제 상태',} + ], + filters: [ + {data: 'contractId', value: null}, + {data: 'itemName', value: null}, + {data: 'memberName', value: null}, + {data: 'startContractDate', value: null}, + {data: 'endContractDate', value: null}, + {data: 'startDueDate', value: null}, + {data: 'endDueDate', value: null}, + {data: 'startCreatedAt', value: null}, + {data: 'endCreatedAt', value: null}, + {data: 'paymentTypeId', value: null}, + {data: 'paymentStatusId', value: null}, + ] + } + }, + actions: { + setSize(number) { + this.size = number + }, + setMaxPage(number) { + this.maxPage = number + }, + setPage(number) { + if (number <= this.maxPage && number >= 0) { + this.page = number + } + }, + setInvoiceList(invoiceList) { + this.invoiceList = invoiceList + }, + setColumnSort(columnData, sortValue) { + const column = this.columns.find((col) => col.data === columnData) + if (column) { + column.sort = sortValue + } + }, + setFilter(name, value) { + const filterData = this.filters.find((filter) => filter.data === name) + if (filterData) { + filterData.value = value + } + }, + setCurrentInvoice(info) { + this.currentInvoice = info + } + } +}) diff --git a/src/stores/invoice/payment.js b/src/stores/invoice/payment.js new file mode 100644 index 0000000..2f72536 --- /dev/null +++ b/src/stores/invoice/payment.js @@ -0,0 +1,25 @@ +import { defineStore } from 'pinia' + +export const usePaymentStore = defineStore('payment', { + state() { + return { + paid: false, + data: { + "invoiceId": null, + "payAmount": null, + "paymentMethod": null, + "createAt": null, + "number": null, + "owner": null + } + } + }, + actions: { + setPaid(value) { + this.paid = value + }, + setData(data) { + this.data = data + } + } +}) diff --git a/src/stores/item.js b/src/stores/item.js new file mode 100644 index 0000000..43e021b --- /dev/null +++ b/src/stores/item.js @@ -0,0 +1,51 @@ +import { defineStore } from 'pinia' + +export const useItemStore = defineStore('item', { + state() { + return { + page : 0, + size : 10, + maxPage: 0, + itemList : [], + currentItem: {}, + columns: [ + {data: 'id', name:'상품번호', sort:null}, + {data:'imageUrl', name:'상품 이미지', sort:null}, + {data: 'name', name:'상품명', sort:null}, + {data: 'price', name:'가격', sort:null}, + {data: 'contractCount', name:'계약 건수', sort:null}, + {data: 'createdAt', name:'생성일', sort:null}, + {data: 'updatedAt', name:'수정일', sort:null} + ], + search: {keyword: 'name', value: null} + } + }, + actions: { + setSize(number) { + this.size = number; + }, + setMaxPage(number) { + this.maxPage = number; + }, + setPage(number) { + if (number <= this.maxPage && number >= 0) { + this.page = number; + } + }, + setItemList(itemList) { + this.itemList = itemList; + }, + setColumnSort(columnData, sortValue) { + const column = this.columns.find(col => col.data === columnData); + if (column) { + column.sort = sortValue; + } + }, + setCurrentItem(info) { + this.currentItem = info; + }, + setSearchValue(value) { + this.search.value = value; + } + }, +}) \ No newline at end of file diff --git a/src/stores/member/member.js b/src/stores/member/member.js new file mode 100644 index 0000000..fec865c --- /dev/null +++ b/src/stores/member/member.js @@ -0,0 +1,54 @@ +import { defineStore } from 'pinia' + +export const useMemberStore = defineStore('member', { + state() { + return { + page: 0, + size: 10, + maxPage: 0, + memberList: [], + currentMember: {}, + columns: [ + { data: 'id', name: '회원번호', sort: null }, + { data: 'name', name: '이름', sort: null }, + { data: 'email', name: '이메일', sort: null }, + { data: 'phone', name: '전화번호', sort: null }, + { data: 'contractCount', name: '계약 건수', sort: null }, + { data: 'createdAt', name: '생성일', sort: null }, + { data: 'updatedAt', name: '수정일', sort: null } + ], + search : {keyword: 'name', value: null}, + } + }, + actions: { + setSize(number) { + this.size = number; + }, + setMaxPage(number) { + this.maxPage = number; + }, + setPage(number) { + if (number <= this.maxPage && number >= 0) { + this.page = number; + } + }, + setMemberList(memberList) { + this.memberList = memberList; + }, + setColumnSort(columnData, sortValue) { + const column = this.columns.find((col) => col.data === columnData); + if (column) { + column.sort = sortValue; + } + }, + setCurrentMember(info) { + this.currentMember = info; + }, + setKeyword(keyword) { + this.search.keyword = keyword; + }, + setSearchValue(value) { + this.search.value = value + } + } +}) diff --git a/src/stores/member/memberBulk.js b/src/stores/member/memberBulk.js new file mode 100644 index 0000000..b7b9618 --- /dev/null +++ b/src/stores/member/memberBulk.js @@ -0,0 +1,24 @@ +import { defineStore } from 'pinia' + +export const useMemberBulkStore = defineStore('memberBulk', { + state() { + return { + exampleImg: 'example_member.png', + download: '회원등록.xlsx', + file: null, + uploadData: null, + errorList: [], + } + }, + actions: { + setFile(file) { + this.file = file; + }, + setUploadData(uploadData) { + this.uploadData = uploadData; + }, + setErrorList(errorList) { + this.errorList = errorList; + } + } +}) diff --git a/src/stores/mobilePage.js b/src/stores/mobilePage.js new file mode 100644 index 0000000..483c94d --- /dev/null +++ b/src/stores/mobilePage.js @@ -0,0 +1,14 @@ +import { defineStore } from 'pinia' + +export const useMobileStore = defineStore('mobilePage', { + state() { + return { + pageName : "" + } + }, + actions: { + setPageName(pageName) { + this.pageName = pageName; + } + }, +}) \ No newline at end of file diff --git a/src/stores/payment/accountInfo.js b/src/stores/payment/accountInfo.js new file mode 100644 index 0000000..05c34f7 --- /dev/null +++ b/src/stores/payment/accountInfo.js @@ -0,0 +1,24 @@ +import { defineStore } from 'pinia' + +export const useAccountInfoStore = defineStore('accountInfo', { + state: () => ({ + infoMap: {} + }), + actions: { + setInfo(invoiceId, info) { + this.infoMap[invoiceId] = info + }, + getInfo(invoiceId) { + return this.infoMap[invoiceId] || null + } + }, + persist: { + enabled: true, + strategies: [ + { + storage: sessionStorage, + paths: ['infoMap'] + } + ] + } +}) \ No newline at end of file diff --git a/src/stores/payment/cardInfo.js b/src/stores/payment/cardInfo.js new file mode 100644 index 0000000..eb10b61 --- /dev/null +++ b/src/stores/payment/cardInfo.js @@ -0,0 +1,24 @@ +import { defineStore } from 'pinia' + +export const useCardInfoStore = defineStore('cardInfo', { + state: () => ({ + infoMap: {} + }), + actions: { + setInfo(invoiceId, info) { + this.infoMap[invoiceId] = info + }, + getInfo(invoiceId) { + return this.infoMap[invoiceId] || null + } + }, + persist: { + enabled: true, + strategies: [ + { + storage: sessionStorage, + paths: ['infoMap'] + } + ] + } +}) \ No newline at end of file diff --git a/src/stores/payment/paymentInfo.js b/src/stores/payment/paymentInfo.js new file mode 100644 index 0000000..e2ea21d --- /dev/null +++ b/src/stores/payment/paymentInfo.js @@ -0,0 +1,26 @@ +import { defineStore } from 'pinia' + +export const usePaymentInfoStore = defineStore('paymentInfo', { + state: () => ({ + infoMap: {} + }), + + actions: { + setInfo(invoiceId, info) { + this.infoMap[invoiceId] = info + }, + getInfo(invoiceId) { + return this.infoMap[invoiceId] || null + } + }, + + persist: { + enabled: true, + strategies: [ + { + storage: sessionStorage, + paths: ['infoMap'] + } + ] + } +}) \ No newline at end of file diff --git a/src/stores/payment/paymentResult.js b/src/stores/payment/paymentResult.js new file mode 100644 index 0000000..46d0ec4 --- /dev/null +++ b/src/stores/payment/paymentResult.js @@ -0,0 +1,24 @@ +import { defineStore } from 'pinia'; + +export const usePaymentResultStore = defineStore('paymentResult', { + state: () => ({ + resultMap: {} + }), + actions: { + setResult(invoiceId, result) { + this.resultMap[invoiceId] = result; + }, + getResult(invoiceId) { + return this.resultMap[invoiceId] || null; + } + }, + persist: { + enabled: true, + strategies: [ + { + storage: sessionStorage, + paths: ['resultMap'] + } + ] + } +}); \ No newline at end of file diff --git a/src/stores/setting/settingItem.js b/src/stores/setting/settingItem.js new file mode 100644 index 0000000..0865373 --- /dev/null +++ b/src/stores/setting/settingItem.js @@ -0,0 +1,65 @@ +import { defineStore } from 'pinia' + +export const useSettingItemStore = defineStore('settingItem', { + state() { + return { + page: 0, + size: 10, + maxPage: 0, + itemList: [], + originalItemList: [], + currentItem: {}, + columns: [ + {data: 'id', name:'상품번호', sort:null}, + {data:'imageUrl', name:'상품 이미지', sort:null}, + {data: 'name', name:'상품명', sort:null}, + {data: 'price', name:'가격', sort:null}, + {data: 'contractCount', name:'계약 건수', sort:null}, + {data: 'createdAt', name:'생성일', sort:null}, + {data: 'updatedAt', name:'수정일', sort:null}, + {data: 'isBasic', name:'기본 설정', sort:null} + ], + search: {keyword: 'name', value: null} + } + }, + actions: { + setSize(number) { + this.size = number; + }, + setMaxPage(number) { + this.maxPage = number; + }, + setPage(number) { + if (number <= this.maxPage && number >= 0) { + this.page = number; + } + }, + setItemList(itemList) { + this.itemList = itemList; + }, + setColumnSort(columnData, sortValue) { + const column = this.columns.find(col => col.data === columnData); + if (column) { + column.sort = sortValue; + } + }, + setCurrentItem(info) { + this.currentItem = info; + }, + setSearchValue(value) { + this.search.value = value; + }, + startEditing() { + this.originalItemList = JSON.parse(JSON.stringify(this.itemList)); + }, + cancelEditing() { + this.itemList = JSON.parse(JSON.stringify(this.originalItemList)); + }, + toggleItemBasicStatus(itemId) { + const item = this.itemList.find(item => item.id === itemId); + if (item) { + item.isBasic = !item.isBasic; + } + } + }, +}) \ No newline at end of file diff --git a/src/stores/static/static.js b/src/stores/static/static.js new file mode 100644 index 0000000..ae9b623 --- /dev/null +++ b/src/stores/static/static.js @@ -0,0 +1,97 @@ +import { defineStore } from 'pinia' + +export const useStaticStore = defineStore('static', { + state() { + return { + thisMonthData: { + id: 0, + date: new Date(), + totalInvoiced: 0, + totalCollected: 0, + outstanding: 0, + year: 0, + month: 0, + week: 0, + type: 0 + }, + prevMonthData: { + id: 0, + date: new Date(), + totalInvoiced: 0, + totalCollected: 0, + outstanding: 0, + year: 0, + month: 0, + week: 0, + type: 0 + }, + prevYearData: { + id: 0, + date: new Date(), + totalInvoiced: 0, + totalCollected: 0, + outstanding: 0, + year: 0, + month: 0, + week: 0, + type: 0 + }, + allDataList: [], + monthDataList: [], + weekDataList: [] + } + }, + actions: { + setThisMonthData(data) { + this.thisMonthData = data + }, + setPrevMonthData(data) { + this.prevMonthData = data + }, + setPrevYearData(data) { + this.prevYearData = data + }, + setAllDataList(data) { + this.allDataList = data + }, + setMonthDataList(data) { + this.monthDataList = data + }, + setWeekDataList(data) { + this.weekDataList = data + } + }, + getters: { + collectedPercentage() { + if (this.thisMonthData.totalInvoiced === 0) { + return 0 + } else { + return Math.floor( + (this.thisMonthData.totalCollected / this.thisMonthData.totalInvoiced) * 100 + ) + } + }, + invoicedPercentageIncreasePrevMonth() { + if (this.prevMonthData.totalInvoiced === 0) { + return 0 + } else { + return Math.floor( + ((this.thisMonthData.totalInvoiced - this.prevMonthData.totalInvoiced) / + this.prevMonthData.totalInvoiced) * + 100 + ) + } + }, + invoicedPercentageIncreasePrevYear() { + if (this.prevYearData.totalInvoiced === 0) { + return 0 + } else { + return Math.floor( + ((this.thisMonthData.totalInvoiced - this.prevYearData.totalInvoiced) / + this.prevYearData.totalInvoiced) * + 100 + ) + } + } + } +}) diff --git a/src/utils/axios.js b/src/utils/axios.js index 7374bae..9fed603 100644 --- a/src/utils/axios.js +++ b/src/utils/axios.js @@ -1,4 +1,5 @@ import { useAuthStore } from '@/stores/auth'; +import { useErrorHandleStore } from '@/stores/error/errorHandle'; import axios from 'axios'; // 인증, 인가 관련 API @@ -29,6 +30,46 @@ const mainAxios = axios.create({ }) mainAxios.interceptors.response.use( + (response) => { + return response.data; + }, + async (error) => { + if (error.code === 'ERR_NETWORK' ) { + const errorHandleStore = useErrorHandleStore(); + errorHandleStore.setServerError(true); + // 잘못된 토큰 + } else if (error.response.data.code === 401) { + const authStore = useAuthStore(); + authStore.logout(); + // 만료된 엑세스 토큰 + } else if (error.response.data.code === 419) { + await mainAxios.post('auth/reissue') + return await mainAxios(error.config); + // 존재하지 않는 데이터 + } else if (error.response.data.code === 404) { + const errorHandleStore = useErrorHandleStore(); + errorHandleStore.setNotFound(true); + // 권한이 없는 접근 + } else if (error.response.data.code === 403) { + const errorHandleStore = useErrorHandleStore(); + errorHandleStore.setNotAuthorized(true); + } else { + // 그 외의 예외 + return error.response.data; + } + } +); + +// 파일 API +const fileAxios = axios.create({ + baseURL: `${import.meta.env.VITE_API_URL}`, + headers: { + 'Content-Type': 'multipart/form-data', + }, + withCredentials: true +}) + +fileAxios.interceptors.response.use( (response) => { return response.data; }, @@ -48,4 +89,23 @@ mainAxios.interceptors.response.use( } ); -export { authAxios, mainAxios } \ No newline at end of file + +// 회원 관련 axios +const memberAxios = axios.create({ + baseURL: `${import.meta.env.VITE_API_URL}`, + headers: { + 'Content-Type': 'application/json', + }, + withCredentials: true +}); + +authAxios.interceptors.response.use( + (response) => { + return response; + }, + (error) => { + return error.response; + } +); + +export { authAxios, mainAxios, fileAxios, memberAxios } \ No newline at end of file diff --git a/src/utils/consent.js b/src/utils/consent.js new file mode 100644 index 0000000..36cfc8e --- /dev/null +++ b/src/utils/consent.js @@ -0,0 +1,61 @@ +import { useConsentDetailStore } from "@/stores/contract/consentDetail"; +import { fileAxios, mainAxios } from "./axios" + +const consentDetailStore = useConsentDetailStore(); + +// 동의서 조회 +async function getConsent(memberId) { + const result = await mainAxios.get(`consents/${memberId}`); + + if (result.code === 200) { + consentDetailStore.setIsExist(true); + consentDetailStore.setData(result.data); + } + + return result; +} + +// 동의서 등록 +async function createConsent(memberId, data, file) { + const formData = new FormData(); + const jsonData = JSON.stringify(data); + + const jsonBlob = new Blob([jsonData], { type: 'application/json' }); + formData.append('data', jsonBlob, 'item'); + formData.append('signImage', file, 'image'); + const result = await fileAxios.post(`consents/${memberId}`, formData); + + if (result.code === 200) { + consentDetailStore.setIsExist(true); + consentDetailStore.setData(result.data); + } + + return result; +} + +// 동의서 수정 +async function editConsent(memberId, data) { + const result = await mainAxios.put(`consents/${memberId}`, data); + + if (result.code === 200) { + consentDetailStore.setData(result.data); + } + + return result; +} + +// 동의 서명 이미지 수정 +async function editConsentImage(memberId, file) { + const formData = new FormData(); + formData.append('signImage', file, 'image'); + + const result = await fileAxios.put(`consents/${memberId}/image`, formData); + + if (result.code === 200) { + consentDetailStore.setData(result.data); + } + + return result; +} + +export { getConsent, createConsent, editConsent, editConsentImage } \ No newline at end of file diff --git a/src/utils/contract.js b/src/utils/contract.js new file mode 100644 index 0000000..863a63d --- /dev/null +++ b/src/utils/contract.js @@ -0,0 +1,122 @@ +import { useContractListStore } from "@/stores/contract/contractList"; +import { fileAxios, mainAxios } from "./axios"; +import { useContractCreateStore } from "@/stores/contract/contractCreate"; +import { useContractDetailStore } from "@/stores/contract/contractDetail"; +import { useContractBulkStore } from "@/stores/contract/contractBulk"; +import { useLoadingStore } from "@/stores/error/loading"; + +const contractListStore = useContractListStore(); +const contractDetailStore = useContractDetailStore(); +const constractCreateStore = useContractCreateStore(); +const contractBulkStore = useContractBulkStore(); +const loadingStore = useLoadingStore(); + +// 계약 목록 조회 +async function getContractList() { + let url = `contracts?page=${contractListStore.page}&size=${contractListStore.size}`; + + contractListStore.columns.forEach(column => { + if (column.sort != null) url += `&sort=${column.data},${column.sort}` + }); + + contractListStore.filters.forEach(filter => { + if (filter.value != null) url += `&${filter.data}=${filter.value}` + }); + + const result = await mainAxios.get(url); + + if (result.code === 200) { + contractListStore.setMaxPage(result.data.totalPages - 1); + contractListStore.setContractList(result.data.content); + } + + return result; +} + +// 계약 상세 조회 +async function getContract(contractId) { + const result = await mainAxios.get(`contracts/${contractId}`); + + if (result.code === 200) { + contractDetailStore.setData(result.data); + } + + return result; +} + +// 계약 생성 +async function createContract() { + loadingStore.setIsLoading(true); + + const data = { + "memberId": constractCreateStore.member.id, + "itemId": constractCreateStore.item.id, + "itemPrice": constractCreateStore.item.price, + "itemAmount": constractCreateStore.item.count, + "isSubscription": constractCreateStore.isSubscriptionValue, + "invoiceTypeId": constractCreateStore.invoiceTypeValue, + "paymentTypeId": constractCreateStore.paymentTypeValue, + "isEasyConsent": constractCreateStore.isEasyConsentValue, + "contractCycle": constractCreateStore.contractCycle, + "paymentDueCycle": constractCreateStore.paymentDueCycle + } + + const result = await mainAxios.post('contracts', data); + + loadingStore.setIsLoading(false); + + return result; +} + +// 계약 대량 등록 +async function createContractBulk(file) { + loadingStore.setIsLoading(true); + + const formData = new FormData(); + formData.append('file', file, 'file'); + + const result = await fileAxios.post('contracts/bulk-register', formData); + + if (result.code !== 200) { + if (result.data) { + contractBulkStore.errorList = [...result.data]; + } else { + contractBulkStore.errorList = [result.message]; + } + } + + loadingStore.setIsLoading(false); + + return result; +} + +// 계약 수정 +async function editContract(contractId) { + loadingStore.setIsLoading(true); + + const data = { + "itemPrice": constractCreateStore.item.price, + "itemAmount": constractCreateStore.item.count, + "isSubscription": constractCreateStore.isSubscriptionValue, + "invoiceTypeId": constractCreateStore.invoiceTypeValue, + "paymentTypeId": constractCreateStore.paymentTypeValue, + "isEasyConsent": constractCreateStore.isEasyConsentValue, + "contractCycle": constractCreateStore.contractCycle, + "paymentDueCycle": constractCreateStore.paymentDueCycle + } + + const result = await mainAxios.put(`contracts/${contractId}`, data); + + loadingStore.setIsLoading(false); + + return result; +} + +// 계약 삭제 +async function deleteContract(contractId) { + const result = await mainAxios.delete(`contracts/${contractId}`); + + return result; +} + +export {getContractList, getContract, createContract, createContractBulk, editContract, deleteContract} \ No newline at end of file diff --git a/src/utils/file.js b/src/utils/file.js new file mode 100644 index 0000000..e69de29 diff --git a/src/utils/formatter.js b/src/utils/formatter.js new file mode 100644 index 0000000..f999d95 --- /dev/null +++ b/src/utils/formatter.js @@ -0,0 +1,26 @@ +// 2024.07.12 형식의 문자열로 날짜 데이터 변환 +function toDateFromDateTime(dateTime) { + const date = new Date(dateTime); + const year = date.getFullYear(); + const month = date.getMonth() + 1; + const day = date.getDate(); + + return `${year}.${month < 10? "0" + month : month}.${day < 10? "0"+ day : day}` +} + +// 2024-07-12 형식의 문자열로 날짜 데이터 변환 +function toInputDateFromDateTime(dateTime) { + const date = new Date(dateTime); + const year = date.getFullYear(); + const month = date.getMonth() + 1; + const day = date.getDate(); + + return `${year}-${month < 10? "0" + month : month}-${day < 10? "0"+ day : day}` +} + +// 숫자 통화 표시 +function formatNumber(amount) { + return new Intl.NumberFormat('ko-KR').format(amount); +} + +export {toDateFromDateTime, toInputDateFromDateTime, formatNumber} \ No newline at end of file diff --git a/src/utils/invoice.js b/src/utils/invoice.js new file mode 100644 index 0000000..c573358 --- /dev/null +++ b/src/utils/invoice.js @@ -0,0 +1,86 @@ +import { useInvoiceListStore } from "@/stores/invoice/invoiceList"; +import { mainAxios } from "./axios"; +import { useInvoiceDetailStore } from "@/stores/invoice/invoiceDetail"; +import { useInvoiceCreateStore } from "@/stores/invoice/invoiceCreate"; +import { useLoadingStore } from "@/stores/error/loading"; + +const invoiceListStore = useInvoiceListStore(); +const invoiceDetailStore = useInvoiceDetailStore(); +const invoiceCreateStore = useInvoiceCreateStore(); +const loadingStore = useLoadingStore(); + + +// 청구서 전송 +async function sendInvoice(invoiceId) { + loadingStore.setIsLoading(true); + const result = await mainAxios.get(`invoices/${invoiceId}/send`); + + loadingStore.setIsLoading(false); + + return result; +} + +// 청구 목록 조회 +async function getInvoiceList() { + let url = `invoices?page=${invoiceListStore.page}&size=${invoiceListStore.size}`; + + invoiceListStore.columns.forEach(column => { + if (column.sort != null) url += `&sort=${column.data},${column.sort}` + }); + + invoiceListStore.filters.forEach(filter => { + if (filter.value != null) url += `&${filter.data}=${filter.value}` + }); + + const result = await mainAxios.get(url); + + if (result.code === 200) { + invoiceListStore.setMaxPage(result.data.totalPages - 1); + invoiceListStore.setInvoiceList(result.data.content); + } + + return result; +} + +// 청구 상세 조회 +async function getInvoice(invoiceId) { + const result = await mainAxios.get(`invoices/${invoiceId}`); + + if (result.code === 200) { + invoiceDetailStore.setData(result.data); + } + + return result; +} + +// 청구 생성 +async function createInvoice() { + console.log(invoiceCreateStore.data) + const result = await mainAxios.post(`invoices`, invoiceCreateStore.data); + + return result; +} + +// 청구 수정 +async function editInvoice(invoiceId, data) { + const result = await mainAxios.put(`invoices/${invoiceId}`, data); + + if (result.code === 200) { + invoiceDetailStore.setData(result.data); + } + + return result; +} + +// 청구 삭제 +async function deleteInvoice(invoiceId) { + const result = await mainAxios.delete(`invoices/${invoiceId}`); + + if (result.code === 200) { + invoiceDetailStore.$reset(); + } + + return result; +} + +export {sendInvoice, getInvoiceList, getInvoice, createInvoice, editInvoice, deleteInvoice} \ No newline at end of file diff --git a/src/utils/item.js b/src/utils/item.js new file mode 100644 index 0000000..98584cd --- /dev/null +++ b/src/utils/item.js @@ -0,0 +1,92 @@ +import { useItemStore } from "@/stores/item"; +import { fileAxios, mainAxios } from "./axios"; + +const itemStore = useItemStore(); + + + +// 아이템 목록 조회 +async function getItemList() { + + let url = `items?page=${itemStore.page}&size=${itemStore.size}`; + if (itemStore.search.value) { + url += `&${itemStore.search.keyword}=${itemStore.search.valu}` + } + + itemStore.columns.forEach(column => { + if (column.sort != null) url += `&sort=${column.data},${column.sort}` + }); + + const result = await mainAxios.get(url); + itemStore.setMaxPage(result.data.totalPages - 1); + itemStore.setItemList(result.data.content); + + return {'code': result.code, 'message' : result.message} +} + +// 아이템 상세 조회 +async function getItem(itemId) { + let url = `items/${itemId}`; + const result = await mainAxios.get(url); + + if (result.code === 200) { + itemStore.setCurrentItem(result.data); + } + + return {'code': result.code, 'message' : result.message}; +} + +// 아이템 생성 +async function createItem(infos, imgFile) { + + const formData = new FormData(); + const jsonData = JSON.stringify(infos); + + const jsonBlob = new Blob([jsonData], { type: 'application/json' }); + formData.append('data', jsonBlob, 'item'); + if (imgFile !== null) { + formData.append('image', imgFile, 'image'); + } + + const result = await fileAxios.post('items', formData); + + return result; +} + +// 아이템 수정 +async function editItem(itemId, infos) { + const result = await mainAxios.put(`items/${itemId}`, infos); + + if (result.code === 200) { + itemStore.setCurrentItem(result.data); + } + + return {'code': result.code, 'message' : result.message}; +} + +// 아이템 이미지 수정 +async function editItemImage(itemId, imgFile) { + const formData = new FormData(); + formData.append('image', imgFile, 'image'); + + const result = await fileAxios.put(`items/${itemId}/image`, formData); + + if (result.code === 200) { + itemStore.setCurrentItem(result.data); + } + + return {'code': result.code, 'message' : result.message}; +} + +// 아이템 삭제 +async function deleteItem(itemId) { + const result = await fileAxios.delete(`items/${itemId}`); + + if (result.code === 200) { + itemStore.setCurrentItem({}); + } + + return {'code': result.code, 'message' : result.message}; +} + +export { getItemList, getItem, createItem, editItem, editItemImage, deleteItem } \ No newline at end of file diff --git a/src/utils/member.js b/src/utils/member.js new file mode 100644 index 0000000..d951f9d --- /dev/null +++ b/src/utils/member.js @@ -0,0 +1,84 @@ +import { useMemberStore } from "@/stores/member/member"; +import { useMemberBulkStore } from "@/stores/member/memberBulk"; +import { fileAxios, mainAxios } from "@/utils/axios"; + +const memberStore = useMemberStore(); +const memberBulkStore = useMemberBulkStore(); + +// 회원 목록 조회 +async function getMemberList() { + let url = `members?page=${memberStore.page}&size=${memberStore.size}`; + if (memberStore.search.value) { + url += `&${memberStore.search.keyword}=${memberStore.search.value}` + } + + memberStore.columns.forEach(column => { + if (column.sort != null) url += `&sort=${column.data},${column.sort}` + }); + + const result = await mainAxios.get(url); + + if (result.code === 200) { + memberStore.setMaxPage(result.data.totalPages - 1); + memberStore.setMemberList(result.data.content); + } + + return result; +} + +// 회원 상세 조회 +async function getMember(memberId) { + const result = await mainAxios.get(`members/${memberId}`); + + if (result.code === 200) { + memberStore.setCurrentMember(result.data); + } + + return result; +} + +// 회원 등록 +async function createMember(infos) { + const result = await mainAxios.post('members', infos); + + return result; +} + +// 회원 대량 등록 +async function createMemberBulk(file) { + const formData = new FormData(); + formData.append('file', file, 'file'); + + const result = await fileAxios.post('members/bulk-register', formData); + + if (result.code !== 200) { + if (result.data) { + memberBulkStore.errorList = [...result.data]; + } else { + memberBulkStore.errorList = [result.message]; + } + } + + return result; +} + + +// 회원 수정 +async function updateMember(memberId, infos) { + const result = await mainAxios.put(`members/${memberId}`, infos); + + if (result.code === 200) { + memberStore.setCurrentMember(result.data); + } + + return result; +} + +// 회원 삭제 +async function deleteMember(memberId) { + const result = await mainAxios.delete(`members/${memberId}`); + + return result; +} + +export { getMemberList, getMember, createMember, createMemberBulk, updateMember, deleteMember } \ No newline at end of file diff --git a/src/utils/payement.js b/src/utils/payement.js new file mode 100644 index 0000000..a08d20f --- /dev/null +++ b/src/utils/payement.js @@ -0,0 +1,27 @@ +import { usePaymentStore } from "@/stores/invoice/payment"; +import { mainAxios } from "./axios"; + +const paymentStore = usePaymentStore(); + +// 납부 조회 +async function getPayment(invoiceId) { + const result = await mainAxios.get(`payments/${invoiceId}`); + + if (result.code === 200) { + paymentStore.setPaid(true); + paymentStore.setData(result.data); + } else if (result.code === 400) { + paymentStore.setPaid(false); + } + + return result; +} + +// 납부 취소 +async function deletePayment(invoiceId) { + const result = await mainAxios.delete(`payments/${invoiceId}`); + + return result; +} + +export {getPayment, deletePayment} \ No newline at end of file diff --git a/src/utils/setting.js b/src/utils/setting.js new file mode 100644 index 0000000..84edd5f --- /dev/null +++ b/src/utils/setting.js @@ -0,0 +1,33 @@ +import { useSettingItemStore } from "@/stores/setting/settingItem"; +import { mainAxios } from "./axios"; + +const settingItemStore = useSettingItemStore(); + +// 설정 아이템 목록 조회 +async function getSettingItemList() { + let url = `items?page=${settingItemStore.page}&size=${settingItemStore.size}`; + if (settingItemStore.search.value) { + url += `&${settingItemStore.search.keyword}=${settingItemStore.search.value}` + } + + settingItemStore.columns.forEach(column => { + if (column.sort != null) url += `&sort=${column.data},${column.sort}` + }); + + const result = await mainAxios.get(url); + settingItemStore.setMaxPage(result.data.totalPages - 1); + settingItemStore.setItemList(result.data.content); + + return {'code': result.code, 'message' : result.message} +} + +// 간편동의 상품설정 +async function setEasyConsentItems(itemIdList) { + const result = await mainAxios.put('/setting/easy-consent/items', { + itemIdList: itemIdList + }); + + return {'code': result.code, 'message': result.message} +} + +export { getSettingItemList, setEasyConsentItems } \ No newline at end of file diff --git a/src/utils/static.js b/src/utils/static.js new file mode 100644 index 0000000..6a88772 --- /dev/null +++ b/src/utils/static.js @@ -0,0 +1,42 @@ +import { useStaticStore } from "@/stores/static/static"; +import { mainAxios } from "./axios" + +const staticStore = useStaticStore(); + +async function getAllStatic() { + const result = await mainAxios('stats/1'); + + if (result.code === 200) { + staticStore.setAllDataList(result.data); + } + + return result; +} + +async function getYearStatic(year) { + const result = await mainAxios(`stats/2?year=${year}`); + + if (result.code === 200) { + staticStore.setMonthDataList(result.data); + } + + return result; +} + +async function getMonthStatic(year, month) { + const result = await mainAxios(`stats/1?year=${year}&month=${month}`); + + if (result.code === 200) { + staticStore.setWeekDataList(result.data); + } + + return result; +} + +async function getThisMonthStatic(year, month) { + const result = await mainAxios(`stats/2?year=${year}&month=${month}`); + + return result; +} + +export { getAllStatic, getYearStatic, getMonthStatic, getThisMonthStatic } \ No newline at end of file diff --git a/src/views/MainView.vue b/src/views/MainView.vue index eef3505..e9ee385 100644 --- a/src/views/MainView.vue +++ b/src/views/MainView.vue @@ -1,33 +1,75 @@ \ No newline at end of file diff --git a/src/views/MobileView.vue b/src/views/MobileView.vue new file mode 100644 index 0000000..dd8d6d0 --- /dev/null +++ b/src/views/MobileView.vue @@ -0,0 +1,67 @@ + + + + + \ No newline at end of file diff --git a/src/views/auth/LoginView.vue b/src/views/auth/LoginView.vue index a9d3967..e1af83c 100644 --- a/src/views/auth/LoginView.vue +++ b/src/views/auth/LoginView.vue @@ -51,7 +51,7 @@ export default { if (result.code == 200) { this.authStore.login(); - this.$router.push({ name: 'home' }); + this.$router.push({ name: 'home' }) } else { this.invalidMsg = result.message; this.invalidInput = true; @@ -60,7 +60,7 @@ export default { signup() { this.$router.push({ name: 'signup' }) } - } + }, } diff --git a/src/views/auth/SignupView.vue b/src/views/auth/SignupView.vue index 1c99db2..68cd0ae 100644 --- a/src/views/auth/SignupView.vue +++ b/src/views/auth/SignupView.vue @@ -231,7 +231,7 @@ export default { "phone" : this.phone.value } const result = await authAxios.post('auth/register', data); - console.log(result); + if (result.code === 200) { // --- 회원가입 성공 모달 출력 --- this.$router.push({name: 'login'}); diff --git a/src/views/consent/member/AccountInfoView.vue b/src/views/consent/member/AccountInfoView.vue new file mode 100644 index 0000000..9ff67f3 --- /dev/null +++ b/src/views/consent/member/AccountInfoView.vue @@ -0,0 +1,243 @@ + + + + + \ No newline at end of file diff --git a/src/views/consent/member/ContractInfoConfirmation.vue b/src/views/consent/member/ContractInfoConfirmation.vue new file mode 100644 index 0000000..c8c0826 --- /dev/null +++ b/src/views/consent/member/ContractInfoConfirmation.vue @@ -0,0 +1,190 @@ + + + + + \ No newline at end of file diff --git a/src/views/consent/member/DrawSignature.vue b/src/views/consent/member/DrawSignature.vue new file mode 100644 index 0000000..c861cfe --- /dev/null +++ b/src/views/consent/member/DrawSignature.vue @@ -0,0 +1,250 @@ + + + + + \ No newline at end of file diff --git a/src/views/consent/member/FinalConfirmation.vue b/src/views/consent/member/FinalConfirmation.vue new file mode 100644 index 0000000..fe0b029 --- /dev/null +++ b/src/views/consent/member/FinalConfirmation.vue @@ -0,0 +1,226 @@ + + + + + \ No newline at end of file diff --git a/src/views/consent/member/PaymentCompletion.vue b/src/views/consent/member/PaymentCompletion.vue new file mode 100644 index 0000000..6c452d2 --- /dev/null +++ b/src/views/consent/member/PaymentCompletion.vue @@ -0,0 +1,152 @@ + + + + + \ No newline at end of file diff --git a/src/views/consent/member/SignatureInput.vue b/src/views/consent/member/SignatureInput.vue new file mode 100644 index 0000000..ffafff7 --- /dev/null +++ b/src/views/consent/member/SignatureInput.vue @@ -0,0 +1,207 @@ + + + + + \ No newline at end of file diff --git a/src/views/consent/member/UploadSignature.vue b/src/views/consent/member/UploadSignature.vue new file mode 100644 index 0000000..95af65a --- /dev/null +++ b/src/views/consent/member/UploadSignature.vue @@ -0,0 +1,231 @@ + + + + + \ No newline at end of file diff --git a/src/views/consent/non-member/AccountInfoView.vue b/src/views/consent/non-member/AccountInfoView.vue new file mode 100644 index 0000000..1b252f9 --- /dev/null +++ b/src/views/consent/non-member/AccountInfoView.vue @@ -0,0 +1,230 @@ + + + + + \ No newline at end of file diff --git a/src/views/consent/non-member/ConsentExplanationView.vue b/src/views/consent/non-member/ConsentExplanationView.vue new file mode 100644 index 0000000..a41a387 --- /dev/null +++ b/src/views/consent/non-member/ConsentExplanationView.vue @@ -0,0 +1,104 @@ + + + + + \ No newline at end of file diff --git a/src/views/consent/non-member/ConsentItemView.vue b/src/views/consent/non-member/ConsentItemView.vue new file mode 100644 index 0000000..5557a99 --- /dev/null +++ b/src/views/consent/non-member/ConsentItemView.vue @@ -0,0 +1,330 @@ + + + + + \ No newline at end of file diff --git a/src/views/consent/non-member/ContractInfoConfirmation.vue b/src/views/consent/non-member/ContractInfoConfirmation.vue new file mode 100644 index 0000000..417c035 --- /dev/null +++ b/src/views/consent/non-member/ContractInfoConfirmation.vue @@ -0,0 +1,191 @@ + + + + + \ No newline at end of file diff --git a/src/views/consent/non-member/ContractInfoView.vue b/src/views/consent/non-member/ContractInfoView.vue new file mode 100644 index 0000000..b1071f2 --- /dev/null +++ b/src/views/consent/non-member/ContractInfoView.vue @@ -0,0 +1,101 @@ + + + + + \ No newline at end of file diff --git a/src/views/consent/non-member/DrawSignature.vue b/src/views/consent/non-member/DrawSignature.vue new file mode 100644 index 0000000..89316e8 --- /dev/null +++ b/src/views/consent/non-member/DrawSignature.vue @@ -0,0 +1,186 @@ + + + + + \ No newline at end of file diff --git a/src/views/consent/non-member/FinalConfirmation.vue b/src/views/consent/non-member/FinalConfirmation.vue new file mode 100644 index 0000000..0c0b8cd --- /dev/null +++ b/src/views/consent/non-member/FinalConfirmation.vue @@ -0,0 +1,224 @@ + + + + + \ No newline at end of file diff --git a/src/views/consent/non-member/MemberInfoView.vue b/src/views/consent/non-member/MemberInfoView.vue new file mode 100644 index 0000000..5e33e14 --- /dev/null +++ b/src/views/consent/non-member/MemberInfoView.vue @@ -0,0 +1,197 @@ + + + + + \ No newline at end of file diff --git a/src/views/consent/non-member/PaymentCompletion.vue b/src/views/consent/non-member/PaymentCompletion.vue new file mode 100644 index 0000000..7a216a6 --- /dev/null +++ b/src/views/consent/non-member/PaymentCompletion.vue @@ -0,0 +1,144 @@ + + + + \ No newline at end of file diff --git a/src/views/consent/non-member/SignatureInput.vue b/src/views/consent/non-member/SignatureInput.vue new file mode 100644 index 0000000..093dd72 --- /dev/null +++ b/src/views/consent/non-member/SignatureInput.vue @@ -0,0 +1,183 @@ + + + + + \ No newline at end of file diff --git a/src/views/consent/non-member/UploadSignature.vue b/src/views/consent/non-member/UploadSignature.vue new file mode 100644 index 0000000..0cefb8a --- /dev/null +++ b/src/views/consent/non-member/UploadSignature.vue @@ -0,0 +1,185 @@ + + + + + diff --git a/src/views/contract/ContractBulkCreateView.vue b/src/views/contract/ContractBulkCreateView.vue new file mode 100644 index 0000000..c3baa8b --- /dev/null +++ b/src/views/contract/ContractBulkCreateView.vue @@ -0,0 +1,107 @@ + + + + + \ No newline at end of file diff --git a/src/views/contract/ContractCreateView.vue b/src/views/contract/ContractCreateView.vue new file mode 100644 index 0000000..94a3efb --- /dev/null +++ b/src/views/contract/ContractCreateView.vue @@ -0,0 +1,111 @@ + + + + + \ No newline at end of file diff --git a/src/views/contract/ContractDetailView.vue b/src/views/contract/ContractDetailView.vue new file mode 100644 index 0000000..1859e43 --- /dev/null +++ b/src/views/contract/ContractDetailView.vue @@ -0,0 +1,168 @@ + + + + + \ No newline at end of file diff --git a/src/views/contract/ContractEditView.vue b/src/views/contract/ContractEditView.vue new file mode 100644 index 0000000..2e98a73 --- /dev/null +++ b/src/views/contract/ContractEditView.vue @@ -0,0 +1,96 @@ + + + + + \ No newline at end of file diff --git a/src/views/contract/ContractListView.vue b/src/views/contract/ContractListView.vue index 9fca418..c473671 100644 --- a/src/views/contract/ContractListView.vue +++ b/src/views/contract/ContractListView.vue @@ -1,18 +1,90 @@ diff --git a/src/views/error/AccessDeniedView.vue b/src/views/error/AccessDeniedView.vue new file mode 100644 index 0000000..1e40416 --- /dev/null +++ b/src/views/error/AccessDeniedView.vue @@ -0,0 +1,47 @@ + + + + + \ No newline at end of file diff --git a/src/views/error/NotFoundView.vue b/src/views/error/NotFoundView.vue new file mode 100644 index 0000000..e0573c4 --- /dev/null +++ b/src/views/error/NotFoundView.vue @@ -0,0 +1,47 @@ + + + + + \ No newline at end of file diff --git a/src/views/error/ServerErrorView.vue b/src/views/error/ServerErrorView.vue new file mode 100644 index 0000000..9e7eb2a --- /dev/null +++ b/src/views/error/ServerErrorView.vue @@ -0,0 +1,53 @@ + + + + + \ No newline at end of file diff --git a/src/views/home/HomeView.vue b/src/views/home/HomeView.vue index 5edd52b..43932c6 100644 --- a/src/views/home/HomeView.vue +++ b/src/views/home/HomeView.vue @@ -1,19 +1,118 @@ +} + +.right-container { + @include flex-box(column, space-between, 30px); + height: 100%; + .btn-container { + @include flex-box(column, center, 20px); + flex-grow: 1; + width: 100%; + } +} + diff --git a/src/views/invoice/InvoiceCreateView.vue b/src/views/invoice/InvoiceCreateView.vue new file mode 100644 index 0000000..0548724 --- /dev/null +++ b/src/views/invoice/InvoiceCreateView.vue @@ -0,0 +1,141 @@ + + + + + diff --git a/src/views/invoice/InvoiceDetailView.vue b/src/views/invoice/InvoiceDetailView.vue new file mode 100644 index 0000000..e89461d --- /dev/null +++ b/src/views/invoice/InvoiceDetailView.vue @@ -0,0 +1,126 @@ + + + + + \ No newline at end of file diff --git a/src/views/invoice/InvoiceListView.vue b/src/views/invoice/InvoiceListView.vue index 446e521..27e5f53 100644 --- a/src/views/invoice/InvoiceListView.vue +++ b/src/views/invoice/InvoiceListView.vue @@ -1,18 +1,79 @@ diff --git a/src/views/item/ItemDetailView.vue b/src/views/item/ItemDetailView.vue new file mode 100644 index 0000000..b9d9e23 --- /dev/null +++ b/src/views/item/ItemDetailView.vue @@ -0,0 +1,165 @@ + + + + + \ No newline at end of file diff --git a/src/views/item/ItemListView.vue b/src/views/item/ItemListView.vue index e831040..9ca3808 100644 --- a/src/views/item/ItemListView.vue +++ b/src/views/item/ItemListView.vue @@ -1,18 +1,93 @@ diff --git a/src/views/member/MemberBulkCreateView.vue b/src/views/member/MemberBulkCreateView.vue new file mode 100644 index 0000000..7f6362f --- /dev/null +++ b/src/views/member/MemberBulkCreateView.vue @@ -0,0 +1,106 @@ + + + + + \ No newline at end of file diff --git a/src/views/member/MemberDetailView.vue b/src/views/member/MemberDetailView.vue new file mode 100644 index 0000000..371b401 --- /dev/null +++ b/src/views/member/MemberDetailView.vue @@ -0,0 +1,166 @@ + + + + + \ No newline at end of file diff --git a/src/views/member/MemberListView.vue b/src/views/member/MemberListView.vue index 5dd8c06..e1a645b 100644 --- a/src/views/member/MemberListView.vue +++ b/src/views/member/MemberListView.vue @@ -1,18 +1,95 @@ diff --git a/src/views/payment/PaymentInfoView.vue b/src/views/payment/PaymentInfoView.vue new file mode 100644 index 0000000..766bcc4 --- /dev/null +++ b/src/views/payment/PaymentInfoView.vue @@ -0,0 +1,155 @@ + + + + + \ No newline at end of file diff --git a/src/views/payment/PaymentMethodView.vue b/src/views/payment/PaymentMethodView.vue new file mode 100644 index 0000000..66077a3 --- /dev/null +++ b/src/views/payment/PaymentMethodView.vue @@ -0,0 +1,195 @@ + + + + + \ No newline at end of file diff --git a/src/views/payment/PaymentResultView.vue b/src/views/payment/PaymentResultView.vue new file mode 100644 index 0000000..ae1126f --- /dev/null +++ b/src/views/payment/PaymentResultView.vue @@ -0,0 +1,132 @@ + + + + + \ No newline at end of file diff --git a/src/views/payment/account/AccountPaymentAgreementView.vue b/src/views/payment/account/AccountPaymentAgreementView.vue new file mode 100644 index 0000000..6554c9c --- /dev/null +++ b/src/views/payment/account/AccountPaymentAgreementView.vue @@ -0,0 +1,96 @@ + + + + + \ No newline at end of file diff --git a/src/views/payment/account/AccountPaymentConfirmView.vue b/src/views/payment/account/AccountPaymentConfirmView.vue new file mode 100644 index 0000000..a6093c1 --- /dev/null +++ b/src/views/payment/account/AccountPaymentConfirmView.vue @@ -0,0 +1,198 @@ + + + + + \ No newline at end of file diff --git a/src/views/payment/account/AccountPaymentInputView.vue b/src/views/payment/account/AccountPaymentInputView.vue new file mode 100644 index 0000000..4a4305b --- /dev/null +++ b/src/views/payment/account/AccountPaymentInputView.vue @@ -0,0 +1,279 @@ + + + + + \ No newline at end of file diff --git a/src/views/payment/card/CardPaymentAgreementView.vue b/src/views/payment/card/CardPaymentAgreementView.vue new file mode 100644 index 0000000..88a8a18 --- /dev/null +++ b/src/views/payment/card/CardPaymentAgreementView.vue @@ -0,0 +1,97 @@ + + + + + \ No newline at end of file diff --git a/src/views/payment/card/CardPaymentConfirmView.vue b/src/views/payment/card/CardPaymentConfirmView.vue new file mode 100644 index 0000000..fecbc98 --- /dev/null +++ b/src/views/payment/card/CardPaymentConfirmView.vue @@ -0,0 +1,197 @@ + + + + + \ No newline at end of file diff --git a/src/views/payment/card/CardPaymentInputView.vue b/src/views/payment/card/CardPaymentInputView.vue new file mode 100644 index 0000000..90d2788 --- /dev/null +++ b/src/views/payment/card/CardPaymentInputView.vue @@ -0,0 +1,349 @@ + + + + + \ No newline at end of file diff --git a/src/views/setting/SettingItemView.vue b/src/views/setting/SettingItemView.vue new file mode 100644 index 0000000..abab2f3 --- /dev/null +++ b/src/views/setting/SettingItemView.vue @@ -0,0 +1,172 @@ + + + + + \ No newline at end of file diff --git a/src/views/setting/SettingPaymentView.vue b/src/views/setting/SettingPaymentView.vue new file mode 100644 index 0000000..78bf962 --- /dev/null +++ b/src/views/setting/SettingPaymentView.vue @@ -0,0 +1,86 @@ + + + + + \ No newline at end of file diff --git a/src/views/setting/SettingView.vue b/src/views/setting/SettingView.vue deleted file mode 100644 index df760fc..0000000 --- a/src/views/setting/SettingView.vue +++ /dev/null @@ -1,18 +0,0 @@ - - - - -