diff --git a/README.md b/README.md
index 4f072816f46e7365ad4ab944adb84369aea5cea7..9904dd834166c8cf8c8b36d94da58b601ece9305 100644
--- a/README.md
+++ b/README.md
@@ -1,22 +1,60 @@
-# JavaWeb_23
+[# JavaWeb_23
#### 介绍
-集成SpringAI的课程管理系统
+这是一个基于Spring Boot框架开发的课程管理系统,主要实现了用户认证、课程管理以及AI智能助手等功能。
#### 软件架构
软件架构说明
Springboot3 mybatis SpringAi
+#### 技术架构与工作流程
+1. 后端技术栈
+Spring Boot: 主要框架,简化配置和部署.
+
+MyBatis: ORM框架,用于数据库操作
+
+Thymeleaf: 服务端模板引擎,渲染HTML页面
+
+Spring AI: 集成AI功能,提供智能客服助手
+
+JWT/Cookie Session: 用户身份验证管理
+
+2. 前端技术栈
+HTML/CSS/JavaScript: 基础前端技术
+
+jQuery: 简化DOM操作和AJAX请求
+
+CSS3动画: 实现页面动效和渐变背景
+
+Web Speech API: 实现语音识别和合成功能
+
+##### 工作流程
+1.用户通过登录页面进行身份验证
+
+2.登录成功后进入课程管理主界面
+
+3.可以查看、添加、编辑、删除课程
+
+4.通过AI助手可以用自然语言操作课程数据,所有操作都支持语音交互
+
#### 安装教程
-1. mysql 5.7
+1. mysql 8.0.33
2. jdk17
3. maven3.8.1
#### 使用说明
-
-
-
+1.登录页面
+
+2.课程管理系统总页面,可以查看到所有课程信息,以及能够进行的大概操作
+
+3.添加课程界面
+
+4.修改界面
+)
+5.删除功能
+6.搜索(可模糊查询)
+
#### 参与贡献
@@ -33,4 +71,4 @@ Springboot3 mybatis SpringAi
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
-6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
+6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)]
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 7946cd7efad7d4a7ca45de2e21bb1ff165ff400b..e29e8679cbac32ff5eecaef8beef84e3a2b14638 100644
--- a/pom.xml
+++ b/pom.xml
@@ -31,7 +31,7 @@
mysql
mysql-connector-java
- 5.1.49
+ 8.0.33
org.springframework.boot
@@ -71,6 +71,14 @@
pom
import
+
+
+ cn.afterturn
+ easypoi-spring-boot-starter
+ 4.4.0
+
+
+
diff --git a/src/main/java/com/hxci/liyifei/controller/LYFCourseController.java b/src/main/java/com/hxci/liyifei/controller/LYFCourseController.java
new file mode 100644
index 0000000000000000000000000000000000000000..e9a23ba1c15cfd1082b9a862999b688ea5d6a634
--- /dev/null
+++ b/src/main/java/com/hxci/liyifei/controller/LYFCourseController.java
@@ -0,0 +1,96 @@
+package com.hxci.liyifei.controller;
+
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.hxci.liyifei.pojo.Course;
+import com.hxci.liyifei.servcie.LYFCorseService;
+import jakarta.servlet.http.HttpServletResponse;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.io.IOException;
+import java.util.List;
+
+@Controller
+@RequestMapping("/lyfcourse")
+public class LYFCourseController {
+ @Autowired
+ LYFCorseService service;
+
+ @RequestMapping("/view")
+ public String view(){
+ return "liyifei/course";
+ }
+
+ @RequestMapping("/add")
+ public String add(){
+ return "liyifei/add";
+ }
+ //保存
+ @ResponseBody
+ @RequestMapping("/save")
+ public Integer save(Course course){
+ System.out.println(course);
+ Integer flag= service.save(course);
+ return flag;
+ }
+// if(course.getId() != null){
+// return mapper.update(course);
+// }else {
+// // 手动设置ID或使用某种ID生成策略
+// course.setId(generateUniqueId()); // 你需要实现generateUniqueId()方法
+// return mapper.save(course);
+// }
+//}
+ @ResponseBody
+ @RequestMapping("/query")
+ public List query(Course course){
+ System.out.println("==========");
+ List list = service.query(course);
+ return list;
+ }
+ @ResponseBody
+ @RequestMapping("/del")
+ public Integer del(String id){
+ System.out.println("==========");
+ Integer flag = service.del(id);
+ return flag;
+ }
+ @RequestMapping("/edit")
+ public String edit(String id, Model model){
+ Course course = service.queryBySno(id);
+ model.addAttribute("course",course);
+ return "liyifei/edit";
+ }
+
+ @GetMapping("/page")
+ public PageInfo page(@RequestParam(defaultValue="1")int page,
+ @RequestParam(defaultValue="10")int size,
+ String keyword){
+ PageHelper.startPage(page,size);
+ List list=service.query(new Course(){{setCname(keyword);}});
+ return new PageInfo<>(list);
+ }
+
+ @GetMapping("/export")
+ public void export(HttpServletResponse resp, String keyword) throws IOException {
+ List list = service.query(new Course() {{
+ setCname(keyword);
+ }});
+
+ Workbook wb = ExcelExportUtil.exportExcel(new ExportParams(), Course.class, list);
+ resp.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
+ resp.setHeader("Content-Disposition", "attachment; filename=course.xlsx");
+ wb.write(resp.getOutputStream());
+ wb.close();
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/hxci/liyifei/controller/LYFOpenAIController.java b/src/main/java/com/hxci/liyifei/controller/LYFOpenAIController.java
new file mode 100644
index 0000000000000000000000000000000000000000..b68390756b1921380dea2ef9aacbb0fe17f0a1c1
--- /dev/null
+++ b/src/main/java/com/hxci/liyifei/controller/LYFOpenAIController.java
@@ -0,0 +1,61 @@
+package com.hxci.liyifei.controller;
+
+import org.springframework.ai.chat.client.ChatClient;
+import org.springframework.ai.chat.client.advisor.PromptChatMemoryAdvisor;
+import org.springframework.ai.chat.client.advisor.QuestionAnswerAdvisor;
+import org.springframework.ai.chat.memory.ChatMemory;
+import org.springframework.ai.vectorstore.SearchRequest;
+import org.springframework.ai.vectorstore.VectorStore;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import reactor.core.publisher.Flux;
+
+import java.time.LocalDate;
+
+import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY;
+
+@RestController
+public class LYFOpenAIController {
+ private final ChatClient chatClient;
+ public LYFOpenAIController(ChatClient.Builder chatClientBuilder, VectorStore vectorStore, ChatMemory chatMemory) {
+ this.chatClient = chatClientBuilder
+ .defaultSystem("""
+ 您是“哈尔滨信息工程学院课程管理系统”的客户聊天支持代理。请以友好、乐于助人且愉快的方式来回复。
+ 您正在通过在线聊天系统与客户互动。
+ 在提供有关课程得删除和添加的信息之前,您必须始终从用户处获取以下信息:
+ 如果是添加课程需要提供课程名、课程简介、任课教师。
+ 如果是删除课程需要提供课程编号,需要得到用户的确定,在删除此编号的课程信息。
+ 如果是修改课程,请先用课程编号查询出原信息,向用户确认要修改的字段(课程名、简介、教师),收到新值后 **只调用 updateCourseByLYF** 接口,禁止再调用 addCourseByLYF。
+ 同时还可以根据任课老师查找相应的课程信息。
+ 添加或者删除、修改成功之后不需要说太多没用的东西。
+
+ 如果需要,可以调用相应函数调用完成辅助动作。
+ 请讲中文。
+ 今天的日期是 {current_date}.
+ """)
+ .defaultAdvisors(
+ new PromptChatMemoryAdvisor(chatMemory),
+ new QuestionAnswerAdvisor(vectorStore, SearchRequest.defaults()) // RAG
+ )
+ .defaultFunctions("addCourseByLYF", "deleteCourseByLYF", "getCourseDetailsByLYF", "updateCourseByLYF")
+ .build();
+
+
+ }
+ @GetMapping(value = "/ai/liyifei/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
+ public Flux generateStreamAsString(@RequestParam(value = "message", defaultValue = "讲个笑话") String message) {
+ System.out.println( message+"==========================");
+ Flux content = chatClient.prompt()
+ .system(s -> s.param("current_date", LocalDate.now().toString()))
+ .advisors(a -> a.param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100))
+ .user(message)
+ .stream()
+ .content();
+ //return content;
+ return content.concatWith(Flux.just("[complete]"));
+
+
+ }
+}
diff --git a/src/main/java/com/hxci/liyifei/controller/LYFUserController.java b/src/main/java/com/hxci/liyifei/controller/LYFUserController.java
new file mode 100644
index 0000000000000000000000000000000000000000..9410694d78b1d3bd85bf661a89d097eb43ae04f0
--- /dev/null
+++ b/src/main/java/com/hxci/liyifei/controller/LYFUserController.java
@@ -0,0 +1,34 @@
+package com.hxci.liyifei.controller;
+
+import com.hxci.liyifei.servcie.LYFUserServcie;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@Controller
+@RequestMapping("/lyfuser")
+public class LYFUserController {
+
+
+ @RequestMapping("/lyflogin")
+ public String login(){
+ return "liyifei/login";
+ }
+
+
+ @Autowired
+ private LYFUserServcie lyfUserServcie;
+ @ResponseBody
+ @RequestMapping("/tologin")
+ public Integer tologin( @RequestParam("name") String name, @RequestParam("pass")String pass){
+ System.out.println( name);
+ System.out.println( pass);
+ Integer res = lyfUserServcie.login(name,pass);
+ return res;
+ }
+
+
+
+}
diff --git a/src/main/java/com/hxci/liyifei/dao/LYFCourseMapper.java b/src/main/java/com/hxci/liyifei/dao/LYFCourseMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..430b60e51d2217e348f93ebde03d545ee45f8299
--- /dev/null
+++ b/src/main/java/com/hxci/liyifei/dao/LYFCourseMapper.java
@@ -0,0 +1,20 @@
+package com.hxci.liyifei.dao;
+
+import com.hxci.liyifei.pojo.Course;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+@Mapper
+public interface LYFCourseMapper {
+ public List query(Course course);
+
+ Integer del(String id);
+
+ Integer save(Course course);
+
+ Course queryBySno(String sno);
+
+ List queryByTeacher(String teacher);
+
+ Integer update(Course course);
+}
diff --git a/src/main/java/com/hxci/liyifei/dao/LYFUserMapper.java b/src/main/java/com/hxci/liyifei/dao/LYFUserMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..6657e0820288b4bd2644815810907c96b25cc8b8
--- /dev/null
+++ b/src/main/java/com/hxci/liyifei/dao/LYFUserMapper.java
@@ -0,0 +1,12 @@
+package com.hxci.liyifei.dao;
+
+import com.hxci.liyifei.pojo.User;
+
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface LYFUserMapper {
+ User login(String name, String pass);
+}
+
+
diff --git a/src/main/java/com/hxci/liyifei/pojo/Course.java b/src/main/java/com/hxci/liyifei/pojo/Course.java
new file mode 100644
index 0000000000000000000000000000000000000000..2be49a0ce9161b11136d87879aa6138b5fa0484a
--- /dev/null
+++ b/src/main/java/com/hxci/liyifei/pojo/Course.java
@@ -0,0 +1,11 @@
+package com.hxci.liyifei.pojo;
+
+import lombok.Data;
+
+@Data
+public class Course {
+ private Integer id;
+ private String cname;
+ private String mark;
+ private String tea;
+}
diff --git a/src/main/java/com/hxci/liyifei/pojo/User.java b/src/main/java/com/hxci/liyifei/pojo/User.java
new file mode 100644
index 0000000000000000000000000000000000000000..8a7f686266f4f15598406e41347df0fc8ff0604f
--- /dev/null
+++ b/src/main/java/com/hxci/liyifei/pojo/User.java
@@ -0,0 +1,10 @@
+package com.hxci.liyifei.pojo;
+
+import lombok.Data;
+
+@Data
+public class User {
+ private Integer id;
+ private String name;
+ private String pass;
+}
diff --git a/src/main/java/com/hxci/liyifei/servcie/LYFCorseService.java b/src/main/java/com/hxci/liyifei/servcie/LYFCorseService.java
new file mode 100644
index 0000000000000000000000000000000000000000..56598ce8262f8f0dd092d0b21de938a0ec771c58
--- /dev/null
+++ b/src/main/java/com/hxci/liyifei/servcie/LYFCorseService.java
@@ -0,0 +1,17 @@
+package com.hxci.liyifei.servcie;
+
+import com.hxci.liyifei.pojo.Course;
+
+import java.util.List;
+
+public interface LYFCorseService {
+ public List query(Course course);
+
+ Integer del(String id);
+
+ Integer save(Course course);
+
+ Course queryBySno(String sno);
+
+ List queryByTeacher(String teacher);
+}
diff --git a/src/main/java/com/hxci/liyifei/servcie/LYFCorseServiceImp.java b/src/main/java/com/hxci/liyifei/servcie/LYFCorseServiceImp.java
new file mode 100644
index 0000000000000000000000000000000000000000..aa2763b5a45124a0a5942897261c6838de2e79d7
--- /dev/null
+++ b/src/main/java/com/hxci/liyifei/servcie/LYFCorseServiceImp.java
@@ -0,0 +1,43 @@
+package com.hxci.liyifei.servcie;
+
+import com.hxci.liyifei.dao.LYFCourseMapper;
+import com.hxci.liyifei.pojo.Course;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+@Service
+public class LYFCorseServiceImp implements LYFCorseService {
+ @Autowired
+ LYFCourseMapper mapper;
+
+ @Override
+ public List query(Course course) {
+ return mapper.query(course);
+ }
+
+ @Override
+ public Integer del(String id) {
+ return mapper.del(id);
+ }
+
+ @Override
+ public Integer save(Course course) {
+ if(course.getId() != null){
+ return mapper.update(course);
+ }else {
+ return mapper.save(course);
+ }
+
+ }
+
+ @Override
+ public Course queryBySno(String sno) {
+ return mapper.queryBySno(sno);
+ }
+
+ @Override
+ public List queryByTeacher(String teacher) {
+ return mapper.queryByTeacher(teacher);
+ }
+}
diff --git a/src/main/java/com/hxci/liyifei/servcie/LYFUserServcie.java b/src/main/java/com/hxci/liyifei/servcie/LYFUserServcie.java
new file mode 100644
index 0000000000000000000000000000000000000000..ac1fb89d0ecf365281acf719da00590bb5f90066
--- /dev/null
+++ b/src/main/java/com/hxci/liyifei/servcie/LYFUserServcie.java
@@ -0,0 +1,5 @@
+package com.hxci.liyifei.servcie;
+
+public interface LYFUserServcie {
+ Integer login(String name, String pass);
+}
diff --git a/src/main/java/com/hxci/liyifei/servcie/LYFUserServiceImpl.java b/src/main/java/com/hxci/liyifei/servcie/LYFUserServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..036ef7b2e0d29f589d8073ac3f3ffb89478f7453
--- /dev/null
+++ b/src/main/java/com/hxci/liyifei/servcie/LYFUserServiceImpl.java
@@ -0,0 +1,22 @@
+package com.hxci.liyifei.servcie;
+
+import com.hxci.liyifei.dao.LYFUserMapper;
+import com.hxci.liyifei.pojo.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class LYFUserServiceImpl implements LYFUserServcie {
+ @Autowired
+ private LYFUserMapper dao;
+
+ @Override
+ public Integer login(String name, String pass) {
+ User user = dao.login(name,pass);
+ if(user==null){
+ return 0;
+ }
+
+ return 1;
+ }
+}
diff --git a/src/main/java/com/hxci/liyifei/tool/LYFCourseTools.java b/src/main/java/com/hxci/liyifei/tool/LYFCourseTools.java
new file mode 100644
index 0000000000000000000000000000000000000000..10ce21d4e38e5511ed9e881495aa5a5a0a583595
--- /dev/null
+++ b/src/main/java/com/hxci/liyifei/tool/LYFCourseTools.java
@@ -0,0 +1,73 @@
+package com.hxci.liyifei.tool;
+
+import com.hxci.liyifei.pojo.Course;
+import com.hxci.liyifei.servcie.LYFCorseService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Description;
+
+import java.util.List;
+import java.util.function.Function;
+
+@Configuration
+public class LYFCourseTools {
+ @Autowired
+ private LYFCorseService LYFCorseService;
+
+ public record DeleteCourseDatesRequest(String sno) {
+ }
+
+ public record AddCourseDataRequest(Course course) {
+ }
+ public record CourseDetailsRequest(String teacher) {
+ }
+
+ public record UpdateCourseRequest(Integer id,String cname,String mark,String tea){}
+
+ @Bean
+ @Description("删除课程")
+ public Function deleteCourseByLYF() {
+ return request -> {
+ System.out.println(request.sno);
+ Integer flag = LYFCorseService.del(request.sno);
+ return "";
+ };
+ }
+
+ @Bean
+ @Description("添加课程")
+ public Function addCourseByLYF() {
+ return request -> {
+ System.out.println(request.course);
+ request.course.setId(null);
+ LYFCorseService.save(request.course);
+ return "";
+ };
+ }
+
+ @Bean
+ @Description("更新课程")
+ public Function updateCourseByLYF(){
+ return req->{
+ Course c=new Course();
+ c.setId(req.id);
+ c.setCname(req.cname);
+ c.setMark(req.mark);
+ c.setTea(req.tea);
+ LYFCorseService.save(c);
+ return "更新完成";
+ };
+ }
+
+ @Bean
+ @Description("获取课程")
+ public Function> getCourseDetailsByLYF() {
+ return request -> {
+ System.out.println(request.teacher);
+ List courses = LYFCorseService.queryByTeacher(request.teacher);
+ return courses;
+ };
+ }
+
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index d030421464343f697839bfdbce2eb8f4f52d27ff..009d14affad0ee69e20440551389bc6aa97b719e 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1,8 +1,8 @@
-server.port =8081
+server.port =8086
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
-spring.datasource.url= jdbc:mysql://127.0.0.1:3306/1-23web?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+spring.datasource.url= jdbc:mysql://127.0.0.1:3306/javaee_work5?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
spring.datasource.username = root
-spring.datasource.password = x5
+spring.datasource.password = 123456
# mybatis ??
mybatis.mapperLocations = classpath*:mapper/**/*Mapper.xml
@@ -16,6 +16,6 @@ spring.thymeleaf.mode = HTML
spring.thymeleaf.prefix = classpath:/templates/
# thymeleaf??????
spring.thymeleaf.suffix = .html
-#spring.ai.dashscope.api-key = --------------
-#spring.ai.dashscope.chat.options.model = qwen-max
+spring.ai.dashscope.api-key = sk-024fc7ab1b4c42a2a4d814a0c1d31e4d
+spring.ai.dashscope.chat.options.model = qwen-max
diff --git a/src/main/resources/mapper/liyifei/lyfCourseMapper.xml b/src/main/resources/mapper/liyifei/lyfCourseMapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0ab2944006ef50d9dd6b620fd4a208140993bc9d
--- /dev/null
+++ b/src/main/resources/mapper/liyifei/lyfCourseMapper.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+ delete from t_lyf_course where id=#{id}
+
+
+ insert into t_lyf_course(cname,mark,tea) values(#{cname},#{mark},#{tea})
+
+
+
+
+ update t_lyf_course set cname=#{cname},mark=#{mark},tea=#{tea} where id=#{id}
+
+
\ No newline at end of file
diff --git a/src/main/resources/mapper/liyifei/lyfUserMapper.xml b/src/main/resources/mapper/liyifei/lyfUserMapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..55d6684b4c49754977cb017630670682757aed66
--- /dev/null
+++ b/src/main/resources/mapper/liyifei/lyfUserMapper.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/templates/liyifei/add.html b/src/main/resources/templates/liyifei/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..92506cdf6df29cc263c3dd33ae3c88b4b1e7dd14
--- /dev/null
+++ b/src/main/resources/templates/liyifei/add.html
@@ -0,0 +1,129 @@
+
+
+
+
+ 新增课程
+
+
+
+
+新增课程
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/templates/liyifei/course.html b/src/main/resources/templates/liyifei/course.html
new file mode 100644
index 0000000000000000000000000000000000000000..e80d9785ffda1983d6ccdecbe71dde48d2ba69a9
--- /dev/null
+++ b/src/main/resources/templates/liyifei/course.html
@@ -0,0 +1,432 @@
+
+
+
+
+ 课程管理系统
+
+
+
+
+
+课程管理系统
+
+
+
+
+
+
+
+
+ | 编号 |
+ 课程名称 |
+ 简介 |
+ 教师 |
+ 操作 |
+
+
+
+
+
+
+
+
+
+
+
+💬
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/templates/liyifei/edit.html b/src/main/resources/templates/liyifei/edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..9ea385c7c2a0e03edbbbe1700490a65795ff75e9
--- /dev/null
+++ b/src/main/resources/templates/liyifei/edit.html
@@ -0,0 +1,137 @@
+
+
+
+
+
+ 修改课程
+
+
+
+
+修改课程
+
+
+
+
+
+
+
+
+
+
+
+
+