pinclub/pinclub

View on GitHub
picviews/user/setting.html

Summary

Maintainability
Test Coverage
<%- Loader('/public/stylesheets/user.setting.min.css')
.css('/public/stylesheets/_pic_create_modal.less')
.css('/public/stylesheets/_avatar_upload.less')
.css('/public/stylesheets/user/setting.less')
.done(assets, config.site_static_host, config.mini_assets)
%>
<%- partial('navbar',  {style:'min-width: 600px;max-width: 1050px;'} ) %>

<div id="forum_topics" class="wrapper row">
    <div class="col-md-9">
        <div class='panel'>
            <div class='header'>
                <ul class='breadcrumb'>
                    <li><a href='/'>主页</a></li>
                    <li class='active'>设置</li>
                </ul>
            </div>
            <div class='innerTopic'>
                <% if(typeof(error) !== 'undefined' && error){ %>
                <div class="alert alert-error">
                    <a class="close" data-dismiss="alert" href="#">&times;</a>
                    <strong><%= error %></strong>
                </div>
                <% } %>
                <% if (typeof(success) !== 'undefined' && success) { %>
                <div class="alert alert-success">
                    <strong><%= success %></strong>
                </div>
                <% } %>
                <form id='setting_form' class='form-horizontal box' action='/setting' method='post'>
                    <fieldset readonly>
                        <div class='form-group'>
                            <label class='col-sm-2 control-label' for='name'>用户名</label>

                            <div class='col-sm-10'>
                                <input class='form-control ' id='name' name='name' size='30' type='text' readonly='true'
                                       value="<%= loginname %>"/>
                            </div>
                        </div>
                        <div class='form-group' style="margin-bottom: 0px;">
                            <label class='col-sm-2 control-label' for='email'>电子邮件</label>

                            <div class='col-sm-10'>
                                <input class='form-control ' id='email' name='email' size='30' type='text'
                                       readonly='true' value="<%= email %>"/>

                                <p>同时决定了 Gravatar 头像</p>
                            </div>
                        </div>
                        <div class='form-group'>
                            <label class='col-sm-2 control-label' for='email'>性别</label>

                            <div class='col-sm-10'>
                                <label class="radio-inline">
                                    <input type="radio" name="gender" value="male" <% if (gender && gender=='male') { %>checked="checked"<% } %>> 男性
                                </label>
                                <label class="radio-inline">
                                    <input type="radio" name="gender" value="female" <% if (gender && gender=='female') { %>checked="checked"<% } %>> 女性
                                </label>
                                <label class="radio-inline">
                                    <input type="radio" name="gender" value="genderless" <% if (gender && gender=='genderless') { %>checked="checked"<% } %>> 无性别
                                </label>
                                <label class="radio-inline">
                                    <input type="radio" name="gender" value="bigender" <% if (gender && gender=='bigender') { %>checked="checked"<% } %>> 双性别
                                </label>
                            </div>
                        </div>
                    </fieldset>
                    <fieldset>
                        <div class='form-group'>
                            <label class='col-sm-2 control-label' for='url'>个人网站</label>

                            <div class='col-sm-10'>
                                <input class='form-control' id='url' name='url' size='30' type='text'
                                       value="<%= typeof(url) !== 'undefined' ? url : '' %>"/>
                            </div>
                        </div>
                        <div class='form-group'>
                            <label class='col-sm-2 control-label' for='location'>所在地点</label>

                            <div class='col-sm-10'>
                                <input class='form-control' id='location' name='location' size='30' type='text'
                                       value="<%= typeof(location) !== 'undefined' ? location : '' %>"/>
                            </div>
                        </div>

                        <div class='form-group'>
                            <label class='col-sm-2 control-label' for='weibo'>微博</label>

                            <div class='col-sm-10'>
                                <input class='form-control' id='weibo' name='weibo' size='30' type='text'
                                       value="<%= typeof(weibo) !== 'undefined' ? weibo : '' %>"
                                       placeholder="e.g. http://weibo.com/cnodejs"/>
                            </div>
                        </div>
                        <div class='form-group'>
                            <label class='col-sm-2 control-label' for='github'>GitHub</label>

                            <div class='col-sm-10'>
                                <input class='form-control' id='github' name='github' size='30' type='text'
                                       value="<%= typeof(githubUsername) !== 'undefined' ? '@' + githubUsername : '' %>"
                                       placeholder="@username" readonly="readonly"/>
                                <p>请通过 GitHub 登陆 Jiuyanlou 来修改此处</p>
                            </div>
                        </div>
                        <div class='form-group'>
                            <label class='col-sm-2 control-label' for='signature'>个性签名</label>

                            <div class='col-sm-10'>
                                <textarea class='form-control' id='signature' name='signature' size='30'><%= typeof(signature) !== 'undefined' ? signature : "" %></textarea>
                            </div>
                        </div>
                        <input type='hidden' id='action' name='action' value='change_setting'/>
                        <input type='hidden' name='_csrf' value='<%= csrf %>'/>

                        <div class='form-group'>
                            <div class="col-sm-offset-2 col-sm-10">
                                <input type='submit' class='btn' data-loading-text="保存中.." value='保存设置'/>
                            </div>
                        </div>
                    </fieldset>
                </form>
            </div>
        </div>
    </div>

    <div class="col-md-3">
        <div class='panel'>
            <div class='innerTopic '>
                <div class="box">
                    <div id="avatar_list" class='form-group'>
                        <img width="54" height="54" src="<%= avatarPath(avatar_url, 54) %>" data-baiduimageplus-ignore="1"
                             class="avatar" border="0" align="default" style="vertical-align: bottom;">
                        &nbsp;
                        <img width="34" height="34" src="<%= avatarPath(avatar_url, 34) %>" data-baiduimageplus-ignore="1"
                             class="avatar" border="0" align="default" style="vertical-align: bottom;">
                        &nbsp;
                        <img width="24" height="24" src="<%= avatarPath(avatar_url, 24) %>" data-baiduimageplus-ignore="1"
                             class="avatar" border="0" align="default" style="vertical-align: bottom;">
                    </div>
                    <div>
                        <a id='upload_avatar_btn' data-toggle="modal" data-target="#image_upload" class="btn wbtn"><strong>
                            上传新头像</strong><span></span></a>
                    </div>
                </div>
            </div>
        </div>
        <div class='panel pd10'>
            <div class='innerTopic'>
                <form id='change_pass_form'  class="box" action='/setting' method='post'>
                    <div class='form-group'>
                        <label class='control-label' for='old_pass'>当前密码</label>

                        <div class='controls'>
                            <input class='form-control' type='password' id='old_pass' name='old_pass' size='30'/>
                        </div>
                    </div>
                    <div class='form-group'>
                        <label class='control-label' for='new_pass'>新密码</label>

                        <div class='controls'>
                            <input class='form-control' type='password' id='new_pass' name='new_pass' size='30'/>
                        </div>
                    </div>
                    <input type='hidden' id='action' name='action' value='change_password'/>
                    <input type='hidden' name='_csrf' value='<%= csrf %>'/>

                    <div>
                        <input type='submit' class='btn wbtn' data-loading-text="更改中.." value='更改密码'/>
                    </div>
                </form>
            </div>
        </div>
        <div class='panel pd10'>
            <div class='innerTopic'>
                <div class="box">
                    <a id='two_factor_btn' data-toggle="modal" data-target="#two_factor" class="btn wbtn"><strong class="toggle_two_factor_name">
                        <%if (!is_two_factor) {%>开启<% } else {%>关闭<%}%>双因子验证</strong><span></span></a>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="modal fade" id="image_upload" role="dialog" aria-hidden="true" aria-labelledby="avatarModalLabel">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title" id="exampleModalLabel">上传新头像</h5>
            </div>
            <div class="modal-body">
                <div id="upload_area" class="upload-area">
                    <div class="normal">
                        <a href="#" onclick="return false;" class="upload-btn btn btn18" for="img_input2">
                            <span class="text"> 选择新头像</span>
                        </a>

                        <div style="margin: 10px 0 25px" class="sub">支持单张 2M 以内图片上传</div>
                        <div style="margin-top: 20px; font-size: 12px; margin-bottom: 10px;" class="sub">
                            [提示]请严格遵守保密法律法规,严禁在互联网上存储、处理、传输、发布涉密信息
                        </div>

                    </div>
                    <div style="display: none" class="draging">
                        <div class="note">释放鼠标以上传</div>
                    </div>
                    <div style="display: none" class="uploading">
                        <div class="animate">上传中...</div>
                    </div>
                    <div class="dropzone dz-clickable">
                        <div class="dz-default dz-message"><span>拖动文件到这里上传</span></div>
                    </div>
                </div>
                <div id="upload_view" style="display: none">
                    <div id="message_alert" aria-hidden="true" class="alert alert-warning" style="display: none;" role="alert" onclick="hideSelf(this)">
                        <strong>提示</strong>
                        <span class="alert-content"></span>
                    </div>
                    <div class="pin-create">
                        <div class="preview">
                            <div id="preview" class="image">
                            </div>
                        </div>
                    </div>
                </div>

            </div>
            <div class="modal-footer">
                <button type="button" id="upload-close" class="btn" data-dismiss="modal">Close</button>
                <button type="button" id="select-upload-again" class="btn" onclick="selectUploadAgain();">Select Again</button>
                <button type="button" id="upload-submit" class="btn" data-loading-text="<i class='fa fa-circle-o-notch fa-spin' style='background: none;margin: 0px;'></i> Uploading">Upload Image</button>
            </div>
        </div>
    </div>
</div>

<div class="modal fade" id="two_factor" role="dialog" aria-hidden="true" aria-labelledby="twoFactorModalLabel">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title">双因子验证</h5>
            </div>
            <div class="modal-body">
                <div id='two_factor_form' class='form-horizontal'>
                    <% if(!is_two_factor) {%>
                        <div class='form-group'>
                            <div class='col-sm-12 text-center'>
                                <% if(typeof(two_factor_qr) !== 'undefined') {%><img src="<%= two_factor_qr %>"/><%}%>
                            </div>
                        </div>
                        <div class="text-center form-group small">
                            开启两步验证可以为你的帐号增加一层额外的保护<br>
                            请通过手机已安装的验证APP扫描二维码<br>
                            <strong>Google Authenticator</strong>: <a href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en" target="_blank">Google Play</a> / <a target="_blank" href="https://itunes.apple.com/app/google-authenticator/id388497605?mt=8">App Store</a><br>
                            <strong>Authy</strong>: <a href="https://play.google.com/store/apps/details?id=com.authy.authy&hl=en" target="_blank">Google Play</a> / <a href="https://itunes.apple.com/app/authy/id494168017?mt=8" target="_blank">App Store</a><br>
                            由于每次开启都会生成唯一的二维码, 所以每次开启双因子验证都需要重新扫描
                        </div>
                    <%} else {%>
                        <div class="text-center form-group small">
                            关闭双因子验证请输入对应的验证码<br>
                            请通过手机已安装的验证APP查看验证码, APP中默认验证名为: <code class="text-info"><%=loginname%>@Jiuyanlou</code>
                        </div>
                    <%}%>
                    <div class='form-group'>
                        <label class='col-sm-2 control-label' for='github'>验证码</label>
                        <div class='col-sm-10'>
                            <input class='form-control' id='two-factor-value' name='tfv' size='20' type='text'/>
                        </div>
                    </div>
                </div>
            </div>
            <div class="modal-footer">
                <button type="button" id="two-factor-close" class="btn" data-dismiss="modal">Close</button>
                    <button type="button" id="toggle-two-factor" class="btn toggle-two-factor toggle_two_factor_name"><%if (!is_two_factor) {%>开启<% } else {%>关闭<% } %>双因子验证</button>
            </div>
        </div>
    </div>
</div>
<%- Loader('/public/javascripts/user._pic_create_modal.min.js')
.js('/public/libs/Q.Uploader.image.all.js')
.js('/public/libs/load-image.all.min.js')
.done(assets, config.site_static_host, config.mini_assets)
%>
<script type="text/javascript">
    // qrcode generate
    //  var accessToken = "<%- accessToken %>";
    //  new QRCode(document.getElementById("access-token-qrcode"), {
    //    text: accessToken,
    //    width: 200,
    //    height: 200,
    //  });
    // END qrcode generate
    $(document).ready(function () {
        var insertImageBoardAfterCreate = true;

        var _csrf = $('meta[name=csrf-token]').attr('content');
        var uploader = new Q.Uploader({
            url: "/avatarupload?type=file&_csrf=" + _csrf,
            target: document.getElementById("upload_area"),
            view: document.getElementById("preview"),
            allows: ".jpg,.png,.gif,.bmp,.jpeg",
            auto: false,
            multiple: false,
            dataType: "json",
            data: {title: 'test'},
            //图片缩放
            // DONE(hhdem) 如果服务器是在win环境下, 打开图片缩放将无法成功上传
            // scale: {
            //     //最大图片大小(width|height)
            //     maxWidth: 700
            // },
            UI: {
                init: function () {
                    console.info('UI init method');
                },
                draw: function (task) {
                    var self = this,
                        ops = self.ops,
                        boxView = ops.view;

                    if (!boxView) return;

                    var name = task.name;

                    var li = '';
                    loadImage(task.file,
                        function (img, data) {
                            img.style.width = '54px';
//                        var html =
//                            '<div class="u-img"></div><span    class="u-loaded"></span><span class="u-total"></span>';
//                        var taskId = task.id,
//                            box = Q.createEle("div", "u-item", html);
//
//                        box.taskId = taskId;
//
//                        var boxImage = Q.getFirst(box);
//
//                        task.box = box;
//                        boxImage.appendChild(img);
//
//                        //添加到视图中
//                        boxView.appendChild(box);
                            $('#preview').append(img);
                            var img2 = cloneCanvas(img);
                            img2.style.width = '34px';
                            $('#preview').append(img2);
                            var img3 = cloneCanvas(img);
                            img3.style.width = '24px';
                            $('#preview').append(img3);
                        },
                        {orientation: true} // Options
                    );


                    //self.previewImage(boxImage, task, ops);
                },
                update: function (task) {

                }
            },
            on: {
                //添加之前触发
                add: function (task) {
                    if (task.disabled) {
                        return alert("允许上传的文件格式为:" + this.ops.allows)
                    }
                    $('#upload_view').show();
                    $('#upload_area').hide();
                },
                //图片预览后触发
                preview: function (data) {
                    console.log(data.task.name + " : " + data.src);
                },
                //图片压缩后触发,如果图片或浏览器不支持压缩,则不触发
                scale: function (data) {
                    console.log(data.task.name + " : 已压缩!");
                },
                //上传之前触发
                upload: function (task) {
                    //可针对单独的任务配置参数(POST方式)
                    var boardSelected = $('#image_upload .right-part .boardlist .item.selected');
                    uploader.data = {
                        title: $('#preview-desc').val(),
                        board: boardSelected.data("id")
                    };
                },
                //上传完成后触发
                complete: function (task) {
                    if (task.state != Q.Uploader.COMPLETE) {
                        return console.log(task.name + ": " + Q.Uploader.getStatusText(task.state) + "!")
                    }

                    var json = task.json;
                    if (!json.success) {
                        $('#message_alert .alert-content').html(json.msg);
                        $('#message_alert').fadeIn();
                        return console.error(task.name + ": 服务器未返回正确的数据!", json.msg);
                    }

                    console.log(task.name + ": 服务器返回 " + (task.response || ""));
                    // 把新头像插入页面
                    var resJson = JSON.parse(task.response);
                    var item = resJson.data[0];
                    $("#avatar_list").html($('#preview').children('canvas'));

                    //this.list  为上传任务列表
                    //this.index 为当前上传任务索引
                    if (this.index >= this.list.length - 1) {
                        //所有任务上传完成
                        console.log("所有任务上传完成:" + new Date());
                        $('#image_upload').modal('hide');
                        $('#upload-submit').button('reset');
                    }
                }

            }
        });

        // 开始上传图片
        document.getElementById("upload-submit").onclick = function () {
            var $this = $(this);
            $this.button('loading');
            uploader.start();
        };

        $('#image_upload').on('hidden.bs.modal', function (e) {
            selectUploadAgain();
        });
        $('#image_upload').on('hide.bs.modal', function (e) {
            selectUploadAgain();
        });

        function isInsertImageBoardAfterCreate(isInsert) {
            insertImageBoardAfterCreate = isInsert;
        }

        function cloneCanvas(oldCanvas) {
            //create a new canvas
            var newCanvas = document.createElement('canvas');
            var context = newCanvas.getContext('2d');

            //set dimensions
            newCanvas.width = oldCanvas.width;
            newCanvas.height = oldCanvas.height;

            //apply the old canvas to the new one
            context.drawImage(oldCanvas, 0, 0);

            //return the new canvas
            return newCanvas;
        }

        function selectUploadAgain() {
            $('#upload-submit').button('reset');
            $('#upload_area').show();
            $('#upload_view').hide();
            $('#preview').html('');
        }

        function hideSelf(obj) {
            $(obj).fadeOut();
        }

        document.getElementById("toggle-two-factor").onclick = function (event) {
            var tfv = $('#two-factor-value').val();
            if (!tfv) {
                return;
            }
            var toggleTF = {tfv: tfv};
            $.ajax({
                type: "POST",
                url: "/user/<%= loginname%>/two_factor",
                data: toggleTF
            }).done(function (response) {
                if (response.success) {
                    $('#two_factor').modal('hide');
                    if (response.is_two_factor) {
                        $('.toggle_two_factor_name').html('关闭双因子验证');
                    } else {
                        $('.toggle_two_factor_name').html('开启双因子验证');
                    }
                }
            }).error(function (res) {
                console.error(res);
            });
        };
    });
</script>