zhaohe 1 year ago
parent
commit
2587627925
  1. 2
      pom.xml
  2. 18
      src/main/java/a8k/MyApplicationRunner.java
  3. 23
      src/main/java/a8k/controler/AppController.java
  4. 69
      src/main/java/a8k/controler/engineer/EngineerPageControler.java
  5. 20
      src/main/java/a8k/service/usermgr/AppUserMgrService.java
  6. 10
      src/main/java/a8k/utils/AppService.java
  7. 9
      src/main/java/a8k/utils/AppServiceAction.java
  8. 69
      src/main/java/a8k/utils/AppServiceManager.java

2
pom.xml

@ -10,7 +10,7 @@
</parent>
<groupId>com.iflytop</groupId>
<artifactId>a800</artifactId>
<version>0.0.26</version>
<version>0.0.27</version>
<name>boditech-a800</name>
<description>boditech-a800</description>
<properties>

18
src/main/java/a8k/MyApplicationRunner.java

@ -0,0 +1,18 @@
package a8k;
import a8k.utils.AppServiceManager;
import jakarta.annotation.Resource;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Order(1)
@Component
public class MyApplicationRunner implements ApplicationRunner {
@Resource
private AppServiceManager appServiceManager;
@Override
public void run(ApplicationArguments args) throws Exception {
this.appServiceManager.loadActions();
}
}

23
src/main/java/a8k/controler/AppController.java

@ -0,0 +1,23 @@
package a8k.controler;
import a8k.appbase.appret.AppRet;
import a8k.utils.AppServiceManager;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.Map;
@Controller
public class AppController {
@Resource
private AppServiceManager appServiceManager;
@PostMapping("/api/app/execute-action")
@ResponseBody
public AppRet<Object> executeAction( @RequestBody Map<String, Object> params ) throws Exception {
String action = (String) params.get("name");
Map<String, Object> actionParams = (Map<String, Object>) params.get("params");
var result = this.appServiceManager.executeAction(action, actionParams);
return result instanceof AppRet ? (AppRet)result : AppRet.success(result);
}
}

69
src/main/java/a8k/controler/engineer/EngineerPageControler.java

@ -266,6 +266,65 @@ public class EngineerPageControler {
}
}
return this.executeServiceActionAndGetResponse(service, method, actionParams);
}
@PostMapping("/api/service-config/service-action-exec-by-map")
@ResponseBody
public AppRet<Object> serviceActionExecuteByMap( @RequestBody Map<String, Object> params ) throws Throwable {
String serviceKey = (String)params.get("serviceKey");
var service = this.getServiceInstanceByServiceKey(serviceKey);
assert service != null;
var actionName = (String)params.get("action");
var actionParams = (Map<String, Object>)params.get("params");
List<Object> actionParamList = new ArrayList<>();
Method method = null;
for ( var methodItem : service.getClass().getMethods() ) {
if ( !methodItem.getName().equals(actionName) ) {
continue ;
}
if ( methodItem.getParameterTypes().length != actionParams.size() ) {
continue ;
}
if ( !methodItem.isAnnotationPresent(EnginnerPageAction.class)) {
continue;
}
actionParamList.clear();
for ( var paramItem : methodItem.getParameters() ) {
var name = paramItem.getName();
Object value = actionParams.get(name);
if ( paramItem.getType().isEnum() ) {
var methodValueOf = paramItem.getType().getMethod("valueOf", String.class);
value = methodValueOf.invoke(null, (String)value);
} else if ( paramItem.getType().equals(EnginnerParamFile.class) ) {
value = EnginnerParamFile.fromBase64((String)value);
}
if ( !paramItem.getType().isAssignableFrom(value.getClass()) ) {
continue ;
}
actionParamList.add(value);
}
method = methodItem;
break;
}
assert method != null;
return this.executeServiceActionAndGetResponse(service, method, actionParamList);
}
@PostMapping("/api/service-config/class-struct-info-get")
@ResponseBody
public AppRet<Object> classStructInfoGet( @RequestBody Map<String, Object> params ) throws Exception {
String className = (String)params.get("class");
Class<?> clazz = Class.forName(className);
List<Map<String,Object>> struct = new ArrayList<>();
this.classStructInfoFill(clazz, struct);
return AppRet.success(struct);
}
// execute service action and get response
private AppRet<Object> executeServiceActionAndGetResponse( Object service, Method method, List<Object> actionParams) throws Throwable {
Object actionResult = null;
try {
var actionParamList = actionParams.toArray();
@ -292,16 +351,6 @@ public class EngineerPageControler {
return AppRet.success(actionResult);
}
@PostMapping("/api/service-config/class-struct-info-get")
@ResponseBody
public AppRet<Object> classStructInfoGet( @RequestBody Map<String, Object> params ) throws Exception {
String className = (String)params.get("class");
Class<?> clazz = Class.forName(className);
List<Map<String,Object>> struct = new ArrayList<>();
this.classStructInfoFill(clazz, struct);
return AppRet.success(struct);
}
// get service instance by service key
private Object getServiceInstanceByServiceKey( String serviceKey ) {
Class<?> serviceClass = null;

20
src/main/java/a8k/service/usermgr/AppUserMgrService.java

@ -1,8 +1,13 @@
package a8k.service.usermgr;
import a8k.appbase.appret.AppRet;
import a8k.controler.engineer.utils.EngineerPageTab;
import a8k.controler.engineer.utils.EnginnerPageAction;
import a8k.controler.engineer.utils.EnginnerPageParam;
import a8k.db.AppUser;
import a8k.service.hardware.canbus.protocol.A8kEcode;
import a8k.utils.AppService;
import a8k.utils.AppServiceAction;
import com.iflytop.uf.UfActiveRecord;
import jakarta.annotation.PostConstruct;
import org.slf4j.Logger;
@ -13,6 +18,7 @@ import java.util.Map;
@Component
@EngineerPageTab(name = "用户管理")
public class AppUserMgrService {
static Logger logger = org.slf4j.LoggerFactory.getLogger(AppUserMgrService.class);
@ -45,6 +51,7 @@ public class AppUserMgrService {
// EXT FUNC
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@EnginnerPageAction(name = "用户登录")
public AppRet<AppUser> login(String account, String password) {
var user = dbGetUser(account);
if (user == null) {
@ -61,11 +68,18 @@ public class AppUserMgrService {
return AppRet.success(loginUsr);
}
@EnginnerPageAction(name = "用户列表")
public AppRet<List<AppUser>> list() {
return AppRet.success(dbGetUserList());
}
@EnginnerPageAction(name = "登录用户列表")
public AppRet<List<AppUser>> loginList() {
return AppRet.success(dbGetUserList());
}
public AppRet<AppUser> addUser(String account, String password, int isAdmin) {
@EnginnerPageAction(name = "用户添加")
public AppRet<AppUser> addUser(String account, String password, Integer isAdmin) {
if (dbGetUser(account) != null) {
return AppRet.fail(A8kEcode.UsrExistError);
}
@ -77,6 +91,7 @@ public class AppUserMgrService {
return AppRet.success(user);
}
@EnginnerPageAction(name = "用户删除")
public AppRet<AppUser> delUser(String account) {
var user = dbGetUser(account);
if (user == null) {
@ -89,7 +104,8 @@ public class AppUserMgrService {
return AppRet.success(user);
}
public AppRet<AppUser> modifyUser(String account, String password, int isAdmin) {
@EnginnerPageAction(name = "用户变更")
public AppRet<AppUser> modifyUser(String account, String password, Integer isAdmin) {
var user = dbGetUser(account);
if (user == null) {
return AppRet.fail(A8kEcode.UsrNotExitError);

10
src/main/java/a8k/utils/AppService.java

@ -0,0 +1,10 @@
package a8k.utils;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface AppService {
String name();
}

9
src/main/java/a8k/utils/AppServiceAction.java

@ -0,0 +1,9 @@
package a8k.utils;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface AppServiceAction {
}

69
src/main/java/a8k/utils/AppServiceManager.java

@ -0,0 +1,69 @@
package a8k.utils;
import com.iflytop.uf.UfApplication;
import com.iflytop.uf.util.UfClassHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
@Component
public class AppServiceManager {
public static final Logger LOG = LoggerFactory.getLogger(AppServiceManager.class);
// actions
public Map<String, Method> actions;
// services
public Map<Method, Class<?>> actionServices;
// load actions
public void loadActions() throws Exception {
this.actions = new HashMap<String, Method>();
this.actionServices = new HashMap<Method, Class<?>>();
var classList = UfClassHelper.getAllClassesInPackage("a8k");
for (var clazz : classList) {
var serviceAnnotation = clazz.getAnnotation(AppService.class);
if (serviceAnnotation == null) {
continue ;
}
var methods = clazz.getMethods();
for (var method : methods) {
if (!method.isAnnotationPresent(AppServiceAction.class)) {
continue ;
}
String actionKey = String.format("%s.%s", serviceAnnotation.name(), method.getName());
if (this.actions.containsKey(actionKey)) {
throw new Exception(String.format("重复action '%s'", actionKey));
}
this.actions.put(actionKey, method);
this.actionServices.put(method, clazz);
LOG.info("load app action : {}", actionKey);
}
}
}
// execute action
public Object executeAction(String action, Map<String, Object> params) throws Exception {
var method = actions.get(action);
if (method == null) {
throw new Exception("不存在");
}
var actionParamDefs = method.getParameters();
Object[] args = new Object[actionParamDefs.length];
for ( var i=0; i<actionParamDefs.length; i++ ) {
var name = actionParamDefs[i].getName();
var value = params.get(name);
args[i] = value;
}
var serviceClass = this.actionServices.get(method);
var service = UfApplication.getContext().getBean(serviceClass);
if ( method.getReturnType().equals(Void.TYPE)) {
method.invoke(service, args);
return null;
} else {
return method.invoke(service, args);
}
}
}
Loading…
Cancel
Save