Przeglądaj źródła

代码生成支持文件上传组件

RuoYi 5 lat temu
rodzic
commit
a445462153

+ 5 - 2
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/GenConstants.java

@@ -76,8 +76,11 @@ public class GenConstants
76 76
     /** 日期控件 */
77 77
     public static final String HTML_DATETIME = "datetime";
78 78
 
79
-    /** 上传控件 */
80
-    public static final String HTML_UPLOAD_IMAGE = "uploadImage";
79
+    /** 图片上传控件 */
80
+    public static final String HTML_IMAGE_UPLOAD = "imageUpload";
81
+
82
+    /** 文件上传控件 */
83
+    public static final String HTML_FILE_UPLOAD = "fileUpload";
81 84
 
82 85
     /** 富文本控件 */
83 86
     public static final String HTML_EDITOR = "editor";

+ 1 - 1
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/domain/GenTableColumn.java

@@ -60,7 +60,7 @@ public class GenTableColumn extends BaseEntity
60 60
     /** 查询方式(EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围) */
61 61
     private String queryType;
62 62
 
63
-    /** 显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、upload上传控件、editor富文本控件) */
63
+    /** 显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件) */
64 64
     private String htmlType;
65 65
 
66 66
     /** 字典类型 */

+ 7 - 2
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/GenUtils.java

@@ -112,10 +112,15 @@ public class GenUtils
112 112
         {
113 113
             column.setHtmlType(GenConstants.HTML_SELECT);
114 114
         }
115
-        // 文件字段设置上传控件
115
+        // 图片字段设置图片上传控件
116 116
         else if (StringUtils.endsWithIgnoreCase(columnName, "image"))
117 117
         {
118
-            column.setHtmlType(GenConstants.HTML_UPLOAD_IMAGE);
118
+            column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD);
119
+        }
120
+        // 文件字段设置文件上传控件
121
+        else if (StringUtils.endsWithIgnoreCase(columnName, "file"))
122
+        {
123
+            column.setHtmlType(GenConstants.HTML_FILE_UPLOAD);
119 124
         }
120 125
         // 内容字段设置富文本控件
121 126
         else if (StringUtils.endsWithIgnoreCase(columnName, "content"))

+ 21 - 6
ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index-tree.vue.vm

@@ -153,9 +153,13 @@
153 153
         <el-form-item label="${comment}" prop="${field}">
154 154
           <el-input v-model="form.${field}" placeholder="请输入${comment}" />
155 155
         </el-form-item>
156
-#elseif($column.htmlType == "uploadImage")
156
+#elseif($column.htmlType == "imageUpload")
157 157
         <el-form-item label="${comment}">
158
-          <uploadImage v-model="form.${field}"/>
158
+          <imageUpload v-model="form.${field}"/>
159
+        </el-form-item>
160
+#elseif($column.htmlType == "fileUpload")
161
+        <el-form-item label="${comment}">
162
+          <imageUpload v-model="form.${field}"/>
159 163
         </el-form-item>
160 164
 #elseif($column.htmlType == "editor")
161 165
         <el-form-item label="${comment}">
@@ -244,8 +248,13 @@ import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${Busin
244 248
 import Treeselect from "@riophae/vue-treeselect";
245 249
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
246 250
 #foreach($column in $columns)
247
-#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "uploadImage")
248
-import UploadImage from '@/components/UploadImage';
251
+#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "imageUpload")
252
+import ImageUpload from '@/components/ImageUpload';
253
+#break
254
+#end
255
+#end
256
+#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "fileUpload")
257
+import FileUpload from '@/components/FileUpload';
249 258
 #break
250 259
 #end
251 260
 #end
@@ -260,8 +269,14 @@ export default {
260 269
   name: "${BusinessName}",
261 270
   components: {
262 271
 #foreach($column in $columns)
263
-#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "uploadImage")
264
-    UploadImage,
272
+#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "imageUpload")
273
+    ImageUpload,
274
+#break
275
+#end
276
+#end
277
+#foreach($column in $columns)
278
+#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "fileUpload")
279
+    FileUpload,
265 280
 #break
266 281
 #end
267 282
 #end

+ 22 - 6
ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index.vue.vm

@@ -185,9 +185,13 @@
185 185
         <el-form-item label="${comment}" prop="${field}">
186 186
           <el-input v-model="form.${field}" placeholder="请输入${comment}" />
187 187
         </el-form-item>
188
-#elseif($column.htmlType == "uploadImage")
188
+#elseif($column.htmlType == "imageUpload")
189 189
         <el-form-item label="${comment}">
190
-          <uploadImage v-model="form.${field}"/>
190
+          <imageUpload v-model="form.${field}"/>
191
+        </el-form-item>
192
+#elseif($column.htmlType == "fileUpload")
193
+        <el-form-item label="${comment}">
194
+          <fileUpload v-model="form.${field}"/>
191 195
         </el-form-item>
192 196
 #elseif($column.htmlType == "editor")
193 197
         <el-form-item label="${comment}">
@@ -274,8 +278,14 @@
274 278
 <script>
275 279
 import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from "@/api/${moduleName}/${businessName}";
276 280
 #foreach($column in $columns)
277
-#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "uploadImage")
278
-import UploadImage from '@/components/UploadImage';
281
+#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "imageUpload")
282
+import ImageUpload from '@/components/ImageUpload';
283
+#break
284
+#end
285
+#end
286
+#foreach($column in $columns)
287
+#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "fileUpload")
288
+import FileUpload from '@/components/FileUpload';
279 289
 #break
280 290
 #end
281 291
 #end
@@ -290,8 +300,14 @@ export default {
290 300
   name: "${BusinessName}",
291 301
   components: {
292 302
 #foreach($column in $columns)
293
-#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "uploadImage")
294
-    UploadImage,
303
+#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "imageUpload")
304
+    ImageUpload,
305
+#break
306
+#end
307
+#end
308
+#foreach($column in $columns)
309
+#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "fileUpload")
310
+    FileUpload,
295 311
 #break
296 312
 #end
297 313
 #end

+ 178 - 0
ruoyi-ui/src/components/FileUpload/index.vue

@@ -0,0 +1,178 @@
1
+<template>
2
+  <div class="upload-file">
3
+    <el-upload
4
+      :action="uploadFileUrl"
5
+      :before-upload="handleBeforeUpload"
6
+      :file-list="fileList"
7
+      :limit="1"
8
+      :on-error="handleUploadError"
9
+      :on-exceed="handleExceed"
10
+      :on-success="handleUploadSuccess"
11
+      :show-file-list="false"
12
+      :headers="headers"
13
+      class="upload-file-uploader"
14
+      ref="upload"
15
+    >
16
+      <!-- 上传按钮 -->
17
+      <el-button size="mini" type="primary">选取文件</el-button>
18
+      <!-- 上传提示 -->
19
+      <div class="el-upload__tip" slot="tip" v-if="showTip">
20
+        请上传
21
+        <template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b> </template>
22
+        <template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>
23
+        的文件
24
+      </div>
25
+    </el-upload>
26
+
27
+    <!-- 文件列表 -->
28
+    <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
29
+      <li :key="file.uid" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in list">
30
+        <el-link :href="file.url" :underline="false" target="_blank">
31
+          <span class="el-icon-document"> {{ getFileName(file.name) }} </span>
32
+        </el-link>
33
+        <div class="ele-upload-list__item-content-action">
34
+          <el-link :underline="false" @click="handleDelete(index)" type="danger">删除</el-link>
35
+        </div>
36
+      </li>
37
+    </transition-group>
38
+  </div>
39
+</template>
40
+
41
+<script>
42
+import { getToken } from "@/utils/auth";
43
+
44
+export default {
45
+  props: {
46
+    // 值
47
+    value: [String, Object, Array],
48
+    // 大小限制(MB)
49
+    fileSize: {
50
+      type: Number,
51
+      default: 5,
52
+    },
53
+    // 文件类型, 例如['png', 'jpg', 'jpeg']
54
+    fileType: {
55
+      type: Array,
56
+      default: () => ["doc", "xls", "ppt", "txt", "pdf"],
57
+    },
58
+    // 是否显示提示
59
+    isShowTip: {
60
+      type: Boolean,
61
+      default: true
62
+    }
63
+  },
64
+  data() {
65
+    return {
66
+      uploadFileUrl: process.env.VUE_APP_BASE_API + "/file/upload", // 上传的图片服务器地址
67
+      headers: {
68
+        Authorization: "Bearer " + getToken(),
69
+      },
70
+      fileList: [],
71
+    };
72
+  },
73
+  computed: {
74
+    // 是否显示提示
75
+    showTip() {
76
+      return this.isShowTip && (this.fileType || this.fileSize);
77
+    },
78
+    // 列表
79
+    list() {
80
+      let temp = 1;
81
+      if (this.value) {
82
+        // 首先将值转为数组
83
+        const list = Array.isArray(this.value) ? this.value : [this.value];
84
+        // 然后将数组转为对象数组
85
+        return list.map((item) => {
86
+          if (typeof item === "string") {
87
+            item = { name: item, url: item };
88
+          }
89
+          item.uid = item.uid || new Date().getTime() + temp++;
90
+          return item;
91
+        });
92
+      } else {
93
+        return [];
94
+      }
95
+    },
96
+  },
97
+  methods: {
98
+    // 上传前校检格式和大小
99
+    handleBeforeUpload(file) {
100
+      // 校检文件类型
101
+      if (this.fileType) {
102
+        let fileExtension = "";
103
+        if (file.name.lastIndexOf(".") > -1) {
104
+          fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
105
+        }
106
+        const isTypeOk = this.fileType.some((type) => {
107
+          if (file.type.indexOf(type) > -1) return true;
108
+          if (fileExtension && fileExtension.indexOf(type) > -1) return true;
109
+          return false;
110
+        });
111
+        if (!isTypeOk) {
112
+          this.$message.error(`文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`);
113
+          return false;
114
+        }
115
+      }
116
+      // 校检文件大小
117
+      if (this.fileSize) {
118
+        const isLt = file.size / 1024 / 1024 < this.fileSize;
119
+        if (!isLt) {
120
+          this.$message.error(`上传文件大小不能超过 ${this.fileSize} MB!`);
121
+          return false;
122
+        }
123
+      }
124
+      return true;
125
+    },
126
+    // 文件个数超出
127
+    handleExceed() {
128
+      this.$message.error(`只允许上传单个文件`);
129
+    },
130
+    // 上传失败
131
+    handleUploadError(err) {
132
+      this.$message.error("上传失败, 请重试");
133
+    },
134
+    // 上传成功回调
135
+    handleUploadSuccess(res, file) {
136
+      this.$message.success("上传成功");
137
+      this.$emit("input", res.data.url);
138
+    },
139
+    // 删除文件
140
+    handleDelete(index) {
141
+      this.fileList.splice(index, 1);
142
+      this.$emit("input", '');
143
+    },
144
+    // 获取文件名称
145
+    getFileName(name) {
146
+      if (name.lastIndexOf("/") > -1) {
147
+        return name.slice(name.lastIndexOf("/") + 1).toLowerCase();
148
+      } else {
149
+        return "";
150
+      }
151
+    }
152
+  },
153
+  created() {
154
+    this.fileList = this.list;
155
+  },
156
+};
157
+</script>
158
+
159
+<style scoped lang="scss">
160
+.upload-file-uploader {
161
+  margin-bottom: 5px;
162
+}
163
+.upload-file-list .el-upload-list__item {
164
+  border: 1px solid #e4e7ed;
165
+  line-height: 2;
166
+  margin-bottom: 10px;
167
+  position: relative;
168
+}
169
+.upload-file-list .ele-upload-list__item-content {
170
+  display: flex;
171
+  justify-content: space-between;
172
+  align-items: center;
173
+  color: inherit;
174
+}
175
+.ele-upload-list__item-content-action .el-link {
176
+  margin-right: 10px;
177
+}
178
+</style>

+ 2 - 2
ruoyi-ui/src/components/UploadImage/index.vue

@@ -43,7 +43,7 @@ export default {
43 43
   data() {
44 44
     return {
45 45
       dialogVisible: false,
46
-      uploadImgUrl: process.env.VUE_APP_BASE_API + "/common/upload", // 上传的图片服务器地址
46
+      uploadImgUrl: process.env.VUE_APP_BASE_API + "/file/upload", // 上传的图片服务器地址
47 47
       headers: {
48 48
         Authorization: "Bearer " + getToken(),
49 49
       },
@@ -60,7 +60,7 @@ export default {
60 60
       this.$emit("input", "");
61 61
     },
62 62
     handleUploadSuccess(res) {
63
-      this.$emit("input", res.url);
63
+      this.$emit("input", res.data.url);
64 64
       this.loading.close();
65 65
     },
66 66
     handleBeforeUpload() {

+ 2 - 1
ruoyi-ui/src/views/tool/gen/editTable.vue

@@ -90,7 +90,8 @@
90 90
                 <el-option label="单选框" value="radio" />
91 91
                 <el-option label="复选框" value="checkbox" />
92 92
                 <el-option label="日期控件" value="datetime" />
93
-                <el-option label="上传控件" value="uploadImage" />
93
+                <el-option label="图片上传" value="imageUpload" />
94
+                <el-option label="文件上传" value="fileUpload" />
94 95
                 <el-option label="富文本控件" value="editor" />
95 96
               </el-select>
96 97
             </template>