zoukankan      html  css  js  c++  java
  • vue+h-ui+layUI完成列表页及编辑页

    最近做一个新项目,用H-ui做后台,

    比较喜欢他的模仿bootsharp的栅格和表单样式。

    感觉不好的是iframe加载速度比较慢。

    这里在原有的H-ui页面基础上加入用vue来绑数据,用的还可以。

    用layui分页控件来绑分页加载,用layer作为弹窗显示

    以后改造为用x-admin的首页,加H-ui的编辑和列表也,这样就解决了iframe加载比较慢的问题

    列表页:

    
    

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" type="text/css" href="./H-ui.admin/static/h-ui/css/H-ui.min.css" />
    <link rel="stylesheet" type="text/css" href="./H-ui.admin/static/h-ui.admin/css/H-ui.admin.css" />
    <link rel="stylesheet" type="text/css" href="./H-ui.admin/lib/Hui-iconfont/1.0.8/iconfont.css" />
    <link rel="stylesheet" type="text/css" href="./H-ui.admin/static/h-ui.admin/skin/default/skin.css" id="skin" />
    <link rel="stylesheet" type="text/css" href="./H-ui.admin/static/h-ui.admin/css/style.css" />
    </head>
    <body>

    <style>
        [v-cloak] {
            display: none;
        }
    </style>
    <nav class="breadcrumb">
        <i class="Hui-iconfont">&#xe67f;</i> 首页 <span class="c-gray en">&gt;</span> 管理 <span class="c-gray en">&gt;</span> Banner列表
        <a class="btn btn-success radius r" style="line-height:1.6em;margin-top:3px" href="javascript:location.replace(location.href);" title="刷新">
            <i class="Hui-iconfont">&#xe68f;</i>
        </a>
    </nav>
    <div class="page-container" id="app">
        <div class="text-c">
            <input type="text" name="" id="" v-model="search" placeholder=" Banner名称" style="250px" class="input-text">
            <button v-on:click="find" class="btn btn-success" type="button"><i class="Hui-iconfont">&#xe665;</i> 搜Banner名称</button>
        </div>
        <div class="cl pd-5 bg-1 bk-gray mt-20">
            <span class="l">
                <a class="btn btn-primary radius" href="javascript:;" v-on:click="add('添加Banner','/Admin/News/BannerEdit?id=0')">
                    <i class="Hui-iconfont">&#xe600;</i> 添加Banner
                </a>
            </span> <span class="r">共有数据:<strong>{{total}}</strong> 条</span>
        </div>
        <div class="mt-20">
            <table class="table table-border table-bordered table-bg table-hover table-sort table-responsive">
                <thead>
                    <tr class="text-c">
                        <th width="80">ID</th>
                        <th>Banner名称</th>
                        <th>图片</th>
                        <th>跳转类型</th>
                        <th width="80">排序</th>
                        <th width="120">操作</th>
                    </tr>
                </thead>
                <tbody>
                    <tr class="text-c" v-for="(item, index) in list" v-bind:key="item.Id">
                        <td v-cloak>{{++index}}</td>
                        <td v-cloak>{{item.Title}}</td>
                        <td v-cloak><a href="javascript:;"><img style="40px;height:40px" class="picture-thumb" v-bind:src="item.Img" v-on:click="showPhotos(item.Img)"></a></td>
                        <td v-cloak>{{item.Type|typeStr}}</td>
                        <td v-cloak>{{item.Sort}}</td>
                        <td v-cloak class="f-14 td-manage">
                            <a style="text-decoration:none" class="ml-5" v-on:click="add('Banner编辑', '/Admin/News/BannerEdit?id='+item.Id)" href="javascript:;" title="编辑">
                                <i class="Hui-iconfont">&#xe6df;</i>
                            </a>
                            <a style="text-decoration:none" class="ml-5" v-on:click="del(item.Id)" href="javascript:;" title="删除">
                                <i class="Hui-iconfont">&#xe6e2;</i>
                            </a>
                        </td>
                    </tr>
    
                </tbody>
            </table>
        </div>
        <div id="laypage"></div>
    
    </div>
    
    <script src="~/Scripts/jquery-1.10.2.min.js"></script>
    <script src="~/Content/layer/layer.js"></script>
    <script type="text/javascript" src="~/Content/static/h-ui/js/H-ui.min.js"></script>
    <script type="text/javascript" src="~/Content/static/h-ui.admin/js/H-ui.admin.js"></script>
    
    <link href="~/Content/layui/css/layui.css" rel="stylesheet" />
    <script src="~/Content/layui/layui.js"></script>
    <script src="~/Content/vue/vue2.6.js"></script>
    <script src="~/Content/vue/axios.js"></script>
    
    <script type="text/javascript">
        var vm = new Vue({
            el: '#app',
            data: {
                list: [],
                total: 0,
                pageIndex: 1,
                pageSize: 10,
                search: '',
            },
            methods: {
                loadList: function () {
                    var index = layer.load(0, { shade: false });
                    var data = {
                        pageIndex: this.pageIndex,
                        pageSize: this.pageSize,
                        search: this.search
                    };
                    axios.post('/A/N/GetB', data)
                        .then(result => {
                            this.list = result.data.Data;
                            this.total = result.data.Total;
    
                            if (this.pageIndex == 1) {
                                this.loadPage();
                            }
                            layer.close(index);
                        });
                },
                loadPage: function () {
                    layui.use(['laypage'], function () {
                        var laypage = layui.laypage;
                        laypage.render({
                            elem: 'laypage',
                            count: vm.total, //数据量
                            limit: vm.pageSize,//每页限制s
                            jump: function (obj, first) {
                                if (!first) {
                                    vm.pageIndex = obj.curr;
                                    vm.loadList();
                                }
                            }
                        });
                    });
                },
                find: function () {
                    this.loadList();
                },
                add: function (title, url, w, h) {
                    console.log(url)
                    var index = layer.open({
                        type: 2,
                        title: title,
                        content: url
                    });
                    layer.full(index);
                },
                del: function (id) {
                    layer.confirm('确认要删除吗?', function (index) {
                        axios.post('/A/N/BDel', { id: id })
                            .then(result => {
                                if (result.data.ResultCode == 1000) {
                                    layer.msg('已删除!', { icon: 1, time: 1000 });
                                    vm.loadList();
                                }
    
                            });
                    });
                },
                showPhotos: function (img) {
                    var json = {
                        "title": "", //相册标题
                        "id": 123, //相册id
                        "start": 0, //初始显示的图片序号,默认0
                        "data": [   //相册包含的图片,数组格式
                            {
                                "alt": "图片",
                                "pid": 666, //图片id
                                "src": img, //原图地址
                                "thumb": img //缩略图地址
                            }
                        ]
                    };
                    layer.photos({
                        shade: 0.2,
                        maxWidth: 600,
                        //maxHeight :500,
                        area: 'auto',// ['600px', '450px'],
                        photos: json, 
                        anim: 5 //0-6的选择,指定弹出图片动画类型,默认随机(请注意,3.0之前的版本用shift参数)
                    });
                }
            },
            created: function () {
                this.loadList();
            },
            filters: {
                typeStr: function (value) {
                    var show = "图片";
                    switch (value) {
                        case 0:
                            show = "图片";
                            break;
                        case 1:
                            show = "资讯";
                            break;
                        case 2:
                            show = "外链";
                            break;
                        default:
                    }
                    return show;
                }
    
            },
        })
    
    </script>

    </body>
    </html>

    编辑页:

    
    

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" type="text/css" href="./H-ui.admin/static/h-ui/css/H-ui.min.css" />
    <link rel="stylesheet" type="text/css" href="./H-ui.admin/static/h-ui.admin/css/H-ui.admin.css" />
    <link rel="stylesheet" type="text/css" href="./H-ui.admin/lib/Hui-iconfont/1.0.8/iconfont.css" />
    <link rel="stylesheet" type="text/css" href="./H-ui.admin/static/h-ui.admin/skin/default/skin.css" id="skin" />
    <link rel="stylesheet" type="text/css" href="./H-ui.admin/static/h-ui.admin/css/style.css" />
    </head>
    <body>

    <style>
        .hide {
            display:none;
        }
        .pic_list {
            display: flex;
            justify-content: flex-start;
        }
    
            .pic_list li {
                width: 80px;
                height: 80px;
                background: #F2F2F2;
                display: flex;
                justify-content: space-around;
                flex-direction: column;
                align-items: center;
                cursor: pointer;
                color: #ADADAD;
                position: relative;
            }
    
        .pic {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
        }
    </style>
    
    <article class="page-container" id="app">
        <form class="form form-horizontal" id="form">
            <div class="row cl">
                <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>B名称:</label>
                <div class="formControls col-xs-4 col-sm-4">
                    <input type="text" class="input-text" placeholder="" v-model="title" maxlength="50">
                </div>
            </div>
            <div class="row cl">
                <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>Banner图:</label>
                <div class="formControls col-xs-8 col-sm-9">
                    <ul class="pic_list">
                        <li onclick="upload(this)">
                            上传图片
                            <img id="shareImg" v-bind:src="img" class="pic"  v-bind:class="{hide:img==''}">
                        </li>
                    </ul>
                    <input type="file" accept="image/*" onchange="uploadImg(this)"style="display: none">
                </div>
            </div>
            <div class="row cl">
                <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>类型:</label>
                <div class="formControls col-xs-3 col-sm-3">
                    <span class="select-box">
                        <select v-model="type" class="select">
                            <option value="0">图片</option>
                            <option value="1">资讯</option>
                            <option value="2">外链</option>
                        </select>
                    </span>
                </div>
            </div>
            <div v-show="type==2" class="row cl">
                <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>外链Url:</label>
                <div class="formControls col-xs-6 col-sm-6">
                    <input type="text" class="input-text" placeholder="" v-model="url" maxlength="250">
                </div>
            </div>
            <div v-show="type==1" class="row cl">
                <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>选择资讯:</label>
                <div class="formControls col-xs-8 col-sm-9">
                    <input type="text" class="input-text col-xs-6" placeholder="选择资讯" id="consultaionTitle" v-model="consultaionTitle" style="40%" readonly>
                    <input type="hidden" id="consultaionId" v-model="consultaionId" />
                    <button type="button" class="btn btn-default btn-uploadstar radius ml-10" v-on:click="choiceNews">选择资讯</button>
                </div>
            </div>
            <div class="row cl">
                <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>排序值:</label>
                <div class="formControls col-xs-4 col-sm-4">
                    <input type="text" class="input-text" placeholder="" v-model="sort">
                </div>
            </div>
            <div class="row cl">
                <div class="col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-2">
                    <button v-on:click="save" class="btn btn-success radius" type="button">
                        <i class="Hui-iconfont">&#xe632;</i> 保 存
                    </button>
                </div>
            </div>
        </form>
    </article>
    
    <script src="~/Scripts/jquery.js"></script>
    <script src="~/Content/layer/layer.js"></script>
    <script src="~/Content/vue/vue.js"></script>
    <script src="~/Content/vue/axios.js"></script>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                id: 0,
                title: "",
                sort: 0,
                type: 0,
                consultaionId: 0,
                consultaionTitle:"",
                url: "",
                img: "",
                repeatSubmit: 0   
            },
            methods: {
                getBanner: function () {
                    this.id = this.getQueryString("id");
                    if (this.id > 0) {
                        //获取数据
                        var data = {
                            id: this.id
                        };
                        axios.post('/A/N/GetBById', data)
                            .then(result => {
                                this.title = result.data.Data.Title;
                                this.sort = result.data.Data.Sort;
                                this.type = result.data.Data.Type;
                                this.consultaionId = result.data.Data.CId;
                                this.url = result.data.Data.Url;
                                this.consultaionTitle = result.data.Data.CTitle;
                                this.img = result.data.Data.Img;
                            });
                    }
                },
                save: function () {
                    if (this.repeatSubmit == 1) return; 
    
                    if (this.title.trim() === "") {
                        layer.msg("名称不能为空!", { icon: 7, time: 2000 });
                        return;
                    }
                    if (this.img.trim() === "") {
                        layer.msg("请上传Banner图片!", { icon: 7, time: 2000 });
                        return;
                    }
                    if (this.type == 1 && this.consultaionId===0) {
                        layer.msg("请选择资讯!", { icon: 7, time: 2000 });
                        return;
                    }
    
                    if (this.type == 2 && this.url === "") {
                        layer.msg("外链不能为空!", { icon: 7, time: 2000 });
                        return;
                    }
    
                    if (this.sort === "") {
                        layer.msg('排序不能为空', { icon: 7, time: 2000 });
                        return;
                    }
                    var reg = /^d+$/;
                    if (!reg.test(this.sort)) {
                        layer.msg('排序只能为数字', { icon: 7, time: 2000 });
                        return;
                    }
                    this.repeatSubmit = 1;
                    var index = layer.load(0, { shade: false }); //0代表加载的风格,支持0-2
                    var data = {
                        Id: this.id,
                        Title: this.title,
                        Sort: this.sort,
                        Type: this.type,
                        ConsultaionId: this.consultaionId,
                        Url: this.url,
                        Img: this.img
                    };
    
                    axios.post('/A/N/BSubmit', data)
                        .then(result => {
                            if (result.data.ResultCode == 1000) {
                                layer.msg(result.data.Message, { icon: 1, time: 1000 }, function () {
                                    var indexF = parent.layer.getFrameIndex(window.name);
                                    window.parent.location.reload();
                                    parent.layer.close(indexF);
                                });
    
                            } else {
                                vm.repeatSubmit = 0;
                                layer.msg(result.data.Message, { icon: 1, time: 1000 });
                            }
                            layer.close(index);
                        });
                },
                //选择资讯
                choiceNews: function () {
                    layer.open({
                        title:'选择资讯',
                        type: 2,
                        area: ['850px', '600px'],
                        fixed: false, //不固定
                        maxmin: true,
                        content: '/A/N/ChoiceC'
                    });
                },
                getQueryString: function (name) {
                    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
                    var r = window.location.search.substr(1).match(reg);
                    if (r != null) return unescape(r[2]);
                    return null;
                }
            },
            created: function () {
                this.getBanner();
            },
    
        })
    
        //分享图片上传
        function upload(dom) {
            $(dom).parent().next().click();
        }
        //上传图片
        function uploadImg(self) {
            var file = self.files[0];
            if (file == undefined || file == "") {
                layer.open({
                    content: '请选择上传的图片'
                    , skin: 'msg'
                    , time: 2 //2秒后自动关闭
                });
                return;
            }
            var filename = file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase();//获取上传文件的类型
            if (filename != "jpg" && filename != "png" && filename != "jpeg") {
                layer.open({
                    content: "只能上传JPG/PNG/JPEG格式的图片,您上传的格式为:" + filename
                    , skin: 'msg'
                    , time: 2000 //2秒后自动关闭
                });
                return;
            }
            if (file.size > 1024 * 1024 * 5) {
                layer.open({
                    content: '上传的图片不能超过5MB'
                    , skin: 'msg'
                    , time: 2000 //2秒后自动关闭
                });
                return;
            }
            var form = new FormData();
            form.append('upfile', file);
            form.append('type', filename);
            $.ajax({
                url: '/Home/UpLoadImg',
                type: 'POST',
                data: form,
                async: true,
                cache: false,
                processData: false, // tell jQuery not to process the data
                contentType: false, // tell jQuery not to set contentType
            }).done(function (data) {
                layer.msg(data.Message, { icon: 1 });
                if (data.ResultCode === 1000) {
                    vm.img = data.Data;
                }
            }).fail(function () {
                layer.msg('图片错误,请重新选择!', { icon: 7 });
            });
        }
    </script>

    </body>
    </html>

     
  • 相关阅读:
    最近在项目中使用ibatis小结
    35 岁前程序员要规划好的四件事
    C# webbrowser小结
    高并发网站架构
    高斯混合模型(GMM)
    EM算法学习(Expectation Maximization Algorithm)
    如何用CSS3美化菜单
    Intellij IDEA配置自动同步到FTP服务器
    Mac 快速休眠关机重启锁屏
    JavaScript并行运算新机遇——Web Workers的神奇魔法
  • 原文地址:https://www.cnblogs.com/zhuyapeng/p/11277180.html
Copyright © 2011-2022 走看看