Browse Source

设备监听客户端

yingp 6 years ago
parent
commit
4cbc566b45
23 changed files with 773 additions and 66 deletions
  1. 7 2
      applications/device/device-client/pom.xml
  2. 15 0
      applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/common/RandomUtils.java
  3. 53 0
      applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/config/DataSourceConfig.java
  4. 2 2
      applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/controller/AccessControlController.java
  5. 28 0
      applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/init/IcCardInitializer.java
  6. 16 0
      applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/jdbc/Connectable.java
  7. 143 0
      applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/jdbc/DynamicDataSource.java
  8. 25 0
      applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/jdbc/DynamicDataSourceContextHolder.java
  9. 40 0
      applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/jdbc/DynamicDataSourceRegister.java
  10. 12 16
      applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/po/AccessControl.java
  11. 78 0
      applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/po/IcCard.java
  12. 22 0
      applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/po/School.java
  13. 56 11
      applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/repository/AccessControlRepository.java
  14. 38 0
      applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/repository/IcCardRepository.java
  15. 36 0
      applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/repository/SchoolRepository.java
  16. 35 2
      applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/service/AccessControlService.java
  17. 47 0
      applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/service/IcCardService.java
  18. 28 0
      applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/service/SchoolService.java
  19. 5 4
      applications/device/device-client/src/main/resources/application.yml
  20. 23 0
      applications/device/device-client/src/main/resources/schema.sql
  21. 18 27
      applications/device/device-client/src/main/resources/static/index.html
  22. 46 2
      applications/device/device-client/src/main/resources/static/js/index.js
  23. 0 0
      applications/device/device-client/src/main/resources/static/js/template.min.js

+ 7 - 2
applications/device/device-client/pom.xml

@@ -22,7 +22,12 @@
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-jpa</artifactId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.microsoft.sqlserver</groupId>
+            <artifactId>mssql-jdbc</artifactId>
+            <version>4.2.0</version>
         </dependency>
         <dependency>
             <groupId>com.h2database</groupId>
@@ -30,7 +35,7 @@
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-security</artifactId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
         </dependency>
     </dependencies>
 

+ 15 - 0
applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/common/RandomUtils.java

@@ -0,0 +1,15 @@
+package com.usoftchina.smartschool.device.client.common;
+
+import java.util.Random;
+
+/**
+ * @author yingp
+ * @date 2019/3/11
+ */
+public class RandomUtils {
+
+    public static String randomString() {
+        return String.valueOf(new Random().nextLong());
+    }
+
+}

+ 53 - 0
applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/config/DataSourceConfig.java

@@ -0,0 +1,53 @@
+package com.usoftchina.smartschool.device.client.config;
+
+import com.usoftchina.smartschool.device.client.jdbc.DynamicDataSource;
+import com.usoftchina.smartschool.device.client.jdbc.DynamicDataSourceRegister;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.jdbc.DataSourceBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+import javax.sql.DataSource;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author yingp
+ * @date 2019/3/11
+ */
+@Configuration
+public class DataSourceConfig {
+
+    @Primary
+    @Bean(name = "primaryDataSource")
+    @ConfigurationProperties(prefix = "spring.datasource.primary")
+    public DataSource primaryDataSource() {
+        return DataSourceBuilder.create().build();
+    }
+
+    @Bean(name = "dataSource")
+    public DynamicDataSource dynamicDataSource() {
+        DataSource primaryDataSource = this.primaryDataSource();
+        Map<Object, Object> targetDataSources = new HashMap<>();
+        targetDataSources.put("primaryDataSource", primaryDataSource);
+        DynamicDataSource dataSource = new DynamicDataSource();
+        dataSource.setDefaultTargetDataSource(primaryDataSource);
+        dataSource.setTargetDataSources(targetDataSources);
+        return dataSource;
+    }
+
+    @Bean
+    public JdbcTemplate jdbcTemplate() {
+        return new JdbcTemplate(this.dynamicDataSource());
+    }
+
+    @Bean
+    public DynamicDataSourceRegister register() {
+        DataSourceProperties dataSourceProperties = new DataSourceProperties();
+        dataSourceProperties.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
+        return new DynamicDataSourceRegister(dataSourceProperties, this.dynamicDataSource());
+    }
+}

+ 2 - 2
applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/controller/AccessControlController.java

@@ -13,7 +13,7 @@ import java.util.List;
  * @date 2019/3/11
  */
 @RestController
-@RequestMapping("/accesscontrol")
+@RequestMapping("/api/accesscontrol")
 public class AccessControlController {
 
     @Autowired
@@ -36,7 +36,7 @@ public class AccessControlController {
      * @return
      */
     @PostMapping
-    public Result save(@RequestBody AccessControl accessControl) {
+    public Result save(AccessControl accessControl) {
         accessControlService.save(accessControl);
         return Result.success();
     }

+ 28 - 0
applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/init/IcCardInitializer.java

@@ -0,0 +1,28 @@
+package com.usoftchina.smartschool.device.client.init;
+
+import com.usoftchina.smartschool.device.client.jdbc.DynamicDataSourceRegister;
+import com.usoftchina.smartschool.device.client.po.IcCard;
+import com.usoftchina.smartschool.device.client.service.IcCardService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+
+/**
+ * @author yingp
+ * @date 2019/3/11
+ */
+public class IcCardInitializer implements CommandLineRunner {
+
+    @Autowired
+    private IcCardService icCardService;
+
+    @Autowired
+    private DynamicDataSourceRegister dynamicDataSourceRegister;
+
+    @Override
+    public void run(String... args) throws Exception {
+        IcCard card = icCardService.find();
+        if (null != card) {
+            dynamicDataSourceRegister.createDataSource(card);
+        }
+    }
+}

+ 16 - 0
applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/jdbc/Connectable.java

@@ -0,0 +1,16 @@
+package com.usoftchina.smartschool.device.client.jdbc;
+
+/**
+ * Created by Pro1 on 2017/7/27.
+ */
+public interface Connectable {
+
+    String qualifier();
+
+    String url();
+
+    String username();
+
+    String password();
+
+}

+ 143 - 0
applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/jdbc/DynamicDataSource.java

@@ -0,0 +1,143 @@
+package com.usoftchina.smartschool.device.client.jdbc;
+
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.jdbc.datasource.AbstractDataSource;
+import org.springframework.jdbc.datasource.lookup.DataSourceLookup;
+import org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup;
+import org.springframework.util.Assert;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * Created by Pro1 on 2017/7/27.
+ * 基于{@AbstractRoutingDataSource},解决不能动态添加新数据源的问题
+ */
+public class DynamicDataSource extends AbstractDataSource implements InitializingBean {
+
+    private Map<Object, Object> targetDataSources;
+    private Object defaultTargetDataSource;
+    private boolean lenientFallback = true;
+    private DataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
+    private Map<Object, DataSource> resolvedDataSources;
+    private DataSource resolvedDefaultDataSource;
+
+    public void setTargetDataSources(Map<Object, Object> targetDataSources) {
+        this.targetDataSources = targetDataSources;
+    }
+
+    public void setDefaultTargetDataSource(Object defaultTargetDataSource) {
+        this.defaultTargetDataSource = defaultTargetDataSource;
+    }
+
+    public void setLenientFallback(boolean lenientFallback) {
+        this.lenientFallback = lenientFallback;
+    }
+
+    public void setDataSourceLookup(DataSourceLookup dataSourceLookup) {
+        this.dataSourceLookup = (DataSourceLookup)(dataSourceLookup != null?dataSourceLookup:new JndiDataSourceLookup());
+    }
+
+    @Override
+    public void afterPropertiesSet() {
+        if(this.targetDataSources == null) {
+            throw new IllegalArgumentException("Property \'targetDataSources\' is required");
+        } else {
+            this.resolvedDataSources = new HashMap(this.targetDataSources.size());
+            Iterator var1 = this.targetDataSources.entrySet().iterator();
+
+            while(var1.hasNext()) {
+                Map.Entry entry = (Map.Entry)var1.next();
+                Object lookupKey = this.resolveSpecifiedLookupKey(entry.getKey());
+                DataSource dataSource = this.resolveSpecifiedDataSource(entry.getValue());
+                this.resolvedDataSources.put(lookupKey, dataSource);
+            }
+
+            if(this.defaultTargetDataSource != null) {
+                this.resolvedDefaultDataSource = this.resolveSpecifiedDataSource(this.defaultTargetDataSource);
+            }
+
+        }
+    }
+
+    protected Object resolveSpecifiedLookupKey(Object lookupKey) {
+        return lookupKey;
+    }
+
+    protected DataSource resolveSpecifiedDataSource(Object dataSource) throws IllegalArgumentException {
+        if(dataSource instanceof DataSource) {
+            return (DataSource)dataSource;
+        } else if(dataSource instanceof String) {
+            return this.dataSourceLookup.getDataSource((String)dataSource);
+        } else {
+            throw new IllegalArgumentException("Illegal data source value - only [javax.sql.DataSource] and String supported: " + dataSource);
+        }
+    }
+
+    @Override
+    public Connection getConnection() throws SQLException {
+        return this.determineTargetDataSource().getConnection();
+    }
+
+    @Override
+    public Connection getConnection(String username, String password) throws SQLException {
+        return this.determineTargetDataSource().getConnection(username, password);
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public <T> T unwrap(Class<T> iface) throws SQLException {
+        if (iface.isInstance(this)) {
+            return (T) this;
+        }
+        return determineTargetDataSource().unwrap(iface);
+    }
+
+    @Override
+    public boolean isWrapperFor(Class<?> iface) throws SQLException {
+        return (iface.isInstance(this) || determineTargetDataSource().isWrapperFor(iface));
+    }
+
+    protected DataSource determineTargetDataSource() {
+        Assert.notNull(this.resolvedDataSources, "DataSource router not initialized");
+        Object lookupKey = this.determineCurrentLookupKey();
+        DataSource dataSource = (DataSource)this.resolvedDataSources.get(lookupKey);
+        if(dataSource == null && (this.lenientFallback || lookupKey == null)) {
+            dataSource = this.resolvedDefaultDataSource;
+        }
+
+        if(dataSource == null) {
+            throw new IllegalStateException("Cannot determine target DataSource for lookup key [" + lookupKey + "]");
+        } else {
+            return dataSource;
+        }
+    }
+
+    protected Object determineCurrentLookupKey() {
+        return DynamicDataSourceContextHolder.get();
+    }
+
+    public boolean containsDataSource(Object key) {
+        Object lookupKey = this.resolveSpecifiedLookupKey(key);
+        return this.resolvedDataSources.containsKey(lookupKey);
+    }
+
+    public void addDataSource(Object key, Object value) {
+        Object lookupKey = this.resolveSpecifiedLookupKey(key);
+        if (!containsDataSource(lookupKey)) {
+            DataSource dataSource = this.resolveSpecifiedDataSource(value);
+            this.resolvedDataSources.put(lookupKey, dataSource);
+        }
+    }
+
+    public void removeDataSource(Object key) {
+        Object lookupKey = this.resolveSpecifiedLookupKey(key);
+        if (!containsDataSource(lookupKey)) {
+            this.resolvedDataSources.remove(key);
+        }
+    }
+}

+ 25 - 0
applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/jdbc/DynamicDataSourceContextHolder.java

@@ -0,0 +1,25 @@
+package com.usoftchina.smartschool.device.client.jdbc;
+
+/**
+ * Created by Pro1 on 2017/7/27.
+ */
+public class DynamicDataSourceContextHolder {
+
+    private static final ThreadLocal<String> contextHolder = new InheritableThreadLocal<>();
+
+    public static void set(String dataSource) {
+        contextHolder.set(dataSource);
+    }
+
+    public static void set(Connectable connectable) {
+        contextHolder.set(connectable.qualifier());
+    }
+
+    public static String get() {
+        return contextHolder.get();
+    }
+
+    public static void clear() {
+        contextHolder.remove();
+    }
+}

+ 40 - 0
applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/jdbc/DynamicDataSourceRegister.java

@@ -0,0 +1,40 @@
+package com.usoftchina.smartschool.device.client.jdbc;
+
+import com.zaxxer.hikari.HikariDataSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
+import org.springframework.boot.jdbc.DataSourceBuilder;
+
+/**
+ * Created by Pro1 on 2017/7/27.
+ */
+public class DynamicDataSourceRegister {
+
+    private DataSourceProperties defaultProperties;
+    private DynamicDataSource dynamicDataSource;
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    public DynamicDataSourceRegister(DataSourceProperties defaultProperties, DynamicDataSource dynamicDataSource) {
+        this.defaultProperties = defaultProperties;
+        this.dynamicDataSource = dynamicDataSource;
+    }
+
+    public void createDataSource(Connectable connectable) {
+        if (!dynamicDataSource.containsDataSource(connectable.qualifier())) {
+            logger.info("connectable:" + connectable);
+            HikariDataSource dataSource = DataSourceBuilder.create(defaultProperties.getClassLoader())
+                    .type(HikariDataSource.class)
+                    .driverClassName(defaultProperties.determineDriverClassName())
+                    .url(connectable.url())
+                    .username(connectable.username())
+                    .password(connectable.password())
+                    .build();
+            dynamicDataSource.addDataSource(connectable.qualifier(), dataSource);
+        }
+    }
+
+    public void unregister(Connectable connectable) {
+        dynamicDataSource.removeDataSource(connectable.qualifier());
+    }
+}

+ 12 - 16
applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/po/AccessControl.java

@@ -2,19 +2,15 @@ package com.usoftchina.smartschool.device.client.po;
 
 import com.usoftchina.smartschool.device.dto.DeviceInfo;
 
-import javax.persistence.*;
-
 /**
  * @author yingp
  * @date 2019/3/11
  */
-@Entity
-@Table(indexes = {@Index(name = "idx_access_control_ip_port", columnList = "ip,port", unique = true)})
 public class AccessControl implements DeviceInfo{
-    @Id
-    @GeneratedValue
-    private Integer id;
-
+    private String id;
+    /**
+     * 名称
+     */
     private String name;
 
     private String ip;
@@ -25,14 +21,6 @@ public class AccessControl implements DeviceInfo{
 
     private String password;
 
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
     public String getName() {
         return name;
     }
@@ -41,6 +29,14 @@ public class AccessControl implements DeviceInfo{
         this.name = name;
     }
 
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
     @Override
     public String getIp() {
         return ip;

+ 78 - 0
applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/po/IcCard.java

@@ -0,0 +1,78 @@
+package com.usoftchina.smartschool.device.client.po;
+
+import com.usoftchina.smartschool.device.client.jdbc.Connectable;
+
+import java.io.Serializable;
+
+/**
+ * @author yingp
+ * @date 2019/3/11
+ */
+public class IcCard implements Serializable, Connectable {
+    private String databaseName;
+    private String ip;
+    private int port;
+    private String username;
+    private String password;
+
+    public String getDatabaseName() {
+        return databaseName;
+    }
+
+    public void setDatabaseName(String databaseName) {
+        this.databaseName = databaseName;
+    }
+
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    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;
+    }
+
+    @Override
+    public String qualifier() {
+        return databaseName;
+    }
+
+    @Override
+    public String url() {
+        return String.format("jdbc:sqlserver://%s:%s;DatabaseName=%s",
+                ip, port, databaseName);
+    }
+
+    @Override
+    public String username() {
+        return username;
+    }
+
+    @Override
+    public String password() {
+        return password;
+    }
+}

+ 22 - 0
applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/po/School.java

@@ -0,0 +1,22 @@
+package com.usoftchina.smartschool.device.client.po;
+
+import java.io.Serializable;
+
+/**
+ * @author yingp
+ * @date 2019/3/11
+ */
+public class School implements Serializable {
+    /**
+     * 学校名称
+     */
+    private String name;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

+ 56 - 11
applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/repository/AccessControlRepository.java

@@ -1,22 +1,67 @@
 package com.usoftchina.smartschool.device.client.repository;
 
 import com.usoftchina.smartschool.device.client.po.AccessControl;
-import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.EmptyResultDataAccessException;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.support.JdbcDaoSupport;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 /**
  * @author yingp
  * @date 2019/3/11
  */
 @Repository
-public interface AccessControlRepository extends JpaRepository<AccessControl, Integer> {
-
-    /**
-     * 按IP+PORT查找
-     *
-     * @param ip
-     * @param port
-     * @return
-     */
-    AccessControl findByIpAndPort(String ip, int port);
+public class AccessControlRepository {
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    public List<AccessControl> findAll() {
+        try {
+            return jdbcTemplate.query("select * from access_control",
+                    new BeanPropertyRowMapper<>(AccessControl.class));
+        } catch (EmptyResultDataAccessException e) {
+            return null;
+        }
+    }
+
+    public AccessControl findByIpAndPort(String ip, int port) {
+        try {
+            return jdbcTemplate.queryForObject("select * from access_control where ip=? and port=?",
+                    new BeanPropertyRowMapper<>(AccessControl.class), ip, port);
+        } catch (EmptyResultDataAccessException e) {
+            return null;
+        }
+    }
+
+    public AccessControl findById(String id) {
+        try {
+            return jdbcTemplate.queryForObject("select * from access_control where id=?",
+                    new BeanPropertyRowMapper<>(AccessControl.class), id);
+        } catch (EmptyResultDataAccessException e) {
+            return null;
+        }
+    }
+
+    public boolean save(AccessControl accessControl) {
+        int ret = jdbcTemplate.update("insert into access_control(id, name,ip,port,username,password) values " +
+                        "(?,?,?,?,?,?)", accessControl.getId(), accessControl.getName(), accessControl.getIp(), accessControl.getPort(),
+                accessControl.getUsername(), accessControl.getPassword());
+        return ret > 0;
+    }
+
+    public boolean update(AccessControl accessControl) {
+        int ret = jdbcTemplate.update("update access_control set name=?,ip=?,port=?,username=?,password=? where " +
+                        "id=?", accessControl.getName(), accessControl.getIp(), accessControl.getPort(),
+                accessControl.getUsername(), accessControl.getPassword(), accessControl.getId());
+        return ret > 0;
+    }
+
+    public boolean delete(String id) {
+        return jdbcTemplate.update("delete from access_control where id=?", id) > 0;
+    }
 }

+ 38 - 0
applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/repository/IcCardRepository.java

@@ -0,0 +1,38 @@
+package com.usoftchina.smartschool.device.client.repository;
+
+import com.usoftchina.smartschool.device.client.po.IcCard;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.EmptyResultDataAccessException;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author yingp
+ * @date 2019/3/11
+ */
+@Repository
+public class IcCardRepository{
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    public IcCard find() {
+        try {
+            return jdbcTemplate.queryForObject("select * from iccard",
+                    new BeanPropertyRowMapper<>(IcCard.class));
+        } catch (EmptyResultDataAccessException e) {
+            return null;
+        }
+    }
+
+    public void save(IcCard card) {
+        jdbcTemplate.update("insert into iccard (databaseName,ip,port,username,password) values (?,?,?,?,?)",
+                card.getDatabaseName(), card.getIp(), card.getPort(), card.getUsername(), card.getPassword());
+    }
+
+    public void update(IcCard card) {
+        jdbcTemplate.update("update iccard set databaseName=?,ip=?,port=?,username=?,password=?",
+                card.getDatabaseName(), card.getIp(), card.getPort(), card.getUsername(), card.getPassword());
+    }
+}

+ 36 - 0
applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/repository/SchoolRepository.java

@@ -0,0 +1,36 @@
+package com.usoftchina.smartschool.device.client.repository;
+
+import com.usoftchina.smartschool.device.client.po.School;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.EmptyResultDataAccessException;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author yingp
+ * @date 2019/3/11
+ */
+@Repository
+public class SchoolRepository{
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    public School find() {
+        try {
+            return jdbcTemplate.queryForObject("select * from iccard",
+                    new BeanPropertyRowMapper<>(School.class));
+        } catch (EmptyResultDataAccessException e) {
+            return null;
+        }
+    }
+
+    public void save(School school) {
+        jdbcTemplate.update("insert into school (name) values (?)", school.getName());
+    }
+
+    public void update(School school) {
+        jdbcTemplate.update("update school set name=?", school.getName());
+    }
+}

+ 35 - 2
applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/service/AccessControlService.java

@@ -1,6 +1,8 @@
 package com.usoftchina.smartschool.device.client.service;
 
+import com.usoftchina.smartschool.device.api.DeviceApi;
 import com.usoftchina.smartschool.device.base.Result;
+import com.usoftchina.smartschool.device.client.common.RandomUtils;
 import com.usoftchina.smartschool.device.client.config.DeviceServerProperties;
 import com.usoftchina.smartschool.device.client.po.AccessControl;
 import com.usoftchina.smartschool.device.client.repository.AccessControlRepository;
@@ -10,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 import org.springframework.web.client.RestTemplate;
 
 import java.util.List;
@@ -29,6 +32,9 @@ public class AccessControlService {
     @Autowired
     private DeviceServerProperties deviceServerProperties;
 
+    @Autowired
+    private DeviceApi deviceApi;
+
     public List<AccessControl> findAll() {
         return accessControlRepository.findAll();
     }
@@ -42,13 +48,40 @@ public class AccessControlService {
         AccessControl oldOne = accessControlRepository.findByIpAndPort(accessControl.getIp(),
                 accessControl.getPort());
         if (null != oldOne) {
-            if (accessControl.getId() == null || accessControl.getId() <= 0) {
+            if (StringUtils.isEmpty(accessControl.getId())) {
                 accessControl.setId(oldOne.getId());
             } else if (!accessControl.getId().equals(oldOne.getId())) {
                 ExceptionCode.ERROR_IP_PORT_EXIST.occur();
             }
+            accessControlRepository.update(accessControl);
+            if (!oldOne.getIp().equals(accessControl.getIp()) || oldOne.getPort() != accessControl.getPort() ||
+                    !oldOne.getUsername().equals(accessControl.getUsername()) ||
+                            !oldOne.getPassword().equals(accessControl.getPassword())) {
+                // 先调用设备接口停止监听
+                deviceApi.remove(accessControl);
+                // 调用设备接口监听
+                deviceApi.add(accessControl);
+            }
+
+        } else {
+            accessControl.setId(RandomUtils.randomString());
+            accessControlRepository.save(accessControl);
+            // 调用设备接口监听
+            deviceApi.add(accessControl);
+        }
+    }
+
+    public void delete(String id) {
+        AccessControl oldOne = accessControlRepository.findById(id);
+        if (null != oldOne) {
+            try {
+                // 先调用设备接口停止监听
+                deviceApi.remove(oldOne);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            accessControlRepository.delete(id);
         }
-        accessControlRepository.save(accessControl);
     }
 
     /**

+ 47 - 0
applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/service/IcCardService.java

@@ -0,0 +1,47 @@
+package com.usoftchina.smartschool.device.client.service;
+
+import com.usoftchina.smartschool.device.client.jdbc.DynamicDataSourceContextHolder;
+import com.usoftchina.smartschool.device.client.jdbc.DynamicDataSourceRegister;
+import com.usoftchina.smartschool.device.client.po.IcCard;
+import com.usoftchina.smartschool.device.client.repository.IcCardRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author yingp
+ * @date 2019/3/11
+ */
+@Service
+public class IcCardService {
+
+    @Autowired
+    private IcCardRepository icCardRepository;
+
+    @Autowired
+    private DynamicDataSourceRegister dynamicDataSourceRegister;
+
+    public IcCard find() {
+        return icCardRepository.find();
+    }
+
+    public void save(IcCard card) {
+        IcCard oldOne = find();
+        if (null != oldOne) {
+            icCardRepository.update(card);
+            dynamicDataSourceRegister.unregister(oldOne);
+        } else {
+            icCardRepository.save(card);
+        }
+        dynamicDataSourceRegister.createDataSource(card);
+    }
+
+    public void startListen() {
+        IcCard card = find();
+        DynamicDataSourceContextHolder.set(card);
+        try {
+            // TODO
+        } finally {
+            DynamicDataSourceContextHolder.clear();
+        }
+    }
+}

+ 28 - 0
applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/service/SchoolService.java

@@ -0,0 +1,28 @@
+package com.usoftchina.smartschool.device.client.service;
+
+import com.usoftchina.smartschool.device.client.po.School;
+import com.usoftchina.smartschool.device.client.repository.SchoolRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author yingp
+ * @date 2019/3/11
+ */
+@Service
+public class SchoolService {
+    @Autowired
+    private SchoolRepository schoolRepository;
+
+    public School find() {
+        return schoolRepository.find();
+    }
+
+    public void save(School school) {
+        if (null != find()) {
+            schoolRepository.update(school);
+        } else {
+            schoolRepository.save(school);
+        }
+    }
+}

+ 5 - 4
applications/device/device-client/src/main/resources/application.yml

@@ -15,10 +15,11 @@ spring:
       charset: utf-8
       enabled: true
   datasource:
-    driver-class-name: org.h2.Driver
-    url: jdbc:h2:file:./data/device-client;FILE_LOCK=NO;DB_CLOSE_ON_EXIT=FALSE
-    username: admin
-    password: select111***
+    primary:
+      driver-class-name: org.h2.Driver
+      jdbc-url: jdbc:h2:file:./data/device_client;FILE_LOCK=NO;DB_CLOSE_ON_EXIT=FALSE
+      username: admin
+      password: select111***
     hikari:
       minimum-idle: 5
       maximum-pool-size: 50

+ 23 - 0
applications/device/device-client/src/main/resources/schema.sql

@@ -0,0 +1,23 @@
+create table if not exists access_control
+(
+id varchar(50) primary key not null,
+name varchar(300) not null,
+ip varchar(20) not null,
+port int not null,
+username varchar(30) not null,
+password varchar(50) not null
+);
+
+create table if not exists school
+(
+name varchar(500) primary key not null
+);
+
+create table if not exists iccard
+(
+ip varchar(20) not null,
+port int not null,
+username varchar(30) not null,
+password varchar(50) not null,
+databaseName varchar(30) not null
+);

+ 18 - 27
applications/device/device-client/src/main/resources/static/index.html

@@ -37,31 +37,31 @@
                 </button>
             </div>
             <div class="modal-body">
-                <form>
+                <form id="form">
                     <div class="form-group">
                         <label for="nameInput">名称</label>
-                        <input type="text" class="form-control" id="nameInput" required
+                        <input type="text" class="form-control" id="nameInput" name="name" required
                                aria-describedby="nameHelp" placeholder="设备名称">
                     </div>
                     <div class="form-group">
                         <label for="ipInput">IP</label>
-                        <input type="text" class="form-control" id="ipInput" required
+                        <input type="text" class="form-control" id="ipInput" name="ip" required
                                aria-describedby="ipHelp" placeholder="ip地址,例如192.168.1.100">
                     </div>
                     <div class="form-group">
                         <label for="portInput">端口</label>
-                        <input type="text" class="form-control" id="portInput" required
+                        <input type="text" class="form-control" id="portInput" name="port" required
                                aria-describedby="portHelp" placeholder="tcp端口,例如37777">
                     </div>
                     <div class="form-group">
                         <label for="usernameInput">账号</label>
-                        <input type="text" class="form-control" id="usernameInput" value="admin" required
-                               aria-describedby="usernameHelp" placeholder="登录账号,例如admin">
+                        <input type="text" class="form-control" id="usernameInput" name="username"
+                               value="admin" required aria-describedby="usernameHelp" placeholder="登录账号,例如admin">
                     </div>
                     <div class="form-group">
                         <label for="passwordInput">密码</label>
-                        <input type="password" class="form-control" id="passwordInput" required
-                               aria-describedby="passwordHelp" placeholder="登录密码">
+                        <input type="password" class="form-control" id="passwordInput" name="password"
+                               required aria-describedby="passwordHelp" placeholder="登录密码">
                     </div>
                 </form>
             </div>
@@ -75,34 +75,25 @@
 <table class="table">
     <thead class="thead-light">
     <tr>
-        <th scope="col">#</th>
         <th scope="col">名称</th>
         <th scope="col">IP</th>
         <th scope="col">端口</th>
     </tr>
     </thead>
     <tbody>
-    <tr>
-        <th scope="row">1</th>
-        <td>Mark</td>
-        <td>Otto</td>
-        <td>@mdo</td>
-    </tr>
-    <tr>
-        <th scope="row">2</th>
-        <td>Jacob</td>
-        <td>Thornton</td>
-        <td>@fat</td>
-    </tr>
-    <tr>
-        <th scope="row">3</th>
-        <td>Larry</td>
-        <td>the Bird</td>
-        <td>@twitter</td>
-    </tr>
     </tbody>
 </table>
+<script id="template-html" type="text/html">
+    <%for(var i in data){%>
+    <tr>
+        <td><%=data[i].name%></td>
+        <td><%=data[i].ip%></td>
+        <td><%=data[i].port%></td>
+    </tr>
+    <%}%>
+</script>
 <script src="/js/jquery.min.js"></script>
 <script src="/js/bootstrap.min.js"></script>
+<script src="/js/template.min.js"></script>
 <script src="/js/index.js"></script>
 </body>

+ 46 - 2
applications/device/device-client/src/main/resources/static/js/index.js

@@ -1,5 +1,49 @@
 $(document).ready(function () {
-   $('#saveBtn').click(function(){
+    var app = {
+        data: {
+            accessControls: []
+        },
+        methods: {
+            getList: function () {
+                $.ajax({
+                    url: '/api/accesscontrol',
+                    method: 'GET',
+                    success: function (content) {
+                        if (content.success) {
+                            app.data.accessControls = content.data;
+                            $('.table tbody').html(template($('#template-html').text(), content));
+                        } else {
+                            alert(content.message);
+                        }
+                    }
+                });
+            },
+            save: function () {
+                // var name = $('#nameInput').val(),
+                //     ip = $('#ipInput').val(),
+                //     port = $('#portInput').val(),
+                //     username = $('usernameInput').val(),
+                //     password = $('passwordInput').val();
+                $.ajax({
+                    url: '/api/accesscontrol',
+                    method: 'POST',
+                    data: $('#form').serialize(),
+                    success: function () {
+                        window.location.reload();
+                    },
+                    error: function () {
 
-   });
+                    }
+                });
+            }
+        },
+        init: function () {
+            $('#saveBtn').click(function () {
+                app.methods.save();
+            });
+            app.methods.getList();
+        }
+    };
+
+    app.init();
 });

File diff suppressed because it is too large
+ 0 - 0
applications/device/device-client/src/main/resources/static/js/template.min.js


Some files were not shown because too many files changed in this diff