Hệ thống quản lý sở hữu trí tuệ nội bộ doanh nghiệp với Spring Boot và Vue

Phân tích khả thi

Phân tích khả thi là bước thiết yếu trong quá trình phát triển hệ thống, giúp đánh giá tính thực tiễn và hiệu quả của dự án. Đối với hệ thống quản lý sở hữu trí tuệ nội bộ, việc thay thế quy trình thủ công bằng giải pháp số hóa mang lại nhiều lợi ích như giảm khối lượng công việc cho nhân viên, tăng hiệu suất xử lý và kiểm soát tài sản trí tuệ chính xác hơn.

  • Khả thi về kỹ thuật: Sử dụng Spring Boot (Java) kết hợp Vue.js đảm bảo tính ổn định, dễ mở rộng và có cộng đồng hỗ trợ mạnh mẽ.
  • Khả thi về kinh tế: Chi phí phát triển hợp lý so với lợi ích lâu dài từ việc tự động hóa và quản lý tập trung.
  • Khả thi về vận hành: Giao diện thân thiện, quy trình đơn giản giúp người dùng nội bộ tiếp cận nhanh chóng.

Kiểm thử hệ thống

Kiểm thử hệ thống được thực hiện để đảm bảo toàn bộ chức năng hoạt động đúng theo yêu cầu, bao gồm kiểm thử chức năng, hiệu năng và bảo mật.

Kiểm thử đăng nhập

Dữ liệu đầu vào Kết quả mong đợi Kết quả thực tế Đánh giá
Tên đăng nhập: admin, Mật khẩu: 123456, Mã xác thực đúng Đăng nhập thành công Đăng nhập thành công Đạt
Tên đăng nhập: admin, Mật khẩu: sai, Mã xác thực đúng Thông báo lỗi mật khẩu Hiển thị "Mật khẩu không chính xác" Đạt
Mã xác thực sai Thông báo lỗi mã xác thực Hiển thị "Mã xác thực không hợp lệ" Đạt
Không nhập tên đăng nhập Yêu cầu nhập tên đăng nhập Hiển thị "Vui lòng nhập tên đăng nhập" Đạt

Kiểm thử quản lý người dùng

Thao tác Kết quả mong đợi Kết quả thực tế Đánh giá
Thêm người dùng mới với thông tin đầy đủ Người dùng xuất hiện trong danh sách Xuất hiện đúng Đạt
Sửa thông tin người dùng Thông tin được cập nhật Cập nhật thành công Đạt
Xóa người dùng Hệ thống hỏi xác nhận, sau đó xóa khỏi danh sách Xác nhận và xóa thành công Đạt
Thêm người dùng với tên đã tồn tại Thông báo "Tên người dùng đã tồn tại" Hiển thị đúng thông báo Đạt

Thiết kế cơ sở dữ liệu

Bảng người dùng (t_user)

Tên trường Kiểu dữ liệu Khóa chính NULL? Mô tả
user_id BIGINT Không ID duy nhất
username VARCHAR(50) Không Không Tên đăng nhập
password VARCHAR(255) Không Không Mật khẩu (mã hóa)
email VARCHAR(100) Không Không Email liên hệ
phone VARCHAR(20) Không Số điện thoại
status TINYINT Không Không Trạng thái (0: vô hiệu, 1: kích hoạt)
create_time DATETIME Không Không Thời gian tạo
update_time DATETIME Không Không Thời gian cập nhật

Bảng vai trò (t_role)

Tên trường Kiểu dữ liệu Khóa chính NULL? Mô tả
role_id BIGINT Không ID vai trò
role_name VARCHAR(50) Không Không Tên vai trò (VD: Quản trị viên, Nhân viên)
description VARCHAR(255) Không Mô tả vai trò
create_time DATETIME Không Không Thời gian tạo
update_time DATETIME Không Không Thời gian cập nhật

Triển khai API quản lý người dùng

@RestController
@RequestMapping("/api/user")
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private TokenService tokenService;

    @PostMapping("/login")
    public ResponseEntity<Map<String, Object>> login(@RequestParam String username,
                                                       @RequestParam String password,
                                                       @RequestParam String captcha,
                                                       HttpServletRequest request) {
        // Kiểm tra CAPTCHA (giả sử đã được xác minh)
        User user = userService.findByUsername(username);
        if (user == null || !passwordEncoder.matches(password, user.getPassword())) {
            return ResponseEntity.badRequest().body(Map.of("error", "Tài khoản hoặc mật khẩu không đúng"));
        }
        if (user.getStatus() == 0) {
            return ResponseEntity.badRequest().body(Map.of("error", "Tài khoản đã bị vô hiệu hóa"));
        }

        String token = tokenService.generateToken(user.getId(), username, "user");
        Map<String, Object> response = new HashMap<>();
        response.put("token", token);
        response.put("userId", user.getUserId());
        response.put("username", user.getUsername());
        response.put("role", "user");

        return ResponseEntity.ok(response);
    }

    @PostMapping("/register")
    public ResponseEntity<String> register(@RequestBody User user) {
        if (userService.existsByUsernameOrEmail(user.getUsername(), user.getEmail())) {
            return ResponseEntity.badRequest().body("Tên đăng nhập hoặc email đã tồn tại");
        }
        user.setPassword(passwordEncoder.encode(user.getPassword()));
        user.setStatus(1);
        user.setCreateTime(new Date());
        user.setUpdateTime(new Date());
        userService.save(user);
        return ResponseEntity.ok("Đăng ký thành công");
    }

    @PutMapping("/update")
    public ResponseEntity<String> updateUser(@RequestBody User updatedUser, HttpServletRequest request) {
        Long userId = (Long) request.getAttribute("userId");
        User existingUser = userService.findById(userId);
        if (existingUser == null) {
            return ResponseEntity.notFound().build();
        }
        // Cập nhật thông tin (không cho phép đổi username/email nếu trùng)
        if (!existingUser.getUsername().equals(updatedUser.getUsername()) ||
            !existingUser.getEmail().equals(updatedUser.getEmail())) {
            if (userService.existsByUsernameOrEmail(updatedUser.getUsername(), updatedUser.getEmail())) {
                return ResponseEntity.badRequest().body("Thông tin đã tồn tại");
            }
        }
        updatedUser.setUserId(userId);
        updatedUser.setPassword(existingUser.getPassword()); // Giữ nguyên mật khẩu
        updatedUser.setUpdateTime(new Date());
        userService.update(updatedUser);
        return ResponseEntity.ok("Cập nhật thành công");
    }
}

Script khởi tạo cơ sở dữ liệu

CREATE TABLE `t_user` (
  `user_id` BIGINT NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(50) NOT NULL UNIQUE,
  `password` VARCHAR(255) NOT NULL,
  `email` VARCHAR(100) NOT NULL,
  `phone` VARCHAR(20),
  `status` TINYINT NOT NULL DEFAULT 1,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `t_role` (
  `role_id` BIGINT NOT NULL AUTO_INCREMENT,
  `role_name` VARCHAR(50) NOT NULL,
  `description` VARCHAR(255),
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `t_user_role` (
  `user_id` BIGINT NOT NULL,
  `role_id` BIGINT NOT NULL,
  PRIMARY KEY (`user_id`, `role_id`),
  FOREIGN KEY (`user_id`) REFERENCES `t_user`(`user_id`),
  FOREIGN KEY (`role_id`) REFERENCES `t_role`(`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Thẻ: Spring Boot Vue.js Quản lý sở hữu trí tuệ REST API mysql

Đăng vào ngày 15 tháng 7 lúc 11:21