Procházet zdrojové kódy

!821 文件管理列表添加编辑按钮,支持修改上传文件的信息
Merge pull request !821 from capad1946/feature/edit-upload-file

zuohuaijun před 2 roky
rodič
revize
3a8aee9a32

+ 2 - 0
Admin.NET/Admin.NET.Core/SeedData/SysMenuSeedData.cs

@@ -136,6 +136,8 @@ public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
             new SysMenu{ Id=1310000000393, Pid=1310000000391, Title="上传", Permission="sysFile:uploadFile", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
             new SysMenu{ Id=1310000000394, Pid=1310000000391, Title="下载", Permission="sysFile:downloadFile", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
             new SysMenu{ Id=1310000000395, Pid=1310000000391, Title="删除", Permission="sysFile:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
+            new SysMenu{ Id=1310000000396, Pid=1310000000391, Title="编辑", Permission="sysFile:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2023-10-27 00:00:00"), OrderNo=100 },
+
 
             new SysMenu{ Id=1310000000401, Pid=1310000000301, Title="打印模板", Path="/platform/print", Name="sysPrint", Component="/system/print/index", Icon="ele-Printer", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=190 },
             new SysMenu{ Id=1310000000402, Pid=1310000000401, Title="查询", Permission="sysPrint:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },

+ 1 - 0
Admin.NET/Admin.NET.Core/SeedData/SysRoleMenuSeedData.cs

@@ -109,6 +109,7 @@ public class SysRoleMenuSeedData : ISqlSugarEntitySeedData<SysRoleMenu>
             new SysRoleMenu{ Id=1300000000293, RoleId=1300000000101, MenuId=1310000000393 },
             new SysRoleMenu{ Id=1300000000294, RoleId=1300000000101, MenuId=1310000000394 },
             new SysRoleMenu{ Id=1300000000295, RoleId=1300000000101, MenuId=1310000000395 },
+            new SysRoleMenu{ Id=1300000000296, RoleId=1300000000101, MenuId=1310000000396 },
 
             //// 日志管理
             //new SysRoleMenu{ Id=1300000000301, RoleId=1300000000101, MenuId=1310000000501 },

+ 1 - 0
Admin.NET/Admin.NET.Core/Service/File/Dto/FileInput.cs

@@ -11,6 +11,7 @@ namespace Admin.NET.Core.Service;
 
 public class FileInput : BaseIdInput
 {
+    public string FileName { get; set; }
 }
 
 public class PageFileInput : BasePageInput

+ 24 - 0
Admin.NET/Admin.NET.Core/Service/File/SysFileService.cs

@@ -174,6 +174,30 @@ public class SysFileService : IDynamicApiController, ITransient
         }
     }
 
+    /// <summary>
+    /// 更新上传文件信息
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [ApiDescriptionSettings(Name = "Update"), HttpPost]
+    [DisplayName("更新上传文件的信息")]
+    public async Task UpdateSysFile(FileInput input)
+    {
+        var isExist = await _sysFileRep.IsAnyAsync(u => u.Id == input.Id);
+        if (!isExist) throw Oops.Oh(ErrorCodeEnum.D8000);
+
+        // await _sysFileRep.UpdateAsync(input.Adapt<SysFile>());
+
+        await _sysFileRep
+            .AsUpdateable()
+            .SetColumns(x => new SysFile()
+            {
+                FileName = input.FileName
+            })
+            .Where(x => x.Id == input.Id)
+            .ExecuteCommandAsync();
+    }
+
     /// <summary>
     /// 获取文件
     /// </summary>

+ 83 - 0
Web/src/api-services/apis/sys-file-api.ts

@@ -174,6 +174,54 @@ export const SysFileApiAxiosParamCreator = function (configuration?: Configurati
                 options: localVarRequestOptions,
             };
         },
+        /**
+         * 
+         * @summary 更新上传文件信息
+         * @param {FileInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysFileUpdatePost: async (body?: FileInput, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysFile/update`;
+            // use dummy base URL string because the URL constructor only accepts absolute URLs.
+            const localVarUrlObj = new URL(localVarPath, 'https://example.com');
+            let baseOptions;
+            if (configuration) {
+                baseOptions = configuration.baseOptions;
+            }
+            const localVarRequestOptions :AxiosRequestConfig = { method: 'POST', ...baseOptions, ...options};
+            const localVarHeaderParameter = {} as any;
+            const localVarQueryParameter = {} as any;
+
+            // authentication Bearer required
+            // http bearer authentication required
+            if (configuration && configuration.accessToken) {
+                const accessToken = typeof configuration.accessToken === 'function'
+                    ? await configuration.accessToken()
+                    : await configuration.accessToken;
+                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
+            }
+
+            localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
+
+            const query = new URLSearchParams(localVarUrlObj.search);
+            for (const key in localVarQueryParameter) {
+                query.set(key, localVarQueryParameter[key]);
+            }
+            for (const key in options.params) {
+                query.set(key, options.params[key]);
+            }
+            localVarUrlObj.search = (new URLSearchParams(query)).toString();
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+            const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json';
+            localVarRequestOptions.data =  needsSerialization ? JSON.stringify(body !== undefined ? body : {}) : (body || "");
+
+            return {
+                url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
+                options: localVarRequestOptions,
+            };
+        },
         /**
          * 
          * @summary 上传头像
@@ -487,6 +535,20 @@ export const SysFileApiFp = function(configuration?: Configuration) {
                 return axios.request(axiosRequestArgs);
             };
         },
+        /**
+         * 
+         * @summary 更新上传文件信息
+         * @param {FileInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysFileUpdatePost(body?: FileInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
+            const localVarAxiosArgs = await SysFileApiAxiosParamCreator(configuration).apiSysFileUpdatePost(body, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
         /**
          * 
          * @summary 上传头像
@@ -597,6 +659,16 @@ export const SysFileApiFactory = function (configuration?: Configuration, basePa
         async apiSysFilePagePost(body?: PageFileInput, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSqlSugarPagedListSysFile>> {
             return SysFileApiFp(configuration).apiSysFilePagePost(body, options).then((request) => request(axios, basePath));
         },
+        /**
+         * 
+         * @summary 更新上传文件信息
+         * @param {FileInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysFileUpdatePost(body?: FileInput, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
+            return SysFileApiFp(configuration).apiSysFileUpdatePost(body, options).then((request) => request(axios, basePath));
+        },
         /**
          * 
          * @summary 上传头像
@@ -691,6 +763,17 @@ export class SysFileApi extends BaseAPI {
     public async apiSysFilePagePost(body?: PageFileInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSqlSugarPagedListSysFile>> {
         return SysFileApiFp(this.configuration).apiSysFilePagePost(body, options).then((request) => request(this.axios, this.basePath));
     }
+    /**
+     * 
+     * @summary 更新上传文件信息
+     * @param {FileInput} [body] 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysFileApi
+     */
+    public async apiSysFileUpdatePost(body?: FileInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
+        return SysFileApiFp(this.configuration).apiSysFileUpdatePost(body, options).then((request) => request(this.axios, this.basePath));
+    }
     /**
      * 
      * @summary 上传头像

+ 6 - 0
Web/src/api-services/models/file-input.ts

@@ -23,4 +23,10 @@ export interface FileInput {
      * @memberof FileInput
      */
     id: number;
+    /**
+     * 
+     * @type {string}
+     * @memberof FileInput
+     */
+    fileName?: string | null;
 }

+ 85 - 0
Web/src/views/system/file/component/editSysfile.vue

@@ -0,0 +1,85 @@
+<template>
+	<div class="sys-file-container">
+		<el-dialog v-model="state.isShowDialog" draggable :close-on-click-modal="false" width="500px">
+			<template #header>
+				<div style="color: #fff">
+					<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-Edit /> </el-icon>
+					<span> {{ props.title }} </span>
+				</div>
+			</template>
+			<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto">
+				<el-row>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						<el-form-item label="文件名称" prop="fileName" :rules="[{ required: true, message: '文件名称不能为空', trigger: 'blur' }]">
+							<el-input v-model="state.ruleForm.fileName" placeholder="文件名称" clearable />
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="cancel">取 消</el-button>
+					<el-button type="primary" @click="submit">确 定</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script lang="ts" setup name="sysEditFile">
+import { reactive, ref } from 'vue';
+
+import { ElMessage } from 'element-plus';
+import { getAPI } from '/@/utils/axios-utils';
+import { SysFileApi } from '/@/api-services/api';
+import { FileInput } from '/@/api-services/models';
+
+const props = defineProps({
+	title: String,
+	sysFileId: Number,
+});
+const emits = defineEmits(['handleQuery']);
+const ruleFormRef = ref();
+const state = reactive({
+	isShowDialog: false,
+	ruleForm: {} as FileInput,
+});
+
+// 打开弹窗
+const openDialog = (row: any) => {
+	state.ruleForm = JSON.parse(JSON.stringify(row));
+	state.isShowDialog = true;
+	ruleFormRef.value?.resetFields();
+};
+
+// 关闭弹窗
+const closeDialog = () => {
+	emits('handleQuery');
+	state.isShowDialog = false;
+};
+
+// 取消
+const cancel = () => {
+	state.isShowDialog = false;
+};
+
+// 提交
+const submit = () => {
+	ruleFormRef.value.validate(async (valid: boolean) => {
+		if (!valid) return;
+		if (state.ruleForm.id != undefined && state.ruleForm.id > 0) {
+			await getAPI(SysFileApi).apiSysFileUpdatePost(state.ruleForm).then(rsp=>{
+				if(rsp.data.code == 200){
+					ElMessage.success('修改文件信息成功!');
+				}else{
+					Elmessage.error('修改文件信息失败:' + rsp.data.message)
+				}
+			});
+		} 
+		closeDialog();
+	});
+};
+
+// 导出对象
+defineExpose({ openDialog });
+</script>

+ 12 - 1
Web/src/views/system/file/index.vue

@@ -54,11 +54,12 @@
 				<el-table-column prop="id" label="存储标识" align="center" show-overflow-tooltip />
 				<el-table-column prop="createUserId" label="上传者Id" align="center" show-overflow-tooltip />
 				<el-table-column prop="createTime" label="创建时间" align="center" show-overflow-tooltip />
-				<el-table-column label="操作" width="200" fixed="right" align="center" show-overflow-tooltip>
+				<el-table-column label="操作" width="260" fixed="right" align="center" show-overflow-tooltip>
 					<template #default="scope">
 						<el-button icon="ele-View" size="small" text type="primary" @click="openFilePreviewDialog(scope.row)" v-auth="'sysFile:delete'"> 预览 </el-button>
 						<el-button icon="ele-Download" size="small" text type="primary" @click="downloadFile(scope.row)" v-auth="'sysFile:downloadFile'"> 下载 </el-button>
 						<el-button icon="ele-Delete" size="small" text type="danger" @click="delFile(scope.row)" v-auth="'sysFile:delete'"> 删除 </el-button>
+						<el-button icon="ele-Edit" size="small" text type="primary" @click="openEditSysFile(scope.row)" v-auth="'sysFile:update'"> 编辑 </el-button>
 					</template>
 				</el-table-column>
 			</el-table>
@@ -111,6 +112,7 @@
 			<vue-office-pdf :src="state.pdfUrl" style="height: 100vh" @rendered="renderedHandler" @error="errorHandler"
 		/></el-drawer>
 		<el-image-viewer v-if="state.showViewer" :url-list="state.previewList" @close="state.showViewer = false"></el-image-viewer>
+		<EditSysFile ref="editSysFileRef" title="编辑文件" @handleQuery="handleQuery" />
 	</div>
 </template>
 
@@ -123,6 +125,8 @@ import VueOfficePdf from '@vue-office/pdf';
 import '@vue-office/docx/lib/index.css';
 import '@vue-office/excel/lib/index.css';
 
+import EditSysFile from '/@/views/system/file/component/editSysFile.vue';
+
 import { downloadByUrl } from '/@/utils/download';
 import { getAPI } from '/@/utils/axios-utils';
 import { SysFileApi } from '/@/api-services/api';
@@ -130,6 +134,7 @@ import { SysFile } from '/@/api-services/models';
 
 // const baseUrl = window.__env__.VITE_API_URL;
 const uploadRef = ref<UploadInstance>();
+const editSysFileRef = ref<InstanceType<typeof EditSysFile>>();
 const state = reactive({
 	loading: false,
 	fileData: [] as Array<SysFile>,
@@ -144,6 +149,7 @@ const state = reactive({
 		total: 0 as any,
 	},
 	dialogUploadVisible: false,
+	diaglogEditFile: false,
 	fileList: [] as any,
 	dialogDocxVisible: false,
 	dialogXlsxVisible: false,
@@ -266,6 +272,11 @@ const getFileUrl = (row: SysFile): string => {
 	}
 };
 
+// 打开编辑页面
+const openEditSysFile = (row: any) => {
+	editSysFileRef.value?.openDialog(row);
+};
+
 // 文件渲染完成
 const renderedHandler = () => {};
 // 文件渲染失败