diff --git a/build.gradle b/build.gradle index 57fb1434879e743256de069ce00e844c2c4dc68f..8d359787ce8628dbb4933c80c53d4a6d91fad470 100644 --- a/build.gradle +++ b/build.gradle @@ -24,14 +24,15 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-jdbc' + implementation 'org.mariadb.jdbc:mariadb-java-client:2.1.2' + compileOnly 'org.projectlombok:lombok' testImplementation 'org.projectlombok:lombok:1.18.28' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation 'org.springframework.boot:spring-boot-starter-validation' -// implementation 'org.springframework.boot:spring-boot-starter-jdbc' -// implementation 'org.mariadb.jdbc:mariadb-java-client:2.1.2' } tasks.named('bootBuildImage') { diff --git a/identifier.sqlite b/identifier.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/main/java/Team5.Smarttowns/Data/Towns.db b/src/main/java/Team5.Smarttowns/Data/Towns.db new file mode 100644 index 0000000000000000000000000000000000000000..2532550d9acf4d8abc21a6e6ed89629908b72a3e Binary files /dev/null and b/src/main/java/Team5.Smarttowns/Data/Towns.db differ diff --git a/src/main/java/Team5/SmartTowns/Data/DatabaseController.java b/src/main/java/Team5/SmartTowns/Data/DatabaseController.java new file mode 100644 index 0000000000000000000000000000000000000000..b91d7d880368f6cb405e3ed71c38242f612bfae2 --- /dev/null +++ b/src/main/java/Team5/SmartTowns/Data/DatabaseController.java @@ -0,0 +1,40 @@ +package Team5.SmartTowns.Data; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.servlet.ModelAndView; + +import java.util.*; +@Controller +public class DatabaseController { + + @Autowired + private UserRepository userRepository; + @Autowired + private locationRepository locationRepository; + @Autowired + private trailsRepository trailsRepository; + + @GetMapping("/userList") + public ModelAndView userList() { + ModelAndView mav = new ModelAndView("towns/userData"); + List<user> users = userRepository.getAllUsers(); + mav.addObject("users", users); + return mav; + } + @GetMapping("/trailList") + public ModelAndView trailList() { + ModelAndView mav1 = new ModelAndView("towns/trailsData"); + List<trail> trail = trailsRepository.getAllTrails(); + mav1.addObject("trails", trail); + return mav1; + } + @GetMapping("locationList") + public ModelAndView locationList(){ + ModelAndView mav2 = new ModelAndView("towns/locationData"); + List<location> locations = locationRepository.getAllLocation(); + mav2.addObject("location", locations); + return mav2; + } +} diff --git a/src/main/java/Team5/SmartTowns/Data/UserRepository.java b/src/main/java/Team5/SmartTowns/Data/UserRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..172591d6500927a341d6534dca6c34728965db06 --- /dev/null +++ b/src/main/java/Team5/SmartTowns/Data/UserRepository.java @@ -0,0 +1,8 @@ +//Holds users data repository +package Team5.SmartTowns.Data; + +import java.util.List; + +public interface UserRepository { + List<user> getAllUsers(); +} diff --git a/src/main/java/Team5/SmartTowns/Data/UserRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/Data/UserRepositoryJDBC.java new file mode 100644 index 0000000000000000000000000000000000000000..63e0bad0a8a3abf5f09c435a749066f51f7100fc --- /dev/null +++ b/src/main/java/Team5/SmartTowns/Data/UserRepositoryJDBC.java @@ -0,0 +1,36 @@ +//Implements the users repository using JDBC +package Team5.SmartTowns.Data; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public class UserRepositoryJDBC implements UserRepository{ + + private JdbcTemplate jdbc; + private RowMapper<user> userMapper; + + public UserRepositoryJDBC(JdbcTemplate aJdbc){ + this.jdbc = aJdbc; + setuserMapper(); + } + + + private void setuserMapper(){ + userMapper = (rs, i) -> new user( + rs.getInt("userID"), + rs.getString("name") + ); + } + + + + @Override + public List<user> getAllUsers(){ + String sql= "SELECT * FROM users"; + return jdbc.query(sql, userMapper); + } +} diff --git a/src/main/java/Team5/SmartTowns/Data/location.java b/src/main/java/Team5/SmartTowns/Data/location.java new file mode 100644 index 0000000000000000000000000000000000000000..f74adb71039eb1a254e379e56a16ca16d7e3cf32 --- /dev/null +++ b/src/main/java/Team5/SmartTowns/Data/location.java @@ -0,0 +1,12 @@ +//Holds variable data for the locations table +package Team5.SmartTowns.Data; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class location { + private int locationID; + private String name; +} diff --git a/src/main/java/Team5/SmartTowns/Data/locationRepository.java b/src/main/java/Team5/SmartTowns/Data/locationRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..772f335edeb43376b96a4a2045ceddbbb8bf9690 --- /dev/null +++ b/src/main/java/Team5/SmartTowns/Data/locationRepository.java @@ -0,0 +1,10 @@ +//Holds locations data repository +package Team5.SmartTowns.Data; + +import java.util.List; + +public interface locationRepository { + List<location> getAllLocation(); + + +} diff --git a/src/main/java/Team5/SmartTowns/Data/locationRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/Data/locationRepositoryJDBC.java new file mode 100644 index 0000000000000000000000000000000000000000..b11671ee54d102354431f6917b297ba179f388d9 --- /dev/null +++ b/src/main/java/Team5/SmartTowns/Data/locationRepositoryJDBC.java @@ -0,0 +1,29 @@ +//Implements the locations repository using JDBC +package Team5.SmartTowns.Data; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public class locationRepositoryJDBC implements locationRepository { + private JdbcTemplate jdbc; + private RowMapper<location> locationMapper; + + public locationRepositoryJDBC(JdbcTemplate aJdbc) { + this.jdbc = aJdbc; + setlocationMapper(); + } + private void setlocationMapper(){ + locationMapper = (rs, i) -> new location( + rs.getInt("locationID"), + rs.getString("name") + ); + } + public List<location> getAllLocation(){ + String sql= "SELECT * FROM locations"; + return jdbc.query(sql, locationMapper); + } +} diff --git a/src/main/java/Team5/SmartTowns/Data/trail.java b/src/main/java/Team5/SmartTowns/Data/trail.java new file mode 100644 index 0000000000000000000000000000000000000000..86e78b96712ecf7a5756edbf20a4bae35839ca70 --- /dev/null +++ b/src/main/java/Team5/SmartTowns/Data/trail.java @@ -0,0 +1,12 @@ +//Holds variable data for the trails table +package Team5.SmartTowns.Data; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class trail { + private int trailsId; + private String name; +} diff --git a/src/main/java/Team5/SmartTowns/Data/trailsRepository.java b/src/main/java/Team5/SmartTowns/Data/trailsRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..52d8dc39b9bda0a7390f06afca8769a5fd0607a9 --- /dev/null +++ b/src/main/java/Team5/SmartTowns/Data/trailsRepository.java @@ -0,0 +1,8 @@ +//Holds trails data repository +package Team5.SmartTowns.Data; + +import java.util.List; + +public interface trailsRepository { + List<trail> getAllTrails(); +} diff --git a/src/main/java/Team5/SmartTowns/Data/trailsRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/Data/trailsRepositoryJDBC.java new file mode 100644 index 0000000000000000000000000000000000000000..58aa84a95b00b8f8b5d7f97d240e04f405d2ac3b --- /dev/null +++ b/src/main/java/Team5/SmartTowns/Data/trailsRepositoryJDBC.java @@ -0,0 +1,28 @@ +//Implements the trails repository using JDBC +package Team5.SmartTowns.Data; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public class trailsRepositoryJDBC implements trailsRepository{ + private JdbcTemplate jdbc; + private RowMapper<trail> trailMapper; + public trailsRepositoryJDBC(JdbcTemplate aJdbc){ + this.jdbc = aJdbc; + settrailsMapper(); + } + private void settrailsMapper(){ + trailMapper = (rs, i) -> new trail( + rs.getInt("trailID"), + rs.getString("name") + ); + } + public List<trail> getAllTrails(){ + String sql= "SELECT * FROM trails"; + return jdbc.query(sql, trailMapper); + } +} diff --git a/src/main/java/Team5/SmartTowns/Data/user.java b/src/main/java/Team5/SmartTowns/Data/user.java new file mode 100644 index 0000000000000000000000000000000000000000..a40350ebc13621da4fb8a89f4e58d2ccb5be2568 --- /dev/null +++ b/src/main/java/Team5/SmartTowns/Data/user.java @@ -0,0 +1,12 @@ +//Holds variable data for the users table +package Team5.SmartTowns.Data; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class user { + private int userId; + private String name; +} diff --git a/src/main/resources/QRCodeScanner.html b/src/main/resources/QRCodeScanner.html new file mode 100644 index 0000000000000000000000000000000000000000..11da0658b1421e28159c97fc5abae82030ff3630 --- /dev/null +++ b/src/main/resources/QRCodeScanner.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>QR Camera</title> +</head> +<body> + +</body> +</html> \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8b137891791fe96927ad78e64b0aad7bded08bdc..95f46c69ab2c6b38e1c520a5b8438c8f87aba0a3 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,5 @@ +spring.datasource.url=jdbc:mariadb://localhost:3306/towns +spring.datasource.username=root +spring.datasource.password=comsc +spring.sql.init.mode=always diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql new file mode 100644 index 0000000000000000000000000000000000000000..f7656769c7d1b2afd5e78e3a93c3cd3ed44abe3b --- /dev/null +++ b/src/main/resources/data.sql @@ -0,0 +1,11 @@ +delete from users; +insert into users (userID, Name) value ('1', 'Hannah'); +insert into users (userID, Name) value ('2', 'Nigel'); + +delete from trails; +insert into trails (trailID, Name) value ('1', 'Caerphilly Coffee Trail'); +insert into trails (trailID, Name) value ('2', 'Penarth Dragon Trail'); + +delete from locations; +insert into locations (locationID, Name) value ('1', 'Caerphilly'); +insert into locations (locationID, Name) value ('2', 'Penarth'); \ No newline at end of file diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql new file mode 100644 index 0000000000000000000000000000000000000000..8d9e102d1f6b02b1f864e396f591a4a61aad8b41 --- /dev/null +++ b/src/main/resources/schema.sql @@ -0,0 +1,18 @@ +drop table if exists trails; +create table if not exists trails +( + trailID bigint auto_increment primary key, + name varchar(128) +) engine=InnoDB; +drop table if exists locations; +create table if not exists locations +( + locationID bigint auto_increment primary key, + name varchar(128) +) engine=InnoDB; +drop table if exists users; +create table if not exists users +( + userID bigint auto_increment primary key, + name varchar(128) +) engine=InnoDB; \ No newline at end of file diff --git a/src/main/resources/static/images/Facebook.png b/src/main/resources/static/images/Facebook.png index 259359777e3e7c2ea4f31e00df81dbf075570f84..e510c31874240120ec7ce84676f8a486bbc86923 100644 Binary files a/src/main/resources/static/images/Facebook.png and b/src/main/resources/static/images/Facebook.png differ diff --git a/src/main/resources/static/images/Instagram.jpg b/src/main/resources/static/images/Instagram.jpg index 0c7f47366beef8b56464e6214276ab46e2c8ab66..59e94d4c36bac36d4cdc346293568721a23d0082 100644 Binary files a/src/main/resources/static/images/Instagram.jpg and b/src/main/resources/static/images/Instagram.jpg differ diff --git a/src/main/resources/static/images/LinkedIn.jpg b/src/main/resources/static/images/LinkedIn.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6bf094d20c89883756ec5a105ec2cea1f9eeaf76 Binary files /dev/null and b/src/main/resources/static/images/LinkedIn.jpg differ diff --git "a/src/main/resources/static/images/Twitter-Log\320\276.png" "b/src/main/resources/static/images/Twitter-Log\320\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..c475939bfacb4be3559aab3d58a9a5eadf036afb Binary files /dev/null and "b/src/main/resources/static/images/Twitter-Log\320\276.png" differ diff --git a/src/main/resources/static/users.html b/src/main/resources/static/users.html new file mode 100644 index 0000000000000000000000000000000000000000..566549bdf8fae810809c1a81066000687cb338f6 --- /dev/null +++ b/src/main/resources/static/users.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Title</title> +</head> +<body> + +</body> +</html> \ No newline at end of file diff --git a/src/main/resources/templates/towns/UserData.html b/src/main/resources/templates/towns/UserData.html new file mode 100644 index 0000000000000000000000000000000000000000..3545df540058819df3883482d36f916407e449c8 --- /dev/null +++ b/src/main/resources/templates/towns/UserData.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>User Information</title> +</head> +<body> +<div> + <ul th:each="user:${users}"> + <li th:text="${user}"></li> + </ul> +</div> +</body> +</html> \ No newline at end of file diff --git a/src/main/resources/templates/towns/locationData.html b/src/main/resources/templates/towns/locationData.html new file mode 100644 index 0000000000000000000000000000000000000000..f7636f05a3a0dbfc2ed2e87a8964f637b5e91046 --- /dev/null +++ b/src/main/resources/templates/towns/locationData.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Location Data</title> +</head> +<body> +<div> + <ul th:each="locations:${location}"> + <li th:text="${locations}"></li> + </ul> +</div> +</body> +</html> \ No newline at end of file diff --git a/src/main/resources/templates/towns/templates.server/Templating.html b/src/main/resources/templates/towns/templates.server/Templating.html new file mode 100644 index 0000000000000000000000000000000000000000..14343a76ea3cc2974dbdd50cc7bd3ade124adc17 --- /dev/null +++ b/src/main/resources/templates/towns/templates.server/Templating.html @@ -0,0 +1,149 @@ +<header class="headerBar th:fragment="header"> + + <div class="Logo"> + <img th:src="@{images/VZTA.png}" alt="VZTA Logo"> + </div> + <nav class="navBar"> + <ul> + <li>Home</li> + <li>FAQs</li> + <li>Contact us</li> + </ul> + <label class="work">Who we Work with:</label> + <select> + <ul> + <option value="localauthorities">Local Authorities</option> + <option value="towns">Towns</option> + <option value="businesses">Businesses</option> + <option value="consumers">Consumers</option> + </ul> + </select> + </nav> + </header> + + <div class="footerBar" th:fragment="footer"> + <div class="containerFooter"> + <div class="leftFooter"> + <h3>VZTA</h3> + Near Me Now LTD + <br>Britania House + <br>Caerphilly Business Park + <br>Caerphilly + <br>CF83 3GG + </div> + <div class="rightFooter"> + <h3>Connect with us</h3> + <p>Be the first to know about updates by joining out Community page</p> + (C) VZTA 2022<br> + Policy Terms and Conditions + </div> + <div class="centerFooter"> + <span class="footerText"> + <h3>Follow Us</h3> + <a th:href=="https://www.facebook.com/VZTAsmarttowns/" class="icon"></a><img th:src="@{images/Facebook.png}" alt="Facebook Logo" class="picture"> + <a th:href=="https://www.twitter.com/VZTAsmarttowns/" class="icon"></a><img th:src="@{images/Twitter-Logo.png}" alt="X (formally Twitter) Logo" class="picture"> + <a th:href=="https://www.instagram.com/vztasmarttowns/" class="icon"></a><img th:src="@{images/Instagram.jpg}" alt="Instagram Logo" class="picture"> + <a th:href=="https://'www.linkin.com/company/vztasmarttowns/" class="icon"></a><img th:src="@{images/LinkedIn.jpg}" alt="Linkedin Logo" class="picture"> <br> + </span> + </div> + <div class="copyright" style="text-align: left"> + + </div> + </div> + </div> +</div> +<style> + /* Header */ + .headerBar { + border-bottom: 2px rgb(230, 230, 230) solid; + margin-bottom: 20px; + display: flex; + background: blueviolet; + } + /* Navbar Links */ + .navBar { + margin-top: 50px; + margin-left: auto; + margin-right:20px; + text-align: right; + } + .work{ + color: rgb(255, 255, 255); + } + .navBar ul { + list-style: none; + display: flex; + margin-left: 100px; + } + .navBar a { + border-left: 2px rgb(185, 185, 185) solid; + padding: 10px 40px; + text-decoration: none; + color:rgb(87, 86, 86); + white-space: nowrap; + overflow: hidden; + float: right; + } + .navBar a:hover { + background-color: rgb(209, 209, 209); + } + .navBar li{ + margin-left: 10px; + margin-right: 10px; + color: rgb(255, 255, 255); + } + .navListLast { + border-right: 2px rgb(185, 185, 185) solid; + margin-right:40px; + } + + /* Navbar Logo */ + .Logo { + margin-left:10px; + padding: 20px; + width: fit-content; + } + .Logo img { + width: 120px; + margin-left:15px; + } + + /* Footer */ + footer { + margin-top:20px; + display: flex; + justify-content: center; + } + .footerBar{ + border-top: 2px rgb(230, 230, 230) solid; + text-align: left; + display: flex; + background: blueviolet; + color: rgb(255, 255, 255); + padding-left: 30px; + } + .footerBar ul { + list-style: none; + display: flex; + } + .copyright{ + text-align: left; + display: flex; + } + .containerFooter{ + display: flex; + flex-direction: row; + } + .leftFooter{ + flex:1; + color: rgb(255, 255,255); + } + .centerFooter{ + flex: 1; + color: rgb(255, 255,255); + } + .rightFooter{ + flex:1; + color: rgb(255, 255, 255); + } +</style> \ No newline at end of file diff --git a/src/main/resources/templates/towns/trailsData.html b/src/main/resources/templates/towns/trailsData.html new file mode 100644 index 0000000000000000000000000000000000000000..eed9252284628bd058083f4f1cb13878b71f5b2f --- /dev/null +++ b/src/main/resources/templates/towns/trailsData.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Trails Information</title> +</head> +<body> +<div> + <ul th:each="trail:${trails}"> + <li th:text="${trail}"></li> + </ul> +</div> +</body> +</html> \ No newline at end of file