parent
a776ed1298
commit
769a3a061f
@ -0,0 +1,49 @@
|
||||
######################################################################
|
||||
# Build Tools
|
||||
|
||||
.gradle
|
||||
/build/
|
||||
!gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
target/
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
|
||||
######################################################################
|
||||
# IDE
|
||||
|
||||
### STS ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### JRebel ###
|
||||
rebel.xml
|
||||
|
||||
### NetBeans ###
|
||||
nbproject/private/
|
||||
build/*
|
||||
nbbuild/
|
||||
dist/
|
||||
nbdist/
|
||||
.nb-gradle/
|
||||
.node-moudles/
|
||||
######################################################################
|
||||
# Others
|
||||
*.log
|
||||
*.xml.versionsBackup
|
||||
*.swp
|
||||
|
||||
!*/build/*.java
|
||||
!*/build/*.html
|
||||
!*/build/*.xml
|
||||
|
||||
|
@ -0,0 +1,19 @@
|
||||
# azhou-code-plugins
|
||||
|
||||
## Project setup
|
||||
```
|
||||
npm install
|
||||
```
|
||||
|
||||
### Compiles and hot-reloads for development
|
||||
```
|
||||
npm run serve
|
||||
```
|
||||
|
||||
### Compiles and minifies for production
|
||||
```
|
||||
npm run build
|
||||
```
|
||||
|
||||
### Customize configuration
|
||||
See [Configuration Reference](https://cli.vuejs.org/config/).
|
@ -0,0 +1,5 @@
|
||||
module.exports = {
|
||||
presets: [
|
||||
'@vue/cli-plugin-babel/preset'
|
||||
]
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,32 @@
|
||||
{
|
||||
"name": "azhou-code-plugins",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"serve": "vue-cli-service serve",
|
||||
"build": "vue-cli-service build"
|
||||
},
|
||||
"dependencies": {
|
||||
"axios": "^0.24.0",
|
||||
"core-js": "^3.6.5",
|
||||
"element-ui": "^2.4.5",
|
||||
"vue": "^2.6.11",
|
||||
"vue-router": "^3.2.0",
|
||||
"vuex": "^3.4.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@vue/cli-plugin-babel": "~4.5.0",
|
||||
"@vue/cli-plugin-router": "~4.5.0",
|
||||
"@vue/cli-plugin-vuex": "~4.5.0",
|
||||
"@vue/cli-service": "~4.5.0",
|
||||
"node-sass": "^4.9.2",
|
||||
"sass-loader": "^7.0.3",
|
||||
"vue-cli-plugin-element": "~1.0.1",
|
||||
"vue-template-compiler": "^2.6.11"
|
||||
},
|
||||
"browserslist": [
|
||||
"> 1%",
|
||||
"last 2 versions",
|
||||
"not dead"
|
||||
]
|
||||
}
|
After Width: | Height: | Size: 4.2 KiB |
@ -0,0 +1,17 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
|
||||
<title><%= htmlWebpackPlugin.options.title %></title>
|
||||
</head>
|
||||
<body>
|
||||
<noscript>
|
||||
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
|
||||
</noscript>
|
||||
<div id="app"></div>
|
||||
<!-- built files will be auto injected -->
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,19 @@
|
||||
<template>
|
||||
<div id="app">
|
||||
<router-view></router-view>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
export default {
|
||||
name: 'app',
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
#app {
|
||||
margin: 50px auto;
|
||||
max-width: 1200px;
|
||||
}
|
||||
</style>
|
After Width: | Height: | Size: 6.7 KiB |
@ -0,0 +1,59 @@
|
||||
<template>
|
||||
<div class="hello">
|
||||
<h1>{{ msg }}</h1>
|
||||
<p>
|
||||
For a guide and recipes on how to configure / customize this project,<br>
|
||||
check out the
|
||||
<a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
|
||||
</p>
|
||||
<h3>Installed CLI Plugins</h3>
|
||||
<ul>
|
||||
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
|
||||
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-router" target="_blank" rel="noopener">router</a></li>
|
||||
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-vuex" target="_blank" rel="noopener">vuex</a></li>
|
||||
</ul>
|
||||
<h3>Essential Links</h3>
|
||||
<ul>
|
||||
<li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
|
||||
<li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
|
||||
<li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
|
||||
<li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
|
||||
<li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
|
||||
</ul>
|
||||
<h3>Ecosystem</h3>
|
||||
<ul>
|
||||
<li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
|
||||
<li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
|
||||
<li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
|
||||
<li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
|
||||
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'HelloWorld',
|
||||
props: {
|
||||
msg: String
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<!-- Add "scoped" attribute to limit CSS to this component only -->
|
||||
<style scoped>
|
||||
h3 {
|
||||
margin: 40px 0 0;
|
||||
}
|
||||
ul {
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
}
|
||||
li {
|
||||
display: inline-block;
|
||||
margin: 0 10px;
|
||||
}
|
||||
a {
|
||||
color: #42b983;
|
||||
}
|
||||
</style>
|
@ -0,0 +1,97 @@
|
||||
<template>
|
||||
<div class="">
|
||||
<el-form inline>
|
||||
<el-form-item :label="lable">
|
||||
<el-select v-model="tableName" placeholder="请选择" @change="getTableColList" >
|
||||
<el-option
|
||||
v-for="item in tableNameData"
|
||||
:key="item.value"
|
||||
:label="item.value"
|
||||
:value="item.value">
|
||||
<span style="float: left">{{ item.value }}</span>
|
||||
<span style="float: right; color: #8492a6; font-size: 13px">{{ item.label }}</span>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="页面展示名:" v-if="showName">
|
||||
<el-input v-model="tableComment" @change="changeTableName"></el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {get} from "../util/http";
|
||||
import {message} from "../util/notice";
|
||||
|
||||
export default {
|
||||
name: 'TableFromHeader',
|
||||
props:{
|
||||
lable: {
|
||||
type: String,
|
||||
default: "表名称"
|
||||
},
|
||||
showName: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
random: '',
|
||||
tableNameData: [],
|
||||
tableName: '',
|
||||
tableComment: ''
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
let random = localStorage.getItem("random");
|
||||
if (!random) {
|
||||
message("数据库连接信息有误,请重新配置", "error");
|
||||
this.goHome();
|
||||
return;
|
||||
}
|
||||
this.random = random;
|
||||
this.getAllTable();
|
||||
},
|
||||
methods: {
|
||||
getTableColList() {
|
||||
var url = "/db/getTableColList/" + this.tableName + "/" + this.random;
|
||||
get(url).then(res => {
|
||||
if (res) {
|
||||
var name = this.tableName;
|
||||
this.$emit("changeColData", {res,name});
|
||||
}
|
||||
})
|
||||
},
|
||||
changeTableName(){
|
||||
var name = this.tableComment;
|
||||
this.$emit("changeTableName", {name});
|
||||
},
|
||||
goHome() {
|
||||
this.$router.push("/");
|
||||
},
|
||||
getAllTable() {
|
||||
var url = "/db/getAllTable/" + this.random;
|
||||
get(url).then(res => {
|
||||
var arr = res;
|
||||
if (arr && arr.length > 0) {
|
||||
var tableNameArr = [];
|
||||
for (var i = 0; i < arr.length; i++) {
|
||||
var param = {};
|
||||
param.value = arr[i];
|
||||
param.label = "未配置";
|
||||
tableNameArr.push(param);
|
||||
}
|
||||
this.tableNameData = tableNameArr;
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
@ -0,0 +1,11 @@
|
||||
/*
|
||||
Write your variables here. All available variables can be
|
||||
found in element-ui/packages/theme-chalk/src/common/var.scss.
|
||||
For example, to overwrite the theme color:
|
||||
*/
|
||||
$--color-primary: teal;
|
||||
|
||||
/* icon font path, required */
|
||||
$--font-path: '~element-ui/lib/theme-chalk/fonts';
|
||||
|
||||
@import "~element-ui/packages/theme-chalk/src/index";
|
@ -0,0 +1,13 @@
|
||||
import Vue from 'vue'
|
||||
import App from './App.vue'
|
||||
import router from './router'
|
||||
import store from './store'
|
||||
import './plugins/element.js'
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
new Vue({
|
||||
router,
|
||||
store,
|
||||
render: h => h(App)
|
||||
}).$mount('#app')
|
@ -0,0 +1,5 @@
|
||||
import Vue from 'vue'
|
||||
import Element from 'element-ui'
|
||||
import '../element-variables.scss'
|
||||
|
||||
Vue.use(Element)
|
@ -0,0 +1,29 @@
|
||||
import Vue from 'vue'
|
||||
import VueRouter from 'vue-router'
|
||||
import Home from '../views/Home.vue'
|
||||
|
||||
Vue.use(VueRouter)
|
||||
|
||||
const routes = [
|
||||
{
|
||||
path: '/',
|
||||
name: 'Home',
|
||||
component: Home
|
||||
},
|
||||
{
|
||||
path: '/about',
|
||||
name: 'About',
|
||||
component: () => import('../views/About.vue')
|
||||
},
|
||||
{
|
||||
path: '/table',
|
||||
name: 'Table',
|
||||
component: () => import( '../views/Table.vue')
|
||||
}
|
||||
]
|
||||
|
||||
const router = new VueRouter({
|
||||
routes
|
||||
})
|
||||
|
||||
export default router
|
@ -0,0 +1,15 @@
|
||||
import Vue from 'vue'
|
||||
import Vuex from 'vuex'
|
||||
|
||||
Vue.use(Vuex)
|
||||
|
||||
export default new Vuex.Store({
|
||||
state: {
|
||||
},
|
||||
mutations: {
|
||||
},
|
||||
actions: {
|
||||
},
|
||||
modules: {
|
||||
}
|
||||
})
|
@ -0,0 +1,16 @@
|
||||
import {Message } from 'element-ui'
|
||||
import { Notification } from 'element-ui';
|
||||
|
||||
export function message(title, type) {
|
||||
Message ({
|
||||
message: title,
|
||||
type: type ? type : 'success',
|
||||
})
|
||||
}
|
||||
|
||||
// export function notice(title, type) {
|
||||
// Message ({
|
||||
// message: title,
|
||||
// type: type ? type : 'success',
|
||||
// })
|
||||
// }
|
@ -0,0 +1,5 @@
|
||||
<template>
|
||||
<div class="about">
|
||||
<h1>This is an about page</h1>
|
||||
</div>
|
||||
</template>
|
@ -0,0 +1,500 @@
|
||||
<template>
|
||||
<div class="table">
|
||||
<h2 class="title">数据库表配置</h2>
|
||||
<TableFromHeader @changeColData="changeColData" @changeTableName="changeTableName"></TableFromHeader>
|
||||
<el-button type="text" @click="add()">关联表</el-button>
|
||||
<el-table
|
||||
:data="tableData.tableColEntityList"
|
||||
style="width: 100%;max-height: 600px;overflow: auto">
|
||||
<el-table-column align="center"
|
||||
prop="colName"
|
||||
label="列名称"
|
||||
width="150">
|
||||
</el-table-column>
|
||||
<el-table-column align="center"
|
||||
prop="chinaName"
|
||||
label="展示中文名"
|
||||
width="150">
|
||||
<template slot-scope="scope">
|
||||
<el-input v-model="scope.row.chinaName" placeholder="请输入内容"></el-input>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="date"
|
||||
label="属性类型"
|
||||
width="150">
|
||||
<template slot-scope="scope">
|
||||
<el-select v-model="scope.row.paramType" placeholder="请选择">
|
||||
<el-option
|
||||
v-for="item in paramType"
|
||||
:key="item.value"
|
||||
:label="item.value"
|
||||
:value="item.value">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="name"
|
||||
label="查询配置"
|
||||
width="120">
|
||||
<template slot-scope="scope">
|
||||
<el-select v-model="scope.row.compareType" placeholder="请选择">
|
||||
<el-option
|
||||
v-for="item in compareType"
|
||||
:key="item.value"
|
||||
:label="item.value"
|
||||
:value="item.value">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="搜索" width="80" align="center">
|
||||
<template slot-scope="scope">
|
||||
<el-checkbox v-model="scope.row.searchShow"></el-checkbox>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="表格展示" width="80" align="center">
|
||||
<template slot-scope="scope">
|
||||
<el-checkbox v-model="scope.row.tableShow"></el-checkbox>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="name"
|
||||
label="显示类型"
|
||||
width="120">
|
||||
<template slot-scope="scope">
|
||||
<el-select v-model="scope.row.showType" @change="tableTypeChange(scope.row)" placeholder="请选择">
|
||||
<el-option
|
||||
v-for="item in showType"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="编辑展示" width="80" align="center">
|
||||
<template slot-scope="scope">
|
||||
<el-checkbox v-model="scope.row.updateShow"></el-checkbox>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="name"
|
||||
label="编辑类型"
|
||||
width="120">
|
||||
<template slot-scope="scope">
|
||||
<el-select v-model="scope.row.updateType" @change="updateTypeChange(scope.row)" placeholder="请选择">
|
||||
<el-option
|
||||
v-for="item in updateType"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="图片上传" width="80" align="center">
|
||||
<template slot-scope="scope">
|
||||
<el-checkbox v-model="scope.row.uploadImg"></el-checkbox>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div class="my-button">
|
||||
<el-button @click="goHome">上一步</el-button>
|
||||
<el-button @click="submitMainFrom">确认</el-button>
|
||||
</div>
|
||||
<div>
|
||||
<el-select v-model="type" @change="updateModuleType" placeholder="请选择">
|
||||
<el-option
|
||||
v-for="item in updateModuleTypeArr"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</div>
|
||||
<div class="my-button">
|
||||
<el-button @click="generateCode" type="success">生成代码</el-button>
|
||||
</div>
|
||||
<AddSonTable :dialogVisible=addSonTableDialog @dismissDialog="close" :col-data="currentColData"
|
||||
:table-name="tableData.tableName" @addSonTableList="addSonTableList"></AddSonTable>
|
||||
|
||||
<el-dialog
|
||||
title="数据来源"
|
||||
:visible.sync="dialogVisible"
|
||||
width="50%"
|
||||
>
|
||||
<TableFromHeader :showName="false" @changeColData="selectColName"></TableFromHeader>
|
||||
<el-form>
|
||||
<el-form-item label="字段">
|
||||
<el-select v-model="dataSource.tableFiled" @change="updateFileChange" placeholder="请选择">
|
||||
<el-option
|
||||
v-for="item in colName"
|
||||
:key="item.colName"
|
||||
:label="item.colName"
|
||||
:value="item.colName">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="dialogVisible = false">确 定</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
<el-dialog
|
||||
title="下拉选择配置"
|
||||
:close-on-click-modal="false"
|
||||
:close-on-press-escape="false"
|
||||
:visible.sync="selectDialogVisible"
|
||||
width="50%">
|
||||
<el-form :model="selectDataParam" label-width="100px" inline>
|
||||
<TableFromHeader @changeColData="changeSwitchTableName" lable="数据来源表" :showName="false"></TableFromHeader>
|
||||
<el-form-item label="name列">
|
||||
<el-select v-model="selectDataParam.nameCol" @change="updateFileChange" placeholder="请选择">
|
||||
<el-option
|
||||
v-for="item in selectDataFromTableCol"
|
||||
:key="item.colName"
|
||||
:label="item.chinaName"
|
||||
:value="item.colName">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="value列">
|
||||
<el-select v-model="selectDataParam.valueCol" @change="updateFileChange" placeholder="请选择">
|
||||
<el-option
|
||||
v-for="item in selectDataFromTableCol"
|
||||
:key="item.colName"
|
||||
:label="item.chinaName"
|
||||
:value="item.colName">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button @click="selectDialogVisible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="submitSelectForm">确 定</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
<el-dialog
|
||||
:close-on-click-modal="false"
|
||||
:close-on-press-escape="false"
|
||||
title="枚举来源"
|
||||
:visible.sync="dialogEnumVisible" width="50%">
|
||||
<el-form :model="addEnumForm" ref="addEnumForm" label-width="100px" inline>
|
||||
<div v-for="(domain, index) in addEnumForm.enums">
|
||||
<el-form-item
|
||||
:label="'枚举值-' + index"
|
||||
:key="domain.key"
|
||||
:prop="'enums.' + index + '.name'"
|
||||
:rules="{
|
||||
required: true, message: '枚举key不能为空', trigger: 'blur'}">
|
||||
<el-input v-model="domain.name"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
:label="'中文解释-' + index"
|
||||
:key="domain.key1"
|
||||
:prop="'enums.' + index + '.value'"
|
||||
:rules="{required: true, message: '枚举value不能为空', trigger: 'blur'}">
|
||||
<el-input v-model="domain.value"></el-input>
|
||||
</el-form-item>
|
||||
<el-button @click.prevent="removeDomain(domain)">删除</el-button>
|
||||
</div>
|
||||
<el-form-item>
|
||||
<el-button @click="addDomain">新增枚举</el-button>
|
||||
<el-button @click="resetForm('addEnumForm')">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button @click="dialogEnumVisible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="submitForm('addEnumForm')">确 定</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import {message} from "../util/notice";
|
||||
import {get, post} from "../util/http";
|
||||
import AddSonTable from "../components/AddSonTable";
|
||||
import TableFromHeader from "../components/TableFromHeader";
|
||||
|
||||
export default {
|
||||
components: {AddSonTable, TableFromHeader},
|
||||
data() {
|
||||
return {
|
||||
random: '',
|
||||
paramType: [
|
||||
{value: "String"},
|
||||
{value: "Boolean"},
|
||||
{value: "Long"},
|
||||
{value: "Integer"}
|
||||
],
|
||||
compareType: [
|
||||
{value: "="},
|
||||
{value: "like"},
|
||||
{value: "eq"},
|
||||
{value: "nt"}
|
||||
],
|
||||
showType: [
|
||||
{label: "文本", value: 'text'},
|
||||
{label: "枚举", value: 'enum'},
|
||||
{label: "图片", value: 'image'}
|
||||
],
|
||||
updateModuleTypeArr: [
|
||||
{label: "vue-element-admin", value: '1'},
|
||||
{label: "vue", value: '2'},
|
||||
{label: "layui+html", value: '3'}
|
||||
],
|
||||
type: 1,
|
||||
updateType: [
|
||||
{label: "文本", value: 'text'},
|
||||
{label: "开关", value: 'switch'},
|
||||
{label: "枚举", value: 'enum'},// 作为单选框组
|
||||
{label: "下拉选择", value: 'select'},
|
||||
{label: "数字", value: 'number'},
|
||||
{label: "日期选择", value: 'date'},
|
||||
{label: "文本域", value: 'textArea'},
|
||||
],
|
||||
tableData: {
|
||||
tableComment: "",
|
||||
tableName: '',
|
||||
tableColEntityList: [],
|
||||
sonTableEntities: [],
|
||||
enumsEntities: [],
|
||||
selectEntities: [],
|
||||
tableEnumsEntities: []
|
||||
},
|
||||
correlationList: [],
|
||||
sonTableEntities: [],
|
||||
addSonTableDialog: false,
|
||||
// 当前列数据
|
||||
currentColData: {},
|
||||
dialogVisible: false,
|
||||
dialogEnumVisible: false,
|
||||
selectDialogVisible: false,
|
||||
colName: [],
|
||||
// 下拉框数据来源对象
|
||||
dataSource: {
|
||||
tableName: '',
|
||||
tableFiled: ''
|
||||
},
|
||||
addEnumForm: {
|
||||
enums: [{
|
||||
name: '',
|
||||
value: ''
|
||||
}]
|
||||
},
|
||||
currentCol: '',// 当前列
|
||||
// 开关相关
|
||||
addSwitchForm: {},
|
||||
// 下拉选择相关
|
||||
selectDataFromTableCol: [],
|
||||
selectDataParam: {
|
||||
fromTableName: '',
|
||||
nameCol: '',
|
||||
valueCol: ''
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
let random = localStorage.getItem("random");
|
||||
if (!random) {
|
||||
message("数据库连接信息有误,请重新配置", "error");
|
||||
this.goHome();
|
||||
return;
|
||||
}
|
||||
this.random = random;
|
||||
},
|
||||
methods: {
|
||||
goHome() {
|
||||
this.$router.push("/");
|
||||
},
|
||||
close(obj) {
|
||||
this.addSonTableDialog = false;
|
||||
},
|
||||
add() {
|
||||
if (this.tableData.tableColEntityList.length <= 0) {
|
||||
message("请先选择主表!", "error")
|
||||
return
|
||||
}
|
||||
this.addSonTableDialog = true
|
||||
},
|
||||
changeColData(obj) {
|
||||
this.tableData = []
|
||||
this.tableData = obj.res;
|
||||
this.tableData.tableName = obj.name;
|
||||
},
|
||||
changeTableName(obj) {
|
||||
this.tableData.tableComment = obj.name;
|
||||
},
|
||||
changeSwitchTableName(obj) {
|
||||
this.selectDataParam.fromTableName = obj.name
|
||||
this.selectDataFromTableCol = obj.res.tableColEntityList
|
||||
},
|
||||
updateTypeChange(obj) {
|
||||
localStorage.setItem("type", 1)
|
||||
this.currentCol = obj.colName
|
||||
if (obj.updateType == "select") {
|
||||
this.selectDialogVisible = true
|
||||
}
|
||||
if (obj.updateType == 'enum') {
|
||||
this.dialogEnumVisible = true;
|
||||
}
|
||||
},
|
||||
tableTypeChange(obj) {
|
||||
localStorage.setItem("type", 2)
|
||||
this.currentCol = obj.colName
|
||||
if (obj.showType == 'enum') {
|
||||
this.dialogEnumVisible = true;
|
||||
}
|
||||
},
|
||||
selectColName(obj) {
|
||||
if (this.tableData.tableName == obj.name) {
|
||||
this.colName = [];
|
||||
message("数据表来源不能是当前表!", "error")
|
||||
return;
|
||||
}
|
||||
this.dataSource.tableName = obj.name;
|
||||
this.colName = obj.res.tableColEntityList;
|
||||
},
|
||||
updateFileChange(obj) {
|
||||
// console.log(this.dataSource)
|
||||
},
|
||||
submitSelectForm() {
|
||||
if (this.selectDataParam.fromTableName && this.selectDataParam.nameCol && this.selectDataParam.valueCol) {
|
||||
this.selectDataParam.colName = this.currentCol
|
||||
if (this.tableData.selectEntities && this.tableData.selectEntities.length > 0) {
|
||||
this.tableData.selectEntities.push(this.selectDataParam)
|
||||
} else {
|
||||
let arr = []
|
||||
arr.push(this.selectDataParam)
|
||||
this.tableData.selectEntities = arr
|
||||
}
|
||||
}
|
||||
this.selectDataParam = {}
|
||||
this.selectDialogVisible = false
|
||||
},
|
||||
submitForm(formName) {
|
||||
let type = localStorage.getItem("type")
|
||||
let that = this
|
||||
this.$refs[formName].validate((valid) => {
|
||||
if (valid) {
|
||||
let param = {};
|
||||
param.colName = that.currentCol
|
||||
param.enumsDTOS = that.addEnumForm.enums
|
||||
if (type == 1) {
|
||||
if (that.tableData.enumsEntities && that.tableData.enumsEntities.length > 0) {
|
||||
that.tableData.enumsEntities.push(param)
|
||||
} else {
|
||||
let arr = []
|
||||
arr.push(param)
|
||||
that.tableData.enumsEntities = arr
|
||||
}
|
||||
} else {
|
||||
if (that.tableData.tableEnumsEntities && that.tableData.tableEnumsEntities.length > 0) {
|
||||
that.tableData.tableEnumsEntities.push(param)
|
||||
} else {
|
||||
let arr = []
|
||||
arr.push(param)
|
||||
that.tableData.tableEnumsEntities = arr
|
||||
}
|
||||
}
|
||||
message("枚举添加成功!", "success")
|
||||
that.dialogEnumVisible = false;
|
||||
that.addEnumForm.enums = []
|
||||
localStorage.removeItem("type")
|
||||
} else {
|
||||
console.log('error submit!!');
|
||||
return false;
|
||||
}
|
||||
});
|
||||
},
|
||||
resetForm(formName) {
|
||||
this.$refs[formName].resetFields();
|
||||
},
|
||||
removeDomain(item) {
|
||||
var index = this.addEnumForm.enums.indexOf(item)
|
||||
if (index !== -1) {
|
||||
this.addEnumForm.enums.splice(index, 1)
|
||||
}
|
||||
},
|
||||
addDomain() {
|
||||
this.addEnumForm.enums.push({
|
||||
value: '',
|
||||
name: "",
|
||||
key: Date.now(),
|
||||
key1: Date.now() + 1
|
||||
});
|
||||
},
|
||||
submitMainFrom() {
|
||||
this.tableData.correlationList = this.correlationList
|
||||
this.tableData.sonTableEntities = this.sonTableEntities
|
||||
let random = localStorage.getItem("random")
|
||||
var that = this;
|
||||
post("/table/" + random, this.tableData).then(res => {
|
||||
that.correlationList = []
|
||||
message("配置成功!", "success");
|
||||
})
|
||||
},
|
||||
|
||||
addSonTableList(param) {
|
||||
let obj = param.tableData
|
||||
this.addSonTableDialog = false
|
||||
if (obj && obj.tableName) {
|
||||
message("子表添加成功!")
|
||||
if (this.sonTableEntities.length > 0) {
|
||||
this.checkObjExist(obj);
|
||||
}
|
||||
if (this.correlationList.length > 0) {
|
||||
this.checkCorrelationExist(param.correlation);
|
||||
}
|
||||
this.correlationList.push(param.correlation)
|
||||
this.sonTableEntities.push(obj)
|
||||
}
|
||||
},
|
||||
// 校验数据在数据中是否存在
|
||||
checkObjExist(obj) {
|
||||
for (let i in this.sonTableEntities) {
|
||||
let item = this.sonTableEntities[i]
|
||||
if (item.tableName == obj.tableName) {
|
||||
this.sonTableEntities.splice(i, 1)
|
||||
}
|
||||
}
|
||||
},
|
||||
checkCorrelationExist(obj) {
|
||||
for (let i in this.correlationList) {
|
||||
let item = this.correlationList[i]
|
||||
if (item == obj) {
|
||||
this.correlationList.splice(i, 1)
|
||||
}
|
||||
}
|
||||
},
|
||||
updateModuleType(e) {
|
||||
this.type = e
|
||||
},
|
||||
generateCode() {
|
||||
let random = localStorage.getItem("random")
|
||||
|
||||
let url = "/generator/" + random + "/" + this.type
|
||||
get(url).then(res => {
|
||||
console.log(res)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style scoped>
|
||||
.title {
|
||||
height: 50px;
|
||||
line-height: 50px;
|
||||
}
|
||||
|
||||
.my-button {
|
||||
margin-top: 20px;
|
||||
}
|
||||
</style>
|
@ -0,0 +1,122 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>2.0.7.RELEASE</version>
|
||||
<relativePath />
|
||||
</parent>
|
||||
<groupId>com.example</groupId>
|
||||
<artifactId>azhou-code</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<name>azhou-code</name>
|
||||
<description>Demo project for Spring Boot</description>
|
||||
<properties>
|
||||
<java.version>1.8</java.version>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>1.18.4</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-redis</artifactId>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>io.lettuce</groupId>
|
||||
<artifactId>lettuce-core</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>fastjson</artifactId>
|
||||
<version>1.2.62</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>redis.clients</groupId>
|
||||
<artifactId>jedis</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.hutool</groupId>
|
||||
<artifactId>hutool-all</artifactId>
|
||||
<version>5.7.7</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-freemarker</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<version>8.0.18</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<configuration>
|
||||
<excludes>
|
||||
<exclude>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
</exclude>
|
||||
</excludes>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>spring-milestones</id>
|
||||
<name>Spring Milestones</name>
|
||||
<url>https://repo.spring.io/milestone</url>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>spring-snapshots</id>
|
||||
<name>Spring Snapshots</name>
|
||||
<url>https://repo.spring.io/snapshot</url>
|
||||
<releases>
|
||||
<enabled>false</enabled>
|
||||
</releases>
|
||||
</repository>
|
||||
</repositories>
|
||||
<pluginRepositories>
|
||||
<pluginRepository>
|
||||
<id>spring-milestones</id>
|
||||
<name>Spring Milestones</name>
|
||||
<url>https://repo.spring.io/milestone</url>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
</pluginRepository>
|
||||
<pluginRepository>
|
||||
<id>spring-snapshots</id>
|
||||
<name>Spring Snapshots</name>
|
||||
<url>https://repo.spring.io/snapshot</url>
|
||||
<releases>
|
||||
<enabled>false</enabled>
|
||||
</releases>
|
||||
</pluginRepository>
|
||||
</pluginRepositories>
|
||||
|
||||
</project>
|
@ -0,0 +1,14 @@
|
||||
package com.azhoucode;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication
|
||||
public class AzhouCodeApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(AzhouCodeApplication.class, args);
|
||||
System.out.println("http://localhost:8888/index.html");
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
package com.azhoucode.common;
|
||||
|
||||
|
||||
import com.azhoucode.enums.BaseErrorEnum;
|
||||
|
||||
public class BaseError {
|
||||
|
||||
private Integer code;
|
||||
|
||||
private String message;
|
||||
|
||||
|
||||
public BaseError(Integer code, String message) {
|
||||
this.code = code;
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public BaseError(BaseErrorEnum baseErrorEnum) {
|
||||
this.code = baseErrorEnum.getCode();
|
||||
this.message = baseErrorEnum.getMessage();
|
||||
}
|
||||
|
||||
public Integer getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public void setCode(Integer code) {
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
public void setMessage(String message) {
|
||||
this.message = message;
|
||||
}
|
||||
}
|
@ -0,0 +1,98 @@
|
||||
package com.azhoucode.common;
|
||||
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
|
||||
@ConfigurationProperties(prefix = "spring.redis")
|
||||
public class RedisProperties {
|
||||
|
||||
private String host;
|
||||
|
||||
private Integer port;
|
||||
|
||||
private int timeout;
|
||||
|
||||
private String password;
|
||||
|
||||
private int database;
|
||||
|
||||
private int maxActive;
|
||||
|
||||
private int maxIdle;
|
||||
|
||||
private int maxWait;
|
||||
|
||||
private int minIdle;
|
||||
|
||||
|
||||
public String getHost() {
|
||||
return host;
|
||||
}
|
||||
|
||||
public void setHost(String host) {
|
||||
this.host = host;
|
||||
}
|
||||
|
||||
public Integer getPort() {
|
||||
return port;
|
||||
}
|
||||
|
||||
public void setPort(Integer port) {
|
||||
this.port = port;
|
||||
}
|
||||
|
||||
public int getTimeout() {
|
||||
return timeout;
|
||||
}
|
||||
|
||||
public void setTimeout(int timeout) {
|
||||
this.timeout = timeout;
|
||||
}
|
||||
|
||||
public String getPassword() {
|
||||
return password;
|
||||
}
|
||||
|
||||
public void setPassword(String password) {
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
public int getDatabase() {
|
||||
return database;
|
||||
}
|
||||
|
||||
public void setDatabase(int database) {
|
||||
this.database = database;
|
||||
}
|
||||
|
||||
public int getMaxActive() {
|
||||
return maxActive;
|
||||
}
|
||||
|
||||
public void setMaxActive(int maxActive) {
|
||||
this.maxActive = maxActive;
|
||||
}
|
||||
|
||||
public int getMaxIdle() {
|
||||
return maxIdle;
|
||||
}
|
||||
|
||||
public void setMaxIdle(int maxIdle) {
|
||||
this.maxIdle = maxIdle;
|
||||
}
|
||||
|
||||
public int getMaxWait() {
|
||||
return maxWait;
|
||||
}
|
||||
|
||||
public void setMaxWait(int maxWait) {
|
||||
this.maxWait = maxWait;
|
||||
}
|
||||
|
||||
public int getMinIdle() {
|
||||
return minIdle;
|
||||
}
|
||||
|
||||
public void setMinIdle(int minIdle) {
|
||||
this.minIdle = minIdle;
|
||||
}
|
||||
}
|
@ -0,0 +1,85 @@
|
||||
package com.azhoucode.common;
|
||||
|
||||
|
||||
import com.azhoucode.enums.BaseErrorEnum;
|
||||
|
||||
/**
|
||||
* 数据json数据统一返回
|
||||
*
|
||||
* @param <E> 返回数据data的泛型
|
||||
*/
|
||||
public class SimpleResponse<E> {
|
||||
|
||||
private int code;
|
||||
// 服务端是否正确响应
|
||||
private boolean success;
|
||||
// 错误响应时的消息提示
|
||||
private String message;
|
||||
// 正确响应时的数据对象
|
||||
private E data;
|
||||
|
||||
private SimpleResponse() {
|
||||
this.code = BaseErrorEnum.SUCCESS.getCode();
|
||||
this.success = true;
|
||||
this.message = BaseErrorEnum.SUCCESS.getMessage();
|
||||
}
|
||||
|
||||
private SimpleResponse(int code, String message, boolean success) {
|
||||
this.code = code;
|
||||
this.success = success;
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
private SimpleResponse(E data) {
|
||||
this();
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
public static <E> SimpleResponse<E> success() {
|
||||
return new SimpleResponse<>();
|
||||
}
|
||||
|
||||
public static <E> SimpleResponse<E> success(E data) {
|
||||
return new SimpleResponse<>(data);
|
||||
}
|
||||
|
||||
public static <E> SimpleResponse<E> error(int code, String message, boolean success) {
|
||||
return new SimpleResponse<>(code, message, success);
|
||||
}
|
||||
|
||||
public static <E> SimpleResponse<E> error(BaseErrorEnum baseErrorEnum) {
|
||||
return error((int) baseErrorEnum.getCode(), baseErrorEnum.getMessage(), false);
|
||||
}
|
||||
|
||||
public int getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public void setCode(int code) {
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
public boolean isSuccess() {
|
||||
return success;
|
||||
}
|
||||
|
||||
public void setSuccess(boolean success) {
|
||||
this.success = success;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
public void setMessage(String message) {
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public E getData() {
|
||||
return data;
|
||||
}
|
||||
|
||||
public void setData(E data) {
|
||||
this.data = data;
|
||||
}
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
package com.azhoucode.config;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.cors.CorsConfiguration;
|
||||
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
|
||||
import org.springframework.web.filter.CorsFilter;
|
||||
|
||||
/**
|
||||
* @Description: 跨域过滤器
|
||||
* @Author: azhou
|
||||
* @Create: 2021-05-24 23:13
|
||||
*/
|
||||
@Configuration
|
||||
public class GlobalCorsConfig {
|
||||
|
||||
@Bean
|
||||
public CorsFilter corsFilter() {
|
||||
CorsConfiguration config = new CorsConfiguration();
|
||||
config.addAllowedOrigin("*");
|
||||
config.setAllowCredentials(true);
|
||||
config.addAllowedMethod("*");
|
||||
config.addAllowedHeader("*");
|
||||
config.addExposedHeader("token");
|
||||
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
|
||||
configSource.registerCorsConfiguration("/**", config);
|
||||
return new CorsFilter(configSource);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
package com.azhoucode.config;
|
||||
|
||||
import com.azhoucode.common.SimpleResponse;
|
||||
|
||||
import com.azhoucode.enums.BaseErrorEnum;
|
||||
import org.hibernate.validator.internal.engine.path.PathImpl;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.validation.BindException;
|
||||
import org.springframework.validation.FieldError;
|
||||
import org.springframework.web.HttpRequestMethodNotSupportedException;
|
||||
import org.springframework.web.bind.MissingServletRequestParameterException;
|
||||
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import org.springframework.web.multipart.MaxUploadSizeExceededException;
|
||||
import org.springframework.web.servlet.NoHandlerFoundException;
|
||||
|
||||
import javax.validation.ConstraintViolation;
|
||||
import javax.validation.ConstraintViolationException;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* 统一异常处理器
|
||||
*/
|
||||
@ControllerAdvice
|
||||
@SuppressWarnings("all")
|
||||
public class GlobalExceptionHandler {
|
||||
|
||||
private final Logger logger = LoggerFactory.getLogger(getClass());
|
||||
|
||||
/**
|
||||
* 处理{@link Exception}异常
|
||||
*
|
||||
* @return 返回统一json数据对象
|
||||
*/
|
||||
@ExceptionHandler(Exception.class)
|
||||
@ResponseBody
|
||||
public SimpleResponse errorProceed(Exception e) {
|
||||
logger.error("请求发生错误。", e);
|
||||
return SimpleResponse.error(BaseErrorEnum.SERVER_ERROR);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,134 @@
|
||||
package com.azhoucode.constant;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
|
||||
public class Constant {
|
||||
|
||||
public static JFrame frmv;
|
||||
|
||||
public static final String projectName = "freeOut";
|
||||
|
||||
public static final String modelFiles = "C:\\codeManConfig\\modelFiles\\";
|
||||
|
||||
public static final String modelFilesZip = "C:\\codeManConfig\\modelFiles\\model.zip";
|
||||
|
||||
public static final String staticZip = "C:\\codeManConfig\\modelFiles\\static.zip";
|
||||
|
||||
public static final String webClientZip = "C:\\codeManConfig\\modelFiles\\webClient.zip";
|
||||
|
||||
public static final String mvcSettingsZip = "C:\\codeManConfig\\modelFiles\\mvcSettings.zip";
|
||||
|
||||
public static final String settingsZip = "C:\\codeManConfig\\modelFiles\\settings.zip";
|
||||
|
||||
public static final String libZip = "C:\\codeManConfig\\modelFiles\\lib.zip";
|
||||
|
||||
public static final String zipPwd = "beautiful123,,#@";
|
||||
|
||||
// 获取激活文件
|
||||
public static final String lifePropertiesPath = "C:\\codeManConfig\\codeManSdk\\bin\\server\\life.properties";
|
||||
|
||||
// 项目根目录
|
||||
public static final String freeOutPath = "\\freeOut\\";
|
||||
|
||||
public static final String freeOutPath_lib_MVC = "\\freeOut\\src\\main\\webapp\\WEB-INF\\lib\\";
|
||||
|
||||
public static final String freeOutPath_lib = "\\freeOut\\lib\\";
|
||||
|
||||
public static final String freeOutPath_METAINF_MVC = "\\freeOut\\src\\main\\webapp\\META-INF\\";
|
||||
|
||||
public static final String mainApplicationPath = "\\freeOut\\src\\main\\java\\freeOut\\";
|
||||
|
||||
public static final String testPath = "\\freeOut\\src\\test\\java\\freeOut\\";
|
||||
|
||||
public static final String freeOutPath_controller = "\\freeOut\\src\\main\\java\\freeOut\\controller\\";
|
||||
|
||||
public static final String freeOutPath_core = "\\freeOut\\src\\main\\java\\freeOut\\core\\";
|
||||
|
||||
public static final String freeOutPath_core_annotation = "\\freeOut\\src\\main\\java\\freeOut\\core\\annotation\\";
|
||||
|
||||
public static final String freeOutPath_core_exception = "\\freeOut\\src\\main\\java\\freeOut\\core\\exception\\";
|
||||
|
||||
public static final String freeOutPath_service = "\\freeOut\\src\\main\\java\\freeOut\\service\\";
|
||||
|
||||
public static final String freeOutPath_serviceImpl = "\\freeOut\\src\\main\\java\\freeOut\\service\\impl\\";
|
||||
|
||||
public static final String freeOutPath_dao = "\\freeOut\\src\\main\\java\\freeOut\\dao\\";
|
||||
|
||||
public static final String freeOutPath_entity = "\\freeOut\\src\\main\\java\\freeOut\\entity\\";
|
||||
|
||||
public static final String freeOutPath_constant = "\\freeOut\\src\\main\\java\\freeOut\\constant\\";
|
||||
|
||||
public static final String freeOutPath_resources = "\\freeOut\\src\\main\\resources\\";
|
||||
|
||||
public static final String freeOutPath_sqlMapper = "\\freeOut\\src\\main\\resources\\sqlmapper\\";
|
||||
|
||||
public static final String freeOutPath_sqlMapper_MVC = "\\freeOut\\src\\main\\java\\freeOut\\sqlmapper\\";
|
||||
|
||||
public static final String freeOutPath_static = "\\freeOut\\src\\main\\resources\\static\\mystatic\\";
|
||||
|
||||
public static final String freeOutPath_static_MVC = "\\freeOut\\src\\main\\webapp\\mystatic\\";
|
||||
|
||||
public static final String freeOutPath_templates = "\\freeOut\\src\\main\\resources\\templates\\";
|
||||
|
||||
public static final String freeOutPath_WEBINF_MVC = "\\freeOut\\src\\main\\webapp\\WEB-INF\\";
|
||||
|
||||
public static String downSettingsZipNet = "/zip/settings.zip";
|
||||
|
||||
public static String downMvcSettingsZipNet = "/zip/mvcSettings.zip";
|
||||
|
||||
public static final String freeOutPath_settings = "\\freeOut\\.settings\\";
|
||||
|
||||
public static String downStaticZipNet = "/zip/static.zip";
|
||||
|
||||
public static String downWebClientZipNet = "/zip/webClient.zip";
|
||||
|
||||
public static String downLibZipNet = "/zip/lib.zip";
|
||||
|
||||
public static final String utilPath = "\\freeOut\\src\\main\\java\\freeOut\\utils\\";
|
||||
|
||||
public static final String mvcConfig = "\\freeOut\\src\\main\\java\\freeOut\\config\\";
|
||||
|
||||
public static String everythingZip = "/zip/everything.zip";
|
||||
|
||||
public static final String everythingDownLoadDir = "C:\\codeManConfig\\everything\\";
|
||||
|
||||
public static final String everythingExeName = "C:\\codeManConfig\\everything\\Everything.exe";
|
||||
|
||||
public static String dubboModelZip = "/zip/dubboModel.zip";
|
||||
|
||||
public static String cloudModelZip = "/zip/cloudModel.zip";
|
||||
|
||||
public static final String gitIpAdressFilePath = "C:\\codeManConfig\\codeManIp\\ip.txt";
|
||||
|
||||
public static final String gitConfigFilePath = "C:\\codeManConfig\\.git";
|
||||
|
||||
public static final String webClientPath = "\\freeOut-webClient\\";
|
||||
|
||||
public static final String webClientHtmlPath = "\\freeOut-webClient\\views\\";
|
||||
|
||||
public static final String webClientJsConfigPath = "\\freeOut-webClient\\js\\config\\";
|
||||
|
||||
|
||||
static {
|
||||
File ipFile = new File(Constant.gitIpAdressFilePath);
|
||||
try (BufferedReader reader = new BufferedReader(new FileReader(ipFile))){
|
||||
String ipPath = reader.readLine();
|
||||
|
||||
Constant.downSettingsZipNet = ipPath + Constant.downSettingsZipNet;
|
||||
Constant.downMvcSettingsZipNet = ipPath + Constant.downMvcSettingsZipNet;
|
||||
Constant.downStaticZipNet = ipPath + Constant.downStaticZipNet;
|
||||
Constant.downWebClientZipNet = ipPath + Constant.downWebClientZipNet;
|
||||
Constant.downLibZipNet = ipPath + Constant.downLibZipNet;
|
||||
Constant.everythingZip = ipPath + Constant.everythingZip;
|
||||
Constant.dubboModelZip = ipPath + Constant.dubboModelZip;
|
||||
Constant.cloudModelZip = ipPath + Constant.cloudModelZip;
|
||||
|
||||
} catch (Exception e) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package com.azhoucode.constant;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* @description: 生成路径常量类
|
||||
* @author: azhou
|
||||
* @create: 2021-12-07 17:15
|
||||
**/
|
||||
@Component
|
||||
public class PathConstant {
|
||||
|
||||
@Value("${file-path.project}")
|
||||
public String projectPath;
|
||||
@Value("${dao}")
|
||||
public String daoPath;
|
||||
@Value("${dao}")
|
||||
public String servicePath;
|
||||
@Value("${service-impl}")
|
||||
public String serviceImplPath;
|
||||
@Value("${entity}")
|
||||
public String entityPath;
|
||||
@Value("${controller}")
|
||||
public String controllerPath;
|
||||
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package com.azhoucode.constant;
|
||||
|
||||
/**
|
||||
* @description: Redis常量
|
||||
* @author: azhou
|
||||
* @create: 2021-11-01 16:38
|
||||
**/
|
||||
public class RedisConstant {
|
||||
|
||||
public static final String DB_PARAM = "db_param_%s";
|
||||
|
||||
public static final String TABLE_LIST = "table_list_%s";
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package com.azhoucode.constant;
|
||||
|
||||
/**
|
||||
* @description: 错误提示模板常量类
|
||||
* @author: azhou
|
||||
* @create: 2021-12-14 15:49
|
||||
**/
|
||||
public class TipTemplateConstant {
|
||||
|
||||
public static final String REDIS_KEY_NOT_FOUND = "当前Redis中不存在【%s】key";
|
||||
|
||||
public static final String TEMP_TYPE_NOT_FOUND = "当前模板类型枚举中不存在【%d】";
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,57 @@
|
||||
package com.azhoucode.controller;
|
||||
|
||||
import com.azhoucode.common.SimpleResponse;
|
||||
import com.azhoucode.entity.ApplicationEntity;
|
||||
import com.azhoucode.entity.TableEntity;
|
||||
import com.azhoucode.service.DBService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @description: db
|
||||
* @author: azhou
|
||||
* @create: 2021-11-01 14:50
|
||||
**/
|
||||
@RestController
|
||||
@RequestMapping("/db")
|
||||
public class DBController {
|
||||
|
||||
@Autowired
|
||||
private DBService dbService;
|
||||
|
||||
/**
|
||||
* 校验数据库是否能够连接成功
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/checkDBParam")
|
||||
public SimpleResponse<String> checkDBParam(@RequestBody ApplicationEntity applicationEntity) throws Exception {
|
||||
return SimpleResponse.success(dbService.checkDBParam(applicationEntity));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据表名称获得表中的列数据
|
||||
* @param tableName
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@GetMapping("/getTableColList/{tableName}/{random}")
|
||||
public SimpleResponse<TableEntity> getTableColList(@PathVariable("tableName") String tableName,@PathVariable("random") String random) throws Exception {
|
||||
return SimpleResponse.success(dbService.getTableColList(tableName,random));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得所有的表数据
|
||||
* @param random
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@GetMapping("/getAllTable/{random}")
|
||||
public SimpleResponse<List<String>> getAllTable(@PathVariable("random") String random) throws Exception {
|
||||
List<String> list = dbService.getAllTable(random);
|
||||
return SimpleResponse.success(list);
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
package com.azhoucode.controller;
|
||||
|
||||
import com.azhoucode.common.SimpleResponse;
|
||||
import com.azhoucode.service.GenerateService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
/**
|
||||
* @description: 代码生成器接口层
|
||||
* @author: azhou
|
||||
* @create: 2021-12-14 15:32
|
||||
**/
|
||||
@RestController
|
||||
@RequestMapping("/generator")
|
||||
public class GeneratorController {
|
||||
|
||||
@Autowired
|
||||
private GenerateService generateService;
|
||||
|
||||
/**
|
||||
* 代码生成
|
||||
*/
|
||||
@GetMapping("/{random}/{type}")
|
||||
public SimpleResponse generator(@PathVariable("random") String random,@PathVariable("type") Integer type) throws Exception {
|
||||
generateService.generateCode(random,type);
|
||||
return SimpleResponse.success();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
package com.azhoucode.controller;
|
||||
|
||||
import com.azhoucode.common.SimpleResponse;
|
||||
import com.azhoucode.entity.TableEntity;
|
||||
import com.azhoucode.service.TableService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
/**
|
||||
* @description: 数据库表接口层
|
||||
* @author: azhou
|
||||
* @create: 2021-12-15 10:50
|
||||
**/
|
||||
@RestController
|
||||
@RequestMapping("/table")
|
||||
public class TableController {
|
||||
|
||||
@Autowired
|
||||
private TableService tableService;
|
||||
|
||||
|
||||
/**
|
||||
* 添加单表配置
|
||||
* info#management#message#question#test_paper#type
|
||||
* @param tableEntity
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/{random}")
|
||||
public SimpleResponse<String> addTableConfiguration(@RequestBody TableEntity tableEntity,@PathVariable("random") String random) throws Exception {
|
||||
tableService.addTableConfiguration(tableEntity,random);
|
||||
return SimpleResponse.success();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,67 @@
|
||||
package com.azhoucode.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @description: 配置文件帮助类
|
||||
* @author: azhou
|
||||
* @create: 2021-12-07 13:33
|
||||
**/
|
||||
@Data
|
||||
public class ApplicationEntity extends BaseEntity {
|
||||
|
||||
/** 项目整体相关 start */
|
||||
// 项目端口
|
||||
private Integer port;
|
||||
|
||||
// 是否需要添加邮件发送组件
|
||||
private Boolean hasEmail;
|
||||
|
||||
// 是否需要添加redis组件
|
||||
private Boolean hasRedis;
|
||||
|
||||
// 是否需要添加图片文件上传组件
|
||||
private Boolean hasUploadImg;
|
||||
|
||||
// 是否需要自定义登录
|
||||
private Boolean hasLogin;
|
||||
|
||||
/** 项目整体相关 end */
|
||||
|
||||
/** 数据库相关 start */
|
||||
|
||||
private String ip;
|
||||
|
||||
private String dbPort;
|
||||
|
||||
private String username;
|
||||
|
||||
private String password;
|
||||
|
||||
private String dbName;
|
||||
|
||||
// 数据库表名称,用#隔开
|
||||
private String tableName;
|
||||
|
||||
/** 数据库相关 end */
|
||||
|
||||
/** redis相关 start */
|
||||
|
||||
private String redisIp;
|
||||
|
||||
private String redisPort;
|
||||
|
||||
private String redisPassWord;
|
||||
|
||||
/** redis相关 end */
|
||||
|
||||
/** 图片上传相关 start */
|
||||
|
||||
// 本机图片地址服务器的webapp绝对路径
|
||||
private String uploadUrl;
|
||||
|
||||
/** 图片上传相关 end */
|
||||
|
||||
/** 自定义登录 & 个人信息相关 start */
|
||||
private LoginParam loginParam;
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
package com.azhoucode.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
public class BaseEntity implements Serializable {
|
||||
|
||||
/**表名称*/
|
||||
private String tableName;
|
||||
|
||||
/**作者名称*/
|
||||
private String authorName;
|
||||
|
||||
/**表注释*/
|
||||
private String tableComment;
|
||||
|
||||
/**包名*/
|
||||
private String packageName;
|
||||
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package com.azhoucode.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @description: 枚举传输
|
||||
* @author: azhou
|
||||
* @create: 2021-12-24 11:31
|
||||
**/
|
||||
@Data
|
||||
public class EnumsDTO {
|
||||
|
||||
private String name;
|
||||
|
||||
private String value;
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package com.azhoucode.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @description: 列枚举类
|
||||
* @author: azhou
|
||||
* @create: 2021-12-24 11:29
|
||||
**/
|
||||
@Data
|
||||
public class EnumsEntity {
|
||||
|
||||
/**当前枚举属于那一列*/
|
||||
private String colName;
|
||||
|
||||
private List<EnumsDTO> enumsDTOS;
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
package com.azhoucode.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @description: 登录参数 admin#beds#department#doctor#leave_hospital#rooms#sick_cost#sick_info
|
||||
* @author: azhou
|
||||
* @create: 2021-12-15 17:08
|
||||
**/
|
||||
@Data
|
||||
public class LoginParam {
|
||||
|
||||
private String tableName;
|
||||
private String className;
|
||||
private String unClassName;
|
||||
private String userNameCol;
|
||||
private String passWordCol;
|
||||
// 自定义用户信息相关
|
||||
private Boolean hasUserInfo;
|
||||
private String headImgCol;
|
||||
private String nickNameCol;
|
||||
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
package com.azhoucode.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class Parameters {
|
||||
|
||||
private String projectNameVal;
|
||||
|
||||
private String frameWorkVal;
|
||||
|
||||
private String clientFrameWorkVal;
|
||||
|
||||
private String dataBaseTypeVal;
|
||||
|
||||
private String dataBaseIpVal;
|
||||
|
||||
private String dataBasePortVal;
|
||||
|
||||
private String dataBasePwdVal;
|
||||
|
||||
private String dataBaseNameVal;
|
||||
|
||||
private String dataBaseUserNameVal;
|
||||
|
||||
private String dataBaseUrl;
|
||||
|
||||
private String dataBaseDriverClass;
|
||||
|
||||
private String outPathVal;
|
||||
|
||||
private String makeModelVal;
|
||||
|
||||
private String tableName;
|
||||
|
||||
private String jsFrameWork;
|
||||
|
||||
private String themeVal;
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,57 @@
|
||||
package com.azhoucode.entity;
|
||||
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 项目整体参数
|
||||
*/
|
||||
@Data
|
||||
public class ProjectParam extends BaseEntity{
|
||||
|
||||
/**项目名称*/
|
||||
private String projectName;
|
||||
|
||||
/**项目访问端口*/
|
||||
private Integer projectPort;
|
||||
|
||||
/**总包名*/
|
||||
private String packageName;
|
||||
|
||||
/**数据库ip*/
|
||||
private String dbIp;
|
||||
|
||||
/**数据库端口*/
|
||||
private String dbPort;
|
||||
|
||||
/**数据库用户名*/
|
||||
private String dbUserName;
|
||||
|
||||
/**数据库密码*/
|
||||
private String dbPassWord;
|
||||
|
||||
/**数据库名称*/
|
||||
private String dbName;
|
||||
|
||||
/**表名称(根据#拆分)*/
|
||||
private List<String> tableNames;
|
||||
|
||||
/**是否需要redis*/
|
||||
private Integer isRedis;
|
||||
|
||||
/**是否需要tomcat文件服务器*/
|
||||
private Integer isTomcatFile;
|
||||
|
||||
/**tomcat文件保存的地址*/
|
||||
private String tomcatWebAppsPath;
|
||||
|
||||
/**
|
||||
* 是否需要登录拦截
|
||||
* 如果有redis则使用redis存储用户信息
|
||||
* 否则使用session来存储用户信息
|
||||
*/
|
||||
private Integer isLoginHandle;
|
||||
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
package com.azhoucode.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @description: 路由参数
|
||||
* @author: azhou
|
||||
* @create: 2021-12-23 12:56
|
||||
**/
|
||||
@Data
|
||||
public class RouterParam {
|
||||
|
||||
private String routerName;
|
||||
|
||||
private String chinaName;
|
||||
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package com.azhoucode.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class SearchParam {
|
||||
|
||||
/**列名称*/
|
||||
private String colName;
|
||||
|
||||
/**字段名称*/
|
||||
private String propertyName;
|
||||
|
||||
/**属性类型*/
|
||||
private String propertyType;
|
||||
|
||||
/**字段注释*/
|
||||
private String propertyChinaName;
|
||||
|
||||
/**比较方式*/
|
||||
private String compareWay;
|
||||
|
||||
/**属于那张表*/
|
||||
private String fromTableName;
|
||||
|
||||
/**比较类型*/
|
||||
private String compareType;
|
||||
|
||||
private Boolean isUploadCol;
|
||||
private String showType;
|
||||
private String updateType;
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
package com.azhoucode.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @description: 下拉框对象
|
||||
* @author: azhou
|
||||
* @create: 2021-12-24 14:37
|
||||
**/
|
||||
@Data
|
||||
public class SelectEntity {
|
||||
|
||||
/**来源那张表*/
|
||||
private String fromTableName;
|
||||
|
||||
/**类名*/
|
||||
private String className;
|
||||
|
||||
/**类名小写*/
|
||||
private String unClassName;
|
||||
|
||||
/**名称列*/
|
||||
private String nameCol;
|
||||
|
||||
/**value列*/
|
||||
private String valueCol;
|
||||
|
||||
/**该选择框属于哪一列*/
|
||||
private String colName;
|
||||
|
||||
/**列对应的属性名称*/
|
||||
private String propertyName;
|
||||
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package com.azhoucode.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @description: 数据库表列数据实体
|
||||
* @author: azhou
|
||||
* @create: 2021-11-01 16:25
|
||||
**/
|
||||
@Data
|
||||
public class TableColEntity {
|
||||
|
||||
private String colName;
|
||||
private String chinaName;
|
||||
private Boolean tableShow;
|
||||
private Boolean updateShow;
|
||||
private Boolean searchShow;
|
||||
private String paramType;
|
||||
private String compareType;
|
||||
private String showType;
|
||||
private String updateType;
|
||||
private Boolean uploadImg;
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
package com.azhoucode.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @description: 表格数据
|
||||
* @author: azhou
|
||||
* @create: 2021-11-01 16:29
|
||||
**/
|
||||
@Data
|
||||
public class TableEntity {
|
||||
|
||||
private String tableName;
|
||||
|
||||
private String tableComment;
|
||||
|
||||
/**
|
||||
* 表格中的列数据
|
||||
*/
|
||||
private List<TableColEntity> tableColEntityList;
|
||||
|
||||
/**
|
||||
* 子表数据
|
||||
*/
|
||||
private List<TableEntity> sonTableEntities;
|
||||
|
||||
/**
|
||||
* 关联关系数组
|
||||
*/
|
||||
private List<String> correlationList;
|
||||
|
||||
/**修改展示的枚举*/
|
||||
private List<EnumsEntity> enumsEntities;
|
||||
|
||||
/**表格展示的枚举*/
|
||||
private List<EnumsEntity> tableEnumsEntities;
|
||||
|
||||
private List<SelectEntity> selectEntities;
|
||||
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
package com.azhoucode.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 表的字段和类型
|
||||
* azhou
|
||||
*/
|
||||
@Data
|
||||
public class TableNameAndType implements Serializable {
|
||||
|
||||
/**列明*/
|
||||
private String colName;
|
||||
|
||||
/**对应实体名称*/
|
||||
private String entityName;
|
||||
|
||||
/**实体中参数类型*/
|
||||
private String entityParamType;
|
||||
|
||||
private String className;
|
||||
/**注释*/
|
||||
private String comment;
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,95 @@
|
||||
package com.azhoucode.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @description: 单表参数
|
||||
* @author: azhou
|
||||
* @create: 2021-12-15 09:28
|
||||
**/
|
||||
@Data
|
||||
public class TableParam {
|
||||
|
||||
/**
|
||||
* 表格名称
|
||||
*/
|
||||
private String tableName;
|
||||
|
||||
/**
|
||||
* 类名称
|
||||
*/
|
||||
private String className;
|
||||
|
||||
/**
|
||||
* 小写类名称
|
||||
*/
|
||||
private String unClassName;
|
||||
|
||||
|
||||
/**
|
||||
* 表格中文名称
|
||||
*/
|
||||
private String tableComment;
|
||||
|
||||
/**
|
||||
* 本表中需要展示的列 实体类中的属性
|
||||
*/
|
||||
private List<SearchParam> showColList;
|
||||
|
||||
/**
|
||||
* 是否有子表
|
||||
*/
|
||||
private Boolean hasSonTable;
|
||||
|
||||
/**
|
||||
* 子表中需要展示的列 dto中的属性
|
||||
*/
|
||||
private List<SearchParam> showSonTableColList;
|
||||
|
||||
/**
|
||||
* 搜索比较字段 xml中需要搜索的字段
|
||||
*/
|
||||
private List<SearchParam> searchColsList;
|
||||
|
||||
/**
|
||||
* 与主表的关联关系
|
||||
*/
|
||||
private String correlation;
|
||||
|
||||
/**
|
||||
* 表中是否存在图片上传
|
||||
*/
|
||||
private Boolean hasUpload;
|
||||
|
||||
/**
|
||||
* 前端表格需要展示的列
|
||||
*/
|
||||
private List<SearchParam> vueShowColList;
|
||||
|
||||
/**
|
||||
* 前端编辑添加时候需要修改的列
|
||||
*/
|
||||
private List<SearchParam> vueModifyColList;
|
||||
|
||||
/**
|
||||
* 前端顶部搜索需要展示的列
|
||||
*/
|
||||
private List<SearchParam> vueSearchColList;
|
||||
|
||||
/**
|
||||
* 该表中修改时候需要展示的枚举
|
||||
*/
|
||||
private List<EnumsEntity> updateEnumsLists;
|
||||
|
||||
/**
|
||||
* 下拉选择框数据来源
|
||||
*/
|
||||
private List<SelectEntity> selectEntities;
|
||||
|
||||
private List<EnumsEntity> tableEnumsEntities;
|
||||
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,80 @@
|
||||
package com.azhoucode.enums;
|
||||
|
||||
public enum BaseErrorEnum {
|
||||
|
||||
/**
|
||||
* 成功
|
||||
*/
|
||||
SUCCESS(200, "成功"),
|
||||
|
||||
/**
|
||||
* 普通请求异常
|
||||
*/
|
||||
OBJECT_NOT_FOUND(10001, "请求数据不存在"),
|
||||
REQUEST_PARAMETER_EXCEPTION(10002, "请求参数错误"),
|
||||
PARAMETER_NOT_FOUND(10003, "必传参数缺失"),
|
||||
|
||||
BAD_ACCOUNTS(10004, "手机号码有误,请重新输入"),
|
||||
BAD_CREDENTIALS(10005, "密码有误,请重新输入"),
|
||||
ACCOUNTS_DISABLED(10006, "账号不可用"),
|
||||
LOGIN_EXPIRED(10007, "登录已失效"),
|
||||
REQUIRED_AUTHENTICATION(10008, "权限不足,需要登录认证"),
|
||||
|
||||
REQUIRED_ROLE(10019, "角色权限不足"),
|
||||
|
||||
VALIDATE_CODE_REQUIRED(10009, "请发送短信验证码"),
|
||||
VALIDATE_CODE_EXPIRED(10010, "短信验证码已过期"),
|
||||
VALIDATE_CODE_ERROR(10011, "短信验证码不匹配"),
|
||||
VALIDATE_CODE_SEND_ERROR(10012, "短信验证码发送失败"),
|
||||
|
||||
ACCESS_TOKEN_ERROR(10013, "令牌非法"),
|
||||
SUBJECT_DELETE(10014, "用户已注销"),
|
||||
|
||||
MOBILE_LOGIN_ERROR(10015, "一键登录失败"),
|
||||
MOBILE_LOGIN_DECRYPT_EXCEPTION(10016, "一键登录解密异常"),
|
||||
FILE_TOO_LARGE_EXCEPTION(10017, "上传文件太大"),
|
||||
TXT_TOO_LARGE_EXCEPTION(10018, "数据太长"),
|
||||
|
||||
STAFF_VALIDATE_CODE_ERROR(10019, "管家认证码不存在"),
|
||||
STAFF_VALIDATE_CODE_USED(10020, "管家认证码已使用"),
|
||||
|
||||
// 4000开头客户端异常
|
||||
REQUEST_NOT_SUPPORT(40001, "请求方式不支持"),
|
||||
NO_HANDLER_EXCEPTION(40002, "没有找到请求处理器"),
|
||||
CITY_NOT_FIND_ERROR(40003, "不合法的城市参数"),
|
||||
CONDITION_NOT_MET(40004, "条件未满足"),
|
||||
NO_PERMISSION_FOR_THIS_DATA(40005, "对该数据无权限"),
|
||||
|
||||
// 5000开头服务端异常
|
||||
SERVER_ERROR(50001, "服务内部异常"),
|
||||
BUSINESS_ERROR(50002, "业务错误"),
|
||||
|
||||
|
||||
FILE_UPLOAD_ERROR(50003, "文件上传失败"),
|
||||
|
||||
LOCATION_ERROR(50004,"经纬度定位失败"),
|
||||
HOUSE_NULL(50005,"房源数据为空"),
|
||||
HOUSE_ERROR(50006,"房源数据有误"),
|
||||
RESULT_ERROR(50007,"查询的结果为空"),
|
||||
|
||||
;
|
||||
|
||||
private final int code;
|
||||
|
||||
private final String message;
|
||||
|
||||
BaseErrorEnum(int code, String message) {
|
||||
this.code = code;
|
||||
this.message = message;
|
||||
|
||||
}
|
||||
|
||||
public int getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package com.azhoucode.enums;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum DBType {
|
||||
|
||||
MYSQL(1, "mysql");
|
||||
|
||||
|
||||
|
||||
private Integer code;
|
||||
|
||||
private String value;
|
||||
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package com.azhoucode.enums;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum ServerName {
|
||||
|
||||
SPRING_BOOT(1, "springboot"),
|
||||
|
||||
MYBATIS(101,"mybatis"),
|
||||
MYBATIS_PLUS(102,"mybatis_plus"),
|
||||
REDIS(103,"redis"),// redis
|
||||
|
||||
|
||||
TOMCAT_FILE(301,"tomcat_file");// 文件服务器
|
||||
|
||||
private Integer code;
|
||||
|
||||
private String value;
|
||||
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,61 @@
|
||||
package com.azhoucode.enums;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* @description: 模板类型
|
||||
* @author: azhou
|
||||
* @create: 2021-12-14 15:58
|
||||
**/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum TemplateTypeEnum {
|
||||
|
||||
APPLICATION(1, "application.ftl", "application.yml"),
|
||||
ENTITY(2, "entity.ftl", "%s.java"),
|
||||
CONTROLLER(3, "controller.ftl", "%sController.java"),
|
||||
SERVICE(4, "service.ftl", "%sService.java"),
|
||||
SERVICE_IMPL(5, "serviceImpl.ftl", "%sServiceImpl.java"),
|
||||
DAO(6, "dao.ftl", "%sDao.java"),
|
||||
DTO(7, "dto.ftl", "%sDTO.java"),
|
||||
POM(8, "pom.ftl", "pom.xml"),
|
||||
XML(9, "xml.ftl", "%sDao.xml"),
|
||||
REDIS_CONFIG(10, "redisConfig.ftl", "RedisConfig.java"),
|
||||
REDIS_UTIL(11, "redisUtil.ftl", "RedisUtil.java"),
|
||||
MAIN_UTIL(12, "mailUtil.ftl", "MailUtil.java"),
|
||||
LOGIN_CONTROLLER(13, "loginController.ftl", "LoginController.java"),
|
||||
VUE_TABLE(14, "vueTable.ftl", "index.vue"),
|
||||
VUE_API(15, "api.ftl", "index.js"),
|
||||
VUE_ROUTER(16, "sysRouter.ftl", "index.js"),
|
||||
VUE_TABLE2(17, "vueTable2.ftl", "%s.vue"),
|
||||
VUE_ROUTER2(18, "sysRouter2.ftl", "index.js"),
|
||||
VUE_SIDEBAR(19, "Sidebar.ftl", "Sidebar.vue"),
|
||||
VUE_ROUTER3(20, "admin.ftl", "admin.json"),
|
||||
|
||||
;
|
||||
|
||||
private Integer type;
|
||||
|
||||
/**
|
||||
* 模板文件名称
|
||||
*/
|
||||
private String ftlName;
|
||||
|
||||
/**
|
||||
* 模板生成文件名称,使用占位符的形式
|
||||
*/
|
||||
private String fileName;
|
||||
|
||||
public static TemplateTypeEnum getByCode(Integer code) {
|
||||
for (TemplateTypeEnum templateTypeEnum : TemplateTypeEnum.values()) {
|
||||
if(templateTypeEnum.getType().equals(code)) {
|
||||
return templateTypeEnum;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package com.azhoucode.enums;
|
||||
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum WebName {
|
||||
|
||||
LAYUI(1,"layui"),
|
||||
|
||||
VUE(2,"vue");
|
||||
|
||||
private Integer code;
|
||||
|
||||
private String value;
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package com.azhoucode.service;
|
||||
|
||||
import com.azhoucode.entity.ApplicationEntity;
|
||||
import com.azhoucode.entity.TableEntity;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @description: db
|
||||
* @author: azhou
|
||||
* @create: 2021-11-01 14:54
|
||||
**/
|
||||
public interface DBService {
|
||||
|
||||
|
||||
String checkDBParam(ApplicationEntity applicationEntity) throws Exception;
|
||||
|
||||
TableEntity getTableColList(String tableName,String random) throws Exception;
|
||||
|
||||
List<String> getAllTable(String random) throws Exception;
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
package com.azhoucode.service;
|
||||
|
||||
import com.azhoucode.entity.TableNameAndType;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public interface GenerateService {
|
||||
|
||||
/**
|
||||
* 生成全部代码
|
||||
*/
|
||||
void generateCode(String random,Integer type) throws Exception;
|
||||
|
||||
/**
|
||||
* 生成业务类模板代码
|
||||
* @param tempData 模板数据
|
||||
* @param type 生成模板的类型
|
||||
* @param className 生成类名称
|
||||
*/
|
||||
void generateClassCode(Map<String, Object> tempData, Integer type,String className,String saveUrl) throws Exception;
|
||||
|
||||
/**
|
||||
* 生成公共模板代码
|
||||
* @param tempData 模板数据
|
||||
* @param type 生成模板的类型
|
||||
*/
|
||||
void generatePublicCode(Map<String, Object> tempData, Integer type,String saveUrl) throws Exception;
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package com.azhoucode.service;
|
||||
|
||||
import com.azhoucode.entity.TableEntity;
|
||||
|
||||
/**
|
||||
* @description: 单表
|
||||
* @author: azhou
|
||||
* @create: 2021-12-15 10:51
|
||||
**/
|
||||
public interface TableService {
|
||||
|
||||
void addTableConfiguration(TableEntity tableEntity,String random) throws Exception;
|
||||
|
||||
}
|
@ -0,0 +1,87 @@
|
||||
package com.azhoucode.service.impl;
|
||||
|
||||
import com.azhoucode.constant.RedisConstant;
|
||||
import com.azhoucode.entity.*;
|
||||
import com.azhoucode.enums.DBType;
|
||||
import com.azhoucode.service.DBService;
|
||||
import com.azhoucode.util.*;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import java.sql.Connection;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @description: db
|
||||
* @author: azhou
|
||||
* @create: 2021-11-01 14:54
|
||||
**/
|
||||
@Service
|
||||
public class DBServiceImpl implements DBService {
|
||||
|
||||
|
||||
private List<String> paramList = Arrays.asList("id", "create_time", "update_time", "create_id", "update_id");
|
||||
|
||||
@Override
|
||||
public String checkDBParam(ApplicationEntity applicationEntity) throws Exception {
|
||||
Connection connection = DBUtils.getConnection(applicationEntity);
|
||||
if (connection == null) throw new Exception("连接失败");
|
||||
String random = RandomUtil.getRamdom();
|
||||
RedisCacheUtils.set(String.format(RedisConstant.DB_PARAM, random), applicationEntity, 60 * 60 * 24);
|
||||
return random;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TableEntity getTableColList(String tableName, String random) throws Exception {
|
||||
ApplicationEntity applicationEntity = RedisCacheUtils.get(String.format(RedisConstant.DB_PARAM, random), ApplicationEntity.class);
|
||||
if (applicationEntity == null) throw new Exception("数据库连接异常");
|
||||
Connection connection = DBUtils.getConnection(applicationEntity);
|
||||
List<TableNameAndType> columnNameAndTypes = DBUtils.getColumnNameAndTypes(DBType.MYSQL.getValue(), tableName, connection);
|
||||
if (CollectionUtils.isEmpty(columnNameAndTypes)) return null;
|
||||
TableEntity tableEntity = new TableEntity();
|
||||
// 组装表的列数据
|
||||
List<TableColEntity> collect = columnNameAndTypes.stream().map(item -> getTableColEntity(item)).collect(Collectors.toList());
|
||||
tableEntity.setTableColEntityList(collect);
|
||||
return tableEntity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getAllTable(String random) throws Exception {
|
||||
ApplicationEntity applicationEntity = RedisCacheUtils.get(String.format(RedisConstant.DB_PARAM, random), ApplicationEntity.class);
|
||||
if (applicationEntity == null) throw new Exception("表格基本数据异常");
|
||||
String tableName = applicationEntity.getTableName();
|
||||
if (tableName.startsWith("#")) tableName = tableName.substring(1);
|
||||
if (tableName.endsWith("#")) tableName = tableName.substring(0, tableName.length() - 1);
|
||||
List<String> list = null;
|
||||
try {
|
||||
list = Arrays.asList(tableName.split("#"));
|
||||
} catch (Exception e) {
|
||||
throw new Exception("表格基本数据异常");
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
|
||||
public TableColEntity getTableColEntity(TableNameAndType tableNameAndType) {
|
||||
TableColEntity tableColEntity = new TableColEntity();
|
||||
tableColEntity.setColName(tableNameAndType.getColName());
|
||||
tableColEntity.setChinaName(tableNameAndType.getComment());
|
||||
// 如果是ID则默认不显示 不修改 不添加
|
||||
String colName = tableColEntity.getColName();
|
||||
boolean flag = checkParam(colName);
|
||||
tableColEntity.setTableShow(flag ? false : true);
|
||||
tableColEntity.setUpdateShow(flag ? false : true);
|
||||
tableColEntity.setSearchShow(false);
|
||||
tableColEntity.setCompareType("=");
|
||||
tableColEntity.setShowType("text");
|
||||
tableColEntity.setUpdateType("text");
|
||||
tableColEntity.setUploadImg(false);
|
||||
tableColEntity.setParamType(tableNameAndType.getEntityParamType());
|
||||
return tableColEntity;
|
||||
}
|
||||
|
||||
public boolean checkParam(String param) {
|
||||
return paramList.contains(param);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,213 @@
|
||||
package com.azhoucode.service.impl;
|
||||
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.azhoucode.constant.RedisConstant;
|
||||
import com.azhoucode.entity.*;
|
||||
import com.azhoucode.service.TableService;
|
||||
import com.azhoucode.util.FreeMarkerUtil;
|
||||
import com.azhoucode.util.RedisCacheUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static java.util.Comparator.comparing;
|
||||
import static java.util.stream.Collectors.collectingAndThen;
|
||||
import static java.util.stream.Collectors.toCollection;
|
||||
|
||||
/**
|
||||
* @description: 单表实现
|
||||
* @author: azhou
|
||||
* @create: 2021-12-15 10:51
|
||||
**/
|
||||
@Service
|
||||
public class TableServiceImpl implements TableService {
|
||||
|
||||
private static final String MODIFY = "modify";
|
||||
private static final String SHOW = "show";
|
||||
private static final String SEARCH = "search";
|
||||
|
||||
@Autowired
|
||||
private FreeMarkerUtil freeMarkerUtil;
|
||||
|
||||
@Override
|
||||
public void addTableConfiguration(TableEntity tableEntity, String random) throws Exception {
|
||||
TableParam tableParam = new TableParam();
|
||||
tableParam.setTableName(tableEntity.getTableName());
|
||||
tableParam.setClassName(freeMarkerUtil.getEntityName(tableEntity.getTableName()));
|
||||
tableParam.setUnClassName(freeMarkerUtil.getEntityNameLower(tableEntity.getTableName()));
|
||||
tableParam.setTableComment(StrUtil.isEmpty(tableEntity.getTableComment()) ? tableEntity.getTableName() : tableEntity.getTableComment());
|
||||
tableParam.setShowColList(buildSearchParam(tableEntity, true));
|
||||
List<SearchParam> searchParamList = new ArrayList<>();
|
||||
searchParamList.addAll(buildSearchParam(tableEntity, true));
|
||||
Map<String, List<SearchParam>> stringListMap = buildVueTableData(tableEntity, true);
|
||||
List<SearchParam> modifyList = stringListMap.get(MODIFY);
|
||||
List<SearchParam> showList = stringListMap.get(SHOW);
|
||||
List<SearchParam> searchList = stringListMap.get(SEARCH);
|
||||
// 存在子表配置
|
||||
List<TableEntity> sonTableEntities = tableEntity.getSonTableEntities();
|
||||
List<String> correlationList = tableEntity.getCorrelationList();
|
||||
if (CollectionUtil.isNotEmpty(sonTableEntities) && CollectionUtil.isNotEmpty(correlationList)) {
|
||||
List<SearchParam> sonTableColEntities = new ArrayList<>();
|
||||
tableParam.setHasSonTable(true);
|
||||
for (TableEntity sonTableEntity : sonTableEntities) {
|
||||
Map<String, List<SearchParam>> stringListMap1 = buildVueTableData(sonTableEntity, false);
|
||||
List<SearchParam> modifyList1 = stringListMap1.get(MODIFY);
|
||||
modifyList.addAll(modifyList1);
|
||||
List<SearchParam> showList1 = stringListMap1.get(SHOW);
|
||||
showList.addAll(showList1);
|
||||
List<SearchParam> searchList1 = stringListMap1.get(SEARCH);
|
||||
searchList.addAll(searchList1);
|
||||
sonTableColEntities.addAll(buildSearchParam(sonTableEntity, false));
|
||||
searchParamList.addAll(buildSearchParam(sonTableEntity, false));
|
||||
}
|
||||
tableParam.setShowSonTableColList(sonTableColEntities);
|
||||
if (CollectionUtil.isNotEmpty(correlationList)) {
|
||||
tableParam.setCorrelation(correlationList.stream().collect(Collectors.joining("\n\r")));
|
||||
}
|
||||
}
|
||||
tableParam.setHasUpload(checkHasUpload(tableEntity));
|
||||
tableParam.setSearchColsList(searchParamList);
|
||||
tableParam.setVueModifyColList(modifyList);
|
||||
tableParam.setVueShowColList(showList);
|
||||
tableParam.setVueSearchColList(searchList);
|
||||
if (CollectionUtil.isNotEmpty(tableEntity.getEnumsEntities())) {
|
||||
List<EnumsEntity> enumsEntities = tableEntity.getEnumsEntities();
|
||||
List<EnumsEntity> list = enumsEntities.stream().collect(collectingAndThen(toCollection(() ->
|
||||
new TreeSet<>(comparing(n -> n.getColName()))), ArrayList::new));
|
||||
tableParam.setUpdateEnumsLists(list);
|
||||
}
|
||||
if (CollectionUtil.isNotEmpty(tableEntity.getTableEnumsEntities())) {
|
||||
List<EnumsEntity> enumsEntities = tableEntity.getTableEnumsEntities();
|
||||
List<EnumsEntity> list = enumsEntities.stream().collect(collectingAndThen(toCollection(() ->
|
||||
new TreeSet<>(comparing(n -> n.getColName()))), ArrayList::new));
|
||||
tableParam.setTableEnumsEntities(list);
|
||||
}
|
||||
if(CollectionUtil.isNotEmpty(tableEntity.getSelectEntities())) {
|
||||
List<SelectEntity> selectEntities = tableEntity.getSelectEntities();
|
||||
List<SelectEntity> list = selectEntities.stream().collect(collectingAndThen(toCollection(() ->
|
||||
new TreeSet<>(comparing(n -> n.getFromTableName()))), ArrayList::new));
|
||||
List<SelectEntity> collect = list.stream().map(item -> {
|
||||
item.setClassName(freeMarkerUtil.getEntityName(item.getFromTableName()));
|
||||
item.setUnClassName(freeMarkerUtil.getEntityNameLower(item.getFromTableName()));
|
||||
item.setPropertyName(freeMarkerUtil.getEntityNameLower(item.getColName()));
|
||||
item.setNameCol(freeMarkerUtil.getEntityName(item.getNameCol()));
|
||||
item.setValueCol(freeMarkerUtil.getEntityName(item.getValueCol()));
|
||||
return item;
|
||||
}).collect(Collectors.toList());
|
||||
tableParam.setSelectEntities(collect);
|
||||
}
|
||||
RedisCacheUtils.lpush(String.format(RedisConstant.TABLE_LIST, random), JSON.toJSONString(tableParam));
|
||||
}
|
||||
|
||||
/**
|
||||
* 检验是否需要文件上传
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public Boolean checkHasUpload(TableEntity tableEntity) {
|
||||
List<TableColEntity> tableColEntityList = tableEntity.getTableColEntityList();
|
||||
boolean flag = false;
|
||||
if (CollectionUtil.isEmpty(tableColEntityList)) return flag;
|
||||
for (TableColEntity tableColEntity : tableColEntityList) {
|
||||
if (tableColEntity.getUploadImg()) {
|
||||
flag = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建主表的搜索列
|
||||
*
|
||||
* @param tableEntity
|
||||
* @param isMain
|
||||
* @return
|
||||
*/
|
||||
public List<SearchParam> buildSearchParam(TableEntity tableEntity, Boolean isMain) {
|
||||
List<SearchParam> searchParamList = new ArrayList<>();
|
||||
List<TableColEntity> tableColEntityList = tableEntity.getTableColEntityList();
|
||||
// 处理主表
|
||||
for (TableColEntity tableColEntity : tableColEntityList) {
|
||||
SearchParam searchParam = new SearchParam();
|
||||
searchParam.setColName(tableColEntity.getColName());
|
||||
searchParam.setPropertyType(tableColEntity.getParamType());
|
||||
searchParam.setPropertyName(freeMarkerUtil.underlineToHump(tableColEntity.getColName()));
|
||||
searchParam.setPropertyChinaName(tableColEntity.getChinaName());
|
||||
searchParam.setCompareWay(tableColEntity.getCompareType());
|
||||
// 下划线转驼峰
|
||||
searchParam.setFromTableName(freeMarkerUtil.underlineToHump(tableEntity.getTableName()));
|
||||
if (isMain) {
|
||||
searchParamList.add(searchParam);
|
||||
} else {
|
||||
if (tableColEntity.getTableShow()) {
|
||||
searchParamList.add(searchParam);
|
||||
}
|
||||
}
|
||||
}
|
||||
return searchParamList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建前端vue表格中的各种参数
|
||||
*
|
||||
* @param tableEntity
|
||||
* @return
|
||||
*/
|
||||
private Map<String, List<SearchParam>> buildVueTableData(TableEntity tableEntity, Boolean isMain) {
|
||||
Map<String, List<SearchParam>> map = new HashMap<>(6);
|
||||
List<SearchParam> vueShowColList = new ArrayList<>();
|
||||
List<SearchParam> vueModifyColList = new ArrayList<>();
|
||||
List<SearchParam> vueSearchColList = new ArrayList<>();
|
||||
List<TableColEntity> tableColEntityList = tableEntity.getTableColEntityList();
|
||||
for (TableColEntity tableColEntity : tableColEntityList) {
|
||||
// 修改属性
|
||||
if (tableColEntity.getUpdateShow() && isMain) {
|
||||
SearchParam searchParam = new SearchParam();
|
||||
searchParam.setPropertyChinaName(searchParam.getPropertyChinaName());
|
||||
searchParam.setPropertyName(freeMarkerUtil.underlineToHump(tableColEntity.getColName()));
|
||||
searchParam.setColName(tableColEntity.getColName());
|
||||
searchParam.setPropertyType(tableColEntity.getParamType());
|
||||
searchParam.setPropertyChinaName(tableColEntity.getChinaName());
|
||||
searchParam.setCompareType(tableColEntity.getCompareType());
|
||||
searchParam.setShowType(tableColEntity.getShowType());
|
||||
searchParam.setUpdateType(tableColEntity.getUpdateType());
|
||||
vueModifyColList.add(searchParam);
|
||||
}
|
||||
if (tableColEntity.getTableShow()) {
|
||||
SearchParam searchParam = new SearchParam();
|
||||
searchParam.setPropertyChinaName(searchParam.getPropertyChinaName());
|
||||
searchParam.setPropertyName(freeMarkerUtil.underlineToHump(tableColEntity.getColName()));
|
||||
searchParam.setColName(tableColEntity.getColName());
|
||||
searchParam.setPropertyChinaName(tableColEntity.getChinaName());
|
||||
searchParam.setCompareType(tableColEntity.getCompareType());
|
||||
searchParam.setIsUploadCol(tableColEntity.getUploadImg());
|
||||
searchParam.setPropertyType(tableColEntity.getParamType());
|
||||
searchParam.setShowType(tableColEntity.getShowType());
|
||||
searchParam.setUpdateType(tableColEntity.getUpdateType());
|
||||
vueShowColList.add(searchParam);
|
||||
}
|
||||
if (tableColEntity.getSearchShow()) {
|
||||
SearchParam searchParam = new SearchParam();
|
||||
searchParam.setPropertyChinaName(searchParam.getPropertyChinaName());
|
||||
searchParam.setPropertyName(freeMarkerUtil.underlineToHump(tableColEntity.getColName()));
|
||||
searchParam.setColName(tableColEntity.getColName());
|
||||
searchParam.setPropertyChinaName(tableColEntity.getChinaName());
|
||||
searchParam.setPropertyType(tableColEntity.getParamType());
|
||||
searchParam.setCompareType(tableColEntity.getCompareType());
|
||||
searchParam.setShowType(tableColEntity.getShowType());
|
||||
searchParam.setUpdateType(tableColEntity.getUpdateType());
|
||||
vueSearchColList.add(searchParam);
|
||||
}
|
||||
}
|
||||
map.put(SHOW, vueShowColList);
|
||||
map.put(MODIFY, vueModifyColList);
|
||||
map.put(SEARCH, vueSearchColList);
|
||||
return map;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,425 @@
|
||||
package com.azhoucode.util;
|
||||
|
||||
import com.azhoucode.constant.Constant;
|
||||
import com.azhoucode.entity.ApplicationEntity;
|
||||
import com.azhoucode.entity.Parameters;
|
||||
import com.azhoucode.entity.TableNameAndType;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.sql.*;
|
||||
import java.util.*;
|
||||
|
||||
public class DBUtils {
|
||||
|
||||
public static Connection getConnection(ApplicationEntity applicationEntity) {
|
||||
Connection conn = null;
|
||||
String url = "";
|
||||
String driverClass = "";
|
||||
try {
|
||||
url = "jdbc:mysql://" + applicationEntity.getIp() + ":" + applicationEntity.getDbPort() + "/"
|
||||
+ applicationEntity.getDbName()
|
||||
+ "?connectTimeout=10000&socketTimeout=10000&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull";
|
||||
driverClass = "com.mysql.cj.jdbc.Driver";
|
||||
Class.forName(driverClass);
|
||||
DriverManager.setLoginTimeout(10);
|
||||
conn = DriverManager.getConnection(url, applicationEntity.getUsername(),
|
||||
applicationEntity.getPassword());
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
return conn;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取表的主键id
|
||||
*
|
||||
* @param parameters
|
||||
* @param tableName
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
public static List<String> getPrimarykey(Parameters parameters, String tableName) throws Exception {
|
||||
List<String> primaryKeyList = new ArrayList<>(3);
|
||||
Connection connection = null;
|
||||
if (connection == null) {
|
||||
return null;
|
||||
}
|
||||
DatabaseMetaData metaData = connection.getMetaData();
|
||||
String userName = connection.getMetaData().getUserName();
|
||||
// 获取主键字段
|
||||
ResultSet primaryKeys = metaData.getPrimaryKeys(null, userName, tableName);
|
||||
//根据结果集元数据打印内容
|
||||
ResultSetMetaData pkmd = primaryKeys.getMetaData();
|
||||
while (primaryKeys.next()) {
|
||||
for (int i = 1; i <= pkmd.getColumnCount(); i++) {
|
||||
//获取主键的名称
|
||||
if ("COLUMN_NAME".equalsIgnoreCase(pkmd.getColumnName(i))) {
|
||||
primaryKeyList.add(primaryKeys.getString(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
return primaryKeyList;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param tableNameVal
|
||||
* @param connection
|
||||
* @return
|
||||
*/
|
||||
private static Map<String, String> getColumnComment(String databaseType, String tableNameVal, Connection connection) {
|
||||
|
||||
PreparedStatement columnListPst = null;
|
||||
ResultSet columnListRs = null;
|
||||
|
||||
String sql = "";
|
||||
if ("mysql".equals(databaseType)) {
|
||||
sql = "show full columns from `" + tableNameVal + "`";
|
||||
} else if ("postgresql".equals(databaseType)) {
|
||||
|
||||
String[] tableNameArr = tableNameVal.split("\\.");
|
||||
|
||||
if (tableNameArr.length == 1) {
|
||||
tableNameVal = tableNameArr[0];
|
||||
} else {
|
||||
tableNameVal = tableNameArr[1];
|
||||
}
|
||||
|
||||
sql = "SELECT" +
|
||||
" A.attname AS \"Field\"," +
|
||||
" col_description ( A.attrelid, A.attnum ) AS \"Comment\"" +
|
||||
" FROM" +
|
||||
" pg_class AS C," +
|
||||
" pg_attribute AS A " +
|
||||
" WHERE" +
|
||||
" C.relname = '" + tableNameVal + "' " +
|
||||
" AND A.attrelid = C.oid " +
|
||||
" AND A.attnum > 0";
|
||||
} else if ("oracle".equals(databaseType)) {
|
||||
sql = "select column_name AS \"Field\",comments AS \"Comment\" from user_col_comments where lower(table_Name)='" + tableNameVal.toLowerCase() + "'";
|
||||
}
|
||||
|
||||
// 列名集合
|
||||
Map<String, String> commentMqp = new HashMap<>();
|
||||
try {
|
||||
columnListPst = connection.prepareStatement(sql);
|
||||
columnListRs = columnListPst.executeQuery();
|
||||
|
||||
while (columnListRs.next()) {
|
||||
|
||||
commentMqp.put(columnListRs.getString("Field").toUpperCase(), columnListRs.getString("Comment"));
|
||||
|
||||
}
|
||||
|
||||
} catch (SQLException e) {
|
||||
return null;
|
||||
} finally {
|
||||
try {
|
||||
if (connection != null) {
|
||||
connection.close();
|
||||
}
|
||||
} catch (SQLException ignored) {
|
||||
}
|
||||
try {
|
||||
if (columnListPst != null) {
|
||||
columnListPst.close();
|
||||
}
|
||||
} catch (SQLException ignored) {
|
||||
}
|
||||
try {
|
||||
if (columnListRs != null) {
|
||||
columnListRs.close();
|
||||
}
|
||||
} catch (SQLException ignored) {
|
||||
|
||||
}
|
||||
}
|
||||
return commentMqp;
|
||||
}
|
||||
|
||||
public static List<String> getColumnNameList(String databaseType, String tableNameVal, Connection connection) {
|
||||
|
||||
PreparedStatement columnListPst = null;
|
||||
ResultSet columnListRs = null;
|
||||
|
||||
String sql = "";
|
||||
if ("mysql".equals(databaseType)) {
|
||||
sql = "select * from `" + tableNameVal + "` where 1=0";
|
||||
} else if ("oracle".equals(databaseType)) {
|
||||
sql = "select * from \"" + tableNameVal + "\" where 1=0";
|
||||
} else if ("postgresql".equals(databaseType)) {
|
||||
sql = "select * from " + tableNameVal + " where 1=0";
|
||||
}
|
||||
|
||||
// 列名集合
|
||||
List<String> columnList = new ArrayList<>();
|
||||
|
||||
try {
|
||||
columnListPst = connection.prepareStatement(sql);
|
||||
columnListRs = columnListPst.executeQuery();
|
||||
ResultSetMetaData metaData = columnListRs.getMetaData();
|
||||
|
||||
int columnCount = metaData.getColumnCount();
|
||||
|
||||
for (int i = 0; i < columnCount; i++) {
|
||||
columnList.add(metaData.getColumnName(i + 1));
|
||||
}
|
||||
|
||||
} catch (SQLException e) {
|
||||
return null;
|
||||
} finally {
|
||||
try {
|
||||
if (connection != null) {
|
||||
connection.close();
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
}
|
||||
try {
|
||||
if (columnListPst != null) {
|
||||
columnListPst.close();
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
}
|
||||
try {
|
||||
if (columnListRs != null) {
|
||||
columnListRs.close();
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
|
||||
}
|
||||
}
|
||||
return columnList;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取表中所有字段名称和类型
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public static List<TableNameAndType> getColumnNameAndTypes(String databaseType, String tableNameVal,
|
||||
Connection connection) {
|
||||
PreparedStatement columnListPst = null;
|
||||
ResultSet columnListRs = null;
|
||||
String sql = "";
|
||||
if ("mysql".equals(databaseType)) {
|
||||
sql = "select * from `" + tableNameVal + "` where 1=0";
|
||||
} else if ("oracle".equals(databaseType)) {
|
||||
sql = "select * from \"" + tableNameVal + "\" where 1=0";
|
||||
} else if ("postgresql".equals(databaseType)) {
|
||||
sql = "select * from " + tableNameVal + " where 1=0";
|
||||
}
|
||||
// 列名集合
|
||||
List<TableNameAndType> nameAndTypes = new ArrayList<>();
|
||||
try {
|
||||
columnListPst = connection.prepareStatement(sql);
|
||||
columnListRs = columnListPst.executeQuery();
|
||||
ResultSetMetaData metaData = columnListRs.getMetaData();
|
||||
int columnCount = metaData.getColumnCount();
|
||||
for (int i = 0; i < columnCount; i++) {
|
||||
TableNameAndType nameAndType = new TableNameAndType();
|
||||
nameAndType.setColName(metaData.getColumnName(i + 1));
|
||||
//设置sqlParamName
|
||||
nameAndType.setEntityName(DataUtils.getSqlParam(metaData.getColumnName(i + 1)));
|
||||
nameAndType.setComment((metaData.getColumnName(i + 1)));
|
||||
String javaTypeName = "";
|
||||
String javaClassName = "";
|
||||
String columnTypeName = metaData.getColumnTypeName(i + 1).toUpperCase();
|
||||
switch (databaseType) {
|
||||
case "postgresql":
|
||||
switch (columnTypeName) {
|
||||
case "VARCHAR":
|
||||
javaTypeName = "String";
|
||||
break;
|
||||
case "bigint":
|
||||
javaTypeName = "Long";
|
||||
break;
|
||||
case "CHAR":
|
||||
javaTypeName = "String";
|
||||
break;
|
||||
case "INT2":
|
||||
javaTypeName = "Integer";
|
||||
break;
|
||||
case "INT4":
|
||||
javaTypeName = "Integer";
|
||||
break;
|
||||
case "INT8":
|
||||
javaTypeName = "Long";
|
||||
break;
|
||||
case "SERIAL2":
|
||||
javaTypeName = "Integer";
|
||||
break;
|
||||
case "SERIAL4":
|
||||
javaTypeName = "Integer";
|
||||
break;
|
||||
case "SERIAL8":
|
||||
javaTypeName = "Long";
|
||||
break;
|
||||
case "TEXT":
|
||||
javaTypeName = "String";
|
||||
break;
|
||||
case "DATE":
|
||||
javaTypeName = "Date";
|
||||
javaClassName = "java.util.Date";
|
||||
break;
|
||||
case "TIME":
|
||||
javaTypeName = "Time";
|
||||
javaClassName = "java.util.Date";
|
||||
break;
|
||||
case "TIMETZ":
|
||||
javaTypeName = "Date";
|
||||
javaClassName = "java.util.Date";
|
||||
break;
|
||||
case "TIMESTAMP":
|
||||
javaTypeName = "Date";
|
||||
javaClassName = "java.util.Date";
|
||||
break;
|
||||
case "TIMESTAMPTZ":
|
||||
javaTypeName = "Date";
|
||||
javaClassName = "java.util.Date";
|
||||
break;
|
||||
default:
|
||||
javaTypeName = "String";
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case "mysql":
|
||||
switch (columnTypeName) {
|
||||
case "VARCHAR":
|
||||
javaTypeName = "String";
|
||||
break;
|
||||
case "BIGINT UNSIGNED":
|
||||
javaTypeName = "Long";
|
||||
break;
|
||||
case "INT":
|
||||
javaTypeName = "Integer";
|
||||
break;
|
||||
case "CHAR":
|
||||
javaTypeName = "String";
|
||||
break;
|
||||
case "BLOB":
|
||||
javaTypeName = "byte[]";
|
||||
break;
|
||||
case "TEXT":
|
||||
javaTypeName = "String";
|
||||
break;
|
||||
case "INTEGER":
|
||||
javaTypeName = "Long";
|
||||
break;
|
||||
case "TINYINT":
|
||||
javaTypeName = "Integer";
|
||||
break;
|
||||
case "SMALLINT":
|
||||
javaTypeName = "Integer";
|
||||
break;
|
||||
case "MEDIUMINT":
|
||||
javaTypeName = "Integer";
|
||||
break;
|
||||
case "BIT":
|
||||
javaTypeName = "Long";
|
||||
break;
|
||||
case "BIGINT":
|
||||
javaTypeName = "Long";
|
||||
break;
|
||||
case "FLOAT":
|
||||
javaTypeName = "Float";
|
||||
break;
|
||||
case "DOUBLE":
|
||||
javaTypeName = "Double";
|
||||
break;
|
||||
case "DECIMAL":
|
||||
javaTypeName = "BigDecimal";
|
||||
javaClassName = "java.math.BigDecimal";
|
||||
break;
|
||||
case "BOOLEAN":
|
||||
javaTypeName = "Integer";
|
||||
break;
|
||||
// 主键
|
||||
case "ID":
|
||||
javaTypeName = "Long";
|
||||
break;
|
||||
case "DATE":
|
||||
javaTypeName = "Date";
|
||||
javaClassName = "java.util.Date";
|
||||
break;
|
||||
case "TIME":
|
||||
javaTypeName = "Date";
|
||||
javaClassName = "java.util.Date";
|
||||
break;
|
||||
case "DATETIME":
|
||||
javaTypeName = "Date";
|
||||
javaClassName = "java.util.Date";
|
||||
break;
|
||||
case "TIMESTAMP":
|
||||
javaTypeName = "Date";
|
||||
javaClassName = "java.util.Date";
|
||||
break;
|
||||
case "YEAR":
|
||||
javaTypeName = "Date";
|
||||
javaClassName = "java.util.Date";
|
||||
break;
|
||||
default:
|
||||
javaTypeName = "String";
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case "oracle":
|
||||
switch (columnTypeName) {
|
||||
case "NUMBER":
|
||||
javaTypeName = "Integer";
|
||||
break;
|
||||
case "DATE":
|
||||
javaTypeName = "Date";
|
||||
javaClassName = "java.util.Date";
|
||||
break;
|
||||
case "TIMESTAMP":
|
||||
javaTypeName = "Date";
|
||||
javaClassName = "java.util.Date";
|
||||
break;
|
||||
default:
|
||||
javaTypeName = "String";
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
nameAndType.setEntityParamType(javaTypeName);
|
||||
nameAndType.setClassName(javaClassName);
|
||||
nameAndTypes.add(nameAndType);
|
||||
}
|
||||
// 注释map
|
||||
Map<String, String> columnComment = getColumnComment(databaseType, tableNameVal, connection);
|
||||
for (TableNameAndType tableNameAndType : nameAndTypes) {
|
||||
String name = tableNameAndType.getColName().toUpperCase();
|
||||
// 设置注释内容
|
||||
assert columnComment != null;
|
||||
tableNameAndType.setComment(
|
||||
"".equals(columnComment.get(name)) || columnComment.get(name) == null ? tableNameAndType.getColName() : columnComment.get(name));
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
return null;
|
||||
} finally {
|
||||
try {
|
||||
if (connection != null) {
|
||||
connection.close();
|
||||
}
|
||||
} catch (SQLException ignored) {
|
||||
}
|
||||
try {
|
||||
if (columnListPst != null) {
|
||||
columnListPst.close();
|
||||
}
|
||||
} catch (SQLException ignored) {
|
||||
}
|
||||
try {
|
||||
if (columnListRs != null) {
|
||||
columnListRs.close();
|
||||
}
|
||||
} catch (SQLException ignored) {
|
||||
|
||||
}
|
||||
}
|
||||
return nameAndTypes;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
package com.azhoucode.util;
|
||||
|
||||
public class DataUtils {
|
||||
|
||||
|
||||
/**
|
||||
* @param columnsEng
|
||||
*/
|
||||
public static String getSqlParam(String columnsEng) {
|
||||
|
||||
String sqlParamColumEng = "";
|
||||
|
||||
if (columnsEng.contains(".")) {
|
||||
columnsEng = columnsEng.toLowerCase();
|
||||
String[] nameArr = columnsEng.split("\\.");
|
||||
sqlParamColumEng = makeSqlParam(nameArr);
|
||||
} else if (columnsEng.contains("_")) {
|
||||
columnsEng = columnsEng.toLowerCase();
|
||||
String[] nameArr = columnsEng.split("_");
|
||||
sqlParamColumEng = makeSqlParam(nameArr);
|
||||
} else if (columnsEng.contains("-")) {
|
||||
columnsEng = columnsEng.toLowerCase();
|
||||
String[] nameArr = columnsEng.split("-");
|
||||
sqlParamColumEng = makeSqlParam(nameArr);
|
||||
} else {
|
||||
if (columnsEng.matches("^[A-Z|0-9A-Z]+$")) {
|
||||
sqlParamColumEng = columnsEng.toLowerCase();
|
||||
} else {
|
||||
if (columnsEng.length() > 2) {
|
||||
sqlParamColumEng = columnsEng.substring(0, 2).toLowerCase() + columnsEng.substring(2);
|
||||
} else {
|
||||
sqlParamColumEng = columnsEng.toLowerCase();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return sqlParamColumEng;
|
||||
}
|
||||
|
||||
private static String makeSqlParam(String[] nameArr) {
|
||||
|
||||
String sqlParamColumEng = "";
|
||||
for (int j = 0; j < nameArr.length; j++) {
|
||||
if (j == 0) {
|
||||
sqlParamColumEng += nameArr[j];
|
||||
} else if (nameArr[j].length() > 1) {
|
||||
sqlParamColumEng += nameArr[j].substring(0, 1).toUpperCase() + nameArr[j].substring(1);
|
||||
} else {
|
||||
sqlParamColumEng += nameArr[j].toUpperCase();
|
||||
}
|
||||
}
|
||||
if (sqlParamColumEng.length() > 2) {
|
||||
sqlParamColumEng = sqlParamColumEng.substring(0, 2).toLowerCase() + sqlParamColumEng.substring(2);
|
||||
} else {
|
||||
sqlParamColumEng = sqlParamColumEng.toLowerCase();
|
||||
}
|
||||
return sqlParamColumEng;
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package com.azhoucode.util;
|
||||
|
||||
|
||||
|
||||
public class RandomUtil {
|
||||
|
||||
public static String getRamdom() {
|
||||
String token = String.valueOf(System.currentTimeMillis()) ;
|
||||
return token;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
file-path:
|
||||
# project: D:\\shop\\linshou\\server
|
||||
# vue: D:\\shop\\linshou\\vue-element-admin
|
||||
project: F:\\zt\\zt-workspace\\server
|
||||
vue: F:\\zt\vue\\vue-admin\\vue-element-admin
|
||||
|
||||
|
@ -0,0 +1,4 @@
|
||||
file-path:
|
||||
project: F:\\zt\\zt-workspace\\server
|
||||
|
||||
|
@ -0,0 +1,38 @@
|
||||
server:
|
||||
port: 8888
|
||||
spring:
|
||||
redis:
|
||||
port: 6379
|
||||
host: 127.0.0.1
|
||||
password:
|
||||
maxActive: 300
|
||||
database: 0
|
||||
timeout: 2000
|
||||
maxIdle: 200
|
||||
maxWait: 3000
|
||||
minIdle: 50
|
||||
profiles:
|
||||
active: dev
|
||||
freemarker:
|
||||
settings:
|
||||
classic_compatible: true
|
||||
base-path: ${file-path.project}\\src\\main\\java\\com\\server\\api
|
||||
dao: ${base-path}\\dao
|
||||
dto: ${base-path}\\dto
|
||||
service: ${base-path}\\service
|
||||
serviceImpl: ${base-path}\\service\\impl
|
||||
controller: ${base-path}\\controller
|
||||
entity: ${base-path}\\entity
|
||||
application: ${file-path.project}\\src\\main\\resources
|
||||
xml: ${file-path.project}\\src\\main\\resources\\dao
|
||||
config: ${base-path}\\common\\config
|
||||
util: ${base-path}\\common\\util
|
||||
vueTable: ${file-path.vue}\\src\\views\\%s
|
||||
vueTableApi: ${file-path.vue}\\src\\api\\%s
|
||||
vueRouter: ${file-path.vue}\\src\\router
|
||||
vueCommonTable: F:\\zt\\temp\\exam\\src\\views
|
||||
vueCommonRouterPath: F:\\zt\\temp\\exam\\src\\router
|
||||
vueCommonSidebarPath: F:\\zt\\temp\\exam\\src\\components
|
||||
vueTable2: F:\\zt\\vue\\vue-admin\\vue-next-admin\src\\views\\%s
|
||||
vueTableApi2: F:\\zt\\vue\\vue-admin\\vue-next-admin\\src\\api\\%s
|
||||
vueRouter3: F:\\zt\\vue\\vue-admin\\vue-next-admin\\public
|
@ -0,0 +1,113 @@
|
||||
<template>
|
||||
<div class="sidebar">
|
||||
<el-menu
|
||||
class="sidebar-el-menu"
|
||||
:default-active="onRoutes"
|
||||
:collapse="collapse"
|
||||
background-color="#324157"
|
||||
text-color="#bfcbd9"
|
||||
active-text-color="#20a0ff"
|
||||
unique-opened
|
||||
router
|
||||
>
|
||||
<template v-for="item in items">
|
||||
<template v-if="item.subs">
|
||||
<el-submenu :index="item.index" :key="item.index">
|
||||
<template #title>
|
||||
<i :class="item.icon"></i>
|
||||
<span>{{ item.title }}</span>
|
||||
</template>
|
||||
<template v-for="subItem in item.subs">
|
||||
<el-submenu
|
||||
v-if="subItem.subs"
|
||||
:index="subItem.index"
|
||||
:key="subItem.index"
|
||||
>
|
||||
<template #title>{{ subItem.title }}</template>
|
||||
<el-menu-item
|
||||
v-for="(threeItem, i) in subItem.subs"
|
||||
:key="i"
|
||||
:index="threeItem.index"
|
||||
>{{ threeItem.title }}
|
||||
</el-menu-item
|
||||
>
|
||||
</el-submenu>
|
||||
<el-menu-item
|
||||
v-else
|
||||
:index="subItem.index"
|
||||
:key="subItem.index"
|
||||
>{{ subItem.title }}
|
||||
</el-menu-item
|
||||
>
|
||||
</template>
|
||||
</el-submenu>
|
||||
</template>
|
||||
<template v-else>
|
||||
<el-menu-item :index="item.index" :key="item.index">
|
||||
<i :class="item.icon"></i>
|
||||
<template #title>{{ item.title }}</template>
|
||||
</el-menu-item>
|
||||
</template>
|
||||
</template>
|
||||
</el-menu>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {util} from '../utils/index';
|
||||
|
||||
export default {
|
||||
mixins: [util],
|
||||
data() {
|
||||
return {
|
||||
items: [{
|
||||
icon: "el-icon-s-home",
|
||||
index: "/main",
|
||||
title: "系统首页",
|
||||
},
|
||||
<#if routerParams??>
|
||||
<#list routerParams as col>
|
||||
{
|
||||
icon: "el-icon-s-home",
|
||||
index: "/${col["routerName"]}",
|
||||
title: "${col["chinaName"]}",
|
||||
},
|
||||
</#list>
|
||||
</#if>
|
||||
]
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
onRoutes() {
|
||||
return this.$route.path.replace("/", "");
|
||||
},
|
||||
collapse() {
|
||||
return this.$store.state.collapse;
|
||||
},
|
||||
},
|
||||
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.sidebar {
|
||||
display: block;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 70px;
|
||||
bottom: 0;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
|
||||
.sidebar::-webkit-scrollbar {
|
||||
width: 0;
|
||||
}
|
||||
|
||||
.sidebar-el-menu:not(.el-menu--collapse) {
|
||||
width: 200px;
|
||||
}
|
||||
|
||||
.sidebar > ul {
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
@ -0,0 +1,45 @@
|
||||
{
|
||||
"code": 0,
|
||||
"data": [
|
||||
{
|
||||
"path": "/home",
|
||||
"name": "home",
|
||||
"component": "home",
|
||||
"meta": {
|
||||
"title": "message.router.home",
|
||||
"isLink": "",
|
||||
"isHide": false,
|
||||
"isKeepAlive": true,
|
||||
"isAffix": true,
|
||||
"isIframe": false,
|
||||
"roles": [
|
||||
"admin",
|
||||
"common"
|
||||
],
|
||||
"icon": "iconfont icon-shouye"
|
||||
}
|
||||
},
|
||||
<#if routerParams??>
|
||||
<#list routerParams as col>
|
||||
{
|
||||
"path": "/${col["routerName"]}",
|
||||
"name": "${col["chinaName"]}",
|
||||
"component": "${col["routerName"]}",
|
||||
"meta": {
|
||||
"title": "${col["chinaName"]}",
|
||||
"isLink": "",
|
||||
"isHide": false,
|
||||
"isKeepAlive": true,
|
||||
"isAffix": false,
|
||||
"isIframe": false,
|
||||
"roles": [
|
||||
"admin",
|
||||
"common"
|
||||
],
|
||||
"icon": "iconfont icon-gongju"
|
||||
}
|
||||
},
|
||||
</#list>
|
||||
</#if>
|
||||
]
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
import request from '@/utils/request'
|
||||
const moduleUrl = "/${unClassName}"
|
||||
|
||||
/** 分页 */
|
||||
export function page(data) {
|
||||
return request({
|
||||
url: moduleUrl + '/page',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
/** 添加或修改 */
|
||||
export function saveData(data) {
|
||||
return request({
|
||||
url: moduleUrl + "/save/update",
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
/** 根据主键ID批量删除 */
|
||||
export function batchDelete(data){
|
||||
return request({
|
||||
url: moduleUrl + "/remove",
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
<#if selectEntities??>
|
||||
<#list selectEntities as col>
|
||||
export function get${col['className']}SelectData(){
|
||||
return request({
|
||||
url: moduleUrl + "/get${col['className']}Data",
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
</#list>
|
||||
</#if>
|
||||
|
||||
|
||||
|
@ -0,0 +1,94 @@
|
||||
package com.server.api.controller;
|
||||
|
||||
import com.server.api.common.BaseController;
|
||||
import com.server.api.common.ReturnMsg;
|
||||
import com.server.api.dto.${className}DTO;
|
||||
import com.server.api.service.${className}Service;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.IOException;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
<#if selectEntities??>
|
||||
import com.server.api.common.BaseSelectEntity;
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
<#list selectEntities as selectCol>
|
||||
import com.server.api.dto.${selectCol['className']}DTO;
|
||||
import com.server.api.service.${selectCol['className']}Service;
|
||||
</#list>
|
||||
</#if>
|
||||
|
||||
/**
|
||||
* @Description: ${tableComment}对外接口层
|
||||
* @Author: wuming
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/${unClassName}")
|
||||
public class ${className}Controller extends BaseController<${className}Service, ${className}DTO> {
|
||||
|
||||
@Override
|
||||
@Resource(name = "${unClassName}Service")
|
||||
protected void setBaseService(${className}Service ${unClassName}Service) {
|
||||
this.baseService = ${unClassName}Service;
|
||||
}
|
||||
<#if selectEntities??>
|
||||
<#list selectEntities as selectCol>
|
||||
@Autowired
|
||||
private ${selectCol['className']}Service ${selectCol['unClassName']}Service;
|
||||
</#list>
|
||||
</#if>
|
||||
<#if hasUpload>
|
||||
/**
|
||||
* 图片上传文件夹名称
|
||||
*/
|
||||
private final String realPath = "/${unClassName}";
|
||||
|
||||
/**
|
||||
* 图片上传
|
||||
*
|
||||
* @param filename
|
||||
* @param id 需要修改的数据主键id
|
||||
* @return
|
||||
* @throws IOException
|
||||
*/
|
||||
@PostMapping("/upload/{id}")
|
||||
public ReturnMsg upload(@RequestParam("file") MultipartFile filename, @PathVariable("id") Long id) throws IOException {
|
||||
return this.baseUpLoad(filename, id, realPath, ${className}DTO.class) ? ReturnMsg.ok() : ReturnMsg.error();
|
||||
}
|
||||
</#if>
|
||||
|
||||
/**
|
||||
* 默认分页查询
|
||||
* @param ${unClassName}DTO
|
||||
* @return
|
||||
* @throws IOException
|
||||
*/
|
||||
@PostMapping("/page")
|
||||
public ReturnMsg page(@RequestBody ${className}DTO ${unClassName}DTO) {
|
||||
return ReturnMsg.ok(baseService.basePage(${unClassName}DTO));
|
||||
}
|
||||
|
||||
|
||||
<#if selectEntities??>
|
||||
<#list selectEntities as selectCol>
|
||||
@GetMapping("/get${selectCol['className']}Data")
|
||||
public ReturnMsg get${selectCol['className']}Data(){
|
||||
List<${selectCol['className']}DTO> dataList = ${selectCol['unClassName']}Service.list();
|
||||
List<BaseSelectEntity> selectEntities = new ArrayList<>();
|
||||
if(CollectionUtil.isNotEmpty(dataList)){
|
||||
dataList.forEach(item -> {
|
||||
BaseSelectEntity baseSelectEntity = new BaseSelectEntity();
|
||||
baseSelectEntity.setKey(item.get${selectCol['valueCol']}());
|
||||
baseSelectEntity.setValue(item.get${selectCol['nameCol']}());
|
||||
selectEntities.add(baseSelectEntity);
|
||||
});
|
||||
}
|
||||
return ReturnMsg.ok(selectEntities);
|
||||
}
|
||||
</#list>
|
||||
</#if>
|
||||
}
|
||||
|
@ -0,0 +1,12 @@
|
||||
package com.server.api.dao;
|
||||
|
||||
import com.server.api.common.BaseDao;
|
||||
import com.server.api.dto.${className}DTO;
|
||||
|
||||
/**
|
||||
* @Description: ${tableComment}数据库访问持久层
|
||||
* @Author: wuming
|
||||
*/
|
||||
public interface ${className}Dao extends BaseDao<${className}DTO> {
|
||||
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
package com.server.api.dto;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.server.api.entity.${className};
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
|
||||
/**
|
||||
* @Description: ${tableComment}传输层
|
||||
* @Author: wuming
|
||||
*/
|
||||
@Data
|
||||
@ToString
|
||||
@TableName("${tableName}")
|
||||
public class ${className}DTO extends ${className} {
|
||||
<#--循环生成变量-->
|
||||
<#if showColList??>
|
||||
<#list showSonTableColList as col>
|
||||
<#if col["propertyName"] != "id">
|
||||
|
||||
/**
|
||||
* ${col["propertyChinaName"]}
|
||||
*/
|
||||
@TableField(exist = false)
|
||||
private ${col["propertyType"]} ${col["propertyName"]};
|
||||
|
||||
</#if>
|
||||
</#list>
|
||||
</#if>
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
package com.server.api.entity;
|
||||
|
||||
import com.server.api.common.BaseEntity;
|
||||
import java.util.Date;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.ToString;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
|
||||
/**
|
||||
* @Description: ${tableComment} 实体类
|
||||
* @Author: wuming
|
||||
*/
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@ToString
|
||||
public class ${className} extends BaseEntity {
|
||||
|
||||
<#if showColList??>
|
||||
<#--循环生成变量-->
|
||||
<#list showColList as col>
|
||||
<#if col["propertyName"] != "id">
|
||||
/**
|
||||
* ${col["propertyChinaName"]}
|
||||
*/
|
||||
<#if col["propertyType"]=="Date">
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
</#if>
|
||||
private ${col["propertyType"]} ${col["propertyName"]};
|
||||
|
||||
</#if>
|
||||
</#list>
|
||||
</#if>
|
||||
|
||||
}
|
@ -0,0 +1,65 @@
|
||||
package com.server.api.controller;
|
||||
|
||||
import cn.hutool.core.lang.Assert;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.server.api.common.ReturnMsg;
|
||||
import com.server.api.common.constants.BaseConstant;
|
||||
import com.server.api.dto.${className}DTO;
|
||||
import com.server.api.service.${className}Service;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @description: 后台登录
|
||||
* @author: wuming
|
||||
**/
|
||||
@RestController
|
||||
@RequestMapping("/login")
|
||||
public class LoginController {
|
||||
|
||||
@Autowired
|
||||
private ${className}Service ${unClassName}Service;
|
||||
|
||||
@PostMapping()
|
||||
public ReturnMsg login(@RequestBody ${className}DTO ${unClassName}DTO) {
|
||||
Assert.isTrue(StrUtil.isNotEmpty(${unClassName}DTO.get${userNameCol}())
|
||||
&& StrUtil.isNotEmpty(${unClassName}DTO.get${passWordCol}()), "账号或密码不能为空!");
|
||||
LambdaQueryWrapper<${className}DTO> queryWrapper = Wrappers.lambdaQuery();
|
||||
queryWrapper.eq(${className}DTO::get${userNameCol},${unClassName}DTO.get${userNameCol}()).
|
||||
eq(${className}DTO::get${passWordCol},${unClassName}DTO.get${passWordCol}()).last(BaseConstant.LIMIT_ONE);
|
||||
${className}DTO loginUser = ${unClassName}Service.getOne(queryWrapper);
|
||||
Assert.notNull(loginUser,"账号或密码错误!");
|
||||
return ReturnMsg.ok(loginUser);
|
||||
}
|
||||
|
||||
@GetMapping("/{id}")
|
||||
public ReturnMsg getUserInfo(@PathVariable("id") Long id) {
|
||||
List<String> roles = new ArrayList<>();
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
roles.add("admin");
|
||||
map.put("roles", roles);
|
||||
map.put("introduction", "打工人...");
|
||||
<#if !hasUserInfo>
|
||||
map.put("name", "admin");
|
||||
map.put("avatar", "http://www.elitetest.cn/img/logo.png");
|
||||
<#else>
|
||||
${className}DTO userInfo = ${unClassName}Service.getById(id);
|
||||
map.put("name", userInfo.get${nickNameCol}());
|
||||
map.put("avatar", StrUtil.isNotEmpty(userInfo.get${headImgCol}()) ? userInfo.get${headImgCol}() : "http://www.elitetest.cn/img/logo.png");
|
||||
</#if>
|
||||
return ReturnMsg.ok(map);
|
||||
}
|
||||
|
||||
@DeleteMapping()
|
||||
public ReturnMsg logOut() {
|
||||
return ReturnMsg.ok();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
<#noparse>package com.server.api.common.util;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.mail.SimpleMailMessage;
|
||||
import org.springframework.mail.javamail.JavaMailSender;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* @Description: 简单邮件发送帮助类
|
||||
* @Author: wuming
|
||||
*/
|
||||
@Component
|
||||
public class MailUtil {
|
||||
|
||||
@Value("${spring.mail.from}")
|
||||
private String from;
|
||||
|
||||
@Autowired
|
||||
private JavaMailSender mailSender;
|
||||
|
||||
public void sendSimpleMail(String to, String subject, String content) {
|
||||
SimpleMailMessage message = new SimpleMailMessage();
|
||||
message.setFrom(from);
|
||||
message.setTo(to);
|
||||
message.setSubject(subject);
|
||||
message.setText(content);
|
||||
mailSender.send(message);
|
||||
}
|
||||
|
||||
}
|
||||
</#noparse>
|
@ -0,0 +1,116 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>2.2.6.RELEASE</version>
|
||||
<relativePath/>
|
||||
</parent>
|
||||
<groupId>com.server</groupId>
|
||||
<artifactId>server</artifactId>
|
||||
<version>1.0.0</version>
|
||||
<name>server</name>
|
||||
<description>JAVA服务端应用</description>
|
||||
<properties>
|
||||
<java.version>1.8</java.version>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<!-- ================================公共依赖Start====================================== -->
|
||||
<!-- spring-boot启动项 -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter</artifactId>
|
||||
</dependency>
|
||||
<!-- springboot web启动项 -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<!-- druid数据源 -->
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>druid-spring-boot-starter</artifactId>
|
||||
<version>1.1.24</version>
|
||||
</dependency>
|
||||
<!-- mysql数据库驱动 -->
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<version>8.0.11</version>
|
||||
</dependency>
|
||||
<!-- mybatis-plus -->
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>mybatis-plus-boot-starter</artifactId>
|
||||
<version>3.4.3</version>
|
||||
</dependency>
|
||||
<!-- http请求 -->
|
||||
<dependency>
|
||||
<groupId>org.apache.httpcomponents</groupId>
|
||||
<artifactId>httpclient</artifactId>
|
||||
</dependency>
|
||||
<!-- lombok实体层注解 -->
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>1.18.12</version>
|
||||
</dependency>
|
||||
<!-- 文件上传 -->
|
||||
<dependency>
|
||||
<groupId>commons-io</groupId>
|
||||
<artifactId>commons-io</artifactId>
|
||||
<version>2.4</version>
|
||||
</dependency>
|
||||
<!-- hutool常用帮助包 -->
|
||||
<dependency>
|
||||
<groupId>cn.hutool</groupId>
|
||||
<artifactId>hutool-all</artifactId>
|
||||
<version>5.7.2</version>
|
||||
</dependency>
|
||||
<!-- json帮助包 -->
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>fastjson</artifactId>
|
||||
<version>1.2.47</version>
|
||||
</dependency>
|
||||
<!-- springboot测试 -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<!-- ================================公共依赖End====================================== -->
|
||||
<#if hasEmail>
|
||||
<!-- qq邮件发送 -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-mail</artifactId>
|
||||
</dependency>
|
||||
</#if>
|
||||
<#if hasRedis>
|
||||
<!-- redis -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-redis</artifactId>
|
||||
</dependency>
|
||||
<!-- lettuce-pool 缓存连接池 -->
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-pool2</artifactId>
|
||||
<version>2.7.0</version>
|
||||
</dependency>
|
||||
</#if>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
@ -0,0 +1,112 @@
|
||||
<#noparse>package com.server.api.common.config;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonAutoDetect;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||
import com.fasterxml.jackson.annotation.PropertyAccessor;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
|
||||
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.cache.annotation.EnableCaching;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.data.redis.connection.RedisPassword;
|
||||
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
|
||||
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
|
||||
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
|
||||
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
|
||||
import org.springframework.data.redis.core.RedisTemplate;
|
||||
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
|
||||
import org.springframework.data.redis.serializer.StringRedisSerializer;
|
||||
|
||||
import java.time.Duration;
|
||||
|
||||
/**
|
||||
* @Description: redis配置类
|
||||
* @Author: wuming
|
||||
*/
|
||||
@Configuration
|
||||
@EnableCaching
|
||||
public class RedisConfig {
|
||||
|
||||
@Value("${spring.redis.database}")
|
||||
private int database;
|
||||
|
||||
@Value("${spring.redis.host}")
|
||||
private String host;
|
||||
|
||||
@Value("${spring.redis.password}")
|
||||
private String password;
|
||||
|
||||
@Value("${spring.redis.port}")
|
||||
private int port;
|
||||
|
||||
@Value("${spring.redis.timeout}")
|
||||
private long timeout;
|
||||
|
||||
@Value("${spring.redis.lettuce.shutdown-timeout}")
|
||||
private long shutDownTimeout;
|
||||
|
||||
@Value("${spring.redis.lettuce.pool.max-idle}")
|
||||
private int maxIdle;
|
||||
|
||||
@Value("${spring.redis.lettuce.pool.min-idle}")
|
||||
private int minIdle;
|
||||
|
||||
@Value("${spring.redis.lettuce.pool.max-active}")
|
||||
private int maxActive;
|
||||
|
||||
@Value("${spring.redis.lettuce.pool.max-wait}")
|
||||
private long maxWait;
|
||||
|
||||
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
|
||||
|
||||
@Bean
|
||||
public LettuceConnectionFactory lettuceConnectionFactory() {
|
||||
GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
|
||||
genericObjectPoolConfig.setMaxIdle(maxIdle);
|
||||
genericObjectPoolConfig.setMinIdle(minIdle);
|
||||
genericObjectPoolConfig.setMaxTotal(maxActive);
|
||||
genericObjectPoolConfig.setMaxWaitMillis(maxWait);
|
||||
genericObjectPoolConfig.setTimeBetweenEvictionRunsMillis(100);
|
||||
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
|
||||
redisStandaloneConfiguration.setDatabase(database);
|
||||
redisStandaloneConfiguration.setHostName(host);
|
||||
redisStandaloneConfiguration.setPort(port);
|
||||
redisStandaloneConfiguration.setPassword(RedisPassword.of(password));
|
||||
LettuceClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder()
|
||||
.commandTimeout(Duration.ofMillis(timeout))
|
||||
.shutdownTimeout(Duration.ofMillis(shutDownTimeout))
|
||||
.poolConfig(genericObjectPoolConfig)
|
||||
.build();
|
||||
LettuceConnectionFactory factory = new LettuceConnectionFactory(redisStandaloneConfiguration, clientConfig);
|
||||
factory.setShareNativeConnection(true);
|
||||
factory.setValidateConnection(false);
|
||||
return factory;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
|
||||
RedisTemplate<String, Object> template = new RedisTemplate<>();
|
||||
template.setConnectionFactory(lettuceConnectionFactory);
|
||||
//使用Jackson2JsonRedisSerializer替换默认的JdkSerializationRedisSerializer来序列化和反序列化redis的value值
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
|
||||
mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
|
||||
ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
|
||||
jackson2JsonRedisSerializer.setObjectMapper(mapper);
|
||||
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
|
||||
//key采用String的序列化方式
|
||||
template.setKeySerializer(stringRedisSerializer);
|
||||
// hash的key也采用String的序列化方式
|
||||
template.setHashKeySerializer(stringRedisSerializer);
|
||||
// value序列化方式采用jackson
|
||||
template.setValueSerializer(jackson2JsonRedisSerializer);
|
||||
// hash的value序列化方式采用jackson
|
||||
template.setHashValueSerializer(jackson2JsonRedisSerializer);
|
||||
template.afterPropertiesSet();
|
||||
return template;
|
||||
}
|
||||
|
||||
}
|
||||
</#noparse>
|
@ -0,0 +1,27 @@
|
||||
package com.server.api.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.server.api.dto.${className}DTO;
|
||||
|
||||
/**
|
||||
* @Description: ${tableComment}业务层接口
|
||||
* @Author: wuming
|
||||
*/
|
||||
public interface ${className}Service extends IService<${className}DTO> {
|
||||
|
||||
/**
|
||||
* 默认分页方法
|
||||
* @param ${unClassName}DTO
|
||||
* @return
|
||||
*/
|
||||
Page<${className}DTO> basePage(${className}DTO ${unClassName}DTO);
|
||||
|
||||
/**
|
||||
* 根据DTO对象中的条件查询单个对象
|
||||
* @param ${unClassName}DTO
|
||||
* @return
|
||||
*/
|
||||
${className}DTO find(${className}DTO ${unClassName}DTO);
|
||||
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
package com.server.api.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.server.api.dao.${className}Dao;
|
||||
import com.server.api.dto.${className}DTO;
|
||||
import com.server.api.service.${className}Service;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Description: ${tableComment}业务层实现类
|
||||
* @Author: wuming
|
||||
*/
|
||||
@Service("${unClassName}Service")
|
||||
public class ${className}ServiceImpl extends ServiceImpl<${className}Dao, ${className}DTO> implements ${className}Service {
|
||||
|
||||
@Override
|
||||
public Page<${className}DTO> basePage(${className}DTO ${unClassName}DTO) {
|
||||
if (null != ${unClassName}DTO.getCurrent() && null != ${unClassName}DTO.getPageSize())
|
||||
${unClassName}DTO.setCurrent((${unClassName}DTO.getCurrent() - 1) * ${unClassName}DTO.getPageSize());
|
||||
List<${className}DTO> list = this.baseMapper.findList(${unClassName}DTO);
|
||||
int count = this.baseMapper.findPageCount(${unClassName}DTO);
|
||||
Page<${className}DTO> page = new Page<>();
|
||||
page.setTotal(count);
|
||||
page.setRecords(list);
|
||||
return page;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ${className}DTO find(${className}DTO ${unClassName}DTO) { return this.baseMapper.find(${unClassName}DTO); }
|
||||
|
||||
}
|
@ -0,0 +1,99 @@
|
||||
import Vue from 'vue'
|
||||
import Router from 'vue-router'
|
||||
|
||||
Vue.use(Router)
|
||||
|
||||
import Layout from '@/layout'
|
||||
|
||||
export const constantRoutes = [
|
||||
{
|
||||
path: '/redirect',
|
||||
component: Layout,
|
||||
hidden: true,
|
||||
children: [
|
||||
{
|
||||
path: '/redirect/:path(.*)',
|
||||
component: () => import('@/views/redirect/index')
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
path: '/login',
|
||||
component: () => import('@/views/login/index'),
|
||||
hidden: true
|
||||
},
|
||||
{
|
||||
path: '/auth-redirect',
|
||||
component: () => import('@/views/login/auth-redirect'),
|
||||
hidden: true
|
||||
},
|
||||
{
|
||||
path: '/404',
|
||||
component: () => import('@/views/error-page/404'),
|
||||
hidden: true
|
||||
},
|
||||
{
|
||||
path: '/401',
|
||||
component: () => import('@/views/error-page/401'),
|
||||
hidden: true
|
||||
},
|
||||
{
|
||||
path: '/',
|
||||
component: Layout,
|
||||
redirect: '/dashboard',
|
||||
children: [
|
||||
{
|
||||
path: 'dashboard',
|
||||
component: () => import('@/views/dashboard/index'),
|
||||
name: '首页',
|
||||
meta: { title: '首页', icon: 'dashboard', affix: true }
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
/**
|
||||
* asyncRoutes
|
||||
* the routes that need to be dynamically loaded based on user roles
|
||||
*/
|
||||
export const asyncRoutes = [
|
||||
<#if routerParams??>
|
||||
<#list routerParams as col>
|
||||
{
|
||||
path: '/sys',
|
||||
component: Layout,
|
||||
redirect: '/sys/${col["routerName"]}',
|
||||
name: '系统模块',
|
||||
meta: {
|
||||
title: '系统模块',
|
||||
icon: 'el-icon-star-off'
|
||||
},
|
||||
children: [
|
||||
{
|
||||
path: '${col["routerName"]}',
|
||||
component: () => import('@/views/${col["routerName"]}/index'),
|
||||
name: '${col["chinaName"]}',
|
||||
meta: { title: '${col["chinaName"]}' }
|
||||
}
|
||||
]
|
||||
},
|
||||
</#list>
|
||||
</#if>
|
||||
// 404 page must be placed at the end !!!
|
||||
{ path: '*', redirect: '/404', hidden: true }
|
||||
]
|
||||
|
||||
const createRouter = () => new Router({
|
||||
// mode: 'history', // require service support
|
||||
scrollBehavior: () => ({ y: 0 }),
|
||||
routes: constantRoutes
|
||||
})
|
||||
|
||||
const router = createRouter()
|
||||
|
||||
export function resetRouter() {
|
||||
const newRouter = createRouter()
|
||||
router.matcher = newRouter.matcher // reset router
|
||||
}
|
||||
|
||||
export default router
|
@ -0,0 +1,64 @@
|
||||
import Vue from 'vue'
|
||||
import VueRouter from 'vue-router'
|
||||
|
||||
Vue.use(VueRouter)
|
||||
|
||||
const routes = [{
|
||||
path: '/',
|
||||
redirect: '/login'
|
||||
}, {
|
||||
path: '/login',
|
||||
name: 'Login',
|
||||
component: () => import('../views/Login.vue')
|
||||
}, {
|
||||
path: '/home',
|
||||
name: 'Home',
|
||||
component: () => import('../views/Home.vue'),
|
||||
children: [{
|
||||
path: "/main",
|
||||
name: "Main",
|
||||
meta: {
|
||||
title: '首页'
|
||||
},
|
||||
component: () => import("../views/Main.vue")
|
||||
}, {
|
||||
path: "/error404",
|
||||
name: "404",
|
||||
meta: {
|
||||
title: '404'
|
||||
},
|
||||
component: () => import("../views/404.vue")
|
||||
}, {
|
||||
path: "/error500",
|
||||
name: "403",
|
||||
meta: {
|
||||
title: '500'
|
||||
},
|
||||
component: () => import("../views/500.vue")
|
||||
},
|
||||
<#if routerParams??>
|
||||
<#list routerParams as col>
|
||||
{
|
||||
path: "/${col["routerName"]}",
|
||||
name: "${col["chinaName"]}",
|
||||
meta: {
|
||||
title: '${col["chinaName"]}'
|
||||
},
|
||||
component: () => import("../views/${col["routerName"]}.vue")
|
||||
} ,
|
||||
|
||||
</#list>
|
||||
</#if>
|
||||
]
|
||||
},
|
||||
|
||||
]
|
||||
|
||||
const router = new VueRouter({
|
||||
mode: 'history',
|
||||
base: process.env.BASE_URL,
|
||||
// base: "manage",
|
||||
routes
|
||||
})
|
||||
|
||||
export default router
|
@ -0,0 +1,210 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<div class="filter-container">
|
||||
<#if vueSearchColList??>
|
||||
<#list vueSearchColList as col>
|
||||
<el-input v-model="param.${col["propertyName"]}" placeholder="请输入${col["propertyChinaName"]}" style="width: 200px;" class="filter-item" @keyup.enter.native="handleFilter"/>
|
||||
</#list>
|
||||
</#if>
|
||||
<#if vueSearchColList??>
|
||||
<el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">搜索</el-button>
|
||||
<el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="reset">重置</el-button>
|
||||
</#if>
|
||||
<el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-edit" @click="handleSaveData({})">添加</el-button>
|
||||
<el-button v-waves class="filter-item" type="danger" icon="el-icon-delete" @click="tableHandleBatchDelete">批量删除</el-button>
|
||||
</div>
|
||||
<el-table v-loading="listLoading" :data="list" border fit highlight-current-row style="width: 100%;" @selection-change="handleSelectionChange">
|
||||
<el-table-column align="center" type="selection" width="55"></el-table-column>
|
||||
<#if vueShowColList??>
|
||||
<#list vueShowColList as col>
|
||||
<#if col["isUploadCol"]>
|
||||
<el-table-column label="${col["propertyChinaName"]}" align="center" width="130px">
|
||||
<template slot-scope="{row}">
|
||||
<el-image class="table-img" :src="row.${col["propertyName"]}" :preview-src-list="[row.${col["propertyName"]}]"></el-image>
|
||||
<el-upload ref="upload"
|
||||
:action="'http://localhost:8001' +moduleUrl + '/upload/' + row.id "
|
||||
:on-success="handleAvatarSuccess"
|
||||
:limit="1"
|
||||
:before-upload="beforeImageUpload"
|
||||
:show-file-list="false">
|
||||
<el-button size="small" type="primary">点击上传</el-button>
|
||||
</el-upload>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<#elseif col["showType"] == 'text'>
|
||||
<el-table-column label="${col["propertyChinaName"]}" align="center" min-width="150px" prop="${col["propertyName"]}"></el-table-column>
|
||||
<#elseif col["showType"] == 'enum'>
|
||||
<el-table-column label="${col["propertyChinaName"]}" align="center" width="110px">
|
||||
<template slot-scope="{row}">
|
||||
<#if updateEnumsLists??>
|
||||
<#list tableEnumsEntities as enumCol>
|
||||
<#if col["propertyName"] == enumCol["colName"]>
|
||||
<#if enumCol["enumsDTOS"]??>
|
||||
<#list enumCol["enumsDTOS"] as enumCol1>
|
||||
<strong v-if="row.${col["propertyName"]} == ${enumCol1["name"]}">${enumCol1["value"]}</strong>
|
||||
</#list>
|
||||
</#if>
|
||||
</#if>
|
||||
</#list>
|
||||
</#if>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</#if>
|
||||
</#list>
|
||||
</#if>
|
||||
<el-table-column label="操作" align="center" width="230" class-name="small-padding fixed-width">
|
||||
<template slot-scope="{row,$index}">
|
||||
<el-button type="primary" size="mini" @click="handleSaveData(row)" icon="el-icon-edit">编辑</el-button>
|
||||
<el-button type="danger" size="mini" @click="handleTableDelete(row)" icon="el-icon-delete">删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<pagination v-show="total > 0" :total="total" :page.sync="param.current" :limit.sync="param.pageSize" @pagination="getList"/>
|
||||
<el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible">
|
||||
<el-form ref="dataForm" :rules="rules" :model="form" label-position="left" label-width="150px" style="width: 400px; margin-left:50px;">
|
||||
<#if vueModifyColList??>
|
||||
<#list vueModifyColList as col>
|
||||
<el-form-item label="${col["propertyChinaName"]}" prop="${col["propertyName"]}">
|
||||
<#if col["updateType"] == 'text'>
|
||||
<el-input v-model="form.${col["propertyName"]}"/>
|
||||
<#elseif col["updateType"] == 'switch'>
|
||||
<el-switch
|
||||
v-model="form.${col["propertyName"]}"
|
||||
active-text="开关状态一"
|
||||
inactive-text="开关状态二">
|
||||
</el-switch>
|
||||
<#elseif col["updateType"] == 'select'>
|
||||
<el-select v-model="form.${col["propertyName"]}" placeholder="请初始化下拉选择框数据">
|
||||
<#if selectEntities??>
|
||||
<#list selectEntities as selectCol>
|
||||
<#if selectCol["propertyName"] == col["propertyName"]>
|
||||
<el-option
|
||||
v-for="item in ${selectCol["className"]}Data"
|
||||
:key="item.key"
|
||||
:label="item.value"
|
||||
:value="item.key">
|
||||
</el-option>
|
||||
</#if>
|
||||
</#list>
|
||||
</#if>
|
||||
</el-select>
|
||||
<#elseif col["updateType"] == 'enum'>
|
||||
<#if updateEnumsLists??>
|
||||
<el-radio-group v-model="form.${col["propertyName"]}">
|
||||
<#list updateEnumsLists as enumCol>
|
||||
<#if col["propertyName"] == enumCol["colName"]>
|
||||
<#if enumCol["enumsDTOS"]??>
|
||||
<#list enumCol["enumsDTOS"] as enumCol1>
|
||||
<el-radio :label="${enumCol1["name"]}">${enumCol1["value"]}</el-radio>
|
||||
</#list>
|
||||
</#if>
|
||||
</#if>
|
||||
</#list>
|
||||
</el-radio-group>
|
||||
</#if>
|
||||
<#elseif col["updateType"] == 'number'>
|
||||
<el-input-number v-model="form.${col["propertyName"]}" :min="1" :max="100" ></el-input-number>
|
||||
<#elseif col["updateType"] == 'date'>
|
||||
<el-date-picker
|
||||
v-model="form.${col["propertyName"]}"
|
||||
format="yyyy 年 MM 月 dd 日"
|
||||
value-format="yyyy-MM-dd"
|
||||
type="date"
|
||||
placeholder="请选择日期">
|
||||
</el-date-picker>
|
||||
<#elseif col["updateType"] == 'textArea'>
|
||||
<el-input type="textarea" v-model="form.${col["propertyName"]}"></el-input>
|
||||
</#if>
|
||||
</el-form-item>
|
||||
</#list>
|
||||
</#if>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button @click="dialogFormVisible = false">取消</el-button>
|
||||
<el-button type="primary" @click="submitTableForm">确定</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import waves from '@/directive/waves'
|
||||
import Pagination from '@/components/Pagination'
|
||||
import {tableUtil} from '../../utils/tableUtil';
|
||||
import { batchDelete, page, saveData<#if selectEntities??><#list selectEntities as col>,get${col['className']}SelectData</#list></#if>} from '@/api/${unClassName}/index'
|
||||
export default {
|
||||
name: '${unClassName}',
|
||||
components: { Pagination },
|
||||
directives: { waves },
|
||||
mixins: [tableUtil],
|
||||
data() {
|
||||
return {
|
||||
moduleUrl: '/${unClassName}',
|
||||
param: { // 列表查询参数
|
||||
current: 1,
|
||||
pageSize: 5,
|
||||
<#if vueSearchColList??>
|
||||
<#list vueSearchColList as col>
|
||||
${col["propertyName"]}: undefined,
|
||||
</#list>
|
||||
</#if>
|
||||
},
|
||||
form: { // 添加或修改提交表单
|
||||
<#if showColList??>
|
||||
<#list showColList as col>
|
||||
<#if col["propertyName"] != 'createTime' && col["propertyName"] != 'updateTime'>
|
||||
${col["propertyName"]}: undefined,
|
||||
</#if>
|
||||
</#list>
|
||||
</#if>
|
||||
},
|
||||
rules: { // 自定义校验规则
|
||||
<#if vueModifyColList??>
|
||||
<#list vueModifyColList as col>
|
||||
<#if col["propertyName"] != 'createTime' && col["propertyName"] != 'updateTime'>
|
||||
${col["propertyName"]}: [{ required: true, message: '${col["propertyChinaName"]}为必须项~', trigger: 'blur' }],
|
||||
</#if>
|
||||
</#list>
|
||||
</#if>
|
||||
},
|
||||
<#if selectEntities??>
|
||||
<#list selectEntities as col>
|
||||
${col["className"]}Data:[],
|
||||
</#list>
|
||||
</#if>
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getList()
|
||||
<#if selectEntities??>
|
||||
<#list selectEntities as col>
|
||||
this.get${col["className"]}Data()
|
||||
</#list>
|
||||
</#if>
|
||||
},
|
||||
methods: {
|
||||
getList() { // 表格数据分页获取
|
||||
this.listLoading = true
|
||||
page(this.param).then(res => {
|
||||
this.list = res.data.records
|
||||
this.total = res.data.total
|
||||
this.listLoading = false
|
||||
})
|
||||
},
|
||||
submitTableForm(){this.submitForm(saveData)},
|
||||
handleTableDelete(row){this.handleDelete(row,batchDelete)},
|
||||
tableHandleBatchDelete(){this.tableBatchDelete(batchDelete)},
|
||||
<#if selectEntities??>
|
||||
<#list selectEntities as col>
|
||||
get${col["className"]}Data(){
|
||||
let that = this
|
||||
get${col['className']}SelectData().then(res => {
|
||||
that.${col["className"]}Data = res.data
|
||||
})
|
||||
},
|
||||
</#list>
|
||||
</#if>
|
||||
}
|
||||
}
|
||||
</script>
|
@ -0,0 +1,270 @@
|
||||
<template>
|
||||
<div>
|
||||
<div style="margin: 15px 0">
|
||||
<el-row :gutter="20">
|
||||
<#if vueSearchColList??>
|
||||
<#list vueSearchColList as col>
|
||||
<el-col :span="6">
|
||||
<el-input
|
||||
clearable
|
||||
placeholder="请输入${col["propertyChinaName"]}"
|
||||
v-model="params.${col["propertyName"]}"
|
||||
class="input-with-select">
|
||||
</el-input>
|
||||
</el-col>
|
||||
</#list>
|
||||
</#if>
|
||||
<#if vueSearchColList??>
|
||||
<el-col :span="2">
|
||||
<el-button icon="el-icon-search" @click="getTableData(1)">搜索</el-button>
|
||||
</el-col>
|
||||
<el-col :span="2">
|
||||
<el-button type="success" icon="el-icon-remove-outline" @click="resetObj">清空</el-button>
|
||||
</el-col>
|
||||
</#if>
|
||||
<el-col :span="2">
|
||||
<el-button type="primary" icon="el-icon-edit" @click="add">添加</el-button>
|
||||
</el-col>
|
||||
<el-col :span="2">
|
||||
<el-popover
|
||||
placement="top"
|
||||
width="160"
|
||||
v-model="delVisible">
|
||||
<p>确定删除吗?</p>
|
||||
<div style="text-align: right; margin: 0">
|
||||
<el-button size="mini" type="text" @click="delVisible = false">取消</el-button>
|
||||
<el-button type="primary" size="mini" @click="deleteByIds">确定</el-button>
|
||||
</div>
|
||||
<el-button slot="reference" type="danger" icon="el-icon-delete">批量删除</el-button>
|
||||
</el-popover>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
<el-table :data="tableData" style="width: 100%" class="loading" @selection-change="handleSelectionChange">
|
||||
<el-table-column align="center" type="selection" width="55"></el-table-column>
|
||||
<#if vueShowColList??>
|
||||
<#list vueShowColList as col>
|
||||
<#-- 如果是图片 -->
|
||||
<#if col["isUploadCol"]>
|
||||
<el-table-column prop="${col["propertyName"]}" label="${col["propertyChinaName"]}">
|
||||
<template slot-scope="scope">
|
||||
<img
|
||||
:src="scope.row.${col["propertyName"]}"
|
||||
class="baseImg"
|
||||
@click="seeBigImg(scope.row.${col["propertyName"]})"
|
||||
/>
|
||||
<el-upload
|
||||
:action="getUploadUrl(scope.row.id,moduleName)"
|
||||
:show-file-list="false"
|
||||
:headers="header"
|
||||
:on-success="handleAvatorSuccess"
|
||||
:before-upload="beforeAvatorUpload"
|
||||
>
|
||||
<el-button size="mini">图片上传</el-button>
|
||||
</el-upload>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<#elseif col["showType"] == 'text'>
|
||||
<el-table-column label="${col["propertyChinaName"]}" align="center" min-width="150px" prop="${col["propertyName"]}"></el-table-column>
|
||||
<#elseif col["showType"] == 'enum'>
|
||||
<el-table-column label="${col["propertyChinaName"]}" align="center" width="110px">
|
||||
<template slot-scope="{row}">
|
||||
<#if updateEnumsLists??>
|
||||
<#list tableEnumsEntities as enumCol>
|
||||
<#if col["propertyName"] == enumCol["colName"]>
|
||||
<#if enumCol["enumsDTOS"]??>
|
||||
<#list enumCol["enumsDTOS"] as enumCol1>
|
||||
<strong v-if="row.${col["propertyName"]} == ${enumCol1["name"]}">${enumCol1["value"]}</strong>
|
||||
</#list>
|
||||
</#if>
|
||||
</#if>
|
||||
</#list>
|
||||
</#if>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</#if>
|
||||
</#list>
|
||||
</#if>
|
||||
<el-table-column fixed="right" label="操作" width="200" align="center">
|
||||
<template slot-scope="scope">
|
||||
<el-link icon="el-icon-edit" type="primary" @click="updateById(scope.row,formData)">编辑</el-link>
|
||||
<el-divider direction="vertical"></el-divider>
|
||||
<el-link icon="el-icon-delete" type="danger" @click="deleteById(scope.row.id)">删除</el-link>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<el-pagination
|
||||
style="margin: 10px auto"
|
||||
@size-change="pageSizeChange"
|
||||
@current-change="currentChange"
|
||||
:current-page="params.current"
|
||||
:page-sizes="[5, 10, 15, 100]"
|
||||
:page-size="params.pageSize"
|
||||
layout="total, sizes, prev, pager, next, jumper"
|
||||
:total="params.total">
|
||||
</el-pagination>
|
||||
<el-dialog v-bind="$attrs" :show-close="false" :visible="openDia" v-on="$listeners" :title="diaTitle">
|
||||
<el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="120px">
|
||||
<#if vueModifyColList??>
|
||||
<#list vueModifyColList as col>
|
||||
<el-form-item label="${col["propertyChinaName"]}" prop="${col["propertyName"]}">
|
||||
<#if col["updateType"] == 'text'>
|
||||
<el-input v-model="formData.${col["propertyName"]}"/>
|
||||
<#elseif col["updateType"] == 'switch'>
|
||||
<el-switch
|
||||
v-model="formData.${col["propertyName"]}"
|
||||
active-text="开关状态一"
|
||||
inactive-text="开关状态二">
|
||||
</el-switch>
|
||||
<#elseif col["updateType"] == 'select'>
|
||||
<el-select v-model="formData.${col["propertyName"]}" placeholder="请初始化下拉选择框数据">
|
||||
<#if selectEntities??>
|
||||
<#list selectEntities as selectCol>
|
||||
<#if selectCol["propertyName"] == col["propertyName"]>
|
||||
<el-option
|
||||
v-for="item in ${selectCol["className"]}Data"
|
||||
:key="item.key"
|
||||
:label="item.value"
|
||||
:value="item.key">
|
||||
</el-option>
|
||||
</#if>
|
||||
</#list>
|
||||
</#if>
|
||||
</el-select>
|
||||
<#elseif col["updateType"] == 'enum'>
|
||||
<#if updateEnumsLists??>
|
||||
<el-radio-group v-model="formData.${col["propertyName"]}">
|
||||
<#list updateEnumsLists as enumCol>
|
||||
<#if col["propertyName"] == enumCol["colName"]>
|
||||
<#if enumCol["enumsDTOS"]??>
|
||||
<#list enumCol["enumsDTOS"] as enumCol1>
|
||||
<el-radio :label="${enumCol1["name"]}">${enumCol1["value"]}</el-radio>
|
||||
</#list>
|
||||
</#if>
|
||||
</#if>
|
||||
</#list>
|
||||
</el-radio-group>
|
||||
</#if>
|
||||
<#elseif col["updateType"] == 'number'>
|
||||
<el-input-number v-model="formData.${col["propertyName"]}" :min="1" :max="100" ></el-input-number>
|
||||
<#elseif col["updateType"] == 'date'>
|
||||
<el-date-picker
|
||||
v-model="formData.${col["propertyName"]}"
|
||||
format="yyyy 年 MM 月 dd 日"
|
||||
value-format="yyyy-MM-dd"
|
||||
type="date"
|
||||
placeholder="请选择日期">
|
||||
</el-date-picker>
|
||||
<#elseif col["updateType"] == 'textArea'>
|
||||
<el-input type="textarea" v-model="formData.${col["propertyName"]}"></el-input>
|
||||
</#if>
|
||||
</el-form-item>
|
||||
</#list>
|
||||
</#if>
|
||||
</el-form>
|
||||
<div slot="footer">
|
||||
<el-button @click="reset(formData)">重置</el-button>
|
||||
<el-button @click="closeDia(formData)">取消</el-button>
|
||||
<el-button type="primary" @click="saveData">确定</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
<el-dialog :visible.sync="imgVisible" width="400px">
|
||||
<img width="100%" :src="imgDiaUrl" alt=""/>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {util} from '../utils/index';
|
||||
|
||||
export default {
|
||||
mixins: [util],
|
||||
data() {
|
||||
return {
|
||||
// ========= start ===========
|
||||
imgVisible: false, // 图片展示
|
||||
imgDiaUrl: "",
|
||||
moduleName: "/${unClassName}",
|
||||
header: '',
|
||||
delVisible: false,// 删除对话框
|
||||
openDia: false, // 添加或修改对话框
|
||||
params: { // 查询参数 可自行添加参数 但除search外的都不可变
|
||||
current: 1,
|
||||
pageSize: 5,
|
||||
total: 0,
|
||||
<#if vueSearchColList??>
|
||||
<#list vueSearchColList as col>
|
||||
${col["propertyName"]}: undefined,
|
||||
</#list>
|
||||
</#if>
|
||||
},
|
||||
tableData: [], // 表格数据
|
||||
diaTitle: '添加', // 添加或修改框标题
|
||||
multipleSelection: [], // 批量删除数组
|
||||
// ========= end ===========
|
||||
formData: {
|
||||
<#if showColList??>
|
||||
<#list showColList as col>
|
||||
<#if col["propertyName"] != 'createTime' && col["propertyName"] != 'updateTime'>
|
||||
${col["propertyName"]}: undefined,
|
||||
</#if>
|
||||
</#list>
|
||||
</#if>
|
||||
},
|
||||
rules: {
|
||||
<#if vueModifyColList??>
|
||||
<#list vueModifyColList as col>
|
||||
<#if col["propertyName"] != 'createTime' && col["propertyName"] != 'updateTime'>
|
||||
${col["propertyName"]}: [{ required: true, message: '${col["propertyChinaName"]}为必须项~', trigger: 'blur' }],
|
||||
</#if>
|
||||
</#list>
|
||||
</#if>
|
||||
},
|
||||
<#if selectEntities??>
|
||||
<#list selectEntities as col>
|
||||
${col["className"]}Data:[],
|
||||
</#list>
|
||||
</#if>
|
||||
};
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.getTableData();
|
||||
<#if selectEntities??>
|
||||
<#list selectEntities as col>
|
||||
this.get${col["className"]}Data()
|
||||
</#list>
|
||||
</#if>
|
||||
},
|
||||
methods: {
|
||||
|
||||
getTableData(val) {
|
||||
if (val) this.params.current = 1;
|
||||
this.$getTableData(this.moduleName, this.params, this, "/page")
|
||||
},
|
||||
saveData() {
|
||||
this.$saveData(this.moduleName, this.formData, this, 'elForm');
|
||||
},
|
||||
deleteByIds() {
|
||||
this.$deleteByIds(this.moduleName, this.multipleSelection, this);
|
||||
},
|
||||
deleteById(id) {
|
||||
this.$deleteById(this.moduleName, id, this);
|
||||
},
|
||||
clearParam() {
|
||||
this.params.userName = undefined;
|
||||
this.getTableData();
|
||||
},
|
||||
<#if selectEntities??>
|
||||
<#list selectEntities as col>
|
||||
get${col["className"]}Data(){
|
||||
let that = this
|
||||
this.$baseGetRequest(this.moduleName + "/get${col["className"]}Data").then(res => {
|
||||
that.${col["className"]}sData = res
|
||||
})
|
||||
},
|
||||
</#list>
|
||||
</#if>
|
||||
}
|
||||
};
|
||||
</script>
|
@ -0,0 +1,82 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.server.api.dao.${className}Dao">
|
||||
|
||||
<select id="findList" parameterType="com.server.api.dto.${className}DTO" resultType="com.server.api.dto.${className}DTO">
|
||||
select
|
||||
<#if searchColsList??>
|
||||
<#--循环生成变量-->
|
||||
<#list searchColsList as col>
|
||||
${col["fromTableName"]}.${col["colName"]}<#if col_has_next>,</#if>
|
||||
</#list>
|
||||
</#if>
|
||||
from ${tableName} ${unClassName}
|
||||
<#if correlation??>
|
||||
${correlation}
|
||||
</#if>
|
||||
<where>
|
||||
<#if searchColsList??>
|
||||
<#--循环生成变量-->
|
||||
<#list searchColsList as col>
|
||||
<#if col["compareWay"] == "like">
|
||||
<if test="${col["propertyName"]} != null and ${col["propertyName"]} != ''">and ${col["fromTableName"]}.${col["colName"]} like concat('%',<#noparse>#{</#noparse>${col["propertyName"]}<#noparse>}</#noparse>,'%')</if>
|
||||
<#else>
|
||||
<if test="${col["propertyName"]} != null and ${col["propertyName"]} != ''">and ${col["fromTableName"]}.${col["colName"]} = <#noparse>#{</#noparse>${col["propertyName"]}<#noparse>}</#noparse></if>
|
||||
</#if>
|
||||
</#list>
|
||||
</#if>
|
||||
</where>
|
||||
<if test="current != null and pageSize != null">
|
||||
limit <#noparse>#{</#noparse>current<#noparse>}</#noparse>,<#noparse>#{</#noparse>pageSize<#noparse>}</#noparse>
|
||||
</if>
|
||||
</select>
|
||||
|
||||
<select id="findPageCount" parameterType="com.server.api.dto.${className}DTO" resultType="java.lang.Integer">
|
||||
select count(*) from ${tableName} ${unClassName}
|
||||
<#if correlation??>
|
||||
${correlation}
|
||||
</#if>
|
||||
<where>
|
||||
<#if searchColsList??>
|
||||
<#--循环生成变量-->
|
||||
<#list searchColsList as col>
|
||||
<#if col["compareWay"] == "like">
|
||||
<if test="${col["propertyName"]} != null and ${col["propertyName"]} != ''">and ${col["fromTableName"]}.${col["colName"]} like concat('%',<#noparse>#{</#noparse>${col["propertyName"]}<#noparse>}</#noparse>,'%')</if>
|
||||
<#else>
|
||||
<if test="${col["propertyName"]} != null and ${col["propertyName"]} != ''">and ${col["fromTableName"]}.${col["colName"]} = <#noparse>#{</#noparse>${col["propertyName"]}<#noparse>}</#noparse></if>
|
||||
</#if>
|
||||
</#list>
|
||||
</#if>
|
||||
</where>
|
||||
</select>
|
||||
|
||||
<select id="find" parameterType="com.server.api.dto.${className}DTO" resultType="com.server.api.dto.${className}DTO">
|
||||
select
|
||||
<#if searchColsList??>
|
||||
<#--循环生成变量-->
|
||||
<#list searchColsList as col>
|
||||
${col["fromTableName"]}.${col["colName"]}<#if col_has_next>,</#if>
|
||||
</#list>
|
||||
</#if>
|
||||
from ${tableName} ${unClassName}
|
||||
<#if correlation??>
|
||||
${correlation}
|
||||
</#if>
|
||||
<where>
|
||||
<#if searchColsList??>
|
||||
<#--循环生成变量-->
|
||||
<#list searchColsList as col>
|
||||
<#if col["compareWay"] == "like">
|
||||
<if test="${col["propertyName"]} != null and ${col["propertyName"]} != ''">and ${col["fromTableName"]}.${col["colName"]} like concat('%',<#noparse>#{</#noparse>${col["propertyName"]}<#noparse>}</#noparse>,'%')</if>
|
||||
<#else>
|
||||
<if test="${col["propertyName"]} != null and ${col["propertyName"]} != ''">and ${col["fromTableName"]}.${col["colName"]} = <#noparse>#{</#noparse>${col["propertyName"]}<#noparse>}</#noparse></if>
|
||||
</#if>
|
||||
</#list>
|
||||
</#if>
|
||||
</where>
|
||||
limit 1
|
||||
</select>
|
||||
|
||||
</mapper>
|
@ -0,0 +1,23 @@
|
||||
.DS_Store
|
||||
node_modules
|
||||
/dist
|
||||
|
||||
|
||||
# local env files
|
||||
.env.local
|
||||
.env.*.local
|
||||
|
||||
# Log files
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
|
||||
# Editor directories and files
|
||||
.idea
|
||||
.vscode
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
@ -0,0 +1,19 @@
|
||||
# blog-manage
|
||||
|
||||
## Project setup
|
||||
```
|
||||
yarn install
|
||||
```
|
||||
|
||||
### Compiles and hot-reloads for development
|
||||
```
|
||||
yarn serve
|
||||
```
|
||||
|
||||
### Compiles and minifies for production
|
||||
```
|
||||
yarn build
|
||||
```
|
||||
|
||||
### Customize configuration
|
||||
See [Configuration Reference](https://cli.vuejs.org/config/).
|
@ -0,0 +1,5 @@
|
||||
module.exports = {
|
||||
presets: [
|
||||
'@vue/cli-plugin-babel/preset'
|
||||
]
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "healthy",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"serve": "vue-cli-service serve",
|
||||
"build": "vue-cli-service build"
|
||||
},
|
||||
"dependencies": {
|
||||
"axios": "^0.21.1",
|
||||
"core-js": "^3.6.5",
|
||||
"echarts": "^5.1.2",
|
||||
"element-ui": "^2.15.1",
|
||||
"js-md5": "^0.7.3",
|
||||
"quill": "^1.3.7",
|
||||
"vue": "^2.6.11",
|
||||
"vue-quill-editor": "^3.0.6",
|
||||
"vue-router": "^3.2.0",
|
||||
"vuex": "^3.4.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@vue/cli-plugin-babel": "~4.5.0",
|
||||
"@vue/cli-plugin-router": "~4.5.0",
|
||||
"@vue/cli-plugin-vuex": "~4.5.0",
|
||||
"@vue/cli-service": "~4.5.0",
|
||||
"less": "^3.0.4",
|
||||
"less-loader": "^5.0.0",
|
||||
"vue-template-compiler": "^2.6.11"
|
||||
},
|
||||
"browserslist": [
|
||||
"> 1%",
|
||||
"last 2 versions",
|
||||
"not dead"
|
||||
]
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
|
||||
<title><%= htmlWebpackPlugin.options.title %></title>
|
||||
</head>
|
||||
<body style="margin: 0;padding: 0;">
|
||||
|
||||
<div id="app"></div>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,21 @@
|
||||
<template>
|
||||
<div id="app">
|
||||
<router-view/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style>
|
||||
@import "./assets/css/main.css";
|
||||
@import "./assets/css/color-dark.css";
|
||||
.baseImg {
|
||||
height: 80px;
|
||||
width: 80px;
|
||||
border-radius: 10px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.el-upload--text{
|
||||
height: 28px;
|
||||
width: 80px;
|
||||
border: 1px solid #666;
|
||||
}
|
||||
</style>
|
@ -0,0 +1,64 @@
|
||||
// 所有向后端请求的方法都写在这个里面
|
||||
import {get, post} from "./axios";
|
||||
|
||||
export const getListPageUrl = "/page"
|
||||
export const saveOrUpdateUrl = "/save/update"
|
||||
export const removeByIdUrl = "/remove"
|
||||
export const removeByIdsUrl = "/remove"
|
||||
|
||||
function setToken(param) {
|
||||
param.token = sessionStorage.getItem("manageToken");
|
||||
}
|
||||
|
||||
/**
|
||||
* 通用的请求方法
|
||||
* @param url 请求路径
|
||||
* @param params 参数
|
||||
* @returns {Promise<unknown>}
|
||||
*/
|
||||
export const basePostRequest = (url, params) => post(url, params)
|
||||
export const baseGetRequest = (url) => get(url)
|
||||
|
||||
/**
|
||||
*
|
||||
* @param moduleName 模块名称
|
||||
* @param action 自定义接口
|
||||
* @param params
|
||||
* @param that
|
||||
* @returns {Promise<T>}
|
||||
*/
|
||||
export const getTableData = (moduleName, params, that,action) => post(action ? moduleName + action : moduleName + getListPageUrl, params, that).then(res => {
|
||||
that.tableData = res.records;
|
||||
that.params.total = res.total;
|
||||
})
|
||||
|
||||
export const deleteById = (url, id, that) => get(url + removeByIdUrl + "/" + id).then(res => {
|
||||
that.baseSuccessTip(null, null, that);
|
||||
})
|
||||
|
||||
export function deleteByIds (url, params, that){
|
||||
if (params && params.length > 0){
|
||||
this.$basePostRequest(url + removeByIdsUrl, params).then(res => {
|
||||
that.baseSuccessTip(null, null, that);
|
||||
});
|
||||
}else {
|
||||
that.notify("请先选择需要删除的数据!","error");
|
||||
}
|
||||
|
||||
}
|
||||
export function saveData(url, params, that, formName) {
|
||||
this.$refs[formName].validate(valid => {
|
||||
if (!valid) {
|
||||
that.notify("输入格式不正确!", "error");
|
||||
return
|
||||
}
|
||||
setToken(params);
|
||||
this.$basePostRequest(url + saveOrUpdateUrl, params).then(res => {
|
||||
that.baseSuccessTip(null, null, that);
|
||||
});
|
||||
that.closeDia(params)
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue