diff --git a/Assignment1/backend/Assignments/src/main/java/com/cyberlanting/Assignments/config/SwaggerConfig.java b/Assignment1/backend/Assignments/src/main/java/com/cyberlanting/Assignments/config/SwaggerConfig.java new file mode 100644 index 0000000..a02fef4 --- /dev/null +++ b/Assignment1/backend/Assignments/src/main/java/com/cyberlanting/Assignments/config/SwaggerConfig.java @@ -0,0 +1,18 @@ +package com.cyberlanting.Assignments.config; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@Slf4j +public class SwaggerConfig implements WebMvcConfigurer { + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + log.info("静态资源映射"); + registry.addResourceHandler("/swagger-ui/**") + .addResourceLocations("classpath:/META-INF/resources/webjars/springdoc-openapi-ui/") + .resourceChain(false); + } +} diff --git a/Assignment1/submit.zip b/Assignment1/submit.zip new file mode 100644 index 0000000..e261558 Binary files /dev/null and b/Assignment1/submit.zip differ diff --git a/Assignment1/submit/Restful API.png b/Assignment1/submit/Restful API.png new file mode 100644 index 0000000..93e4e98 Binary files /dev/null and b/Assignment1/submit/Restful API.png differ diff --git a/Assignment1/submit/backend/Assignments/pom.xml b/Assignment1/submit/backend/Assignments/pom.xml new file mode 100644 index 0000000..bad8201 --- /dev/null +++ b/Assignment1/submit/backend/Assignments/pom.xml @@ -0,0 +1,83 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.4.3 + + + com.cyberlanting + Assignments + 0.0.1-SNAPSHOT + Assignments + Assignments + + + + + + + + + + + + + + + 17 + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + org.projectlombok + lombok + provided + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.8.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Assignment1/submit/backend/Assignments/src/main/java/com/cyberlanting/Assignments/AssignmentsApplication.java b/Assignment1/submit/backend/Assignments/src/main/java/com/cyberlanting/Assignments/AssignmentsApplication.java new file mode 100644 index 0000000..c397e0e --- /dev/null +++ b/Assignment1/submit/backend/Assignments/src/main/java/com/cyberlanting/Assignments/AssignmentsApplication.java @@ -0,0 +1,13 @@ +package com.cyberlanting.Assignments; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class AssignmentsApplication { + + public static void main(String[] args) { + SpringApplication.run(AssignmentsApplication.class, args); + } + +} diff --git a/Assignment1/submit/backend/Assignments/src/main/java/com/cyberlanting/Assignments/controller/UserController.java b/Assignment1/submit/backend/Assignments/src/main/java/com/cyberlanting/Assignments/controller/UserController.java new file mode 100644 index 0000000..60589dd --- /dev/null +++ b/Assignment1/submit/backend/Assignments/src/main/java/com/cyberlanting/Assignments/controller/UserController.java @@ -0,0 +1,88 @@ +package com.cyberlanting.Assignments.controller; + +import com.cyberlanting.Assignments.pojo.User; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.*; + +import java.util.*; + +@Tag(name = "用户模块") +@RestController +@RequestMapping("/users") +public class UserController { + + // 创建线程安全的Map,模拟users信息的存储 + static Map users = Collections.synchronizedMap(new HashMap()); + + /** + * 处理"/users/"的GET请求,用来获取用户列表 + * + * @return + */ + @Operation(summary = "获取用户列表") + @GetMapping("/") + public List getUserList() { + // 还可以通过@RequestParam从页面中传递参数来进行查询条件或者翻页信息的传递 + List r = new ArrayList(users.values()); + return r; + } + + /** + * 处理"/users/"的POST请求,用来创建User + * + * @param user + * @return + */ + @Operation(summary = "新建用户") + @PostMapping("/") + public String postUser(@RequestBody User user) { + // @RequestBody注解用来绑定通过http请求中application/json类型上传的数据 + users.put(user.getId(), user); + return "success"; + } + + /** + * 处理"/users/{id}"的GET请求,用来获取url中id值的User信息 + * + * @param id + * @return + */ + @Operation(summary = "根据id获取用户") + @GetMapping("/{id}") + public User getUser(@PathVariable Long id) { + // url中的id可通过@PathVariable绑定到函数的参数中 + return users.get(id); + } + + /** + * 处理"/users/{id}"的PUT请求,用来更新User信息 + * + * @param id + * @param user + * @return + */ + @Operation(summary = "根据id修改用户") + @PutMapping("/{id}") + public String putUser(@PathVariable Long id, @RequestBody User user) { + User u = users.get(id); + u.setName(user.getName()); + u.setAge(user.getAge()); + users.put(id, u); + return "success"; + } + + /** + * 处理"/users/{id}"的DELETE请求,用来删除User + * + * @param id + * @return + */ + @Operation(summary = "删除用户") + @DeleteMapping("/{id}") + public String deleteUser(@PathVariable Long id) { + users.remove(id); + return "success"; + } + +} diff --git a/Assignment1/submit/backend/Assignments/src/main/java/com/cyberlanting/Assignments/pojo/User.java b/Assignment1/submit/backend/Assignments/src/main/java/com/cyberlanting/Assignments/pojo/User.java new file mode 100644 index 0000000..dc3cd6f --- /dev/null +++ b/Assignment1/submit/backend/Assignments/src/main/java/com/cyberlanting/Assignments/pojo/User.java @@ -0,0 +1,12 @@ +package com.cyberlanting.Assignments.pojo; + +import lombok.Data; + +@Data +public class User { + + private Long id; + private String name; + private Integer age; + +} diff --git a/Assignment1/submit/backend/Assignments/src/main/resources/application.yaml b/Assignment1/submit/backend/Assignments/src/main/resources/application.yaml new file mode 100644 index 0000000..ebab286 --- /dev/null +++ b/Assignment1/submit/backend/Assignments/src/main/resources/application.yaml @@ -0,0 +1,11 @@ +spring: + application: + name: Assignments + +#springdoc: +# api-docs: +# enable: true +# path: /v3/api-docs +# swagger-ui: +# enable: true +# path: /swagger-ui.html diff --git a/Assignment1/submit/backend/Assignments/src/test/java/com/cyberlanting/Assignments/AssignmentsApplicationTests.java b/Assignment1/submit/backend/Assignments/src/test/java/com/cyberlanting/Assignments/AssignmentsApplicationTests.java new file mode 100644 index 0000000..ad01079 --- /dev/null +++ b/Assignment1/submit/backend/Assignments/src/test/java/com/cyberlanting/Assignments/AssignmentsApplicationTests.java @@ -0,0 +1,88 @@ +package com.cyberlanting.Assignments; + +import com.cyberlanting.Assignments.controller.UserController; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.RequestBuilder; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + + +import java.nio.charset.StandardCharsets; + +import static org.hamcrest.Matchers.equalTo; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@ExtendWith(SpringExtension.class) +@SpringBootTest +class AssignmentsApplicationTests { + + private MockMvc mvc; + + + @BeforeEach + public void setUp() { + mvc = MockMvcBuilders.standaloneSetup(new UserController()) + .defaultResponseCharacterEncoding(StandardCharsets.UTF_8) // 编码格式 + .addDispatcherServletCustomizer(dispatcher -> + dispatcher.setDispatchOptionsRequest(true)) + .build(); + } + + @Test + public void testUserController() throws Exception { + // 测试UserController + RequestBuilder request; + + // 1、get查一下user列表,应该为空 + request = get("/users/"); + mvc.perform(request) + .andExpect(status().isOk()) + .andExpect(content().string(equalTo("[]"))); + + // 2、post提交一个user + request = post("/users/") + .contentType(MediaType.APPLICATION_JSON) + .content("{\"id\":1,\"name\":\"测试大师\",\"age\":20}"); + mvc.perform(request) + .andExpect(content().string(equalTo("success"))); + + // 3、get获取user列表,应该有刚才插入的数据 + request = get("/users/"); + mvc.perform(request) + .andExpect(status().isOk()) + .andExpect(content().string(equalTo("[{\"id\":1,\"name\":\"测试大师\",\"age\":20}]"))); + + // 4、put修改id为1的user + request = put("/users/1") + .contentType(MediaType.APPLICATION_JSON) + .content("{\"name\":\"测试终极大师\",\"age\":30}"); + mvc.perform(request) + .andExpect(content().string(equalTo("success"))); + + // 5、get一个id为1的user + request = get("/users/1"); + mvc.perform(request) + .andExpect(content().string(equalTo("{\"id\":1,\"name\":\"测试终极大师\",\"age\":30}"))); + + // 6、del删除id为1的user + request = delete("/users/1"); + mvc.perform(request) + .andExpect(content().string(equalTo("success"))); + + // 7、get查一下user列表,应该为空 + request = get("/users/"); + mvc.perform(request) + .andExpect(status().isOk()) + .andExpect(content().string(equalTo("[]"))); + + } + + +} diff --git a/Assignment1/submit/frontend/content.html b/Assignment1/submit/frontend/content.html new file mode 100644 index 0000000..f9a0f3e --- /dev/null +++ b/Assignment1/submit/frontend/content.html @@ -0,0 +1,46 @@ + + + + + + + + + 风景视图 + + + + +
+ +
+ + + + +
+ +
+
+

在湖畔的黄昏里,天空与山脉共舞,云霞映照出生命的绚烂。站在码头的尽头,我们都是这宇宙中的微小尘埃,却也能感受到大自然的壮丽与宁静。每一刻的美丽,都是生命对我们的馈赠,让我们学会珍惜,学会欣赏。

+ 示例图片 +
+
+

在这片静谧的自然角落,两只鸟儿相互依偎,彼此间的默契如同它们头顶上那金色的羽冠般闪耀。它们的存在是对抗孤独的力量,也是对和谐共生最美好的诠释。在这个瞬息万变的世界里,唯有真挚的情感才能跨越一切界限,让心灵得以栖息。

+ 示例图片 +
+
+

在这幅画面中,火烈鸟们优雅地站立着,它们的羽毛呈现出鲜艳的粉红色调,仿佛是大自然赋予的色彩盛宴。背景是一片翠绿的竹林,与火烈鸟形成了鲜明的对比。阳光透过树叶洒下斑驳的光影,为整个场景增添了一丝神秘的氛围。这两只火烈鸟似乎正在享受彼此的陪伴,它们的姿态亲密而温馨,让人感受到自然界中那份纯真的美好。

+ 示例图片 +
+
+

在这片宁静的山谷中,湖水清澈见底,倒映着巍峨的山峰和苍翠的森林。山峰被夕阳染成了金黄色,与蓝天白云相映成趣。这里是大自然的杰作,是人类心灵的净土。在这里,我们可以感受到生命的美好,领悟到人与自然的和谐共生。让我们珍惜这片土地,守护这份宁静,让大自然永远绽放它的光彩。

+ 示例图片 +
+
+
+ + + + + \ No newline at end of file diff --git a/Assignment1/submit/frontend/imgs/1-lakes.jpg b/Assignment1/submit/frontend/imgs/1-lakes.jpg new file mode 100644 index 0000000..1cedf4d Binary files /dev/null and b/Assignment1/submit/frontend/imgs/1-lakes.jpg differ diff --git a/Assignment1/submit/frontend/imgs/2-brown.jpg b/Assignment1/submit/frontend/imgs/2-brown.jpg new file mode 100644 index 0000000..38fb6ba Binary files /dev/null and b/Assignment1/submit/frontend/imgs/2-brown.jpg differ diff --git a/Assignment1/submit/frontend/imgs/3-birds.jpg b/Assignment1/submit/frontend/imgs/3-birds.jpg new file mode 100644 index 0000000..424d719 Binary files /dev/null and b/Assignment1/submit/frontend/imgs/3-birds.jpg differ diff --git a/Assignment1/submit/frontend/imgs/4-lake-mount.jpg b/Assignment1/submit/frontend/imgs/4-lake-mount.jpg new file mode 100644 index 0000000..af09156 Binary files /dev/null and b/Assignment1/submit/frontend/imgs/4-lake-mount.jpg differ diff --git a/Assignment1/submit/frontend/script.js b/Assignment1/submit/frontend/script.js new file mode 100644 index 0000000..2ae1811 --- /dev/null +++ b/Assignment1/submit/frontend/script.js @@ -0,0 +1,16 @@ +document.querySelector('.tab-nav').addEventListener('click', function(e) { + const tabItem = e.target.closest('.tab-item'); + if (!tabItem) return; + + //全部清除acrive状态 + document.querySelectorAll('.tab-item, .content-panel').forEach(el => { + el.classList.remove('active'); + }); + + //标签页active + tabItem.classList.add('active'); + + //将当前的active状态添加到对应的标签内容中 + const targetId = tabItem.dataset.target; + document.getElementById(targetId).classList.add('active'); +}); \ No newline at end of file diff --git a/Assignment1/submit/frontend/styles.css b/Assignment1/submit/frontend/styles.css new file mode 100644 index 0000000..8fd90b9 --- /dev/null +++ b/Assignment1/submit/frontend/styles.css @@ -0,0 +1,50 @@ +.tab-container { + max-width: 800px; + margin: 20px auto; +} + +.tab-nav { + display: flex; + border-bottom: 2px solid #eee; +} +.tab-item { + padding: 12px 24px; + background: none; + border: none; + cursor: pointer; + transition: all 0.3s; +} +.tab-item.active { + border-bottom: 3px solid #2196F3; + color: #2196F3; +} + +.content-panel { + display: none; + padding: 20px; + animation: fadeIn 0.5s; +} + +.content-panel.active { + display: block; +} + +@keyframes fadeIn { + from { opacity: 0; } + to { opacity: 1; } +} + +.content-panel{ + width: 80%; + height: 80%; +} + +img { + width: 100%; + height: 100%; + object-fit: cover; +} + +body .tab-item{ + font-family: 'Noto Sans SC', sans-serif; +} \ No newline at end of file diff --git a/Assignment1/submit/前端tab1.png b/Assignment1/submit/前端tab1.png new file mode 100644 index 0000000..f93c2bd Binary files /dev/null and b/Assignment1/submit/前端tab1.png differ diff --git a/Assignment1/submit/前端tab2.png b/Assignment1/submit/前端tab2.png new file mode 100644 index 0000000..0979294 Binary files /dev/null and b/Assignment1/submit/前端tab2.png differ diff --git a/Assignment1/submit/单元测试运行通过.png b/Assignment1/submit/单元测试运行通过.png new file mode 100644 index 0000000..deeed5e Binary files /dev/null and b/Assignment1/submit/单元测试运行通过.png differ