Files
contract-manager/client/src/main/java/com/ecep/contract/util/AbstractConfigBounder.java
songqq effd7b103c feat: 新增多个服务类及工具类,重构部分代码结构
重构服务类结构,将分散的服务统一整合到service包下
新增ProjectConstant常量类及多个实体服务类
添加SecurityUtils安全工具类和BeanCacher工具类
优化部分UI控件和转换器的实现
2025-09-06 13:43:52 +08:00

129 lines
3.9 KiB
Java

package com.ecep.contract.util;
import java.time.LocalDateTime;
import java.util.concurrent.CompletableFuture;
import com.ecep.contract.Desktop;
import com.ecep.contract.SpringApp;
import com.ecep.contract.model.SysConf;
import com.ecep.contract.service.SysConfService;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.Control;
import lombok.Getter;
import lombok.Setter;
public abstract class AbstractConfigBounder<T> implements ConfigBounder {
@Setter
private SysConfService confService;
String key;
SysConf conf;
@Getter
@Setter
Control control;
@Getter
@Setter
javafx.util.StringConverter<T> converter;
@Setter
Property<T> property;
ObjectProperty<LocalDateTime> modified = new SimpleObjectProperty<>(this, "modified");
ObjectProperty<LocalDateTime> created = new SimpleObjectProperty<>(this, "created");
public AbstractConfigBounder(String key) {
this.key = key;
}
@Override
public CompletableFuture<Void> runAsync(Runnable runnable) {
return CompletableFuture.runAsync(runnable, Desktop.instance.getExecutorService()).exceptionally(ex -> {
ex.printStackTrace();
return null;
});
}
@Override
public SysConfService getConfService() {
if (confService == null) {
confService = SpringApp.getBean(SysConfService.class);
}
return confService;
}
@Override
public void initialize() {
getControl().setDisable(true);
runAsync(this::asyncHandle);
}
protected void asyncHandle() {
conf = getConfService().findById(key);
if (conf == null) {
conf = new SysConf();
conf.setId(key);
conf.setCreated(LocalDateTime.now());
conf.setModified(LocalDateTime.now());
conf = getConfService().save(conf);
}
Property<T> property = getProperty();
property.addListener(this::propertyChanged);
bindBidirectional(property);
modified.set(conf.getModified());
created.set(conf.getCreated());
getControl().setDisable(false);
}
public Property<T> getProperty() {
if (property == null) {
T value = getConverter().fromString(conf.getValue());
property = createProperty(value);
setProperty(property);
}
return property;
}
public ObjectProperty<LocalDateTime> getModifiedProperty() {
return modified;
}
public ObjectProperty<LocalDateTime> getCreatedProperty() {
return created;
}
@SuppressWarnings("unchecked")
protected Property<T> createProperty(T value) {
if (value instanceof Boolean b) {
return (Property<T>) new SimpleBooleanProperty(b);
} else if (value instanceof Integer i) {
return (Property<T>) new SimpleIntegerProperty(i);
} else if (value instanceof Double d) {
return (Property<T>) new SimpleDoubleProperty(d);
} else if (value instanceof String s) {
return (Property<T>) new SimpleStringProperty(s);
}
return new SimpleObjectProperty<>(value);
}
abstract void bindBidirectional(Property<T> property);
void propertyChanged(ObservableValue<? extends T> observable, T oldValue,
T newValue) {
conf.setValue(getConverter().toString(newValue));
conf.setModified(LocalDateTime.now());
save();
}
public void save() {
SysConf saved = getConfService().save(conf);
modified.set(saved.getModified());
created.set(saved.getCreated());
}
}