gugu преди 3 дни
ревизия
64b087f347
променени са 42 файла, в които са добавени 4053 реда и са изтрити 0 реда
  1. 39 0
      .gitignore
  2. 8 0
      .idea/.gitignore
  3. 5 0
      .idea/codeStyles/codeStyleConfig.xml
  4. 7 0
      .idea/encodings.xml
  5. 15 0
      .idea/misc.xml
  6. 6 0
      .idea/vcs.xml
  7. 79 0
      pom.xml
  8. 11 0
      src/main/java/org/example/ZhbfApplication.java
  9. 34 0
      src/main/java/org/example/config/WebConfig.java
  10. 130 0
      src/main/java/org/example/controller/HospitalDeptController.java
  11. 157 0
      src/main/java/org/example/controller/HospitalWardController.java
  12. 262 0
      src/main/java/org/example/controller/LoginController.java
  13. 49 0
      src/main/java/org/example/entity/AdminUser.java
  14. 106 0
      src/main/java/org/example/entity/HospitalDept.java
  15. 60 0
      src/main/java/org/example/entity/HospitalOverview.java
  16. 162 0
      src/main/java/org/example/entity/HospitalWard.java
  17. 49 0
      src/main/java/org/example/entity/Yonghu.java
  18. 14 0
      src/main/java/org/example/mapper/AdminUserMapper.java
  19. 48 0
      src/main/java/org/example/mapper/HospitalDeptMapper.java
  20. 28 0
      src/main/java/org/example/mapper/HospitalOverviewMapper.java
  21. 96 0
      src/main/java/org/example/mapper/HospitalWardMapper.java
  22. 14 0
      src/main/java/org/example/mapper/YonghuMapper.java
  23. 28 0
      src/main/java/org/example/model/User.java
  24. 21 0
      src/main/java/org/example/service/AdminUserService.java
  25. 56 0
      src/main/java/org/example/service/HospitalDeptService.java
  26. 48 0
      src/main/java/org/example/service/HospitalOverviewService.java
  27. 95 0
      src/main/java/org/example/service/HospitalWardService.java
  28. 21 0
      src/main/java/org/example/service/YonghuService.java
  29. 153 0
      src/main/java/org/example/view/LoginView.java
  30. 37 0
      src/main/resources/application.properties
  31. 19 0
      src/main/resources/mapper/AdminUserMapper.xml
  32. 36 0
      src/main/resources/mapper/HospitalOverviewMapper.xml
  33. 19 0
      src/main/resources/mapper/YonghuMapper.xml
  34. 111 0
      src/main/resources/static/css/modal.css
  35. 132 0
      src/main/resources/static/css/style.css
  36. 1705 0
      src/main/resources/static/home.html
  37. BIN
      src/main/resources/static/img/251a9130-a895-44e6-8670-3acd0ce7dc73.png
  38. BIN
      src/main/resources/static/img/42fe99da-c51b-4312-a272-6111dfc4528c.jpg
  39. BIN
      src/main/resources/static/img/657cef70-297a-4d9b-9ed2-307635684c18.jpg
  40. BIN
      src/main/resources/static/img/f5898247-d947-48f0-828c-b7661c1a5044.jpg
  41. 59 0
      src/main/resources/static/index.html
  42. 134 0
      src/main/resources/static/js/script.js

+ 39 - 0
.gitignore

@@ -0,0 +1,39 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+.kotlin
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store

+ 8 - 0
.idea/.gitignore

@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml

+ 5 - 0
.idea/codeStyles/codeStyleConfig.xml

@@ -0,0 +1,5 @@
+<component name="ProjectCodeStyleConfiguration">
+  <state>
+    <option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
+  </state>
+</component>

+ 7 - 0
.idea/encodings.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding" native2AsciiForPropertiesFiles="true" defaultCharsetForPropertiesFiles="UTF-8">
+    <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
+  </component>
+</project>

+ 15 - 0
.idea/misc.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="KubernetesApiProvider"><![CDATA[{}]]></component>
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8 (3)" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+</project>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>

+ 79 - 0
pom.xml

@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.7.0</version>
+        <relativePath/>
+    </parent>
+
+    <groupId>org.example</groupId>
+    <artifactId>zhbf</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
+        </dependency>
+        
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.28</version>
+        </dependency>
+        
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>2.2.2</version>
+        </dependency>
+        
+        <!-- Spring Boot Test依赖 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <mainClass>org.example.ZhbfApplication</mainClass>
+                </configuration>
+            </plugin>
+            
+            <!-- Maven编译插件 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.10.1</version>
+                <configuration>
+                    <source>8</source>
+                    <target>8</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 11 - 0
src/main/java/org/example/ZhbfApplication.java

@@ -0,0 +1,11 @@
+package org.example;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ZhbfApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(ZhbfApplication.class, args);
+    }
+}

+ 34 - 0
src/main/java/org/example/config/WebConfig.java

@@ -0,0 +1,34 @@
+package org.example.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+    
+    @Override
+    public void addViewControllers(ViewControllerRegistry registry) {
+        // 将根路径重定向到登录页面
+        registry.addViewController("/").setViewName("redirect:/index.html");
+    }
+    
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        // 静态资源处理
+        registry.addResourceHandler("/**")
+                .addResourceLocations("classpath:/static/");
+    }
+    
+    @Override
+    public void addCorsMappings(CorsRegistry registry) {
+        // 允许跨域请求
+        registry.addMapping("/**")
+                .allowedOriginPatterns("*")
+                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
+                .allowCredentials(true)
+                .maxAge(3600);
+    }
+}

+ 130 - 0
src/main/java/org/example/controller/HospitalDeptController.java

@@ -0,0 +1,130 @@
+package org.example.controller;
+
+import org.example.entity.HospitalDept;
+import org.example.service.HospitalDeptService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@RestController
+@RequestMapping("/api/departments")
+public class HospitalDeptController {
+    
+    @Autowired
+    private HospitalDeptService hospitalDeptService;
+    
+    /**
+     * 获取所有科室列表(支持按名称模糊查询和启用状态筛选)
+     * @param name 科室名称(模糊匹配)
+     * @param enabled 是否启用
+     * @return 科室列表
+     */
+    @GetMapping
+    public List<HospitalDept> getAllDepartments(@RequestParam(required = false) String name, 
+                                               @RequestParam(required = false) Boolean enabled) {
+        List<HospitalDept> allDepts = hospitalDeptService.findAll();
+        
+        // 如果提供了名称参数,则进行模糊匹配
+        if (name != null && !name.isEmpty()) {
+            allDepts = allDepts.stream()
+                    .filter(dept -> dept.getName() != null && dept.getName().contains(name))
+                    .collect(Collectors.toList());
+        }
+        
+        // 如果提供了启用状态参数,则进行筛选
+        if (enabled != null) {
+            allDepts = allDepts.stream()
+                    .filter(dept -> enabled.equals(dept.getEnabled()))
+                    .collect(Collectors.toList());
+        }
+        
+        return allDepts;
+    }
+    
+    /**
+     * 根据科室代码获取科室信息
+     * @param code 科室代码
+     * @return 科室信息
+     */
+    @GetMapping("/{code}")
+    public Map<String, Object> getDepartmentByCode(@PathVariable String code) {
+        Map<String, Object> result = new HashMap<>();
+        try {
+            HospitalDept dept = hospitalDeptService.findByCode(code);
+            if (dept != null) {
+                result.put("success", true);
+                result.put("data", dept);
+            } else {
+                result.put("success", false);
+                result.put("message", "未找到该科室信息");
+            }
+        } catch (Exception e) {
+            result.put("success", false);
+            result.put("message", "获取科室信息失败: " + e.getMessage());
+        }
+        return result;
+    }
+    
+    /**
+     * 添加新科室
+     * @param dept 科室信息
+     * @return 操作结果
+     */
+    @PostMapping
+    public Map<String, Object> addDepartment(@RequestBody HospitalDept dept) {
+        Map<String, Object> result = new HashMap<>();
+        try {
+            hospitalDeptService.addDept(dept);
+            result.put("success", true);
+            result.put("message", "科室添加成功");
+        } catch (Exception e) {
+            result.put("success", false);
+            result.put("message", "科室添加失败: " + e.getMessage());
+        }
+        return result;
+    }
+    
+    /**
+     * 更新科室信息
+     * @param code 科室代码
+     * @param dept 科室信息
+     * @return 操作结果
+     */
+    @PutMapping("/{code}")
+    public Map<String, Object> updateDepartment(@PathVariable String code, @RequestBody HospitalDept dept) {
+        Map<String, Object> result = new HashMap<>();
+        try {
+            dept.setCode(code);
+            hospitalDeptService.updateDept(dept);
+            result.put("success", true);
+            result.put("message", "科室更新成功");
+        } catch (Exception e) {
+            result.put("success", false);
+            result.put("message", "科室更新失败: " + e.getMessage());
+        }
+        return result;
+    }
+    
+    /**
+     * 删除科室
+     * @param code 科室代码
+     * @return 操作结果
+     */
+    @DeleteMapping("/{code}")
+    public Map<String, Object> deleteDepartment(@PathVariable String code) {
+        Map<String, Object> result = new HashMap<>();
+        try {
+            hospitalDeptService.deleteDept(code);
+            result.put("success", true);
+            result.put("message", "科室删除成功");
+        } catch (Exception e) {
+            result.put("success", false);
+            result.put("message", "科室删除失败: " + e.getMessage());
+        }
+        return result;
+    }
+}

+ 157 - 0
src/main/java/org/example/controller/HospitalWardController.java

@@ -0,0 +1,157 @@
+package org.example.controller;
+
+import org.example.entity.HospitalWard;
+import org.example.service.HospitalWardService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@RestController
+@RequestMapping("/api/wards")
+public class HospitalWardController {
+    
+    @Autowired
+    private HospitalWardService hospitalWardService;
+    
+    /**
+     * 获取所有病区列表(支持按名称模糊查询和启用状态筛选)
+     * @param name 病区名称(模糊匹配)
+     * @param glkeshi 关联科室(模糊匹配)
+     * @param enabled 是否启用
+     * @return 病区列表
+     */
+    @GetMapping
+    public List<HospitalWard> getAllWards(@RequestParam(required = false) String name, 
+                                         @RequestParam(required = false) String glkeshi,
+                                         @RequestParam(required = false) Boolean enabled) {
+        List<HospitalWard> allWards = hospitalWardService.findAll();
+        
+        // 如果提供了名称参数,则进行模糊匹配
+        if (name != null && !name.isEmpty()) {
+            allWards = allWards.stream()
+                    .filter(ward -> ward.getName() != null && ward.getName().contains(name))
+                    .collect(Collectors.toList());
+        }
+        
+        // 如果提供了关联科室参数,则进行模糊匹配
+        if (glkeshi != null && !glkeshi.isEmpty()) {
+            allWards = allWards.stream()
+                    .filter(ward -> ward.getGlkeshi() != null && ward.getGlkeshi().contains(glkeshi))
+                    .collect(Collectors.toList());
+        }
+        
+        // 如果提供了启用状态参数,则进行筛选
+        if (enabled != null) {
+            allWards = allWards.stream()
+                    .filter(ward -> enabled.equals(ward.getEnabled()))
+                    .collect(Collectors.toList());
+        }
+        
+        return allWards;
+    }
+    
+    /**
+     * 根据病区代码获取病区信息
+     * @param code 病区代码
+     * @return 病区信息
+     */
+    @GetMapping("/{code}")
+    public Map<String, Object> getWardByCode(@PathVariable String code) {
+        Map<String, Object> result = new HashMap<>();
+        try {
+            HospitalWard ward = hospitalWardService.findByCode(code);
+            if (ward != null) {
+                result.put("success", true);
+                result.put("data", ward);
+            } else {
+                result.put("success", false);
+                result.put("message", "未找到该病区信息");
+            }
+        } catch (Exception e) {
+            result.put("success", false);
+            result.put("message", "获取病区信息失败: " + e.getMessage());
+        }
+        return result;
+    }
+    
+    /**
+     * 添加新病区
+     * @param ward 病区信息
+     * @return 操作结果
+     */
+    @PostMapping
+    public Map<String, Object> addWard(@RequestBody HospitalWard ward) {
+        Map<String, Object> result = new HashMap<>();
+        try {
+            // 检查代码是否已存在
+            if (hospitalWardService.findByCode(ward.getCode()) != null) {
+                result.put("success", false);
+                result.put("message", "病区代码已存在");
+                return result;
+            }
+            
+            hospitalWardService.addWard(ward);
+            result.put("success", true);
+            result.put("message", "病区添加成功");
+        } catch (Exception e) {
+            result.put("success", false);
+            result.put("message", "病区添加失败: " + e.getMessage());
+        }
+        return result;
+    }
+    
+    /**
+     * 更新病区信息
+     * @param code 病区代码
+     * @param ward 病区信息
+     * @return 操作结果
+     */
+    @PutMapping("/{code}")
+    public Map<String, Object> updateWard(@PathVariable String code, @RequestBody HospitalWard ward) {
+        Map<String, Object> result = new HashMap<>();
+        try {
+            // 检查新代码是否已存在(仅当代码确实改变时)
+            if (!code.equals(ward.getCode())) {
+                boolean exists = hospitalWardService.existsByCodeExcluding(ward.getCode(), code);
+                if (exists) {
+                    result.put("success", false);
+                    result.put("message", "病区代码已存在");
+                    return result;
+                }
+            }
+            
+            // 更新病区信息
+            hospitalWardService.updateWard(code, ward);
+            result.put("success", true);
+            result.put("message", "病区更新成功");
+        } catch (Exception e) {
+            e.printStackTrace(); // 打印异常堆栈以便调试
+            result.put("success", false);
+            result.put("message", "病区更新失败: " + e.getMessage());
+        }
+        return result;
+    }
+    
+    /**
+     * 删除病区
+     * @param code 病区代码
+     * @return 操作结果
+     */
+    @DeleteMapping("/{code}")
+    public Map<String, Object> deleteWard(@PathVariable String code) {
+        Map<String, Object> result = new HashMap<>();
+        try {
+            hospitalWardService.deleteWard(code);
+            result.put("success", true);
+            result.put("message", "病区删除成功");
+        } catch (Exception e) {
+            result.put("success", false);
+            result.put("message", "病区删除失败: " + e.getMessage());
+        }
+        return result;
+    }
+}

+ 262 - 0
src/main/java/org/example/controller/LoginController.java

@@ -0,0 +1,262 @@
+package org.example.controller;
+
+import org.example.entity.HospitalOverview;
+import org.example.service.AdminUserService;
+import org.example.service.YonghuService;
+import org.example.service.HospitalOverviewService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.UrlResource;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpSession;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+@RestController
+@RequestMapping("/api")
+public class LoginController {
+    
+    @Autowired
+    private YonghuService yonghuService;
+    
+    @Autowired
+    private AdminUserService adminUserService;
+    
+    @Autowired
+    private HospitalOverviewService hospitalOverviewService;
+    
+    // Logo文件保存路径
+    private static final String LOGO_UPLOAD_DIR = System.getProperty("user.dir") + "/src/main/resources/static/img/";
+    
+    public LoginController() {
+        // 无参构造函数
+        // 确保目录存在
+        File uploadDir = new File(LOGO_UPLOAD_DIR);
+        if (!uploadDir.exists()) {
+            uploadDir.mkdirs();
+        }
+    }
+    
+    /**
+     * 用户登录接口
+     * @param credentials 登录凭证
+     * @param session HttpSession
+     * @return 登录结果
+     */
+    @PostMapping("/user/login")
+    public Map<String, Object> userLogin(@RequestBody Map<String, String> credentials, HttpSession session) {
+        Map<String, Object> result = new HashMap<>();
+        
+        String username = credentials.get("username");
+        String password = credentials.get("password");
+        
+        // 验证用户
+        boolean authenticated = yonghuService.authenticate(username, password);
+        
+        if (authenticated) {
+            // 登录成功,将用户信息存储到session中
+            session.setAttribute("userType", "yonghu");
+            session.setAttribute("username", username);
+            result.put("success", true);
+            result.put("message", "用户登录成功");
+        } else {
+            // 登录失败
+            result.put("success", false);
+            result.put("message", "用户名或密码错误");
+        }
+        
+        return result;
+    }
+    
+    /**
+     * 管理员登录接口
+     * @param credentials 登录凭证
+     * @param session HttpSession
+     * @return 登录结果
+     */
+    @PostMapping("/admin/login")
+    public Map<String, Object> adminLogin(@RequestBody Map<String, String> credentials, HttpSession session) {
+        Map<String, Object> result = new HashMap<>();
+        
+        String username = credentials.get("username");
+        String password = credentials.get("password");
+        
+        // 验证管理员
+        boolean authenticated = adminUserService.authenticate(username, password);
+        
+        if (authenticated) {
+            // 登录成功,将管理员信息存储到session中
+            session.setAttribute("userType", "admin");
+            session.setAttribute("username", username);
+            result.put("success", true);
+            result.put("message", "管理员登录成功");
+        } else {
+            // 登录失败
+            result.put("success", false);
+            result.put("message", "用户名或密码错误");
+        }
+        
+        return result;
+    }
+    
+    /**
+     * 用户登出接口
+     * @param session HttpSession
+     * @return 登出结果
+     */
+    @PostMapping("/logout")
+    public Map<String, Object> logout(HttpSession session) {
+        Map<String, Object> result = new HashMap<>();
+        
+        // 清除session
+        session.invalidate();
+        result.put("success", true);
+        result.put("message", "登出成功");
+        
+        return result;
+    }
+    
+    /**
+     * 检查登录状态
+     * @param session HttpSession
+     * @return 登录状态
+     */
+    @GetMapping("/status")
+    public Map<String, Object> status(HttpSession session) {
+        Map<String, Object> result = new HashMap<>();
+        
+        String username = (String) session.getAttribute("username");
+        String userType = (String) session.getAttribute("userType");
+        
+        if (username != null && userType != null) {
+            result.put("loggedIn", true);
+            result.put("username", username);
+            result.put("userType", userType);
+        } else {
+            result.put("loggedIn", false);
+        }
+        
+        return result;
+    }
+    
+    /**
+     * 获取医院概况信息
+     * @return 医院概况信息
+     */
+    @GetMapping("/hospital-overview")
+    public Map<String, Object> getHospitalOverview() {
+        Map<String, Object> result = new HashMap<>();
+        
+        try {
+            HospitalOverview hospitalOverview = hospitalOverviewService.getHospitalOverview();
+            result.put("success", true);
+            result.put("data", hospitalOverview);
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.put("success", false);
+            result.put("message", "获取医院概况信息失败");
+        }
+        
+        return result;
+    }
+    
+    /**
+     * 保存医院概况信息
+     * @param data 医院概况数据
+     * @return 保存结果
+     */
+    @PostMapping("/hospital-overview")
+    public Map<String, Object> saveHospitalOverview(@RequestBody Map<String, String> data) {
+        Map<String, Object> result = new HashMap<>();
+        
+        try {
+            HospitalOverview hospitalOverview = new HospitalOverview();
+            hospitalOverview.setDizhi(data.get("dizhi"));
+            hospitalOverview.setDianhua(data.get("dianhua"));
+            hospitalOverview.setJieshao(data.get("jieshao"));
+            
+            boolean success = hospitalOverviewService.saveHospitalOverview(hospitalOverview);
+            if (success) {
+                result.put("success", true);
+                result.put("message", "保存成功");
+            } else {
+                result.put("success", false);
+                result.put("message", "保存失败");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.put("success", false);
+            result.put("message", "保存医院概况信息失败");
+        }
+        
+        return result;
+    }
+    
+    /**
+     * 上传医院Logo
+     * @param file 上传的文件
+     * @return 上传结果
+     */
+    @PostMapping("/upload-logo")
+    public Map<String, Object> uploadLogo(@RequestParam("file") MultipartFile file) {
+        Map<String, Object> result = new HashMap<>();
+        
+        // 检查文件是否为空
+        if (file.isEmpty()) {
+            result.put("success", false);
+            result.put("message", "上传文件不能为空");
+            return result;
+        }
+        
+        try {
+            // 检查文件类型
+            String contentType = file.getContentType();
+            if (!"image/jpeg".equals(contentType) && !"image/png".equals(contentType)) {
+                result.put("success", false);
+                result.put("message", "只支持JPG和PNG格式的图片");
+                return result;
+            }
+            
+            // 检查文件大小 (10MB)
+            if (file.getSize() > 10 * 1024 * 1024) {
+                result.put("success", false);
+                result.put("message", "图片大小不能超过10M");
+                return result;
+            }
+            
+            // 生成唯一文件名
+            String originalFilename = file.getOriginalFilename();
+            String fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));
+            String uniqueFilename = UUID.randomUUID().toString() + fileExtension;
+            
+            // 创建保存目录
+            File uploadDir = new File(LOGO_UPLOAD_DIR);
+            if (!uploadDir.exists()) {
+                uploadDir.mkdirs();
+            }
+            
+            // 保存文件
+            File destFile = new File(LOGO_UPLOAD_DIR + uniqueFilename);
+            file.transferTo(destFile);
+            
+            result.put("success", true);
+            result.put("message", "上传成功");
+            result.put("filename", uniqueFilename);
+            return result;
+        } catch (IOException e) {
+            e.printStackTrace();
+            result.put("success", false);
+            result.put("message", "上传失败:" + e.getMessage());
+            return result;
+        }
+    }
+}

+ 49 - 0
src/main/java/org/example/entity/AdminUser.java

@@ -0,0 +1,49 @@
+package org.example.entity;
+
+public class AdminUser {
+    private Long id;
+    private String username;
+    private String password;
+    
+    // Constructors
+    public AdminUser() {}
+    
+    public AdminUser(String username, String password) {
+        this.username = username;
+        this.password = password;
+    }
+    
+    // Getters and Setters
+    public Long getId() {
+        return id;
+    }
+    
+    public void setId(Long id) {
+        this.id = id;
+    }
+    
+    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 toString() {
+        return "AdminUser{" +
+                "id=" + id +
+                ", username='" + username + '\'' +
+                ", password='" + password + '\'' +
+                '}';
+    }
+}

+ 106 - 0
src/main/java/org/example/entity/HospitalDept.java

@@ -0,0 +1,106 @@
+package org.example.entity;
+
+public class HospitalDept {
+    private String code;          // 科室代码
+    private String outCode;       // 科室外部系统代码
+    private String name;          // 科室名称
+    private String address;       // 科室地址
+    private String telephone;     // 科室电话
+    private String introduction;  // 科室介绍
+    private Boolean enabled;      // 是否启用
+    private String remark;        // 备注
+
+    // Constructors
+    public HospitalDept() {}
+
+    public HospitalDept(String code, String outCode, String name, String address, String telephone, 
+                       String introduction, Boolean enabled, String remark) {
+        this.code = code;
+        this.outCode = outCode;
+        this.name = name;
+        this.address = address;
+        this.telephone = telephone;
+        this.introduction = introduction;
+        this.enabled = enabled;
+        this.remark = remark;
+    }
+
+    // Getters and Setters
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getOutCode() {
+        return outCode;
+    }
+
+    public void setOutCode(String outCode) {
+        this.outCode = outCode;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getTelephone() {
+        return telephone;
+    }
+
+    public void setTelephone(String telephone) {
+        this.telephone = telephone;
+    }
+
+    public String getIntroduction() {
+        return introduction;
+    }
+
+    public void setIntroduction(String introduction) {
+        this.introduction = introduction;
+    }
+
+    public Boolean getEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(Boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public String toString() {
+        return "HospitalDept{" +
+                "code='" + code + '\'' +
+                ", outCode='" + outCode + '\'' +
+                ", name='" + name + '\'' +
+                ", address='" + address + '\'' +
+                ", telephone='" + telephone + '\'' +
+                ", introduction='" + introduction + '\'' +
+                ", enabled=" + enabled +
+                ", remark='" + remark + '\'' +
+                '}';
+    }
+}

+ 60 - 0
src/main/java/org/example/entity/HospitalOverview.java

@@ -0,0 +1,60 @@
+package org.example.entity;
+
+public class HospitalOverview {
+    private Long id;
+    private String dizhi;     // 地址
+    private String dianhua;   // 电话
+    private String jieshao;   // 介绍
+
+    // Constructors
+    public HospitalOverview() {}
+
+    public HospitalOverview(String dizhi, String dianhua, String jieshao) {
+        this.dizhi = dizhi;
+        this.dianhua = dianhua;
+        this.jieshao = jieshao;
+    }
+
+    // Getters and Setters
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getDizhi() {
+        return dizhi;
+    }
+
+    public void setDizhi(String dizhi) {
+        this.dizhi = dizhi;
+    }
+
+    public String getDianhua() {
+        return dianhua;
+    }
+
+    public void setDianhua(String dianhua) {
+        this.dianhua = dianhua;
+    }
+
+    public String getJieshao() {
+        return jieshao;
+    }
+
+    public void setJieshao(String jieshao) {
+        this.jieshao = jieshao;
+    }
+
+    @Override
+    public String toString() {
+        return "HospitalOverview{" +
+                "id=" + id +
+                ", dizhi='" + dizhi + '\'' +
+                ", dianhua='" + dianhua + '\'' +
+                ", jieshao='" + jieshao + '\'' +
+                '}';
+    }
+}

+ 162 - 0
src/main/java/org/example/entity/HospitalWard.java

@@ -0,0 +1,162 @@
+package org.example.entity;
+
+public class HospitalWard {
+    private String code;              // 病区代码
+    private String outCode;           // 病区外部代码
+    private String name;              // 病区名称
+    private String address;           // 病区地址
+    private String glkeshi;           // 关联科室
+    private String telephone;         // 病区电话
+    private String director;          // 病区主任医生
+    private String headNurse;         // 病区护士长
+    private Integer bedCount;         // 编制床位数
+    private Integer bedOpenCount;     // 开放床位数
+    private Integer sort;             // 排序号
+    private Boolean enabled;          // 是否启用
+    private String remark;            // 备注
+
+    // Constructors
+    public HospitalWard() {}
+
+    public HospitalWard(String code, String outCode, String name, String address, String glkeshi,
+                       String telephone, String director, String headNurse, Integer bedCount,
+                       Integer bedOpenCount, Integer sort, Boolean enabled, String remark) {
+        this.code = code;
+        this.outCode = outCode;
+        this.name = name;
+        this.address = address;
+        this.glkeshi = glkeshi;
+        this.telephone = telephone;
+        this.director = director;
+        this.headNurse = headNurse;
+        this.bedCount = bedCount;
+        this.bedOpenCount = bedOpenCount;
+        this.sort = sort;
+        this.enabled = enabled;
+        this.remark = remark;
+    }
+
+    // Getters and Setters
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getOutCode() {
+        return outCode;
+    }
+
+    public void setOutCode(String outCode) {
+        this.outCode = outCode;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getGlkeshi() {
+        return glkeshi;
+    }
+
+    public void setGlkeshi(String glkeshi) {
+        this.glkeshi = glkeshi;
+    }
+
+    public String getTelephone() {
+        return telephone;
+    }
+
+    public void setTelephone(String telephone) {
+        this.telephone = telephone;
+    }
+
+    public String getDirector() {
+        return director;
+    }
+
+    public void setDirector(String director) {
+        this.director = director;
+    }
+
+    public String getHeadNurse() {
+        return headNurse;
+    }
+
+    public void setHeadNurse(String headNurse) {
+        this.headNurse = headNurse;
+    }
+
+    public Integer getBedCount() {
+        return bedCount;
+    }
+
+    public void setBedCount(Integer bedCount) {
+        this.bedCount = bedCount;
+    }
+
+    public Integer getBedOpenCount() {
+        return bedOpenCount;
+    }
+
+    public void setBedOpenCount(Integer bedOpenCount) {
+        this.bedOpenCount = bedOpenCount;
+    }
+
+    public Integer getSort() {
+        return sort;
+    }
+
+    public void setSort(Integer sort) {
+        this.sort = sort;
+    }
+
+    public Boolean getEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(Boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public String toString() {
+        return "HospitalWard{" +
+                "code='" + code + '\'' +
+                ", outCode='" + outCode + '\'' +
+                ", name='" + name + '\'' +
+                ", address='" + address + '\'' +
+                ", glkeshi='" + glkeshi + '\'' +
+                ", telephone='" + telephone + '\'' +
+                ", director='" + director + '\'' +
+                ", headNurse='" + headNurse + '\'' +
+                ", bedCount=" + bedCount +
+                ", bedOpenCount=" + bedOpenCount +
+                ", sort=" + sort +
+                ", enabled=" + enabled +
+                ", remark='" + remark + '\'' +
+                '}';
+    }
+}

+ 49 - 0
src/main/java/org/example/entity/Yonghu.java

@@ -0,0 +1,49 @@
+package org.example.entity;
+
+public class Yonghu {
+    private Long id;
+    private String username;
+    private String password;
+    
+    // Constructors
+    public Yonghu() {}
+    
+    public Yonghu(String username, String password) {
+        this.username = username;
+        this.password = password;
+    }
+    
+    // Getters and Setters
+    public Long getId() {
+        return id;
+    }
+    
+    public void setId(Long id) {
+        this.id = id;
+    }
+    
+    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 toString() {
+        return "Yonghu{" +
+                "id=" + id +
+                ", username='" + username + '\'' +
+                ", password='" + password + '\'' +
+                '}';
+    }
+}

+ 14 - 0
src/main/java/org/example/mapper/AdminUserMapper.java

@@ -0,0 +1,14 @@
+package org.example.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.example.entity.AdminUser;
+
+@Mapper
+public interface AdminUserMapper {
+    /**
+     * 根据用户名查询管理员用户
+     * @param username 用户名
+     * @return 管理员用户对象
+     */
+    AdminUser findByUsername(String username);
+}

+ 48 - 0
src/main/java/org/example/mapper/HospitalDeptMapper.java

@@ -0,0 +1,48 @@
+package org.example.mapper;
+
+import org.apache.ibatis.annotations.*;
+import org.example.entity.HospitalDept;
+
+import java.util.List;
+
+@Mapper
+public interface HospitalDeptMapper {
+    
+    /**
+     * 查询所有科室
+     * @return 科室列表
+     */
+    @Select("SELECT code, out_code AS outCode, name, address, telephone, introduction, enabled, remark FROM tb_hospital_dept")
+    List<HospitalDept> findAll();
+    
+    /**
+     * 根据科室代码查询科室
+     * @param code 科室代码
+     * @return 科室信息
+     */
+    @Select("SELECT code, out_code AS outCode, name, address, telephone, introduction, enabled, remark FROM tb_hospital_dept WHERE code = #{code}")
+    HospitalDept findByCode(String code);
+    
+    /**
+     * 插入新科室
+     * @param dept 科室信息
+     */
+    @Insert("INSERT INTO tb_hospital_dept(code, out_code, name, address, telephone, introduction, enabled, remark) " +
+            "VALUES(#{code}, #{outCode}, #{name}, #{address}, #{telephone}, #{introduction}, #{enabled}, #{remark})")
+    void insert(HospitalDept dept);
+    
+    /**
+     * 更新科室信息
+     * @param dept 科室信息
+     */
+    @Update("UPDATE tb_hospital_dept SET out_code=#{outCode}, name=#{name}, address=#{address}, telephone=#{telephone}, " +
+            "introduction=#{introduction}, enabled=#{enabled}, remark=#{remark} WHERE code=#{code}")
+    void update(HospitalDept dept);
+    
+    /**
+     * 根据科室代码删除科室
+     * @param code 科室代码
+     */
+    @Delete("DELETE FROM tb_hospital_dept WHERE code = #{code}")
+    void deleteByCode(String code);
+}

+ 28 - 0
src/main/java/org/example/mapper/HospitalOverviewMapper.java

@@ -0,0 +1,28 @@
+package org.example.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.example.entity.HospitalOverview;
+
+@Mapper
+public interface HospitalOverviewMapper {
+    /**
+     * 获取医院概况信息
+     * @return 医院概况对象
+     */
+    HospitalOverview getHospitalOverview();
+
+    /**
+     * 更新医院概况信息
+     * @param hospitalOverview 医院概况对象
+     * @return 影响的行数
+     */
+    int updateHospitalOverview(HospitalOverview hospitalOverview);
+
+    /**
+     * 插入医院概况信息
+     * @param hospitalOverview 医院概况对象
+     * @return 影响的行数
+     */
+    int insertHospitalOverview(HospitalOverview hospitalOverview);
+}

+ 96 - 0
src/main/java/org/example/mapper/HospitalWardMapper.java

@@ -0,0 +1,96 @@
+package org.example.mapper;
+
+import org.apache.ibatis.annotations.*;
+import org.example.entity.HospitalWard;
+
+import java.util.List;
+
+@Mapper
+public interface HospitalWardMapper {
+    
+    /**
+     * 查询所有病区
+     * @return 病区列表
+     */
+    @Select("SELECT code, out_code AS outCode, name, address, glkeshi, telephone, director, head_nurse AS headNurse, bed_count AS bedCount, bed_open_count AS bedOpenCount, sort, enabled, remark FROM tb_hospital_ward")
+    List<HospitalWard> findAll();
+    
+    /**
+     * 根据病区代码查询病区
+     * @param code 病区代码
+     * @return 病区信息
+     */
+    @Select("SELECT code, out_code AS outCode, name, address, glkeshi, telephone, director, head_nurse AS headNurse, bed_count AS bedCount, bed_open_count AS bedOpenCount, sort, enabled, remark FROM tb_hospital_ward WHERE code = #{code} LIMIT 1")
+    HospitalWard findByCode(String code);
+    
+    /**
+     * 根据病区名称模糊查询病区列表
+     * @param name 病区名称
+     * @return 病区列表
+     */
+    @Select("SELECT code, out_code AS outCode, name, address, glkeshi, telephone, director, head_nurse AS headNurse, bed_count AS bedCount, bed_open_count AS bedOpenCount, sort, enabled, remark FROM tb_hospital_ward WHERE name LIKE CONCAT('%', #{name}, '%')")
+    List<HospitalWard> findByNameContaining(String name);
+    
+    /**
+     * 根据关联科室模糊查询病区列表
+     * @param glkeshi 关联科室
+     * @return 病区列表
+     */
+    @Select("SELECT code, out_code AS outCode, name, address, glkeshi, telephone, director, head_nurse AS headNurse, bed_count AS bedCount, bed_open_count AS bedOpenCount, sort, enabled, remark FROM tb_hospital_ward WHERE glkeshi LIKE CONCAT('%', #{glkeshi}, '%')")
+    List<HospitalWard> findByGlkeshiContaining(String glkeshi);
+    
+    /**
+     * 根据启用状态查询病区列表
+     * @param enabled 是否启用
+     * @return 病区列表
+     */
+    @Select("SELECT code, out_code AS outCode, name, address, glkeshi, telephone, director, head_nurse AS headNurse, bed_count AS bedCount, bed_open_count AS bedOpenCount, sort, enabled, remark FROM tb_hospital_ward WHERE enabled = #{enabled}")
+    List<HospitalWard> findByEnabled(Boolean enabled);
+    
+    /**
+     * 检查是否存在指定代码的病区(用于唯一性检查)
+     * @param code 病区代码
+     * @param excludeCode 要排除的代码(更新时使用)
+     * @return 病区列表
+     */
+    @Select("SELECT code, out_code AS outCode, name, address, glkeshi, telephone, director, head_nurse AS headNurse, bed_count AS bedCount, bed_open_count AS bedOpenCount, sort, enabled, remark FROM tb_hospital_ward WHERE code = #{code} AND code != #{excludeCode}")
+    List<HospitalWard> findByCodeExcluding(String code, String excludeCode);
+    
+    /**
+     * 插入新病区
+     * @param ward 病区信息
+     */
+    @Insert("INSERT INTO tb_hospital_ward(code, out_code, name, address, glkeshi, telephone, director, head_nurse, bed_count, bed_open_count, sort, enabled, remark) " +
+            "VALUES(#{code}, #{outCode}, #{name}, #{address}, #{glkeshi}, #{telephone}, #{director}, #{headNurse}, #{bedCount}, #{bedOpenCount}, #{sort}, #{enabled}, #{remark})")
+    void insert(HospitalWard ward);
+    
+    /**
+     * 更新病区信息
+     * @param ward 病区信息
+     */
+    @Update({"<script>",
+            "UPDATE tb_hospital_ward",
+            "SET code = #{ward.code}",
+            "<if test='ward.outCode != null'>, out_code = #{ward.outCode}</if>",
+            "<if test='ward.name != null'>, name = #{ward.name}</if>",
+            "<if test='ward.address != null'>, address = #{ward.address}</if>",
+            "<if test='ward.glkeshi != null'>, glkeshi = #{ward.glkeshi}</if>",
+            "<if test='ward.telephone != null'>, telephone = #{ward.telephone}</if>",
+            "<if test='ward.director != null'>, director = #{ward.director}</if>",
+            "<if test='ward.headNurse != null'>, head_nurse = #{ward.headNurse}</if>",
+            "<if test='ward.bedCount != null'>, bed_count = #{ward.bedCount}</if>",
+            "<if test='ward.bedOpenCount != null'>, bed_open_count = #{ward.bedOpenCount}</if>",
+            "<if test='ward.sort != null'>, sort = #{ward.sort}</if>",
+            "<if test='ward.enabled != null'>, enabled = #{ward.enabled}</if>",
+            "<if test='ward.remark != null'>, remark = #{ward.remark}</if>",
+            "WHERE code = #{originCode}",
+            "</script>"})
+    void update(@Param("ward") HospitalWard ward, @Param("originCode") String originCode);
+    
+    /**
+     * 根据病区代码删除病区
+     * @param code 病区代码
+     */
+    @Delete("DELETE FROM tb_hospital_ward WHERE code = #{code}")
+    void deleteByCode(String code);
+}

+ 14 - 0
src/main/java/org/example/mapper/YonghuMapper.java

@@ -0,0 +1,14 @@
+package org.example.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.example.entity.Yonghu;
+
+@Mapper
+public interface YonghuMapper {
+    /**
+     * 根据用户名查询用户
+     * @param username 用户名
+     * @return 用户对象
+     */
+    Yonghu findByUsername(String username);
+}

+ 28 - 0
src/main/java/org/example/model/User.java

@@ -0,0 +1,28 @@
+package org.example.model;
+
+public class User {
+    private String username;
+    private String password;
+    
+    public User(String username, String password) {
+        this.username = username;
+        this.password = password;
+    }
+    
+    // Getters and setters
+    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;
+    }
+}

+ 21 - 0
src/main/java/org/example/service/AdminUserService.java

@@ -0,0 +1,21 @@
+package org.example.service;
+
+import org.example.entity.AdminUser;
+import org.example.mapper.AdminUserMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AdminUserService {
+    
+    @Autowired
+    private AdminUserMapper adminUserMapper;
+    
+    public boolean authenticate(String username, String password) {
+        AdminUser adminUser = adminUserMapper.findByUsername(username);
+        if (adminUser != null && adminUser.getPassword().equals(password)) {
+            return true;
+        }
+        return false;
+    }
+}

+ 56 - 0
src/main/java/org/example/service/HospitalDeptService.java

@@ -0,0 +1,56 @@
+package org.example.service;
+
+import org.example.entity.HospitalDept;
+import org.example.mapper.HospitalDeptMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class HospitalDeptService {
+    
+    @Autowired
+    private HospitalDeptMapper hospitalDeptMapper;
+    
+    /**
+     * 获取所有科室列表
+     * @return 科室列表
+     */
+    public List<HospitalDept> findAll() {
+        return hospitalDeptMapper.findAll();
+    }
+    
+    /**
+     * 根据科室代码获取科室信息
+     * @param code 科室代码
+     * @return 科室信息
+     */
+    public HospitalDept findByCode(String code) {
+        return hospitalDeptMapper.findByCode(code);
+    }
+    
+    /**
+     * 添加新科室
+     * @param dept 科室信息
+     */
+    public void addDept(HospitalDept dept) {
+        hospitalDeptMapper.insert(dept);
+    }
+    
+    /**
+     * 更新科室信息
+     * @param dept 科室信息
+     */
+    public void updateDept(HospitalDept dept) {
+        hospitalDeptMapper.update(dept);
+    }
+    
+    /**
+     * 删除科室
+     * @param code 科室代码
+     */
+    public void deleteDept(String code) {
+        hospitalDeptMapper.deleteByCode(code);
+    }
+}

+ 48 - 0
src/main/java/org/example/service/HospitalOverviewService.java

@@ -0,0 +1,48 @@
+package org.example.service;
+
+import org.example.entity.HospitalOverview;
+import org.example.mapper.HospitalOverviewMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class HospitalOverviewService {
+    
+    @Autowired
+    private HospitalOverviewMapper hospitalOverviewMapper;
+    
+    /**
+     * 获取医院概况信息
+     * @return 医院概况对象
+     */
+    public HospitalOverview getHospitalOverview() {
+        return hospitalOverviewMapper.getHospitalOverview();
+    }
+    
+    /**
+     * 保存医院概况信息
+     * @param hospitalOverview 医院概况对象
+     * @return 是否保存成功
+     */
+    public boolean saveHospitalOverview(HospitalOverview hospitalOverview) {
+        try {
+            // 先尝试获取现有记录
+            HospitalOverview existing = hospitalOverviewMapper.getHospitalOverview();
+            
+            int result;
+            if (existing != null) {
+                // 如果存在记录,则更新
+                hospitalOverview.setId(existing.getId());
+                result = hospitalOverviewMapper.updateHospitalOverview(hospitalOverview);
+            } else {
+                // 如果不存在记录,则插入新记录
+                result = hospitalOverviewMapper.insertHospitalOverview(hospitalOverview);
+            }
+            
+            return result > 0;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+}

+ 95 - 0
src/main/java/org/example/service/HospitalWardService.java

@@ -0,0 +1,95 @@
+package org.example.service;
+
+import org.example.entity.HospitalWard;
+import org.example.mapper.HospitalWardMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class HospitalWardService {
+    
+    @Autowired
+    private HospitalWardMapper hospitalWardMapper;
+    
+    /**
+     * 获取所有病区列表
+     * @return 病区列表
+     */
+    public List<HospitalWard> findAll() {
+        return hospitalWardMapper.findAll();
+    }
+    
+    /**
+     * 根据病区代码获取病区信息
+     * @param code 病区代码
+     * @return 病区信息
+     */
+    public HospitalWard findByCode(String code) {
+        return hospitalWardMapper.findByCode(code);
+    }
+    
+    /**
+     * 检查除了指定代码外,是否还存在其他相同的代码
+     * @param code 病区代码
+     * @param excludeCode 要排除的代码
+     * @return 是否存在
+     */
+    public boolean existsByCodeExcluding(String code, String excludeCode) {
+        List<HospitalWard> wards = hospitalWardMapper.findByCodeExcluding(code, excludeCode);
+        return wards != null && !wards.isEmpty();
+    }
+    
+    /**
+     * 根据病区名称模糊查询病区列表
+     * @param name 病区名称
+     * @return 病区列表
+     */
+    public List<HospitalWard> findByNameContaining(String name) {
+        return hospitalWardMapper.findByNameContaining(name);
+    }
+    
+    /**
+     * 根据关联科室模糊查询病区列表
+     * @param glkeshi 关联科室
+     * @return 病区列表
+     */
+    public List<HospitalWard> findByGlkeshiContaining(String glkeshi) {
+        return hospitalWardMapper.findByGlkeshiContaining(glkeshi);
+    }
+    
+    /**
+     * 根据启用状态查询病区列表
+     * @param enabled 是否启用
+     * @return 病区列表
+     */
+    public List<HospitalWard> findByEnabled(Boolean enabled) {
+        return hospitalWardMapper.findByEnabled(enabled);
+    }
+    
+    /**
+     * 添加新病区
+     * @param ward 病区信息
+     */
+    public void addWard(HospitalWard ward) {
+        hospitalWardMapper.insert(ward);
+    }
+    
+    /**
+     * 更新病区信息
+     * @param originCode 原始病区代码
+     * @param ward 病区信息
+     */
+    public void updateWard(String originCode, HospitalWard ward) {
+        hospitalWardMapper.update(ward, originCode);
+    }
+    
+    /**
+     * 删除病区
+     * @param code 病区代码
+     */
+    public void deleteWard(String code) {
+        hospitalWardMapper.deleteByCode(code);
+    }
+}

+ 21 - 0
src/main/java/org/example/service/YonghuService.java

@@ -0,0 +1,21 @@
+package org.example.service;
+
+import org.example.entity.Yonghu;
+import org.example.mapper.YonghuMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class YonghuService {
+    
+    @Autowired
+    private YonghuMapper yonghuMapper;
+    
+    public boolean authenticate(String username, String password) {
+        Yonghu yonghu = yonghuMapper.findByUsername(username);
+        if (yonghu != null && yonghu.getPassword().equals(password)) {
+            return true;
+        }
+        return false;
+    }
+}

+ 153 - 0
src/main/java/org/example/view/LoginView.java

@@ -0,0 +1,153 @@
+package org.example.view;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+public class LoginView extends JFrame {
+    private JTextField usernameField;
+    private JPasswordField passwordField;
+    private JButton loginButton;
+    private JButton resetButton;
+
+    public LoginView() {
+        initializeComponents();
+        setupLayout();
+        setupEvents();
+        
+        setTitle("智慧病房管理平台");
+        setSize(400, 300);
+        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        setLocationRelativeTo(null); // 居中显示
+        setResizable(false);
+    }
+    
+    private void initializeComponents() {
+        usernameField = new JTextField(20);
+        passwordField = new JPasswordField(20);
+        loginButton = new JButton("登录");
+        resetButton = new JButton("重置");
+        
+        // 设置字体
+        Font font = new Font("微软雅黑", Font.PLAIN, 16);
+        usernameField.setFont(font);
+        passwordField.setFont(font);
+        loginButton.setFont(new Font("微软雅黑", Font.BOLD, 16));
+        resetButton.setFont(new Font("微软雅黑", Font.PLAIN, 16));
+    }
+    
+    private void setupLayout() {
+        JPanel mainPanel = new JPanel(new GridBagLayout());
+        GridBagConstraints gbc = new GridBagConstraints();
+        gbc.insets = new Insets(10, 10, 10, 10);
+        
+        // 标题
+        JLabel titleLabel = new JLabel("智慧病房管理平台");
+        titleLabel.setFont(new Font("微软雅黑", Font.BOLD, 24));
+        titleLabel.setHorizontalAlignment(SwingConstants.CENTER);
+        gbc.gridx = 0; gbc.gridy = 0;
+        gbc.gridwidth = 2;
+        mainPanel.add(titleLabel, gbc);
+        
+        // 用户名标签和输入框
+        gbc.gridwidth = 1;
+        gbc.anchor = GridBagConstraints.EAST;
+        gbc.gridx = 0; gbc.gridy = 1;
+        mainPanel.add(new JLabel("用户名:"), gbc);
+        
+        gbc.anchor = GridBagConstraints.WEST;
+        gbc.gridx = 1; gbc.gridy = 1;
+        mainPanel.add(usernameField, gbc);
+        
+        // 密码标签和输入框
+        gbc.anchor = GridBagConstraints.EAST;
+        gbc.gridx = 0; gbc.gridy = 2;
+        mainPanel.add(new JLabel("密码:"), gbc);
+        
+        gbc.anchor = GridBagConstraints.WEST;
+        gbc.gridx = 1; gbc.gridy = 2;
+        mainPanel.add(passwordField, gbc);
+        
+        // 按钮面板
+        JPanel buttonPanel = new JPanel(new FlowLayout());
+        buttonPanel.add(loginButton);
+        buttonPanel.add(resetButton);
+        
+        gbc.gridx = 0; gbc.gridy = 3;
+        gbc.gridwidth = 2;
+        gbc.anchor = GridBagConstraints.CENTER;
+        mainPanel.add(buttonPanel, gbc);
+        
+        add(mainPanel);
+    }
+    
+    private void setupEvents() {
+        loginButton.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                login();
+            }
+        });
+        
+        resetButton.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                resetFields();
+            }
+        });
+        
+        // 添加回车键登录支持
+        passwordField.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                login();
+            }
+        });
+    }
+    
+    private void login() {
+        String username = usernameField.getText().trim();
+        String password = new String(passwordField.getPassword());
+        
+        if (username.isEmpty()) {
+            JOptionPane.showMessageDialog(this, "请输入用户名!", "提示", JOptionPane.WARNING_MESSAGE);
+            return;
+        }
+        
+        if (password.isEmpty()) {
+            JOptionPane.showMessageDialog(this, "请输入密码!", "提示", JOptionPane.WARNING_MESSAGE);
+            return;
+        }
+        
+        // 这里应该调用后端服务进行验证
+        // 暂时使用简单的验证
+        if ("admin".equals(username) && "password".equals(password)) {
+            JOptionPane.showMessageDialog(this, "登录成功!", "提示", JOptionPane.INFORMATION_MESSAGE);
+            // 登录成功后跳转到主界面
+            dispose(); // 关闭登录窗口
+            showMainApplication(); // 显示主应用窗口
+        } else {
+            JOptionPane.showMessageDialog(this, "用户名或密码错误!", "错误", JOptionPane.ERROR_MESSAGE);
+        }
+    }
+    
+    private void resetFields() {
+        usernameField.setText("");
+        passwordField.setText("");
+        usernameField.requestFocus();
+    }
+    
+    private void showMainApplication() {
+        JFrame mainFrame = new JFrame("智慧病房管理系统主界面");
+        mainFrame.setSize(800, 600);
+        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        
+        JLabel welcomeLabel = new JLabel("欢迎使用智慧病房管理系统!", SwingConstants.CENTER);
+        welcomeLabel.setFont(new Font("微软雅黑", Font.BOLD, 24));
+        mainFrame.add(welcomeLabel);
+        
+        mainFrame.setLocationRelativeTo(null);
+        mainFrame.setVisible(true);
+    }
+}

+ 37 - 0
src/main/resources/application.properties

@@ -0,0 +1,37 @@
+server:
+tomcat:
+uri-encoding: UTF-8
+port: 8080
+servlet:
+context-path: /shixian
+
+
+ 服务器配置
+server.port=8080
+server.servlet.context-path=/shixian
+server.tomcat.uri-encoding=UTF-8
+
+ 数据库连接配置
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+spring.datasource.url=jdbc:mysql://127.0.0.1:3306/shixian?useUnicode=true&characterEncoding=utf-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
+spring.datasource.username=root
+spring.datasource.password=123456
+
+# MyBatis配置
+mybatis.mapper-locations=classpath:mapper/*.xml
+mybatis.type-aliases-package=org.example.entity
+mybatis.configuration.map-underscore-to-camel-case=true
+mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
+
+# 日志配置
+logging.level.root=info
+logging.level.org.example=debug
+logging.level.org.mybatis=debug
+
+# 静态资源配置
+spring.mvc.static-path-pattern=/**
+spring.web.resources.static-locations=classpath:/static/
+
+# 文件上传配置
+spring.servlet.multipart.max-file-size=10MB
+spring.servlet.multipart.max-request-size=10MB

+ 19 - 0
src/main/resources/mapper/AdminUserMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="org.example.mapper.AdminUserMapper">
+    
+    <!-- 结果映射 -->
+    <resultMap id="AdminUserResultMap" type="AdminUser">
+        <id property="id" column="id"/>
+        <result property="username" column="username"/>
+        <result property="password" column="password"/>
+    </resultMap>
+    
+    <!-- 根据用户名查询管理员用户 -->
+    <select id="findByUsername" parameterType="string" resultMap="AdminUserResultMap">
+        SELECT id, username, password FROM users WHERE username = #{username}
+    </select>
+    
+</mapper>

+ 36 - 0
src/main/resources/mapper/HospitalOverviewMapper.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="org.example.mapper.HospitalOverviewMapper">
+    
+    <!-- 结果映射 -->
+    <resultMap id="HospitalOverviewResultMap" type="HospitalOverview">
+        <id property="id" column="id"/>
+        <result property="dizhi" column="dizhi"/>
+        <result property="dianhua" column="dianhua"/>
+        <result property="jieshao" column="jieshao"/>
+    </resultMap>
+    
+    <!-- 获取医院概况信息 -->
+    <select id="getHospitalOverview" resultMap="HospitalOverviewResultMap">
+        SELECT id, dizhi, dianhua, jieshao FROM yiyuangaikuang LIMIT 1
+    </select>
+    
+    <!-- 更新医院概况信息 -->
+    <update id="updateHospitalOverview" parameterType="HospitalOverview">
+        UPDATE yiyuangaikuang 
+        SET 
+            dizhi = #{dizhi},
+            dianhua = #{dianhua},
+            jieshao = #{jieshao}
+        WHERE id = #{id}
+    </update>
+    
+    <!-- 插入医院概况信息 -->
+    <insert id="insertHospitalOverview" parameterType="HospitalOverview">
+        INSERT INTO yiyuangaikuang(dizhi, dianhua, jieshao)
+        VALUES (#{dizhi}, #{dianhua}, #{jieshao})
+    </insert>
+    
+</mapper>

+ 19 - 0
src/main/resources/mapper/YonghuMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="org.example.mapper.YonghuMapper">
+    
+    <!-- 结果映射 -->
+    <resultMap id="YonghuResultMap" type="Yonghu">
+        <id property="id" column="id"/>
+        <result property="username" column="username"/>
+        <result property="password" column="password"/>
+    </resultMap>
+    
+    <!-- 根据用户名查询用户 -->
+    <select id="findByUsername" parameterType="string" resultMap="YonghuResultMap">
+        SELECT id, username, password FROM yonghu WHERE username = #{username}
+    </select>
+    
+</mapper>

+ 111 - 0
src/main/resources/static/css/modal.css

@@ -0,0 +1,111 @@
+/* 弹窗样式 */
+.modal {
+    display: none; /* 默认隐藏 */
+    position: fixed;
+    z-index: 1000;
+    left: 0;
+    top: 0;
+    width: 100%;
+    height: 100%;
+    overflow: auto;
+    background-color: rgba(0,0,0,0.4);
+}
+
+/* 弹窗内容 */
+.modal-content {
+    background-color: #fefefe;
+    margin: 15% auto;
+    padding: 20px;
+    border: 1px solid #888;
+    width: 80%;
+    max-width: 600px;
+    border-radius: 5px;
+}
+
+/* 弹窗标题 */
+.modal-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 20px;
+    padding-bottom: 10px;
+    border-bottom: 1px solid #ddd;
+}
+
+.modal-title {
+    color: white;
+    font-size: 18px;
+    font-weight: bold;
+    background-color: #007bff;
+    padding: 10px 15px;
+    border-radius: 3px;
+}
+
+/* 关闭按钮 */
+.close {
+    color: #aaa;
+    float: right;
+    font-size: 28px;
+    font-weight: bold;
+    cursor: pointer;
+}
+
+.close:hover {
+    color: black;
+}
+
+/* 表单组 */
+.form-group {
+    display: flex;
+    margin-bottom: 15px;
+}
+
+/* 标签 */
+.label {
+    width: 120px;
+    padding: 8px 10px;
+    font-weight: bold;
+    text-align: right;
+    background-color: #f8f9fa;
+    border: 1px solid #ddd;
+    border-radius: 3px;
+}
+
+/* 输入框 */
+.input-field {
+    flex: 1;
+    padding: 8px 10px;
+    border: 1px solid #ddd;
+    border-radius: 3px;
+    margin-left: 10px;
+    background-color: #f8f9fa;
+}
+
+/* 科室介绍文本域 */
+.textarea-field {
+    width: 100%;
+    height: 150px;
+    padding: 10px;
+    border: 1px solid #ddd;
+    border-radius: 3px;
+    background-color: #f8f9fa;
+    resize: vertical;
+}
+
+/* 按钮 */
+.btn {
+    padding: 8px 15px;
+    border: none;
+    border-radius: 3px;
+    cursor: pointer;
+    margin-right: 10px;
+}
+
+.btn-primary {
+    background-color: #007bff;
+    color: white;
+}
+.btn-secondary {
+    background-color: #6c757d;
+    color: white;
+}

+ 132 - 0
src/main/resources/static/css/style.css

@@ -0,0 +1,132 @@
+* {
+    margin: 0;
+    padding: 0;
+    box-sizing: border-box;
+}
+
+body {
+    font-family: 'Microsoft YaHei', Arial, sans-serif;
+    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+    min-height: 100vh;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+
+.container {
+    width: 100%;
+    max-width: 400px;
+    padding: 20px;
+}
+
+.login-wrapper {
+    background: rgba(255, 255, 255, 0.95);
+    border-radius: 10px;
+    box-shadow: 0 15px 35px rgba(0, 0, 0, 0.1);
+    padding: 40px 30px;
+    backdrop-filter: blur(10px);
+}
+
+.login-header {
+    text-align: center;
+    margin-bottom: 30px;
+}
+
+.login-header h1 {
+    color: #333;
+    font-size: 24px;
+    font-weight: bold;
+}
+
+.login-tabs {
+    display: flex;
+    margin-bottom: 30px;
+    border-bottom: 2px solid #eee;
+}
+
+.tab-button {
+    flex: 1;
+    padding: 12px;
+    border: none;
+    background: transparent;
+    font-size: 16px;
+    cursor: pointer;
+    transition: all 0.3s ease;
+    color: #666;
+}
+
+.tab-button.active {
+    color: #667eea;
+    border-bottom: 3px solid #667eea;
+    font-weight: bold;
+}
+
+.form-group {
+    margin-bottom: 20px;
+}
+
+.form-group label {
+    display: block;
+    margin-bottom: 8px;
+    color: #333;
+    font-weight: 500;
+}
+
+.form-group input {
+    width: 100%;
+    padding: 12px 15px;
+    border: 2px solid #ddd;
+    border-radius: 5px;
+    font-size: 16px;
+    transition: border-color 0.3s ease;
+}
+
+.form-group input:focus {
+    outline: none;
+    border-color: #667eea;
+}
+
+.form-group button {
+    width: 100%;
+    padding: 12px;
+    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+    color: white;
+    border: none;
+    border-radius: 5px;
+    font-size: 16px;
+    cursor: pointer;
+    transition: transform 0.2s ease;
+}
+
+.form-group button:hover {
+    transform: translateY(-2px);
+}
+
+.form-group button:active {
+    transform: translateY(0);
+}
+
+.message {
+    margin-top: 20px;
+    padding: 10px;
+    border-radius: 5px;
+    text-align: center;
+    display: none;
+}
+
+.message.success {
+    background-color: #d4edda;
+    color: #155724;
+    border: 1px solid #c3e6cb;
+}
+
+.message.error {
+    background-color: #f8d7da;
+    color: #721c24;
+    border: 1px solid #f5c6cb;
+}
+
+.loading {
+    opacity: 0.7;
+    pointer-events: none;
+}

+ 1705 - 0
src/main/resources/static/home.html

@@ -0,0 +1,1705 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>智慧病房管理平台 - 主页</title>
+    <style>
+        * {
+            margin: 0;
+            padding: 0;
+            box-sizing: border-box;
+        }
+        
+        body {
+            font-family: 'Microsoft YaHei', Arial, sans-serif;
+            background-color: #f5f5f5;
+        }
+        
+        .container {
+            display: flex;
+            min-height: 100vh;
+        }
+        
+        /* 左侧导航栏样式 */
+        .sidebar {
+            width: 250px;
+            background: #2c3e50;
+            color: white;
+            transition: all 0.3s ease;
+            overflow-y: auto;
+        }
+        
+        .sidebar-header {
+            padding: 15px;
+            background: #1a252f;
+            text-align: center;
+            font-size: 18px;
+            font-weight: bold;
+            border-bottom: 1px solid #34495e;
+        }
+        
+        .menu {
+            list-style: none;
+            padding: 0;
+            margin: 0;
+        }
+        
+        .menu-item {
+            border-bottom: 1px solid #34495e;
+        }
+        
+        .menu-item > a {
+            display: block;
+            padding: 12px 15px;
+            color: #ecf0f1;
+            text-decoration: none;
+            transition: background 0.3s ease;
+            cursor: pointer;
+        }
+        
+        .menu-item > a:hover {
+            background: #34495e;
+        }
+        
+        .menu-item > a i {
+            margin-right: 10px;
+        }
+        
+        .submenu {
+            list-style: none;
+            padding: 0;
+            margin: 0;
+            background: #34495e;
+            max-height: 0;
+            overflow: hidden;
+            transition: max-height 0.3s ease;
+        }
+        
+        .submenu.open {
+            max-height: 500px;
+        }
+        
+        .submenu li a {
+            display: block;
+            padding: 10px 15px 10px 30px;
+            color: #bdc3c7;
+            text-decoration: none;
+            transition: all 0.3s ease;
+        }
+        
+        .submenu li a:hover {
+            background: #2c3e50;
+            color: white;
+            padding-left: 45px;
+        }
+        
+        .submenu li a.active {
+            background: #1a252f;
+            color: white;
+        }
+        
+        /* 主内容区域样式 */
+        .main-content {
+            flex: 1;
+            display: flex;
+            flex-direction: column;
+        }
+        
+        .header {
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            padding: 12px 20px;
+            background: white;
+            box-shadow: 0 2px 5px rgba(0,0,0,0.1);
+            z-index: 100;
+        }
+        
+        .welcome {
+            font-size: 18px;
+            color: #333;
+        }
+        
+        .logout-btn {
+            padding: 8px 16px;
+            background: #dc3545;
+            color: white;
+            border: none;
+            border-radius: 4px;
+            cursor: pointer;
+        }
+        
+        .content {
+            flex: 1;
+            padding: 20px;
+            overflow-y: auto;
+        }
+        
+        .page-title {
+            margin-bottom: 15px;
+            color: #333;
+            font-size: 24px;
+        }
+        
+        .dashboard {
+            display: grid;
+            grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
+            gap: 15px;
+        }
+        
+        .card {
+            background: white;
+            border-radius: 8px;
+            padding: 15px;
+            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
+            text-align: center;
+            cursor: pointer;
+            transition: transform 0.3s ease;
+        }
+        
+        .card:hover {
+            transform: translateY(-5px);
+        }
+        
+        .card h3 {
+            margin-bottom: 10px;
+            color: #333;
+        }
+        
+        .card-icon {
+            font-size: 48px;
+            margin-bottom: 10px;
+        }
+        
+        /* 面包屑导航 */
+        .breadcrumb {
+            margin-bottom: 15px;
+            color: #7f8c8d;
+        }
+        
+        /* 表格样式 */
+        .data-table {
+            width: 100%;
+            border-collapse: collapse;
+            background: white;
+            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
+        }
+        
+        .data-table th, .data-table td {
+            padding: 8px 10px;
+            text-align: left;
+            border-bottom: 1px solid #ecf0f1;
+        }
+        
+        .data-table th {
+            background: #3498db;
+            color: white;
+        }
+        
+        .data-table tr:hover {
+            background: #f5f5f5;
+        }
+        
+        /* 按钮样式 */
+        .btn {
+            padding: 6px 12px;
+            border: none;
+            border-radius: 4px;
+            cursor: pointer;
+            text-decoration: none;
+            display: inline-block;
+            margin: 0 3px;
+        }
+        
+        .btn-primary {
+            background: #3498db;
+            color: white;
+        }
+        
+        .btn-success {
+            background: #2ecc71;
+            color: white;
+        }
+        
+        .btn-danger {
+            background: #e74c3c;
+            color: white;
+        }
+        
+        .btn-warning {
+            background: #f39c12;
+            color: white;
+        }
+        
+        .btn-secondary {
+            background: #95a5a6;
+            color: white;
+        }
+        
+        /* 表单样式 */
+        .form-group {
+            margin-bottom: 10px;
+        }
+        
+        .form-group label {
+            display: block;
+            margin-bottom: 3px;
+            font-weight: bold;
+        }
+        
+        .form-group input, .form-group select, .form-group textarea {
+            width: 100%;
+            padding: 8px;
+            border: 1px solid #ddd;
+            border-radius: 4px;
+        }
+        
+        .form-actions {
+            margin-top: 15px;
+        }
+    </style>
+</head>
+<body>
+    <div class="container">
+        <!-- 左侧导航栏 -->
+        <div class="sidebar">
+            <div class="sidebar-header">
+                智慧病房管理系统
+            </div>
+            <ul class="menu">
+                <li class="menu-item">
+                    <a href="#" onclick="toggleSubmenu('hospitalSubmenu')">🏥 院区信息管理</a>
+                    <ul class="submenu" id="hospitalSubmenu">
+                        <li><a href="#" onclick="loadContent('hospitalOverview')">医院概况</a></li>
+                        <li><a href="#" onclick="loadContent('departmentManagement')">科室管理</a></li>
+                        <li><a href="#" onclick="loadContent('wardManagement')">病区管理</a></li>
+                        <li><a href="#" onclick="loadContent('roomManagement')">病房管理</a></li>
+                        <li><a href="#" onclick="loadContent('bedManagement')">床位管理</a></li>
+                    </ul>
+                </li>
+                <li class="menu-item">
+                    <a href="#" onclick="toggleSubmenu('medicalSubmenu')">👨‍⚕️ 医护管理</a>
+                    <ul class="submenu" id="medicalSubmenu">
+                        <li><a href="#" onclick="loadContent('patientManagement')">患者管理</a></li>
+                    </ul>
+                </li>
+                <li class="menu-item">
+                    <a href="#" onclick="toggleSubmenu('equipmentSubmenu')">⚙️ 设备管理</a>
+                    <ul class="submenu" id="equipmentSubmenu">
+                        <li><a href="#" onclick="loadContent('equipmentInfo')">设备信息</a>
+                            <ul class="submenu" style="background:#2c3e50; padding-left:20px;">
+                                <li><a href="#" onclick="loadContent('equipmentQuery')">查询</a></li>
+                                <li><a href="#" onclick="loadContent('equipmentAdd')">新增</a></li>
+                                <li><a href="#" onclick="loadContent('equipmentEdit')">编辑</a></li>
+                                <li><a href="#" onclick="loadContent('equipmentDelete')">删除</a></li>
+                            </ul>
+                        </li>
+                    </ul>
+                </li>
+            </ul>
+        </div>
+        
+        <!-- 主内容区域 -->
+        <div class="main-content">
+            <div class="header">
+                <div class="welcome" id="welcomeMessage">欢迎使用智慧病房管理平台</div>
+                <button class="logout-btn" id="logoutBtn">退出登录</button>
+            </div>
+            
+            <div class="content">
+                <div class="breadcrumb" id="breadcrumb">
+                    首页
+                </div>
+                
+                <h1 class="page-title" id="pageTitle">系统概览</h1>
+                
+                <div id="mainContent">
+                    <div class="dashboard">
+                        <div class="card" onclick="loadContent('hospitalOverview')">
+                            <div class="card-icon">🏥</div>
+                            <h3>院区信息</h3>
+                            <p>查看和管理院区相关信息</p>
+                        </div>
+                        
+                        <div class="card" onclick="loadContent('medicalStaff')">
+                            <div class="card-icon">👨‍⚕️</div>
+                            <h3>医护人员</h3>
+                            <p>管理医生和护士信息</p>
+                        </div>
+                        
+                        <div class="card" onclick="loadContent('patientManagement')">
+                            <div class="card-icon">👤</div>
+                            <h3>患者信息</h3>
+                            <p>查看和更新患者资料</p>
+                        </div>
+                        
+                        <div class="card" onclick="loadContent('equipmentInfo')">
+                            <div class="card-icon">⚙️</div>
+                            <h3>设备管理</h3>
+                            <p>查看和管理设备信息</p>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    
+    <script>
+        // 当前激活的菜单项
+        let activeMenu = null;
+        
+        // 切换子菜单显示/隐藏
+        function toggleSubmenu(menuId) {
+            const submenu = document.getElementById(menuId);
+            submenu.classList.toggle('open');
+        }
+        
+        // 加载内容
+        function loadContent(contentType) {
+            const mainContent = document.getElementById('mainContent');
+            const pageTitle = document.getElementById('pageTitle');
+            const breadcrumb = document.getElementById('breadcrumb');
+            
+            // 更新激活状态
+            updateActiveMenu(contentType);
+            
+            switch(contentType) {
+                case 'hospitalOverview':
+                    pageTitle.textContent = '医院概况';
+                    breadcrumb.textContent = '首页 > 院区信息管理 > 医院概况';
+                    mainContent.innerHTML = `
+                        <div style="background: white; padding: 15px; box-shadow: 0 2px 10px rgba(0,0,0,0.1);">
+                            <h2 style="margin-bottom: 15px;">医院基本信息</h2>
+                            <div class="form-group">
+                                <label for="hospitalName">医院名称<span style="color: red;"> *</span></label>
+                                <input type="text" id="hospitalName" placeholder="请输入医院名称" style="width: 50%; padding: 8px; border: 1px solid #ddd; border-radius: 4px;">
+                            </div>
+                            <div class="form-group">
+                                <label for="hospitalAddress">医院地址</label>
+                                <input type="text" id="hospitalAddress" placeholder="请输入医院地址" style="width: 50%; padding: 8px; border: 1px solid #ddd; border-radius: 4px;">
+                            </div>
+                            <div class="form-group">
+                                <label for="hospitalPhone">联系电话</label>
+                                <input type="text" id="hospitalPhone" placeholder="请输入联系电话" style="width: 50%; padding: 8px; border: 1px solid #ddd; border-radius: 4px;">
+                            </div>
+                            <div class="form-group">
+                                <label>医院Logo</label>
+                                <div style="position: relative; display: inline-block; margin-top: 5px;">
+                                    <div id="logoPreview" style="width: 150px; height: 150px; border: 1px dashed #ccc; display: flex; align-items: center; justify-content: center;">
+                                        <span id="logoPlaceholder" style="color: #999;">暂无图片</span>
+                                        <img id="logoImage" src="" style="max-width: 100%; max-height: 100%; display: none;">
+                                    </div>
+                                    <div style="position: absolute; right: -3cm; bottom: 0;">
+                                        <input type="file" id="logoUpload" accept=".jpg,.jpeg,.png" style="display: none;" onchange="handleLogoUpload(event)">
+                                        <button class="btn btn-primary" onclick="document.getElementById('logoUpload').click()" style="font-size: 12px; padding: 5px 10px;">上传Logo</button>
+                                    </div>
+                                </div>
+                                <p style="font-size: 12px; color: #666; margin-top: 3px;">支持JPG、PNG格式,大小不超过10M</p>
+                            </div>
+                            <div class="form-group">
+                                <label for="hospitalDescription">医院介绍</label>
+                                <textarea id="hospitalDescription" placeholder="请输入医院介绍" style="width: 100%; padding: 8px; border: 1px solid #ddd; border-radius: 4px; height: 120px;"></textarea>
+                            </div>
+                            <div class="form-actions">
+                                <button class="btn btn-success" onclick="saveHospitalOverview()" style="padding: 6px 15px;">保存</button>
+                                <button class="btn btn-secondary" onclick="loadContent('hospitalOverview')" style="padding: 6px 15px;">取消</button>
+                            </div>
+                        </div>
+                    `;
+                    
+                    // 加载医院概况数据
+                    loadHospitalOverviewData();
+                    break;
+                    
+                case 'departmentManagement':
+                    pageTitle.textContent = '科室管理';
+                    breadcrumb.textContent = '首页 > 院区信息管理 > 科室管理';
+                    mainContent.innerHTML = `
+                        <div style="background: white; padding: 15px; box-shadow: 0 2px 10px rgba(0,0,0,0.1);">
+                            <div style="display: flex; justify-content: space-between; margin-bottom: 10px;">
+                                <div>
+                                    <input type="text" id="departmentName" placeholder="科室名称" style="padding: 6px; border: 1px solid #ddd; border-radius: 4px; width: 140px; margin-right: 8px;">
+                                </div>
+                                <div>
+                                    <select id="enabled" style="padding: 6px; border: 1px solid #ddd; border-radius: 4px; width: 90px; margin-right: 8px;">
+                                        <option value="">是否启用</option>
+                                        <option value="true">是</option>
+                                        <option value="false">否</option>
+                                    </select>
+                                    <button class="btn btn-primary" onclick="searchDepartments()" style="padding: 6px 12px;">查询</button>
+                                    <button class="btn btn-secondary" onclick="clearSearch()" style="padding: 6px 12px;">重置</button>
+                                </div>
+                            </div>
+                            <table class="data-table" id="departmentTable">
+                                <thead>
+                                    <tr>
+                                        <th>科室代码</th>
+                                        <th>科室外部代码</th>
+                                        <th>科室名称</th>
+                                        <th>科室地址</th>
+                                        <th>科室电话</th>
+                                        <th>科室介绍</th>
+                                        <th>是否启用</th>
+                                        <th>备注</th>
+                                        <th>详情</th>
+                                    </tr>
+                                </thead>
+                                <tbody id="departmentTableBody">
+                                    <!-- 动态加载数据 -->
+                                </tbody>
+                            </table>
+                        </div>
+                        
+                        <!-- 科室详情模态框 -->
+                        <div id="departmentModal" style="display:none; position: fixed; z-index: 1000; left: 0; top: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.4); overflow: auto; padding: 50px 0;">
+                            <div style="background-color: #fff; margin: 0 auto; padding: 0; border: 1px solid #888; width: 80%; max-width: 600px; border-radius: 5px; max-height: 80%; display: flex; flex-direction: column;">
+                                <div style="padding: 20px; border-bottom: 1px solid #eee;">
+                                    <h2 style="margin-top: 0;">科室详情</h2>
+                                </div>
+                                <div style="overflow-y: auto; flex: 1; padding: 15px;">
+                                    <div class="form-group">
+                                        <label>科室代码:</label>
+                                        <input type="text" id="modalCode" readonly style="width: 100%; padding: 6px;">
+                                    </div>
+                                    <div class="form-group">
+                                        <label>科室外部代码:</label>
+                                        <input type="text" id="modalOutCode" readonly style="width: 100%; padding: 6px;">
+                                    </div>
+                                    <div class="form-group">
+                                        <label>科室名称:</label>
+                                        <input type="text" id="modalName" readonly style="width: 100%; padding: 6px;">
+                                    </div>
+                                    <div class="form-group">
+                                        <label>科室地址:</label>
+                                        <input type="text" id="modalAddress" readonly style="width: 100%; padding: 6px;">
+                                    </div>
+                                    <div class="form-group">
+                                        <label>科室电话:</label>
+                                        <input type="text" id="modalTelephone" readonly style="width: 100%; padding: 6px;">
+                                    </div>
+                                    <div class="form-group">
+                                        <label>科室介绍:</label>
+                                        <textarea id="modalIntroduction" readonly style="width: 100%; padding: 6px; height: 70px;"></textarea>
+                                    </div>
+                                    <div class="form-group">
+                                        <label>是否启用:</label>
+                                        <input type="text" id="modalEnabled" readonly style="width: 100%; padding: 6px;">
+                                    </div>
+                                    <div class="form-group">
+                                        <label>备注:</label>
+                                        <textarea id="modalRemark" readonly style="width: 100%; padding: 6px; height: 50px;"></textarea>
+                                    </div>
+                                </div>
+                                <div style="padding: 20px; border-top: 1px solid #eee; text-align: right;">
+                                    <button class="btn btn-secondary" onclick="closeDepartmentModal()">关闭</button>
+                                </div>
+                            </div>
+                        </div>
+                    `;
+                    // 加载科室数据
+                    loadDepartmentData();
+                    break;
+                    
+                case 'wardManagement':
+                    pageTitle.textContent = '病区管理';
+                    breadcrumb.textContent = '首页 > 院区信息管理 > 病区管理';
+                    mainContent.innerHTML = `
+                        <div style="background: white; padding: 15px; box-shadow: 0 2px 10px rgba(0,0,0,0.1);">
+                            <div style="display: flex; justify-content: space-between; margin-bottom: 10px;">
+                                <div>
+                                    <input type="text" id="wardName" placeholder="病区名称" style="padding: 6px; border: 1px solid #ddd; border-radius: 4px; width: 140px; margin-right: 8px;">
+                                    <input type="text" id="wardGlkeshi" placeholder="关联科室" style="padding: 6px; border: 1px solid #ddd; border-radius: 4px; width: 140px; margin-right: 8px;">
+                                </div>
+                                <div>
+                                    <select id="wardEnabled" style="padding: 6px; border: 1px solid #ddd; border-radius: 4px; width: 90px; margin-right: 8px;">
+                                        <option value="">是否启用</option>
+                                        <option value="true">是</option>
+                                        <option value="false">否</option>
+                                    </select>
+                                    <button class="btn btn-primary" onclick="searchWards()" style="padding: 6px 12px;">查询</button>
+                                    <button class="btn btn-secondary" onclick="clearWardSearch()" style="padding: 6px 12px;">重置</button>
+                                    <button class="btn btn-warning" onclick="showWardCodeSetting()" style="margin-left: 8px; padding: 6px 12px;">病区代码设置</button>
+                                </div>
+                            </div>
+                            <table class="data-table" id="wardTable">
+                                <thead>
+                                    <tr>
+                                        <th><input type="checkbox" id="selectAllWards" onclick="toggleSelectAllWards()"></th>
+                                        <th>病区代码</th>
+                                        <th>病区外部代码</th>
+                                        <th>病区名称</th>
+                                        <th>病区地址</th>
+                                        <th>关联科室</th>
+                                        <th>病区电话</th>
+                                        <th>病区主任医生</th>
+                                        <th>病区护士长</th>
+                                        <th>编制床位数</th>
+                                        <th>开放床位数</th>
+                                        <th>排序号</th>
+                                        <th>是否启用</th>
+                                        <th>备注</th>
+                                        <th>详情</th>
+                                    </tr>
+                                </thead>
+                                <tbody id="wardTableBody">
+                                    <!-- 数据将通过JS动态加载 -->
+                                </tbody>
+                            </table>
+                        </div>
+                        
+                        <!-- 病区详情模态框 -->
+                        <div id="wardModal" style="display:none; position: fixed; z-index: 1000; left: 0; top: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.4); overflow: auto; padding: 50px 0;">
+                            <div style="background-color: #fff; margin: 0 auto; padding: 0; border: 1px solid #888; width: 80%; max-width: 600px; border-radius: 5px; max-height: 80%; display: flex; flex-direction: column;">
+                                <div style="padding: 20px; border-bottom: 1px solid #eee;">
+                                    <h2 style="margin-top: 0;">病区详情</h2>
+                                </div>
+                                <div style="overflow-y: auto; flex: 1; padding: 10px;">
+                                    <div class="form-group" style="margin-bottom: 8px;">
+                                        <label style="margin-bottom: 2px;">病区代码:</label>
+                                        <input type="text" id="modalCode" readonly style="width: 100%; padding: 5px; border: 1px solid #ddd; border-radius: 4px;">
+                                    </div>
+                                    <div class="form-group" style="margin-bottom: 8px;">
+                                        <label style="margin-bottom: 2px;">病区外部代码:</label>
+                                        <input type="text" id="modalOutCode" readonly style="width: 100%; padding: 5px; border: 1px solid #ddd; border-radius: 4px;">
+                                    </div>
+                                    <div class="form-group" style="margin-bottom: 8px;">
+                                        <label style="margin-bottom: 2px;">病区名称:</label>
+                                        <input type="text" id="modalName" readonly style="width: 100%; padding: 5px; border: 1px solid #ddd; border-radius: 4px;">
+                                    </div>
+                                    <div class="form-group" style="margin-bottom: 8px;">
+                                        <label style="margin-bottom: 2px;">病区地址:</label>
+                                        <input type="text" id="modalAddress" readonly style="width: 100%; padding: 5px; border: 1px solid #ddd; border-radius: 4px;">
+                                    </div>
+                                    <div class="form-group" style="margin-bottom: 8px;">
+                                        <label style="margin-bottom: 2px;">关联科室:</label>
+                                        <input type="text" id="modalGlkeshi" readonly style="width: 100%; padding: 5px; border: 1px solid #ddd; border-radius: 4px;">
+                                    </div>
+                                    <div class="form-group" style="margin-bottom: 8px;">
+                                        <label style="margin-bottom: 2px;">病区电话:</label>
+                                        <input type="text" id="modalTelephone" readonly style="width: 100%; padding: 5px; border: 1px solid #ddd; border-radius: 4px;">
+                                    </div>
+                                    <div class="form-group" style="margin-bottom: 8px;">
+                                        <label style="margin-bottom: 2px;">病区主任医生:</label>
+                                        <input type="text" id="modalDirector" readonly style="width: 100%; padding: 5px; border: 1px solid #ddd; border-radius: 4px;">
+                                    </div>
+                                    <div class="form-group" style="margin-bottom: 8px;">
+                                        <label style="margin-bottom: 2px;">病区护士长:</label>
+                                        <input type="text" id="modalHeadNurse" readonly style="width: 100%; padding: 5px; border: 1px solid #ddd; border-radius: 4px;">
+                                    </div>
+                                    <div class="form-group" style="margin-bottom: 8px;">
+                                        <label style="margin-bottom: 2px;">编制床位数:</label>
+                                        <input type="text" id="modalBedCount" readonly style="width: 100%; padding: 5px; border: 1px solid #ddd; border-radius: 4px;">
+                                    </div>
+                                    <div class="form-group" style="margin-bottom: 8px;">
+                                        <label style="margin-bottom: 2px;">开放床位数:</label>
+                                        <input type="text" id="modalBedOpenCount" readonly style="width: 100%; padding: 5px; border: 1px solid #ddd; border-radius: 4px;">
+                                    </div>
+                                    <div class="form-group" style="margin-bottom: 8px;">
+                                        <label style="margin-bottom: 2px;">排序号:</label>
+                                        <input type="text" id="modalSort" readonly style="width: 100%; padding: 5px; border: 1px solid #ddd; border-radius: 4px;">
+                                    </div>
+                                    <div class="form-group" style="margin-bottom: 8px;">
+                                        <label style="margin-bottom: 2px;">是否启用:</label>
+                                        <input type="text" id="modalEnabled" readonly style="width: 100%; padding: 5px; border: 1px solid #ddd; border-radius: 4px;">
+                                    </div>
+                                    <div class="form-group" style="margin-bottom: 8px;">
+                                        <label style="margin-bottom: 2px;">备注:</label>
+                                        <textarea id="modalRemark" readonly style="width: 100%; padding: 5px; border: 1px solid #ddd; border-radius: 4px; height: 40px;"></textarea>
+                                    </div>
+                                </div>
+                                <div style="padding: 20px; border-top: 1px solid #eee; text-align: right;">
+                                    <button class="btn btn-secondary" onclick="closeWardModal()">关闭</button>
+                                </div>
+                            </div>
+                        </div>
+                        
+                        <!-- 病区代码设置模态框 -->
+                        <div id="wardCodeSettingModal" style="display:none; position: fixed; z-index: 1000; left: 0; top: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.4); overflow: auto; padding: 50px 0;">
+                            <div style="background-color: #fff; margin: 0 auto; padding: 0; border: 1px solid #888; width: 80%; max-width: 500px; border-radius: 5px; max-height: 80%; display: flex; flex-direction: column;">
+                                <div style="padding: 20px; border-bottom: 1px solid #eee;">
+                                    <h2 style="margin-top: 0;">病区代码设置</h2>
+                                </div>
+                                <div style="overflow-y: auto; flex: 1; padding: 15px;">
+                                    <div class="form-group">
+                                        <label>起始代码 (01-99):</label>
+                                        <input type="number" id="startCode" min="1" max="99" style="width: 100%; padding: 6px; border: 1px solid #ddd; border-radius: 4px;">
+                                        <p style="font-size: 12px; color: #666; margin-top: 3px;">输入数字,系统会自动补零(如输入1会变成01)</p>
+                                    </div>
+                                    <div class="form-group">
+                                        <label>选中的病区列表:</label>
+                                        <div id="selectedWardsList" style="border: 1px solid #ddd; border-radius: 4px; padding: 8px; max-height: 150px; overflow-y: auto;">
+                                            <p>请先选择病区</p>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div style="padding: 20px; border-top: 1px solid #eee; text-align: right;">
+                                    <button class="btn btn-success" onclick="saveWardCodes()">保存</button>
+                                    <button class="btn btn-secondary" onclick="closeWardCodeSetting()">取消</button>
+                                </div>
+                            </div>
+                        </div>
+                    `;
+                    loadWardData();
+                    break;
+                    
+                case 'roomManagement':
+                    pageTitle.textContent = '病房管理';
+                    breadcrumb.textContent = '首页 > 院区信息管理 > 病房管理';
+                    mainContent.innerHTML = `
+                        <div style="background: white; padding: 20px; box-shadow: 0 2px 10px rgba(0,0,0,0.1);">
+                            <table class="data-table">
+                                <thead>
+                                    <tr>
+                                        <th>病房编号</th>
+                                        <th>病房名称</th>
+                                        <th>所属病区</th>
+                                        <th>床位数量</th>
+                                        <th>状态</th>
+                                        <th>操作</th>
+                                    </tr>
+                                </thead>
+                                <tbody>
+                                    <tr>
+                                        <td>R001</td>
+                                        <td>101病房</td>
+                                        <td>内科一病区</td>
+                                        <td>4</td>
+                                        <td>可用</td>
+                                        <td>
+                                            <button class="btn btn-primary">编辑</button>
+                                            <button class="btn btn-danger">删除</button>
+                                        </td>
+                                    </tr>
+                                </tbody>
+                            </table>
+                        </div>
+                    `;
+                    break;
+                    
+                case 'bedManagement':
+                    pageTitle.textContent = '床位管理';
+                    breadcrumb.textContent = '首页 > 院区信息管理 > 床位管理';
+                    mainContent.innerHTML = `
+                        <div style="background: white; padding: 20px; box-shadow: 0 2px 10px rgba(0,0,0,0.1);">
+                            <div style="margin-bottom: 20px;">
+                                <button class="btn btn-success" onclick="showAddBedForm()">新增床位</button>
+                            </div>
+                            <table class="data-table">
+                                <thead>
+                                    <tr>
+                                        <th>床位编号</th>
+                                        <th>所属病房</th>
+                                        <th>床位状态</th>
+                                        <th>患者信息</th>
+                                        <th>操作</th>
+                                    </tr>
+                                </thead>
+                                <tbody>
+                                    <tr>
+                                        <td>B001</td>
+                                        <td>101病房</td>
+                                        <td>空闲</td>
+                                        <td>无</td>
+                                        <td>
+                                            <button class="btn btn-primary">编辑</button>
+                                            <button class="btn btn-danger">删除</button>
+                                        </td>
+                                    </tr>
+                                </tbody>
+                            </table>
+                        </div>
+                    `;
+                    break;
+                    
+                case 'patientManagement':
+                    pageTitle.textContent = '患者管理';
+                    breadcrumb.textContent = '首页 > 医护管理 > 患者管理';
+                    mainContent.innerHTML = `
+                        <div style="background: white; padding: 20px; box-shadow: 0 2px 10px rgba(0,0,0,0.1);">
+                            <div style="margin-bottom: 20px;">
+                                <button class="btn btn-success" onclick="showAddPatientForm()">新增患者</button>
+                            </div>
+                            <table class="data-table">
+                                <thead>
+                                    <tr>
+                                        <th>患者编号</th>
+                                        <th>姓名</th>
+                                        <th>性别</th>
+                                        <th>年龄</th>
+                                        <th>主治医生</th>
+                                        <th>所在病房</th>
+                                        <th>操作</th>
+                                    </tr>
+                                </thead>
+                                <tbody>
+                                    <tr>
+                                        <td>P001</td>
+                                        <td>张三</td>
+                                        <td>男</td>
+                                        <td>45</td>
+                                        <td>李医生</td>
+                                        <td>101病房</td>
+                                        <td>
+                                            <button class="btn btn-primary">详情</button>
+                                            <button class="btn btn-warning">编辑</button>
+                                            <button class="btn btn-danger"> discharge</button>
+                                        </td>
+                                    </tr>
+                                </tbody>
+                            </table>
+                        </div>
+                    `;
+                    break;
+                    
+                case 'equipmentInfo':
+                    pageTitle.textContent = '设备信息';
+                    breadcrumb.textContent = '首页 > 设备管理 > 设备信息';
+                    mainContent.innerHTML = `
+                        <div style="background: white; padding: 20px; box-shadow: 0 2px 10px rgba(0,0,0,0.1);">
+                            <div style="margin-bottom: 20px; display: flex; justify-content: space-between;">
+                                <div>
+                                    <button class="btn btn-success" onclick="showAddEquipmentForm()">新增设备</button>
+                                    <button class="btn btn-primary" onclick="loadContent('equipmentQuery')">查询</button>
+                                    <button class="btn btn-warning" onclick="loadContent('equipmentEdit')">编辑</button>
+                                    <button class="btn btn-danger" onclick="loadContent('equipmentDelete')">删除</button>
+                                </div>
+                                <div>
+                                    <input type="text" placeholder="搜索设备..." style="padding: 8px; border: 1px solid #ddd; border-radius: 4px;">
+                                </div>
+                            </div>
+                            <table class="data-table">
+                                <thead>
+                                    <tr>
+                                        <th>设备编号</th>
+                                        <th>设备名称</th>
+                                        <th>设备类型</th>
+                                        <th>所在科室</th>
+                                        <th>状态</th>
+                                        <th>购买日期</th>
+                                        <th>操作</th>
+                                    </tr>
+                                </thead>
+                                <tbody>
+                                    <tr>
+                                        <td>E001</td>
+                                        <td>心电监护仪</td>
+                                        <td>监护设备</td>
+                                        <td>内科</td>
+                                        <td>正常</td>
+                                        <td>2023-01-15</td>
+                                        <td>
+                                            <button class="btn btn-primary">详情</button>
+                                            <button class="btn btn-warning">编辑</button>
+                                            <button class="btn btn-danger">删除</button>
+                                        </td>
+                                    </tr>
+                                </tbody>
+                            </table>
+                        </div>
+                    `;
+                    break;
+                    
+                case 'equipmentQuery':
+                    pageTitle.textContent = '设备查询';
+                    breadcrumb.textContent = '首页 > 设备管理 > 设备信息 > 查询';
+                    mainContent.innerHTML = `
+                        <div style="background: white; padding: 20px; box-shadow: 0 2px 10px rgba(0,0,0,0.1);">
+                            <h2 style="margin-bottom: 20px;">设备查询</h2>
+                            <div class="form-group">
+                                <label>设备名称:</label>
+                                <input type="text" placeholder="请输入设备名称">
+                            </div>
+                            <div class="form-group">
+                                <label>设备类型:</label>
+                                <select>
+                                    <option>请选择设备类型</option>
+                                    <option>监护设备</option>
+                                    <option>治疗设备</option>
+                                    <option>检验设备</option>
+                                </select>
+                            </div>
+                            <div class="form-actions">
+                                <button class="btn btn-primary">查询</button>
+                                <button class="btn btn-secondary">重置</button>
+                            </div>
+                        </div>
+                    `;
+                    break;
+                    
+                case 'equipmentAdd':
+                    pageTitle.textContent = '新增设备';
+                    breadcrumb.textContent = '首页 > 设备管理 > 设备信息 > 新增';
+                    mainContent.innerHTML = `
+                        <div style="background: white; padding: 20px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); max-width: 600px;">
+                            <h2 style="margin-bottom: 20px;">新增设备</h2>
+                            <div class="form-group">
+                                <label>设备编号:</label>
+                                <input type="text" placeholder="请输入设备编号">
+                            </div>
+                            <div class="form-group">
+                                <label>设备名称:</label>
+                                <input type="text" placeholder="请输入设备名称">
+                            </div>
+                            <div class="form-group">
+                                <label>设备类型:</label>
+                                <select>
+                                    <option>请选择设备类型</option>
+                                    <option>监护设备</option>
+                                    <option>治疗设备</option>
+                                    <option>检验设备</option>
+                                </select>
+                            </div>
+                            <div class="form-group">
+                                <label>所在科室:</label>
+                                <select>
+                                    <option>请选择科室</option>
+                                    <option>内科</option>
+                                    <option>外科</option>
+                                </select>
+                            </div>
+                            <div class="form-group">
+                                <label>状态:</label>
+                                <select>
+                                    <option>正常</option>
+                                    <option>维修中</option>
+                                    <option>报废</option>
+                                </select>
+                            </div>
+                            <div class="form-actions">
+                                <button class="btn btn-success">保存</button>
+                                <button class="btn btn-secondary" onclick="loadContent('equipmentInfo')">取消</button>
+                            </div>
+                        </div>
+                    `;
+                    break;
+                    
+                case 'equipmentEdit':
+                    pageTitle.textContent = '编辑设备';
+                    breadcrumb.textContent = '首页 > 设备管理 > 设备信息 > 编辑';
+                    mainContent.innerHTML = `
+                        <div style="background: white; padding: 20px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); max-width: 600px;">
+                            <h2 style="margin-bottom: 20px;">编辑设备信息</h2>
+                            <div class="form-group">
+                                <label>设备编号:</label>
+                                <input type="text" value="E001" readonly>
+                            </div>
+                            <div class="form-group">
+                                <label>设备名称:</label>
+                                <input type="text" value="心电监护仪">
+                            </div>
+                            <div class="form-group">
+                                <label>设备类型:</label>
+                                <select>
+                                    <option>监护设备</option>
+                                    <option>治疗设备</option>
+                                    <option>检验设备</option>
+                                </select>
+                            </div>
+                            <div class="form-group">
+                                <label>所在科室:</label>
+                                <select>
+                                    <option>内科</option>
+                                    <option>外科</option>
+                                </select>
+                            </div>
+                            <div class="form-group">
+                                <label>状态:</label>
+                                <select>
+                                    <option>正常</option>
+                                    <option>维修中</option>
+                                    <option>报废</option>
+                                </select>
+                            </div>
+                            <div class="form-actions">
+                                <button class="btn btn-success">保存</button>
+                                <button class="btn btn-secondary" onclick="loadContent('equipmentInfo')">取消</button>
+                            </div>
+                        </div>
+                    `;
+                    break;
+                    
+                case 'equipmentDelete':
+                    pageTitle.textContent = '删除设备';
+                    breadcrumb.textContent = '首页 > 设备管理 > 设备信息 > 删除';
+                    mainContent.innerHTML = `
+                        <div style="background: white; padding: 20px; box-shadow: 0 2px 10px rgba(0,0,0,0.1);">
+                            <h2 style="margin-bottom: 20px;">删除设备</h2>
+                            <p>请选择要删除的设备:</p>
+                            <table class="data-table">
+                                <thead>
+                                    <tr>
+                                        <th><input type="checkbox"></th>
+                                        <th>设备编号</th>
+                                        <th>设备名称</th>
+                                        <th>设备类型</th>
+                                        <th>所在科室</th>
+                                        <th>状态</th>
+                                    </tr>
+                                </thead>
+                                <tbody>
+                                    <tr>
+                                        <td><input type="checkbox"></td>
+                                        <td>E001</td>
+                                        <td>心电监护仪</td>
+                                        <td>监护设备</td>
+                                        <td>内科</td>
+                                        <td>正常</td>
+                                    </tr>
+                                    <tr>
+                                        <td><input type="checkbox"></td>
+                                        <td>E002</td>
+                                        <td>输液泵</td>
+                                        <td>治疗设备</td>
+                                        <td>外科</td>
+                                        <td>正常</td>
+                                    </tr>
+                                </tbody>
+                            </table>
+                            <div style="margin-top: 20px;">
+                                <button class="btn btn-danger">删除选中设备</button>
+                                <button class="btn btn-secondary" onclick="loadContent('equipmentInfo')">返回</button>
+                            </div>
+                        </div>
+                    `;
+                    break;
+                    
+                default:
+                    pageTitle.textContent = '系统概览';
+                    breadcrumb.textContent = '首页';
+                    mainContent.innerHTML = `
+                        <div class="dashboard">
+                            <div class="card" onclick="loadContent('hospitalOverview')">
+                                <div class="card-icon">🏥</div>
+                                <h3>院区信息</h3>
+                                <p>查看和管理院区相关信息</p>
+                            </div>
+                            
+                            <div class="card" onclick="loadContent('medicalStaff')">
+                                <div class="card-icon">👨‍⚕️</div>
+                                <h3>医护人员</h3>
+                                <p>管理医生和护士信息</p>
+                            </div>
+                            
+                            <div class="card" onclick="loadContent('patientManagement')">
+                                <div class="card-icon">👤</div>
+                                <h3>患者信息</h3>
+                                <p>查看和更新患者资料</p>
+                            </div>
+                            
+                            <div class="card" onclick="loadContent('equipmentInfo')">
+                                <div class="card-icon">⚙️</div>
+                                <h3>设备管理</h3>
+                                <p>查看和管理设备信息</p>
+                            </div>
+                        </div>
+                    `;
+            }
+        }
+        
+        // 更新激活菜单状态
+        function updateActiveMenu(contentType) {
+            // 移除之前激活的菜单项
+            if (activeMenu) {
+                activeMenu.classList.remove('active');
+            }
+            
+            // 根据内容类型激活相应的菜单项
+            let menuItem;
+            switch(contentType) {
+                case 'hospitalOverview':
+                case 'departmentManagement':
+                case 'wardManagement':
+                case 'roomManagement':
+                case 'bedManagement':
+                    menuItem = document.querySelector('#hospitalSubmenu a[href="#"][onclick*="' + contentType + '"]');
+                    // 展开院区信息管理子菜单
+                    document.getElementById('hospitalSubmenu').classList.add('open');
+                    break;
+                case 'patientManagement':
+                    menuItem = document.querySelector('#medicalSubmenu a[href="#"][onclick*="' + contentType + '"]');
+                    // 展开医护管理子菜单
+                    document.getElementById('medicalSubmenu').classList.add('open');
+                    break;
+                case 'equipmentInfo':
+                case 'equipmentQuery':
+                case 'equipmentAdd':
+                case 'equipmentEdit':
+                case 'equipmentDelete':
+                    menuItem = document.querySelector('#equipmentSubmenu a[href="#"][onclick*="' + contentType + '"]');
+                    // 展开设备管理子菜单
+                    document.getElementById('equipmentSubmenu').classList.add('open');
+                    // 特别处理设备信息下的子菜单
+                    if (contentType !== 'equipmentInfo') {
+                        document.querySelector('#equipmentSubmenu > li > ul').style.display = 'block';
+                    }
+                    break;
+                default:
+                    // 默认情况不激活任何菜单项
+                    return;
+            }
+            
+            if (menuItem) {
+                menuItem.classList.add('active');
+                activeMenu = menuItem;
+            }
+        }
+        
+        // 显示添加表单的函数(示例)
+        function showAddDepartmentForm() {
+            alert('显示新增科室表单');
+        }
+        
+        function showAddWardForm() {
+            alert('显示新增病区表单');
+        }
+        
+        function showAddRoomForm() {
+            alert('显示新增病房表单');
+        }
+        
+        function showAddBedForm() {
+            alert('显示新增床位表单');
+        }
+        
+        function showAddPatientForm() {
+            alert('显示新增患者表单');
+        }
+        
+        function showAddEquipmentForm() {
+            alert('显示新增设备表单');
+        }
+        
+        document.addEventListener('DOMContentLoaded', function() {
+            // 检查登录状态
+            fetch('/shixian/api/status')
+                .then(response => response.json())
+                .then(data => {
+                    if (!data.loggedIn) {
+                        // 未登录,跳转到登录页
+                        window.location.href = '/shixian/';
+                    } else {
+                        // 显示欢迎信息
+                        document.getElementById('welcomeMessage').textContent = 
+                            `欢迎,${data.username} (${data.userType === 'admin' ? '管理员' : '用户'})`;
+                    }
+                })
+                .catch(error => {
+                    console.error('Error:', error);
+                });
+            
+            // 页面加载完成后初始化病区管理数据
+            if (document.getElementById('wardTableBody')) {
+                loadWardData();
+            }
+            
+            // 退出登录
+            document.getElementById('logoutBtn').addEventListener('click', function() {
+                fetch('/shixian/api/logout', {
+                    method: 'POST'
+                })
+                .then(response => response.json())
+                .then(data => {
+                    if (data.success) {
+                        window.location.href = '/shixian/';
+                    }
+                })
+                .catch(error => {
+                    console.error('Error:', error);
+                });
+            });
+            
+            // 监听病区管理页面的全选复选框变化
+            const selectAllWards = document.getElementById('selectAllWards');
+            if (selectAllWards) {
+                selectAllWards.addEventListener('change', function() {
+                    const checkboxes = document.querySelectorAll('.ward-checkbox');
+                    checkboxes.forEach(checkbox => {
+                        checkbox.checked = this.checked;
+                    });
+                });
+            }
+        });
+        
+        // Logo上传处理函数
+        function handleLogoUpload(event) {
+            const file = event.target.files[0];
+            if (!file) return;
+            
+            // 检查文件类型
+            const allowedTypes = ['image/jpeg', 'image/png'];
+            if (!allowedTypes.includes(file.type)) {
+                alert('请上传JPG或PNG格式的图片');
+                event.target.value = ''; // 清空文件选择
+                return;
+            }
+            
+            // 检查文件大小 (10MB = 10 * 1024 * 1024 bytes)
+            const maxSize = 10 * 1024 * 1024;
+            if (file.size > maxSize) {
+                alert('图片大小不能超过10M');
+                event.target.value = ''; // 清空文件选择
+                return;
+            }
+            
+            // 创建FormData对象
+            const formData = new FormData();
+            formData.append('file', file);
+            
+            // 上传文件到服务器
+            fetch('/shixian/api/upload-logo', {
+                method: 'POST',
+                body: formData
+            })
+            .then(response => response.json())
+            .then(data => {
+                if (data.success) {
+                    // 预览图片
+                    const reader = new FileReader();
+                    reader.onload = function(e) {
+                        const logoImage = document.getElementById('logoImage');
+                        const logoPlaceholder = document.getElementById('logoPlaceholder');
+                        
+                        logoImage.src = e.target.result;
+                        logoImage.style.display = 'block';
+                        logoPlaceholder.style.display = 'none';
+                    };
+                    reader.readAsDataURL(file);
+                    
+                    alert('Logo上传成功');
+                } else {
+                    alert('Logo上传失败: ' + data.message);
+                    event.target.value = ''; // 清空文件选择
+                }
+            })
+            .catch(error => {
+                console.error('上传Logo失败:', error);
+                alert('Logo上传失败,请稍后重试');
+                event.target.value = ''; // 清空文件选择
+            });
+        }
+        
+        // 加载医院概况数据
+        function loadHospitalOverviewData() {
+            fetch('/shixian/api/hospital-overview')
+                .then(response => response.json())
+                .then(data => {
+                    if (data.success && data.data) {
+                        // 填充表单数据
+                        document.getElementById('hospitalName').value = data.data.id || '';
+                        document.getElementById('hospitalAddress').value = data.data.dizhi || '';
+                        document.getElementById('hospitalPhone').value = data.data.dianhua || '';
+                        document.getElementById('hospitalDescription').value = data.data.jieshao || '';
+                    }
+                })
+                .catch(error => {
+                    console.error('加载医院概况数据失败:', error);
+                });
+        }
+        
+        // 保存医院概况数据
+        function saveHospitalOverview() {
+            const hospitalData = {
+                id: document.getElementById('hospitalName').value,
+                dizhi: document.getElementById('hospitalAddress').value,
+                dianhua: document.getElementById('hospitalPhone').value,
+                jieshao: document.getElementById('hospitalDescription').value
+            };
+            
+            fetch('/shixian/api/hospital-overview', {
+                method: 'POST',
+                headers: {
+                    'Content-Type': 'application/json'
+                },
+                body: JSON.stringify(hospitalData)
+            })
+            .then(response => response.json())
+            .then(data => {
+                if (data.success) {
+                    alert('保存成功');
+                } else {
+                    alert('保存失败: ' + data.message);
+                }
+            })
+            .catch(error => {
+                console.error('保存医院概况数据失败:', error);
+                alert('保存失败,请稍后重试');
+            });
+        }
+        
+        // 加载科室数据
+        function loadDepartmentData() {
+            fetch('/shixian/api/departments')
+            .then(response => response.json())
+            .then(data => {
+                const tbody = document.getElementById('departmentTableBody');
+                tbody.innerHTML = '';
+                
+                data.forEach(dept => {
+                    const row = document.createElement('tr');
+                    row.innerHTML = `
+                        <td>${dept.code}</td>
+                        <td>${dept.outCode}</td>
+                        <td>${dept.name}</td>
+                        <td>${dept.address || ''}</td>
+                        <td>${dept.telephone || ''}</td>
+                        <td>${dept.introduction || ''}</td>
+                        <td>${dept.enabled ? '是' : '否'}</td>
+                        <td>${dept.remark || ''}</td>
+                        <td>
+                            <button class="btn btn-primary" onclick="viewDepartment('${dept.code}')">详情</button>
+                        </td>
+                    `;
+                    tbody.appendChild(row);
+                });
+            })
+            .catch(error => {
+                console.error('加载科室数据失败:', error);
+            });
+        }
+        
+        // 显示新增科室表单
+        function showAddDepartmentForm() {
+            alert('显示新增科室表单');
+        }
+        
+        // 查询科室
+        function searchDepartments() {
+            const name = document.getElementById('departmentName').value;
+            const enabled = document.getElementById('enabled').value;
+            
+            // 构建查询参数
+            let url = '/shixian/api/departments';
+            const params = [];
+            
+            if (name) {
+                params.push(`name=${encodeURIComponent(name)}`);
+            }
+            
+            if (enabled !== '') {
+                params.push(`enabled=${enabled}`);
+            }
+            
+            if (params.length > 0) {
+                url += '?' + params.join('&');
+            }
+            
+            fetch(url)
+            .then(response => response.json())
+            .then(data => {
+                const tbody = document.getElementById('departmentTableBody');
+                tbody.innerHTML = '';
+                
+                data.forEach(dept => {
+                    const row = document.createElement('tr');
+                    row.innerHTML = `
+                        <td>${dept.code}</td>
+                        <td>${dept.outCode}</td>
+                        <td>${dept.name}</td>
+                        <td>${dept.address || ''}</td>
+                        <td>${dept.telephone || ''}</td>
+                        <td>${dept.introduction || ''}</td>
+                        <td>${dept.enabled ? '是' : '否'}</td>
+                        <td>${dept.remark || ''}</td>
+                        <td>
+                            <button class="btn btn-primary" onclick="viewDepartment('${dept.code}')">详情</button>
+                        </td>
+                    `;
+                    tbody.appendChild(row);
+                });
+            })
+            .catch(error => {
+                console.error('查询科室数据失败:', error);
+                alert('查询失败,请稍后重试');
+            });
+        }
+        
+        // 清空查询条件
+        function clearSearch() {
+            document.getElementById('departmentName').value = '';
+            document.getElementById('enabled').value = '';
+            // 重新加载所有数据
+            loadDepartmentData();
+        }
+        
+        // 查看科室详情
+        function viewDepartment(code) {
+            // 获取科室数据
+            fetch(`/shixian/api/departments/${code}`)
+            .then(response => response.json())
+            .then(data => {
+                if (data.success) {
+                    const dept = data.data;
+                    
+                    // 填充弹窗内容
+                    document.getElementById('modalCode').value = dept.code || '';
+                    document.getElementById('modalOutCode').value = dept.outCode || '';
+                    document.getElementById('modalName').value = dept.name || '';
+                    document.getElementById('modalAddress').value = dept.address || '';
+                    document.getElementById('modalTelephone').value = dept.telephone || '';
+                    document.getElementById('modalIntroduction').value = dept.introduction || '';
+                    document.getElementById('modalEnabled').value = dept.enabled ? '是' : '否';
+                    document.getElementById('modalRemark').value = dept.remark || '';
+                    
+                    // 显示弹窗
+                    document.getElementById('departmentModal').style.display = 'block';
+                } else {
+                    alert('获取科室信息失败: ' + data.message);
+                }
+            })
+            .catch(error => {
+                console.error('获取科室信息失败:', error);
+                alert('获取科室信息失败,请稍后重试');
+            });
+        }
+
+        // 关闭弹窗
+        function closeDepartmentModal() {
+            document.getElementById('departmentModal').style.display = 'none';
+        }
+
+        // 点击弹窗外部关闭
+        window.onclick = function(event) {
+            const departmentModal = document.getElementById('departmentModal');
+            const wardModal = document.getElementById('wardModal');
+            
+            if (event.target === departmentModal) {
+                departmentModal.style.display = 'none';
+            } else if (event.target === wardModal) {
+                wardModal.style.display = 'none';
+            }
+        };
+        
+        // 编辑科室
+        function editDepartment(code) {
+            alert('编辑科室: ' + code);
+        }
+        
+        // 删除科室
+        function deleteDepartment(code) {
+            if (confirm('确定要删除该科室吗?')) {
+                fetch(`/shixian/api/departments/${code}`, {
+                    method: 'DELETE'
+                })
+                .then(response => response.json())
+                .then(data => {
+                    if (data.success) {
+                        alert('删除成功');
+                        // 重新加载数据
+                        loadDepartmentData();
+                    } else {
+                        alert('删除失败: ' + data.message);
+                    }
+                })
+                .catch(error => {
+                    console.error('删除科室失败:', error);
+                    alert('删除失败,请稍后重试');
+                });
+            }
+        }
+        
+        // 加载病区数据
+        function loadWardData() {
+            const name = document.getElementById('wardName').value;
+            const glkeshi = document.getElementById('wardGlkeshi').value;
+            const enabled = document.getElementById('wardEnabled').value;
+            
+            // 构造查询参数
+            let url = '/shixian/api/wards';
+            const params = [];
+            if (name) params.push(`name=${encodeURIComponent(name)}`);
+            if (glkeshi) params.push(`glkeshi=${encodeURIComponent(glkeshi)}`);
+            if (enabled !== '') params.push(`enabled=${enabled}`);
+            if (params.length > 0) url += '?' + params.join('&');
+            
+            fetch(url)
+                .then(response => response.json())
+                .then(data => {
+                    const tbody = document.getElementById('wardTableBody');
+                    tbody.innerHTML = '';
+                    
+                    data.forEach(ward => {
+                        const row = document.createElement('tr');
+                        row.innerHTML = `
+                            <td><input type="checkbox" class="ward-checkbox" data-code="${ward.code}"></td>
+                            <td>${ward.code}</td>
+                            <td>${ward.outCode || ''}</td>
+                            <td>${ward.name}</td>
+                            <td>${ward.address || ''}</td>
+                            <td>${ward.glkeshi || ''}</td>
+                            <td>${ward.telephone || ''}</td>
+                            <td>${ward.director || ''}</td>
+                            <td>${ward.headNurse || ''}</td>
+                            <td>${ward.bedCount || 0}</td>
+                            <td>${ward.bedOpenCount || 0}</td>
+                            <td>${ward.sort || 0}</td>
+                            <td>${ward.enabled ? '是' : '否'}</td>
+                            <td>${ward.remark || ''}</td>
+                            <td>
+                                <button class="btn btn-primary" onclick="viewWardDetail('${ward.code}')">详情</button>
+                            </td>
+                        `;
+                        tbody.appendChild(row);
+                    });
+                    
+                    // 添加事件监听器到复选框
+                    document.querySelectorAll('.ward-checkbox').forEach(checkbox => {
+                        checkbox.addEventListener('change', function() {
+                            // 可以在这里添加处理逻辑,例如记录选中的项目等
+                        });
+                    });
+                    
+                    // 重置全选复选框
+                    document.getElementById('selectAllWards').checked = false;
+                })
+                .catch(error => {
+                    console.error('Error loading ward data:', error);
+                    alert('加载病区数据失败');
+                });
+        }
+        
+        // 全选/取消全选功能
+        function toggleSelectAllWards() {
+            const selectAllCheckbox = document.getElementById('selectAllWards');
+            const checkboxes = document.querySelectorAll('.ward-checkbox');
+            
+            checkboxes.forEach(checkbox => {
+                checkbox.checked = selectAllCheckbox.checked;
+            });
+        }
+        
+        // 显示病区代码设置界面
+        function showWardCodeSetting() {
+            const checkboxes = document.querySelectorAll('.ward-checkbox:checked');
+            if (checkboxes.length === 0) {
+                alert('请先选择至少一个病区');
+                return;
+            }
+            
+            // 显示选中的病区列表
+            const selectedWardsList = document.getElementById('selectedWardsList');
+            selectedWardsList.innerHTML = '';
+            
+            checkboxes.forEach((checkbox, index) => {
+                const code = checkbox.getAttribute('data-code');
+                const name = checkbox.closest('tr').querySelector('td:nth-child(4)').textContent;
+                
+                const wardItem = document.createElement('div');
+                wardItem.innerHTML = `
+                    <div style="display: flex; justify-content: space-between; padding: 5px 0; border-bottom: 1px solid #eee;">
+                        <span>${name} (${code})</span>
+                    </div>
+                `;
+                selectedWardsList.appendChild(wardItem);
+            });
+            
+            // 显示模态框
+            document.getElementById('wardCodeSettingModal').style.display = 'block';
+        }
+        
+        // 关闭病区代码设置界面
+        function closeWardCodeSetting() {
+            document.getElementById('wardCodeSettingModal').style.display = 'none';
+            document.getElementById('startCode').value = '';
+        }
+        
+        // 保存病区代码设置
+        function saveWardCodes() {
+            const startCode = document.getElementById('startCode').value;
+            
+            if (!startCode) {
+                alert('请输入起始代码');
+                return;
+            }
+            
+            const numStartCode = parseInt(startCode);
+            if (numStartCode < 1 || numStartCode > 99) {
+                alert('病区代码必须在1-99之间');
+                return;
+            }
+            
+            const checkboxes = document.querySelectorAll('.ward-checkbox:checked');
+            if (checkboxes.length === 0) {
+                alert('没有选中的病区');
+                return;
+            }
+            
+            // 检查是否有代码冲突
+            const formattedCode = numStartCode.toString().padStart(2, '0');
+            
+            // 这里应该调用后端API检查代码是否重复,暂时用前端模拟
+            // 在实际应用中,应该发送请求到后端验证
+            
+            // 生成代码序列
+            let currentCode = numStartCode;
+            const updatePromises = [];
+            
+            // 先获取所有选中病区的完整数据
+            const fetchDataPromises = [];
+            checkboxes.forEach(checkbox => {
+                const wardCode = checkbox.getAttribute('data-code');
+                const promise = fetch(`/shixian/api/wards/${wardCode}`)
+                    .then(response => {
+                        if (!response.ok) {
+                            throw new Error(`HTTP error! status: ${response.status}`);
+                        }
+                        return response.json();
+                    })
+                    .then(data => {
+                        if (!data.success) {
+                            throw new Error(data.message || '获取病区信息失败');
+                        }
+                        return { originalCode: wardCode, data: data.data };
+                    })
+                    .catch(error => {
+                        console.error('获取病区信息失败:', error);
+                        throw error;
+                    });
+                fetchDataPromises.push(promise);
+            });
+            
+            // 获取完所有数据后再执行更新操作
+            Promise.all(fetchDataPromises)
+                .then(wardsData => {
+                    wardsData.forEach(wardObj => {
+                        const formattedCurrentCode = currentCode.toString().padStart(2, '0');
+                        const wardCode = wardObj.originalCode;
+                        const ward = wardObj.data;
+                        
+                        // 更新病区代码
+                        ward.code = formattedCurrentCode;
+                        
+                        // 发送更新请求,包含完整的病区数据
+                        const promise = fetch(`/shixian/api/wards/${wardCode}`, {
+                            method: 'PUT',
+                            headers: {
+                                'Content-Type': 'application/json'
+                            },
+                            body: JSON.stringify(ward)
+                        }).then(response => {
+                            if (!response.ok) {
+                                throw new Error(`HTTP error! status: ${response.status}`);
+                            }
+                            return response.json();
+                        })
+                        .then(data => {
+                            if (!data.success) {
+                                throw new Error(data.message || '更新病区信息失败');
+                            }
+                            return data;
+                        })
+                        .catch(error => {
+                            console.error('更新病区代码失败:', error);
+                            throw error;
+                        });
+                        
+                        updatePromises.push(promise);
+                        currentCode++;
+                        
+                        // 如果超出范围则停止
+                        if (currentCode > 99) {
+                            return;
+                        }
+                    });
+                    
+                    // 处理所有更新请求
+                    return Promise.all(updatePromises);
+                })
+                .then(results => {
+                    // 检查是否有任何更新失败
+                    const failedUpdates = results.filter(result => !result.success);
+                    
+                    if (failedUpdates.length === 0) {
+                        alert('病区代码更新成功');
+                        closeWardCodeSetting();
+                        loadWardData(); // 重新加载数据
+                    } else {
+                        alert(`部分病区代码更新失败: ${failedUpdates.length} 个`);
+                    }
+                })
+                .catch(error => {
+                    console.error('更新病区代码时出错:', error);
+                    alert('更新病区代码时发生错误: ' + error.message);
+                });
+        }
+        
+        // 查询病区
+        function searchWards() {
+            loadWardData();
+        }
+        
+        // 查看病区详情
+        function viewWardDetail(code) {
+            // 获取病区数据
+            fetch(`/shixian/api/wards/${code}`)
+            .then(response => response.json())
+            .then(data => {
+                if (data.success) {
+                    const ward = data.data;
+                    
+                    // 填充弹窗内容
+                    document.getElementById('modalCode').value = ward.code || '';
+                    document.getElementById('modalOutCode').value = ward.outCode || '';
+                    document.getElementById('modalName').value = ward.name || '';
+                    document.getElementById('modalAddress').value = ward.address || '';
+                    document.getElementById('modalGlkeshi').value = ward.glkeshi || '';
+                    document.getElementById('modalTelephone').value = ward.telephone || '';
+                    document.getElementById('modalDirector').value = ward.director || '';
+                    document.getElementById('modalHeadNurse').value = ward.headNurse || '';
+                    document.getElementById('modalBedCount').value = ward.bedCount !== null && ward.bedCount !== undefined ? ward.bedCount : '';
+                    document.getElementById('modalBedOpenCount').value = ward.bedOpenCount !== null && ward.bedOpenCount !== undefined ? ward.bedOpenCount : '';
+                    document.getElementById('modalSort').value = ward.sort !== null && ward.sort !== undefined ? ward.sort : '';
+                    document.getElementById('modalEnabled').value = ward.enabled !== null && ward.enabled !== undefined ? (ward.enabled ? '是' : '否') : '';
+                    document.getElementById('modalRemark').value = ward.remark || '';
+                    
+                    // 确保强制刷新所有字段
+                    const inputs = document.querySelectorAll('#wardModal input, #wardModal textarea');
+                    inputs.forEach(input => {
+                        input.dispatchEvent(new Event('input', { bubbles: true }));
+                        input.dispatchEvent(new Event('change', { bubbles: true }));
+                    });
+                    
+                    // 显示弹窗
+                    document.getElementById('wardModal').style.display = 'block';
+                } else {
+                    alert('获取病区信息失败: ' + data.message);
+                }
+            })
+            .catch(error => {
+                console.error('获取病区信息失败:', error);
+                alert('获取病区信息失败,请稍后重试');
+            });
+        }
+
+        // 关闭病区详情弹窗
+        function closeWardModal() {
+            document.getElementById('wardModal').style.display = 'none';
+        }
+
+        // 点击弹窗关闭按钮或按ESC键关闭弹窗
+        document.addEventListener('keydown', function(event) {
+            if (event.key === 'Escape') {
+                const wardModal = document.getElementById('wardModal');
+                const wardCodeSettingModal = document.getElementById('wardCodeSettingModal');
+                const departmentModal = document.getElementById('departmentModal');
+                
+                if (wardModal && wardModal.style.display === 'block') {
+                    wardModal.style.display = 'none';
+                } else if (wardCodeSettingModal && wardCodeSettingModal.style.display === 'block') {
+                    wardCodeSettingModal.style.display = 'none';
+                } else if (departmentModal && departmentModal.style.display === 'block') {
+                    departmentModal.style.display = 'none';
+                }
+            }
+        });
+
+        // 重置查询条件
+        function clearWardSearch() {
+            document.getElementById('wardName').value = '';
+            document.getElementById('wardGlkeshi').value = '';
+            document.getElementById('wardEnabled').value = '';
+            loadWardData();
+        }
+    </script>
+</body>
+</html>

BIN
src/main/resources/static/img/251a9130-a895-44e6-8670-3acd0ce7dc73.png


BIN
src/main/resources/static/img/42fe99da-c51b-4312-a272-6111dfc4528c.jpg


BIN
src/main/resources/static/img/657cef70-297a-4d9b-9ed2-307635684c18.jpg


BIN
src/main/resources/static/img/f5898247-d947-48f0-828c-b7661c1a5044.jpg


+ 59 - 0
src/main/resources/static/index.html

@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>智慧病房管理平台</title>
+    <link rel="stylesheet" href="css/style.css">
+</head>
+<body>
+    <div class="container">
+        <div class="login-wrapper">
+            <div class="login-header">
+                <h1>智慧病房管理平台</h1>
+            </div>
+            
+            <div class="login-tabs">
+                <button class="tab-button active" data-tab="user">用户登录</button>
+                <button class="tab-button" data-tab="admin">管理登录</button>
+            </div>
+            
+            <div class="login-form active" id="user-login">
+                <form id="userLoginForm">
+                    <div class="form-group">
+                        <label for="userUsername">用户名</label>
+                        <input type="text" id="userUsername" name="username" required>
+                    </div>
+                    <div class="form-group">
+                        <label for="userPassword">密码</label>
+                        <input type="password" id="userPassword" name="password" required>
+                    </div>
+                    <div class="form-group">
+                        <button type="submit">用户登录</button>
+                    </div>
+                </form>
+            </div>
+            
+            <div class="login-form" id="admin-login" style="display: none;">
+                <form id="adminLoginForm">
+                    <div class="form-group">
+                        <label for="adminUsername">用户名</label>
+                        <input type="text" id="adminUsername" name="username" required>
+                    </div>
+                    <div class="form-group">
+                        <label for="adminPassword">密码</label>
+                        <input type="password" id="adminPassword" name="password" required>
+                    </div>
+                    <div class="form-group">
+                        <button type="submit">管理登录</button>
+                    </div>
+                </form>
+            </div>
+            
+            <div class="message" id="message"></div>
+        </div>
+    </div>
+    
+    <script src="js/script.js"></script>
+</body>
+</html>

+ 134 - 0
src/main/resources/static/js/script.js

@@ -0,0 +1,134 @@
+document.addEventListener('DOMContentLoaded', function() {
+    // 获取元素
+    const tabButtons = document.querySelectorAll('.tab-button');
+    const loginForms = document.querySelectorAll('.login-form');
+    const userLoginForm = document.getElementById('userLoginForm');
+    const adminLoginForm = document.getElementById('adminLoginForm');
+    const messageDiv = document.getElementById('message');
+    
+    // 切换标签页
+    tabButtons.forEach(button => {
+        button.addEventListener('click', function() {
+            // 移除所有活动状态
+            tabButtons.forEach(btn => btn.classList.remove('active'));
+            loginForms.forEach(form => {
+                form.classList.remove('active');
+                form.style.display = 'none';
+            });
+            
+            // 添加活动状态到当前点击的标签
+            this.classList.add('active');
+            const tabId = this.getAttribute('data-tab');
+            document.getElementById(tabId + '-login').style.display = 'block';
+            document.getElementById(tabId + '-login').classList.add('active');
+        });
+    });
+    
+    // 用户登录表单提交
+    userLoginForm.addEventListener('submit', function(e) {
+        e.preventDefault();
+        const username = document.getElementById('userUsername').value;
+        const password = document.getElementById('userPassword').value;
+        
+        // 显示加载状态
+        const submitButton = this.querySelector('button[type="submit"]');
+        const originalText = submitButton.textContent;
+        submitButton.textContent = '登录中...';
+        submitButton.disabled = true;
+        document.body.classList.add('loading');
+        
+        // 发送登录请求
+        fetch('/shixian/api/user/login', {
+            method: 'POST',
+            headers: {
+                'Content-Type': 'application/json'
+            },
+            body: JSON.stringify({
+                username: username,
+                password: password
+            })
+        })
+        .then(response => response.json())
+        .then(data => {
+            if (data.success) {
+                showMessage('用户登录成功!', 'success');
+                // 延迟跳转到主页
+                setTimeout(() => {
+                    window.location.href = '/shixian/home.html';
+                }, 1000);
+            } else {
+                showMessage(data.message, 'error');
+            }
+        })
+        .catch(error => {
+            console.error('Error:', error);
+            showMessage('登录请求失败,请稍后重试', 'error');
+        })
+        .finally(() => {
+            // 恢复按钮状态
+            submitButton.textContent = originalText;
+            submitButton.disabled = false;
+            document.body.classList.remove('loading');
+        });
+    });
+    
+    // 管理员登录表单提交
+    adminLoginForm.addEventListener('submit', function(e) {
+        e.preventDefault();
+        const username = document.getElementById('adminUsername').value;
+        const password = document.getElementById('adminPassword').value;
+        
+        // 显示加载状态
+        const submitButton = this.querySelector('button[type="submit"]');
+        const originalText = submitButton.textContent;
+        submitButton.textContent = '登录中...';
+        submitButton.disabled = true;
+        document.body.classList.add('loading');
+        
+        // 发送登录请求
+        fetch('/shixian/api/admin/login', {
+            method: 'POST',
+            headers: {
+                'Content-Type': 'application/json'
+            },
+            body: JSON.stringify({
+                username: username,
+                password: password
+            })
+        })
+        .then(response => response.json())
+        .then(data => {
+            if (data.success) {
+                showMessage('管理员登录成功!', 'success');
+                // 延迟跳转到主页
+                setTimeout(() => {
+                    window.location.href = '/shixian/home.html';
+                }, 1000);
+            } else {
+                showMessage(data.message, 'error');
+            }
+        })
+        .catch(error => {
+            console.error('Error:', error);
+            showMessage('登录请求失败,请稍后重试', 'error');
+        })
+        .finally(() => {
+            // 恢复按钮状态
+            submitButton.textContent = originalText;
+            submitButton.disabled = false;
+            document.body.classList.remove('loading');
+        });
+    });
+    
+    // 显示消息函数
+    function showMessage(text, type) {
+        messageDiv.textContent = text;
+        messageDiv.className = 'message ' + type;
+        messageDiv.style.display = 'block';
+        
+        // 3秒后隐藏消息
+        setTimeout(() => {
+            messageDiv.style.display = 'none';
+        }, 3000);
+    }
+});