1
0

2 Commits

Author SHA1 Message Date
1ec345e18d feat(web): 增加授权相关界面 2024-12-02 19:07:22 +08:00
e7918f9039 feat(web): 避免h2的数据库关键字 2024-12-02 16:27:01 +08:00
43 changed files with 556 additions and 208 deletions

View File

@@ -1,11 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="RemoteRepositoriesConfiguration"> <component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository>
<remote-repository> <remote-repository>
<option name="id" value="mavenCentral" /> <option name="id" value="mavenCentral" />
<option name="name" value="mavenCentral" /> <option name="name" value="mavenCentral" />

2
.idea/misc.xml generated
View File

@@ -8,7 +8,7 @@
</list> </list>
</option> </option>
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="temurin-17" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="corretto-11" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" /> <output url="file://$PROJECT_DIR$/out" />
</component> </component>
<component name="ProjectType"> <component name="ProjectType">

View File

@@ -43,7 +43,7 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot3-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.retry</groupId> <groupId>org.springframework.retry</groupId>

View File

@@ -18,7 +18,7 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.dtflys.forest</groupId> <groupId>com.dtflys.forest</groupId>
<artifactId>forest-spring-boot3-starter</artifactId> <artifactId>forest-spring-boot-starter</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.cloud</groupId> <groupId>org.springframework.cloud</groupId>

View File

@@ -98,6 +98,7 @@ export function inputFileFormItemCommonOptions(accept = '*', maxSize = size5MB)
accept: accept, accept: accept,
maxSize: maxSize, maxSize: maxSize,
autoUpload: false, autoUpload: false,
drag: true,
startChunkApi: apiPost('${base}/upload/start'), startChunkApi: apiPost('${base}/upload/start'),
chunkApi: apiPost('${base}/upload/slice'), chunkApi: apiPost('${base}/upload/slice'),
finishChunkApi: apiPost('${base}/upload/finish'), finishChunkApi: apiPost('${base}/upload/finish'),
@@ -197,7 +198,7 @@ export function stringField(field, label, width = undefined, wrap = false) {
if (width) { if (width) {
data['width'] = width data['width'] = width
} }
if (wrap) { if (!wrap) {
data['className'] = 'nowrap' data['className'] = 'nowrap'
} }
return data return data
@@ -247,10 +248,11 @@ export const userStateMapping = [
mappingItem('禁用', 'DISABLED', 'bg-danger'), mappingItem('禁用', 'DISABLED', 'bg-danger'),
] ]
export const confirmationStateMapping = [ export const permissionStateMapping = [
mappingItem('未确权', 'NONE'), mappingItem('未确权', 'NONE'),
mappingItem('草稿', 'DRAFT', 'bg-primary'), mappingItem('草稿', 'DRAFT', 'bg-primary'),
mappingItem('审查中', 'CHECKING', 'bg-warning'), mappingItem('审查中', 'CHECKING', 'bg-warning'),
mappingItem('用户审查中', 'USER_CHECKING', 'bg-warning'),
mappingItem('通过', 'NORMAL', 'bg-success'), mappingItem('通过', 'NORMAL', 'bg-success'),
mappingItem('驳回', 'REJECT', 'bg-danger'), mappingItem('驳回', 'REJECT', 'bg-danger'),
] ]

View File

@@ -12,8 +12,12 @@ import {
import {resourceList} from "../../pages/index/tab-data.js"; import {resourceList} from "../../pages/index/tab-data.js";
import {resourceDetailDialog} from "../resource/dialog-resource.js"; import {resourceDetailDialog} from "../resource/dialog-resource.js";
const CONFIRMATION_TYPE = 'confirmation'
const AUTHENTICATION_TYPE = 'authentication'
function detailForm(showCreatedUserAndModifiedUser = false) { function detailForm(showCreatedUserAndModifiedUser = false) {
return { return {
debug: true,
id: 'permission_form', id: 'permission_form',
type: 'form', type: 'form',
...horizontalFormOptions(), ...horizontalFormOptions(),
@@ -70,12 +74,38 @@ function detailForm(showCreatedUserAndModifiedUser = false) {
joinValues: false, joinValues: false,
...inputFileFormItemCommonOptions(undefined, size100MB), ...inputFileFormItemCommonOptions(undefined, size100MB),
}, },
{
visibleOn: `\${${AUTHENTICATION_TYPE}}`,
type: 'input-datetime-range',
name: 'activeTime',
extraName: 'expiredTime',
label: '授权时间',
required: true,
format: 'YYYY-MM-DD HH:mm:ss',
shortcuts: [
'7dayslater',
'14dayslater',
'30dayslater',
'180dayslater',
'365dayslater',
]
},
...(showCreatedUserAndModifiedUser ? formCreatedUserAndModifiedUser() : []) ...(showCreatedUserAndModifiedUser ? formCreatedUserAndModifiedUser() : [])
] ]
} }
} }
export function permissionAddDialog() { export function confirmationAddDialog() {
return permissionAddDialog(CONFIRMATION_TYPE)
}
export function authenticationAddDialog() {
return permissionAddDialog(AUTHENTICATION_TYPE)
}
function permissionAddDialog(type) {
let data = {add: true}
data[type] = true
return { return {
actionType: 'dialog', actionType: 'dialog',
dialog: { dialog: {
@@ -94,16 +124,24 @@ export function permissionAddDialog() {
], ],
body: { body: {
...detailForm(), ...detailForm(),
api: apiPost('${base}/confirmation/save'), api: apiPost(`\${base}/${type}/save`),
data: { data: data,
add: true,
},
} }
} }
} }
} }
export function permissionDetailDialog(field = 'id', actions = []) { export function confirmationDetailDialog(field = 'id', actions = []) {
return permissionDetailDialog(CONFIRMATION_TYPE, field, actions)
}
export function authenticationDetailDialog(field = 'id', actions = []) {
return permissionDetailDialog(AUTHENTICATION_TYPE, field, actions)
}
function permissionDetailDialog(type, field = 'id', actions = []) {
let data = {detail: true}
data[type] = true
return { return {
actionType: 'dialog', actionType: 'dialog',
dialog: { dialog: {
@@ -112,17 +150,25 @@ export function permissionDetailDialog(field = 'id', actions = []) {
actions: actions, actions: actions,
body: { body: {
...detailForm(true), ...detailForm(true),
initApi: apiGet(`\${base}/confirmation/detail/\${${field}}`), initApi: apiGet(`\${base}/${type}/detail/\${${field}}`),
static: true, static: true,
data: { data: data,
detail: true,
},
} }
} }
} }
} }
export function permissionEditeDialog(field = 'id') { export function confirmationEditeDialog(field = 'id') {
return permissionEditeDialog(CONFIRMATION_TYPE, field)
}
export function authenticationEditeDialog(field = 'id') {
return permissionEditeDialog(CONFIRMATION_TYPE, field)
}
function permissionEditeDialog(type, field = 'id') {
let data = {edit: true}
data[type] = true
return { return {
actionType: 'dialog', actionType: 'dialog',
dialog: { dialog: {
@@ -141,11 +187,9 @@ export function permissionEditeDialog(field = 'id') {
], ],
body: { body: {
...detailForm(), ...detailForm(),
api: apiPost('${base}/confirmation/save'), api: apiPost(`\${base}/${type}/save`),
initApi: apiGet(`\${base}/confirmation/detail/\${${field}}`), initApi: apiGet(`\${base}/${type}/detail/\${${field}}`),
data: { data: data,
edit: true,
}
}, },
} }
} }

View File

@@ -59,9 +59,9 @@ useAmis(information => {
tabs: [ tabs: [
// tabOverview(), // tabOverview(),
// tabMarket(), // tabMarket(),
tabPermissions(),
tabCheck(), tabCheck(),
tabData(), tabData(),
tabPermissions(),
tabUser(), tabUser(),
tabSettings(), tabSettings(),
] ]

View File

@@ -9,7 +9,7 @@ import {
stringField, stringField,
timeField, timeField,
} from "../../components/constants.js"; } from "../../components/constants.js";
import {permissionDetailDialog} from "../../components/permission/dialog-permission.js"; import {confirmationDetailDialog} from "../../components/permission/dialog-permission.js";
export function tabCheck() { export function tabCheck() {
return { return {
@@ -40,7 +40,7 @@ export function tabCheck() {
type: 'action', type: 'action',
label: '处理', label: '处理',
level: 'link', level: 'link',
...permissionDetailDialog( ...confirmationDetailDialog(
'parameters.confirmationId', 'parameters.confirmationId',
[ [
{ {
@@ -67,7 +67,7 @@ export function tabCheck() {
type: 'action', type: 'action',
label: '查看', label: '查看',
level: 'link', level: 'link',
...permissionDetailDialog('parameters.confirmationId'), ...confirmationDetailDialog('parameters.confirmationId'),
}, },
]), ]),
], ],

View File

@@ -8,10 +8,10 @@ import {
arrayInCheck, arrayInCheck,
arrayOutCheck, arrayOutCheck,
confirmationState, confirmationState,
confirmationStateMapping,
crudCommonOptions, crudCommonOptions,
mappingField, mappingField,
operationField, operationField,
permissionStateMapping,
timeField, timeField,
userOnly userOnly
} from "../../components/constants.js"; } from "../../components/constants.js";
@@ -40,7 +40,7 @@ export function resourceList() {
label: '描述', label: '描述',
name: 'description', name: 'description',
}, },
mappingField('confirmationState', '确权状态', confirmationStateMapping), mappingField('confirmationState', '确权状态', permissionStateMapping),
timeField('createdTime', '创建时间'), timeField('createdTime', '创建时间'),
operationField('操作', undefined, [ operationField('操作', undefined, [
{ {

View File

@@ -1,9 +1,10 @@
import { import {
apiGet, apiGet,
confirmationStateMapping,
crudCommonOptions, crudCommonOptions,
customerOnly,
mappingField, mappingField,
operationField, operationField,
permissionStateMapping,
providerOnly, providerOnly,
stringField, stringField,
stringWrapField, stringWrapField,
@@ -11,9 +12,12 @@ import {
userOnly, userOnly,
} from "../../components/constants.js"; } from "../../components/constants.js";
import { import {
permissionAddDialog, authenticationAddDialog,
permissionDetailDialog, authenticationDetailDialog,
permissionEditeDialog, authenticationEditeDialog,
confirmationAddDialog,
confirmationDetailDialog,
confirmationEditeDialog,
} from "../../components/permission/dialog-permission.js"; } from "../../components/permission/dialog-permission.js";
export function tabPermissions() { export function tabPermissions() {
@@ -25,6 +29,85 @@ export function tabPermissions() {
body: { body: {
type: 'tabs', type: 'tabs',
tabs: [ tabs: [
{
visibleOn: customerOnly,
title: '授权管理',
body: {
type: 'crud',
api: {
...apiGet('${base}/authentication/list')
},
...crudCommonOptions(),
headerToolbar: [
'reload',
{
type: 'action',
label: '',
icon: 'fa fa-plus',
...authenticationAddDialog()
},
],
columns: [
stringField('name', '名称', 200),
stringWrapField('description', '描述'),
mappingField('state', '状态', permissionStateMapping),
timeField('createdTime', '创建时间'),
operationField('操作', undefined, [
{
type: 'action',
label: '查看',
level: 'link',
...authenticationDetailDialog(),
},
{
visibleOn: "${state === 'CHECKING'}",
type: 'action',
label: '撤销',
level: 'link',
confirmTitle: '确认撤销',
confirmText: '确认撤销名称为「${name}」的确权申请吗?',
actionType: 'ajax',
api: apiGet('${base}/authentication/retract/${id}'),
},
{
visibleOn: "${state === 'DRAFT' || state === 'REJECT'}",
type: 'action',
label: '提交',
level: 'link',
confirmTitle: '确认提交',
confirmText: '确认提交名称为「${name}」的确权申请吗?',
actionType: 'ajax',
api: apiGet('${base}/authentication/submit/${id}'),
},
{
type: 'dropdown-button',
level: 'link',
icon: 'fa fa-ellipsis-h',
hideCaret: true,
trigger: 'hover',
buttons: [
{
disabledOn: "${state !== 'DRAFT'}",
type: 'action',
label: '编辑',
level: 'link',
...authenticationEditeDialog(),
},
{
disabledOn: "${state === 'CHECKING'}",
type: 'action',
label: "删除",
confirmTitle: '确认删除',
confirmText: '确认删除名称为「${name}」的确权申请吗?删除后对应的数据资源处于未确权状态。',
actionType: 'ajax',
api: apiGet('${base}/authentication/remove/${id}'),
},
]
},
]),
]
}
},
{ {
visibleOn: providerOnly, visibleOn: providerOnly,
title: '确权管理', title: '确权管理',
@@ -40,20 +123,20 @@ export function tabPermissions() {
type: 'action', type: 'action',
label: '', label: '',
icon: 'fa fa-plus', icon: 'fa fa-plus',
...permissionAddDialog() ...confirmationAddDialog()
}, },
], ],
columns: [ columns: [
stringField('name', '名称', 200), stringField('name', '名称', 200),
stringWrapField('description', '描述'), stringWrapField('description', '描述'),
mappingField('state', '状态', confirmationStateMapping), mappingField('state', '状态', permissionStateMapping),
timeField('createdTime', '创建时间'), timeField('createdTime', '创建时间'),
operationField('操作', undefined, [ operationField('操作', undefined, [
{ {
type: 'action', type: 'action',
label: '查看', label: '查看',
level: 'link', level: 'link',
...permissionDetailDialog(), ...confirmationDetailDialog(),
}, },
{ {
visibleOn: "${state === 'CHECKING'}", visibleOn: "${state === 'CHECKING'}",
@@ -87,7 +170,7 @@ export function tabPermissions() {
type: 'action', type: 'action',
label: '编辑', label: '编辑',
level: 'link', level: 'link',
...permissionEditeDialog(), ...confirmationEditeDialog(),
}, },
{ {
disabledOn: "${state === 'CHECKING'}", disabledOn: "${state === 'CHECKING'}",
@@ -104,10 +187,6 @@ export function tabPermissions() {
] ]
} }
}, },
{
title: '授权管理',
body: []
}
] ]
} }
} }

View File

@@ -19,12 +19,6 @@
<dependency> <dependency>
<groupId>com.eshore</groupId> <groupId>com.eshore</groupId>
<artifactId>gringotts-forest</artifactId> <artifactId>gringotts-forest</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>

View File

@@ -0,0 +1,87 @@
package com.eshore.gringotts.web.domain.authentication.controller;
import com.eshore.gringotts.web.domain.authentication.entity.Authentication;
import com.eshore.gringotts.web.domain.authentication.service.AuthenticationService;
import com.eshore.gringotts.web.domain.base.controller.SimpleControllerSupport;
import com.eshore.gringotts.web.domain.base.entity.FileInfo;
import com.eshore.gringotts.web.domain.base.entity.SimpleListItem;
import com.eshore.gringotts.web.domain.base.entity.SimpleSaveItem;
import com.eshore.gringotts.web.domain.resource.service.DataResourceService;
import com.eshore.gringotts.web.domain.upload.service.DataFileService;
import java.time.LocalDateTime;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.collections.api.set.ImmutableSet;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author lanyuanxiaoyao
* @date 2024-12-02
*/
@Slf4j
@RestController
@RequestMapping("authentication")
public class AuthenticationController extends SimpleControllerSupport<Authentication, AuthenticationController.SaveItem, AuthenticationController.ListItem, AuthenticationController.DetailItem> {
private final AuthenticationService authenticationService;
private final DataResourceService dataResourceService;
private final DataFileService dataFileService;
public AuthenticationController(AuthenticationService service, DataResourceService dataResourceService, DataFileService dataFileService) {
super(service);
this.authenticationService = service;
this.dataResourceService = dataResourceService;
this.dataFileService = dataFileService;
}
@Override
protected Authentication fromSaveItem(SaveItem item) {
Authentication authentication = new Authentication();
authentication.setId(item.getId());
authentication.setDescription(item.getDescription());
authentication.setTarget(dataResourceService.detailOrThrow(item.getTargetId()));
authentication.setEvidences(dataFileService.list(item.getEvidenceFiles().collect(FileInfo::getValue)).toSet());
authentication.setActiveTime(item.getActiveTime());
authentication.setExpiredTime(item.getExpiredTime());
return null;
}
@Override
protected ListItem toListItem(Authentication entity) {
ListItem item = new ListItem();
item.setId(entity.getId());
item.setName(entity.getTarget().getName());
item.setDescription(entity.getDescription());
item.setState(entity.getState().name());
item.setCreatedUsername(entity.getCreatedUser().getUsername());
item.setCreatedTime(entity.getCreatedTime());
return item;
}
@Override
protected DetailItem toDetailItem(Authentication entity) {
return null;
}
@Data
@EqualsAndHashCode(callSuper = true)
public static final class SaveItem extends SimpleSaveItem<Authentication> {
private Long targetId;
private String description;
private ImmutableSet<FileInfo> evidenceFiles;
private LocalDateTime activeTime;
private LocalDateTime expiredTime;
}
@Data
@EqualsAndHashCode(callSuper = true)
public static final class ListItem extends SimpleListItem<Authentication> {
private String name;
private String description;
private String state;
}
@Data
public static final class DetailItem {}
}

View File

@@ -2,26 +2,30 @@ package com.eshore.gringotts.web.domain.authentication.entity;
import com.eshore.gringotts.core.Constants; import com.eshore.gringotts.core.Constants;
import com.eshore.gringotts.web.domain.base.entity.CheckingNeededEntity; import com.eshore.gringotts.web.domain.base.entity.CheckingNeededEntity;
import com.eshore.gringotts.web.domain.base.entity.LogicDeleteEntity;
import com.eshore.gringotts.web.domain.resource.entity.DataResource; import com.eshore.gringotts.web.domain.resource.entity.DataResource;
import com.eshore.gringotts.web.domain.upload.entity.DataFile; import com.eshore.gringotts.web.domain.upload.entity.DataFile;
import jakarta.persistence.CascadeType; import java.time.LocalDateTime;
import jakarta.persistence.ConstraintMode;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.FetchType;
import jakarta.persistence.ForeignKey;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.JoinTable;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.NamedAttributeNode;
import jakarta.persistence.NamedEntityGraph;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import java.util.Set; import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.ConstraintMode;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.FetchType;
import javax.persistence.ForeignKey;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.NamedAttributeNode;
import javax.persistence.NamedEntityGraph;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import org.hibernate.annotations.DynamicUpdate; import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.Where;
import org.springframework.data.jpa.domain.support.AuditingEntityListener; import org.springframework.data.jpa.domain.support.AuditingEntityListener;
/** /**
@@ -50,9 +54,21 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
public class Authentication extends CheckingNeededEntity { public class Authentication extends CheckingNeededEntity {
@ManyToOne(fetch = FetchType.EAGER) @ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(nullable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) @JoinColumn(nullable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
@Where(clause = LogicDeleteEntity.LOGIC_DELETE_CLAUSE)
private DataResource target; private DataResource target;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT), inverseForeignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) @JoinTable(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT), inverseForeignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
@ToString.Exclude @ToString.Exclude
@Where(clause = LogicDeleteEntity.LOGIC_DELETE_CLAUSE)
private Set<DataFile> evidences; private Set<DataFile> evidences;
/**
* 生效时间
*/
@Column(nullable = false)
private LocalDateTime activeTime = LocalDateTime.now();
/**
* 过期时间
*/
@Column(nullable = false)
private LocalDateTime expiredTime = LocalDateTime.now().plusDays(1);
} }

View File

@@ -0,0 +1,13 @@
package com.eshore.gringotts.web.domain.authentication.repository;
import com.eshore.gringotts.web.domain.authentication.entity.Authentication;
import com.eshore.gringotts.web.domain.base.repository.SimpleRepository;
import org.springframework.stereotype.Repository;
/**
* @author lanyuanxiaoyao
* @date 2024-12-02
*/
@Repository
public interface AuthenticationRepository extends SimpleRepository<Authentication, Long> {
}

View File

@@ -0,0 +1,31 @@
package com.eshore.gringotts.web.domain.authentication.service;
import com.eshore.gringotts.web.domain.authentication.entity.Authentication;
import com.eshore.gringotts.web.domain.authentication.repository.AuthenticationRepository;
import com.eshore.gringotts.web.domain.base.service.CheckingService;
import com.eshore.gringotts.web.domain.base.service.LogicDeleteService;
import com.eshore.gringotts.web.domain.check.entity.CheckOrder;
import com.eshore.gringotts.web.domain.user.service.UserService;
import javax.persistence.EntityManager;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.collections.api.map.ImmutableMap;
import org.springframework.stereotype.Service;
/**
* @author lanyuanxiaoyao
* @date 2024-12-02
*/
@Slf4j
@Service
public class AuthenticationService extends LogicDeleteService<Authentication> implements CheckingService {
private final AuthenticationRepository authenticationRepository;
public AuthenticationService(AuthenticationRepository repository, UserService userService, EntityManager manager) {
super(repository, userService, manager);
this.authenticationRepository = repository;
}
@Override
public void onChecked(CheckOrder order, CheckOrder.Operation operation, ImmutableMap<String, Object> parameters) {
}
}

View File

@@ -1,10 +1,10 @@
package com.eshore.gringotts.web.domain.base.entity; package com.eshore.gringotts.web.domain.base.entity;
import jakarta.persistence.Column; import javax.persistence.Column;
import jakarta.persistence.EntityListeners; import javax.persistence.EntityListeners;
import jakarta.persistence.EnumType; import javax.persistence.EnumType;
import jakarta.persistence.Enumerated; import javax.persistence.Enumerated;
import jakarta.persistence.MappedSuperclass; import javax.persistence.MappedSuperclass;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
@@ -35,6 +35,10 @@ public class CheckingNeededEntity extends LogicDeleteEntity {
* 审查中 * 审查中
*/ */
CHECKING, CHECKING,
/**
* 用户审核
*/
USER_CHECKING,
/** /**
* 正常 * 正常
*/ */

View File

@@ -1,9 +1,9 @@
package com.eshore.gringotts.web.domain.base.entity; package com.eshore.gringotts.web.domain.base.entity;
import jakarta.persistence.EntityListeners; import javax.persistence.EntityListeners;
import jakarta.persistence.GeneratedValue; import javax.persistence.GeneratedValue;
import jakarta.persistence.Id; import javax.persistence.Id;
import jakarta.persistence.MappedSuperclass; import javax.persistence.MappedSuperclass;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;

View File

@@ -1,12 +1,11 @@
package com.eshore.gringotts.web.domain.base.entity; package com.eshore.gringotts.web.domain.base.entity;
import jakarta.persistence.Column; import javax.persistence.Column;
import jakarta.persistence.EntityListeners; import javax.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass; import javax.persistence.MappedSuperclass;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import org.hibernate.annotations.SoftDelete;
import org.springframework.data.jpa.domain.support.AuditingEntityListener; import org.springframework.data.jpa.domain.support.AuditingEntityListener;
/** /**
@@ -20,8 +19,9 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@ToString(callSuper = true) @ToString(callSuper = true)
@MappedSuperclass @MappedSuperclass
@EntityListeners(AuditingEntityListener.class) @EntityListeners(AuditingEntityListener.class)
@SoftDelete(columnName = "delete")
public class LogicDeleteEntity extends SimpleEntity { public class LogicDeleteEntity extends SimpleEntity {
public static final String LOGIC_DELETE_CLAUSE = "deleted = false";
@Column(nullable = false) @Column(nullable = false)
private Boolean deleted = false; private Boolean deleted = false;
} }

View File

@@ -1,12 +1,11 @@
package com.eshore.gringotts.web.domain.base.entity; package com.eshore.gringotts.web.domain.base.entity;
import jakarta.persistence.Column; import javax.persistence.Column;
import jakarta.persistence.EntityListeners; import javax.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass; import javax.persistence.MappedSuperclass;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import org.hibernate.annotations.SoftDelete;
import org.springframework.data.jpa.domain.support.AuditingEntityListener; import org.springframework.data.jpa.domain.support.AuditingEntityListener;
/** /**
@@ -20,8 +19,9 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@ToString(callSuper = true) @ToString(callSuper = true)
@MappedSuperclass @MappedSuperclass
@EntityListeners(AuditingEntityListener.class) @EntityListeners(AuditingEntityListener.class)
@SoftDelete(columnName = "delete")
public class LogicDeleteIdOnlyEntity extends IdOnlyEntity { public class LogicDeleteIdOnlyEntity extends IdOnlyEntity {
public static final String LOGIC_DELETE_CLAUSE = "deleted = false";
@Column(nullable = false) @Column(nullable = false)
private Boolean deleted = false; private Boolean deleted = false;
} }

View File

@@ -1,14 +1,14 @@
package com.eshore.gringotts.web.domain.base.entity; package com.eshore.gringotts.web.domain.base.entity;
import com.eshore.gringotts.web.domain.user.entity.User; import com.eshore.gringotts.web.domain.user.entity.User;
import jakarta.persistence.ConstraintMode;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.FetchType;
import jakarta.persistence.ForeignKey;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.MappedSuperclass;
import jakarta.persistence.OneToOne;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import javax.persistence.ConstraintMode;
import javax.persistence.EntityListeners;
import javax.persistence.FetchType;
import javax.persistence.ForeignKey;
import javax.persistence.JoinColumn;
import javax.persistence.MappedSuperclass;
import javax.persistence.OneToOne;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;

View File

@@ -5,13 +5,13 @@ import cn.hutool.core.util.StrUtil;
import com.eshore.gringotts.web.domain.base.entity.LogicDeleteEntity; import com.eshore.gringotts.web.domain.base.entity.LogicDeleteEntity;
import com.eshore.gringotts.web.domain.base.repository.SimpleRepository; import com.eshore.gringotts.web.domain.base.repository.SimpleRepository;
import com.eshore.gringotts.web.domain.user.service.UserService; import com.eshore.gringotts.web.domain.user.service.UserService;
import jakarta.persistence.EntityManager; import javax.persistence.EntityManager;
import jakarta.persistence.Query; import javax.persistence.Query;
import jakarta.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Predicate; import javax.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root; import javax.persistence.criteria.Root;
import jakarta.transaction.Transactional; import javax.transaction.Transactional;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.eclipse.collections.api.factory.Lists; import org.eclipse.collections.api.factory.Lists;
import org.eclipse.collections.api.list.ImmutableList; import org.eclipse.collections.api.list.ImmutableList;

View File

@@ -8,12 +8,12 @@ import com.eshore.gringotts.web.domain.base.entity.SimpleEntity;
import com.eshore.gringotts.web.domain.base.repository.SimpleRepository; import com.eshore.gringotts.web.domain.base.repository.SimpleRepository;
import com.eshore.gringotts.web.domain.user.entity.User; import com.eshore.gringotts.web.domain.user.entity.User;
import com.eshore.gringotts.web.domain.user.service.UserService; import com.eshore.gringotts.web.domain.user.service.UserService;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root;
import jakarta.transaction.Transactional;
import java.util.Optional; import java.util.Optional;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.transaction.Transactional;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.eclipse.collections.api.factory.Lists; import org.eclipse.collections.api.factory.Lists;
import org.eclipse.collections.api.list.ImmutableList; import org.eclipse.collections.api.list.ImmutableList;

View File

@@ -3,19 +3,19 @@ package com.eshore.gringotts.web.domain.check.entity;
import com.eshore.gringotts.core.Constants; import com.eshore.gringotts.core.Constants;
import com.eshore.gringotts.web.domain.base.entity.SimpleEntity; import com.eshore.gringotts.web.domain.base.entity.SimpleEntity;
import com.eshore.gringotts.web.domain.user.entity.User; import com.eshore.gringotts.web.domain.user.entity.User;
import jakarta.persistence.Column; import javax.persistence.Column;
import jakarta.persistence.ConstraintMode; import javax.persistence.ConstraintMode;
import jakarta.persistence.Entity; import javax.persistence.Entity;
import jakarta.persistence.EntityListeners; import javax.persistence.EntityListeners;
import jakarta.persistence.EnumType; import javax.persistence.EnumType;
import jakarta.persistence.Enumerated; import javax.persistence.Enumerated;
import jakarta.persistence.FetchType; import javax.persistence.FetchType;
import jakarta.persistence.ForeignKey; import javax.persistence.ForeignKey;
import jakarta.persistence.JoinColumn; import javax.persistence.JoinColumn;
import jakarta.persistence.NamedAttributeNode; import javax.persistence.NamedAttributeNode;
import jakarta.persistence.NamedEntityGraph; import javax.persistence.NamedEntityGraph;
import jakarta.persistence.OneToOne; import javax.persistence.OneToOne;
import jakarta.persistence.Table; import javax.persistence.Table;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;

View File

@@ -3,9 +3,9 @@ package com.eshore.gringotts.web.domain.check.repository;
import com.eshore.gringotts.web.domain.base.repository.SimpleRepository; import com.eshore.gringotts.web.domain.base.repository.SimpleRepository;
import com.eshore.gringotts.web.domain.check.entity.CheckOrder; import com.eshore.gringotts.web.domain.check.entity.CheckOrder;
import com.eshore.gringotts.web.domain.user.entity.User; import com.eshore.gringotts.web.domain.user.entity.User;
import jakarta.transaction.Transactional;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import javax.transaction.Transactional;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.EntityGraph;

View File

@@ -2,26 +2,29 @@ package com.eshore.gringotts.web.domain.confirmation.entity;
import com.eshore.gringotts.core.Constants; import com.eshore.gringotts.core.Constants;
import com.eshore.gringotts.web.domain.base.entity.CheckingNeededEntity; import com.eshore.gringotts.web.domain.base.entity.CheckingNeededEntity;
import com.eshore.gringotts.web.domain.base.entity.LogicDeleteEntity;
import com.eshore.gringotts.web.domain.resource.entity.DataResource; import com.eshore.gringotts.web.domain.resource.entity.DataResource;
import com.eshore.gringotts.web.domain.upload.entity.DataFile; import com.eshore.gringotts.web.domain.upload.entity.DataFile;
import jakarta.persistence.CascadeType;
import jakarta.persistence.ConstraintMode;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.FetchType;
import jakarta.persistence.ForeignKey;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.JoinTable;
import jakarta.persistence.NamedAttributeNode;
import jakarta.persistence.NamedEntityGraph;
import jakarta.persistence.OneToMany;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import java.util.Set; import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.ConstraintMode;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.FetchType;
import javax.persistence.ForeignKey;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.NamedAttributeNode;
import javax.persistence.NamedEntityGraph;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import org.hibernate.annotations.DynamicUpdate; import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import org.springframework.data.jpa.domain.support.AuditingEntityListener; import org.springframework.data.jpa.domain.support.AuditingEntityListener;
/** /**
@@ -47,12 +50,16 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@NamedAttributeNode(value = "createdUser"), @NamedAttributeNode(value = "createdUser"),
@NamedAttributeNode(value = "modifiedUser"), @NamedAttributeNode(value = "modifiedUser"),
}) })
@SQLDelete(sql = "update " + Constants.TABLE_PREFIX + "confirmation" + " set deleted = true where id = ?")
@Where(clause = LogicDeleteEntity.LOGIC_DELETE_CLAUSE)
public class Confirmation extends CheckingNeededEntity { public class Confirmation extends CheckingNeededEntity {
@OneToOne(fetch = FetchType.EAGER) @OneToOne(fetch = FetchType.EAGER)
@JoinColumn(nullable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) @JoinColumn(nullable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
@Where(clause = LogicDeleteEntity.LOGIC_DELETE_CLAUSE)
private DataResource target; private DataResource target;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT), inverseForeignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) @JoinTable(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT), inverseForeignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
@ToString.Exclude @ToString.Exclude
@Where(clause = LogicDeleteEntity.LOGIC_DELETE_CLAUSE)
private Set<DataFile> evidences; private Set<DataFile> evidences;
} }

View File

@@ -3,9 +3,9 @@ package com.eshore.gringotts.web.domain.confirmation.repository;
import com.eshore.gringotts.web.domain.base.repository.SimpleRepository; import com.eshore.gringotts.web.domain.base.repository.SimpleRepository;
import com.eshore.gringotts.web.domain.confirmation.entity.Confirmation; import com.eshore.gringotts.web.domain.confirmation.entity.Confirmation;
import com.eshore.gringotts.web.domain.user.entity.User; import com.eshore.gringotts.web.domain.user.entity.User;
import jakarta.transaction.Transactional;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import javax.transaction.Transactional;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.EntityGraph;

View File

@@ -12,7 +12,7 @@ import com.eshore.gringotts.web.domain.user.entity.User;
import com.eshore.gringotts.web.domain.user.service.UserService; import com.eshore.gringotts.web.domain.user.service.UserService;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.transaction.Transactional; import javax.transaction.Transactional;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.eclipse.collections.api.factory.Maps; import org.eclipse.collections.api.factory.Maps;
import org.eclipse.collections.api.map.ImmutableMap; import org.eclipse.collections.api.map.ImmutableMap;

View File

@@ -7,24 +7,26 @@ import com.eshore.gringotts.web.domain.confirmation.entity.Confirmation;
import com.eshore.gringotts.web.domain.resource.entity.format.ResourceFormat; import com.eshore.gringotts.web.domain.resource.entity.format.ResourceFormat;
import com.eshore.gringotts.web.domain.resource.entity.type.ResourceType; import com.eshore.gringotts.web.domain.resource.entity.type.ResourceType;
import com.eshore.gringotts.web.domain.upload.entity.DataFile; import com.eshore.gringotts.web.domain.upload.entity.DataFile;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.ConstraintMode;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.FetchType;
import jakarta.persistence.ForeignKey;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.NamedAttributeNode;
import jakarta.persistence.NamedEntityGraph;
import jakarta.persistence.OneToMany;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import java.util.Set; import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.ConstraintMode;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.FetchType;
import javax.persistence.ForeignKey;
import javax.persistence.JoinColumn;
import javax.persistence.NamedAttributeNode;
import javax.persistence.NamedEntityGraph;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import org.hibernate.annotations.DynamicUpdate; import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import org.springframework.data.jpa.domain.support.AuditingEntityListener; import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@Getter @Getter
@@ -48,26 +50,33 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@NamedAttributeNode(value = "createdUser"), @NamedAttributeNode(value = "createdUser"),
@NamedAttributeNode(value = "modifiedUser"), @NamedAttributeNode(value = "modifiedUser"),
}) })
@SQLDelete(sql = "update " + Constants.TABLE_PREFIX + "data_resource" + " set deleted = true where id = ?")
@Where(clause = LogicDeleteEntity.LOGIC_DELETE_CLAUSE)
public class DataResource extends LogicDeleteEntity { public class DataResource extends LogicDeleteEntity {
@Column(nullable = false) @Column(nullable = false)
private String name; private String name;
private String description; private String description;
@OneToOne(cascade = CascadeType.REMOVE) @OneToOne(cascade = CascadeType.REMOVE, fetch = FetchType.LAZY)
@JoinColumn(nullable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) @JoinColumn(nullable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
@ToString.Exclude @ToString.Exclude
@Where(clause = LogicDeleteEntity.LOGIC_DELETE_CLAUSE)
private ResourceType type; private ResourceType type;
@OneToOne(cascade = CascadeType.REMOVE) @OneToOne(cascade = CascadeType.REMOVE, fetch = FetchType.LAZY)
@JoinColumn(nullable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) @JoinColumn(nullable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
@ToString.Exclude @ToString.Exclude
@Where(clause = LogicDeleteEntity.LOGIC_DELETE_CLAUSE)
private ResourceFormat format; private ResourceFormat format;
@OneToOne(cascade = CascadeType.REMOVE) @OneToOne(fetch = FetchType.LAZY)
@JoinColumn(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) @JoinColumn(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
@ToString.Exclude @ToString.Exclude
@Where(clause = LogicDeleteEntity.LOGIC_DELETE_CLAUSE)
private DataFile example; private DataFile example;
@OneToOne(cascade = CascadeType.REMOVE, fetch = FetchType.EAGER, mappedBy = "target") @OneToOne(cascade = CascadeType.REMOVE, fetch = FetchType.EAGER, mappedBy = "target")
@ToString.Exclude @ToString.Exclude
@Where(clause = LogicDeleteEntity.LOGIC_DELETE_CLAUSE)
private Confirmation confirmation; private Confirmation confirmation;
@OneToMany(cascade = CascadeType.REMOVE, fetch = FetchType.EAGER, mappedBy = "target") @OneToMany(cascade = CascadeType.REMOVE, fetch = FetchType.EAGER, mappedBy = "target")
@ToString.Exclude @ToString.Exclude
@Where(clause = LogicDeleteEntity.LOGIC_DELETE_CLAUSE)
private Set<Authentication> authentications; private Set<Authentication> authentications;
} }

View File

@@ -1,12 +1,16 @@
package com.eshore.gringotts.web.domain.resource.entity.format; package com.eshore.gringotts.web.domain.resource.entity.format;
import jakarta.persistence.DiscriminatorValue; import com.eshore.gringotts.core.Constants;
import jakarta.persistence.Entity; import com.eshore.gringotts.web.domain.base.entity.LogicDeleteIdOnlyEntity;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
/** /**
* CSV格式 * CSV格式
@@ -21,6 +25,8 @@ import lombok.ToString;
@NoArgsConstructor @NoArgsConstructor
@Entity @Entity
@DiscriminatorValue("CSV") @DiscriminatorValue("CSV")
@SQLDelete(sql = "update " + Constants.TABLE_PREFIX + "resource_format" + " set deleted = true where id = ?")
@Where(clause = LogicDeleteIdOnlyEntity.LOGIC_DELETE_CLAUSE)
public class CsvResourceFormat extends ResourceFormat { public class CsvResourceFormat extends ResourceFormat {
private String schema; private String schema;

View File

@@ -1,12 +1,16 @@
package com.eshore.gringotts.web.domain.resource.entity.format; package com.eshore.gringotts.web.domain.resource.entity.format;
import jakarta.persistence.DiscriminatorValue; import com.eshore.gringotts.core.Constants;
import jakarta.persistence.Entity; import com.eshore.gringotts.web.domain.base.entity.LogicDeleteIdOnlyEntity;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
/** /**
* JSON line格式 * JSON line格式
@@ -21,6 +25,8 @@ import lombok.ToString;
@NoArgsConstructor @NoArgsConstructor
@Entity @Entity
@DiscriminatorValue("JSON_LINE") @DiscriminatorValue("JSON_LINE")
@SQLDelete(sql = "update " + Constants.TABLE_PREFIX + "resource_format" + " set deleted = true where id = ?")
@Where(clause = LogicDeleteIdOnlyEntity.LOGIC_DELETE_CLAUSE)
public class JsonLineResourceFormat extends ResourceFormat { public class JsonLineResourceFormat extends ResourceFormat {
private String schema; private String schema;

View File

@@ -1,12 +1,16 @@
package com.eshore.gringotts.web.domain.resource.entity.format; package com.eshore.gringotts.web.domain.resource.entity.format;
import jakarta.persistence.DiscriminatorValue; import com.eshore.gringotts.core.Constants;
import jakarta.persistence.Entity; import com.eshore.gringotts.web.domain.base.entity.LogicDeleteIdOnlyEntity;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
/** /**
* 一个文件就是一个JSON * 一个文件就是一个JSON
@@ -21,6 +25,8 @@ import lombok.ToString;
@NoArgsConstructor @NoArgsConstructor
@Entity @Entity
@DiscriminatorValue("JSON") @DiscriminatorValue("JSON")
@SQLDelete(sql = "update " + Constants.TABLE_PREFIX + "resource_format" + " set deleted = true where id = ?")
@Where(clause = LogicDeleteIdOnlyEntity.LOGIC_DELETE_CLAUSE)
public class JsonResourceFormat extends ResourceFormat { public class JsonResourceFormat extends ResourceFormat {
private String schema; private String schema;

View File

@@ -1,10 +1,14 @@
package com.eshore.gringotts.web.domain.resource.entity.format; package com.eshore.gringotts.web.domain.resource.entity.format;
import jakarta.persistence.DiscriminatorValue; import com.eshore.gringotts.core.Constants;
import jakarta.persistence.Entity; import com.eshore.gringotts.web.domain.base.entity.LogicDeleteIdOnlyEntity;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
/** /**
* 无格式,文件每行就是一份数据 * 无格式,文件每行就是一份数据
@@ -17,6 +21,8 @@ import lombok.ToString;
@ToString @ToString
@Entity @Entity
@DiscriminatorValue("LINE") @DiscriminatorValue("LINE")
@SQLDelete(sql = "update " + Constants.TABLE_PREFIX + "resource_format" + " set deleted = true where id = ?")
@Where(clause = LogicDeleteIdOnlyEntity.LOGIC_DELETE_CLAUSE)
public class LineResourceFormat extends ResourceFormat { public class LineResourceFormat extends ResourceFormat {
@Override @Override
public Type getFormatType() { public Type getFormatType() {

View File

@@ -1,10 +1,14 @@
package com.eshore.gringotts.web.domain.resource.entity.format; package com.eshore.gringotts.web.domain.resource.entity.format;
import jakarta.persistence.DiscriminatorValue; import com.eshore.gringotts.core.Constants;
import jakarta.persistence.Entity; import com.eshore.gringotts.web.domain.base.entity.LogicDeleteIdOnlyEntity;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
/** /**
* 无格式,整个文件就是一份数据 * 无格式,整个文件就是一份数据
@@ -17,6 +21,8 @@ import lombok.ToString;
@ToString @ToString
@Entity @Entity
@DiscriminatorValue("NONE") @DiscriminatorValue("NONE")
@SQLDelete(sql = "update " + Constants.TABLE_PREFIX + "resource_format" + " set deleted = true where id = ?")
@Where(clause = LogicDeleteIdOnlyEntity.LOGIC_DELETE_CLAUSE)
public class NoneResourceFormat extends ResourceFormat { public class NoneResourceFormat extends ResourceFormat {
@Override @Override
public Type getFormatType() { public Type getFormatType() {

View File

@@ -2,13 +2,15 @@ package com.eshore.gringotts.web.domain.resource.entity.format;
import com.eshore.gringotts.core.Constants; import com.eshore.gringotts.core.Constants;
import com.eshore.gringotts.web.domain.base.entity.LogicDeleteIdOnlyEntity; import com.eshore.gringotts.web.domain.base.entity.LogicDeleteIdOnlyEntity;
import jakarta.persistence.Entity; import javax.persistence.Entity;
import jakarta.persistence.Inheritance; import javax.persistence.Inheritance;
import jakarta.persistence.InheritanceType; import javax.persistence.InheritanceType;
import jakarta.persistence.Table; import javax.persistence.Table;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
/** /**
* 资源格式 * 资源格式
@@ -22,6 +24,8 @@ import lombok.ToString;
@Entity @Entity
@Table(name = Constants.TABLE_PREFIX + "resource_format") @Table(name = Constants.TABLE_PREFIX + "resource_format")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@SQLDelete(sql = "update " + Constants.TABLE_PREFIX + "resource_format" + " set deleted = true where id = ?")
@Where(clause = LogicDeleteIdOnlyEntity.LOGIC_DELETE_CLAUSE)
public abstract class ResourceFormat extends LogicDeleteIdOnlyEntity { public abstract class ResourceFormat extends LogicDeleteIdOnlyEntity {
public enum Type { public enum Type {
NONE, NONE,

View File

@@ -1,14 +1,17 @@
package com.eshore.gringotts.web.domain.resource.entity.type; package com.eshore.gringotts.web.domain.resource.entity.type;
import com.eshore.gringotts.core.Constants; import com.eshore.gringotts.core.Constants;
import jakarta.persistence.Column; import com.eshore.gringotts.web.domain.base.entity.LogicDeleteIdOnlyEntity;
import jakarta.persistence.Entity; import javax.persistence.Column;
import jakarta.persistence.Table; import javax.persistence.Entity;
import javax.persistence.Table;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
@Getter @Getter
@Setter @Setter
@@ -17,6 +20,8 @@ import lombok.ToString;
@NoArgsConstructor @NoArgsConstructor
@Entity @Entity
@Table(name = Constants.TABLE_PREFIX + "resource_type_api") @Table(name = Constants.TABLE_PREFIX + "resource_type_api")
@SQLDelete(sql = "update " + Constants.TABLE_PREFIX + "resource_type_api" + " set deleted = true where id = ?")
@Where(clause = LogicDeleteIdOnlyEntity.LOGIC_DELETE_CLAUSE)
public class ApiResourceType extends ResourceType { public class ApiResourceType extends ResourceType {
@Column(nullable = false) @Column(nullable = false)
private String url; private String url;

View File

@@ -1,16 +1,19 @@
package com.eshore.gringotts.web.domain.resource.entity.type; package com.eshore.gringotts.web.domain.resource.entity.type;
import com.eshore.gringotts.core.Constants; import com.eshore.gringotts.core.Constants;
import jakarta.persistence.Column; import com.eshore.gringotts.web.domain.base.entity.LogicDeleteIdOnlyEntity;
import jakarta.persistence.Entity; import javax.persistence.Column;
import jakarta.persistence.EnumType; import javax.persistence.Entity;
import jakarta.persistence.Enumerated; import javax.persistence.EnumType;
import jakarta.persistence.Table; import javax.persistence.Enumerated;
import javax.persistence.Table;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
@Getter @Getter
@Setter @Setter
@@ -19,6 +22,8 @@ import lombok.ToString;
@NoArgsConstructor @NoArgsConstructor
@Entity @Entity
@Table(name = Constants.TABLE_PREFIX + "resource_type_database") @Table(name = Constants.TABLE_PREFIX + "resource_type_database")
@SQLDelete(sql = "update " + Constants.TABLE_PREFIX + "resource_type_database" + " set deleted = true where id = ?")
@Where(clause = LogicDeleteIdOnlyEntity.LOGIC_DELETE_CLAUSE)
public class DatabaseResourceType extends ResourceType { public class DatabaseResourceType extends ResourceType {
@Column(nullable = false) @Column(nullable = false)
private String jdbc; private String jdbc;

View File

@@ -1,18 +1,21 @@
package com.eshore.gringotts.web.domain.resource.entity.type; package com.eshore.gringotts.web.domain.resource.entity.type;
import com.eshore.gringotts.core.Constants; import com.eshore.gringotts.core.Constants;
import com.eshore.gringotts.web.domain.base.entity.LogicDeleteIdOnlyEntity;
import com.eshore.gringotts.web.domain.upload.entity.DataFile; import com.eshore.gringotts.web.domain.upload.entity.DataFile;
import jakarta.persistence.ConstraintMode; import javax.persistence.ConstraintMode;
import jakarta.persistence.Entity; import javax.persistence.Entity;
import jakarta.persistence.ForeignKey; import javax.persistence.ForeignKey;
import jakarta.persistence.JoinColumn; import javax.persistence.JoinColumn;
import jakarta.persistence.OneToOne; import javax.persistence.OneToOne;
import jakarta.persistence.Table; import javax.persistence.Table;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
@Getter @Getter
@Setter @Setter
@@ -21,6 +24,8 @@ import lombok.ToString;
@NoArgsConstructor @NoArgsConstructor
@Entity @Entity
@Table(name = Constants.TABLE_PREFIX + "resource_type_file") @Table(name = Constants.TABLE_PREFIX + "resource_type_file")
@SQLDelete(sql = "update " + Constants.TABLE_PREFIX + "resource_type_file" + " set deleted = true where id = ?")
@Where(clause = LogicDeleteIdOnlyEntity.LOGIC_DELETE_CLAUSE)
public class FileResourceType extends ResourceType { public class FileResourceType extends ResourceType {
@OneToOne @OneToOne
@JoinColumn(nullable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) @JoinColumn(nullable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))

View File

@@ -1,14 +1,17 @@
package com.eshore.gringotts.web.domain.resource.entity.type; package com.eshore.gringotts.web.domain.resource.entity.type;
import com.eshore.gringotts.core.Constants; import com.eshore.gringotts.core.Constants;
import jakarta.persistence.Column; import com.eshore.gringotts.web.domain.base.entity.LogicDeleteIdOnlyEntity;
import jakarta.persistence.Entity; import javax.persistence.Column;
import jakarta.persistence.Table; import javax.persistence.Entity;
import javax.persistence.Table;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
@Getter @Getter
@Setter @Setter
@@ -17,6 +20,8 @@ import lombok.ToString;
@NoArgsConstructor @NoArgsConstructor
@Entity @Entity
@Table(name = Constants.TABLE_PREFIX + "resource_type_ftp") @Table(name = Constants.TABLE_PREFIX + "resource_type_ftp")
@SQLDelete(sql = "update " + Constants.TABLE_PREFIX + "resource_type_ftp" + " set deleted = true where id = ?")
@Where(clause = LogicDeleteIdOnlyEntity.LOGIC_DELETE_CLAUSE)
public class FtpResourceType extends ResourceType { public class FtpResourceType extends ResourceType {
@Column(nullable = false) @Column(nullable = false)
private String url; private String url;

View File

@@ -1,18 +1,21 @@
package com.eshore.gringotts.web.domain.resource.entity.type; package com.eshore.gringotts.web.domain.resource.entity.type;
import com.eshore.gringotts.core.Constants; import com.eshore.gringotts.core.Constants;
import com.eshore.gringotts.web.domain.base.entity.LogicDeleteIdOnlyEntity;
import com.eshore.gringotts.web.domain.upload.entity.DataFile; import com.eshore.gringotts.web.domain.upload.entity.DataFile;
import jakarta.persistence.ConstraintMode; import javax.persistence.ConstraintMode;
import jakarta.persistence.Entity; import javax.persistence.Entity;
import jakarta.persistence.ForeignKey; import javax.persistence.ForeignKey;
import jakarta.persistence.JoinColumn; import javax.persistence.JoinColumn;
import jakarta.persistence.OneToOne; import javax.persistence.OneToOne;
import jakarta.persistence.Table; import javax.persistence.Table;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
@Getter @Getter
@Setter @Setter
@@ -21,6 +24,8 @@ import lombok.ToString;
@NoArgsConstructor @NoArgsConstructor
@Entity @Entity
@Table(name = Constants.TABLE_PREFIX + "resource_type_hdfs") @Table(name = Constants.TABLE_PREFIX + "resource_type_hdfs")
@SQLDelete(sql = "update " + Constants.TABLE_PREFIX + "resource_type_hdfs" + " set deleted = true where id = ?")
@Where(clause = LogicDeleteIdOnlyEntity.LOGIC_DELETE_CLAUSE)
public class HDFSResourceType extends ResourceType { public class HDFSResourceType extends ResourceType {
@OneToOne @OneToOne
@JoinColumn(nullable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) @JoinColumn(nullable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))

View File

@@ -2,13 +2,15 @@ package com.eshore.gringotts.web.domain.resource.entity.type;
import com.eshore.gringotts.core.Constants; import com.eshore.gringotts.core.Constants;
import com.eshore.gringotts.web.domain.base.entity.LogicDeleteIdOnlyEntity; import com.eshore.gringotts.web.domain.base.entity.LogicDeleteIdOnlyEntity;
import jakarta.persistence.Entity; import javax.persistence.Entity;
import jakarta.persistence.Inheritance; import javax.persistence.Inheritance;
import jakarta.persistence.InheritanceType; import javax.persistence.InheritanceType;
import jakarta.persistence.Table; import javax.persistence.Table;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
/** /**
* 资源类型 * 资源类型
@@ -22,6 +24,8 @@ import lombok.ToString;
@Entity @Entity
@Table(name = Constants.TABLE_PREFIX + "resource_type") @Table(name = Constants.TABLE_PREFIX + "resource_type")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@SQLDelete(sql = "update " + Constants.TABLE_PREFIX + "resource_type" + " set deleted = true where id = ?")
@Where(clause = LogicDeleteIdOnlyEntity.LOGIC_DELETE_CLAUSE)
public abstract class ResourceType extends LogicDeleteIdOnlyEntity { public abstract class ResourceType extends LogicDeleteIdOnlyEntity {
public abstract Type getResourceType(); public abstract Type getResourceType();

View File

@@ -2,12 +2,14 @@ package com.eshore.gringotts.web.domain.upload.entity;
import com.eshore.gringotts.core.Constants; import com.eshore.gringotts.core.Constants;
import com.eshore.gringotts.web.domain.base.entity.LogicDeleteEntity; import com.eshore.gringotts.web.domain.base.entity.LogicDeleteEntity;
import jakarta.persistence.Entity; import javax.persistence.Entity;
import jakarta.persistence.Table; import javax.persistence.Table;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import org.hibernate.annotations.DynamicUpdate; import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
/** /**
* 上传文件 * 上传文件
@@ -21,6 +23,8 @@ import org.hibernate.annotations.DynamicUpdate;
@Entity @Entity
@DynamicUpdate @DynamicUpdate
@Table(name = Constants.TABLE_PREFIX + "data_file") @Table(name = Constants.TABLE_PREFIX + "data_file")
@SQLDelete(sql = "update " + Constants.TABLE_PREFIX + "data_file" + " set deleted = true where id = ?")
@Where(clause = LogicDeleteEntity.LOGIC_DELETE_CLAUSE)
public class DataFile extends LogicDeleteEntity { public class DataFile extends LogicDeleteEntity {
private String filename; private String filename;
private Long size; private Long size;

View File

@@ -2,19 +2,19 @@ package com.eshore.gringotts.web.domain.user.entity;
import com.eshore.gringotts.core.Constants; import com.eshore.gringotts.core.Constants;
import com.eshore.gringotts.web.domain.base.entity.SimpleEntity; import com.eshore.gringotts.web.domain.base.entity.SimpleEntity;
import jakarta.persistence.Column;
import jakarta.persistence.ConstraintMode;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.ForeignKey;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.NamedAttributeNode;
import jakarta.persistence.NamedEntityGraph;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import javax.persistence.Column;
import javax.persistence.ConstraintMode;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.ForeignKey;
import javax.persistence.JoinColumn;
import javax.persistence.NamedAttributeNode;
import javax.persistence.NamedEntityGraph;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;

14
pom.xml
View File

@@ -19,12 +19,12 @@
</modules> </modules>
<properties> <properties>
<maven.compiler.source>17</maven.compiler.source> <maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target> <maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-boot.version>3.2.1</spring-boot.version> <spring-boot.version>2.6.15</spring-boot.version>
<spring-cloud.version>2023.0.4</spring-cloud.version> <spring-cloud.version>2021.0.9</spring-cloud.version>
<hutool.version>5.8.32</hutool.version> <hutool.version>5.8.32</hutool.version>
<fisco.sdk.version>2.10.0</fisco.sdk.version> <fisco.sdk.version>2.10.0</fisco.sdk.version>
@@ -75,7 +75,7 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.dtflys.forest</groupId> <groupId>com.dtflys.forest</groupId>
<artifactId>forest-spring-boot3-starter</artifactId> <artifactId>forest-spring-boot-starter</artifactId>
<version>1.5.36</version> <version>1.5.36</version>
</dependency> </dependency>
<dependency> <dependency>
@@ -95,13 +95,13 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot3-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.39.0</version> <version>1.39.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.blinkfox</groupId> <groupId>com.blinkfox</groupId>
<artifactId>fenix-spring-boot-starter</artifactId> <artifactId>fenix-spring-boot-starter</artifactId>
<version>3.0.0</version> <version>2.7.0</version>
</dependency> </dependency>
<!-- Others --> <!-- Others -->