main
黄海 9 months ago
parent 621e89c143
commit f7634fbb89

@ -16,3 +16,7 @@ export const getResList = (params: Resource.ReqResourceParams) => {
export const addResData = params => {
return http.post(`/dsRes/res/addResourceBase`, params, { loading: false });
};
export const delResData = params => {
return http.post(`/dsRes/res/delResourceBaseById`, params, { loading: false });
};

@ -77,7 +77,7 @@ const tableReset = () => {
//
const columns = reactive<ColumnProps<Scheme.ResSchemeList>[]>([
{ type: "index", width: 70, label: "序号" },
{ type: "index", width: 100, label: "序号" },
{ prop: "scheme_id", label: "版本ID" },
{ prop: "scheme_name", label: "版本名称" },
{
@ -106,7 +106,7 @@ const columns = reactive<ColumnProps<Scheme.ResSchemeList>[]>([
{ label: "知识点", value: 2, tagType: "success" }
]
},
{ prop: "operation", label: "操作", fixed: "right", width: 330 }
{ prop: "operation", label: "操作", fixed: "right", width: 200 }
]);
const dialogRef = ref<InstanceType<typeof SchemeDialog> | null>(null);

@ -18,7 +18,7 @@ const _toolButton = ["refresh"] as any;
// const proTable = ref<ProTableInstance>();
//
const columns = reactive<ColumnProps<Stage.ResStageList>[]>([
{ type: "index", width: 70, label: "序号" },
{ type: "index", width: 100, label: "序号" },
{ prop: "stage_id", label: "学段ID" },
{ prop: "stage_name", label: "学段名称" }
// { prop: "operation", label: "", fixed: "right", width: 330 }

@ -28,7 +28,7 @@
</el-col>
<el-col :span="4" style="text-align: right">
<el-button type="primary" :icon="Search">搜索</el-button>
<el-button :icon="Delete"> 重置 </el-button>
<!-- <el-button :icon="Delete"> 重置 </el-button> -->
</el-col>
</el-row>
</div>

@ -51,7 +51,7 @@ const stageSelectChange = async e => {
//
const columns = reactive<ColumnProps<Subject.ResSubjectList>[]>([
{ type: "index", width: 70, label: "序号" },
{ type: "index", width: 100, label: "序号" },
{ prop: "subject_id", label: "学科ID" },
{ prop: "subject_name", label: "学科名称" },
{ prop: "subject_code", label: "学科代码" },

@ -1,106 +1,282 @@
<template>
<div class="main-box">
<div class="main-box" @click="visible = false">
<div class="card filter">
<div style="display: flex; justify-content: space-between; margin-bottom: 10px">
<div style="display: flex; align-items: center; font-size: 14px; color: #009688; font-weight: bolder">
{{ sssTxt }}
</div>
<div>
<el-popover placement="right" :width="200" trigger="click" :visible="visible">
<template #reference>
<el-icon style="cursor: pointer" @click="openpopover"><Expand /></el-icon>
</template>
<el-select
v-model="stageSelect"
placeholder="请选择学段"
style="margin-bottom: 10px"
:teleported="false"
@change="stageChange"
>
<el-option v-for="(item, index) in stageList" :key="index" :label="item.stage_name" :value="item.stage_id" />
</el-select>
<el-select
v-model="subjectSelect"
placeholder="请选择学科"
style="margin-bottom: 10px"
:teleported="false"
@change="subjectChange"
>
<el-option v-for="(item, index) in subjectList" :key="index" :label="item.subject_name" :value="item.subject_id" />
</el-select>
<el-select
v-model="schemeSelect"
placeholder="请选择版本"
style="margin-bottom: 10px"
:teleported="false"
@change="schemeChange"
>
<el-option v-for="(item, index) in schemeList" :key="index" :label="item.scheme_name" :value="item.scheme_id" />
</el-select>
<div style="text-align: right">
<el-tooltip :visible="tooltipShow">
<template #content>
<span>请选择版本</span>
</template>
<el-button
type="primary"
size="small"
:icon="Select"
round
@click="well"
@mouseenter="wellenter"
@mouseleave="wellleave"
>确定</el-button
>
</el-tooltip>
</div>
</el-popover>
</div>
</div>
<TreeFilter
label="structure_name"
id="structure_id"
title=""
:refresh-api="getSchemeTreeRefresh"
:data="treeFilterData"
ref="treeFilterRef"
:default-value="initParam.structure_id"
@change="changeTreeFilter"
/>
</div>
<div class="table-box"></div>
<div class="table-box">
<ProTable ref="proTable" :columns="columns" :request-api="getTableList" :initParam="initParam" :requestAuto="false">
<!-- 表格 header 按钮 -->
<template #tableHeader="">
<el-button type="primary" :icon="CirclePlus" @click="openDrawer('上传资源')"></el-button>
</template>
<!-- 表格操作 -->
<template #operation="scope">
<el-button type="primary" link :icon="Delete" @click="deleteSch(scope.row.resource_id_int)"></el-button>
</template>
</ProTable>
<UploadDialog ref="dialogRef" />
</div>
</div>
</template>
<script setup lang="ts">
import { ref, reactive, onMounted } from "vue";
import { Select } from "@element-plus/icons-vue";
import { ProTableInstance, ColumnProps } from "@/components/ProTable/interface";
import { Stage } from "@/api/interface";
import ProTable from "@/components/ProTable/index.vue";
import TreeFilter from "@/components/TreeFilter/index.vue";
import { CirclePlus, Delete } from "@element-plus/icons-vue";
import { ElMessage, ElMessageBox } from "element-plus";
import { getStructureList, getStageList, getSubjectList, getSchemeList } from "@/api/modules/base";
import { getResList } from "@/api/modules/res";
import { getResList, delResData } from "@/api/modules/res";
import UploadDialog from "@/views/res/test/components/uploadDialog.vue";
const treeFilterData = ref<any>([]);
const initParam = reactive({ structure_id: "367554" });
const getSchemeTree = async (scheme_id: number = 500124397) => {
// const { data } = await getStructureList({ scheme_id });
const data = [
{
structure_id: "1",
structure_name: "华东分部",
children: [
{
structure_id: "11",
structure_name: "研发部"
},
{
structure_id: "12",
structure_name: "市场部"
},
{
structure_id: "13",
structure_name: "商务部"
},
{
structure_id: "14",
structure_name: "财务部"
}
]
},
{
structure_id: "2",
structure_name: "华南分部",
children: [
{
structure_id: "21",
structure_name: "研发部"
},
{
structure_id: "22",
structure_name: "市场部"
},
{
structure_id: "23",
structure_name: "商务部"
},
{
structure_id: "24",
structure_name: "财务部"
}
]
},
{
structure_id: "3",
structure_name: "西北分部",
children: [
{
structure_id: "31",
structure_name: "研发部"
},
{
structure_id: "32",
structure_name: "市场部"
},
{
structure_id: "33",
structure_name: "商务部"
},
{
structure_id: "34",
structure_name: "财务部"
}
]
}
];
const stageList = ref<any>([]);
const stageSelect = ref("");
const stageSelectTxt = ref("");
const subjectList = ref<any>([]);
const subjectSelect = ref("");
const subjectSelectTxt = ref("");
const schemeList = ref<any>([]);
const schemeSelect = ref("");
const schemeSelectTxt = ref("");
const structureSelect = ref("");
const sssTxt = ref("");
const visible = ref(false);
const tooltipShow = ref(false);
// ProTable
const proTable = ref<ProTableInstance>();
const initParam = reactive({ structure_id: "" });
const getSchemeTree = async () => {
const { data } = await getStructureList({ scheme_id: schemeSelect.value });
treeFilterData.value = data;
initParam.structure_id = data[0].structure_id.toString();
initParam.structure_id = data[0].structure_id;
};
onMounted(() => {
const getSchemeTreeRefresh = async scheme_id => {
const res = await getStructureList({ scheme_id: schemeSelect.value });
return res;
};
const getTableList = (params: any) => {
return getResList(params);
};
const columns = reactive<ColumnProps<Stage.ResStageList>[]>([
{ type: "index", width: 100, label: "序号" },
{ prop: "resource_title", label: "资源名称" },
{ prop: "extension", label: "资源类型" },
{ prop: "create_time", label: "上传时间" },
{ prop: "operation", label: "操作", fixed: "right", width: 180 }
]);
const treeFilterRef = ref<InstanceType<typeof TreeFilter>>();
const getStageSelectList = async () => {
const res = await getStageList();
stageList.value = res.data.list;
};
const stageChange = async value => {
const res = await getSubjectList({ stage_id: value, pageNum: 1, pageSize: 100 });
subjectList.value = res.data.list;
stageSelectTxt.value = stageList.value.find(item => item.stage_id === value)?.stage_name;
subjectSelect.value = "";
schemeList.value = [];
schemeSelect.value = "";
};
const subjectChange = async value => {
const res = await getSchemeList({
stage_id: stageSelect.value,
subject_id: value,
pageNum: 1,
pageSize: 100
});
schemeList.value = res.data.list;
subjectSelectTxt.value = subjectList.value.find(item => item.subject_id === value)?.subject_name;
schemeSelect.value = "";
};
const schemeChange = value => {
schemeSelectTxt.value = schemeList.value.find(item => item.scheme_id === value)?.scheme_name;
};
const openpopover = e => {
e.stopPropagation();
visible.value = true;
};
const well = () => {
if (schemeSelect.value) {
sssTxt.value = stageSelectTxt.value + "-" + subjectSelectTxt.value + "-" + schemeSelectTxt.value;
treeFilterRef.value?.refresh(schemeSelect.value);
visible.value = false;
}
};
const wellenter = e => {
if (!schemeSelect.value) {
tooltipShow.value = true;
}
};
const wellleave = e => {
tooltipShow.value = false;
};
const getSssSelectList = async () => {
console.log("getSssSelectList");
const resStage = await getStageList();
stageList.value = resStage.data.list;
stageSelect.value = stageList.value[0].stage_id;
stageSelectTxt.value = stageList.value[0].stage_name;
const resSubject = await getSubjectList({ stage_id: stageList.value[0].stage_id, pageNum: 1, pageSize: 100 });
subjectList.value = resSubject.data.list;
subjectSelect.value = subjectList.value[0].subject_id;
subjectSelectTxt.value = subjectList.value[0].subject_name;
const resScheme = await getSchemeList({
stage_id: stageList.value[0].stage_id,
subject_id: subjectList.value[0].subject_id,
pageNum: 1,
pageSize: 100
});
schemeList.value = resScheme.data.list;
schemeSelect.value = schemeList.value[0].scheme_id;
schemeSelectTxt.value = schemeList.value[0].scheme_name;
sssTxt.value = stageSelectTxt.value + "-" + subjectSelectTxt.value + "-" + schemeSelectTxt.value;
getSchemeTree();
};
const changeTreeFilter = (val: string) => {
structureSelect.value = val;
initParam.structure_id = val;
};
const dialogRef = ref<InstanceType<typeof UploadDialog> | null>(null);
const openDrawer = (title: string) => {
const params = {
title,
row: {
stage_id: stageSelect.value,
subject_id: subjectSelect.value,
scheme_id: schemeSelect.value,
structure_id: structureSelect.value
},
getTableList: proTable.value?.getTableList
};
dialogRef.value?.acceptParams(params);
};
//
const deleteSch = async (resource_id_int: number) => {
ElMessageBox.confirm(`是否删除该资源?`, "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
draggable: true
}).then(async () => {
await delResData({ resource_id_int });
ElMessage.success({ message: `成功!` });
proTable.value?.getTableList();
});
};
onMounted(() => {
getSssSelectList();
// getStageSelectList();
});
</script>
<style scoped lang="scss">

@ -1,154 +0,0 @@
<template>
<el-dialog
v-model="dialogFormVisible"
:title="`${paramsProps.title}`"
draggable
append-to-body
:destroy-on-close="true"
width="500"
@close="closeDialog"
>
<el-upload
class="upload-demo"
drag
method="PUT"
:action="signature"
:multiple="true"
:before-upload="uploadBefore"
:on-success="uploadSuccess"
:on-exceed="uploadExceed"
:on-change="uploadChange"
:limit="5"
:show-file-list="true"
list-type="picture"
v-model:file-list="fileList"
>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">拖动文件到此区域 <em>点击上传</em></div>
</el-upload>
</el-dialog>
</template>
<script setup lang="ts" name="uploadDialog">
import { ref, onMounted } from "vue";
import { ElMessage, UploadUserFile } from "element-plus";
import { getFileExtIcon, getUpladFileSignature, addResData } from "@/api/modules/res";
const dialogFormVisible = ref(false);
const fileList = ref<UploadUserFile[]>([]);
const iconList = ref<any>([]);
const signature = ref(
"http://10.10.14.210:9000/dsideal/resources/d0a9a28e-ca25-4844-b6c0-5f66f0fd631b.doc?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AOxWewe7pywwEc1NQeP6%2F20241031%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241031T082920Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=7f596c972b5c22f73a001460504e1aaa905431a32e3dab456e57e9bc40ad7094"
);
const paramsProps = ref<View.DefaultParams>({
title: "",
row: {},
updateId: 0,
getTableList: undefined
});
const acceptParams = (params: View.DefaultParams) => {
paramsProps.value = params;
dialogFormVisible.value = true;
};
const uploadBefore = async rawFile => {
const fileExt = rawFile.name.split(".").pop();
//
const res = await getUpladFileSignature({ extension: fileExt });
signature.value = res.data.signature;
//rawFile
rawFile.file_ext = fileExt;
rawFile.file_name = res.data.object_name;
};
const uploadChange = async (uploadFile, uploadFiles) => {
if (uploadFile.status == "ready") {
const fileExt = uploadFile.name.split(".").pop();
const imageExt = ["jpg", "jpeg", "png", "gif", "bmp"];
const isImage = imageExt.includes(fileExt.toLowerCase());
if (!isImage) {
const extObj = iconList.value.find(item => item.ext === fileExt);
if (extObj) {
uploadFile.url = extObj.thumb_name;
} else {
const extOtherObj = iconList.value.find(item => item.ext === "other");
uploadFile.url = extOtherObj.thumb_name;
}
}
}
};
const uploadSuccess = (response, uploadFile, uploadFiles) => {
setTimeout(() => {
const _index = fileList.value.findIndex(item => item.name === uploadFile.name);
fileList.value.splice(_index, 1);
}, 3000);
addRes(
uploadFile.name.split(".").slice(0, -1).join("."),
uploadFile.size,
uploadFile.raw.file_ext,
uploadFile.raw.file_name,
paramsProps.value.row.scheme_id,
paramsProps.value.row.structure_id,
paramsProps.value.row.stage_id,
paramsProps.value.row.subject_id
);
};
const uploadExceed = () => {
ElMessage.warning(`一次最多只能选择5个文件上传`);
};
const getFileExtIconList = async () => {
const res = await getFileExtIcon();
iconList.value = res.data;
};
const addRes = async (resource_title, resource_size_int, extension, file_name, scheme_id, structure_id, stage_id, subject_id) => {
await addResData({
resource_title,
resource_size_int,
extension,
file_name,
file_md5: "1",
scheme_id,
structure_id,
stage_id,
subject_id
});
};
const closeDialog = () => {
paramsProps.value.getTableList!();
};
onMounted(() => {
getFileExtIconList();
});
defineExpose({
acceptParams
});
</script>
<style scoped lang="scss">
:deep(li) {
height: 50px; /* 设置固定高度 */
}
:deep(.el-upload-list__item) {
margin-top: 0;
}
:deep(.el-upload-list__item-thumbnail) {
height: 30px;
width: none;
}
</style>

@ -1,267 +1,106 @@
<template>
<div class="main-box" @click="visible = false">
<div class="main-box">
<div class="card filter">
<div style="display: flex; justify-content: space-between; margin-bottom: 10px">
<div style="display: flex; align-items: center; font-size: 14px; color: #009688; font-weight: bolder">
{{ sssTxt }}
</div>
<div>
<el-popover placement="right" :width="200" trigger="click" :visible="visible">
<template #reference>
<el-icon style="cursor: pointer" @click="openpopover"><Expand /></el-icon>
</template>
<el-select
v-model="stageSelect"
placeholder="请选择学段"
style="margin-bottom: 10px"
:teleported="false"
@change="stageChange"
>
<el-option v-for="(item, index) in stageList" :key="index" :label="item.stage_name" :value="item.stage_id" />
</el-select>
<el-select
v-model="subjectSelect"
placeholder="请选择学科"
style="margin-bottom: 10px"
:teleported="false"
@change="subjectChange"
>
<el-option v-for="(item, index) in subjectList" :key="index" :label="item.subject_name" :value="item.subject_id" />
</el-select>
<el-select
v-model="schemeSelect"
placeholder="请选择版本"
style="margin-bottom: 10px"
:teleported="false"
@change="schemeChange"
>
<el-option v-for="(item, index) in schemeList" :key="index" :label="item.scheme_name" :value="item.scheme_id" />
</el-select>
<div style="text-align: right">
<el-tooltip :visible="tooltipShow">
<template #content>
<span>请选择版本</span>
</template>
<el-button
type="primary"
size="small"
:icon="Select"
round
@click="well"
@mouseenter="wellenter"
@mouseleave="wellleave"
>确定</el-button
>
</el-tooltip>
</div>
</el-popover>
</div>
</div>
<TreeFilter
label="structure_name"
id="structure_id"
title=""
:refresh-api="getSchemeTreeRefresh"
:data="treeFilterData"
ref="treeFilterRef"
:default-value="initParam.structure_id"
@change="changeTreeFilter"
/>
</div>
<div class="table-box">
<ProTable ref="proTable" :columns="columns" :request-api="getTableList" :initParam="initParam" :requestAuto="false">
<!-- 表格 header 按钮 -->
<template #tableHeader="">
<el-button type="primary" :icon="CirclePlus" @click="openDrawer('上传资源')"></el-button>
</template>
<!-- 表格操作 -->
<template #operation="scope">
<!-- <el-button type="primary" link :icon="Delete" @click="deleteSch(scope.row.scheme_id)"></el-button> -->
</template>
</ProTable>
<UploadDialog ref="dialogRef" />
</div>
<div class="table-box"></div>
</div>
</template>
<script setup lang="ts">
import { ref, reactive, onMounted } from "vue";
import { Select } from "@element-plus/icons-vue";
import { ProTableInstance, ColumnProps } from "@/components/ProTable/interface";
import { Stage } from "@/api/interface";
import ProTable from "@/components/ProTable/index.vue";
import TreeFilter from "@/components/TreeFilter/index.vue";
import { CirclePlus, Delete, EditPen } from "@element-plus/icons-vue";
import { ElMessage } from "element-plus";
import { getStructureList, getStageList, getSubjectList, getSchemeList } from "@/api/modules/base";
import { getResList } from "@/api/modules/res";
import UploadDialog from "@/views/res/test/components/uploadDialog.vue";
const treeFilterData = ref<any>([]);
const stageList = ref<any>([]);
const stageSelect = ref("");
const stageSelectTxt = ref("");
const subjectList = ref<any>([]);
const subjectSelect = ref("");
const subjectSelectTxt = ref("");
const schemeList = ref<any>([]);
const schemeSelect = ref("");
const schemeSelectTxt = ref("");
const structureSelect = ref("");
const sssTxt = ref("");
const visible = ref(false);
const tooltipShow = ref(false);
// ProTable
const proTable = ref<ProTableInstance>();
const initParam = reactive({ structure_id: "" });
const getSchemeTree = async () => {
const { data } = await getStructureList({ scheme_id: schemeSelect.value });
treeFilterData.value = data;
initParam.structure_id = data[0].structure_id;
};
const getSchemeTreeRefresh = async scheme_id => {
const res = await getStructureList({ scheme_id: schemeSelect.value });
return res;
};
const getTableList = (params: any) => {
return getResList(params);
};
const columns = reactive<ColumnProps<Stage.ResStageList>[]>([
{ type: "index", width: 70, label: "序号" },
{ prop: "resource_title", label: "资源名称" },
{ prop: "extension", label: "资源类型" },
{ prop: "create_time", label: "上传时间" }
// { prop: "operation", label: "", fixed: "right", width: 330 }
]);
const treeFilterRef = ref<InstanceType<typeof TreeFilter>>();
const getStageSelectList = async () => {
const res = await getStageList();
stageList.value = res.data.list;
};
const stageChange = async value => {
const res = await getSubjectList({ stage_id: value, pageNum: 1, pageSize: 100 });
subjectList.value = res.data.list;
stageSelectTxt.value = stageList.value.find(item => item.stage_id === value)?.stage_name;
subjectSelect.value = "";
schemeList.value = [];
schemeSelect.value = "";
};
const subjectChange = async value => {
const res = await getSchemeList({
stage_id: stageSelect.value,
subject_id: value,
pageNum: 1,
pageSize: 100
});
schemeList.value = res.data.list;
subjectSelectTxt.value = subjectList.value.find(item => item.subject_id === value)?.subject_name;
schemeSelect.value = "";
};
const schemeChange = value => {
schemeSelectTxt.value = schemeList.value.find(item => item.scheme_id === value)?.scheme_name;
};
const openpopover = e => {
e.stopPropagation();
visible.value = true;
};
const well = () => {
if (schemeSelect.value) {
sssTxt.value = stageSelectTxt.value + "-" + subjectSelectTxt.value + "-" + schemeSelectTxt.value;
treeFilterRef.value?.refresh(schemeSelect.value);
visible.value = false;
}
};
const wellenter = e => {
if (!schemeSelect.value) {
tooltipShow.value = true;
}
};
const wellleave = e => {
tooltipShow.value = false;
};
const getSssSelectList = async () => {
console.log("getSssSelectList");
const resStage = await getStageList();
stageList.value = resStage.data.list;
stageSelect.value = stageList.value[0].stage_id;
stageSelectTxt.value = stageList.value[0].stage_name;
const resSubject = await getSubjectList({ stage_id: stageList.value[0].stage_id, pageNum: 1, pageSize: 100 });
subjectList.value = resSubject.data.list;
subjectSelect.value = subjectList.value[0].subject_id;
subjectSelectTxt.value = subjectList.value[0].subject_name;
const resScheme = await getSchemeList({
stage_id: stageList.value[0].stage_id,
subject_id: subjectList.value[0].subject_id,
pageNum: 1,
pageSize: 100
});
schemeList.value = resScheme.data.list;
schemeSelect.value = schemeList.value[0].scheme_id;
schemeSelectTxt.value = schemeList.value[0].scheme_name;
sssTxt.value = stageSelectTxt.value + "-" + subjectSelectTxt.value + "-" + schemeSelectTxt.value;
getSchemeTree();
};
const changeTreeFilter = (val: string) => {
structureSelect.value = val;
initParam.structure_id = val;
};
const dialogRef = ref<InstanceType<typeof UploadDialog> | null>(null);
const openDrawer = (title: string) => {
const params = {
title,
row: {
stage_id: stageSelect.value,
subject_id: subjectSelect.value,
scheme_id: schemeSelect.value,
structure_id: structureSelect.value
const initParam = reactive({ structure_id: "367554" });
const getSchemeTree = async (scheme_id: number = 500124397) => {
// const { data } = await getStructureList({ scheme_id });
const data = [
{
structure_id: "1",
structure_name: "华东分部",
children: [
{
structure_id: "11",
structure_name: "研发部"
},
{
structure_id: "12",
structure_name: "市场部"
},
{
structure_id: "13",
structure_name: "商务部"
},
{
structure_id: "14",
structure_name: "财务部"
}
]
},
{
structure_id: "2",
structure_name: "华南分部",
children: [
{
structure_id: "21",
structure_name: "研发部"
},
{
structure_id: "22",
structure_name: "市场部"
},
{
structure_id: "23",
structure_name: "商务部"
},
{
structure_id: "24",
structure_name: "财务部"
}
]
},
getTableList: proTable.value?.getTableList
};
dialogRef.value?.acceptParams(params);
{
structure_id: "3",
structure_name: "西北分部",
children: [
{
structure_id: "31",
structure_name: "研发部"
},
{
structure_id: "32",
structure_name: "市场部"
},
{
structure_id: "33",
structure_name: "商务部"
},
{
structure_id: "34",
structure_name: "财务部"
}
]
}
];
treeFilterData.value = data;
initParam.structure_id = data[0].structure_id.toString();
};
onMounted(() => {
getSssSelectList();
// getStageSelectList();
getSchemeTree();
});
</script>
<style scoped lang="scss">

Loading…
Cancel
Save