# CTBC台北-1 2023/2/22
# 環境檢查
## 環境檢查
### cmd
### `java -version`
### `javac -version`
### `where java`
### 設定JAVA_HOME
### 設定Path
* `%JAVA_HOME%\bin`
### Eclipse的設定位置


### Add JRE

### 測試eclipse的連網 (下午)
### Windows/Preference
### https://github.com/adobe-fonts/source-code-pro

### Demo1 Review熱鍵
```java
package lab1;
import java.util.ArrayList;
import java.util.List;
// 使用alt+/
// 使用ctrl+shift+F
// ctrl+shift+O
// alt+上, alt+下
// ctrl+/ 註解(toggle)
// alt+shift+S ==> 對source生成...
public class Lab1Main {
public static void main(String[] args) {
// 1 設定環境
// 2 講解規則
// 3 設定學習目標
List<String> studied = new ArrayList<String>();
List<String> studied2 = new ArrayList<String>();
// 4 執行
String[] targets = { "Java", "Spring Boot", "Angular", "Domain Driven Design" };
for (String s : targets) { // ctrl+click 物件變數==> 物件的定義
System.out.println("選取的是:" + s);
}
}
}
```
### lab2
```java
package lab2;
// 單行註解
/*
* 我是
* 多
* 行註解
*
*/
/**
* 我是說明文件
* @author Admin
*
*/
public class Lab2Main {
public static void main(String[] args) {
// 001, 010, 100, 011,
String s1 = "111101011010";
int x1 = Integer.parseInt(s1, 2);
int x2 = 0b111101011010;
System.out.printf("x1=%d x2=%d \n", x1, x2);
int x3 = 1_0000_0000;
int x4 = 100_000_000;
System.out.printf("x3=%d, x4=%d, x3-x4=%d \n", x3, x4, x3-x4);
// System.out.println("good bye");
}
}
```



# Day2
* %JAVA_HOME%\bin
## jconsole
## jarsigner
## keytool
### https://martinfowler.com/books/uml.html



# https://zh.wikipedia.org/zh-tw/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%EF%BC%9A%E5%8F%AF%E5%A4%8D%E7%94%A8%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E8%BD%AF%E4%BB%B6%E7%9A%84%E5%9F%BA%E7%A1%80


# https://www.manning.com/
# https://www.manning.com/books/regular-expression-puzzles-and-ai-coding-assistants


# https://git-scm.com/
## week1的原始碼:
* https://drive.google.com/file/d/1JQIStmhHJz0xKpaz38zOfXV5LXrMXJ8k/view?usp=sharing


# Day4
![Uploading file..._5h4x8hi1f]()

# Day5
1. https://start.spring.io/
https://start.spring.io/









# http://localhost:8080/
# http://localhost:8080/actuator
# https://git-scm.com/
```
git --version
```
# 正式開始
1. https://start.spring.io/






# share the project setup
* copy/paste this
* https://start.spring.io/#!type=maven-project&language=java&platformVersion=2.7.9&packaging=jar&jvmVersion=11&groupId=com.ctbcbank.boot&artifactId=lab1&name=lab1&description=Demo%20project%20for%20Spring%20Boot&packageName=com.ctbcbank.boot.lab1&dependencies=devtools,h2,web,thymeleaf,lombok,actuator,validation,data-jpa
* 解壓縮
* File/Import



```
spring-boot:run
```

# http://localhost:8080/
# http://localhost:8080/actuator

# https://git-scm.com/book/zh-tw/v2/%E9%96%8B%E5%A7%8B-%E5%88%9D%E6%AC%A1%E8%A8%AD%E5%AE%9A-Git
```
git config --global user.name "Mark Ho"
git config --global user.email "mark@patristar.com"
```
more .gitconfig








# 午休完的準備
* 用marketplace安裝web tools
* 下載2-3張圖形到桌面備用
# https://projectlombok.org/


* https://www.tenlong.com.tw/products/9789864345618?list_name=srh

```
surefire-report:report
```
# C:\Users\Admin\Desktop\2023_Mar_02\lab1\target\site
# Day6
## https://learn.microsoft.com/en-us/dotnet/architecture/modern-web-apps-azure/common-web-application-architectures
## mvnw --version
* 告訴你maven版本, 抓到的JDK version
## mvnw install
## mvnw spring-boot:run
## mvnw test
## mvnw surefire-report:report

## https://martinfowler.com/books/refactoring.html

# Lab1&2的準備




* https://start.spring.io/#!type=maven-project&language=java&platformVersion=2.7.9&packaging=jar&jvmVersion=11&groupId=com.ctbcbank.lab&artifactId=lab1&name=lab1&description=Demo%20project%20for%20Spring%20Boot&packageName=com.ctbcbank.lab.lab1&dependencies=lombok,devtools,web,thymeleaf,h2,data-jpa,validation,actuator
```
https://start.spring.io/#!type=maven-project&language=java&platformVersion=2.7.9&packaging=jar&jvmVersion=11&groupId=com.ctbcbank.lab&artifactId=lab1&name=lab1&description=Demo%20project%20for%20Spring%20Boot&packageName=com.ctbcbank.lab.lab1&dependencies=lombok,devtools,web,thymeleaf,h2,data-jpa,validation,actuator
```



# mvnw install
# mvnw spring-boot:run
* ctrl+c停掉
# mvnw test
# mvnw surefire-report:report
# mvnw dependency:tree


* new
# https://junit.org/junit5/docs/current/user-guide/#extensions-exception-handling
* original
# https://junit.org/junit5/docs/current/user‑guide/#extensionsexception‑handling
# 作業1
* https://drive.google.com/file/d/1_uE3sJQadeLJySGoijdwDF-x_7SRAypo/view?usp=sharing
# week2的code
* https://drive.google.com/file/d/1ScZOm2C1m_v-t8kyExJiwqUPmB9jk8QT/view?usp=sharing
# Week3 Day3
## package com.ctbcbank.boot.lab1.bean
### CourseForm.java
```java
package com.ctbcbank.boot.lab1.bean;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
import lombok.Getter;
import lombok.Setter;
//@Data
public class CourseForm {
@NotEmpty
@Size(min=5, max=30)
@Getter
@Setter
private String courseId;
@Getter
@Setter
private String courseName;
@Getter
@Setter
private Integer duration;
}
```
## 縮減的型式
### 完成的如下
```java
package com.ctbcbank.boot.lab1.bean;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import lombok.Data;
@Data
public class CourseForm {
@NotEmpty
@Size(min=5, max=30)
private String courseId;
@NotEmpty
private String courseName;
@NotNull
@Min(7)
private Integer duration;
}
```

### 樣版
```html
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
```



# When you want to implement a MVC
## html --> view
* `course.html`
## controller --> @Controller
## Model --> form (data bean)
# CourseController.java
```java
package com.ctbcbank.boot.lab1.controllers;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class CourseController {
@GetMapping("/course")
public String showCourse() {
return "course";
}
}
```
# 講解lab
## https://start.spring.io/
* https://start.spring.io/#!type=maven-project&language=java&platformVersion=2.7.9&packaging=jar&jvmVersion=11&groupId=com.ctbcbank.lab&artifactId=workthrough1&name=workthrough1&description=Demo%20project%20for%20Spring%20Boot&packageName=com.ctbcbank.lab.workthrough1&dependencies=web,devtools,lombok,validation
## git建立基礎
* 從start.spring.io新增, 初始相依性web,devtools,lombok,validation


* `git status`
* https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/UUID.html
* Course
```java
package com.ctbcbank.lab.workthrough1.model;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@NoArgsConstructor
@AllArgsConstructor
public class Course {
@Getter
@Setter
private UUID id;
@Getter
@Setter
private String name;
@Getter
@Setter
private int price;
@Getter
@Setter
private CourseCategory category;
}
```
* CourseCategory
```java
package com.ctbcbank.lab.workthrough1.model;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@AllArgsConstructor
@NoArgsConstructor
public class CourseCategory {
@Getter
@Setter
private String name;
@Getter
@Setter
private String detail;
@Getter
@Setter
private UUID id;
}
```
# CourseTest.java
```java
package com.ctbcbank.lab.workthrough1.lab1;
import java.util.UUID;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import com.ctbcbank.lab.workthrough1.model.Course;
public class CourseTest {
@Test
public void noArgumentTest() {
Course c1 = new Course();
//Course c1 = null;
Assertions.assertNotNull(c1,
"course should not be null");
}
@Test
public void allArgsTest() {
Course c1 = new Course(UUID.randomUUID(),"name",500,null);
Assertions.assertNotNull(c1,
"course should not be null");
}
}
```
* CourseService.java
```java
package com.ctbcbank.lab.workthrough1.service;
import java.util.List;
import java.util.UUID;
import com.ctbcbank.lab.workthrough1.model.Course;
import com.ctbcbank.lab.workthrough1.model.CourseCategory;
public interface CourseService {
List<Course> getAllCourse();
Course addCourse(String name, int price, CourseCategory cateogry);
void removeCourse(UUID id);
Course modifyCourse(UUID id, String name, int price, CourseCategory cateogry);
}
```
* CourseServiceJDKImplement
```java
package com.ctbcbank.lab.workthrough1.service;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import com.ctbcbank.lab.workthrough1.model.Course;
import com.ctbcbank.lab.workthrough1.model.CourseCategory;
public class CourseServiceJDKImplement implements CourseService {
private List<Course> course = new ArrayList<>();
@Override
public List<Course> getAllCourse() {
return course;
}
@Override
public Course addCourse(String name, int price, CourseCategory category) {
Course c1 = new Course(UUID.randomUUID(), name, price, category);
course.add(c1);
return c1;
}
@Override
public void removeCourse(UUID id) {
for (Course c : course) {
if (c.getId().equals(id)) {
course.remove(c);
}
}
}
@Override
public Course modifyCourse(UUID id, String name, int price, CourseCategory cateogry) {
for (Course c : course) {
if (c.getId().equals(id)) {
c.setName(name);
c.setPrice(price);
c.setCategory(cateogry);
return c;
}
}
return null;
}
}
```
* CourseCategoryService
```java
package com.ctbcbank.lab.workthrough1.service;
import java.util.List;
import java.util.UUID;
import com.ctbcbank.lab.workthrough1.model.CourseCategory;
public interface CourseCategoryService {
List<CourseCategory> getAllCourseCategory();
CourseCategory addCourseCategory(String name, String detail);
void removeCourseCategory(UUID id);
CourseCategory modifyCourseCategory(UUID id, String name,
String detail);
}
```
* CourseCategoryServiceJDKImplement
```java
package com.ctbcbank.lab.workthrough1.service;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import com.ctbcbank.lab.workthrough1.model.CourseCategory;
public class CourseCategoryServiceJDKImplement implements CourseCategoryService{
List<CourseCategory> categories = new ArrayList<>();
@Override
public List<CourseCategory> getAllCourseCategory() {
return categories;
}
@Override
public CourseCategory addCourseCategory(String name, String detail) {
UUID uuid = UUID.randomUUID();
CourseCategory category = new CourseCategory(name, detail,uuid);
categories.add(category);
return category;
}
@Override
public void removeCourseCategory(UUID id) {
for(CourseCategory category:categories) {
if (category.getId().equals(id)) {
categories.remove(category);
return;
}
}
}
@Override
public CourseCategory modifyCourseCategory(UUID id, String name, String detail) {
for(CourseCategory category:categories) {
if (category.getId().equals(id)) {
category.setName(name);
category.setDetail(detail);
return category;
}
}
return null;
}
}
```
* CourseFactory
```java
package com.ctbcbank.lab.workthrough1.factory;
import com.ctbcbank.lab.workthrough1.service.CourseService;
import com.ctbcbank.lab.workthrough1.service.CourseServiceJDKImplement;
public class CourseFactory {
// static
public static CourseService getService() {
CourseService s1 = new CourseServiceJDKImplement();
return s1;
}
}
```
* CourseForm.html
```html
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF8">
<title>課程管理介面</title>
</head>
<body>
<h1>課程表單</h1>
<form th:object="${courseForm}" method="post" th:action="@{/course}">
<table>
<tr>
<td>課程ID</td>
<td><input type="text" th:field="*{courseId}" /></td>
<td th:errors="*{courseId}">如果id有錯就會放在這兒</td>
</tr>
<tr>
<td>課程名稱</td>
<td><input type="text" th:field="*{courseName}" /></td>
<td th:errors="*{courseName}">如果name有錯就會放在這兒</td>
</tr>
<tr>
<td>課程時數</td>
<td><input type="number" th:field="*{duration}"></td>
<td th:errors="*{duration}"></td>
</tr>
<tr>
<td><button type="submit">Submit</button></td>
</tr>
</table>
</form>
</body>
</html>
```
* CourseController.java
```java
package com.ctbcbank.boot.lab1.controllers;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.ctbcbank.boot.lab1.bean.CourseForm;
import lombok.extern.slf4j.Slf4j;
@Controller
@Slf4j
public class CourseController implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/results").setViewName("results");
}
@GetMapping("/course")
public String showCourse(CourseForm x) {
return "course";
}
@PostMapping("/course")
public String checkCourse(@Valid CourseForm y,BindingResult bindingResult) {
log.info("get course from form:{}",y);
if (bindingResult.hasErrors()) {
log.info("validation got errors, need to fix");
return "course";
}
return "redirect:/results"; //這邊應該是個成功的網頁的URL
}
}
```
# maven
```
mvnw --version
mvnw clean
mvnw compile
mvnw package
java -jar target\lab1-0.0.1-SNAPSHOT.jar
```

```
mvnw dependency:tree
```
* https://tomcat.apache.org/whichversion.html
* https://www.postman.com/
* https://www.advancedrestclient.com/
# GreetingController
```java
package com.ctbcbank.boot.lab1.controllers;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class GreetingController {
private static final String NAME = "name";
private static final String PROMPT = "prompt";
@RequestMapping("/hello")
public String doGreet(
@RequestParam(value="name",required=false,defaultValue = "Brian") String name,
@RequestParam(value="prompt",required=false,defaultValue = "hello") String prompt
,Model model) {
model.addAttribute(NAME, name);
model.addAttribute(PROMPT,prompt);
return "greeting";
}
}
```
# HelloController
```java
package com.ctbcbank.boot.lab1.controllers;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/hello")
public class HelloController {
@GetMapping("")
public String getHello() {
return "hello_get";
}
@PostMapping("")
public String postHello() {
return "hello_post";
}
@PutMapping("")
public String putHello() {
return "hello_put";
}
@PatchMapping("")
public String patchHello() {
return "hello_patch";
}
@DeleteMapping("")
public String deleteHello() {
return "hello_delete";
}
}
```
* Customer.java
```java
package com.ctbcbank.boot.lab1.bean;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
public class Customer {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String lastName;
private String mobilePhone;
private String email;
}
```
* show-sql
* `spring.jpa.show-sql=true`
```
## change server port
# server.port=8880
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
```
* CustomerRunner.java
```java
package com.ctbcbank.boot.lab1.runner;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import com.ctbcbank.boot.lab1.bean.Customer;
import com.ctbcbank.boot.lab1.repository.CustomerRepository;
import lombok.extern.slf4j.Slf4j;
@Component
@Slf4j
public class CustomerRunner implements CommandLineRunner {
@Autowired
private CustomerRepository repository;
@Override
public void run(String... args) throws Exception {
// 塞幾筆資料
initData();
// 把資料取得
// SELECT * FROM CUSTOMER
for (Customer customer : repository.findAll()) {
log.info("get a customer:{}", customer);
}
repository.findAll().forEach(customer -> log.info("**{}", customer));
}
private void initData() {
Customer customer = new Customer();
customer.setLastName("Ho");
customer.setFirstName("Mark");
Customer customer2 = new Customer();
customer2.setLastName("Chiang");
customer2.setFirstName("Brian");
repository.save(customer);
repository.save(customer2);
}
}
```
* CustomerServiceJPAImplement.java
```java
package com.ctbcbank.boot.lab1.services;
import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ctbcbank.boot.lab1.bean.Customer;
import com.ctbcbank.boot.lab1.repository.CustomerRepository;
@Service
public class CustomerServiceJPAImplement implements CustomerService {
@Autowired
private CustomerRepository repository;
@Override
public List<Customer> findAll() {
return repository.findAll();
}
@Override
public Customer findOne(Long id) {
Optional<Customer> optionalCustomer = repository.findById(id);
return optionalCustomer.get();
}
@Override
public Customer create(Customer c) {
Customer savedCustomer = repository.save(c);
return savedCustomer;
}
@Override
public Customer update(Customer c) {
Customer savedCustomer = repository.save(c);
return savedCustomer;
}
@Override
public void delete(Long id) {
repository.deleteById(id);
}
}
```
* CustomerRestController
```java
package com.ctbcbank.boot.lab1.controllers;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
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 com.ctbcbank.boot.lab1.bean.Customer;
import com.ctbcbank.boot.lab1.services.CustomerService;
@RestController
@RequestMapping("/api/customers")
public class CustomerRestController {
@Autowired
private CustomerService service;
@GetMapping("")
public List<Customer> getAllCustomers() {
return service.findAll();
}
@PostMapping("")
public Customer createCustomer(@RequestBody Customer customer) {
return service.create(customer);
}
}
```
## 作業2
* https://drive.google.com/file/d/16GlB3RFKbnBwXEOZ-KbdtBGDeMqENylD/view?usp=sharing
## 第三周的程式碼整包
* https://drive.google.com/file/d/1K4jQU3VAG0myE8oMdngk0_-8ivJPcW_o/view?usp=sharing
# Day9

```
'Source Code Pro',Consolas, 'Courier New', monospace
```


```
node --version
npm --version
npm config ls
npm config get prefix
npm install -g npm
npm list -g
npm install -g @angular/cli
npm list -g
npm list -g --depth=2
```
```
ng serve
ng new lab1_no_strict --strict false
```
```
npm start
ng serve
```

# https://getbootstrap.com/

# lab2的準備工作
* https://start.spring.io/
* https://start.spring.io/#!type=maven-project&language=java&platformVersion=2.7.9&packaging=jar&jvmVersion=11&groupId=com.ctbcbank.lab&artifactId=backend&name=backend&description=Demo%20project%20for%20Spring%20Boot%2C%20as%20angular%20backend&packageName=com.ctbcbank.lab.backend&dependencies=devtools,lombok,web,thymeleaf,data-jpa,h2,validation
* https://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html/listeners.html
* 1.2.1
----------------------------
# Day10
### `ng serve`
### https://getbootstrap.com/docs/5.0/getting-started/introduction/
### https://getbootstrap.com/docs/5.0/components/buttons/
# Day11
### gyms.component.ts
```javascript
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-gyms',
templateUrl: './gyms.component.html',
styleUrls: ['./gyms.component.css'],
})
export class GymsComponent implements OnInit {
gyms = [
{ name: '復興北', count: 4 },
{ name: '北車京站', count: 3 },
{ name: '戶江高中', count: 12 },
];
onGymAdd(eventData: { name: string; count: number }) {
this.gyms.push({ name: eventData.name, count: eventData.count });
}
onGymDelete(deletedItemIndex: number) {
this.gyms.splice(deletedItemIndex, 1);
}
onGymUpdate(index: number, eventData: { name: string; count: number }) {
this.gyms[index] = { name: eventData.name, count: eventData.count };
}
allowReload = true;
searchCriteria = '找的預設值';
searchCriteria2 = '第二個預設值';
onSearchGym(event: Event) {
console.log('事件是:', event);
console.log('對象是:', event.target);
console.log('值是:', (event.target as HTMLInputElement).value);
this.searchCriteria = (event.target as HTMLInputElement).value;
}
onCheckStatus(condition) {
console.log('查詢是否可以重新載入', condition);
}
constructor() {
console.log('gyms component創建了!');
setTimeout(() => {
console.log('五秒後才會執行這個');
this.allowReload = false;
this.gyms.push({ name: '松菸', count: 10 });
setTimeout(() => {
console.log('五秒後才會執行這個');
this.allowReload = true;
this.gyms.push({ name: '民生東', count: 8 });
}, 5000);
}, 5000);
}
ngOnInit(): void {
console.log('gyms component初始化了');
}
}
```
# Day12
### bootstrap color
* https://getbootstrap.com/docs/4.0/utilities/colors/
* final angular
* https://drive.google.com/file/d/1DzSLSt0IL4JWfmKaAlwi3vX0h5DC1vDa/view?usp=sharing
* spring final
* https://drive.google.com/file/d/1OvSWJPyXYmzzjJjsiSQDGvwra7Mi-KZ7/view?usp=sharing