Finish the migrate program.

This commit is contained in:
zicla committed 2019-05-21 03:36:37 +08:00
1 parent cf847d44d7
commit 7f225bb18e
13 files changed
+368 -83

No files matched your search

+1 -1
View File
@@ -1 +1 @@
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/favicon.ico><title>tank-front-tmp</title><link href=/css/app.a576a8d2.css rel=preload as=style><link href=/css/chunk-vendors.cb22afd2.css rel=preload as=style><link href=/js/app.4452d0c8.js rel=preload as=script><link href=/js/chunk-vendors.220ccae9.js rel=preload as=script><link href=/css/chunk-vendors.cb22afd2.css rel=stylesheet><link href=/css/app.a576a8d2.css rel=stylesheet></head><body><noscript><strong>We're sorry but tank-front-tmp doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/js/chunk-vendors.220ccae9.js></script><script src=/js/app.4452d0c8.js></script></body></html>
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/favicon.ico><title>tank-front-tmp</title><link href=/css/app.a576a8d2.css rel=preload as=style><link href=/css/chunk-vendors.cb22afd2.css rel=preload as=style><link href=/js/app.ce972e7b.js rel=preload as=script><link href=/js/chunk-vendors.220ccae9.js rel=preload as=script><link href=/css/chunk-vendors.cb22afd2.css rel=stylesheet><link href=/css/app.a576a8d2.css rel=stylesheet></head><body><noscript><strong>We're sorry but tank-front-tmp doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/js/chunk-vendors.220ccae9.js></script><script src=/js/app.ce972e7b.js></script></body></html>
-11
View File
@@ -1,11 +0,0 @@
(function(e){function t(t){for(var i,n,o=t[0],l=t[1],c=t[2],d=0,p=[];d<o.length;d++)n=o[d],s[n]&&p.push(s[n][0]),s[n]=0;for(i in l)Object.prototype.hasOwnProperty.call(l,i)&&(e[i]=l[i]);u&&u(t);while(p.length)p.shift()();return r.push.apply(r,c||[]),a()}function a(){for(var e,t=0;t<r.length;t++){for(var a=r[t],i=!0,o=1;o<a.length;o++){var l=a[o];0!==s[l]&&(i=!1)}i&&(r.splice(t--,1),e=n(n.s=a[0]))}return e}var i={},s={app:0},r=[];function n(t){if(i[t])return i[t].exports;var a=i[t]={i:t,l:!1,exports:{}};return e[t].call(a.exports,a,a.exports,n),a.l=!0,a.exports}n.m=e,n.c=i,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(a,i,function(t){return e[t]}.bind(null,i));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/";var o=window["webpackJsonp"]=window["webpackJsonp"]||[],l=o.push.bind(o);o.push=t,o=o.slice();for(var c=0;c<o.length;c++)t(o[c]);var u=l;r.push([0,"chunk-vendors"]),a()})({0:function(e,t,a){e.exports=a("56d7")},"014f":function(e,t,a){"use strict";var i=a("2802"),s=a.n(i);s.a},"02a9":function(e,t,a){e.exports=a.p+"img/image.06f036ce.svg"},"05cc":function(e,t,a){},"06d3":function(e,t,a){},"0835":function(e,t,a){"use strict";var i=a("7ca5"),s=a.n(i);s.a},"0d6d":function(e,t,a){},"0e03":function(e,t,a){},"0e21":function(e,t,a){"use strict";var i=a("161f"),s=a.n(i);s.a},1:function(e,t){},"12f9":function(e,t,a){e.exports=a.p+"img/xls.ef5ba31b.svg"},1528:function(e,t,a){},1612:function(e,t,a){},"161f":function(e,t,a){},"1a7d":function(e,t,a){},"1c4e":function(e,t,a){"use strict";var i=a("c55d"),s=a.n(i);s.a},"1c8a":function(e,t,a){e.exports=a.p+"img/video.4387235d.svg"},"1da3":function(e,t,a){},"207e":function(e,t,a){},"23cb":function(e,t,a){"use strict";var i=a("72e0"),s=a.n(i);s.a},"241a":function(e,t,a){"use strict";var i=a("8bd5"),s=a.n(i);s.a},2802:function(e,t,a){},"2aaf":function(e,t,a){},"2ce3":function(e,t,a){"use strict";var i=a("95b7"),s=a.n(i);s.a},"300a":function(e,t,a){"use strict";var i=a("8082"),s=a.n(i);s.a},3257:function(e,t,a){"use strict";var i=a("cfa4"),s=a.n(i);s.a},"3cf5":function(e,t,a){},"3e98":function(e,t,a){"use strict";var i=a("ac62"),s=a.n(i);s.a},"3f6d":function(e){e.exports={color:["#006699","#1ab394","#7bd9a5"],backgroundColor:"rgba(0,0,0,0)",textStyle:{},title:{textStyle:{color:"#666666"},subtextStyle:{color:"#999999"}},line:{itemStyle:{normal:{borderWidth:"2"}},lineStyle:{normal:{width:"3"}},symbolSize:"10",symbol:"emptyCircle",smooth:!0},radar:{itemStyle:{normal:{borderWidth:"2"}},lineStyle:{normal:{width:"3"}},symbolSize:"10",symbol:"emptyCircle",smooth:!0},bar:{itemStyle:{normal:{barBorderWidth:"0",barBorderColor:"#444444"},emphasis:{barBorderWidth:"0",barBorderColor:"#444444"}}},pie:{itemStyle:{normal:{borderWidth:"0",borderColor:"#444444"},emphasis:{borderWidth:"0",borderColor:"#444444"}}},scatter:{itemStyle:{normal:{borderWidth:"0",borderColor:"#444444"},emphasis:{borderWidth:"0",borderColor:"#444444"}}},boxplot:{itemStyle:{normal:{borderWidth:"0",borderColor:"#444444"},emphasis:{borderWidth:"0",borderColor:"#444444"}}},parallel:{itemStyle:{normal:{borderWidth:"0",borderColor:"#444444"},emphasis:{borderWidth:"0",borderColor:"#444444"}}},sankey:{itemStyle:{normal:{borderWidth:"0",borderColor:"#444444"},emphasis:{borderWidth:"0",borderColor:"#444444"}}},funnel:{itemStyle:{normal:{borderWidth:"0",borderColor:"#444444"},emphasis:{borderWidth:"0",borderColor:"#444444"}}},gauge:{itemStyle:{normal:{borderWidth:"0",borderColor:"#444444"},emphasis:{borderWidth:"0",borderColor:"#444444"}}},candlestick:{itemStyle:{normal:{color:"#d0648a",color0:"#ffffff",borderColor:"#d0648a",borderColor0:"#22c3aa",borderWidth:1}}},graph:{itemStyle:{normal:{borderWidth:"0",borderColor:"#444444"}},lineStyle:{normal:{width:1,color:"#aaa"}},symbolSize:"10",symbol:"emptyCircle",smooth:!0,color:["#4ea397","#22c3aa","#7bd9a5"],label:{normal:{textStyle:{color:"#ffffff"}}}},map:{itemStyle:{normal:{areaColor:"#eeeeee",borderColor:"#999999",borderWidth:"0.5"},emphasis:{areaColor:"rgba(34,195,170,0.25)",borderColor:"#22c3aa",borderWidth:"0.5"}},label:{normal:{textStyle:{color:"#28544e"}},emphasis:{textStyle:{color:"rgb(52,158,142)"}}}},geo:{itemStyle:{normal:{areaColor:"#eeeeee",borderColor:"#999999",borderWidth:"0.5"},emphasis:{areaColor:"rgba(34,195,170,0.25)",borderColor:"#22c3aa",borderWidth:"0.5"}},label:{normal:{textStyle:{color:"#28544e"}},emphasis:{textStyle:{color:"rgb(52,158,142)"}}}},categoryAxis:{axisLine:{Line truncated
/*!
* iCheck v1.0.2, http://git.io/arlzeA
* ===================================
* Powerful jQuery and Zepto plugin for checkboxes and radio buttons customization
*
* (c) 2013 Damir Sultanov, http://fronteed.com
* MIT Licensed
*/
function Mi(e){var t="iCheck",a=t+"-helper",i="checkbox",s="radio",r="checked",n="un"+r,o="disabled",l="determinate",c="in"+l,u="update",d="type",p="click",m="touchbegin.i touchend.i",f="addClass",h="removeClass",v="trigger",g="label",b="cursor",C=/ipad|iphone|ipod|android|blackberry|windows phone|opera mini|silk/i.test(navigator.userAgent);function w(e,t,a){var i=e[0],n=/er/.test(a)?c:/bl/.test(a)?o:r,p=a==u?{checked:i[r],disabled:i[o],indeterminate:"true"==e.attr(c)||"false"==e.attr(l)}:i[n];if(/^(ch|di|in)/.test(a)&&!p)y(e,n);else if(/^(un|en|de)/.test(a)&&p)_(e,n);else if(a==u)for(var m in p)p[m]?y(e,m,!0):_(e,m,!0);else t&&"toggle"!=a||(t||e[v]("ifClicked"),p?i[d]!==s&&_(e,n):y(e,n))}function y(i,u,p){var m=i[0],v=i.parent(),g=u==r,C=u==c,w=u==o,y=C?l:g?n:"enabled",x=k(i,y+S(m[d])),E=k(i,u+S(m[d]));if(!0!==m[u]){if(!p&&u==r&&m[d]==s&&m.name){var P=i.closest("form"),A='input[name="'+m.name+'"]';A=P.length?P.find(A):e(A),A.each(function(){this!==m&&e(this).data(t)&&_(e(this),u)})}C?(m[u]=!0,m[r]&&_(i,r,"force")):(p||(m[u]=!0),g&&m[c]&&_(i,c,!1)),T(i,g,u,p)}m[o]&&k(i,b,!0)&&v.find("."+a).css(b,"default"),v[f](E||k(i,u)||""),v.attr("role")&&!C&&v.attr("aria-"+(w?o:r),"true"),v[h](x||k(i,y)||"")}function _(e,t,i){var s=e[0],u=e.parent(),p=t==r,m=t==c,v=t==o,g=m?l:p?n:"enabled",C=k(e,g+S(s[d])),w=k(e,t+S(s[d]));!1!==s[t]&&(!m&&i&&"force"!=i||(s[t]=!1),T(e,p,g,i)),!s[o]&&k(e,b,!0)&&u.find("."+a).css(b,"pointer"),u[h](w||k(e,t)||""),u.attr("role")&&!m&&u.attr("aria-"+(v?o:r),"false"),u[f](C||k(e,g)||"")}function x(a,i){a.data(t)&&(a.parent().html(a.attr("style",a.data(t).s||"")),i&&a[v](i),a.off(".i").unwrap(),e(g+'[for="'+a[0].id+'"]').add(a.closest(g)).off(".i"))}function k(e,a,i){if(e.data(t))return e.data(t).o[a+(i?"":"Class")]}function S(e){return e.charAt(0).toUpperCase()+e.slice(1)}function T(e,t,a,i){i||(t&&e[v]("ifToggled"),e[v]("ifChanged")[v]("if"+S(a)))}e.fn[t]=function(n,l){var b='input[type="'+i+'"], input[type="'+s+'"]',k=e(),S=function(t){t.each(function(){var t=e(this);k=t.is(b)?k.add(t):k.add(t.find(b))})};if(/^(check|uncheck|toggle|indeterminate|determinate|disable|enable|update|destroy)$/i.test(n))return n=n.toLowerCase(),S(this),k.each(function(){var t=e(this);"destroy"==n?x(t,"ifDestroyed"):w(t,!0,n),e.isFunction(l)&&l()});if("object"!=Object(Je["a"])(n)&&n)return this;var T=e.extend({checkedClass:r,disabledClass:o,indeterminateClass:c,labelHover:!0},n),E=T.handle,P=T.hoverClass||"hover",A=T.focusClass||"focus",$=T.activeClass||"active",U=!!T.labelHover,D=T.labelHoverClass||"hover",O=0|(""+T.increaseArea).replace("%","");return E!=i&&E!=s||(b='input[type="'+E+'"]'),O<-50&&(O=-50),S(this),k.each(function(){var n=e(this);x(n);var l,c=this,b=c.id,k=-O+"%",S=100+2*O+"%",E={position:"absolute",top:k,left:k,display:"block",width:S,height:S,margin:0,padding:0,background:"#fff",border:0,opacity:0},L=C?{position:"absolute",visibility:"hidden"}:O?E:{position:"absolute",opacity:0},N=c[d]==i?T.checkboxClass||"i"+i:T.radioClass||"i"+s,I=e(g+'[for="'+b+'"]').add(n.closest(g)),M=!!T.aria,R=t+"-"+Math.random().toString(36).substr(2,6),F='<div class="'+N+'" '+(M?'role="'+c[d]+'" ':"");M&&I.each(function(){F+='aria-labelledby="',this.id?F+=this.id:(this.id=R,F+=R),F+='"'}),F=n.wrap(F+"/>")[v]("ifCreated").parent().append(T.insert),l=e('<ins class="'+a+'"/>').css(E).appendTo(F),n.data(t,{o:T,s:n.attr("style")}).css(L),T.inheritClass&&F[f](c.className||""),T.inheritID&&b&&F.attr("id",t+"-"+b),"static"==F.css("position")&&F.css("position","relative"),w(n,!0,u),I.length&&I.on(p+".i mouseover.i mouseout.i "+m,function(t){var a=t[d],i=e(this);if(!c[o]){if(a==p){if(e(t.target).is("a"))return;w(n,!1,!0)}else U&&(/ut|nd/.test(a)?(F[h](P),i[h](D)):(F[f](P),i[f](D)));if(!C)return!1;t.stopPropagation()}}),n.on(p+".i focus.i blur.i keyup.i keydown.i keypress.i",function(e){var t=e[d],a=e.keyCode;return t!=p&&("keydown"==t&&32==a?(c[d]==s&&c[r]||(c[r]?_(n,r):y(n,r)),!1):void("keyup"==t&&c[d]==s?!c[r]&&y(n,r):/us|ur/.test(t)&&F["blur"==t?h:f](A)))}),l.on(p+" mousedown mouseup mouseover mouseout "+m,function(e){var t=e[d],a=/wn|up/.test(t)?$:P;if(!c[o]){if(t==p?w(n,!1,!0):(/wn|er|in/.test(t)?F[f](a):F[h](a+" "+$),I.length&&U&&a==P&&I[/ut|nd/.test(t)?h:f](D)),!C)return!1;e.stopPropagation()}})})}}a("fec5");Mi(l.a);var Ri={data:function(){return{}},props:{value:{type:[String,Number,Boolean,Array],required:!1,default:!1},val:{type:[String,Number,Boolean],required:!1,default:null}},computed:{$check:function(){return l()(this.$refs.check)}},watch:{value:function(){this.refresh()},val:function(){this.refresh()}},methods:{refresh:function(){var e="check";e=this.value instanceof Array?-1===this.value.indexOf(this.val)?"uncheck":"check":this.value?"check":"uncheck",this.$check.iCheck(e)}},mounted:function(){var e=this;this.$check.iCheck({checkboxClass:"icheckbox_minimal-blue",radioClass:"iradio_minimal-blue"}),this.refresh(),this.$check.on("ifChecked",function(t){e.value instanceof Array?-1===e.value.indexOf(e.val)&&(e.value.pushLine truncated
//# sourceMappingURL=app.4452d0c8.js.map
+11
View File
@@ -0,0 +1,11 @@
(function(e){function t(t){for(var i,n,o=t[0],l=t[1],c=t[2],d=0,p=[];d<o.length;d++)n=o[d],s[n]&&p.push(s[n][0]),s[n]=0;for(i in l)Object.prototype.hasOwnProperty.call(l,i)&&(e[i]=l[i]);u&&u(t);while(p.length)p.shift()();return r.push.apply(r,c||[]),a()}function a(){for(var e,t=0;t<r.length;t++){for(var a=r[t],i=!0,o=1;o<a.length;o++){var l=a[o];0!==s[l]&&(i=!1)}i&&(r.splice(t--,1),e=n(n.s=a[0]))}return e}var i={},s={app:0},r=[];function n(t){if(i[t])return i[t].exports;var a=i[t]={i:t,l:!1,exports:{}};return e[t].call(a.exports,a,a.exports,n),a.l=!0,a.exports}n.m=e,n.c=i,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(a,i,function(t){return e[t]}.bind(null,i));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/";var o=window["webpackJsonp"]=window["webpackJsonp"]||[],l=o.push.bind(o);o.push=t,o=o.slice();for(var c=0;c<o.length;c++)t(o[c]);var u=l;r.push([0,"chunk-vendors"]),a()})({0:function(e,t,a){e.exports=a("56d7")},"014f":function(e,t,a){"use strict";var i=a("2802"),s=a.n(i);s.a},"02a9":function(e,t,a){e.exports=a.p+"img/image.06f036ce.svg"},"05cc":function(e,t,a){},"06d3":function(e,t,a){},"0835":function(e,t,a){"use strict";var i=a("7ca5"),s=a.n(i);s.a},"0d6d":function(e,t,a){},"0e03":function(e,t,a){},"0e21":function(e,t,a){"use strict";var i=a("161f"),s=a.n(i);s.a},1:function(e,t){},"12f9":function(e,t,a){e.exports=a.p+"img/xls.ef5ba31b.svg"},1528:function(e,t,a){},1612:function(e,t,a){},"161f":function(e,t,a){},"1a7d":function(e,t,a){},"1c4e":function(e,t,a){"use strict";var i=a("c55d"),s=a.n(i);s.a},"1c8a":function(e,t,a){e.exports=a.p+"img/video.4387235d.svg"},"1da3":function(e,t,a){},"207e":function(e,t,a){},"23cb":function(e,t,a){"use strict";var i=a("72e0"),s=a.n(i);s.a},"241a":function(e,t,a){"use strict";var i=a("8bd5"),s=a.n(i);s.a},2802:function(e,t,a){},"2aaf":function(e,t,a){},"2ce3":function(e,t,a){"use strict";var i=a("95b7"),s=a.n(i);s.a},"300a":function(e,t,a){"use strict";var i=a("8082"),s=a.n(i);s.a},3257:function(e,t,a){"use strict";var i=a("cfa4"),s=a.n(i);s.a},"3cf5":function(e,t,a){},"3e98":function(e,t,a){"use strict";var i=a("ac62"),s=a.n(i);s.a},"3f6d":function(e){e.exports={color:["#006699","#1ab394","#7bd9a5"],backgroundColor:"rgba(0,0,0,0)",textStyle:{},title:{textStyle:{color:"#666666"},subtextStyle:{color:"#999999"}},line:{itemStyle:{normal:{borderWidth:"2"}},lineStyle:{normal:{width:"3"}},symbolSize:"10",symbol:"emptyCircle",smooth:!0},radar:{itemStyle:{normal:{borderWidth:"2"}},lineStyle:{normal:{width:"3"}},symbolSize:"10",symbol:"emptyCircle",smooth:!0},bar:{itemStyle:{normal:{barBorderWidth:"0",barBorderColor:"#444444"},emphasis:{barBorderWidth:"0",barBorderColor:"#444444"}}},pie:{itemStyle:{normal:{borderWidth:"0",borderColor:"#444444"},emphasis:{borderWidth:"0",borderColor:"#444444"}}},scatter:{itemStyle:{normal:{borderWidth:"0",borderColor:"#444444"},emphasis:{borderWidth:"0",borderColor:"#444444"}}},boxplot:{itemStyle:{normal:{borderWidth:"0",borderColor:"#444444"},emphasis:{borderWidth:"0",borderColor:"#444444"}}},parallel:{itemStyle:{normal:{borderWidth:"0",borderColor:"#444444"},emphasis:{borderWidth:"0",borderColor:"#444444"}}},sankey:{itemStyle:{normal:{borderWidth:"0",borderColor:"#444444"},emphasis:{borderWidth:"0",borderColor:"#444444"}}},funnel:{itemStyle:{normal:{borderWidth:"0",borderColor:"#444444"},emphasis:{borderWidth:"0",borderColor:"#444444"}}},gauge:{itemStyle:{normal:{borderWidth:"0",borderColor:"#444444"},emphasis:{borderWidth:"0",borderColor:"#444444"}}},candlestick:{itemStyle:{normal:{color:"#d0648a",color0:"#ffffff",borderColor:"#d0648a",borderColor0:"#22c3aa",borderWidth:1}}},graph:{itemStyle:{normal:{borderWidth:"0",borderColor:"#444444"}},lineStyle:{normal:{width:1,color:"#aaa"}},symbolSize:"10",symbol:"emptyCircle",smooth:!0,color:["#4ea397","#22c3aa","#7bd9a5"],label:{normal:{textStyle:{color:"#ffffff"}}}},map:{itemStyle:{normal:{areaColor:"#eeeeee",borderColor:"#999999",borderWidth:"0.5"},emphasis:{areaColor:"rgba(34,195,170,0.25)",borderColor:"#22c3aa",borderWidth:"0.5"}},label:{normal:{textStyle:{color:"#28544e"}},emphasis:{textStyle:{color:"rgb(52,158,142)"}}}},geo:{itemStyle:{normal:{areaColor:"#eeeeee",borderColor:"#999999",borderWidth:"0.5"},emphasis:{areaColor:"rgba(34,195,170,0.25)",borderColor:"#22c3aa",borderWidth:"0.5"}},label:{normal:{textStyle:{color:"#28544e"}},emphasis:{textStyle:{color:"rgb(52,158,142)"}}}},categoryAxis:{axisLine:{Line truncated
/*!
* iCheck v1.0.2, http://git.io/arlzeA
* ===================================
* Powerful jQuery and Zepto plugin for checkboxes and radio buttons customization
*
* (c) 2013 Damir Sultanov, http://fronteed.com
* MIT Licensed
*/
function Mi(e){var t="iCheck",a=t+"-helper",i="checkbox",s="radio",r="checked",n="un"+r,o="disabled",l="determinate",c="in"+l,u="update",d="type",p="click",m="touchbegin.i touchend.i",f="addClass",h="removeClass",v="trigger",g="label",b="cursor",C=/ipad|iphone|ipod|android|blackberry|windows phone|opera mini|silk/i.test(navigator.userAgent);function w(e,t,a){var i=e[0],n=/er/.test(a)?c:/bl/.test(a)?o:r,p=a==u?{checked:i[r],disabled:i[o],indeterminate:"true"==e.attr(c)||"false"==e.attr(l)}:i[n];if(/^(ch|di|in)/.test(a)&&!p)y(e,n);else if(/^(un|en|de)/.test(a)&&p)_(e,n);else if(a==u)for(var m in p)p[m]?y(e,m,!0):_(e,m,!0);else t&&"toggle"!=a||(t||e[v]("ifClicked"),p?i[d]!==s&&_(e,n):y(e,n))}function y(i,u,p){var m=i[0],v=i.parent(),g=u==r,C=u==c,w=u==o,y=C?l:g?n:"enabled",x=k(i,y+S(m[d])),E=k(i,u+S(m[d]));if(!0!==m[u]){if(!p&&u==r&&m[d]==s&&m.name){var P=i.closest("form"),A='input[name="'+m.name+'"]';A=P.length?P.find(A):e(A),A.each(function(){this!==m&&e(this).data(t)&&_(e(this),u)})}C?(m[u]=!0,m[r]&&_(i,r,"force")):(p||(m[u]=!0),g&&m[c]&&_(i,c,!1)),T(i,g,u,p)}m[o]&&k(i,b,!0)&&v.find("."+a).css(b,"default"),v[f](E||k(i,u)||""),v.attr("role")&&!C&&v.attr("aria-"+(w?o:r),"true"),v[h](x||k(i,y)||"")}function _(e,t,i){var s=e[0],u=e.parent(),p=t==r,m=t==c,v=t==o,g=m?l:p?n:"enabled",C=k(e,g+S(s[d])),w=k(e,t+S(s[d]));!1!==s[t]&&(!m&&i&&"force"!=i||(s[t]=!1),T(e,p,g,i)),!s[o]&&k(e,b,!0)&&u.find("."+a).css(b,"pointer"),u[h](w||k(e,t)||""),u.attr("role")&&!m&&u.attr("aria-"+(v?o:r),"false"),u[f](C||k(e,g)||"")}function x(a,i){a.data(t)&&(a.parent().html(a.attr("style",a.data(t).s||"")),i&&a[v](i),a.off(".i").unwrap(),e(g+'[for="'+a[0].id+'"]').add(a.closest(g)).off(".i"))}function k(e,a,i){if(e.data(t))return e.data(t).o[a+(i?"":"Class")]}function S(e){return e.charAt(0).toUpperCase()+e.slice(1)}function T(e,t,a,i){i||(t&&e[v]("ifToggled"),e[v]("ifChanged")[v]("if"+S(a)))}e.fn[t]=function(n,l){var b='input[type="'+i+'"], input[type="'+s+'"]',k=e(),S=function(t){t.each(function(){var t=e(this);k=t.is(b)?k.add(t):k.add(t.find(b))})};if(/^(check|uncheck|toggle|indeterminate|determinate|disable|enable|update|destroy)$/i.test(n))return n=n.toLowerCase(),S(this),k.each(function(){var t=e(this);"destroy"==n?x(t,"ifDestroyed"):w(t,!0,n),e.isFunction(l)&&l()});if("object"!=Object(Je["a"])(n)&&n)return this;var T=e.extend({checkedClass:r,disabledClass:o,indeterminateClass:c,labelHover:!0},n),E=T.handle,P=T.hoverClass||"hover",A=T.focusClass||"focus",$=T.activeClass||"active",U=!!T.labelHover,D=T.labelHoverClass||"hover",O=0|(""+T.increaseArea).replace("%","");return E!=i&&E!=s||(b='input[type="'+E+'"]'),O<-50&&(O=-50),S(this),k.each(function(){var n=e(this);x(n);var l,c=this,b=c.id,k=-O+"%",S=100+2*O+"%",E={position:"absolute",top:k,left:k,display:"block",width:S,height:S,margin:0,padding:0,background:"#fff",border:0,opacity:0},L=C?{position:"absolute",visibility:"hidden"}:O?E:{position:"absolute",opacity:0},N=c[d]==i?T.checkboxClass||"i"+i:T.radioClass||"i"+s,I=e(g+'[for="'+b+'"]').add(n.closest(g)),M=!!T.aria,R=t+"-"+Math.random().toString(36).substr(2,6),F='<div class="'+N+'" '+(M?'role="'+c[d]+'" ':"");M&&I.each(function(){F+='aria-labelledby="',this.id?F+=this.id:(this.id=R,F+=R),F+='"'}),F=n.wrap(F+"/>")[v]("ifCreated").parent().append(T.insert),l=e('<ins class="'+a+'"/>').css(E).appendTo(F),n.data(t,{o:T,s:n.attr("style")}).css(L),T.inheritClass&&F[f](c.className||""),T.inheritID&&b&&F.attr("id",t+"-"+b),"static"==F.css("position")&&F.css("position","relative"),w(n,!0,u),I.length&&I.on(p+".i mouseover.i mouseout.i "+m,function(t){var a=t[d],i=e(this);if(!c[o]){if(a==p){if(e(t.target).is("a"))return;w(n,!1,!0)}else U&&(/ut|nd/.test(a)?(F[h](P),i[h](D)):(F[f](P),i[f](D)));if(!C)return!1;t.stopPropagation()}}),n.on(p+".i focus.i blur.i keyup.i keydown.i keypress.i",function(e){var t=e[d],a=e.keyCode;return t!=p&&("keydown"==t&&32==a?(c[d]==s&&c[r]||(c[r]?_(n,r):y(n,r)),!1):void("keyup"==t&&c[d]==s?!c[r]&&y(n,r):/us|ur/.test(t)&&F["blur"==t?h:f](A)))}),l.on(p+" mousedown mouseup mouseover mouseout "+m,function(e){var t=e[d],a=/wn|up/.test(t)?$:P;if(!c[o]){if(t==p?w(n,!1,!0):(/wn|er|in/.test(t)?F[f](a):F[h](a+" "+$),I.length&&U&&a==P&&I[/ut|nd/.test(t)?h:f](D)),!C)return!1;e.stopPropagation()}})})}}a("fec5");Mi(l.a);var Ri={data:function(){return{}},props:{value:{type:[String,Number,Boolean,Array],required:!1,default:!1},val:{type:[String,Number,Boolean],required:!1,default:null}},computed:{$check:function(){return l()(this.$refs.check)}},watch:{value:function(){this.refresh()},val:function(){this.refresh()}},methods:{refresh:function(){var e="check";e=this.value instanceof Array?-1===this.value.indexOf(this.val)?"uncheck":"check":this.value?"check":"uncheck",this.$check.iCheck(e)}},mounted:function(){var e=this;this.$check.iCheck({checkboxClass:"icheckbox_minimal-blue",radioClass:"iradio_minimal-blue"}),this.refresh(),this.$check.on("ifChecked",function(t){e.value instanceof Array?-1===e.value.indexOf(e.val)&&(e.value.pushLine truncated
//# sourceMappingURL=app.ce972e7b.js.map
@@ -1 +1 @@
{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/backyard/share/widget/ShareMatterBar.vue?1d3c","webpack:///./src/assets/img/file/image.svg","webpack:///./src/backyard/share/Detail.vue?f673","webpack:///./src/common/widget/NbSwitcher.vue?6be8","webpack:///./src/assets/img/file/xls.svg","webpack:///./src/common/plugin/previewer/panels/PdfPanel.vue?4519","webpack:///./src/assets/img/file/video.svg","webpack:///./src/common/widget/NbSlidePanel.vue?437a","webpack:///./src/backyard/install/Index.vue?b5e0","webpack:///./src/backyard/share/widget/ShareBar.vue?7a30","webpack:///./src/backyard/user/Edit.vue?0bb6","webpack:///./src/backyard/user/Register.vue?927a","webpack:///./src/common/widget/filter/NbFilterCheck.vue?ecfd","webpack:///./src/backyard/layout/BottomNavigation.vue?a117","webpack:///./src/backyard/matter/widget/MoveBatchPanel.vue?b183","webpack:///./src/assets/img/logo.png","webpack:///./src/common/directive/directive.js","webpack:///./src/common/plugin/copy/CopyPlguinLayout.vue?aaa8","webpack:///./src/common/filter/str.js","webpack:///./src/common/util/Utils.js","webpack:///src/common/plugin/copy/CopyPlguinLayout.vue","webpack:///./src/common/plugin/copy/CopyPlguinLayout.vue?3f1d","webpack:///./src/common/plugin/copy/CopyPlguinLayout.vue","webpack:///./src/common/plugin/copy/CopyPlugin.js","webpack:///./src/common/plugin/photoswipe/PhotoSwipeLayout.vue?6291","webpack:///src/common/plugin/photoswipe/PhotoSwipeLayout.vue","webpack:///./src/common/plugin/photoswipe/PhotoSwipeLayout.vue?3326","webpack:///./src/common/plugin/photoswipe/PhotoSwipeLayout.vue","webpack:///./src/common/plugin/photoswipe/PhotoSwipePlugin.js","webpack:///./src/common/plugin/previewer/PreviewerLayout.vue?4b6f","webpack:///./src/common/plugin/previewer/panels/PdfPanel.vue?b7f6","webpack:///src/common/plugin/previewer/panels/PdfPanel.vue","webpack:///./src/common/plugin/previewer/panels/PdfPanel.vue?6435","webpack:///./src/common/plugin/previewer/panels/PdfPanel.vue","webpack:///./src/common/plugin/previewer/panels/TextPanel.vue?dfc4","webpack:///src/common/plugin/previewer/panels/TextPanel.vue","webpack:///./src/common/plugin/previewer/panels/TextPanel.vue?a9da","webpack:///./src/common/plugin/previewer/panels/TextPanel.vue","webpack:///./src/common/plugin/previewer/panels/OfficePanel.vue?67d3","webpack:///src/common/plugin/previewer/panels/OfficePanel.vue","webpack:///./src/common/plugin/previewer/panels/OfficePanel.vue?b38e","webpack:///./src/common/plugin/previewer/panels/OfficePanel.vue","webpack:///./src/common/plugin/previewer/panels/AudioPanel.vue?f39a","webpack:///src/common/plugin/previewer/panels/AudioPanel.vue","webpack:///./src/common/plugin/previewer/panels/AudioPanel.vue?c8d3","webpack:///./src/common/plugin/previewer/panels/AudioPanel.vue","webpack:///./src/common/plugin/previewer/panels/VideoPanel.vue?52de","webpack:///src/common/plugin/previewer/panels/VideoPanel.vue","webpack:///./src/common/plugin/previewer/panels/VideoPanel.vue?1051","webpack:///./src/common/plugin/previewer/panels/VideoPanel.vue","webpack:///src/common/plugin/previewer/PreviewerLayout.vue","webpack:///./src/common/plugin/previewer/PreviewerLayout.vue?96db","webpack:///./src/common/plugin/previewer/PreviewerLayout.vue","webpack:///./src/common/plugin/previewer/Previewer.js","webpack:///./src/App.vue?51de","webpack:///src/App.vue","webpack:///./src/App.vue?a7d1","webpack:///./src/App.vue","webpack:///./src/common/filter/time.js","webpack:///./src/common/util/JsonUtils.js","webpack:///./src/common/model/base/ResultCode.js","webpack:///./src/common/model/base/Base.js","webpack:///./src/common/model/base/FilterType.js","webpack:///./src/common/model/base/Filter.js","webpack:///./src/common/model/base/BaseEntity.js","webpack:///./src/common/model/user/UserRole.js","webpack:///./src/common/model/user/UserStatus.js","webpack:///./src/common/util/NumberUtil.js","webpack:///./src/common/util/MimeUtil.js","webpack:///./src/common/util/ImageUtil.js","webpack:///./src/common/model/user/User.js","webpack:///./src/common/model/preference/Preference.js","webpack:///./src/common/util/BrowserUtil.js","webpack:///./src/common/vuex/index.js","webpack:///./src/backyard/Frame.vue?34ef","webpack:///./src/backyard/layout/SideNavigation.vue?529c","webpack:///./src/backyard/layout/BottomNavigation.vue?98a8","webpack:///src/backyard/layout/BottomNavigation.vue","webpack:///./src/backyard/layout/BottomNavigation.vue?c2ca","webpack:///./src/backyard/layout/BottomNavigation.vue","webpack:///src/backyard/layout/SideNavigation.vue","webpack:///./src/backyard/layout/SideNavigation.vue?1f7d","webpack:///./src/backyard/layout/SideNavigation.vue","webpack:///./src/backyard/layout/TopNavigation.vue?3171","webpack:///src/backyard/layout/TopNavigation.vue","webpack:///./src/backyard/layout/TopNavigation.vue?0279","webpack:///./src/backyard/layout/TopNavigation.vue","webpack:///src/backyard/Frame.vue","webpack:///./src/backyard/Frame.vue?b843","webpack:///./Line truncated
{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/backyard/share/widget/ShareMatterBar.vue?1d3c","webpack:///./src/assets/img/file/image.svg","webpack:///./src/backyard/share/Detail.vue?f673","webpack:///./src/common/widget/NbSwitcher.vue?6be8","webpack:///./src/assets/img/file/xls.svg","webpack:///./src/common/plugin/previewer/panels/PdfPanel.vue?4519","webpack:///./src/assets/img/file/video.svg","webpack:///./src/common/widget/NbSlidePanel.vue?437a","webpack:///./src/backyard/install/Index.vue?b5e0","webpack:///./src/backyard/share/widget/ShareBar.vue?7a30","webpack:///./src/backyard/user/Edit.vue?0bb6","webpack:///./src/backyard/user/Register.vue?927a","webpack:///./src/common/widget/filter/NbFilterCheck.vue?ecfd","webpack:///./src/backyard/layout/BottomNavigation.vue?a117","webpack:///./src/backyard/matter/widget/MoveBatchPanel.vue?b183","webpack:///./src/assets/img/logo.png","webpack:///./src/common/directive/directive.js","webpack:///./src/common/plugin/copy/CopyPlguinLayout.vue?aaa8","webpack:///./src/common/filter/str.js","webpack:///./src/common/util/Utils.js","webpack:///src/common/plugin/copy/CopyPlguinLayout.vue","webpack:///./src/common/plugin/copy/CopyPlguinLayout.vue?3f1d","webpack:///./src/common/plugin/copy/CopyPlguinLayout.vue","webpack:///./src/common/plugin/copy/CopyPlugin.js","webpack:///./src/common/plugin/photoswipe/PhotoSwipeLayout.vue?6291","webpack:///src/common/plugin/photoswipe/PhotoSwipeLayout.vue","webpack:///./src/common/plugin/photoswipe/PhotoSwipeLayout.vue?3326","webpack:///./src/common/plugin/photoswipe/PhotoSwipeLayout.vue","webpack:///./src/common/plugin/photoswipe/PhotoSwipePlugin.js","webpack:///./src/common/plugin/previewer/PreviewerLayout.vue?4b6f","webpack:///./src/common/plugin/previewer/panels/PdfPanel.vue?b7f6","webpack:///src/common/plugin/previewer/panels/PdfPanel.vue","webpack:///./src/common/plugin/previewer/panels/PdfPanel.vue?6435","webpack:///./src/common/plugin/previewer/panels/PdfPanel.vue","webpack:///./src/common/plugin/previewer/panels/TextPanel.vue?dfc4","webpack:///src/common/plugin/previewer/panels/TextPanel.vue","webpack:///./src/common/plugin/previewer/panels/TextPanel.vue?a9da","webpack:///./src/common/plugin/previewer/panels/TextPanel.vue","webpack:///./src/common/plugin/previewer/panels/OfficePanel.vue?67d3","webpack:///src/common/plugin/previewer/panels/OfficePanel.vue","webpack:///./src/common/plugin/previewer/panels/OfficePanel.vue?b38e","webpack:///./src/common/plugin/previewer/panels/OfficePanel.vue","webpack:///./src/common/plugin/previewer/panels/AudioPanel.vue?f39a","webpack:///src/common/plugin/previewer/panels/AudioPanel.vue","webpack:///./src/common/plugin/previewer/panels/AudioPanel.vue?c8d3","webpack:///./src/common/plugin/previewer/panels/AudioPanel.vue","webpack:///./src/common/plugin/previewer/panels/VideoPanel.vue?52de","webpack:///src/common/plugin/previewer/panels/VideoPanel.vue","webpack:///./src/common/plugin/previewer/panels/VideoPanel.vue?1051","webpack:///./src/common/plugin/previewer/panels/VideoPanel.vue","webpack:///src/common/plugin/previewer/PreviewerLayout.vue","webpack:///./src/common/plugin/previewer/PreviewerLayout.vue?96db","webpack:///./src/common/plugin/previewer/PreviewerLayout.vue","webpack:///./src/common/plugin/previewer/Previewer.js","webpack:///./src/App.vue?51de","webpack:///src/App.vue","webpack:///./src/App.vue?a7d1","webpack:///./src/App.vue","webpack:///./src/common/filter/time.js","webpack:///./src/common/util/JsonUtils.js","webpack:///./src/common/model/base/ResultCode.js","webpack:///./src/common/model/base/Base.js","webpack:///./src/common/model/base/FilterType.js","webpack:///./src/common/model/base/Filter.js","webpack:///./src/common/model/base/BaseEntity.js","webpack:///./src/common/model/user/UserRole.js","webpack:///./src/common/model/user/UserStatus.js","webpack:///./src/common/util/NumberUtil.js","webpack:///./src/common/util/MimeUtil.js","webpack:///./src/common/util/ImageUtil.js","webpack:///./src/common/model/user/User.js","webpack:///./src/common/model/preference/Preference.js","webpack:///./src/common/util/BrowserUtil.js","webpack:///./src/common/vuex/index.js","webpack:///./src/backyard/Frame.vue?34ef","webpack:///./src/backyard/layout/SideNavigation.vue?529c","webpack:///./src/backyard/layout/BottomNavigation.vue?98a8","webpack:///src/backyard/layout/BottomNavigation.vue","webpack:///./src/backyard/layout/BottomNavigation.vue?c2ca","webpack:///./src/backyard/layout/BottomNavigation.vue","webpack:///src/backyard/layout/SideNavigation.vue","webpack:///./src/backyard/layout/SideNavigation.vue?1f7d","webpack:///./src/backyard/layout/SideNavigation.vue","webpack:///./src/backyard/layout/TopNavigation.vue?3171","webpack:///src/backyard/layout/TopNavigation.vue","webpack:///./src/backyard/layout/TopNavigation.vue?0279","webpack:///./src/backyard/layout/TopNavigation.vue","webpack:///src/backyard/Frame.vue","webpack:///./src/backyard/Frame.vue?b843","webpack:///./Line truncated
+1 -1
View File
@@ -166,7 +166,7 @@ func (this *DavService) HandlePropfind(writer http.ResponseWriter, request *http
matters = []*Matter{matter}
} else {
// len(matters) == 0 means empty directory
matters = this.matterDao.ListByPuuidAndUserUuid(matter.Uuid, user.Uuid, nil)
matters = this.matterDao.FindByPuuidAndUserUuid(matter.Uuid, user.Uuid, nil)
//add this matter to head.
matters = append([]*Matter{matter}, matters...)
+1 -1
View File
@@ -456,7 +456,7 @@ func (this *MatterController) Zip(writer http.ResponseWriter, request *http.Requ
uuidArray := strings.Split(uuids, ",")
matters := this.matterDao.ListByUuids(uuidArray, nil)
matters := this.matterDao.FindByUuids(uuidArray, nil)
if matters == nil || len(matters) == 0 {
panic(result.BadRequest("matters cannot be nil."))
+48 -17
View File
@@ -120,6 +120,30 @@ func (this *MatterDao) FindByUserUuidAndPuuidAndNameAndDirTrue(userUuid string,
return matter
}
func (this *MatterDao) FindByUserUuidAndPuuidAndDirTrue(userUuid string, puuid string) []*Matter {
var wp = &builder.WherePair{}
if userUuid != "" {
wp = wp.And(&builder.WherePair{Query: "user_uuid = ?", Args: []interface{}{userUuid}})
}
if puuid != "" {
wp = wp.And(&builder.WherePair{Query: "puuid = ?", Args: []interface{}{puuid}})
}
wp = wp.And(&builder.WherePair{Query: "dir = ?", Args: []interface{}{1}})
var matters []*Matter
db := core.CONTEXT.GetDB().Model(&Matter{}).Where(wp.Query, wp.Args...).First(&matters)
if db.Error != nil {
return nil
}
return matters
}
func (this *MatterDao) CheckByUuidAndUserUuid(uuid string, userUuid string) *Matter {
var matter = &Matter{}
@@ -193,20 +217,11 @@ func (this *MatterDao) FindByUserUuidAndPuuidAndDirAndName(userUuid string, puui
return matter
}
func (this *MatterDao) ListByUserUuidAndPuuidAndDirAndName(userUuid string, puuid string, dir bool, name string) []*Matter {
func (this *MatterDao) FindByPuuidAndUserUuid(puuid string, userUuid string, sortArray []builder.OrderPair) []*Matter {
var matters []*Matter
db := core.CONTEXT.GetDB().
Where(Matter{UserUuid: userUuid, Puuid: puuid, Dir: dir, Name: name}).
Find(&matters)
this.PanicError(db.Error)
return matters
}
func (this *MatterDao) ListByPuuidAndUserUuid(puuid string, userUuid string, sortArray []builder.OrderPair) []*Matter {
var matters []*Matter
var wp = &builder.WherePair{}
wp = wp.And(&builder.WherePair{Query: "puuid = ? AND user_uuid = ?", Args: []interface{}{puuid, userUuid}})
if sortArray == nil {
@@ -222,13 +237,13 @@ func (this *MatterDao) ListByPuuidAndUserUuid(puuid string, userUuid string, sor
}
}
db := core.CONTEXT.GetDB().Where(Matter{UserUuid: userUuid, Puuid: puuid}).Order(this.GetSortString(sortArray)).Find(&matters)
db := core.CONTEXT.GetDB().Model(&Matter{}).Where(wp.Query, wp.Args...).Order(this.GetSortString(sortArray)).Find(&matters)
this.PanicError(db.Error)
return matters
}
func (this *MatterDao) ListByUuids(uuids []string, sortArray []builder.OrderPair) []*Matter {
func (this *MatterDao) FindByUuids(uuids []string, sortArray []builder.OrderPair) []*Matter {
var matters []*Matter
db := core.CONTEXT.GetDB().Where(uuids).Order(this.GetSortString(sortArray)).Find(&matters)
@@ -236,8 +251,7 @@ func (this *MatterDao) ListByUuids(uuids []string, sortArray []builder.OrderPair
return matters
}
func (this *MatterDao) Page(page int, pageSize int, puuid string, userUuid string, name string, dir string, extensions []string, sortArray []builder.OrderPair) *Pager {
func (this *MatterDao) PlainPage(page int, pageSize int, puuid string, userUuid string, name string, dir string, extensions []string, sortArray []builder.OrderPair) (int, []*Matter) {
var wp = &builder.WherePair{}
@@ -279,6 +293,12 @@ func (this *MatterDao) Page(page int, pageSize int, puuid string, userUuid strin
var matters []*Matter
db = conditionDB.Order(this.GetSortString(sortArray)).Offset(page * pageSize).Limit(pageSize).Find(&matters)
this.PanicError(db.Error)
return count, matters
}
func (this *MatterDao) Page(page int, pageSize int, puuid string, userUuid string, name string, dir string, extensions []string, sortArray []builder.OrderPair) *Pager {
count, matters := this.PlainPage(page, pageSize, puuid, userUuid, name, dir, extensions, sortArray)
pager := NewPager(page, pageSize, count, matters)
return pager
@@ -337,7 +357,7 @@ func (this *MatterDao) Delete(matter *Matter) {
// recursive if dir
if matter.Dir {
matters := this.ListByPuuidAndUserUuid(matter.Uuid, matter.UserUuid, nil)
matters := this.FindByPuuidAndUserUuid(matter.Uuid, matter.UserUuid, nil)
for _, f := range matters {
this.Delete(f)
@@ -461,6 +481,17 @@ func (this *MatterDao) CountByUserUuidAndPath(userUuid string, path string) int6
}
//统计总共有多少条。
func (this *MatterDao) Count() int64 {
var count int64
db := core.CONTEXT.GetDB().Model(&Matter{}).Count(&count)
core.PanicError(db.Error)
return count
}
//System cleanup.
func (this *MatterDao) Cleanup() {
this.logger.Info("[MatterDao] clean up. Delete all Matter record in db and on disk.")
+49 -5
View File
@@ -393,6 +393,50 @@ func (this *MatterService) ComputeRouteSize(matterUuid string, user *User) {
this.ComputeRouteSize(matter.Puuid, user)
}
// compute all dir's size.
func (this *MatterService) ComputeAllDirSize(user *User) {
this.logger.Info("Compute all dir's size for user %s %s", user.Uuid, user.Username)
rootMatter := NewRootMatter(user)
this.ComputeDirSize(rootMatter, user)
}
// compute a dir's size.
func (this *MatterService) ComputeDirSize(dirMatter *Matter, user *User) {
this.logger.Info("Compute dir's size %s %s", dirMatter.Uuid, dirMatter.Name)
//update sub dir first
childrenDirMatters := this.matterDao.FindByUserUuidAndPuuidAndDirTrue(user.Uuid, dirMatter.Uuid)
for _, childrenDirMatter := range childrenDirMatters {
this.ComputeDirSize(childrenDirMatter, user)
}
//if to root directory, then update to user's info.
if dirMatter.Uuid == MATTER_ROOT {
size := this.matterDao.SizeByPuuidAndUserUuid(MATTER_ROOT, user.Uuid)
db := core.CONTEXT.GetDB().Model(&User{}).Where("uuid = ?", user.Uuid).Update("total_size", size)
this.PanicError(db.Error)
//update user total size info in cache.
user.TotalSize = size
} else {
//compute self.
size := this.matterDao.SizeByPuuidAndUserUuid(dirMatter.Uuid, user.Uuid)
//when changed, we update
if dirMatter.Size != size {
db := core.CONTEXT.GetDB().Model(&Matter{}).Where("uuid = ?", dirMatter.Uuid).Update("size", size)
this.PanicError(db.Error)
}
}
}
//inner create directory.
func (this *MatterService) createDirectory(request *http.Request, dirMatter *Matter, name string, user *User) *Matter {
@@ -515,7 +559,7 @@ func (this *MatterService) move(request *http.Request, srcMatter *Matter, destDi
srcMatter = this.matterDao.Save(srcMatter)
//reCompute the path.
matters := this.matterDao.ListByPuuidAndUserUuid(srcMatter.Uuid, srcMatter.UserUuid, nil)
matters := this.matterDao.FindByPuuidAndUserUuid(srcMatter.Uuid, srcMatter.UserUuid, nil)
for _, m := range matters {
this.adjustPath(m, srcMatter)
}
@@ -638,7 +682,7 @@ func (this *MatterService) copy(request *http.Request, srcMatter *Matter, destDi
newMatter = this.matterDao.Create(newMatter)
//copy children
matters := this.matterDao.ListByPuuidAndUserUuid(srcMatter.Uuid, srcMatter.UserUuid, nil)
matters := this.matterDao.FindByPuuidAndUserUuid(srcMatter.Uuid, srcMatter.UserUuid, nil)
for _, m := range matters {
this.copy(request, m, newMatter, m.Name)
}
@@ -729,7 +773,7 @@ func (this *MatterService) AtomicRename(request *http.Request, matter *Matter, n
matter = this.matterDao.Save(matter)
//调整该文件夹下文件的Path.
matters := this.matterDao.ListByPuuidAndUserUuid(matter.Uuid, matter.UserUuid, nil)
matters := this.matterDao.FindByPuuidAndUserUuid(matter.Uuid, matter.UserUuid, nil)
for _, m := range matters {
this.adjustPath(m, matter)
}
@@ -917,7 +961,7 @@ func (this *MatterService) WrapChildrenDetail(request *http.Request, matter *Mat
if matter.Dir {
children := this.matterDao.ListByPuuidAndUserUuid(matter.Uuid, matter.UserUuid, nil)
children := this.matterDao.FindByPuuidAndUserUuid(matter.Uuid, matter.UserUuid, nil)
matter.Children = children
for _, child := range matter.Children {
@@ -967,7 +1011,7 @@ func (this *MatterService) adjustPath(matter *Matter, parentMatter *Matter) {
matter = this.matterDao.Save(matter)
//adjust children.
matters := this.matterDao.ListByPuuidAndUserUuid(matter.Uuid, matter.UserUuid, nil)
matters := this.matterDao.FindByPuuidAndUserUuid(matter.Uuid, matter.UserUuid, nil)
for _, m := range matters {
this.adjustPath(m, matter)
}
+14 -39
View File
@@ -11,8 +11,8 @@ import (
type PreferenceController struct {
BaseController
preferenceDao *PreferenceDao
matterDao *MatterDao
preferenceService *PreferenceService
migrating bool
}
func (this *PreferenceController) Init() {
@@ -23,6 +23,10 @@ func (this *PreferenceController) Init() {
this.preferenceDao = b
}
b = core.CONTEXT.GetBean(this.matterDao)
if b, ok := b.(*MatterDao); ok {
this.matterDao = b
}
b = core.CONTEXT.GetBean(this.preferenceService)
if b, ok := b.(*PreferenceService); ok {
this.preferenceService = b
@@ -125,44 +129,6 @@ func (this *PreferenceController) Edit(writer http.ResponseWriter, request *http
return this.Success(preference)
}
//migrate 2.0's db data and file data to 3.0
func (this *PreferenceController) Migrate20to30(writer http.ResponseWriter, request *http.Request) *result.WebResult {
this.logger.Info("start migrating from 2.0 to 3.0")
if this.migrating {
panic(result.BadRequest("migrating work is processing"))
} else {
this.migrating = true
}
defer func() {
this.migrating = false
}()
migrateDashboardSql := "INSERT INTO `tank`.`tank30_download_token` ( `uuid`, `sort`, `update_time`, `create_time`, `user_uuid`, `matter_uuid`, `expire_time`, `ip` ) ( SELECT `uuid`, `sort`, `update_time`, `create_time`, `user_uuid`, `matter_uuid`, `expire_time`, `ip` FROM `tank`.`tank20_download_token`)"
this.logger.Info(migrateDashboardSql)
core.CONTEXT.GetDB().Exec(migrateDashboardSql)
migrateDownloadTokenSql := "INSERT INTO `tank`.`tank30_dashboard` ( `uuid`, `sort`, `update_time`, `create_time`, `invoke_num`, `total_invoke_num`, `uv`, `total_uv`, `matter_num`, `total_matter_num`, `file_size`, `total_file_size`, `avg_cost`, `dt` ) ( SELECT `uuid`, `sort`, `update_time`, `create_time`, `invoke_num`, `total_invoke_num`, `uv`, `total_uv`, `matter_num`, `total_matter_num`, `file_size`, `total_file_size`, `avg_cost`, `dt` FROM `tank`.`tank20_dashboard` )"
this.logger.Info(migrateDownloadTokenSql)
core.CONTEXT.GetDB().Exec(migrateDownloadTokenSql)
migrateMatterSql := "INSERT INTO `tank`.`tank30_matter` ( `uuid`, `sort`, `update_time`, `create_time`, `puuid`, `user_uuid`, `username`, `dir`, `name`, `md5`, `size`, `privacy`, `path`, `times` ) ( SELECT `uuid`, `sort`, `update_time`, `create_time`, `puuid`, `user_uuid`, '', `dir`, `name`, `md5`, `size`, `privacy`, `path`, `times` FROM `tank`.`tank20_matter` ) "
this.logger.Info(migrateMatterSql)
core.CONTEXT.GetDB().Exec(migrateMatterSql)
migrateUploadTokenSql := "INSERT INTO `tank`.`tank30_upload_token` ( `uuid`, `sort`, `update_time`, `create_time`, `user_uuid`, `folder_uuid`, `matter_uuid`, `expire_time`, `filename`, `privacy`, `size`, `ip` ) ( SELECT `uuid`, `sort`, `update_time`, `create_time`, `user_uuid`, `folder_uuid`, `matter_uuid`, `expire_time`, `filename`, `privacy`, `size`, `ip` FROM `tank`.`tank20_upload_token` ) "
this.logger.Info(migrateUploadTokenSql)
core.CONTEXT.GetDB().Exec(migrateUploadTokenSql)
//username in tank2.0 add _20.
migrateUserSql := "INSERT INTO `tank`.`tank30_user` ( `uuid`, `sort`, `update_time`, `create_time`, `role`, `username`, `password`, `avatar_url`, `last_ip`, `last_time`, `size_limit`, `total_size_limit`, `total_size`, `status` ) ( SELECT `uuid`, `sort`, `update_time`, `create_time`, `role`, CONCAT(`username`,'_20') as `username`, `password`, `avatar_url`, `last_ip`, `last_time`, `size_limit`, -1, 0, `status` FROM `tank`.`tank20_user` )"
this.logger.Info(migrateUserSql)
core.CONTEXT.GetDB().Exec(migrateUserSql)
return this.Success("OK")
}
//cleanup system data.
func (this *PreferenceController) SystemCleanup(writer http.ResponseWriter, request *http.Request) *result.WebResult {
@@ -178,3 +144,12 @@ func (this *PreferenceController) SystemCleanup(writer http.ResponseWriter, requ
return this.Success("OK")
}
//migrate 2.0's db data and file data to 3.0
func (this *PreferenceController) Migrate20to30(writer http.ResponseWriter, request *http.Request) *result.WebResult {
this.logger.Info("start migrating from 2.0 to 3.0")
this.preferenceService.Migrate20to30(writer, request)
return this.Success("OK")
}
+218 -1
View File
@@ -1,12 +1,26 @@
package rest
import "github.com/eyebluecn/tank/code/core"
import (
"fmt"
"github.com/eyebluecn/tank/code/core"
"github.com/eyebluecn/tank/code/tool/i18n"
"github.com/eyebluecn/tank/code/tool/result"
"github.com/eyebluecn/tank/code/tool/util"
"net/http"
"os"
"regexp"
"strings"
)
//@Service
type PreferenceService struct {
BaseBean
preferenceDao *PreferenceDao
preference *Preference
matterDao *MatterDao
matterService *MatterService
userDao *UserDao
migrating bool
}
func (this *PreferenceService) Init() {
@@ -17,6 +31,21 @@ func (this *PreferenceService) Init() {
this.preferenceDao = b
}
b = core.CONTEXT.GetBean(this.matterDao)
if b, ok := b.(*MatterDao); ok {
this.matterDao = b
}
b = core.CONTEXT.GetBean(this.matterService)
if b, ok := b.(*MatterService); ok {
this.matterService = b
}
b = core.CONTEXT.GetBean(this.userDao)
if b, ok := b.(*UserDao); ok {
this.userDao = b
}
}
func (this *PreferenceService) Fetch() *Preference {
@@ -42,3 +71,191 @@ func (this *PreferenceService) Cleanup() {
this.Reset()
}
//migrate 2.0's db data and file data to 3.0
func (this *PreferenceService) Migrate20to30(writer http.ResponseWriter, request *http.Request) {
matterPath := request.FormValue("matterPath")
if matterPath == "" {
panic(result.BadRequest("matterPath required"))
}
this.logger.Info("start migrating from 2.0 to 3.0")
//lock
if this.migrating {
panic(result.BadRequest("migrating work is processing"))
} else {
this.migrating = true
}
defer func() {
this.migrating = false
}()
//delete all users with _20
this.userDao.DeleteUsers20()
migrateDashboardSql := "INSERT INTO `tank`.`tank30_download_token` ( `uuid`, `sort`, `update_time`, `create_time`, `user_uuid`, `matter_uuid`, `expire_time`, `ip` ) ( SELECT `uuid`, `sort`, `update_time`, `create_time`, `user_uuid`, `matter_uuid`, `expire_time`, `ip` FROM `tank`.`tank20_download_token`)"
this.logger.Info(migrateDashboardSql)
db := core.CONTEXT.GetDB().Exec(migrateDashboardSql)
if db.Error != nil {
this.logger.Error("%v", db.Error)
}
migrateDownloadTokenSql := "INSERT INTO `tank`.`tank30_dashboard` ( `uuid`, `sort`, `update_time`, `create_time`, `invoke_num`, `total_invoke_num`, `uv`, `total_uv`, `matter_num`, `total_matter_num`, `file_size`, `total_file_size`, `avg_cost`, `dt` ) ( SELECT `uuid`, `sort`, `update_time`, `create_time`, `invoke_num`, `total_invoke_num`, `uv`, `total_uv`, `matter_num`, `total_matter_num`, `file_size`, `total_file_size`, `avg_cost`, `dt` FROM `tank`.`tank20_dashboard` )"
this.logger.Info(migrateDownloadTokenSql)
db = core.CONTEXT.GetDB().Exec(migrateDownloadTokenSql)
if db.Error != nil {
this.logger.Error("%v", db.Error)
}
migrateMatterSql := "INSERT INTO `tank`.`tank30_matter` ( `uuid`, `sort`, `update_time`, `create_time`, `puuid`, `user_uuid`, `username`, `dir`, `name`, `md5`, `size`, `privacy`, `path`, `times` ) ( SELECT `uuid`, `sort`, `update_time`, `create_time`, `puuid`, `user_uuid`, '', `dir`, `name`, `md5`, `size`, `privacy`, `path`, `times` FROM `tank`.`tank20_matter` ) "
this.logger.Info(migrateMatterSql)
db = core.CONTEXT.GetDB().Exec(migrateMatterSql)
if db.Error != nil {
this.logger.Error("%v", db.Error)
}
migrateUploadTokenSql := "INSERT INTO `tank`.`tank30_upload_token` ( `uuid`, `sort`, `update_time`, `create_time`, `user_uuid`, `folder_uuid`, `matter_uuid`, `expire_time`, `filename`, `privacy`, `size`, `ip` ) ( SELECT `uuid`, `sort`, `update_time`, `create_time`, `user_uuid`, `folder_uuid`, `matter_uuid`, `expire_time`, `filename`, `privacy`, `size`, `ip` FROM `tank`.`tank20_upload_token` ) "
this.logger.Info(migrateUploadTokenSql)
db = core.CONTEXT.GetDB().Exec(migrateUploadTokenSql)
if db.Error != nil {
this.logger.Error("%v", db.Error)
}
//username in tank2.0 add _20.
migrateUserSql := "INSERT INTO `tank`.`tank30_user` ( `uuid`, `sort`, `update_time`, `create_time`, `role`, `username`, `password`, `avatar_url`, `last_ip`, `last_time`, `size_limit`, `total_size_limit`, `total_size`, `status` ) ( SELECT `uuid`, `sort`, `update_time`, `create_time`, `role`, CONCAT(`username`,'_20') as `username`, `password`, `avatar_url`, `last_ip`, `last_time`, `size_limit`, -1, 0, `status` FROM `tank`.`tank20_user` )"
this.logger.Info(migrateUserSql)
db = core.CONTEXT.GetDB().Exec(migrateUserSql)
if db.Error != nil {
this.logger.Error("%v", db.Error)
}
//find all 2.0 users.
users := this.userDao.FindUsers20()
for _, user := range users {
this.logger.Info("start handling matters for user %s %s", user.Uuid, user.Username)
rootMatter := NewRootMatter(user)
firstLevelMatters := this.matterDao.FindByPuuidAndUserUuid(MATTER_ROOT, user.Uuid, nil)
for _, firstLevelMatter := range firstLevelMatters {
this.HandleMatter20(request, matterPath, rootMatter, firstLevelMatter, user)
}
//adjust all the size.
this.matterService.ComputeAllDirSize(user)
}
}
//handle matter from 2.0
func (this *PreferenceService) HandleMatter20(request *http.Request, matterPath string, dirMatter *Matter, matter *Matter, user *User) {
defer func() {
if err := recover(); err != nil {
this.logger.Warn("HandleMatter20 occur error %v when handle matter %s %s. Ignore the error and continue. \r\n", err, matter.Uuid, matter.Name)
}
}()
this.logger.Info("start handling matter %s", matter.Name)
if matter == nil {
panic(result.BadRequest("matter cannot be nil."))
}
if user == nil {
panic(result.BadRequest("user cannot be nil."))
}
if dirMatter == nil {
panic(result.BadRequest("dirMatter cannot be nil"))
}
if !dirMatter.Dir {
panic(result.BadRequest("dirMatter must be directory"))
}
if dirMatter.UserUuid != user.Uuid {
panic(result.BadRequest("file's user not the same"))
}
name := matter.Name
filename := name
if name == "" {
panic(result.BadRequest("name cannot be blank"))
}
if len(name) > MATTER_NAME_MAX_LENGTH {
panic(result.BadRequestI18n(request, i18n.MatterNameLengthExceedLimit, len(name), MATTER_NAME_MAX_LENGTH))
}
//if directory. Create it.
if matter.Dir {
if m, _ := regexp.MatchString(MATTER_NAME_PATTERN, name); m {
panic(result.BadRequestI18n(request, i18n.MatterNameContainSpecialChars))
}
parts := strings.Split(dirMatter.Path, "/")
if len(parts) > MATTER_NAME_MAX_DEPTH {
panic(result.BadRequestI18n(request, i18n.MatterDepthExceedLimit, len(parts), MATTER_NAME_MAX_DEPTH))
}
absolutePath := GetUserMatterRootDir(user.Username) + dirMatter.Path + "/" + name
relativePath := dirMatter.Path + "/" + name
//crate directory on disk.
dirPath := util.MakeDirAll(absolutePath)
this.logger.Info("Create Directory: %s", dirPath)
//change matter info.
matter.Username = user.Username
matter.Path = relativePath
matter = this.matterDao.Save(matter)
//handle its children.
children := this.matterDao.FindByPuuidAndUserUuid(matter.Uuid, user.Uuid, nil)
for _, child := range children {
this.HandleMatter20(request, matterPath, matter, child, user)
}
} else {
//if file. copy and adjust it.
dirAbsolutePath := dirMatter.AbsolutePath()
dirRelativePath := dirMatter.Path
fileAbsolutePath := dirAbsolutePath + "/" + filename
fileRelativePath := dirRelativePath + "/" + filename
util.MakeDirAll(dirAbsolutePath)
//if exist, panic it.
exist := util.PathExists(fileAbsolutePath)
if exist {
this.logger.Error("%s exits, overwrite it.", fileAbsolutePath)
removeError := os.Remove(fileAbsolutePath)
this.PanicError(removeError)
}
srcAbsolutePath := fmt.Sprintf("%s%s", matterPath, matter.Path)
//find the 2.0 disk file.
fileSize := util.CopyFile(srcAbsolutePath, fileAbsolutePath)
this.logger.Info("copy %s %v ", filename, util.HumanFileSize(fileSize))
//update info.
matter.Path = fileRelativePath
matter.Username = user.Username
matter = this.matterDao.Save(matter)
}
}
+2 -2
View File
@@ -293,7 +293,7 @@ func (this *ShareController) Browse(writer http.ResponseWriter, request *http.Re
Value: DIRECTION_DESC,
},
}
matters = this.matterDao.ListByUuids(uuids, sortArray)
matters = this.matterDao.FindByUuids(uuids, sortArray)
share.Matters = matters
}
@@ -358,7 +358,7 @@ func (this *ShareController) Zip(writer http.ResponseWriter, request *http.Reque
for _, bridge := range bridges {
matterUuids = append(matterUuids, bridge.MatterUuid)
}
matters := this.matterDao.ListByUuids(matterUuids, nil)
matters := this.matterDao.FindByUuids(matterUuids, nil)
this.matterService.DownloadZip(writer, request, matters)
} else {
+19
View File
@@ -130,6 +130,25 @@ func (this *UserDao) Save(user *User) *User {
return user
}
//find all 2.0 users.
func (this *UserDao) FindUsers20() []*User {
var users []*User
var wp = &builder.WherePair{}
wp = wp.And(&builder.WherePair{Query: "username like ?", Args: []interface{}{"%_20"}})
db := core.CONTEXT.GetDB().Model(&User{}).Where(wp.Query, wp.Args...).Find(&users)
this.PanicError(db.Error)
return users
}
func (this *UserDao) DeleteUsers20() {
var wp = &builder.WherePair{}
wp = wp.And(&builder.WherePair{Query: "username like ?", Args: []interface{}{"%_20"}})
db := core.CONTEXT.GetDB().Where(wp.Query, wp.Args...).Delete(User{})
this.PanicError(db.Error)
}
//System cleanup.
func (this *UserDao) Cleanup() {
this.logger.Info("[UserDao] clean up. Delete all User")
+3 -4
View File
@@ -195,12 +195,11 @@ func (this *TankRouter) ServeHTTP(writer http.ResponseWriter, request *http.Requ
//static file.
dir := util.GetHtmlPath()
requestURI := request.RequestURI
if requestURI == "" || request.RequestURI == "/" {
requestURI = "index.html"
if path == "" || path == "/" {
path = "index.html"
}
filePath := dir + requestURI
filePath := dir + path
exists := util.PathExists(filePath)
if !exists {
filePath = dir + "/index.html"