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>
<div class="app-container">
<!--工具栏-->
<div class="head-container">
<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 class="header">
<h1>{{ formInline.incubatorName }}</h1>
</div>
<!--表单渲染-->
<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">
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="80px">
<el-form-item label="菜单类型" prop="type">
<el-radio-group v-model="form.type" size="mini" style="width: 178px">
<el-radio-button label="0">目录</el-radio-button>
<el-radio-button label="1">菜单</el-radio-button>
<el-radio-button label="2">按钮</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item v-show="form.type.toString() !== '2'" label="菜单图标" prop="icon">
<el-popover
placement="bottom-start"
width="450"
trigger="click"
@show="$refs['iconSelect'].reset()"
>
<IconSelect ref="iconSelect" @selected="selected" />
<el-input slot="reference" v-model="form.icon" style="width: 450px;" placeholder="点击选择图标" readonly>
<svg-icon v-if="form.icon" slot="prefix" :icon-class="form.icon" class="el-input__icon" style="height: 32px;width: 16px;" />
<i v-else slot="prefix" class="el-icon-search el-input__icon" />
</el-input>
</el-popover>
</el-form-item>
<el-form-item v-show="form.type.toString() !== '2'" label="外链菜单" prop="iframe">
<el-radio-group v-model="form.iframe" size="mini">
<el-radio-button label="true"></el-radio-button>
<el-radio-button label="false"></el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item v-show="form.type.toString() === '1'" label="菜单缓存" prop="cache">
<el-radio-group v-model="form.cache" size="mini">
<el-radio-button label="true"></el-radio-button>
<el-radio-button label="false"></el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item v-show="form.type.toString() !== '2'" label="菜单可见" prop="hidden">
<el-radio-group v-model="form.hidden" size="mini">
<el-radio-button label="false"></el-radio-button>
<el-radio-button label="true"></el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item v-if="form.type.toString() !== '2'" label="菜单标题" prop="title">
<el-input v-model="form.title" :style=" form.type.toString() === '0' ? 'width: 450px' : 'width: 178px'" placeholder="菜单标题" />
</el-form-item>
<el-form-item v-if="form.type.toString() === '2'" label="按钮名称" prop="title">
<el-input v-model="form.title" placeholder="按钮名称" style="width: 178px;" />
</el-form-item>
<el-form-item v-show="form.type.toString() !== '0'" label="权限标识" prop="permission">
<el-input v-model="form.permission" :disabled="form.iframe.toString() === 'true'" placeholder="权限标识" style="width: 178px;" />
</el-form-item>
<el-form-item v-if="form.type.toString() !== '2'" label="路由地址" prop="path">
<el-input v-model="form.path" placeholder="路由地址" style="width: 178px;" />
</el-form-item>
<el-form-item label="菜单排序" prop="menuSort">
<el-input-number v-model.number="form.menuSort" :min="0" :max="999" controls-position="right" style="width: 178px;" />
</el-form-item>
<el-form-item v-show="form.iframe.toString() !== 'true' && form.type.toString() === '1'" label="组件名称" prop="componentName">
<el-input v-model="form.componentName" style="width: 178px;" placeholder="匹配组件内Name字段" />
</el-form-item>
<el-form-item v-show="form.iframe.toString() !== 'true' && form.type.toString() === '1'" label="组件路径" prop="component">
<el-input v-model="form.component" style="width: 178px;" placeholder="组件路径" />
</el-form-item>
<el-form-item label="上级类目" prop="pid">
<treeselect
v-model="form.pid"
:options="menus"
:load-options="loadMenus"
style="width: 450px;"
placeholder="选择上级类目"
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="crud.cancelCU">取消</el-button>
<el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
<div class="body">
<div class="title"><i></i>基本信息</div>
<div class="form">
<el-form
label-width="170px"
:inline="true"
:model="formInline"
class="demo-form-inline"
:label-position="labelPosition"
>
<el-row>
<el-form-item label="运行机构">
<el-input
v-model="formInline.operatingAgency"
placeholder=""
size="middle"
></el-input>
</el-form-item>
<el-form-item label="孵化器等级">
<el-select
v-model="formInline.incubatorLevel"
style="width: 320px"
size="middle"
>
<el-option label="区域一" value="shanghai"></el-option>
<el-option label="区域二" value="beijing"></el-option>
</el-select>
</el-form-item>
<el-form-item label="联系人">
<el-input
v-model="formInline.contactPerson"
placeholder=""
size="middle"
></el-input>
</el-form-item>
</el-row>
<el-row>
<el-form-item label="联系电话">
<el-input
v-model="formInline.contactPhone"
placeholder=""
size="middle"
></el-input>
</el-form-item>
<el-form-item label="孵化器使用总面积(m²)">
<el-input
v-model="formInline.totalArea"
placeholder=""
size="middle"
></el-input>
</el-form-item>
<el-form-item label="用于企业孵化的面积(m²)">
<el-input
v-model="formInline.incubationArea"
placeholder=""
size="middle"
></el-input>
</el-form-item>
</el-row>
<el-row>
<el-form-item label="剩余企业孵化的面积(m²)">
{{ remainingArea }}
</el-form-item>
</el-row>
<el-row>
<el-form-item label="孵化器地理位置">
<el-input
v-model="formInline.address"
placeholder=""
size="small"
style="width: 360px;"
disabled
></el-input>
<div
class="map-ctn"
: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>
</el-dialog>
<!--表格渲染-->
<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>
<script>
import crudMenu from '@/api/system/menu'
import IconSelect from '@/components/IconSelect'
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
import { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect'
import CRUD, { presenter, header, form, crud } from '@crud/crud'
import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation'
import udOperation from '@crud/UD.operation'
import DateRangePicker from '@/components/DateRangePicker'
var baseAPI = process.env.NODE_ENV === 'development' ? process.env.VUE_APP_LOCAL_API + '/' : (VUE_APP_API.ServiceURL || process.env.VUE_APP_LOCAL_API) + '/';
import crudHome from "@/api/system/home";
import IconSelect from "@/components/IconSelect";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import { LOAD_CHILDREN_OPTIONS } from "@riophae/vue-treeselect";
import CRUD, { presenter, header, form, crud } from "@crud/crud";
import rrOperation from "@crud/RR.operation";
import crudOperation from "@crud/CRUD.operation";
import udOperation from "@crud/UD.operation";
import DateRangePicker from "@/components/DateRangePicker";
import cuAmap from "@/components/AMap";
// 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 {
name: 'Menu',
components: { Treeselect, IconSelect, crudOperation, rrOperation, udOperation, DateRangePicker },
name: "Menu",
components: {
cuAmap,
Treeselect,
IconSelect,
crudOperation,
rrOperation,
udOperation,
DateRangePicker,
},
cruds() {
return CRUD({ title: '菜单', url: 'api/menus', crudMethod: { ...crudMenu }})
return CRUD({
title: "菜单",
url: "api/menus",
crudMethod: { ...crudHome },
});
},
mixins: [presenter(), header(), form(defaultForm), crud()],
data() {
return {
baseAPI:baseAPI,
labelPosition: "right",
fileList: [],
Dict: { selectList: [] },
formInline: {
address: "",
contactPerson: "",
contactPhone: "",
id:'',
incubationArea:'',
incubatorImage:'',
incubatorLevel:'',
incubatorName:'',
latitude:'',
longitude:'',
operatingAgency:'',
totalArea:'',
},
menus: [],
permission: {
add: ['admin', 'menu:add'],
edit: ['admin', 'menu:edit'],
del: ['admin', 'menu:del']
add: ["admin", "menu:add"],
edit: ["admin", "menu:edit"],
del: ["admin", "menu:del"],
},
rules: {
title: [
{ required: true, message: '请输入标题', trigger: 'blur' }
],
path: [
{ required: true, message: '请输入地址', trigger: 'blur' }
]
}
title: [{ required: true, message: "请输入标题", trigger: "blur" }],
path: [{ required: true, message: "请输入地址", trigger: "blur" }],
},
};
},
computed: {
remainingArea() {
return this.formInline.totalArea - this.formInline.incubationArea;
}
},
mounted(){
this.getData()
},
methods: {
// 新增与编辑前做的操作
[CRUD.HOOK.afterToCU](crud, form) {
this.menus = []
if (form.id != null) {
if (form.pid === null) {
form.pid = 0
}
this.getSupDepts(form.id)
} else {
this.menus.push({ id: 0, label: '顶级类目', children: null })
}
handleSuccess(response, file) {
// 处理上传成功
console.log('Upload success:', response, file);
this.formInline.incubatorImage = response.body
// this.fileList.push(file); // 存储已上传文件
// this.tableData.push({
// name: file.name,
// status: '上传成功',
// });
},
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) {
const params = { pid: tree.id }
setTimeout(() => {
crudMenu.getMenus(params).then(res => {
resolve(res.content)
})
}, 100)
handlePreview(file) {
console.log(file);
},
getSupDepts(id) {
crudMenu.getMenuSuperior(id).then(res => {
const children = res.map(function(obj) {
if (!obj.leaf && !obj.children) {
obj.children = null
handleExceed(files, fileList) {
this.$message.warning(
`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${
files.length + fileList.length
} 个文件`
);
},
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
})
this.menus = [{ id: 0, label: '顶级类目', children: children }]
})
},
click: function (e, cmap) {
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 }) {
if (action === LOAD_CHILDREN_OPTIONS) {
crudMenu.getMenusTree(parentNode.id).then(res => {
parentNode.children = res.map(function(obj) {
if (!obj.leaf) {
obj.children = null
}
return obj
})
setTimeout(() => {
callback()
}, 100)
})
}
edit(){
crudHome.edit(this.formInline).then((res) => {
if(res && res.code === 200){
this.$message.warning(res.msg)
}
});
},
getData() {
crudHome.getData().then((res) => {
this.formInline = res.body
this.formInline.incubatorImage = res.body.incubatorImage
// 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) {
this.form.icon = name
}
}
}
this.form.icon = name;
},
},
};
</script>
<style>
.app-main {
background-color: #fff !important;
}
</style>
<style rel="stylesheet/scss" lang="scss" scoped>
::v-deep .el-input-number .el-input__inner {
text-align: left;
.header {
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;
line-height: 30px;
}
.body {
.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>
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