+ 系统 配置简介:对纠察图的 所属应用 进行分组。
+ 因为边配置和节点配置是需要应用隔离的,因此需要维护一份数据,而在SDK或者HTTP写入的数据中,SystemKey就是应用的唯一标识。可以相关相互关联。
+
边配置简介: 对纠察图的 节点之间的边 进行配置。
边函数配置简介: 对纠察图的 节点之间的边函数 进行配置。
diff --git a/views/src/main/resources/vueboot/src/views/login/index.vue b/views/src/main/resources/vueboot/src/views/login/index.vue
index 259064059442806a74c841ec1faa246334484b07..ab4952a17305371d52bb1eef5c4a2d6a85621874 100644
--- a/views/src/main/resources/vueboot/src/views/login/index.vue
+++ b/views/src/main/resources/vueboot/src/views/login/index.vue
@@ -155,13 +155,15 @@ export default {
handleLogin() {
this.$refs.loginForm.validate(valid => {
if (valid) {
+ debugger
this.loading = true
this.$store.dispatch('user/login', this.loginForm)
.then(() => {
this.$router.push({ path: this.redirect || '/', query: this.otherQuery })
this.loading = false
})
- .catch(() => {
+ .catch((e) => {
+ console.log(e)
this.loading = false
})
} else {
diff --git a/views/src/main/resources/vueboot/src/views/permission/components/SwitchRoles.vue b/views/src/main/resources/vueboot/src/views/permission/components/SwitchRoles.vue
deleted file mode 100644
index 9fabbe19e58dc6a6a4c013786b6035af8fc2b51d..0000000000000000000000000000000000000000
--- a/views/src/main/resources/vueboot/src/views/permission/components/SwitchRoles.vue
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
- Your roles: {{ roles }}
-
- Switch roles:
-
-
-
-
-
-
-
-
diff --git a/views/src/main/resources/vueboot/src/views/permission/directive.vue b/views/src/main/resources/vueboot/src/views/permission/directive.vue
deleted file mode 100644
index 4a497928f1b3daf32023391c1d0f60f3da008e90..0000000000000000000000000000000000000000
--- a/views/src/main/resources/vueboot/src/views/permission/directive.vue
+++ /dev/null
@@ -1,111 +0,0 @@
-
-
-
-
-
-
- Only
- admin can see this
-
-
- v-permission="['admin']"
-
-
-
-
-
- Only
- editor can see this
-
-
- v-permission="['editor']"
-
-
-
-
-
- Both
- admin and
- editor can see this
-
-
- v-permission="['admin','editor']"
-
-
-
-
-
-
- In some cases, using v-permission will have no effect. For example: Element-UI's Tab component or el-table-column and other scenes that dynamically render dom. You can only do this with v-if.
- e.g.
-
-
-
-
- Admin can see this
-
- v-if="checkPermission(['admin'])"
-
-
-
-
- Editor can see this
-
- v-if="checkPermission(['editor'])"
-
-
-
-
- Both admin or editor can see this
-
- v-if="checkPermission(['admin','editor'])"
-
-
-
-
-
-
-
-
-
-
-
diff --git a/views/src/main/resources/vueboot/src/views/permission/page.vue b/views/src/main/resources/vueboot/src/views/permission/page.vue
deleted file mode 100644
index 5291a78294e9a91675a01f006fa86add8f22fa62..0000000000000000000000000000000000000000
--- a/views/src/main/resources/vueboot/src/views/permission/page.vue
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
diff --git a/views/src/main/resources/vueboot/src/views/permission/role.vue b/views/src/main/resources/vueboot/src/views/permission/role.vue
deleted file mode 100644
index cd7ecd4cb695ecdb5f48b0a2cfe8ebc5e0c2dca0..0000000000000000000000000000000000000000
--- a/views/src/main/resources/vueboot/src/views/permission/role.vue
+++ /dev/null
@@ -1,270 +0,0 @@
-
-
-
New Role
-
-
-
-
- {{ scope.row.key }}
-
-
-
-
- {{ scope.row.name }}
-
-
-
-
- {{ scope.row.description }}
-
-
-
-
- Edit
- Delete
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Cancel
- Confirm
-
-
-
-
-
-
-
-
diff --git a/views/src/main/resources/vueboot/vue.config.js b/views/src/main/resources/vueboot/vue.config.js
index 6b06bc10cc482b1b8a09bf96d918e79fe0837964..1d402a3228823456fec6dc0563bd748ae2f073f4 100644
--- a/views/src/main/resources/vueboot/vue.config.js
+++ b/views/src/main/resources/vueboot/vue.config.js
@@ -35,8 +35,8 @@ module.exports = {
overlay: {
warnings: false,
errors: true
- },
- before: require('./mock/mock-server.js')
+ }
+ // before: require('./mock/mock-server.js')
},
configureWebpack: {
// provide the app's title in webpack's name field, so that
@@ -88,34 +88,34 @@ module.exports = {
.plugin('ScriptExtHtmlWebpackPlugin')
.after('html')
.use('script-ext-html-webpack-plugin', [{
- // `runtime` must same as runtimeChunk name. default is `runtime`
+ // `runtime` must same as runtimeChunk name. default is `runtime`
inline: /runtime\..*\.js$/
}])
.end()
config
.optimization.splitChunks({
- chunks: 'all',
- cacheGroups: {
- libs: {
- name: 'chunk-libs',
- test: /[\\/]node_modules[\\/]/,
- priority: 10,
- chunks: 'initial' // only package third parties that are initially dependent
- },
- elementUI: {
- name: 'chunk-elementUI', // split elementUI into a single package
- priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
- test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
- },
- commons: {
- name: 'chunk-commons',
- test: resolve('src/components'), // can customize your rules
- minChunks: 3, // minimum common number
- priority: 5,
- reuseExistingChunk: true
- }
+ chunks: 'all',
+ cacheGroups: {
+ libs: {
+ name: 'chunk-libs',
+ test: /[\\/]node_modules[\\/]/,
+ priority: 10,
+ chunks: 'initial' // only package third parties that are initially dependent
+ },
+ elementUI: {
+ name: 'chunk-elementUI', // split elementUI into a single package
+ priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
+ test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
+ },
+ commons: {
+ name: 'chunk-commons',
+ test: resolve('src/components'), // can customize your rules
+ minChunks: 3, // minimum common number
+ priority: 5,
+ reuseExistingChunk: true
}
- })
+ }
+ })
// https:// webpack.js.org/configuration/optimization/#optimizationruntimechunk
config.optimization.runtimeChunk('single')
}
diff --git a/web/pom.xml b/web/pom.xml
index ff75d3e92733351895d135fb187a26c2dd0fd24d..2e78d29fcee619e7f95cdb752538dcfebd6a247e 100644
--- a/web/pom.xml
+++ b/web/pom.xml
@@ -33,4 +33,30 @@
${parent.version}
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.8
+ 1.8
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+
+
+ org.mapstruct
+ mapstruct-processor
+ ${mapstruct.version}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/api/BuryingApi.java b/web/src/main/java/cn/icanci/loopstack/bic/web/api/BuryingApi.java
index a7352522f2ee55d3721bded0e153d1bd197c04f3..7f96997fbe6933c4e26c565ed4f55bf9f862c6ce 100644
--- a/web/src/main/java/cn/icanci/loopstack/bic/web/api/BuryingApi.java
+++ b/web/src/main/java/cn/icanci/loopstack/bic/web/api/BuryingApi.java
@@ -9,7 +9,7 @@ import org.springframework.web.bind.annotation.RestController;
import cn.icanci.loopstack.bic.biz.service.BuryingService;
import cn.icanci.loopstack.bic.common.result.R;
-import cn.icanci.loopstack.bic.web.model.BuryingModelVO;
+import cn.icanci.loopstack.bic.web.model.Burying;
/**
* @author icanci
@@ -22,7 +22,7 @@ public class BuryingApi {
private BuryingService buryingService;
@PostMapping("/batchSubmit")
- public R batchSubmit(@RequestBody BuryingModelVO buryingModel) {
+ public R batchSubmit(@RequestBody Burying buryingModel) {
buryingService.batchInsert(buryingModel.getBuryingList());
return R.builderOk().build();
}
diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/auth/UserAccountController.java b/web/src/main/java/cn/icanci/loopstack/bic/web/auth/UserAccountController.java
new file mode 100644
index 0000000000000000000000000000000000000000..bb81cf356fce0dc3428c1e1bc9558b91fdcd0dc9
--- /dev/null
+++ b/web/src/main/java/cn/icanci/loopstack/bic/web/auth/UserAccountController.java
@@ -0,0 +1,60 @@
+package cn.icanci.loopstack.bic.web.auth;
+
+import java.util.Date;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+import cn.icanci.loopstack.bic.common.result.R;
+import cn.icanci.loopstack.bic.common.result.ResultCodes;
+import cn.icanci.loopstack.bic.web.model.AdminLogin;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/09/10 14:35
+ */
+@RestController
+@RequestMapping("/bicAdmin/user")
+public class UserAccountController {
+ private final Logger logger = LoggerFactory.getLogger(UserAccountController.class);
+
+ @PostMapping("/login")
+ public R login(@RequestBody(required = false) AdminLogin loginVO) {
+ try {
+ AdminLogin vo = new AdminLogin();
+ vo.setId(1);
+ vo.setUsername("admin");
+ vo.setPassword("admin");
+ vo.setSecurity(1);
+ vo.setCreateTime(new Date());
+ vo.setRoles("[admin]");
+ vo.setAvatar("http://localhost:9999/static/head.jpg");
+ return R.builderOk().message("登录成功").data("userInfo", vo).build();
+ } catch (Exception e) {
+ return R.builderFail().message(e.getMessage()).build();
+ }
+ }
+
+ @GetMapping("/info/{username}")
+ public R info(@PathVariable("username") String username) {
+ if (StringUtils.isEmpty(username)) {
+ return R.builderOk().code(ResultCodes.LOGIN_TIME_OUT).message("用户已经退出").build();
+ }
+ AdminLogin vo = new AdminLogin();
+ vo.setId(1);
+ vo.setUsername("admin");
+ vo.setPassword("admin");
+ vo.setSecurity(1);
+ vo.setCreateTime(new Date());
+ vo.setRoles("[admin]");
+ vo.setAvatar("http://localhost:9999/static/head.jpg");
+ return R.builderOk().data("roles", vo.getRoles()).data("name", vo.getUsername()).data("avatar", vo.getAvatar()).build();
+ }
+
+ @PostMapping("/logout")
+ public R logout() {
+ return R.builderOk().message("退出成功").build();
+ }
+}
diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/config/WebConfig.java b/web/src/main/java/cn/icanci/loopstack/bic/web/config/WebConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..a5d23be0ba2d2a9eaa4bf5146701d875c6a2c19d
--- /dev/null
+++ b/web/src/main/java/cn/icanci/loopstack/bic/web/config/WebConfig.java
@@ -0,0 +1,39 @@
+package cn.icanci.loopstack.bic.web.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+
+/**
+ * 跨域配置
+ *
+ * @author icanci
+ * @since 1.0 Created in 2022/04/27 16:11
+ */
+@Configuration
+public class WebConfig {
+
+ // 过滤器跨域配置
+ @Bean
+ public CorsFilter corsFilter() {
+ UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+
+ CorsConfiguration config = new CorsConfiguration();
+
+ // 允许跨域的头部信息
+ config.addAllowedHeader("*");
+ // 允许跨域的方法
+ config.addAllowedMethod("*");
+ // 可访问的外部域
+ config.addAllowedOrigin("*");
+ // 需要跨域用户凭证(cookie、HTTP认证及客户端SSL证明等)
+ // config.setAllowCredentials(true);
+ // config.addAllowedOriginPattern("*");
+
+ // 跨域路径配置
+ source.registerCorsConfiguration("/**", config);
+ return new CorsFilter(source);
+ }
+}
diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/config/WebExceptionAdvice.java b/web/src/main/java/cn/icanci/loopstack/bic/web/config/WebExceptionAdvice.java
new file mode 100644
index 0000000000000000000000000000000000000000..f8f4ba763a3ff7f0cc194e80716ed774ad8ca963
--- /dev/null
+++ b/web/src/main/java/cn/icanci/loopstack/bic/web/config/WebExceptionAdvice.java
@@ -0,0 +1,30 @@
+package cn.icanci.loopstack.bic.web.config;
+
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import cn.icanci.loopstack.bic.common.result.R;
+
+/**
+ * 异常处理器
+ *
+ * @author icanci
+ * @since 1.0 Created in 2022/11/12 11:19
+ */
+@ControllerAdvice
+public class WebExceptionAdvice {
+
+ /**
+ * 非跳转页面无权限异常
+ *
+ * @param e 异常
+ * @return 返回异常信息
+ */
+ @ExceptionHandler(value = Exception.class)
+ @ResponseBody
+ public R jsonHandlerException(Exception e) {
+ return R.builderFail().message(e.getMessage()).build();
+ }
+
+}
diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/controller/BuryingController.java b/web/src/main/java/cn/icanci/loopstack/bic/web/controller/BuryingController.java
index 5c0ea95c621d7362fd3ccd62935fcb942c9c19db..9cc263f1ef2e3128a6d3373f28781ef568f5c029 100644
--- a/web/src/main/java/cn/icanci/loopstack/bic/web/controller/BuryingController.java
+++ b/web/src/main/java/cn/icanci/loopstack/bic/web/controller/BuryingController.java
@@ -2,14 +2,19 @@ package cn.icanci.loopstack.bic.web.controller;
import javax.annotation.Resource;
-import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.icanci.loopstack.bic.biz.service.BuryingService;
+import cn.icanci.loopstack.bic.common.model.BuryingVO;
import cn.icanci.loopstack.bic.common.result.R;
+import cn.icanci.loopstack.bic.web.form.BuryingQueryForm;
/**
+ * 埋点查询控制器
+ *
* @author icanci
* @since 1.0 Created in 2023/08/19 18:34
*/
@@ -19,8 +24,15 @@ public class BuryingController {
@Resource
private BuryingService buryingService;
- @GetMapping("queryAll")
- public R queryAll() {
- return R.builderOk().data("list", buryingService.queryAll()).build();
+ @PostMapping("query")
+ public R query(@RequestBody BuryingQueryForm form) {
+ return R.builderOk().data("queryPage", buryingService.queryPage(form.getBurying(), form.getPaginator().getCurrentPage(), form.getPaginator().getPageSize())).build();
}
+
+ @PostMapping("saveForMock")
+ public R saveForMock(@RequestBody BuryingVO burying) {
+ buryingService.save(burying);
+ return R.builderOk().build();
+ }
+
}
diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/controller/CommonController.java b/web/src/main/java/cn/icanci/loopstack/bic/web/controller/CommonController.java
new file mode 100644
index 0000000000000000000000000000000000000000..9bbb61f82e69fcdfbb8d8167273cb031c487419c
--- /dev/null
+++ b/web/src/main/java/cn/icanci/loopstack/bic/web/controller/CommonController.java
@@ -0,0 +1,43 @@
+package cn.icanci.loopstack.bic.web.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.icanci.loopstack.bic.common.enums.FuncTypeEnum;
+import cn.icanci.loopstack.bic.common.enums.NodeDataModeEnum;
+import cn.icanci.loopstack.bic.common.enums.NodeTypeEnum;
+import cn.icanci.loopstack.bic.common.model.TextValue;
+import cn.icanci.loopstack.bic.common.result.R;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/09/10 15:05
+ */
+@RestController
+@SuppressWarnings("all")
+@RequestMapping("/bicAdmin/common")
+public class CommonController {
+
+ @GetMapping("/funcType")
+ public R funcType() {
+ List
textValues = Arrays.stream(FuncTypeEnum.values()).map(x -> new TextValue(x.getDesc(), x.name())).collect(Collectors.toList());
+ return R.builderOk().data("textValues", textValues).build();
+ }
+
+ @GetMapping("/nodeDataMode")
+ public R nodeDataMode() {
+ List textValues = Arrays.stream(NodeDataModeEnum.values()).map(x -> new TextValue(x.getDesc(), x.name())).collect(Collectors.toList());
+ return R.builderOk().data("textValues", textValues).build();
+ }
+
+ @GetMapping("/nodeType")
+ public R nodeType() {
+ List textValues = Arrays.stream(NodeTypeEnum.values()).map(x -> new TextValue(x.getDesc(), x.name())).collect(Collectors.toList());
+ return R.builderOk().data("textValues", textValues).build();
+ }
+}
diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/controller/NodeFuncController.java b/web/src/main/java/cn/icanci/loopstack/bic/web/controller/NodeFuncController.java
new file mode 100644
index 0000000000000000000000000000000000000000..d5f3f23cfb2b2f8fd42a4580bccc783c7280a5d9
--- /dev/null
+++ b/web/src/main/java/cn/icanci/loopstack/bic/web/controller/NodeFuncController.java
@@ -0,0 +1,16 @@
+package cn.icanci.loopstack.bic.web.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 节点函数控制器
+ *
+ * @author icanci
+ * @since 1.0 Created in 2023/09/02 21:33
+ */
+@RestController
+@RequestMapping("/bicAdmin/node/func")
+public class NodeFuncController {
+
+}
diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/controller/SystemController.java b/web/src/main/java/cn/icanci/loopstack/bic/web/controller/SystemController.java
new file mode 100644
index 0000000000000000000000000000000000000000..74dfee0b09ea718281d57a435127c164342a1241
--- /dev/null
+++ b/web/src/main/java/cn/icanci/loopstack/bic/web/controller/SystemController.java
@@ -0,0 +1,64 @@
+package cn.icanci.loopstack.bic.web.controller;
+
+import java.util.List;
+
+import javax.annotation.Resource;
+
+import org.springframework.web.bind.annotation.*;
+
+import cn.icanci.loopstack.bic.biz.service.SystemService;
+import cn.icanci.loopstack.bic.common.model.TextValue;
+import cn.icanci.loopstack.bic.common.model.base.SystemVO;
+import cn.icanci.loopstack.bic.common.result.R;
+import cn.icanci.loopstack.bic.web.form.SystemQueryForm;
+import cn.icanci.loopstack.bic.web.mapper.SystemWebMapper;
+import cn.icanci.loopstack.bic.web.model.System;
+
+/**
+ * 系统控制层Controller
+ *
+ * @author icanci
+ * @since 1.0 Created in 2023/09/10 15:16
+ */
+@RestController
+@SuppressWarnings("all")
+@RequestMapping("/bicAdmin/system")
+public class SystemController {
+ @Resource
+ private SystemWebMapper systemWebMapper;
+ @Resource
+ private SystemService systemService;
+
+ // ================================ CRUD ================================
+ @PostMapping("query")
+ public R query(@RequestBody SystemQueryForm form) {
+ return R.builderOk()
+ .data("queryPage", systemService.queryPage(systemWebMapper.web2vo(form.getSystem()), form.getPaginator().getCurrentPage(), form.getPaginator().getPageSize())).build();
+ }
+
+ @PostMapping("save")
+ public R save(@RequestBody System system) {
+ systemService.save(systemWebMapper.web2vo(system));
+ return R.builderOk().build();
+ }
+
+ @GetMapping("validateName/{name}")
+ public R validateName(@PathVariable("name") String name) {
+ SystemVO systemVO = systemService.queryByName(name);
+ return R.builderOk().data("result", systemVO == null).build();
+ }
+
+ @GetMapping("validateKey/{key}")
+ public R validateKey(@PathVariable("key") String key) {
+ SystemVO systemVO = systemService.queryByKey(key);
+ return R.builderOk().data("result", systemVO == null).build();
+ }
+ // ================================ Load Selectors ================================
+
+ @GetMapping("loadSelector")
+ public R loadSelector() {
+ List textValues = systemService.loadSelector();
+ return R.builderOk().data("textValues", textValues).build();
+ }
+
+}
diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/controller/UseCaseController.java b/web/src/main/java/cn/icanci/loopstack/bic/web/controller/UseCaseController.java
new file mode 100644
index 0000000000000000000000000000000000000000..48730e37a4986d281e9b4a78e50cc4fc7375c761
--- /dev/null
+++ b/web/src/main/java/cn/icanci/loopstack/bic/web/controller/UseCaseController.java
@@ -0,0 +1,62 @@
+package cn.icanci.loopstack.bic.web.controller;
+
+import java.util.List;
+
+import javax.annotation.Resource;
+
+import org.springframework.web.bind.annotation.*;
+
+import cn.icanci.loopstack.bic.biz.service.UseCaseService;
+import cn.icanci.loopstack.bic.common.model.TextValue;
+import cn.icanci.loopstack.bic.common.model.base.UseCaseVO;
+import cn.icanci.loopstack.bic.common.result.R;
+import cn.icanci.loopstack.bic.web.form.UseCaseQueryForm;
+import cn.icanci.loopstack.bic.web.mapper.UseCaseWebMapper;
+import cn.icanci.loopstack.bic.web.model.UseCase;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/09/10 20:03
+ */
+@RestController
+@SuppressWarnings("all")
+@RequestMapping("/bicAdmin/useCase")
+public class UseCaseController {
+ @Resource
+ private UseCaseWebMapper useCaseWebMapper;
+ @Resource
+ private UseCaseService useCaseService;
+
+ // ================================ CRUD ================================
+ @PostMapping("query")
+ public R query(@RequestBody UseCaseQueryForm form) {
+ return R.builderOk()
+ .data("queryPage", useCaseService.queryPage(useCaseWebMapper.web2vo(form.getUseCase()), form.getPaginator().getCurrentPage(), form.getPaginator().getPageSize()))
+ .build();
+ }
+
+ @PostMapping("save")
+ public R save(@RequestBody UseCase useCase) {
+ useCaseService.save(useCaseWebMapper.web2vo(useCase));
+ return R.builderOk().build();
+ }
+
+ @GetMapping("validateName/{systemUuid}/{name}")
+ public R validateName(@PathVariable("systemUuid") String systemUuid, @PathVariable("name") String name) {
+ UseCaseVO useCaseVO = useCaseService.queryBySystemUuidAndName(systemUuid, name);
+ return R.builderOk().data("result", useCaseVO == null).build();
+ }
+
+ @GetMapping("validateKey/{systemUuid}/{key}")
+ public R validateKey(@PathVariable("systemUuid") String systemUuid, @PathVariable("key") String key) {
+ UseCaseVO useCaseVO = useCaseService.queryBySystemUuidAndKey(systemUuid, key);
+ return R.builderOk().data("result", useCaseVO == null).build();
+ }
+ // ================================ Load Selectors ================================
+
+ @GetMapping("loadSelector/{systemUuid}")
+ public R loadSelector(@PathVariable("systemUuid") String systemUuid) {
+ List textValues = useCaseService.loadSelector(systemUuid);
+ return R.builderOk().data("textValues", textValues).build();
+ }
+}
diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/form/BaseQueryForm.java b/web/src/main/java/cn/icanci/loopstack/bic/web/form/BaseQueryForm.java
new file mode 100644
index 0000000000000000000000000000000000000000..f5c2c27e8c6cae56b335eede93217cee95c02d67
--- /dev/null
+++ b/web/src/main/java/cn/icanci/loopstack/bic/web/form/BaseQueryForm.java
@@ -0,0 +1,23 @@
+package cn.icanci.loopstack.bic.web.form;
+
+import cn.icanci.loopstack.bic.dal.mongo.common.Paginator;
+import lombok.Data;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/09/10 15:44
+ */
+@Data
+public class BaseQueryForm {
+ private static final long serialVersionUID = -2325040090136131269L;
+
+ private Paginator paginator;
+
+ public Paginator getPaginator() {
+ return paginator;
+ }
+
+ public void setPaginator(Paginator paginator) {
+ this.paginator = paginator;
+ }
+}
diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/form/BuryingQueryForm.java b/web/src/main/java/cn/icanci/loopstack/bic/web/form/BuryingQueryForm.java
new file mode 100644
index 0000000000000000000000000000000000000000..cdc121424265dbc269cdb589c8177c8b4905d649
--- /dev/null
+++ b/web/src/main/java/cn/icanci/loopstack/bic/web/form/BuryingQueryForm.java
@@ -0,0 +1,13 @@
+package cn.icanci.loopstack.bic.web.form;
+
+import cn.icanci.loopstack.bic.common.model.BuryingVO;
+import lombok.Data;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/09/11 11:18
+ */
+@Data
+public class BuryingQueryForm extends BaseQueryForm {
+ private BuryingVO burying;
+}
diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/form/SystemQueryForm.java b/web/src/main/java/cn/icanci/loopstack/bic/web/form/SystemQueryForm.java
new file mode 100644
index 0000000000000000000000000000000000000000..c6e3338b9f8ea838675e6d2a94c4789ffa5ef8b1
--- /dev/null
+++ b/web/src/main/java/cn/icanci/loopstack/bic/web/form/SystemQueryForm.java
@@ -0,0 +1,14 @@
+package cn.icanci.loopstack.bic.web.form;
+
+import cn.icanci.loopstack.bic.web.model.System;
+import lombok.Data;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/09/10 15:44
+ */
+@Data
+public class SystemQueryForm extends BaseQueryForm {
+ private static final long serialVersionUID = -5707057820546333067L;
+ private System system;
+}
diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/form/UseCaseQueryForm.java b/web/src/main/java/cn/icanci/loopstack/bic/web/form/UseCaseQueryForm.java
new file mode 100644
index 0000000000000000000000000000000000000000..e23b0e28e854ba1e59aa272caa7f0d71812dc050
--- /dev/null
+++ b/web/src/main/java/cn/icanci/loopstack/bic/web/form/UseCaseQueryForm.java
@@ -0,0 +1,16 @@
+package cn.icanci.loopstack.bic.web.form;
+
+import cn.icanci.loopstack.bic.web.model.UseCase;
+import lombok.Data;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/09/10 20:06
+ */
+@Data
+public class UseCaseQueryForm extends BaseQueryForm {
+ /**
+ * 用例查询模型
+ */
+ private UseCase useCase;
+}
diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/mapper/BaseWebMapper.java b/web/src/main/java/cn/icanci/loopstack/bic/web/mapper/BaseWebMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..65397a18090dda0bb9cf47b53c5cab24501f8b60
--- /dev/null
+++ b/web/src/main/java/cn/icanci/loopstack/bic/web/mapper/BaseWebMapper.java
@@ -0,0 +1,18 @@
+package cn.icanci.loopstack.bic.web.mapper;
+
+import java.util.List;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2022/11/11 17:20
+ */
+public interface BaseWebMapper {
+
+ R web2vo(T t);
+
+ List webs2vos(List ts);
+
+ T vo2web(R r);
+
+ List vos2webs(List rs);
+}
diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/mapper/SystemWebMapper.java b/web/src/main/java/cn/icanci/loopstack/bic/web/mapper/SystemWebMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..68d499f42451656995c9ce5b4c5a1bade4325a64
--- /dev/null
+++ b/web/src/main/java/cn/icanci/loopstack/bic/web/mapper/SystemWebMapper.java
@@ -0,0 +1,15 @@
+package cn.icanci.loopstack.bic.web.mapper;
+
+import cn.icanci.loopstack.bic.common.model.base.SystemVO;
+import cn.icanci.loopstack.bic.web.model.System;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.NullValueMappingStrategy;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/09/10 15:17
+ */
+@Mapper(componentModel = "spring", uses = {}, nullValueMappingStrategy = NullValueMappingStrategy.RETURN_NULL)
+public interface SystemWebMapper extends BaseWebMapper {
+}
diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/mapper/UseCaseWebMapper.java b/web/src/main/java/cn/icanci/loopstack/bic/web/mapper/UseCaseWebMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..8234c38cc3ef134f1bef6ad8fc0cc7b5de859a54
--- /dev/null
+++ b/web/src/main/java/cn/icanci/loopstack/bic/web/mapper/UseCaseWebMapper.java
@@ -0,0 +1,15 @@
+package cn.icanci.loopstack.bic.web.mapper;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.NullValueMappingStrategy;
+
+import cn.icanci.loopstack.bic.common.model.base.UseCaseVO;
+import cn.icanci.loopstack.bic.web.model.UseCase;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/09/10 20:08
+ */
+@Mapper(componentModel = "spring", uses = {}, nullValueMappingStrategy = NullValueMappingStrategy.RETURN_NULL)
+public interface UseCaseWebMapper extends BaseWebMapper {
+}
diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/model/AdminLogin.java b/web/src/main/java/cn/icanci/loopstack/bic/web/model/AdminLogin.java
new file mode 100644
index 0000000000000000000000000000000000000000..b27e8a40650846fca154054a3c0f596415e242fe
--- /dev/null
+++ b/web/src/main/java/cn/icanci/loopstack/bic/web/model/AdminLogin.java
@@ -0,0 +1,98 @@
+package cn.icanci.loopstack.bic.web.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 用户登录请求
+ *
+ * @author icanci
+ * @since 1.0 Created in 2022/04/25 16:42
+ */
+public class AdminLogin implements Serializable {
+ private static final long serialVersionUID = -6109731549811158442L;
+ /**
+ * 主键
+ */
+ private Integer id;
+ /**
+ * 用户名
+ */
+ private String username;
+ /**
+ * 密码
+ */
+ private String password;
+ /**
+ * 权限
+ */
+ private Integer security;
+ /**
+ * 创建时间
+ */
+ private Date createTime;
+ /**
+ * 角色
+ */
+ private String roles;
+ /**
+ * 头像地址
+ */
+ private String avatar;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public Integer getSecurity() {
+ return security;
+ }
+
+ public void setSecurity(Integer security) {
+ this.security = security;
+ }
+
+ public Date getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(Date createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getRoles() {
+ return roles;
+ }
+
+ public void setRoles(String roles) {
+ this.roles = roles;
+ }
+
+ public String getAvatar() {
+ return avatar;
+ }
+
+ public void setAvatar(String avatar) {
+ this.avatar = avatar;
+ }
+}
diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/model/Base.java b/web/src/main/java/cn/icanci/loopstack/bic/web/model/Base.java
new file mode 100644
index 0000000000000000000000000000000000000000..1bfeb613568a65ca171187b6ad38cd8d670ba149
--- /dev/null
+++ b/web/src/main/java/cn/icanci/loopstack/bic/web/model/Base.java
@@ -0,0 +1,29 @@
+package cn.icanci.loopstack.bic.web.model;
+
+import lombok.Data;
+
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/09/10 15:18
+ */
+@Data
+public class Base {
+ /** mongodb id */
+ private String id;
+ /** 雪花算法随机UUID */
+ private String uuid;
+ /** 创建时间 */
+ @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date createTime;
+ /** 更新时间 */
+ @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date updateTime;
+ /** 状态 false 有效,true 无效 */
+ private boolean deleted;
+ /** 环境 */
+ private String env;
+}
diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/model/BuryingModelVO.java b/web/src/main/java/cn/icanci/loopstack/bic/web/model/Burying.java
similarity index 92%
rename from web/src/main/java/cn/icanci/loopstack/bic/web/model/BuryingModelVO.java
rename to web/src/main/java/cn/icanci/loopstack/bic/web/model/Burying.java
index e14e76bee616fbe6727e8cc73bec490fad32e33f..d8140e1281a914ee302b22995d62a3e5f98d16f2 100644
--- a/web/src/main/java/cn/icanci/loopstack/bic/web/model/BuryingModelVO.java
+++ b/web/src/main/java/cn/icanci/loopstack/bic/web/model/Burying.java
@@ -10,7 +10,7 @@ import cn.icanci.loopstack.bic.common.model.BuryingVO;
* @author icanci
* @since 1.0 Created in 2023/08/19 18:20
*/
-public class BuryingModelVO implements Serializable {
+public class Burying implements Serializable {
private List buryingList;
diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/model/System.java b/web/src/main/java/cn/icanci/loopstack/bic/web/model/System.java
new file mode 100644
index 0000000000000000000000000000000000000000..96f0ed9d0bf5253f13c535ba7408f8d0d3f96c7f
--- /dev/null
+++ b/web/src/main/java/cn/icanci/loopstack/bic/web/model/System.java
@@ -0,0 +1,15 @@
+package cn.icanci.loopstack.bic.web.model;
+
+import lombok.Data;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/09/10 15:18
+ */
+@Data
+public class System extends Base {
+ /** 系统名称 */
+ private String systemName;
+ /** 系统唯一标识 */
+ private String systemKey;
+}
diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/model/UseCase.java b/web/src/main/java/cn/icanci/loopstack/bic/web/model/UseCase.java
new file mode 100644
index 0000000000000000000000000000000000000000..58382e7cd8ed7b10cffb054a56f6b2eb76f7c66e
--- /dev/null
+++ b/web/src/main/java/cn/icanci/loopstack/bic/web/model/UseCase.java
@@ -0,0 +1,17 @@
+package cn.icanci.loopstack.bic.web.model;
+
+import lombok.Data;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/09/10 20:05
+ */
+@Data
+public class UseCase extends Base {
+ /** 用例名称,系统唯一 */
+ private String useCaseName;
+ /** 用例标识,系统唯一 */
+ private String useCaseKey;
+ /** 系统关联标识 */
+ private String systemUuid;
+}
diff --git a/web/src/main/resources/.gitkeep b/web/src/main/resources/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/web/src/main/resources/json/logs.json b/web/src/main/resources/json/logs.json
new file mode 100644
index 0000000000000000000000000000000000000000..8ee68c6d53fa06d2016ed5c72af00c6736e7d6f1
--- /dev/null
+++ b/web/src/main/resources/json/logs.json
@@ -0,0 +1,24 @@
+[
+ {
+ "systemKey": "iflight.java.dsf.tradecore",
+ "useCase": "bookValidate",
+ "traceId": "TC20230907154200P4AQRPKF2B70CEOKZV0N7O8743RNXCBJ1RVGFLDIOOA9L6N8",
+ "businessNo": "",
+ "module": "BOOK_VALIDATE",
+ "category": "FR2",
+ "subCategory": "",
+ "time": "2023-09-07 15:47:41.868",
+ "message": "{\"currency\":\"\",\"language\":\"\",\"loginKey\":\"\",\"member\":null,\"pricingSerialNo\":\"TC_QJD_HSQJD\",\"reqPassengers\":[{\"passengerNum\":1,\"passengerType\":1},{\"passengerNum\":0,\"passengerType\":2},{\"passengerNum\":0,\"passengerType\":3}],\"resource\":852,\"resourceId\":\"EBOOKING-PRICING\",\"searchCondition\":{\"arrivalCity\":\"VTE\",\"bookingClass\":\"\",\"departureCity\":\"CAN\",\"departureDate\":\"2023-09-08\",\"flatType\":\"\",\"maxAge\":0,\"minAge\":0,\"nationList\":[],\"reqPassengers\":[],\"returnDate\":\"1900-01-01\",\"travelType\":\"OW\"},\"traceId\":\"TC20230907154200P4AQRPKF2B70CEOKZV0N7O8743RNXCBJ1RVGFLDIOOA9L6N8\",\"unitGuid\":\"CORE~20230907154207^OW_CAN/VTE/20230908_ADT-1|CHD-0|INF-0_Y|S|F|C_3319424961810663376_SIMPLE_0_V11^CZ6091_20230908^NORMAL\",\"unitKey\":\"NORMAL_GW_-7202149149514880210_ZYHSQJD_148390996\"}"
+ },
+ {
+ "systemKey": "iflight.java.dsf.tradecore",
+ "useCase": "bookValidate",
+ "traceId": "TC20230907154200P4AQRPKF2B70CEOKZV0N7O8743RNXCBJ1RVGFLDIOOA9L6N8",
+ "businessNo": "",
+ "module": "BOOK_VALIDATE",
+ "category": "FR2",
+ "subCategory": "",
+ "time": "2023-09-07 15:48:41.868",
+ "message": "{\"code\":\"\",\"message\":\"\",\"priceChange\":false,\"prices\":[],\"remainCabinNum\":\"\",\"rule\":null,\"success\":true}"
+ }
+]
\ No newline at end of file