diff --git a/.env.dev b/.env.dev
new file mode 100644
index 0000000..759edf0
--- /dev/null
+++ b/.env.dev
@@ -0,0 +1,3 @@
+NODE_ENV = "dev"
+VITE_APP_API_SERVER_URL = "http://localhost:80"
+VITE_ROOT_PATH = ""
\ No newline at end of file
diff --git a/.env.prod b/.env.prod
new file mode 100644
index 0000000..ee3fe6a
--- /dev/null
+++ b/.env.prod
@@ -0,0 +1,3 @@
+NODE_ENV = "prod"
+VITE_APP_API_SERVER_URL = "http://cuuva.com:2480/autoflow-server-mgmt"
+VITE_ROOT_PATH = "/autoflow"
\ No newline at end of file
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 0000000..3af516b
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,30 @@
+module.exports = {
+ root: true,
+ env: {
+ node: true,
+ },
+ extends: [
+ "eslint:recommended",
+ "plugin:@vue/typescript/recommended",
+ "plugin:vue/vue3-recommended",
+ "plugin:prettier/recommended",
+ ],
+ parserOptions: {
+ parser: "@typescript-eslint/parser",
+ },
+ rules: {
+ "vue/multi-word-component-names": "off",
+ "vue/comment-directive": "off",
+ "vue/no-v-html": "off",
+ "no-console": process.env.NODE_ENV === "prod" ? "warn" : "off",
+ "no-debugger": process.env.NODE_ENV === "prod" ? "warn" : "off",
+ "vue/no-deprecated-slot-attribute": "off",
+ "@typescript-eslint/no-explicit-any": "off",
+ "prettier/prettier": [
+ "error",
+ {
+ endOfLine: "auto",
+ },
+ ],
+ },
+};
diff --git a/Dockerfile_queenclient b/Dockerfile_queenclient
new file mode 100644
index 0000000..4fe1aef
--- /dev/null
+++ b/Dockerfile_queenclient
@@ -0,0 +1,9 @@
+FROM nginx:stable-alpine
+
+RUN apk --no-cache add tzdata && cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime
+
+COPY default.conf /etc/nginx/conf.d/default.conf
+
+COPY dist/. /usr/share/nginx/html/autoflow
+EXPOSE 80
+ENTRYPOINT ["nginx", "-g", "daemon off;"]
diff --git a/components.d.ts b/components.d.ts
index 71c2f9e..96bfebc 100644
--- a/components.d.ts
+++ b/components.d.ts
@@ -9,13 +9,30 @@ export {}
declare module 'vue' {
export interface GlobalComponents {
AppFooter: typeof import('./src/components/AppFooter.vue')['default']
+ CompareComponent: typeof import('./src/components/templates/run/executions/CompareComponent.vue')['default']
+ DatasetsBaseDoalog: typeof import('./src/components/atoms/organisms/DatasetsBaseDoalog.vue')['default']
+ DeploymentDialog: typeof import('./src/components/atoms/organisms/DeploymentDialog.vue')['default']
DrawerComponent: typeof import('./src/components/common/DrawerComponent.vue')['default']
+ ExecutionBaseDialog: typeof import('./src/components/atoms/organisms/ExecutionBaseDialog.vue')['default']
+ ExperimentCreateDialog: typeof import('./src/components/atoms/organisms/ExperimentCreateDialog.vue')['default']
HelloWorld: typeof import('./src/components/HelloWorld.vue')['default']
- IconDeleteBtn: typeof import('./src/components/button/IconDeleteBtn.vue')['default']
- IconModifyBtn: typeof import('./src/components/button/IconModifyBtn.vue')['default']
+ IconArrowDown: typeof import('./src/components/atoms/button/IconArrowDown.vue')['default']
+ IconArrowUp: typeof import('./src/components/atoms/button/IconArrowUp.vue')['default']
+ IconDeleteBtn: typeof import('./src/components/atoms/button/IconDeleteBtn.vue')['default']
+ IconDeployment: typeof import('./src/components/atoms/button/IconDeployment.vue')['default']
+ IconDownloadBtn: typeof import('./src/components/atoms/button/IconDownloadBtn.vue')['default']
+ IconInfoBtn: typeof import('./src/components/atoms/button/IconInfoBtn.vue')['default']
+ IconModifyBtn: typeof import('./src/components/atoms/button/IconModifyBtn.vue')['default']
+ IconSettingBtn: typeof import('./src/components/atoms/button/IconSettingBtn.vue')['default']
LayoutComponent: typeof import('./src/components/common/LayoutComponent.vue')['default']
- ListComponent: typeof import('./src/components/workflow/ListComponent.vue')['default']
+ ListComponent: typeof import('./src/components/home/ListComponent.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
+ StapComfigDialog: typeof import('./src/components/atoms/organisms/StapComfigDialog.vue')['default']
+ TrainingScriptBaseDoalog: typeof import('./src/components/atoms/organisms/TrainingScriptBaseDoalog.vue')['default']
+ ViewComponent: typeof import('./src/components/templates/Datasets/ViewComponent.vue')['default']
+ WorkflowDialog: typeof import('./src/components/atoms/organisms/WorkflowDialog.vue')['default']
+ WorkflowsCreateDialog: typeof import('./src/components/atoms/organisms/WorkflowsCreateDialog.vue')['default']
+ WorkflowsUploadDialog: typeof import('./src/components/atoms/organisms/WorkflowsUploadDialog.vue')['default']
}
}
diff --git a/default.conf b/default.conf
new file mode 100644
index 0000000..857bc0f
--- /dev/null
+++ b/default.conf
@@ -0,0 +1,16 @@
+server {
+ listen 80;
+ server_name localhost;
+
+ location / {
+ root /usr/share/nginx/html;
+ index index.html index.htm;
+ try_files $uri $uri/ /autoflow/index.html;
+ }
+
+
+ error_page 500 502 503 504 /50x.html;
+ location = /50x.html {
+ root /usr/share/nginx/html;
+ }
+}
diff --git a/eslint.config.js b/eslint.config.js
index bb02741..1991d3a 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -1,3 +1,9 @@
import vuetify from 'eslint-config-vuetify'
-export default vuetify()
+export default {
+ vuetify(),
+ 'vue/attributes-order': 'off',
+
+
+ }
+}
\ No newline at end of file
diff --git a/index.html b/index.html
index 0a84a1c..fbfd5d0 100644
--- a/index.html
+++ b/index.html
@@ -1,10 +1,10 @@
-
+
-
-
-
- Welcome to Vuetify 3
+
+
+
+ AutoFlow Web Console
diff --git a/jsconfig.json b/jsconfig.json
index dad0634..7f7f8d4 100644
--- a/jsconfig.json
+++ b/jsconfig.json
@@ -6,15 +6,10 @@
"baseUrl": "./",
"moduleResolution": "bundler",
"paths": {
- "@/*": [
- "src/*"
- ]
+ "@/*": ["src/*"]
},
- "lib": [
- "esnext",
- "dom",
- "dom.iterable",
- "scripthost"
- ]
- }
+ "lib": ["esnext", "dom", "dom.iterable", "scripthost"],
+ "types": ["vite/client"]
+ },
+ "include": ["src/**/*", "env.d.ts"]
}
diff --git a/kubernetes/queenclient-deployment.yaml b/kubernetes/queenclient-deployment.yaml
new file mode 100644
index 0000000..af60744
--- /dev/null
+++ b/kubernetes/queenclient-deployment.yaml
@@ -0,0 +1,43 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: autoflow
+ namespace: autoflow
+ labels:
+ app: autoflow
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: autoflow
+ template:
+ metadata:
+ labels:
+ app: autoflow
+ spec:
+ containers:
+ - image: 192.168.10.120:32100/autoflow:2025.07.005
+ name: autoflow
+ ports:
+ - containerPort: 80
+ resources:
+ requests:
+ cpu: 500m
+ memory: 100Mi
+ # limits:
+ # cpu: 1000m
+ # memory: 2Gi
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: autoflow
+ namespace: autoflow
+spec:
+ type: ClusterIP
+ selector:
+ app: autoflow
+ ports:
+ - protocol: TCP
+ port: 80
+ targetPort: 80
diff --git a/kubernetes/queenclient-ingress.yaml b/kubernetes/queenclient-ingress.yaml
new file mode 100644
index 0000000..db39998
--- /dev/null
+++ b/kubernetes/queenclient-ingress.yaml
@@ -0,0 +1,19 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ namespace: autoflow
+ annotations:
+ nginx.ingress.kubernetes.io/proxy-body-size: 1g
+ name: autoflow
+spec:
+ ingressClassName: nginx
+ rules:
+ - http:
+ paths:
+ - path: /autoflow
+ pathType: Prefix
+ backend:
+ service:
+ name: autoflow
+ port:
+ number: 80
diff --git a/package-lock.json b/package-lock.json
index 1de5717..58595a6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,6 +10,9 @@
"dependencies": {
"@fontsource/roboto": "5.2.5",
"@mdi/font": "7.4.47",
+ "axios": "^1.11.0",
+ "monaco-editor": "^0.52.2",
+ "plotly.js-dist-min": "^3.0.1",
"prettier": "^3.5.3",
"vue": "^3.5.13",
"vuetify": "^3.8.1"
@@ -869,12 +872,59 @@
"url": "https://github.com/sponsors/nzakas"
}
},
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.12",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz",
+ "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.10",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz",
+ "integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
+ }
+ },
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
"license": "MIT"
},
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.29",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz",
+ "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
"node_modules/@jsdevtools/ono": {
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz",
@@ -1270,6 +1320,17 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/node": {
+ "version": "24.0.12",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.12.tgz",
+ "integrity": "sha512-LtOrbvDf5ndC9Xi+4QZjVL0woFymF/xSTKZKPgrrl7H7XoeDvnD+E2IclKVDyaK9UM756W/3BXqSU+JEHopA9g==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "undici-types": "~7.8.0"
+ }
+ },
"node_modules/@types/normalize-package-data": {
"version": "2.4.4",
"resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
@@ -2020,7 +2081,7 @@
"version": "8.15.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
@@ -2148,6 +2209,23 @@
"node": ">=16.14.0"
}
},
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
+ "node_modules/axios": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz",
+ "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.4",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -2248,6 +2326,14 @@
"devOptional": true,
"license": "MIT/X11"
},
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
"node_modules/builtin-modules": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.0.0.tgz",
@@ -2261,6 +2347,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -2423,6 +2522,26 @@
"devOptional": true,
"license": "MIT"
},
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
"node_modules/comment-parser": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
@@ -2546,6 +2665,29 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/electron-to-chromium": {
"version": "1.5.169",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.169.tgz",
@@ -2573,6 +2715,51 @@
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/esbuild": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz",
@@ -3511,6 +3698,42 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/follow-redirects": {
+ "version": "1.15.11",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
+ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
+ "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@@ -3525,6 +3748,52 @@
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/get-tsconfig": {
"version": "4.10.1",
"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz",
@@ -3564,6 +3833,18 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/graphemer": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
@@ -3581,6 +3862,45 @@
"node": ">=8"
}
},
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/hookable": {
"version": "5.5.3",
"resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz",
@@ -3989,6 +4309,15 @@
"url": "https://github.com/sponsors/sxzz"
}
},
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -4026,6 +4355,27 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/min-indent": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
@@ -4091,6 +4441,12 @@
"pathe": "^2.0.1"
}
},
+ "node_modules/monaco-editor": {
+ "version": "0.52.2",
+ "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz",
+ "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==",
+ "license": "MIT"
+ },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -4396,6 +4752,12 @@
"pathe": "^2.0.3"
}
},
+ "node_modules/plotly.js-dist-min": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/plotly.js-dist-min/-/plotly.js-dist-min-3.0.1.tgz",
+ "integrity": "sha512-RReOqr6TfoHaTbVAoHR1UbTCOSRDsQ7Hbthd+3XAxOwaKmxCE3oejMhLG7urQSqWC65DAcSKV23kZd8e+7mG7w==",
+ "license": "MIT"
+ },
"node_modules/pluralize": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
@@ -4493,6 +4855,12 @@
"url": "https://github.com/prettier/prettier?sponsor=1"
}
},
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "license": "MIT"
+ },
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -5165,6 +5533,17 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
@@ -5174,6 +5553,18 @@
"node": ">=0.10.0"
}
},
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
"node_modules/spdx-correct": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
@@ -5344,6 +5735,26 @@
"url": "https://opencollective.com/synckit"
}
},
+ "node_modules/terser": {
+ "version": "5.43.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz",
+ "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==",
+ "license": "BSD-2-Clause",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.14.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/tinyexec": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
@@ -5472,6 +5883,14 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/undici-types": {
+ "version": "7.8.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz",
+ "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
"node_modules/unicorn-magic": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz",
diff --git a/package.json b/package.json
index 9f4e062..0242ced 100644
--- a/package.json
+++ b/package.json
@@ -4,14 +4,17 @@
"type": "module",
"version": "0.0.0",
"scripts": {
- "dev": "vite",
- "build": "vite build",
+ "dev": "vite --mode dev",
+ "build": "vite build --mode prod",
"preview": "vite preview",
"lint": "eslint . --fix"
},
"dependencies": {
"@fontsource/roboto": "5.2.5",
"@mdi/font": "7.4.47",
+ "axios": "^1.11.0",
+ "monaco-editor": "^0.52.2",
+ "plotly.js-dist-min": "^3.0.1",
"prettier": "^3.5.3",
"vue": "^3.5.13",
"vuetify": "^3.8.1"
diff --git a/src/App.vue b/src/App.vue
index 64618cd..ecbb947 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -5,5 +5,5 @@
diff --git a/src/components/atoms/button/IconArrowDown.vue b/src/components/atoms/button/IconArrowDown.vue
new file mode 100644
index 0000000..9b766fc
--- /dev/null
+++ b/src/components/atoms/button/IconArrowDown.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/atoms/button/IconArrowUp.vue b/src/components/atoms/button/IconArrowUp.vue
new file mode 100644
index 0000000..70abe44
--- /dev/null
+++ b/src/components/atoms/button/IconArrowUp.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/button/IconDeleteBtn.vue b/src/components/atoms/button/IconDeleteBtn.vue
similarity index 100%
rename from src/components/button/IconDeleteBtn.vue
rename to src/components/atoms/button/IconDeleteBtn.vue
diff --git a/src/components/atoms/button/IconDeployment.vue b/src/components/atoms/button/IconDeployment.vue
new file mode 100644
index 0000000..e9aa00f
--- /dev/null
+++ b/src/components/atoms/button/IconDeployment.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/atoms/button/IconDownloadBtn.vue b/src/components/atoms/button/IconDownloadBtn.vue
new file mode 100644
index 0000000..e4ce50e
--- /dev/null
+++ b/src/components/atoms/button/IconDownloadBtn.vue
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/atoms/button/IconInfoBtn.vue b/src/components/atoms/button/IconInfoBtn.vue
new file mode 100644
index 0000000..49bfe75
--- /dev/null
+++ b/src/components/atoms/button/IconInfoBtn.vue
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/button/IconModifyBtn.vue b/src/components/atoms/button/IconModifyBtn.vue
similarity index 100%
rename from src/components/button/IconModifyBtn.vue
rename to src/components/atoms/button/IconModifyBtn.vue
diff --git a/src/components/atoms/button/IconSettingBtn.vue b/src/components/atoms/button/IconSettingBtn.vue
new file mode 100644
index 0000000..3512465
--- /dev/null
+++ b/src/components/atoms/button/IconSettingBtn.vue
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/atoms/organisms/DatasetsBaseDoalog.vue b/src/components/atoms/organisms/DatasetsBaseDoalog.vue
new file mode 100644
index 0000000..00f752c
--- /dev/null
+++ b/src/components/atoms/organisms/DatasetsBaseDoalog.vue
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+ {{ dialogTitle }}
+
+
+
+
+
+
+
+ Dataset Title
+
+
+
+
+
+ Dataset Version
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Save
+ Close
+
+
+
diff --git a/src/components/atoms/organisms/DeploymentDialog.vue b/src/components/atoms/organisms/DeploymentDialog.vue
new file mode 100644
index 0000000..b932e53
--- /dev/null
+++ b/src/components/atoms/organisms/DeploymentDialog.vue
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+ Deploy Model
+
+
+
+
+ Select Model : ImageClassifier
+
+
+
+
+
+
+
+
+ Select Package
+
+
+
+
+
+
+
+
+
+
+ Package Preview
+
+
+
+
+
+ Linux
+
+
+
+
+
+
+ Windows
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Save
+ Close
+
+
+
diff --git a/src/components/atoms/organisms/ExecutionBaseDialog.vue b/src/components/atoms/organisms/ExecutionBaseDialog.vue
new file mode 100644
index 0000000..4e7adbf
--- /dev/null
+++ b/src/components/atoms/organisms/ExecutionBaseDialog.vue
@@ -0,0 +1,159 @@
+
+
+
+
+ {{ dialogTitle }}
+
+
+
+
+ Workflow Information
+
+
+
+
+ Select Workflow
+
+
+
+
+
+ Execution Type
+
+
+
+
+
+
+
+
+
+ Execution Type
+
+
+
+
+
+
+
+
+
+
+ Description
+
+
+
+
+
+
+
+
+
+
+ Experiment
+
+
+
+
+
+
+
+
+
+ Start
+ Close
+
+
+
diff --git a/src/components/atoms/organisms/ExperimentCreateDialog.vue b/src/components/atoms/organisms/ExperimentCreateDialog.vue
new file mode 100644
index 0000000..53e3c9a
--- /dev/null
+++ b/src/components/atoms/organisms/ExperimentCreateDialog.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+ Create Experiment
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Save
+ Close
+
+
+
diff --git a/src/components/atoms/organisms/StapComfigDialog.vue b/src/components/atoms/organisms/StapComfigDialog.vue
new file mode 100644
index 0000000..0f9e8ef
--- /dev/null
+++ b/src/components/atoms/organisms/StapComfigDialog.vue
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+ Edit Workflow Step Config
+
+
+
+
+
+
+ Select Workflow
+
+
+
+
+
+
+
+
+
+
+ Workflow Step Name
+
+
+
+
+
+
+
+
+ Save
+ Close
+
+
+
diff --git a/src/components/atoms/organisms/TrainingScriptBaseDoalog.vue b/src/components/atoms/organisms/TrainingScriptBaseDoalog.vue
new file mode 100644
index 0000000..842af9a
--- /dev/null
+++ b/src/components/atoms/organisms/TrainingScriptBaseDoalog.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+ {{ dialogTitle }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Save
+ Close
+
+
+
diff --git a/src/components/atoms/organisms/WorkflowDialog.vue b/src/components/atoms/organisms/WorkflowDialog.vue
new file mode 100644
index 0000000..5d58c02
--- /dev/null
+++ b/src/components/atoms/organisms/WorkflowDialog.vue
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+ Edit Workflow
+
+
+ mdi-close
+
+
+
+
+
+
+
+
+ Select Workflow
+
+
+
+
+
+
+
+
+
+
+ Workflow Step Name
+
+
+
+
+
+
+
+
+ Save
+ Close
+
+
+
diff --git a/src/components/atoms/organisms/WorkflowsCreateDialog.vue b/src/components/atoms/organisms/WorkflowsCreateDialog.vue
new file mode 100644
index 0000000..8ecdee5
--- /dev/null
+++ b/src/components/atoms/organisms/WorkflowsCreateDialog.vue
@@ -0,0 +1,207 @@
+
+
+
+
+
+
+ Create Workflow
+
+
+
+
+ Workflow Information
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Workflow Steps
+
+
+
+ mdi-plus
+ Add Step
+
+
+
+ Save
+
+
+ Cancel
+
+
+
+
+
+
+
+ | Order |
+ Step Name |
+ Component Type |
+ Status |
+ Action |
+
+
+
+
+ | {{ step.order }} |
+ {{ step.stepName }} |
+
+
+ |
+ {{ step.status }} |
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+ Save
+ Close
+
+
+
diff --git a/src/components/atoms/organisms/WorkflowsUploadDialog.vue b/src/components/atoms/organisms/WorkflowsUploadDialog.vue
new file mode 100644
index 0000000..9068924
--- /dev/null
+++ b/src/components/atoms/organisms/WorkflowsUploadDialog.vue
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+ Workflow Information
+
+
+
+
+
+ Workflow Information
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Save
+ Close
+
+
+
diff --git a/src/components/common/DrawerComponent.vue b/src/components/common/DrawerComponent.vue
index f2d6904..873f0f3 100644
--- a/src/components/common/DrawerComponent.vue
+++ b/src/components/common/DrawerComponent.vue
@@ -1,5 +1,5 @@
-
@@ -35,9 +63,10 @@ onMounted(() => {
@click="goMain"
>
-
-
Autoflow Web Console
-
+
+
+ Autoflow Web Console
+
@@ -72,6 +101,7 @@ onMounted(() => {
{
-
+
diff --git a/src/components/common/LayoutComponent.vue b/src/components/common/LayoutComponent.vue
index 898508d..709cdc5 100644
--- a/src/components/common/LayoutComponent.vue
+++ b/src/components/common/LayoutComponent.vue
@@ -1,17 +1,39 @@
-
-
-
+
+
+
@@ -88,23 +151,18 @@ watchEffect(() => {
-
+
mdi-cog
-
+
mdi-home
@@ -112,8 +170,10 @@ watchEffect(() => {
-
ADMIN_001
-
No Project Selected
+
{{ username || "GUEST" }}
+
+ {{ projectName || "No Project Selected" }}
+
mdi-arrow-down-drop-circle-outline
@@ -142,10 +202,7 @@ watchEffect(() => {
-
-
+
diff --git a/src/components/home/ListComponent.vue b/src/components/home/ListComponent.vue
new file mode 100644
index 0000000..800484a
--- /dev/null
+++ b/src/components/home/ListComponent.vue
@@ -0,0 +1,312 @@
+
+
+
+
+
+
배터리 상태 예측 모델 프로젝트
+ Refresh
+
+
+
+
+
+
+
+ Workflow Success Rate
+
+
+
+
+
+
+
+
+
+ Recently Registered Workflow
+
+
+
+
+
+
+
+ {{
+ item.title
+ }}
+ {{
+ item.date
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Recent Run
+
+
+
+
+
+
+
+ {{ run.status === "success" ? "mdi-check" : "mdi-close" }}
+
+
+
+
+
+ {{ run.name }}
+
+
+ {{ run.time }}
+
+
+
+
+
+
+
+
+
+
+
+
+ Dataset Update Activity
+
+
+
+
+
+ {{ data.name }}
+
+ {{ data.count }} updates
+
+
+
+
+
+
+
+
+
+
+ Model Deployment
+
+
+ Go to Model Deploy
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+ |
+
+ {{ item.label }}
+ |
+
+
+
+
+ |
+
+ |
+ {{ item.name }} |
+ {{ item.version }} |
+ {{ item.time }} |
+ {{ item.status }} |
+ {{ item.download }} |
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/models/management/Autoflow.ts b/src/components/models/management/Autoflow.ts
new file mode 100644
index 0000000..c6de4c2
--- /dev/null
+++ b/src/components/models/management/Autoflow.ts
@@ -0,0 +1,9 @@
+export interface Workflow {
+ workflowName: string;
+ workflowDescription?: string;
+ uploadYn: "Y" | "N";
+ regUserId: string;
+ regDt: string;
+ modDt: string;
+ projectId: number;
+}
diff --git a/src/components/models/management/User.ts b/src/components/models/management/User.ts
new file mode 100644
index 0000000..5f55c5c
--- /dev/null
+++ b/src/components/models/management/User.ts
@@ -0,0 +1,27 @@
+export interface UserSearch {
+ searchType: string;
+ searchText: string;
+ pageSize: number;
+ pageNum: number;
+}
+
+export interface User {
+ userId: string;
+ userPw: string;
+ userNm: string;
+ userAuth: string;
+ delYn: string;
+ regDate: string;
+ regUserId: string;
+ regUserNm: string;
+ modDate: string;
+ modUserId: string;
+ modUserNm: string;
+ logingDate: string;
+ token: string;
+}
+
+export interface UserProjectMap {
+ userId: string;
+ prjCd: string;
+}
diff --git a/src/components/models/project/Project.ts b/src/components/models/project/Project.ts
new file mode 100644
index 0000000..b03dc92
--- /dev/null
+++ b/src/components/models/project/Project.ts
@@ -0,0 +1,43 @@
+export interface ApiProject {
+ id: number | null;
+ prjCd: string;
+ prjNm: string;
+ prjDesc: string;
+ prjStartDt: string;
+ prjEndDt: string;
+ delYn: string;
+ regDate: string;
+ regUserId: string;
+ regUserNm: string;
+ modDate: string;
+ modUserId: string;
+ modUserNm: string;
+}
+
+export interface UiProject {
+ id: number;
+ title: string;
+ creator: string;
+ date: string;
+ description: string;
+}
+
+export type Permission = "CREATE" | "READ" | "UPDATE" | "DELETE";
+
+export interface ProjectAuthority {
+ projectId: number;
+ userId: number | string;
+ permissions: Permission[];
+}
+
+export interface ProjectSearchParams {
+ page: number;
+ size: number;
+ keyword: string;
+ searchType: string;
+ startDate: string;
+ endDate: string;
+ sortField: string;
+ sortDirection: string;
+ projectId: number;
+}
diff --git a/src/components/models/token/token.ts b/src/components/models/token/token.ts
new file mode 100644
index 0000000..e8d1f74
--- /dev/null
+++ b/src/components/models/token/token.ts
@@ -0,0 +1,4 @@
+export interface Token {
+ accessToken: string;
+ refreshToken: string;
+}
diff --git a/src/components/service/index.ts b/src/components/service/index.ts
new file mode 100644
index 0000000..aed462f
--- /dev/null
+++ b/src/components/service/index.ts
@@ -0,0 +1,130 @@
+import axios from "axios";
+import { commonStore, loadingStore } from "@/stores/commonStore";
+import { storage } from "@/utils/storage";
+import router from "@/router";
+
+const loading = loadingStore();
+
+const API_URL = import.meta.env.VITE_APP_API_SERVER_URL;
+console.log("API URL:", API_URL);
+export const request = {
+ post: (uri: string, param: any): any => {
+ return axios.post(`${API_URL}${uri}`, param);
+ },
+ get: (uri: string, param: any): any => {
+ return axios.get(`${API_URL}${uri}`, { params: param });
+ },
+ delete: (uri: string, param: any): any => {
+ return axios.delete(`${API_URL}${uri}`, param);
+ },
+ put: (uri: string, param: any): any => {
+ return axios.put(`${API_URL}${uri}`, param);
+ },
+ postFile: (uri: string, param: any, attachment: any, progress: any): any => {
+ const formData = new FormData();
+
+ for (const key in attachment) {
+ if (Object.prototype.hasOwnProperty.call(attachment, key)) {
+ const value = attachment[key];
+
+ if (Array.isArray(value)) {
+ for (const file of value) {
+ formData.append(key, file);
+ }
+ } else {
+ formData.append(key, value);
+ }
+ }
+ }
+ formData.append("param", JSON.stringify(param));
+
+ return axios.post(`${API_URL}${uri}`, formData, {
+ headers: {
+ "Content-Type": "multipart/form-data",
+ },
+ onUploadProgress: progress,
+ });
+ },
+ postResponseFile: (
+ uri: string,
+ param: any,
+ responseParam: any,
+ attachment: any,
+ progress: any,
+ ): any => {
+ const formData = new FormData();
+ for (const key in attachment) {
+ if (Object.prototype.hasOwnProperty.call(attachment, key)) {
+ const value = attachment[key];
+ if (Array.isArray(value)) {
+ for (const file of value) {
+ formData.append(key, file);
+ }
+ }
+ }
+ }
+ formData.append("param", JSON.stringify(param));
+ formData.append("responseParam", JSON.stringify(responseParam));
+
+ return axios.post(`${API_URL}${uri}`, formData, {
+ headers: {
+ "Content-Type": "multipart/form-data",
+ },
+ onUploadProgress: progress,
+ });
+ },
+ postNoParam: (uri: string): any => {
+ return axios.post(`${API_URL}${uri}`, null);
+ },
+};
+
+axios.defaults.headers.common["Access-Control-Allow-Origin"] = "*";
+axios.interceptors.request.use(
+ (config) => {
+ loading.setLoading(true);
+
+ const token = storage.getToken();
+ const refresh = storage.getRefreshToken();
+
+ if (token) {
+ config.headers.Authorization = `Bearer ${token}`;
+ }
+ if (token) (config.headers as any)["cuuva-jwt"] = token;
+ if (refresh) (config.headers as any)["cuuva-jwt-refresh"] = refresh;
+
+ return config;
+ },
+ (error) => {
+ loading.setLoading(false);
+
+ console.log("request error", error);
+
+ const store = commonStore();
+ store.setSnackbarMsg({
+ text: "에러가 발생하였습니다.",
+ color: "red",
+ result: 500,
+ });
+
+ return Promise.reject(error);
+ },
+);
+
+axios.interceptors.response.use(
+ (response) => {
+ loading.setLoading(false);
+ return response;
+ },
+ (error) => {
+ loading.setLoading(false);
+
+ const store = commonStore();
+ store.setSnackbarMsg({
+ text: "에러가 발생하였습니다.",
+ color: "red",
+ result: 500,
+ });
+
+ return Promise.reject(error);
+ },
+);
diff --git a/src/components/service/management/AutoflowService.ts b/src/components/service/management/AutoflowService.ts
new file mode 100644
index 0000000..316f065
--- /dev/null
+++ b/src/components/service/management/AutoflowService.ts
@@ -0,0 +1,15 @@
+import { Workflow } from "@/components/models/management/Autoflow";
+import { request } from "@/components/service/index";
+export const AutoflowService = {
+ add: (payload: Workflow) => {
+ return request.post("/api/workflows", payload);
+ },
+ getAll: () => request.get("/api/workflows", {}),
+
+ delete: (id: Number) => {
+ return request.delete(`/api/workflows/${id}`, {});
+ },
+ view: (id: Number) => {
+ return request.get(`/api/workflows/${id}`, {});
+ },
+};
diff --git a/src/components/service/management/userManagerService.ts b/src/components/service/management/userManagerService.ts
new file mode 100644
index 0000000..bdbec82
--- /dev/null
+++ b/src/components/service/management/userManagerService.ts
@@ -0,0 +1,29 @@
+import { request } from "@/components/service/index";
+import { UserSearch, User } from "@/components/models/management/User";
+
+export const UserManagerService = {
+ // 로그인
+ signIn: (payload: User) => {
+ return request.post("/api/auth/signin", payload);
+ },
+ // 회원가입
+ signUp: (payload: User) => {
+ return request.post("/api/auth/signup", payload);
+ },
+ // 로그아웃
+ signOut: () => {
+ return request.post("/api/auth/signout", {});
+ },
+ // 토큰 갱신
+ refreshtoken: () => {
+ return request.post("/api/auth/refreshtoken", {});
+ },
+ // 전체 사용자 조회
+ getAll: () => {
+ return request.get("/api/auth/users", {});
+ },
+ // 사용자 조회
+ getUser: (userId: number) => {
+ return request.get(`/api/auth/users/${userId}`, {});
+ },
+};
diff --git a/src/components/service/project/projectService.ts b/src/components/service/project/projectService.ts
new file mode 100644
index 0000000..735736f
--- /dev/null
+++ b/src/components/service/project/projectService.ts
@@ -0,0 +1,46 @@
+import { request } from "@/components/service/index";
+import {
+ ApiProject,
+ ProjectAuthority,
+ ProjectSearchParams,
+} from "@/components/models/project/Project";
+
+export const ProjectService = {
+ // ID로 프로젝트 조회
+ fetchProjectById: (id: number) => {
+ return request.get(`/api/projects/${id}`, {});
+ },
+ // 프로젝트 수정
+ update: (id: number, payload: ApiProject) => {
+ return request.put(`/api/projects/${id}`, payload);
+ },
+ // 프로젝트 삭제
+ delete: (id: number) => {
+ return request.delete(`/api/projects/${id}`, {});
+ },
+ // 전체 프로젝트 목록 조회
+ search: () => {
+ return request.get("/api/projects", {});
+ },
+ // 프로젝트 생성
+ add: (payload: ApiProject) => {
+ return request.post("/api/projects", payload);
+ },
+ // 검색 및 페이지네이션 프로젝트 목록 조회
+ searchProjects: (params: ProjectSearchParams) =>
+ request.get("/api/projects/search", params),
+
+ // ----------------------------------------------------------------------
+
+ // 프로젝트 권한
+ projectAuthority: (projectId: number, payload: ProjectAuthority) => {
+ return request.post(`/api/projects/${projectId}/users`, payload);
+ },
+
+ deleteProjectAuthority: (projectId: number, userId: number) => {
+ return request.delete(
+ `/api/projects/${projectId}/users/${userId}/permissions`,
+ {},
+ );
+ },
+};
diff --git a/src/components/service/token/tokenService.ts b/src/components/service/token/tokenService.ts
new file mode 100644
index 0000000..66b61e1
--- /dev/null
+++ b/src/components/service/token/tokenService.ts
@@ -0,0 +1,7 @@
+import { request } from "@/components/service/index";
+import { Token } from "@/components/models/token/token";
+
+export const TokenService = {
+ refreshToken: (): Promise<{ data: Token }> =>
+ request.postNoParam("/api/auth/refreshtoken"),
+};
diff --git a/src/components/templates/Datasets/ListComponent.vue b/src/components/templates/Datasets/ListComponent.vue
new file mode 100644
index 0000000..2beb334
--- /dev/null
+++ b/src/components/templates/Datasets/ListComponent.vue
@@ -0,0 +1,519 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ mdi-magnify
+
+
+
+
+
+
+
+
+ 총 {{ data.totalDataLength.toLocaleString() }}개
+
+
+
+
+
+
+
+
+
+ Create Dataset
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+ {{ item.label }}
+ |
+
+
+
+
+ | {{ item.title }} |
+ {{ item.fileName }} |
+ {{ item.filePath }} |
+ {{ item.description }} |
+ {{ item.createdData }} |
+ {{ item.modifiedData }} |
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/templates/Datasets/ViewComponent.vue b/src/components/templates/Datasets/ViewComponent.vue
new file mode 100644
index 0000000..36ee04a
--- /dev/null
+++ b/src/components/templates/Datasets/ViewComponent.vue
@@ -0,0 +1,257 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dataset Title
+
+ {{
+ experimentInfo.datasetTitle
+ }}
+ Version
+ {{ experimentInfo.version }}
+
+
+
+
+ Project Name
+
+ {{
+ experimentInfo.projectName
+ }}
+
+
+
+ Created Date
+
+ {{
+ experimentInfo.createdDate
+ }}
+ Created ID
+ {{ experimentInfo.createdId }}
+
+
+
+ Modified Date
+
+ {{
+ experimentInfo.modifiedDate
+ }}
+ Modified ID
+
+ {{ experimentInfo.modifiedId }}
+
+
+
+
+
+
+ Description
+ {{
+ experimentInfo.description
+ }}
+
+
+
+ File
+ {{ experimentInfo.fileName }}
+
+
+
+ Back to List
+
+
+
+
+
+
+
diff --git a/src/components/templates/Project/ListComponent.vue b/src/components/templates/Project/ListComponent.vue
new file mode 100644
index 0000000..a80b41d
--- /dev/null
+++ b/src/components/templates/Project/ListComponent.vue
@@ -0,0 +1,599 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ mdi-magnify
+
+
+
+
+
+
+
+
+ 총 {{ data.totalDataLength.toLocaleString() }}개
+
+
+
+
+
+
+
+
+
+ Create Project
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+ |
+
+ {{ item.label }}
+ |
+
+
+
+
+
+ |
+
+ |
+
+ {{ item.no }} |
+ {{ item.name }} |
+
+
+
+ {{ item.desc }}
+ |
+
+
+
+
+
+ {{ u }}
+
+
+ -
+ |
+
+ {{ item.registDt }} |
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ data.modalMode === "create" ? "Create Project" : "Modify Project"
+ }}
+
+
+
+
+
+
+
+
+
+
+ Cancel
+
+ {{ data.modalMode === "create" ? "Create" : "Save" }}
+
+
+
+
+
+
+
+
diff --git a/src/components/templates/deployment/ListComponent.vue b/src/components/templates/deployment/ListComponent.vue
new file mode 100644
index 0000000..6e4b911
--- /dev/null
+++ b/src/components/templates/deployment/ListComponent.vue
@@ -0,0 +1,551 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ mdi-magnify
+
+
+
+
+
+
+
+
+ 총 {{ data.totalDataLength.toLocaleString() }}개
+
+
+
+
+
+
+
+
+
+ Refresh
+
+ Deployment
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+ |
+
+ {{ item.label }}
+ |
+
+
+
+
+ |
+
+ |
+ {{ item.no }} |
+ {{ item.modelName }} |
+ {{ item.version }} |
+ {{ item.duration }} |
+
+
+
+ mdi-checkbox-marked-circle
+
+
+ mdi-loading
+
+ mdi-close-circle
+ |
+
+
+ mdi-checkbox-marked-circle
+
+
+ mdi-loading
+
+
+ mdi-close-circle
+
+ -
+ |
+ {{ item.deployedAt }} |
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/templates/deployment/ViewComponent.vue b/src/components/templates/deployment/ViewComponent.vue
new file mode 100644
index 0000000..49bb278
--- /dev/null
+++ b/src/components/templates/deployment/ViewComponent.vue
@@ -0,0 +1,397 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Deploy Model Information
+
+
+
+
+
+ Model Name
+ {{ experimentInfo.modelName }}
+
+
+
+
+
+ Project Name
+ {{
+ experimentInfo.projectName
+ }}
+
+
+
+ Experiment Name
+
+ {{
+ experimentInfo.experimentName
+ }}
+
+
+
+
+ Execution Name
+ {{
+ experimentInfo.executionName
+ }}
+
+
+
+ Deploy Date
+
+ {{ experimentInfo.deployDate }}
+ Created ID
+ {{ experimentInfo.createdId }}
+
+
+
+
+
+ Description
+ {{
+ experimentInfo.description
+ }}
+
+
+
+ Deploy Status
+
+ -
+ Download Status
+
+ -
+
+
+
+
+
+ Deploy OTA Information
+
+
+
+ Package Name
+ {{ otaInfo.packageName }}
+
+
+
+ OS
+ {{ otaInfo.os }}
+
+
+
+ Package File Name
+ {{ otaInfo.packageFileName }}
+
+
+
+ Package File Path
+ {{ otaInfo.packageFilePath }}
+
+
+
+ Software Name
+ {{ otaInfo.softwareName }}
+ Software Version
+ {{ otaInfo.softwareVersion }}
+
+
+
+ Execute
+ {{ otaInfo.execute }}
+
+
+
+ Back to List
+
+
+
+
+
+
+
diff --git a/src/components/templates/run/executions/CompareComponent.vue b/src/components/templates/run/executions/CompareComponent.vue
new file mode 100644
index 0000000..b41ad54
--- /dev/null
+++ b/src/components/templates/run/executions/CompareComponent.vue
@@ -0,0 +1,526 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Details
+ Visualizations
+
+
+
+
+ Run Detail
+
+
+
+
+ Run ID:
+ {{ runA.id }}
+ {{ runB.id }}
+
+ Run Name:
+
+ {{ runA.name }}
+ {{ runB.name }}
+
+ Start Name:
+
+ {{ runA.start }}
+ {{ runB.start }}
+
+ End Name:
+
+ {{ runA.end }}
+ {{ runB.end }}
+
+ Duration:
+
+ {{ runA.duration }}
+ {{ runB.duration }}
+
+
+
+
+ Parameters
+
+
+
+
+ alpha
+ {{ runA.params.alpha }}
+ {{ runB.params.alpha }}
+
+
+ l1_ratio
+
+ {{ runA.params.l1_ratio }}
+ {{ runB.params.l1_ratio }}
+
+
+
+
+ Metrics
+
+
+
+
+ mae
+ {{ runA.metrics.mae }}
+ {{ runA.metrics.mae }}
+
+ r2
+ {{ runA.metrics.r2 }}
+ {{ runA.metrics.r2 }}
+ rmse
+ {{ runA.metrics.rmse }}
+ {{ runA.metrics.rmse }}
+
+
+
+
+
+ Tags
+
+
+
+
+
+ estimator_class
+
+ {{ runA.tags.estimator_class }}
+ {{ runA.tags.estimator_class }}
+
+ estimator_name
+
+ {{ runA.tags.estimator_name }}
+ {{ runA.tags.estimator_name }}
+
+
+
+
+ Artifacts
+
+
+ Back to List
+
+
+
+
+
+
+ Parallel Coordinates Plot
+ Scatter Plot
+ Box Plot
+ Contour Plot
+
+
+
+
+
+
+
+
+
+
+
+ Clear All
+
+
+
+
+
+ Clear All
+
+
+
+
+
+ Clear All
+
+
+
+
+
+
+
+ Clear All
+
+
+
+
+
+
+
+
+
+
+ Back to List
+
+
+
+
+
+
+
+
diff --git a/src/components/templates/run/executions/ListComponent.vue b/src/components/templates/run/executions/ListComponent.vue
new file mode 100644
index 0000000..b011d12
--- /dev/null
+++ b/src/components/templates/run/executions/ListComponent.vue
@@ -0,0 +1,607 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ mdi-magnify
+
+
+
+
+
+
+
+
+ 총 {{ data.totalDataLength.toLocaleString() }}개
+
+
+
+
+
+
+
+
+
+ Terminate
+
+
+ Retry
+
+
+ Clone
+
+
+ Compare
+
+
+ Execution
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+ |
+
+ {{ item.label }}
+ |
+
+
+
+
+ |
+
+ |
+ {{ item.no }} |
+ {{ item.name }} |
+
+ mdi-check-circle
+ mdi-close-circle
+ mdi-loading
+ |
+ {{ item.duration }} |
+ {{ item.experiment }} |
+ {{ item.workflow }} |
+ {{ item.startTime }} |
+ {{ item.registryStatus }} |
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/templates/run/executions/ViewComponent.vue b/src/components/templates/run/executions/ViewComponent.vue
new file mode 100644
index 0000000..4cc68c9
--- /dev/null
+++ b/src/components/templates/run/executions/ViewComponent.vue
@@ -0,0 +1,339 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Deploy Model Information
+
+
+
+
+
+ Executions Name
+
+ {{
+ experimentInfo.executionsName
+ }}
+
+
+
+
+
+ Status
+
+ mdi-check-circle
+ mdi-close-circle
+ mdi-loading
+
+
+
+ Duration
+ {{ experimentInfo.duration }}
+
+
+
+
+ Experiment
+ {{ experimentInfo.experiment }}
+
+
+
+ Workflow
+ {{ experimentInfo.workflow }}
+ Start Time
+ {{ experimentInfo.startTime }}
+
+
+
+
+
+ Registry Status
+ {{
+ experimentInfo.registryStatus
+ }}
+
+
+
+
+ Back to List
+
+
+
+
+
+
+
diff --git a/src/components/templates/run/experiment/ListComponent.vue b/src/components/templates/run/experiment/ListComponent.vue
new file mode 100644
index 0000000..bc15a6f
--- /dev/null
+++ b/src/components/templates/run/experiment/ListComponent.vue
@@ -0,0 +1,489 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ mdi-magnify
+
+
+
+
+
+
+
+
+ 총 {{ data.totalDataLength.toLocaleString() }}개
+
+
+
+
+
+
+
+
+
+ Create Experiment
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+ {{ item.label }}
+ |
+
+
+
+
+
+ | {{ item.name }} |
+ {{ item.description }} |
+ {{ item.createdDate }} |
+ {{ item.createdID }} |
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/templates/run/experiment/ViewComponent.vue b/src/components/templates/run/experiment/ViewComponent.vue
new file mode 100644
index 0000000..bc4ff1b
--- /dev/null
+++ b/src/components/templates/run/experiment/ViewComponent.vue
@@ -0,0 +1,405 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Experiment Information
+
+
+
+
+
+ Experiment Name
+ {{
+ experimentInfo.experimentName
+ }}
+
+
+
+
+
+ Project Name
+ {{
+ experimentInfo.projectName
+ }}
+
+
+
+
+
+ Created Date
+ {{
+ experimentInfo.createdDate
+ }}
+ Created ID
+ {{ experimentInfo.createdId }}
+
+
+
+
+
+ Description
+ {{
+ experimentInfo.description
+ }}
+
+
+
+
+
+
+ Runs
+
+
+
+
+
+
+
+
+
+ |
+ {{ item.label }}
+ |
+
+
+
+
+ | {{ item.name }} |
+ {{ item.status }} |
+ {{ item.Duration }} |
+ {{ item.Pipeline }} |
+ {{ item.registDt }} |
+
+
+
+
+
+
+
+
+
+ Back to List
+
+
+
+
+
+
+
+
diff --git a/src/components/templates/stepconfig/ListComponent.vue b/src/components/templates/stepconfig/ListComponent.vue
new file mode 100644
index 0000000..934c358
--- /dev/null
+++ b/src/components/templates/stepconfig/ListComponent.vue
@@ -0,0 +1,536 @@
+
+
+
+
+
+
+
+
+
+
Workflows Step Config
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ mdi-magnify
+
+
+
+
+
+
+
+
+ 총 {{ data.totalDataLength.toLocaleString() }}개
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+ |
+
+ {{ item.label }}
+ |
+
+
+
+
+ |
+
+ |
+ {{ item.no }} |
+ {{ item.stepName }} |
+ {{ item.type }} |
+ {{ item.dataset }} |
+ {{ item.script }} |
+ {{ item.hyperParameters }} |
+ {{ item.resource }} |
+
+
+ mdi-checkbox-marked-circle
+
+
+ mdi-alert-circle
+
+ |
+ {{ item.workflow }} |
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/templates/stepconfig/ViewComponent.vue b/src/components/templates/stepconfig/ViewComponent.vue
new file mode 100644
index 0000000..325c40d
--- /dev/null
+++ b/src/components/templates/stepconfig/ViewComponent.vue
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Workflow Step Information
+
+
+
+ Workflow Step Name
+ Train Model
+ Workflow Name
+ sentiment-analysis
+
+
+
+ Created Date
+ 2025-02-06
+ Created ID
+ ADMIN_001
+
+
+
+
+
+
+
+ Dataset
+
+
+
+ Dataset Name
+ 야간 주행용 레이더 데이터셋 구성
+ Version
+ v2.0
+
+
+
+
+
+
+
+ Training Script
+
+
+
+ Script File
+ baseline_train.py
+
+
+
+ Script File Path
+
+ /mnt/nfs/model_code/baseline/baseline_train.py
+
+
+
+
+
+
+
+
+ Hyperparameters
+
+
+
+ Batch Size
+ 64
+ Learning Rate
+ 0.001
+
+
+
+ Optimizer
+ Adam
+ Epochs
+ 20
+
+
+
+
+
+
+
+ Resource & Scheduling
+
+
+
+ CPU Cores
+ 4
+ Memory
+ 16Gi
+
+
+
+ GPU
+ 1 (NVIDIA A100)
+
+
+
+
+
+
+
+ Docker image
+
+
+
+ kubeflownotebookswg/jupyter-pytorch-cuda-full:v1.9.2
+
+
+
+ Back to List
+
+
+
+
+
+
+
+
diff --git a/src/components/templates/trainingscript/ListComponent.vue b/src/components/templates/trainingscript/ListComponent.vue
new file mode 100644
index 0000000..5b85386
--- /dev/null
+++ b/src/components/templates/trainingscript/ListComponent.vue
@@ -0,0 +1,519 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ mdi-magnify
+
+
+
+
+
+
+
+
+ 총 {{ data.totalDataLength.toLocaleString() }}개
+
+
+
+
+
+
+
+
+
+ Create Script
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+ {{ item.label }}
+ |
+
+
+
+
+ | {{ item.title }} |
+ {{ item.fileName }} |
+ {{ item.filePath }} |
+ {{ item.description }} |
+ {{ item.createdData }} |
+ {{ item.modifiedData }} |
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/templates/trainingscript/ViewComponent.vue b/src/components/templates/trainingscript/ViewComponent.vue
new file mode 100644
index 0000000..bd008ef
--- /dev/null
+++ b/src/components/templates/trainingscript/ViewComponent.vue
@@ -0,0 +1,291 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Training Script Information
+
+
+
+
+
+ Training Script Title
+
+ {{ experimentInfo.modelName }}
+
+
+
+
+
+ File Name
+ {{
+ experimentInfo.projectName
+ }}
+
+
+
+ File Path
+ {{
+ experimentInfo.experimentName
+ }}
+
+
+
+
+
+ Created Date
+
+ {{ experimentInfo.deployDate }}
+ Modified Date
+
+ {{ experimentInfo.createdId }}
+
+
+
+
+
+ Description
+ {{
+ experimentInfo.description
+ }}
+
+
+
+
+
+ Training Script Preview
+
+
+
+
+ Back to List
+
+
+
+
+
+
+
diff --git a/src/components/templates/workflow/ListComponent.vue b/src/components/templates/workflow/ListComponent.vue
new file mode 100644
index 0000000..0d56b01
--- /dev/null
+++ b/src/components/templates/workflow/ListComponent.vue
@@ -0,0 +1,578 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ mdi-magnify
+
+
+
+
+
+
+
+
+ 총 {{ data.totalDataLength.toLocaleString() }}개
+
+
+
+
+
+
+
+
+
+ Upload Workflow
+
+ Create Workflow
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+ |
+
+ {{ item.label }}
+ |
+
+
+
+
+ |
+
+ |
+ {{ item.no }} |
+ {{ item.name }} |
+ {{ item.stepCount }} |
+ {{ item.configProgress }} |
+ {{ item.kubeflowStatus }} |
+ {{ item.registDt }} |
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/templates/workflow/ViewComponent.vue b/src/components/templates/workflow/ViewComponent.vue
new file mode 100644
index 0000000..901a8e2
--- /dev/null
+++ b/src/components/templates/workflow/ViewComponent.vue
@@ -0,0 +1,262 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Details
+ YAML
+
+
+
+
+
+
+ Workflow Information
+
+
+
+ Workflow Name
+ {{ detail.workflowName }}
+ Version
+ {{ detail.version }}
+
+
+
+ Workflow Description
+ {{ detail.workflowDescription }}
+
+
+
+ Created Date
+ {{ detail.createdDate }}
+ Created ID
+ {{ detail.createdId }}
+
+
+
+
+
+
+
+ Step Overview
+
+
+
+ {{ index + 1 }}
+
+
+ {{ item.status }}
+
+
+
+
+
+ Back to List
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/workflow/ListComponent.vue b/src/components/workflow/ListComponent.vue
deleted file mode 100644
index aa881d8..0000000
--- a/src/components/workflow/ListComponent.vue
+++ /dev/null
@@ -1,532 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- mdi-magnify
-
-
-
-
-
-
-
-
- 총 {{ data.totalDataLength.toLocaleString() }}개
-
-
-
-
-
-
-
-
-
- 선택 삭제
-
- 등록
-
-
-
-
-
-
-
-
-
-
-
-
-
- |
-
- |
-
- {{ item.label }}
- |
-
-
-
-
- |
-
- |
- {{ item.no }} |
- {{ item.name }} |
- {{ item.version }} |
- {{ item.stepCount }} |
- {{ item.configProgress }} |
- {{ item.kubeflowStatus }} |
- {{ item.registDt }} |
-
-
-
- |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/layouts/default.vue b/src/layouts/default.vue
index b91b180..973fc71 100644
--- a/src/layouts/default.vue
+++ b/src/layouts/default.vue
@@ -5,5 +5,5 @@
diff --git a/src/pages/DatasetView.vue b/src/pages/DatasetView.vue
index 52dbf2f..c37d46a 100644
--- a/src/pages/DatasetView.vue
+++ b/src/pages/DatasetView.vue
@@ -1,10 +1,9 @@
+
-
+
diff --git a/src/pages/DeploymentView.vue b/src/pages/DeploymentView.vue
index 52dbf2f..b1f8e29 100644
--- a/src/pages/DeploymentView.vue
+++ b/src/pages/DeploymentView.vue
@@ -1,10 +1,9 @@
+
-
+
diff --git a/src/pages/ExcutionsView.vue b/src/pages/ExcutionsView.vue
deleted file mode 100644
index 52dbf2f..0000000
--- a/src/pages/ExcutionsView.vue
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
diff --git a/src/pages/ExecutionsView.vue b/src/pages/ExecutionsView.vue
new file mode 100644
index 0000000..5dd2d83
--- /dev/null
+++ b/src/pages/ExecutionsView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/src/pages/ExperimentView.vue b/src/pages/ExperimentView.vue
index 52dbf2f..c33a5d3 100644
--- a/src/pages/ExperimentView.vue
+++ b/src/pages/ExperimentView.vue
@@ -1,10 +1,9 @@
+
-
+
diff --git a/src/pages/HomeView.vue b/src/pages/HomeView.vue
index 52dbf2f..352f6c7 100644
--- a/src/pages/HomeView.vue
+++ b/src/pages/HomeView.vue
@@ -1,10 +1,9 @@
-
+
-
+
diff --git a/src/pages/LoginView.vue b/src/pages/LoginView.vue
index 220c8e8..7ace2c8 100644
--- a/src/pages/LoginView.vue
+++ b/src/pages/LoginView.vue
@@ -5,13 +5,15 @@ import { storage } from "@/utils/storage";
import logo from "@/assets/wordmark.png";
import logo2 from "@/assets/workflow.png";
-
+import { UserManagerService } from "@/components/service/management/userManagerService";
+import { TokenService } from "@/components/service/token/tokenService";
+const API_URL = import.meta.env.VITE_APP_API_SERVER_URL;
const router = useRouter();
const data = ref({
form: false,
- userId: "",
- userPw: "",
+ username: "",
+ password: "",
loading: false,
snackbar: false,
snackbarText: "",
@@ -24,25 +26,39 @@ const resetForm = () => {
data.value.loading = false;
};
+const resetLogin = () => {
+ data.value.userId = "";
+ data.value.userPw = "";
+ data.value.loading = false;
+};
+const resetSignup = () => {
+ data.value.username = "";
+ data.value.email = "";
+ data.value.role = [];
+ data.value.password = "";
+ data.value.loading = false;
+};
const signIn = () => {
- // if (!data.value.form) return;
- // data.value.loading = true;
- // setTimeout(() => (data.value.loading = false), 2000);
+ const payload = {
+ username: data.value.username,
+ password: data.value.password,
+ };
- // const params = {
- // userId: data.value.userId,
- // password: data.value.userPw,
- // };
- //
- // UserManagerService.signIn(params).then((d) => {
- // if (d.data.success === true) {
- // storage.setAuth(d.data.data);
- router.push("/workflows");
- // } else {
- // resetForm();
- // data.value.snackbar = true;
- // }
- // });
+ UserManagerService.signIn(payload)
+ // .then((res) => TokenService.refreshToken().then(() => res))
+ .then((res) => {
+ storage.setAuth(res.data);
+ router.push("/select");
+ })
+ .catch((err) => {
+ if (err.response?.status === 401) {
+ data.value.snackbarText = "아이디 또는 비밀번호가 올바르지 않습니다.";
+ } else {
+ data.value.snackbarText = "서버 에러가 발생했습니다.";
+ }
+ data.value.snackbarColor = "red";
+ data.value.snackbar = true;
+ });
};
@@ -54,7 +70,7 @@ const signIn = () => {
@@ -64,7 +80,6 @@ const signIn = () => {
>
mdi-shield-key-outline
-
Autoflow Web Console
@@ -72,7 +87,7 @@ const signIn = () => {
{
>
{
login
+
+
+ 계정이 없으십니까?
+
+ SignUp
+
+
+
{
style="bottom: 0; left: 0"
>
Copyright © 2025 Autoflow Web Console
+ >Copyright © 2025 Autoflow Web Console
{
}
.background-image {
- background-image: linear-gradient(
- 90deg,
- rgba(19, 18, 18, 0.5),
- rgba(19, 18, 18, 0.3),
- rgba(19, 18, 18, 0.3),
- rgba(19, 18, 18, 0.5)
- ),url("@/assets/4117551.jpg"); /* 배경 이미지 경로 */
+ background-image:
+ linear-gradient(
+ 90deg,
+ rgba(19, 18, 18, 0.5),
+ rgba(19, 18, 18, 0.3),
+ rgba(19, 18, 18, 0.3),
+ rgba(19, 18, 18, 0.5)
+ ),
+ url("@/assets/4117551.jpg"); /* 배경 이미지 경로 */
background-size: cover; /* 이미지가 화면을 꽉 채우도록 설정 */
background-position: center; /* 이미지 중앙 정렬 */
background-repeat: no-repeat; /* 이미지 반복 방지 */
diff --git a/src/pages/ProjectView.vue b/src/pages/ProjectView.vue
new file mode 100644
index 0000000..67cc292
--- /dev/null
+++ b/src/pages/ProjectView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/src/pages/SignupView.vue b/src/pages/SignupView.vue
new file mode 100644
index 0000000..7d254f4
--- /dev/null
+++ b/src/pages/SignupView.vue
@@ -0,0 +1,210 @@
+
+
+
+
+
+
+
+
+
+ mdi-shield-key-outline
+
+
+
+ Autoflow Web Console
+
+
+
+
+
+
+
+
+
+ SignUp
+
+
+
+
+ 계정이 있으십니까?
+
+ Login
+
+
+
+
+
+
+ Copyright © 2025 Autoflow Web Console
+
+
+
+
+
+
+
+
+
+
+
+ {{ data.snackbarText }}
+
+ 닫기
+
+
+
+
+
diff --git a/src/pages/TrainingScriptView.vue b/src/pages/TrainingScriptView.vue
index 52dbf2f..6947fee 100644
--- a/src/pages/TrainingScriptView.vue
+++ b/src/pages/TrainingScriptView.vue
@@ -1,10 +1,9 @@
+
-
+
diff --git a/src/pages/WorkflowStepConfigView.vue b/src/pages/WorkflowStepConfigView.vue
index 52dbf2f..d24833a 100644
--- a/src/pages/WorkflowStepConfigView.vue
+++ b/src/pages/WorkflowStepConfigView.vue
@@ -1,10 +1,9 @@
+
-
+
diff --git a/src/pages/WorkflowView.vue b/src/pages/WorkflowView.vue
index bffabe2..7d2441b 100644
--- a/src/pages/WorkflowView.vue
+++ b/src/pages/WorkflowView.vue
@@ -1,11 +1,9 @@
-
+
-
+
diff --git a/src/router/index.js b/src/router/index.js
index f667d2e..83c7f80 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -1,14 +1,13 @@
import { createRouter, createWebHistory } from "vue-router";
import { storage } from "@/utils/storage";
-
const rootPath = import.meta.env.VITE_ROOT_PATH;
const routes = [
{
path: `/`,
- component: () => import('@/layouts/default.vue'),
- redirect: { name: "signin" },
+ component: () => import("@/layouts/default.vue"),
+ redirect: { name: "login" },
children: [
{
name: "main",
@@ -17,7 +16,26 @@ const routes = [
title: "",
requiresAuth: false,
},
- component: () => import('@/pages/MainView.vue'),
+ component: () => import("@/pages/MainView.vue"),
+ },
+ {
+ name: "select",
+ path: `/select`,
+ meta: {
+ title: "select",
+ requiresAuth: false,
+ hideSidebar: true,
+ },
+ component: () => import("@/views/Select.vue"),
+ },
+ {
+ name: "project",
+ path: `/project`,
+ meta: {
+ title: "Project",
+ requiresAuth: false,
+ },
+ component: () => import("@/pages/ProjectView.vue"),
},
{
name: "home",
@@ -28,6 +46,7 @@ const routes = [
},
component: () => import("@/pages/HomeView.vue"),
},
+
{
name: "workflows",
path: `/workflows`,
@@ -48,7 +67,7 @@ const routes = [
},
{
name: "run",
- path: `/run`,
+ path: `/run/experiment`,
meta: {
title: "Run",
requiresAuth: false,
@@ -65,16 +84,17 @@ const routes = [
component: () => import("@/pages/ExperimentView.vue"),
},
{
- name: "Excutions",
- path: `/run/excutions`,
+ name: "Executions",
+ path: `/run/executions`,
meta: {
- title: "Excutions",
+ title: "Executions",
requiresAuth: false,
},
- component: () => import("@/pages/ExcutionsView.vue"),
+ component: () => import("@/pages/ExecutionsView.vue"),
},
],
},
+
{
name: "deployment",
path: `/deployment`,
@@ -105,13 +125,22 @@ const routes = [
],
},
{
- name: "signin",
- path: `/signin`,
+ name: "login",
+ path: `/login`,
+ meta: {
+ title: "로그인",
+ requiresAuth: false,
+ },
+ component: () => import("@/pages/LoginView.vue"),
+ },
+ {
+ name: "signup",
+ path: `/signup`,
meta: {
title: "로그인",
requiresAuth: false,
},
- component: () => import('@/pages/LoginView.vue'),
+ component: () => import("@/pages/SignupView.vue"),
},
];
diff --git a/src/stores/autoflowStore.ts b/src/stores/autoflowStore.ts
new file mode 100644
index 0000000..a3f5eb0
--- /dev/null
+++ b/src/stores/autoflowStore.ts
@@ -0,0 +1,39 @@
+import { defineStore } from "pinia";
+import { ref } from "vue";
+
+export const useAutoflowStore = defineStore("autoflowStore", () => {
+ // 초기값 복원
+ const storedId = localStorage.getItem("projectId");
+ const projectId = ref(storedId ? Number(storedId) : null);
+
+ const projectName = ref(localStorage.getItem("projectName") || "");
+
+ const setProjectId = (id: number) => {
+ projectId.value = id;
+ localStorage.setItem("projectId", String(id));
+ };
+
+ const clearProjectId = () => {
+ projectId.value = null;
+ localStorage.removeItem("projectId");
+ };
+
+ const setProjectName = (name: string) => {
+ projectName.value = name;
+ localStorage.setItem("projectName", name);
+ };
+
+ const clearProjectName = () => {
+ projectName.value = "";
+ localStorage.removeItem("projectName");
+ };
+
+ return {
+ projectId,
+ projectName,
+ setProjectId,
+ clearProjectId,
+ setProjectName,
+ clearProjectName,
+ };
+});
diff --git a/src/stores/commonStore.ts b/src/stores/commonStore.ts
new file mode 100644
index 0000000..e32549d
--- /dev/null
+++ b/src/stores/commonStore.ts
@@ -0,0 +1,32 @@
+import { defineStore } from "pinia";
+import { ref } from "vue";
+import { load } from "webfontloader";
+
+export const commonStore = defineStore("common", () => {
+ const snackbarMsg = ref({ text: "", color: "", result: 200 });
+
+ const setSnackbarMsg = (data: {
+ result: number;
+ color: string;
+ text: string;
+ }) => {
+ snackbarMsg.value = data;
+ };
+
+ return {
+ snackbarMsg,
+ setSnackbarMsg,
+ };
+});
+
+export const loadingStore = defineStore("loading", () => {
+ const loading = ref(false);
+ const setLoading = (value: boolean) => {
+ loading.value = value;
+ };
+
+ return {
+ loading,
+ setLoading,
+ };
+});
diff --git a/src/utils/CommonUtils.ts b/src/utils/CommonUtils.ts
new file mode 100644
index 0000000..1e99ab9
--- /dev/null
+++ b/src/utils/CommonUtils.ts
@@ -0,0 +1,96 @@
+export const CommonFunctions = {
+ stringTruncate: (str: string, len: number) => {
+ return str.length > len ? str.slice(0, len) + "..." : str;
+ },
+ getFileExtension: (filename: string) => {
+ const index = filename.lastIndexOf(".");
+ return index !== -1 ? filename.substring(index + 1).toLowerCase() : null;
+ },
+ getDateFormatYmd: (date: string) => {
+ if (date != null && date != "") {
+ const inputDate = new Date(date);
+ const year = inputDate.getFullYear();
+ const month = (inputDate.getMonth() + 1).toString().padStart(2, "0");
+ const day = inputDate.getDate().toString().padStart(2, "0");
+ const formattedDate = `${year}.${month}.${day}`;
+
+ return formattedDate;
+ } else {
+ return "";
+ }
+ },
+ getDateFormatHis: (date: string) => {
+ if (date != null && date != "") {
+ const timeMatch = date.match(/\b\d{2}:\d{2}:\d{2}\b/);
+ if (timeMatch) {
+ return timeMatch[0];
+ } else {
+ return "";
+ }
+ } else {
+ return "";
+ }
+ },
+ getQuantumDateFormat: (dateString: string) => {
+ if (dateString != null && dateString != "" && dateString != "-") {
+ const date = new Date(dateString);
+
+ // 날짜와 시간을 각각 포맷팅
+ const year = date.getFullYear();
+ const month = String(date.getMonth() + 1).padStart(2, "0");
+ const day = String(date.getDate()).padStart(2, "0");
+ const hours = String(date.getHours()).padStart(2, "0");
+ const minutes = String(date.getMinutes()).padStart(2, "0");
+ const seconds = String(date.getSeconds()).padStart(2, "0");
+
+ return `${year}.${month}.${day} ${hours}:${minutes}:${seconds}`;
+ } else {
+ return "-";
+ }
+ dateString;
+ },
+ getQuantumDateFormatToCustom: (dateString: string) => {
+ if (dateString != null && dateString != "" && dateString != "-") {
+ const date = new Date(dateString);
+
+ // toLocaleString을 사용해 형식 지정
+ return date.toLocaleString("en-US", {
+ month: "short", // Oct
+ day: "2-digit", // 07
+ year: "numeric", // 2024
+ hour: "2-digit", // 10
+ minute: "2-digit", // 37
+ hour12: true, // AM/PM 형식
+ });
+ } else {
+ return "-";
+ }
+ },
+ getTimeDifferenceInSeconds: (dateString1: string, dateString2: string) => {
+ const date1 = new Date(dateString1);
+ const date2 = new Date(dateString2);
+
+ // 두 날짜의 밀리초 차이 계산
+ const differenceInMs = Math.abs(date1.getTime() - date2.getTime());
+
+ // 밀리초 차이를 초 단위로 변환
+ const differenceInSeconds = Math.floor(differenceInMs / 1000);
+ return differenceInSeconds;
+ },
+ getJobChartData: (data: string[]) => {
+ const binaryMapping: Record = {
+ "0x0": "00",
+ "0x1": "01",
+ "0x2": "10",
+ "0x3": "11",
+ };
+
+ const frequency: Record = {};
+ data.forEach((d) => {
+ const binary = binaryMapping[d] || "00";
+ frequency[binary] = (frequency[binary] || 0) + 1;
+ });
+
+ return frequency;
+ },
+};
diff --git a/src/utils/menuUtils.js b/src/utils/menuUtils.js
index fc71f9e..90efece 100644
--- a/src/utils/menuUtils.js
+++ b/src/utils/menuUtils.js
@@ -6,6 +6,12 @@ export const menuUtils = {
value: "home",
icon: "mdi-monitor-multiple",
},
+ {
+ title: "Project",
+ path: "/project",
+ value: "project",
+ icon: "mdi-folder-cog-outline",
+ },
{
title: "Workflows",
path: "/workflows",
@@ -25,7 +31,7 @@ export const menuUtils = {
icon: "mdi-format-list-bulleted-square",
depth: [
{ title: "Experiment", path: "/run/experiment" },
- { title: "Excutions", path: "/run/excutions" },
+ { title: "Executions", path: "/run/executions" },
],
},
{
@@ -40,13 +46,13 @@ export const menuUtils = {
title: "Training Script",
path: "/training-script",
value: "training-script",
- icon: "mdi-account",
+ icon: "mdi-file-code-outline",
},
{
title: "Datasets",
path: "/datasets",
value: "datasets",
- icon: "mdi-account",
+ icon: "mdi-database-outline",
},
],
};
diff --git a/src/utils/storage.js b/src/utils/storage.js
index 2cae909..23c2e3d 100644
--- a/src/utils/storage.js
+++ b/src/utils/storage.js
@@ -8,8 +8,40 @@ export const storage = {
getToken: () => {
const authString = localStorage.getItem("autoflow-auth");
if (authString !== null) {
- const auth = JSON.parse(authString);
- return auth.token;
+ try {
+ const auth = JSON.parse(authString);
+
+ if (auth.jwtCookie) {
+ const match = auth.jwtCookie.match(/cuuva-jwt=([^;]+)/);
+ if (match && match[1]) {
+ return match[1];
+ }
+ }
+ } catch (e) {
+ console.error("[storage] getToken parse error:", e);
+ }
+ }
+ return "";
+ },
+
+ // 리프레시 토큰만 잘라서 반환
+ getRefreshToken: () => {
+ const authString = localStorage.getItem("autoflow-auth");
+ if (authString !== null) {
+ try {
+ const auth = JSON.parse(authString);
+
+ if (auth.jwtRefreshCookie) {
+ const match = auth.jwtRefreshCookie.match(
+ /cuuva-jwt-refresh=([^;]+)/,
+ );
+ if (match && match[1]) {
+ return match[1];
+ }
+ }
+ } catch (e) {
+ console.error("[storage] getRefreshToken parse error:", e);
+ }
}
return "";
},
@@ -21,7 +53,7 @@ export const storage = {
}
return "";
},
- getId: () =>{
+ getId: () => {
const authString = localStorage.getItem("autoflow-auth");
if (authString !== null) {
const auth = JSON.parse(authString);
diff --git a/src/views/Select.vue b/src/views/Select.vue
new file mode 100644
index 0000000..ed6ce2b
--- /dev/null
+++ b/src/views/Select.vue
@@ -0,0 +1,420 @@
+
+
+
+
+
+
+ Project Selection
+
+
+
+
+
+
+ Create Project
+
+
+
+
+
+
+ openContextMenu(e, index)"
+ >
+
+
+ {{ project.title }}
+
+
+
+ Select Users: {{ project.creator }}
+ 등록일: {{ project.date }}
+
+
+
+ {{ project.description }}
+
+
+
+
+
+
+
+
+ mdi-square-edit-outline
+ Modify
+
+
+ mdi-delete
+ Delete
+
+
+
+
+
+
+
+ {{ modalMode === "create" ? "Create Project" : "Modify Project" }}
+
+
+
+
+
+
+
+
+
+
+
+
+ Cancel
+
+ {{ modalMode === "create" ? "Create" : "Save" }}
+
+
+
+
+
+
+
+
diff --git a/typed-router.d.ts b/typed-router.d.ts
index e544b87..8c4a1a7 100644
--- a/typed-router.d.ts
+++ b/typed-router.d.ts
@@ -21,11 +21,13 @@ declare module 'vue-router/auto-routes' {
'/': RouteRecordInfo<'/', '/', Record, Record>,
'/DatasetView': RouteRecordInfo<'/DatasetView', '/DatasetView', Record, Record>,
'/DeploymentView': RouteRecordInfo<'/DeploymentView', '/DeploymentView', Record, Record>,
- '/ExcutionsView': RouteRecordInfo<'/ExcutionsView', '/ExcutionsView', Record, Record>,
+ '/ExecutionsView': RouteRecordInfo<'/ExecutionsView', '/ExecutionsView', Record, Record>,
'/ExperimentView': RouteRecordInfo<'/ExperimentView', '/ExperimentView', Record, Record>,
'/HomeView': RouteRecordInfo<'/HomeView', '/HomeView', Record, Record>,
'/LoginView': RouteRecordInfo<'/LoginView', '/LoginView', Record, Record>,
'/MainView': RouteRecordInfo<'/MainView', '/MainView', Record, Record>,
+ '/ProjectView': RouteRecordInfo<'/ProjectView', '/ProjectView', Record, Record>,
+ '/SignupView': RouteRecordInfo<'/SignupView', '/SignupView', Record, Record>,
'/TrainingScriptView': RouteRecordInfo<'/TrainingScriptView', '/TrainingScriptView', Record, Record>,
'/WorkflowStepConfigView': RouteRecordInfo<'/WorkflowStepConfigView', '/WorkflowStepConfigView', Record, Record>,
'/WorkflowView': RouteRecordInfo<'/WorkflowView', '/WorkflowView', Record, Record>,
diff --git a/vite.config.mjs b/vite.config.mjs
index 0d08c1e..1fdc47b 100644
--- a/vite.config.mjs
+++ b/vite.config.mjs
@@ -1,19 +1,22 @@
// Plugins
-import AutoImport from 'unplugin-auto-import/vite'
-import Components from 'unplugin-vue-components/vite'
-import Fonts from 'unplugin-fonts/vite'
-import Layouts from 'vite-plugin-vue-layouts-next'
-import Vue from '@vitejs/plugin-vue'
-import VueRouter from 'unplugin-vue-router/vite'
-import { VueRouterAutoImports } from 'unplugin-vue-router'
-import Vuetify, { transformAssetUrls } from 'vite-plugin-vuetify'
+import AutoImport from "unplugin-auto-import/vite";
+import Components from "unplugin-vue-components/vite";
+import Fonts from "unplugin-fonts/vite";
+import Layouts from "vite-plugin-vue-layouts-next";
+import Vue from "@vitejs/plugin-vue";
+import VueRouter from "unplugin-vue-router/vite";
+import { VueRouterAutoImports } from "unplugin-vue-router";
+import Vuetify, { transformAssetUrls } from "vite-plugin-vuetify";
// Utilities
-import { defineConfig } from 'vite'
-import { fileURLToPath, URL } from 'node:url'
+import { defineConfig } from "vite";
+import { fileURLToPath, URL } from "node:url";
// https://vitejs.dev/config/
export default defineConfig({
+ // 배포할때는 주석 풀기
+ // base: process.env.VITE_ROOT_PATH,
+ // base: "/autoflow/",
plugins: [
VueRouter(),
Layouts(),
@@ -24,24 +27,26 @@ export default defineConfig({
Vuetify({
autoImport: true,
styles: {
- configFile: 'src/styles/settings.scss',
+ configFile: "src/styles/settings.scss",
},
}),
Components(),
Fonts({
google: {
- families: [{
- name: 'Roboto',
- styles: 'wght@100;300;400;500;700;900',
- }],
+ families: [
+ {
+ name: "Roboto",
+ styles: "wght@100;300;400;500;700;900",
+ },
+ ],
},
}),
AutoImport({
imports: [
- 'vue',
+ "vue",
VueRouterAutoImports,
{
- pinia: ['defineStore', 'storeToRefs'],
+ pinia: ["defineStore", "storeToRefs"],
},
],
eslintrc: {
@@ -52,27 +57,19 @@ export default defineConfig({
],
optimizeDeps: {
exclude: [
- 'vuetify',
- 'vue-router',
- 'unplugin-vue-router/runtime',
- 'unplugin-vue-router/data-loaders',
- 'unplugin-vue-router/data-loaders/basic',
+ "vuetify",
+ "vue-router",
+ "unplugin-vue-router/runtime",
+ "unplugin-vue-router/data-loaders",
+ "unplugin-vue-router/data-loaders/basic",
],
},
- define: { 'process.env': {} },
+ define: { "process.env": {} },
resolve: {
alias: {
- '@': fileURLToPath(new URL('src', import.meta.url)),
+ "@": fileURLToPath(new URL("src", import.meta.url)),
},
- extensions: [
- '.js',
- '.json',
- '.jsx',
- '.mjs',
- '.ts',
- '.tsx',
- '.vue',
- ],
+ extensions: [".js", ".json", ".jsx", ".mjs", ".ts", ".tsx", ".vue"],
},
server: {
port: 3000,
@@ -80,11 +77,8 @@ export default defineConfig({
css: {
preprocessorOptions: {
sass: {
- api: 'modern-compiler',
- },
- scss: {
- api: 'modern-compiler',
+ api: "modern-compiler",
},
},
},
-})
+});