第四章:Vue组件模板文件

  • 第一步:导航模板,在menu-list.js文件中添加一栏,注意id不能与以往的冲突。
{
        id: '1',
        name: '用户管理',
        icon: 'el-icon-document-remove',
        info: '标准版的CRUD',
        childList: [
            {id: '1-1', name: '新增用户', icon: 'el-icon-plus', url: 'sa-view/users/users-add.vue'},
            {id: '1-2', name: '修改用户', icon: 'el-icon-edit', url: 'sa-view/users/users-edit.vue'},
            {id: '1-3', name: '用户列表', icon: 'el-icon-document-remove', url: 'sa-view/users/users-list.vue'},
            {id: '1-4', name: '用户统计', icon: 'el-icon-pie-chart', url: 'sa-view/users/users-chart.vue'},
        ]
    },
  • 第二步:【新增】模板users-add.vue
<template>
    <div class="vue-box" style="display: none;" :style="'display: block;'">
        <!-- 参数栏 -->
        <div class="c-panel">
            <div class="c-title">用户添加</div>
            <el-form v-if="m">
                <div class="c-item br">
                    <label class="c-label">昵称:</label>
                    <el-input size="mini" v-model="m.username"></el-input>
                </div>
                <div class="c-item br">
                    <label class="c-label">密码:</label>
                    <el-input size="mini" v-model="m.password"></el-input>
                </div>
                <div class="c-item br">
                    <label class="c-label">手机:</label>
                    <el-input size="mini" v-model="m.phone"></el-input>
                </div>
                <div class="c-item br">
                    <label class="c-label">角色:</label>
                    <el-select size="mini" v-model="m.role_id">
                        <el-option label="管理员" :value="1"></el-option>
                        <el-option label="公告管理员" :value="2"></el-option>
                        <el-option label="普通用户" :value="3"></el-option>
                    </el-select>
                </div>
                <div class="c-item br">
                    <label class="c-label">性别:</label>
                    <el-radio-group size="mini" v-model="m.sex" size="mini">
                        <el-radio :label="1">男</el-radio>
                        <el-radio :label="2">女</el-radio>
                    </el-radio-group>
                </div>
                <div class="c-item br">
                    <label class="c-label"></label>
                    <el-button size="mini" type="primary" icon="el-icon-plus" size="mini" @click="ok">确定</el-button>
                </div>
            </el-form>
        </div>
    </div>
</template>
<script>
    //这里要使用module.exports,而不是export default
    module.exports = {
        components: {
            //无论是在html还是vue组件中,引入子组件都要使用httpVueLoader的形式。
            "sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),
        },
        //这里要使用函数的方式,而不是JSON
        data: function () {
            return {
                m:{
                    username:"",
                    password:"",
                    phone:"",
                    role_id:"",
                    sex:"",
                }
            }
        },
        methods: {
            ok: function () {
                sa.alert(JSON.stringify(this.m))
            }
        }
    }
</script>

<style scoped>

</style>

第三步:【列表】模板users-list.vue

<template>
    <div class="vue-box" style="display: none;" :style="'display: block;'">
        <div class="c-panel">
            <!-- ------------- 检索参数 ------------- -->
            <div class="c-title">用户列表</div>
            <el-form>
                <div class="c-item">
                    <label class="c-label">用户昵称:</label>
                    <el-input size="mini" v-model="p.username" placeholder="模糊查询"></el-input>
                </div>
                <div class="c-item">
                    <label class="c-label">注册日期:</label>
                    <el-date-picker size="mini" v-model="p.start_time" type="date" value-format="yyyy-MM-dd"
                                    placeholder="开始日期"></el-date-picker>
                    -
                    <el-date-picker size="mini" v-model="p.end_time" type="date" value-format="yyyy-MM-dd"
                                    placeholder="结束日期"></el-date-picker>
                </div>
                <div class="c-item" style="min-width: 0px;">
                    <el-button size="mini" type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询
                    </el-button>
                </div>
                <br/>
                <!-- ------------- 排序参数 ------------- -->
                <div class="c-item s-radio-text">
                    <label class="c-label">综合排序:</label>
                    <el-radio-group size="mini" v-model="p.sortType">
                        <el-radio :label="1">注册时间</el-radio>
                        <el-radio :label="2">最近登录</el-radio>
                        <el-radio :label="3">登陆次数</el-radio>
                        <el-radio :label="4">最近签到</el-radio>
                        <el-radio :label="5">签到次数</el-radio>
                    </el-radio-group>
                </div>
            </el-form>
            <!-- ------------- 快捷按钮 ------------- -->
            <div class="fast-btn">
                <el-button size="mini" type="primary" icon="el-icon-plus" @click="add()">新增</el-button>
                <el-button size="mini" type="success" icon="el-icon-view" @click="getBySelect()">查看</el-button>
                <el-button size="mini" type="danger" icon="el-icon-delete" @click="deleteByIds()">删除</el-button>
                <el-button size="mini" type="warning" icon="el-icon-download" @click="sa.exportExcel()">导出</el-button>
                <el-button size="mini" type="info" icon="el-icon-refresh" @click="sa.f5()">重置</el-button>
            </div>
            <!-- ------------- 数据列表 ------------- -->
            <el-table class="data-table" ref="data-table" :data="dataList" size="small">
                <el-table-column type="selection" width="45px"></el-table-column>
                <el-table-column label="编号" prop="id" width="80px"></el-table-column>
                <el-table-column label="昵称" prop="username" width="220px">
                    <template slot-scope="s">
                        <img :src="s.row.avatar" @click="sa.showImage(s.row.avatar, '400px', '400px')"
                             style="width: 3em; height: 3em; float: left; margin-right: 1em; border-radius: 50%; cursor: pointer;">
                        <div style="float: left; width: 130px; line-height: 20px;">
                            <b>{{s.row.username}}</b>
                            <p>{{s.row.tell}}</p>
                        </div>
                    </template>
                </el-table-column>
                <el-table-column label="个人相册">
                    <template slot-scope="s">
                        <img :src="s.row.photo_list[0]" style="width: 40px; height: 40px; cursor: pointer;"
                             @click="sa.showImageList(s.row.photo_list)">
                        共{{s.row.photo_list.length}}张, 点击预览
                    </template>
                </el-table-column>
                <el-table-column label="性别" prop="sex"></el-table-column>
                <el-table-column label="注册方式" prop="create_type"></el-table-column>
                <el-table-column label="注册于" prop="create_time"></el-table-column>
                <el-table-column label="状态">
                    <template slot-scope="s">
                        <el-switch v-model="s.row.status" :active-value="1" :inactive-value="2"
                                   inactive-color="#ff4949"></el-switch>
                        <b style="color: green;" v-if="s.row.status == 1">正常</b>
                        <b style="color: red;" v-if="s.row.status == 2">禁用</b>
                    </template>
                </el-table-column>
                <el-table-column prop="address" label="操作">
                    <template slot-scope="s">
                        <el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">详情</el-button>
                        <el-button class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
                    </template>
                </el-table-column>
            </el-table>
            <!-- ------------- 分页 ------------- -->
            <div class="page-box">
                <el-pagination background
                               layout="total, prev, pager, next, sizes, jumper"
                               :current-page.sync="p.pageNo"
                               :page-size.sync="p.pageSize"
                               :total="dataCount"
                               :page-sizes="[1, 10, 20, 30, 40, 50, 100]"
                               @current-change="f5(true)"
                               @size-change="f5(true)">
                </el-pagination>
            </div>
        </div>
    </div>
</template>
<script>
    //这里要使用module.exports,而不是export default
    module.exports = {
        components: {
            //无论是在html还是vue组件中,引入子组件都要使用httpVueLoader的形式。
            "sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),
        },
        //这里要使用函数的方式,而不是JSON
        data: function () {
            return {
                p: {	// 查询参数
                    username: '',
                    create_type: 0,
                    sortType: 1,
                    start_time: new Date().getFullYear() + '-' + (new Date().getMonth() + 1) + '-1',	// 本月一号
                    end_time: new Date().getFullYear() + '-' + (new Date().getMonth() + 1) + '-' + new Date().getDate(),	// 本月当日
                    pageNo: 1,
                    pageSize: 10,
                },
                dataCount: 1422,
                dataList: []
            }
        },
        methods: {
            // 数据刷新
            f5: function () {
                //这里发送ajax请求获取数据进行填充 TODO
                this.dataList = [{
                    "id": 12001,
                    "username": "省长",
                    "avatar": "https://color-test.oss-cn-qingdao.aliyuncs.com/dyc/img/default_head/2.png?x-oss-process=style/yasuo",
                    "tell": '这人懒,啥也没有留下',
                    "sex": "男",
                    "photo_list": [
                        "http://color-test.oss-cn-qingdao.aliyuncs.com/dyc/img/2019/02/02/1549112799839261454077.jpeg?x-oss-process=style/yasuo"
                    ],
                    "create_type": "账号注册",
                    "create_time": "2019-02-09 20:22:00",
                    "status": 1
                }];	// 数据
                this.dataCount = 1000;		// 分页
                sa.f5TableHeight();		// 刷新表格高度
            },
            //详情
            get: function (data) {
                sa.alert(JSON.stringify(data))
            },
            // 删除
            del: function (data) {
                sa.confirm('是否删除,此操作不可撤销', function () {
                    //发送ajax请求 TODO
                    sa.ok('删除成功');
                    sa.f5TableHeight();		// 刷新表格高度
                }.bind(this));
            },

            //新增
            add: function (data) {
                //跳转到指定菜单
                this.sa_admin.showMenuById("1-1")
            },
            //查看-根据选中的
            getBySelect: function (data) {
                var selection = this.$refs['data-table'].selection;
                if (selection.length === 0) {
                    return sa.msg('请选择一条数据')
                }
                sa.alert(JSON.stringify(selection[0]))
            },
            // 批量删除
            deleteByIds: function() {
                // 获取选中元素的id列表
                let selection = this.$refs['data-table'].selection;
                let ids = sa.getArrayField(selection, 'id');
                if(selection.length == 0) {
                    return sa.msg('请至少选择一条数据')
                }
                // 提交删除
                sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
                    //发送ajax请求删除:参数{ids: ids.join(',')}  TODO
                        sa.ok('删除成功');
                        sa.f5TableHeight();		// 刷新表格高度
                }.bind(this));
            },
        },
        created: function () {
            this.f5();
            sa.onInputEnter();//监听输入框的回车事件,执行查询
        }
    }
</script>

<style scoped>

</style>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要实现Vue中的Word模板在线预览本地文件,可以借助于第三方库`docxtemplater`和`jszip`。具体步骤如下: 1. 安装`docxtemplater`和`jszip`库: ```bash npm install docxtemplater jszip --save ``` 2. 在Vue组件中引入这两个库: ```javascript import Docxtemplater from 'docxtemplater'; import JSZip from 'jszip'; ``` 3. 在Vue组件中添加一个文件上传的input框和一个用于显示Word文档内容的div: ```html <template> <div> <input type="file" ref="fileInput" @change="onFileChange"> <div ref="wordContent"></div> </div> </template> ``` 4. 在Vue组件的methods中编写处理文件上传和Word模板预览的方法: ```javascript methods: { onFileChange() { const file = this.$refs.fileInput.files[0]; const reader = new FileReader(); reader.onload = () => { this.previewWord(reader.result); }; reader.readAsArrayBuffer(file); }, previewWord(data) { JSZip.loadAsync(data).then((zip) => { const doc = new Docxtemplater().loadZip(zip); const result = doc.getZip().generate({type: 'blob'}); const wordContent = this.$refs.wordContent; wordContent.innerHTML = ''; const fileReader = new FileReader(); fileReader.onloadend = () => { const content = fileReader.result; const iframe = document.createElement('iframe'); iframe.src = `data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,${btoa(content)}`; iframe.width = '100%'; iframe.height = '800px'; wordContent.appendChild(iframe); }; fileReader.readAsBinaryString(result); }); }, } ``` 这段代码的作用是: - 当用户选择文件后,将文件读取为二进制数组,并调用`previewWord`方法进行预览。 - 在`previewWord`方法中,使用`JSZip`将Word文档的二进制数组解压缩,然后使用`docxtemplater`加载Word文档模板。 - 调用`docxtemplater`的`getZip()`方法生成Word文档,并将其转换为二进制字符串。 - 将二进制字符串转换为base64编码,生成一个iframe元素,并将其作为子元素添加到Vue组件中用于显示Word内容的div中。 这样,当用户上传一个Word文档后,就可以在Vue组件中预览该文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文子阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值