Merge branch 'master' of https://gitee.com/y_project/RuoYi-Vue
Conflicts:
ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java
ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java
ruoyi-generator/src/main/resources/vm/vue/index.vue.vm
ruoyi-ui/package.json
ruoyi-ui/src/components/HeaderSearch/index.vue
ruoyi-ui/src/main.js
ruoyi-ui/src/views/tool/gen/editTable.vue
ruoyi-ui/src/views/tool/gen/index.vue
| | |
| | | /** æ¥ææ§ä»¶ */ |
| | | public static final String HTML_DATETIME = "datetime"; |
| | | |
| | | /** ä¸ä¼ æ§ä»¶ */ |
| | | public static final String HTML_UPLOAD_IMAGE = "uploadImage"; |
| | | /** å¾çä¸ä¼ æ§ä»¶ */ |
| | | public static final String HTML_IMAGE_UPLOAD = "imageUpload"; |
| | | |
| | | /** æä»¶ä¸ä¼ æ§ä»¶ */ |
| | | public static final String HTML_FILE_UPLOAD = "fileUpload"; |
| | | |
| | | /** å¯ææ¬æ§ä»¶ */ |
| | | public static final String HTML_EDITOR = "editor"; |
| | |
| | | { |
| | | column.setHtmlType(GenConstants.HTML_SELECT); |
| | | } |
| | | // æä»¶å段设置ä¸ä¼ æ§ä»¶ |
| | | // å¾çåæ®µè®¾ç½®å¾çä¸ä¼ æ§ä»¶ |
| | | else if (StringUtils.endsWithIgnoreCase(columnName, "image")) |
| | | { |
| | | column.setHtmlType(GenConstants.HTML_UPLOAD_IMAGE); |
| | | column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD); |
| | | } |
| | | // æä»¶å段设置æä»¶ä¸ä¼ æ§ä»¶ |
| | | else if (StringUtils.endsWithIgnoreCase(columnName, "file")) |
| | | { |
| | | column.setHtmlType(GenConstants.HTML_FILE_UPLOAD); |
| | | } |
| | | // å
容忮µè®¾ç½®å¯ææ¬æ§ä»¶ |
| | | else if (StringUtils.endsWithIgnoreCase(columnName, "content")) |
| | |
| | | <el-form-item label="${comment}" prop="${field}">
|
| | | <el-input v-model="form.${field}" placeholder="请è¾å
¥${comment}" />
|
| | | </el-form-item>
|
| | | #elseif($column.htmlType == "uploadImage")
|
| | | #elseif($column.htmlType == "imageUpload")
|
| | | <el-form-item label="${comment}">
|
| | | <uploadImage v-model="form.${field}"/>
|
| | | <imageUpload v-model="form.${field}"/>
|
| | | </el-form-item>
|
| | | #elseif($column.htmlType == "fileUpload")
|
| | | <el-form-item label="${comment}">
|
| | | <imageUpload v-model="form.${field}"/>
|
| | | </el-form-item>
|
| | | #elseif($column.htmlType == "editor")
|
| | | <el-form-item label="${comment}">
|
| | |
| | | import Treeselect from "@riophae/vue-treeselect";
|
| | | import "@riophae/vue-treeselect/dist/vue-treeselect.css";
|
| | | #foreach($column in $columns)
|
| | | #if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "uploadImage")
|
| | | import UploadImage from '@/components/UploadImage';
|
| | | #if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "imageUpload")
|
| | | import ImageUpload from '@/components/ImageUpload';
|
| | | #break
|
| | | #end
|
| | | #end
|
| | | #if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "fileUpload")
|
| | | import FileUpload from '@/components/FileUpload';
|
| | | #break
|
| | | #end
|
| | | #end
|
| | |
| | | name: "${BusinessName}",
|
| | | components: {
|
| | | #foreach($column in $columns)
|
| | | #if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "uploadImage")
|
| | | UploadImage,
|
| | | #if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "imageUpload")
|
| | | ImageUpload,
|
| | | #break
|
| | | #end
|
| | | #end
|
| | | #foreach($column in $columns)
|
| | | #if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "fileUpload")
|
| | | FileUpload,
|
| | | #break
|
| | | #end
|
| | | #end
|
| | |
| | | <el-form-item label="${comment}" prop="${field}"> |
| | | <el-input v-model="form.${field}" placeholder="请è¾å
¥${comment}" /> |
| | | </el-form-item> |
| | | #elseif($column.htmlType == "uploadImage") |
| | | #elseif($column.htmlType == "imageUpload") |
| | | <el-form-item label="${comment}"> |
| | | <uploadImage v-model="form.${field}"/> |
| | | <imageUpload v-model="form.${field}"/> |
| | | </el-form-item> |
| | | #elseif($column.htmlType == "fileUpload") |
| | | <el-form-item label="${comment}"> |
| | | <fileUpload v-model="form.${field}"/> |
| | | </el-form-item> |
| | | #elseif($column.htmlType == "editor") |
| | | <el-form-item label="${comment}"> |
| | |
| | | <script> |
| | | import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName}, export${BusinessName} } from "@/api/${moduleName}/${businessName}"; |
| | | #foreach($column in $columns) |
| | | #if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "uploadImage") |
| | | import UploadImage from '@/components/UploadImage'; |
| | | #if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "imageUpload") |
| | | import ImageUpload from '@/components/ImageUpload'; |
| | | #break |
| | | #end |
| | | #end |
| | | #foreach($column in $columns) |
| | | #if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "fileUpload") |
| | | import FileUpload from '@/components/FileUpload'; |
| | | #break |
| | | #end |
| | | #end |
| | |
| | | name: "${BusinessName}", |
| | | components: { |
| | | #foreach($column in $columns) |
| | | #if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "uploadImage") |
| | | UploadImage, |
| | | #if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "imageUpload") |
| | | ImageUpload, |
| | | #break |
| | | #end |
| | | #end |
| | | #foreach($column in $columns) |
| | | #if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "fileUpload") |
| | | FileUpload, |
| | | #break |
| | | #end |
| | | #end |
| | |
| | | "element-ui": "2.14.1", |
| | | "file-saver": "2.0.4", |
| | | "fuse.js": "6.4.3", |
| | | "highlight.js": "10.4.1", |
| | | "highlight.js": "9.18.5", |
| | | "js-beautify": "1.13.0", |
| | | "js-cookie": "2.2.1", |
| | | "jsencrypt": "3.0.0-rc.1", |
| | |
| | | "eslint": "7.15.0", |
| | | "eslint-plugin-vue": "7.2.0", |
| | | "lint-staged": "10.5.3", |
| | | "sass": "1.30.0", |
| | | "runjs": "4.4.2", |
| | | "sass": "1.32.0", |
| | | "sass-loader": "10.1.0", |
| | | "script-ext-html-webpack-plugin": "2.1.5", |
| | | "svg-sprite-loader": "5.1.1", |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template>
|
| | | <div class="upload-file">
|
| | | <el-upload
|
| | | :action="uploadFileUrl"
|
| | | :before-upload="handleBeforeUpload"
|
| | | :file-list="fileList"
|
| | | :limit="1"
|
| | | :on-error="handleUploadError"
|
| | | :on-exceed="handleExceed"
|
| | | :on-success="handleUploadSuccess"
|
| | | :show-file-list="false"
|
| | | :headers="headers"
|
| | | class="upload-file-uploader"
|
| | | ref="upload"
|
| | | >
|
| | | <!-- ä¸ä¼ æé® -->
|
| | | <el-button size="mini" type="primary">éåæä»¶</el-button>
|
| | | <!-- ä¸ä¼ æç¤º -->
|
| | | <div class="el-upload__tip" slot="tip" v-if="showTip">
|
| | | 请ä¸ä¼
|
| | | <template v-if="fileSize"> 大å°ä¸è¶
è¿ <b style="color: #f56c6c">{{ fileSize }}MB</b> </template>
|
| | | <template v-if="fileType"> æ ¼å¼ä¸º <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>
|
| | | çæä»¶
|
| | | </div>
|
| | | </el-upload>
|
| | |
|
| | | <!-- æä»¶å表 -->
|
| | | <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
|
| | | <li :key="file.uid" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in list">
|
| | | <el-link :href="file.url" :underline="false" target="_blank">
|
| | | <span class="el-icon-document"> {{ getFileName(file.name) }} </span>
|
| | | </el-link>
|
| | | <div class="ele-upload-list__item-content-action">
|
| | | <el-link :underline="false" @click="handleDelete(index)" type="danger">å é¤</el-link>
|
| | | </div>
|
| | | </li>
|
| | | </transition-group>
|
| | | </div>
|
| | | </template>
|
| | |
|
| | | <script>
|
| | | import { getToken } from "@/utils/auth";
|
| | |
|
| | | export default {
|
| | | props: {
|
| | | // å¼
|
| | | value: [String, Object, Array],
|
| | | // 大å°éå¶(MB)
|
| | | fileSize: {
|
| | | type: Number,
|
| | | default: 5,
|
| | | },
|
| | | // æä»¶ç±»å, ä¾å¦['png', 'jpg', 'jpeg']
|
| | | fileType: {
|
| | | type: Array,
|
| | | default: () => ["doc", "xls", "ppt", "txt", "pdf"],
|
| | | },
|
| | | // æ¯å¦æ¾ç¤ºæç¤º
|
| | | isShowTip: {
|
| | | type: Boolean,
|
| | | default: true
|
| | | }
|
| | | },
|
| | | data() {
|
| | | return {
|
| | | uploadFileUrl: process.env.VUE_APP_BASE_API + "/common/upload", // ä¸ä¼ çå¾çæå¡å¨å°å
|
| | | headers: {
|
| | | Authorization: "Bearer " + getToken(),
|
| | | },
|
| | | fileList: [],
|
| | | };
|
| | | },
|
| | | computed: {
|
| | | // æ¯å¦æ¾ç¤ºæç¤º
|
| | | showTip() {
|
| | | return this.isShowTip && (this.fileType || this.fileSize);
|
| | | },
|
| | | // å表
|
| | | list() {
|
| | | let temp = 1;
|
| | | if (this.value) {
|
| | | // é¦å
å°å¼è½¬ä¸ºæ°ç»
|
| | | const list = Array.isArray(this.value) ? this.value : [this.value];
|
| | | // ç¶åå°æ°ç»è½¬ä¸ºå¯¹è±¡æ°ç»
|
| | | return list.map((item) => {
|
| | | if (typeof item === "string") {
|
| | | item = { name: item, url: item };
|
| | | }
|
| | | item.uid = item.uid || new Date().getTime() + temp++;
|
| | | return item;
|
| | | });
|
| | | } else {
|
| | | return [];
|
| | | }
|
| | | },
|
| | | },
|
| | | methods: {
|
| | | // ä¸ä¼ åæ ¡æ£æ ¼å¼å大å°
|
| | | handleBeforeUpload(file) {
|
| | | // æ ¡æ£æä»¶ç±»å
|
| | | if (this.fileType) {
|
| | | let fileExtension = "";
|
| | | if (file.name.lastIndexOf(".") > -1) {
|
| | | fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
|
| | | }
|
| | | const isTypeOk = this.fileType.some((type) => {
|
| | | if (file.type.indexOf(type) > -1) return true;
|
| | | if (fileExtension && fileExtension.indexOf(type) > -1) return true;
|
| | | return false;
|
| | | });
|
| | | if (!isTypeOk) {
|
| | | this.$message.error(`æä»¶æ ¼å¼ä¸æ£ç¡®, 请ä¸ä¼ ${this.fileType.join("/")}æ ¼å¼æä»¶!`);
|
| | | return false;
|
| | | }
|
| | | }
|
| | | // æ ¡æ£æä»¶å¤§å°
|
| | | if (this.fileSize) {
|
| | | const isLt = file.size / 1024 / 1024 < this.fileSize;
|
| | | if (!isLt) {
|
| | | this.$message.error(`ä¸ä¼ æä»¶å¤§å°ä¸è½è¶
è¿ ${this.fileSize} MB!`);
|
| | | return false;
|
| | | }
|
| | | }
|
| | | return true;
|
| | | },
|
| | | // æä»¶ä¸ªæ°è¶
åº
|
| | | handleExceed() {
|
| | | this.$message.error(`åªå
许ä¸ä¼ å个æä»¶`);
|
| | | },
|
| | | // ä¸ä¼ 失败
|
| | | handleUploadError(err) {
|
| | | this.$message.error("ä¸ä¼ 失败, 请éè¯");
|
| | | },
|
| | | // ä¸ä¼ æååè°
|
| | | handleUploadSuccess(res, file) {
|
| | | this.$message.success("ä¸ä¼ æå");
|
| | | this.$emit("input", res.url);
|
| | | },
|
| | | // å 餿件
|
| | | handleDelete(index) {
|
| | | this.fileList.splice(index, 1);
|
| | | this.$emit("input", '');
|
| | | },
|
| | | // è·åæä»¶åç§°
|
| | | getFileName(name) {
|
| | | if (name.lastIndexOf("/") > -1) {
|
| | | return name.slice(name.lastIndexOf("/") + 1).toLowerCase();
|
| | | } else {
|
| | | return "";
|
| | | }
|
| | | }
|
| | | },
|
| | | created() {
|
| | | this.fileList = this.list;
|
| | | },
|
| | | };
|
| | | </script>
|
| | |
|
| | | <style scoped lang="scss">
|
| | | .upload-file-uploader {
|
| | | margin-bottom: 5px;
|
| | | }
|
| | | .upload-file-list .el-upload-list__item {
|
| | | border: 1px solid #e4e7ed;
|
| | | line-height: 2;
|
| | | margin-bottom: 10px;
|
| | | position: relative;
|
| | | }
|
| | | .upload-file-list .ele-upload-list__item-content {
|
| | | display: flex;
|
| | | justify-content: space-between;
|
| | | align-items: center;
|
| | | color: inherit;
|
| | | }
|
| | | .ele-upload-list__item-content-action .el-link {
|
| | | margin-right: 10px;
|
| | | }
|
| | | </style> |
| | |
| | | <script> |
| | | // fuse is a lightweight fuzzy-search module |
| | | // make search results more in line with expectations |
| | | import Fuse from 'fuse.js' |
| | | import Fuse from 'fuse.js/dist/fuse.min.js' |
| | | import path from 'path' |
| | | |
| | | export default { |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template>
|
| | | <div class="component-upload-image">
|
| | | <el-upload
|
| | | :action="uploadImgUrl"
|
| | | list-type="picture-card"
|
| | | :on-success="handleUploadSuccess"
|
| | | :before-upload="handleBeforeUpload"
|
| | | :on-error="handleUploadError"
|
| | | name="file"
|
| | | :show-file-list="false"
|
| | | :headers="headers"
|
| | | style="display: inline-block; vertical-align: top"
|
| | | >
|
| | | <el-image v-if="!value" :src="value">
|
| | | <div slot="error" class="image-slot">
|
| | | <i class="el-icon-plus" />
|
| | | </div>
|
| | | </el-image>
|
| | | <div v-else class="image">
|
| | | <el-image :src="value" :style="`width:150px;height:150px;`" fit="fill"/>
|
| | | <div class="mask">
|
| | | <div class="actions">
|
| | | <span title="é¢è§" @click.stop="dialogVisible = true">
|
| | | <i class="el-icon-zoom-in" />
|
| | | </span>
|
| | | <span title="ç§»é¤" @click.stop="removeImage">
|
| | | <i class="el-icon-delete" />
|
| | | </span>
|
| | | </div>
|
| | | </div>
|
| | | </div>
|
| | | </el-upload>
|
| | | <el-dialog :visible.sync="dialogVisible" title="é¢è§" width="800" append-to-body>
|
| | | <img :src="value" style="display: block; max-width: 100%; margin: 0 auto;">
|
| | | </el-dialog>
|
| | | </div>
|
| | | </template>
|
| | |
|
| | | <script>
|
| | | import { getToken } from "@/utils/auth";
|
| | |
|
| | | export default {
|
| | | data() {
|
| | | return {
|
| | | dialogVisible: false,
|
| | | uploadImgUrl: process.env.VUE_APP_BASE_API + "/common/upload", // ä¸ä¼ çå¾çæå¡å¨å°å
|
| | | headers: {
|
| | | Authorization: "Bearer " + getToken(),
|
| | | },
|
| | | };
|
| | | },
|
| | | props: {
|
| | | value: {
|
| | | type: String,
|
| | | default: "",
|
| | | },
|
| | | },
|
| | | methods: {
|
| | | removeImage() {
|
| | | this.$emit("input", "");
|
| | | },
|
| | | handleUploadSuccess(res) {
|
| | | this.$emit("input", res.url);
|
| | | this.loading.close();
|
| | | },
|
| | | handleBeforeUpload() {
|
| | | this.loading = this.$loading({
|
| | | lock: true,
|
| | | text: "ä¸ä¼ ä¸",
|
| | | background: "rgba(0, 0, 0, 0.7)",
|
| | | });
|
| | | },
|
| | | handleUploadError() {
|
| | | this.$message({
|
| | | type: "error",
|
| | | message: "ä¸ä¼ 失败",
|
| | | });
|
| | | this.loading.close();
|
| | | },
|
| | | },
|
| | | watch: {},
|
| | | };
|
| | | </script>
|
| | |
|
| | | <style scoped lang="scss">
|
| | | .image {
|
| | | position: relative;
|
| | | .mask {
|
| | | opacity: 0;
|
| | | position: absolute;
|
| | | top: 0;
|
| | | width: 100%;
|
| | | background-color: rgba(0, 0, 0, 0.5);
|
| | | transition: all 0.3s;
|
| | | }
|
| | | &:hover .mask {
|
| | | opacity: 1;
|
| | | }
|
| | | }
|
| | | </style> |
| | |
| | | import Pagination from "@/components/Pagination"; |
| | | // èªå®ä¹è¡¨æ ¼å·¥å
·æ©å± |
| | | import RightToolbar from "@/components/RightToolbar" |
| | | // 代ç é«äº®æä»¶ |
| | | import hljs from 'highlight.js' |
| | | import 'highlight.js/styles/github-gist.css' |
| | | |
| | | // å
¨å±æ¹æ³æè½½ |
| | | Vue.prototype.getDicts = getDicts |
| | |
| | | Vue.component('RightToolbar', RightToolbar) |
| | | |
| | | Vue.use(permission) |
| | | Vue.use(hljs.vuePlugin); |
| | | |
| | | /** |
| | | * If you don't want to use mock-server |
| | |
| | | <el-option label="åéæ¡" value="radio" /> |
| | | <el-option label="å¤éæ¡" value="checkbox" /> |
| | | <el-option label="æ¥ææ§ä»¶" value="datetime" /> |
| | | <el-option label="ä¸ä¼ æ§ä»¶" value="uploadImage" /> |
| | | <el-option label="å¾çä¸ä¼ " value="imageUpload" /> |
| | | <el-option label="æä»¶ä¸ä¼ " value="fileUpload" /> |
| | | <el-option label="å¯ææ¬æ§ä»¶" value="editor" /> |
| | | </el-select> |
| | | </template> |
| | |
| | | :name="key.substring(key.lastIndexOf('/')+1,key.indexOf('.vm'))" |
| | | :key="key" |
| | | > |
| | | <highlightjs autodetect :code="value" /> |
| | | <pre><code class="hljs" v-html="highlightedCode(value, key)"></code></pre> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | </el-dialog> |
| | |
| | | import { listTable, previewTable, delTable, genCode, synchDb } from "@/api/tool/gen"; |
| | | import importTable from "./importTable"; |
| | | import { downLoadZip } from "@/utils/zipdownload"; |
| | | import hljs from "highlight.js/lib/highlight"; |
| | | import "highlight.js/styles/github-gist.css"; |
| | | hljs.registerLanguage("java", require("highlight.js/lib/languages/java")); |
| | | hljs.registerLanguage("xml", require("highlight.js/lib/languages/xml")); |
| | | hljs.registerLanguage("html", require("highlight.js/lib/languages/xml")); |
| | | hljs.registerLanguage("vue", require("highlight.js/lib/languages/xml")); |
| | | hljs.registerLanguage("javascript", require("highlight.js/lib/languages/javascript")); |
| | | hljs.registerLanguage("sql", require("highlight.js/lib/languages/sql")); |
| | | |
| | | export default { |
| | | name: "Gen", |
| | |
| | | this.preview.open = true; |
| | | }); |
| | | }, |
| | | /** é«äº®æ¾ç¤º */ |
| | | highlightedCode(code, key) { |
| | | const vmName = key.substring(key.lastIndexOf("/") + 1, key.indexOf(".vm")); |
| | | var language = vmName.substring(vmName.indexOf(".") + 1, vmName.length); |
| | | const result = hljs.highlight(language, code || "", true); |
| | | return result.value || ' '; |
| | | }, |
| | | // å¤éæ¡é䏿°æ® |
| | | handleSelectionChange(selection) { |
| | | this.ids = selection.map(item => item.tableId); |
| | |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | </script> |