百搜论坛欢迎您的加入!
adimg adimg
 
昨日:篇  今日:篇   总帖:篇   会员:
今日:0    总帖:26
admin
1033
近几年,市场环境变化无常,很多传统行业都开始发展电商,电商创业、电商助农... 电商行业的新鲜血液瞬间涌入了很多,对于一个电商小白来说,进入电商行业,找好领路人很重要,选择靠谱的商城系统也十分重要。很多人可能会疑问,为什么要选择商城系统,而不是直接挑选现有电商平台入驻?首先,现有电商平台的发展已逐步进入平台期,电商小白进入这种大市场中,“石沉大海” 的可能性会很大;再者,用商城系统最重要的一个好处就是有利于私域流量的积累与管理,这样对品牌建设、用户积累都能打下良好的基础。市场中的电商系统鱼龙混杂,所以在选择电商系统的时候,一定要擦亮眼睛,既要考虑实际应用是否满足需求,也要平衡创业成本。如果前期不想投入太多,建议大家还是选择一款全开源、功能齐全的商城系统比较靠谱,降低试错成本,有效提高创业成功率。当然,如何选择一套开源免费商用、功能齐全的商城系统,也是一个很有考验的事情。通常情况下,建议大家还是去专业的平台比较稳妥一些,比如被称为 “代码托管平台” 的 Gitee(码云),在这里,有很多免费的开源项目可以供大家使用,当需要搭建一个商城系统时,就可以根据 Gitee 官网 “开源项目 - 建站系统 - 新零售 / 网店 / 系统” 路径,寻找合适的系统搭建使用。同时,该平台也会评选一些最具价值的开源项目,赋予 GVP 图标,这是长期以来市场用户使用的反馈,代表着大部分用户的认可。例如,如果你需要一个 PHP 语言的开源系统,就可以选择其中的 CRMEB 打通版,这套系统不仅是 GVP-Gitee 最具价值开源项目,还是全开源免费商用,既能满足创业者的大部分功能需求,也附带有全面具体的使用文件,对于决心坚定的创业者来说,仔细研究这些资料,肯定能够轻松搭建起系统来使用,也能充分发挥各种系统功能,让自己的事业更上一层楼!源码附件已经打包好上传到百度云了,大家自行下载即可~链接: https://pan.baidu.com/s/14G-bpVthImHD4eosZUNSFA?pwd=yu27 提取码: yu27百度云链接不稳定,随时可能会失效,大家抓紧保存哈。如果百度云链接失效了的话,请留言告诉我,我看到后会及时更新~开源地址码云地址:http://github.crmeb.net/u/defuGithub 地址:http://github.crmeb.net/u/defu
0 0 662天前
admin
906
现在,无论是大平台,还是小公司,都在做分销裂变,很多商家通过分销活动,收获了流量红利,实现了获客、裂变、复购。但也有很大一部分商家,尽管也在做分销,但却没有在分销活动中取得预期的效果。同样是做分销,有的人会将分销与营销活动结合,多措并举,将分销裂变的效果尽可能放大。但有的人就只是机械的发朋友圈,分销永远停留在第一步,不仅没有拓展出新的客户群体,还可能会流失以前的稳定客户。所以,现在很多商家在做分销裂变活动时,会搭配一些营销活动同时进行,既保障了客户留存,也收获了分销裂变成果。拼团裂变拼团活动能充分发挥客户朋友圈的力量,用户发起拼团,通过社交方式分享给好友,好友参与拼团,共同以低于单品正常的价格购买商品,邀请者和受邀者都可以享受拼团价,这样能帮助商家巩固老用户,也能吸引到新的目标客户。秒杀活动商户创建限时限量秒杀,激发用户冲动式消费,也能通过一级分销用户拓展二级分销,甚至发展更多的分销群体。砍价功能砍价裂变的根本是低价刺激,用更低的价格吸引用户去找好友助力砍价,拉动更多人参与到其中,提高曝光率,也能从中进行客户转化。相较于以前传统的电话轰炸、散发传单的分销方式,现在 “私域 + 营销 + 分销” 的形式,更多的是私域流量在发挥作用,凭借人与人之间的社交关系,让客户的社交圈发挥能量、产生裂变,体现出每个人的社交价值,降低运营成本,帮助企业有效实现拓客引流。源码附件已经打包好上传到百度云了,大家自行下载即可~链接: https://pan.baidu.com/s/14G-bpVthImHD4eosZUNSFA?pwd=yu27 提取码: yu27百度云链接不稳定,随时可能会失效,大家抓紧保存哈。如果百度云链接失效了的话,请留言告诉我,我看到后会及时更新~开源地址码云地址:http://github.crmeb.net/u/defuGithub 地址:http://github.crmeb.net/u/defu
0 0 662天前
admin
1158
现在的电商市场,经营主体规模十分庞大,各种电商系统琳琅满目,但是仔细观察就会发现,有很大一部分商城系统的风格极其相似,很容易让消费者产生审美疲劳。那么,一个独具特色的商城系统,都需要什么功能来满足呢?主题风格随机应变一个商城系统的设计面对的是各行各业,不同行业适合的风格是存在很大区别的,比如生鲜类适合绿色系的风格,美妆类适合粉色系的风格,不同行业需要搭配不同风格。例如 CRMEB 开源打通版商城系统,就适配了 5 种不同的商城主题风格,商户在使用时选择合适的就行,而且这个设置还能兼容 H5、小程序、APP,使用十分方便。首页 DIY 功能必不可少如今,都在注重满足客户的个性化需求,商城系统也不例外。要实现个性化设置,首页 DIY 功能是必不可少的,CRMEB 开源打通版商城系统通过划分模块进行区域管理,各种模块素材随意更换,DIY 装修一个商城首页,不仅能让自己的商城看起来特色鲜明,也能根据实际需求添加或删除内容,操作更加灵活,系统设置也更人性化。数据配置自定义设置现在,人们的生活日渐电子化,用户的使用习惯也追求简单高效,能直接跳转的就别让人复制粘贴,能直接链接的就别让人去搜索寻找。在 CRMEB 开源打通版商城系统的界面设置中,数据配置就十分方便,各种图片、图标都可以直接链接到详细的页面,用户使用时,直接点击就能跳转到相关界面。所以,企业或品牌想要让自己的商城系统更加吸引人,就需要根据实际特点进行商城装修,选择合适的系统,匹配合适的功能,这就是你与众不同的第一步。源码附件已经打包好上传到百度云了,大家自行下载即可~链接: https://pan.baidu.com/s/14G-bpVthImHD4eosZUNSFA?pwd=yu27 提取码: yu27百度云链接不稳定,随时可能会失效,大家抓紧保存哈。如果百度云链接失效了的话,请留言告诉我,我看到后会及时更新~开源地址码云地址:http://github.crmeb.net/u/defuGithub 地址:http://github.crmeb.net/u/defu
0 0 665天前
admin
888
前言:之前的文章介绍了通过快照的方式加速 Node.js 的启动,除了快照,V8 还提供了另一种技术加速代码的执行,那就是代码缓存。通过 V8 第一次执行 JS 的时候,V8 需要即时进行解析和编译 JS代码,这个是需要一定时间的,代码缓存可以把这个过程的一些信息保存下来,下次执行的时候,通过这个缓存的信息就可以加速 JS 代码的执行。本文介绍在 Node.js 里如何利用代码缓存技术加速 Node.js 的启动。首先看一下 Node.js 的编译配置。'actions': [   {     'action_name': 'node_js2c',     'process_outputs_as_sources': 1,     'inputs': [       'tools/js2c.py',       '<@(library_files)',       '<@(deps_files)',       'config.gypi'     ],     'outputs': [       '<(SHARED_INTERMEDIATE_DIR)/node_javascript.cc',     ],     'action': [       '<(python)',       'tools/js2c.py',       '--directory',       'lib',       '--target',       '<@(_outputs)',       'config.gypi',       '<@(deps_files)',     ],   }, ],通过这个配置,在编译 Node.js 的时候,会执行 js2c.py,并且把输入写到 node_javascript.cc 文件。我们看一下生成的内容。里面定义了一个函数,这个函数里面往 source_ 字段里不断追加一系列的内容,其中 key 是 Node.js 中的原生 JS 模块信息,值是模块的内容,我们随便看一个模块 assert/strict。const data = [39,117,115,101, 32,115,116,114,105, 99,116, 39, 59, 10, 10,109,111,100,117,108,101, 46,101,120,112,111,114,116,115, 32,61, 32,114,101,113,117,105,114,101, 40, 39, 97,115,115,101,114,116, 39, 41, 46,115,116,114,105, 99,116, 59, 10]; console.log(Buffer.from(data).toString('utf-8'))输出如下。'use strict'; module.exports = require('assert').strict;通过 js2c.py  ,Node.js 把原生 JS 模块的内容写到了文件中,并且编译进 Node.js 的可执行文件里,这样在 Node.js 启动时就不需要从硬盘里读取对应的文件,否则无论是启动还是运行时动态加载原生 JS 模块,都需要更多的耗时,因为内存的速度远快于硬盘。这是 Node.js 做的第一个优化,接下来看代码缓存,因为代码缓存是在这个基础上实现的。首先看一下编译配置。['node_use_node_code_cache=="true"', {   'dependencies': [     'mkcodecache',   ],   'actions': [     {       'action_name': 'run_mkcodecache',       'process_outputs_as_sources': 1,       'inputs': [         '<(mkcodecache_exec)',       ],       'outputs': [         '<(SHARED_INTERMEDIATE_DIR)/node_code_cache.cc',       ],       'action': [         '<@(_inputs)',         '<@(_outputs)',       ],     },   ],}, {   'sources': [     'src/node_code_cache_stub.cc'   ], }],如果编译 Node.js 时 node_use_node_code_cache 为 true 则生成代码缓存。如果我们不需要可以关掉,具体执行 ./configure --without-node-code-cache。如果我们关闭代码缓存, Node.js 关于这部分的实现是空,具体在 node_code_cache_stub.cc。const bool has_code_cache = false; void NativeModuleEnv::InitializeCodeCache() {}也就是什么都不做。如果我们开启了代码缓存,就会执行 mkcodecache.cc 生成代码缓存。int main(int argc, char* argv[]) {   argv = uv_setup_args(argc, argv);   std::ofstream out;   out.open(argv[1], std::ios::out | std::ios::binary);   node::per_process::enabled_debug_list.Parse(nullptr);   std::unique_ptrplatform = v8::platform::NewDefaultPlatform();   v8::V8::InitializePlatform(platform.get());   v8::V8::Initialize();   Isolate::CreateParams create_params;   create_params.array_buffer_allocator_shared.reset(       ArrayBuffer::Allocator::NewDefaultAllocator());   Isolate* isolate = Isolate::New(create_params);   {     Isolate::Scope isolate_scope(isolate);     v8::HandleScope handle_scope(isolate);     v8::Localcontext = v8::Context::New(isolate);     v8::Context::Scope context_scope(context);     std::string cache = CodeCacheBuilder::Generate(context);     out << cache;     out.close();   }   isolate->Dispose();   v8::V8::ShutdownPlatform();   return 0; }首先打开文件,然后是 V8 的常用初始化逻辑,最后通过 Generate 生成代码缓存。std::string CodeCacheBuilder::Generate(Localcontext) {   NativeModuleLoader* loader = NativeModuleLoader::GetInstance();   std::vectorids = loader->GetModuleIds();   std::mapdata;   for (const auto& id : ids) {     if (loader->CanBeRequired(id.c_str())) {       NativeModuleLoader::Result result;       USE(loader->CompileAsModule(context, id.c_str(), &result));       ScriptCompiler::CachedData* cached_data = loader->GetCodeCache(id.c_str());       data.emplace(id, cached_data);     }   }   return GenerateCodeCache(data); }首先新建一个 NativeModuleLoader。NativeModuleLoader::NativeModuleLoader() : config_(GetConfig()) {   LoadJavaScriptSource(); }NativeModuleLoader 初始化时会执行 LoadJavaScriptSource,这个函数就是通过 python  生成的 node_javascript.cc 文件里的函数,初始化完成后 NativeModuleLoader 对象的 source_ 字段就保存了原生 JS 模块的代码。接着遍历这些原生 JS 模块,通过 CompileAsModule 进行编译。MaybeLocalNativeModuleLoader::CompileAsModule(     Localcontext,     const char* id,     NativeModuleLoader::Result* result) {   Isolate* isolate = context->GetIsolate();   std::vector<1local> parameters = {       FIXED_ONE_BYTE_STRING(isolate, "exports"),       FIXED_ONE_BYTE_STRING(isolate, "require"),       FIXED_ONE_BYTE_STRING(isolate, "module"),       FIXED_ONE_BYTE_STRING(isolate, "process"),       FIXED_ONE_BYTE_STRING(isolate, "internalBinding"),       FIXED_ONE_BYTE_STRING(isolate, "primordials")};   return LookupAndCompile(context, id, ¶meters, result); }接着看 LookupAndCompileMaybeLocalNativeModuleLoader::LookupAndCompile(     Localcontext,     const char* id,     std::vector<1local>* parameters,     NativeModuleLoader::Result* result) {   Isolate* isolate = context->GetIsolate();   EscapableHandleScope scope(isolate);   Localsource;   // 根据 key 从 source_ 字段找到模块内容   if (!LoadBuiltinModuleSource(isolate, id).ToLocal(&source)) {     return {};   }   std::string filename_s = std::string("node:") + id;   Localfilename =       OneByteString(isolate, filename_s.c_str(), filename_s.size());   ScriptOrigin origin(isolate, filename, 0, 0, true);   ScriptCompiler::CachedData* cached_data = nullptr;   {     Mutex::ScopedLock lock(code_cache_mutex_);     // 判断是否有代码缓存     auto cache_it = code_cache_.find(id);     if (cache_it != code_cache_.end()) {       cached_data = cache_it->second.release();       code_cache_.erase(cache_it);     }   }   const bool has_cache = cached_data != nullptr;   ScriptCompiler::CompileOptions options =       has_cache ? ScriptCompiler::kConsumeCodeCache                 : ScriptCompiler::kEagerCompile;   // 如果有代码缓存则传入                ScriptCompiler::Source script_source(source, origin, cached_data);   // 进行编译   MaybeLocalmaybe_fun =       ScriptCompiler::CompileFunctionInContext(context,                                                &script_source,                                                parameters->size(),                                                parameters->data(),                                                0,                                                nullptr,                                                options);   Localfun;   if (!maybe_fun.ToLocal(&fun)) {     return MaybeLocal();   }   *result = (has_cache && !script_source.GetCachedData()->rejected)                 ? Result::kWithCache                 : Result::kWithoutCache;   // 生成代码缓存保存下来,最后写入文件,下次使用   std::unique_ptrnew_cached_data(       ScriptCompiler::CreateCodeCacheForFunction(fun));   {     Mutex::ScopedLock lock(code_cache_mutex_);     code_cache_.emplace(id, std::move(new_cached_data));   }   return scope.Escape(fun); }第一次执行的时候,也就是编译 Node.js 时,LookupAndCompile 会生成代码缓存写到文件 node_code_cache.cc 中,并编译进可执行文件,内容大致如下。除了这个函数还有一系列的代码缓存数据,这里就不贴出来了。在 Node.js 第一次执行的初始化阶段,就会执行上面的函数,在 code_cache 字段里保存了每个模块和对应的代码缓存。初始化完毕后,后面加载原生 JS 模块时,Node.js 再次执行 LookupAndCompile,就个时候就有代码缓存了。当开启代码缓存时,我的电脑上 Node.js 启动时间大概为 40 毫秒,当去掉代码缓存的逻辑重新编译后,Node.js 的启动时间大概是 60 毫秒,速度有了很大的提升。总结:Node.js 在编译时首先把原生 JS 模块的代码写入到文件并,接着执行 mkcodecache.cc 把原生 JS 模块进行编译和获取对应的代码缓存,然后写到文件中,同时编译进 Node.js 的可执行文件中,在 Node.js 初始化时会把他们收集起来,这样后续加载原生 JS 模块时就可以使用这些代码缓存加速代码的执行。
0 0 668天前
admin
949
在今天的文章中,我将与你分享20有用的 TypeScript 单行代码,这些单行代码可以快速的帮助我们提升开发效率,希望对你有用。那我们现在开始吧。01、等待特定的时间量(以毫秒为单位)const wait = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));await wait(1000); // waiting 1 second02、检查日期是否为工作日const isWeekday = (d: Date): boolean => d.getDay() % 6 !== ;isWeekday(new Date(2022, 2, 21)); // -> trueisWeekday(new Date(2021, 2, 20)); // -> false03、反转字符串const reverse = (s: string): string => s.split('').reverse().join('');reverse('elon musk'); // -> 'ksum nole'04、检查一个数字是否为偶数。const isEven = (n: number): boolean => n % 2 === ;isEven(2); // -> trueisEven(3); // -> false05、大写字符串const capitalize = (s: string): string => s.charAt().toUpperCase() + s.slice(1);capitalize('lorem ipsum'); // -> Lorem ipsum06、检查数组是否为空const isArrayEmpty = (arr: unknown[]): boolean => Array.isArray(arr) && !arr.length;isArrayEmpty([]); // -> trueisArrayEmpty([1, 2, 3]); // -> false07、检查对象/数组是否为空const isObjectEmpty = (obj: unknown): boolean => obj && Object.keys(obj).length === ;isObjectEmpty({}); // -> trueisObjectEmpty({ foo: 'bar' }); // -> false08、随机生成整数基于两个参数生成一个随机整数。const randomInteger = (min: number, max: number): number => Math.floor(Math.random() * (max - min + 1)) + min;randomInteger(1, 10); // -> 709、生成随机布尔值const randomBoolean = (): boolean => Math.random() >= 0.5;randomBoolean(); // -> true10、切换布尔值切换布尔值,变假为真,变真为假。const toggleBoolean = (val: boolean): boolean => (val = !val);toggleBoolean(true); // -> false11、转换将字符串转换为带“-”的连字字符串。const slugify = (str: string): string => str.toLowerCase().replace(/\s+/g, '-').replace(/[^\w-]+/g, '');slugify('Hello World'); // -> hello-world12、生成随数组组合随机生成一组任何类型的数组。const shuffleArray = <T>(arr: T[]): T[] => arr.sort(() => Math.random() - 0.5);shuffleArray(<number[]>[1, 2, 3, 4, 5]); // -> [ 4, 5, 2, 1, 3 ]13、将连字字符串转换为骆峰字符串const snakeToCamel = (s: string): string => s.toLowerCase().replace(/(_\w)/g, (w) => w.toUpperCase().substring(1));snakeToCamel('foo_bar'); // -> fooBar14、随机整数根据当前时间生成一个随机整数。const randomInteger = (): number => new Date().getTime();randomInteger(); // -> 164661736734515、随机数字符串根据当前时间生成随机数字符串。const randomNumberString = (): string => new Date().getTime() + Math.random().toString(36).slice(2);randomNumberString(); // -> 1646617484381wml196a8iso16、将数字转换为字符/字母const numberToLetter = (value: number): string => String.fromCharCode(94 + value);numberToLetter(4); // -> b17、生成随机的十六进制颜色const randomHexColor = (): string => `#${Math.floor(Math.random() * 0xffffff).toString(16).padEnd(6, '0')}`;randomHexColor(); // -> #dc7c4018、删除字符串的尾部斜杠const removeTrailingSlash = (value: string): string => value && value.charAt(value.length - 1) === '/' ? value.slice(, -1) : value;removeTrailingSlash('foo-bar/'); // -> foo-bar19、获取数组的随机项const randomItem = <T>(arr: T[]): T => arr[(Math.random() * arr.length) | ];randomItem(<number[]>[1, 2, 3, 4, 5]); // -> 420、将大写字符串转换为小写const decapitalize = (str: string): string => `${str.charAt(0).toLowerCase()}${str.slice(1)}`;decapitalize('Hello world'); // -> hello world写在最后以上就是我今天与你分享的全部内容,如果你觉得有用的话,请点赞我,关注我,并将它分享分享给你身边做开发的朋友,也许能够帮助到他。最后,感谢你的阅读,祝编程愉快!
0 0 669天前
admin
1235
今天和大家一起学习一个 el-table 分页全选的功能我们在用 el-table 组件的时候,肯定会用到分页功能,不管是长列表下拉分页还是用 element-UI 的 el-pagination 分页。但是我们在具有选择功能的 el-table 的时候,会遇到一个问题,在点击进行分页之后,之前选择的数据没了,这个问题真的是困扰我良久。在后面的我又开始面向百度开发,找到一个没有 bug 的方法这个方法是:在 el-table 中,通过 @selection-change=“handleRowSelection” 和 :row-key=“getRowKeys”,在第一行,也就是多选框的那一列上,加上 :reserve-selection="true", 直接上代码,仅供大家参考。<template>   <div>     <el-table       ref="table"       :data="tableData"       size="small"       height="100%" row-key=“id”       @selection-change="handleSelectChange"       @select="handleSelect"     >       <el-table-column width="50" type="selection" />       <el-table-column type="index" label="序号" width="50">         <template scope="scope">           <span>{{             (pageInfo.pageNo - 1) * pageInfo.pageSize + scope.$index + 1           }}</span>         </template>       </el-table-column>       <el-table-column label="名称1" />       <el-table-column label="名称2" />       <el-table-column label="名称3" />       <el-table-column label="名称4" />       <el-table-column label="名称5" />     </el-table>   </div> </template> <script> export default {   data() {     return {       tableData: [],       selectedObj: {},       selectedData: []     }   },   methods: {     getList() {       // 查数据的地方,处理分页选中状态       this.handleRowSelection(this.tableData)     },     handleSelectChange(selection) {       // 全选取消,删除当前页所有数据       if (selection.length === 0) {         this.tableData.forEach(item => {           delete this.selectedObj[item.id]         })       }       // 勾选数据 添加       selection.forEach(item => {         this.selectedObj[item.id] = item       })       // 获取所有分页勾选的数据       this.selectedData = []       for (const key in this.selectedObj) {         this.selectedData.push(this.selectedObj[key])       }     },     handleSelect(selection, row) {       // 取消单个勾选时,删除对应属性       if (!selection.some(item => item.id === row.id)) {         delete this.selectedObj[row.id]       }     },     // 处理当前列表选中状态    handleRowSelection(data) {       data.forEach(item => {         if (this.selectedObj[item.id]) {           this.$nextTick(() => {             this.$refs.table.toggleRowSelection(item)           })         }       })     }   } }</script>源码附件已经打包好上传到百度云了,大家自行下载即可~链接: https://pan.baidu.com/s/14G-bpVthImHD4eosZUNSFA?pwd=yu27 提取码: yu27百度云链接不稳定,随时可能会失效,大家抓紧保存哈。如果百度云链接失效了的话,请留言告诉我,我看到后会及时更新~开源地址码云地址:http://github.crmeb.net/u/defuGithub 地址:http://github.crmeb.net/u/defu
0 0 670天前
快速发帖 高级模式
联系站长 友链申请桂ICP备19000949号-1     桂ICP备19000949号-1
您的IP:3.143.218.146,2024-04-20 22:16:55,Processed in 0.18958 second(s).
免责声明: 本网不承担任何由内容提供商提供的信息所引起的争议和法律责任。
Powered by HadSky 7.12.9
免责声明
1、本站资源,均来自网络,版权归原作者,所有资源和文章仅限用于学习和研究目的 。
2、不得用于商业或非法用途,否则,一切责任由该用户承担 !
如果觉得本文还不错请点个赞或者打赏点轻币哦~
拒绝伸手党,拿走请回复,尊重楼主,尊重你我他~

侵权删除请致信 E-Mail:207882320@qq.com