Commit 74201798 authored by 赵啸非's avatar 赵啸非

修改前端站点编辑

parent f96901cf
......@@ -22,16 +22,22 @@
</ul>
</div>
<div class="layout-profile">
<el-dropdown @command="handleCommand">
<span class="el-dropdown-link">
{{userData.currUserName}}
<i class="el-icon-arrow-down el-icon--right"></i>
</span>
<!-- <el-dropdown @command="handleCommand">
<span class="el-dropdown-link">
{{userData.currUserName}}
<i class="el-icon-arrow-down el-icon--right"></i>
</span>
<!-- <el-dropdown-menu slot="dropdown">
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="update">修改密码</el-dropdown-item>
<el-dropdown-item command="logout">退出登录</el-dropdown-item>
</el-dropdown-menu> -->
</el-dropdown>
</el-dropdown-menu>
</el-dropdown> -->
</div>
</div>
......
......@@ -3,22 +3,7 @@
<template>
<div class="search-form-wapper">
<el-form :inline="true" :model="form" ref="search-form" size="small">
<!-- 省市区选择器 -->
<template v-if="areaSelect.enable">
<el-form-item label="区域">
<el-cascader
v-model="area"
clearable="true"
filterable
change-on-select
@change="treeSelected"
:options="treeData"
></el-cascader>
</el-form-item>
</template>
<el-form-item
v-for="(item, i) in search"
:key="i"
v-bind:class="{ search_new_line: item.newLine }"
......@@ -26,8 +11,8 @@
<el-input
v-model="form[item.name]"
v-if="item.type === 'text'"
:placeholder="item.placeholder? item.placeholder: '请输入' + item.label
:placeholder="
item.placeholder ? item.placeholder : '请输入' + item.label
"
></el-input>
......@@ -164,8 +149,6 @@
:placeholder="item.label"
>
</el-date-picker>
</el-form-item>
<el-form-item>
......@@ -173,11 +156,9 @@
type="primary"
icon="el-icon-search"
@click="onSubmit"
title="查询"
>查询</el-button>
>查询</el-button
>
<el-button
icon="el-icon-download"
......@@ -186,12 +167,9 @@
v-if="downloadUrl"
>下载</el-button
>
<el-button
icon="el-icon-refresh-left"
@click="cleanForm"
title="清空"
>清空</el-button>
<el-button icon="el-icon-refresh-left" @click="cleanForm" title="清空"
>清空</el-button
>
</el-form-item>
</el-form>
</div>
......@@ -199,13 +177,7 @@
<script>
import Qs from "qs";
import {
type,
download,
downloadWithCustName,
getUserListByQuery,
} from "@/assets/utils";
import { treeCache } from "@/assets/utils/tree";
import { type } from "@/assets/utils";
import { isArray } from "util";
export default {
......@@ -218,19 +190,6 @@ export default {
type: Object,
default: () => {},
},
downloadUrl: {
type: String,
default: "",
},
areaSelect: {
type: Object,
default: () => {
return {
enable: false,
level: 1, // 1,仅区域
};
},
},
},
watch: {
$route(route) {
......@@ -238,35 +197,18 @@ export default {
},
},
async created() {
// this.treeDatas = await treeCache.getTree();
// if (this.areaSelect.enable) {
// this.treeData = await treeCache.getTree();
// }
// let tempAreaId = this.$route.query["areaId"];
// if (tempAreaId) {
// this.selectedTreeID = treeCache.getPid(Number(tempAreaId));
// }
this.initForm(this.$route.query);
},
methods: {
afterRender() {
this.selectedTreeID = treeCache.getPid(this.form.areaId);
},
beforeSubmit(form) {
form.areaId = this.selectedTreeID.slice().pop();
return form;
},
treeSelecteds(val) {
this.form.areaId = val.slice().pop();
},
remoteMethod(query, searchType) {
if (query == "") {
console.log("查询参数为空!");
return;
}
this.loading = true;
var param = {
"name": query,
"searchType": searchType,
name: query,
searchType: searchType,
};
try {
this.$post("/common/autoComplete/list", param).then(({ data }) => {
......@@ -284,9 +226,14 @@ export default {
} catch (error) {}
},
async initForm(data) {
//初始化查询表单
let newFormData = {};
this.form = this.encode(data, this.form);
// this.form = this.encode(data, this.form);
console.log("data", data);
console.log("form", this.form);
this.search.forEach((item) => {
console.log("search-item", item);
//复选框
if (item.type === "checkbox") {
if (this.form[item.name] == undefined) {
newFormData[item.name] = [];
......@@ -307,27 +254,11 @@ export default {
}
}
}
if (item.type === "remoteSelect") {
if (
this.form[item.name] == undefined ||
(item.multiple === true && this.form[item.name].length == 0)
) {
this.remoteOptions[item.searchType] = {};
} else {
this.remoteOptions[item.searchType] = JSON.parse(
sessionStorage.getItem(item.searchType + "OptionsDict")
);
}
}
});
this.form = Object.assign({}, this.form, newFormData);
//this.form = Object.assign({}, this.form, this.encode(data));
// 区域选择器
// if (this.areaSelect.enable) {
// this.form.areaId = this.form.areaId ? this.form.areaId : 510100;
// this.area = treeCache.getPid(this.form.areaId).map(Number);
// this.treeSelected(this.area, "man");
// }
this.form = Object.assign({}, this.form, data);
console.log("form2", this.form);
},
cleanForm() {
this.clean();
......@@ -343,12 +274,7 @@ export default {
newData[item.name] = item.multiple ? [] : undefined;
}
});
if (this.areaSelect.enable) {
newData.areaId = "";
this.area = [510000, 510100];
}
this.form = Object.assign({}, this.form, newData);
this.selectedTreeID = [];
},
onSubmit() {
let { path, query } = this.$route;
......@@ -362,6 +288,7 @@ export default {
encode(data, formTemp) {
let newData = {};
Object.keys(Qs.parse(data)).forEach((item) => {
console.log(item);
if (/^query\./.test(item)) {
let val = data[item];
let key = item.replace(/^query\./, "");
......@@ -388,23 +315,10 @@ export default {
});
return newData;
},
decodeVal(val) {
let valType = type(val);
if (["Number", "Boolean"].indexOf(valType) > -1) {
return val;
}
if (valType == "Undefined" || valType == "Null") {
return undefined;
}
if (valType == "String") {
let str = val.trim();
return str.length ? str : undefined;
}
return val;
},
// 解析url字符串,加入query字段
decode(data) {
let newData = { "page": 1 };
let newData = { page: 1 };
Object.keys(data).forEach((item) => {
let val = data[item];
this.search.forEach((obj) => {
......@@ -416,62 +330,34 @@ export default {
) {
//支持模糊查询,收尾增加百分号
val = val.trim();
val = "%" + val + "%";
if(val.charAt(0)!='%'){
val = "%" + val
}
if(val.charAt(val.length-1)!='%'){
val =val + "%";
}
}
});
newData[item] = this.decodeVal(val);
});
return newData;
},
// 下载文件
async downloadFile() {
let data = this.decode(this.form);
let searchString = Object.assign({}, this.$route.query, data);
this.isDownload = true;
try {
// await download(this.downloadUrl, searchString )
await downloadWithCustName(this.downloadUrl, searchString);
} catch (error) {
this.$message.error(error);
}
this.isDownload = false;
},
// 区域选择
async treeSelected(val, type) {
let areas = [];
const [province, city, area] = val;
if (!type) {
this.form.areaId = val.slice().pop();
decodeVal(val) {
let valType = type(val);
if (["Number", "Boolean"].indexOf(valType) > -1) {
return val;
}
// 查找省市关联的区域
switch (val.length) {
case 1:
areas = await treeCache.getAreasByProvinceId([province]);
break;
case 2:
areas = await treeCache.getAreasByCityId([city]);
break;
case 3:
areas = [val[2]];
break;
default:
break;
if (valType == "Undefined" || valType == "Null") {
return undefined;
}
},
//用户远程搜索
async userRemoteMethod(name) {
if (name !== "") {
this.loading = true;
const userQuery = {
"size": 50,
"realName": name,
};
this.userData = await getUserListByQuery(userQuery);
this.loading = false;
} else {
this.userData = [];
if (valType == "String") {
let str = val.trim();
return str.length ? str : undefined;
}
return val;
},
listChange() {},
},
computed: {},
......@@ -481,12 +367,6 @@ export default {
groupList: [],
},
remoteOptions: {},
treeData: [],
userData: [],
area: [],
isDownload: false,
treeDatas: [],
selectedTreeID: [],
};
},
};
......
......@@ -117,7 +117,6 @@
:areaSelect="config.areaSelect"
/>
</div>
</div>
</div>
</div>
......@@ -191,7 +190,8 @@
class="table-foot"
v-if="!isShowButton('notPagination') ? false : data.pageInfo.totalResult"
>
<Pagination style="float:left"
<Pagination
style="float: left"
:total="data.pageInfo.totalResult"
:prePageResult="data.pageInfo.prePageResult"
/>
......@@ -257,7 +257,7 @@ export default {
},
watch: {
$route(route) {
this.showSearch = this.isShowSearch(route.query);
// this.showSearch = this.isShowSearch(route.query);
},
},
computed: {
......
......@@ -35,7 +35,6 @@ const router = new Router({
...restBuilder('user', 'system/user'), // 用户管理 -- 管理用户
...restBuilder('param', 'system/param'), // 系统管理--参数管理
...restBuilder('task', 'system/task'), // 系统管理--任务管理
...restBuilder('area', 'system/area'), // 系统管理-区域管理
builder('site/list', 'system/site/index'),//站点
......
......@@ -118,6 +118,47 @@
<el-button @click="upload.open = false">取 消</el-button>
</div>
</el-dialog>
<!-- 站点修改对话框 -->
<el-dialog
:title="tree.title"
:visible.sync="tree.open"
width="40%"
append-to-body
>
<span style="font-size: 13px"
><b>当前站点:</b> (<el-link
style="margin-left: 10px"
type="primary"
:underline="false"
>{{ siteName }}</el-link
>
站点编码:{{ siteCode }} )</span
>
<el-divider></el-divider>
<el-scrollbar style="height: 100%">
<el-tree
size="mini"
ref="siteTree"
:data="areaData"
id="el-tree"
node-key="id"
indent="4"
:props="treeProps"
:load="loadNode"
highlight-current
default-expand-all
:expand-on-click-node="false"
:render-content="renderContent"
@node-click="handleNodeClick"
>
</el-tree>
</el-scrollbar>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="updateSiteConform">确 定</el-button>
<el-button @click="tree.open = false">取 消</el-button>
</div>
</el-dialog>
<!-- <dialog-show ref="dialogform" @ok="getData" /> -->
<drawer-show ref="drawerform" @ok="getData" />
......@@ -131,10 +172,11 @@
import drawerView from "./drawerview";
import drawerShow from "./drawershow";
import table from "@/assets/mixins/table";
import tree from "@/assets/mixins/tree";
export default {
name: "Device",
components: { drawerShow, drawerView },
mixins: [table],
mixins: [table, tree],
created() {
console.log(this.$route);
this.siteId = this.$route.query.siteId;
......@@ -144,7 +186,6 @@ export default {
})
.then((res) => {
if (res.code == 1) {
console.log("res", res);
this.siteName = res.data.siteName;
this.siteCode = res.data.siteCode;
}
......@@ -270,6 +311,49 @@ export default {
this.$message.error(error.message);
});
},
updateSite(row) {
console.log("update site");
this.$get("/sitestat/siteTree", {}).then(({ data }) => {
this.areaData = data.siteTree;
this.tree.open = true;
this.tree.id = row.id;
});
},
handleNodeClick(node) {
console.log("click node", node);
this.currentNode = node;
},
updateSiteConform() {
if (this.currentNode.type != "site") {
this.$message.error("请选择正确的站点!");
return;
}
this.loading = true;
this.$post("/device/save", {
id: this.tree.id,
siteId: this.currentNode.id,
siteCode: this.currentNode.siteCode,
siteName: this.currentNode.label,
})
.then((res) => {
if (res.code == 1) {
this.$message.success("编辑站点成功!");
this.tree.open=false;
this.getData();
}
})
.catch((error) => {
this.loading=false;
this.$message.error(error.message);
});
},
// 操作菜单状态
changeStatus(row, column) {
return (
......@@ -301,30 +385,37 @@ export default {
// 上传的地址
url: "/m/device/importData",
},
// 站点树
tree: {
// 是否显示弹出层(设备导入)
open: false,
// 弹出层标题(设备导入)
title: "修改站点",
},
isExport: false,
siteId: null,
siteName: "",
siteCode: "",
updateSiteId: null,
updateSiteName: "",
updateSiteCode: "",
config: {
getsocketData: null,
search: [
// {
// name: "deviceNum",
// type: "text",
// label: "设备编号",
// },
{
name: "deviceCode",
type: "text",
label: "设备编码",
fuzzy:true
},
{
name: "deviceStatus",
type: "select",
label: "状态",
},
// {
// name: "porductId",
// type: "select",
// label: "产品类型",
// },
],
columns: [
{ type: "selection", width: 60 },
......@@ -368,7 +459,7 @@ export default {
{
label: "操作",
width: 240,
width: 280,
formatter: (row) => {
return (
<div>
......@@ -395,6 +486,17 @@ export default {
""
)}
<span> </span>
<el-button
size="mini"
type="text"
icon="el-icon-map-location"
onClick={() => {
this.updateSite(row);
}}
>
编辑站点
</el-button>
</div>
);
},
......
......@@ -31,7 +31,7 @@ import { createSocket } from '@/assets/utils/websocket'
export default {
name: 'login',
created() {
window.location.href=process.env.VUE_APP_PORTAL_URL=='undefined'?'http://192.168.0.98:11072':process.env.VUE_APP_PORTAL_URL
// window.location.href=process.env.VUE_APP_PORTAL_URL=='undefined'?'http://192.168.0.98:11072':process.env.VUE_APP_PORTAL_URL
},
methods: {
login() {
......
let treeData = [];
// 查找该条数据所处的层级深度
function getDeep(list, parentId, deep) {
try {
let pid = list.filter(i=>i.id == parentId)[0].parentId;
deep++;
if(pid != 0) {
return getDeep(list, pid, deep);
}else{
return deep
}
} catch (error) {
return deep;
}
}
// 分组排序
function sort(list) {
let array = [];
list.filter(i=>!i.parentId).forEach(item=>{
array = array.concat(child(list, item, []))
})
return array
}
function child(list, data, arr) {
arr.push(data);
if(data.hasChild) {
list.filter(i=>i.parentId==data.id).forEach(item=>{
return child(list, item, arr)
})
}
return arr;
}
let render = function(result) {
return treeData = sort(result.map(i=>{
i.hasChild = result.filter(j=>j.parentId==i.id).length > 0; // 是否有下级
i.deep = getDeep(result, i.parentId, 0); // 缩进层级
i.open = false;
i.isShow = true;
return i;
}));
}
let toggle = function(row) {
// 关闭的时候,需要递归关闭下面全部子级
let childId = []
// 打开下级
if(row.open) {
childId = child(treeData, row, []).map(i=>i.id)
childId.shift();
}
return treeData.map(i=>{
if(i.id == row.id) {
i.open = !i.open;
}
if(i.parentId == row.id) {
i.isShow = !i.isShow;
}
if(childId.indexOf(i.id) > -1) {
i.open = false;
i.isShow = childId.indexOf(i.id) === -1
}
return i;
})
.filter(i=>i.isShow)
}
function getParentId(id, list, arr) {
arr.unshift(id);
const pid = list.filter(i=>id == i.id)[0].parentId;
if(pid) {
return getParentId(pid, list, arr)
}else{
return arr;
}
}
function buildTree(pid, list) {
const data = list.filter(i=>pid == i.parentId);
return data.length ? data.map(i=>{
return {
value: i.id,
label: i.name,
children: buildTree(i.id, list),
}
}) : undefined
}
export default {
render,
toggle,
getParentId,
buildTree,
}
\ No newline at end of file
<template>
<div class="page">
<LayoutTable :data='tableData' :config='tableConfig' notPagination notDel >
<div>
<el-tree
:data="tree"
:props="treeProps"
:load="loadNode"
lazy>
<span style="width:100%" slot-scope="{ node, data }">
<span >{{ node.label }}</span>
<span style="float:right;">
<el-button
icon="el-icon-plus"
style="padding:3px 10px"
round
@click="() => addChild(data)">新增
</el-button>
<el-button
icon="el-icon-edit"
type="primary"
style="padding:3px 10px"
round
@click="() => editChild(data)"> 编辑
</el-button>
</span>
</span>
</el-tree>
</div>
</LayoutTable>
</div>
</template>
<script>
import table from "@/assets/mixins/table";
export default {
mixins: [table],
methods: {
async loadNode(node, resolve) {
if(node.level === 0) return
let res = await this.$post('/area/getAreaByParentId', {
'parentId': node.data.id,
'size': -1
});
resolve(this.clean(res.data.data));
},
clean(data) {
return data.map(i=>{
return {
name: i.name,
children: [],
id: i.id,
isLeaf: i.level > 2
}
});
},
afterRender({result}) {
this.tree = result;
},
addChild(data) {
this.$router.push({
path: this.pageInfo.add,
query: { pid: data.id }
});
},
editChild(data) {
this.$router.push({
path: this.pageInfo.edit,
query: Object.assign({}, {id: data.id}, this.query)
})
}
},
data() {
return {
tree:[],
openIds: [],
treeProps: {
children: 'children',
label: 'name',
isLeaf: 'isLeaf',
},
urls: {
del: "/area/disable"
},
query: {
pageInfo: {
prePageResult: -1
}
},
config: {
search: [
{
name: "name",
type: "text",
label: "名称"
},
{
name: "status",
type: "select",
label: "是否启用"
}
],
columns: [
{
type: "selection",
width: 60
},
{
label: "区域名称",
width: 200,
formatter: (row, col, val, index) => {
const width = `width: ${row.deep *
18}px;height: 20px;display: inline-block;`;
return (
<div>
<span style={width} />
{row.hasChild ? (
<i
onClick={() =>
this.loadArea(row)
}
class={
row.open
? "el-icon-caret-bottom"
: "el-icon-caret-right"
}
>
{row.name}
</i>
) : (
<span>{row.name}</span>
)}
</div>
);
}
},
{
prop: "id",
label: "区域ID"
},
{
prop: "parentId",
label: "上级区域ID"
},
{
prop: "name",
label: "区域名称"
},
{
prop: "level",
label: "区域级别",
width: 70,
formatter: this.formatter
},
{
prop: "code",
label: "区域编码"
},
// {
// prop: "contactsPeople",
// label: "区域负责人"
// },
// {
// prop: "contactsMobile",
// label: "区域负责人电话"
// },
{
prop: "status",
label: "启用",
formatter: this.formatter
},
{
prop: "remark",
label: "描述"
},
{
label: "操作",
width: 180,
formatter: row => {
return (
<div>
<el-button
icon="el-icon-plus"
size="mini"
round
onClick={() => {
this.addChild(row);
}}
>
新增
</el-button>{" "}
<table-buttons
row={row}
onEdit={this.toEdit}
noDel
/>
</div>
);
}
}
]
}
};
}
};
</script>
<template>
<layout-form>
<el-form
:model="form"
:loading="loading"
:rules="rules"
size='small'
label-width='120px'
ref="form"
>
<el-row>
<el-col :span='12'>
<el-form-item
label="区域"
prop="parentId"
>
<el-cascader
@change='treeSelected'
:options="treeData"
change-on-select
v-model="selectedTreeID"
></el-cascader>
</el-form-item>
</el-col>
<Field
label="区域名称"
prop="name"
v-model="form.name"
/>
<Field
label="区域级别"
prop="level"
v-model="form.level"
:enumData='dict.level'
type='select'
/>
<Field
label="编码"
prop="code"
v-model="form.code"
/>
<!-- <Field label="负责人" prop="contactsPeople" v-model="form.contactsPeople"/>
<Field label="负责人电话" prop="contactsMobile" v-model="form.contactsMobile"/> -->
<Field
label="子区域数量"
prop="childSize"
v-model="form.childSize"
/>
<Field
label="子区域的最大ID"
prop="maxChildId"
v-model="form.maxChildId"
/>
<Field
label="是否启用"
prop="status"
v-model="form.status"
:enumData="dict.status"
type='select'
/>
<Field
label="描述"
prop="remark"
v-model="form.remark"
:span='24'
/>
</el-row>
<form-buttons @submit='submitForm' />
</el-form>
</layout-form>
</template>
<script>
import form from "@/assets/mixins/form";
import { treeCache } from "@/assets/utils/tree";
export default {
mixins: [form],
async created() {
this.treeData = await treeCache.getTree();
this.form.parentId = this.query.pid;
},
methods: {
afterRender() {
this.selectedTreeID = treeCache.getPid(this.form.parentId);
},
beforeSubmit(form) {
form.parentId = this.selectedTreeID.slice().pop();
return form;
},
treeSelected(val) {
console.log(val);
this.form.parentId = val.slice().pop();
}
},
data() {
return {
toString: ["level", "status"],
treeData: [],
selectedTreeID: [],
rules: {
name: [{ required: true, message: "请输入区域名称", trigger: "blur" }],
remark: [{validator: (rule, val, callback) => {
if (val && val.split("").length > 200) {
return callback(new Error('描述不得超过200字'))
}
callback();
}, trigger: ['change','blur']
},
],
}
};
}
};
</script>
......@@ -21,6 +21,8 @@ import com.mortals.xhx.base.system.user.model.UserEntity;
import com.mortals.xhx.base.system.user.service.UserService;
import com.mortals.xhx.base.system.valid.service.ValidCodeService;
import com.mortals.xhx.common.key.RedisKey;
import com.mortals.xhx.common.pdu.user.UserPdu;
import com.mortals.xhx.feign.user.IUserFeign;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
......@@ -57,8 +59,8 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
private ICacheService cacheService;
@Autowired
private IAuthTokenService authTokenService;
private static Log logger = LogFactory.getLog(LoginController.class);
@Autowired
private IUserFeign userFeign;
@RequestMapping("login")
public String login(@RequestBody LoginForm loginForm) throws Exception {
......@@ -66,7 +68,15 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
JSONObject ret = new JSONObject();
String loginName = loginForm.getLoginName();
String password = loginForm.getPassword();
String securityCode = loginForm.getSecurityCode();
UserPdu userPdu = new UserPdu();
userPdu.setLoginName(loginName);
userPdu.setPassword(password);
String resp = userFeign.portalLogin(userPdu);
return resp;
/* String securityCode = loginForm.getSecurityCode();
String ip = super.getRequestIP(request);
if (StringUtils.isEmpty(loginName) || StringUtils.isEmpty(password)) {
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
......@@ -128,7 +138,7 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
ret.put(KEY_RESULT_MSG, super.convertException(e));
return ret.toJSONString();
}
}*/
}
@RequestMapping("logout")
......
......@@ -76,9 +76,9 @@ application:
upload:
path: @profiles.filepath@
feign:
hystrix:
enabled: false
#feign:
# hystrix:
# enabled: false
queue:
type: @profiles.queue.type@ # memory or kafka (Apache Kafka) or rabbitmq (RabbitMQ)
......
......@@ -63,13 +63,6 @@
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId> spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
</dependencies>
<build>
......
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