鍍金池/ 問答/ 網(wǎng)絡(luò)安全問答
枕邊人 回答

app.set('views', [path.join(__dirname, 'views'),path.join(__dirname, 'views/back')]);

放開她 回答

你應(yīng)該把請求的Accept設(shè)置成application/octet-stream.
這其實(shí)有的奇怪, 因?yàn)橐话闱闆r下 Excel 文件的 Accept 是application/vnd.ms-excel.
但是由于 flasgger 是使用 swagger-ui 作為前端, 而 Swagger 發(fā)送文件類請求是使用 superagent, 使用的是 blob 技術(shù), 需要設(shè)置 xhr 的 ResponseTypeblob.
我們看flasgger_static/lib/http.js:

if(this.binaryRequest(accept)) {
    r.on('request', function () {
      if(this.xhr) {
        this.xhr.responseType = 'blob';
      }
    });
  }
SuperagentHttpClient.prototype. binaryRequest = function (accept) {
  if(!accept) {
    return false;
  }
  return (/^image/i).test(accept)
    || (/^application\/pdf/).test(accept)
    || (/^application\/octet-stream/).test(accept);
};

只在 Accept 匹配為image/i,/^application\/pdf/,/^application\/octet-stream/, 才將 responseType 設(shè)置成 blob
所以要么將/^application\/vnd.ms-excel/這個匹配加入http.js, 要么將發(fā)送的請求全部設(shè)置成application/octet-stream.
也就是這樣設(shè)置produces:
app.py:

@app.route('/excel')
def excel():
    """
    ---
    produces:
      application/octet-stream
    responses:
      200:
        description: description_text
        schema:
          type: file
    """
    save_path = 'demo.xls'
    response = make_response(send_file(save_path))
    response.headers['Content-Disposition'] = 'attachment; filename=demo.xls'
    return response

比如現(xiàn)在的目錄結(jié)構(gòu):

clipboard.png
demo.py:

clipboard.png
apidocs頁面:

clipboard.png

命于你 回答

startsWith的mdn,這個你的看看,ie根本就沒事實(shí)現(xiàn)這個方法,你既然使用了babel-polyfill,那么你應(yīng)該是看不到startsWith這個方法的,所以應(yīng)該是沒有被轉(zhuǎn)譯,想想引得babel-polyfill是否正確,考慮使用mdn提供的轉(zhuǎn)譯再寫一遍。

/*! http://mths.be/startswith v0.2.0 by @mathias */
if (!String.prototype.startsWith) {
  (function() {
    'use strict'; // needed to support `apply`/`call` with `undefined`/`null`
    var defineProperty = (function() {
      // IE 8 only supports `Object.defineProperty` on DOM elements
      try {
        var object = {};
        var $defineProperty = Object.defineProperty;
        var result = $defineProperty(object, object, object) && $defineProperty;
      } catch(error) {}
      return result;
    }());
    var toString = {}.toString;
    var startsWith = function(search) {
      if (this == null) {
        throw TypeError();
      }
      var string = String(this);
      if (search && toString.call(search) == '[object RegExp]') {
        throw TypeError();
      }
      var stringLength = string.length;
      var searchString = String(search);
      var searchLength = searchString.length;
      var position = arguments.length > 1 ? arguments[1] : undefined;
      // `ToInteger`
      var pos = position ? Number(position) : 0;
      if (pos != pos) { // better `isNaN`
        pos = 0;
      }
      var start = Math.min(Math.max(pos, 0), stringLength);
      // Avoid the `indexOf` call if no match is possible
      if (searchLength + start > stringLength) {
        return false;
      }
      var index = -1;
      while (++index < searchLength) {
        if (string.charCodeAt(start + index) != searchString.charCodeAt(index)) {
          return false;
        }
      }
      return true;
    };
    if (defineProperty) {
      defineProperty(String.prototype, 'startsWith', {
        'value': startsWith,
        'configurable': true,
        'writable': true
      });
    } else {
      String.prototype.startsWith = startsWith;
    }
  }());
}
爛人 回答

@凌云識木 slice的零值是nil,轉(zhuǎn)化后就是json的null,文檔是ok的.

@xialeistudio 你的data["a"]是有值的, 且不是零值, 這種情況下轉(zhuǎn)成null才是有問題.

壞脾滊 回答

不懂,但是我猜想一下,會不會是需要攜帶的憑證參數(shù)沒有成功?或者進(jìn)行了跳轉(zhuǎn)你的APP沒有進(jìn)行處理。

嫑吢丕 回答

其實(shí)就是創(chuàng)建數(shù)組,數(shù)組每一項(xiàng)就是一個函數(shù), a[n]() 執(zhí)行數(shù)組里的第N個函數(shù)
例如:

var a = []; //創(chuàng)建數(shù)組賦值
a[1] = function () {
    console.log(1);
  };
a[2] = function () {
    console.log(2);
  };
a[3] = function () {
    console.log(3);
  };

//a =[a[1],a[2],a[3]]

a[3]() // 3

我甘愿 回答
1,我們的工作模式現(xiàn)在在別的公司(也不大那種吧)算是常見嗎,作為前端我是不是做的太少了

這種工作模式在小公司很常見的,尤其是某些做傳統(tǒng)軟件的公司,我也待過四五家公司了,待過小公司,待過大公司,對你的這種情況還是有點(diǎn)了解的。
小公司嗎,資金有限,用人成本在那里,恨不得招一個人來什么都會,也就不難理解讓你一個做前端的兼職設(shè)計(jì)ps AI等等(和我以前待的一個公司一樣,前端還要兼職做ui設(shè)計(jì))。
作為前端的你做的太雜了,你目前的狀態(tài)應(yīng)該是技術(shù)的深度更加重要,而不是廣度。PS AI,UI等應(yīng)該有專門的人去負(fù)責(zé)。

2,如果前后端分離的話,前端就只能從ajax獲取后臺數(shù)據(jù)?然后加載到dom嗎?有其他獲取的方式嗎

我是做后端的,前端的經(jīng)驗(yàn)不多。我個人認(rèn)為用的最多的應(yīng)該ajax調(diào)用后臺的接口獲取數(shù)據(jù),當(dāng)然也有其他獲取后臺數(shù)據(jù)的方式,比如后端主動將數(shù)據(jù)推送到前端。

不要小瞧從ajax獲取后臺數(shù)據(jù),然后加載到dom這個過程,很多前端框架把這個過程玩成了花。

3,如果頁面很多模塊比如好多下拉 還有表格,那么ajax要多次單獨(dú)傳輸還是一次傳輸過來?如果一次要怎么把數(shù)據(jù)(json)分布給這些組件呢(有條件的前輩復(fù)制個簡單demo給看看行嗎)

好多模塊需要的數(shù)據(jù)量很少,可以把這些模塊需要的數(shù)據(jù)后臺合并下,一次ajax就可以獲取。當(dāng)是對于有些模塊需要的數(shù)據(jù)量很大,這個時候最好按需加載,即用的時候ajax請求后臺獲取下。

4,以上憂慮來自于,項(xiàng)目數(shù)據(jù)很多,然后我對前后端交接處又 云里霧里,ajax基本是后端寫,導(dǎo)致我非常被動,對項(xiàng)目整體把握沒那么好,感覺后端貌似更容易吞噬前端,我想改變這種局面(有一次聽后端竟然說項(xiàng)目是他一個人做的<說是開玩笑,但是對我打擊很大>,我ri了)

主要還是你公司的問題,分工不明確。就你一個前端,后端不負(fù)責(zé)些前端的工作,項(xiàng)目什么時候能完成呀。
規(guī)范的公司會分工明確,會在項(xiàng)目前期確定好前后端怎么交互,并落實(shí)到文檔,前端參考文檔,有問題及時溝通即可。

5,我現(xiàn)在要從哪里開始做起,要如何慢慢改變這種已經(jīng)適應(yīng)了一年的模式,讓后端也能接受(貌似他的ajax也是基礎(chǔ)層面,難一些的也就不行了,我們項(xiàng)目要求不是很高,也沒有人說過啥,但我想讓前端表現(xiàn)的更好)
我以前學(xué)過PHP(比較淺那種),特別想深入學(xué)習(xí)一下,這樣只有自己實(shí)踐了才會明白其中的原理,因?yàn)楦杏X跟這個后端配合,我進(jìn)步不大,很被動,他習(xí)慣了只做他懂了,不會的就繞道了,所有他隨便搞,只要搞出來就行,我要從哪里插手?

既然做前端了,那就堅(jiān)持下去。換來換去,可能最后什么都只是會一點(diǎn)。你以為身邊的牛人天生就牛嗎,不是的,最重要的是別人比你花的時間多,比你勤奮,你晚上回去打游戲,別人在學(xué)習(xí),你周末去玩,別人在學(xué)習(xí),
你和女朋友你儂我儂,別人在學(xué)習(xí)。

換一家公司吧,不一定非要去大公司,很多小的公司技術(shù)也很規(guī)范的,技術(shù)氛圍也很好,小而美。

1:基礎(chǔ)(html/css/javascript/json等等一堆)一定要打扎實(shí)了。
2:大公司招聘前端的時候,都會列出一些技術(shù)要求,什么什么框架呀,你可以看看那些技術(shù)你是否掌握了。
3:經(jīng)驗(yàn)和解決問題的能力在工作中汲取,邊做邊學(xué),多思考,多做筆記。
4:肯花時間。

久愛她 回答

我草,這個存儲空間的名稱是整個oss唯一,不是按照帳號來的,我說怎么我?guī)ぬ柪锩鏇]有這個存儲空間,還提示我這個存儲空間不屬于我呢。

卟乖 回答

不知道是修改哪個成功的~,做了如下兩個操作就可以了!

  1. 配置文件Vagrantfile

添加:config.ssh.insert_key = false

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    config.ssh.insert_key = false
    if File.exist? aliasesPath then
        config.vm.provision "file", source: aliasesPath, destination: "/tmp/bash_aliases"
        config.vm.provision "shell" do |s|
            s.inline = "awk '{ sub(\"\r$\", \"\"); print }' /tmp/bash_aliases > /home/vagrant/.bash_aliases"
        end
    end
  1. 開啟電腦主板BIOS的虛擬化

參考:https://blog.csdn.net/github_...
華碩主板參考:https://zhidao.baidu.com/ques...

真難過 回答

是博文有誤,LDFLAGS-lxxx不應(yīng)該有lib前綴,我已重新整理https://github.com/meilihao/t...

囍槑 回答

第一個問題不太明晰。對于第二個問題,點(diǎn)擊下一頁后,前端通過js代碼得到 篩選條件以及下一頁對應(yīng)的頁碼值,生成 篩選參數(shù)以及頁碼參數(shù) 通過 get請求或其他請求 來訪問后臺,后臺通過附帶的 篩選參數(shù)以及頁碼參數(shù) 拼接出select語句 進(jìn)行下一頁的查詢(通過limit關(guān)鍵字實(shí)現(xiàn)分頁的查詢)。

monkey patchXMLHttpRequest 對象的原型方法吧,因?yàn)檎埱髱觳还茉趺捶庋b,一般內(nèi)部還是XMLHttpRequest,有的可能也用現(xiàn)代瀏覽器的fetch,比如:

(function(send) {

    XMLHttpRequest.prototype.send = function(data) {

        // do something...

        send.call(this, data);
    };

})(XMLHttpRequest.prototype.send);

如果要這么做的話,注意性能問題。

忠妾 回答

把curl寫在單獨(dú)的一個php里,做代理。前端每次包好數(shù)據(jù)、用ajax去發(fā)請求給這個php,在php里拿到數(shù)據(jù),重新打包發(fā)給真正的地址,返回的內(nèi)容再reture給前端頁面就可以了。這樣前端不會有跨域問題(因?yàn)檎嬲恼埱笫呛蠖税l(fā)的),另外還可以隱藏實(shí)際的接口地址(比如如果是部署在阿里云平臺的話,接口域名就可以用云平臺的內(nèi)網(wǎng)地址代替)。

墨小羽 回答

其實(shí)很簡單,使用javac編譯之后得到兩個class(Demo01.class Demo01$1.class),我貼上來你看一下。

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

public class Demo01 {
    String name;

    public Demo01(String var1) {
        System.out.println("類中的構(gòu)造代碼塊");
        System.out.println("構(gòu)造函數(shù)");
        this.name = var1;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String var1) {
        this.name = var1;
    }

    public void show() {
        System.out.println(this.name);
    }

    public static void main(String[] var0) {
        Demo01 var1 = new Demo01("11") {
            {
                System.out.println("構(gòu)造代碼塊???");
                this.setName("22");
            }
        };
        var1.show();
    }
}
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

final class Demo01$1 extends Demo01 {
    Demo01$1(String var1) {
        super(var1);
        System.out.println("構(gòu)造代碼塊???");
        this.setName("22");
    }
}
若相惜 回答

首先給出我認(rèn)為的正確寫法吧(我copy了Predicat類,然后改名為PredicateExt進(jìn)行重寫)

default PredicateExt<T> negate() {
        PredicateExt<T> predicate = this;
        PredicateExt<T> otherPredicate = new PredicateExt<T>() {
            @Override
            public boolean test(T t) {
                return !predicate.test(t);
            }
        };
        return otherPredicate;
    }

再來看看Java8中Predicate.negate到底表達(dá)的是什么意思

  1. Predicate肯定是一個類,(t) -> !test(t)這種lamdba語法也只是表示Predicate的一個對象而已
  2. default方法就是代表了Predicate對象的某個實(shí)例方法

因此結(jié)合以上兩點(diǎn),可以直接看出Predicate.negate代表Predicate的某個對象A執(zhí)行時,根據(jù)A的執(zhí)行結(jié)果再次創(chuàng)建了一個新Predicate的對象B
所以,要換種方式來表示Predicate.negate方法,肯定也要體現(xiàn)出A,B兩個新舊對象,并且該方法的執(zhí)行結(jié)果是根據(jù)A的執(zhí)行結(jié)果體現(xiàn)出來的

再來說說題主為什么會死循環(huán),雖然題主已經(jīng)明顯new了一個Predicate對象,這里體現(xiàn)了A,B兩個新舊對象,但是后面的執(zhí)行結(jié)果并沒有體現(xiàn)出是根據(jù)A的執(zhí)行結(jié)果來產(chǎn)生B的
主要在于里面的在重寫B(tài)的test方法時,是再調(diào)用test方法的,只是前面加了一個!,所以顯然這里調(diào)用的是B的Predicatetest方法,當(dāng)然就是循環(huán)調(diào)用了,可別指望它能調(diào)用A的Predicate方法,因?yàn)槟阏谥貙戇@個新Predicate的方法,這里的this指針,肯定是指向B的

鑒于此,既然在B里面重寫方法時this指針是指向B的,那就在外面顯示的把A的對象指示出來,然后再B中重寫時,顯示用的A的方法進(jìn)行執(zhí)行,這樣就可以了,所以才有上面的寫法

從運(yùn)行的debug來看,以前的方式和現(xiàn)在重寫的方式,在新的B對象中,都包含了以前的舊對象A的,所以是可行的

clipboard.png

遲月 回答

標(biāo)準(zhǔn)的stylus語法就是沒有花括號,沒有分號,沒有冒號。
剛開始也許你不是很適應(yīng),寫久了,你會發(fā)現(xiàn)這真的是爽。
不過本王還是喜歡scss,stylus的功能滿足不了本王,而且,如果是直接在瀏覽器上條樣式,然后想復(fù)制粘貼到vscode上,還得手動刪去冒號和分號,雖然不刪也可以,但畢竟要統(tǒng)一。
本王也有見過雖然用著stylus,但是寫法卻是scss的寫法,那還不如一開始就用scss,本王也是更支持vue項(xiàng)目使用scss的。

墨沫 回答

encoding 函數(shù)使用有問題的話,可以嘗試自己手動對html進(jìn)行轉(zhuǎn)碼

心夠野 回答

使用onerror="default.png" 給張默認(rèn)的圖片