前端实习之路

    技术渣,找到一个前端实习的工作。公司项目是layui搭建的,刚开始接触一脸懵逼,以此记录自己的学习足迹。持续更新。。。

  • 今天经理让我改一下首页的点击收缩展开,再不断的找前人经验下,写出了一段jQuery代码,然而还是实现不了。后来厚着脸皮请教了公司前端娇姐,娇姐帮我调试了一下,终于出来了。
     //收缩展开
    
            $(document).ready(function(){
                    $(".kit-item").click(function(){
                        $(".user-icon").toggle();
                    });
                });

    注意点:

  1. 取值要取到合适的地方,看清楚需要修改的是哪个div,可以在浏览器上操作
  2. 书写格式需要仔仔细细的看清楚
  • 验证一个表单金额,使其输入金额必须是数字,且保留两位小数
/*表单校验*/
    layui.use('form',function () {
        var form=layui.form;
        //验证规则
        form.verify({
            sumMoney:[/^(([1-9]{1}\d*)|(0{1}))(\.\d{2})$/,'输入金额必须是数字,且保留两位小数']
        });
    })

注意点:

  1. 正则表达式的写法,其实暂时还没有学会,这个正则表达式是借鉴了前人的经验
  2. layui方法的使用要好好学习。
  • 今天做出了自己的第一个页面,虽然也有参考其他页面,不过也算是进步了吧。今天学到了在layui中渲染表格的方法。初步了解了jQuery的声明方法。具体代码如下:
layui.use(['jquery','table','layer','laypage','tools'], ()=>{

            const $=layui.jquery;
            const table=layui.table;
            const layer=layui.layer;
            const laypage=layui.laypage;
            const tools=layui.tool;

            let query = layui.queryEntry.get();
            let rule_data = {};

            //渲染表格
            const ruleTable=table.render({
                elem:"#tb_rule",
                cellMinWidth: 60,
                toolbar: '#tableBar',
                defaultToolbar: ['filter','print','exports'],
                cols: [[
                    {field:"rule-name",title:"规则名称",width:"200",align:'center'},
                    {field:"rule",title:"规则",width:"300",align:'center'},
                    {title:'操作',fixed:'right',width:350,align:'center',toolbar:'#toolBar'},
                ]],

                data: []
 });

注意点:写jQuery代码时太容易出错了,得特别注意逗号,今天就是有个逗号写错了地方,报错还找不到。还有空格,声明id时不可以打空格,会导致出错,而且还找不到。

  • 今天还在娇姐那个页面上学了tab切换的方法
<script>
    //tab的切换
    layui.use('element', function() {
        var $ = layui.jquery,
            element = layui.element; //Tab的切换功能,切换事件监听等,需要依赖element模块

        //触发事件
        var active = {
            tabAdd: function() {
                //新增一个Tab项
                element.tabAdd('demo', {
                    title: '新选项' + (Math.random() * 1000 | 0) //用于演示
                    ,
                    content: '内容' + (Math.random() * 1000 | 0),
                    id: new Date().getTime() //实际使用一般是规定好的id,这里以时间戳模拟下
                })
            }

            ,
            tabChange: function() {
                //切换到指定Tab项
                element.tabChange('demo', '22'); //切换到:用户管理
            }
        };

        $('.site-demo-active').on('click', function() {
            var othis = $(this),
                type = othis.data('type');
            active[type] ? active[type].call(this, othis) : '';
        });

        //Hash地址的定位
        var layid = location.hash.replace(/^#test=/, '');
        element.tabChange('test', layid);

        element.on('tab(test)', function(elem) {
            location.hash = 'test=' + $(this).attr('lay-id');
        });

    });
</script>
  • 又爬上来更新了,最近学的感觉没有什么新技术,所以没来写。今天要我实现一个文件下载的功能,找了半天js的方法没实现成功,最后发现h5的a标签就有下载的功能,只需要一行简单的代码,就可以实现制定路径下的文件下载。
<a href="/template/question.docx">点击下载</a>
  • 还有一个文件上传的实现,我在layui里找到的方法,也实现了。但是公司大牛又改进了一下,直接可以上传文件或图片,下次再更新吧。之前做好的页面经理说他觉得这样设计不好,要做大更改,希望下班之前能改好。

文件上传代码见下

layui.define(['jquery', 'upload', 'ossApi', 'layer'], function (exports) {
    const MOD_NAME = 'upfile';
    const $ = layui.jquery;
    const upload = layui.upload;
    const ossApi = layui.ossApi;
    const layer = layui.layer;

    let region, accessKeyId, accessKeySecret, stsToken, bucket;

    const obj = function (config) {
        this.config = {
            //选择器id或class
            elem: '',
            //可选值有:images(图片)、file(所有文件)、video(视频)、audio(音频)
            accept: 'images',
            //规定打开文件选择框时,筛选出的文件类型,值为用逗号隔开的 MIME 类型列表
            acceptMime: 'image/jpg, image/png',
            //允许上传的文件后缀
            exts: 'jpg|png',
            //指向一个按钮触发上传.默认自动上传
            bindAction: null,
            //设置文件最大可允许上传的大小,单位 KB 默认4mb
            size: 4096,
            // 是否允许多文件上传。设置 true即可开启
            multiple: false,
            //设置同时可上传的文件数量  默认10
            number: 10,
            //是否接受拖拽的文件上传 默认否
            drag: false,
            //是否使用oss上次  默认true
            oss: true,
            //文件的上传路径 如果开启oss则为前缀路径,如果关闭oss则为要上传的接口路径
            url: '',
            //选择文件后的回调函数。返回一个object参数
            choose: function (object) {
            },
            //文件提交上传前的回调。返回一个object参数(同上)
            before: function (object) {
            },
            //执行上传请求后的回调
            done: function () {
            },
            //执行上传请求出现异常的回调
            error: function () {
            }
        };
        //实例化配置
        this.config = $.extend(this.config, config);


        //请求Sts
        this.getSts = function () {
            const o = this, c = o.config;
            if (c.oss) {
                ossApi.sts()
                    .then(data => {
                        if (data.code === 200) {
                            region = data.data.region;
                            accessKeyId = data.data.sts.accessKeyId;
                            accessKeySecret = data.data.sts.accessKeySecret;
                            stsToken = data.data.sts.securityToken;
                            bucket = data.data.bucket;
                        }
                    });
            }
        };

        //oss 上传
        this.ossUpload = function (r, fun) {
            const o = this, c = o.config;
            const client = new OSS.Wrapper({
                region: region,
                //云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用STS方式来进行API访问
                accessKeyId: accessKeyId,
                accessKeySecret: accessKeySecret,
                stsToken: stsToken,
                bucket: bucket//用户oss仓库地址
            });

            const filePath = (c.url ? (c.url.charAt(c.url.length - 1) === "/" ? c.url : (c.url + "/")) : "") + o.timestamp() + ".jpg";

            const json = {
                "code": 200
                , "msg": ""
                , "data": {
                    "src": "",
                    "key": ""
                }
            };
            client.multipartUpload(filePath, r).then(function (result) {
                json.data.src = cfx.ossPath(result.name, 0, 0);
                json.data.key = result.name;
                fun(json)
            }).catch(function (err) {
                json.code = 500;
                fun(json)
            });
        };

        /**
         * 生成文件名
         * @returns
         */
        this.timestamp = function timestamp() {
            const o = this, c = o.config;
            const time = new Date();
            const y = time.getFullYear();
            const m = time.getMonth() + 1;
            const d = time.getDate();
            const h = time.getHours();
            const mm = time.getMinutes();
            const s = time.getSeconds();
            // console.log(y);
            return "" + y + o.add(m) + o.add(d) + o.add(h) + o.add(mm) + o.add(s);
        };

        this.add = function add(m) {
            return m < 10 ? '0' + m : m;
        };
    };
    //渲染一个实例
    obj.prototype.render = function () {
        const o = this, c = o.config;
        $E = $(c.elem);
        if ($E.length === 0) {
            console.error(MOD_NAME + ' hint:找不到容器 ' + c.elem);
            return false;
        }
        //如果是oss上传 加载令牌
        if (c.oss) {
            o.getSts();
        }

        upload.render({
            elem: c.elem
            , url: c.url //必填项
            , accept: c.accept
            , acceptMime: c.acceptMime
            , exts: c.exts
            , bindAction: c.bindAction
            , size: c.size
            , multiple: c.multiple
            , number: c.number
            , drag: c.drag
            , upload: c.oss ? function (r, fun) {
                o.ossUpload(r, fun);
            } : null
            , choose: c.choose
            , before: function () {
                cfx.loading();
                c.before()
            }
            , done: function (r) {
                cfx.close();
                layer.msg("上传成功");
                c.done(r);
            }
            , error: function () {
                cfx.close();
                layer.msg("上传失败,请重试");
                c.error();
            }
        });

    };

    //输出
    exports(MOD_NAME, function (config) {
        const _this = new obj(config);
        _this.render();
        return _this;
    });
});
  • 今天做了个点击radio更改指定地方的文本内容。按照我自己找到的方法没有实现成功,后来参考了经理写的方法。
        //点击radio改变下面内容
        form.on('radio(changeIp)', function(data) {
            if (data.value == '0'){
                $("#change").text("增加:");
            }
            if (data.value == '1') {
                $("#change").text("减少:");
            }
        });
  • 我自己写的没有实现的方法见下,以后看能不能实现它。感觉没实现的原因还是因为我对jQuery的代码的不了解。
        $("#cut").click(function () {
           if ($("input[type=radio]:checked").val(0)){
               $("#change").text("增加:");
           }else if ($("input[type=radio]:checked").val(1)){
               $("#change").text("减少:");
           }
       })
  • detail和edit页面共用共一个页面,在edit为1/0判断是编辑页面还是查看页面。现在实现一个查看页面时让所有input框都没有边框。但编辑页面时有边框。
            const isEdit = tools.getUrlParam("edit");
            //  禁用/启用表单元素
            tools.disabledForm(isEdit);

            if (isEdit == 1) {
                $(document).ready(function(){
                    $("input" ).removeClass("deleteBorder");
               });
            };
  • jQuery中的属性操作
  • 如果遇到同源阻止页面的弹出,路径这么写。如果需要带参数就按第二种,主要是路径需要这么写
  • div+css设置label标签内文字在超过宽度时自动换行显示
    white-space:normal
  • layui表格内使用表单元素CheckBox时,如何获取到选中值,采用行监听
    //表格渲染方式 
    {
                        field: "lesson",
                        title: "记上课",
                        width: "16%",
                        align: "center",
                        totalRow: true,
                        templet: function (d){
                            return '<input name="lesson" type="checkbox" class="layui-form-checkbox">\n'
    
                        }
                    },
       //监听行点击事件
                    table.on('row(account_list)', function(obj){
    
                        const on=$("input:checkbox[name='lesson']:checked").length;
                        const not=parseInt(count)-parseInt(on)
                        console.log(count); //获取选中行数量,可作为是否有选中行的条件
    
                        $("div[id='amount']").html(count+"人"+"&nbsp"+"&nbsp"+"出勤"+on+"人"+"&nbsp"+"&nbsp"+"缺勤"+not+"人" );
                    });
    <!----合计行的写法---->
     <div class="layui-form-item">
                                <div style="float: right">
                                    <label class="layui-form-label Qh-insrt-form" style="width: 50px">合计:</label>
                                    <div class="layui-inline ">
                                        <div class="layui-form-label  Qh-insrt-form" style="width: 190px" id="amount"></div>
                                    </div>
                                </div>
                            </div>

    效果图:

  • 传属性:id,name     ---------->params

传对象:--------------->data

  • 筛选表格数据
   //点击按钮筛选数据
        let choose = $('input[name="csp.isAccredit"]:checked ').val();
        if (choose === "0") {
            type = "1";
            query.equals['csp.isAccredit'] = $("input[name='csp.isAccredit']:checked").val();
        }
        form.on('radio', function (data) {
            query.equals['csp.isAccredit'] = $("input[name='csp.isAccredit']:checked").val();
            queryCourse(query);
            if ($("input[name='csp.isAccredit']:checked").val() === "0"){
                type = "1";
            } else if($("input[name='csp.isAccredit']:checked").val() === "1"){
                type = "0";
            }
        });
  • detail页面的设计  

  因为科目的值是后台传过来的,所以不可以通过监听radio的值来对元素进行操作,可以通过传参的值来判断。追加必填和清除必填。

courseInfo.isMoreCourse = courseInfo.isMoreCourse.toString();
                        //根据是否多科的值添加*号
                        if (courseInfo.isMoreCourse === "0") {
                            //添加必填*
                            $("#subject").append('<span style="color:red">*</span>')
                        }else{
                            //移除必填*
                            $("#subject :last-child").remove();
                        }
  • 点击按钮,清空隐藏输入框的值和设置必填校验

            form.on('radio(chekIp)', function (data) {
                if (data.value == '1') {
                    $("#price").css('display', 'none');
                    $("#pC").removeAttr("lay-verify");
                    $('#pC').val('');
                    $("#isHidden").css('display', 'block');
                    $("#pT").attr("lay-verify", "number");
                    $("#tP").attr("lay-verify", "number");
                }
                if (data.value == '0') {
                    $("#isHidden").css('display', 'none');
                    $("#pT").removeAttr("lay-verify");
                    $("#tP").removeAttr("lay-verify");
                    $('#tP').val('');
                    $('#pT').val('');
                    $("#price").css('display', 'block');
                    $("#pC").attr("lay-verify", "number");

                }

            });
  • 自定义校验单选按钮是否选中
          $(function () {
                $("#btn_submit").click(function () {
                    const boolCheck = $('input:radio[name="isPhase"]').is(":checked");
                    const subjectCheck = $('input:radio[name="isMoreCourse"]').is(":checked");
                    if (boolCheck == false) {
                        layer.msg('请先选择是否按期!');
                        return false;
                    }
                    if (subjectCheck == false) {
                        layer.msg('请先选择是否多科!');
                        return false;
                    }
                    return true;
                });
            });
  • 调用两个api时使用责任链

具体可以参考https://blog.csdn.net/Wbiokr/article/details/79490390

//查询 分校
            const queryOrg = () => {
                //责任链
                new Promise((resolve, reject) => {
                    courseApi.listPriceAccredit(courseId)
                        .then((data) => {
                            if (data.code === 200) {
                                course2school2priceEntity_data = data.data.list;//校区价格授权表
                                resolve(course2school2priceEntity_data);
                            }
                            cfx.close();
                        });
                }).then(course2school2priceEntity_data => {
                    orgApi.listCompanyByTop(topId)
                        .then((data) => {
                            if (data.code === 200) {
                                org_data = data.data;
                                course_data = data.data;
                                for (let i = 0; i < org_data.length; i++) {
                                    for (let j = 0; j < course2school2priceEntity_data.length; j++) {
                                        if (org_data[i].orgId == course2school2priceEntity_data[j].accreditCompanyId) {
                                            org_data[i]['id'] = course2school2priceEntity_data[j].id;
                                            org_data[i]['accreditPrice'] = course2school2priceEntity_data[j].accreditPrice;
                                            org_data[i]['accreditCompanyId'] = course2school2priceEntity_data[j].accreditCompanyId;
                                            org_data[i]['createCompanyId'] = course2school2priceEntity_data[j].companyId;
                                        }
                                    }
                                    if (!org_data[i]['id']) {
                                        org_data[i]['id'] = "";
                                        org_data[i]['accreditPrice'] = "";
                                    }
                                }
                                course_school_price_list.reload({
                                    data: org_data
                                });
                                cfx.close();
                            }
                        });
                });
            };
  • 实现将数组里面的数据取出来放到一个list里面,失败了。
  for (let j = 0; j < Array.length; j++) {
               
                staffIds =staffIds+Array[j].id+",";//将循环取出来的数据再重新放到一个list里面,好像没有实现??
            }

猜你喜欢

转载自blog.csdn.net/yjie970715/article/details/88024537