first commit
This commit is contained in:
commit
6cf4ecacf5
24
.gitignore
vendored
Normal file
24
.gitignore
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
dist-ssr
|
||||||
|
*.local
|
||||||
|
|
||||||
|
# Editor directories and files
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/extensions.json
|
||||||
|
.idea
|
||||||
|
.DS_Store
|
||||||
|
*.suo
|
||||||
|
*.ntvs*
|
||||||
|
*.njsproj
|
||||||
|
*.sln
|
||||||
|
*.sw?
|
3
.vscode/extensions.json
vendored
Normal file
3
.vscode/extensions.json
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"recommendations": ["Vue.volar"]
|
||||||
|
}
|
5
README.md
Normal file
5
README.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# EMS前台
|
||||||
|
|
||||||
|
## Vue 3 + TypeScript + Vite
|
||||||
|
This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
|
||||||
|
Learn more about the recommended Project Setup and IDE Support in the [Vue Docs TypeScript Guide](https://vuejs.org/guide/typescript/overview.html#project-setup).
|
10
auto-imports.d.ts
vendored
Normal file
10
auto-imports.d.ts
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
/* eslint-disable */
|
||||||
|
/* prettier-ignore */
|
||||||
|
// @ts-nocheck
|
||||||
|
// noinspection JSUnusedGlobalSymbols
|
||||||
|
// Generated by unplugin-auto-import
|
||||||
|
// biome-ignore lint: disable
|
||||||
|
export {}
|
||||||
|
declare global {
|
||||||
|
|
||||||
|
}
|
31
components.d.ts
vendored
Normal file
31
components.d.ts
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/* eslint-disable */
|
||||||
|
// @ts-nocheck
|
||||||
|
// Generated by unplugin-vue-components
|
||||||
|
// Read more: https://github.com/vuejs/core/pull/3399
|
||||||
|
// biome-ignore lint: disable
|
||||||
|
export {}
|
||||||
|
|
||||||
|
/* prettier-ignore */
|
||||||
|
declare module 'vue' {
|
||||||
|
export interface GlobalComponents {
|
||||||
|
ElButton: typeof import('element-plus/es')['ElButton']
|
||||||
|
ElButtonGroup: typeof import('element-plus/es')['ElButtonGroup']
|
||||||
|
ElCard: typeof import('element-plus/es')['ElCard']
|
||||||
|
ElCol: typeof import('element-plus/es')['ElCol']
|
||||||
|
ElContainer: typeof import('element-plus/es')['ElContainer']
|
||||||
|
ElHeader: typeof import('element-plus/es')['ElHeader']
|
||||||
|
ElInput: typeof import('element-plus/es')['ElInput']
|
||||||
|
ElMain: typeof import('element-plus/es')['ElMain']
|
||||||
|
ElMenu: typeof import('element-plus/es')['ElMenu']
|
||||||
|
ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
|
||||||
|
ElRow: typeof import('element-plus/es')['ElRow']
|
||||||
|
ElStatistic: typeof import('element-plus/es')['ElStatistic']
|
||||||
|
ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
|
||||||
|
EnergyBar: typeof import('./src/components/EnergyBar.vue')['default']
|
||||||
|
EnergyLine: typeof import('./src/components/EnergyLine.vue')['default']
|
||||||
|
EnergySankey: typeof import('./src/components/EnergySankey.vue')['default']
|
||||||
|
Navbar: typeof import('./src/components/Navbar.vue')['default']
|
||||||
|
RouterLink: typeof import('vue-router')['RouterLink']
|
||||||
|
RouterView: typeof import('vue-router')['RouterView']
|
||||||
|
}
|
||||||
|
}
|
13
index.html
Normal file
13
index.html
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>EMS</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
<script type="module" src="/src/main.ts"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
2263
package-lock.json
generated
Normal file
2263
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
27
package.json
Normal file
27
package.json
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"name": "ems_front",
|
||||||
|
"private": true,
|
||||||
|
"version": "0.0.0",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite",
|
||||||
|
"build": "vue-tsc -b && vite build",
|
||||||
|
"preview": "vite preview"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"echarts": "^5.6.0",
|
||||||
|
"element-plus": "^2.9.6",
|
||||||
|
"vue": "^3.5.13",
|
||||||
|
"vue-router": "^4.5.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^22.13.11",
|
||||||
|
"@vitejs/plugin-vue": "^5.2.1",
|
||||||
|
"@vue/tsconfig": "^0.7.0",
|
||||||
|
"typescript": "~5.7.2",
|
||||||
|
"unplugin-auto-import": "^19.1.1",
|
||||||
|
"unplugin-vue-components": "^28.4.1",
|
||||||
|
"vite": "^6.2.0",
|
||||||
|
"vue-tsc": "^2.2.4"
|
||||||
|
}
|
||||||
|
}
|
1
public/vite.svg
Normal file
1
public/vite.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
|
After Width: | Height: | Size: 1.5 KiB |
5
src/App.vue
Normal file
5
src/App.vue
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<script setup lang="ts"></script>
|
||||||
|
<template>
|
||||||
|
<router-view></router-view>
|
||||||
|
</template>
|
||||||
|
<style></style>
|
BIN
src/assets/bg.jpg
Normal file
BIN
src/assets/bg.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 66 KiB |
1
src/assets/vue.svg
Normal file
1
src/assets/vue.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>
|
After Width: | Height: | Size: 496 B |
82
src/components/EnergyBar.vue
Normal file
82
src/components/EnergyBar.vue
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
<script setup>
|
||||||
|
import { ref, onMounted, watch, onUnmounted } from "vue";
|
||||||
|
import * as echarts from "echarts";
|
||||||
|
|
||||||
|
const chartContainer = ref(null);
|
||||||
|
let chartInstance = null;
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
chartData: {
|
||||||
|
type: Object,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const initChart = () => {
|
||||||
|
chartInstance = echarts.init(chartContainer.value);
|
||||||
|
|
||||||
|
const option = {
|
||||||
|
tooltip: {
|
||||||
|
trigger: "axis",
|
||||||
|
axisPointer: {
|
||||||
|
type: "shadow",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
data: props.chartData.series.map((item) => item.name),
|
||||||
|
bottom: "0%",
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
top: "5%",
|
||||||
|
left: "5%",
|
||||||
|
right: "5%",
|
||||||
|
bottom: "10%",
|
||||||
|
containLabel: true,
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
type: "category",
|
||||||
|
data: props.chartData.categories || [],
|
||||||
|
},
|
||||||
|
yAxis: {
|
||||||
|
type: "value",
|
||||||
|
},
|
||||||
|
series: props.chartData.series.map((item) => ({
|
||||||
|
...item,
|
||||||
|
stack: "total",
|
||||||
|
})),
|
||||||
|
};
|
||||||
|
|
||||||
|
chartInstance.setOption(option);
|
||||||
|
};
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
initChart();
|
||||||
|
});
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => props.chartData,
|
||||||
|
(newChartData) => {
|
||||||
|
if (chartInstance) {
|
||||||
|
chartInstance.setOption({
|
||||||
|
xAxis: {
|
||||||
|
data: newChartData.categories || [],
|
||||||
|
},
|
||||||
|
series: newChartData.series.map((item) => ({
|
||||||
|
...item,
|
||||||
|
stack: "total",
|
||||||
|
})),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ deep: true }
|
||||||
|
);
|
||||||
|
|
||||||
|
onUnmounted(() => {
|
||||||
|
if (chartInstance) {
|
||||||
|
chartInstance.dispose();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<template>
|
||||||
|
<div ref="chartContainer" style="width: 100%; height: 250px"></div>
|
||||||
|
</template>
|
105
src/components/EnergyLine.vue
Normal file
105
src/components/EnergyLine.vue
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
<script setup>
|
||||||
|
import { ref, onMounted, onUnmounted } from "vue";
|
||||||
|
import * as echarts from "echarts"; // 引入 echarts
|
||||||
|
|
||||||
|
// 假資料
|
||||||
|
const data = {
|
||||||
|
categories: [
|
||||||
|
"16:22:29",
|
||||||
|
"16:22:37",
|
||||||
|
"16:22:47",
|
||||||
|
"16:23:00",
|
||||||
|
"16:23:08",
|
||||||
|
"16:23:18",
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: "即時趨勢",
|
||||||
|
type: "line",
|
||||||
|
data: [320, 310, 300, 305, 310, 300],
|
||||||
|
smooth: true,
|
||||||
|
lineStyle: {
|
||||||
|
width: 3,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "契約容量",
|
||||||
|
type: "line",
|
||||||
|
data: [400, 400, 400, 400, 400, 400],
|
||||||
|
smooth: true,
|
||||||
|
lineStyle: {
|
||||||
|
width: 3,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "警戒容量",
|
||||||
|
type: "line",
|
||||||
|
data: [350, 350, 350, 350, 350, 350],
|
||||||
|
smooth: true,
|
||||||
|
lineStyle: {
|
||||||
|
width: 3,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "偵測值",
|
||||||
|
type: "line",
|
||||||
|
data: [280, 300, 290, 295, 300, 290],
|
||||||
|
smooth: true,
|
||||||
|
lineStyle: {
|
||||||
|
width: 3,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
const demand_chart = ref(null);
|
||||||
|
const defaultChartOption = ref({
|
||||||
|
tooltip: {
|
||||||
|
trigger: "axis",
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
data: data.series.map((s) => s.name),
|
||||||
|
orient: "horizontal",
|
||||||
|
bottom: "0%",
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
top: "10%",
|
||||||
|
left: "0%",
|
||||||
|
right: "5%",
|
||||||
|
bottom: "10%",
|
||||||
|
containLabel: true,
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
type: "category",
|
||||||
|
data: data.categories,
|
||||||
|
},
|
||||||
|
yAxis: {
|
||||||
|
type: "value",
|
||||||
|
},
|
||||||
|
series: data.series,
|
||||||
|
});
|
||||||
|
|
||||||
|
let chartInstance = null; // 图表实例
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
chartInstance = echarts.init(demand_chart.value);
|
||||||
|
chartInstance.setOption(defaultChartOption.value);
|
||||||
|
|
||||||
|
window.addEventListener("resize", () => {
|
||||||
|
chartInstance.resize();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
onUnmounted(() => {
|
||||||
|
if (chartInstance) {
|
||||||
|
chartInstance.dispose();
|
||||||
|
}
|
||||||
|
window.removeEventListener("resize", () => {
|
||||||
|
chartInstance.resize();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<template>
|
||||||
|
<div ref="demand_chart" style="width: 100%; height: 200px"></div>
|
||||||
|
</template>
|
||||||
|
<style scoped></style>
|
76
src/components/EnergySankey.vue
Normal file
76
src/components/EnergySankey.vue
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
<script setup>
|
||||||
|
import { ref, onMounted, onUnmounted } from "vue";
|
||||||
|
import * as echarts from "echarts";
|
||||||
|
|
||||||
|
const chartContainer = ref(null);
|
||||||
|
let chart = null;
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
initChart();
|
||||||
|
});
|
||||||
|
|
||||||
|
const initChart = () => {
|
||||||
|
chart = echarts.init(chartContainer.value);
|
||||||
|
|
||||||
|
const option = {
|
||||||
|
tooltip: {
|
||||||
|
trigger: "item",
|
||||||
|
triggerOn: "mousemove",
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
type: "sankey",
|
||||||
|
layout: "none",
|
||||||
|
emphasis: {
|
||||||
|
focus: "adjacency",
|
||||||
|
},
|
||||||
|
data: [
|
||||||
|
{ name: "總用電" },
|
||||||
|
{ name: "照明" },
|
||||||
|
{ name: "空調" },
|
||||||
|
{ name: "設備A" },
|
||||||
|
{ name: "設備B" },
|
||||||
|
{ name: "其他" },
|
||||||
|
],
|
||||||
|
|
||||||
|
links: [
|
||||||
|
{ source: "總用電", target: "照明", value: 100 },
|
||||||
|
{ source: "總用電", target: "空調", value: 150 },
|
||||||
|
{ source: "總用電", target: "設備A", value: 80 },
|
||||||
|
{ source: "總用電", target: "設備B", value: 120 },
|
||||||
|
{ source: "總用電", target: "其他", value: 50 },
|
||||||
|
],
|
||||||
|
lineStyle: {
|
||||||
|
color: "gradient",
|
||||||
|
opacity: 0.7,
|
||||||
|
curveness: 0.5,
|
||||||
|
},
|
||||||
|
itemStyle: {
|
||||||
|
borderWidth: 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
chart.setOption(option); // 設置圖表配置項
|
||||||
|
|
||||||
|
// 監聽視窗大小變化,調整圖表尺寸
|
||||||
|
window.addEventListener("resize", () => {
|
||||||
|
chart.resize();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// 在組件卸載時銷毀圖表實例,釋放資源
|
||||||
|
onUnmounted(() => {
|
||||||
|
if (chart) {
|
||||||
|
chart.dispose();
|
||||||
|
}
|
||||||
|
window.removeEventListener("resize", () => {
|
||||||
|
chart.resize();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<template>
|
||||||
|
<div ref="chartContainer" style="width: 100%; height: 200px"></div>
|
||||||
|
</template>
|
||||||
|
<style scoped></style>
|
43
src/components/Navbar.vue
Normal file
43
src/components/Navbar.vue
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
<template>
|
||||||
|
<el-menu
|
||||||
|
:default-active="activeIndex"
|
||||||
|
class="el-menu-demo"
|
||||||
|
mode="horizontal"
|
||||||
|
@select="handleSelect"
|
||||||
|
>
|
||||||
|
<el-menu-item index="chart">能源圖表 </el-menu-item>
|
||||||
|
<el-sub-menu index="elecPricing">
|
||||||
|
<template #title>電價表</template>
|
||||||
|
<el-menu-item index="elecPricingSimple">住宅型</el-menu-item>
|
||||||
|
<el-menu-item index="elecPricingStandard">標準型</el-menu-item>
|
||||||
|
</el-sub-menu>
|
||||||
|
</el-menu>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref } from "vue";
|
||||||
|
import { useRouter } from "vue-router";
|
||||||
|
|
||||||
|
const router = useRouter();
|
||||||
|
const activeIndex = ref("chart"); // Set initial active index
|
||||||
|
const handleSelect = (key: string, keyPath: string[]) => {
|
||||||
|
console.log(key, keyPath);
|
||||||
|
|
||||||
|
switch (key) {
|
||||||
|
case "chart":
|
||||||
|
router.push({ name: "EnergyChart" });
|
||||||
|
activeIndex.value = "chart";
|
||||||
|
break;
|
||||||
|
case "elecPricingSimple":
|
||||||
|
router.push({ name: "ElecPricingSimple" });
|
||||||
|
activeIndex.value = "elecPricingSimple";
|
||||||
|
break;
|
||||||
|
case "elecPricingStandard":
|
||||||
|
router.push({ name: "ElecPricingStandard" });
|
||||||
|
activeIndex.value = "elecPricingStandard";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped></style>
|
8
src/main.ts
Normal file
8
src/main.ts
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import { createApp } from 'vue'
|
||||||
|
import './reset.css'
|
||||||
|
import App from './App.vue'
|
||||||
|
import router from './router'
|
||||||
|
|
||||||
|
const app = createApp(App)
|
||||||
|
app.use(router)
|
||||||
|
app.mount('#app')
|
31
src/reset.css
Normal file
31
src/reset.css
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
:root {
|
||||||
|
font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
|
||||||
|
line-height: 1.5;
|
||||||
|
font-weight: 400;
|
||||||
|
color-scheme: light dark;
|
||||||
|
font-synthesis: none;
|
||||||
|
text-rendering: optimizeLegibility;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
min-width: 320px;
|
||||||
|
min-height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
#app {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
border-spacing: 0;
|
||||||
|
width: 100%;
|
||||||
|
}
|
44
src/router/index.ts
Normal file
44
src/router/index.ts
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
import { createRouter, createWebHistory } from "vue-router";
|
||||||
|
import type { RouteRecordRaw } from "vue-router";
|
||||||
|
|
||||||
|
const routes: Array<RouteRecordRaw> = [
|
||||||
|
{
|
||||||
|
path: "/:catchAll(.*)",
|
||||||
|
name: "Home",
|
||||||
|
component: () => import("../views/Home.vue"),
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: "",
|
||||||
|
name: "EnergyChart",
|
||||||
|
component: () => import("../views/EnergyChart.vue"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "elecPricingSimple",
|
||||||
|
name: "ElecPricingSimple",
|
||||||
|
component: () => import("../views/ElecPriceRes.vue"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "elecPricingStandard",
|
||||||
|
name: "ElecPricingStandard",
|
||||||
|
component: () => import("../views/ElecPriceStd.vue"),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "/register",
|
||||||
|
name: "Register",
|
||||||
|
component: () => import("../views/Register.vue"),
|
||||||
|
},
|
||||||
|
// {
|
||||||
|
// path: "/:catchAll(.*)",
|
||||||
|
// name: "404",
|
||||||
|
// component: () => import("../views/404.vue"),
|
||||||
|
// },
|
||||||
|
];
|
||||||
|
|
||||||
|
const router = createRouter({
|
||||||
|
history: createWebHistory(),
|
||||||
|
routes,
|
||||||
|
});
|
||||||
|
|
||||||
|
export default router;
|
79
src/style.css
Normal file
79
src/style.css
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
:root {
|
||||||
|
font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
|
||||||
|
line-height: 1.5;
|
||||||
|
font-weight: 400;
|
||||||
|
|
||||||
|
color-scheme: light dark;
|
||||||
|
color: rgba(255, 255, 255, 0.87);
|
||||||
|
background-color: #242424;
|
||||||
|
|
||||||
|
font-synthesis: none;
|
||||||
|
text-rendering: optimizeLegibility;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
font-weight: 500;
|
||||||
|
color: #646cff;
|
||||||
|
text-decoration: inherit;
|
||||||
|
}
|
||||||
|
a:hover {
|
||||||
|
color: #535bf2;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
display: flex;
|
||||||
|
place-items: center;
|
||||||
|
min-width: 320px;
|
||||||
|
min-height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 3.2em;
|
||||||
|
line-height: 1.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
border-radius: 8px;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
padding: 0.6em 1.2em;
|
||||||
|
font-size: 1em;
|
||||||
|
font-weight: 500;
|
||||||
|
font-family: inherit;
|
||||||
|
background-color: #1a1a1a;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: border-color 0.25s;
|
||||||
|
}
|
||||||
|
button:hover {
|
||||||
|
border-color: #646cff;
|
||||||
|
}
|
||||||
|
button:focus,
|
||||||
|
button:focus-visible {
|
||||||
|
outline: 4px auto -webkit-focus-ring-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card {
|
||||||
|
padding: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#app {
|
||||||
|
max-width: 1280px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 2rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: light) {
|
||||||
|
:root {
|
||||||
|
color: #213547;
|
||||||
|
background-color: #ffffff;
|
||||||
|
}
|
||||||
|
a:hover {
|
||||||
|
color: #747bff;
|
||||||
|
}
|
||||||
|
button {
|
||||||
|
background-color: #f9f9f9;
|
||||||
|
}
|
||||||
|
}
|
10
src/views/404.vue
Normal file
10
src/views/404.vue
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<template>
|
||||||
|
<el-result title="404" icon="warning" sub-title="Sorry, request error">
|
||||||
|
<template #extra>
|
||||||
|
<el-button type="primary" @click="$router.push('/')">返回首頁</el-button>
|
||||||
|
</template>
|
||||||
|
</el-result>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
</style>
|
399
src/views/ElecPriceRes.vue
Normal file
399
src/views/ElecPriceRes.vue
Normal file
@ -0,0 +1,399 @@
|
|||||||
|
<template>
|
||||||
|
<el-row :gutter="20">
|
||||||
|
<el-col :span="24">
|
||||||
|
<h2>
|
||||||
|
適合每月用電800度~5,300度之住宅及1,600度~5,300度之小商店評估選用。
|
||||||
|
</h2>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<table class="">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th colspan="8">
|
||||||
|
<div style="display: flex; justify-content: space-between">
|
||||||
|
簡易型時間電價二段式
|
||||||
|
<el-button-group>
|
||||||
|
<el-button
|
||||||
|
type="warning"
|
||||||
|
plain
|
||||||
|
:icon="Edit"
|
||||||
|
v-if="!sim2isEditing"
|
||||||
|
@click.stop.prevent="sim2isEditing = true"
|
||||||
|
>編輯</el-button
|
||||||
|
>
|
||||||
|
<template v-else>
|
||||||
|
<el-button
|
||||||
|
type="warning"
|
||||||
|
plain
|
||||||
|
:icon="CircleCheck"
|
||||||
|
@click.stop.prevent="sim2isEditing = false"
|
||||||
|
>確認</el-button
|
||||||
|
>
|
||||||
|
<el-button
|
||||||
|
type="warning"
|
||||||
|
plain
|
||||||
|
:icon="CircleClose"
|
||||||
|
@click.stop.prevent="onCancel('sim2')"
|
||||||
|
>取消</el-button
|
||||||
|
>
|
||||||
|
</template>
|
||||||
|
</el-button-group>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td colspan="6" class="bg-teal-800 bg-opacity-20">分類</td>
|
||||||
|
<td class="bg-teal-800 bg-opacity-20">夏月<br />(6/1~9/30)</td>
|
||||||
|
<td class="bg-teal-800 bg-opacity-20">
|
||||||
|
非夏月<br />(夏月以外的時間)
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="bg-brown" width="40">基本電費</td>
|
||||||
|
<td colspan="4" class="bg-brown">按戶計收</td>
|
||||||
|
<td class="bg-brown" width="40">每戶每月</td>
|
||||||
|
<td colspan="2" class="bg-brown">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="sim2Value[0]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!sim2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td rowspan="6">流動電費</td>
|
||||||
|
<td rowspan="4" width="80">週一~週五</td>
|
||||||
|
<td rowspan="2" class="bg-red" width="30">尖峰時間</td>
|
||||||
|
<td class="bg-lightred">夏月</td>
|
||||||
|
<td class="bg-lightred">09:00 ~ 24:00</td>
|
||||||
|
<td rowspan="5">每度</td>
|
||||||
|
<td class="bg-lightred">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="sim2Value[1]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!sim2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-lightred">-</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="bg-lightred">非夏月</td>
|
||||||
|
<td class="bg-lightred">06:00 ~ 11:00<br />14:00 ~ 24:00</td>
|
||||||
|
<td class="bg-lightred">-</td>
|
||||||
|
<td class="bg-lightred">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="sim2Value[2]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!sim2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td rowspan="2" class="bg-green">離峰時間</td>
|
||||||
|
<td class="bg-lightgreen">夏月</td>
|
||||||
|
<td class="bg-lightgreen">00:00 ~ 09:00</td>
|
||||||
|
<td class="bg-lightgreen">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="sim2Value[3]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!sim2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-lightgreen">-</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="bg-lightgreen">非夏月</td>
|
||||||
|
<td class="bg-lightgreen">00:00 ~ 06:00<br />11:00 ~ 14:00</td>
|
||||||
|
<td class="bg-lightgreen">-</td>
|
||||||
|
<td class="bg-lightgreen">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="sim2Value[4]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!sim2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>週六、週日及離峰日</td>
|
||||||
|
<td class="bg-green">離峰時間</td>
|
||||||
|
<td colspan="2" class="bg-lightgreen">全日</td>
|
||||||
|
<td class="bg-lightgreen">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="sim2Value[5]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!sim2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-lightgreen">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="sim2Value[6]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!sim2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="4">每月總度數超過2000度之部分</td>
|
||||||
|
<td>每度</td>
|
||||||
|
<td colspan="2" class="">
|
||||||
|
<div class="">
|
||||||
|
加
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="sim2Value[7]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!sim2isEditing"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<table class="">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th colspan="8" class="">
|
||||||
|
<div style="display: flex; justify-content: space-between">
|
||||||
|
簡易型時間電價三段式
|
||||||
|
<el-button-group>
|
||||||
|
<el-button
|
||||||
|
type="warning"
|
||||||
|
plain
|
||||||
|
:icon="Edit"
|
||||||
|
v-if="!sim3isEditing"
|
||||||
|
@click.stop.prevent="sim3isEditing = true"
|
||||||
|
>編輯</el-button
|
||||||
|
>
|
||||||
|
<template v-else>
|
||||||
|
<el-button
|
||||||
|
type="warning"
|
||||||
|
plain
|
||||||
|
:icon="CircleCheck"
|
||||||
|
@click.stop.prevent="sim3isEditing = false"
|
||||||
|
>確認</el-button
|
||||||
|
>
|
||||||
|
<el-button
|
||||||
|
type="warning"
|
||||||
|
plain
|
||||||
|
:icon="CircleClose"
|
||||||
|
@click.stop.prevent="onCancel('sim3')"
|
||||||
|
>取消</el-button
|
||||||
|
>
|
||||||
|
</template>
|
||||||
|
</el-button-group>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td colspan="6" class="bg-">分類</td>
|
||||||
|
<td class="">夏月<br />(6/1~9/30)</td>
|
||||||
|
<td class="">非夏月<br />(夏月以外的時間)</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="bg-brown" width="40">基本電費</td>
|
||||||
|
<td colspan="4" class="bg-brown">按戶計收</td>
|
||||||
|
<td class="bg-brown" width="40">每戶每月</td>
|
||||||
|
<td colspan="2" class="bg-brown">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="sim3Value[0]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!sim3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td rowspan="7">流動電費</td>
|
||||||
|
<td rowspan="5">週一~週五</td>
|
||||||
|
<td class="bg-red" width="40">尖峰時間</td>
|
||||||
|
<td class="bg-lightred">夏月</td>
|
||||||
|
<td class="bg-lightred" width="110">16:00 ~ 22:00</td>
|
||||||
|
<td rowspan="6">每度</td>
|
||||||
|
<td class="bg-lightred">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="sim3Value[1]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!sim3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-lightred">-</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td rowspan="2" class="bg-yellow">半尖峰時間</td>
|
||||||
|
<td class="bg-lightyellow">夏月</td>
|
||||||
|
<td class="bg-lightyellow">09:00 ~ 16:00<br />22:00~24:00</td>
|
||||||
|
<td class="bg-lightyellow">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="sim3Value[2]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!sim3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-lightyellow">-</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="bg-lightyellow">非夏月</td>
|
||||||
|
<td class="bg-lightyellow">06:00 ~ 11:00<br />14:00 ~ 24:00</td>
|
||||||
|
<td class="bg-lightyellow">-</td>
|
||||||
|
<td class="bg-lightyellow">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="sim3Value[3]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!sim3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td rowspan="2" class="bg-green">離峰時間</td>
|
||||||
|
<td class="bg-lightgreen">夏月</td>
|
||||||
|
<td class="bg-lightgreen">00:00 ~ 09:00</td>
|
||||||
|
<td class="bg-lightgreen">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="sim3Value[4]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!sim3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-lightgreen">-</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="bg-lightgreen">非夏月</td>
|
||||||
|
<td class="bg-lightgreen">00:00 ~ 06:00<br />11:00 ~ 14:00</td>
|
||||||
|
<td class="bg-lightgreen">-</td>
|
||||||
|
<td class="bg-lightgreen">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="sim3Value[5]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!sim3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>週六、週日及離峰日</td>
|
||||||
|
<td colspan="2" class="bg-green">離峰時間</td>
|
||||||
|
<td class="bg-lightgreen">全日</td>
|
||||||
|
<td class="bg-lightgreen">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="sim3Value[6]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!sim3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-lightgreen">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="sim3Value[7]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!sim3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="4">每月總度數超過2000度之部分</td>
|
||||||
|
<td>每度</td>
|
||||||
|
<td colspan="2" class="!text-start">
|
||||||
|
<div class="flex items-center">
|
||||||
|
加
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="sim3Value[8]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!sim3isEditing"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref } from "vue";
|
||||||
|
import { Edit, CircleClose, CircleCheck } from "@element-plus/icons-vue";
|
||||||
|
const sim2isEditing = ref(false);
|
||||||
|
const sim3isEditing = ref(false);
|
||||||
|
const sim2Value = ref([75, 5.01, 4.78, 1.96, 1.89, 1.96, 1.89, 1.02]);
|
||||||
|
const sim3Value = ref([75, 6.92, 4.54, 4.33, 1.96, 1.89, 1.96, 1.89, 1.02]);
|
||||||
|
|
||||||
|
const onCancel = (sheet: string) => {
|
||||||
|
if(sheet == "sim2"){
|
||||||
|
sim2isEditing.value = false;
|
||||||
|
sim2Value.value = [75, 5.01, 4.78, 1.96, 1.89, 1.96, 1.89, 1.02];
|
||||||
|
}else{
|
||||||
|
sim3isEditing.value = false;
|
||||||
|
sim3Value.value = [75, 6.92, 4.54, 4.33, 1.96, 1.89, 1.96, 1.89, 1.02];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
h2 {
|
||||||
|
font-size: 1.2em;
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
}
|
||||||
|
th,
|
||||||
|
td {
|
||||||
|
border: 1px solid #9c9a97;
|
||||||
|
padding: 0.7rem;
|
||||||
|
text-align: center;
|
||||||
|
font-weight: 600;
|
||||||
|
background: #e9e2d1;
|
||||||
|
}
|
||||||
|
th {
|
||||||
|
font-size: 1.2em;
|
||||||
|
line-height: 2;
|
||||||
|
background: #f3ac0a;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
td {
|
||||||
|
font-size: 1em;
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
.bg-brown {
|
||||||
|
background: #d8cdb2;
|
||||||
|
}
|
||||||
|
.bg-red {
|
||||||
|
background: #ce1c45;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.bg-lightred {
|
||||||
|
background: #fee5dd;
|
||||||
|
}
|
||||||
|
.bg-green {
|
||||||
|
background: #4da62c;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.bg-lightgreen {
|
||||||
|
background: #dae9c9;
|
||||||
|
}
|
||||||
|
.bg-yellow {
|
||||||
|
background: #eeb612;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.bg-lightyellow {
|
||||||
|
background: #f3e5a3;
|
||||||
|
}
|
||||||
|
</style>
|
664
src/views/ElecPriceStd.vue
Normal file
664
src/views/ElecPriceStd.vue
Normal file
@ -0,0 +1,664 @@
|
|||||||
|
<template>
|
||||||
|
<el-row :gutter="20">
|
||||||
|
<el-col :span="24">
|
||||||
|
<h2>適合每月用電超過5,300度之住宅及小商店評估選用。</h2>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<table class="">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th colspan="8" class="">
|
||||||
|
<div style="display: flex; justify-content: space-between">
|
||||||
|
標準型時間電價二段式
|
||||||
|
<el-button-group>
|
||||||
|
<el-button
|
||||||
|
type="warning"
|
||||||
|
plain
|
||||||
|
:icon="Edit"
|
||||||
|
v-if="!stand2isEditing"
|
||||||
|
@click.stop.prevent="stand2isEditing = true"
|
||||||
|
>編輯</el-button
|
||||||
|
>
|
||||||
|
<template v-else>
|
||||||
|
<el-button
|
||||||
|
type="warning"
|
||||||
|
plain
|
||||||
|
:icon="CircleCheck"
|
||||||
|
@click.stop.prevent="stand2isEditing = false"
|
||||||
|
>確認</el-button
|
||||||
|
>
|
||||||
|
<el-button
|
||||||
|
type="warning"
|
||||||
|
plain
|
||||||
|
:icon="CircleClose"
|
||||||
|
@click.stop.prevent="onCancel('stand2')"
|
||||||
|
>取消</el-button
|
||||||
|
>
|
||||||
|
</template>
|
||||||
|
</el-button-group>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td colspan="6" class="">分類</td>
|
||||||
|
<td class="">夏月<br />(6/1~9/30)</td>
|
||||||
|
<td class="">非夏月<br />(夏月以外的時間)</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td rowspan="6" class="bg-brown">基本電費</td>
|
||||||
|
<td colspan="2" rowspan="2" class="bg-brown">按戶計收</td>
|
||||||
|
<td colspan="2" class="bg-brown">單相</td>
|
||||||
|
<td rowspan="2" class="bg-brown">每戶每月</td>
|
||||||
|
<td colspan="2" class="bg-brown">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand2Value[0]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="2" class="bg-brown">三相</td>
|
||||||
|
<td colspan="2" class="bg-brown">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand2Value[1]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="4" class="bg-brown">經常契約</td>
|
||||||
|
<td rowspan="4" class="bg-brown">每瓩每月</td>
|
||||||
|
<td class="bg-brown">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand2Value[2]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-brown">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand2Value[3]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="4" class="bg-brown">非夏日契約</td>
|
||||||
|
<td class="bg-brown">-</td>
|
||||||
|
<td class="bg-brown">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand2Value[4]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="4" class="bg-brown">週六半尖峰契約</td>
|
||||||
|
<td class="bg-brown">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand2Value[5]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-brown">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand2Value[6]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="4" class="bg-brown">離峰契約</td>
|
||||||
|
<td class="bg-brown">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand2Value[7]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-brown">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand2Value[8]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td rowspan="9">流動電費</td>
|
||||||
|
<td rowspan="4">週一~週五</td>
|
||||||
|
<td rowspan="2" class="bg-red">尖峰時間</td>
|
||||||
|
<td class="bg-lightred" width="50">夏月</td>
|
||||||
|
<td class="bg-lightred" width="120">09:00 ~ 24:00</td>
|
||||||
|
<td rowspan="9">每度</td>
|
||||||
|
<td class="bg-lightred">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand2Value[9]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-lightred">-</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="bg-lightred">非夏月</td>
|
||||||
|
<td class="bg-lightred">06:00 ~ 11:00<br />14:00~24:00</td>
|
||||||
|
<td class="bg-lightred">-</td>
|
||||||
|
<td class="bg-lightred">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand2Value[10]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td rowspan="2" class="bg-green">離峰時間</td>
|
||||||
|
<td class="bg-lightgreen">夏月</td>
|
||||||
|
<td class="bg-lightgreen">00:00 ~ 09:00</td>
|
||||||
|
<td class="bg-lightgreen">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand2Value[11]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-lightgreen">-</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="bg-lightgreen">非夏月</td>
|
||||||
|
<td class="bg-lightgreen">
|
||||||
|
00:00 ~ 06:00<br />
|
||||||
|
11:00 ~ 14:00
|
||||||
|
</td>
|
||||||
|
<td class="bg-lightgreen">-</td>
|
||||||
|
<td class="bg-lightgreen">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand2Value[12]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td rowspan="4">週六</td>
|
||||||
|
<td rowspan="2" class="bg-yellow">半尖峰時間</td>
|
||||||
|
<td class="bg-lightyellow">夏月</td>
|
||||||
|
<td class="bg-lightyellow">09:00 ~ 24:00</td>
|
||||||
|
<td class="bg-lightyellow">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand2Value[13]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-lightyellow">-</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="bg-lightyellow">非夏月</td>
|
||||||
|
<td class="bg-lightyellow">
|
||||||
|
06:00 ~ 11:00<br />
|
||||||
|
14:00 ~ 24:00
|
||||||
|
</td>
|
||||||
|
<td class="bg-lightyellow">-</td>
|
||||||
|
<td class="bg-lightyellow">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand2Value[14]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td rowspan="2" class="bg-green">離峰時間</td>
|
||||||
|
<td class="bg-lightgreen">夏月</td>
|
||||||
|
<td class="bg-lightgreen">00:00 ~ 09:00</td>
|
||||||
|
<td class="bg-lightgreen">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand2Value[15]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-lightgreen">-</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="bg-lightgreen">非夏月</td>
|
||||||
|
<td class="bg-lightgreen">00:00 ~ 06:00<br />11:00 ~ 14:00</td>
|
||||||
|
<td class="bg-lightgreen">-</td>
|
||||||
|
<td class="bg-lightgreen">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand2Value[16]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>週六、週日及離峰日</td>
|
||||||
|
<td class="bg-green">離峰時間</td>
|
||||||
|
<td colspan="2" class="bg-lightgreen">全日</td>
|
||||||
|
<td class="bg-lightgreen">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand2Value[17]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-lightgreen">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand2Value[18]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand2isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<table class="">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th colspan="8" class="">
|
||||||
|
<div style="display: flex; justify-content: space-between">
|
||||||
|
標準型時間電價三段式
|
||||||
|
<el-button-group>
|
||||||
|
<el-button
|
||||||
|
type="warning"
|
||||||
|
plain
|
||||||
|
:icon="Edit"
|
||||||
|
v-if="!stand3isEditing"
|
||||||
|
@click.stop.prevent="stand3isEditing = true"
|
||||||
|
>編輯</el-button
|
||||||
|
>
|
||||||
|
<template v-else>
|
||||||
|
<el-button
|
||||||
|
type="warning"
|
||||||
|
plain
|
||||||
|
:icon="CircleCheck"
|
||||||
|
@click.stop.prevent="stand3isEditing = false"
|
||||||
|
>確認</el-button
|
||||||
|
>
|
||||||
|
<el-button
|
||||||
|
type="warning"
|
||||||
|
plain
|
||||||
|
:icon="CircleClose"
|
||||||
|
@click.stop.prevent="onCancel('stand3')"
|
||||||
|
>取消</el-button
|
||||||
|
>
|
||||||
|
</template>
|
||||||
|
</el-button-group>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td colspan="6" class="">分類</td>
|
||||||
|
<td class="">夏月<br />(6/1~9/30)</td>
|
||||||
|
<td class="">非夏月<br />(夏月以外的時間)</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td rowspan="6" class="bg-brown">基本電費</td>
|
||||||
|
<td colspan="2" rowspan="2" class="bg-brown">按戶計收</td>
|
||||||
|
<td colspan="2" class="bg-brown">單相</td>
|
||||||
|
<td rowspan="2" class="bg-brown">每戶每月</td>
|
||||||
|
<td colspan="2" class="bg-brown">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand3Value[0]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="2" class="bg-brown">三相</td>
|
||||||
|
<td colspan="2" class="bg-brown">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand3Value[1]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="4" class="bg-brown">經常契約</td>
|
||||||
|
<td rowspan="4" class="bg-brown">每瓩每月</td>
|
||||||
|
<td class="bg-brown">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand3Value[2]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-brown">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand3Value[3]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="4" class="bg-brown">非夏日契約</td>
|
||||||
|
<td class="bg-brown">-</td>
|
||||||
|
<td class="bg-brown">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand3Value[4]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="4" class="bg-brown">週六半尖峰契約</td>
|
||||||
|
<td class="bg-brown">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand3Value[5]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-brown">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand3Value[6]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="4" class="bg-brown">離峰契約</td>
|
||||||
|
<td class="bg-brown">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand3Value[7]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-brown">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand3Value[8]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td rowspan="10">流動電費</td>
|
||||||
|
<td rowspan="5">週一~週五</td>
|
||||||
|
<td class="bg-red">尖峰時間</td>
|
||||||
|
<td class="bg-lightred" width="50">夏月</td>
|
||||||
|
<td class="bg-lightred" width="120">16:00 ~ 22:00</td>
|
||||||
|
<td rowspan="10">每度</td>
|
||||||
|
<td class="bg-lightred">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand3Value[9]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-lightred">-</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td rowspan="2" class="bg-yellow">半尖峰時間</td>
|
||||||
|
<td class="bg-lightyellow">夏月</td>
|
||||||
|
<td class="bg-lightyellow">09:00 ~ 16:00<br />22:00 ~ 24:00</td>
|
||||||
|
<td class="bg-lightyellow">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand3Value[10]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-lightyellow">-</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="bg-lightyellow">非夏月</td>
|
||||||
|
<td class="bg-lightyellow">06:00 ~ 11:00<br />14:00 ~ 24:00</td>
|
||||||
|
<td class="bg-lightyellow">-</td>
|
||||||
|
<td class="bg-lightyellow">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand3Value[11]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td rowspan="2" class="bg-green">離峰時間</td>
|
||||||
|
<td class="bg-lightgreen">夏月</td>
|
||||||
|
<td class="bg-lightgreen">00:00 ~ 09:00</td>
|
||||||
|
<td class="bg-lightgreen">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand3Value[12]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-lightgreen">-</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="bg-lightgreen">非夏月</td>
|
||||||
|
<td class="bg-lightgreen">
|
||||||
|
00:00 ~ 06:00<br />
|
||||||
|
11:00 ~ 14:00
|
||||||
|
</td>
|
||||||
|
<td class="bg-lightgreen">-</td>
|
||||||
|
<td class="bg-lightgreen">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand3Value[13]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td rowspan="4">週六</td>
|
||||||
|
<td rowspan="2" class="bg-yellow">半尖峰時間</td>
|
||||||
|
<td class="bg-lightyellow">夏月</td>
|
||||||
|
<td class="bg-lightyellow">09:00 ~ 24:00</td>
|
||||||
|
<td class="bg-lightyellow">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand3Value[14]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-lightyellow">-</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="bg-lightyellow">非夏月</td>
|
||||||
|
<td class="bg-lightyellow">
|
||||||
|
06:00 ~ 11:00<br />
|
||||||
|
14:00 ~ 24:00
|
||||||
|
</td>
|
||||||
|
<td class="bg-lightyellow">-</td>
|
||||||
|
<td class="bg-lightyellow">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand3Value[15]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td rowspan="2" class="bg-green">離峰時間</td>
|
||||||
|
<td class="bg-lightgreen">夏月</td>
|
||||||
|
<td class="bg-lightgreen">00:00 ~ 09:00</td>
|
||||||
|
<td class="bg-lightgreen">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand3Value[16]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-lightgreen">-</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="bg-lightgreen">非夏月</td>
|
||||||
|
<td class="bg-lightgreen">00:00 ~ 06:00<br />11:00 ~ 14:00</td>
|
||||||
|
<td class="bg-lightgreen">-</td>
|
||||||
|
<td class="bg-lightgreen">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand3Value[17]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>週日及離峰日</td>
|
||||||
|
<td class="bg-green">離峰時間</td>
|
||||||
|
<td colspan="2" class="bg-lightgreen">全日</td>
|
||||||
|
<td class="bg-lightgreen">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand3Value[18]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="bg-lightgreen">
|
||||||
|
<el-input
|
||||||
|
type="number"
|
||||||
|
v-model.number="stand3Value[19]"
|
||||||
|
style="width: 140px"
|
||||||
|
:disabled="!stand3isEditing"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref } from "vue";
|
||||||
|
import { Edit, CircleClose, CircleCheck } from "@element-plus/icons-vue";
|
||||||
|
|
||||||
|
const stand2isEditing = ref(false);
|
||||||
|
const stand3isEditing = ref(false);
|
||||||
|
const stand2Value = ref([
|
||||||
|
129.1, 262.5, 236.2, 173.2, 173.2, 47.2, 34.6, 47.2, 34.6, 5.54, 5.39, 2.27,
|
||||||
|
2.15, 2.76, 2.65, 2.27, 2.15, 2.27, 2.15,
|
||||||
|
]);
|
||||||
|
const stand3Value = ref([
|
||||||
|
129.1, 262.5, 236.2, 173.2, 173.2, 173.2, 47.2, 34.6, 47.2, 34.6, 8.12, 5.02,
|
||||||
|
4.86, 2.23, 2.12, 2.5, 2.4, 2.23, 2.12, 2.23, 2.12,
|
||||||
|
]);
|
||||||
|
|
||||||
|
const onCancel = (sheet: string) => {
|
||||||
|
if(sheet == "stand2"){
|
||||||
|
stand2isEditing.value = false;
|
||||||
|
stand2Value.value = [
|
||||||
|
129.1, 262.5, 236.2, 173.2, 173.2, 47.2, 34.6, 47.2, 34.6, 5.54, 5.39, 2.27,
|
||||||
|
2.15, 2.76, 2.65, 2.27, 2.15, 2.27, 2.15,
|
||||||
|
];
|
||||||
|
}else{
|
||||||
|
stand3isEditing.value = false;
|
||||||
|
stand3Value.value = [
|
||||||
|
129.1, 262.5, 236.2, 173.2, 173.2, 173.2, 47.2, 34.6, 47.2, 34.6, 8.12, 5.02,
|
||||||
|
4.86, 2.23, 2.12, 2.5, 2.4, 2.23, 2.12, 2.23, 2.12,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
h2 {
|
||||||
|
font-size: 1.2em;
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
}
|
||||||
|
th,
|
||||||
|
td {
|
||||||
|
border: 1px solid #9c9a97;
|
||||||
|
padding: 0.7rem;
|
||||||
|
text-align: center;
|
||||||
|
font-weight: 600;
|
||||||
|
background: #e9e2d1;
|
||||||
|
}
|
||||||
|
th {
|
||||||
|
font-size: 1.2em;
|
||||||
|
line-height: 2;
|
||||||
|
background: #f3ac0a;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
td {
|
||||||
|
font-size: 1em;
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
.bg-brown {
|
||||||
|
background: #d8cdb2;
|
||||||
|
}
|
||||||
|
.bg-red {
|
||||||
|
background: #ce1c45;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.bg-lightred {
|
||||||
|
background: #fee5dd;
|
||||||
|
}
|
||||||
|
.bg-green {
|
||||||
|
background: #4da62c;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.bg-lightgreen {
|
||||||
|
background: #dae9c9;
|
||||||
|
}
|
||||||
|
.bg-yellow {
|
||||||
|
background: #eeb612;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.bg-lightyellow {
|
||||||
|
background: #f3e5a3;
|
||||||
|
}
|
||||||
|
</style>
|
226
src/views/EnergyChart.vue
Normal file
226
src/views/EnergyChart.vue
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
<template>
|
||||||
|
<el-row :gutter="20">
|
||||||
|
<el-col :span="10">
|
||||||
|
<el-card style="border-radius: 8px">
|
||||||
|
<h3 class="">用電即時分佈</h3>
|
||||||
|
<EnergySankey />
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="14">
|
||||||
|
<h3 class="" style="margin-top: 15px">即時需量</h3>
|
||||||
|
<EnergyLine />
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<el-row :gutter="20">
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-row style="padding-right: 15px">
|
||||||
|
<el-col :span="12" v-for="(item, index) in statisticData">
|
||||||
|
<el-card
|
||||||
|
style="
|
||||||
|
width: 100%;
|
||||||
|
padding: 5px;
|
||||||
|
max-width: 480px;
|
||||||
|
border-radius: 0;
|
||||||
|
"
|
||||||
|
:key="index"
|
||||||
|
:class="{ 'bg-info': index == 0 || index == 3 || index == 4 }"
|
||||||
|
shadow="hover"
|
||||||
|
>
|
||||||
|
<el-statistic
|
||||||
|
:title="item.title"
|
||||||
|
:value="item.value"
|
||||||
|
:suffix="item.unit"
|
||||||
|
/>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-card style="border-radius: 8px; height: 100%">
|
||||||
|
<h3 class="">每月用電分析</h3>
|
||||||
|
<EnergyBar :chartData="monthlyElectricityData" />
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-card style="border-radius: 8px; height: 100%">
|
||||||
|
<h3 class="">每月碳排當量 (kgCO2e)</h3>
|
||||||
|
<EnergyBar :chartData="monthlyCarbonData" />
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<el-row :gutter="20">
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-card style="border-radius: 8px; height: 100%">
|
||||||
|
<h3 class="">每月計費度數 (kWh)</h3>
|
||||||
|
<EnergyBar :chartData="monthlyBillingData" />
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="16">
|
||||||
|
<el-card style="border-radius: 8px">
|
||||||
|
<h3 class="">區間計費度數 2025-03-01 ~ 2025-03-12</h3>
|
||||||
|
<EnergyBar :chartData="areaBillingData" />
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { onMounted, ref, computed } from "vue";
|
||||||
|
import EnergySankey from "../components/EnergySankey.vue";
|
||||||
|
import EnergyLine from "../components/EnergyLine.vue";
|
||||||
|
import EnergyBar from "../components/EnergyBar.vue";
|
||||||
|
|
||||||
|
const statisticData = ref([
|
||||||
|
{ title: "今年電費累計", value: 58792.56, unit: "元" },
|
||||||
|
{ title: "區間電費", value: 1234.78, unit: "元" },
|
||||||
|
{ title: "今年碳排當量累計", value: 3456.23, unit: "公斤" },
|
||||||
|
{ title: "區間碳排當量", value: 15.67, unit: "公斤" },
|
||||||
|
{ title: "今年用電度數", value: 1890.45, unit: "kWh" },
|
||||||
|
{ title: "區間用電度數", value: 123.9, unit: "kWh" },
|
||||||
|
]);
|
||||||
|
|
||||||
|
// 每月用電分析
|
||||||
|
const monthlyElectricityData = ref({
|
||||||
|
categories: [
|
||||||
|
"Jan",
|
||||||
|
"Feb",
|
||||||
|
"Mar",
|
||||||
|
"Apr",
|
||||||
|
"May",
|
||||||
|
"Jun",
|
||||||
|
"Jul",
|
||||||
|
"Aug",
|
||||||
|
"Sep",
|
||||||
|
"Oct",
|
||||||
|
"Nov",
|
||||||
|
"Dec",
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: "基本電量",
|
||||||
|
type: "bar",
|
||||||
|
data: [120, 100, 110, 130, 150, 160, 140, 150, 130, 120, 110, 130],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "流動電量",
|
||||||
|
type: "bar",
|
||||||
|
data: [80, 60, 70, 90, 100, 110, 90, 100, 80, 70, 60, 80],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "總電量",
|
||||||
|
type: "bar",
|
||||||
|
data: [200, 160, 180, 220, 250, 270, 230, 250, 210, 190, 170, 210],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
// 每月碳排當量
|
||||||
|
const monthlyCarbonData = ref({
|
||||||
|
categories: [
|
||||||
|
"Jan",
|
||||||
|
"Feb",
|
||||||
|
"Mar",
|
||||||
|
"Apr",
|
||||||
|
"May",
|
||||||
|
"Jun",
|
||||||
|
"Jul",
|
||||||
|
"Aug",
|
||||||
|
"Sep",
|
||||||
|
"Oct",
|
||||||
|
"Nov",
|
||||||
|
"Dec",
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: "碳排當量",
|
||||||
|
type: "bar",
|
||||||
|
data: [50, 40, 45, 55, 60, 65, 55, 60, 50, 45, 40, 50],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
// 每月計費度數 (kWh)
|
||||||
|
const monthlyBillingData = ref({
|
||||||
|
categories: [
|
||||||
|
"Jan",
|
||||||
|
"Feb",
|
||||||
|
"Mar",
|
||||||
|
"Apr",
|
||||||
|
"May",
|
||||||
|
"Jun",
|
||||||
|
"Jul",
|
||||||
|
"Aug",
|
||||||
|
"Sep",
|
||||||
|
"Oct",
|
||||||
|
"Nov",
|
||||||
|
"Dec",
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: "尖峰",
|
||||||
|
type: "bar",
|
||||||
|
data: [120, 100, 110, 130, 150, 160, 140, 150, 130, 120, 110, 130],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "半尖峰",
|
||||||
|
type: "bar",
|
||||||
|
data: [80, 60, 70, 90, 100, 110, 90, 100, 80, 70, 60, 80],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "離峰",
|
||||||
|
type: "bar",
|
||||||
|
data: [200, 160, 180, 220, 250, 270, 230, 250, 210, 190, 170, 210],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
// 區間計費度數
|
||||||
|
const areaBillingData = ref({
|
||||||
|
categories: [
|
||||||
|
"03-01",
|
||||||
|
"03-02",
|
||||||
|
"03-03",
|
||||||
|
"03-04",
|
||||||
|
"03-05",
|
||||||
|
"03-06",
|
||||||
|
"03-07",
|
||||||
|
"03-08",
|
||||||
|
"03-09",
|
||||||
|
"03-10",
|
||||||
|
"03-11",
|
||||||
|
"03-12",
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: "尖峰",
|
||||||
|
type: "bar",
|
||||||
|
data: [120, 100, 110, 130, 150, 160, 140, 150, 130, 120, 110, 130],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "半尖峰",
|
||||||
|
type: "bar",
|
||||||
|
data: [80, 60, 70, 90, 100, 110, 90, 100, 80, 70, 60, 80],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "離峰",
|
||||||
|
type: "bar",
|
||||||
|
data: [200, 160, 180, 220, 250, 270, 230, 250, 210, 190, 170, 210],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.el-row {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
h3 {
|
||||||
|
margin: 0;
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 15px;
|
||||||
|
color: #141414;
|
||||||
|
}
|
||||||
|
.bg-info {
|
||||||
|
background: rgb(224, 239, 255);
|
||||||
|
}
|
||||||
|
</style>
|
18
src/views/Home.vue
Normal file
18
src/views/Home.vue
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<template>
|
||||||
|
<div class="common-layout">
|
||||||
|
<el-container>
|
||||||
|
<el-header><Navbar /></el-header>
|
||||||
|
<el-main><router-view></router-view></el-main>
|
||||||
|
</el-container>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import Navbar from "../components/Navbar.vue";
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.el-header{
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
</style>
|
28
src/views/Register.vue
Normal file
28
src/views/Register.vue
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<template>
|
||||||
|
<div class="register">
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="12" :offset="6" class="">
|
||||||
|
|
||||||
|
<h2 class="title">能源管理系統 Energy Management System</h2>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script></script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.register {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: url(../assets/bg.jpg) no-repeat center center;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
}
|
||||||
|
.title {
|
||||||
|
font-family: "Microsoft YaHei";
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 26px;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
</style>
|
15
src/vite-env.d.ts
vendored
Normal file
15
src/vite-env.d.ts
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/// <reference types="vite/client" />
|
||||||
|
|
||||||
|
// 聲明 .vue 檔案可以被導入為 Vue 元件
|
||||||
|
declare module "*.vue" {
|
||||||
|
import type { DefineComponent } from "vue";
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types
|
||||||
|
const component: DefineComponent<{}, {}, any>;
|
||||||
|
export default component;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 聲明環境變數 ( .env 檔案)
|
||||||
|
interface ImportMetaEnv {
|
||||||
|
readonly VITE_APP_TITLE: string;
|
||||||
|
readonly VITE_API_URL: string;
|
||||||
|
}
|
14
tsconfig.app.json
Normal file
14
tsconfig.app.json
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"extends": "@vue/tsconfig/tsconfig.dom.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
||||||
|
|
||||||
|
/* Linting */
|
||||||
|
"strict": true,
|
||||||
|
"noUnusedLocals": true,
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
"noUncheckedSideEffectImports": true
|
||||||
|
},
|
||||||
|
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
|
||||||
|
}
|
7
tsconfig.json
Normal file
7
tsconfig.json
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"files": [],
|
||||||
|
"references": [
|
||||||
|
{ "path": "./tsconfig.app.json" },
|
||||||
|
{ "path": "./tsconfig.node.json" }
|
||||||
|
]
|
||||||
|
}
|
24
tsconfig.node.json
Normal file
24
tsconfig.node.json
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
||||||
|
"target": "ES2022",
|
||||||
|
"lib": ["ES2023"],
|
||||||
|
"module": "ESNext",
|
||||||
|
"skipLibCheck": true,
|
||||||
|
|
||||||
|
/* Bundler mode */
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"allowImportingTsExtensions": true,
|
||||||
|
"isolatedModules": true,
|
||||||
|
"moduleDetection": "force",
|
||||||
|
"noEmit": true,
|
||||||
|
|
||||||
|
/* Linting */
|
||||||
|
"strict": true,
|
||||||
|
"noUnusedLocals": true,
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
"noUncheckedSideEffectImports": true
|
||||||
|
},
|
||||||
|
"include": ["vite.config.ts"]
|
||||||
|
}
|
22
vite.config.ts
Normal file
22
vite.config.ts
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import { defineConfig } from "vite";
|
||||||
|
import vue from "@vitejs/plugin-vue";
|
||||||
|
import AutoImport from "unplugin-auto-import/vite";
|
||||||
|
import Components from "unplugin-vue-components/vite";
|
||||||
|
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
|
||||||
|
|
||||||
|
// https://vite.dev/config/
|
||||||
|
export default defineConfig({
|
||||||
|
base: 'https://192.168.0.206:8500/file/ibms_ems_front/',
|
||||||
|
build: {
|
||||||
|
emptyOutDir: true,
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
vue(),
|
||||||
|
AutoImport({
|
||||||
|
resolvers: [ElementPlusResolver()],
|
||||||
|
}),
|
||||||
|
Components({
|
||||||
|
resolvers: [ElementPlusResolver()],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user