开始尝试进行业务化模板
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -82,3 +82,4 @@ Icon
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
*.db
|
||||
|
||||
@@ -27,6 +27,11 @@ createApp(App)
|
||||
path: 'overview',
|
||||
component: () => import('@/views/management/Overview.vue'),
|
||||
},
|
||||
{
|
||||
name: 'organization',
|
||||
path: 'organization',
|
||||
component: () => import('@/views/management/Organization.vue'),
|
||||
},
|
||||
{
|
||||
name: 'setting',
|
||||
path: 'setting',
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const information = {
|
||||
debug: true,
|
||||
baseUrl: 'http://localhost'
|
||||
baseUrl: 'http://localhost:8080',
|
||||
}
|
||||
|
||||
export function amisRender(target, amisJson) {
|
||||
@@ -13,7 +13,9 @@ export function amisRender(target, amisJson) {
|
||||
amisJsonObject,
|
||||
information,
|
||||
{
|
||||
theme: 'antd'
|
||||
}
|
||||
theme: 'antd',
|
||||
enableAMISDebug:
|
||||
information.debug,
|
||||
},
|
||||
)
|
||||
}
|
||||
@@ -1,5 +1,8 @@
|
||||
<script setup>
|
||||
import {ref, watch} from 'vue'
|
||||
import {
|
||||
ref,
|
||||
watch,
|
||||
} from 'vue'
|
||||
import {useRoute} from 'vue-router'
|
||||
|
||||
const route = useRoute();
|
||||
@@ -13,13 +16,18 @@ const menus = [
|
||||
key: 'system',
|
||||
name: '系统管理',
|
||||
children: [
|
||||
{
|
||||
key: 'organization',
|
||||
path: '/management/organization',
|
||||
name: '组织架构',
|
||||
},
|
||||
{
|
||||
key: 'setting',
|
||||
path: '/management/setting',
|
||||
name: '设置',
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
],
|
||||
},
|
||||
]
|
||||
const sideNavSelected = ref(['overview'])
|
||||
const openKeys = ref([]) // 控制展开的子菜单
|
||||
@@ -65,19 +73,21 @@ watch(() => route.path, () => {
|
||||
v-model:openKeys="openKeys"
|
||||
mode="inline"
|
||||
>
|
||||
<a-menu-item key="overview">
|
||||
<router-link to="/management/overview">概览</router-link>
|
||||
</a-menu-item>
|
||||
<a-sub-menu key="system">
|
||||
<div v-for="menu in menus" :key="menu.key">
|
||||
<a-sub-menu v-if="menu.children" :key="menu.key">
|
||||
<template #title>
|
||||
<span>
|
||||
系统管理
|
||||
{{ menu.name }}
|
||||
</span>
|
||||
</template>
|
||||
<a-menu-item key="setting">
|
||||
<router-link to="/management/setting">设置</router-link>
|
||||
<a-menu-item v-for="submenu in menu.children" :key="submenu.key">
|
||||
<router-link :to="submenu.path">{{ submenu.name }}</router-link>
|
||||
</a-menu-item>
|
||||
</a-sub-menu>
|
||||
<a-menu-item v-else :key="menu.key">
|
||||
<router-link :to="menu.path">{{ menu.name }}</router-link>
|
||||
</a-menu-item>
|
||||
</div>
|
||||
</a-menu>
|
||||
</a-layout-sider>
|
||||
<div class="p-3 h-full w-full">
|
||||
|
||||
78
client/src/views/management/Organization.vue
Normal file
78
client/src/views/management/Organization.vue
Normal file
@@ -0,0 +1,78 @@
|
||||
<script setup>
|
||||
import {onMounted} from 'vue'
|
||||
import {amisRender} from '@/utils.js'
|
||||
|
||||
onMounted(() => {
|
||||
amisRender(
|
||||
'#amis-organization',
|
||||
information => {
|
||||
return {
|
||||
type: 'page',
|
||||
body: [
|
||||
{
|
||||
type: 'tpl',
|
||||
tpl: '${baseUrl}1',
|
||||
},
|
||||
{
|
||||
type: 'crud',
|
||||
syncLocation: false,
|
||||
headerToolbar: [
|
||||
{
|
||||
type: 'action',
|
||||
label: '新增组织',
|
||||
level: 'primary',
|
||||
actionType: 'dialog',
|
||||
dialog: {
|
||||
title: '新增组织',
|
||||
body: {
|
||||
type: 'form',
|
||||
api: {
|
||||
method: 'post',
|
||||
url: `${information.baseUrl}/jsonapi/organization`,
|
||||
dataType: 'application/vnd.api+json',
|
||||
headers: {
|
||||
'Content-Type': 'application/vnd.api+json',
|
||||
},
|
||||
data: {
|
||||
type: 'user',
|
||||
attributes: {
|
||||
organizationName: '${organizationName}',
|
||||
},
|
||||
},
|
||||
},
|
||||
body: [
|
||||
{
|
||||
type: 'input-text',
|
||||
name: 'organizationName',
|
||||
label: '组织名称',
|
||||
required: true,
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
columns: [
|
||||
{
|
||||
name: 'organizationId',
|
||||
label: '组织编号',
|
||||
},
|
||||
{
|
||||
name: 'organizationName',
|
||||
label: '组织名称',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
)
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div id="amis-organization"></div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
</style>
|
||||
@@ -5,5 +5,5 @@ package com.lanyuanxiaoyao.server.configuration;
|
||||
* @version 20250327
|
||||
*/
|
||||
public interface Constants {
|
||||
String DATABASE_TABLE_PREFIX = "system_";
|
||||
String DATABASE_TABLE_PREFIX = "platform_";
|
||||
}
|
||||
|
||||
@@ -22,7 +22,6 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
||||
@Slf4j
|
||||
public class SnowflakeId {
|
||||
@IdGeneratorType(IdGenerator.class)
|
||||
@ValueGenerationType(generatedBy = IdGenerator.class)
|
||||
@Retention(RUNTIME)
|
||||
@Target({FIELD, METHOD})
|
||||
public @interface Generator {
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.lanyuanxiaoyao.server.entity;
|
||||
|
||||
import com.lanyuanxiaoyao.server.configuration.Constants;
|
||||
import com.lanyuanxiaoyao.server.configuration.database.SnowflakeId;
|
||||
import com.yahoo.elide.annotation.Include;
|
||||
import jakarta.persistence.ConstraintMode;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.FetchType;
|
||||
@@ -27,19 +28,24 @@ import lombok.ToString;
|
||||
@ToString
|
||||
@Entity
|
||||
@Table(name = Constants.DATABASE_TABLE_PREFIX + "department")
|
||||
@Include
|
||||
public class Department {
|
||||
@Id
|
||||
@SnowflakeId.Generator
|
||||
private Long departmentId;
|
||||
private String departmentName;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(nullable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
|
||||
@ManyToOne(optional = false)
|
||||
@JoinColumn(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
|
||||
private Organization organization;
|
||||
|
||||
@OneToMany(fetch = FetchType.LAZY, mappedBy = "department")
|
||||
@ToString.Exclude
|
||||
private Set<User> users;
|
||||
|
||||
@ManyToOne
|
||||
private Department parent;
|
||||
@OneToMany(fetch = FetchType.LAZY, mappedBy = "departmentParent")
|
||||
@OneToMany(fetch = FetchType.LAZY, mappedBy = "parent")
|
||||
@ToString.Exclude
|
||||
private Set<Department> children;
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.lanyuanxiaoyao.server.entity;
|
||||
|
||||
import com.lanyuanxiaoyao.server.configuration.Constants;
|
||||
import com.lanyuanxiaoyao.server.configuration.database.SnowflakeId;
|
||||
import com.yahoo.elide.annotation.Include;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.FetchType;
|
||||
import jakarta.persistence.Id;
|
||||
@@ -23,12 +24,17 @@ import lombok.ToString;
|
||||
@ToString
|
||||
@Entity
|
||||
@Table(name = Constants.DATABASE_TABLE_PREFIX + "organization")
|
||||
@Include
|
||||
public class Organization {
|
||||
@Id
|
||||
@SnowflakeId.Generator
|
||||
private Long organizationId;
|
||||
private String organizationName;
|
||||
|
||||
@OneToMany(fetch = FetchType.LAZY, mappedBy = "organization")
|
||||
@ToString.Exclude
|
||||
private Set<User> users;
|
||||
|
||||
@OneToMany(fetch = FetchType.LAZY, mappedBy = "organization")
|
||||
@ToString.Exclude
|
||||
private Set<Department> departments;
|
||||
|
||||
@@ -2,9 +2,15 @@ package com.lanyuanxiaoyao.server.entity;
|
||||
|
||||
import com.lanyuanxiaoyao.server.configuration.Constants;
|
||||
import com.lanyuanxiaoyao.server.configuration.database.SnowflakeId;
|
||||
import com.yahoo.elide.annotation.Include;
|
||||
import jakarta.persistence.ConstraintMode;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.ForeignKey;
|
||||
import jakarta.persistence.Id;
|
||||
import jakarta.persistence.JoinColumn;
|
||||
import jakarta.persistence.ManyToOne;
|
||||
import jakarta.persistence.Table;
|
||||
import jakarta.persistence.UniqueConstraint;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
@@ -20,11 +26,20 @@ import lombok.ToString;
|
||||
@ToString
|
||||
@Entity
|
||||
@Table(name = Constants.DATABASE_TABLE_PREFIX + "user")
|
||||
@Include
|
||||
public class User {
|
||||
@Id
|
||||
@SnowflakeId.Generator
|
||||
private Long userId;
|
||||
private String userCode;
|
||||
private String userNickName;
|
||||
private String userNickname;
|
||||
private String userSecret;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
|
||||
private Organization organization;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
|
||||
private Department department;
|
||||
}
|
||||
|
||||
10
src/test/resources/organization.http
Normal file
10
src/test/resources/organization.http
Normal file
@@ -0,0 +1,10 @@
|
||||
### Create
|
||||
POST http://localhost:8080/jsonapi/organization
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"type": "organization",
|
||||
"attributes": {
|
||||
"organizationName": "苹果公司"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user