欢迎光临
我们一直在努力

Web 毕设篇-适合练手的 Spring Boot Web 毕业设计项目:智驿AI系统(前后端源码 + 数据库 sql 脚本)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍

文章目录

        AI系统具有许多优势

        1.0 项目介绍

        1.1 项目功能

        1.2 用户端功能

        2.0 用户登录

        3.0 首页界面

        4.0 物件管理功能

        5.0 用户管理功能

        6.0 区域管理功能

        7.0 物件日志管理功能

        8.0 操作日志


        AI系统具有许多优势

        1)自动化:AI 系统能够自动化执行任务,减少人力和时间成本。它们可以自动处理大量数据并执行复杂的计算,从而提高效率。

        2)智能决策:AI 系统可以通过学习和分析数据来做出智能决策。它们能够根据过去的经验和数据来预测未来的趋势,并提供有价值的见解。

        3)高精度和一致性:AI 系统在执行任务时通常能达到高精度和一致性。它们不受情绪或疲劳的影响,可以持续长时间地保持高质量的表现。

        4)大规模处理:AI 系统可以处理大规模的数据,并能够在短时间内快速地进行分析和处理。这使得它们特别适合处理需要大量数据处理的任务。

        5)个性化服务:AI 系统能够根据每个用户的需求和偏好提供个性化的服务。通过分析用户的数据和行为,AI 系统可以定制和优化用户体验。

        6)持续学习:AI 系统具有持续学习的能力,可以根据不断积累的数据和经验不断改进自身性能。这使得它们能够不断适应变化的环境和需求。

        总的来说,AI 系统的优势在于其自动化、智能化、高效率和灵活性,使其在各种领域都能发挥重要作用。

        1.0 项目介绍

        开发工具:IDEA、VScode

        服务器:Tomcat, JDK 17

        项目构建:maven

        数据库:mysql 8.0

系统用户前台和管理后台两部分,项目采用前后端分离

        前端技术:vue3 + elementUI

        服务端技术:springboot + mybatis + redis + mysql

        简单介绍一下,智驿AI系统主要分为两个端,系统管理端、用户端:

        1)系统管理端:

        2)用户端:

        1.1 项目功能

后台功能:

        1)登录、退出系统、首页

        2)物件管理

                (1) 物件管理:添加、修改、删除、查询等功能。

        3)用户管理

                (1) 用户管理:添加、修改、删除、查询等功能。

        4)区域管理

                (1) 区域管理:添加、修改、删除、查询等功能。

        5)物件日志管理

                (1) 物件日志管理:添加、修改、删除、查询等功能。

        6)用户反馈信息

                (1) 用户反馈信息:添加、修改、删除、查询等功能。

        7)操作日志

                (1) 操作日志:添加、修改、删除、查询等功能。

        8)物件入库

                (1)物件入库功能。

        9)系统管理

                用户信息管理

                        (1)用户信息管理:添加、修改、删除、查询等功能。

                角色管理

                        (2)角色信息管理:添加、修改、删除、查询等功能。

                菜单管理

                        (3)菜单信息管理:添加、修改、删除、查询等功能。

                日志管理

                        (4)日志信息管理:添加、修改、删除、查询等功能。

        10)系统监控

                        查看在先用户、设置定时任务、数据监控、缓存监控、查看缓存列表等。

        11)权限管理

                (1) 角色信息管理:添加、修改、删除、分配权限等功能。

                (2) 资源信息管理:添加、修改、删除等功能。

注意:不一定非要完全符合开发环境,有稍微的差别也是可以开发的。

         若需要项目完整源码,可以在 CSDN 私信给我,我每天都有查看消息的,感谢大家支持,希

望可以帮助到大家!

        1.2 用户端功能

        用户通过访问智能客服来询问快递的具体位置功能、用户信息反馈功能、用户取件功能:

相关源码:

<template>
<div class="home" :class="{ 'dark': isDark }">
<div class="container">
<h1 class="title">取件 AI 应用中心</h1>
<div class="cards-grid">
<router-link
v-for="app in aiApps"
:key="app.id"
:to="app.route"
class="card"
:aria-label="app.title"
>
<div class="card-content">
<component :is="app.icon" class="icon" />
<h2>{{ app.title }}</h2>
<p>{{ app.description }}</p>
</div>
</router-link>
</div>
</div>
</div>
</template>

<script setup>
import { ref } from 'vue'
import { useDark } from '@vueuse/core'
import {
ChatBubbleLeftRightIcon,
HeartIcon,
UserGroupIcon,
DocumentTextIcon
} from '@heroicons/vue/24/outline'

const isDark = useDark()

const aiApps = ref([
{
id: 1,
title: 'AI 聊天',
description: '多模态对话机器人,支持图片、音频等',
route: '/ai-chat',
icon: ChatBubbleLeftRightIcon
},

{
id: 3,
title: '快递取件智能客服',
description: '24小时在线的智能咨询',
route: '/customer-service',
icon: UserGroupIcon
}

])
</script>

<style scoped lang="scss">

.container {
max-width: 1600px;
margin: 0 auto;
padding: 0 2rem;
}

.title {
text-align: center;
font-size: 2.5rem;
margin-bottom: 3rem;
background: linear-gradient(45deg, #007CF0, #00DFD8);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
animation: fadeIn 1s ease-out;
}

.cards-grid {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 10rem;
padding: 1rem;
}

.card {
width: 100%;
max-width: 320px;
background: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(10px);
border-radius: 120px;
padding: 2rem;
text-decoration: none;
color: inherit;
transition: all 0.3s ease;
border: 1px solid rgba(255, 255, 255, 0.1);
overflow: hidden;

&:hover {
transform: translateY(-5px);
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
}

.dark & {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.05);
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3);
}

.card-content {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
}

.icon {
width: 48px;
height: 48px;
margin-bottom: 1rem;
color: #007CF0;
}

h2 {
font-size: 1.5rem;
margin-bottom: 0.5rem;
}

p {
color: #666;
font-size: 1rem;
line-height: 1.6;
}

.dark & p {
color: #999;
}
}
}

</style>

        2.0 用户登录

        用户根据正确的用户名、密码且通过正确的校验码进行登录。

        用到了 Spring Security 框架来实现登录、校验、验证等功能。 

相关的部分源码:

@RestController
public class SysLoginController
{
@Autowired
private SysLoginService loginService;

@Autowired
private ISysMenuService menuService;

@Autowired
private SysPermissionService permissionService;

/**
* 登录方法
*
* @param loginBody 登录信息
* @return 结果
*/
@PostMapping("/login")
public AjaxResult login(@RequestBody LoginBody loginBody)
{
AjaxResult ajax = AjaxResult.success();
// 生成令牌
String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
loginBody.getUuid());
ajax.put(Constants.TOKEN, token);
return ajax;
}

/**
* 获取用户信息
*
* @return 用户信息
*/
@GetMapping("getInfo")
public AjaxResult getInfo()
{
SysUser user = SecurityUtils.getLoginUser().getUser();
// 角色集合
Set<String> roles = permissionService.getRolePermission(user);
// 权限集合
Set<String> permissions = permissionService.getMenuPermission(user);
AjaxResult ajax = AjaxResult.success();
ajax.put("user", user);
ajax.put("roles", roles);
ajax.put("permissions", permissions);
return ajax;
}

/**
* 获取路由信息
*
* @return 路由信息
*/
@GetMapping("getRouters")
public AjaxResult getRouters()
{
Long userId = SecurityUtils.getUserId();
List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
return AjaxResult.success(menuService.buildMenus(menus));
}
}

        3.0 首页界面

        使用了各种各样的统计图表来直观展示数据。

相关的前端源码:

<template>
<div class="stats-container">
<!– 页面标题 –>
<h2>快递数据统计</h2>

<!– 统计卡片区域 –>
<el-row :gutter="20" class="mb-4">
<el-col :span="12">
<el-card class="stat-card" shadow="hover">
<div class="card-content">
<div class="icon"><i class="el-icon-box"></i></div>

<div class="info">
<p class="title">今日入库数量</p>
<p class="value">{{ stats.inbound }}</p>
</div>

<div class="info">
<p class="title">入库总数量</p>
<p class="value">{{ stats.inboundCount }}</p>
</div>
</div>
</el-card>
</el-col>
<el-col :span="12">
<el-card class="stat-card" shadow="hover">
<div class="card-content">
<div class="icon"><i class="el-icon-truck"></i></div>

<div class="info">
<p class="title">今日出库数量</p>
<p class="value">{{ stats.outbound }}</p>
</div>

<div class="info">
<p class="title">出库总数量</p>
<p class="value">{{ stats.outboundCount }}</p>
</div>
</div>
</el-card>
</el-col>
</el-row>

<!– 图表区域 –>
<el-row :gutter="20">
<el-col :span="12">
<el-card class="chart-card" shadow="never">
<template #header>
<div class="chart-header">快递入库统计</div>
</template>
<div ref="barChart" class="chart-container"></div>
</el-card>
</el-col>
<el-col :span="12">
<el-card class="chart-card" shadow="never">
<template #header>
<div class="chart-header">快递出库比例</div>
</template>
<div ref="pieChart" class="chart-container"></div>
</el-card>
</el-col>
</el-row>
</div>
</template>

<script setup>
import { ref, onMounted } from 'vue'
import * as echarts from 'echarts'
import {getGoodsTodayCount} from '@/api/goods/goods'

// 模拟统计数据
const stats = ref({
inbound: 0,
outbound: 0,
inboundCount:0,
outboundCount:0
})

// 图表容器引用
const barChart = ref(null)
const pieChart = ref(null)

let barInstance = null
let pieInstance = null

// 初始化图表
function initCharts() {
if (!barChart.value || !pieChart.value) return

// 条形图配置(模拟数据)
barInstance = echarts.init(barChart.value)
barInstance.setOption({
tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },
grid: { left: '5%', right: '5%', bottom: '10%' },
xAxis: { type: 'category', data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] },
yAxis: {},
series: [{ name: '入库数量', type: 'bar', data: [120, 200, 150, 80, 70, 110, 130], itemStyle: { color: '#409EFF' } }]
})

// 饼图配置(模拟数据)
pieInstance = echarts.init(pieChart.value)
pieInstance.setOption({
tooltip: { trigger: 'item' },
legend: { top: '5%', left: 'center' },
series: [{
name: '出库比例',
type: 'pie',
radius: '60%',
data: [
{ value: 335, name: '华东' },
{ value: 310, name: '华北' },
{ value: 274, name: '华南' },
{ value: 235, name: '华中' }
],
emphasis: { itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)' } },
itemStyle: { borderRadius: 5, borderColor: '#fff', borderWidth: 2 }
}]
})
}

// 获取数据的方法(可替换为真实接口)
function fetchData() {

// 异步请求
getGoodsTodayCount().then((result) => {
stats.value = result.data;
stats.value = {
inbound: result.data.todayInboundCount,
outbound: result.data.todayOutboundCount,
inboundCount:result.data.inboundCount,
outboundCount:result.data.outboundCount
}
console.log(result.data);
})

// 更新图表数据(示例)
updateChartData()

}

// 更新图表数据(预留方法用于接口回调后更新)
function updateChartData() {
if (barInstance) {
barInstance.setOption({
series: [{ data: [100, 180, 140, 90, 80, 120, 110] }]
})
}

if (pieInstance) {
pieInstance.setOption({
series: [{
data: [
{ value: 280, name: '华东' },
{ value: 250, name: '华北' },
{ value: 200, name: '华南' },
{ value: 180, name: '华中' }
]
}]
})
}
}

onMounted(() => {
initCharts()
fetchData()
})

</script>

<style scoped>
.stats-container {
background-color: #ffffff;
padding: 20px;
min-height: 100vh;
font-family: "Helvetica Neue", Arial, sans-serif;
}

.stat-card {
background-color: #f5f7fa;
border-radius: 12px;
height: 120px;
}

.card-content {
display: flex;
align-items: center;
justify-content: space-between;
padding: 15px;
}

.icon {
font-size: 40px;
color: #409EFF;
}

.info .title {
font-size: 16px;
color: #666;
margin-bottom: 5px;
}

.info .value {
font-size: 24px;
font-weight: bold;
color: #333;
}

.chart-card {
background-color: #f9fafb;
border-radius: 12px;
}

.chart-header {
font-size: 16px;
font-weight: bold;
text-align: center;
color: #333;
}

.chart-container {
width: 100%;
height: 350px;
}
</style>

        4.0 物件管理功能

相关源码:

<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="手机号" prop="phoneNumber">
<el-input
v-model="queryParams.phoneNumber"
placeholder="请输入手机号码"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>

<el-form-item label="状态" prop="state">
<el-select v-model="queryParams.state" placeholder="请选择入库或者代表出库" clearable>
<el-option
v-for="dict in state"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="入库时间" prop="inboundTime">
<el-date-picker clearable
v-model="queryParams.inboundTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择入库时间">
</el-date-picker>
</el-form-item>
<el-form-item label="出库时间" prop="outboundTime">
<el-date-picker clearable
v-model="queryParams.outboundTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择出库时间">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>

<el-row :gutter="10" class="mb8">
<!– <el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['goods:goods:add']"
>新增</el-button>
</el-col> –>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['goods:goods:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['goods:goods:remove']"
>删除</el-button>
</el-col>

<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>

<el-table v-loading="loading" :data="goodsList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="物品序号" width="80" align="center" prop="id" />
<el-table-column label="手机号码" align="center" prop="phoneNumber" />
<el-table-column label="物品入库位置" align="center" prop="regionId" >
<template #default="scope">
<!– 遍历区域列表信息 –>
<div v-for="region in regionOptions" :key="region.id">
<span v-if="region.id === scope.row.regionId">{{ region.regionName + "-" + region.layer}}</span>
</div>
</template>
</el-table-column>
<el-table-column label="物品状态" align="center" prop="state">
<template #default="scope">
<dict-tag :options="state" :value="scope.row.state"/>
</template>
</el-table-column>
<el-table-column label="入库时间" align="center" prop="inboundTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.inboundTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="出库时间" align="center" prop="outboundTime" width="180">
<template #default="scope">
<span v-if="scope.row.outboundTime != null && scope.row.outboundTime != ''">{{ parseTime(scope.row.outboundTime, '{y}-{m}-{d}') }}</span>
<span v-else>待领取</span>
</template>
</el-table-column>
<el-table-column label="存放时间" align="center" prop="storageTime" width="180">

<template #default="scope">
<span v-if="scope.row.outboundTime != null && scope.row.outboundTime != ''">
{{
scope.row.outboundTime === scope.row.inboundTime
? '当天入库'
: Math.floor((new Date(scope.row.outboundTime) – new Date(scope.row.inboundTime)) / (1000 * 60 * 60 * 24)) + '天'
}}
</span>
<span v-if="scope.row.outboundTime == null || scope.row.outboundTime == ''">
{{
Math.floor((new Date() – new Date(scope.row.inboundTime)) / (1000 * 60 * 60 * 24)) == '0'
? '当天入库'
: Math.floor((new Date() – new Date(scope.row.inboundTime)) / (1000 * 60 * 60 * 24)) + '天'
}}
</span>
</template>

</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['goods:goods:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['goods:goods:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>

<pagination
v-show="total>0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>

<!– 添加或修改物件管理对话框 –>
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="goodsRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="手机号码" prop="phoneNumber">
<el-input v-model="form.phoneNumber" placeholder="请输入用户手机号码" />
</el-form-item>
<el-form-item label="物件状态" prop="state">
<el-select v-model="form.state" placeholder="请选择1代表入库;2代表出库">
<el-option
v-for="dict in state"
:key="dict.value"
:label="dict.label"
:value="parseInt(dict.value)"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="入库时间" prop="inboundTime">
<el-date-picker clearable
v-model="form.inboundTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择入库时间">
</el-date-picker>
</el-form-item>
<el-form-item label="出库时间" prop="outboundTime">
<el-date-picker clearable
v-model="form.outboundTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择出库时间">
</el-date-picker>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template>

<script setup name="Goods">
import { listGoods, getGoods, delGoods, addGoods, updateGoods } from "@/api/goods/goods";
import {listRegion} from "@/api/region/region";
import { get } from "@vueuse/core";

const { proxy } = getCurrentInstance();
const { state } = proxy.useDict('state');

const goodsList = ref([]);
const open = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const title = ref("");

const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
phoneNumber: null,
regionId: null,
state: null,
inboundTime: null,
outboundTime: null,
storageTime: null
},
rules: {
phoneNumber: [
{ required: true, message: "用户手机号码不能为空", trigger: "blur" }
]/* ,
regionId: [
{ required: true, message: "当前物品入库位置不能为空", trigger: "blur" }
], */
}
});

const { queryParams, form, rules } = toRefs(data);

/** 查询物件管理列表 */
function getList() {
loading.value = true;
listGoods(queryParams.value).then(response => {
goodsList.value = response.rows;
total.value = response.total;
loading.value = false;
});
}

// 取消按钮
function cancel() {
open.value = false;
reset();
}

// 表单重置
function reset() {
form.value = {
id: null,
phoneNumber: null,
regionId: null,
state: null,
inboundTime: null,
outboundTime: null,
storageTime: null
};
proxy.resetForm("goodsRef");
}

/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1;
getList();
}

/** 重置按钮操作 */
function resetQuery() {
proxy.resetForm("queryRef");
handleQuery();
}

// 多选框选中数据
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}

/** 新增按钮操作 */
function handleAdd() {
reset();
open.value = true;
title.value = "添加物件管理";
}

/** 修改按钮操作 */
function handleUpdate(row) {
reset();
const _id = row.id || ids.value
getGoods(_id).then(response => {
form.value = response.data;
open.value = true;
title.value = "修改物件管理";
});
}

/** 提交按钮 */
function submitForm() {
proxy.$refs["goodsRef"].validate(valid => {
if (valid) {
if (form.value.id != null) {
updateGoods(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功");
open.value = false;
getList();
});
} else {
addGoods(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功");
open.value = false;
getList();
});
}
}
});
}

/** 删除按钮操作 */
function handleDelete(row) {
const _ids = row.id || ids.value;
proxy.$modal.confirm('是否确认删除物件管理编号为"' + _ids + '"的数据项?').then(function() {
return delGoods(_ids);
}).then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
}).catch(() => {});
}

/** 导出按钮操作 */
function handleExport() {
proxy.download('goods/goods/export', {
…queryParams.value
}, `goods_${new Date().getTime()}.xlsx`)
}

getList();

const regionOptions = ref([]);
//查询区域列表
function getRegionList() {
listRegion().then(response => {
regionOptions.value = response.rows;
});
}

getRegionList();

</script>

        5.0 用户管理功能

相关源码:

<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="用户名字" prop="userName">
<el-input
v-model="queryParams.userName"
placeholder="请输入用户名字"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="电话号码" prop="phoneNumber">
<el-input
v-model="queryParams.phoneNumber"
placeholder="请输入电话号码"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>

<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['tbUser:tbuser:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['tbUser:tbuser:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['tbUser:tbuser:remove']"
>删除</el-button>
</el-col>

<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>

<el-table v-loading="loading" :data="tbuserList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="用户序号" type="index" width="130" align="center" prop="id" />
<el-table-column label="用户名字" align="center" prop="userName" width="180"/>
<el-table-column label="用户号码" align="center" prop="phoneNumber" width="280" />
<el-table-column label="用户图片" align="center" prop="img" width="200">
<template #default="scope">
<image-preview :src="scope.row.img" :width="80" :height="60"/>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['tbUser:tbuser:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['tbUser:tbuser:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>

<pagination
v-show="total>0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>

<!– 添加或修改用户管理对话框 –>
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="tbuserRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="用户名字" prop="userName">
<el-input v-model="form.userName" placeholder="请输入用户名字" />
</el-form-item>
<el-form-item label="用户号码" prop="phoneNumber">
<el-input v-model="form.phoneNumber" placeholder="请输入用户号码" />
</el-form-item>
<el-form-item label="用户图片" prop="img">
<image-upload v-model="form.img"/>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template>

<script setup name="Tbuser">
import { listTbuser, getTbuser, delTbuser, addTbuser, updateTbuser } from "@/api/tbUser/tbuser";

const { proxy } = getCurrentInstance();

const tbuserList = ref([]);
const open = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const title = ref("");

const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
userName: null,
phoneNumber: null,
img: null
},
rules: {
userName: [
{ required: true, message: "用户名字不能为空", trigger: "blur" }
],
phoneNumber: [
{ required: true, message: "用户号码不能为空", trigger: "blur" }
]
}
});

const { queryParams, form, rules } = toRefs(data);

/** 查询用户管理列表 */
function getList() {
loading.value = true;
listTbuser(queryParams.value).then(response => {
tbuserList.value = response.rows;
total.value = response.total;
loading.value = false;
});
}

// 取消按钮
function cancel() {
open.value = false;
reset();
}

// 表单重置
function reset() {
form.value = {
id: null,
userName: null,
phoneNumber: null,
img: null
};
proxy.resetForm("tbuserRef");
}

/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1;
getList();
}

/** 重置按钮操作 */
function resetQuery() {
proxy.resetForm("queryRef");
handleQuery();
}

// 多选框选中数据
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}

/** 新增按钮操作 */
function handleAdd() {
reset();
open.value = true;
title.value = "添加用户管理";
}

/** 修改按钮操作 */
function handleUpdate(row) {
reset();
const _id = row.id || ids.value
getTbuser(_id).then(response => {
form.value = response.data;
open.value = true;
title.value = "修改用户管理";
});
}

/** 提交按钮 */
function submitForm() {
proxy.$refs["tbuserRef"].validate(valid => {
if (valid) {
if (form.value.id != null) {
updateTbuser(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功");
open.value = false;
getList();
});
} else {
addTbuser(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功");
open.value = false;
getList();
});
}
}
});
}

/** 删除按钮操作 */
function handleDelete(row) {
const _ids = row.id || ids.value;
proxy.$modal.confirm('是否确认删除用户的数据项?').then(function() {
return delTbuser(_ids);
}).then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
}).catch(() => {});
}

/** 导出按钮操作 */
function handleExport() {
proxy.download('tbUser/tbuser/export', {
…queryParams.value
}, `tbuser_${new Date().getTime()}.xlsx`)
}

getList();
</script>

        6.0 区域管理功能

相关源码:

<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="区域名" prop="regionName">
<el-input
v-model="queryParams.regionName"
placeholder="请输入区域名"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="容量" prop="capacity">
<el-input
v-model="queryParams.capacity"
placeholder="请输入容量"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="当前容量" prop="currentQuantity">
<el-input
v-model="queryParams.currentQuantity"
placeholder="请输入当前容量"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>

<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['region:region:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['region:region:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['region:region:remove']"
>删除</el-button>
</el-col>

<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>

<el-table v-loading="loading" :data="regionList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="区域序号" type="index" align="center" prop="id" width="80" />
<el-table-column label="区域名" align="center" prop="regionName" />
<el-table-column label="货架层级" align="center" prop="layer" width="110"/>
<el-table-column label="区域图片" align="center" prop="img" width="180">
<template #default="scope">
<image-preview :src="scope.row.img" :width="80" :height="60"/>
</template>
</el-table-column>

<el-table-column label="容量" align="center" prop="capacity" />
<el-table-column label="当前件数" align="center" prop="currentQuantity" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['region:region:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['region:region:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>

<pagination
v-show="total>0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>

<!– 添加或修改区域对话框 –>
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="regionRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="区域名" prop="regionName">
<el-input v-model="form.regionName" placeholder="请输入区域名" />
</el-form-item>
<el-form-item label="区域图片" prop="img">
<image-upload v-model="form.img"/>
</el-form-item>
<el-form-item label="层数" prop="layer">
<el-input v-model="form.layer" placeholder="请输入层数" />
</el-form-item>
<el-form-item label="容量" prop="capacity">
<el-input v-model="form.capacity" placeholder="请输入容量" />
</el-form-item>
<!– <el-form-item label="当前容量" prop="currentQuantity">
<el-input v-model="form.currentQuantity" placeholder="请输入当前容量" />
</el-form-item> –>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template>

<script setup name="Region">
import { listRegion, getRegion, delRegion, addRegion, updateRegion } from "@/api/region/region";

const { proxy } = getCurrentInstance();

const regionList = ref([]);
const open = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const title = ref("");

const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
regionName: null,
img: null,
layer: null,
capacity: null,
currentQuantity: null
},
rules: {
regionName: [
{ required: true, message: "区域名不能为空", trigger: "blur" }
],
layer: [
{ required: true, message: "层数不能为空", trigger: "blur" }
],
capacity: [
{ required: true, message: "容量不能为空", trigger: "blur" }
]
}
});

const { queryParams, form, rules } = toRefs(data);

/** 查询区域列表 */
function getList() {
loading.value = true;
listRegion(queryParams.value).then(response => {
regionList.value = response.rows;
total.value = response.total;
loading.value = false;
});
}

// 取消按钮
function cancel() {
open.value = false;
reset();
}

// 表单重置
function reset() {
form.value = {
id: null,
regionName: null,
img: null,
layer: null,
capacity: null,
currentQuantity: null
};
proxy.resetForm("regionRef");
}

/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1;
getList();
}

/** 重置按钮操作 */
function resetQuery() {
proxy.resetForm("queryRef");
handleQuery();
}

// 多选框选中数据
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}

/** 新增按钮操作 */
function handleAdd() {
reset();
open.value = true;
title.value = "添加区域";
}

/** 修改按钮操作 */
function handleUpdate(row) {
reset();
const _id = row.id || ids.value
getRegion(_id).then(response => {
form.value = response.data;
open.value = true;
title.value = "修改区域";
});
}

/** 提交按钮 */
function submitForm() {
proxy.$refs["regionRef"].validate(valid => {
if (valid) {
if (form.value.id != null) {
updateRegion(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功");
open.value = false;
getList();
});
} else {
addRegion(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功");
open.value = false;
getList();
});
}
}
});
}

/** 删除按钮操作 */
function handleDelete(row) {
const _ids = row.id || ids.value;
proxy.$modal.confirm('是否确认删除区域的数据项?').then(function() {
return delRegion(_ids);
}).then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
}).catch(() => {});
}

/** 导出按钮操作 */
function handleExport() {
proxy.download('region/region/export', {
…queryParams.value
}, `region_${new Date().getTime()}.xlsx`)
}

getList();
</script>

        7.0 物件日志管理功能

相关源码:

<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="用户号码" prop="number">
<el-input
v-model="queryParams.number"
placeholder="请输入用户号码"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<!– <el-form-item label="物品id" prop="goodsId">
<el-input
v-model="queryParams.goodsId"
placeholder="请输入物品id"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item> –>
<el-form-item label="入库时间" prop="inboundTime">
<el-date-picker clearable
v-model="queryParams.inboundTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择入库时间">
</el-date-picker>
</el-form-item>
<el-form-item label="出库时间" prop="outboundTime">
<el-date-picker clearable
v-model="queryParams.outboundTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择出库时间">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>

<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['ItemLog:Itemlog:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['ItemLog:Itemlog:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['ItemLog:Itemlog:remove']"
>删除</el-button>
</el-col>

<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>

<el-table v-loading="loading" :data="ItemlogList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="物品日志序号" type="index" width="130" align="center" prop="id" />
<el-table-column label="手机号码" align="center" prop="number" />
<el-table-column label="物品唯一标识" align="center" prop="goodsId" />
<el-table-column label="入库时间" align="center" prop="inboundTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.inboundTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="出库时间" align="center" prop="outboundTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.outboundTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['ItemLog:Itemlog:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['ItemLog:Itemlog:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>

<pagination
v-show="total>0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>

<!– 添加或修改物件日志管理对话框 –>
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="ItemlogRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="手机号码" prop="number">
<el-input v-model="form.number" placeholder="请输入用户手机号码" />
</el-form-item>
<el-form-item label="物品标识" prop="goodsId">
<el-input v-model="form.goodsId" placeholder="请输入物品id" />
</el-form-item>
<el-form-item label="入库时间" prop="inboundTime">
<el-date-picker clearable
v-model="form.inboundTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择入库时间">
</el-date-picker>
</el-form-item>
<el-form-item label="出库时间" prop="outboundTime">
<el-date-picker clearable
v-model="form.outboundTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择出库时间">
</el-date-picker>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template>

<script setup name="Itemlog">
import { listItemlog, getItemlog, delItemlog, addItemlog, updateItemlog } from "@/api/ItemLog/Itemlog";

const { proxy } = getCurrentInstance();

const ItemlogList = ref([]);
const open = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const title = ref("");

const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
number: null,
goodsId: null,
inboundTime: null,
outboundTime: null
},
rules: {
number: [
{ required: true, message: "管理id/用户号码不能为空", trigger: "blur" }
],
goodsId: [
{ required: true, message: "物品id不能为空", trigger: "blur" }
],
inboundTime: [
{ required: true, message: "入库时间不能为空", trigger: "blur" }
],
outboundTime: [
{ required: true, message: "出库时间不能为空", trigger: "blur" }
]
}
});

const { queryParams, form, rules } = toRefs(data);

/** 查询物件日志管理列表 */
function getList() {
loading.value = true;
listItemlog(queryParams.value).then(response => {
ItemlogList.value = response.rows;
total.value = response.total;
loading.value = false;
});
}

// 取消按钮
function cancel() {
open.value = false;
reset();
}

// 表单重置
function reset() {
form.value = {
id: null,
number: null,
goodsId: null,
inboundTime: null,
outboundTime: null
};
proxy.resetForm("ItemlogRef");
}

/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1;
getList();
}

/** 重置按钮操作 */
function resetQuery() {
proxy.resetForm("queryRef");
handleQuery();
}

// 多选框选中数据
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}

/** 新增按钮操作 */
function handleAdd() {
reset();
open.value = true;
title.value = "添加物件日志管理";
}

/** 修改按钮操作 */
function handleUpdate(row) {
reset();
const _id = row.id || ids.value
getItemlog(_id).then(response => {
form.value = response.data;
open.value = true;
title.value = "修改物件日志管理";
});
}

/** 提交按钮 */
function submitForm() {
proxy.$refs["ItemlogRef"].validate(valid => {
if (valid) {
if (form.value.id != null) {
updateItemlog(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功");
open.value = false;
getList();
});
} else {
addItemlog(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功");
open.value = false;
getList();
});
}
}
});
}

/** 删除按钮操作 */
function handleDelete(row) {
const _ids = row.id || ids.value;
proxy.$modal.confirm('是否确认删除物件日志管理编号为"' + _ids + '"的数据项?').then(function() {
return delItemlog(_ids);
}).then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
}).catch(() => {});
}

/** 导出按钮操作 */
function handleExport() {
proxy.download('ItemLog/Itemlog/export', {
…queryParams.value
}, `Itemlog_${new Date().getTime()}.xlsx`)
}

getList();
</script>

        8.0 操作日志

相关源码:

<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item label="操作人员" prop="adminId">
<el-input
v-model="queryParams.adminId"
placeholder="请输入操作人员唯一标识"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>

<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['optionLog:log:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['optionLog:log:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['optionLog:log:remove']"
>删除</el-button>
</el-col>

<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>

<el-table v-loading="loading" :data="logList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="操作日志序号" type="index" width="130" align="center" prop="id" />
<!– <el-table-column label="操作信息" align="center" prop="msg" width="100" /> –>
<el-table-column label="操作信息" align="center" prop="msg" width="400">
<template #default="scope">
<el-tooltip :content="scope.row.msg" placement="top" :disabled="!scope.row.msg || scope.row.msg.length <= 10">
<span>{{ scope.row.msg }}</span>
</el-tooltip>
</template>
</el-table-column>
<el-table-column label="操作人员唯一标识" align="center" prop="adminId" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['optionLog:log:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['optionLog:log:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>

<pagination
v-show="total>0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>

<!– 添加或修改操作日志对话框 –>
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="logRef" :model="form" :rules="rules" label-width="80px">

<el-form-item label="操作人员" prop="adminId">
<el-input v-model="form.adminId" placeholder="请输入操作人员唯一标识" />
</el-form-item>

<el-form-item label="操作信息" prop="msg">
<el-input v-model="form.msg" placeholder="请输入操作信息" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template>

<script setup name="Log">
import { listLog, getLog, delLog, addLog, updateLog } from "@/api/optionLog/log";

const { proxy } = getCurrentInstance();

const logList = ref([]);
const open = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const title = ref("");

const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
adminId: null,
},
rules: {
msg: [
{ required: true, message: "操作信息不能为空", trigger: "blur" }
],
adminId: [
{ required: true, message: "操作人员id不能为空", trigger: "blur" }
],
}
});

const { queryParams, form, rules } = toRefs(data);

/** 查询操作日志列表 */
function getList() {
loading.value = true;
listLog(queryParams.value).then(response => {
logList.value = response.rows;
total.value = response.total;
loading.value = false;
});
}

// 取消按钮
function cancel() {
open.value = false;
reset();
}

// 表单重置
function reset() {
form.value = {
id: null,
msg: null,
adminId: null,
createTime: null
};
proxy.resetForm("logRef");
}

/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1;
getList();
}

/** 重置按钮操作 */
function resetQuery() {
proxy.resetForm("queryRef");
handleQuery();
}

// 多选框选中数据
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}

/** 新增按钮操作 */
function handleAdd() {
reset();
open.value = true;
title.value = "添加操作日志";
}

/** 修改按钮操作 */
function handleUpdate(row) {
reset();
const _id = row.id || ids.value
getLog(_id).then(response => {
form.value = response.data;
open.value = true;
title.value = "修改操作日志";
});
}

/** 提交按钮 */
function submitForm() {
proxy.$refs["logRef"].validate(valid => {
if (valid) {
if (form.value.id != null) {
updateLog(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功");
open.value = false;
getList();
});
} else {
addLog(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功");
open.value = false;
getList();
});
}
}
});
}

/** 删除按钮操作 */
function handleDelete(row) {
const _ids = row.id || ids.value;
proxy.$modal.confirm('是否确认删除操作日志编号为"' + _ids + '"的数据项?').then(function() {
return delLog(_ids);
}).then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
}).catch(() => {});
}

/** 导出按钮操作 */
function handleExport() {
proxy.download('optionLog/log/export', {
…queryParams.value
}, `log_${new Date().getTime()}.xlsx`)
}

getList();
</script>

        若需要项目完整源码,可以在 CSDN 私信给我或者直接+我名片,我每天都有查看消息的,感谢大家支持,希望可以帮助到大家!

赞(0)
未经允许不得转载:171主机测评 » Web 毕设篇-适合练手的 Spring Boot Web 毕业设计项目:智驿AI系统(前后端源码 + 数据库 sql 脚本)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址