Commit 0f9fbbe0 by liuyingying

文章功能总算好了

parent 777a0c3e
/**
* bootstrap.js v3.0.0 by @fat and @mdo
* Copyright 2013 Twitter Inc.
* http://www.apache.org/licenses/LICENSE-2.0
*/
if(!jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(window.jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]');if(a.length){var b=this.$element.find("input").prop("checked",!this.$element.hasClass("active")).trigger("change");"radio"===b.prop("type")&&a.find(".active").removeClass("active")}this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(window.jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("dropdown");d||c.data("dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu]",f.prototype.keydown)}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.load(this.options.remote)};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?"hide":"show"](a)},b.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on("click.dismiss.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show(),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden.bs.modal")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$element.on("click.dismiss.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",function(){a(document.body).removeClass("modal-open")})}(window.jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focus",i="hover"==g?"mouseleave":"blur";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show),void 0):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide),void 0):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this.tip();this.setContent(),this.options.animation&&c.addClass("fade");var d="function"==typeof this.options.placement?this.options.placement.call(this,c[0],this.$element[0]):this.options.placement,e=/\s?auto?\s?/i,f=e.test(d);f&&(d=d.replace(e,"")||"top"),c.detach().css({top:0,left:0,display:"block"}).addClass(d),this.options.container?c.appendTo(this.options.container):c.insertAfter(this.$element);var g=this.getPosition(),h=c[0].offsetWidth,i=c[0].offsetHeight;if(f){var j=this.$element.parent(),k=d,l=document.documentElement.scrollTop||document.body.scrollTop,m="body"==this.options.container?window.innerWidth:j.outerWidth(),n="body"==this.options.container?window.innerHeight:j.outerHeight(),o="body"==this.options.container?0:j.offset().left;d="bottom"==d&&g.top+g.height+i-l>n?"top":"top"==d&&g.top-l-i<0?"bottom":"right"==d&&g.right+h>m?"left":"left"==d&&g.left-h<o?"right":d,c.removeClass(k).addClass(d)}var p=this.getCalculatedOffset(d,g,h,i);this.applyPlacement(p,d),this.$element.trigger("shown.bs."+this.type)}},b.prototype.applyPlacement=function(a,b){var c,d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),a.top=a.top+g,a.left=a.left+h,d.offset(a).addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;if("top"==b&&j!=f&&(c=!0,a.top=a.top+f-j),/bottom|top/.test(b)){var k=0;a.left<0&&(k=-2*a.left,a.left=0,d.offset(a),i=d[0].offsetWidth,j=d[0].offsetHeight),this.replaceArrow(k-e+i,i,"left")}else this.replaceArrow(j-f,j,"top");c&&d.offset(a)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach()}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.$element.trigger("hidden.bs."+this.type),this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(window.jQuery),+function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(window.jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.attr("data-target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(window.jQuery);
\ No newline at end of file
*{
box-sizing:border-box;
transition:all .5s;
-moz-transition:all .5s;
-webkit-transition:all .5s;
-o-transition:all .5s;
margin:0;
padding: 0;
}
body{
background-color: rgba(253, 253, 253, .3);
width:100%;
}
button{
/* border: solid 1px black; */
border-radius: 5px;
cursor: pointer;
}
select{
height: 30px;
font-weight: 200;
}
a{
text-decoration: none;
}
\ No newline at end of file
*{
box-sizing:border-box;
transition:all .5s;
-moz-transition:all .5s;
-webkit-transition:all .5s;
-o-transition:all .5s;
margin:0;
padding: 0;
}
html, body{
overflow: scroll;
width:100%;
height:100%;
min-width: 1250px;
}
button{
width:50px;
height:30px;
margin:5px 10px;
float: right;
background-color: rgb(52, 133, 251);
color: white;
border:none;
}
nav{
width:100%;
height:40px;
position: fixed;
/*border-bottom: solid 1px #e3e6e8;*/
background:white;
}
nav a{
font-size:18px;
font-weight: bold;
}
nav>div{
width:100%;
height:40px;
border-bottom: solid 1px #ececec
}
nav span{
height:40px;
line-height: 40px;
padding-left:15px;
}
#bar > span{
float: right;
width: 150px;
font-size: 12px;
line-height: 30px;
height: 30px;
margin: 5px 10px;
text-align: center;
}
#hunter,
#bar{
width:50%;
height:100%;
float: left;
}
.middle_div{
width: 100%;
height: 40px;
margin-top: 40px;
background-color: #e6e6e6;
}
.title{
width:40%;
float: left;
height:100%;
padding:5px 10px;
}
.title label{
font-size:14px;
}
.title input{
width:90%;
height:30px;
}
#myfile{
width: 300px;
height: 30px;
margin: 10px;
/* line-height: 30px; */
font-size: 14px;
display: block;
float: right;
}
#error_log{
color:red;
font-size:12px;
width:100px;
height:40px;
line-height: 40px;
float: right;
}
.grey_text{
color: #999999;
font-size:12px;
width:100px;
height:40px;
line-height: 40px;
float: right;
}
textarea{
width:100%;
height:100%;
}
#markdownCnt{
width:100%;
padding-top:10px;
}
#markdownCnt >div>label{
width:100%;
height:0;
display: none;
}
#markdownCnt>div{
width:50%;
height:100%;
float: left;
}
#markdownCnt div:first-child{
padding-left:10px;
}
#markdownCnt textarea{
min-height: 1000px;
}
#textCnt{
padding-right: 10px;
}
/* Markdown解析样式 */
blockquote {
color: rgba(0,0,0,.5);
padding-left: 1.5em;
border-left: 5px solid rgba(0,0,0,.1);
}
blockquote {
display: block;
-webkit-margin-before: 1em;
-webkit-margin-after: 1em;
-webkit-margin-start: 40px;
-webkit-margin-end: 40px;
}
ul li {
line-height: 20px;
list-style: circle;
}
code {
background-color: rgba(0,0,0,.05);
display: block;
padding: .5em;
-webkit-text-size-adjust: none;
overflow-x: auto;
white-space: pre;
}
img{
width: 80%;
margin: 0 auto;
display: block;
}
/* Markdown解析样式 */
a{
color: black;
text-decoration: none;
}
.navbar{
background-color: black;
color: #FF9800;
}
.btns{
width:auto;
float: right;
padding: 15px 15px;
height: 50px;
line-height: 20px;
}
.btns > button{
margin-right: 20px;
}
#save, #publish, #return{
float: left;
}
.file_ipt{
width: 50%;
height: 100%;
float: right;
font-size: 16px;
}
#return{
height: 50px;
line-height: 30px;
}
button:hover{
background-color: #306cc5;
}
svg{
width:100%;
height: 100%;
}
textarea{
border:0;
outline: none;
}
/*article*/
#title_view{
width:100%;
text-align: center;
font-weight: bold;
}
.attachment {
width:70%;
margin:0 auto;
}
.attachment a{
font-size: 12px;
color: blue;
text-decoration: underline;
float:right;
}
.attachment span{
float: right;
font-size:12px;
}
.contain{
width: 100%;
padding-top: 60px;
}
#content_view{
width: 70%;
margin: 0 auto;
}
#right_bar span{
float: right;
font-size: 12px;
line-height: 30px;
height: 30px;
margin: 5px 0;
}
#right_bar{
padding-right: 20px;
}
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -301,6 +301,7 @@ blockquote>p{ ...@@ -301,6 +301,7 @@ blockquote>p{
.wrap ul{ .wrap ul{
display: block; display: block;
width:100%; width:100%;
cursor: pointer;
padding-right: 20px; padding-right: 20px;
} }
...@@ -343,6 +344,19 @@ ul:after{ ...@@ -343,6 +344,19 @@ ul:after{
margin: -10px 0 20px; margin: -10px 0 20px;
z-index: -999; z-index: -999;
} }
.small_text a{
color:blue;
font-size: 12px;
text-decoration: underline;
cursor: pointer;
z-index: auto;
}
.small_text a:hover,
.small_text a:active{
color: darkgrey;
font-size:12px !important;
}
.li_small_text{ .li_small_text{
font-size: 14px; font-size: 14px;
color: grey; color: grey;
...@@ -363,7 +377,7 @@ ul:after{ ...@@ -363,7 +377,7 @@ ul:after{
.right{ .right{
float:right !important; float:right !important;
height: 20px !important; height: 20px !important;
margin: -10px 0 20px; margin: 0 0 20px;
z-index: -999; z-index: -999;
font-size:14px; font-size:14px;
} }
...@@ -559,6 +573,10 @@ section > .smaller_box{ ...@@ -559,6 +573,10 @@ section > .smaller_box{
height:35px; height:35px;
float: right; float: right;
} }
.add_one > a{
float: right;
margin: 5px 20px;
}
.add_one button{ .add_one button{
width:30px; width:30px;
height:30px; height:30px;
...@@ -566,7 +584,6 @@ section > .smaller_box{ ...@@ -566,7 +584,6 @@ section > .smaller_box{
border:none; border:none;
background: transparent; background: transparent;
margin-right: 15px; margin-right: 15px;
} }
li svg{ li svg{
margin:10px 5px; margin:10px 5px;
......
...@@ -2,10 +2,49 @@ ...@@ -2,10 +2,49 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>hunter.article</title> <title>HT-{{ article.title }}</title>
{% load static %}
<link rel="icon" href="{% static 'hunter/images/logo.ico' %}" type="text/icon">
<script src="{% static 'hunter/jquery-1.9.1.min.js' %}"></script>
<link rel="stylesheet" type="text/css" href="{% static 'hunter/md/markdown.css' %}">
<script type="text/javascript" src="{% static 'hunter/md/showdown.js' %}"></script>
</head> </head>
<body> <body>
{{ article }} <nav>
<p>article</p> <div>
<div id="hunter">
<span><a href="/">HUNTER</a></span>
</div>
<div id="right_bar" class="">
<span>{{ article.author }}</span>
<span>作者:</span>
</div>
</div>
</nav>
<div class="contain">
<div id="title_view"> {{ article.title }}</div>
<div id="content_view" style="display: none;">{{ article.content }}</div>
</div>
<div class="attachment" id="attachment" >
<a target="_blank" download="{{ article.attachment }}" href="{% static 'hunter/articles/' %}{{ article.attachment }}">{{ article.attachment }}</a>
</div>
<script>
$(document).ready(function() {
convMDtoHTML();
});
function convMDtoHTML(){
var text = document.getElementById("content_view").innerHTML;
var converter = new showdown.Converter();
var html = converter.makeHtml(text);
$("#content_view").empty();
$("#content_view").append(html);
$("#content_view").css('display','block');
if($('#attachment a').text()){
$('#attachment').append('<span>附件下载:</span>');
}
}
</script>
</body> </body>
</html> </html>
\ No newline at end of file
...@@ -3,7 +3,54 @@ ...@@ -3,7 +3,54 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>hunter.detail</title> <title>hunter.detail</title>
{% load static %}
<link rel="icon" href="{% static 'hunter/images/logo.ico' %}" type="text/icon">
<link rel="stylesheet" type="text/css" href="{% static 'hunter/detail.css' %}">
<script src="{% static 'hunter/jquery-1.9.1.min.js' %}"></script>
</head> </head>
<body> <body>
<nav>
<div>
<div id="hunter">
<span><a href="/">HUNTER</a></span>
</div>
<div id="bar" class="">
</div>
</div>
</nav>
<div>
<div class="wrap">
{% for year,publications in publication_year_list.items %}
<blockquote><p>{{ year }}</p></blockquote>
{% if publications %}
{% for publication in publications %}
<ul>
<li><a href="{% static 'hunter/publications/' %}{{ publication.link }}" target="_blank">{{ publication.title }}</a></li>
<li>{{ publication.date }}</li>
<li>{{ publication.journalname }}</li>
<li>{{ publication.publishType }}</li>
<li>{{ publication.authors }}</li>
</ul>
{% endfor %}
{% endif %}
{% endfor %}
</div>
<div class="wrap">
{% for year, cves in cve_year_list.items %}
<blockquote ><p>{{ year }}</p></blockquote>
{% if cves %}
{% for cve in cves %}
<ul>
<li class="cve_big_text"><a href="{{ cve.url }}" target="_blank">{{ cve.identifier }}</a></li>
<li class="li_right">{{ cve.datetime }}</li>
<li class="li_right">{{ cve.software }}</li>
<li class="li_right">{{ cve.bugType }}</li>
<li class="li_long li_small_text">{{ cve.description }}</li>
</ul>
{% endfor %}
{% endif %}
{% endfor %}
</div>
</div>
</body> </body>
</html> </html>
\ No newline at end of file
...@@ -60,7 +60,7 @@ ...@@ -60,7 +60,7 @@
{% for user in users %} {% for user in users %}
<ul> <ul>
<li> <li>
<a href="{% url 'hunter:user' user.userID %}" target="_blank">{{ user.name_hanzi }}</a> <a href="{% url 'hunter:detail' user.userID %}" target="_blank">{{ user.name_hanzi }}</a>
</li> </li>
<li class="user_mail">{{ user.mailAddress }}</li> <li class="user_mail">{{ user.mailAddress }}</li>
</ul> </ul>
...@@ -240,7 +240,7 @@ ...@@ -240,7 +240,7 @@
let i = $(".bottom>a").index(this); let i = $(".bottom>a").index(this);
click_bar(i); click_bar(i);
}); });
let storage = window.sessionStorage; let storage = window.localStorage;
if (!storage["userID"]&&!storage["username"]){ if (!storage["userID"]&&!storage["username"]){
}else{ }else{
...@@ -250,9 +250,9 @@ ...@@ -250,9 +250,9 @@
}; };
function logout(){ function logout(){
let session = window.sessionStorage; let storage = window.localStorage;
session['username']=""; storage['username']="";
session['password']=""; storage['password']="";
$('#top_bar').empty(); $('#top_bar').empty();
$('#top_bar').append("<ul><li onclick='login()'>登录</li></ul>"); $('#top_bar').append("<ul><li onclick='login()'>登录</li></ul>");
} }
...@@ -289,7 +289,7 @@ ...@@ -289,7 +289,7 @@
console.log(response); console.log(response);
if(response['message']==="success"){ if(response['message']==="success"){
let user_id=response['userid']; let user_id=response['userid'];
let storage = window.sessionStorage; let storage = window.localStorage;
storage['username'] = username; storage['username'] = username;
storage['userID'] = user_id; storage['userID'] = user_id;
console.log(storage); console.log(storage);
...@@ -322,7 +322,7 @@ ...@@ -322,7 +322,7 @@
function logout(){ function logout(){
$('#top_bar').empty(); $('#top_bar').empty();
$('#top_bar').append('<button onclick="show_log()">登录</button>'); $('#top_bar').append('<button onclick="show_log()">登录</button>');
let storage = window.sessionStorage; let storage = window.localStorage;
storage.clear(); storage.clear();
console.log(storage); console.log(storage);
} }
......
...@@ -120,9 +120,9 @@ ...@@ -120,9 +120,9 @@
</span> </span>
<div class="add_one"> <div class="add_one">
<button onclick="addArt()"> <a href="{% url 'hunter:write_art' %}">
<svg t="1587711895133" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3772" width="20" height="20"><path d="M512 1024C229.2224 1024 0 794.7776 0 512 0 229.2224 229.2224 0 512 0 794.7776 0 1024 229.2224 1024 512 1024 794.7776 794.7776 1024 512 1024ZM716.8 486.4 537.6 486.4 537.6 307.2 486.4 307.2 486.4 486.4 307.2 486.4 307.2 537.6 486.4 537.6 486.4 716.8 537.6 716.8 537.6 537.6 716.8 537.6 716.8 486.4Z" p-id="3773" fill="#6e829e"></path></svg> <svg t="1587711451871" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2741" width="20" height="20"><path d="M863.079412 351.09129a29.2569 29.2569 0 0 1 58.5138 0v555.881108a117.027602 117.027602 0 0 1-117.027601 117.027602H219.427602a117.027602 117.027602 0 0 1-117.027602-117.027602V146.292987a117.027602 117.027602 0 0 1 117.027602-117.027602h380.339706a29.2569 29.2569 0 0 1 0 58.513801H219.427602a58.513801 58.513801 0 0 0-58.513801 58.513801v760.679411a58.513801 58.513801 0 0 0 58.513801 58.513801h585.138009a58.513801 58.513801 0 0 0 58.513801-58.513801V351.09129zM855.414104 10.306913a29.2569 29.2569 0 1 1 44.587516 37.916943l-248.683654 292.569005a29.2569 29.2569 0 1 1-44.587516-37.916943l248.683654-292.569005zM307.198303 526.632692h263.312104a29.2569 29.2569 0 0 1 0 58.513801H307.198303a29.2569 29.2569 0 0 1 0-58.513801z m0 175.541403h409.596606a29.2569 29.2569 0 0 1 0 58.513801H307.198303a29.2569 29.2569 0 0 1 0-58.513801z" p-id="2742" fill="#6e829e"></path></svg>
</button> </a>
</div> </div>
</div> </div>
<div class="wrap smaller_wrap"> <div class="wrap smaller_wrap">
...@@ -141,6 +141,7 @@ ...@@ -141,6 +141,7 @@
{# </button></li>#} {# </button></li>#}
<li class="middle_text right">{{ art.editDateTime }}</li> <li class="middle_text right">{{ art.editDateTime }}</li>
<li class="small_text right">{{ art.authorID }}</li> <li class="small_text right">{{ art.authorID }}</li>
<li class="small_text right"><a target="_blank" download="{{ art.attachment }}" href="{% static 'hunter/articles/' %}{{ art.attachment }}">{{ art.attachment }}</a></li>
</ul> </ul>
{% endfor %} {% endfor %}
{% endif %} {% endif %}
...@@ -157,7 +158,7 @@ ...@@ -157,7 +158,7 @@
</footer> </footer>
<script type="text/javascript" src="{% static 'hunter/bootstrap.min.js' %}"></script> <script type="text/javascript" src="{% static 'hunter/bootstrap.min.js' %}"></script>
<script type="text/javascript" src="{% static 'hunter/bootstrap-datetimepicker.js' %}" charset="UTF-8"></script> <script type="text/javascript" src="{% static 'hunter/bootstrap-datetimepicker.js' %}" charset="UTF-8"></script>
<script type="text/javascript" src="{% static 'hunter//bootstrap-datetimepicker.zh-CN.js' %}" charset="UTF-8"></script> <script type="text/javascript" src="{% static 'hunter/bootstrap-datetimepicker.zh-CN.js' %}" charset="UTF-8"></script>
<script type="text/javascript"> <script type="text/javascript">
$('.form_datetime').datetimepicker({ $('.form_datetime').datetimepicker({
//language: 'fr', //language: 'fr',
...@@ -194,22 +195,22 @@ ...@@ -194,22 +195,22 @@
<script type="text/javascript"> <script type="text/javascript">
window.onload=function(){ window.onload=function(){
let session = window.sessionStorage; let storage = window.localStorage;
let url = window.location.pathname; let url = window.location.pathname;
let id = url.split('/')[2]; let id = url.split('/')[2];
if(id!==sessionStorage["userID"]){ if(id!==storage["userID"]){
console.log($('#username').val()); console.log($('#username').val());
window.location.href='/'; window.location.href='/';
}else{ }else{
$('#username').append(session['username']); $('#username').append(storage['username']);
$('.userID')[0].id=session['userID']; $('.userID')[0].id=storage['userID'];
} }
}; };
function exit(){ function exit(){
let session = window.sessionStorage; let storage = window.localStorage;
session['username']=""; storage['username']="";
session['userID']=""; storage['userID']="";
window.location.href='/'; window.location.href='/';
} }
var submit_what = ''; var submit_what = '';
...@@ -329,8 +330,8 @@ ...@@ -329,8 +330,8 @@
$('#edit_title').append('添加CVE'); $('#edit_title').append('添加CVE');
} }
function submit_cve(){ function submit_cve(){
let session = window.sessionStorage; let storage = window.localStorage;
let owner = session['username']; let owner = storage['username'];
let cve_id = $('input[name="identifier"]').val(); let cve_id = $('input[name="identifier"]').val();
let bugtype = $('input[name="bugtype"]').val(); let bugtype = $('input[name="bugtype"]').val();
let date = $('#date_input').val(); let date = $('#date_input').val();
......
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>写文章</title>
{% load static %}
<link rel="icon" href="{% static 'hunter/images/logo.ico' %}" type="text/icon">
<script src="{% static 'hunter/jquery-1.9.1.min.js' %}"></script>
<link rel="stylesheet" type="text/css" href="{% static 'hunter/md/markdown.css' %}">
<script type="text/javascript" src="{% static 'hunter/md/showdown.js' %}"></script>
<script type="text/javascript" src="{% static 'hunter/bootstrap.min.js' %}"></script>
</head>
<body>
<nav>
<div>
<div id="hunter">
<span><a href="/">HUNTER</a></span>
</div>
<div id="bar" class="">
<span id="username"></span>
<button onclick="saveArt()">保存</button>
</div>
</div>
</nav>
<div class="middle_div">
<div class="title">
<label for="title">标题</label>
<input type="text" id="title" required>
</div>
<input name="myfile" id="myfile" type="file" >
<div class="grey_text">多个文件请打包</div>
<div id="error_log"></div>
</div>
<div id="markdownCnt">
<div>
<label for="originCnt">原文</label>
<textarea id = "originCnt" class="" oninput="compile()" placeholder="Start your writing">{{ articleCnt }}</textarea>
<!-- <button onclick="compile()">转换</button> -->
</div>
<div id="textCnt" class="halfView">
</div>
</div>
</body>
<script>
$(document).ready(function() {
var height = window.innerHeight;
$('#markdownCnt').css("height",height*0.88);
getUsername();
compile();
//拖离
document.addEventListener('dragleave',function(e){e.preventDefault();});
//拖后放
document.addEventListener('drop',function(e){e.preventDefault();});
//拖进
document.addEventListener('dragenter',function(e){e.preventDefault();});
//拖来拖去
document.addEventListener('dragover',function(e){e.preventDefault();});
var boxImg = document.getElementById("originCnt");
boxImg.addEventListener("drop",function(e){
e.preventDefault();
var fileList = e.dataTransfer.files;
if(fileList.length===0){return false;}
else if(fileList.length>1){
console.log("暂不支持多图同时上传");
return false;
}
else if(fileList[0].type.indexOf('image')===-1){
alert("文章中只能插入图片哦");
return false;
}
else{
console.log(fileList[0].name);
var formData = new FormData();
formData.append('image', fileList[0]);
$.ajax({
type:"post",
url:'/uploadImg/',//ajaxurl
async:false,
dataType:"text",
data:formData,
processData : false,
contentType : false,
success:function(data){
if(data){
var addMDHTML='!['+fileList[0].name+']('+data+')';
console.log(addMDHTML);
                 $("#originCnt").val($("#originCnt").val()+addMDHTML);
compile();
}else{
console.log(data)
}
},error:function(e){
console.log(e)
}
});
}
});
},false);
function saveArt(){
let username = document.getElementById("username").innerHTML;
let title = document.getElementById("title").value;
let content = document.getElementById("originCnt").value;
if(title.length<=0){
$('#error_log').empty();
$('#error_log').append('标题不能为空');
return;
}
let formdata = new FormData();
let files = $('input[name="myfile"]')[0].files;
if(files.length>0){
let myfile =files[0];
formdata.append("myfile",myfile);
formdata.append("isHaveFile", "1");
}else{
formdata.append("isHaveFile", "0");
}
formdata.append("username",username);
formdata.append("title",title);
formdata.append("content",content);
$.ajax({
url:'/write/',
type:'post',
data:formdata,
processData : false, // 使数据不做处理
contentType : false, // 不要设置Content-Type请求头
success:function (response) {
if(response["message"]){
alert('上传成功');
let storage = window.localStorage;
window.location.href="/user/"+storage.userID;
}else{
$('#error_log').empty();
$('#error_log').append(response['error']);
}
},
});
}
function getUsername(){
let storage=window.localStorage;
let username=storage['username'];
console.log(username);
if(username){
$("#username").text(username);
}else{
$("#username").text('你好');
{#alert("请先登录");#}
{#window.location.href="/";#}
}
}
function compile(){
var text = document.getElementById("originCnt").value;
var converter = new showdown.Converter();
let md_html = converter.makeHtml(text);
document.getElementById("textCnt").innerHTML = md_html;
}
</script>
</html>
\ No newline at end of file
...@@ -4,10 +4,13 @@ from . import views ...@@ -4,10 +4,13 @@ from . import views
app_name = 'hunter' app_name = 'hunter'
urlpatterns = [ urlpatterns = [
path('', views.index, name='index'), path('', views.index, name='index'),
path('/index/', views.index, name='index'), path('index/', views.index, name='index'),
# path('<int:pk>/', views.UserDetail.as_view(), name='user'), # path('<int:pk>/', views.UserDetail.as_view(), name='user'),
# path('<int:pk>/article/', views.ArticleDetail.as_view(), name='article'), # path('<int:pk>/article/', views.ArticleDetail.as_view(), name='article'),
path('user/<int:user_id>/', views.user, name='user'), path('user/<int:user_id>/', views.user, name='user'),
path('user/detail/<int:user_id>/', views.detail, name='detail'),
path('write/', views.write_art, name='write_art'),
path('uploadImg/', views.uploadImg, name='uploadImg'),
path('article/<int:article_id>/', views.article, name='article'), path('article/<int:article_id>/', views.article, name='article'),
path('login/', views.login, name='login'), path('login/', views.login, name='login'),
path('delete/publication/', views.delete_publication, name='delete_publication'), path('delete/publication/', views.delete_publication, name='delete_publication'),
......
...@@ -6,6 +6,7 @@ from django.http import JsonResponse ...@@ -6,6 +6,7 @@ from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
import os import os
from django.db.utils import ProgrammingError from django.db.utils import ProgrammingError
import datetime
from django.shortcuts import redirect from django.shortcuts import redirect
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
import json import json
...@@ -120,7 +121,6 @@ def user(request, user_id): ...@@ -120,7 +121,6 @@ def user(request, user_id):
for art in my_article_list: for art in my_article_list:
year = str(art.editDateTime)[0:4] year = str(art.editDateTime)[0:4]
art.editDateTime = str(art.editDateTime)[5:10] art.editDateTime = str(art.editDateTime)[5:10]
u = User.objects.filter(userID=art.authorID).values('name')
art.authorID = username art.authorID = username
if year in my_article_year_list.keys(): if year in my_article_year_list.keys():
my_article_year_list[year].append(art) my_article_year_list[year].append(art)
...@@ -143,16 +143,108 @@ def user(request, user_id): ...@@ -143,16 +143,108 @@ def user(request, user_id):
'cve_year_list': my_cve_year_list, 'cve_year_list': my_cve_year_list,
'article_year_list': my_article_year_list, 'article_year_list': my_article_year_list,
} }
return render(request, 'hunter/user.html', context) return render(request, 'hunter/user.html', context)
def detail(request, user_id):
usr = get_object_or_404(User, pk=user_id)
username = usr.name
my_publication_year_list = {}
pub_ids = PubToUser.objects.filter(username=username).all().values("pubID")
for pub_id in pub_ids:
pub = get_object_or_404(Publications, pk=pub_id['pubID'])
year = str(pub.date)[0:4]
pub.date = str(pub.date)[5:10]
pub.link = pub.link.split('/')[-1]
if year in my_publication_year_list.keys():
my_publication_year_list[year].append(pub)
else:
my_publication_year_list[year] = [pub]
my_bug_list = Bugs.objects.filter(owner=username).order_by('-datetime')
my_cve_year_list = {}
for cve in my_bug_list:
year = str(cve.datetime)[0:4]
cve.datetime = str(cve.datetime)[5:10]
if year in my_cve_year_list.keys():
my_cve_year_list[year].append(cve)
else:
my_cve_year_list[year] = [cve]
context = {
'user': usr,
'publication_year_list': my_publication_year_list,
'cve_year_list': my_cve_year_list,
}
return render(request, 'hunter/detail.html', context)
def article(request, article_id): def article(request, article_id):
art = get_object_or_404(Articles, pk=article_id) art = get_object_or_404(Articles, pk=article_id)
author = get_object_or_404(User, pk=art.authorID)
art.author = author.name
return render(request, 'hunter/article.html', {'article': art}) return render(request, 'hunter/article.html', {'article': art})
@csrf_exempt @csrf_exempt
def write_art(request):
if request.is_ajax():
username = request.POST.get('username', '')
title = request.POST.get('title', '')
content = request.POST.get('content', '')
editdatetime = datetime.datetime.now().date()
is_have_file = request.POST['isHaveFile']
link=""
# 加入判断题目是否相同
is_have = Articles.objects.filter(title=title).count()
if is_have > 0:
return JsonResponse({'message': 0, 'error': '该题目已存在'})
if int(is_have_file) > 0:
myfile = request.FILES['myfile']
if Articles.objects.filter(attachment=myfile.name).count():
return JsonResponse({'message': 0, 'error': '文件已存在'})
else:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
destination = os.path.join(BASE_DIR, 'hunter', 'static', 'hunter/articles', myfile.name)
if os.path.exists(destination):
os.remove(destination)
with open(destination, 'wb+') as dest:
for chunk in myfile.chunks():
dest.write(chunk)
dest.close()
link = myfile.name
if Articles.objects.last() is None:
articleID = 1
else:
articleID = Articles.objects.last().articleID + 1
try:
authorID = User.objects.get(name=username).userID
except ObjectDoesNotExist as e:
response = JsonResponse({"message": 0, 'error':'用户不存在,请检查是否登录'})
return response
try:
Articles.objects.create(articleID=articleID, authorID=authorID, title=title, content=content,
editDateTime=editdatetime,
attachment=link)
response = JsonResponse({"message": 1})
except ProgrammingError as e:
response = JsonResponse({"message": 0, 'error': '数据库错误'})
return response
return render(request, 'hunter/write.html')
@csrf_exempt
def uploadImg(request):
file_obj = request.FILES.get("image")
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
file_path = os.path.join(BASE_DIR, 'hunter', 'static', 'hunter/articles/images', file_obj.name)
link_path = os.path.join('/static', 'hunter/articles/images', file_obj.name)
with open(file_path,'wb') as f:
for chunk in file_obj.chunks():
f.write(chunk)
return HttpResponse(link_path)
@csrf_exempt
def delete_publication(request): def delete_publication(request):
pub_id = request.POST['pub_id'] pub_id = request.POST['pub_id']
print(pub_id) print(pub_id)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment