小明:最近公司要上线一个固定资产管理系统,我有点不太清楚怎么开始。你有什么建议吗?
小李:嗯,首先你要明确系统的核心功能。固定资产管理系统通常包括资产录入、分类、盘点、借用、归还、报废等功能。你可以先画个功能图,再考虑技术实现。
小明:那具体怎么设计数据库呢?我听说用MySQL比较常见。
小李:对,MySQL是个不错的选择。我们可以设计几个表,比如资产表(assets)、部门表(departments)、用户表(users)等。资产表里应该包含资产编号、名称、类型、购买日期、状态等字段。
小明:那你能给我一个具体的SQL语句示例吗?
小李:当然可以。以下是创建资产表的SQL代码:
CREATE TABLE assets (
id INT AUTO_INCREMENT PRIMARY KEY,
asset_number VARCHAR(50) NOT NULL UNIQUE,
name VARCHAR(100) NOT NULL,
type VARCHAR(50),
purchase_date DATE,
status ENUM('available', 'in_use', 'damaged', 'disposed') DEFAULT 'available',
department_id INT,
user_id INT,
FOREIGN KEY (department_id) REFERENCES departments(id),
FOREIGN KEY (user_id) REFERENCES users(id)
);
小明:明白了,那后端怎么处理这些数据呢?是用Java吗?
小李:是的,Java是一个很常用的选择,尤其是Spring Boot框架。我们可以用Spring Boot来搭建后端服务,提供RESTful API。
小明:那能给我一个简单的Controller示例吗?比如获取所有资产列表的接口。
小李:好的,下面是获取所有资产的Controller代码:

@RestController
@RequestMapping("/api/assets")
public class AssetController {
@Autowired
private AssetService assetService;
@GetMapping
public ResponseEntity> getAllAssets() {
List assets = assetService.getAllAssets();
return ResponseEntity.ok(assets);
}
}
小明:这个Service层怎么写呢?
小李:Service层负责业务逻辑,这里我们只需要调用Repository来获取数据。下面是AssetService的示例:
@Service
public class AssetService {
@Autowired
private AssetRepository assetRepository;
public List getAllAssets() {
return assetRepository.findAll();
}
}
小明:那Repository层呢?是不是用JPA?
小李:没错,JPA是Spring Boot中常用的ORM框架。下面是AssetRepository的代码:
public interface AssetRepository extends JpaRepository {
}
小明:听起来挺简单的。那如果我要开发一个App呢?用什么语言比较好?
小李:App的话,如果是移动端,可以用Flutter或者React Native,这样可以同时支持iOS和Android。不过如果你更熟悉Java,也可以用Android原生开发。
小明:那能给我一个简单的Flutter App示例吗?比如显示资产列表。
小李:当然可以。以下是一个简单的Flutter App代码,用来从后端API获取资产列表并显示出来:
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: '固定资产App',
home: AssetListScreen(),
);
}
}
class AssetListScreen extends StatefulWidget {
@override
_AssetListScreenState createState() => _AssetListScreenState();
}
class _AssetListScreenState extends State {
List assets = [];
@override
void initState() {
super.initState();
fetchAssets();
}
Future fetchAssets() async {
final response = await http.get(Uri.parse('http://localhost:8080/api/assets'));
if (response.statusCode == 200) {
setState(() {
assets = jsonDecode(response.body);
});
} else {
print('Failed to load assets');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('资产列表')),
body: ListView.builder(
itemCount: assets.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(assets[index]['name']),
subtitle: Text(assets[index]['type']),
);
},
),
);
}
}
小明:这个App看起来不错,但怎么测试呢?有没有什么工具推荐?
小李:你可以用Postman测试后端API,确保接口正常。对于App,可以使用Android Studio或Flutter DevTools进行调试。
小明:那如果我想增加搜索功能呢?比如根据资产名称搜索。
小李:这需要在后端添加一个搜索接口,比如GET /api/assets/search?name=xxx。然后在App中添加一个搜索框,发送请求并更新列表。
小明:那能给我一个搜索接口的示例吗?
小李:当然可以。以下是搜索资产的Controller代码:
@GetMapping("/search")
public ResponseEntity> searchAssets(@RequestParam String name) {
List assets = assetService.searchAssets(name);
return ResponseEntity.ok(assets);
}
小明:那Service层怎么实现搜索?
小李:可以在Service中使用JPA的查询方法,或者自定义查询。例如:
public List searchAssets(String name) {
return assetRepository.findByNameContaining(name);
}
小明:那Repository层应该怎么写?
小李:在Repository中添加一个方法,比如:
List findByNameContaining(String name);
小明:明白了。那如果我要部署这个系统呢?有什么需要注意的地方吗?
小李:部署时要注意环境配置,比如数据库连接、服务器端口、安全设置等。可以使用Docker容器化部署,提高可移植性和稳定性。
小明:那App怎么打包发布呢?
小李:对于Flutter App,可以使用flutter build apk生成APK文件,然后上传到Google Play或国内应用市场。如果是Android原生项目,可以用Android Studio导出APK。
小明:听起来整个流程都很清晰了。谢谢你!
小李:不客气!如果有其他问题,随时问我。
