Commit 0af78bc3 authored by xinzhedeai's avatar xinzhedeai

home

parent c3e29d83
import request from '@/utils/request'
export function getData(data) {
return request({
url: 'api/incubator/home',
method: 'get',
})
}
export function del(ids) {
return request({
url: 'api/users',
method: 'delete',
data: ids
})
}
export function edit(data) {
return request({
url: 'api/incubator',
method: 'put',
data
})
}
export function editUser(data) {
return request({
url: 'api/users/center',
method: 'put',
data
})
}
export default { getData, edit, del }
<template> <template>
<div class="app-container"> <div class="app-container">
<!--工具栏--> <div class="header">
<div class="head-container"> <h1>{{ formInline.incubatorName }}</h1>
<div v-if="crud.props.searchToggle">
<!-- 搜索 -->
<el-input v-model="query.blurry" clearable size="small" placeholder="模糊搜索" style="width: 200px;" class="filter-item" @keyup.enter.native="crud.toQuery" />
<date-range-picker v-model="query.createTime" class="date-item" />
<rrOperation />
</div>
<crudOperation :permission="permission" />
</div> </div>
<!--表单渲染--> <div class="body">
<el-dialog append-to-body :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title" width="580px"> <div class="title"><i></i>基本信息</div>
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="80px"> <div class="form">
<el-form-item label="菜单类型" prop="type"> <el-form
<el-radio-group v-model="form.type" size="mini" style="width: 178px"> label-width="170px"
<el-radio-button label="0">目录</el-radio-button> :inline="true"
<el-radio-button label="1">菜单</el-radio-button> :model="formInline"
<el-radio-button label="2">按钮</el-radio-button> class="demo-form-inline"
</el-radio-group> :label-position="labelPosition"
</el-form-item> >
<el-form-item v-show="form.type.toString() !== '2'" label="菜单图标" prop="icon"> <el-row>
<el-popover <el-form-item label="运行机构">
placement="bottom-start" <el-input
width="450" v-model="formInline.operatingAgency"
trigger="click" placeholder=""
@show="$refs['iconSelect'].reset()" size="middle"
> ></el-input>
<IconSelect ref="iconSelect" @selected="selected" /> </el-form-item>
<el-input slot="reference" v-model="form.icon" style="width: 450px;" placeholder="点击选择图标" readonly> <el-form-item label="孵化器等级">
<svg-icon v-if="form.icon" slot="prefix" :icon-class="form.icon" class="el-input__icon" style="height: 32px;width: 16px;" /> <el-select
<i v-else slot="prefix" class="el-icon-search el-input__icon" /> v-model="formInline.incubatorLevel"
</el-input> style="width: 320px"
</el-popover> size="middle"
</el-form-item> >
<el-form-item v-show="form.type.toString() !== '2'" label="外链菜单" prop="iframe"> <el-option label="区域一" value="shanghai"></el-option>
<el-radio-group v-model="form.iframe" size="mini"> <el-option label="区域二" value="beijing"></el-option>
<el-radio-button label="true"></el-radio-button> </el-select>
<el-radio-button label="false"></el-radio-button> </el-form-item>
</el-radio-group> <el-form-item label="联系人">
</el-form-item> <el-input
<el-form-item v-show="form.type.toString() === '1'" label="菜单缓存" prop="cache"> v-model="formInline.contactPerson"
<el-radio-group v-model="form.cache" size="mini"> placeholder=""
<el-radio-button label="true"></el-radio-button> size="middle"
<el-radio-button label="false"></el-radio-button> ></el-input>
</el-radio-group> </el-form-item>
</el-form-item> </el-row>
<el-form-item v-show="form.type.toString() !== '2'" label="菜单可见" prop="hidden"> <el-row>
<el-radio-group v-model="form.hidden" size="mini"> <el-form-item label="联系电话">
<el-radio-button label="false"></el-radio-button> <el-input
<el-radio-button label="true"></el-radio-button> v-model="formInline.contactPhone"
</el-radio-group> placeholder=""
</el-form-item> size="middle"
<el-form-item v-if="form.type.toString() !== '2'" label="菜单标题" prop="title"> ></el-input>
<el-input v-model="form.title" :style=" form.type.toString() === '0' ? 'width: 450px' : 'width: 178px'" placeholder="菜单标题" /> </el-form-item>
</el-form-item> <el-form-item label="孵化器使用总面积(m²)">
<el-form-item v-if="form.type.toString() === '2'" label="按钮名称" prop="title"> <el-input
<el-input v-model="form.title" placeholder="按钮名称" style="width: 178px;" /> v-model="formInline.totalArea"
</el-form-item> placeholder=""
<el-form-item v-show="form.type.toString() !== '0'" label="权限标识" prop="permission"> size="middle"
<el-input v-model="form.permission" :disabled="form.iframe.toString() === 'true'" placeholder="权限标识" style="width: 178px;" /> ></el-input>
</el-form-item> </el-form-item>
<el-form-item v-if="form.type.toString() !== '2'" label="路由地址" prop="path"> <el-form-item label="用于企业孵化的面积(m²)">
<el-input v-model="form.path" placeholder="路由地址" style="width: 178px;" /> <el-input
</el-form-item> v-model="formInline.incubationArea"
<el-form-item label="菜单排序" prop="menuSort"> placeholder=""
<el-input-number v-model.number="form.menuSort" :min="0" :max="999" controls-position="right" style="width: 178px;" /> size="middle"
</el-form-item> ></el-input>
<el-form-item v-show="form.iframe.toString() !== 'true' && form.type.toString() === '1'" label="组件名称" prop="componentName"> </el-form-item>
<el-input v-model="form.componentName" style="width: 178px;" placeholder="匹配组件内Name字段" /> </el-row>
</el-form-item> <el-row>
<el-form-item v-show="form.iframe.toString() !== 'true' && form.type.toString() === '1'" label="组件路径" prop="component"> <el-form-item label="剩余企业孵化的面积(m²)">
<el-input v-model="form.component" style="width: 178px;" placeholder="组件路径" /> {{ remainingArea }}
</el-form-item> </el-form-item>
<el-form-item label="上级类目" prop="pid"> </el-row>
<treeselect <el-row>
v-model="form.pid" <el-form-item label="孵化器地理位置">
:options="menus" <el-input
:load-options="loadMenus" v-model="formInline.address"
style="width: 450px;" placeholder=""
placeholder="选择上级类目" size="small"
/> style="width: 360px;"
</el-form-item> disabled
</el-form> ></el-input>
<div slot="footer" class="dialog-footer"> <div
<el-button type="text" @click="crud.cancelCU">取消</el-button> class="map-ctn"
<el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button> :style="'width:500px;' + 'height:300px' + ';'"
>
<cu-amap ref="amap" :options="amapOptions()" />
</div>
</el-form-item>
<el-form-item style="margin-left: 80px;">
<el-upload
class="upload-demo"
:action="`${baseAPI}api/file/upload?modelName=incubator`"
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-remove="beforeRemove"
:on-success="handleSuccess"
:on-error="handleError"
:limit="1"
:on-exceed="handleExceed"
:file-list="fileList"
:show-file-list="false"
style="margin-bottom: 6px;"
>
<span style="margin-right: 14px">孵化器展示上传</span>
<el-button size="mini" type="default">上传图片</el-button>
</el-upload>
<div :style="'width:500px;' + 'height:300px' + ';'">
<div class="imgShowraper">
<img :src="`${baseAPI}file/${formInline.incubatorImage}`" alt="" width="500" height="300px" />
</div>
</div>
</el-form-item>
<el-row style=" display: flex;
justify-content: center; margin-top: 60px;"><el-button type="primary" size="small" @click="edit">保存修改信息</el-button></el-row>
</el-row>
</el-form>
</div> </div>
</el-dialog>
<!--表格渲染--> </div>
<el-table
ref="table"
v-loading="crud.loading"
lazy
:load="getMenus"
:data="crud.data"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
row-key="id"
@select="crud.selectChange"
@select-all="crud.selectAllChange"
@selection-change="crud.selectionChangeHandler"
>
<el-table-column type="selection" width="55" />
<el-table-column :show-overflow-tooltip="true" label="菜单标题" prop="title" />
<el-table-column prop="icon" label="图标" align="center" width="60px">
<template slot-scope="scope">
<svg-icon :icon-class="scope.row.icon ? scope.row.icon : ''" />
</template>
</el-table-column>
<el-table-column prop="menuSort" align="center" label="排序" width="60px" >
<template slot-scope="scope">
{{ scope.row.menuSort }}
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" prop="permission" label="权限标识" width="100px"/>
<el-table-column :show-overflow-tooltip="true" prop="component" label="组件路径" />
<el-table-column prop="iframe" label="外链" width="60px">
<template slot-scope="scope">
<span v-if="scope.row.iframe"></span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column prop="cache" label="缓存" width="60px">
<template slot-scope="scope">
<span v-if="scope.row.cache"></span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column prop="hidden" label="可见" width="60px">
<template slot-scope="scope">
<span v-if="scope.row.hidden"></span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建日期" width="135px" />
<el-table-column v-if="checkPer(['admin','menu:edit','menu:del'])" label="操作" width="130px" align="center" fixed="right">
<template slot-scope="scope">
<udOperation
:data="scope.row"
:permission="permission"
msg="确定删除吗,如果存在下级节点则一并删除,此操作不能撤销!"
/>
</template>
</el-table-column>
</el-table>
</div> </div>
</template> </template>
<script> <script>
import crudMenu from '@/api/system/menu'
import IconSelect from '@/components/IconSelect' var baseAPI = process.env.NODE_ENV === 'development' ? process.env.VUE_APP_LOCAL_API + '/' : (VUE_APP_API.ServiceURL || process.env.VUE_APP_LOCAL_API) + '/';
import Treeselect from '@riophae/vue-treeselect' import crudHome from "@/api/system/home";
import '@riophae/vue-treeselect/dist/vue-treeselect.css' import IconSelect from "@/components/IconSelect";
import { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect' import Treeselect from "@riophae/vue-treeselect";
import CRUD, { presenter, header, form, crud } from '@crud/crud' import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import rrOperation from '@crud/RR.operation' import { LOAD_CHILDREN_OPTIONS } from "@riophae/vue-treeselect";
import crudOperation from '@crud/CRUD.operation' import CRUD, { presenter, header, form, crud } from "@crud/crud";
import udOperation from '@crud/UD.operation' import rrOperation from "@crud/RR.operation";
import DateRangePicker from '@/components/DateRangePicker' import crudOperation from "@crud/CRUD.operation";
import udOperation from "@crud/UD.operation";
import DateRangePicker from "@/components/DateRangePicker";
import cuAmap from "@/components/AMap";
// crud交由presenter持有 // crud交由presenter持有
const defaultForm = { id: null, title: null, menuSort: 999, path: null, component: null, componentName: null, iframe: false, roles: [], pid: 0, icon: null, cache: false, hidden: false, type: 0, permission: null } const defaultForm = {
id: null,
title: null,
menuSort: 999,
path: null,
component: null,
componentName: null,
iframe: false,
roles: [],
pid: 0,
icon: null,
cache: false,
hidden: false,
type: 0,
permission: null,
};
export default { export default {
name: 'Menu', name: "Menu",
components: { Treeselect, IconSelect, crudOperation, rrOperation, udOperation, DateRangePicker }, components: {
cuAmap,
Treeselect,
IconSelect,
crudOperation,
rrOperation,
udOperation,
DateRangePicker,
},
cruds() { cruds() {
return CRUD({ title: '菜单', url: 'api/menus', crudMethod: { ...crudMenu }}) return CRUD({
title: "菜单",
url: "api/menus",
crudMethod: { ...crudHome },
});
}, },
mixins: [presenter(), header(), form(defaultForm), crud()], mixins: [presenter(), header(), form(defaultForm), crud()],
data() { data() {
return { return {
baseAPI:baseAPI,
labelPosition: "right",
fileList: [],
Dict: { selectList: [] },
formInline: {
address: "",
contactPerson: "",
contactPhone: "",
id:'',
incubationArea:'',
incubatorImage:'',
incubatorLevel:'',
incubatorName:'',
latitude:'',
longitude:'',
operatingAgency:'',
totalArea:'',
},
menus: [], menus: [],
permission: { permission: {
add: ['admin', 'menu:add'], add: ["admin", "menu:add"],
edit: ['admin', 'menu:edit'], edit: ["admin", "menu:edit"],
del: ['admin', 'menu:del'] del: ["admin", "menu:del"],
}, },
rules: { rules: {
title: [ title: [{ required: true, message: "请输入标题", trigger: "blur" }],
{ required: true, message: '请输入标题', trigger: 'blur' } path: [{ required: true, message: "请输入地址", trigger: "blur" }],
], },
path: [ };
{ required: true, message: '请输入地址', trigger: 'blur' } },
] computed: {
} remainingArea() {
return this.formInline.totalArea - this.formInline.incubationArea;
} }
}, },
mounted(){
this.getData()
},
methods: { methods: {
// 新增与编辑前做的操作 handleSuccess(response, file) {
[CRUD.HOOK.afterToCU](crud, form) { // 处理上传成功
this.menus = [] console.log('Upload success:', response, file);
if (form.id != null) {
if (form.pid === null) { this.formInline.incubatorImage = response.body
form.pid = 0 // this.fileList.push(file); // 存储已上传文件
} // this.tableData.push({
this.getSupDepts(form.id) // name: file.name,
} else { // status: '上传成功',
this.menus.push({ id: 0, label: '顶级类目', children: null }) // });
} },
handleError(err, file) {
// 处理上传错误
console.error('Upload failed:', err, file);
this.tableData.push({
name: file.name,
status: '上传失败',
});
},
handleRemove(file, fileList) {
console.log(file, fileList);
}, },
getMenus(tree, treeNode, resolve) { handlePreview(file) {
const params = { pid: tree.id } console.log(file);
setTimeout(() => {
crudMenu.getMenus(params).then(res => {
resolve(res.content)
})
}, 100)
}, },
getSupDepts(id) { handleExceed(files, fileList) {
crudMenu.getMenuSuperior(id).then(res => { this.$message.warning(
const children = res.map(function(obj) { `当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${
if (!obj.leaf && !obj.children) { files.length + fileList.length
obj.children = null } 个文件`
);
},
beforeRemove(file, fileList) {
return this.$confirm(`确定移除 ${file.name}?`);
},
initMap(lng, lat){
// var opts = {
// center:[lng || 107.260044, lat || 36.737982],
// showLabel: true,
// pitch: 40,
// zoom: 4,
// mapStyle: 'amap://styles/blue',
// };
var cmap = this.$refs.amap.init(amapOptions());
},
amapOptions(cmap) {
var item = this.formInline.item,
self = this,
form = this.formInline;
return {
zoom: 12,
center: [122.050189, 37.515189],
//showLabel: true,
//pitch: 40,
onload: function (cmap) {
this.Dict.cmap = cmap;
var center = cmap.options.center;
var lng = form.longitude || center[0],
lat = form.latitude || center[1];
if (lng && lat) {
cmap.setCenter([lng, lat]);
// 添加标记
cmap.addMarker({
lnglat: [lng, lat],
title: "",
draggable: true,
dragend: function (e) {
var lnglat = e.lnglat;
cmap.deGeocode([lnglat.lng, lnglat.lat], function (addr) {
form.address = addr;
form.longitude = lnglat.lng;
form.latitude = lnglat.lat;
self.$forceUpdate();
});
},
});
} }
return obj },
}) click: function (e, cmap) {
this.menus = [{ id: 0, label: '顶级类目', children: children }] var lnglat = e.lnglat;
}) cmap.deGeocode([lnglat.lng, lnglat.lat], function (addr) {
form.address = addr;
form.longitude = lnglat.lng;
form.latitude = lnglat.lat;
});
cmap.marker && cmap.removeMarker();
// 添加标记
cmap.addMarker({
lnglat: [lnglat.lng, lnglat.lat],
title: "",
draggable: true,
dragend: function (e) {
var lnglat = e.lnglat;
cmap.deGeocode([lnglat.lng, lnglat.lat], function (addr) {
form.address = addr;
form.longitude = lnglat.lng;
form.latitude = lnglat.lat;
});
},
});
},
};
},
onSubmit() {
console.log("submit!");
}, },
loadMenus({ action, parentNode, callback }) { edit(){
if (action === LOAD_CHILDREN_OPTIONS) { crudHome.edit(this.formInline).then((res) => {
crudMenu.getMenusTree(parentNode.id).then(res => { if(res && res.code === 200){
parentNode.children = res.map(function(obj) { this.$message.warning(res.msg)
if (!obj.leaf) { }
obj.children = null });
} },
return obj getData() {
}) crudHome.getData().then((res) => {
setTimeout(() => { this.formInline = res.body
callback() this.formInline.incubatorImage = res.body.incubatorImage
}, 100) // this.$refs.amap.init(amapOptions());
}) const center = [this.formInline.lat, this.formInline.lng ];
} this.$refs.amap.map.setCenter(center);
this.Dict.cmap.marker.setPosition(new AMap.LngLat(this.formInline.lng, this.formInline.lat));
});
}, },
// 选中图标 // 选中图标
selected(name) { selected(name) {
this.form.icon = name this.form.icon = name;
} },
} },
} };
</script> </script>
<style>
.app-main {
background-color: #fff !important;
}
</style>
<style rel="stylesheet/scss" lang="scss" scoped> <style rel="stylesheet/scss" lang="scss" scoped>
::v-deep .el-input-number .el-input__inner { .header {
text-align: left; background: #f5f6fb;
height: 52px;
line-height: 52px;
h1 {
color: #303133;
font-size: 19px;
padding-left: 32px;
&:before {
content: "";
display: block;
background: no-repeat top left url("~@/assets/images/iconNew/icon1.png");
position: absolute;
top: 25px;
left: 28px;
height: 100%;
width: 1.58rem;
}
} }
::v-deep .vue-treeselect__control,::v-deep .vue-treeselect__placeholder,::v-deep .vue-treeselect__single-value { }
height: 30px; .body {
line-height: 30px;
.title {
color: #1890ff;
height: 48px;
background: #e4f2ff;
font-weight: 400;
font-size: 16px;
line-height: 48px;
margin-bottom: 20px;
i {
width: 4px;
height: 16px;
background: #1890ff;
margin-right: 6px;
display: inline-block;
vertical-align: -2px;
margin-left: 18px;
}
} }
}
::v-deep .el-input__inner{
height: 38px;
}
::v-deep .el-input-number .el-input__inner {
text-align: left;
}
::v-deep .vue-treeselect__control,
::v-deep .vue-treeselect__placeholder,
::v-deep .vue-treeselect__single-value {
height: 30px;
line-height: 30px;
}
</style> </style>
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