基于鸿蒙(ArkTS)、Java、MySQL的全栈开发,其核心在于利用ArkTS构建鸿蒙原生应用前端,使用Java开发后端服务,并通过MySQL进行数据持久化。

一、技术栈与职责划分

技术层 技术选型 核心职责与说明
前端 (鸿蒙应用) ArkTS (基于TypeScript) 构建鸿蒙原生应用的UI界面与交互逻辑,利用声明式UI开发范式。
后端 (服务端) Java (Spring Boot) 提供RESTful API,处理业务逻辑,连接数据库,是应用的核心服务层。
数据库 MySQL 8.0+ 负责数据的结构化存储、查询与管理,是应用的数据持久化层。
辅助工具 DevEco Studio, IntelliJ IDEA, Git 分别为鸿蒙前端、Java后端开发IDE及版本控制工具。

二、核心开发流程与代码示例

1. 数据库设计 (MySQL)

首先,在MySQL中创建数据库和表。例如,为一个简单的“任务”应用设计表结构:

-- 创建数据库
CREATE DATABASE IF NOT EXISTS harmony_app DEFAULT CHARACTER SET utf8mb4;
USE harmony_app;

-- 创建任务表
CREATE TABLE task (
    id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(255) NOT NULL COMMENT '任务标题',
    description TEXT COMMENT '任务描述',
    completed BOOLEAN DEFAULT FALSE COMMENT '是否完成',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE=InnoDB COMMENT='任务表';

-- 为查询字段创建索引以优化性能
CREATE INDEX idx_task_completed ON task(completed);

此设计包含了基础字段、注释及索引优化。

2. 后端开发 (Java Spring Boot)

使用Spring Boot快速搭建RESTful API服务。

  • 项目依赖 (pom.xml 关键部分):

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
    
  • 实体类 (Entity):

    import jakarta.persistence.*;
    import java.time.LocalDateTime;
    
    @Entity @Table(name = "task")
    public class Task {
        @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
        private String title;
        private String description;
        private Boolean completed = false;
        private LocalDateTime createdAt;
        private LocalDateTime updatedAt;
    

// 省略 Getter、Setter 以及 @PrePersist, @PreUpdate 注解方法(用于自动设置时间)
}
```

  • 数据访问层 (Repository):

    import org.springframework.data.jpa.repository.JpaRepository;
    import java.util.List;
    
    public interface TaskRepository extends JpaRepository<Task, Integer> {
        List<Task> findByCompleted(Boolean completed);
    }
    
  • 业务控制层 (Controller):

    import org.springframework.web.bind.annotation.*;
    import java.util.List;
    
    @RestController
    @RequestMapping("/api/tasks")
    public class TaskController {
        @Autowired
        private TaskRepository taskRepository;
    
        @GetMapping public List<Task> getAllTasks(@RequestParam(required = false) Boolean completed) {
            if (completed != null) {
                return taskRepository.findByCompleted(completed);
            }
            return taskRepository.findAll();
        }
    
        @PostMapping public Task createTask(@RequestBody Task task) {
            // 在实际项目中,应对传入的task对象进行校验
            return taskRepository.save(task);
        }
        // 其他接口:GET /{id}, PUT /{id}, DELETE /{id} 等 }
    

    此部分构建了基础的CRUD API,并通过JPA简化了数据库操作。

  • 应用配置 (application.properties):

    spring.datasource.url=jdbc:mysql://localhost:3306/harmony_app?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC spring.datasource.username=your_username
    spring.datasource.password=your_password
    spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true ```
    
    

3. 前端开发 (鸿蒙 ArkTS)

在DevEco Studio中,使用ArkTS开发界面并调用后端API。

  • 页面UI与数据模型 (TaskList.ets):
    // 导入必要的模块 import http from '@ohos.net.http';
    import promptAction from '@ohos.promptAction';
    
    @Entry @Component struct TaskList {
      // 定义任务数据数组
      @State taskList: Array<Task> = []
      // 定义后端API基础地址(注意:真机调试需配置网络权限并使用实际IP)
      private baseUrl: string = 'http://your_backend_ip:8080/api/tasks'
    
      // 构建UI build() {
        Column({ space: 10 }) {
          // 1. 标题
          Text('任务列表')
            .fontSize(30)
            .fontWeight(FontWeight.Bold)
    
          // 2. 列表展示
          List({ space: 5 }) {
            ForEach(this.taskList, (item: Task) => {
              ListItem() {
                Row({ space: 10 }) {
                  // 任务完成状态复选框 Checkbox({ name: 'completed', group: 'taskGroup' })
                    .select(item.completed)
                    .onChange((value: boolean) => {
                      this.updateTaskStatus(item.id, value)
                    })
                  // 任务标题和描述 Column({ space: 5 }) {
                    Text(item.title).fontSize(18)
                    Text(item.description).fontSize(14).fontColor(Color.Gray)
                  }
                }
                .padding(10)
                .width('100%')
                .justifyContent(FlexAlign.Start)
              }
            })
          }
          .layoutWeight(1) // 列表占满剩余空间
          .width('100%')
    
          // 3. “添加任务”按钮
          Button('添加新任务')
            .onClick(() => {
              // 跳转到添加任务页面或弹出对话框
              promptAction.showToast({ message: '功能待实现' })
            })
            .width('90%')
        }
        .padding(20)
        .width('100%')
        .height('100%')
        .onAppear(() => {
          // 页面显示时加载数据
          this.loadTasks()
        })
      }
    
      // 加载任务列表的方法 async loadTasks() {
        let httpRequest = http.createHttp()
        try {
          let response = await httpRequest.request(this.baseUrl, {
            method: http.RequestMethod.GET,
            header: { 'Content-Type': 'application/json' }
          })
          if (response.responseCode === 200) {
            this.taskList = JSON.parse(response.result as string)
          } else {
            promptAction.showToast({ message: `加载失败: ${response.responseCode}` })
          }
        } catch (err) {
          promptAction.showToast({ message: `网络请求异常: ${err.message}` })
        } finally {
          httpRequest.destroy()
        }
      }
    
      // 更新任务状态的方法 async updateTaskStatus(taskId: number, completed: boolean) {
        let httpRequest = http.createHttp()
        try {
          let response = await httpRequest.request(`${this.baseUrl}/${taskId}`, {
            method: http.RequestMethod.PUT,
            header: { 'Content-Type': 'application/json' },
            extraData: JSON.stringify({ completed: completed })
          })
          if (response.responseCode === 200) {
            promptAction.showToast({ message: '更新成功' })
            this.loadTasks() // 刷新列表 }
        } catch (err) {
          promptAction.showToast({ message: `更新失败: ${err.message}` })
        } finally {
          httpRequest.destroy()
        }
      }
    }
    
    // 任务数据模型
    class Task {
      id: number = 0
      title: string = ''
      description: string = ''
      completed: boolean = false }
    
    此代码展示了鸿蒙ArkTS声明式UI的构建、状态管理(@State)以及通过@ohos.net.http模块进行网络请求的关键流程。

三、关键配置与联调要点

  1. 网络权限与安全:鸿蒙应用需要在module.json5配置文件中声明网络权限(ohos.permission.INTERNET)。后端Spring Boot应用如需跨域访问,需配置CORS。
  2. 真机联调网络:当鸿蒙应用在真机上运行时,baseUrl中的localhost 127.0.0.1需替换为运行后端服务的电脑在局域网中的实际IP地址。
  3. 数据交互格式:前后端统一使用JSON作为数据交换格式,确保Content-Type: application/json
  4. 进阶特性:在实际项目中,后端应考虑添加JWT认证、API文档(如Swagger)、更完善的错误处理与日志;前端需处理更复杂的UI状态、路由导航及本地数据缓存。

参考来源

 

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐