Compare commits

...

10 Commits

Author SHA1 Message Date
hzz
90966a3c43 update 2025-09-29 16:25:52 +08:00
hzz
80daffe10b update 2024-10-09 09:52:08 +08:00
hzz
aa7caccffd update 2024-10-09 08:50:33 +08:00
hzz
4ddc4d76a3 update 2024-05-28 16:18:41 +08:00
hzz
1e4828f4e9 update 2024-04-02 10:55:01 +08:00
hzz
7ce173dc2f update 2024-03-08 14:28:41 +08:00
hzz
4520d7d612 update 2024-02-19 17:03:34 +08:00
hzz
34eda2a916 报警邮件设置 未完成 2024-02-18 17:03:29 +08:00
hzz
674198c8b8 添加授权管理 2024-01-24 08:51:28 +08:00
hzz
0d4eef91f0 更新告警邮件发送 2024-01-19 17:01:06 +08:00
23 changed files with 1148 additions and 37 deletions

View File

@ -1,5 +1,5 @@
# 页面标题
VITE_APP_TITLE = 若依管理系统
VITE_APP_TITLE = 物联大屏管理系统
# 开发环境配置
VITE_APP_ENV = 'development'

View File

@ -1,5 +1,5 @@
# 页面标题
VITE_APP_TITLE = 若依管理系统
VITE_APP_TITLE = 物联大屏管理系统
# 生产环境配置
VITE_APP_ENV = 'production'

View File

@ -7,7 +7,7 @@
<meta name="renderer" content="webkit">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="icon" href="/favicon.ico">
<title>若依管理系统</title>
<title>物联大屏管理系统</title>
<!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
<style>
html,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

34
src/api/activation.js Normal file
View File

@ -0,0 +1,34 @@
/*
* @FilePath: \wang-vue-work\src\api\activation.js
* @Author: 王路平
* @文件版本: V1.0.0
* @Date: 2023-01-16 08:22:42
* @Description:
*
* 版权信息 : 2023 by ${再登软件}, All Rights Reserved.
*/
import request from '@/utils/request'
// 获取激活文件信息
export function getServerInfos(query) {
return request({
url: '/license/getServerInfos',
method: 'post',
params: query,
})
}
// 获取时间信息
export function getLicenceDate() {
return request({
url: '/license/getLicenceDate',
method: 'get'
})
}
// 上传文件
export function uploadLicense(query) {
return request({
url: '/license/uploadLicense',
method: 'post',
params: query
})
}

47
src/api/alarm/index.js Normal file
View File

@ -0,0 +1,47 @@
import request from '@/utils/request'
//big/getScreen
//监控列表
export function getEmailList(query) {
return request({
url: '/system/email/list',
method: 'get',
params: query
})
}
//获取监控列表详情
export function getEmailInfo(query) {
return request({
url: '/system/email/getInfo',
method: 'get',
params: query
})
}
//添加监控列表
export function AddEmailAlarm(query) {
return request({
url: '/system/email/add',
method: 'post',
params: query
})
}
//修改监控列表
export function EditEmailAlarm(query) {
return request({
url: '/system/email/edit',
method: 'put',
params: query
})
}
//删除监控列表
export function DeleteEmailAlarm(query) {
return request({
url: '/system/email/remove?deviceId=' + query,
method: 'delete',
})
}

BIN
src/assets/logo/goat.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

View File

@ -2,11 +2,11 @@
<div class="sidebar-logo-container" :class="{ 'collapse': collapse }" :style="{ backgroundColor: sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }">
<transition name="sidebarLogoFade">
<router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
<img v-if="logo" :src="logo" class="sidebar-logo" />
<h1 v-else class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }}</h1>
<!-- <img v-if="logo" :src="logo" class="sidebar-logo" /> -->
<h1 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }}</h1>
</router-link>
<router-link v-else key="expand" class="sidebar-logo-link" to="/">
<img v-if="logo" :src="logo" class="sidebar-logo" />
<!-- <img v-if="logo" :src="logo" class="sidebar-logo" /> -->
<h1 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }}</h1>
</router-link>
</transition>
@ -15,7 +15,6 @@
<script setup>
import variables from '@/assets/styles/variables.module.scss'
import logo from '@/assets/logo/logo.png'
import useSettingsStore from '@/store/modules/settings'
defineProps({
@ -25,7 +24,7 @@ defineProps({
}
})
const title = ref('若依管理系统');
const title = import.meta.env.VITE_APP_TITLE;
const settingsStore = useSettingsStore();
const sideTheme = computed(() => settingsStore.sideTheme);
</script>

View File

@ -34,6 +34,7 @@ router.beforeEach((to, from, next) => {
router.addRoute(route) // 动态添加可访问路由表
}
})
console.log(router.getRoutes())
next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
})
}).catch(err => {

View File

@ -0,0 +1,217 @@
<template>
<base-dialog :title="prop.title" width="60%" :visible="prop.visible" :autoHeight="false" @open="handleOpen"
@handleConfirm="handleConfirm" @close="handleClose">
<div class="body">
<el-form :model="form" label-width="120px">
<el-form-item>
<template #label>
<span>
<el-tooltip content="多个邮箱之间用逗号','分隔" placement="top">
<el-icon><question-filled /></el-icon>
</el-tooltip>
发送邮箱
</span>
</template>
<el-input v-model="form.email" placeholder="邮箱" />
</el-form-item>
<el-form-item label="设备类型">
<el-select v-model="form.typeId" @change="typeChange" filterable placeholder="选择设备类型">
<el-option value="" label="请选择"></el-option>
<el-option v-for="item in monitorList" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="监控列表">
<el-select v-model="form.ids" :multiple="prop.type == 'add'?true:false" filterable placeholder="Select" style="width: 240px">
<el-option v-for="item in optionsList" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="邮件标题">
<el-input v-model="form.title" placeholder="备注" />
</el-form-item>
<el-form-item>
<template #label>
<span>
<el-tooltip content="邮件内容可以用特殊字符代替,$t:设备类型,$x:超标值,$y:超标事件,$z:超标位置传感器" placement="top">
<el-icon><question-filled /></el-icon>
</el-tooltip>
邮件内容
</span>
</template>
<el-input v-model="form.content" placeholder="备注" />
</el-form-item>
<el-form-item label="备注">
<el-input v-model="form.remark" placeholder="备注" />
</el-form-item>
<el-form-item label="是否启用">
<el-switch v-model="form.enable" size="large" style="margin-left: 24px" inline-prompt
:active-icon="Check" :inactive-icon="Close" active-value="启用" inactive-value="未启用" />
</el-form-item>
</el-form>
</div>
</base-dialog>
</template>
<script setup>
import { ref, watch, getCurrentInstance,onMounted } from 'vue'
import { Check, Close } from '@element-plus/icons-vue'
import { getDeptList } from '@/api/big/dept'
import {getEmailInfo,AddEmailAlarm,EditEmailAlarm,DeleteEmailAlarm} from '@/api/alarm/index'
import { getDeviceTypeList } from '@/api/big/deviceType'
import { getDeviceList } from '@/api/big/device'
const prop = defineProps({
visible: {
type: Boolean,
default: false,
},
title: {
type: String,
default: '提示',
},
type: {
type: String,
default: 'add',
},
})
let form = ref({
email: undefined,
typeId: undefined,
ids: undefined,
title: '',
content: undefined,
remark: undefined,
enable: '启用',
})
let monitorList = ref()
//
function remoteMethodTypeId() {
getDeviceTypeList({ pageSize: 100 }).then(res => {
if (res.code === 200) {
monitorList.value = res.rows.map(item => {
return {
label: item.desc,
value: item.desc
}
})
}
})
}
//
function typeChange(val) {
form.value.ids = []
DeviceList(val)
}
const optionsList = ref([])
const { proxy: ctx } = getCurrentInstance()
const handleClose = () => {
//baseFormRef.value.reset()
form.value = {
email: undefined,
typeId: undefined,
ids: undefined,
title: '',
content: undefined,
remark: undefined,
enable: '启用',
}
emit('closeDialog')
emit('refreshTable')
}
//
const handleOpen = () => {
if(prop.type == 'add') {
form.value = {
email: undefined,
typeId: undefined,
ids: undefined,
title: '',
content: undefined,
remark: undefined,
enable: '启用',
}
} else {
getEmailInfo({deviceId: prop.type}).then(res => {
form.value = res.data
form.value.ids = res.data.ids.split(',')
})
}
// getAddFormOptions()
}
//
const emit = defineEmits(['refreshTable', 'closeDialog','clearIds'])
// /
async function addDeductionInfo() {
emit('closeDialog')
//
if (prop.type == 'add') {
let return_form = JSON.parse(JSON.stringify(form.value))
return_form.ids = return_form.ids.join(',')
let { code, msg } = await AddEmailAlarm(return_form)
ctx.$message({
type: code === 200 ? 'success' : 'warning',
message: msg,
})
if (code === 200) {
//
emit('refreshTable')
emit('closeDialog')
}
} else { //
let { code, msg } = await EditEmailAlarm(form)
ctx.$message({
type: code === 200 ? 'success' : 'warning',
message: msg,
})
if (code === 200) {
//
emit('refreshTable')
emit('closeDialog')
}
}
}
//
const handleConfirm = () => {
addDeductionInfo()
}
/** 查询设备列表 */
function DeviceList(type) {
// console.log(JSON.stringify(queryParams.value));
getDeviceList({userId: 1,type}).then(res => {
optionsList.value = res.rows.map(item => {
return {
label: item.name,
value: item.id
}
})
});
}
onMounted(() => {
remoteMethodTypeId()
})
</script>
<style lang="scss" scoped>
.body {
height: 100%;
}
.img-preview {
max-width: 100%;
max-height: 100%;
display: block;
margin: 0 auto;
padding-top: 10px;
}
</style>

View File

@ -0,0 +1,217 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
<el-form-item label="设备名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入设备名称" clearable style="width: 200px"
@keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="机架号" prop="label">
<el-input v-model="queryParams.label" placeholder="请输入机架号" clearable style="width: 200px"
@keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="设备类型" prop="type">
<!-- <el-input v-model="queryParams.type" placeholder="请输入设备类型" clearable style="width: 200px"
@keyup.enter="handleQuery" /> -->
<el-select v-model="queryParams.type" value-key="label" style="width: 200px" filterable placeholder="选择设备类型" @keyup.enter="handleQuery">
<el-option value="" label="请选择"></el-option>
<el-option v-for="item in typeList" :key="item.value" :label="item.label" :value="item.label" />
</el-select>
</el-form-item>
<!-- <el-form-item label="部门名称" prop="dept">
<el-input v-model="queryParams.dept" placeholder="请输入部门名称" clearable style="width: 200px"
@keyup.enter="handleQuery" />
</el-form-item> -->
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd"
v-hasPermi="['alarm:send:add']">新增</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" v-hasPermi="['alarm:send:update']"
@click="handleUpdate(ids[0])">修改</el-button>
</el-col> -->
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" v-hasPermi="['alarm:send:del']"
@click="handleDelete">删除</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<!-- 表格数据 -->
<el-table v-loading="loading" :data="deviceList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" type="index" width="120" />
<!-- <el-table-column label="部门id" prop="id" width="120" /> -->
<el-table-column label="设备名称" prop="name" :show-overflow-tooltip="true" />
<el-table-column label="邮箱" prop="email" :show-overflow-tooltip="true" />
<!-- <el-table-column label="类型" prop="type" :show-overflow-tooltip="true" />
<el-table-column label="型号" prop="model" align="center" :show-overflow-tooltip="true" /> -->
<el-table-column label="是否启用" align="center" :show-overflow-tooltip="true">
<template #default="scope">
<el-tag v-if="scope.row.enable == '启用'" type="success">启用</el-tag>
<el-tag v-else type="warning">未启用</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="150">
<template #default="scope">
<!-- <el-tooltip content="修改" placement="top" v-if="scope.row.roleId !== 1">
<el-button link type="primary" v-hasPermi="['alarm:send:update']" icon="Edit"
@click="handleUpdate(scope.row.deviceId)"></el-button>
</el-tooltip> -->
<el-tooltip content="删除" placement="top" v-if="scope.row.userId !== 1">
<el-button link type="primary" icon="Delete" v-hasPermi="['alarm:send:del']"
@click="handleDelete(scope.row)"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" @pagination="getList" />
<add_edit @closeDialog="open = false" :type="type" :title="title" :visible="open"
@refreshTable="getList" />
<!-- <assemblyVue @closeDialog="assemblyOpen = false" :form="assemblyForm" :title="assemblyTitle" :visible="assemblyOpen"></assemblyVue>
<el-dialog v-model="imgDialogVisible">
<img w-full :src="dialogImageUrl" alt="Preview Image" class="img-preview" />
</el-dialog>
<devInfo ref="devInfoRight" @closeDialog="devinfoopen = false" :visible="devinfoopen" :form="devinfoForm" :title="devinfoTitle"></devInfo> -->
</div>
</template>
<script setup>
import { ref, reactive, toRefs, getCurrentInstance, onMounted } from 'vue'
import { Picture as IconPicture } from '@element-plus/icons-vue'
import { getDeviceList, delDevice } from '@/api/big/device'
import { getEmailList, getEmailInfo,AddEmailAlarm,EditEmailAlarm,DeleteEmailAlarm} from '@/api/alarm/index'
import useDeviceStore from '@/store/modules/device'
import add_edit from './components/add_edit.vue'
// import assemblyVue from './components/assembly'
// import devInfo from './components/devInfo.vue'
const store = useDeviceStore()
const { proxy } = getCurrentInstance();
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
name: '',
dept: '',
type: '',
label: '',
userId: 1,
},
});
const { queryParams, form } = toRefs(data);
// testScreen({}).then(res => {
// alert(JSON.stringify(res))
// })
let deviceList = ref([])
const open = ref(false);
const loading = ref(false);
const showSearch = ref(false);
const ids = ref([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const title = ref("");
const file_list = ref([])
const type = ref("add");
const typeList = ref([])
/** 查询设备列表 */
function getList() {
loading.value = true;
// console.log(JSON.stringify(queryParams.value));
getEmailList(queryParams.value).then(res => {
loading.value = false;
deviceList.value = res.rows;
total.value = res.total;
});
}
/** 搜索按钮操作 */
function handleQuery() {
getList();
}
/** 重置按钮操作 */
function resetQuery() {
proxy.resetForm("queryRef");
handleQuery();
}
/** 添加 */
function handleAdd() {
title.value = "添加发送计划";
type.value = "add";
open.value = true;
}
/** 修改 */
function handleUpdate(id) {
title.value = "修改设备类型";
type.value = id;
open.value = true;
}
/** 删除按钮操作 */
function handleDelete(row) {
let rows = deviceList.value.filter(item => ids.value.includes(item.deviceId));
const names = row.name || rows.map(item => item.name).join(',');
const deviceTypeIds = row.deviceId || ids.value.join(',');
proxy.$modal.confirm('是否确认删除名称为"' + names + '"的数据项?').then(function () {
return DeleteEmailAlarm(deviceTypeIds);
}).then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
}).catch(() => { });
}
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.deviceId);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
onMounted(() => {
getList();
})
</script>
<style lang="scss" scoped>
:deep(.el-table .el-table__cell) {
z-index: auto;
}
.img-preview {
max-width: 100%;
max-height: 100%;
display: block;
margin: 0 auto;
}
</style>

View File

@ -0,0 +1,207 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
<el-form-item label="设备名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入设备名称" clearable style="width: 200px"
@keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="机架号" prop="label">
<el-input v-model="queryParams.label" placeholder="请输入机架号" clearable style="width: 200px"
@keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="设备类型" prop="type">
<!-- <el-input v-model="queryParams.type" placeholder="请输入设备类型" clearable style="width: 200px"
@keyup.enter="handleQuery" /> -->
<el-select v-model="queryParams.type" value-key="label" style="width: 200px" filterable placeholder="选择设备类型"
@keyup.enter="handleQuery">
<el-option value="" label="请选择"></el-option>
<el-option v-for="item in typeList" :key="item.value" :label="item.label" :value="item.label" />
</el-select>
</el-form-item>
<!-- <el-form-item label="部门名称" prop="dept">
<el-input v-model="queryParams.dept" placeholder="请输入部门名称" clearable style="width: 200px"
@keyup.enter="handleQuery" />
</el-form-item> -->
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<!-- <el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd"
v-hasPermi="['alarm:sendlog:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" v-hasPermi="['alarm:sendlog:update']"
@click="handleUpdate(ids[0])">修改</el-button>
</el-col> -->
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" v-hasPermi="['alarm:sendlog:del']"
@click="handleDelete">删除</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<!-- 表格数据 -->
<el-table v-loading="loading" :data="deviceList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" type="index" width="120" />
<!-- <el-table-column label="部门id" prop="id" width="120" /> -->
<el-table-column label="设备名称" prop="name" :show-overflow-tooltip="true" />
<el-table-column label="邮箱" prop="email" :show-overflow-tooltip="true" />
<!-- <el-table-column label="类型" prop="type" :show-overflow-tooltip="true" />
<el-table-column label="型号" prop="model" align="center" :show-overflow-tooltip="true" /> -->
<el-table-column label="是否启用" align="center" :show-overflow-tooltip="true">
<template #default="scope">
<el-tag v-if="scope.row.enable == '启用'" type="success">启用</el-tag>
<el-tag v-else type="warning">未启用</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="150">
<template #default="scope">
<!-- <el-tooltip content="修改" placement="top" v-if="scope.row.roleId !== 1">
<el-button link type="primary" v-hasPermi="['alarm:sendlog:update']" icon="Edit"
@click="handleUpdate(scope.row.deviceId)"></el-button>
</el-tooltip> -->
<el-tooltip content="删除" placement="top" v-if="scope.row.userId !== 1">
<el-button link type="primary" icon="Delete" v-hasPermi="['alarm:sendlog:del']"
@click="handleDelete(scope.row)"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > queryParams.pageSize" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</div>
</template>
<script setup>
import { ref, reactive, toRefs, getCurrentInstance, onMounted } from 'vue'
import { Picture as IconPicture } from '@element-plus/icons-vue'
import { getDeviceList, delDevice } from '@/api/big/device'
import { getEmailList, getEmailInfo, AddEmailAlarm, EditEmailAlarm, DeleteEmailAlarm } from '@/api/alarm/index'
import useDeviceStore from '@/store/modules/device'
const store = useDeviceStore()
const { proxy } = getCurrentInstance();
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
name: '',
dept: '',
type: '',
label: '',
userId: 1,
},
});
const { queryParams, form } = toRefs(data);
// testScreen({}).then(res => {
// alert(JSON.stringify(res))
// })
let deviceList = ref([])
const open = ref(false);
const loading = ref(false);
const showSearch = ref(false);
const ids = ref([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const title = ref("");
const file_list = ref([])
const type = ref("add");
const typeList = ref([])
/** 查询设备列表 */
function getList() {
loading.value = true;
// console.log(JSON.stringify(queryParams.value));
getEmailList(queryParams.value).then(res => {
loading.value = false;
deviceList.value = res.rows;
total.value = res.total;
});
}
/** 搜索按钮操作 */
function handleQuery() {
getList();
}
/** 重置按钮操作 */
function resetQuery() {
proxy.resetForm("queryRef");
handleQuery();
}
/** 添加 */
function handleAdd() {
title.value = "添加发送计划";
type.value = "add";
open.value = true;
}
/** 修改 */
function handleUpdate(id) {
title.value = "修改设备类型";
type.value = id;
open.value = true;
}
/** 删除按钮操作 */
function handleDelete(row) {
let rows = deviceList.value.filter(item => ids.value.includes(item.deviceId));
const names = row.name || rows.map(item => item.name).join(',');
const deviceTypeIds = row.deviceId || ids.value.join(',');
proxy.$modal.confirm('是否确认删除名称为"' + names + '"的数据项?').then(function () {
return DeleteEmailAlarm(deviceTypeIds);
}).then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
}).catch(() => { });
}
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.deviceId);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
onMounted(() => {
getList();
})
</script>
<style lang="scss" scoped>
:deep(.el-table .el-table__cell) {
z-index: auto;
}
.img-preview {
max-width: 100%;
max-height: 100%;
display: block;
margin: 0 auto;
}
</style>

View File

@ -1,4 +1,3 @@
<template>
<base-dialog :title="prop.title" width="60%" :visible="prop.visible" :autoHeight="false" @open="handleOpen"
@handleConfirm="handleConfirm" @close="handleClose">
@ -14,7 +13,13 @@
<el-input v-model="prop.form.url" placeholder="网页路径" />
</el-form-item>
<el-form-item label="大屏图片">
<ImageUpload v-model="prop.form.img" :limit="1" />
<ImageUpload v-model="prop.form.img" :limit="1" :fileSize="1" />
</el-form-item>
<el-form-item label="大屏类型">
<el-select v-model="form.screenType">
<el-option v-for="dict in screen_type" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="备注">
<el-input v-model="prop.form.remark" placeholder="备注" />
@ -59,11 +64,11 @@ const prop = defineProps({
img: undefined,
releases: false,
path: undefined,
img: undefined,
},
}
})
const { proxy: ctx } = getCurrentInstance()
const { screen_type } = ctx.useDict("screen_type");
const dialogImageUrl = ref('')
const dialogVisible = ref(false)
const disabled = ref(false)

View File

@ -33,14 +33,7 @@
<!-- <el-table-column label="" prop="path" :show-overflow-tooltip="true" /> -->
<el-table-column label="大屏图片" align="center">
<template #default="scope">
<el-image :src="scope.row.img" :preview-src-list="[scope.row.img]" fit="cover"
style="width: 100px; height: 100px">
<template #error>
<div class="image-slot">
<el-icon size="100"><icon-picture /></el-icon>
</div>
</template>
</el-image>
<image-preview :src="scope.row.img" width="100px" height="100px" />
</template>
</el-table-column>
<el-table-column label="备注" prop="remark" :show-overflow-tooltip="true" width="180" />
@ -171,12 +164,7 @@ function getList() {
// console.log(JSON.stringify(queryParams.value));
getScreen(queryParams.value).then(res => {
loading.value = false;
screenList.value = res.rows.map(item => {
const regex = /^(http|https):\/\/[^ "]+$/;
let isTrue = regex.test(item.img);
item.img = isTrue ? item.img : import.meta.env.VITE_APP_BASE_API + item.img
return item
});
screenList.value = res.rows
total.value = res.total;
});
@ -221,6 +209,7 @@ function handleAdd() {
path: undefined,
img: undefined,
remark: undefined,
form: undefined,
};
file_list.value = []
type.value = "add";
@ -285,10 +274,29 @@ function handleSelectionChange(selection) {
multiple.value = !selection.length;
}
function param(obj) {
return Object.keys(obj)
.map(key => encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]))
.join('&');
}
const appendQuery = (url, key, value) => {
var options = key;
if (typeof options == 'string') {
options = {};
options[key] = value;
}
options = param(options);
if (url.includes('?')) {
url += '&' + options
} else {
url += '?' + options
}
return url;
}
/**前往大屏 */
const toScreen = (row) => {
window.open(row.url + '?hash=' + row.hash);
window.open(appendQuery(row.url,'hash',row.hash));
}
/**修改大屏发布状态 */

View File

@ -9,12 +9,12 @@
-->
<template>
<div class="app-container home">
<div class="title"> 物联大屏管理系统</div>
<div class="title"> {{title}}</div>
</div>
</template>
<script setup name="Index">
let title = import.meta.env.VITE_APP_TITLE;
</script>
<style scoped lang="scss">

View File

@ -1,7 +1,7 @@
<template>
<div class="login">
<el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
<h3 class="title">大屏后台管理系统</h3>
<h3 class="title">物联大屏管理系统</h3>
<el-form-item prop="username">
<el-input
v-model="loginForm.username"
@ -59,7 +59,7 @@
</el-form>
<!-- 底部 -->
<div class="el-login-footer">
<span>Copyright © 2018-2022 GOATS All Rights Reserved.</span>
<span>Copyright © 天津市再登软件有限公司 版权所有</span>
</div>
</div>
</template>
@ -76,7 +76,7 @@ const { proxy } = getCurrentInstance();
const loginForm = ref({
username: "admin",
password: "admin123",
password: "123456",
rememberMe: false,
code: "",
uuid: ""

View File

@ -1,7 +1,7 @@
<template>
<div class="register">
<el-form ref="registerRef" :model="registerForm" :rules="registerRules" class="register-form">
<h3 class="title">若依后台管理系统</h3>
<h3 class="title">物联后台管理系统</h3>
<el-form-item prop="username">
<el-input
v-model="registerForm.username"

View File

@ -0,0 +1,213 @@
<!-- -->
<template>
<div class="activation">
<!-- <el-steps class="steps" :active="active" finish-status="success" align-center>
<el-step title="服务器选择"></el-step>
<el-step title="步骤 2"></el-step>
<el-step title="步骤 3"></el-step>
</el-steps>
<div class="step-content" v-if="active == 0">
<Server @next="next"></Server>
</div>
<div class="step-content" v-if="active == 1">
1111
</div> -->
<el-form ref="form" :model="form" label-width="150px">
<el-form-item label="获取服务器信息">
<el-select v-model="form.osName" placeholder="请选择服务器">
<el-option label="windows" value="windows"></el-option>
<el-option label="linux" value="linux"></el-option>
</el-select>
<el-button @click="getInfos">确定</el-button>
</el-form-item>
<el-form-item label="">
<div>
<div style="width:400px; margin-top: 10px;">
<el-upload ref="upload" :limit="1" name="uploadFile" accept=".lic" :action="upload.url"
:disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess"
:auto-upload="false" drag>
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<!-- <div class="el-upload__tip text-center" slot="tip">
<span>仅允许导入txt格式文件</span>
</div> -->
</el-upload>
<el-button type="primary" @click="submitFileForm">注册</el-button>
</div>
</div>
</el-form-item>
<el-form-item label="有效期">
<div class="time-end" v-if="!time.check">
<h1>{{ time.issuedTime }}</h1>
<span>-</span>
<h1>{{ time.expiryTime }}</h1>
</div>
<div class="time-end" v-else>
<h1>尚未注册</h1>
</div>
</el-form-item>
</el-form>
</div>
</template>
<script>
//jsjsjson
//import from '';
// import server from '@/views/activationStepltem/serverInformation.vue'
import Server from "./serverInformation.vue";
import {
getServerInfos,
getLicenceDate,
uploadLicense,
} from "@/api/activation.js";
import { getToken } from "@/utils/auth";
export default {
//import使
components: {
Server,
},
data() {
//
return {
active: 0,
form: {
osName: "linux",
},
fileList: [],
//
time: {
expiryTime: "",
issuedTime: "",
check: 1,
},
//
upload: {
//
isUploading: false,
//
url: import.meta.env.VITE_APP_BASE_API + "/license/uploadLicense"
}
};
},
// data
computed: {},
//data
watch: {},
// - 访this
created() { },
// - 访DOM
mounted() {
this.getDate();
},
// -
beforeCreate() { },
// -
beforeMount() { },
// -
beforeUpdate() { },
// -
updated() { },
// -
beforeDestroy() { },
// -
destroyed() { },
//keep-alive
activated() { },
//
methods: {
next() {
if (this.active++ > 2) this.active = 0;
},
//
submitFileForm() {
this.$refs.upload.submit();
},
getDate() {
getLicenceDate().then((res) => {
this.time.check = res.check;
if (!res.check) {
this.time.expiryTime = res.expiryTime;
this.time.issuedTime = res.issuedTime;
}
});
},
getInfos() {
this.$modal.loading("正在导出数据,请稍后...");
getServerInfos(this.form).then((res) => {
console.log(res);
if (res.code == 200) {
const blob = new Blob([res.data], { type: 'text/plain;charset=utf-8' })
this.$download.saveAs(blob, "serverInfo.txt")
} else {
this.$modal.msgError(res.msg);
}
this.$modal.closeLoading();
})
},
handleFileUploadProgress(event, file, fileList) {
this.upload.isUploading = true;
},
//
handleFileSuccess(response, file, fileList) {
if (response.code == 200) {
this.upload.isUploading = false;
this.$refs.upload.clearFiles();
this.time.check = response.check;
this.time.expiryTime = response.expiryTime;
this.time.issuedTime = response.issuedTime;
this.$modal.msgSuccess(response.msg);
} else {
this.$modal.msgError(response.msg);
}
},
},
};
</script>
<style scoped>
.activation {
width: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding-top: 50px;
}
.steps {
width: 70%;
}
.step-content {
width: 100%;
}
.time-end {
color: red;
display: flex;
align-items: center;
height: 36px;
font-size: 50px;
/* justify-content: center; */
}
.time-end {
font-size: 20px;
-webkit-text-fill-color: transparent;
-webkit-text-stroke: 1px #000;
}
.time-end span {
margin: 0 20px;
}
</style>

View File

@ -0,0 +1,146 @@
<!--
* @FilePath: \wang-vue-work\src\views\activationStepItem\serverInformation.vue
* @Author: 王路平
* @文件版本: V1.0.0
* @Date: 2023-01-14 09:36:04
* @Description:
*
* 版权信息 : 2023 by ${再登软件}, All Rights Reserved.
-->
<!-- -->
<template>
<div class='sever'>
<ul class="select-box">
<li class="select-item windows" @click="okserver('windows')">
<div>
<!-- <el-image :src="src"></el-image>
-->
<div class="windows-class">
<svg-icon icon-class="windows" class-name='windows-class' />
</div>
<h4>windows</h4>
</div>
</li>
<li class="select-item linux" @click="okserver('linux')">
<div>
<svg-icon icon-class="linux" class-name='linux-class' />
<h4>linux</h4>
</div>
</li>
</ul>
</div>
</template>
<script>
//jsjsjson
//import from '';
export default {
//import使
components: {},
data() {
//
return {
}
},
// data
computed: {},
//data
watch: {},
// - 访this
created() {
},
// - 访DOM
mounted() {
},
// -
beforeCreate() {
},
// -
beforeMount() {
},
// -
beforeUpdate() {
},
// -
updated() {
},
// -
beforeDestroy() {
},
// -
destroyed() {
},
//keep-alive
activated() {
},
//
methods: {
okserver(name){
console.log(name);
this.$emit('next')
}
}
}
</script>
<style scoped>
.sever{
display: flex;
justify-content: center;
align-items: center;
width: 100%;
}
.select-box{
display: flex;
justify-content: space-around;
align-items: center;
width: 80%;
padding: 0;
padding-top: 50px;
}
.select-item{
padding: 20px;
list-style: none;
border-radius: 20px;
border: 1px solid #8a8a8a;
/* box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1) */
/* box-shadow: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04) */
}
.select-item:hover {
/* box-shadow: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04) */
border: 1px solid #409EFF;
cursor: pointer
}
.select-item:hover .windows-class,
.select-item:hover .linux-class{
fill: #409EFF;
}
.select-item h4{
margin: 0;
margin-top:30px;
text-align: center;
}
.windows-class{
width: 200px;
height: 200px;
}
.linux-class{
width: 200px;
height: 200px;
}
</style>

View File

@ -77,7 +77,7 @@ function getRowKey(row) {
};
/** 关闭按钮 */
function close() {
const obj = { path: "/system/user" };
const obj = { path: "/org/user" };
proxy.$tab.closeOpenPage(obj);
};
/** 提交按钮 */

View File

@ -0,0 +1,16 @@
<template>
<div class="things-container">
<iframe src="http://localhost:4200" frameborder="0" width="100%" height="100%"></iframe>
</div>
</template>
<script setup>
</script>
<style lang="scss" scoped>
.things-container {
width: 100%;
height: calc(100vh - 84px);
background-color: #fff;
}
</style>

View File

@ -31,11 +31,12 @@ export default defineConfig(({ mode, command }) => {
proxy: {
// https://cn.vitejs.dev/config/#server-proxy
'/dev-api': {
target: 'http://192.168.110.238:8080',
target: 'http://192.168.10.98:9015',
// target: 'http://8.141.87.86:9015',
// target: 'http://192.168.110.90:10393/mock/5ce74738-f63f-4d21-af85-b1d132c6f6fd',
changeOrigin: true,
rewrite: (p) => p.replace(/^\/dev-api/, '')
}
},
}
},
//fix:error:stdin>:7356:1: warning: "@charset" must be the first rule in the file