Commit f1258b20 authored by dupengyu's avatar dupengyu

站点 检测设备等修改

parent d7a61660
...@@ -20,26 +20,26 @@ export default function socket(handlerOptions) { ...@@ -20,26 +20,26 @@ export default function socket(handlerOptions) {
let heart = heartCheck(websocket) let heart = heartCheck(websocket)
websocket.onerror = function() { websocket.onerror = function () {
console.info("Websocket服务器连接错误") console.info("Websocket服务器连接错误")
} }
//连接成功建立的回调方法 //连接成功建立的回调方法
websocket.onopen = function() { websocket.onopen = function () {
console.info("Websocket连接成功") console.info("Websocket连接成功")
heart.start() heart.start()
onopen && onopen() onopen && onopen()
} }
//接收到消息的回调方法 //接收到消息的回调方法
websocket.onmessage = function(event) { websocket.onmessage = function (event) {
let message = event.data //消息内容 let message = event.data //消息内容
heart.reset() //重置心跳上传时间 heart.reset() //重置心跳上传时间
onmessage && onmessage(message) //消息业务处理 onmessage && onmessage(message) //消息业务处理
} }
//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。 //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function() { window.onbeforeunload = function () {
websocket.close() websocket.close()
} }
return websocket return websocket
...@@ -48,12 +48,12 @@ function heartCheck(websocket) { ...@@ -48,12 +48,12 @@ function heartCheck(websocket) {
return { return {
timeout: 15000, timeout: 15000,
timeoutObj: null, timeoutObj: null,
reset: function() { reset: function () {
clearTimeout(this.timeoutObj) clearTimeout(this.timeoutObj)
this.start() this.start()
}, },
start: function() { start: function () {
this.timeoutObj = setInterval(function() { this.timeoutObj = setInterval(function () {
// if(websocket.readyState==1){ // if(websocket.readyState==1){
websocket.send("HeartBeat") websocket.send("HeartBeat")
console.info("Websocket发送心跳:HeartBeat") console.info("Websocket发送心跳:HeartBeat")
...@@ -67,7 +67,7 @@ function heartCheck(websocket) { ...@@ -67,7 +67,7 @@ function heartCheck(websocket) {
export function receiveMessage(message) { export function receiveMessage(message) {
// 消息接收后处理逻辑 接口访问 // 消息接收后处理逻辑 接口访问
if (message != '连接成功') { if (message != '连接成功') {
let obj = JSON.parse( JSON.parse(message)) let obj = JSON.parse(JSON.parse(message))
EventBus.$emit('dialogAlarm', obj) EventBus.$emit('dialogAlarm', obj)
EventBus.$emit('autioPlay', obj) EventBus.$emit('autioPlay', obj)
} }
......
...@@ -54,9 +54,9 @@ ...@@ -54,9 +54,9 @@
> >
<el-option <el-option
v-for="item in backupModeSelect" v-for="item in backupModeSelect"
:key="item.id" :key="item.dictValue"
:label="item.dictValue" :label="item.dictLabel"
:value="item.id" :value="item.dictValue"
></el-option ></el-option
></el-select> ></el-select>
</el-form-item> </el-form-item>
...@@ -64,9 +64,9 @@ ...@@ -64,9 +64,9 @@
<el-select v-model="FSUForm.connectMode" placeholder="请选择通信方式"> <el-select v-model="FSUForm.connectMode" placeholder="请选择通信方式">
<el-option <el-option
v-for="item in connectModeSelect" v-for="item in connectModeSelect"
:key="item.id" :key="item.dictValue"
:label="item.dictValue" :label="item.dictLabel"
:value="item.id" :value="item.dictValue"
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
...@@ -74,9 +74,9 @@ ...@@ -74,9 +74,9 @@
<el-select v-model="FSUForm.equipType" placeholder="请选择设备类型"> <el-select v-model="FSUForm.equipType" placeholder="请选择设备类型">
<el-option <el-option
v-for="item in equipTypeSelect" v-for="item in equipTypeSelect"
:key="item.id" :key="item.dictValue"
:label="item.dictValue" :label="item.dictLabel"
:value="item.id" :value="item.dictValue"
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
...@@ -87,9 +87,9 @@ ...@@ -87,9 +87,9 @@
> >
<el-option <el-option
v-for="item in equipSubTypeSelect" v-for="item in equipSubTypeSelect"
:key="item.id" :key="item.dictValue"
:label="item.dictValue" :label="item.dictLabel"
:value="item.id" :value="item.dictValue"
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
......
This diff is collapsed.
...@@ -30,14 +30,23 @@ ...@@ -30,14 +30,23 @@
/> />
</el-form-item> </el-form-item>
<el-form-item label="站点所在局:" prop="siteArea"> <el-form-item label="站点所在局:" prop="siteArea">
<el-input <el-select v-model="stationForm.siteArea" value-key="railwayName" @change="handleSiteArea" placeholder="请选择漏缆">
<el-option
v-for="item in options"
:key="item.railwayName"
:label="item.railwayName"
:value="item"
></el-option>
</el-select>
<!-- <el-input
v-model="stationForm.siteArea" v-model="stationForm.siteArea"
placeholder="请输入站点所在局" placeholder="请输入站点所在局"
/> /> -->
</el-form-item> </el-form-item>
<el-form-item label="站点所在段号:" prop="siteSectionCode"> <el-form-item label="站点所在段号:" prop="siteSectionCode">
<el-input <el-input
v-model="stationForm.siteSectionCode" v-model="stationForm.siteSectionCode"
disabled
placeholder="请输入站点所在段号" placeholder="请输入站点所在段号"
/> />
</el-form-item> </el-form-item>
...@@ -77,7 +86,12 @@ ...@@ -77,7 +86,12 @@
</div> </div>
</template> </template>
<script> <script>
import { sitesave, railWaylist, updateSiteConf } from "../../api"; import {
sitesave,
railWaylist,
updateSiteConf,
sysRailwayBureaus,
} from "../../api";
import { successAlert, warningAlert } from "@/utils/alert"; import { successAlert, warningAlert } from "@/utils/alert";
export default { export default {
...@@ -138,12 +152,23 @@ export default { ...@@ -138,12 +152,23 @@ export default {
{ required: true, message: "请输入站点其他信息", trigger: "blur" }, { required: true, message: "请输入站点其他信息", trigger: "blur" },
], ],
}, },
options: [],
}; };
}, },
mounted() { mounted() {
this.getAllWay(); this.getAllWay();
this.handleSysRailwayBureaus();
}, },
methods: { methods: {
handleSiteArea(e){
console.log(e)
this.stationForm.siteArea = e.railwayName;
this.stationForm.siteSectionCode = e.railwayCode;
},
async handleSysRailwayBureaus() {
let res = await sysRailwayBureaus();
this.options = res;
},
// 编辑的确认 // 编辑的确认
confirm() { confirm() {
let params = { let params = {
......
...@@ -53,6 +53,9 @@ const path = { ...@@ -53,6 +53,9 @@ const path = {
waveStatistics: '/device/sampling/waveStatistics', waveStatistics: '/device/sampling/waveStatistics',
distanceStatistics: '/device/sampling/distanceStatistics', distanceStatistics: '/device/sampling/distanceStatistics',
samplingList: '/device/sampling/selectPage', samplingList: '/device/sampling/selectPage',
sysRailwayBureaus: '/api/sysRailwayBureaus/selectAll'
} }
// 铁路线 // 铁路线
export function railWaylist() { export function railWaylist() {
...@@ -75,6 +78,10 @@ export function updateRailWay() { ...@@ -75,6 +78,10 @@ export function updateRailWay() {
} }
//站点 //站点
export function sysRailwayBureaus() {
return request.post(path.sysRailwayBureaus, ...arguments);
}
export function selectForSite() { export function selectForSite() {
return request.post(path.selectForSite, ...arguments); return request.post(path.selectForSite, ...arguments);
} }
......
<template>
<div class="app-container">
<h4 class="form-header h4">基本信息</h4>
<el-form ref="form" :model="form" label-width="80px">
<el-row>
<el-col :span="8" :offset="2">
<el-form-item label="用户昵称" prop="nickName">
<el-input v-model="form.nickName" disabled />
</el-form-item>
</el-col>
<el-col :span="8" :offset="2">
<el-form-item label="登录账号" prop="userName">
<el-input v-model="form.userName" disabled />
</el-form-item>
</el-col>
</el-row>
</el-form>
<h4 class="form-header h4">角色信息</h4>
<el-table v-loading="loading" :row-key="getRowKey" @row-click="clickRow" ref="table" @selection-change="handleSelectionChange" :data="roles.slice((pageNum-1)*pageSize,pageNum*pageSize)">
<el-table-column label="序号" type="index" align="center">
<template slot-scope="scope">
<span>{{(pageNum - 1) * pageSize + scope.$index + 1}}</span>
</template>
</el-table-column>
<el-table-column type="selection" :reserve-selection="true" width="55"></el-table-column>
<el-table-column label="角色编号" align="center" prop="roleId" />
<el-table-column label="角色名称" align="center" prop="roleName" />
<el-table-column label="权限字符" align="center" prop="roleKey" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
</el-table>
<pagination v-show="total>0" :total="total" :page.sync="pageNum" :limit.sync="pageSize" />
<el-form label-width="100px">
<el-form-item style="text-align: center;margin-left:-120px;margin-top:30px;">
<el-button type="primary" @click="submitForm()">提交</el-button>
<el-button @click="close()">返回</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { getAuthRole, updateAuthRole } from "@/api/system/user";
export default {
name: "AuthRole",
data() {
return {
// 遮罩层
loading: true,
// 分页信息
total: 0,
pageNum: 1,
pageSize: 10,
// 选中角色编号
roleIds:[],
// 角色信息
roles: [],
// 用户信息
form: {}
};
},
created() {
const userId = this.$route.params && this.$route.params.userId;
if (userId) {
this.loading = true;
getAuthRole(userId).then((response) => {
this.form = response.user;
this.roles = response.roles;
this.total = this.roles.length;
this.$nextTick(() => {
this.roles.forEach((row) => {
if (row.flag) {
this.$refs.table.toggleRowSelection(row);
}
});
});
this.loading = false;
});
}
},
methods: {
/** 单击选中行数据 */
clickRow(row) {
this.$refs.table.toggleRowSelection(row);
},
// 多选框选中数据
handleSelectionChange(selection) {
this.roleIds = selection.map((item) => item.roleId);
},
// 保存选中的数据编号
getRowKey(row) {
return row.roleId;
},
/** 提交按钮 */
submitForm() {
const userId = this.form.userId;
const roleIds = this.roleIds.join(",");
updateAuthRole({ userId: userId, roleIds: roleIds }).then((response) => {
this.$modal.msgSuccess("授权成功");
this.close();
});
},
/** 关闭按钮 */
close() {
const obj = { path: "/system/user" };
this.$tab.closeOpenPage(obj);
},
},
};
</script>
\ No newline at end of file
This diff is collapsed.
<template>
<div class="app-container">
<el-row :gutter="20">
<el-col :span="6" :xs="24">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>个人信息</span>
</div>
<div>
<div class="text-center">
<userAvatar />
</div>
<ul class="list-group list-group-striped">
<li class="list-group-item">
<svg-icon icon-class="user" />用户名称
<div class="pull-right">{{ user.userName }}</div>
</li>
<li class="list-group-item">
<svg-icon icon-class="phone" />手机号码
<div class="pull-right">{{ user.phonenumber }}</div>
</li>
<li class="list-group-item">
<svg-icon icon-class="email" />用户邮箱
<div class="pull-right">{{ user.email }}</div>
</li>
<li class="list-group-item">
<svg-icon icon-class="tree" />所属部门
<div class="pull-right" v-if="user.dept">{{ user.dept.deptName }} / {{ postGroup }}</div>
</li>
<li class="list-group-item">
<svg-icon icon-class="peoples" />所属角色
<div class="pull-right">{{ roleGroup }}</div>
</li>
<li class="list-group-item">
<svg-icon icon-class="date" />创建日期
<div class="pull-right">{{ user.createTime }}</div>
</li>
</ul>
</div>
</el-card>
</el-col>
<el-col :span="18" :xs="24">
<el-card>
<div slot="header" class="clearfix">
<span>基本资料</span>
</div>
<el-tabs v-model="activeTab">
<el-tab-pane label="基本资料" name="userinfo">
<userInfo :user="user" />
</el-tab-pane>
<el-tab-pane label="修改密码" name="resetPwd">
<resetPwd />
</el-tab-pane>
</el-tabs>
</el-card>
</el-col>
</el-row>
</div>
</template>
<script>
import userAvatar from "./userAvatar";
import userInfo from "./userInfo";
import resetPwd from "./resetPwd";
import { getUserProfile } from "@/api/system/user";
export default {
name: "Profile",
components: { userAvatar, userInfo, resetPwd },
data() {
return {
user: {},
roleGroup: {},
postGroup: {},
activeTab: "userinfo"
};
},
created() {
this.getUser();
},
methods: {
getUser() {
getUserProfile().then(response => {
this.user = response.data;
this.roleGroup = response.roleGroup;
this.postGroup = response.postGroup;
});
}
}
};
</script>
<template>
<el-form ref="form" :model="user" :rules="rules" label-width="80px">
<el-form-item label="旧密码" prop="oldPassword">
<el-input v-model="user.oldPassword" placeholder="请输入旧密码" type="password" show-password/>
</el-form-item>
<el-form-item label="新密码" prop="newPassword">
<el-input v-model="user.newPassword" placeholder="请输入新密码" type="password" show-password/>
</el-form-item>
<el-form-item label="确认密码" prop="confirmPassword">
<el-input v-model="user.confirmPassword" placeholder="请确认新密码" type="password" show-password/>
</el-form-item>
<el-form-item>
<el-button type="primary" size="mini" @click="submit">保存</el-button>
<el-button type="danger" size="mini" @click="close">关闭</el-button>
</el-form-item>
</el-form>
</template>
<script>
import { updateUserPwd } from "@/api/system/user";
export default {
data() {
const equalToPassword = (rule, value, callback) => {
if (this.user.newPassword !== value) {
callback(new Error("两次输入的密码不一致"));
} else {
callback();
}
};
return {
user: {
oldPassword: undefined,
newPassword: undefined,
confirmPassword: undefined
},
// 表单校验
rules: {
oldPassword: [
{ required: true, message: "旧密码不能为空", trigger: "blur" }
],
newPassword: [
{ required: true, message: "新密码不能为空", trigger: "blur" },
{ min: 6, max: 20, message: "长度在 6 到 20 个字符", trigger: "blur" }
],
confirmPassword: [
{ required: true, message: "确认密码不能为空", trigger: "blur" },
{ required: true, validator: equalToPassword, trigger: "blur" }
]
}
};
},
methods: {
submit() {
this.$refs["form"].validate(valid => {
if (valid) {
updateUserPwd(this.user.oldPassword, this.user.newPassword).then(response => {
this.$modal.msgSuccess("修改成功");
});
}
});
},
close() {
this.$tab.closePage();
}
}
};
</script>
<template>
<div>
<div class="user-info-head" @click="editCropper()"><img v-bind:src="options.img" title="点击上传头像" class="img-circle img-lg" /></div>
<el-dialog :title="title" :visible.sync="open" width="800px" append-to-body @opened="modalOpened" @close="closeDialog">
<el-row>
<el-col :xs="24" :md="12" :style="{height: '350px'}">
<!-- <vue-cropper
ref="cropper"
:img="options.img"
:info="true"
:autoCrop="options.autoCrop"
:autoCropWidth="options.autoCropWidth"
:autoCropHeight="options.autoCropHeight"
:fixedBox="options.fixedBox"
:outputType="options.outputType"
@realTime="realTime"
v-if="visible"
/> -->
</el-col>
<el-col :xs="24" :md="12" :style="{height: '350px'}">
<div class="avatar-upload-preview">
<img :src="previews.url" :style="previews.img" />
</div>
</el-col>
</el-row>
<br />
<el-row>
<el-col :lg="2" :sm="3" :xs="3">
<el-upload action="#" :http-request="requestUpload" :show-file-list="false" :before-upload="beforeUpload">
<el-button size="small">
选择
<i class="el-icon-upload el-icon--right"></i>
</el-button>
</el-upload>
</el-col>
<el-col :lg="{span: 1, offset: 2}" :sm="2" :xs="2">
<el-button icon="el-icon-plus" size="small" @click="changeScale(1)"></el-button>
</el-col>
<el-col :lg="{span: 1, offset: 1}" :sm="2" :xs="2">
<el-button icon="el-icon-minus" size="small" @click="changeScale(-1)"></el-button>
</el-col>
<el-col :lg="{span: 1, offset: 1}" :sm="2" :xs="2">
<el-button icon="el-icon-refresh-left" size="small" @click="rotateLeft()"></el-button>
</el-col>
<el-col :lg="{span: 1, offset: 1}" :sm="2" :xs="2">
<el-button icon="el-icon-refresh-right" size="small" @click="rotateRight()"></el-button>
</el-col>
<el-col :lg="{span: 2, offset: 6}" :sm="2" :xs="2">
<el-button type="primary" size="small" @click="uploadImg()">提 交</el-button>
</el-col>
</el-row>
</el-dialog>
</div>
</template>
<script>
import store from "@/store";
// import { VueCropper } from "vue-cropper";
import { uploadAvatar } from "@/api/system/user";
import { debounce } from '@/utils'
export default {
// components: { VueCropper },
data() {
return {
// 是否显示弹出层
open: false,
// 是否显示cropper
visible: false,
// 弹出层标题
title: "修改头像",
options: {
img: store.getters.avatar, //裁剪图片的地址
autoCrop: true, // 是否默认生成截图框
autoCropWidth: 200, // 默认生成截图框宽度
autoCropHeight: 200, // 默认生成截图框高度
fixedBox: true, // 固定截图框大小 不允许改变
outputType:"png", // 默认生成截图为PNG格式
filename: 'avatar' // 文件名称
},
previews: {},
resizeHandler: null
};
},
methods: {
// 编辑头像
editCropper() {
this.open = true;
},
// 打开弹出层结束时的回调
modalOpened() {
this.visible = true;
if (!this.resizeHandler) {
this.resizeHandler = debounce(() => {
this.refresh()
}, 100)
}
window.addEventListener("resize", this.resizeHandler)
},
// 刷新组件
refresh() {
this.$refs.cropper.refresh();
},
// 覆盖默认的上传行为
requestUpload() {
},
// 向左旋转
rotateLeft() {
this.$refs.cropper.rotateLeft();
},
// 向右旋转
rotateRight() {
this.$refs.cropper.rotateRight();
},
// 图片缩放
changeScale(num) {
num = num || 1;
this.$refs.cropper.changeScale(num);
},
// 上传预处理
beforeUpload(file) {
if (file.type.indexOf("image/") == -1) {
this.$modal.msgError("文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。");
} else {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => {
this.options.img = reader.result;
this.options.filename = file.name;
};
}
},
// 上传图片
uploadImg() {
this.$refs.cropper.getCropBlob(data => {
let formData = new FormData();
formData.append("avatarfile", data, this.options.filename);
uploadAvatar(formData).then(response => {
this.open = false;
this.options.img = process.env.VUE_APP_BASE_API + response.imgUrl;
store.commit('SET_AVATAR', this.options.img);
this.$modal.msgSuccess("修改成功");
this.visible = false;
});
});
},
// 实时预览
realTime(data) {
this.previews = data;
},
// 关闭窗口
closeDialog() {
this.options.img = store.getters.avatar
this.visible = false;
window.removeEventListener("resize", this.resizeHandler)
}
}
};
</script>
<style scoped lang="scss">
.user-info-head {
position: relative;
display: inline-block;
height: 120px;
}
.user-info-head:hover:after {
content: '+';
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
color: #eee;
background: rgba(0, 0, 0, 0.5);
font-size: 24px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
cursor: pointer;
line-height: 110px;
border-radius: 50%;
}
</style>
<template>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="用户昵称" prop="nickName">
<el-input v-model="form.nickName" maxlength="30" />
</el-form-item>
<el-form-item label="手机号码" prop="phonenumber">
<el-input v-model="form.phonenumber" maxlength="11" />
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input v-model="form.email" maxlength="50" />
</el-form-item>
<el-form-item label="性别">
<el-radio-group v-model="form.sex">
<el-radio label="0"></el-radio>
<el-radio label="1"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item>
<el-button type="primary" size="mini" @click="submit">保存</el-button>
<el-button type="danger" size="mini" @click="close">关闭</el-button>
</el-form-item>
</el-form>
</template>
<script>
import { updateUserProfile } from "@/api/system/user";
export default {
props: {
user: {
type: Object
}
},
data() {
return {
form: {},
// 表单校验
rules: {
nickName: [
{ required: true, message: "用户昵称不能为空", trigger: "blur" }
],
email: [
{ required: true, message: "邮箱地址不能为空", trigger: "blur" },
{
type: "email",
message: "请输入正确的邮箱地址",
trigger: ["blur", "change"]
}
],
phonenumber: [
{ required: true, message: "手机号码不能为空", trigger: "blur" },
{
pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
message: "请输入正确的手机号码",
trigger: "blur"
}
]
}
};
},
watch: {
user: {
handler(user) {
if (user) {
this.form = { nickName: user.nickName, phonenumber: user.phonenumber, email: user.email, sex: user.sex };
}
},
immediate: true
}
},
methods: {
submit() {
this.$refs["form"].validate(valid => {
if (valid) {
updateUserProfile(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.user.phonenumber = this.form.phonenumber;
this.user.email = this.form.email;
});
}
});
},
close() {
this.$tab.closePage();
}
}
};
</script>
...@@ -9,8 +9,8 @@ function resolve(dir) { ...@@ -9,8 +9,8 @@ function resolve(dir) {
const name = defaultSettings.title || '漏缆故障定位监测系统' // page title const name = defaultSettings.title || '漏缆故障定位监测系统' // page title
const port = process.env.port || process.env.npm_config_port || 8890 // dev port const port = process.env.port || process.env.npm_config_port || 8890 // dev port
// const href = 'http://101.126.159.207' // const href = 'http://101.126.159.207'
const href = 'http://127.0.0.1' // const href = 'http://127.0.0.1'
// const href = 'http://192.168.0.122' const href = 'http://192.168.0.113'
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment