Browse Source

fix: file upload key loss #120

vben 4 years ago
parent
commit
29461a8568

+ 3 - 0
.env.development

@@ -14,5 +14,8 @@ VITE_DROP_CONSOLE = false
 # Basic interface address SPA
 VITE_GLOB_API_URL=/api
 
+# File upload address, optional
+VITE_GLOB_UPLOAD_URL=/upload
+
 # Interface prefix
 VITE_GLOB_API_URL_PREFIX=

+ 4 - 0
.env.production

@@ -13,6 +13,10 @@ VITE_BUILD_GZIP = false
 # Basic interface address SPA
 VITE_GLOB_API_URL=/api
 
+# File upload address, optional
+# It can be forwarded by nginx or write the actual address directly
+VITE_GLOB_UPLOAD_URL=/upload
+
 # Interface prefix
 VITE_GLOB_API_URL_PREFIX=
 

+ 3 - 0
CHANGELOG.zh_CN.md

@@ -11,6 +11,7 @@
 - i18n 支持 vscode `i18n-ally`插件
 - 新增多级路由缓存示例
 - 打包代码拆分(试验)
+- 提取上传地址到全局变量,打包可以动态配置
 
 ### ⚡ Performance Improvements
 
@@ -23,6 +24,7 @@
 - 升级`ant-design-vue`到`2.0.0-rc.3`
 - 重新引入`vueuse`
 - 移除 route meta 内的`afterCloseLoading`属性
+- 文档更新
 
 ### 🐛 Bug Fixes
 
@@ -31,6 +33,7 @@
 - 修复顶部菜单宽度计算问题
 - 修复表格 tabSetting 问题
 - 修复文件上传删除失效
+- 修复表格行编辑保存错误问题
 
 ## 2.0.0-rc.12 (2020-11-30)
 

+ 3 - 4
src/api/sys/upload.ts

@@ -1,10 +1,9 @@
 import { UploadApiResult } from './model/uploadModel';
 import { defHttp } from '/@/utils/http/axios';
 import { UploadFileParams } from '/@/utils/http/axios/types';
+import { useGlobSetting } from '/@/hooks/setting';
 
-enum Api {
-  UPLOAD_URL = '/upload',
-}
+const { uploadUrl = '' } = useGlobSetting();
 
 /**
  * @description: Upload interface
@@ -15,7 +14,7 @@ export function uploadApi(
 ) {
   return defHttp.uploadFile<UploadApiResult>(
     {
-      url: Api.UPLOAD_URL,
+      url: uploadUrl,
       onUploadProgress,
     },
     params

+ 1 - 0
src/components/Excel/src/Export2Excel.ts

@@ -31,6 +31,7 @@ export function jsonToSheetXlsx<T = any>({
   writeFile(workbook, filename, write2excelOpts);
   /* at this point, out.xlsb will have been downloaded */
 }
+
 export function aoaToSheetXlsx<T = any>({
   data,
   header,

+ 2 - 1
src/components/Excel/src/ImportExcel.vue

@@ -17,7 +17,7 @@
   import type { ExcelData } from './types';
   export default defineComponent({
     name: 'ImportExcel',
-    emits: ['success'],
+    emits: ['success', 'error'],
     setup(_, { emit }) {
       const inputRef = ref<HTMLInputElement | null>(null);
       const loadingRef = ref<Boolean>(false);
@@ -82,6 +82,7 @@
               resolve('');
             } catch (error) {
               reject(error);
+              emit('error');
             } finally {
               loadingRef.value = false;
             }

+ 1 - 0
src/components/Excel/src/types.ts

@@ -17,6 +17,7 @@ export interface JsonToSheet<T = any> {
   json2sheetOpts?: JSON2SheetOpts;
   write2excelOpts?: WritingOptions;
 }
+
 export interface AoAToSheet<T = any> {
   data: T[][];
   header?: T[];

+ 0 - 1
src/components/Form/src/types/index.ts

@@ -93,7 +93,6 @@ export type ComponentType =
   | 'SelectOption'
   | 'TreeSelect'
   | 'Transfer'
-  // | 'Radio'
   | 'RadioButtonGroup'
   | 'RadioGroup'
   | 'Checkbox'

+ 1 - 0
src/components/Menu/src/BasicMenu.tsx

@@ -190,6 +190,7 @@ export default defineComponent({
       const { appendClass } = props;
       const isAppendActiveCls =
         appendClass && level === 1 && menu.path === unref(currentParentPath);
+
       const levelCls = [
         `${prefixCls}-item__level${level}`,
         ` ${menuState.theme} `,

+ 2 - 2
src/components/Upload/src/FileList.tsx

@@ -38,9 +38,9 @@ export default defineComponent({
             </tr>
           </thead>
           <tbody>
-            {dataSource.map((record = {}) => {
+            {dataSource.map((record = {}, index) => {
               return (
-                <tr class="file-table-tr" key={record.uuid}>
+                <tr class="file-table-tr" key={`${index + record.name || ''}`}>
                   {columnList.map((item) => {
                     const { dataIndex = '', customRender, align = 'center' } = item;
                     const render = customRender && isFunction(customRender);

+ 2 - 0
src/hooks/setting/index.ts

@@ -18,6 +18,7 @@ const {
   VITE_GLOB_API_URL,
   VITE_GLOB_APP_SHORT_NAME,
   VITE_GLOB_API_URL_PREFIX,
+  VITE_GLOB_UPLOAD_URL,
 } = ENV;
 
 if (!reg.test(VITE_GLOB_APP_SHORT_NAME)) {
@@ -33,6 +34,7 @@ export const useGlobSetting = (): Readonly<GlobConfig> => {
     apiUrl: VITE_GLOB_API_URL,
     shortName: VITE_GLOB_APP_SHORT_NAME,
     urlPrefix: VITE_GLOB_API_URL_PREFIX,
+    uploadUrl: VITE_GLOB_UPLOAD_URL,
   };
   return glob as Readonly<GlobConfig>;
 };

+ 2 - 0
src/types/config.d.ts

@@ -129,6 +129,7 @@ export interface GlobConfig {
   title: string;
   // 项目路径
   apiUrl: string;
+  uploadUrl?: string;
   urlPrefix?: string;
   shortName: string;
 }
@@ -139,6 +140,7 @@ export interface GlobEnvConfig {
   VITE_GLOB_API_URL: string;
   VITE_GLOB_API_URL_PREFIX?: string;
   VITE_GLOB_APP_SHORT_NAME: string;
+  VITE_GLOB_UPLOAD_URL?: string;
 }
 
 interface GlobWrap {

+ 2 - 2
src/views/demo/excel/ArrayExport.vue

@@ -11,11 +11,11 @@
 <script lang="ts">
   import { defineComponent } from 'vue';
   import { BasicTable } from '/@/components/Table';
-  import { aoaToSheetXlsx, ExportExcelModel } from '/@/components/Excel';
+  import { aoaToSheetXlsx } from '/@/components/Excel';
   import { arrHeader, arrData, columns, data } from './data';
 
   export default defineComponent({
-    components: { BasicTable, ExportExcelModel },
+    components: { BasicTable },
     setup() {
       function aoaToExcel() {
         // 保证data顺序与header一致

+ 3 - 2
src/views/demo/excel/JsonExport.vue

@@ -12,11 +12,11 @@
 <script lang="ts">
   import { defineComponent } from 'vue';
   import { BasicTable } from '/@/components/Table';
-  import { jsonToSheetXlsx, ExportExcelModel } from '/@/components/Excel';
+  import { jsonToSheetXlsx } from '/@/components/Excel';
   import { columns, data } from './data';
 
   export default defineComponent({
-    components: { BasicTable, ExportExcelModel },
+    components: { BasicTable },
     setup() {
       function defaultHeader() {
         // 默认Object.keys(data[0])作为header
@@ -25,6 +25,7 @@
           filename: '使用key作为默认头部.xlsx',
         });
       }
+
       function customHeader() {
         jsonToSheetXlsx({
           data,