Add app blueprint generation flow
This commit is contained in:
@@ -820,6 +820,83 @@ export default {
|
||||
</script>
|
||||
', 'admin', sysdate());
|
||||
|
||||
INSERT INTO sys_template_file (template_file_id, template_id, file_name, module_id, file_path, file_content, create_by, create_time) VALUES
|
||||
(910204, 9102, 'adminMenus.js.vm', NULL, 'adminMenus.js.vm',
|
||||
'export const appRoles = [
|
||||
#foreach($role in $appRoles)
|
||||
{ code: "${role.code}", name: "${role.name}", description: "${role.description}" }#if($foreach.hasNext),#end
|
||||
#end
|
||||
]
|
||||
|
||||
export const adminMenus = [
|
||||
#foreach($menu in $adminMenus)
|
||||
{
|
||||
code: "${menu.code}",
|
||||
name: "${menu.name}",
|
||||
path: "${menu.path}",
|
||||
requiresLogin: ${menu.requiresLogin},
|
||||
visibleRoles: [
|
||||
#foreach($role in $menu.visibleRoles)
|
||||
"${role}"#if($foreach.hasNext),#end
|
||||
#end
|
||||
],
|
||||
dataScope: "${menu.dataScope}"
|
||||
}#if($foreach.hasNext),#end
|
||||
#end
|
||||
]
|
||||
|
||||
export function requiresLogin(menu) {
|
||||
return Boolean(menu && menu.requiresLogin)
|
||||
}
|
||||
|
||||
export function canShowMenu(menu, currentUser = {}) {
|
||||
if (!menu) {
|
||||
return false
|
||||
}
|
||||
if (menu.requiresLogin && !currentUser.id && !currentUser.userId) {
|
||||
return false
|
||||
}
|
||||
const userRoles = Array.isArray(currentUser.roles) ? currentUser.roles : []
|
||||
if (!Array.isArray(menu.visibleRoles) || menu.visibleRoles.length === 0) {
|
||||
return true
|
||||
}
|
||||
return menu.visibleRoles.some(role => userRoles.includes(role))
|
||||
}
|
||||
', 'admin', sysdate());
|
||||
|
||||
INSERT INTO sys_template_file (template_file_id, template_id, file_name, module_id, file_path, file_content, create_by, create_time) VALUES
|
||||
(910205, 9102, 'adminPermission.js.vm', NULL, 'adminPermission.js.vm',
|
||||
'import { adminMenus, canShowMenu, requiresLogin } from "./config/adminMenus"
|
||||
|
||||
function defaultCurrentUser() {
|
||||
try {
|
||||
return JSON.parse(localStorage.getItem("currentUser") || "{}")
|
||||
} catch (error) {
|
||||
return {}
|
||||
}
|
||||
}
|
||||
|
||||
function isLoggedIn(user) {
|
||||
return Boolean(user && (user.id || user.userId))
|
||||
}
|
||||
|
||||
export function installAdminGuard(router, getCurrentUser = defaultCurrentUser) {
|
||||
router.beforeEach((to, from, next) => {
|
||||
const menu = adminMenus.find(item => item.path === to.path)
|
||||
const user = getCurrentUser() || {}
|
||||
if (menu && !canShowMenu(menu, user)) {
|
||||
next(false)
|
||||
return
|
||||
}
|
||||
if (menu && requiresLogin(menu) && !isLoggedIn(user)) {
|
||||
next("/login")
|
||||
return
|
||||
}
|
||||
next()
|
||||
})
|
||||
}
|
||||
', 'admin', sysdate());
|
||||
|
||||
-- Portal frontend template files
|
||||
INSERT INTO sys_template_file (template_file_id, template_id, file_name, module_id, file_path, file_content, create_by, create_time) VALUES
|
||||
(910301, 9103, 'package.json.vm', NULL, 'package.json.vm',
|
||||
@@ -873,6 +950,9 @@ createApp(App).use(router).use(ElementPlus).mount("#app")
|
||||
<strong>${projectName}</strong>
|
||||
<el-menu mode="horizontal" router :default-active="$route.path">
|
||||
<el-menu-item index="/">工作台</el-menu-item>
|
||||
<el-menu-item v-for="menu in visibleMenus" :key="menu.code" :index="menu.path">
|
||||
{{ menu.name }}
|
||||
</el-menu-item>
|
||||
</el-menu>
|
||||
</el-header>
|
||||
<el-main>
|
||||
@@ -881,6 +961,22 @@ createApp(App).use(router).use(ElementPlus).mount("#app")
|
||||
</el-container>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { computed, ref } from "vue"
|
||||
import { canShowMenu, frontendMenus } from "./config/frontendMenus"
|
||||
|
||||
function loadCurrentUser() {
|
||||
try {
|
||||
return JSON.parse(localStorage.getItem("currentUser") || "{}")
|
||||
} catch (error) {
|
||||
return {}
|
||||
}
|
||||
}
|
||||
|
||||
const currentUser = ref(loadCurrentUser())
|
||||
const visibleMenus = computed(() => frontendMenus.filter(menu => canShowMenu(menu, currentUser.value)))
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.shell {
|
||||
min-height: 100vh;
|
||||
@@ -897,6 +993,7 @@ createApp(App).use(router).use(ElementPlus).mount("#app")
|
||||
', 'admin', sysdate()),
|
||||
(910305, 9103, 'router.js.vm', NULL, 'router.js.vm',
|
||||
'import { createRouter, createWebHistory } from "vue-router"
|
||||
import { canShowMenu, frontendMenus, requiresLogin } from "../config/frontendMenus"
|
||||
#foreach($table in $tables)
|
||||
import ${table.className}Index from "../views/${table.businessName}/index.vue"
|
||||
import ${table.className}Detail from "../views/${table.businessName}/detail.vue"
|
||||
@@ -927,10 +1024,38 @@ const routes = [
|
||||
#end
|
||||
]
|
||||
|
||||
export default createRouter({
|
||||
function currentUser() {
|
||||
try {
|
||||
return JSON.parse(localStorage.getItem("currentUser") || "{}")
|
||||
} catch (error) {
|
||||
return {}
|
||||
}
|
||||
}
|
||||
|
||||
function isLoggedIn(user) {
|
||||
return Boolean(user && (user.id || user.userId))
|
||||
}
|
||||
|
||||
const router = createRouter({
|
||||
history: createWebHistory(),
|
||||
routes
|
||||
})
|
||||
|
||||
router.beforeEach((to, from, next) => {
|
||||
const menu = frontendMenus.find(item => item.path === to.path)
|
||||
const user = currentUser()
|
||||
if (menu && !canShowMenu(menu, user)) {
|
||||
next(false)
|
||||
return
|
||||
}
|
||||
if (menu && requiresLogin(menu) && !isLoggedIn(user)) {
|
||||
next("/login")
|
||||
return
|
||||
}
|
||||
next()
|
||||
})
|
||||
|
||||
export default router
|
||||
', 'admin', sysdate()),
|
||||
(910306, 9103, 'request.js.vm', NULL, 'request.js.vm',
|
||||
'import axios from "axios"
|
||||
@@ -1146,6 +1271,50 @@ onMounted(loadDetail)
|
||||
</style>
|
||||
', 'admin', sysdate());
|
||||
|
||||
INSERT INTO sys_template_file (template_file_id, template_id, file_name, module_id, file_path, file_content, create_by, create_time) VALUES
|
||||
(910310, 9103, 'frontendMenus.js.vm', NULL, 'frontendMenus.js.vm',
|
||||
'export const appRoles = [
|
||||
#foreach($role in $appRoles)
|
||||
{ code: "${role.code}", name: "${role.name}", description: "${role.description}" }#if($foreach.hasNext),#end
|
||||
#end
|
||||
]
|
||||
|
||||
export const frontendMenus = [
|
||||
#foreach($menu in $frontendMenus)
|
||||
{
|
||||
code: "${menu.code}",
|
||||
name: "${menu.name}",
|
||||
path: "${menu.path}",
|
||||
requiresLogin: ${menu.requiresLogin},
|
||||
visibleRoles: [
|
||||
#foreach($role in $menu.visibleRoles)
|
||||
"${role}"#if($foreach.hasNext),#end
|
||||
#end
|
||||
],
|
||||
dataScope: "${menu.dataScope}"
|
||||
}#if($foreach.hasNext),#end
|
||||
#end
|
||||
]
|
||||
|
||||
export function requiresLogin(menu) {
|
||||
return Boolean(menu && menu.requiresLogin)
|
||||
}
|
||||
|
||||
export function canShowMenu(menu, currentUser = {}) {
|
||||
if (!menu) {
|
||||
return false
|
||||
}
|
||||
if (menu.requiresLogin && !currentUser.id && !currentUser.userId) {
|
||||
return false
|
||||
}
|
||||
const userRoles = Array.isArray(currentUser.roles) ? currentUser.roles : []
|
||||
if (!Array.isArray(menu.visibleRoles) || menu.visibleRoles.length === 0) {
|
||||
return true
|
||||
}
|
||||
return menu.visibleRoles.some(role => userRoles.includes(role))
|
||||
}
|
||||
', 'admin', sysdate());
|
||||
|
||||
-- Backend project structure
|
||||
INSERT INTO sys_project_structure (node_id, parent_id, node_name, node_type, module, template_id, table_id, category, sort_order, status, create_by, create_time, update_by, update_time) VALUES
|
||||
(910100, 0, '{projectName}-backend', 'folder', NULL, 9101, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL),
|
||||
@@ -1184,6 +1353,13 @@ INSERT INTO sys_project_structure (node_id, parent_id, node_name, node_type, mod
|
||||
(910208, 910207, '{businessName}', 'folder', NULL, 9102, 0, NULL, 1, '0', 'admin', sysdate(), '', NULL),
|
||||
(910209, 910208, 'index.vue', 'file', NULL, 9102, 0, 'index.vue.vm', 1, '0', 'admin', sysdate(), '', NULL);
|
||||
|
||||
INSERT INTO sys_project_structure (node_id, parent_id, node_name, node_type, module, template_id, table_id, category, sort_order, status, create_by, create_time, update_by, update_time) VALUES
|
||||
(910210, 910202, 'config', 'folder', NULL, 9102, NULL, NULL, 3, '0', 'admin', sysdate(), '', NULL),
|
||||
(910211, 910210, 'adminMenus.js', 'file', NULL, 9102, -1, 'adminMenus.js.vm', 1, '0', 'admin', sysdate(), '', NULL);
|
||||
|
||||
INSERT INTO sys_project_structure (node_id, parent_id, node_name, node_type, module, template_id, table_id, category, sort_order, status, create_by, create_time, update_by, update_time) VALUES
|
||||
(910212, 910202, 'permission.js', 'file', NULL, 9102, -1, 'adminPermission.js.vm', 4, '0', 'admin', sysdate(), '', NULL);
|
||||
|
||||
-- Portal frontend project structure
|
||||
INSERT INTO sys_project_structure (node_id, parent_id, node_name, node_type, module, template_id, table_id, category, sort_order, status, create_by, create_time, update_by, update_time) VALUES
|
||||
(910300, 0, '{projectName}-portal', 'folder', NULL, 9103, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL),
|
||||
@@ -1202,4 +1378,8 @@ INSERT INTO sys_project_structure (node_id, parent_id, node_name, node_type, mod
|
||||
(910313, 910312, 'index.vue', 'file', NULL, 9103, 0, 'index.vue.vm', 1, '0', 'admin', sysdate(), '', NULL),
|
||||
(910314, 910312, 'detail.vue', 'file', NULL, 9103, 0, 'detail.vue.vm', 2, '0', 'admin', sysdate(), '', NULL);
|
||||
|
||||
INSERT INTO sys_project_structure (node_id, parent_id, node_name, node_type, module, template_id, table_id, category, sort_order, status, create_by, create_time, update_by, update_time) VALUES
|
||||
(910315, 910303, 'config', 'folder', NULL, 9103, NULL, NULL, 6, '0', 'admin', sysdate(), '', NULL),
|
||||
(910316, 910315, 'frontendMenus.js', 'file', NULL, 9103, -1, 'frontendMenus.js.vm', 1, '0', 'admin', sysdate(), '', NULL);
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
@@ -1299,6 +1299,7 @@ create table front_project (
|
||||
back_framework varchar(50) default 'Spring Boot + MyBatis' comment '后端框架',
|
||||
generate_status char(1) default '0' comment '数据库生成状态(0未生成 1生成中 2已生成 3失败)',
|
||||
preview_status char(1) default '0' comment '预览状态(0未预览 1已预览 2失败)',
|
||||
app_blueprint longtext comment '应用蓝图草稿JSON',
|
||||
er_diagram longtext comment 'ER图草稿JSON',
|
||||
business_blueprint longtext comment '业务蓝图草稿JSON',
|
||||
status char(1) default '0' comment '状态(0正常 1停用)',
|
||||
|
||||
17
RuoYi-Vue/sql/front_app_blueprint.sql
Normal file
17
RuoYi-Vue/sql/front_app_blueprint.sql
Normal file
@@ -0,0 +1,17 @@
|
||||
set @front_app_blueprint_exists := (
|
||||
select count(1)
|
||||
from information_schema.columns
|
||||
where table_schema = database()
|
||||
and table_name = 'front_project'
|
||||
and column_name = 'app_blueprint'
|
||||
);
|
||||
|
||||
set @front_app_blueprint_sql := if(
|
||||
@front_app_blueprint_exists = 0,
|
||||
'alter table front_project add column app_blueprint longtext comment ''应用蓝图草稿JSON'' after preview_status',
|
||||
'select ''front_project.app_blueprint already exists'''
|
||||
);
|
||||
|
||||
prepare front_app_blueprint_stmt from @front_app_blueprint_sql;
|
||||
execute front_app_blueprint_stmt;
|
||||
deallocate prepare front_app_blueprint_stmt;
|
||||
@@ -42,6 +42,7 @@ create table front_project (
|
||||
back_framework varchar(50) default 'Spring Boot + MyBatis' comment '后端框架',
|
||||
generate_status char(1) default '0' comment '数据库生成状态(0未生成 1生成中 2已生成 3失败)',
|
||||
preview_status char(1) default '0' comment '预览状态(0未预览 1已预览 2失败)',
|
||||
app_blueprint longtext comment '应用蓝图草稿JSON',
|
||||
er_diagram longtext comment 'ER图草稿JSON',
|
||||
business_blueprint longtext comment '业务蓝图草稿JSON',
|
||||
status char(1) default '0' comment '状态(0正常 1停用)',
|
||||
|
||||
Reference in New Issue
Block a user