wip: 临时提交

This commit is contained in:
ray
2025-05-28 08:21:01 +08:00
parent 54ab9f6f44
commit b2333e8b70
58 changed files with 5078 additions and 4337 deletions

View File

@@ -1,324 +0,0 @@
<template>
<view class="work">
<!-- 筛选 -->
<wd-drop-menu close-on-click-modal class="mb-20rpx mr-20rpx ml-20rpx">
<wd-drop-menu-item ref="dropMenu" title="筛选" icon="filter" icon-size="18px">
<view>
<wd-input
v-model="queryParams.keywords"
label="关键字"
type="text"
clearable
placeholder="请输入关键字"
/>
<view class="flex flex-row items-center mb-20rpx">
<wd-button class="mt-20rpx mb-20rpx" size="medium" @click="handleQuery()">
查询
</wd-button>
<wd-button size="medium" type="info" @click="handleReset">重置</wd-button>
</view>
</view>
</wd-drop-menu-item>
</wd-drop-menu>
<view class="data-container">
<!-- 列表内容 -->
<view v-for="(item, index) in pageData" :key="index" class="mb-20rpx">
<wd-card>
<template #title>
<view class="flex items-center justify-between">
<view class="flex-1 text-truncate">{{ item.configName }}</view>
</view>
</template>
<wd-cell-group>
<wd-cell title="配置键" :value="item.configKey" />
<wd-cell title="配置值" :value="item.configValue" />
<wd-cell title="备注" :value="item.remark" />
</wd-cell-group>
<template #footer>
<wd-button size="small" plain type="primary" @click="handleAction(item)">
操作
</wd-button>
</template>
</wd-card>
</view>
</view>
<!-- 加载更多 -->
<wd-loadmore :state="state" @reload="handleQuery" />
<!-- 底部按钮 -->
<view class="fixed bottom-0 w-full flex justify-around items-center p-20rpx bg-#fff">
<wd-button size="medium" type="primary" @click="handleOpenDialog">添加</wd-button>
<wd-button size="medium" type="success" @click="refreshCache">刷新缓存</wd-button>
</view>
<wd-popup v-model="showEditPopup" position="bottom">
<view class="p-20rpx">
<wd-form ref="formRef" :model="form">
<wd-input
v-model="form.configName"
label="配置名称"
type="text"
placeholder="请输入配置名称"
:rules="[{ required: true, message: '请填写配置名称' }]"
/>
<wd-input
v-model="form.configKey"
label="配置键名"
type="text"
placeholder="请输入配置键名"
:rules="[{ required: true, message: '请填写配置键' }]"
/>
<wd-input
v-model="form.configValue"
label="配置键值"
type="text"
placeholder="请输入配置键值"
:rules="[{ required: true, message: '请填写配置值' }]"
/>
<wd-textarea
v-model="form.remark"
prop="remark"
label="配置描述"
label-align="right"
clearable
:maxlength="100"
show-word-limit
label-width="100px"
placeholder="请输入配置描述"
/>
</wd-form>
<view class="flex justify-around mt-20rpx">
<wd-button @click="showEditPopup = false">取消</wd-button>
<wd-button type="primary" native-type="submit" :loading="loading" @click="submitForm">
确定
</wd-button>
</view>
</view>
</wd-popup>
</view>
</template>
<script lang="ts" setup>
import ConfigAPI, { ConfigPageVO, ConfigForm, ConfigPageQuery } from "@/api/system/config";
import { DropMenuItemExpose } from "wot-design-uni/components/wd-drop-menu-item/types";
import { LoadMoreState } from "wot-design-uni/components/wd-loadmore/types";
import { FormInstance } from "wot-design-uni/components/wd-form/types";
import { debounce } from "@/utils";
const state = ref<LoadMoreState>("loading"); // 加载状态 loading, finished:, error
const total = ref(0);
const queryParams = reactive<ConfigPageQuery>({
pageNum: 1,
pageSize: 10,
keywords: "",
});
// 系统配置表格数据
const pageData = ref<ConfigPageVO[]>([]);
const formRef = ref<FormInstance>();
const loading = ref(false);
/**
* 搜索栏
*/
const dropMenu = ref<DropMenuItemExpose>();
/**
* 搜索
*/
function handleQuery() {
pageData.value = [];
dropMenu.value?.close();
queryParams.pageNum = 1;
loadmore();
}
const showEditPopup = ref(false);
const form = ref<ConfigForm>({});
// 修改编辑函数
function handleEdit(id: number) {
ConfigAPI.getFormData(id).then((data) => {
Object.assign(form.value, data);
// 显示弹窗
showEditPopup.value = true;
});
}
// 提交表单
async function submitForm() {
loading.value = true;
try {
if (formRef.value) {
formRef.value!.validate().then(async ({ valid }) => {
if (valid) {
if (form.value.id) {
await ConfigAPI.update(form.value.id, form.value);
uni.showToast({ title: "更新成功", icon: "success" });
} else {
await ConfigAPI.add(form.value);
uni.showToast({ title: "添加成功", icon: "success" });
}
showEditPopup.value = false;
handleQuery(); // 刷新列表
} else {
uni.showToast({ title: "请检查表单", icon: "error" });
loading.value = false;
}
});
}
} catch {
uni.showToast({ title: "操作失败", icon: "error" });
loading.value = false;
} finally {
loading.value = false;
}
}
/**
* 重置搜索条件
*/
function handleReset() {
queryParams.pageNum = 1;
queryParams.keywords = "";
pageData.value = [];
dropMenu.value?.close();
handleQuery();
}
/**
* 触底事件
*/
onReachBottom(() => {
queryParams.pageNum++;
handleQuery();
});
/**
* 加载更多
*/
function loadmore() {
state.value = "loading";
ConfigAPI.getPage(queryParams)
.then((data) => {
if (queryParams.pageNum === 1) {
pageData.value = data.list;
} else {
pageData.value.push(...data.list);
}
total.value = data.total;
})
.finally(() => {
state.value = "finished";
});
}
/**
* 添加
*/
function handleOpenDialog() {
form.value.id = undefined;
form.value.configName = "";
form.value.configKey = "";
form.value.configValue = "";
form.value.remark = "";
showEditPopup.value = true;
}
/**
* 刷新缓存
*/
const refreshCache = debounce(() => {
ConfigAPI.refreshCache().then(() => {
uni.showToast({
title: "刷新缓存成功",
icon: "success",
duration: 1000, // 显示时间,单位为毫秒,设置为 0 则不会自动消失
});
});
}, 1000);
/**
* 删除
*/
function handleDelete(item: ConfigPageVO) {
uni.showModal({
title: "提示",
content: "确定要删除该配置吗?",
success: async (res) => {
if (res.confirm) {
if (item.id) {
ConfigAPI.deleteById(item.id).then(() => {
uni.showToast({ title: "删除成功", icon: "success" });
});
}
}
},
});
}
/**
* 操作
*/
function handleAction(item: ConfigPageVO) {
const actions = ["编辑", "删除"];
uni.showActionSheet({
itemList: actions,
success: ({ tapIndex }) => {
switch (actions[tapIndex]) {
case "编辑":
handleEdit(item.id || 0);
break;
case "删除":
handleDelete(item);
break;
}
},
});
}
onMounted(() => {
handleQuery();
});
/**
* 页面返回回来也要重新加载数据
*/
onLoad(() => {
queryParams.pageNum = 1;
handleQuery();
});
</script>
<style lang="scss" scoped>
.data-container {
:deep(.wd-cell__wrapper) {
padding: 4rpx 0;
}
:deep(.wd-cell) {
padding-right: 10rpx;
background: #f8f8f8;
}
:deep(.wd-fab__trigger) {
width: 80rpx !important;
height: 80rpx !important;
}
:deep(.wd-cell__right) {
flex: 2;
}
.filter-container {
padding: 10rpx;
background: #fff;
}
.data-container {
margin-top: 20rpx;
}
}
</style>