low" class="ui green sha label" href="/tonglan/adminSystem/commit/11e3a9652a62b867d722e5aebdba895bb86f9ed3 ">11e3a9652a first 8 年之前 babel-plugin-transform-vue-jsx 11e3a9652a first 8 年之前 babel-preset-env 11e3a9652a first 8 年之前 babel-preset-jest 11e3a9652a first 8 年之前 babel-preset-stage-2 11e3a9652a first 8 年之前 babel-preset-stage-3 11e3a9652a first 8 年之前 babel-preset-vue 11e3a9652a first 8 年之前 babel-preset-vue-app 11e3a9652a first 8 年之前 babel-register 11e3a9652a first 8 年之前 babel-runtime 11e3a9652a first 8 年之前 babel-template 11e3a9652a first 8 年之前 babel-traverse 11e3a9652a first 8 年之前 babel-types 11e3a9652a first 8 年之前 babylon 11e3a9652a first 8 年之前 balanced-match 11e3a9652a first 8 年之前 base 11e3a9652a first 8 年之前 base64-js 11e3a9652a first 8 年之前 batch 11e3a9652a first 8 年之前 bcrypt-pbkdf 11e3a9652a first 8 年之前 bfj-node4 11e3a9652a first 8 年之前 big.js 11e3a9652a first 8 年之前 binary-extensions 11e3a9652a first 8 年之前 block-stream 11e3a9652a first 8 年之前 bluebird 11e3a9652a first 8 年之前 bn.js 11e3a9652a first 8 年之前 body-parser 11e3a9652a first 8 年之前 bonjour 11e3a9652a first 8 年之前 boolbase 11e3a9652a first 8 年之前 boom 11e3a9652a first 8 年之前 brace-expansion 11e3a9652a first 8 年之前 braces 11e3a9652a first 8 年之前 brorand 11e3a9652a first 8 年之前 browser-process-hrtime 11e3a9652a first 8 年之前 browser-resolve 11e3a9652a first 8 年之前 browser-stdout 11e3a9652a first 8 年之前 browserify-aes 11e3a9652a first 8 年之前 browserify-cipher 11e3a9652a first 8 年之前 browserify-des 11e3a9652a first 8 年之前 browserify-rsa 11e3a9652a first 8 年之前 browserify-sign 11e3a9652a first 8 年之前 browserify-zlib 11e3a9652a first 8 年之前 browserslist 11e3a9652a first 8 年之前 bser 11e3a9652a first 8 年之前 buffer 11e3a9652a first 8 年之前 buffer-indexof 11e3a9652a first 8 年之前 buffer-xor 11e3a9652a first 8 年之前 builtin-modules 11e3a9652a first 8 年之前 builtin-status-codes 11e3a9652a first 8 年之前 bytes 11e3a9652a first 8 年之前 cacache 11e3a9652a first 8 年之前 cache-base 11e3a9652a first 8 年之前 caller-path 11e3a9652a first 8 年之前 callsites 11e3a9652a first 8 年之前 camel-case 11e3a9652a first 8 年之前 camelcase 11e3a9652a first 8 年之前 camelcase-keys 11e3a9652a first 8 年之前 caniuse-api 11e3a9652a first 8 年之前 caniuse-db 11e3a9652a first 8 年之前 caniuse-lite 11e3a9652a first 8 年之前 caseless 11e3a9652a first 8 年之前 center-align 11e3a9652a first 8 年之前 chai-nightwatch 11e3a9652a first 8 年之前 chalk 11e3a9652a first 8 年之前 chardet 11e3a9652a first 8 年之前 check-types 11e3a9652a first 8 年之前 chokidar 11e3a9652a first 8 年之前 chownr 11e3a9652a first 8 年之前 chromedriver 11e3a9652a first 8 年之前 ci-info 11e3a9652a first 8 年之前 cipher-base 11e3a9652a first 8 年之前 circular-json 11e3a9652a first 8 年之前 clap 11e3a9652a first 8 年之前 class-utils 11e3a9652a first 8 年之前 clean-css 11e3a9652a first 8 年之前 cli-cursor 11e3a9652a first 8 年之前 cli-spinners 11e3a9652a first 8 年之前 cli-width 11e3a9652a first 8 年之前 cliui 11e3a9652a first 8 年之前 clone 11e3a9652a first 8 年之前 clone-deep 11e3a9652a first 8 年之前 co 11e3a9652a first 8 年之前 coa 11e3a9652a first 8 年之前 coalescy 11e3a9652a first 8 年之前 code-point-at 11e3a9652a first 8 年之前 collection-visit 11e3a9652a first 8 年之前 color 11e3a9652a first 8 年之前 color-convert 11e3a9652a first 8 年之前 color-name 11e3a9652a first 8 年之前 color-string 11e3a9652a first 8 年之前 colormin 11e3a9652a first 8 年之前 colors 11e3a9652a first 8 年之前 combined-stream 11e3a9652a first 8 年之前 commander 11e3a9652a first 8 年之前 commondir 11e3a9652a first 8 年之前 compare-versions 11e3a9652a first 8 年之前 component-emitter 11e3a9652a first 8 年之前 compressible 11e3a9652a first 8 年之前 compression 11e3a9652a first 8 年之前 concat-map 11e3a9652a first 8 年之前 concat-stream 11e3a9652a first 8 年之前 condense-newlines 11e3a9652a first 8 年之前 config-chain 11e3a9652a first 8 年之前 connect-history-api-fallback 11e3a9652a first 8 年之前 console-browserify 11e3a9652a first 8 年之前 console-control-strings 11e3a9652a first 8 年之前 consolidate 11e3a9652a first 8 年之前 constants-browserify 11e3a9652a first 8 年之前 contains-path 11e3a9652a first 8 年之前 content-disposition 11e3a9652a first 8 年之前 content-type 11e3a9652a first 8 年之前 convert-source-map 11e3a9652a first 8 年之前 cookie 11e3a9652a first 8 年之前 cookie-signature 11e3a9652a first 8 年之前 copy-concurrently 11e3a9652a first 8 年之前 copy-descriptor 11e3a9652a first 8 年之前 copy-webpack-plugin 11e3a9652a first 8 年之前 core-js 11e3a9652a first 8 年之前 core-util-is 11e3a9652a first 8 年之前 cosmiconfig 11e3a9652a first 8 年之前 create-ecdh 11e3a9652a first 8 年之前 create-hash 11e3a9652a first 8 年之前 create-hmac 11e3a9652a first 8 年之前 cross-spawn 11e3a9652a first 8 年之前 cryptiles 11e3a9652a first 8 年之前 crypto-browserify 11e3a9652a first 8 年之前 css-color-names 11e3a9652a first 8 年之前 css-loader 11e3a9652a first 8 年之前 css-select 11e3a9652a first 8 年之前 css-selector-tokenizer 11e3a9652a first 8 年之前 css-what 11e3a9652a first 8 年之前 cssesc 11e3a9652a first 8 年之前 cssnano 11e3a9652a first 8 年之前 csso 11e3a9652a first 8 年之前 cssom 11e3a9652a first 8 年之前 cssstyle 11e3a9652a first 8 年之前 cuint 11e3a9652a first 8 年之前 currently-unhandled 11e3a9652a first 8 年之前 cyclist 11e3a9652a first 8 年之前 d 11e3a9652a first 8 年之前 dashdash 11e3a9652a first 8 年之前 data-uri-to-buffer 11e3a9652a first 8 年之前 data-urls 11e3a9652a first 8 年之前 date-now 11e3a9652a first 8 年之前 de-indent 11e3a9652a first 8 年之前 debug 11e3a9652a first 8 年之前 decamelize 11e3a9652a first 8 年之前 decode-uri-component 11e3a9652a first 8 年之前 deep-eql 11e3a9652a first 8 年之前 deep-equal 11e3a9652a first 8 年之前 deep-is 11e3a9652a first 8 年之前 deepmerge 11e3a9652a first 8 年之前 default-require-extensions 11e3a9652a first 8 年之前 define-properties 11e3a9652a first 8 年之前 define-property 11e3a9652a first 8 年之前 defined 11e3a9652a first 8 年之前 degenerator 11e3a9652a first 8 年之前 del 11e3a9652a first 8 年之前 delayed-stream 11e3a9652a first 8 年之前 delegates 11e3a9652a first 8 年之前 depd 11e3a9652a first 8 年之前 des.js 11e3a9652a first 8 年之前 destroy 11e3a9652a first 8 年之前 detect-indent 11e3a9652a first 8 年之前 detect-newline 11e3a9652a first 8 年之前 detect-node 11e3a9652a first 8 年之前 diff 11e3a9652a first 8 年之前 diffie-hellman 11e3a9652a first 8 年之前 dir-glob 11e3a9652a first 8 年之前 dns-equal 11e3a9652a first 8 年之前 dns-packet 11e3a9652a first 8 年之前 dns-txt 11e3a9652a first 8 年之前 doctrine 11e3a9652a first 8 年之前 dom-converter 11e3a9652a first 8 年之前 dom-serializer 11e3a9652a first 8 年之前 domain-browser 11e3a9652a first 8 年之前 domelementtype 11e3a9652a first 8 年之前 domexception 11e3a9652a first 8 年之前 domhandler 11e3a9652a first 8 年之前 domutils 11e3a9652a first 8 年之前 duplexer 11e3a9652a first 8 年之前 duplexify 11e3a9652a first 8 年之前 ecc-jsbn 11e3a9652a first 8 年之前 echarts 11e3a9652a first 8 年之前 editorconfig 11e3a9652a first 8 年之前 ee-first 11e3a9652a first 8 年之前 ejs 11e3a9652a first 8 年之前 electron-to-chromium 11e3a9652a first 8 年之前 element-ui 11e3a9652a first 8 年之前 elliptic 11e3a9652a first 8 年之前 emojis-list 11e3a9652a first 8 年之前 encodeurl 11e3a9652a first 8 年之前 end-of-stream 11e3a9652a first 8 年之前 enhanced-resolve 11e3a9652a first 8 年之前 entities 11e3a9652a first 8 年之前 errno 11e3a9652a first 8 年之前 error-ex 11e3a9652a first 8 年之前 error-stack-parser 11e3a9652a first 8 年之前 es-abstract 11e3a9652a first 8 年之前 es-to-primitive 11e3a9652a first 8 年之前 es5-ext 11e3a9652a first 8 年之前 es6-iterator 11e3a9652a first 8 年之前 es6-map 11e3a9652a first 8 年之前 es6-set 11e3a9652a first 8 年之前 es6-symbol 11e3a9652a first 8 年之前 es6-weak-map 11e3a9652a first 8 年之前 escape-html 11e3a9652a first 8 年之前 escape-string-regexp 11e3a9652a first 8 年之前 escodegen 11e3a9652a first 8 年之前 escope 11e3a9652a first 8 年之前 eslint 11e3a9652a first 8 年之前 eslint-config-standard 11e3a9652a first 8 年之前 eslint-friendly-formatter 11e3a9652a first 8 年之前 eslint-import-resolver-node 11e3a9652a first 8 年之前 eslint-loader 11e3a9652a first 8 年之前 eslint-module-utils 11e3a9652a first 8 年之前 eslint-plugin-import 11e3a9652a first 8 年之前 eslint-plugin-node 11e3a9652a first 8 年之前 eslint-plugin-promise 11e3a9652a first 8 年之前 eslint-plugin-standard 11e3a9652a first 8 年之前 eslint-plugin-vue 11e3a9652a first 8 年之前 eslint-scope 11e3a9652a first 8 年之前 eslint-visitor-keys 11e3a9652a first 8 年之前 espree 11e3a9652a first 8 年之前 esprima 11e3a9652a first 8 年之前 esquery 11e3a9652a first 8 年之前 esrecurse 11e3a9652a first 8 年之前 estraverse 11e3a9652a first 8 年之前 esutils 11e3a9652a first 8 年之前 etag 11e3a9652a first 8 年之前 event-emitter 11e3a9652a first 8 年之前 eventemitter3 11e3a9652a first 8 年之前 events 11e3a9652a first 8 年之前 eventsource 11e3a9652a first 8 年之前 evp_bytestokey 11e3a9652a first 8 年之前 exec-sh 11e3a9652a first 8 年之前 execa 11e3a9652a first 8 年之前 exit 11e3a9652a first 8 年之前 expand-brackets 11e3a9652a first 8 年之前 expand-range 11e3a9652a first 8 年之前 expect 11e3a9652a first 8 年之前 express 11e3a9652a first 8 年之前 extend 11e3a9652a first 8 年之前 extend-shallow 11e3a9652a first 8 年之前 external-editor 11e3a9652a first 8 年之前 extglob 11e3a9652a first 8 年之前 extract-text-webpack-plugin 11e3a9652a first 8 年之前 extract-zip 11e3a9652a first 8 年之前 extsprintf 11e3a9652a first 8 年之前 fast-deep-equal 11e3a9652a first 8 年之前 fast-json-stable-stringify 11e3a9652a first 8 年之前 fast-levenshtein 11e3a9652a first 8 年之前 fastparse 11e3a9652a first 8 年之前 faye-websocket 11e3a9652a first 8 年之前 fb-watchman 11e3a9652a first 8 年之前 fd-slicer 11e3a9652a first 8 年之前 figures 11e3a9652a first 8 年之前 file-entry-cache 11e3a9652a first 8 年之前 file-loader 11e3a9652a first 8 年之前 file-uri-to-path 11e3a9652a first 8 年之前 filename-regex 11e3a9652a first 8 年之前 fileset 11e3a9652a first 8 年之前 filesize 11e3a9652a first 8 年之前 fill-range 11e3a9652a first 8 年之前 finalhandler 11e3a9652a first 8 年之前 find-babel-config 11e3a9652a first 8 年之前 find-cache-dir 11e3a9652a first 8 年之前 find-up 11e3a9652a first 8 年之前 flat-cache 11e3a9652a first 8 年之前 flatten 11e3a9652a first 8 年之前 flush-write-stream 11e3a9652a first 8 年之前 follow-redirects 11e3a9652a first 8 年之前 for-in 11e3a9652a first 8 年之前 for-own 11e3a9652a first 8 年之前 foreach 11e3a9652a first 8 年之前 forever-agent 11e3a9652a first 8 年之前 form-data 11e3a9652a first 8 年之前 forwarded 11e3a9652a first 8 年之前 fragment-cache 11e3a9652a first 8 年之前 fresh 11e3a9652a first 8 年之前 friendly-errors-webpack-plugin 11e3a9652a first 8 年之前 from2 11e3a9652a first 8 年之前 fs-write-stream-atomic 11e3a9652a first 8 年之前 fs.realpath 11e3a9652a first 8 年之前 fsevents 11e3a9652a first 8 年之前 fstream 11e3a9652a first 8 年之前 ftp 11e3a9652a first 8 年之前 function-bind 11e3a9652a first 8 年之前 functional-red-black-tree 11e3a9652a first 8 年之前 gauge 11e3a9652a first 8 年之前 gaze 11e3a9652a first 8 年之前 generate-function 11e3a9652a first 8 年之前 generate-object-property 11e3a9652a first 8 年之前 get-caller-file 11e3a9652a first 8 年之前 get-stdin 11e3a9652a first 8 年之前 get-stream 11e3a9652a first 8 年之前 get-uri 11e3a9652a first 8 年之前 get-value 11e3a9652a first 8 年之前 getpass 11e3a9652a first 8 年之前 glob 11e3a9652a first 8 年之前 glob-base 11e3a9652a first 8 年之前 glob-parent 11e3a9652a first 8 年之前 globals 11e3a9652a first 8 年之前 globby 11e3a9652a first 8 年之前 globule 11e3a9652a first 8 年之前 graceful-fs 11e3a9652a first 8 年之前 graceful-readlink 11e3a9652a first 8 年之前 growl 11e3a9652a first 8 年之前 growly 11e3a9652a first 8 年之前 gzip-size 11e3a9652a first 8 年之前 handle-thing 11e3a9652a first 8 年之前 handlebars 11e3a9652a first 8 年之前 har-schema 11e3a9652a first 8 年之前 har-validator 11e3a9652a first 8 年之前 has 11e3a9652a first 8 年之前 has-ansi 11e3a9652a first 8 年之前 has-flag 11e3a9652a first 8 年之前 has-unicode 11e3a9652a first 8 年之前 has-value 11e3a9652a first 8 年之前 has-values 11e3a9652a first 8 年之前 hash-base 11e3a9652a first 8 年之前 hash-sum 11e3a9652a first 8 年之前 hash.js 11e3a9652a first 8 年之前 hawk 11e3a9652a first 8 年之前 he 11e3a9652a first 8 年之前 hmac-drbg 11e3a9652a first 8 年之前 hoek 11e3a9652a first 8 年之前 home-or-tmp 11e3a9652a first 8 年之前 hosted-git-info 11e3a9652a first 8 年之前 hpack.js 11e3a9652a first 8 年之前 html-comment-regex 11e3a9652a first 8 年之前 html-encoding-sniffer 11e3a9652a first 8 年之前 html-entities 11e3a9652a first 8 年之前 html-minifier 11e3a9652a first 8 年之前 html-tags 11e3a9652a first 8 年之前 html-webpack-plugin 11e3a9652a first 8 年之前 htmlparser2 11e3a9652a first 8 年之前 http-deceiver 11e3a9652a first 8 年之前 http-errors 11e3a9652a first 8 年之前 http-parser-js 11e3a9652a first 8 年之前 http-proxy 11e3a9652a first 8 年之前 http-proxy-agent 11e3a9652a first 8 年之前 http-proxy-middleware 11e3a9652a first 8 年之前 http-signature 11e3a9652a first 8 年之前 https-browserify 11e3a9652a first 8 年之前 https-proxy-agent 11e3a9652a first 8 年之前 iconv-lite 11e3a9652a first 8 年之前 icss-replace-symbols 11e3a9652a first 8 年之前 icss-utils 11e3a9652a first 8 年之前 ieee754 11e3a9652a first 8 年之前 iferr 11e3a9652a first 8 年之前 ignore 11e3a9652a first 8 年之前 import-local 11e3a9652a first 8 年之前 imurmurhash 11e3a9652a first 8 年之前 in-publish 11e3a9652a first 8 年之前 indent-string 11e3a9652a first 8 年之前 indexes-of 11e3a9652a first 8 年之前 indexof 11e3a9652a first 8 年之前 inflight 11e3a9652a first 8 年之前 inherits 11e3a9652a first 8 年之前 ini 11e3a9652a first 8 年之前 inquirer 11e3a9652a first 8 年之前 internal-ip 11e3a9652a first 8 年之前 interpret 11e3a9652a first 8 年之前 invariant 11e3a9652a first 8 年之前 invert-kv 11e3a9652a first 8 年之前 ip 11e3a9652a first 8 年之前 ipaddr.js 11e3a9652a first 8 年之前 is-absolute-url 11e3a9652a first 8 年之前 is-accessor-descriptor 11e3a9652a first 8 年之前 is-arrayish 11e3a9652a first 8 年之前 is-binary-path 11e3a9652a first 8 年之前 is-buffer 11e3a9652a first 8 年之前 is-builtin-module 11e3a9652a first 8 年之前 is-callable 11e3a9652a first 8 年之前 is-ci 11e3a9652a first 8 年之前 is-data-descriptor 11e3a9652a first 8 年之前 is-date-object 11e3a9652a first 8 年之前 is-descriptor 11e3a9652a first 8 年之前 is-directory 11e3a9652a first 8 年之前 is-dotfile 11e3a9652a first 8 年之前 is-equal-shallow 11e3a9652a first 8 年之前 is-extendable 11e3a9652a first 8 年之前 is-extglob 11e3a9652a first 8 年之前 is-finite 11e3a9652a first 8 年之前 is-fullwidth-code-point 11e3a9652a first 8 年之前 is-generator-fn 11e3a9652a first 8 年之前 is-glob 11e3a9652a first 8 年之前 is-my-ip-valid 11e3a9652a first 8 年之前 is-my-json-valid 11e3a9652a first 8 年之前 is-number 11e3a9652a first 8 年之前 is-odd 11e3a9652a first 8 年之前 is-path-cwd 11e3a9652a first 8 年之前 is-path-in-cwd 11e3a9652a first 8 年之前 is-path-inside 11e3a9652a first 8 年之前 is-plain-obj 11e3a9652a first 8 年之前 is-plain-object 11e3a9652a first 8 年之前 is-posix-bracket 11e3a9652a first 8 年之前 is-primitive 11e3a9652a first 8 年之前 is-promise 11e3a9652a first 8 年之前 is-property 11e3a9652a first 8 年之前 is-regex 11e3a9652a first 8 年之前 is-resolvable 11e3a9652a first 8 年之前 is-stream 11e3a9652a first 8 年之前 is-svg 11e3a9652a first 8 年之前 is-symbol 11e3a9652a first 8 年之前 is-typedarray 11e3a9652a first 8 年之前 is-utf8 11e3a9652a first 8 年之前 is-whitespace 11e3a9652a first 8 年之前 is-windows 11e3a9652a first 8 年之前 is-wsl 11e3a9652a first 8 年之前 isarray 11e3a9652a first 8 年之前 isexe 11e3a9652a first 8 年之前 isobject 11e3a9652a first 8 年之前 isstream 11e3a9652a first 8 年之前 istanbul-api 11e3a9652a first 8 年之前 istanbul-lib-coverage 11e3a9652a first 8 年之前 istanbul-lib-hook 11e3a9652a first 8 年之前 istanbul-lib-instrument 11e3a9652a first 8 年之前 istanbul-lib-report 11e3a9652a first 8 年之前 istanbul-lib-source-maps 11e3a9652a first 8 年之前 istanbul-reports 11e3a9652a first 8 年之前 jest 11e3a9652a first 8 年之前 jest-changed-files 11e3a9652a first 8 年之前 jest-config 11e3a9652a first 8 年之前 jest-diff 11e3a9652a first 8 年之前 jest-docblock 11e3a9652a first 8 年之前 jest-environment-jsdom 11e3a9652a first 8 年之前 jest-environment-node 11e3a9652a first 8 年之前 jest-get-type 11e3a9652a first 8 年之前 jest-haste-map 11e3a9652a first 8 年之前 jest-jasmine2 11e3a9652a first 8 年之前 jest-leak-detector 11e3a9652a first 8 年之前 jest-matcher-utils 11e3a9652a first 8 年之前 jest-message-util 11e3a9652a first 8 年之前 jest-mock 11e3a9652a first 8 年之前 jest-regex-util 11e3a9652a first 8 年之前 jest-resolve 11e3a9652a first 8 年之前 jest-resolve-dependencies 11e3a9652a first 8 年之前 jest-runner 11e3a9652a first 8 年之前 jest-runtime 11e3a9652a first 8 年之前 jest-serializer 11e3a9652a first 8 年之前 jest-serializer-vue 11e3a9652a first 8 年之前 jest-snapshot 11e3a9652a first 8 年之前 jest-util 11e3a9652a first 8 年之前 jest-validate 11e3a9652a first 8 年之前 jest-worker 11e3a9652a first 8 年之前 js-base64 11e3a9652a first 8 年之前 js-beautify 11e3a9652a first 8 年之前 js-tokens 11e3a9652a first 8 年之前 js-yaml 11e3a9652a first 8 年之前 jsbn 11e3a9652a first 8 年之前 jsdom 11e3a9652a first 8 年之前 jsesc 11e3a9652a first 8 年之前 json-loader 11e3a9652a first 8 年之前 json-schema 11e3a9652a first 8 年之前 json-schema-traverse 11e3a9652a first 8 年之前 json-stable-stringify 11e3a9652a first 8 年之前 json-stable-stringify-without-jsonify 11e3a9652a first 8 年之前 json-stringify-safe 11e3a9652a first 8 年之前 json3 11e3a9652a first 8 年之前 json5 11e3a9652a first 8 年之前 jsonify 11e3a9652a first 8 年之前 jsonpointer 11e3a9652a first 8 年之前 jsprim 11e3a9652a first 8 年之前 kew 11e3a9652a first 8 年之前 killable 11e3a9652a first 8 年之前 kind-of 11e3a9652a first 8 年之前 last-call-webpack-plugin 11e3a9652a first 8 年之前 lazy-cache 11e3a9652a first 8 年之前 lcid 11e3a9652a first 8 年之前 left-pad 11e3a9652a first 8 年之前 leven 11e3a9652a first 8 年之前 levn 11e3a9652a first 8 年之前 load-json-file 11e3a9652a first 8 年之前 loader-fs-cache 11e3a9652a first 8 年之前 loader-runner 11e3a9652a first 8 年之前 loader-utils 11e3a9652a first 8 年之前 locate-path 11e3a9652a first 8 年之前 lodash 11e3a9652a first 8 年之前 lodash._arraycopy 11e3a9652a first 8 年之前 lodash._arrayeach 11e3a9652a first 8 年之前 lodash._baseassign 11e3a9652a first 8 年之前 lodash._baseclone 11e3a9652a first 8 年之前 lodash._basecopy 11e3a9652a first 8 年之前 lodash._basecreate 11e3a9652a first 8 年之前 lodash._basefor 11e3a9652a first 8 年之前 lodash._bindcallback 11e3a9652a first 8 年之前 lodash._getnative 11e3a9652a first 8 年之前 lodash._isiterateecall 11e3a9652a first 8 年之前 lodash._stack 11e3a9652a first 8 年之前 lodash.assign 11e3a9652a first 8 年之前 lodash.camelcase 11e3a9652a first 8 年之前 lodash.clone 11e3a9652a first 8 年之前 lodash.clonedeep 11e3a9652a first 8 年之前 lodash.create 11e3a9652a first 8 年之前 lodash.defaultsdeep 11e3a9652a first 8 年之前 lodash.isarguments 11e3a9652a first 8 年之前 lodash.isarray 11e3a9652a first 8 年之前 lodash.isplainobject 11e3a9652a first 8 年之前 lodash.keys 11e3a9652a first 8 年之前 lodash.keysin 11e3a9652a first 8 年之前 lodash.memoize 11e3a9652a first 8 年之前 lodash.mergewith 11e3a9652a first 8 年之前 lodash.rest 11e3a9652a first 8 年之前 lodash.sortby 11e3a9652a first 8 年之前 lodash.tail 11e3a9652a first 8 年之前 lodash.uniq 11e3a9652a first 8 年之前 log-symbols 11e3a9652a first 8 年之前 loglevel 11e3a9652a first 8 年之前 longest 11e3a9652a first 8 年之前 loose-envify 11e3a9652a first 8 年之前 loud-rejection 11e3a9652a first 8 年之前 lower-case 11e3a9652a first 8 年之前 lru-cache 11e3a9652a first 8 年之前 macaddress 11e3a9652a first 8 年之前 make-dir 11e3a9652a first 8 年之前 makeerror 11e3a9652a first 8 年之前 map-cache 11e3a9652a first 8 年之前 map-obj 11e3a9652a first 8 年之前 map-visit 11e3a9652a first 8 年之前 math-expression-evaluator 11e3a9652a first 8 年之前 md5.js 11e3a9652a first 8 年之前 media-typer 11e3a9652a first 8 年之前 mem 11e3a9652a first 8 年之前 memory-fs 11e3a9652a first 8 年之前 meow 11e3a9652a first 8 年之前 merge 11e3a9652a first 8 年之前 merge-descriptors 11e3a9652a first 8 年之前 merge-stream 11e3a9652a first 8 年之前 methods 11e3a9652a first 8 年之前 micromatch 11e3a9652a first 8 年之前 miller-rabin 11e3a9652a first 8 年之前 mime 11e3a9652a first 8 年之前 mime-db 11e3a9652a first 8 年之前 mime-types 11e3a9652a first 8 年之前 mimic-fn 11e3a9652a first 8 年之前 minimalistic-assert 11e3a9652a first 8 年之前 minimalistic-crypto-utils 11e3a9652a first 8 年之前 minimatch 11e3a9652a first 8 年之前 minimist 11e3a9652a first 8 年之前 mississippi 11e3a9652a first 8 年之前 mixin-deep 11e3a9652a first 8 年之前 mixin-object 11e3a9652a first 8 年之前 mkdirp 11e3a9652a first 8 年之前 mkpath 11e3a9652a first 8 年之前 mocha-nightwatch 11e3a9652a first 8 年之前 move-concurrently 11e3a9652a first 8 年之前 ms 11e3a9652a first 8 年之前 multicast-dns 11e3a9652a first 8 年之前 multicast-dns-service-types 11e3a9652a first 8 年之前 mute-stream 11e3a9652a first 8 年之前 nan 11e3a9652a first 8 年之前 nanomatch 11e3a9652a first 8 年之前 natural-compare 11e3a9652a first 8 年之前 negotiator 11e3a9652a first 8 年之前 neo-async 11e3a9652a first 8 年之前 netmask 11e3a9652a first 8 年之前 next-tick 11e3a9652a first 8 年之前 nightwatch 11e3a9652a first 8 年之前 no-case 11e3a9652a first 8 年之前 node-cache 11e3a9652a first 8 年之前 node-forge 11e3a9652a first 8 年之前 node-gyp 11e3a9652a first 8 年之前 node-int64 11e3a9652a first 8 年之前 node-libs-browser 11e3a9652a first 8 年之前 node-notifier 11e3a9652a first 8 年之前 node-sass 11e3a9652a first 8 年之前 nopt 11e3a9652a first 8 年之前 normalize-package-data 11e3a9652a first 8 年之前 normalize-path 11e3a9652a first 8 年之前 normalize-range 11e3a9652a first 8 年之前 normalize-url 11e3a9652a first 8 年之前 normalize-wheel 11e3a9652a first 8 年之前 npm-run-path 11e3a9652a first 8 年之前 npmlog 11e3a9652a first 8 年之前 nth-check 11e3a9652a first 8 年之前 num2fraction 11e3a9652a first 8 年之前 number-is-nan 11e3a9652a first 8 年之前 nwmatcher 11e3a9652a first 8 年之前 oauth-sign 11e3a9652a first 8 年之前 object-assign 11e3a9652a first 8 年之前 object-copy 11e3a9652a first 8 年之前 object-hash 11e3a9652a first 8 年之前 object-keys 11e3a9652a first 8 年之前 object-visit 11e3a9652a first 8 年之前 object.getownpropertydescriptors 11e3a9652a first 8 年之前 object.omit 11e3a9652a first 8 年之前 object.pick 11e3a9652a first 8 年之前 obuf 11e3a9652a first 8 年之前 on-finished 11e3a9652a first 8 年之前 on-headers 11e3a9652a first 8 年之前 once 11e3a9652a first 8 年之前 onetime 11e3a9652a first 8 年之前 opener 11e3a9652a first 8 年之前 opn 11e3a9652a first 8 年之前 optimist 11e3a9652a first 8 年之前 optimize-css-assets-webpack-plugin 11e3a9652a first 8 年之前 optionator 11e3a9652a first 8 年之前 ora 11e3a9652a first 8 年之前 original 11e3a9652a first 8 年之前 os-browserify 11e3a9652a first 8 年之前 os-homedir 11e3a9652a first 8 年之前 os-locale 11e3a9652a first 8 年之前 os-tmpdir 11e3a9652a first 8 年之前 osenv 11e3a9652a first 8 年之前 p-finally 11e3a9652a first 8 年之前 p-limit 11e3a9652a first 8 年之前 p-locate 11e3a9652a first 8 年之前 p-map 11e3a9652a first 8 年之前 p-try 11e3a9652a first 8 年之前 pac-proxy-agent 11e3a9652a first 8 年之前 pac-resolver 11e3a9652a first 8 年之前 pako 11e3a9652a first 8 年之前 parallel-transform 11e3a9652a first 8 年之前 param-case 11e3a9652a first 8 年之前 parse-asn1 11e3a9652a first 8 年之前 parse-glob 11e3a9652a first 8 年之前 parse-json 11e3a9652a first 8 年之前 parse5 11e3a9652a first 8 年之前 parseurl 11e3a9652a first 8 年之前 pascalcase 11e3a9652a first 8 年之前 path-browserify 11e3a9652a first 8 年之前 path-dirname 11e3a9652a first 8 年之前 path-exists 11e3a9652a first 8 年之前 path-is-absolute 11e3a9652a first 8 年之前 path-is-inside 11e3a9652a first 8 年之前 path-key 11e3a9652a first 8 年之前 path-parse 11e3a9652a first 8 年之前 path-to-regexp 11e3a9652a first 8 年之前 path-type 11e3a9652a first 8 年之前 pbkdf2 11e3a9652a first 8 年之前 pend 11e3a9652a first 8 年之前 performance-now 11e3a9652a first 8 年之前 pify 11e3a9652a first 8 年之前 pinkie 11e3a9652a first 8 年之前 pinkie-promise 11e3a9652a first 8 年之前 pkg-dir 11e3a9652a first 8 年之前 pluralize 11e3a9652a first 8 年之前 pn 11e3a9652a first 8 年之前 portfinder 11e3a9652a first 8 年之前 posix-character-classes 11e3a9652a first 8 年之前 postcss 11e3a9652a first 8 年之前 postcss-calc 11e3a9652a first 8 年之前 postcss-colormin 11e3a9652a first 8 年之前 postcss-convert-values 11e3a9652a first 8 年之前 postcss-discard-comments 11e3a9652a first 8 年之前 postcss-discard-duplicates 11e3a9652a first 8 年之前 postcss-discard-empty 11e3a9652a first 8 年之前 postcss-discard-overridden 11e3a9652a first 8 年之前 postcss-discard-unused 11e3a9652a first 8 年之前 postcss-filter-plugins 11e3a9652a first 8 年之前 postcss-import 11e3a9652a first 8 年之前 postcss-load-config 11e3a9652a first 8 年之前 postcss-load-options 11e3a9652a first 8 年之前 postcss-load-plugins 11e3a9652a first 8 年之前 postcss-loader 11e3a9652a first 8 年之前 postcss-merge-idents 11e3a9652a first 8 年之前 postcss-merge-longhand 11e3a9652a first 8 年之前 postcss-merge-rules 11e3a9652a first 8 年之前 postcss-message-helpers 11e3a9652a first 8 年之前 postcss-minify-font-values 11e3a9652a first 8 年之前 postcss-minify-gradients 11e3a9652a first 8 年之前 postcss-minify-params 11e3a9652a first 8 年之前 postcss-minify-selectors 11e3a9652a first 8 年之前 postcss-modules-extract-imports 11e3a9652a first 8 年之前 postcss-modules-local-by-default 11e3a9652a first 8 年之前 postcss-modules-scope 11e3a9652a first 8 年之前 postcss-modules-values 11e3a9652a first 8 年之前 postcss-normalize-charset 11e3a9652a first 8 年之前 postcss-normalize-url 11e3a9652a first 8 年之前 postcss-ordered-values 11e3a9652a first 8 年之前 postcss-reduce-idents 11e3a9652a first 8 年之前 postcss-reduce-initial 11e3a9652a first 8 年之前 postcss-reduce-transforms 11e3a9652a first 8 年之前 postcss-selector-parser 11e3a9652a first 8 年之前 postcss-svgo 11e3a9652a first 8 年之前 postcss-unique-selectors 11e3a9652a first 8 年之前 postcss-url 11e3a9652a first 8 年之前 postcss-value-parser 11e3a9652a first 8 年之前 postcss-zindex 11e3a9652a first 8 年之前 prelude-ls 11e3a9652a first 8 年之前 prepend-http 11e3a9652a first 8 年之前 preserve 11e3a9652a first 8 年之前 prettier 11e3a9652a first 8 年之前 pretty 11e3a9652a first 8 年之前 pretty-error 11e3a9652a first 8 年之前 pretty-format 11e3a9652a first 8 年之前 private 11e3a9652a first 8 年之前 process 11e3a9652a first 8 年之前 process-nextick-args 11e3a9652a first 8 年之前 progress 11e3a9652a first 8 年之前 promise-inflight 11e3a9652a first 8 年之前 proto-list 11e3a9652a first 8 年之前 proxy-addr 11e3a9652a first 8 年之前 proxy-agent 11e3a9652a first 8 年之前 prr 11e3a9652a first 8 年之前 pseudomap 11e3a9652a first 8 年之前 public-encrypt 11e3a9652a first 8 年之前 pump 11e3a9652a first 8 年之前 pumpify 11e3a9652a first 8 年之前 punycode 11e3a9652a first 8 年之前 q 11e3a9652a first 8 年之前 qrcodejs2 11e3a9652a first 8 年之前 qs 11e3a9652a first 8 年之前 query-string 11e3a9652a first 8 年之前 querystring 11e3a9652a first 8 年之前 querystring-es3 11e3a9652a first 8 年之前 querystringify 11e3a9652a first 8 年之前 randomatic 11e3a9652a first 8 年之前 randombytes 11e3a9652a first 8 年之前 randomfill 11e3a9652a first 8 年之前 range-parser 11e3a9652a first 8 年之前 raw-body 11e3a9652a first 8 年之前 read-cache 11e3a9652a first 8 年之前 read-pkg 11e3a9652a first 8 年之前 read-pkg-up 11e3a9652a first 8 年之前 readable-stream 11e3a9652a first 8 年之前 readdirp 11e3a9652a first 8 年之前 realpath-native 11e3a9652a first 8 年之前 rechoir 11e3a9652a first 8 年之前 redent 11e3a9652a first 8 年之前 reduce-css-calc 11e3a9652a first 8 年之前 reduce-function-call 11e3a9652a first 8 年之前 regenerate 11e3a9652a first 8 年之前 regenerator-runtime 11e3a9652a first 8 年之前 regenerator-transform 11e3a9652a first 8 年之前 regex-cache 11e3a9652a first 8 年之前 regex-not 11e3a9652a first 8 年之前 regexpp 11e3a9652a first 8 年之前 regexpu-core 11e3a9652a first 8 年之前 regjsgen 11e3a9652a first 8 年之前 regjsparser 11e3a9652a first 8 年之前 relateurl 11e3a9652a first 8 年之前 remove-trailing-separator 11e3a9652a first 8 年之前 renderkid 11e3a9652a first 8 年之前 repeat-element 11e3a9652a first 8 年之前 repeat-string 11e3a9652a first 8 年之前 repeating 11e3a9652a first 8 年之前 request 11e3a9652a first 8 年之前 request-promise-core 11e3a9652a first 8 年之前 request-promise-native 11e3a9652a first 8 年之前 require-directory 11e3a9652a first 8 年之前 require-from-string 11e3a9652a first 8 年之前 require-main-filename 11e3a9652a first 8 年之前 require-uncached 11e3a9652a first 8 年之前 requires-port 11e3a9652a first 8 年之前 resize-observer-polyfill 11e3a9652a first 8 年之前 resolve 11e3a9652a first 8 年之前 resolve-cwd 11e3a9652a first 8 年之前 resolve-from 11e3a9652a first 8 年之前 resolve-url 11e3a9652a first 8 年之前 restore-cursor 11e3a9652a first 8 年之前 ret 11e3a9652a first 8 年之前 right-align 11e3a9652a first 8 年之前 rimraf 11e3a9652a first 8 年之前 ripemd160 11e3a9652a first 8 年之前 run-async 11e3a9652a first 8 年之前 run-queue 11e3a9652a first 8 年之前 rx-lite 11e3a9652a first 8 年之前 rx-lite-aggregates 11e3a9652a first 8 年之前 safe-buffer 11e3a9652a first 8 年之前 safe-regex 11e3a9652a first 8 年之前 safer-buffer 11e3a9652a first 8 年之前 sane 11e3a9652a first 8 年之前 sass-graph 11e3a9652a first 8 年之前 sass-loader 11e3a9652a first 8 年之前 sax 11e3a9652a first 8 年之前 schema-utils 11e3a9652a first 8 年之前 scss-tokenizer 11e3a9652a first 8 年之前 select-hose 11e3a9652a first 8 年之前 selenium-server 11e3a9652a first 8 年之前 selfsigned 11e3a9652a first 8 年之前 semver 11e3a9652a first 8 年之前 send 11e3a9652a first 8 年之前 serialize-javascript 11e3a9652a first 8 年之前 serve-index 11e3a9652a first 8 年之前 serve-static 11e3a9652a first 8 年之前 set-blocking 11e3a9652a first 8 年之前 set-immediate-shim 11e3a9652a first 8 年之前 set-value 11e3a9652a first 8 年之前 setimmediate 11e3a9652a first 8 年之前 setprototypeof 11e3a9652a first 8 年之前 sha.js 11e3a9652a first 8 年之前 shallow-clone 11e3a9652a first 8 年之前 shebang-command 11e3a9652a first 8 年之前 shebang-regex 11e3a9652a first 8 年之前 shelljs 11e3a9652a first 8 年之前 shellwords 11e3a9652a first 8 年之前 sigmund 11e3a9652a first 8 年之前 signal-exit 11e3a9652a first 8 年之前 slash 11e3a9652a first 8 年之前 slice-ansi 11e3a9652a first 8 年之前 smart-buffer 11e3a9652a first 8 年之前 snapdragon 11e3a9652a first 8 年之前 snapdragon-node 11e3a9652a first 8 年之前 snapdragon-util 11e3a9652a first 8 年之前 sntp 11e3a9652a first 8 年之前 sockjs 11e3a9652a first 8 年之前 sockjs-client 11e3a9652a first 8 年之前 socks 11e3a9652a first 8 年之前 socks-proxy-agent 11e3a9652a first 8 年之前 sort-keys 11e3a9652a first 8 年之前 source-list-map 11e3a9652a first 8 年之前 source-map 11e3a9652a first 8 年之前 source-map-resolve 11e3a9652a first 8 年之前 source-map-support 11e3a9652a first 8 年之前 source-map-url 11e3a9652a first 8 年之前 spdx-correct 11e3a9652a first 8 年之前 spdx-exceptions 11e3a9652a first 8 年之前 spdx-expression-parse 11e3a9652a first 8 年之前 spdx-license-ids 11e3a9652a first 8 年之前 spdy 11e3a9652a first 8 年之前 spdy-transport 11e3a9652a first 8 年之前 split-string 11e3a9652a first 8 年之前 sprintf-js 11e3a9652a first 8 年之前 sshpk 11e3a9652a first 8 年之前 ssri 11e3a9652a first 8 年之前 stack-utils 11e3a9652a first 8 年之前 stackframe 11e3a9652a first 8 年之前 static-extend 11e3a9652a first 8 年之前 statuses 11e3a9652a first 8 年之前 stdout-stream 11e3a9652a first 8 年之前 stealthy-require 11e3a9652a first 8 年之前 stream-browserify 11e3a9652a first 8 年之前 stream-each 11e3a9652a first 8 年之前 stream-http 11e3a9652a first 8 年之前 stream-shift 11e3a9652a first 8 年之前 strict-uri-encode 11e3a9652a first 8 年之前 string-length 11e3a9652a first 8 年之前 string-width 11e3a9652a first 8 年之前 string_decoder 11e3a9652a first 8 年之前 stringstream 11e3a9652a first 8 年之前 strip-ansi 11e3a9652a first 8 年之前 strip-bom 11e3a9652a first 8 年之前 strip-eof 11e3a9652a first 8 年之前 strip-indent 11e3a9652a first 8 年之前 strip-json-comments 11e3a9652a first 8 年之前 supports-color 11e3a9652a first 8 年之前 svg-tags 11e3a9652a first 8 年之前 svgo 11e3a9652a first 8 年之前 symbol-tree 11e3a9652a first 8 年之前 table 11e3a9652a first 8 年之前 tapable 11e3a9652a first 8 年之前 tar 11e3a9652a first 8 年之前 test-exclude 11e3a9652a first 8 年之前 text-table 11e3a9652a first 8 年之前 throat 11e3a9652a first 8 年之前 throttle-debounce 11e3a9652a first 8 年之前 through 11e3a9652a first 8 年之前 through2 11e3a9652a first 8 年之前 thunkify 11e3a9652a first 8 年之前 thunky 11e3a9652a first 8 年之前 time-stamp 11e3a9652a first 8 年之前 timers-browserify 11e3a9652a first 8 年之前 tmp 11e3a9652a first 8 年之前 tmpl 11e3a9652a first 8 年之前 to-arraybuffer 11e3a9652a first 8 年之前 to-fast-properties 11e3a9652a first 8 年之前 to-object-path 11e3a9652a first 8 年之前 to-regex 11e3a9652a first 8 年之前 to-regex-range 11e3a9652a first 8 年之前 toposort 11e3a9652a first 8 年之前 tough-cookie 11e3a9652a first 8 年之前 tr46 11e3a9652a first 8 年之前 trim-newlines 11e3a9652a first 8 年之前 trim-right 11e3a9652a first 8 年之前 true-case-path 11e3a9652a first 8 年之前 tryer 11e3a9652a first 8 年之前 tsconfig 11e3a9652a first 8 年之前 tty-browserify 11e3a9652a first 8 年之前 tunnel-agent 11e3a9652a first 8 年之前 tweetnacl 11e3a9652a first 8 年之前 type-check 11e3a9652a first 8 年之前 type-detect 11e3a9652a first 8 年之前 type-is 11e3a9652a first 8 年之前 typedarray 11e3a9652a first 8 年之前 uglify-js 11e3a9652a first 8 年之前 uglify-to-browserify 11e3a9652a first 8 年之前 uglifyjs-webpack-plugin 11e3a9652a first 8 年之前 union-value 11e3a9652a first 8 年之前 uniq 11e3a9652a first 8 年之前 uniqid 11e3a9652a first 8 年之前 uniqs 11e3a9652a first 8 年之前 unique-filename 11e3a9652a first 8 年之前 unique-slug 11e3a9652a first 8 年之前 unpipe 11e3a9652a first 8 年之前 unset-value 11e3a9652a first 8 年之前 upath 11e3a9652a first 8 年之前 upper-case 11e3a9652a first 8 年之前 uri-js 11e3a9652a first 8 年之前 urix 11e3a9652a first 8 年之前 url 11e3a9652a first 8 年之前 url-loader 11e3a9652a first 8 年之前 url-parse 11e3a9652a first 8 年之前 use 11e3a9652a first 8 年之前 util 11e3a9652a first 8 年之前 util-deprecate 11e3a9652a first 8 年之前 util.promisify 11e3a9652a first 8 年之前 utila 11e3a9652a first 8 年之前 utils-merge 11e3a9652a first 8 年之前 uuid 11e3a9652a first 8 年之前 validate-npm-package-license 11e3a9652a first 8 年之前 vary 11e3a9652a first 8 年之前 vendors 11e3a9652a first 8 年之前 verror 11e3a9652a first 8 年之前 vm-browserify 11e3a9652a first 8 年之前 vue 11e3a9652a first 8 年之前 vue-eslint-parser 11e3a9652a first 8 年之前 vue-hot-reload-api 11e3a9652a first 8 年之前 vue-jest 11e3a9652a first 8 年之前 vue-loader 11e3a9652a first 8 年之前 vue-router 11e3a9652a first 8 年之前 vue-style-loader 11e3a9652a first 8 年之前 vue-template-compiler 11e3a9652a first 8 年之前 vue-template-es2015-compiler 11e3a9652a first 8 年之前 w3c-hr-time 11e3a9652a first 8 年之前 walker 11e3a9652a first 8 年之前 watch 11e3a9652a first 8 年之前 watchpack 11e3a9652a first 8 年之前 wbuf 11e3a9652a first 8 年之前 webidl-conversions 11e3a9652a first 8 年之前 webpack 11e3a9652a first 8 年之前 webpack-bundle-analyzer 11e3a9652a first 8 年之前 webpack-dev-middleware 11e3a9652a first 8 年之前 webpack-dev-server 11e3a9652a first 8 年之前 webpack-merge 11e3a9652a first 8 年之前 webpack-sources 11e3a9652a first 8 年之前 websocket-driver 11e3a9652a first 8 年之前 websocket-extensions 11e3a9652a first 8 年之前 whatwg-encoding 11e3a9652a first 8 年之前 whatwg-mimetype 11e3a9652a first 8 年之前 whatwg-url 11e3a9652a first 8 年之前 whet.extend 11e3a9652a first 8 年之前 which 11e3a9652a first 8 年之前 which-module 11e3a9652a first 8 年之前 wide-align 11e3a9652a first 8 年之前 window-size 11e3a9652a first 8 年之前 wordwrap 11e3a9652a first 8 年之前 worker-farm 11e3a9652a first 8 年之前 wrap-ansi 11e3a9652a first 8 年之前 wrappy 11e3a9652a first 8 年之前 write 11e3a9652a first 8 年之前 write-file-atomic 11e3a9652a first 8 年之前 ws 11e3a9652a first 8 年之前 xml-name-validator 11e3a9652a first 8 年之前 xregexp 11e3a9652a first 8 年之前 xtend 11e3a9652a first 8 年之前 xxhashjs 11e3a9652a first 8 年之前 y18n 11e3a9652a first 8 年之前 yallist 11e3a9652a first 8 年之前 yargs 11e3a9652a first 8 年之前 yargs-parser 11e3a9652a first 8 年之前 yauzl 11e3a9652a first 8 年之前 zrender 11e3a9652a first 8 年之前 add api lensman_photo_bought & modify api wx_order_create_api and adjust return field · 102152ca4a - Gogs: Go Git Service

add api lensman_photo_bought & modify api wx_order_create_api and adjust return field

Brightcells 10 anni fa
parent
commit
102152ca4a

+ 1 - 1
account/views.py

@@ -19,7 +19,7 @@ from TimeConvert import TimeConvert as tc
19 19
 
20 20
 
21 21
 # curl -X POST -F username=xxxxxxx -F password=xxxxxxx http://api.pai.ai/login
22
-def lesman_login_api(request):
22
+def lensman_login_api(request):
23 23
     username = request.POST.get('username', '')
24 24
     password = request.POST.get('password', '')
25 25
 

+ 3 - 2
api/urls.py

@@ -12,7 +12,7 @@ from photo import views as photo_views
12 12
 
13 13
 # 帐户相关
14 14
 urlpatterns = [
15
-    url(r'^login$', account_views.lesman_login_api, name='lesman_login_api'),  # 摄影师登录
15
+    url(r'^login$', account_views.lensman_login_api, name='lensman_login_api'),  # 摄影师登录
16 16
     url(r'^u/is_registered$', account_views.user_is_registered_api, name='user_is_registered_api'),  # 用户是否已经注册
17 17
     url(r'^u/signup$', account_views.user_signup_api, name='user_signup_api'),  # 用户注册
18 18
     url(r'^u/login$', account_views.user_login_api, name='user_login_api'),  # 用户登录
@@ -44,7 +44,8 @@ urlpatterns += [
44 44
     url(r'^f/thumbup/submit$', group_views.thumbup_submit_api, name='thumbup_submit_api'),  # 飞图点赞提交
45 45
     url(r'^f/thumbup/list$', group_views.thumbup_list_api, name='thumbup_list_api'),  # 飞图点赞列表
46 46
     url(r'^f/thumbup/cancel$', group_views.thumbup_cancel_api, name='thumbup_cancel_api'),  # 飞图点赞取消
47
-    url(r'^f/price$', group_views.lesman_photo_price, name='lesman_photo_price'),  # 摄影师照片价格获取
47
+    url(r'^f/price$', group_views.lensman_photo_price, name='lensman_photo_price'),  # 摄影师照片价格获取
48
+    url(r'^f/bought$', group_views.lensman_photo_bought, name='lensman_photo_bought'),  # 摄影师照片已购买
48 49
 ]
49 50
 
50 51
 # 消息相关

+ 7 - 2
group/admin.py

@@ -2,7 +2,7 @@
2 2
 
3 3
 from django.contrib import admin
4 4
 
5
-from group.models import GroupInfo, GroupUserInfo, GroupPhotoInfo, PhotoCommentInfo, PhotoThumbUpInfo
5
+from group.models import GroupInfo, GroupUserInfo, GroupPhotoInfo, GroupPhotoOrderInfo, PhotoCommentInfo, PhotoThumbUpInfo
6 6
 
7 7
 
8 8
 class GroupInfoAdmin(admin.ModelAdmin):
@@ -17,7 +17,11 @@ class GroupUserInfoAdmin(admin.ModelAdmin):
17 17
 
18 18
 class GroupPhotoInfoAdmin(admin.ModelAdmin):
19 19
     list_display = ('group_id', 'user_id', 'nickname', 'photo_path', 'photo_thumbnail_path', 'photo_thumbnail2_path', 'status', 'created_at', 'updated_at')
20
-    list_filter = ('status', )
20
+    list_filter = ('photo_from', 'status')
21
+
22
+
23
+class GroupPhotoOrderInfoAdmin(admin.ModelAdmin):
24
+    list_display = ('group_id', 'user_id', 'photo_id', 'm_photo_path', 'l_photo_path', 'r_photo_path', 'status', 'created_at', 'updated_at')
21 25
 
22 26
 
23 27
 class PhotoCommentInfoAdmin(admin.ModelAdmin):
@@ -33,5 +37,6 @@ class PhotoThumbUpInfoAdmin(admin.ModelAdmin):
33 37
 admin.site.register(GroupInfo, GroupInfoAdmin)
34 38
 admin.site.register(GroupUserInfo, GroupUserInfoAdmin)
35 39
 admin.site.register(GroupPhotoInfo, GroupPhotoInfoAdmin)
40
+admin.site.register(GroupPhotoOrderInfo, GroupPhotoOrderInfoAdmin)
36 41
 admin.site.register(PhotoCommentInfo, PhotoCommentInfoAdmin)
37 42
 admin.site.register(PhotoThumbUpInfo, PhotoThumbUpInfoAdmin)

+ 68 - 0
group/migrations/0019_auto_20160422_1322.py

@@ -0,0 +1,68 @@
1
+# -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
3
+
4
+from django.db import models, migrations
5
+
6
+
7
+class Migration(migrations.Migration):
8
+
9
+    dependencies = [
10
+        ('group', '0018_auto_20160417_2246'),
11
+    ]
12
+
13
+    operations = [
14
+        migrations.CreateModel(
15
+            name='GroupPhotoOrderInfo',
16
+            fields=[
17
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
18
+                ('status', models.BooleanField(default=True, help_text='\u72b6\u6001', db_index=True, verbose_name='status')),
19
+                ('created_at', models.DateTimeField(help_text='\u521b\u5efa\u65f6\u95f4', verbose_name='created_at', auto_now_add=True)),
20
+                ('updated_at', models.DateTimeField(help_text='\u66f4\u65b0\u65f6\u95f4', verbose_name='updated_at', auto_now=True)),
21
+                ('group_id', models.CharField(max_length=255, blank=True, help_text='\u7fa4\u7ec4\u552f\u4e00\u6807\u8bc6', null=True, verbose_name='group_id', db_index=True)),
22
+                ('user_id', models.CharField(max_length=255, blank=True, help_text='\u7528\u6237\u552f\u4e00\u6807\u8bc6', null=True, verbose_name='user_id', db_index=True)),
23
+                ('photo_id', models.CharField(max_length=255, blank=True, help_text='\u7167\u7247\u552f\u4e00\u6807\u8bc6', null=True, verbose_name='photo_id', db_index=True)),
24
+                ('m_photo_path', models.CharField(help_text='\u7167\u7247\u5b58\u653e\u8def\u5f84\uff0c\u63a7\u5236\u5668\u4e0a\u4f20\uff0c\u65e0\u6c34\u5370', max_length=255, null=True, verbose_name='m_photo_path', blank=True)),
25
+                ('l_photo_path', models.CharField(help_text='\u7167\u7247\u5b58\u653e\u8def\u5f84\uff0c\u7f8e\u5316\u5927\u56fe', max_length=255, null=True, verbose_name='l_photo_path', blank=True)),
26
+                ('r_photo_path', models.CharField(help_text='\u7167\u7247\u5b58\u653e\u8def\u5f84\uff0c\u9ad8\u6e05\u5927\u56fe', max_length=255, null=True, verbose_name='r_photo_path', blank=True)),
27
+            ],
28
+            options={
29
+                'verbose_name': 'groupphotoorderinfo',
30
+                'verbose_name_plural': 'groupphotoorderinfo',
31
+            },
32
+        ),
33
+        migrations.AddField(
34
+            model_name='groupphotoinfo',
35
+            name='lensman_id',
36
+            field=models.CharField(max_length=255, blank=True, help_text='\u6444\u5f71\u5e08\u552f\u4e00\u6807\u8bc6\uff0c\u540c PhotosInfo \u8868', null=True, verbose_name='lensman_id', db_index=True),
37
+        ),
38
+        migrations.AddField(
39
+            model_name='groupphotoinfo',
40
+            name='lensman_photo_id',
41
+            field=models.CharField(max_length=255, blank=True, help_text='\u6444\u5f71\u5e08\u7167\u7247\u552f\u4e00\u6807\u8bc6\uff0c\u540c PhotosInfo \u8868', null=True, verbose_name='lensman_photo_id', db_index=True),
42
+        ),
43
+        migrations.AlterField(
44
+            model_name='groupinfo',
45
+            name='admin_id',
46
+            field=models.CharField(max_length=255, blank=True, help_text='\u7528\u6237\u552f\u4e00\u6807\u8bc6', null=True, verbose_name='admin_id', db_index=True),
47
+        ),
48
+        migrations.AlterField(
49
+            model_name='groupphotoinfo',
50
+            name='user_id',
51
+            field=models.CharField(max_length=255, blank=True, help_text='\u7528\u6237\u552f\u4e00\u6807\u8bc6', null=True, verbose_name='user_id', db_index=True),
52
+        ),
53
+        migrations.AlterField(
54
+            model_name='groupuserinfo',
55
+            name='user_id',
56
+            field=models.CharField(max_length=255, blank=True, help_text='\u7528\u6237\u552f\u4e00\u6807\u8bc6', null=True, verbose_name='user_id', db_index=True),
57
+        ),
58
+        migrations.AlterField(
59
+            model_name='photocommentinfo',
60
+            name='user_id',
61
+            field=models.CharField(max_length=255, blank=True, help_text='\u7528\u6237\u552f\u4e00\u6807\u8bc6', null=True, verbose_name='user_id', db_index=True),
62
+        ),
63
+        migrations.AlterField(
64
+            model_name='photothumbupinfo',
65
+            name='user_id',
66
+            field=models.CharField(max_length=255, blank=True, help_text='\u7528\u6237\u552f\u4e00\u6807\u8bc6', null=True, verbose_name='user_id', db_index=True),
67
+        ),
68
+    ]

+ 19 - 0
group/migrations/0020_groupphotoinfo_session_id.py

@@ -0,0 +1,19 @@
1
+# -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
3
+
4
+from django.db import models, migrations
5
+
6
+
7
+class Migration(migrations.Migration):
8
+
9
+    dependencies = [
10
+        ('group', '0019_auto_20160422_1322'),
11
+    ]
12
+
13
+    operations = [
14
+        migrations.AddField(
15
+            model_name='groupphotoinfo',
16
+            name='session_id',
17
+            field=models.CharField(max_length=255, blank=True, help_text='\u7167\u7247\u7ec4\u552f\u4e00\u6807\u8bc6\uff0c\u540c PhotosInfo \u8868', null=True, verbose_name='session_id', db_index=True),
18
+        ),
19
+    ]

+ 50 - 5
group/models.py

@@ -9,6 +9,7 @@ from pai2.basemodels import CreateUpdateMixin
9 9
 from utils.url_utils import img_url
10 10
 
11 11
 from utils.redis.rgroup import get_group_photo_thumbup_flag
12
+from utils.redis.rorder import get_lensman_order_record
12 13
 
13 14
 
14 15
 r = settings.REDIS_CACHE
@@ -24,7 +25,7 @@ class GroupInfo(CreateUpdateMixin):
24 25
     )
25 26
 
26 27
     group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True, unique=True)
27
-    admin_id = models.CharField(_(u'admin_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识')
28
+    admin_id = models.CharField(_(u'admin_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
28 29
     group_name = models.CharField(_(u'group_name'), max_length=255, blank=True, null=True, help_text=u'群组名称')
29 30
     group_default_avatar = models.IntegerField(_(u'group_default_avatar'), default=0, help_text=u'群组默认头像,0 - 255,水果头像')
30 31
     group_avatar = models.CharField(_(u'group_avatar'), max_length=255, blank=True, null=True, help_text=u'群组头像')
@@ -99,7 +100,7 @@ class GroupUserInfo(CreateUpdateMixin):
99 100
     )
100 101
 
101 102
     group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True)
102
-    user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识')
103
+    user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
103 104
     current_id = models.IntegerField(_(u'current_id'), default=-1, help_text=u'当前群组照片ID')
104 105
     nickname = models.CharField(_(u'nickname'), max_length=255, blank=True, null=True, help_text=u'用户群组昵称')
105 106
     avatar = models.CharField(_(u'avatar'), max_length=255, blank=True, null=True, help_text=u'用户头像')
@@ -137,7 +138,7 @@ class GroupPhotoInfo(CreateUpdateMixin):
137 138
     )
138 139
 
139 140
     group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True)
140
-    user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识')
141
+    user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
141 142
     nickname = models.CharField(_(u'nickname'), max_length=255, blank=True, null=True, help_text=u'用户群组昵称')
142 143
     avatar = models.CharField(_(u'avatar'), max_length=255, blank=True, null=True, help_text=u'用户头像')
143 144
 
@@ -157,8 +158,13 @@ class GroupPhotoInfo(CreateUpdateMixin):
157 158
 
158 159
     comment_num = models.IntegerField(_(u'comment_num'), default=0, help_text=u'照片评论数量')
159 160
     thumbup_num = models.IntegerField(_(u'thumbup_num'), default=0, help_text=u'照片点赞数量')
161
+
160 162
     photo_from = models.IntegerField(_(u'photo_from'), choices=PHOTO_FROM, default=APP_GROUP, help_text=u'照片来源')
161 163
 
164
+    session_id = models.CharField(_(u'session_id'), max_length=255, blank=True, null=True, help_text=u'照片组唯一标识,同 PhotosInfo 表', db_index=True)
165
+    lensman_id = models.CharField(_(u'lensman_id'), max_length=255, blank=True, null=True, help_text=u'摄影师唯一标识,同 PhotosInfo 表', db_index=True)
166
+    lensman_photo_id = models.CharField(_(u'lensman_photo_id'), max_length=255, blank=True, null=True, help_text=u'摄影师照片唯一标识,同 PhotosInfo 表', db_index=True)
167
+
162 168
     class Meta:
163 169
         verbose_name = _(u'groupphotoinfo')
164 170
         verbose_name_plural = _(u'groupphotoinfo')
@@ -183,6 +189,7 @@ class GroupPhotoInfo(CreateUpdateMixin):
183 189
             group = GroupInfo.objects.get(group_id=self.group_id)
184 190
         except GroupInfo.DoesNotExist:
185 191
             group = None
192
+        porder = get_lensman_order_record(self.pk, user_id) if self.photo_from == GroupPhotoInfo.SESSION_GROUP else {}
186 193
         return {
187 194
             'group_id': group and group.group_id,
188 195
             'group_name': group and group.group_name,
@@ -206,13 +213,51 @@ class GroupPhotoInfo(CreateUpdateMixin):
206 213
             'thumbup': get_group_photo_thumbup_flag(self.pk, user_id),
207 214
             'thumbup_num': self.thumbup_num,
208 215
             'photo_from': self.photo_from,
216
+            'porder': porder,
209 217
             'created_at': self.created_at.replace(microsecond=0),
210 218
         }
211 219
 
212 220
 
221
+class GroupPhotoOrderInfo(CreateUpdateMixin):
222
+    group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True)
223
+    user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
224
+    photo_id = models.CharField(_(u'photo_id'), max_length=255, blank=True, null=True, help_text=u'照片唯一标识', db_index=True)
225
+
226
+    m_photo_path = models.CharField(_(u'm_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,控制器上传,无水印')
227
+    l_photo_path = models.CharField(_(u'l_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,美化大图')
228
+    r_photo_path = models.CharField(_(u'r_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,高清大图')
229
+
230
+    class Meta:
231
+        verbose_name = _(u'groupphotoorderinfo')
232
+        verbose_name_plural = _(u'groupphotoorderinfo')
233
+
234
+    def __unicode__(self):
235
+        return unicode(self.pk)
236
+
237
+    @property
238
+    def m_photo_url(self):
239
+        return img_url(self.m_photo_path)
240
+
241
+    @property
242
+    def l_photo_url(self):
243
+        return img_url(self.l_photo_path)
244
+
245
+    @property
246
+    def r_photo_url(self):
247
+        return img_url(self.r_photo_path)
248
+
249
+    @property
250
+    def porder_info(self):
251
+        return {
252
+            'm_photo_url': self.m_photo_url,
253
+            'l_photo_url': self.l_photo_url,
254
+            'r_photo_url': self.r_photo_url,
255
+        }
256
+
257
+
213 258
 class PhotoCommentInfo(CreateUpdateMixin):
214 259
     photo_id = models.CharField(_(u'photo_id'), max_length=255, blank=True, null=True, help_text=u'飞图唯一标识', db_index=True)
215
-    user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识')
260
+    user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
216 261
     nickname = models.CharField(_(u'nickname'), max_length=255, blank=True, null=True, help_text=u'用户群组昵称')
217 262
     avatar = models.CharField(_(u'avatar'), max_length=255, blank=True, null=True, help_text=u'用户头像')
218 263
     comment = models.TextField(_(u'comment'), blank=True, null=True, help_text=u'用户评论')
@@ -237,7 +282,7 @@ class PhotoCommentInfo(CreateUpdateMixin):
237 282
 
238 283
 class PhotoThumbUpInfo(CreateUpdateMixin):
239 284
     photo_id = models.CharField(_(u'photo_id'), max_length=255, blank=True, null=True, help_text=u'飞图唯一标识', db_index=True)
240
-    user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识')
285
+    user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
241 286
     nickname = models.CharField(_(u'nickname'), max_length=255, blank=True, null=True, help_text=u'用户群组昵称')
242 287
     avatar = models.CharField(_(u'avatar'), max_length=255, blank=True, null=True, help_text=u'用户头像')
243 288
     thumbup = models.BooleanField(_(u'thumbup'), default=True, help_text=u'用户点赞', db_index=True)

+ 32 - 10
group/views.py

@@ -26,9 +26,10 @@ from utils.redis.rkeys import (
26 26
     GROUP_USERS_QUIT_SET,
27 27
 )
28 28
 from utils.redis.rkeys import GROUP_LAST_PHOTO_PK
29
-from utils.redis.rkeys import LESMAN_PHOTO_PRICE, LESMAN_PHOTO_HAGGLE_TIMES
29
+from utils.redis.rkeys import LENSMAN_PHOTO_PRICE, LENSMAN_PHOTO_HAGGLE_TIMES
30 30
 from utils.redis.rgroup import set_group_info, get_group_info, set_group_users_info, get_group_users_info
31 31
 from utils.redis.rgroup import set_group_photo_thumbup_flag, del_group_photo_thumbup_flag, get_group_photo_thumbup_flag
32
+from utils.redis.rorder import get_lensman_order_record
32 33
 
33 34
 from utils.sql.raw import PAI2_HOME_API
34 35
 
@@ -902,7 +903,10 @@ def pai2_home_api(request):
902 903
         'created_at': row[21],
903 904
     } for row in rows]
904 905
 
905
-    [row.update({'thumbup': get_group_photo_thumbup_flag(row['photo_id'], user_id)}) for row in rows]
906
+    [row.update({
907
+        'thumbup': get_group_photo_thumbup_flag(row['photo_id'], user_id),
908
+        'porder': get_lensman_order_record(row['photo_id'], user_id) if row['photo_from'] == GroupPhotoInfo.SESSION_GROUP else {}
909
+    }) for row in rows]
906 910
 
907 911
     return JsonResponse({
908 912
         'status': 200,
@@ -914,7 +918,7 @@ def pai2_home_api(request):
914 918
     })
915 919
 
916 920
 
917
-def lesman_photo_price(request):
921
+def lensman_photo_price(request):
918 922
     """
919 923
     摄影师照片价格获取
920 924
     :param request:
@@ -925,22 +929,22 @@ def lesman_photo_price(request):
925 929
     photo_type = request.POST.get('photo_type', 'nomark')  # nomark for 去除水印, origin for 获取高清图
926 930
 
927 931
     # 处理价格逻辑
928
-    lesman_photo_price_key = LESMAN_PHOTO_PRICE % (user_id, photo_id, photo_type)
929
-    lesman_photo_haggle_times_key = LESMAN_PHOTO_HAGGLE_TIMES % (user_id, photo_id, photo_type)
932
+    lensman_photo_price_key = LENSMAN_PHOTO_PRICE % (user_id, photo_id, photo_type)
933
+    lensman_photo_haggle_times_key = LENSMAN_PHOTO_HAGGLE_TIMES % (user_id, photo_id, photo_type)
930 934
     # Redis 获取存储的价格
931
-    price = float(r.get(lesman_photo_price_key) or 0)
935
+    price = float(r.get(lensman_photo_price_key) or 0)
932 936
     if price:
933
-        haggle_times = int(r.get(lesman_photo_haggle_times_key) or 0)
937
+        haggle_times = int(r.get(lensman_photo_haggle_times_key) or 0)
934 938
         # 砍价逻辑
935
-        if haggle_times < settings.LESMAN_PHOTO_HAGGLE_MAX_TIMES:
939
+        if haggle_times < settings.LENSMAN_PHOTO_HAGGLE_MAX_TIMES:
936 940
             price -= random.choice([0.5, 1])
937
-            r.incr(lesman_photo_haggle_times_key)
941
+            r.incr(lensman_photo_haggle_times_key)
938 942
     else:
939 943
         # 获取摄影师定价
940 944
         # TODO, 此处需要完整的摄影师定价
941 945
         price = 9.9 if photo_type == 'origin' else 6.6
942 946
 
943
-    r.set(lesman_photo_price_key, price)
947
+    r.set(lensman_photo_price_key, price)
944 948
 
945 949
     return JsonResponse({
946 950
         'status': 200,
@@ -951,6 +955,24 @@ def lesman_photo_price(request):
951 955
     })
952 956
 
953 957
 
958
+def lensman_photo_bought(request):
959
+    """
960
+    摄影师照片已购买
961
+    :param request:
962
+    :return:
963
+    """
964
+    user_id = request.POST.get('user_id', '')
965
+    photo_id = request.POST.get('photo_id', '')
966
+
967
+    return JsonResponse({
968
+        'status': 200,
969
+        'message': u'获取购买数据成功',
970
+        'data': {
971
+            'porder': get_lensman_order_record(photo_id, user_id)
972
+        }
973
+    })
974
+
975
+
954 976
 def group_detail(request, group_id):
955 977
     return render(request, 'page/download.html', {})
956 978
 

+ 24 - 0
message/migrations/0005_auto_20160422_1322.py

@@ -0,0 +1,24 @@
1
+# -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
3
+
4
+from django.db import models, migrations
5
+
6
+
7
+class Migration(migrations.Migration):
8
+
9
+    dependencies = [
10
+        ('message', '0004_systemmessagedeleteinfo'),
11
+    ]
12
+
13
+    operations = [
14
+        migrations.AlterField(
15
+            model_name='usermessageinfo',
16
+            name='group_id',
17
+            field=models.CharField(max_length=255, blank=True, help_text='\u7fa4\u7ec4\u552f\u4e00\u6807\u8bc6', null=True, verbose_name='group_id', db_index=True),
18
+        ),
19
+        migrations.AlterField(
20
+            model_name='usermessageinfo',
21
+            name='photo_id',
22
+            field=models.CharField(max_length=255, blank=True, help_text='\u98de\u56fe\u552f\u4e00\u6807\u8bc6', null=True, verbose_name='photo_id', db_index=True),
23
+        ),
24
+    ]

+ 2 - 2
message/models.py

@@ -42,8 +42,8 @@ class UserMessageInfo(CreateUpdateMixin):
42 42
 
43 43
     to_uid = models.CharField(_(u'to_uid'), max_length=255, blank=True, null=True, help_text=u'接收消息用户唯一标识', db_index=True)
44 44
 
45
-    group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识')
46
-    photo_id = models.CharField(_(u'photo_id'), max_length=255, blank=True, null=True, help_text=u'飞图唯一标识')
45
+    group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True)
46
+    photo_id = models.CharField(_(u'photo_id'), max_length=255, blank=True, null=True, help_text=u'飞图唯一标识', db_index=True)
47 47
 
48 48
     msg_type = models.CharField(_(u'msg_type'), max_length=255, default='system', help_text=u'消息类型', db_index=True)
49 49
     msg_title = models.CharField(_(u'msg_title'), max_length=255, blank=True, null=True, help_text=u'消息标题')

+ 0 - 1
pai2/basemodels.py

@@ -1,4 +1,3 @@
1
-#!/usr/bin/env python
2 1
 # -*- coding: utf-8 -*-
3 2
 
4 3
 from django.db import models

+ 1 - 2
pai2/settings.py

@@ -69,7 +69,6 @@ MIDDLEWARE_CLASSES += ('multidomain.middleware.DomainMiddleware', )
69 69
 
70 70
 URL_CONFIG = (
71 71
     # (r'^(.+\.)?xfoto\.com\.cn', 'pai2.urls_www'),
72
-    (r'^(.+\.)?api\.xfoto\.com\.cn', 'pai2.urls_api'),
73 72
     (r'^(.+\.)?api\.pai\.ai', 'pai2.urls_api'),
74 73
 )
75 74
 
@@ -250,7 +249,7 @@ PAI2_HOME_MAX_ROWS = 400  # 首页照片最大数量, PAI2_HOME_PER_PAGE * PAI2_
250 249
 GROUP_PER_PAGE = 20  # 群组每页数量
251 250
 
252 251
 # 价格设置
253
-LESMAN_PHOTO_HAGGLE_MAX_TIMES = 3  # 摄影师照片最大砍价次数
252
+LENSMAN_PHOTO_HAGGLE_MAX_TIMES = 3  # 摄影师照片最大砍价次数
254 253
 
255 254
 # 订单设置
256 255
 ORDER_NUM_PER_PAGE = 10  # 订单每页数量

+ 34 - 0
pay/migrations/0004_auto_20160422_1322.py

@@ -0,0 +1,34 @@
1
+# -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
3
+
4
+from django.db import models, migrations
5
+
6
+
7
+class Migration(migrations.Migration):
8
+
9
+    dependencies = [
10
+        ('pay', '0003_auto_20160417_1544'),
11
+    ]
12
+
13
+    operations = [
14
+        migrations.AddField(
15
+            model_name='orderinfo',
16
+            name='group_id',
17
+            field=models.CharField(max_length=255, blank=True, help_text='\u7fa4\u7ec4\u552f\u4e00\u6807\u8bc6', null=True, verbose_name='group_id', db_index=True),
18
+        ),
19
+        migrations.AddField(
20
+            model_name='orderinfo',
21
+            name='lensman_photo_id',
22
+            field=models.CharField(max_length=255, blank=True, help_text='\u6444\u5f71\u5e08\u7167\u7247\u552f\u4e00\u6807\u8bc6\uff0c\u540c PhotosInfo \u8868', null=True, verbose_name='lensman_photo_id', db_index=True),
23
+        ),
24
+        migrations.AddField(
25
+            model_name='orderinfo',
26
+            name='photo_id',
27
+            field=models.CharField(max_length=255, blank=True, help_text='\u98de\u56fe\u552f\u4e00\u6807\u8bc6', null=True, verbose_name='photo_id', db_index=True),
28
+        ),
29
+        migrations.AddField(
30
+            model_name='orderinfo',
31
+            name='photo_type',
32
+            field=models.IntegerField(default=0, help_text='\u8d2d\u4e70\u7167\u7247\u7c7b\u578b', verbose_name='photo_type', choices=[(0, '\u53bb\u9664\u6c34\u5370'), (1, '\u83b7\u53d6\u9ad8\u6e05\u56fe')]),
33
+        ),
34
+    ]

+ 24 - 2
pay/models.py

@@ -8,8 +8,18 @@ from shortuuidfield import ShortUUIDField
8 8
 
9 9
 from pai2.basemodels import CreateUpdateMixin
10 10
 
11
+from group.models import GroupPhotoInfo
12
+
11 13
 
12 14
 class OrderInfo(CreateUpdateMixin):
15
+    NOMARK = 0
16
+    ORIGIN = 1
17
+
18
+    PHOTO_TYPE = (
19
+        (NOMARK, u'去除水印'),
20
+        (ORIGIN, u'获取高清图'),
21
+    )
22
+
13 23
     """
14 24
     # Trade State of Wechat Query
15 25
     SUCCESS ——— 支付成功
@@ -35,6 +45,12 @@ class OrderInfo(CreateUpdateMixin):
35 45
 
36 46
     order_id = ShortUUIDField(_(u'order_id'), max_length=255, help_text=u'订单唯一标识', db_index=True)
37 47
 
48
+    group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True)
49
+    photo_id = models.CharField(_(u'photo_id'), max_length=255, blank=True, null=True, help_text=u'飞图唯一标识', db_index=True)
50
+    lensman_photo_id = models.CharField(_(u'lensman_photo_id'), max_length=255, blank=True, null=True, help_text=u'摄影师照片唯一标识,同 PhotosInfo 表', db_index=True)
51
+
52
+    photo_type = models.IntegerField(_('photo_type'), choices=PHOTO_TYPE, default=NOMARK, help_text=u'购买照片类型')
53
+
38 54
     from_uid = models.CharField(_(u'from_uid'), max_length=255, help_text=u'付款用户唯一标识', db_index=True)
39 55
     to_lid = models.CharField(_(u'to_lid'), max_length=255, blank=True, null=True, help_text=u'收款摄影师唯一标识', db_index=True)
40 56
     to_uid = models.CharField(_(u'to_uid'), max_length=255, blank=True, null=True, help_text=u'收款用户唯一标识', db_index=True)
@@ -54,11 +70,17 @@ class OrderInfo(CreateUpdateMixin):
54 70
     def __unicode__(self):
55 71
         return u'{0.pk}'.format(self)
56 72
 
57
-    @property
58
-    def data(self):
73
+    def data(self, user_id=None):
74
+        try:
75
+            group_photo = GroupPhotoInfo.objects.get(pk=self.photo_id)
76
+        except GroupPhotoInfo.DoesNotExist:
77
+            group_photo = {}
59 78
         return {
60 79
             'order_id': self.order_id,
61 80
             'from_uid': self.from_uid,
81
+            'group_id': self.group_id,
82
+            'photo_id': self.photo_id,
83
+            'group_photo_info': group_photo and group_photo.photo_info(user_id),
62 84
             'to_lid': self.to_lid,
63 85
             'to_uid': self.to_uid,
64 86
             'body': self.body,

+ 46 - 6
pay/views.py

@@ -5,13 +5,18 @@ from django.db import transaction
5 5
 from django.http import JsonResponse
6 6
 from django.shortcuts import HttpResponse
7 7
 
8
+from group.models import GroupPhotoInfo, GroupPhotoOrderInfo
8 9
 from pay.models import OrderInfo
10
+from photo.models import PhotosInfo
9 11
 
10 12
 from utils.page_utils import pagination
11 13
 
12
-from utils.error.errno_utils import OrderStatusCode
14
+from utils.error.errno_utils import GroupPhotoStatusCode, OrderStatusCode
13 15
 from utils.error.response_utils import response
14 16
 
17
+from utils.redis.rkeys import LENSMAN_PHOTO_PRICE
18
+from utils.redis.rorder import set_lensman_order_record
19
+
15 20
 from logit import logit
16 21
 
17 22
 from TimeConvert import TimeConvert as tc
@@ -20,6 +25,7 @@ from wechatpy import WeChatPay, WeChatPayException
20 25
 import xmltodict
21 26
 
22 27
 
28
+r = settings.REDIS_CACHE
23 29
 WECHAT = settings.WECHAT
24 30
 
25 31
 
@@ -31,13 +37,33 @@ def wx_order_create_api(request):
31 37
     :param request:
32 38
     :return:
33 39
     """
34
-    from_uid = request.POST.get('from_uid', '')
35
-    to_lid = request.POST.get('to_lid', '')
36
-    to_uid = request.POST.get('to_uid', '')
40
+    # from_uid = request.POST.get('from_uid', '')
41
+    # to_lid = request.POST.get('to_lid', '')
42
+    # to_uid = request.POST.get('to_uid', '')
43
+
44
+    group_id = request.POST.get('group_id', '')
45
+    user_id = request.POST.get('user_id', '')
46
+    photo_id = request.POST.get('photo_id', '')
47
+    photo_type = request.POST.get('photo_type', 'nomark')  # nomark for 去除水印, origin for 获取高清图
48
+
49
+    # 群组照片校验
50
+    try:
51
+        group_photo = GroupPhotoInfo.objects.get(pk=photo_id)
52
+    except GroupPhotoInfo.DoesNotExist:
53
+        return response(GroupPhotoStatusCode.GROUP_PHOTO_NOT_FOUND)
37 54
 
38 55
     body = request.POST.get('body', '')  # 商品描述
39 56
     total_fee = int(request.POST.get('total_fee', 0))  # 总金额,单位分
40 57
 
58
+    # 金额校验
59
+    # if float(r.get(LENSMAN_PHOTO_PRICE % (user_id, photo_id, photo_type)) or 0) != total_fee:
60
+    #     return response(OrderStatusCode.FEE_CHECK_FAIL)
61
+
62
+    # 获取 from_uid, to_lid, to_uid
63
+    from_uid = user_id
64
+    to_lid = group_photo.lensman_id
65
+    to_uid = '' if group_photo.lensman_id else group_photo.user_id
66
+
41 67
     # JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付,统一下单接口trade_type的传参可参考这里
42 68
     trade_type = request.POST.get('trade_type', '')
43 69
 
@@ -48,6 +74,10 @@ def wx_order_create_api(request):
48 74
 
49 75
     # 生成订单
50 76
     order = OrderInfo.objects.create(
77
+        group_id=group_id,
78
+        photo_id=photo_id,
79
+        lensman_photo_id=group_photo.lensman_photo_id,
80
+        photo_type=1 if photo_type == 'origin' else 0,
51 81
         from_uid=from_uid,
52 82
         to_lid=to_lid,
53 83
         to_uid=to_uid,
@@ -93,6 +123,16 @@ def order_paid_success(order):
93 123
     order.paid_at = tc.utc_datetime()
94 124
     order.save()
95 125
 
126
+    porder, created = GroupPhotoOrderInfo.objects.get_or_create(group_id=order.group_id, photo_id=order.group_id, user_id=order.from_uid)
127
+    photo = PhotosInfo.objects.get(photo_id=order.lensman_photo_id)
128
+    if order.photo_type == OrderInfo.NOMARK:
129
+        porder.m_photo_path = photo.m_photo_path
130
+    elif order.photo_type == OrderInfo.ORIGIN:
131
+        porder.r_photo_path = photo.r_photo_path
132
+    porder.save()
133
+
134
+    set_lensman_order_record(porder)
135
+
96 136
 
97 137
 def order_paid_fail(order):
98 138
     if order.pay_status == OrderInfo.FAIL:
@@ -177,7 +217,7 @@ def wx_order_list_api(request):
177 217
 
178 218
     orders = OrderInfo.objects.filter(from_uid=user_id).order_by('-pk')
179 219
     orders, left = pagination(orders, page, num)
180
-    orders = [order.data for order in orders]
220
+    orders = [order.data(user_id) for order in orders]
181 221
 
182 222
     return JsonResponse({
183 223
         'status': 200,
@@ -212,7 +252,7 @@ def wx_order_detail_api(request):
212 252
         'status': 200,
213 253
         'message': u'获取订单详情成功',
214 254
         'data': {
215
-            'order': order.data,
255
+            'order': order.data(user_id),
216 256
         },
217 257
     })
218 258
 

+ 34 - 0
photo/migrations/0007_auto_20160422_1322.py

@@ -0,0 +1,34 @@
1
+# -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
3
+
4
+from django.db import models, migrations
5
+
6
+
7
+class Migration(migrations.Migration):
8
+
9
+    dependencies = [
10
+        ('photo', '0006_auto_20160120_1830'),
11
+    ]
12
+
13
+    operations = [
14
+        migrations.AlterField(
15
+            model_name='photosinfo',
16
+            name='l_photo_path',
17
+            field=models.CharField(help_text='\u7167\u7247\u5b58\u653e\u8def\u5f84\uff0c\u7f8e\u5316\u5927\u56fe', max_length=255, null=True, verbose_name='l_photo_path', blank=True),
18
+        ),
19
+        migrations.AlterField(
20
+            model_name='photosinfo',
21
+            name='m_photo_path',
22
+            field=models.CharField(help_text='\u7167\u7247\u5b58\u653e\u8def\u5f84\uff0c\u63a7\u5236\u5668\u4e0a\u4f20\uff0c\u65e0\u6c34\u5370', max_length=255, null=True, verbose_name='m_photo_path', blank=True),
23
+        ),
24
+        migrations.AlterField(
25
+            model_name='photosinfo',
26
+            name='p_photo_path',
27
+            field=models.CharField(help_text='\u7167\u7247\u5b58\u653e\u8def\u5f84\uff0c\u63a7\u5236\u5668\u4e0a\u4f20\uff0c\u6709\u6c34\u5370\uff0c\u670d\u52a1\u5668\u6dfb\u52a0', max_length=255, null=True, verbose_name='p_photo_path', blank=True),
28
+        ),
29
+        migrations.AlterField(
30
+            model_name='photosinfo',
31
+            name='r_photo_path',
32
+            field=models.CharField(help_text='\u7167\u7247\u5b58\u653e\u8def\u5f84\uff0c\u9ad8\u6e05\u5927\u56fe', max_length=255, null=True, verbose_name='r_photo_path', blank=True),
33
+        ),
34
+    ]

+ 4 - 4
photo/models.py

@@ -34,10 +34,10 @@ class PhotosInfo(CreateUpdateMixin):
34 34
     lensman_id = models.CharField(_(u'lensman_id'), max_length=255, blank=True, null=True, help_text=u'摄影师唯一标识', db_index=True)
35 35
     session_id = models.CharField(_(u'session_id'), max_length=255, blank=True, null=True, help_text=u'照片组唯一标识', db_index=True)
36 36
     photo_id = models.CharField(_(u'photo_id'), max_length=255, blank=True, null=True, help_text=u'照片唯一标识', db_index=True, unique=True)
37
-    p_photo_path = models.CharField(_(u'p_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径')
38
-    m_photo_path = models.CharField(_(u'm_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径')
39
-    l_photo_path = models.CharField(_(u'l_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径')
40
-    r_photo_path = models.CharField(_(u'r_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径')
37
+    p_photo_path = models.CharField(_(u'p_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,控制器上传,有水印,服务器添加')
38
+    m_photo_path = models.CharField(_(u'm_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,控制器上传,无水印')
39
+    l_photo_path = models.CharField(_(u'l_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,美化大图')
40
+    r_photo_path = models.CharField(_(u'r_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,高清大图')
41 41
 
42 42
     class Meta:
43 43
         verbose_name = _('photosinfo')

+ 3 - 0
photo/views.py

@@ -234,6 +234,9 @@ def session_join_api(request):
234 234
                 photo_thumbnail2_w=photo_thumbnail2_w,
235 235
                 photo_thumbnail2_h=photo_thumbnail2_h,
236 236
                 photo_from=GroupPhotoInfo.SESSION_GROUP,
237
+                session_id=photo.session_id,
238
+                lensman_id=photo.lensman_id,
239
+                lensman_photo_id=photo.photo_id,
237 240
             )
238 241
 
239 242
         # 设置群组最后一张照片PK

+ 1 - 0
utils/error/errno_utils.py

@@ -69,6 +69,7 @@ class OrderStatusCode(BaseStatusCode):
69 69
     WX_ORDER_PAYING = StatusCodeField(404003, u'WX Order Paying', description=u'订单支付中')
70 70
     WX_ORDER_PAY_FAIL = StatusCodeField(404009, u'WX Order Pay Fail', description=u'微信支付失败')
71 71
     SIGN_CHECK_FAIL = StatusCodeField(404010, u'Sign Check Fail', description=u'签名校验失败')
72
+    FEE_CHECK_FAIL = StatusCodeField(404011, u'FEE Check Fail', description=u'金额校验失败')
72 73
     NO_DETAIL_PERMISSION = StatusCodeField(404015, u'No Detail Permission', description=u'没有详情权限')
73 74
 
74 75
 

+ 3 - 2
utils/redis/rkeys.py

@@ -19,8 +19,9 @@ GROUP_PHOTO_THUMB_UP = 'group:photo:thumb:up:%s:%s'  # STRING,群组照片用
19 19
 GROUP_LAST_PHOTO_PK = 'group:last:photo:pk:%s'  # STRING,群组最后一张照片PK,group_id
20 20
 
21 21
 # 摄影师照片相关
22
-LESMAN_PHOTO_PRICE = 'lesman:photo:price:%s:%s:%s'  # STRING,摄影师照片价格,photo_id、user_id、photo_type
23
-LESMAN_PHOTO_HAGGLE_TIMES = 'lesman:photo:haggle:times:%s:%s:%s'  # STRING,摄影师照片价格,photo_id、user_id、photo_type
22
+LENSMAN_PHOTO_PRICE = 'lensman:photo:price:%s:%s:%s'  # STRING,摄影师照片价格,photo_id、user_id、photo_type
23
+LENSMAN_PHOTO_HAGGLE_TIMES = 'lensman:photo:haggle:times:%s:%s:%s'  # STRING,摄影师照片价格,photo_id、user_id、photo_type
24
+LENSMAN_PHOTO_ORDER_RECORD = 'lensman:photo:order:record:%s:%s'  # STRING,摄影师照片购买记录,photo_id、user_id
24 25
 
25 26
 # 系统消息相关
26 27
 SYSTEM_MESSAGE_DELETED_INFO = 'system:message:deleted:info:%s'  # STRING,系统消息删除信息,user_id

+ 36 - 0
utils/redis/rorder.py

@@ -0,0 +1,36 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from django.conf import settings
4
+from django.core.serializers.json import DjangoJSONEncoder
5
+
6
+from utils.redis.rkeys import LENSMAN_PHOTO_ORDER_RECORD
7
+
8
+import json
9
+
10
+
11
+r = settings.REDIS_CACHE
12
+
13
+
14
+# 摄影师照片购买记录相关
15
+
16
+
17
+def set_lensman_order_record(porder):
18
+    """ 设置摄影师照片购买记录 """
19
+    porder_info = porder.porder_info
20
+    r.setex(LENSMAN_PHOTO_ORDER_RECORD % (porder.photo_id, porder.user_id), settings.REDIS_EXPIRED_MONTH, json.dumps(porder_info, cls=DjangoJSONEncoder))
21
+    return porder_info
22
+
23
+
24
+def set_lensman_order_record_by_id(photo_id, user_id):
25
+    """ 设置摄影师照片购买记录 """
26
+    from group.models import GroupPhotoOrderInfo
27
+    try:
28
+        porder = GroupPhotoOrderInfo.objects.get(photo_id=photo_id, user_id=user_id)
29
+    except GroupPhotoOrderInfo.DoesNotExist:
30
+        return {}
31
+    return set_lensman_order_record(porder)
32
+
33
+
34
+def get_lensman_order_record(photo_id, user_id):
35
+    """ 获取摄影师照片购买记录 """
36
+    return json.loads(r.get(LENSMAN_PHOTO_ORDER_RECORD % (photo_id, user_id)) or '{}') or set_lensman_order_record_by_id(photo_id, user_id)