Skip to content

ts

ts
import { userApi } from "@/api/user/user";
import {ref,reactive} from 'vue';
import cloneDeep from 'lodash/cloneDeep';
import { ElMessageBox ,ElMessage} from "element-plus";


export function index(){
    /**
     * 空表单
     */
    const EmptyFrom:userType = {
        id: 0,
        name: "",
        password: "",
        iStatus: 3,
        memo: "",
        create_time: "", 
    }
    const FormData  = ref<userType>()
    /**
     * 弹窗标题
     */
    const DialogTitle = ref("");

    /**
     * 表格数据
     */
    const TableData = ref<userType[]>()

    /**
     * 搜索框form表单
     */
    const SearchData = ref<userType>(cloneDeep(EmptyFrom));

    /**
     * 分页查询数据载体
     */
    const PaginationData = ref({ PageNum: 1, PageSize: 10 });
    
    /**
     * 列表总数
     */
    const Total = ref(0);

    /**
     * 弹窗标识 false关闭,true打开
     */
    const DialogViewFlag = ref(false);
    
    /**
     * 弹窗数据
     */
    const DialogFormData = ref<userType>(cloneDeep(EmptyFrom));


    /**
     * 获取列表数据
     */
    const FunGetList = async()=>{
        try{

            const request = await userApi.getList({Pagination:PaginationData.value,data:SearchData.value}); 
            PaginationData.value  = {
                PageNum: request.data.pageNum,
                PageSize: request.data.pageSize
            };
            TableData.value = request.data.items
            Total.value = request.data.total
        }catch(error){ 
        }
    }


    /**
     * 获取列表数据,(用来测试的)
     */
    const FunGetListText = async()=>{
        try{
            const request = await userApi.getList({Pagination:PaginationData.value,data:EmptyFrom}); 
            console.log("request:",request);     
            PaginationData.value  = cloneDeep({
                PageNum: request.data.pageNum,
                PageSize: request.data.pageSize
            }) as any
            TableData.value = request.data.items
            Total.value = request.data.total
        }catch(error){ 
        }
    }


    /**
     * 打开弹窗,通过id获取每条记录
     * @param Param 每条记录的id
     */
    const FunOpenDialog = (Param:any) =>{
        
        DialogViewFlag.value = true;
        DialogFormData.value = cloneDeep(Param);   
        if(Param.id == 0){
            DialogTitle.value = "新增用户"
            DialogFormData.value.create_time = getCurrentTime()
        }else{
            DialogTitle.value = "编辑用户" 
        }
    } 


    /**
     * 关闭弹窗
     */
    const FunCloseDialog = ()=>{
        DialogViewFlag.value = false;
        DialogFormData.value = cloneDeep(EmptyFrom);
    }   


    /**
     * 弹窗表单的提交,id为0是新增,id为其他是修改
     */
    const FunSubmit = async()=>{

        // console.log("弹窗表单数据",DialogFormData.value);
        try{
            if(DialogFormData.value?.id == 0){
                await userApi.add(DialogFormData.value);
            }else{
                await userApi.Edit(DialogFormData.value);
            }
            DialogViewFlag.value = false;
            FunGetList();
            ElMessage.success("成功操作");
        }catch(error){}
    }


    /**
     * 每条的删除按钮
     * @param Param scope.row,每条记录的信息
     */
    const FunDelete = async(Param:any)=>{
        try{
            await userApi.del(Param); 
            FunGetList();
        } catch(error){}
    }


    /**
     * 监听页码变化
     * @param val 输入页码
     */
    // 监听页码变化
    const FunhandleCurrentChange = async(val: number) => { 
        PaginationData.value = { PageNum: val, PageSize: PaginationData.value.PageSize } 
        // Pagination.value.PageNum = val;
        await FunGetList();
    };

    /**
     * 
     * @param val 输入的每页大小
     * 监听每页条数变化
     */ 
    const FunhandleSizeChange = async(val: number) => { 
        PaginationData.value = { PageNum: PaginationData.value.PageNum, PageSize: val } 
        // Pagination.value.PageSize = val;
        await FunGetList();
    };


    /**
     * 重置搜索框数据
     */
    const FunReSetSearchData = ()=>{
        SearchData.value = cloneDeep(EmptyFrom) 
    }
     

    /**
     * 重置弹窗表单数据
     */
    const FunReSetDialogFormData = ()=>{
        DialogFormData.value = cloneDeep(EmptyFrom) 
    }

    /**
     * 获取当前时间 yyyy-mm-ddThh:MM:ss
     * @returns 
     */
    function getCurrentTime(): string {
        const now = new Date()
        const pad = (n: number, len: number = 2) => String(n).padStart(len, '0')
        const year = now.getFullYear()
        const month = pad(now.getMonth() + 1)
        const day = pad(now.getDate())
        const hours12 = pad(now.getHours() % 12 || 12) // 12小时制
        const minutes = pad(now.getMinutes())
        const seconds = pad(now.getSeconds())
        const milliseconds = pad(now.getMilliseconds(), 3)

        return `${year}-${month}-${day}T${hours12}:${minutes}:${seconds}.${milliseconds}`
    }
    return {
        TableData,
        SearchData,
        PaginationData,
        DialogTitle,
        Total,
        DialogViewFlag,
        DialogFormData,
        EmptyFrom,

        FunGetList,
        FunOpenDialog,
        FunSubmit, 
        FunGetListText,
        FunhandleSizeChange,
        FunhandleCurrentChange,
        FunReSetSearchData,
        FunCloseDialog,
        FunReSetDialogFormData,
        FunDelete,
    }
}

export interface userType {
    id: number;
    name: string;
    password: string;
    iStatus: number;
    memo: string;
    create_time: string;
}
export interface paginationType {
    PageNum:number;
    PageSize:number;
} 
export interface SearchDataType {
    Pagination:paginationType;
    list:userType;
}

vue

vue
<template>
    <!--搜索框-->
    <el-row>

        <el-col>
            <el-card style=""  shadow="never">
                <el-form inline="true" :model="SearchData" >
                    <el-form-item label="名字">
                        <el-input v-model="SearchData.name" />
                    </el-form-item> 
                    <el-form-item label="状态">   
                        <el-select v-model="SearchData.iStatus" placeholder="请选择" width="100" style="width:200px">
                            <el-option label="禁用" :value="0" />
                            <el-option label="启用" :value="1" />
                            <el-option label="请选择" :value="3"  ></el-option>
                        </el-select>
                    </el-form-item>
                    <el-form-item label="备注">
                        <el-input v-model="SearchData.memo" />
                    </el-form-item>
                    <el-form-item >
                        <el-button type="plain" @click="FunReSetSearchData">重置</el-button>
                        <el-button type="primary" @click="FunGetList">搜索</el-button> 
                    </el-form-item>
                </el-form> 
            </el-card>
        </el-col>
    </el-row>
    <!--中间按钮-->
    <el-row> 
        <el-col>
            <el-button type="primary" @click="FunGetListText">获取数据</el-button>
            <el-button type="primary" @click="FunOpenDialog(EmptyFrom)">新增</el-button>
        </el-col>
    </el-row>
    <!--表格-->
    <el-row>
        <el-col :span="24"> 
            <el-table :data="TableData" border  style="width: 100%;max-height: 400px;"   height="400px"  >
                <el-table-column fixed="left"    label="名字" prop="name"  width="200"  align="center" />  
                <el-table-column   label="密码" prop="password" width="200"   align="center"/> 
                <el-table-column   label="状态" prop="iStatus" width="200"   align="center">
                 <template #default="scope" >
                        <template v-if="scope.row.iStatus ==1"><el-text class="mx-1" type="success">启用</el-text></template>
                        <template v-else  > <el-text class="mx-1" type="info">禁用</el-text></template>
                    </template>
                </el-table-column>
                <el-table-column   label="备注" prop="memo"  min-width="180"  align="center" show-overflow-tooltip />
                <el-table-column   label="创建时间" prop="create_time"  width="200"   align="center">
                    <template #default="scope"
                    >
                        {{ scope.row.create_time.split("T")[0] }}  &nbsp; &nbsp; {{ scope.row.create_time.split("T")[1] }}
                    </template>
                </el-table-column> 
                <el-table-column label="操作"  align="center" fixed="right" width="180" > 
                    <template #default="scope">
                        <div style="display: flex;justify-content: center;width: 100%;  gap: 8px;"> 
                        <el-button @click="FunOpenDialog(scope.row)" type="success" size="small">编辑</el-button> 
                            <el-popconfirm 
                            confirm-button-text="是"
                            confirm-button-type="warning"
                            cancel-button-text="否"
                            :title="`你确定要删除用户 ${scope.row.name} 吗?`"
                            placement="top-end"
                            @confirm="FunDelete(scope.row)"
                        >
                            <template #reference>
                                <el-button type="danger" size="small">删除</el-button>  
                            </template>
                        </el-popconfirm>
                        </div>
                    </template>
                </el-table-column>
            </el-table>
        </el-col> 
    </el-row>
    <!--分页-->
    <el-row>
        <el-col>
                <el-pagination
                     :current-page=" PaginationData.PageNum"
                     :page-size="PaginationData.PageSize"
                    :page-sizes="[1,2,3,4,5,6,7,8,9,10, 20, 50, 100]"
                    :total="Total"
                    layout="total, sizes, prev, pager, next, jumper"
                    @size-change="FunhandleSizeChange"
                    @current-change="FunhandleCurrentChange"
                    style="margin-top: 20px; justify-content: flex-end;"
                />
        </el-col>
    </el-row>
    <!--弹窗-->
    <el-row>
        <el-col>
            <el-dialog
                v-model="DialogViewFlag"
                :title="DialogTitle"
                width="700"
                :close-on-click-modal="false"
                
            >
                 <el-form   :model="DialogFormData" label-width="auto"   label-position="right" >
                    <el-form-item label="名字">
                        <el-input v-model="DialogFormData.name" />
                    </el-form-item> 
                    <el-form-item label="密码">
                        <el-input v-model="DialogFormData.password" />
                    </el-form-item> 
                    <el-form-item label="状态">   
                        <el-select v-model="DialogFormData.iStatus" placeholder="请选择" width="100" style="width:200px">
                            <el-option label="禁用" :value="0" />
                            <el-option label="启用" :value="1" />
                            <el-option label="请选择" :value="3"  ></el-option>
                        </el-select>
                    </el-form-item>
                    <el-form-item label="创建时间"> 
                          <el-date-picker
                        v-model="DialogFormData.create_time"
                        type="datetime"
                        placeholder="创建时间"
                        format="YYYY/MM/DD HH:mm:ss"
                        value-format="YYYY-MM-DDTHH:mm:ss" 
                        readonly
                    />
                    </el-form-item> 
                    <el-form-item label="备注">
                        <el-input v-model="DialogFormData.memo" />
                    </el-form-item> 
                </el-form>  
                  <template #footer>
                    <div class="dialog-footer">
                        <el-button @click="FunCloseDialog">取消</el-button>
                        <el-button @click="FunReSetDialogFormData"  v-if="DialogFormData.id == 0" >重置</el-button>
                        <el-button type="primary" @click="FunSubmit">
                        提交
                        </el-button>
                    </div>
                    </template>
            </el-dialog>
        </el-col>
    </el-row>
</template>
<script lang="ts" setup>
import {index} from '@/views/UserOneVue/index.ts';
import Dialog from '../User/components/Dialog.vue';
import { onMounted } from 'vue';
const {
        TableData,
        SearchData,
        PaginationData,
        Total,
        DialogViewFlag,
        DialogFormData,
        EmptyFrom,
        DialogTitle,

        FunGetList,
        FunOpenDialog,
        FunCloseDialog,
        FunReSetSearchData,
        FunSubmit, 
        FunDelete,
        FunGetListText,
        FunhandleCurrentChange,
        FunhandleSizeChange,
        FunReSetDialogFormData,
    }=index();
onMounted(()=>{
    FunGetList();
})
</script>