零基础快速开发Vue图书管理系统—角色管理篇(五)

简介: 户管理页面前端结构部分

零基础快速开发Vue图书管理系统—角色管理篇(五)

一、用户管理页面前端结构部分

2345_image_file_copy_568.jpg

<template>
    <div>
        <a-card>
            <h2>用户管理</h2>
            <a-divider></a-divider>
            <a-button>添加用户</a-button>
            <a-divider></a-divider>
            <div>
                <a-table 
                bordered 
                :pagination="false"
                :columns ="columns"
                :data-source ="list"
                >
                <template #createdAt="{record}">
                    {{ formatTimestamp(record.meta.createdAt) }}
                </template>
                <template #actions="{record}">
                <a href="javascript;">重置密码</a>
               &nbsp;
                <a href="javascript;">删除</a>
                </template>
            </a-table>
            </div>
            <space-between1 style="margin-top:24px;">
                <a-pagination></a-pagination>
            </space-between1>
        </a-card>
    </div>
</template>
<script src="./index.js"></script>
<style lang="scss" scoped>
     @import './index.scss';
</style>
import { defineComponent, ref, onMounted } from 'vue';
import { user } from '@/service';
import { result, formatTimestamp } from '@/helpers/utils'
const columns = [{
    title: '账户',
    dataIndex: 'account'
}, {
    title: '创建日期',
    slots: { customRender: 'createdAt' }
}, {
    title: '操作',
    slots: { customRender: 'actions' }
}]
export default defineComponent({
    setup() {
        const list = ref([]);
        const total = ref(0);
        const curPage = ref(1);
        const getUser = async() => {
            const res = await user.list(curPage.value);
            result(res)
                .success(({ data: { list: refList, total: resTotal } }) => {
                    list.value = refList;
                    total.value = resTotal;
                });
        };
        onMounted(() => {
            getUser();
        })
        return {
            list,
            total,
            curPage,
            columns,
            formatTimestamp
        }
    },
});

2345_image_file_copy_569.jpg

二、删除接口实现

2345_image_file_copy_570.jpg

三、删除接口前端联调

2345_image_file_copy_571.jpg

  const remove = async({ _id }) => {
            const res = await user.remove(_id);
            result(res)
                .success(({ msg }) => {
                    message.success(msg);
                    getUser();
                })
        }

四、添加用户前端弹框实现

2345_image_file_copy_572.jpg

<template>
    <div>
        <a-card>
            <h2>用户管理</h2>
            <a-divider></a-divider>
            <a-button @click="showAddModal =true">添加用户</a-button>
            <a-divider></a-divider>
            <div>
                <a-table 
                 bordered 
                :pagination="false"
                :columns ="columns"
                :data-source ="list"
                >
                <template #createdAt="{record}">
                    {{ formatTimestamp(record.meta.createdAt) }}
                </template>
                <template #actions="{record}">
                <a href="javascript;">重置密码</a>
               &nbsp;
                <a href="javascript;" @click="remove(record)">删除</a>
                </template>
            </a-table>
            </div>
            <space-between1 style="margin-top:24px;">
                <a-pagination></a-pagination>
            </space-between1>
        </a-card>
        <add-one v-model:show="showAddModal"
         />
    </div>
</template>
<script src="./index.js"></script>
<style lang="scss" scoped>
     @import './index.scss';
</style>
import { defineComponent, ref, onMounted } from 'vue';
import { user } from '@/service';
import { result, formatTimestamp } from '@/helpers/utils'
import { message } from 'ant-design-vue'
import AddOne from './AddOne/index.vue'
const columns = [{
    title: '账户',
    dataIndex: 'account'
}, {
    title: '创建日期',
    slots: { customRender: 'createdAt' }
}, {
    title: '操作',
    slots: { customRender: 'actions' }
}]
export default defineComponent({
    components: {
        AddOne,
    },
    setup() {
        const list = ref([]);
        const total = ref(0);
        const curPage = ref(1);
        const showAddModal = ref(false);
        const getUser = async() => {
            const res = await user.list(curPage.value);
            result(res)
                .success(({ data: { list: refList, total: resTotal } }) => {
                    list.value = refList;
                    total.value = resTotal;
                });
        };
        onMounted(() => {
            getUser();
        })
        const remove = async({ _id }) => {
            const res = await user.remove(_id);
            result(res)
                .success(({ msg }) => {
                    message.success(msg);
                    getUser();
                })
        }
        return {
            list,
            total,
            curPage,
            columns,
            formatTimestamp,
            remove,
            showAddModal
        }
    },
});

五、添加用户接口实现

const Router = require('@koa/router');
const mongoose = require('mongoose');
// const { getBody } = require('../../helpers/utils')
const { v4: uuidv4 } = require('uuid');
const User = mongoose.model('User');
const router = new Router({
    prefix: '/user',
});
router.get('/list', async(ctx) => {
    let { page, size } = ctx.query;
    page = Number(page);
    size = Number(size);
    const list = await User
        .find()
        .skip((page - 1) * size)
        .limit(size)
        .exec();
    const total = await User.countDocuments().exec();
    ctx.body = {
        msg: '获取列表成功',
        data: {
            list,
            page,
            size,
            total,
        },
        code: 1,
    }
})
router.delete('/:id', async(ctx) => {
    const { id } = ctx.params;
    const delMsg = await User.deleteOne({
        _id: id,
    });
    ctx.body = {
        data: delMsg,
        code: 1,
        msg: '删除成功'
    }
})
router.post('/add', async(ctx) => {
    const { account, password = '123123' } =
    ctx.request.body;
    const user = new User({
        account,
        password,
    })
    const res = await user.save()
    ctx.body = {
        data: res,
        code: 1,
        msg: '添加成功'
    };
});
module.exports = router;

2345_image_file_copy_573.jpg

六、实现用户接口联调和分页效果实现

2345_image_file_copy_574.jpg

<template>
    <div>
        <a-card>
            <h2>用户管理</h2>
            <a-divider></a-divider>
            <a-button @click="showAddModal =true">添加用户</a-button>
            <a-divider></a-divider>
            <div>
                <a-table 
                 bordered 
                :pagination="false"
                :columns ="columns"
                :data-source ="list"
                >
                <template #createdAt="{record}">
                    {{ formatTimestamp(record.meta.createdAt) }}
                </template>
                <template #actions="{record}">
                <a href="javascript;">重置密码</a>
               &nbsp;
                <a href="javascript;" @click="remove(record)">删除</a>
                </template>
            </a-table>
            </div>
            <space-between1 style="margin-top:24px;">
                <a-pagination  
                v-model:current="curPage"
                :total="total"
                :page-size="3"
                @change="setPage"
                >
                </a-pagination>
            </space-between1>
        </a-card>
        <add-one 
        v-model:show="showAddModal"
        @getList="getUser"
         />
    </div>
</template>
<script src="./index.js"></script>
<style lang="scss" scoped>
     @import './index.scss';
</style>

2345_image_file_copy_575.jpg

七、重置密码接口实现

import { defineComponent, ref, onMounted } from 'vue';
import { user } from '@/service';
import { result, formatTimestamp } from '@/helpers/utils'
import { message } from 'ant-design-vue'
import AddOne from './AddOne/index.vue'
const columns = [{
    title: '账户',
    dataIndex: 'account'
}, {
    title: '创建日期',
    slots: { customRender: 'createdAt' }
}, {
    title: '操作',
    slots: { customRender: 'actions' }
}]
export default defineComponent({
    components: {
        AddOne,
    },
    setup() {
        const list = ref([]);
        const total = ref(0);
        const curPage = ref(1);
        const showAddModal = ref(false);
        const getUser = async() => {
            const res = await user.list(curPage.value, 3);
            result(res)
                .success(({ data: { list: refList, total: resTotal } }) => {
                    list.value = refList;
                    total.value = resTotal;
                });
        };
        onMounted(() => {
            getUser();
        })
        const remove = async({ _id }) => {
            const res = await user.remove(_id);
            result(res)
                .success(({ msg }) => {
                    message.success(msg);
                    getUser();
                });
        };
        const setPage = (page) => {
            curPage.value = page;
            getUser();
        };
        const resetPassword = async({ _id }) => {
            const res = await user.resetPassword(_id);
            result(res)
                .success(({ msg }) => {
                    message.success(msg)
                })
        }
        return {
            list,
            total,
            curPage,
            columns,
            formatTimestamp,
            remove,
            showAddModal,
            getUser,
            setPage,
            resetPassword
        }
    },
});

2345_image_file_copy_576.jpg

2345_image_file_copy_577.jpg

2345_image_file_copy_578.jpg

八、根据账户查找用户

2345_image_file_copy_579.jpg

2345_image_file_copy_580.jpg

2345_image_file_copy_581.jpg

2345_image_file_copy_582.jpg

import { defineComponent, ref, onMounted } from 'vue';
import { user } from '@/service';
import { result, formatTimestamp } from '@/helpers/utils'
import { message } from 'ant-design-vue'
import AddOne from './AddOne/index.vue'
const columns = [{
    title: '账户',
    dataIndex: 'account'
}, {
    title: '创建日期',
    slots: { customRender: 'createdAt' }
}, {
    title: '操作',
    slots: { customRender: 'actions' }
}]
export default defineComponent({
    components: {
        AddOne,
    },
    setup() {
        const list = ref([]);
        const total = ref(0);
        const curPage = ref(1);
        const showAddModal = ref(false);
        const keyword = ref('');
        const isSearch = ref(false);
        const getUser = async() => {
            const res = await user.list(curPage.value, 3, keyword.value);
            result(res)
                .success(({ data: { list: refList, total: resTotal } }) => {
                    list.value = refList;
                    total.value = resTotal;
                });
        };
        onMounted(() => {
            getUser();
        })
        const remove = async({ _id }) => {
            const res = await user.remove(_id);
            result(res)
                .success(({ msg }) => {
                    message.success(msg);
                    getUser();
                });
        };
        const setPage = (page) => {
            curPage.value = page;
            getUser();
        };
        const resetPassword = async({ _id }) => {
            const res = await user.resetPassword(_id);
            result(res)
                .success(({ msg }) => {
                    message.success(msg)
                })
        };
        const onSearch = () => {
            getUser();
            isSearch.value = !!keyword.value;
        };
        const backAll = () => {
            isSearch.value = false;
            keyword.value = '';
            getUser();
        };
        return {
            list,
            total,
            curPage,
            columns,
            formatTimestamp,
            remove,
            showAddModal,
            getUser,
            setPage,
            resetPassword,
            keyword,
            isSearch,
            onSearch,
            backAll
        }
    },
});


相关文章
|
3天前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发
|
3天前
|
存储 JavaScript
Vue 状态管理工具vuex
Vue 状态管理工具vuex
|
9天前
|
JavaScript
如何在 Vue 中使用具名插槽
【10月更文挑战第25天】通过使用具名插槽,你可以更好地组织和定制组件的模板结构,使组件更具灵活性和可复用性。同时,具名插槽也有助于提高代码的可读性和可维护性。
13 2
|
9天前
|
JavaScript
Vue 中的插槽
【10月更文挑战第25天】插槽的使用可以大大提高组件的复用性和灵活性,使你能够根据具体需求在组件中插入不同的内容,同时保持组件的结构和样式的一致性。
12 2
|
9天前
|
前端开发 JavaScript 容器
在 vite+vue 中使用@originjs/vite-plugin-federation 模块联邦
【10月更文挑战第25天】模块联邦是一种强大的技术,它允许将不同的微前端模块组合在一起,形成一个统一的应用。在 vite+vue 项目中,使用@originjs/vite-plugin-federation 模块联邦可以实现高效的模块共享和组合。通过本文的介绍,相信你已经了解了如何在 vite+vue 项目中使用@originjs/vite-plugin-federation 模块联邦,包括安装、配置和使用等方面。在实际开发中,你可以根据自己的需求和项目的特点,灵活地使用模块联邦,提高项目的可维护性和扩展性。
|
存储 前端开发 JavaScript
为什么我不再用Vue,改用React?
当我走进现代前端开发行业的时候,我做了一个每位开发人员都要做的决策:选择一个合适的框架。当时正逢 jQuery 被淘汰,前端开发者们不再用它编写难看的、非结构化的老式 JavaScript 程序了。
|
10天前
|
数据采集 监控 JavaScript
在 Vue 项目中使用预渲染技术
【10月更文挑战第23天】在 Vue 项目中使用预渲染技术是提升 SEO 效果的有效途径之一。通过选择合适的预渲染工具,正确配置和运行预渲染操作,结合其他 SEO 策略,可以实现更好的搜索引擎优化效果。同时,需要不断地监控和优化预渲染效果,以适应不断变化的搜索引擎环境和用户需求。
|
10天前
|
缓存 JavaScript 搜索推荐
Vue SSR(服务端渲染)预渲染的工作原理
【10月更文挑战第23天】Vue SSR 预渲染通过一系列复杂的步骤和机制,实现了在服务器端生成静态 HTML 页面的目标。它为提升 Vue 应用的性能、SEO 效果以及用户体验提供了有力的支持。随着技术的不断发展,Vue SSR 预渲染技术也将不断完善和创新,以适应不断变化的互联网环境和用户需求。
29 9
|
9天前
|
缓存 JavaScript UED
Vue 中实现组件的懒加载
【10月更文挑战第23天】组件的懒加载是 Vue 应用中提高性能的重要手段之一。通过合理运用动态导入、路由配置等方式,可以实现组件的按需加载,减少资源浪费,提高应用的响应速度和用户体验。在实际应用中,需要根据具体情况选择合适的懒加载方式,并结合性能优化的其他措施,以打造更高效、更优质的 Vue 应用。
|
9天前
|
JavaScript 前端开发 UED
vue 提高 tree shaking 的效果
【10月更文挑战第23天】提高 Vue 中 Tree shaking 的效果需要综合考虑多个因素,包括模块的导出和引用方式、打包工具配置、代码结构等。通过不断地优化和调整,可以最大限度地发挥 Tree shaking 的优势,为 Vue 项目带来更好的性能和用户体验。