QuickBuild
QuickBuild
  • 🚀快速开始(后端)
  • 🚀快速开始(前端)
  • 🚀快速开发(学生管理后端)
  • 🚀快速开发(学生管理前端)
  • 🚀快速开发(学生管理进阶完善篇)
  • Ant Design Vue组件
  • 前端框架文档
系统ai配置
QuickBuild
  • 🚀快速开始(后端)
  • 🚀快速开始(前端)
  • 🚀快速开发(学生管理后端)
  • 🚀快速开发(学生管理前端)
  • 🚀快速开发(学生管理进阶完善篇)
  • Ant Design Vue组件
  • 前端框架文档
系统ai配置
  • 🚀快速开发(学生管理前端端篇)

🚀快速开发(学生管理前端端篇)

现在我们来进行前端页面快速生成开发

前端项目结构

主要是了解我们下面的这些📂

FRONT-END-CODE
├── .changeset
├── .husky
├── .vscode
├── apps          --模块
│   ├── backend-mock
│   └── web-ant      --这个是我们前端的项目   重要!!
│       ├── node_modules
│       ├── public
│       └── src
│           ├── adapter          --适配器
│           ├── api              --请求
│           ├── components       --组件
│           ├── layouts         
│           ├── locales         --配置语言菜单
│           ├── router         -- 路由
│           ├── services      --常用的业务变量
│           ├── store          
│           ├── util   --工具类
│           ├── views   --页面vue
│           ├── app.vue  
│           ├── bootstrap.ts
│           ├── main.ts
│           ├── preferences.ts
│           ├── .env
│           ├── index.html
│           ├── package.json
│           ├── tailwind.config.mjs
│           ├── tsconfig.json
│           └── vite.config.mts
├── docs
└── internal
└── node_modules

现在我们来启动我们的前端页面

pnpm run dev
然后会出现
*  Select the app you need to run [dev]:
|  > @vben/web-antd
|    @vben/docs
|    @vben/playground
只需要回车即可

启动好了就会显示

例:

  VITE v6.0.6  ready in 24883 ms

  ➜  Local:   http://localhost:5666/                                                                          14:37:48
  ➜  Network: http://10.13.15.190:5666/                                                                       14:37:48
  ➜  Build Quickly Docs: https://doc.vben.pro                                                                 14:37:48
  ➜  press h + enter to show help                                                                             14:37:48

打开页面访问 http://localhost:5666/

进入到我们的系统里面去

👀菜单 找到 代码生成!!

系统
├── 用户管理   -
├── 菜单管理
├── 角色管理
├── 在线用户
├── 日志管理         
├── 代码生成
├── 组件案例
├── 系统ai
├── ai知识库
├── ai模型配置
└── 工作流

打开代码生成页面

找到我们的学生表

+--------+-----------+------------------+
| 表名   | 表注释    | 操作             |
+========+===========+==================+
| student | 学生信息表 | 生成前端代码     |
+--------+-----------+------------------+
| t_log  | 日志表    | 生成前端代码     |
+--------+-----------+------------------+

点击生成前端代码

+-------------------------------+
| 生成前端代码                  |   ×
+-------------------------------+
| [请输入模块名]                |  --模块名 我们这里写  stu
|                               |
| [请输入后端请求地址]          | --后端请求地址  我们写 /stu/Student
|                               |
| D:\shopCode\vue-vben-admin    | --这个是我们的前端项目路径 请换成自己的路径
|                               |
|           [取消]     [确定]   |
+-------------------------------+

填好过后 我们只需要点击确认

FRONT-END-CODE
├── .vscode
├── apps
│   ├── backend-mock
│   └── web-ant
│       ├── node_modules
│       ├── public
│       └── src
│           ├── adapter
│           ├── api
│           ├── components
│           ├── layouts
│           ├── locales
│           ├── router
│           ├── services
│           ├── store
│           ├── util
│           └── views
│               ├── _core
│               ├── dashboard
│               ├── demos
│               ├── object
│               └── stu        --!! 这里的stu 文件夹就是我们生成
│                   └── student.vue  --生成的学生管理代码
│       ├── app.vue
│       ├── bootstrap.ts
│       ├── main.ts
│       ├── preferences.ts
│       ├── .env
│       ├── index.html
│       ├── package.json
│       ├── tailwind.config.mjs
│       ├── tsconfig.json
│       └── vite.config.mts
├── docs
└── internal
    └── node_modules

配置路由菜单信息

配置我们菜单名称

如图所示

配置前端路由信息

在上面的路径下新建文件 students.ts 配置信息 如下

import type { RouteRecordRaw } from 'vue-router';

import { BasicLayout } from '#/layouts';
import { $t } from '#/locales';

const routes: RouteRecordRaw[] = [
  {
    component: BasicLayout,
    meta: {
      icon: 'ic:baseline-view-in-ar',
      keepAlive: true,
      order: 1000,
      title: $t('page.stu.student'),
    },
    name: 'stu',
    path: '/stu',
    children: [
      {
        meta: {
          title: $t('page.stu.student'),
        },
        name: 'student',
        path: '/student',
        component: () => import('#/views/stu/student.vue'),
      },
    ],
  },
];

export default routes;


接下来配置我们的后端菜单

如图 所示

配置好了点击确定刷新页面 一下

就可以看到我们的新的菜单页面 学生管理🎉 点击学生管理出现下面的页面 那么你就完成了百分之80的开发了!!!

那么好 我们现在只需要调整一下我们页面的显示就👌了

👇下面我们就调整一下我们的显示代码

<template>
  <div class="padding30px">
    <a-card>
      <!-- 搜索区域 -->
      <a-form :model="searchForm" layout="inline" @submit.prevent="handleSearch">

        <a-form-item label="学号">
          <a-input v-model:value="searchForm.studentId" placeholder="学号,业务唯一标识,如" />
        </a-form-item>
        <a-form-item label="学生姓名">
          <a-input v-model:value="searchForm.name" placeholder="学生姓名" />
        </a-form-item>

        <a-form-item>
          <a-button type="primary" htmlType="submit">搜索</a-button>
        </a-form-item>

        <a-form-item>
          <a-button @click="resetSearch">重置</a-button>
        </a-form-item>
      </a-form>

    </a-card>
    <a-card title="查询列表">
      <!-- 操作按钮 -->
      <a-button type="primary" @click="openAddModal" style="margin-bottom: 16px">新增</a-button>
      <a-button @click="deleteSelect" style="margin-left: 16px"
        :disabled="rowSelectionSelecRow.length == 0">批量删除</a-button>
      <!-- 表格 -->
      <a-table :dataSource="dataSourceT" :columns="columns" :pagination="pagination" :row-selection="rowSelection"
        :scroll="{ x: true }" rowKey="id" bordered @change="handleTableChange">
        <!-- 自定义列渲染 -->
        <template #bodyCell="{ column, record }">
          <!-- 操作列 -->
          <template v-if="column.dataIndex === 'edit'">
            <a-button @click="openEditModal(record)">编辑</a-button>
          </template>
        </template>
      </a-table>
    </a-card>

    <!-- 新增/编辑模态框 -->
    <a-modal :title="isEditMode ? '编辑' : '新增'" :open="modalVisible" @ok="handleSubmit" @cancel="handleCancel">
      <a-form ref="formRef" :model="currentFormData" :rules="formRules" layout="vertical">

        <a-form-item label="学号,业务唯一标识,如" name="studentId">
          <a-input v-model:value="currentFormData.studentId" />
        </a-form-item>
        <a-form-item label="学生姓名" name="name">
          <a-input v-model:value="currentFormData.name" />
        </a-form-item>
        <a-form-item label="性别:M-男," name="gender">
          <a-input v-model:value="currentFormData.gender" />
        </a-form-item>
        <a-form-item label="出生日期" name="dateOfBirth">
          <a-input v-model:value="currentFormData.dateOfBirth" />
        </a-form-item>
        <a-form-item label="电子邮箱" name="email">
          <a-input v-model:value="currentFormData.email" />
        </a-form-item>
        <a-form-item label="手机号码" name="phone">
          <a-input v-model:value="currentFormData.phone" />
        </a-form-item>
        <a-form-item label="家庭住址" name="address">
          <a-input v-model:value="currentFormData.address" />
        </a-form-item>
        <a-form-item label="入学日期" name="enrollmentDate">
          <a-input v-model:value="currentFormData.enrollmentDate" />
        </a-form-item>
        <a-form-item label="年级,如" name="grade">
          <a-input v-model:value="currentFormData.grade" />
        </a-form-item>
        <a-form-item label="专业名称,如" name="major">
          <a-input v-model:value="currentFormData.major" />
        </a-form-item>
        <a-form-item label="学籍状态:0-在读," name="status">
          <a-input v-model:value="currentFormData.status" />
        </a-form-item>
        <a-form-item label="记录创建时间" name="createdAt">
          <a-input v-model:value="currentFormData.createdAt" />
        </a-form-item>
        <a-form-item label="记录最后更新时间" name="updatedAt">
          <a-input v-model:value="currentFormData.updatedAt" />
        </a-form-item>

      </a-form>
    </a-modal>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue'
import { message } from 'ant-design-vue'
import {
  listApi,
  addApi,
  updateApi,
  updateBatchApi,
  deleteApi
} from '#/api/stu/student.ts'


// 通用 CRUD 钩子
import { crud } from '#/components/crud'

// 图片上传组件(此处暂时未用到,保留未来扩展可能)
// import ImageUpload from '#/components/ImageUpload.vue'

// 初始化搜索表单
const initSearchForm = {
  roleName: '',
}

// 使用 useCrud 管理数据和操作
const {
  dataSource: dataSourceT,
  pagination,
  searchForm,
  selectedRowKeys: rowSelectionSelecRow,
  modalVisible,
  isEditMode,
  formData: currentFormData,
  loadData,
  handleTableChange,
  handleSearch,
  resetSearch,
  deleteSelected: deleteSelect,
  openAddModal,
  openEditModal,
  handleSubmit,
  handleCancel,
} = crud({
  getList: listApi,
  create: addApi,
  update: updateApi,
  delete: deleteApi,
}, initSearchForm)

// 表单验证规则
const formRules = {
  studentId: [
    { required: true, message: '请输入学号,业务唯一标识,如' }
  ],
  name: [
    { required: true, message: '请输入学生姓名' }
  ],
  gender: [
    { required: true, message: '请输入性别:M-男,' }
  ],
  dateOfBirth: [
    { required: true, message: '请输入出生日期' }
  ],
  email: [
    { required: true, message: '请输入电子邮箱' }
  ],
  phone: [
    { required: true, message: '请输入手机号码' }
  ],
  address: [
    { required: true, message: '请输入家庭住址' }
  ],
  enrollmentDate: [
    { required: true, message: '请输入入学日期' }
  ],
  grade: [
    { required: true, message: '请输入年级,如' }
  ],
  major: [
    { required: true, message: '请输入专业名称,如' }
  ],
  status: [
    { required: true, message: '请输入学籍状态:0-在读,' }
  ],
  createdAt: [
    { required: true, message: '请输入记录创建时间' }
  ],
  updatedAt: [
    { required: true, message: '请输入记录最后更新时间' }
  ],
}

// 表格列配置
const columns = [
  { title: '主键ID', dataIndex: 'id', key: 'id', align: 'center' },
  { title: '学号', dataIndex: 'studentId', key: 'studentId', align: 'center' },
  { title: '学生姓名', dataIndex: 'name', key: 'name', align: 'center' },
  { title: '性别', dataIndex: 'gender', key: 'gender', align: 'center' },
  { title: '出生日期', dataIndex: 'dateOfBirth', key: 'dateOfBirth', align: 'center' },
  { title: '电子邮箱', dataIndex: 'email', key: 'email', align: 'center' },
  { title: '手机号码', dataIndex: 'phone', key: 'phone', align: 'center' },
  { title: '家庭住址', dataIndex: 'address', key: 'address', align: 'center' },
  { title: '入学日期', dataIndex: 'enrollmentDate', key: 'enrollmentDate', align: 'center' },
  { title: '年级,如', dataIndex: 'grade', key: 'grade', align: 'center' },
  { title: '专业名称,如', dataIndex: 'major', key: 'major', align: 'center' },
  { title: '学籍状态', dataIndex: 'status', key: 'status', align: 'center' },
  { title: '记录创建时间', dataIndex: 'createdAt', key: 'createdAt', align: 'center' },
  { title: '记录最后更新时间', dataIndex: 'updatedAt', key: 'updatedAt', align: 'center' },
  { title: '操作', dataIndex: 'edit', key: 'edit', align: 'center' },
]

// 行选择配置
const rowSelection = {
  onChange: (selectedRowKeys) => {
    rowSelectionSelecRow.value = selectedRowKeys
  }
}

// 页面挂载时加载数据
onMounted(() => {
  loadData()
})


</script>

Last Updated:: 12/9/25, 5:13 PM
Contributors: liqing