目录
一. 主页
(一). 实现功能
主页配置:
动态更改订阅模块的顺序、显示。
数据库添加字段,设置部分模块重置效果。
我的数据:
根据用户需求选择各个模块配置。存在配置文件。根据用户需求动态化设计。
模块数据部分展示,展示前十条。
模块位置动态展示。
模块内容关键字跳转。
查看全部按钮,展示全部数据。
(二). 实现效果
1.主页配置
1.1主页配置弹窗
1.2拖拽排序
1.3模块订阅
1.4列数更改
1.5重置订阅
2.我的数据
2.1主页数据展示
2.2查看全部跳转
2.3主页链接跳转
2.4查看全部链接跳转
2.5echarts展示数据
(二). 实现代码
1.主页+订阅弹窗页面
dashboard文件夹=>index.vue
<template>
<div class="dashboard-container firstPage">
<div class="dashboard-text">
<el-card style="min-height: calc(100vh - 120px)">
<div slot="header" class="card-title">
<span>我的数据</span>
<el-button type="primary" @click="showSubscribe" style="float: right"
>主页配置</el-button
>
</div>
<el-row :gutter="15" v-loading="pageLoading">
<el-col
:span="24 / subscribe.layoutCols"
class="dataBox align-center"
v-for="item in subscribe.sortedItems"
:key="item.name"
>
<component
:is="item.name"
:user="user"
:colNum="subscribe.layoutCols"
>
</component>
</el-col>
</el-row>
</el-card>
</div>
<!-- 订阅的弹窗 -->
<el-dialog
title="主页配置"
:visible.sync="subscribe.show"
width="40%"
:before-close="closedia"
class="a1"
>
<el-form style="height:600px,overflow:hidden">
<el-form-item label="布局列数:">
<el-select v-model="subscribe.colNum" placeholder="请选择布局列数">
<el-option label="2列" value="2"> </el-option>
<el-option label="3列" value="3"> </el-option>
<el-option label="4列" value="4"> </el-option>
</el-select>
</el-form-item>
<el-form-item label="订阅模块:">
<div class="drags">
<div
class="item"
:class="'item' + subscribe.colNum"
v-for="(item, index) in subscribe.items"
:key="item + index + 'key'"
draggable
@dragstart="startDrag($event, item)"
@dragover.prevent="handDragOver($event, item)"
@dragenter="handDragEnter($event, item)"
@dragend="endDrag($event, item)"
:style="{ background: item.color }"
:ref="item.color"
>
<div class="bc">
<div class="item-title">{{ item.cname }}</div>
<el-switch
v-model="item.subscribed"
inactive-color="#ff4949"
active-text="订阅"
inactive-text="取消"
>
</el-switch>
</div>
</div>
</div>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="success" @click="updateConfigurationListByRole"
>重 置</el-button
>
<el-button type="primary" @click="updateUserConfiguration"
>确 定</el-button
>
</span>
</el-dialog>
</div>
</template>
<script>
import { mapGetters, mapState } from "vuex";
import MyCounts from "./components/statisticsAnalysis/myCount";
import FileCount from "./components/statisticsAnalysis/fileCount";
import MyMessages from "./components/statisticsAnalysis/MyMsgs";
import MyAssigns from "./components/statisticsAnalysis/TaskCount";
import MyDataStatistics from "./components/statisticsAnalysis/dataCount";
import MyOperations from "./components/statisticsAnalysis/myOperates";
import MyTools from "./components/statisticsAnalysis/toolsRunning";
import MyProjects from "./components/myDatas/myProjects";
import MyItems from "./components/myDatas/myAnalysisTargets";
import MyVersions from "./components/myDatas/myVersions";
import MyModels from "./components/myDatas/myModels";
import MySolvingFiles from "./components/myDatas/mySolvingFiles";
import MyReports from "./components/myDatas/myReports";
import MyResults from "./components/myDatas/myReuslts";
import MyAllKeyResults from "./components/myDatas/myAllKeyResult";
import MyToDoTaskNode from "./components/myDatas/myToDoTaskNode";
import MyApproval from "./components/myDatas/myApply";
import MyTasks from "./components/myDatas/myWork";
import MyCreateTask from "./components/myDatas/myCreateTask";
import MyPersonInfo from "./components/myDatas/myPersonInfo";
import { getUserConfiguration } from "@/api/statistics";
import { getAllConfiguration } from "@/api/statistics";
import { updateUserConfiguration } from "@/api/statistics";
import { findConfigurationListByRole } from "@/api/statistics";
export default {
name: "Dashboard",
computed: {
...mapGetters(["name"]),
...mapState({
user: (state) => state.user.user,
}),
},
components: {
// CountTo,
MyCounts,
FileCount,
MyMessages,
MyAssigns,
MyDataStatistics,
MyOperations,
MyTools,
MyProjects,
MyItems,
MyVersions,
MyModels,
MySolvingFiles,
MyReports,
MyResults,
MyAllKeyResults,
MyToDoTaskNode,
MyTasks,
MyCreateTask,
MyApproval,
MyPersonInfo,
},
data() {
return {
pageLoading: false,
subscribe: {
colNum: 3,
layoutCols: 3,
objectid: "",
show: false,
ending: null,
dragging: null,
items: [],
sortedItems: [],
cacheItems: [],
cacheCols: 3,
},
defaultConfig: {
column: 4,
default: [],
},
allConfig: [],
};
},
methods: {
// 获取个人主页配置
getUserConfiguration() {
return getUserConfiguration();
},
// 获取全部主页配置
getAllConfiguration() {
return getAllConfiguration();
},
// 根据用户角色获取默认配置
findConfigurationListByRole() {
return findConfigurationListByRole();
},
async configuration() {
let UserConfiguration = await this.getUserConfiguration();
let AllConfiguration = await this.getAllConfiguration();
let DefaultConfiguration = await this.findConfigurationListByRole();
let userConfig = UserConfiguration.data;
let allConfig = AllConfiguration.data;
let defaultConfig = DefaultConfiguration.data;
console.log(userConfig);
console.log(allConfig);
this.allConfig = JSON.parse(JSON.stringify(allConfig));
this.defaultConfig = defaultConfig;
let subscribeid =
userConfig.subscribe.length != 0
? userConfig.subscribe
: defaultConfig.default;
var subed = [];
for (var item of subscribeid) {
for (var allItem of allConfig) {
if (allItem.objectid == item) {
allItem.subscribed = true;
subed.push(allItem);
break;
}
}
}
var notSub = allConfig.filter((item) => {
if (!subscribeid.includes(item.objectid)) {
item.subscribed = false;
return item
}
});
var config = [...subed, ...notSub];
console.log(config);
// var config = allConfig.map((item) => {
// item.subscribed = subscribeid.includes(item.objectid) ? true : false;
// return item;
// });
this.subscribe.items = JSON.parse(JSON.stringify(config));
console.log(this.subscribe.items);
this.subscribe.colNum =
userConfig.column.length != 0
? userConfig.column
: defaultConfig.column;
// this.subscribe.objectid = userconfig.objectid;
this.sortConfirm();
this.pageLoading = false;
},
// 更新个人主页
updateUserConfiguration() {
var user = JSON.parse(localStorage.getItem("user")); //数组对象
let userId = user.objectid;
var subids = [];
for (var item of this.subscribe.items) {
if (item.subscribed == true) {
subids.push(item.objectid);
}
}
let data = {
user: userId,
column: this.subscribe.colNum,
subscribeList: subids,
};
updateUserConfiguration(data).then((res) => {
if (res) {
console.log(res);
this.sortConfirm();
}
});
},
// 根据用户角色获取默认配置
updateConfigurationListByRole() {
let arr = this.allConfig.map((item) => {
item.subscribed = this.defaultConfig.default.includes(item.objectid)
? true
: false;
return item;
});
this.subscribe.items = JSON.parse(JSON.stringify(arr));
this.subscribe.colNum = this.defaultConfig.column;
},
startDrag(e, item) {
console.log(e, item);
this.subscribe.dragging = item;
console.log(this.$refs[item.color]);
},
handDragOver(e, item) {
console.log(e, item);
e.dataTransfer.dropEffect = "move";
},
handDragEnter(e, item) {
console.log(e, item);
e.dataTransfer.effectAllowed = "move";
this.subscribe.ending = item;
},
endDrag(e, item) {
console.log(e, item);
if (this.subscribe.ending.name === this.subscribe.dragging.name) {
return;
}
let newItems = [...this.subscribe.items];
const src = newItems.indexOf(this.subscribe.dragging);
const dst = newItems.indexOf(this.subscribe.ending);
newItems.splice(src, 1);
newItems.splice(dst, 0, this.subscribe.dragging);
this.subscribe.items = newItems;
this.$nextTick(() => {
this.subscribe.dragging = null;
this.subscribe.ending = null;
});
},
showSubscribe() {
this.subscribe.show = true;
},
sortConfirm() {
this.subscribe.sortedItems = this.subscribe.items.filter((v) => {
return v.subscribed;
});
this.subscribe.layoutCols = this.subscribe.colNum;
this.subscribe.cacheItems = this.subscribe.items;
this.subscribe.cacheCols = this.subscribe.colNum;
this.subscribe.show = false;
},
closedia(done) {
this.subscribe.items = this.subscribe.cacheItems;
this.subscribe.colNum = this.subscribe.cacheCols;
if (done) {
done();
}
},
},
created() {
this.pageLoading = true;
this.configuration();
},
mounted() {},
};
</script>
<style lang="scss" scoped>
.a1{
height: 100%;
::v-deep .el-dialog__body{
height: 40rem;
overflow: auto;
}
}
.dashboard {
&-container {
margin: 30px;
}
}
.firstPage {
.card-title {
font-size: 20px;
font-weight: bold;
}
::v-deep .dataBox {
height: calc(50vh - 150px);
margin-bottom: 15px;
.border-box {
border: 1px solid #eef;
border-radius: 5px;
height: calc(50vh - 150px);
box-sizing: border-box;
padding: 15px 0;
}
#smChart {
height: 100px;
width: 200px;
}
.readBox {
line-height: 28px;
}
.card-sub-title {
font-size: 18px;
font-weight: bold;
line-height: 20px;
.messageIcon {
color: #409eff;
font-size: 18px;
display: inline-block;
vertical-align: middle;
margin: 0 5px;
}
.messageNum {
display: inline-block;
vertical-align: middle;
font-size: 14px;
color: #679;
margin: 0 5px;
}
}
.chartTitle {
font-size: 18px;
font-weight: bold;
padding-left: 15px;
}
.middleChartBox {
height: 300px;
}
.chartBox {
height: 300px;
}
.label {
color: #999;
}
.bo {
font-size: 30px;
}
.card-panel-num {
font-size: 40px;
line-height: 200px;
}
}
::v-deep .drags {
display: flex;
flex-wrap: wrap;
.item {
height: 100px;
// width: 200px;
// background: #f5f9ff;
margin-right: 20px;
margin-bottom: 20px;
text-align: center;
.bc {
width: calc(100% -20px);
background: #f5f9ff;
}
.item-title {
line-height: 60px;
}
&.item2 {
width: calc(50% - 20px);
}
&.item3 {
width: calc(33% - 20px);
}
&.item4 {
width: calc(25% - 20px);
}
}
.el-switch__label--left {
&.is-active {
color: #ff4949;
}
}
.el-switch__label--right.is-active {
&.is-active {
color: #1890ff;
}
}
}
}
</style>
2.订阅模块
点击查看订阅模块实现代码
3.订阅模块配置文件
{
"myAllKeyResult": {
"label": [
"名称",
"性能结果类型",
"创建者",
"所有者",
"创建时间",
"结果",
"描述"
]
},
"myAnalysisTargets": {
"label": [
"对象名称",
"项目",
"分析对象定义",
"上层分析对象",
"创建者",
"所有者",
"创建时间",
"描述"
]
},
"myApply": {
"label": [
"名称",
"审批对象名称",
"类型",
"申请时间",
"状态"
]
},
"myCreateTask": {
"label": [
"任务名称",
"项目",
"版本",
"阶段",
"类型",
"上层任务",
"任务负责人",
"创建时间",
"任务状态"
]
},
"myModels": {
"label": [
"模型名称",
"版本方案",
"项目",
"分析对象",
"阶段",
"模型定义",
"模型实例类型",
"上层模型",
"格式",
"密级",
"创建者",
"所有者",
"创建时间",
"描述"
]
},
"myProjects": {
"label": [
"项目名称",
"项目长名",
"项目类型",
"上层项目",
"创建者",
"所有者",
"创建时间",
"项目状态",
"描述"
]
},
"myReports": {
"label": [
"名称",
"项目",
"关联数据",
"密级",
"报告类型",
"创建者",
"所有者",
"创建时间",
"描述"
]
},
"myReuslts": {
"label": [
"名称",
"项目",
"分析对象",
"版本",
"模型定义",
"结果类型",
"分析类型",
"计算文件",
"格式",
"研制阶段",
"创建者",
"所有者",
"创建时间",
"结果描述"
]
},
"mySolvingFiles": {
"label": [
"模型名称",
"项目",
"分析对象",
"版本方案",
"模型实例类型",
"模型定义",
"分析类型",
"分析工具",
"格式",
"密级",
"阶段",
"创建者",
"所有者",
"创建时间",
"描述"
]
},
"myToDoTaskNode": {
"label": [
"名称",
"审批对象名称",
"申请人",
"类型",
"申请时间"
]
},
"myVersions": {
"label": [
"版本名称",
"分析对象",
"项目",
"分析对象定义",
"版本方案定义",
"上层版本方案",
"阶段",
"创建者",
"所有者",
"创建时间",
"描述"
]
},
"myWork": {
"label": [
"任务名称",
"项目",
"版本",
"阶段",
"类型",
"上层任务",
"任务负责人",
"创建时间",
"任务状态"
]
}
}
4.查看全部(组件复用)
myDatasList文件夹=>index.vue
<template>
<div class="dashboard-container firstPage">
<div class="dashboard-text">
<el-card class="box-card" style="min-height: calc(100vh - 80px)">
<div slot="header" class="clearfix">
<span>{{$route.query.title}}</span>
</div>
<!-- 我的项目 -->
<myProjects :page='currentPage' :pagesize="pagesize" @retotal="totalChange" v-if=" $route.query.title === '我的项目' "></myProjects>
<!-- 我的分析对象 -->
<myItems :page='currentPage' :pagesize="pagesize" @retotal="totalChange" v-if=" $route.query.title === '我的分析对象' "></myItems>
<!-- 我的版本方案 -->
<myVersions :page='currentPage' :pagesize="pagesize" @retotal="totalChange" v-if=" $route.query.title === '我的版本方案' "></myVersions>
<!-- 我的模型 -->
<myModels :page='currentPage' :pagesize="pagesize" @retotal="totalChange" v-if=" $route.query.title==='我的模型'"></myModels>
<!-- 我的求解文件 -->
<mySolvingFiles :page='currentPage' :pagesize="pagesize" @retotal="totalChange" v-if=" $route.query.title === '我的求解文件'" ></mySolvingFiles>
<!-- 我的分析报告 -->
<myReports :page='currentPage' :pagesize="pagesize" @retotal="totalChange" v-if=" $route.query.title === '我的分析报告' "></myReports>
<!-- 我的仿真结果 -->
<myResults :page='currentPage' :pagesize="pagesize" @retotal="totalChange" v-if=" $route.query.title === '我的仿真结果'" ></myResults>
<!-- 我的性能结果 -->
<myAllKeyResults :page='currentPage' :pagesize="pagesize" @retotal="totalChange" v-if=" $route.query.title === '我的性能结果' "></myAllKeyResults>
<!-- 我的任务 -->
<myTasks :page='currentPage' :pagesize="pagesize" @retotal="totalChange" v-if=" $route.query.title === '我的任务' "></myTasks>
<!-- 我创建的任务 -->
<myCreateTask :page='currentPage' :pagesize="pagesize" @retotal="totalChange" v-if=" $route.query.title === '我创建的任务' "></myCreateTask>
<!-- 我的审批申请 -->
<myApproval :page='currentPage' :pagesize="pagesize" @retotal="totalChange" v-if=" $route.query.title === '我的审批申请' "></myApproval>
<!-- 我的代办审批 -->
<myToDoTaskNode :page='currentPage' :pagesize="pagesize" @retotal="totalChange" v-if=" $route.query.title === '我的代办审批'"></myToDoTaskNode>
<div class="mt15" style="text-align: right">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 20, 30, 40]"
:page-size="pagesize"
layout="total, prev, pager, next, sizes, jumper"
:total="total"
>
</el-pagination>
</div>
</el-card>
</div>
</div>
</template>
<script>
import MyProjects from "../dashboard/components/myDatas/myProjects";
import MyItems from "../dashboard/components/myDatas/myAnalysisTargets";
import MyVersions from "../dashboard/components/myDatas/myVersions";
import MyModels from "../dashboard/components/myDatas/myModels";
import MySolvingFiles from "../dashboard/components/myDatas/mySolvingFiles";
import MyReports from "../dashboard/components/myDatas/myReports";
import MyResults from "../dashboard/components/myDatas/myReuslts";
import MyAllKeyResults from "../dashboard/components/myDatas/myAllKeyResult";
import MyToDoTaskNode from "../dashboard/components/myDatas/myToDoTaskNode";
import MyApproval from "../dashboard/components/myDatas/myApply";
import MyTasks from "../dashboard/components/myDatas/myWork";
import MyCreateTask from "../dashboard/components/myDatas/myCreateTask";
export default {
name: "myDatasList",
components: {
MyProjects,
MyItems,
MyVersions,
MyModels,
MySolvingFiles,
MyReports,
MyResults,
MyAllKeyResults,
MyToDoTaskNode,
MyApproval,
MyTasks,
MyCreateTask,
},
data(){
return{
currentPage:1,
pagesize:10,
total:0,
}
},
methods:{
totalChange(val){
this.total = val;
this.prev = val
},
handleSizeChange(val){
this.pagesize = val
this.$emit("add",this.page)
this.$emit("add",this.pagesize)
},
handleCurrentChange(val){
this.currentPage = val
},
},
};
</script>
二. 更改所有者
(一)实现功能
校验登录用户身份,校验不同文件类型,更改所对应所有者。
(二)实现效果
(三)实现代码
1.dialog
<template>
<div class="updateOwner">
<el-dialog
title="更改所有者"
:visible.sync="value"
width="500px"
:before-close="handleClose"
:close-on-click-modal="false"
@close="handleAssignUserClose"
>
<el-form
:inline="true"
ref="assignUserForm"
:model="formInline"
class="demo-form-inline"
>
<el-form-item label="项目" required>
<el-cascader
v-model="formInline.project"
:options="projectData"
:props="projectProps"
placeholder="请选择项目"
clearable
:disabled="true"
>
</el-cascader>
</el-form-item>
</el-form>
<div class="projectBox">
<el-tag style="margin: 2px" size="small">
{{ currentowner.name }}
</el-tag>
</div>
<el-table
:data="tableData"
border
style="width: 100%"
class="mt15"
size="mini"
>
<el-table-column prop="realName" label="用户名"> </el-table-column>
<!-- <el-table-column prop="name" label="账户"> </el-table-column> -->
<el-table-column label="操作" width="100">
<template slot-scope="scope">
<el-button
type="text"
size="mini"
v-if="!(scope.row.userId==currentowner.id)"
@click="handleAdd(scope.row)"
>更改</el-button
>
</template>
</el-table-column>
</el-table>
<div class="mt15 align-right clear">
<el-pagination
@current-change="handleCurrentChange"
:current-page.sync="currentPage"
:page-size="10"
layout="total, prev, pager, next, jumper"
:total="total"
size="mini"
>
</el-pagination>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="handleAssignUserClose">取 消</el-button>
<el-button type="primary" @click="assignProjectForUser"
>提 交</el-button
>
</span>
</el-dialog>
</div>
</template>
<script>
import { updateAuth } from '@/utils/statusCode'
import { findAllRole } from "@/api/authorization/role";
import { getUserListByPage } from "@/api/authorization/user";
import request from "@/utils/request";
import { mapState } from "vuex";
export default {
name: "updateOwner",
computed: {
...mapState({
user: (state) => state.user.user,
}),
},
props: {
value: {
type: Boolean,
default: false,
required: true,
},
projectData: {
type: Array,
},
updateAcObj: {
type: Object,
},
// ownerId: { type: String },
},
data() {
return {
projectProps: {
value: "objectid",
label: "name",
children: "children",
checkStrictly: true,
},
updateAuth,
tableData: [],
currentPage: 1,
total: 0,
formInline: {},
userList: [],
expirationDate: "",
roleList: [],
associatedUserList: [],
projectUserList: [],
currentowner: { name: "", id: "" },
};
},
methods: {
initForm(projectDetail) {
// debugger
this.currentowner.id = this.updateAcObj.ownerId;
this.formInline.project = projectDetail.objectid;
this.formInline.parentProject = projectDetail.parent;
this.getUsersByProjectId(this.formInline.project);
this.$emit("input", true);
},
assignProjectForUser() {
let typeObj = {
project: 1,
item: 2,
version: 3,
model: 4,
inputDeck: 5,
result: 6,
report: 7,
imageResult: 9,
valueResult: 10,
docResult: 11,
movieResult: 12,
curveResult: 13,
itemDef: 15,
versionDef: 16,
Scenario: 17,
modelDef: 18,
studyDoc:19,
studyDocTag:20
};
let data = {
objectId: this.updateAcObj.objectId,
type: typeObj[this.updateAcObj.type],
owner: this.currentowner.id,
};
console.log(data);
request({
url: "/datamanager/updateAuth/updateOwner",
method: "get",
params: data,
})
.then((res) => {
this.$message.success("分配成功");
this.handleClose();
this.$emit("refreshBasic", {
owner: this.currentowner.name,
ownerId: this.currentowner.id,
});
})
.catch((err) => {
this.$message.error("请添加用户!");
});
return;
},
getUsersByProjectId(projectId) {
this.getUserListByPage();
},
handleAdd(row) {
// debugger
this.currentowner.name = row.realName;
this.currentowner.id = row.userId;
},
handleCurrentChange(val) {
this.currentPage = val;
this.getUserListByPage();
},
getUserListByPage() {
var self = this;
let data = {
start: this.currentPage,
limit: 10,
userRealName: this.formInline.userRealName || "",
};
getUserListByPage(data).then((res) => {
if (res) {
this.tableData = res.data.records;
for (let i = 0; i < this.tableData.length; i++) {
this.tableData[i].dis = false;
this.tableData[i].roleId = this.roleList[0].ownerid;
for (let j = 0; j < this.associatedUserList.length; j++) {
if (
this.associatedUserList[j].objectid == this.tableData[i].userId
) {
this.tableData[i].transmit =
this.associatedUserList[j].transmit;
this.tableData[i].dis = true;
this.tableData[i].roleId = this.associatedUserList[j].role;
}
}
this.tableData[i].realName =
"" + self.tableData[i].lastname + self.tableData[i].firstname;
if (this.tableData[i].userId === this.currentowner.id) {
this.currentowner.name = this.tableData[i].realName;
}
}
this.total = res.data.total;
}
});
},
findAllRole() {
findAllRole().then((res) => {
if (res) {
res.data.forEach((item) => {
if (item.type == 2) {
this.roleList.push(item);
}
});
}
});
},
handleAssignUserClose() {
this.associatedUserList = [];
this.currentPage = 1;
this.formInline = {
realName: null,
};
this.$emit("input", false);
},
async handleClose(done) {
await this.$emit("input", false);
done();
},
},
created() {
this.findAllRole();
},
};
</script>
<style lang="scss" scoped>
.assignUser {
.label {
line-height: 40px;
width: 100px;
}
}
</style>
2.code值
export var updateAuth = {
"item": '202',//分析对象更改所有者'
"version": '205',//'版本方案更改所有者'
"model": '208',//:'模型更改所有者'
"inputDeck": '211',//:'计算文件更改所有者'
"result": '214',//:'结果更改所有者'
"keyResult": '217',//:'性能结果更改所有者'
"report": '220',//:'报告更改所有者'
"docTags":"223",//文档分类更改所有者
"docs":"226",//知识文档更改所有者
"project":"227",//项目更改所有者
"itemDef":"228",//对象定义更改所有者
"versionDef":"229",//版本方案定义更改所有者
"modelDef":"230",//模型定义更改所有者
"scenario":"231",//分析类型更改所有者
}
3.按钮
<div class="fl btnItem" :class="{ disabled: editStatus }" @click="!editStatus ? updateOwner() : null" v-if="updateAcObj.showBtn">
<svg-icon icon-class="user" class="btnIcon" />
<p>更改所有者</p>
<i class="el-icon-setting smIcon"></i>
</div>
<!-- 更改所有者 -->
<updateOwner
ref="updateOwner"
v-model="updateOwnerVisible"
:updateAcObj="updateAcObj"
:projectData="projectData"
@refreshBasic="updOwner"
></updateOwner>
import updateOwner from "@/components/project/updateOwner";
updateOwner() {
this.$refs.updateOwner.initForm(this.projectDetail);
},