download
parent
9dfe0ea3f0
commit
4762eeab6d
35
src/App.vue
35
src/App.vue
|
@ -1,59 +1,30 @@
|
|||
<template>
|
||||
<div class="common-layout">
|
||||
<el-container>
|
||||
<el-header v-if="state.showMenu">INNcom 清单生成器</el-header>
|
||||
<el-main><router-view /></el-main>
|
||||
</el-container>
|
||||
</div>
|
||||
<router-view />
|
||||
</template>
|
||||
<script>
|
||||
import { onUnmounted, reactive } from 'vue'
|
||||
import { onUnmounted } from 'vue'
|
||||
import { useRouter } from 'vue-router'
|
||||
import { pathMap, localGet } from '@/utils';
|
||||
export default {
|
||||
name: 'App',
|
||||
setup() {
|
||||
const noMenu = ['/login']
|
||||
const router = useRouter();
|
||||
const state = reactive({
|
||||
showMenu: true,
|
||||
currentPath: '/dashboard'
|
||||
})
|
||||
// 监听浏览器原生回退事件
|
||||
if (window.history && window.history.pushState) {
|
||||
history.pushState(null, null, document.URL);
|
||||
window.addEventListener('popstate', () => {
|
||||
if (!localGet('token')) {
|
||||
state.showMenu = false
|
||||
}
|
||||
}, false);
|
||||
}
|
||||
const unwatch = router.beforeEach((to, from, next) => {
|
||||
if (to.path == '/login') {
|
||||
// 如果路径是 /login 则正常执行
|
||||
next()
|
||||
} else {
|
||||
// 如果不是 /login,判断是否有 token
|
||||
if (!localGet('token')) {
|
||||
// 如果没有,则跳至登录页面
|
||||
if (!localGet('token') || !localGet('name')) {
|
||||
next({ path: '/login' })
|
||||
} else {
|
||||
// 否则继续执行
|
||||
next()
|
||||
}
|
||||
}
|
||||
state.showMenu = !noMenu.includes(to.path)
|
||||
state.currentPath = to.path
|
||||
document.title = pathMap[to.name]
|
||||
})
|
||||
|
||||
onUnmounted(() => {
|
||||
unwatch();
|
||||
})
|
||||
|
||||
return {
|
||||
state
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
import axios from "axios";
|
||||
import { pathMap, localGet, localRemove } from '@/utils';
|
||||
import { localGet, localRemove } from '@/utils';
|
||||
axios.defaults.withCredentials = true;
|
||||
import { ElMessage } from "element-plus";
|
||||
import router from "@/router/index";
|
||||
// 请求头,headers 信息
|
||||
axios.defaults.headers["X-Requested-With"] = "XMLHttpRequest";
|
||||
axios.defaults.headers = {
|
||||
name: localGet('name'),
|
||||
|
@ -15,8 +14,7 @@ axios.defaults.headers = {
|
|||
// 请求拦截器,内部根据返回值,重新组装,统一管理。
|
||||
axios.interceptors.response.use(
|
||||
(res) => {
|
||||
console.log(111,res);
|
||||
if(res.data.code === 2001) {
|
||||
if(res.data.code === 2001||res.data.code === 2002) {
|
||||
ElMessage.error(res.data.message || "401 Unauthorized");
|
||||
router.push({ path: "/login" });
|
||||
localRemove('token');
|
||||
|
@ -37,17 +35,26 @@ export function postJsonRequest(url, params) {
|
|||
method: "post",
|
||||
url: url,
|
||||
data: params,
|
||||
// responseType: 'arraybuffer',
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
});
|
||||
}
|
||||
export function downloadRequest(url, params) {
|
||||
return axios({
|
||||
method: "post",
|
||||
url: url,
|
||||
data: params,
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
"Content-Type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||||
},
|
||||
});
|
||||
}
|
||||
// get请求
|
||||
export function getRequest(url, params) {
|
||||
return axios({
|
||||
method: "get",
|
||||
// responseType: 'arraybuffer',
|
||||
params: {
|
||||
...params,
|
||||
},
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
import {
|
||||
getRequest,
|
||||
postJsonRequest,
|
||||
deleteRequest,
|
||||
putRequest
|
||||
postJsonRequest,downloadRequest
|
||||
} from './api.js';
|
||||
const myApi = {
|
||||
|
||||
getProjects(params) {
|
||||
return postJsonRequest('/api/honeywell/inncon/list/project', params);
|
||||
},
|
||||
|
||||
download(params) {
|
||||
return downloadRequest('/api/honeywell/inncon/list/project', params);
|
||||
}
|
||||
}
|
||||
export default myApi;
|
||||
|
|
|
@ -17,8 +17,6 @@ export function localRemove(key) {
|
|||
|
||||
export const pathMap = {
|
||||
login: '登录',
|
||||
home: 'INNcom 清单生成器',
|
||||
project: 'INNcom 清单生成器',
|
||||
room: 'INNcom 清单生成器',
|
||||
weather: 'INNcom 清单生成器',
|
||||
home: '项目管理',
|
||||
room: '房型管理',
|
||||
}
|
|
@ -1,17 +1,28 @@
|
|||
<template>
|
||||
<el-card class="home-div">
|
||||
<el-card class="card-div">
|
||||
<el-button :icon="Plus" circle size="large" @click="open_project" />
|
||||
</el-card>
|
||||
<el-card class="card-div" v-for="(item, index) in projects" :key="index">
|
||||
<p class="project-title">{{ item.name }}</p>
|
||||
<p>{{ item.description }}</p>
|
||||
<el-button type="primary"
|
||||
@click="router.push({ name: 'room', query: { project_name: item.name } })">管理</el-button>
|
||||
<el-button type="success" @click="openUpdateDialog(item)">编辑</el-button>
|
||||
<el-button type="danger" @click="openRemove(item)">删除</el-button>
|
||||
</el-card>
|
||||
</el-card>
|
||||
<el-container>
|
||||
<el-header>
|
||||
<el-card>
|
||||
项目管理
|
||||
<el-button type="danger" @click="logout">退出</el-button>
|
||||
</el-card>
|
||||
</el-header>
|
||||
<el-main>
|
||||
<el-card class="home-div">
|
||||
<el-card class="card-div">
|
||||
<el-button class="button_plus" :icon="Plus" circle size="large" @click="open_project" />
|
||||
</el-card>
|
||||
<el-card class="card-div" v-for="(item, index) in projects" :key="index">
|
||||
<p class="project-title">{{ item.name }}</p>
|
||||
<p>{{ item.description }}</p>
|
||||
<el-button type="primary"
|
||||
@click="router.push({ name: 'room', query: { project_name: item.name } })">管理</el-button>
|
||||
<el-button type="success" @click="openUpdateDialog(item)">编辑</el-button>
|
||||
<el-button type="danger" @click="openRemove(item)">删除</el-button>
|
||||
</el-card>
|
||||
</el-card>
|
||||
</el-main>
|
||||
</el-container>
|
||||
|
||||
<el-dialog v-model="add_project_info.enable" title="新增项目" width="500" center>
|
||||
<el-form :model="add_project_info">
|
||||
<el-form-item label="项目名称">
|
||||
|
@ -54,11 +65,16 @@ import { Plus } from "@element-plus/icons-vue";
|
|||
import { ElMessage, ElMessageBox } from "element-plus";
|
||||
import myApi from "@/api/myApi.js";
|
||||
import { useRouter } from 'vue-router'
|
||||
|
||||
import { localRemove } from '@/utils';
|
||||
const router = useRouter()
|
||||
|
||||
const projects = ref([]);
|
||||
const logout = () => {
|
||||
localRemove("name");
|
||||
localRemove("token");
|
||||
router.push('login');
|
||||
}
|
||||
|
||||
const projects = ref([]);
|
||||
|
||||
const open_project = () => {
|
||||
add_project_info.name = '';
|
||||
|
@ -85,7 +101,6 @@ const openUpdateDialog = (item) => {
|
|||
update_project_info.name = item.name;
|
||||
update_project_info.new_name = item.name;
|
||||
update_project_info.description = item.description;
|
||||
update_project_info.content = item.content || null;
|
||||
update_project_info.enable = true;
|
||||
}
|
||||
|
||||
|
@ -121,7 +136,6 @@ const update_project_info = reactive({
|
|||
name: "",
|
||||
new_name: "",
|
||||
description: "",
|
||||
content: null,
|
||||
});
|
||||
|
||||
const update_project = async () => {
|
||||
|
@ -219,5 +233,11 @@ onMounted(() => {
|
|||
font-weight: 500;
|
||||
}
|
||||
|
||||
.button_plus {
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
font-size: 72px;
|
||||
}
|
||||
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -6,7 +6,8 @@
|
|||
<div class="title">登录</div>
|
||||
</div>
|
||||
</div>
|
||||
<el-form label-position="top" :rules="rules" :model="ruleForm" ref="loginForm" class="login-form">
|
||||
<el-form label-position="top" :rules="rules" :model="ruleForm" ref="loginForm" class="login-form" @keydown.enter.native="submitForm"
|
||||
>
|
||||
<el-form-item label="账号" prop="username">
|
||||
<el-input type="text" v-model.trim="ruleForm.username" autocomplete="off"></el-input>
|
||||
</el-form-item>
|
||||
|
@ -23,9 +24,7 @@
|
|||
|
||||
<script>
|
||||
import { reactive, ref, toRefs } from 'vue'
|
||||
import myApi from "@/api/myApi.js";
|
||||
import { localSet } from '@/utils';
|
||||
// const bcryptjs = require('bcryptjs')
|
||||
import bcrypt from 'bcryptjs'
|
||||
export default {
|
||||
name: 'Login',
|
||||
|
@ -49,7 +48,6 @@
|
|||
const submitForm = async () => {
|
||||
loginForm.value.validate(async (valid) => {
|
||||
if (valid) {
|
||||
// const res = await myApi.login(param);
|
||||
const encryptedPassword = await bcrypt.hash(state.ruleForm.password, 10);
|
||||
localSet('name', state.ruleForm.username);
|
||||
localSet('token', encryptedPassword);
|
||||
|
|
|
@ -3,7 +3,8 @@
|
|||
<el-card>
|
||||
<div>
|
||||
<el-button type="primary" @click="goHome">项目管理</el-button>
|
||||
<el-button type="success" @click="save_room">项目预览</el-button>
|
||||
<el-button type="success" @click="save_room">项目保存</el-button>
|
||||
<el-button type="success" @click="exc">项目预览</el-button>
|
||||
</div>
|
||||
<div class="ptoject-info">
|
||||
<div class="title">{{ project.name }}</div>
|
||||
|
@ -14,8 +15,12 @@
|
|||
<el-button type="primary" class="add-btn" :icon="Plus" @click="add_room">新建</el-button>
|
||||
</div>
|
||||
<div class="room-list">
|
||||
<div v-for="(item, index) in project.content" :key="index" class="room-span" @click="select_room(item)"
|
||||
:class="{ 'selectDiv': item.base_info.room_name === current_room_info.base_info.room_name }">
|
||||
<div v-for="item in project.content" :key="item.base_info.room_name" class="room-span"
|
||||
@click="select_room(item)" :class="{
|
||||
selectDiv:
|
||||
item.base_info.room_name ===
|
||||
current_room_info.base_info.room_name,
|
||||
}">
|
||||
<span>{{ item.base_info.room_name }}</span>
|
||||
<span>{{ item.base_info.room_count }}</span>
|
||||
<el-button :icon="Delete" circle @click="delet_room(item)" />
|
||||
|
@ -32,7 +37,7 @@
|
|||
</div>
|
||||
<div class="div300">
|
||||
<span>房型数量:</span>
|
||||
<el-input-number v-model="current_room_info.base_info.room_count" :min="1" :max="1000"
|
||||
<el-input-number v-model="current_room_info.base_info.room_count" :min="1" :max="99999"
|
||||
label="描述文字"></el-input-number>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -40,33 +45,13 @@
|
|||
<div class="div-2">
|
||||
<span class="name name2">灯光信息</span>
|
||||
<div class="flex-center bar">
|
||||
<p>开关回路</p>
|
||||
<p>
|
||||
<el-input-number v-model="current_room_info.light_info.switching_circuit" :min="1"
|
||||
:max="100"></el-input-number>
|
||||
</p>
|
||||
<p>0-10V调光</p>
|
||||
<p>
|
||||
<el-input-number v-model="current_room_info.light_info.dimming_10v" :min="1"
|
||||
:max="100"></el-input-number>
|
||||
</p>
|
||||
<p>前沿调光</p>
|
||||
<p>
|
||||
<el-input-number v-model="current_room_info.light_info.dimming_leading_edge" :min="1"
|
||||
:max="100"></el-input-number>
|
||||
</p>
|
||||
<p>后沿调光</p>
|
||||
<p>
|
||||
<el-input-number v-model="current_room_info.light_info.dimming_trailing_edge" :min="1"
|
||||
:max="100"></el-input-number>
|
||||
</p>
|
||||
<p>DALI灯</p>
|
||||
<p>
|
||||
<el-input-number v-model="current_room_info.light_info.DALI" :min="1"
|
||||
:max="100"></el-input-number>
|
||||
</p>
|
||||
|
||||
|
||||
<div v-for="item in lightArr" :key="item.label">
|
||||
<p>{{ item.label }}</p>
|
||||
<p>
|
||||
<el-input-number v-model="current_room_info.light_info[item.key]" :min="0"
|
||||
:max="999"></el-input-number>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="div-3">
|
||||
|
@ -74,30 +59,29 @@
|
|||
<div class="flex-center bar">
|
||||
<div>盘管类型</div>
|
||||
<el-radio-group v-model="current_room_info.fcu_info.fcu_type">
|
||||
<el-radio :value="item.value" :key="item.value" v-for="(item, index) in radioGroup1">{{
|
||||
item.label
|
||||
}}</el-radio>
|
||||
<el-radio :value="item.value" :key="item.value" v-for="item in radioGroup1">{{ item.label
|
||||
}}</el-radio>
|
||||
</el-radio-group>
|
||||
<el-radio-group v-model="current_room_info.fcu_info.pipe_type">
|
||||
<el-radio :value="item.value" :key="item.value" v-for="(item, index) in radioGroup2">{{
|
||||
item.label
|
||||
}}</el-radio>
|
||||
<el-radio :value="item.value" :key="item.value" v-for="item in radioGroup2">{{ item.label
|
||||
}}</el-radio>
|
||||
</el-radio-group>
|
||||
<el-radio-group v-model="current_room_info.fcu_info.valve_type">
|
||||
<el-radio :value="item.value" :key="item.value" v-for="(item, index) in radioGroup3">{{
|
||||
item.label
|
||||
}}</el-radio>
|
||||
<el-radio :value="item.value" :key="item.value" v-for="item in radioGroup3">{{ item.label
|
||||
}}</el-radio>
|
||||
</el-radio-group>
|
||||
<div>
|
||||
<p>风机盘管数量</p>
|
||||
<p>
|
||||
<el-input-number v-model="current_room_info.fcu_info.fcu_count" :min="1" :max="100"></el-input-number>
|
||||
<el-input-number v-model="current_room_info.fcu_info.fcu_count" :min="0"
|
||||
:max="999"></el-input-number>
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<p>温控器数量</p>
|
||||
<p>
|
||||
<el-input-number v-model="current_room_info.fcu_info.thermostat_count" :min="1" :max="100"></el-input-number>
|
||||
<el-input-number v-model="current_room_info.fcu_info.thermostat_count" :min="0"
|
||||
:max="999"></el-input-number>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -107,20 +91,21 @@
|
|||
<div class="flex-center bar">
|
||||
<div>面板类型</div>
|
||||
<el-radio-group v-model="current_room_info.panel_info.panel_type">
|
||||
<el-radio :value="item.value" :key="item.value" v-for="(item, index) in radioGroup4">{{
|
||||
item.label
|
||||
}}</el-radio>
|
||||
<el-radio :value="item.value" :key="item.value" v-for="item in radioGroup4">{{ item.label
|
||||
}}</el-radio>
|
||||
</el-radio-group>
|
||||
<div>
|
||||
<p>面板数量</p>
|
||||
<p>
|
||||
<el-input-number v-model="current_room_info.panel_info.panel_count" :min="1" :max="100"></el-input-number>
|
||||
<el-input-number v-model="current_room_info.panel_info.panel_count" :min="0"
|
||||
:max="999"></el-input-number>
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<p>按钮数量</p>
|
||||
<p>
|
||||
<el-input-number v-model="current_room_info.panel_info.panel_button_count" :min="1" :max="100"></el-input-number>
|
||||
<el-input-number v-model="current_room_info.panel_info.panel_button_count" :min="0"
|
||||
:max="999"></el-input-number>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -130,20 +115,21 @@
|
|||
<div class="flex-center bar">
|
||||
<div>窗帘类型</div>
|
||||
<el-radio-group v-model="current_room_info.curtain_info.curtain_type">
|
||||
<el-radio :value="item.value" :key="item.value" v-for="(item, index) in radioGroup5">{{
|
||||
item.label
|
||||
}}</el-radio>
|
||||
<el-radio :value="item.value" :key="item.value" v-for="item in radioGroup5">{{ item.label
|
||||
}}</el-radio>
|
||||
</el-radio-group>
|
||||
<div>
|
||||
<p>窗帘数量</p>
|
||||
<p>
|
||||
<el-input-number v-model="current_room_info.curtain_info.curtain_count" :min="1" :max="100"></el-input-number>
|
||||
<el-input-number v-model="current_room_info.curtain_info.curtain_count" :min="0"
|
||||
:max="999"></el-input-number>
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<p>窗纱数量</p>
|
||||
<p>
|
||||
<el-input-number v-model="current_room_info.curtain_info.sheer_curtain_count" :min="1" :max="100"></el-input-number>
|
||||
<el-input-number v-model="current_room_info.curtain_info.sheer_curtain_count" :min="0"
|
||||
:max="999"></el-input-number>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -152,23 +138,15 @@
|
|||
<span class="name name6">其他信息</span>
|
||||
<div class="con-div">
|
||||
<div class="flex-center bar">
|
||||
<div v-for="(item, i) in otherArr" :key="item.label">
|
||||
<div v-for="item in otherArr" :key="item.label">
|
||||
<p>{{ item.label }}</p>
|
||||
<p>
|
||||
<el-input-number v-model="current_room_info.other[item.key]" :min="1"
|
||||
:max="100"></el-input-number>
|
||||
<el-input-number v-model="current_room_info.other[item.key]" :min="0"
|
||||
:max="999"></el-input-number>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<el-checkbox-group v-model="current_room_info.other.Housekeeping" class="rules-label">
|
||||
<el-checkbox v-for="(item, i) in checkList" :label="item.label" :key="item.value"
|
||||
:value="item.value">
|
||||
{{ item.label }}
|
||||
</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="div-7">
|
||||
<span class="name name7">备注</span>
|
||||
|
@ -182,18 +160,14 @@
|
|||
</div>
|
||||
</template>
|
||||
<script setup>
|
||||
import { Delete } from '@element-plus/icons-vue'
|
||||
import { onMounted, reactive,ref } from 'vue'
|
||||
import { Plus } from '@element-plus/icons-vue'
|
||||
import { Delete } from "@element-plus/icons-vue";
|
||||
import { onMounted, reactive } from "vue";
|
||||
import { Plus } from "@element-plus/icons-vue";
|
||||
import myApi from "@/api/myApi.js";
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import { useRoute, useRouter } from "vue-router";
|
||||
import { ElMessage } from "element-plus";
|
||||
|
||||
import bcrypt from 'bcryptjs'
|
||||
|
||||
console.log(bcrypt.hashSync("aaa"))
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
const router = useRouter();
|
||||
const route = useRoute();
|
||||
|
||||
const project = reactive({
|
||||
name: "",
|
||||
|
@ -201,104 +175,114 @@ const project = reactive({
|
|||
content: [],
|
||||
});
|
||||
|
||||
const addData = reactive({
|
||||
const addData = reactive({
|
||||
base_info: {
|
||||
room_name: '',
|
||||
room_name: "",
|
||||
room_count: 1,
|
||||
desc: ''
|
||||
desc: "",
|
||||
},
|
||||
|
||||
light_info: {// 灯光信息
|
||||
light_info: {
|
||||
// 灯光信息
|
||||
switching_circuit: 0,
|
||||
dimming_10v: 0,
|
||||
dimming_leading_edge: 0,
|
||||
dimming_trailing_edge: 0,
|
||||
DALI: 0,
|
||||
},
|
||||
fcu_info: {// 盘管信息
|
||||
fcu_info: {
|
||||
// 盘管信息
|
||||
fcu_type: 0,
|
||||
pipe_type: 0,
|
||||
valve_type: 0,
|
||||
fcu_count: 0,
|
||||
thermostat_count: 0,
|
||||
},
|
||||
panel_info: {// 面板信息
|
||||
panel_info: {
|
||||
// 面板信息
|
||||
panel_type: 0,
|
||||
panel_count: 0,
|
||||
panel_button_count: 0,
|
||||
},
|
||||
curtain_info: {// 窗帘信息
|
||||
curtain_info: {
|
||||
// 窗帘信息
|
||||
curtain_type: 0,
|
||||
curtain_count: 0,
|
||||
sheer_curtain_count: 0,
|
||||
},
|
||||
other: {// 其他信息
|
||||
PIR: 1,
|
||||
PIR2: 1,
|
||||
Gate: 1,
|
||||
Window: 1,
|
||||
doorbell: 1,
|
||||
Housekeeping: ['DND', 'MUR'],
|
||||
other: {
|
||||
// 其他信息
|
||||
PIR: 0,
|
||||
PIR2: 0,
|
||||
Gate: 0,
|
||||
Window: 0,
|
||||
doorbell: 0,
|
||||
Housekeeping: 0,
|
||||
},
|
||||
|
||||
})
|
||||
|
||||
|
||||
});
|
||||
|
||||
const current_room_info = reactive({
|
||||
base_info: {
|
||||
room_name: '',
|
||||
room_name: "",
|
||||
room_count: 1,
|
||||
desc: ''
|
||||
desc: "",
|
||||
},
|
||||
|
||||
light_info: {// 灯光信息
|
||||
light_info: {
|
||||
// 灯光信息
|
||||
switching_circuit: 0,
|
||||
dimming_10v: 0,
|
||||
dimming_leading_edge: 0,
|
||||
dimming_trailing_edge: 0,
|
||||
DALI: 0,
|
||||
},
|
||||
fcu_info: {// 盘管信息
|
||||
fcu_info: {
|
||||
// 盘管信息
|
||||
fcu_type: 0,
|
||||
pipe_type: 0,
|
||||
valve_type: 0,
|
||||
fcu_count: 0,
|
||||
thermostat_count: 0,
|
||||
},
|
||||
panel_info: {// 面板信息
|
||||
panel_info: {
|
||||
// 面板信息
|
||||
panel_type: 0,
|
||||
panel_count: 0,
|
||||
panel_button_count: 0,
|
||||
},
|
||||
curtain_info: {// 窗帘信息
|
||||
curtain_info: {
|
||||
// 窗帘信息
|
||||
curtain_type: 0,
|
||||
curtain_count: 0,
|
||||
sheer_curtain_count: 0,
|
||||
},
|
||||
other: {// 其他信息
|
||||
PIR: 1,
|
||||
PIR2: 1,
|
||||
Gate: 1,
|
||||
Window: 1,
|
||||
doorbell: 1,
|
||||
Housekeeping: ['DND', 'MUR'],
|
||||
other: {
|
||||
// 其他信息
|
||||
PIR: 0,
|
||||
PIR2: 0,
|
||||
Gate: 0,
|
||||
Window: 0,
|
||||
doorbell: 0,
|
||||
Housekeeping: 0,
|
||||
},
|
||||
|
||||
})
|
||||
});
|
||||
|
||||
const get_project = async () => {
|
||||
const param = {
|
||||
action: 100,
|
||||
data: {
|
||||
name: route.query.project_name,
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
const res = await myApi.getProjects(param);
|
||||
if (res.code === 0) {
|
||||
project.name = res.data.name;
|
||||
project.description = res.data.description;
|
||||
if (res.data.content && Array.isArray(res.data.content) && res.data.content.length > 0) {
|
||||
if (
|
||||
res.data.content &&
|
||||
Array.isArray(res.data.content) &&
|
||||
res.data.content.length > 0
|
||||
) {
|
||||
project.content = res.data.content;
|
||||
} else {
|
||||
add_room();
|
||||
|
@ -310,165 +294,227 @@ const get_project = async () => {
|
|||
type: "warning",
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
const delet_room = (item) => {
|
||||
if (project.content.length === 1) {
|
||||
ElMessage.warning('至少保留一个。。')
|
||||
ElMessage.warning("至少保留一个。。");
|
||||
return;
|
||||
}
|
||||
project.content = project.content.filter(ele => {
|
||||
project.content = project.content.filter((ele) => {
|
||||
return ele.base_info.room_name !== item.base_info.room_name;
|
||||
})
|
||||
save_room();
|
||||
}
|
||||
});
|
||||
};
|
||||
onMounted(() => {
|
||||
get_project();
|
||||
});
|
||||
|
||||
const select_room = (item) => {
|
||||
for (const key in item) {
|
||||
console.log(key);
|
||||
current_room_info[key] = item[key];
|
||||
|
||||
}
|
||||
}
|
||||
};
|
||||
const add_room = () => {
|
||||
if (!Array.isArray(project.content)) {
|
||||
project.content = []
|
||||
project.content = [];
|
||||
}
|
||||
let target = JSON.parse(JSON.stringify(addData));
|
||||
target.base_info.room_name = "房型" + generateShortUUID();
|
||||
project.content.push(target);
|
||||
}
|
||||
};
|
||||
|
||||
const save_room = async () => {
|
||||
const param = {
|
||||
action: 1021,
|
||||
data: project
|
||||
}
|
||||
debugger;
|
||||
data: project,
|
||||
};
|
||||
const res = await myApi.getProjects(param);
|
||||
console.log(res);
|
||||
if (res.code === 0) {
|
||||
ElMessage({
|
||||
message: "更新成功",
|
||||
message: "保存成功",
|
||||
type: "success",
|
||||
});
|
||||
get_project();
|
||||
} else {
|
||||
ElMessage({
|
||||
message: res.message + '[' + res.data + ']',
|
||||
message: res.message + "[" + res.data + "]",
|
||||
type: "warning",
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const exc = async () => {
|
||||
const param = {
|
||||
action: 90001,
|
||||
data: project,
|
||||
};
|
||||
try {
|
||||
const res = await myApi.download(param);
|
||||
console.log(res);
|
||||
if (1) {
|
||||
// 文件下载成功
|
||||
const blob = new Blob([res.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
|
||||
const url = window.URL.createObjectURL(blob);
|
||||
const link = document.createElement("a");
|
||||
link.href = url;
|
||||
link.download = 'xx.xlsx'; // 设置下载的文件名
|
||||
document.body.appendChild(link);
|
||||
link.click();
|
||||
link.remove();
|
||||
window.URL.revokeObjectURL(url);
|
||||
ElMessage({
|
||||
message: "保存成功",
|
||||
type: "success",
|
||||
});
|
||||
} else {
|
||||
// 下载失败,显示错误信息
|
||||
ElMessage({
|
||||
message: res.message + "[" + res.data + "]",
|
||||
type: "warning",
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
// 捕获并处理可能的错误
|
||||
console.error("Error downloading file:", error);
|
||||
ElMessage({
|
||||
message: "下载文件时发生错误",
|
||||
type: "error",
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
function generateShortUUID() {
|
||||
let uuid = '';
|
||||
const possible = '0123456789ABCDEF';
|
||||
let uuid = "";
|
||||
const possible = "0123456789ABCDEF";
|
||||
|
||||
for (let i = 0; i < 8; i++) {
|
||||
uuid += possible.charAt(Math.floor(Math.random() * possible.length));
|
||||
}
|
||||
for (let i = 0; i < 8; i++) {
|
||||
uuid += possible.charAt(Math.floor(Math.random() * possible.length));
|
||||
}
|
||||
|
||||
return uuid;
|
||||
return uuid;
|
||||
}
|
||||
|
||||
|
||||
const goHome = () => {
|
||||
save_room();
|
||||
router.push('home');
|
||||
}
|
||||
router.push("home");
|
||||
};
|
||||
|
||||
|
||||
const lightArr = reactive([{
|
||||
label: '开关回路',
|
||||
value: 0,
|
||||
}, {
|
||||
label: '0-10V调光',
|
||||
value: 1,
|
||||
}, {
|
||||
label: '前沿调光',
|
||||
value: 2,
|
||||
}, {
|
||||
label: '后沿调光',
|
||||
value: 3,
|
||||
}, {
|
||||
label: 'DALI灯',
|
||||
value: 4,
|
||||
}])
|
||||
const otherArr = reactive([{
|
||||
label: '红外',
|
||||
value: 0,
|
||||
key: 'PIR'
|
||||
}, {
|
||||
label: '双鉴红外',
|
||||
value: 1,
|
||||
key: 'PIR2'
|
||||
}, {
|
||||
label: '门磁',
|
||||
value: 2,
|
||||
key: 'Gate'
|
||||
}, {
|
||||
label: '窗磁',
|
||||
value: 3,
|
||||
key: 'Window'
|
||||
}, {
|
||||
label: '门铃',
|
||||
value: 4,
|
||||
key: 'doorbell'
|
||||
}])
|
||||
const radioGroup1 = reactive([{
|
||||
label: '普通三速风机',
|
||||
value: 0,
|
||||
}, {
|
||||
label: '直流无刷风机',
|
||||
value: 1,
|
||||
}, {
|
||||
label: '三方协议风机',
|
||||
value: 2,
|
||||
}])
|
||||
const radioGroup2 = reactive([{
|
||||
label: '两管制',
|
||||
value: 0,
|
||||
}, {
|
||||
label: '四管制',
|
||||
value: 1,
|
||||
}])
|
||||
const radioGroup3 = reactive([{
|
||||
label: '两通阀',
|
||||
value: 0,
|
||||
}, {
|
||||
label: '调节阀',
|
||||
value: 1,
|
||||
}])
|
||||
const radioGroup4 = reactive([{
|
||||
label: '普通面板(无背光)',
|
||||
value: 0,
|
||||
}, {
|
||||
label: '普通面板(带背光)',
|
||||
value: 1,
|
||||
}, {
|
||||
label: '协议面板',
|
||||
value: 10,
|
||||
}])
|
||||
const radioGroup5 = reactive([{
|
||||
label: '干接点电机',
|
||||
value: 0,
|
||||
}, {
|
||||
label: '485电机',
|
||||
value: 1,
|
||||
}])
|
||||
const checkList = reactive([{
|
||||
label: 'DND',
|
||||
value: 'DND',
|
||||
}, {
|
||||
label: 'MUR',
|
||||
value: 'MUR',
|
||||
}, {
|
||||
label: 'SOS',
|
||||
value: 'SOS',
|
||||
}])
|
||||
const lightArr = reactive([
|
||||
{
|
||||
label: "开关回路",
|
||||
value: 0,
|
||||
key: "switching_circuit",
|
||||
},
|
||||
{
|
||||
label: "0-10V调光",
|
||||
value: 1,
|
||||
key: "dimming_10v",
|
||||
},
|
||||
{
|
||||
label: "前沿调光",
|
||||
value: 2,
|
||||
key: "dimming_leading_edge",
|
||||
},
|
||||
{
|
||||
label: "后沿调光",
|
||||
value: 3,
|
||||
key: "dimming_trailing_edge",
|
||||
},
|
||||
{
|
||||
label: "DALI灯",
|
||||
value: 4,
|
||||
key: "DALI",
|
||||
},
|
||||
]);
|
||||
const otherArr = reactive([
|
||||
{
|
||||
label: "红外",
|
||||
value: 0,
|
||||
key: "PIR",
|
||||
},
|
||||
{
|
||||
label: "双鉴红外",
|
||||
value: 1,
|
||||
key: "PIR2",
|
||||
},
|
||||
{
|
||||
label: "门磁",
|
||||
value: 2,
|
||||
key: "Gate",
|
||||
},
|
||||
{
|
||||
label: "窗磁",
|
||||
value: 3,
|
||||
key: "Window",
|
||||
},
|
||||
{
|
||||
label: "门铃",
|
||||
value: 4,
|
||||
key: "doorbell",
|
||||
},
|
||||
{
|
||||
label: "房务",
|
||||
value: 5,
|
||||
key: "Housekeeping",
|
||||
},
|
||||
]);
|
||||
const radioGroup1 = reactive([
|
||||
{
|
||||
label: "普通三速风机",
|
||||
value: 0,
|
||||
},
|
||||
{
|
||||
label: "直流无刷风机",
|
||||
value: 1,
|
||||
},
|
||||
{
|
||||
label: "三方协议风机",
|
||||
value: 2,
|
||||
},
|
||||
]);
|
||||
const radioGroup2 = reactive([
|
||||
{
|
||||
label: "两管制",
|
||||
value: 0,
|
||||
},
|
||||
{
|
||||
label: "四管制",
|
||||
value: 1,
|
||||
},
|
||||
]);
|
||||
const radioGroup3 = reactive([
|
||||
{
|
||||
label: "两通阀",
|
||||
value: 0,
|
||||
},
|
||||
{
|
||||
label: "调节阀",
|
||||
value: 1,
|
||||
},
|
||||
]);
|
||||
const radioGroup4 = reactive([
|
||||
{
|
||||
label: "普通面板(无背光)",
|
||||
value: 0,
|
||||
},
|
||||
{
|
||||
label: "普通面板(带背光)",
|
||||
value: 1,
|
||||
},
|
||||
{
|
||||
label: "协议面板",
|
||||
value: 10,
|
||||
},
|
||||
]);
|
||||
const radioGroup5 = reactive([
|
||||
{
|
||||
label: "干接点电机",
|
||||
value: 0,
|
||||
},
|
||||
{
|
||||
label: "485电机",
|
||||
value: 1,
|
||||
},
|
||||
]);
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.room-div {
|
||||
|
@ -517,7 +563,6 @@ const checkList = reactive([{
|
|||
background-color: #409eff;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
>div:nth-child(2) {
|
||||
|
@ -654,6 +699,5 @@ const checkList = reactive([{
|
|||
background: #409eff;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
}
|
||||
</style>
|
Loading…
Reference in New Issue