一人公司智能管理系统概述

发布于:2025-09-06 ⋅ 阅读:(23) ⋅ 点赞:(0)

系统概述

项目结构

Al_Compny系统采用前后端分离的全栈架构,项目根目录下包含两个主要子目录:Al_Compny_backend(后端服务)和Al_Compny_frontend(前端应用)。

在这里插入图片描述

核心功能模块

Al_Compny系统是一个面向"一人公司"场景的企业智能管理平台,集成了用户管理、角色权限控制、菜单系统和智能HR助手等核心功能模块。系统旨在为个人创业者提供全方位的管理支持,包括简历优化、战略分析、人事文章生成和财务决策辅助。

用户管理模块

用户管理模块是系统的基础,负责用户账户的创建、认证和信息维护。该模块定义了系统用户的数据模型和相关API接口。

角色与权限模块

角色与权限模块实现了基于角色的访问控制(RBAC)机制,通过角色定义权限,并将角色分配给用户。系统还包含菜单模块,用于定义系统功能菜单和权限关联。

智能HR助手模块

智能HR助手模块是系统的核心智能功能,提供简历助手、战略分析助手和人事部助手等多种AI服务,支持文件上传和对话式交互

系统架构与技术栈

Al_Compny系统采用现代化的全栈前后端分离架构,后端基于Python的Django框架,前端基于Vue 3框架,通过RESTful API进行通信。

技术栈组成

后端技术栈:

  • 框架: Django + Django REST framework
  • 数据库: MySQL
  • 认证: JWT (JSON Web Token)
  • 部署: WSGI

前端技术栈:

  • 框架: Vue 3 + Vite

  • 状态管理: Pinia

  • UI组件库: Element Plus

  • 路由: Vue Router

  • HTTP客户端: Axios

    前后端协同工作机制

    在这里插入图片描述

    系统采用标准的前后端分离模式,前端负责用户界面展示和交互,后端提供数据API服务。用户通过浏览器访问前端应用,前端通过Axios库向后端Django服务发起HTTP请求,后端处理请求并返回JSON格式的数据。

    用户与权限管理

    用户认证流程

    系统采用JWT(JSON Web Token)进行用户认证,实现了标准的注册和登录流程。

在这里插入图片描述

角色权限体系

系统通过角色管理实现权限控制,不同角色拥有不同的系统访问权限。前端路由配置中明确标识了各页面的权限要求。

智能HR助手功能

功能概述

智能HR助手模块为"一人公司"场景提供全方位的智能支持,主要包括:

  • 简历助手: 帮助优化个人简历,提升求职竞争力
  • 战略分析助手: 提供商业战略分析和决策支持
  • 人事部助手: 生成人事相关文档和文章
  • 财务决策支持: 提供财务规划和决策建议

数据模型设计

智能HR助手基于对话会话模型,支持多轮对话和文件上传功能。

业务逻辑流程

当用户发送消息时,系统创建用户消息记录,并调用AI服务生成回复。

在这里插入图片描述

API接口设计

RESTful API路由

系统采用RESTful风格的API设计,通过Django的URL路由机制进行端点管理。

主要API端点

模块 端点 HTTP方法 功能
用户 /user/register/ POST 用户注册
用户 /user/login/ POST 用户登录
HR助手 /hrchat/ GET, POST 对话会话管理
HR助手 /hrchat/{id}/messages/ GET 获取消息列表
HR助手 /hrchat/{id}/messages/send/ POST 发送新消息

前后端交互流程

JWT认证流程

系统采用JWT进行无状态认证,确保API调用的安全性。

在这里插入图片描述

Pinia状态管理

前端使用Pinia进行全局状态管理,集中管理用户认证状态。

在这里插入图片描述

数据库设计

数据库配置

系统使用MySQL作为主要数据库,配置信息位于Django设置文件中。

在这里插入图片描述

数据表结构

系统主要数据表包括:

  • sys_user: 系统用户表
  • chat_session: 对话会话表
  • chat_message: 对话消息表

系统上下文图

在这里插入图片描述

数据表结构

系统主要数据表包括:

  • sys_user: 系统用户表
  • chat_session: 对话会话表
  • chat_message: 对话消息表

前端架构

项目结构

Al_Compny项目包含前后端两个主要部分。前端位于Al_Compny_frontend目录,采用Vue 3 + TypeScript + Pinia + Vue Router的现代前端技术栈。后端为Django项目,提供RESTful API服务。

前端核心结构如下:

  • src/main.ts:应用入口文件
  • src/App.vue:根组件
  • src/router/index.ts:路由配置
  • src/stores/:Pinia状态管理模块
  • src/utils/request.ts:Axios封装
  • src/views/:页面级组件
  • src/components/:可复用UI组件
  • src/types/:TypeScript类型定义

在这里插入图片描述

核心组件

本项目采用MVVM架构模式,通过组件化设计实现高内聚低耦合。核心组件包括:

  • 视图层(View).vue文件,负责UI渲染与用户交互
  • 模型层(Model):Pinia Store,管理应用状态
  • 视图模型(ViewModel):Vue组件的<script setup>部分,连接视图与模型

数据流遵循单向数据流原则:用户操作触发事件 → 组件调用Store方法 → Store调用API → 更新状态 → 视图响应式更新。

应用入口与初始化

main.ts是Vue应用的启动入口,负责创建Vue实例并挂载核心插件。

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import ElementPlus from 'element-plus'
import App from './App.vue'
import router from './router'

const app = createApp(App)
const pinia = createPinia()

app.use(pinia)
app.use(router)
app.use(ElementPlus)
app.mount('#app')

初始化流程:

  1. 创建Vue应用实例
  2. 创建Pinia状态管理实例
  3. 依次注册Pinia、Vue Router、ElementPlus插件
  4. 挂载到DOM元素#app

此设计实现了关注点分离,确保应用在启动时完成所有依赖注入。

根组件与布局

App.vue作为根组件,采用<script setup>语法糖,结构简洁。

<template>
  <router-view />
</template>

该组件仅包含一个<router-view>占位符,用于动态渲染当前路由匹配的视图组件。这种设计实现了路由驱动的布局机制——不同的URL路径会加载不同的页面组件(如Login.vue、Dashboard.vue等),而根组件保持不变。

路由系统

Vue Router在index.ts中定义了完整的路由表,采用嵌套路由实现模块化管理。

路由配置分析

routes: [
  {
    path: '/home',
    name: 'home',
    meta: {requiresAuth: true},
    component: () => import('@/views/Home.vue'),
    redirect: '/home/dashboard',
    children: [ /* 子路由 */ ]
  },
  {
    path: '/login',
    name: 'login',
    meta: {requiresAuth: false},
    component: () => import('@/views/Login.vue'),
  }
]

关键特性:

  • 路由元信息meta.requiresAuth标记是否需要认证
  • 懒加载:使用import()动态导入组件,实现代码分割
  • 嵌套路由/home下包含多个子页面(仪表盘、用户管理等)

路由守卫

router.beforeEach(async (to, from, next) => {
  const userStore = useUserStore()
  const savedToken = localStorage.getItem('token')
  
  if (to.meta.requiresAuth && !savedToken) {
    next({ path: '/login', query: { redirect: to.fullPath } })
  } else {
    next()
  }
})

全局前置守卫实现:

  1. 检查目标路由是否需要认证
  2. 若未登录且访问受保护路由,则重定向至登录页
  3. 登录后可自动跳转回原始目标页面

在这里插入图片描述

状态管理

Pinia在user.ts中实现了用户状态的集中管理,遵循单一状态树原则。

状态定义

const user = ref<User | null>(null)
const token = ref<string | null>(localStorage.getItem('token'))
const isLoggedIn = computed(() => !!token.value)
  • user:存储用户信息对象
  • token:JWT令牌,初始化时从localStorage读取
  • isLoggedIn:计算属性,反映登录状态

核心方法

登录方法
const login = async (loginForm: LoginForm) => {
  const response = await request.post('/user/login/', loginForm)
  if (apiResponse.code === 200) {
    token.value = jwtToken
    user.value = userInfo
    localStorage.setItem('token', jwtToken)
    return { success: true }
  }
}
登出方法
const logout = () => {
  localStorage.removeItem('token')
  user.value = null
  token.value = null
  router.push('/login')
}
自动恢复状态
// 刷新页面时从 localStorage 恢复 token
const savedToken = localStorage.getItem('token')
if (savedToken && !userStore.token) {
  userStore.token = savedToken
}

状态管理实现了:

  • 持久化:token存储在localStorage
  • 响应式:使用refcomputed实现自动更新
  • 集中控制:所有用户相关操作通过Store统一处理

在这里插入图片描述

API请求封装

request.ts对Axios进行了封装,提供统一的HTTP请求接口。

封装策略

const httpService = axios.create({
  baseURL: "http://127.0.0.1:8000/",
  timeout: 3000
})

  • 基础配置:设置API基础URL和超时时间
  • 请求拦截器:自动添加认证头
  • 响应拦截器:统一处理响应和错误

请求拦截器

httpService.interceptors.request.use(config => {
  config.headers.AUTHORIZATION = localStorage.getItem('token') || ''
  return config
})

确保每次请求都携带JWT令牌。

响应处理

export function get<T>(url, params) {
  return new Promise((resolve, reject) => {
    httpService({ url, method: 'get', params })
      .then(response => resolve(response))
      .catch(error => reject(error))
  })
}

提供getpostdelfileUpload等便捷方法,支持泛型类型推断。

本节来源

  • [request.ts](file:///E:/Al_Compny/Al_Compny_frontend/src/utils/request.ts#L1-L153)

组件通信与数据流

系统通过"事件驱动 + 状态管理"模式实现组件间通信。

数据流示例:登录流程

关键通信机制:

  1. 组件 → Store:通过useUserStore()获取Store实例并调用方法
  2. Store → API:Store内部调用request模块发起HTTP请求
  3. API → Store:更新响应数据到状态
  4. Store → 组件:组件通过computed或直接引用响应式数据自动更新视图

类型安全

通过types/user.ts定义接口,确保类型安全:

export interface User {
  id: number
  username: string
  email?: string
}

export interface ApiResponse<T> {
  code: number
  message: string
  data?: T
}

本节来源

  • [Login.vue](file:///E:/Al_Compny/Al_Compny_frontend/src/views/Login.vue#L1-L219)
  • [user.ts](file:///E:/Al_Compny/Al_Compny_frontend/src/stores/user.ts#L1-L185)
  • [request.ts](file:///E:/Al_Compny/Al_Compny_frontend/src/utils/request.ts#L1-L153)
  • [user.ts](file:///E:/Al_Compny/Al_Compny_frontend/src/types/user.ts#L1-L26)

登录流程分析

以登录功能为例,展示完整的工作流程:

  1. 用户交互:在Login.vue输入用户名密码
  2. 表单验证:Element Plus表单规则验证输入
  3. 调用StorehandleLogin()调用userStore.login()
  4. 发起请求:Store通过request.post()发送登录请求
  5. 身份验证:后端验证凭证,返回JWT token
  6. 状态更新:Store更新tokenuser状态
  7. 持久化:token保存到localStorage
  8. 路由跳转:导航到首页
  9. 守卫验证:路由守卫检查token有效性
  10. 页面渲染:加载Dashboard组件

此流程体现了MVVM模式的优势:视图只关注用户交互,业务逻辑和状态管理完全解耦。

本节来源

  • [Login.vue](file:///E:/Al_Compny/Al_Compny_frontend/src/views/Login.vue#L1-L219)
  • [user.ts](file:///E:/Al_Compny/Al_Compny_frontend/src/stores/user.ts#L39-L77)
  • [index.ts](file:///E:/Al_Compny/Al_Compny_frontend/src/router/index.ts#L50-L100)

结论

Al_Compny前端架构采用现代化的Vue 3技术栈,具有以下特点:

优势

  • 清晰的分层:MVVM模式实现关注点分离
  • 高效的通信:Pinia提供集中式状态管理
  • 安全的路由:路由守卫实现权限控制
  • 统一的API:Axios封装简化网络请求
  • 响应式更新:Vue 3的响应式系统确保UI同步

改进建议

  1. 错误处理:增强全局错误处理机制
  2. 类型完善:补充更多接口类型定义
  3. 性能优化:添加API响应缓存
  4. 安全性:考虑使用httpOnly cookie存储token
  5. 测试覆盖:增加单元测试和E2E测试

整体架构设计合理,具备良好的可维护性和扩展性,为企业的数字化管理平台提供了坚实的技术基础。

后端架构

项目结构

Al_Compny后端项目采用Django框架,遵循MVC设计模式,整体结构清晰,模块化程度高。项目主要由以下几个核心部分组成:

  • 主配置目录 (Al_Compny_backend/Al_Compny_backend):包含Django项目的核心配置文件(settings.py, urls.py, asgi.py, wsgi.py)。
  • 应用模块:包括user(用户管理)、role(角色管理)、menu(菜单权限)、hrchat(HR对话)等独立应用,每个应用都遵循Django的标准结构(models.py, views.py, urls.py等)。
  • 管理脚本manage.py是Django项目的命令行工具入口。

这种结构体现了高内聚、低耦合的设计原则,便于维护和扩展。

在这里插入图片描述

核心配置分析

Django项目的主配置文件settings.py是整个应用的“大脑”,它定义了项目运行所需的所有全局设置。

服务器接口配置

asgi.pywsgi.py是Django与Web服务器通信的接口。

  • ASGI (Asynchronous Server Gateway Interface)asgi.py文件配置了异步应用接口,允许Django处理WebSocket、HTTP/2等长连接或异步请求,为未来的实时功能(如聊天)提供支持。
  • WSGI (Web Server Gateway Interface)wsgi.py文件配置了传统的同步应用接口,用于处理标准的HTTP请求。大多数Web服务器(如Gunicorn, uWSGI)通过此接口与Django应用通信。
# asgi.py 和 wsgi.py 的核心代码
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Al_Compny_backend.settings')
application = get_asgi_application() # 或 get_wsgi_application()

数据库连接配置

项目配置了MySQL数据库,替代了默认的SQLite,以支持更复杂的数据操作和更高的并发性能。

# settings.py 中的 DATABASES 配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_al_compnyManage',
        'USER': 'root',
        'PASSWORD': '20021230',
        'HOST': 'localhost',
        'PORT': '3306'
    }
}

JWT认证设置

项目集成了djangorestframework-simplejwt库来实现基于Token的认证。

# settings.py 中的 JWT_AUTH 配置
JWT_AUTH = {
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1), # Token有效期为1天
}
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ]
}

CORS策略

为了支持前端(Al_Compny_frontend)的跨域访问,项目配置了django-cors-headers中间件。

# settings.py 中的 CORS 配置
CORS_ORIGIN_ALLOW_ALL = True # 允许所有来源
CORS_ALLOW_CREDENTIALS = True # 允许携带凭证(如Cookie)
CORS_ALLOW_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'] # 允许的HTTP方法

应用注册

INSTALLED_APPS列表注册了所有启用的应用,包括Django内置应用和自定义应用。

INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.contenttypes',
    # ... 其他内置应用
    'user', # 用户管理
    'role', # 角色管理
    'menu', # 菜单权限
    'hrchat', # HR对话
    'rest_framework', # Django REST framework
    'rest_framework_jwt', # JWT认证支持
    "corsheaders", # CORS支持
]

本节来源

  • [settings.py](file://al_compny_backend/Al_Compny_backend/settings.py#L1-L170)
  • [asgi.py](file://al_compny_backend/Al_Compny_backend/asgi.py#L1-L17)
  • [wsgi.py](file://al_compny_backend/Al_Compny_backend/wsgi.py#L1-L16)

路由分发体系

项目采用分层的URL路由分发机制,实现了清晰的API路径管理。

根路由 (Root URLs)

Al_Compny_backend/urls.py作为根路由,负责将不同前缀的请求分发到对应的应用。

# Al_Compny_backend/urls.py
urlpatterns = [
    path('user/', include('user.urls')),  # 所有 /user/ 开头的请求交给 user 应用处理
    path('role/', include('role.urls')),  # 所有 /role/ 开头的请求交给 role 应用处理
    path('menu/', include('menu.urls')),  # 所有 /menu/ 开头的请求交给 menu 应用处理
]

应用路由 (App URLs)

每个应用都有自己的urls.py文件,定义其内部的API端点。

user应用为例:

# user/urls.py
urlpatterns = [
    path('register/', RegisterView.as_view(), name='register'), # POST /user/register/
    path('login/', LoginView.as_view(), name='login')          # POST /user/login/
]

这种分发模式使得API路径清晰、易于维护,并且各应用的路由相互隔离。

在这里插入图片描述

数据模型设计

数据模型定义了数据库的表结构和对象关系。

SysUser 模型

user/models.py中的SysUser类定义了系统用户的核心信息。

class SysUser(models.Model):
    id = models.AutoField(primary_key=True)
    username = models.CharField(max_length=100, unique=True) # 用户名,唯一
    password = models.CharField(max_length=100) # 加密后的密码
    avatar = models.CharField(max_length=255, null=True) # 头像
    email = models.CharField(max_length=100, null=True) # 邮箱
    phonenumber = models.CharField(max_length=11, null=True) # 手机号
    status = models.IntegerField(null=True) # 状态 (0正常, 1停用)
    # ... 其他字段
    class Meta:
        db_table = "sys_user" # 对应数据库表名

ChatSession 与 ChatMessage 模型

hrchat/models.py中定义了聊天会话和消息的模型,体现了典型的“一对多”关系。

class ChatSession(models.Model):
    title = models.CharField(max_length=100, blank=True) # 会话标题
    created_at = models.DateTimeField(auto_now_add=True) # 创建时间

class ChatMessage(models.Model):
    ROLE_CHOICES = [("user", "User"), ("assistant", "Assistant")]
    session = models.ForeignKey(ChatSession, on_delete=models.CASCADE, related_name="messages")
    role = models.CharField(max_length=10, choices=ROLE_CHOICES) # 消息角色
    content = models.TextField() # 消息内容
    file = models.CharField(max_length=255, blank=True, null=True) # 附件
    created_at = models.DateTimeField(auto_now_add=True) # 创建时间

关系设计说明

  • ChatMessage通过ForeignKey字段session关联到ChatSession
  • on_delete=models.CASCADE表示当会话被删除时,其所有消息也会被级联删除。
  • related_name="messages"允许通过session.messages.all()反向查询该会话的所有消息。

在这里插入图片描述

API实现与JWT认证

API逻辑主要通过Django REST framework (DRF) 的类视图(APIView)实现。

用户注册 (RegisterView)

user/views.py中的RegisterView处理用户注册请求。

  1. 接收数据:从request.data获取username, password等。
  2. 验证数据:检查用户名和密码是否为空,以及用户名是否已存在。
  3. 创建用户:使用make_password()对明文密码进行哈希加密,然后创建SysUser实例并保存到数据库。

用户登录与JWT令牌生成 (LoginView)

LoginView是JWT认证流程的核心。

  1. 接收凭证:获取usernamepassword

  2. 验证凭证:查询数据库找到用户,并使用check_password()验证密码哈希。

  3. 生成令牌

    • 创建一个RefreshToken对象(refresh = RefreshToken.for_user(user))。
    • 从刷新令牌中提取访问令牌access_token = str(refresh.access_token))。
  4. 返回响应:将access_token和用户基本信息返回给前端。

在这里插入图片描述

序列化器作用

序列化器(Serializers)是DRF的核心组件,负责在Python对象(如Django模型实例)和JSON数据之间进行转换。

数据序列化 (Python -> JSON)

当API需要返回数据时(如获取聊天记录),序列化器将数据库查询结果(QuerySet)或模型实例转换为前端可读的JSON格式。

# hrchat/serializers.py
class ChatMessageSerializer(serializers.ModelSerializer):
    class Meta:
        model = ChatMessage
        fields = ["id", "role", "content", "file", "created_at"] # 指定需要序列化的字段

MessageList视图中,get_queryset()返回ChatMessage对象列表,DRF会自动使用ChatMessageSerializer将它们序列化为JSON数组。

数据反序列化 (JSON -> Python)

当API接收数据时(如创建新消息),序列化器验证传入的JSON数据,并将其转换为Python字典,以便创建或更新模型实例。

# 在 MessageCreate 视图中
def perform_create(self, serializer):
    session = get_object_or_404(ChatSession, pk=self.kwargs["pk"])
    # serializer.validated_data 包含已验证的JSON数据
    message = serializer.save(session=session, role="user") # 创建并保存 ChatMessage 实例

本节来源

  • [hrchat/serializers.py](file://al_compny_backend/hrchat/serializers.py#L1-L13)
  • [hrchat/views.py](file://al_compny_backend/hrchat/views.py#L1-L57)

权限控制机制

项目遵循RESTful设计原则,API设计清晰、状态无关。

RESTful设计体现

  • 资源导向:API端点代表资源(如/user/, /chat/)。
  • 统一接口:使用标准的HTTP方法(GET, POST, PUT, DELETE)对资源进行操作。
  • 无状态:服务器不保存客户端状态,每次请求都包含所有必要信息(通过JWT Token)。

权限控制应用

虽然在当前分析的userhrchat应用的视图中未显式设置permission_classes(如IsAuthenticated),但权限控制主要在前端路由API调用层面实现。

  • 前端路由守卫:前端代码src/router/index.ts中,路由元信息meta: {requiresAuth: true}标记了需要登录的页面(如人事助手、财务助手)。路由守卫会在跳转前检查是否存在有效的Token。
  • API调用:前端在调用需要认证的API时,会自动在请求头中添加Authorization: Bearer <access_token>。后端的JWTAuthentication类会自动验证此Token。

因此,权限控制是一个前后端协同的过程:前端负责阻止未登录用户访问特定页面,而后端通过JWT验证确保API调用的合法性。


网站公告

今日签到

点亮在社区的每一天
去签到