You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

612 lines
18 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="场景名称" prop="sceneName">
<el-input
v-model="queryParams.sceneName"
placeholder="请输入场景名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="所属租户" prop="tenantId">
<el-select v-model="queryParams.tenantId" placeholder="请选择">
<el-option
v-for="(tenant, index) in tenants"
:key="index"
:label="tenant.tenantName"
:value="tenant.tenantId"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="场景类型" prop="sceneModeId">
<el-select v-model="queryParams.sceneModeId" placeholder="请选择">
<el-option
v-for="(sceneMode, index) in sceneModes"
:key="index"
:label="sceneMode.sceneModeName"
:value="sceneMode.sceneModeId"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="通用标识" prop="defaultFlag">
<el-select v-model="queryParams.defaultFlag" placeholder="请选择">
<el-option
v-for="dict in dict.type.hw_scene_default_flag"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @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="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['business:scene:add']"
>新增
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['business:scene:edit']"
>修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['business:scene:remove']"
>删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['business:scene:export']"
>导出
</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="sceneList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center"/>
<el-table-column label="场景ID" align="center" prop="sceneId"/>
<el-table-column label="场景名称" align="center" prop="sceneName"/>
<el-table-column label="所属租户" align="center" prop="tenantName"/>
<el-table-column label="场景类型" align="center" prop="sceneModeName"/>
<el-table-column label="是否默认" align="center" prop="defaultFlag">
<template slot-scope="scope">
<dict-tag :options="dict.type.hw_scene_default_flag" :value="scope.row.defaultFlag"/>
</template>
</el-table-column>
<el-table-column label="保存周期(天)" align="center" prop="preserveTime"/>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['business:scene:edit']"
>修改
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['business:scene:remove']"
>删除
</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改场景信息对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="110px">
<el-form-item label="所属租户" prop="tenantId">
<el-select v-model="form.tenantId" placeholder="请选择">
<el-option
v-for="(tenant, index) in tenants"
:key="index"
:label="tenant.tenantName"
:value="tenant.tenantId"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="场景名称" prop="sceneName">
<el-input v-model="form.sceneName" placeholder="请输入场景名称"/>
</el-form-item>
<el-form-item label="场景类型" prop="sceneModeId">
<el-select v-model="form.sceneModeId" placeholder="请选择">
<el-option
v-for="(sceneMode, index) in sceneModes"
:key="index"
:label="sceneMode.sceneModeName"
:value="sceneMode.sceneModeId"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="是否默认" prop="defaultFlag">
<el-radio-group v-model="form.defaultFlag">
<el-radio
v-for="dict in dict.type.hw_scene_default_flag"
:key="dict.value"
:label="dict.value"
>{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="认证方式" prop="authMode">
<el-select v-model="form.authMode" placeholder="请选择认证方式">
<el-option
v-for="dict in dict.type.hw_scene_auth_mode"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="场景账号" prop="modeAccount">
<el-input v-model="form.modeAccount" placeholder="请输入场景账号"/>
</el-form-item>
<el-form-item label="场景密码" prop="modeKey">
<el-input v-model="form.modeKey" placeholder="请输入场景key"/>
</el-form-item>
<el-form-item label="保存周期(天)" prop="preserveTime">
<el-input v-model="form.preserveTime" placeholder="请输入保存周期(单位默认90天"/>
</el-form-item>
<el-form-item label="场景描述" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容"/>
</el-form-item>
<el-form-item label="场景图片" prop="scenePic">
<el-upload
single
:action="uploadImgUrl"
list-type="picture-card"
:limit="limit"
:on-success="handleUploadSuccess"
:before-upload="handleBeforeUpload"
:on-error="handleUploadError"
:on-exceed="handleExceed"
ref="imageUpload"
:on-remove="handleDeletePicture"
:show-file-list="true"
:headers="headers"
:file-list="fileList"
:on-preview="handlePictureCardPreview"
:class="{hide: this.fileList.length >= 1}"
>
<i class="el-icon-plus"></i>
</el-upload>
<!-- 上传提示 -->
<div class="el-upload__tip" slot="tip" v-if="showTip">
请上传
<template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b></template>
<template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b></template>
的文件
</div>
<el-dialog
:visible.sync="dialogVisible"
title="预览"
width="800"
append-to-body
>
<img
:src="dialogImageUrl"
style="display: block; max-width: 100%; margin: 0 auto"
/>
</el-dialog>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {listScene, getScene, delScene, addScene, updateScene, getSceneModes, getTenants} from "@/api/business/scene";
import {getToken} from "@/utils/auth";
export default {
name: "Scene",
dicts: ['hw_scene_auth_mode', 'hw_scene_default_flag'],
props: {
value: [String, Object, Array],
// 图片数量限制
limit: {
type: Number,
default: 1,
},
// 大小限制(MB)
fileSize: {
type: Number,
default: 5,
},
// 文件类型, 例如['png', 'jpg', 'jpeg']
fileType: {
type: Array,
default: () => ["png", "jpg", "jpeg"],
},
// 是否显示提示
isShowTip: {
type: Boolean,
default: true
}
},
data() {
return {
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 场景信息表格数据
sceneList: [],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
sceneModes: [],
tenants: [],
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
sceneName: null,
tenantId: null,
sceneModeId: null,
scenePic: null,
defaultFlag: null,
sceneStatus: null,
authMode: null,
modeAccount: null,
modeKey: null,
modeSecret: null,
preserveTime: null,
testPreserveTime: null,
sceneEnvironment: null,
sceneField: null
},
// 表单参数
form: {},
// 表单校验
rules: {
sceneName: [
{required: true, message: "场景名称不能为空", trigger: "blur"}
],
sceneModeId: [
{required: true, message: "场景类型关联表hw_scene_mode的scene_mode_id不能为空", trigger: "blur"}
],
defaultFlag: [
{required: true, message: "是否默认不能为空", trigger: "blur"}
],
sceneStatus: [
{required: true, message: "状态不能为空", trigger: "change"}
],
authMode: [
{required: true, message: "认证方式不能为空", trigger: "blur"}
],
modeKey: [
{required: true, message: "场景key不能为空", trigger: "blur"}
],
modeSecret: [
{required: true, message: "场景secret不能为空", trigger: "blur"}
],
preserveTime: [
{required: true, message: "保存周期(单位默认90天不能为空", trigger: "blur"}
],
testPreserveTime: [
{required: true, message: "测试环境保存周期(单位默认30天不能为空", trigger: "blur"}
],
},
number: 0,
uploadList: [],
dialogImageUrl: "",
dialogVisible: false,
hideUpload: false,
uploadImgUrl: process.env.VUE_APP_BASE_API + "/file/upload", // 上传的图片服务器地址
headers: {
Authorization: "Bearer " + getToken(),
},
fileList: [],
};
},
created() {
this.getTenants();
this.getSceneModes();
this.getList();
},
methods: {
getSceneModes() {
getSceneModes().then(response => {
this.sceneModes = response.data;
});
},
getTenants() {
getTenants().then(response => {
this.tenants = response.data;
});
},
/** 查询场景信息列表 */
getList() {
this.loading = true;
listScene(this.queryParams).then(response => {
this.sceneList = response.rows;
this.total = response.total;
this.loading = false;
});
},
// 取消按钮
cancel() {
this.open = false;
this.reset();
},
// 表单重置
reset() {
this.form = {
sceneId: null,
sceneName: null,
tenantId: null,
sceneModeId: null,
scenePic: null,
defaultFlag: null,
sceneStatus: null,
authMode: "1",
modeAccount: null,
modeKey: null,
modeSecret: null,
preserveTime: 90,
testPreserveTime: null,
remark: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null,
sceneEnvironment: null,
sceneField: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.sceneId)
this.single = selection.length !== 1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加场景信息";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const sceneId = row.sceneId || this.ids
this.fileList = [];
getScene(sceneId).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改场景信息";
if (response.data.scenePic != null) {
let previewFile = {};
previewFile.url = response.data.scenePic
this.fileList.push(previewFile);
}
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.sceneId != null) {
updateScene(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addScene(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const sceneIds = row.sceneId || this.ids;
this.$modal.confirm('是否确认删除场景信息编号为"' + sceneIds + '"的数据项?').then(function () {
return delScene(sceneIds);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {
});
},
/** 导出按钮操作 */
handleExport() {
this.download('business/scene/export', {
...this.queryParams
}, `scene_${new Date().getTime()}.xlsx`)
},
/**上传图片处理*/
// 上传前loading加载
handleBeforeUpload(file) {
let isImg = false;
if (this.fileType.length) {
let fileExtension = "";
if (file.name.lastIndexOf(".") > -1) {
fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
}
isImg = this.fileType.some(type => {
if (file.type.indexOf(type) > -1) return true;
if (fileExtension && fileExtension.indexOf(type) > -1) return true;
return false;
});
} else {
isImg = file.type.indexOf("image") > -1;
}
if (!isImg) {
this.$modal.msgError(`文件格式不正确, 请上传${this.fileType.join("/")}图片格式文件!`);
return false;
}
if (this.fileSize) {
const isLt = file.size / 1024 / 1024 < this.fileSize;
if (!isLt) {
this.$modal.msgError(`上传头像图片大小不能超过 ${this.fileSize} MB!`);
return false;
}
}
this.$modal.loading("正在上传图片,请稍候...");
this.number++;
},
checkPicture(file) {
},
// 文件个数超出
handleExceed() {
this.$modal.msgError(`上传文件数量不能超过 ${this.limit} !`);
},
// 上传成功回调
handleUploadSuccess(res, file) {
if (res.code === 200) {
this.uploadList.push(res.data.url);
this.uploadedSuccessfully();
} else {
this.number--;
this.$modal.closeLoading();
this.$modal.msgError(res.msg);
this.$refs.imageUpload.handleRemove(file);
this.uploadedSuccessfully();
}
},
// 上传结束处理
uploadedSuccessfully() {
if (this.number > 0 && this.uploadList.length === this.number) {
this.fileList = this.fileList.concat(this.uploadList);
this.uploadList = [];
this.number = 0;
this.form.scenePic = this.fileList[0];
// this.$emit("input", this.listToString(this.fileList));
this.$modal.closeLoading();
}
},
// 删除图片
handleDeletePicture(file) {
const findex = this.fileList.map(f => f.name).indexOf(file.name);
if (findex > -1) {
this.fileList.splice(findex, 1);
// this.$emit("input", this.listToString(this.fileList));
}
this.form.scenePic = '';
},
// 上传失败
handleUploadError() {
this.$modal.msgError("上传图片失败,请重试");
this.$modal.closeLoading();
},
// 预览
handlePictureCardPreview(file) {
this.dialogImageUrl = file.url;
this.dialogVisible = true;
},
// 对象转成指定字符串分隔
listToString(list, separator) {
let strs = "";
separator = separator || ",";
for (let i in list) {
if (list[i].url) {
strs += list[i].url.replace(this.baseUrl, "") + separator;
}
}
return strs != '' ? strs.substr(0, strs.length - 1) : '';
},
},
};
</script>