HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

Native.js 实现 unaipp 离线推送

消息推送
<template>  
    <view class="content">  
    <view class="text-area">  
      <button type="primary" size="mini" @tap="pushMsg()">推送</button>  
    </view>  
    </view>  
</template>  

<script>  
    export default {  
        data() {  
            return {  

            }  
        },  
        onLoad() {  
      // #ifdef APP-PLUS  
      // 获取客户端标识信息  
      // var info = plus.push.getClientInfo();  
      // console.log( JSON.stringify( info ) );  

      // 添加监听从系统消息中心点击某条消息启动应用事件  
      plus.push.addEventListener('click', function(msg){  
            // 分析msg.payload处理业务逻辑   
            console.log( '点击通知栏: ',msg.payload, msg.content, msg.payload.url )  

          setTimeout(() => {  
            uni.navigateTo({  
              url: msg.payload.url  
            });  
          }, 1000);  

      }, false );  

      // #endif  
        },  
        methods: {  
      pushMsg(){  
        plus.nativeUI.toast('推送消息测试')  
        // createMessage  
        var options = {  
          cover:false,  
          // icon: '',  
          // title: '1111',  
          // subtitle: '1111',  
        };  
        plus.push.createMessage('你收到一条新消息', {  
          type: 'LocalMSG',  
          url: '../test/test'  
        }, options);  

        //设置角标  
        plus.runtime.setBadgeNumber(0);  
      }  

        }  
    }  
</script>  

<style>  
    .content {  
        display: flex;  
        flex-direction: column;  
        align-items: center;  
        justify-content: center;  
    }  

    .logo {  
        height: 200rpx;  
        width: 200rpx;  
        margin-top: 200rpx;  
        margin-left: auto;  
        margin-right: auto;  
        margin-bottom: 50rpx;  
    }  

    .text-area {  
        display: flex;  
        justify-content: center;  
    }  

    .title {  
        font-size: 36rpx;  
        color: #8f8f94;  
    }  
</style>  
继续阅读 »
<template>  
    <view class="content">  
    <view class="text-area">  
      <button type="primary" size="mini" @tap="pushMsg()">推送</button>  
    </view>  
    </view>  
</template>  

<script>  
    export default {  
        data() {  
            return {  

            }  
        },  
        onLoad() {  
      // #ifdef APP-PLUS  
      // 获取客户端标识信息  
      // var info = plus.push.getClientInfo();  
      // console.log( JSON.stringify( info ) );  

      // 添加监听从系统消息中心点击某条消息启动应用事件  
      plus.push.addEventListener('click', function(msg){  
            // 分析msg.payload处理业务逻辑   
            console.log( '点击通知栏: ',msg.payload, msg.content, msg.payload.url )  

          setTimeout(() => {  
            uni.navigateTo({  
              url: msg.payload.url  
            });  
          }, 1000);  

      }, false );  

      // #endif  
        },  
        methods: {  
      pushMsg(){  
        plus.nativeUI.toast('推送消息测试')  
        // createMessage  
        var options = {  
          cover:false,  
          // icon: '',  
          // title: '1111',  
          // subtitle: '1111',  
        };  
        plus.push.createMessage('你收到一条新消息', {  
          type: 'LocalMSG',  
          url: '../test/test'  
        }, options);  

        //设置角标  
        plus.runtime.setBadgeNumber(0);  
      }  

        }  
    }  
</script>  

<style>  
    .content {  
        display: flex;  
        flex-direction: column;  
        align-items: center;  
        justify-content: center;  
    }  

    .logo {  
        height: 200rpx;  
        width: 200rpx;  
        margin-top: 200rpx;  
        margin-left: auto;  
        margin-right: auto;  
        margin-bottom: 50rpx;  
    }  

    .text-area {  
        display: flex;  
        justify-content: center;  
    }  

    .title {  
        font-size: 36rpx;  
        color: #8f8f94;  
    }  
</style>  
收起阅读 »

Native.js 实现 unaipp 截图

截图
<template>  
    <view class="content">  
        <image class="logo" src="/static/logo.png"></image>  
    <image  :src="capture" ref="img"></image>  
        <view class="text-area">  
            <text class="title">{{title}}</text>  
        </view>  
    <button @tap="captureWebview"> 截图 </button>  
    </view>  
</template>  

<script>  
    export default {  
        data() {  
            return {  
                title: 'Hello word !',  
        capture: '',  
            }  
        },  
        onLoad() {  
      // #ifdef APP-PLUS  
      console.log('系统: ', plus.os.name)   
      // console.log('version:' + plus.runtime.versionCode);  

      // 监听设备网络状态变化事件  
      plus.globalEvent.addEventListener('netchange', function(){  
        console.log('网络')  
      });  

      // #endif  
        },  
        methods: {  
      // 截屏绘制  
      captureWebview() {  
        var _this = this  
        var ws=plus.webview.getTopWebview();  
        var bitmap = new plus.nativeObj.Bitmap('test');  
        // 将webview内容绘制到Bitmap对象中  
        ws.draw(bitmap,function(){  
             console.log('截屏绘制图片成功');  
          bitmap.save( "_doc/a.jpg",{},  
          function(e){  
            console.log('保存图片成功:'+JSON.stringify(e));  
            //保存到相册  
            plus.gallery.save(e.target,(e)=>{  
              plus.nativeUI.toast("保存成功")  
            })  
          },  
          function(e){  
            console.log('保存图片失败:'+JSON.stringify(e));  
          });  
           _this.capture = bitmap.toBase64Data()  

          // bitmap.save('_doc/b.png',   
          // {  "overwrite": false,  "format": "png",  "quality": 50  },   
          // function(e){  
          //   //保存到相册  
          //   plus.gallery.save(e.target,(e)=>{  
          //     plus.nativeUI.toast("保存成功")  
          //   })  
          // }, function(error){  
          //   plus.nativeUI.toast("保存失败")  
          //   console.log("code:" + error.code + ";msg:" + error.message)  
          // })  

          //保存到相册后,回收Bitmap图片内存    
          bitmap.recycle();    
        },function(e){  
            console.log('截屏绘制图片失败:'+JSON.stringify(e));  
        });  
      },  

        }  
    }  
</script>  

<style>  
    .content {  
        display: flex;  
        flex-direction: column;  
        align-items: center;  
        justify-content: center;  
    }  

    .logo {  
        height: 200rpx;  
        width: 200rpx;  
        margin-top: 200rpx;  
        margin-left: auto;  
        margin-right: auto;  
        margin-bottom: 50rpx;  
    }  

    .text-area {  
        display: flex;  
        justify-content: center;  
    }  

    .title {  
        font-size: 36rpx;  
        color: #8f8f94;  
    }  
</style>  
继续阅读 »
<template>  
    <view class="content">  
        <image class="logo" src="/static/logo.png"></image>  
    <image  :src="capture" ref="img"></image>  
        <view class="text-area">  
            <text class="title">{{title}}</text>  
        </view>  
    <button @tap="captureWebview"> 截图 </button>  
    </view>  
</template>  

<script>  
    export default {  
        data() {  
            return {  
                title: 'Hello word !',  
        capture: '',  
            }  
        },  
        onLoad() {  
      // #ifdef APP-PLUS  
      console.log('系统: ', plus.os.name)   
      // console.log('version:' + plus.runtime.versionCode);  

      // 监听设备网络状态变化事件  
      plus.globalEvent.addEventListener('netchange', function(){  
        console.log('网络')  
      });  

      // #endif  
        },  
        methods: {  
      // 截屏绘制  
      captureWebview() {  
        var _this = this  
        var ws=plus.webview.getTopWebview();  
        var bitmap = new plus.nativeObj.Bitmap('test');  
        // 将webview内容绘制到Bitmap对象中  
        ws.draw(bitmap,function(){  
             console.log('截屏绘制图片成功');  
          bitmap.save( "_doc/a.jpg",{},  
          function(e){  
            console.log('保存图片成功:'+JSON.stringify(e));  
            //保存到相册  
            plus.gallery.save(e.target,(e)=>{  
              plus.nativeUI.toast("保存成功")  
            })  
          },  
          function(e){  
            console.log('保存图片失败:'+JSON.stringify(e));  
          });  
           _this.capture = bitmap.toBase64Data()  

          // bitmap.save('_doc/b.png',   
          // {  "overwrite": false,  "format": "png",  "quality": 50  },   
          // function(e){  
          //   //保存到相册  
          //   plus.gallery.save(e.target,(e)=>{  
          //     plus.nativeUI.toast("保存成功")  
          //   })  
          // }, function(error){  
          //   plus.nativeUI.toast("保存失败")  
          //   console.log("code:" + error.code + ";msg:" + error.message)  
          // })  

          //保存到相册后,回收Bitmap图片内存    
          bitmap.recycle();    
        },function(e){  
            console.log('截屏绘制图片失败:'+JSON.stringify(e));  
        });  
      },  

        }  
    }  
</script>  

<style>  
    .content {  
        display: flex;  
        flex-direction: column;  
        align-items: center;  
        justify-content: center;  
    }  

    .logo {  
        height: 200rpx;  
        width: 200rpx;  
        margin-top: 200rpx;  
        margin-left: auto;  
        margin-right: auto;  
        margin-bottom: 50rpx;  
    }  

    .text-area {  
        display: flex;  
        justify-content: center;  
    }  

    .title {  
        font-size: 36rpx;  
        color: #8f8f94;  
    }  
</style>  
收起阅读 »

我写了一个基于Typescript跨多平台的nodejs框架

nodejs uniCloud

现在支持私有部署同时也支持serverless各个平台的nodejs框架多么?答案是否定的,在2022年越来越多的企业会选择serverless来部署自己的应用,因为它足够轻巧省去了运维的成本,编写一个API可能只需要几行代码,越来越多的平台也推出了自己的云数据库以及云消息队列,我们前端开发编写后端api不再是一个头疼的事情。所以serverless是未来,为此我写了一个框架,它会在web服务器中运行也可以在serverless环境运行,在serverless中我会优先支持unicloud,我将使用这款框架参加2022年的dcloud插件大赛。

简单聊聊这款框架,我为什么要创建一款nodejs框架?

为什么要造轮子

在sword团队中我们使用unicloud构建应用程序,采用了CQRS,我们所有的写操作都由unicloud的云函数完成,但是你会发现在unicloud社区优秀的框架有很多,它们提供了url处理以及逻辑的分发,还有一些特色的框架也提供了诸如上传,和unicloud的部分特性封装,在我看来,这样的框架没有真正解决开发者的问题,比如:

  • 我想现在不想用unicloud,我想用传统服务器运行函数
  • 我想和云平台解耦,我希望我的云函数的特性和功能实现和某一平台无关
  • 我想使用ts开发
  • 我想有IDE强力支持
  • 我想使用一些开箱即用的方案,比如说hook,又比如HMR
  • 我想使用ES开发nodejs程序,使用先进的技术对程序进行捆绑(treeshaking...)
  • 如果要满足上面的特性,那么只有midway.js了,midway.js很酷,但是它并没有unicloud的faas插件,而且我希望框架能够让sword团队更好的构建程序,所以我们造一个轮子,来解决这些事情。

简单说说这个框架的技术栈

这款框架是我目前最得意的作品, 但是时间太仓促, 它的功能实现肯定不是最好的, 所以我需要各位的支持测试, 而且我也希望能拿到今年的插件大赛的名次; 去年拿到了三等奖也是我写的一款小程序, 今年带来的这个作品含金量非常高哈哈哈.

整个框架都是ts, 我使用了monorepo架构基于pnpm, 所有的源代码你都可以在packages中找到, 框架核心就是runtime那个文件夹. 整个框架最主要的2个部分就是cli + runtime, cli主要做多端的编译功能, 没错cli不仅做了打包还做了编译, 而且打包也是分环境的, 开发环境我是用的是swc (rust) 进行打包, 生产程序是使用esbuild (go), 所以极速是这个框架的特点, 不仅如此, runtime部分我实现了一个简易的异步依赖调度器使之不同平台, 都可以动态加载依赖, 所以server平台和unicloud平台互相不牵扯.

接下来, 我大概梳理一下我这个框架的特性, 希望你可以喜欢

  • 完全拥抱TypeScript
  • 支持跨平台: Server/阿里云/腾讯云/Cloudflare/AWS/Unicloud
  • 基于文件系统的路由
  • 开箱即用的开发套件
  • TS运行时类型校验
  • 生成API文档,兼容markdown以及openapi3.0
  • 完全 Hook 的写法与设计

框架github地址: https://github.com/swordCodePractice/sword-framework
dcloud插件市场求支持求支持求支持: https://ext.dcloud.net.cn/plugin?id=8433
我们的中文文档: https://www.yuque.com/mlgrgm/lrf0ra
我们的官方网站: https://swordcodepractice.github.io/backend-framework-website/

继续阅读 »

现在支持私有部署同时也支持serverless各个平台的nodejs框架多么?答案是否定的,在2022年越来越多的企业会选择serverless来部署自己的应用,因为它足够轻巧省去了运维的成本,编写一个API可能只需要几行代码,越来越多的平台也推出了自己的云数据库以及云消息队列,我们前端开发编写后端api不再是一个头疼的事情。所以serverless是未来,为此我写了一个框架,它会在web服务器中运行也可以在serverless环境运行,在serverless中我会优先支持unicloud,我将使用这款框架参加2022年的dcloud插件大赛。

简单聊聊这款框架,我为什么要创建一款nodejs框架?

为什么要造轮子

在sword团队中我们使用unicloud构建应用程序,采用了CQRS,我们所有的写操作都由unicloud的云函数完成,但是你会发现在unicloud社区优秀的框架有很多,它们提供了url处理以及逻辑的分发,还有一些特色的框架也提供了诸如上传,和unicloud的部分特性封装,在我看来,这样的框架没有真正解决开发者的问题,比如:

  • 我想现在不想用unicloud,我想用传统服务器运行函数
  • 我想和云平台解耦,我希望我的云函数的特性和功能实现和某一平台无关
  • 我想使用ts开发
  • 我想有IDE强力支持
  • 我想使用一些开箱即用的方案,比如说hook,又比如HMR
  • 我想使用ES开发nodejs程序,使用先进的技术对程序进行捆绑(treeshaking...)
  • 如果要满足上面的特性,那么只有midway.js了,midway.js很酷,但是它并没有unicloud的faas插件,而且我希望框架能够让sword团队更好的构建程序,所以我们造一个轮子,来解决这些事情。

简单说说这个框架的技术栈

这款框架是我目前最得意的作品, 但是时间太仓促, 它的功能实现肯定不是最好的, 所以我需要各位的支持测试, 而且我也希望能拿到今年的插件大赛的名次; 去年拿到了三等奖也是我写的一款小程序, 今年带来的这个作品含金量非常高哈哈哈.

整个框架都是ts, 我使用了monorepo架构基于pnpm, 所有的源代码你都可以在packages中找到, 框架核心就是runtime那个文件夹. 整个框架最主要的2个部分就是cli + runtime, cli主要做多端的编译功能, 没错cli不仅做了打包还做了编译, 而且打包也是分环境的, 开发环境我是用的是swc (rust) 进行打包, 生产程序是使用esbuild (go), 所以极速是这个框架的特点, 不仅如此, runtime部分我实现了一个简易的异步依赖调度器使之不同平台, 都可以动态加载依赖, 所以server平台和unicloud平台互相不牵扯.

接下来, 我大概梳理一下我这个框架的特性, 希望你可以喜欢

  • 完全拥抱TypeScript
  • 支持跨平台: Server/阿里云/腾讯云/Cloudflare/AWS/Unicloud
  • 基于文件系统的路由
  • 开箱即用的开发套件
  • TS运行时类型校验
  • 生成API文档,兼容markdown以及openapi3.0
  • 完全 Hook 的写法与设计

框架github地址: https://github.com/swordCodePractice/sword-framework
dcloud插件市场求支持求支持求支持: https://ext.dcloud.net.cn/plugin?id=8433
我们的中文文档: https://www.yuque.com/mlgrgm/lrf0ra
我们的官方网站: https://swordcodepractice.github.io/backend-framework-website/

收起阅读 »

uni-app海外月活过亿,2022出海吧;uni-ad全面支持web和微信小程序;uni统计发布2.0版且全面开源

公告
继续阅读 »
收起阅读 »

国际化多语言插件i18n批量翻译助手

i18n

微信小程序。 i18n批量翻译助手

微信小程序。 i18n批量翻译助手

进销存管理系统源码带手机版

源码分享

  进销存管理系统代表企业资源规划,它是组织中用于集成信息流和简化业务流程的软件应用程序。进销存管理系统软件开发可以将应用程序组合到一个网络中,该网络可从任何具有适当安全凭证和权限的计算机访问。进销存管理系统允许公司自动化工作流程、监控库存水平和跟踪销售订单。
  
  进销存管理系统源码:c.csymzs.top

   

  1. 组建进销存管理系统项目团队
  
  首先要做的事情是:独自计划这将是非常痛苦的。创建一个高效且敬业的进销存管理系统实施团队将使您的工作变得更加轻松。
  
  首先,您需要以下“核心”成员。
  
  项目经理:领导。你可能。
  
  应用分析师:负责数据迁移和清洗
  
  应用开发者:负责系统定制
  
  QA 测试工程师:负责系统测试和性能工作
  
  这些将在很大程度上取决于您的主要利益相关者是谁 - 鉴于进销存管理系统的性质,这些将因公司而异,具体取决于您正在实施的功能。
  
  2.制定进销存管理系统实施变更管理计划
  
  这有两个方面,真的。
  
  首先,您需要分步规划您的进销存管理系统实施,并根据专业知识将这些委派给您的实施团队。
  
  我们在这里有一个深入的模板进销存管理系统实施时间表- 尽管您可以使用下面的清单来快速了解需要做什么。在开始实施之前,您应该制定以下计划:
  
  预测实施成本并制定预算
  
  创建进销存管理系统实施计划
  
  将数据迁移到新系统
  
  培训您的进销存管理系统用户群
  
  测试您的进销存管理系统并上线
  
  当天上线活动
  
  评估项目的成功
  
  其次,您需要计划在实施过程中保持公司正常运行的方法。变化总是会带来一定程度的破坏,但可以通过以下方式将其最小化:
  
  任何预期中断的清晰沟通
  
  留出足够的时间进行用户培训
  
  考虑到关键利益相关者的需求(您已经完成了一半,项目团队中包括了代表)。

   

  3. 预测您的进销存管理系统实施成本并起草预算
  
  您应该在实施预算中包括所有这些因素,以避免受到隐藏成本的影响:
  
  硬件/网络升级:如果您正在实施内部部署系统,这些将要高得多
  
  员工加班费:要记住的重要一点 - “我们没有为加班费做预算,抱歉”这句话不会让您的团队感到满意
  
  供应商培训、定制和咨询费用:如果您幸运的话,您的供应商可能已将这些包含在初始软件价格中,但这绝对不是给定的。经常检查
  
  数据备份和存储:这些通常与云进销存管理系统成本捆绑在一起——但同样——总是要检查。
  
  4. 开始迁移您的数据
  
  所以它开始了。
  
  你已经尽可能地计划好了。现在是时候开始着手将您的公司转移到新的进销存管理系统的实际过程了。
  
  数据迁移是第一步——如果你做对了,你将建立一个坚实的基础来继续你的实施工作。弄错了,事情可能会开始崩溃。
  
  您的应用程序分析师应该负责这项工作,因为这是他们的专长。准备好帮助他们:
  
  数据清洗和验证
  
  数据库设置
  
  将旧数据映射到新的数据库字段
  
  数据传输到新系统
  
  遗留数据的测试和验证
  
  新数据输入的测试和验证
  
  5. 开始培训您的进销存管理系统用户群
  
  用户采用是进销存管理系统实施项目成功的关键,而合适的用户培训计划对于实现这一目标至关重要。
  
  无论哪种培训方法最适合您的员工,所有成功培训计划的四个特点包括:
  
  基于角色的培训,以简化流程并让时间紧缺的员工随时待命。
  
  受训人员提供反馈的机会(以及实施团队采取行动的机会)
  
  与供应商支持团队建立清晰的沟通渠道
  
  为了获得最佳效果,为什么不尝试将训练计划的部分内容游戏化呢?调查显示,89% 的受访者表示,基于积分的系统会提高他们的参与度,而 62% 的人表示,排行榜和与同事竞争的机会会激励他们学习。使用它对您有利。
  
  为按时完成培训任务的每个人提供的小额津贴(免费食物,额外的午餐时间),以及为您的表现最好的人提供的较大的补助将使参与培训对忙碌的员工更具吸引力。
  
  6. 计划并启动您的进销存管理系统上线活动
  
  如果您认为结婚需要进行大量艰巨的提前计划,那么您会对进销存管理系统实施的“上线”阶段感到不快。
  
  计划的事情包括:
  
  系统测试(上线前和上线后)
  
  人员安排,包括所需的加班或临时人员
  
  确定项目评估的指标
  
  为系统停机制定沟通策略
  
  网络速度和可靠性检查
  
  数据备份流程
  
  7. 评估您的进销存管理系统实施项目的成功与否
  
  您可以结合使用以下指标:
  
  投资回报率。您在进销存管理系统上花费的资金是否有回报?
  
  减少人为错误:实施良好的进销存管理系统应减少由于流程自动化导致的数据错误。如果您的培训计划奏效,员工应该充分利用这些功能
  
  提高生产力水平:这是不言而喻的。进销存管理系统是否完全实现了它的目标?
  
  提高客户满意度:周转时间增加了吗?您是否更快地处理订单?

继续阅读 »

  进销存管理系统代表企业资源规划,它是组织中用于集成信息流和简化业务流程的软件应用程序。进销存管理系统软件开发可以将应用程序组合到一个网络中,该网络可从任何具有适当安全凭证和权限的计算机访问。进销存管理系统允许公司自动化工作流程、监控库存水平和跟踪销售订单。
  
  进销存管理系统源码:c.csymzs.top

   

  1. 组建进销存管理系统项目团队
  
  首先要做的事情是:独自计划这将是非常痛苦的。创建一个高效且敬业的进销存管理系统实施团队将使您的工作变得更加轻松。
  
  首先,您需要以下“核心”成员。
  
  项目经理:领导。你可能。
  
  应用分析师:负责数据迁移和清洗
  
  应用开发者:负责系统定制
  
  QA 测试工程师:负责系统测试和性能工作
  
  这些将在很大程度上取决于您的主要利益相关者是谁 - 鉴于进销存管理系统的性质,这些将因公司而异,具体取决于您正在实施的功能。
  
  2.制定进销存管理系统实施变更管理计划
  
  这有两个方面,真的。
  
  首先,您需要分步规划您的进销存管理系统实施,并根据专业知识将这些委派给您的实施团队。
  
  我们在这里有一个深入的模板进销存管理系统实施时间表- 尽管您可以使用下面的清单来快速了解需要做什么。在开始实施之前,您应该制定以下计划:
  
  预测实施成本并制定预算
  
  创建进销存管理系统实施计划
  
  将数据迁移到新系统
  
  培训您的进销存管理系统用户群
  
  测试您的进销存管理系统并上线
  
  当天上线活动
  
  评估项目的成功
  
  其次,您需要计划在实施过程中保持公司正常运行的方法。变化总是会带来一定程度的破坏,但可以通过以下方式将其最小化:
  
  任何预期中断的清晰沟通
  
  留出足够的时间进行用户培训
  
  考虑到关键利益相关者的需求(您已经完成了一半,项目团队中包括了代表)。

   

  3. 预测您的进销存管理系统实施成本并起草预算
  
  您应该在实施预算中包括所有这些因素,以避免受到隐藏成本的影响:
  
  硬件/网络升级:如果您正在实施内部部署系统,这些将要高得多
  
  员工加班费:要记住的重要一点 - “我们没有为加班费做预算,抱歉”这句话不会让您的团队感到满意
  
  供应商培训、定制和咨询费用:如果您幸运的话,您的供应商可能已将这些包含在初始软件价格中,但这绝对不是给定的。经常检查
  
  数据备份和存储:这些通常与云进销存管理系统成本捆绑在一起——但同样——总是要检查。
  
  4. 开始迁移您的数据
  
  所以它开始了。
  
  你已经尽可能地计划好了。现在是时候开始着手将您的公司转移到新的进销存管理系统的实际过程了。
  
  数据迁移是第一步——如果你做对了,你将建立一个坚实的基础来继续你的实施工作。弄错了,事情可能会开始崩溃。
  
  您的应用程序分析师应该负责这项工作,因为这是他们的专长。准备好帮助他们:
  
  数据清洗和验证
  
  数据库设置
  
  将旧数据映射到新的数据库字段
  
  数据传输到新系统
  
  遗留数据的测试和验证
  
  新数据输入的测试和验证
  
  5. 开始培训您的进销存管理系统用户群
  
  用户采用是进销存管理系统实施项目成功的关键,而合适的用户培训计划对于实现这一目标至关重要。
  
  无论哪种培训方法最适合您的员工,所有成功培训计划的四个特点包括:
  
  基于角色的培训,以简化流程并让时间紧缺的员工随时待命。
  
  受训人员提供反馈的机会(以及实施团队采取行动的机会)
  
  与供应商支持团队建立清晰的沟通渠道
  
  为了获得最佳效果,为什么不尝试将训练计划的部分内容游戏化呢?调查显示,89% 的受访者表示,基于积分的系统会提高他们的参与度,而 62% 的人表示,排行榜和与同事竞争的机会会激励他们学习。使用它对您有利。
  
  为按时完成培训任务的每个人提供的小额津贴(免费食物,额外的午餐时间),以及为您的表现最好的人提供的较大的补助将使参与培训对忙碌的员工更具吸引力。
  
  6. 计划并启动您的进销存管理系统上线活动
  
  如果您认为结婚需要进行大量艰巨的提前计划,那么您会对进销存管理系统实施的“上线”阶段感到不快。
  
  计划的事情包括:
  
  系统测试(上线前和上线后)
  
  人员安排,包括所需的加班或临时人员
  
  确定项目评估的指标
  
  为系统停机制定沟通策略
  
  网络速度和可靠性检查
  
  数据备份流程
  
  7. 评估您的进销存管理系统实施项目的成功与否
  
  您可以结合使用以下指标:
  
  投资回报率。您在进销存管理系统上花费的资金是否有回报?
  
  减少人为错误:实施良好的进销存管理系统应减少由于流程自动化导致的数据错误。如果您的培训计划奏效,员工应该充分利用这些功能
  
  提高生产力水平:这是不言而喻的。进销存管理系统是否完全实现了它的目标?
  
  提高客户满意度:周转时间增加了吗?您是否更快地处理订单?

收起阅读 »

信息展示类APP外包

外包

1、集成wallet connect;
2、登录页面:游客登录(后端自动注册账号返回)+wallet connect登录(签名验证);
3、个人信息+设置页面(打开自动MINT出现推荐设置/高级设置选项);
4、排行榜页面;
5、项目展示页;
6、推送消息列表页,显示所有通知消息(缓存本地);
7、项目列表页,支持地址精确搜索、名称模糊搜索,可点击加入订阅列表、从订阅列表移除
8、订阅列表页,可新增订阅项目、移除已订阅项目,支持搜索
9、卡密激活页
10、地址追踪页,地址列表:增加、删除、查看详情功能;
11、高级规则设置页(列表展示)增加、删除、禁用规则/启用规则功能
12、国际化
13、app端+微信h5
14、开发架构和思路清晰合理 便于后期升级维护
15、主要是数据的展示与增删改,没有太多的业务逻辑,对于熟手来说应该是有很多组件可以直接复用。
16、可以使用uniapp、react native之类的。
17、请确保时间充裕,不要耽误彼此时间。
18、长期合作优先。
19、5天内能完成的请联系我,所谓“难者不会、会者不难”,它给时间效率高的熟手带来的是更高的收益,不建议新手接,耽误更多时间,不划算。

我方提供API接口
q:284550983

继续阅读 »

1、集成wallet connect;
2、登录页面:游客登录(后端自动注册账号返回)+wallet connect登录(签名验证);
3、个人信息+设置页面(打开自动MINT出现推荐设置/高级设置选项);
4、排行榜页面;
5、项目展示页;
6、推送消息列表页,显示所有通知消息(缓存本地);
7、项目列表页,支持地址精确搜索、名称模糊搜索,可点击加入订阅列表、从订阅列表移除
8、订阅列表页,可新增订阅项目、移除已订阅项目,支持搜索
9、卡密激活页
10、地址追踪页,地址列表:增加、删除、查看详情功能;
11、高级规则设置页(列表展示)增加、删除、禁用规则/启用规则功能
12、国际化
13、app端+微信h5
14、开发架构和思路清晰合理 便于后期升级维护
15、主要是数据的展示与增删改,没有太多的业务逻辑,对于熟手来说应该是有很多组件可以直接复用。
16、可以使用uniapp、react native之类的。
17、请确保时间充裕,不要耽误彼此时间。
18、长期合作优先。
19、5天内能完成的请联系我,所谓“难者不会、会者不难”,它给时间效率高的熟手带来的是更高的收益,不建议新手接,耽误更多时间,不划算。

我方提供API接口
q:284550983

收起阅读 »

在线生成Universal Links

Universal Links是苹果在WWDC 2015上提出的iOS9的新特性之一,此特性类似于深层链接,并能够方便地通过打开一个Https链接来直接启动您的客户端应用(手机有安装App)。对比起以往所使用的URL Scheme,这种新特性在实现Web-app的无缝链接时能够提供极佳的用户体验。

这具体是一种怎样的情景呢?举个例子,你的用户在微信里面浏览一个你们公司的网页,而此时用户手机也同时安装有你们公司的App;而Universal Links能够使得用户在打开某个详情页时直接打开你的app并到达app中相应的内容页面,从而实施用户想要的操作(例如查看某条新闻,查看某个商品的明细等等)

> Universal Links 和 URL Scheme有什么区别?

是两种不同技术的实现,都是通过苹果系统实现。
唯一不同的是URL Scheme 配置是通过打包来配置的,而深链是通过安装时请求https地址或者一个文件(内部为json结构),然后注册号https 和 app的对应。相当于URLScheme,调起更准确,universal和App的bundle ID(唯一) 相关联,所以不会产生冲突。原来的scheme URL因为并不唯一,所以可能会错误调起。

一、开启关联域名(Associated Domains)服务,到[苹果开发者网站]为当前的App ID开启关联域名(Associated Domains)服务:

配置Appld
二、创建新的(或更新现有的)描述文件
创建新的(或更新现有的)描述文件,下载并导入到XCode中(通过xcode自动生成的描述文件,可跳过这一步):

配置id
三、在Universal Links 功能模块中通过手动填写或者自动上传ipa 生成Universal Links
点击此处配置
1.手动生成Universal Links
1.1选择手动配置
1.2填入包名
1.3填入Team Id
1.4点击生成Universal Links 文件

2.上传ipa生成Universal Links
2.1点击自动配置
2.2点击选择ipa包,上传包

点击生成即可!

以上步骤都会生成一个文件,当下载完毕文件后,请将文件重命名为:apple-app-site-association 不要带任何后戳,然后直接上传服务器即可!

注意点
Team ID 非 证书ID 获取链接教程:https://www.chuxueyun.com/new/content/id-237.html

Team ID
四、微信配置
进入微信开发者后台(https://open.weixin.qq.com/)进入需要配置的app详情页,将地址填入配置等待审核通过

继续阅读 »

Universal Links是苹果在WWDC 2015上提出的iOS9的新特性之一,此特性类似于深层链接,并能够方便地通过打开一个Https链接来直接启动您的客户端应用(手机有安装App)。对比起以往所使用的URL Scheme,这种新特性在实现Web-app的无缝链接时能够提供极佳的用户体验。

这具体是一种怎样的情景呢?举个例子,你的用户在微信里面浏览一个你们公司的网页,而此时用户手机也同时安装有你们公司的App;而Universal Links能够使得用户在打开某个详情页时直接打开你的app并到达app中相应的内容页面,从而实施用户想要的操作(例如查看某条新闻,查看某个商品的明细等等)

> Universal Links 和 URL Scheme有什么区别?

是两种不同技术的实现,都是通过苹果系统实现。
唯一不同的是URL Scheme 配置是通过打包来配置的,而深链是通过安装时请求https地址或者一个文件(内部为json结构),然后注册号https 和 app的对应。相当于URLScheme,调起更准确,universal和App的bundle ID(唯一) 相关联,所以不会产生冲突。原来的scheme URL因为并不唯一,所以可能会错误调起。

一、开启关联域名(Associated Domains)服务,到[苹果开发者网站]为当前的App ID开启关联域名(Associated Domains)服务:

配置Appld
二、创建新的(或更新现有的)描述文件
创建新的(或更新现有的)描述文件,下载并导入到XCode中(通过xcode自动生成的描述文件,可跳过这一步):

配置id
三、在Universal Links 功能模块中通过手动填写或者自动上传ipa 生成Universal Links
点击此处配置
1.手动生成Universal Links
1.1选择手动配置
1.2填入包名
1.3填入Team Id
1.4点击生成Universal Links 文件

2.上传ipa生成Universal Links
2.1点击自动配置
2.2点击选择ipa包,上传包

点击生成即可!

以上步骤都会生成一个文件,当下载完毕文件后,请将文件重命名为:apple-app-site-association 不要带任何后戳,然后直接上传服务器即可!

注意点
Team ID 非 证书ID 获取链接教程:https://www.chuxueyun.com/new/content/id-237.html

Team ID
四、微信配置
进入微信开发者后台(https://open.weixin.qq.com/)进入需要配置的app详情页,将地址填入配置等待审核通过

收起阅读 »

公告:uni-app非V3版本编译器APP云端打包将于2022年7月1日正式下线

uni_app

自2019年底 uni-app 发布v3版本编译器以来,已经经过两年半迭代升级,v3版本的编译器已经非常成熟,DCloud将于2022年7月1日正式下线非v3版本云端打包功能,请仍未升级的开发者尽快完成编译器升级。如有特殊需求,请邮件联系 bd@dcloud.io。

相关链接:

继续阅读 »

自2019年底 uni-app 发布v3版本编译器以来,已经经过两年半迭代升级,v3版本的编译器已经非常成熟,DCloud将于2022年7月1日正式下线非v3版本云端打包功能,请仍未升级的开发者尽快完成编译器升级。如有特殊需求,请邮件联系 bd@dcloud.io。

相关链接:

收起阅读 »

uniapp转快应用开放过程遇到的问题

uniapp框架允许里面除了小程序外还有两个选项-快应用联盟和华为快应用,千万不用以为快应用联盟那个可以取代华为那个,运行打包后生成的两个包quickapp-webview-huawei和quickapp-webview-union,它们分别需要分别使用Huawei QuickApp IDE(华为的开发工具)和 快应用开发工具来运行。

一开始还傻乎乎的以为快应用联盟是包括华为的是互相通用的两个开发选择,没想到是不通用的需要两个工具分别使用,使用快应用开发工具的确可以在右边的模拟器上面看到自己开发的页面,打开开发者选项后USB连接页可以正常连接,还会自动帮你安装预览工具到手机上面,就是最后调试手机哪里只显示一个根标签给你而已,页面全是一片空白,什么提示都没有。

在安装quickapp-webview-huawei后发现这个工具不能使用,工具选项昏暗,插入手机USB调试上面也是显示无设备,点击构建-快应用或者工具-生成签名这些功能都是无反应的,经过各种检测才发现好几台win7系统的电脑安装后都是无法使用,在win10上面安装就正常;

win7解决方法:下载一个12版本的node.exe替换下ide安装路径下的/resources/app/extensions/deveco-debug/ lib/ toolkit/nodeTool这个里面的node.exe,直接复制替换然后重新打开就好了,如果有问题就看下直接的node版本对不对,或者下载安装不启动直接替换再打开试试。



这个是Huawei QuickApp IDE默认安装的node版本,是14的,win7不能用

继续阅读 »

uniapp框架允许里面除了小程序外还有两个选项-快应用联盟和华为快应用,千万不用以为快应用联盟那个可以取代华为那个,运行打包后生成的两个包quickapp-webview-huawei和quickapp-webview-union,它们分别需要分别使用Huawei QuickApp IDE(华为的开发工具)和 快应用开发工具来运行。

一开始还傻乎乎的以为快应用联盟是包括华为的是互相通用的两个开发选择,没想到是不通用的需要两个工具分别使用,使用快应用开发工具的确可以在右边的模拟器上面看到自己开发的页面,打开开发者选项后USB连接页可以正常连接,还会自动帮你安装预览工具到手机上面,就是最后调试手机哪里只显示一个根标签给你而已,页面全是一片空白,什么提示都没有。

在安装quickapp-webview-huawei后发现这个工具不能使用,工具选项昏暗,插入手机USB调试上面也是显示无设备,点击构建-快应用或者工具-生成签名这些功能都是无反应的,经过各种检测才发现好几台win7系统的电脑安装后都是无法使用,在win10上面安装就正常;

win7解决方法:下载一个12版本的node.exe替换下ide安装路径下的/resources/app/extensions/deveco-debug/ lib/ toolkit/nodeTool这个里面的node.exe,直接复制替换然后重新打开就好了,如果有问题就看下直接的node版本对不对,或者下载安装不启动直接替换再打开试试。



这个是Huawei QuickApp IDE默认安装的node版本,是14的,win7不能用

收起阅读 »

官方文档这个地方是不是错的?我不会,请指点一下

bug反馈 bug待确认 问题已解决

https://uniapp.dcloud.io/uniCloud/cf-database-aggregate-operator.html#%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81-33

求 min 小于 40 且 max 大于 60 的记录。

const $ = db.command.aggregate
let res = await db.collection('price').aggregate()
.project({
fullfilled: $.or([$.lt(['$min', 30]), $.gt(['$max', 60])])
})
.end()

$.lt(['$min', 30])这个应该是40还是30啊

继续阅读 »

https://uniapp.dcloud.io/uniCloud/cf-database-aggregate-operator.html#%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81-33

求 min 小于 40 且 max 大于 60 的记录。

const $ = db.command.aggregate
let res = await db.collection('price').aggregate()
.project({
fullfilled: $.or([$.lt(['$min', 30]), $.gt(['$max', 60])])
})
.end()

$.lt(['$min', 30])这个应该是40还是30啊

收起阅读 »

针对m1 mac 用户优化hbuilder的方法,替换不协调的图标以及更换arm版本node的全过程

HBuilder X Mac

新工作单位需要维护uniapp的遗留项目,不得不下载Hbuilder X,这篇文章专注解决和本人一样强迫症的用户,
图片不知道怎么插入,附件里有前后的对比图,一定要记得备份,防止操作失败或者不适用自己项目可以回滚过来

备份Hbuilder X,防止操作失败影响搬砖

  • 进入应用程序目录对Hbuilder X 压缩,如操作过程中出现问题,可以删除APP并直接解压

替换图标

  • 打开网站 https://macosicons.com/how-to#/,搜索HBuilder,找到喜欢的图标下载下来
  • 打开 应用程序目录,点击选中Hbuilder X, 然后按下 command + i 打开简介窗口
  • 拖动下载的图标到 简介窗口的图标位置,重启Hbuilder 新图标就换好了

修改Hbuilder 内置node 为 本机Arm版本

在终端执行 where node,会输出本地node 所在位置
例如:/Users/xx/.nvm/versions/node/v16.14.2/bin/node,
在终端执行 open /Users/xx/.nvm/versions/node/v16.14.2/bin打开node所在目录,
以及 open /Applications/HBuilderX.app/Contents/HBuilderX/plugins/node,打开Hbuilder内置node目录,
接下去复制本地的node到HBuilderX的node目录中,记住是复制!!不要直接拖动过去

这时候项目是运行不了的,因为Hbuilder内置了node-sass,并不匹配Arm版node,
终端会报错,如下内容,不要根据提示去操作,不会有效果的

[0;31m--> LibSass 的二进制文件(/Applications/HBuilderX.app/Contents/HBuilderX/plugins/compile-node-sass/node_modules/node-sass-china/vendor/darwin-arm64-93/binding.node)缺失,请执行下面3条命令下载对应版本的二进制文件:(有可能引发此错误的原因是 Node 版本变更)   
14:39:41.361   mkdir -p /Applications/HBuilderX.app/Contents/HBuilderX/plugins/compile-node-sass/node_modules/node-sass-china/vendor/darwin-arm64-93  
14:39:41.363   cd /Applications/HBuilderX.app/Contents/HBuilderX/plugins/compile-node-sass/node_modules/node-sass-china/vendor/darwin-arm64-93  
14:39:41.365   curl -o binding.node http://cdn.npm.taobao.org/dist/node-sass/v4.7.2/darwin-arm64-93_binding.node

替换node-sass 为 dart-sass

  • 首先 终端执行 cd /Applications/HBuilderX.app/Contents/HBuilderX/plugins,打开plugins目录
  • 执行rm -rf compile-node-sass 删除node-sass目录
  • 执行yarn add sass,
  • 重启编辑器

解决真机调试问题

一直没有看到用到这个功能,所以没发现,看到评论有问题,记录一下解决的过程,有其他问题可以也可以用这个方法

如发现某些功能异常,打开 hbuilder 帮助->查看运行日志,清空日志,重新操作未正常启动的功能。
查看日志,一般都是缺少一些模块的报错,如缺少在出错的插件目录下安装即可

  • 在 /Applications/HBuilderX.app/Contents/HBuilderX/plugins/launcher 目录下安装 执行 yarn add archiver
  • 清空plugins/launcher/tools/adbs 目录,下载arm版本adb拖动进去 或 使用brew安装adb,在hbuilder偏好设置- 运行配置- adb路径中修改 (但在活动监视器中adb进程还是会显示intel,不知为何)
  • 重启编辑器
继续阅读 »

新工作单位需要维护uniapp的遗留项目,不得不下载Hbuilder X,这篇文章专注解决和本人一样强迫症的用户,
图片不知道怎么插入,附件里有前后的对比图,一定要记得备份,防止操作失败或者不适用自己项目可以回滚过来

备份Hbuilder X,防止操作失败影响搬砖

  • 进入应用程序目录对Hbuilder X 压缩,如操作过程中出现问题,可以删除APP并直接解压

替换图标

  • 打开网站 https://macosicons.com/how-to#/,搜索HBuilder,找到喜欢的图标下载下来
  • 打开 应用程序目录,点击选中Hbuilder X, 然后按下 command + i 打开简介窗口
  • 拖动下载的图标到 简介窗口的图标位置,重启Hbuilder 新图标就换好了

修改Hbuilder 内置node 为 本机Arm版本

在终端执行 where node,会输出本地node 所在位置
例如:/Users/xx/.nvm/versions/node/v16.14.2/bin/node,
在终端执行 open /Users/xx/.nvm/versions/node/v16.14.2/bin打开node所在目录,
以及 open /Applications/HBuilderX.app/Contents/HBuilderX/plugins/node,打开Hbuilder内置node目录,
接下去复制本地的node到HBuilderX的node目录中,记住是复制!!不要直接拖动过去

这时候项目是运行不了的,因为Hbuilder内置了node-sass,并不匹配Arm版node,
终端会报错,如下内容,不要根据提示去操作,不会有效果的

[0;31m--> LibSass 的二进制文件(/Applications/HBuilderX.app/Contents/HBuilderX/plugins/compile-node-sass/node_modules/node-sass-china/vendor/darwin-arm64-93/binding.node)缺失,请执行下面3条命令下载对应版本的二进制文件:(有可能引发此错误的原因是 Node 版本变更)   
14:39:41.361   mkdir -p /Applications/HBuilderX.app/Contents/HBuilderX/plugins/compile-node-sass/node_modules/node-sass-china/vendor/darwin-arm64-93  
14:39:41.363   cd /Applications/HBuilderX.app/Contents/HBuilderX/plugins/compile-node-sass/node_modules/node-sass-china/vendor/darwin-arm64-93  
14:39:41.365   curl -o binding.node http://cdn.npm.taobao.org/dist/node-sass/v4.7.2/darwin-arm64-93_binding.node

替换node-sass 为 dart-sass

  • 首先 终端执行 cd /Applications/HBuilderX.app/Contents/HBuilderX/plugins,打开plugins目录
  • 执行rm -rf compile-node-sass 删除node-sass目录
  • 执行yarn add sass,
  • 重启编辑器

解决真机调试问题

一直没有看到用到这个功能,所以没发现,看到评论有问题,记录一下解决的过程,有其他问题可以也可以用这个方法

如发现某些功能异常,打开 hbuilder 帮助->查看运行日志,清空日志,重新操作未正常启动的功能。
查看日志,一般都是缺少一些模块的报错,如缺少在出错的插件目录下安装即可

  • 在 /Applications/HBuilderX.app/Contents/HBuilderX/plugins/launcher 目录下安装 执行 yarn add archiver
  • 清空plugins/launcher/tools/adbs 目录,下载arm版本adb拖动进去 或 使用brew安装adb,在hbuilder偏好设置- 运行配置- adb路径中修改 (但在活动监视器中adb进程还是会显示intel,不知为何)
  • 重启编辑器
收起阅读 »