.js" class="text truncate">isWeakSet.js 11e3a9652a first 8 anni fa iteratee.js 11e3a9652a first 8 anni fa join.js 11e3a9652a first 8 anni fa kebabCase.js 11e3a9652a first 8 anni fa keyBy.js 11e3a9652a first 8 anni fa keys.js 11e3a9652a first 8 anni fa keysIn.js 11e3a9652a first 8 anni fa lang.js 11e3a9652a first 8 anni fa last.js 11e3a9652a first 8 anni fa lastIndexOf.js 11e3a9652a first 8 anni fa lodash.js 11e3a9652a first 8 anni fa lodash.min.js 11e3a9652a first 8 anni fa lowerCase.js 11e3a9652a first 8 anni fa lowerFirst.js 11e3a9652a first 8 anni fa lt.js 11e3a9652a first 8 anni fa lte.js 11e3a9652a first 8 anni fa map.js 11e3a9652a first 8 anni fa mapKeys.js 11e3a9652a first 8 anni fa mapValues.js 11e3a9652a first 8 anni fa matches.js 11e3a9652a first 8 anni fa matchesProperty.js 11e3a9652a first 8 anni fa math.js 11e3a9652a first 8 anni fa max.js 11e3a9652a first 8 anni fa maxBy.js 11e3a9652a first 8 anni fa mean.js 11e3a9652a first 8 anni fa meanBy.js 11e3a9652a first 8 anni fa memoize.js 11e3a9652a first 8 anni fa merge.js 11e3a9652a first 8 anni fa mergeWith.js 11e3a9652a first 8 anni fa method.js 11e3a9652a first 8 anni fa methodOf.js 11e3a9652a first 8 anni fa min.js 11e3a9652a first 8 anni fa minBy.js 11e3a9652a first 8 anni fa mixin.js 11e3a9652a first 8 anni fa multiply.js 11e3a9652a first 8 anni fa negate.js 11e3a9652a first 8 anni fa next.js 11e3a9652a first 8 anni fa noop.js 11e3a9652a first 8 anni fa now.js 11e3a9652a first 8 anni fa nth.js 11e3a9652a first 8 anni fa nthArg.js 11e3a9652a first 8 anni fa number.js 11e3a9652a first 8 anni fa object.js 11e3a9652a first 8 anni fa omit.js 11e3a9652a first 8 anni fa omitBy.js 11e3a9652a first 8 anni fa once.js 11e3a9652a first 8 anni fa orderBy.js 11e3a9652a first 8 anni fa over.js 11e3a9652a first 8 anni fa overArgs.js 11e3a9652a first 8 anni fa overEvery.js 11e3a9652a first 8 anni fa overSome.js 11e3a9652a first 8 anni fa package.json 11e3a9652a first 8 anni fa pad.js 11e3a9652a first 8 anni fa padEnd.js 11e3a9652a first 8 anni fa padStart.js 11e3a9652a first 8 anni fa parseInt.js 11e3a9652a first 8 anni fa partial.js 11e3a9652a first 8 anni fa partialRight.js 11e3a9652a first 8 anni fa partition.js 11e3a9652a first 8 anni fa pick.js 11e3a9652a first 8 anni fa pickBy.js 11e3a9652a first 8 anni fa plant.js 11e3a9652a first 8 anni fa property.js 11e3a9652a first 8 anni fa propertyOf.js 11e3a9652a first 8 anni fa pull.js 11e3a9652a first 8 anni fa pullAll.js 11e3a9652a first 8 anni fa pullAllBy.js 11e3a9652a first 8 anni fa pullAllWith.js 11e3a9652a first 8 anni fa pullAt.js 11e3a9652a first 8 anni fa random.js 11e3a9652a first 8 anni fa range.js 11e3a9652a first 8 anni fa rangeRight.js 11e3a9652a first 8 anni fa rearg.js 11e3a9652a first 8 anni fa reduce.js 11e3a9652a first 8 anni fa reduceRight.js 11e3a9652a first 8 anni fa reject.js 11e3a9652a first 8 anni fa remove.js 11e3a9652a first 8 anni fa repeat.js 11e3a9652a first 8 anni fa replace.js 11e3a9652a first 8 anni fa rest.js 11e3a9652a first 8 anni fa result.js 11e3a9652a first 8 anni fa reverse.js 11e3a9652a first 8 anni fa round.js 11e3a9652a first 8 anni fa sample.js 11e3a9652a first 8 anni fa sampleSize.js 11e3a9652a first 8 anni fa seq.js 11e3a9652a first 8 anni fa set.js 11e3a9652a first 8 anni fa setWith.js 11e3a9652a first 8 anni fa shuffle.js 11e3a9652a first 8 anni fa size.js 11e3a9652a first 8 anni fa slice.js 11e3a9652a first 8 anni fa snakeCase.js 11e3a9652a first 8 anni fa some.js 11e3a9652a first 8 anni fa sortBy.js 11e3a9652a first 8 anni fa sortedIndex.js 11e3a9652a first 8 anni fa sortedIndexBy.js 11e3a9652a first 8 anni fa sortedIndexOf.js 11e3a9652a first 8 anni fa sortedLastIndex.js 11e3a9652a first 8 anni fa sortedLastIndexBy.js 11e3a9652a first 8 anni fa sortedLastIndexOf.js 11e3a9652a first 8 anni fa sortedUniq.js 11e3a9652a first 8 anni fa sortedUniqBy.js 11e3a9652a first 8 anni fa split.js 11e3a9652a first 8 anni fa spread.js 11e3a9652a first 8 anni fa startCase.js 11e3a9652a first 8 anni fa startsWith.js 11e3a9652a first 8 anni fa string.js 11e3a9652a first 8 anni fa stubArray.js 11e3a9652a first 8 anni fa stubFalse.js 11e3a9652a first 8 anni fa stubObject.js 11e3a9652a first 8 anni fa stubString.js 11e3a9652a first 8 anni fa stubTrue.js 11e3a9652a first 8 anni fa subtract.js 11e3a9652a first 8 anni fa sum.js 11e3a9652a first 8 anni fa sumBy.js 11e3a9652a first 8 anni fa tail.js 11e3a9652a first 8 anni fa take.js 11e3a9652a first 8 anni fa takeRight.js 11e3a9652a first 8 anni fa takeRightWhile.js 11e3a9652a first 8 anni fa takeWhile.js 11e3a9652a first 8 anni fa tap.js 11e3a9652a first 8 anni fa template.js 11e3a9652a first 8 anni fa templateSettings.js 11e3a9652a first 8 anni fa throttle.js 11e3a9652a first 8 anni fa thru.js 11e3a9652a first 8 anni fa times.js 11e3a9652a first 8 anni fa toArray.js 11e3a9652a first 8 anni fa toFinite.js 11e3a9652a first 8 anni fa toInteger.js 11e3a9652a first 8 anni fa toIterator.js 11e3a9652a first 8 anni fa toJSON.js 11e3a9652a first 8 anni fa toLength.js 11e3a9652a first 8 anni fa toLower.js 11e3a9652a first 8 anni fa toNumber.js 11e3a9652a first 8 anni fa toPairs.js 11e3a9652a first 8 anni fa toPairsIn.js 11e3a9652a first 8 anni fa toPath.js 11e3a9652a first 8 anni fa toPlainObject.js 11e3a9652a first 8 anni fa toSafeInteger.js 11e3a9652a first 8 anni fa toString.js 11e3a9652a first 8 anni fa toUpper.js 11e3a9652a first 8 anni fa transform.js 11e3a9652a first 8 anni fa trim.js 11e3a9652a first 8 anni fa trimEnd.js 11e3a9652a first 8 anni fa trimStart.js 11e3a9652a first 8 anni fa truncate.js 11e3a9652a first 8 anni fa unary.js 11e3a9652a first 8 anni fa unescape.js 11e3a9652a first 8 anni fa union.js 11e3a9652a first 8 anni fa unionBy.js 11e3a9652a first 8 anni fa unionWith.js 11e3a9652a first 8 anni fa uniq.js 11e3a9652a first 8 anni fa uniqBy.js 11e3a9652a first 8 anni fa uniqWith.js 11e3a9652a first 8 anni fa uniqueId.js 11e3a9652a first 8 anni fa unset.js 11e3a9652a first 8 anni fa unzip.js 11e3a9652a first 8 anni fa unzipWith.js 11e3a9652a first 8 anni fa update.js 11e3a9652a first 8 anni fa updateWith.js 11e3a9652a first 8 anni fa upperCase.js 11e3a9652a first 8 anni fa upperFirst.js 11e3a9652a first 8 anni fa util.js 11e3a9652a first 8 anni fa value.js 11e3a9652a first 8 anni fa valueOf.js 11e3a9652a first 8 anni fa values.js 11e3a9652a first 8 anni fa valuesIn.js 11e3a9652a first 8 anni fa without.js 11e3a9652a first 8 anni fa words.js 11e3a9652a first 8 anni fa wrap.js 11e3a9652a first 8 anni fa wrapperAt.js 11e3a9652a first 8 anni fa wrapperChain.js 11e3a9652a first 8 anni fa wrapperLodash.js 11e3a9652a first 8 anni fa wrapperReverse.js 11e3a9652a first 8 anni fa wrapperValue.js 11e3a9652a first 8 anni fa xor.js 11e3a9652a first 8 anni fa xorBy.js 11e3a9652a first 8 anni fa xorWith.js 11e3a9652a first 8 anni fa zip.js 11e3a9652a first 8 anni fa zipObject.js 11e3a9652a first 8 anni fa zipObjectDeep.js 11e3a9652a first 8 anni fa zipWith.js 11e3a9652a first 8 anni fa

README.md

lodash v4.17.5

The Lodash library exported as Node.js modules.

Installation

Using npm:

$ npm i -g npm
$ npm i --save lodash

In Node.js:

// Load the full build.
var _ = require('lodash');
// Load the core build.
var _ = require('lodash/core');
// Load the FP build for immutable auto-curried iteratee-first data-last methods.
var fp = require('lodash/fp');

// Load method categories.
var array = require('lodash/array');
var object = require('lodash/fp/object');

// Cherry-pick methods for smaller browserify/rollup/webpack bundles.
var at = require('lodash/at');
var curryN = require('lodash/fp/curryN');

See the package source for more details.

Note:
Install n_ for Lodash use in the Node.js < 6 REPL.

Support

Tested in Chrome 63-64, Firefox 57-58, IE 11, Edge 14, Safari 10-11, Node.js 4-9, & PhantomJS 2.1.1.
Automated browser & CI test runs are available.

kodo - Gogs: Go Git Service

No Description

storage_qiniu_utils.py 5.2KB

    # -*- coding: utf-8 -*- import os import shortuuid from django.conf import settings from django.core.files.storage import default_storage from django.db import transaction from django_file_md5 import calculate_md5 from photo.models import PhotoUUIDInfo from utils.qiniucdn import upload_file_path from utils.thumbnail_utils import make_thumbnail from utils.watermark_utils import watermark_wrap class DotDict(dict): """ dot.notation access to dictionary attributes """ def __getattr__(self, attr): return self.get(attr) __setattr__ = dict.__setitem__ __delattr__ = dict.__delitem__ def file_abspath(file_path=None): return os.path.join(settings.MEDIA_ROOT, file_path).replace('\\', '/') @transaction.atomic def file_save(file_=None, file_path=None, prefix='img', ext='.jpeg', watermark=False, thumbnail=False): photo_path, photo_watermark_path, photo_thumbnail_path, photo_thumbnail2_path = '', '', '', '' # Photo file_ = file_ or default_storage.open(file_path) # Ext ext = os.path.splitext(file_.name)[-1] or ext # Photo MD5 photo_md5 = calculate_md5(file_) # Photo UUID Get or Create photo, created = PhotoUUIDInfo.objects.select_for_update().get_or_create(photo_md5=photo_md5) # 无水印 if not photo.photo_path: photo_path = '{}/{}{}'.format(prefix, shortuuid.uuid(), ext) if default_storage.exists(photo_path): default_storage.delete(photo_path) default_storage.save(photo_path, file_) photo_path_qiniu = upload_file_path(file_abspath(photo_path), bucket='photo') photo.photo_path = photo_path_qiniu photo.save() else: if ((watermark and not photo.photo_watermark_path) or (thumbnail and not (photo.photo_thumbnail_path and photo.photo_thumbnail2_path))) and (not default_storage.exists(photo.photo_path)): default_storage.save(photo.photo_path, file_) # 有水印 if watermark: if not photo.photo_watermark_path: if settings.WATERMARK_OR_NOT: photo_watermark_path = 'photo/{}{}'.format(shortuuid.uuid(), ext) watermark_wrap( file_abspath(photo_path), settings.WATERMARK_LOGO_PATH, file_abspath(photo_watermark_path) ) photo_watermark_path_qiniu = upload_file_path(file_abspath(photo_watermark_path), bucket='watermark') photo.photo_watermark_path = photo_watermark_path_qiniu else: photo.photo_watermark_path = photo_path_qiniu photo.save() # 缩略图 if thumbnail: if not photo.photo_thumbnail_path: # 双列: 540, 40-50K photo_thumbnail_path = photo_path.replace('.', '_thumbnail.') photo_w, photo_h, photo_thumbnail_w, photo_thumbnail_h = make_thumbnail( file_abspath(photo_path), file_abspath(photo_thumbnail_path), settings.THUMBNAIL_MAX_WIDTH ) photo_thumbnail_path_qiniu = upload_file_path(file_abspath(photo_thumbnail_path), bucket='thumbnail') photo.photo_w = photo_w photo.photo_h = photo_h photo.photo_thumbnail_path = photo_thumbnail_path_qiniu photo.photo_thumbnail_w = photo_thumbnail_w photo.photo_thumbnail_h = photo_thumbnail_h if not photo.photo_thumbnail2_path: # 单列: 1080, xx-100K photo_thumbnail2_path = photo_path.replace('.', '_thumbnail2.') photo_w, photo_h, photo_thumbnail2_w, photo_thumbnail2_h = make_thumbnail( file_abspath(photo_path), file_abspath(photo_thumbnail2_path), settings.THUMBNAIL_MAX_WIDTH2 ) if watermark and settings.WATERMARK_OR_NOT: watermark_wrap( file_abspath(photo_thumbnail2_path), settings.WATERMARK_LOGO_PATH, file_abspath(photo_thumbnail2_path) ) photo_thumbnail2_path_qiniu = upload_file_path(file_abspath(photo_thumbnail2_path), bucket='thumbnail2') photo.photo_w = photo_w photo.photo_h = photo_h photo.photo_thumbnail2_path = photo_thumbnail2_path_qiniu photo.photo_thumbnail2_w = photo_thumbnail2_w photo.photo_thumbnail2_h = photo_thumbnail2_h photo.save() # 本地删除 for path in [photo_path, photo_watermark_path, photo_thumbnail_path, photo_thumbnail2_path]: if path and default_storage.exists(path): default_storage.delete(path) return DotDict({ 'ext': ext, 'photo_md5': photo_md5, 'photo_path': photo.photo_path, 'photo_w': photo.photo_w, 'photo_h': photo.photo_h, 'photo_watermark_path': photo.photo_watermark_path, 'photo_thumbnail_path': photo.photo_thumbnail_path, 'photo_thumbnail_w': photo.photo_thumbnail_w, 'photo_thumbnail_h': photo.photo_thumbnail_h, 'photo_thumbnail2_path': photo.photo_thumbnail2_path, 'photo_thumbnail2_w': photo.photo_thumbnail2_w, 'photo_thumbnail2_h': photo.photo_thumbnail2_h, })