增加导入优化导出

This commit is contained in:
龙运模 2024-07-15 17:24:45 +08:00
parent bb6c776515
commit 6dd9d35ce3
10 changed files with 258 additions and 73 deletions

View File

@ -219,6 +219,21 @@ export default {
post: async function (params) {
return await http.post(this.url,params);
}
},
template:{
url: `${config.API_URL}/company.import.template`,
name: "公司资料导入模版",
responseType: 'arraybuffer',
get: async function (params) {
return await http.get(this.url,params);
}
},
import:{
url: `${config.API_URL}/organization.import`,
name: "公司资料导入",
post: async function (params) {
return await http.post(this.url,params);
}
}
},
dept: {

View File

@ -0,0 +1,13 @@
<template>
<svg t="1721009243835" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3722" width="200" height="200"><path d="M909.0048 936.1152H101.12a74.752 74.752 0 0 1-74.6752-74.6752V184.1152A74.752 74.752 0 0 1 101.12 109.44H451.584a74.752 74.752 0 0 1 74.6752 74.6752 21.4016 21.4016 0 0 1-21.3248 21.3248 21.4016 21.4016 0 0 1-21.3504-21.3248c0-17.7152-14.2848-32-32-32H101.12c-17.7152 0-32 14.2848-32 32V861.44c0 17.7152 14.2848 32 32 32h807.8848c11.7504 0 21.3504 9.6 21.3504 21.3504a21.248 21.248 0 0 1-21.3504 21.3248z" fill="#1367C1" p-id="3723"></path><path d="M909.0048 936.1152a21.4016 21.4016 0 0 1-21.3248-21.3248c0-11.7504 9.6-21.3504 21.3248-21.3504 17.7152 0 32-14.2848 32-32V422.656c0-17.7152-14.2848-32-32-32h-631.04c-17.7152 0-32 14.2848-32 32V709.12a21.4016 21.4016 0 0 1-21.3248 21.3504 21.4016 21.4016 0 0 1-21.3504-21.3504V422.656a74.752 74.752 0 0 1 74.6752-74.6752h631.04a74.752 74.752 0 0 1 74.6752 74.6752V861.44a74.752 74.752 0 0 1-74.6752 74.6752zM748.8 280.576h-190.08a74.752 74.752 0 0 1-74.6752-74.6752V194.816c0-11.7504 9.6-21.3504 21.3248-21.3504 11.7504 0 21.3504 9.6 21.3504 21.3504v11.0848c0 17.7152 14.2848 32 32 32h190.08c11.7248 0 21.3248 9.6 21.3248 21.3248a21.4016 21.4016 0 0 1-21.3248 21.3504z" fill="#1367C1" p-id="3724"></path><path d="M171.52 936.1408h-16.8448a21.4016 21.4016 0 0 1-21.3248-21.3504c0-11.7248 9.6-21.3248 21.3248-21.3248h16.8704c17.6896 0 32-14.3104 32-32v-179.84c0-11.7504 9.6-21.3504 21.3248-21.3504 11.7248 0 21.3248 9.6 21.3248 21.3504v179.84a74.88 74.88 0 0 1-74.6496 74.6496z m666.88-545.28a21.4016 21.4016 0 0 1-21.3248-21.3504v-56.7552c0-17.6896-14.2848-32-32-32h-96.4096a21.4016 21.4016 0 0 1-21.3504-21.3248c0-11.7248 9.6-21.3248 21.3504-21.3248h96.4096a74.752 74.752 0 0 1 74.6752 74.6496v56.7552a21.4016 21.4016 0 0 1-21.3248 21.3248z" fill="#1367C1" p-id="3725"></path><path d="M615.168 818.5856a24.3456 24.3456 0 0 1-24.2688-24.2688v-257.536c0-13.3632 10.9312-24.2688 24.2688-24.2688a24.32 24.32 0 0 1 24.2688 24.2688v257.536a24.32 24.32 0 0 1-24.2688 24.2688z" fill="#A7C0F1" p-id="3726"></path><path d="M719.0784 664.96a24.8576 24.8576 0 0 1-17.2288-7.04l-103.9104-103.8848a24.1664 24.1664 0 1 1 34.2272-34.2272l104.1408 103.8848a24.1664 24.1664 0 0 1-17.2288 41.2672z" fill="#A7C0F1" p-id="3727"></path><path d="M511.0784 664.8832a24.8576 24.8576 0 0 1-17.2288-7.04 24.1664 24.1664 0 0 1 0-34.2272l104.1408-104.1152a24.1664 24.1664 0 1 1 34.2016 34.2272l-104.1152 104.1152a22.912 22.912 0 0 1-16.9984 7.04z" fill="#A7C0F1" p-id="3728"></path></svg>
</template>
<script>
export default {
name: "UploadExcel"
}
</script>
<style scoped>
</style>

View File

@ -9,6 +9,7 @@ export { default as FileExcel } from './FileExcel.vue'
export { default as FilePpt } from './FilePpt.vue'
export { default as Organization } from './Organization.vue'
export { default as Upload } from './Upload.vue'
export { default as UploadExcel } from './UploadExcel.vue'
export { default as Download } from './Download.vue'
export { default as Bell } from './Bell.vue'
export { default as Full } from './Full.vue'

View File

@ -9,7 +9,7 @@
:visible="show"
>
<template #reference>
<el-button :size="size" icon="sc-icon-Download" @click="exportClick">下载</el-button>
<el-button :size="size" icon="sc-icon-Download" @click="exportClick">下载 {{show}}</el-button>
</template>
<template #default>
<div v-for="item in list" :key="item">
@ -30,7 +30,7 @@
export default {
name: "index",
props:{
size:{ type: String, default: "small" },
size:{type: String, default: "small" },
show:{type:Boolean, default: false},
type:{type: String, default: ""}
},
@ -65,7 +65,8 @@ export default {
if(res.data.type == 8){
this.list[2] = item;
}
this.$emit('updateShow',item);
this.$emit('updateShow', item);
if(res.data.status==1){
this.down(res.data);
}

View File

@ -0,0 +1,149 @@
<template>
<el-dialog :title="titleMap[mode]" v-model="visible" :width="560" destroy-on-close draggable @closed="$emit('closed')">
<div class="importBody">
<el-upload
class="upload"
:action="oss.host"
:data="upload_data"
:show-file-list="false"
:on-success="handleSuccess"
:on-error="handleError"
:before-upload="beforeUpload"
drag
multiple
>
<el-icon class="el-icon--upload"><sc-icon-UploadExcel /></el-icon>
<div class="el-upload__text">
<span class="laText">请将Excel拖到此处</span>
<span class="tipText">或点击上传</span><em> Excel</em>
</div>
<template #tip>
<div class="el-upload__tip">
<span class="tip">如果数据导入中途业务出错请不要刷新页面修改后继续点击导入</span>
<span class="btn">
<slot></slot>
</span>
</div>
<div class="importBox">
<div class="name">导入进度</div>
<el-progress class="exportPopover" :text-inside="true" :stroke-width="12" :percentage="67" />
</div>
</template>
</el-upload>
</div>
<template #footer>
<el-button @click="visible=false"> </el-button>
<el-button type="primary">确定导入</el-button>
</template>
</el-dialog>
</template>
<script>
export default {
name: "import",
emits: ['success', 'closed'],
data(){
return{
mode: "import",
titleMap: {
import: '批量导入公司组织'
},
visible: false,
oss:{
host:''
},
upload_data:{}
}
},
mounted() {
},
methods:{
open(mode='import'){
this.mode = mode;
this.visible = true;
return this
},
//
beforeUpload(file){
const text = file.name.split('.').pop();
if(!['xls','xlsx'].includes(text)){
this.$message.warning(`只能选择的excel文件类型`);
return false;
}
return new Promise((resolve)=>{
setTimeout(async ()=>{
let params = {
dir:"user/file/"
}
const res = await this.$API.oss.ossGet.post(params);
this.oss = res.data;
this.upload_data = {
name: new Date().getTime() + file.name,
key: this.oss.dir +file.name,
policy: this.oss.policy,
OSSAccessKeyId: this.oss.accessid,
success_action_status: "200",
callback: this.oss.callback,
signature: this.oss.signature,
"Cache-Control": this.oss.cache_control,
};
resolve()
},100)
})
},
//
handleSuccess(file){
this.imageUrl = this.oss.host+'/'+file.data.filename;
this.$emit('parentParams',this.imageUrl);
},
//
handleError(){
this.$message.warning('上传失败请重新上传');
}
}
}
</script>
<style scoped lang="scss">
.importBody{
padding: 0 20px;
}
.upload .el-icon--upload{
width: 54px;height: 54px;
}
.upload :deep(.el-upload__text){
.laText{
color: var(--el-color-dark);
}
.tipText{
color: var(--el-text-color-placeholder);
}
}
.upload :deep(.el-upload__tip){
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 15px;color: var(--el-text-color-placeholder);
.btn{
color: var(--el-color-primary);
cursor: pointer;
}
}
.importBox{
border: 1px solid var(--el-border-color);
padding: 10px 5px;
margin: 15px 0;
border-radius: 4px;
.name{margin-bottom: 8px;font-size: 13px;}
.exportPopover :deep(.el-progress-bar__innerText){
height: 100%;
display: flex;align-items: center;justify-content: flex-end;
font-size: 10px;
}
}
</style>

View File

@ -27,6 +27,7 @@ import scInput from "./components/scInput";
import scVgInput from "./components/scInput/inputVague";
import scSearch from "./components/scSearch";
import scExport from "./components/scExport";
import scImport from "./components/scImport";
import scStatusIndicator from './components/scMini/scStatusIndicator'
import scTrend from './components/scMini/scTrend'
@ -80,6 +81,7 @@ export default {
app.component('scVgInput', scVgInput);
app.component('scSearch', scSearch);
app.component('scExport', scExport);
app.component('scImport', scImport);
//注册全局指令
app.directive('auth', auth)

View File

@ -249,8 +249,8 @@ const http = {
*/
jsonp: function (url, name = 'jsonp') {
return new Promise((resolve) => {
var script = document.createElement('script')
var _id = `jsonp${Math.ceil(Math.random() * 1000000)}`
const script = document.createElement('script');
const _id = `jsonp${Math.ceil(Math.random() * 1000000)}`;
script.id = _id
script.type = 'text/javascript'
script.src = url

View File

@ -51,21 +51,20 @@
<save-dialog v-if="dialog.save" ref="saveDialog" @success="handleSaveSuccess" @closed="dialog.save=false"></save-dialog>
<see-dialog v-if="dialog.show" ref="showDialog" @closed="dialog.show=false"></see-dialog>
<import-dialog v-if="dialog.import" ref="importDialog" @closed="dialog.import=false"></import-dialog>
<scImport v-if="dialog.import" ref="importDialog" @closed="dialog.import=false">
<div @click="importTemplate">下载导入模版</div>
</scImport>
</template>
<script>
import saveDialog from './save'
import seeDialog from './see'
import importDialog from './import'
export default {
name: 'company',
components: {
saveDialog,
seeDialog,
importDialog
},
data() {
return {
@ -154,6 +153,13 @@ export default {
this.$refs.importDialog.open()
})
},
async importTemplate() {
const res = await this.$API.system.company.template.get();
if(res.code == 200){
console.log(res.data)
}
},
//
table_edit(row){
this.dialog.save = true
@ -224,9 +230,9 @@ export default {
}, 500);
},
//
exportChangeShow(e){
if(e.type == 6){
this.exportShow = e.status==0?true:false
exportChangeShow(params){
if(params.type == 6){
this.exportShow = params.status==0?true:false
}
},
async exportData() {

View File

@ -23,7 +23,6 @@
<script>
import info from './info'
export default {
components: {
info,
@ -73,9 +72,9 @@
}
},
//
exportChangeShow(e){
if(e.type == 8){
this.exportShow = e.status==0?true:false
exportChangeShow(params){
if(params.type == 8){
this.exportShow = params.status==0?true:false
}
},
async exportData() {

View File

@ -11,65 +11,65 @@
</el-container>
</el-aside>
<el-container class="mainHeaderNoBorderPadding">
<el-header style="padding-left: 10px;">
<div class="left-panel">
<el-button type="primary" :size="size" icon="el-icon-plus" @click="add">新增用户</el-button>
<el-button type="danger" plain :size="size" icon="el-icon-delete" :disabled="selection.length==0" @click="batch_del"></el-button>
<el-button type="primary" plain :size="size" :disabled="selection.length==0" @click="role">分配角色</el-button>
<el-button type="primary" plain :size="size" :disabled="selection.length==0" @click="rePwd">密码重置</el-button>
<el-header style="padding-left: 10px;">
<div class="left-panel">
<el-button type="primary" :size="size" icon="el-icon-plus" @click="add">新增用户</el-button>
<el-button type="danger" plain :size="size" icon="el-icon-delete" :disabled="selection.length==0" @click="batch_del"></el-button>
<el-button type="primary" plain :size="size" :disabled="selection.length==0" @click="role">分配角色</el-button>
<el-button type="primary" plain :size="size" :disabled="selection.length==0" @click="rePwd">密码重置</el-button>
</div>
<div class="right-panel">
<div class="right-panel-search">
<scExport :size="size" @exportData="exportData" @updateShow="exportChangeShow" :show="exportShow" type="7"></scExport>
</div>
<div class="right-panel">
<div class="right-panel-search">
<scExport :size="size" @exportData="exportData" @updateShow="exportChangeShow" :show="exportShow" type="7"></scExport>
</div>
</div>
</el-header>
<el-main class="nopadding">
<div class="searchMain searchMainNoTop" style="padding-left: 10px;">
<scSearch ref="scSearch" :searchList="searchList" @fetchSelectData="getSelectData"></scSearch>
</div>
</el-header>
<el-main class="nopadding">
<div class="searchMain searchMainNoTop" style="padding-left: 10px;">
<scSearch ref="scSearch" :searchList="searchList" @fetchSelectData="getSelectData"></scSearch>
<div class="searchItem searchBtn">
<el-button :size="size" :icon="searchShow?'el-icon-ArrowUpBold':'el-icon-ArrowDownBold'" @click="searchShowClick">{{searchShow?'收起':'更多'}}</el-button>
<el-button :size="size" type="primary" icon="el-icon-search" @click="upSearch">查询</el-button>
<el-button :size="size" type="info" icon="el-icon-RefreshRight" @click="reset">重置</el-button>
</div>
<div class="searchItem searchBtn">
<el-button :size="size" :icon="searchShow?'el-icon-ArrowUpBold':'el-icon-ArrowDownBold'" @click="searchShowClick">{{searchShow?'收起':'更多'}}</el-button>
<el-button :size="size" type="primary" icon="el-icon-search" @click="upSearch">查询</el-button>
<el-button :size="size" type="info" icon="el-icon-RefreshRight" @click="reset">重置</el-button>
</div>
<scTable ref="table" :apiObj="list.apiObj" :column="list.column" @selection-change="selectionChange" stripe :size="size">
<el-table-column type="selection" align="center" width="45"></el-table-column>
<sc-table-column label="序号" align="center" type="index"></sc-table-column>
<template #avatar="scope">
<div class="userImg">
<el-avatar :src="scope.row.avatar" size="small"></el-avatar>
</div>
</template>
<template #roles="scope">
<span v-if="scope.row.user_roles">
<span v-for="(em,index) in scope.row.user_roles.role_names" :key="index">
<span>{{em}}</span><span v-if="index+1<scope.row.user_roles.role_names.length"></span>
</span>
</div>
<scTable ref="table" :apiObj="list.apiObj" :column="list.column" @selection-change="selectionChange" stripe :size="size">
<el-table-column type="selection" align="center" width="45"></el-table-column>
<sc-table-column label="序号" align="center" type="index"></sc-table-column>
<template #avatar="scope">
<div class="userImg">
<el-avatar :src="scope.row.avatar" size="small"></el-avatar>
</div>
</template>
<template #roles="scope">
<span v-if="scope.row.user_roles">
<span v-for="(em,index) in scope.row.user_roles.role_names" :key="index">
<span>{{em}}</span><span v-if="index+1<scope.row.user_roles.role_names.length"></span>
</span>
</span>
</template>
<template #active_status="scope">
<el-switch :size="size" v-model="scope.row.active_status" @change="changeSwitch($event, scope.row)" :loading="scope.row.$switch_status" :active-value="true" :inactive-value="false"></el-switch>
</template>
<el-table-column label="操作" fixed="right" align="center" width="160">
<template #default="scope">
<el-dropdown>
<el-button class="noBorderBtn" icon="el-icon-more" :size="size"></el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click="table_show(scope.row, 'show')" icon="sc-icon-See">用户详情</el-dropdown-item>
<el-dropdown-item @click="table_edit(scope.row, 'edit')" icon="sc-icon-Edit">编辑用户</el-dropdown-item>
<el-dropdown-item @click="table_empower(scope.row)" icon="sc-icon-AbilityAuthorization" divided>查看权限</el-dropdown-item>
<el-dropdown-item @click="table_del(scope.row, 'delete')" icon="sc-icon-Delete">删除用户</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</template>
<template #active_status="scope">
<el-switch :size="size" v-model="scope.row.active_status" @change="changeSwitch($event, scope.row)" :loading="scope.row.$switch_status" :active-value="true" :inactive-value="false"></el-switch>
</template>
<el-table-column label="操作" fixed="right" align="center" width="160">
<template #default="scope">
<el-dropdown>
<el-button class="noBorderBtn" icon="el-icon-more" :size="size"></el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click="table_show(scope.row, 'show')" icon="sc-icon-See">用户详情</el-dropdown-item>
<el-dropdown-item @click="table_edit(scope.row, 'edit')" icon="sc-icon-Edit">编辑用户</el-dropdown-item>
<el-dropdown-item @click="table_empower(scope.row)" icon="sc-icon-AbilityAuthorization" divided>查看权限</el-dropdown-item>
<el-dropdown-item @click="table_del(scope.row, 'delete')" icon="sc-icon-Delete">删除用户</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</template>
</el-table-column>
</el-table-column>
</scTable>
</el-main>
</scTable>
</el-main>
</el-container>
</el-container>
@ -85,7 +85,6 @@
import disRoleDialog from './role'
export default {
name: 'user',
components: {
saveDialog, rePwdDialog, disRoleDialog
},
@ -279,9 +278,9 @@
}, 500);
},
//
exportChangeShow(e){
if(e.type == 7){
this.exportShow = e.status==0?true:false
exportChangeShow(params){
if(params.type == 7){
this.exportShow = params.status==0?true:false
}
},
async exportData() {