Browse Source

bpmn.js整合bpmn-js-lint

master
xlsea 3 years ago
parent
commit
5c5c41ce1b
  1. 4
      ruoyi-ui/package.json
  2. 3
      ruoyi-ui/src/components/Process/.bpmnlintrc
  3. 15
      ruoyi-ui/src/components/Process/index.vue
  4. 278
      ruoyi-ui/vue.config.js

4
ruoyi-ui/package.json

@ -39,6 +39,10 @@
"@riophae/vue-treeselect": "0.4.0", "@riophae/vue-treeselect": "0.4.0",
"axios": "0.24.0", "axios": "0.24.0",
"bpmn-js": "^11.1.0", "bpmn-js": "^11.1.0",
"bpmnlint": "^6.4.0",
"bpmn-js-bpmnlint": "^0.15.0",
"bpmnlint-loader": "^0.1.4",
"file-drops": "^0.4.0",
"clipboard": "2.0.8", "clipboard": "2.0.8",
"core-js": "3.25.3", "core-js": "3.25.3",
"diagram-js": "^11.4.1", "diagram-js": "^11.4.1",

3
ruoyi-ui/src/components/Process/.bpmnlintrc

@ -0,0 +1,3 @@
{
"extends": "bpmnlint:recommended"
}

15
ruoyi-ui/src/components/Process/index.vue

@ -29,6 +29,7 @@
</el-tooltip> </el-tooltip>
</div> </div>
<div> <div>
<el-button size="mini" icon="el-icon-s-check" @click="verifyXML">校验xml</el-button>
<el-button size="mini" icon="el-icon-view" @click="showXML">查看xml</el-button> <el-button size="mini" icon="el-icon-view" @click="showXML">查看xml</el-button>
<el-button size="mini" icon="el-icon-download" @click="saveXML(true)">下载xml</el-button> <el-button size="mini" icon="el-icon-download" @click="saveXML(true)">下载xml</el-button>
<el-button size="mini" icon="el-icon-picture" @click="saveImg('svg', true)">下载svg</el-button> <el-button size="mini" icon="el-icon-picture" @click="saveImg('svg', true)">下载svg</el-button>
@ -51,7 +52,9 @@
<script> <script>
// //
import customTranslate from './common/customTranslate' import customTranslate from './common/customTranslate'
import lintModule from 'bpmn-js-bpmnlint';
import Modeler from 'bpmn-js/lib/Modeler' import Modeler from 'bpmn-js/lib/Modeler'
import bpmnlintConfig from './.bpmnlintrc';
import panel from './PropertyPanel' import panel from './PropertyPanel'
import getInitStr from './flowable/init' import getInitStr from './flowable/init'
// flowable // flowable
@ -107,11 +110,15 @@ export default {
this.modeler = new Modeler({ this.modeler = new Modeler({
container: this.$refs.canvas, container: this.$refs.canvas,
additionalModules: [ additionalModules: [
lintModule,
customControlsModule, customControlsModule,
{ // { //
translate: ['value', customTranslate] translate: ['value', customTranslate]
}, },
], ],
linting: {
bpmnlint: bpmnlintConfig
},
moddleExtensions: { moddleExtensions: {
flowable: FlowableModule flowable: FlowableModule
} }
@ -179,6 +186,11 @@ export default {
if (rootElements[i].$type === 'bpmn:Process') return rootElements[i] if (rootElements[i].$type === 'bpmn:Process') return rootElements[i]
} }
}, },
async verifyXML(){
const linting = this.modeler.get('linting')
console.log(linting)
linting.toggle(true);
},
async saveXML(download = false) { async saveXML(download = false) {
try { try {
const { xml } = await this.modeler.saveXML({ format: true }) const { xml } = await this.modeler.saveXML({ format: true })
@ -243,6 +255,7 @@ export default {
@import "~bpmn-js/dist/assets/bpmn-font/css/bpmn.css"; @import "~bpmn-js/dist/assets/bpmn-font/css/bpmn.css";
@import "~bpmn-js/dist/assets/bpmn-font/css/bpmn-codes.css"; @import "~bpmn-js/dist/assets/bpmn-font/css/bpmn-codes.css";
@import "~bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css"; @import "~bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css";
@import "~bpmn-js-bpmnlint/dist/assets/css/bpmn-js-bpmnlint.css";
.view-mode { .view-mode {
.el-header, .el-aside, .djs-palette, .bjs-powered-by { .el-header, .el-aside, .djs-palette, .bjs-powered-by {
display: none; display: none;
@ -289,7 +302,7 @@ export default {
} }
.djs-container svg { .djs-container svg {
min-height: 650px; //min-height: 650px;
} }
.highlight.djs-shape .djs-visual > :nth-child(1) { .highlight.djs-shape .djs-visual > :nth-child(1) {

278
ruoyi-ui/vue.config.js

@ -1,136 +1,142 @@
'use strict' 'use strict'
const path = require('path') const path = require('path')
function resolve(dir) { function resolve(dir) {
return path.join(__dirname, dir) return path.join(__dirname, dir)
} }
const CompressionPlugin = require('compression-webpack-plugin') const CompressionPlugin = require('compression-webpack-plugin')
const name = process.env.VUE_APP_TITLE || '若依管理系统' // 网页标题 const name = process.env.VUE_APP_TITLE || '若依管理系统' // 网页标题
const port = process.env.port || process.env.npm_config_port || 80 // 端口 const port = process.env.port || process.env.npm_config_port || 80 // 端口
// vue.config.js 配置说明 // vue.config.js 配置说明
//官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions //官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions
// 这里只列一部分,具体配置参考文档 // 这里只列一部分,具体配置参考文档
module.exports = { module.exports = {
// 部署生产环境和开发环境下的URL。 // 部署生产环境和开发环境下的URL。
// 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上 // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上
// 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。 // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
publicPath: process.env.NODE_ENV === "production" ? "/" : "/", publicPath: process.env.NODE_ENV === "production" ? "/" : "/",
// 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist) // 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist)
outputDir: 'dist', outputDir: 'dist',
// 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下) // 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)
assetsDir: 'static', assetsDir: 'static',
// 是否开启eslint保存检测,有效值:ture | false | 'error' // 是否开启eslint保存检测,有效值:ture | false | 'error'
lintOnSave: process.env.NODE_ENV === 'development', lintOnSave: process.env.NODE_ENV === 'development',
// 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。 // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
productionSourceMap: false, productionSourceMap: false,
// webpack-dev-server 相关配置 // webpack-dev-server 相关配置
devServer: { devServer: {
host: '0.0.0.0', host: '0.0.0.0',
port: port, port: port,
open: true, open: true,
proxy: { proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy // detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: { [process.env.VUE_APP_BASE_API]: {
target: `http://localhost:8080`, target: `http://localhost:8080`,
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: '' ['^' + process.env.VUE_APP_BASE_API]: ''
} }
} }
}, },
disableHostCheck: true disableHostCheck: true
}, },
css: { css: {
loaderOptions: { loaderOptions: {
sass: { sass: {
sassOptions: { outputStyle: "expanded" } sassOptions: { outputStyle: "expanded" }
} }
} }
}, },
configureWebpack: { configureWebpack: {
name: name, name: name,
resolve: { resolve: {
alias: { alias: {
'@': resolve('src') '@': resolve('src')
} }
}, },
plugins: [ plugins: [
// http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件 // http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件
new CompressionPlugin({ new CompressionPlugin({
cache: false, // 不启用文件缓存 cache: false, // 不启用文件缓存
test: /\.(js|css|html)?$/i, // 压缩文件格式 test: /\.(js|css|html)?$/i, // 压缩文件格式
filename: '[path].gz[query]', // 压缩后的文件名 filename: '[path].gz[query]', // 压缩后的文件名
algorithm: 'gzip', // 使用gzip压缩 algorithm: 'gzip', // 使用gzip压缩
minRatio: 0.8 // 压缩率小于1才会压缩 minRatio: 0.8 // 压缩率小于1才会压缩
}) })
], ],
}, },
chainWebpack(config) { chainWebpack(config) {
config.plugins.delete('preload') // TODO: need test config.plugins.delete('preload') // TODO: need test
config.plugins.delete('prefetch') // TODO: need test config.plugins.delete('prefetch') // TODO: need test
// set svg-sprite-loader // set svg-sprite-loader
config.module config.module
.rule('svg') .rule('svg')
.exclude.add(resolve('src/assets/icons')) .exclude.add(resolve('src/assets/icons'))
.end() .end()
config.module config.module
.rule('icons') .rule('icons')
.test(/\.svg$/) .test(/\.svg$/)
.include.add(resolve('src/assets/icons')) .include.add(resolve('src/assets/icons'))
.end() .end()
.use('svg-sprite-loader') .use('svg-sprite-loader')
.loader('svg-sprite-loader') .loader('svg-sprite-loader')
.options({ .options({
symbolId: 'icon-[name]' symbolId: 'icon-[name]'
}) })
.end() .end()
config.module
config .rule('bpmnlintrc')
.when(process.env.NODE_ENV !== 'development', .test(/\.bpmnlintrc$/)
config => { .use('bpmnlint-loader')
config .loader('bpmnlint-loader')
.plugin('ScriptExtHtmlWebpackPlugin') .end()
.after('html')
.use('script-ext-html-webpack-plugin', [{ config
// `runtime` must same as runtimeChunk name. default is `runtime` .when(process.env.NODE_ENV !== 'development',
inline: /runtime\..*\.js$/ config => {
}]) config
.end() .plugin('ScriptExtHtmlWebpackPlugin')
config .after('html')
.optimization.splitChunks({ .use('script-ext-html-webpack-plugin', [{
chunks: 'all', // `runtime` must same as runtimeChunk name. default is `runtime`
cacheGroups: { inline: /runtime\..*\.js$/
libs: { }])
name: 'chunk-libs', .end()
test: /[\\/]node_modules[\\/]/, config
priority: 10, .optimization.splitChunks({
chunks: 'initial' // only package third parties that are initially dependent chunks: 'all',
}, cacheGroups: {
elementUI: { libs: {
name: 'chunk-elementUI', // split elementUI into a single package name: 'chunk-libs',
priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app test: /[\\/]node_modules[\\/]/,
test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm priority: 10,
}, chunks: 'initial' // only package third parties that are initially dependent
commons: { },
name: 'chunk-commons', elementUI: {
test: resolve('src/components'), // can customize your rules name: 'chunk-elementUI', // split elementUI into a single package
minChunks: 3, // minimum common number priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
priority: 5, test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
reuseExistingChunk: true },
} commons: {
} name: 'chunk-commons',
}) test: resolve('src/components'), // can customize your rules
config.optimization.runtimeChunk('single'), minChunks: 3, // minimum common number
{ priority: 5,
from: path.resolve(__dirname, './public/robots.txt'), //防爬虫文件 reuseExistingChunk: true
to: './' //到根目录下 }
} }
} })
) config.optimization.runtimeChunk('single'),
} {
} from: path.resolve(__dirname, './public/robots.txt'), //防爬虫文件
to: './' //到根目录下
}
}
)
}
}

Loading…
Cancel
Save