系统概述
项目结构
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')
初始化流程:
- 创建Vue应用实例
- 创建Pinia状态管理实例
- 依次注册Pinia、Vue Router、ElementPlus插件
- 挂载到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()
}
})
全局前置守卫实现:
- 检查目标路由是否需要认证
- 若未登录且访问受保护路由,则重定向至登录页
- 登录后可自动跳转回原始目标页面
状态管理
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
- 响应式:使用
ref
和computed
实现自动更新 - 集中控制:所有用户相关操作通过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))
})
}
提供get
、post
、del
、fileUpload
等便捷方法,支持泛型类型推断。
本节来源
- [request.ts](file:///E:/Al_Compny/Al_Compny_frontend/src/utils/request.ts#L1-L153)
组件通信与数据流
系统通过"事件驱动 + 状态管理"模式实现组件间通信。
数据流示例:登录流程
关键通信机制:
- 组件 → Store:通过
useUserStore()
获取Store实例并调用方法 - Store → API:Store内部调用
request
模块发起HTTP请求 - API → Store:更新响应数据到状态
- 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)
登录流程分析
以登录功能为例,展示完整的工作流程:
- 用户交互:在
Login.vue
输入用户名密码 - 表单验证:Element Plus表单规则验证输入
- 调用Store:
handleLogin()
调用userStore.login()
- 发起请求:Store通过
request.post()
发送登录请求 - 身份验证:后端验证凭证,返回JWT token
- 状态更新:Store更新
token
和user
状态 - 持久化:token保存到
localStorage
- 路由跳转:导航到首页
- 守卫验证:路由守卫检查token有效性
- 页面渲染:加载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同步
改进建议:
- 错误处理:增强全局错误处理机制
- 类型完善:补充更多接口类型定义
- 性能优化:添加API响应缓存
- 安全性:考虑使用
httpOnly
cookie存储token - 测试覆盖:增加单元测试和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.py
和wsgi.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
处理用户注册请求。
- 接收数据:从
request.data
获取username
,password
等。 - 验证数据:检查用户名和密码是否为空,以及用户名是否已存在。
- 创建用户:使用
make_password()
对明文密码进行哈希加密,然后创建SysUser
实例并保存到数据库。
用户登录与JWT令牌生成 (LoginView)
LoginView
是JWT认证流程的核心。
接收凭证:获取
username
和password
。验证凭证:查询数据库找到用户,并使用
check_password()
验证密码哈希。生成令牌
:
- 创建一个
RefreshToken
对象(refresh = RefreshToken.for_user(user)
)。 - 从刷新令牌中提取访问令牌(
access_token = str(refresh.access_token)
)。
- 创建一个
返回响应:将
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)。
权限控制应用
虽然在当前分析的user
和hrchat
应用的视图中未显式设置permission_classes
(如IsAuthenticated
),但权限控制主要在前端路由和API调用层面实现。
- 前端路由守卫:前端代码
src/router/index.ts
中,路由元信息meta: {requiresAuth: true}
标记了需要登录的页面(如人事助手、财务助手)。路由守卫会在跳转前检查是否存在有效的Token。 - API调用:前端在调用需要认证的API时,会自动在请求头中添加
Authorization: Bearer <access_token>
。后端的JWTAuthentication
类会自动验证此Token。
因此,权限控制是一个前后端协同的过程:前端负责阻止未登录用户访问特定页面,而后端通过JWT验证确保API调用的合法性。