大家好!今天,我要和大家分享一个超级实用的项目:AI_Company,一个专为一人公司(或小团队)设计的智能管理系统。它不是简单的CRUD工具,而是融合了AI能力的“创业新助手”,帮助你处理HR、战略分析、财务等琐事,让你专注核心业务。

为什么要做这个项目?在当下创业浪潮中,一人公司越来越多,但管理痛点也层出不穷。别担心,这篇文章将从零带你一步步构建它。我们会结合实际代码(基于提供的文档),详细剖析前后端架构、核心模块和交互逻辑。无论你是前端小白还是后端老鸟,都能轻松跟上。准备好了吗?让我们开始吧!

一、项目开篇:一人公司的智能管理需求与解决方案

1.1 一人公司管理痛点剖析

想象一下,你是一个一人创业者:早上写简历模板,中午分析市场战略,下午处理财务报表,晚上还要招人聊天。听起来很酷?但现实是,时间被琐事吞噬,效率低下。常见痛点包括:

  • 用户与权限管理:一人公司也需要多角色(如自己、虚拟助手),但手动管理用户/权限太麻烦,容易出错。
  • HR与沟通:招聘简历筛选、员工聊天、战略分析全靠手动,AI时代却还用Excel?
  • 数据交互:前后端分离的项目中,认证、API调用常常出错,导致开发卡壳。
  • 扩展性差:传统工具无法集成AI大模型,如Coze,导致无法实现智能对话。

这些痛点让我决定打造AI_Company:一个轻量、AI驱动的管理系统,帮助一人公司自动化HR、分析战略,并提供安全的用户权限控制。

1.2 AI_Company 系统核心价值定位

AI_Company 的核心价值在于“一人即公司”:它不是 bloated 的企业级系统,而是精简的AI利器。关键卖点:

  • AI集成:使用Coze大模型实现HR助手(简历分析、战略建议)和聊天功能,省时省力。
  • 安全认证:JWT + RBAC(Role-Based Access Control)确保一人公司也能安全管理“虚拟团队”。
  • 前后端分离:Vue3前端 + Django后端,易扩展,支持文件上传、实时聊天。
  • 实用模块:用户管理、角色权限、智能HR(简历/战略/人事/财务助手)、公司聊天。

通过这个系统,你可以上传简历让AI自动筛选,输入战略数据获取洞察,甚至模拟公司内部聊天。最终目标:让一人公司像大企业一样高效!

1.3 项目整体架构概览(前后端分离设计)

项目采用经典的前后端分离架构:

  • 后端:Django + DRF(Django REST Framework)处理API、数据库(MySQL)和AI集成(Coze API)。核心是RESTful接口,支持JWT认证。
  • 前端:Vue 3 + Vite + TypeScript,提供响应式UI(Element Plus)。使用Pinia管理状态,Vue Router处理路由。
  • 通信:Axios封装的HTTP客户端,带Token拦截器。数据流:前端请求 → 后端验证 → 数据库/AI响应 → 前端渲染。
  • 部署:后端跑在localhost:8000,前端Vite dev server。

整体流程:用户登录(JWT)→ 访问模块(如HR助手)→ AI对话 → 权限校验。文档中提供的代码(如router/index.ts、user.ts store、AnalysisView.vue)就是这个架构的体现。

二、项目基础:技术栈选型与环境搭建

2.1 后端技术栈深度解析

后端选择Django,因为它“batteries included”——内置ORM、Admin面板,完美适合快速原型。结合DRF,提供REST API。

2.1.1 Django + Django REST Framework 框架优势与配置

Django的优势:快速开发、强类型模型、安全性高。DRF扩展了它,支持序列化、视图集、认证。

核心配置(settings.py示例,基于标准Django项目):

# settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'rest_framework',  # DRF
    'rest_framework_simplejwt',  # JWT
    'corsheaders',  # 跨域
    'yourapp.user',  # 自定义app
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
}

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',  # 允许前端跨域
    # ... 其他
]

CORS_ALLOWED_ORIGINS = [
    "http://localhost:5173",  # Vite dev server
]

优势:DRF的ViewSet让API开发像喝水一样简单;JWT比Session更适合移动/分离架构。

2.1.2 MySQL 数据库设计与连接配置(含核心配置代码)

MySQL选择因其稳定性和免费。数据库设计:用户表(sys_user)、角色表(sys_role)、聊天表(chat_session/message)。

配置(settings.py):

# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'ai_company_db',
        'USER': 'root',
        'PASSWORD': 'your_password',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

表结构示例(models.py,用户模型):

# models.py (user/models.py)
from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    email = models.EmailField(unique=True, blank=True)
    phonenumber = models.CharField(max_length=11, blank=True)
    avatar = models.ImageField(upload_to='avatars/', blank=True)
    role_key = models.CharField(max_length=50, default='user')  # 角色标识
    is_active = models.BooleanField(default=True)
    date_joined = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'sys_user'

运行迁移:python manage.py makemigrations && python manage.py migrate。

2.1.3 JWT 认证机制原理与实现(SimpleJWT 集成)

JWT(JSON Web Token)原理:用户登录生成Token(Header.Payload.Signature),后端验证签名。前端存localStorage,后续请求带Bearer Token。

集成SimpleJWT:

# settings.py
from datetime import timedelta

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
}

登录视图(views.py):

# views.py (user/views.py)
from rest_framework_simplejwt.views import TokenObtainPairView
from rest_framework import status
from rest_framework.response import Response

class LoginView(TokenObtainPairView):
    def post(self, request, *args, **kwargs):
        # 验证用户名密码(使用Django auth)
        username = request.data.get('username')
        password = request.data.get('password')
        user = authenticate(username=username, password=password)
        if user:
            refresh = RefreshToken.for_user(user)
            return Response({
                'access': str(refresh.access_token),
                'refresh': str(refresh),
                'user': {'id': user.id, 'username': user.username, 'role_key': user.role_key}
            })
        return Response({'error': 'Invalid credentials'}, status=status.HTTP_401_UNAUTHORIZED)

2.2 前端技术栈全面解读

前端用Vue 3,因为Composition API更灵活,TypeScript加持类型安全。

2.2.1 Vue 3 + Vite 构建工具链使用(项目初始化代码)

Vite的优势:热重载快、插件生态丰富。初始化:

npm create vue@latest ai-company -- --template vue-ts
cd ai-company
npm install

vite.config.ts:

// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'

export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      '@': resolve(__dirname, 'src')
    }
  },
  server: {
    port: 5173,
    proxy: {
      '/api': {
        target: 'http://localhost:8000',
        changeOrigin: true
      }
    }
  }
})
2.2.2 Pinia 状态管理与 Vue Router 路由配置

Pinia比Vuex简单,支持TypeScript。安装:npm i pinia。

主入口(main.ts):

// main.ts
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
import router from './router'

const app = createApp(App)
app.use(createPinia())
app.use(router)
app.mount('#app')

路由配置(基于文档的index.ts):

// router/index.ts (部分代码)
import { createRouter, createWebHistory } from 'vue-router'
import { useUserStore } from '@/stores/user'
// ... 导入视图

const routes = [
  { path: '/', redirect: '/home/dashboard' },
  { path: '/login', name: 'login', component: Login, meta: { requiresAuth: false } },
  { path: '/home', component: Home, meta: { requiresAuth: true }, children: [
    { path: 'dashboard', name: 'dashboard', component: Dashboard },
    { path: 'company/analysis', name: 'analysis-agent', component: () => import('@/views/company/AnalysisView.vue') },
    // ... 其他
  ]},
  // 404
  { path: '/:pathMatch(.*)*', component: () => import('@/views/NotFound.vue') }
]

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes
})

// 守卫:认证 + 权限
router.beforeEach(async (to, from, next) => {
  const userStore = useUserStore()
  if (to.meta.requiresAuth && !userStore.isLoggedIn) {
    next('/login')
    return
  }
  // ... 权限校验逻辑(基于localStorage角色权限)
  next()
})

export default router
2.2.3 Element Plus UI 组件库集成与实战

Element Plus是Vue 3的Material Design UI。安装:npm i element-plus。

main.ts集成:

// main.ts
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
app.use(ElementPlus)

实战示例:在Login.vue中使用ElForm:

<!-- Login.vue (部分) -->
<template>
  <el-form ref="loginRef" :model="loginForm" :rules="loginRules">
    <el-form-item prop="username">
      <el-input v-model="loginForm.username" placeholder="用户名" prefix-icon="User" />
    </el-form-item>
    <!-- ... -->
    <el-button @click="handleLogin" type="primary">登录</el-button>
  </el-form>
</template>

2.3 开发环境搭建步骤(含依赖版本清单)

  1. 后端:Python 3.10+,pip install django djangorestframework djangorestframework-simplejwt mysqlclient corsheaders。版本:Django 4.2, DRF 3.14。
  2. 前端:Node 18+,npm install vue@3 vite@4 pinia@2 element-plus@2 axios@1 typescript@5。版本:Vue 3.3, Vite 4.4。
  3. 运行:后端python manage.py runserver,前端npm run dev。
  4. 工具:VS Code + Python/Django扩展,Postman测试API。

三、项目架构:从目录结构到模块划分

3.1 后端项目结构深度解析

标准Django结构:

ai_company_backend/
├── manage.py
├── ai_company/
│   ├── __init__.py
│   ├── settings.py  # 配置
│   ├── urls.py      # 主路由
│   └── wsgi.py
├── user/            # 用户模块
│   ├── models.py    # User模型
│   ├── views.py     # API视图
│   ├── serializers.py
│   └── urls.py
├── role/            # 角色模块
│   
├── hrchat/          # HR聊天模块
│   └── models.py    # ChatSession等
└── migrations/      # 数据库迁移
3.1.1 核心配置目录(settings.py、urls.py 代码详解)

settings.py:如2.1节所示,配置数据库、DRF、JWT。

urls.py(主路由):

# ai_company/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/user/', include('user.urls')),  # 用户API
    path('api/role/', include('role.urls')),  # 角色API
    path('api/hrchat/', include('hrchat.urls')),  # HR API
]
3.1.2 功能模块组织(user、role、menu、hrchat 目录结构)
  • user:认证、用户CRUD。
  • role:基于文档的role.py(前端API调用),后端对应Role模型和ViewSet。
  • menu:权限菜单(未提供代码,但类似role)。
  • hrchat:聊天模型,集成Coze API。
3.1.3 数据库迁移文件(migrations)作用与使用

migrations记录模型变更。使用:修改models.py后,makemigrations user 生成文件,migrate 应用到DB。作用:版本控制数据库 schema,避免手动SQL。

3.2 前端项目结构全面梳理

Vite + Vue结构:

ai-company-frontend/
├── index.html
├── vite.config.ts
├── src/
│   ├── main.ts          # 入口
│   ├── App.vue
│   ├── router/          # index.ts (路由)
│   ├── stores/          # Pinia: user.ts, counter.ts
│   ├── views/           # 页面: Login.vue, Home.vue, AnalysisView.vue
│   ├── components/      # DataStats.vue 等
│   ├── types/           # user.ts, chat.ts
│   ├── utils/           # request.ts
│   └── assets/          # 图片
└── package.json
3.2.1 核心配置文件(vite.config.ts、tsconfig.json 配置)

vite.config.ts:如2.2.1所示,代理API到后端。

tsconfig.json:

{
  "compilerOptions": {
    "target": "ES2020",
    "useDefineForClassFields": true,
    "module": "ESNext",
    "lib": ["ES2020", "DOM", "DOM.Iterable"],
    "skipLibCheck": true,
    "moduleResolution": "bundler",
    "allowImportingTsExtensions": true,
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "jsx": "preserve",
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noFallthroughCasesInSwitch": true,
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    }
  },
  "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
  "references": [{ "path": "./tsconfig.node.json" }]
}
3.2.2 源码目录(src)细分:入口、组件、状态管理等
  • main.ts:App初始化。
  • views/:页面组件,如AnalysisView.vue(战略分析助手)。
  • stores/:Pinia模块,如user.ts(用户状态)。
  • components/:可复用,如DataStats.vue(统计卡片)。
3.2.3 工具函数与类型定义(utils/request.ts、types/user.ts)

request.ts(Axios封装,基于文档):

// utils/request.ts (部分)
import axios from 'axios'
import type { AxiosResponse, AxiosInstance, AxiosError } from 'axios'

const httpService: AxiosInstance = axios.create({
  baseURL: 'http://localhost:8000/',
  timeout: 15000
})

httpService.interceptors.request.use((config) => {
  const token = localStorage.getItem('token')
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
})

export function post<T = any>(url: string, params: object = {}): Promise<AxiosResponse<T>> {
  return httpService({ url, method: 'post', data: params })
}

// ... get, put, del, fileUpload

types/user.ts(类型定义):

// types/user.ts (部分)
export interface User {
  id: number
  username: string
  email?: string
  // ... 其他字段
}

export interface LoginForm {
  username: string
  password: string
}

四、核心模块开发(一):用户与权限管理系统

4.1 用户数据模型设计(sys_user 表结构与 models.py 代码)

如3.1.2所示,User模型继承AbstractUser,添加role_key等字段。表结构(MySQL):

  • id: INT PRIMARY KEY AUTO_INCREMENT
  • username: VARCHAR(150) UNIQUE
  • email: VARCHAR(254) UNIQUE
  • role_key: VARCHAR(50)
  • is_active: BOOLEAN

这确保一人公司能管理多个“角色”用户。

4.2 用户认证流程实现

4.2.1 注册功能(RegisterView 类视图代码详解)

后端views.py:

# user/views.py
from rest_framework import generics, status
from rest_framework.response import Response
from django.contrib.auth import get_user_model
from .serializers import UserSerializer

User = get_user_model()

class RegisterView(generics.CreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        if serializer.is_valid():
            user = serializer.save()
            return Response({
                'code': 200,
                'message': '注册成功',
                'data': {'id': user.id, 'username': user.username}
            }, status=status.HTTP_201_CREATED)
        return Response({'code': 400, 'message': serializer.errors}, status=status.HTTP_400_BAD_REQUEST)

Serializer(serializers.py):

from rest_framework import serializers
from .models import User

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('username', 'password', 'email', 'phonenumber')
    def create(self, validated_data):
        user = User.objects.create_user(**validated_data)
        return user
4.2.2 登录功能(LoginView 与 JWT Token 生成代码)

如2.1.3所示,LoginView使用SimpleJWT生成Token。

4.2.3 前端登录页面(Login.vue)与表单验证

基于文档的Login.vue:

  • 使用ElForm + rules验证。
  • handleLogin调用userStore.login,成功后router.push('/home')。
  • 记住密码:localStorage存username/password。

完整代码见文档,易懂:reactive表单 + async/await处理API。

4.3 角色与权限控制

4.3.1 RBAC 权限模型设计(Role、Menu 数据模型)

Role模型(role/models.py):

# role/models.py
class Role(models.Model):
    name = models.CharField(max_length=50)
    key = models.CharField(max_length=50, unique=True)  # 如 'admin'
    description = models.TextField()
    permissions = models.ManyToManyField('Menu', blank=True)  # 关联菜单权限

class Menu(models.Model):
    name = models.CharField(max_length=50)
    route_name = models.CharField(max_length=50)  # 如 'dashboard'
    # ...

前端API(role.py,基于文档):

// types/role.py (前端调用)
export function createRole(roleData: RoleForm): Promise<RoleResponse> {
  return requestUtil.post('/api/role/list/', roleData).then(response => response.data)
}
4.3.2 前端路由守卫与权限校验(router/index.ts 代码)

如2.2.2所示,beforeEach检查token + 角色权限(localStorage存allowed routes)。超级admin无限制,白名单包括dashboard。

五、核心模块开发(二):智能 HR 助手模块

5.1 模块功能定位与业务逻辑

HR助手针对一人公司:简历筛选(temp-agent)、战略分析(analysis-agent)、人事/财务聊天。业务逻辑:用户输入/上传文件 → 后端解析 → Coze AI生成响应 → 前端渲染。支持历史记录、流式回复。

5.2 数据模型设计(ChatSession、ChatMessage 模型代码)

hrchat/models.py:

# hrchat/models.py
from django.db import models
from user.models import User

class ChatSession(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

class ChatMessage(models.Model):
    session = models.ForeignKey(ChatSession, on_delete=models.CASCADE, related_name='messages')
    role = models.CharField(max_length=10, choices=[('user', 'user'), ('assistant', 'assistant')])
    content = models.TextField()
    timestamp = models.DateTimeField(auto_now_add=True)
    file = models.FileField(upload_to='chat_files/', blank=True)  # 支持文件

5.3 API 接口开发

5.3.1 会话管理接口(ChatSessionListCreate 视图代码)

views.py:

# hrchat/views.py
from rest_framework import generics, status
from rest_framework.response import Response
from .models import ChatSession
from .serializers import ChatSessionSerializer

class ChatSessionListCreate(generics.ListCreateAPIView):
    serializer_class = ChatSessionSerializer
    def get_queryset(self):
        return ChatSession.objects.filter(user=self.request.user)
    def perform_create(self, serializer):
        serializer.save(user=self.request.user)
5.3.2 消息交互接口(MessageList、MessageCreate 代码)
class MessageList(generics.ListAPIView):
    serializer_class = MessageSerializer
    def get_queryset(self):
        session_id = self.kwargs['session_id']
        return ChatMessage.objects.filter(session_id=session_id)

class MessageCreate(generics.CreateAPIView):
    serializer_class = MessageSerializer
    def perform_create(self, serializer):
        session_id = self.kwargs['session_id']
        session = ChatSession.objects.get(id=session_id)
        # 调用Coze AI生成响应
        ai_response = call_coze_ai(serializer.validated_data['content'])
        serializer.save(session=session, role='user')
        # 保存AI响应
        Message.objects.create(session=session, role='assistant', content=ai_response)
5.3.3 API 文档与调用示例(含 curl 命令)

Swagger或DRF自带文档。示例(创建消息):

curl -X POST http://localhost:8000/api/hrchat/sessions/1/messages/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"content": "分析这份简历", "file": "file.txt"}'

响应:{"code":200, "data": {"id":1, "content":"AI分析结果..."}}

5.4 前端交互实现

5.4.1 聊天界面(ResumeAssistant.vue)组件开发

类似文档的AnalysisView.vue(战略分析,但HR类似):

<!-- AnalysisView.vue (简化版,用于HR) -->
<template>
  <div class="chat-container">
    <div class="messages" v-for="msg in msgs" :key="msg.id">
      <div :class="msg.role">{{ msg.content }}</div>
    </div>
    <input v-model="text" @keyup.enter="sendMessage" placeholder="输入消息..." />
    <button @click="sendMessage">发送</button>
  </div>
</template>
<script setup>
import { ref } from 'vue'
import { coze } from '@/types/hr'  // Coze API

const text = ref('')
const msgs = ref([])

const sendMessage = async () => {
  // 添加用户消息
  msgs.value.push({ role: 'user', content: text.value })
  // 调用Coze
  const response = await coze.chat.completions.create({
    model: 'your-model',
    messages: [{ role: 'user', content: text.value }]
  })
  msgs.value.push({ role: 'assistant', content: response.choices[0].message.content })
  text.value = ''
}
</script>
5.4.2 消息发送与接收逻辑(Pinia 状态管理代码)

扩展user.ts store为chat store(chat.ts types支持):

// stores/chat.ts (基于文档user.ts模式)
import { defineStore } from 'pinia'
import ChatService from '@/services/chatService'  // 基于chatService.ts

export const useChatStore = defineStore('chat', () => {
  const messages = ref<ChatMessage[]>([])
  const sessions = ref<ChatSession[]>([])

  const sendMessage = async (roomId: number, content: string) => {
    const msg = await ChatService.sendMessage(roomId, { content, message_type: 'text' })
    messages.value.push(msg)
  }

  const loadSessions = async () => {
    sessions.value = await ChatService.getChatRooms()
  }

  return { messages, sessions, sendMessage, loadSessions }
})

chatService.ts(基于文档)封装API调用。

5.4.3 流式对话功能实现(Coze 大模型集成代码)

hr.ts(Coze配置):

// types/hr.ts
import { CozeAPI } from '@coze/api'

export const coze = new CozeAPI({
  token: 'your_token',
  baseURL: 'https://api.coze.cn',
  allowPersonalAccessTokenInBrowser: true
})

在组件中使用流式(SSE或WebSocket模拟):

// 在sendMessage中
const stream = await coze.chat.completions.create({
  stream: true,
  messages: [...]
})
for await (const chunk of stream) {
  // 追加chunk到UI,实现流式
  currentMsg.content += chunk.choices[0].delta.content
}

六、前后端交互核心:API 客户端与数据通信

6.1 Axios 封装实战(request.ts 代码详解)

如3.2.3所示,request.ts创建Axios实例,拦截器自动加Token。优势:统一错误处理,一处配置全局。

6.1.1 自定义 Axios 实例创建与配置

baseURL指向后端,timeout 15s。

6.1.2 请求拦截器(JWT Token 注入)

从localStorage取token,加到headers。

6.1.3 响应拦截器与错误处理
httpService.interceptors.response.use(
  (response) => response,
  (error: AxiosError) => {
    if (error.response?.status === 401) {
      // 清除token,重定向登录
      localStorage.removeItem('token')
      router.push('/login')
    }
    return Promise.reject(error)
  }
)

6.2 数据通信流程分析

6.2.1 登录流程完整数据交互(前端→后端→数据库)
  1. 前端:userStore.login发送POST /api/user/login/ {username, password}。
  2. 后端:LoginView验证 → Django auth → 生成JWT → 返回token/user。
  3. 前端:存localStorage,fetchUserInfo更新store → 路由跳转。
  4. 数据库:User表查询/更新。
6.2.2 智能 HR 助手消息交互流程
  1. 前端:sendMessage → request.post('/api/hrchat/messages/', {content}) + Token。
  2. 后端:验证Token → 保存User消息 → 调用Coze API → 保存AI响应 → 返回。
  3. 前端:更新msgs ref,渲染Markdown(marked库)。

6.3 状态管理(Pinia)深度应用

6.3.1 用户状态模块(user.ts)代码详解

基于文档user.ts:

  • ref(user, token),computed(isLoggedIn)。
  • login/register:async post,处理响应,存localStorage。
  • fetchUserInfo:get /api/user/user_info/,更新user。
  • clearAuth:移除token,重定向。
const login = async (loginForm: LoginForm) => {
  const response = await requestUtil.post('/api/user/login/', loginForm)
  const { token: jwtToken, user: userInfo } = response.data.data
  token.value = jwtToken
  user.value = userInfo
  localStorage.setItem('token', jwtToken)
  return { success: true, message: '登录成功' }
}

结语:你的AI创业助手,从这里启航

恭喜!我们从痛点到完整系统,一步步构建了AI_Company。它不只代码,更是你的生产力武器。项目GitHub:连接后面放

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐