🚀快速开发(学生管理前端端篇)
现在我们来进行前端页面快速生成开发
前端项目结构
主要是了解我们下面的这些📂
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>