精华内容
下载资源
问答
  • 小程序分享功能开发

    万次阅读 2018-03-17 14:58:18
    小程序分享功能开发 接触小程序不久,在第一次开发分享功能的过程中遇到了些许波折,此文介绍在小程序中,如何应对不同业务场景下的分享功能开发需求。 功能介绍 小程序转发分享功能,跟开发相关的内容并不多,...

    小程序分享功能开发

    接触小程序不久,在第一次开发分享功能的过程中遇到了些许波折,此文介绍在小程序中,如何应对不同业务场景下的分享功能开发需求。

    功能介绍

    小程序转发分享功能,跟开发相关的内容并不多,主要通过onShareAppMessage定制页面分享内容,但有两个重要约束:

    • 无法从代码内触发转发,只能通过open-type="share"的按钮在页面内触发
    • 转发内容(title、url、imageUrl)需要同步返回

    这两个约束,对实际业务的开发带来了不小的影响,如果需要用户在一个操作内保存数据并分享,因为上述两个限制,该功能就能很难实现,因为保存,涉及网络请求,必然是异步的。

    异步指定分享内容的解决方案

    这里提供两种解决方案,都是曲线救国,多少有些瑕疵。

    方案一

    将用户行为拆分为两个步骤,先保存数据,成功后再由用户主动分享给他人。这种方案在技术上相比第二种更为安全,但在某些业务场景下,用户体验并不完美,比如“给好友发送xxx”这种场景模式。

    方案二

    在用户分享成功后再保存数据,采用这个方案需要结合具体业务思考,标准是:“数据如果没有保存成功,会造成多大的影响与后果?是不是可接受的?”。

    常规POST/CREATE操作,一般数据ID都是后端负责生成,操作成功后接口返回ID,但为了面对目前这种情况,在接口设计上需要做出部分调整:

    • 尽最大可能降低接口的失败可能性
    • 保存数据时支持指定ID
    • 为避免ID冲突,后端提供ID预生成接口

    其他的就不过多废话了,一切尽在代码中:

    Page({
        data: {
            id: null
        },
    
        onLoad: function () {
            return this.fetchId();
        },
    
        onShow: function () {
            if (!this.loading && !this.data.id) {
                return this.fetchId();
            }
        },
    
        onShareAppMessage: function () {
            if (!this.data.id) {
                // todo 返回默认分享信息,比如小程序首页
            }
    
            return {
                title: 'xxx',
                path: 'xxx?id=' + this.data.id,
                success: function (res) {
                    if (this.data.savedId === this.data.id) {
                        return;
                    }
    
                    this.saveData().then(() => {
                        this.setData({
                            savedId: this.data.id
                        });
                        // todo 如果跳转到其他页面,删除this.data.id
                    });
                }
            };
        },
    
        fetchId: function () {
            // fetch id and set to data
        },
    
        saveData: function () {
            // save data to server
        }
    });

    canvas绘制分享图片

    针对上一部分,如果分享内容是异步生成的,往往分享图片也是动态的(非固定的本地资源或者网络资源)。

    针对动态分享图片,通常有两种解决方案:

    • 服务器动态生成所需图片

    依赖服务器的图片处理功能,灵活合成所需图片,缺点很明显,图片处理会消耗过多的服务器资源,影响服务器整体吞吐量

    • 客户端使用canvas绘制动态图片

    在客户端本地使用canvas绘制内容,最后通过wx.canvasToTempFilePath保存图片临时路径用于分享,这种方式的缺点:兼容性不够好,可能遇到各种BUG

    在第一次开发过程中,选择了canvas绘制分享图片,主要步骤如下:

    • 在wxml文件中声明canvas区块

    此处有一个主意事项:canvas区块应该不影响布局且不可见,但经过实践发现不能使用display: none;opacity: 0;这种方式。最终摸索出一种可行方式:使用view容器包裹canvas,然后设置view的style为height: 0; overflow: hidden;

    • 在js中通过wx.createCanvasContext获取绘图上下文

    • 通过上下文使用canvas相关api绘图

    • 使用wx.canvasToTempFilePath获取图片路径

    这种方式的优点是不依赖服务器,节省了服务器性能开销,但是也有一个致命缺点:图片生成是异步的,与onShareAppMessage需要同步返回数据有冲突。

    为解决该问题,采取的方案是在影响分享图片因素变化时,立即重新生成,且需要考虑失败时的替代图片。这种做法,因为频繁的使用canvas绘制与保存图片,可能会影响小程序的运行流畅度。

    最后贴上针对输入框内容动态生成分享图片的核心代码:

    App({
        drawLock: false,        // 避免同时对一个canvas进行操作
        shareImageCache: {},    // 尽可能优化
    
        drawShareImage: function (canvasId, ctx, text) {
            if (this.drawLock) {
                return;
            }
            this.drawLock = true;
    
            let that = this;
            let cacheKey = util.hash(text);
            if (this.shareImageCache[cacheKey]) {
                return Promise.resolve(this.shareImageCache[cacheKey]);
            }
    
            ctx.clearRect(0, 0, 500, 400);
    
            return new Promise(resolve, reject => {
                ctx.setFillStyle('#333333');
                ctx.setFontSize(40);
                ctx.fillText(text, 20, 60);
    
                ctx.draw(true, () => {
                    promisify(wx.canvasToTempFilePath)({
                        canvasId: canvasId
                    }).then(res => {
                        this.drawLock = false;
    
                        that.shareImageCache[cacheKey] = res.tempFilePath;
                        resolve(res.tempFilePath);
                    }).catch(err => {
                        this.drawLock = false;
    
                        reject(err);
                    });
                });
            });
        }
    });
    
    Page({
        data: {
            canvasId: 'share-canvas',
        },
        shareImagePath: null,
    
        onLoad: function () {
            this.ctx = wx.createCanvasContext(this.data.canvasId);
    
            this.drawShare();
        },
    
        onInput: function () {
            if (this.preInputTimer) {
                clearTimeout(this.preInputTimer);
            }
            this.preInputTimer = setTimeout(() => {
                this.drawShare();
            }, 1000);       // 这个数字最好是比一般人连续输入时间间隔大一丢丢
        },
    
        drawShare: function () {
            return app.drawShareImage(this.data.canvasId, this.ctx, e.detail.value).then(path => {
                this.shareImagePath = path;
            }).catch(err => {
                logger.error(err);
            });
        }
    });

    以上代码是从自己小程序代码中提炼的部分内容,把绘制行为放在app中,是为了与其他页面共享。

    上述是一个极端例子,因为用户的输入实时反馈到分享图片上,如果在产品层面考虑变通,可能会有更好的思路与解决方案。

    博客原文

    展开全文
  • 微信小程序开发(四)入门之打卡功能开发

    万次阅读 多人点赞 2018-05-20 23:29:50
    相关文章微信小程序开发(一)微信开发者工具以及小程序框架介绍微信小程序开发(二)开发之日历打卡小程序发现页微信小程序开发(三)入门之创建打卡活动前言本篇文章将介绍打卡小程序打卡页面相关功能开发,涉及...

    相关文章

    微信小程序开发(一)微信开发者工具以及小程序框架介绍

    微信小程序开发(二)开发之日历打卡小程序发现页

    微信小程序开发(三)入门之创建打卡活动


    前言

    本篇文章将介绍打卡小程序打卡页面相关功能的开发,涉及到的知识点有小程序分享功能动画实现setData修改数组值等问题。


    需求

    打卡页面部门功能需求图。

          

    1. 小程序分享功能

    小程序中分享的入口有两处,第一处是menu:右上角转发菜单( 右上角...),第二处是页面内通过 <button>转发。下面看下打卡页面右上角分享功能的实现。

     <view class='share-layout'>
        <image class='detail-cover' src='{{dakaPic}}' mode='aspectFill'></image>
        <view>
          <image class='share-icon' bindtap='shareSign' src='../../imgs/share_icon.png'></image>
          <button class='share-button' open-type='share' plain='true'></button>
        </view>
      </view>
    
    
    .share-layout {
      position: relative;
      width: 100%;
    }
    
    .detail-cover {
      width: 100%;
      height: 312rpx;
    }
    
    .share-icon{
      position: absolute;
      right: 30rpx;
      top: 30rpx;
      width: 70rpx;
      height: 70rpx;
    }
    
    .share-button {
      z-index: 100;
      border: 0;
      opacity: 0;
      position: absolute;
      right: 30rpx;
      top: 30rpx;
      width: 70rpx;
      height: 70rpx;
    }
    
    
    实现方式很简单,上面说到小程序在页面内分享只能通过 <button>标签通过添加open-type='share'来实现,将 <button>层叠在图片上,设置opcity为0即可。当用户做分享操作会触发下面的方法,用户进入时onLoad()的options参数会携带分享的参数。

     /**
       * 用户点击右分享操作
       */
      onShareAppMessage: function () {
        var that = this;
        return {        
       // 分享标题   
       title: this.data.dakaName,                 
       //分享路径,用户点击微信中分享卡片进入小程序的页面,以及携带的参数
       path: 'pages/signdetail/notjoin?userId' + wx.getStorageSync('userId') 
                                               + "&activityId=" + this.data.activityId,                       
       success: function (res) {
          that.shareCallback();                //此处为了记录分享次数
        },
    fail: function (res) { } } },

    2. 打卡动画实现

    效果如下,GIF图有点卡顿。


        
    <image class=='sign-icon' animation='{{animationData}}' bindtap='signClick' src='../../imgs/sign_button.png'></image>
    
    
    首先,要在我们实现动画的组件上添加' animation'属性,下面看下animationData是如何创建的。

    signClick: function () {
        var that = this
        //第1步:创建动画实例
        var animation = wx.createAnimation({
          duration: 1000,                     //动画时长   
          timingFunction: "ease",             //线性 
          delay: 0                           //0则不延迟 
        })
        //第2步:将创建的动画实例赋值给当前的动画
        this.animation = animation;
        //第3步:执行动画,Z轴旋转360度
        animation.opacity(1).rotateZ(360).step();
        //第4步:导出动画对象赋值给数据对象
        this.setData({
          animationData: animation.export(),
        })
        //设置指定时间后进行页面跳转
        setTimeout(function () {
          wx.navigateTo({
            url: '../sign/sign?isMessage=' + this.data.isMessage
            + "&actId=" + this.data.activityId
            + "&nickName=" + this.data.nickName,
          })
        }.bind(this), 800)
      },
    
    
    这里在开发时遇到一个问题,跳转到下一个页面没有做任何操作,返回当前页面,当点击打卡操作,此时旋转动画将不会再执行。按照正常逻辑来说,我每次点击打卡按钮相当于重新创建动画实例执行操作,然而效果看起来并不是。这个动画实例除非页面销毁才会重置,否则一直是动画执行结束后的状态。这里我在页面隐藏的时候将动画重置为初始状态。

     /**
     * 生命周期函数--监听页面隐藏
     */
      onHide: function () {
        var animation = wx.createAnimation({
          duration: 10,
          timingFunction: "ease", //线性 
          delay: 0, //0则不延迟 
        })
        this.animation = animation;
        //重置动画为原始状态,将原始状态赋值给数据对象进行保存
        animation.opacity(1).rotateZ(0).step();
        this.setData({
          animationData: animation.export(),
        })
      },
    

    3. 数组修改值

    以一个示例介绍小程序中用setData方式修改数组的值。修改第0个元素为100。操作如下

    Page({
      data: {
        tempArray: [1,2,3,4]
      },
      //事件处理函数
      ...
      changeArray: function(){
        var newArray= "tempArray[0]";
        this.setData({    
              newArray :100
            });
        }
    })
    
    

    4. 模态弹窗实现

    微信小程序中目前没有提供较好的模态弹窗,很多也不适合项目的需求。如上图中,打卡规则的弹窗需要自己定义。

    <view class="root-layout">
      <!-- 遮罩层,全屏显示,层级 z-index=1000  -->
      <view class="shade-mask" bindtap="shadeMaskHandler" data-status="close" wx:if="{{showModalStatus}}"/>
      <!-- 模态弹窗,显示打卡规则 层级 z-index = 10001 -->
      <view animation="{{animationData}}" class="model-box" wx:if="{{showModalStatus}}">
        <text class="rule-title">打卡规则</text>
        <view class="rule-content-layout">
          <block wx:for="{{dakaRules}}" wx:for-item="ruleItem">
            <view class="rule_content">
              <view class="dot"></view>
              <text class="rule">{{ruleItem}}</text>
            </view>
          </block>
        </view>
        <!-- 确定按钮 -->
        <text class="btn-sure" bindtap="shadeMaskHandler" data-status="close">确定</text>
      </view>
    </view>
    
    
    部分样式代码如下。

    /* 遮罩层 */
    .shade-mask {
      width: 100%;
      height: 100%;
      position: fixed;
      top: 0;
      left: 0;
      z-index: 1000;
      background: #000;
      opacity: 0.5;
      overflow: hidden;
    }
    
    /* 模态弹窗 */
    .model-box {
      width: 600rpx;
      overflow: hidden;
      position: fixed;
      top: 50%;
      left: 25rpx;
      z-index: 1001;
      background: #fafafa;
      margin: -150px 50rpx 0 50rpx;
      border-radius: 6rpx;
    }
    
    /* 确定按钮 */
    .btn-sure {
      display: block;
      padding: 30rpx;
      font-size: 32rpx;
      text-align: center;
      border-top: 1rpx solid #e8e8ea;
      color: #7885e8;
    }
    
    

    结尾

    打卡小程序的主要开发点大概就是这么几篇,还有部分功能点日后总结后会在这几篇文章中重新记录。最近美团的mpvue框架也是比较火热。打算使用一把,到时候遇到的问题也会做个记录分享。


    展开全文
  • 2小时入门小程序登陆注册功能开发

    千人学习 2019-12-05 10:05:58
    实现登陆功能 5,从用户表里获取用户账号和密码,然后和用户输入的账号和密码做比对校验 6,登陆成功后跳转到首页 订阅消息(模板消息) 1,云开发入门 2,用户openid获取 3,订阅消息授权 4,模板消息推送
  • 支付宝退款功能开发

    万次阅读 2017-05-12 11:22:56
    (不是开发难,是别的问题) 首先,按照国际惯例,我先在支付宝的官网上查看开发文档 https://doc.open.alipay.com/docs/api.htm?spm=a219a.7629065.0.0.PbaltX&apiId=759&docType=4 这就是咱们要开发的必备...
    当接到这个任务的时候,我说实话没搞过,之前搞过支付的,感觉退款应该很容易吧,但实际上并没有我想象的那么容易。(不是开发难,是别的问题)
    首先,按照国际惯例,我先在支付宝的官网上查看开发文档
    这就是咱们要开发的 必备文档

    我是要用java开发

    当看到这个的时候,应该就差不多了,按照这个写,不过按照这个写的时候,需要用到支付宝的sdk,导入几个jar包,不然程序会报编译错误。
    需要的关键jar包:

    开始编写代码:
    /**
     * 支付宝退款工具类
     * @author WangXJ
     */
    public class Aliaction {
    	/**
    	 * @param out_trade_no 订单支付时传入的商户订单号,不能和 trade_no同时为空。
    	 * @param trade_no 支付宝交易号,和商户订单号不能同时为空
    	 * @param refund_amount 需要退款的金额,该金额不能大于订单金额,单位为元,支持两位小数
    	 * @return 将提示信息返回
    	 */
    	public  synchronized static  String alipayRefundRequest(String out_trade_no,String trade_no,double refund_amount){
            // 发送请求
    		String strResponse = null;
    		try {
    			AlipayClient alipayClient = new DefaultAlipayClient(AliRefundConfig.request_url,AliRefundConfig.app_id,AliRefundConfig.private_key,"json","GBK",AliRefundConfig.ali_public_key,"RSA");
    			AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
    			AlipayRefundInfo alidata= new AlipayRefundInfo();//这里我封装了一个类用来传递json数据
    			alidata.setOut_trade_no(out_trade_no);
    			alidata.setRefund_amount(refund_amount);
    			alidata.setTrade_no(trade_no);
    			request.setBizContent(JsonUtil.toJSONString(alidata));//将数据格式化成json格式
    			AlipayTradeRefundResponse response;
    			response = alipayClient.execute(request);
    			if ("10000".equals(response.getCode())) {
    				System.out.println("退款成功");//没有提示消息就是好消息strResponse=null
                }else {
                	strResponse=response.getSubMsg();//退款失败的提示信息
                }
    			
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return strResponse;
    	}
    

    本以为写到这里应该就没问题了,开始测试,测试的时候只需要请求一个action,然后action中调用此工具类里的这个方法就行了。(切记:一定要先下单。测试下一个0.01元的订单,然后得到该订单的out_trade_no和(trade_no,refund_amount:0.01 这几个测试的时候可以直接写死)

    这个是我的boss后台,我的程序是这样的,在这里点击确认退款后,就调用我上面写的方法
    结果后台还是出问题了(抛异常:sign无效, 也有的是app_id无效等等)
    看到这些问题的时候,不要慌,因为这个很可能不是你程序写的问题。(我之前支付用的是MD5加密的,而本次用的是RSA加密)

    这里的数据一定要是和公司支付宝账号的信息完全对应,想到这里果断联系上级领导,要到了公司支付宝的账号和密码
    登录成功后,我们找到了app_id

    在公司logo头像下找到“账号管理”

    点进去,看看是否设置了RSA秘钥,且要确保和你在程序中的配置的一模一样

    对应的私钥如果忘记的话,要重新生成公钥并上传,私钥一定要记住并放到你的程序中

    (生成RSA公钥和私钥工具)这个可以直接在支付宝开放平台上下载就好了

    用这个动动生成你需要的公钥和私钥,公钥要上传到上面说的那个支付宝的开放平台上。对于java开发人员的话,要特别注意

    生成的这个文件才是你要的私钥哦。(这里有个插曲,上传公钥的时候,需要老板将收到的短信验证码给到你……)
    私钥和公钥是一对,切记,你上传到支付宝开放平台上的那个公钥对应的私钥如果忘记了,那你就要用工具重新再生成一对公钥和私钥了,还要再问老板要验证码重新上传新的公钥……甚是麻烦
    OK,现在,就没问题了。
    测试效果如下

    展开全文
  • Spring Boot 介绍、前后端分离、API 规范等内容旨在让读者更加熟悉 SpringBoot 及企业开发中需要注意的事项并具有使用 SpringBoot 技术进行基本功能开发的能力;这最后的项目实战为课程的主要部分,我会带着大家实际...
  • python flask web开发入门与项目实战

    千人学习 2019-12-15 19:02:04
    如果采用成熟、稳健的框架,那么一些诸 如安全性、数据流控制等类型的基础性工作都可以让框架来处理,而程序开发人员则可以把更多的精力放在具体业务逻辑功能的实现和优化上。        使用Flask...
  • 前面给大家讲过一个借助小程序云开发实现微信支付的,但是那个操作稍微有点繁琐,并且还会经常出现问题,今天就给大家讲一个简单的,并且借助官方支付api实现小程序支付功能。 传送门 借助小程序云开发实现小程序...

    前面给大家讲过一个借助小程序云开发实现微信支付的,但是那个操作稍微有点繁琐,并且还会经常出现问题,今天就给大家讲一个简单的,并且借助官方支付api实现小程序支付功能。

    传送门
    借助小程序云开发实现小程序支付功能

    老规矩,先看本节效果图

    我们实现这个支付功能完全是借助小程序云开发实现的,不用搭建自己的服务器,不用买域名,不用备案域名,不用支持https。只需要一个简单的云函数,就可以轻松的实现微信小程序支付功能。
    核心代码就下面这些

    一,创建一个云开发小程序

    关于如何创建云开发小程序,这里我就不再做具体讲解。不知道怎么创建云开发小程序的同学,可以去翻看我之前的文章,或者看下我录制的视频:https://edu.csdn.net/course/play/9604/204528

    创建云开发小程序有几点注意的

    1,一定不要忘记在app.js里初始化云开发环境。

    2,创建完云函数后,一定要记得上传

    二, 创建支付的云函数

    1,创建云函数pay

    三,引入三方依赖tenpay

    我们这里引入三方依赖的目的,是创建我们支付时需要的一些参数。我们安装依赖是使用里npm 而npm必须安装node,关于如何安装node,我这里不做讲解,百度一下,网上一大堆。

    1,首先右键pay,然后选择在终端中打开

    2,我们使用npm来安装这个依赖。

    在命令行里执行 npm i tenpay



    安装完成后,我们的pay云函数会多出一个package.json 文件

    到这里我们的tenpay依赖就安装好了。

    四,编写云函数pay


    完整代码如下

    //云开发实现支付
    const cloud = require('wx-server-sdk')
    cloud.init()
    
    //1,引入支付的三方依赖
    const tenpay = require('tenpay');
    //2,配置支付信息
    const config = {
      appid: '你的小程序appid', 
      mchid: '你的微信商户号',
      partnerKey: '微信支付安全密钥', 
      notify_url: '支付回调网址,这里可以先随意填一个网址', 
      spbill_create_ip: '127.0.0.1' //这里填这个就可以
    };
    
    exports.main = async(event, context) => {
      const wxContext = cloud.getWXContext()
      let {
        orderid,
        money
      } = event;
      //3,初始化支付
      const api = tenpay.init(config);
    
      let result = await api.getPayParams({
        out_trade_no: orderid,
        body: '商品简单描述',
        total_fee: money, //订单金额(分),
        openid: wxContext.OPENID //付款用户的openid
      });
      return result;
    }
    

    一定要注意把appid,mchid,partnerKey换成你自己的。

    到这里我们获取小程序支付所需参数的云函数代码就编写完成了。
    不要忘记上传这个云函数。

    出现下图就代表上传成功

    五,写一个简单的页面,用来提交订单,调用pay云函数。


    这个页面很简单,
    1,自己随便编写一个订单号(这个订单号要大于6位)
    2,自己随便填写一个订单价(单位是分)
    3,点击按钮,调用pay云函数。获取支付所需参数。

    下图是官方支付api所需要的一些必须参数。

    下图是我们调用pay云函数获取的参数,和上图所需要的是不是一样。
    [图片上传中...(WechatIMG9.jpeg-82c1c2-1565617669894-0)]

    六,调用wx.requestPayment实现支付

    下图是官方的示例代码

    这里不在做具体讲解了,把完整代码给大家贴出来

    // pages/pay/pay.js
    Page({
      //提交订单
      formSubmit: function(e) {
        let that = this;
        let formData = e.detail.value
        console.log('form发生了submit事件,携带数据为:', formData)
        wx.cloud.callFunction({
          name: "pay",
          data: {
            orderid: "" + formData.orderid,
            money: formData.money
          },
          success(res) {
            console.log("提交成功", res.result)
            that.pay(res.result)
          },
          fail(res) {
            console.log("提交失败", res)
          }
        })
      },
    
      //实现小程序支付
      pay(payData) {
        //官方标准的支付方法
        wx.requestPayment({
          timeStamp: payData.timeStamp,
          nonceStr: payData.nonceStr,
          package: payData.package, //统一下单接口返回的 prepay_id 格式如:prepay_id=***
          signType: 'MD5',
          paySign: payData.paySign, //签名
          success(res) {
            console.log("支付成功", res)
          },
          fail(res) {
            console.log("支付失败", res)
          },
          complete(res) {
            console.log("支付完成", res)
          }
        })
      }
    })
    

    到这里,云开发实现小程序支付的功能就完整实现了。

    实现效果

    1,调起支付键盘

    2,支付完成

    3,log日志,可以看出不同支付状态的回调


    上图是支付成功的回调,我们可以在支付成功回调时,改变订单支付状态。

    下图是支付失败的回调,

    下图是支付完成的状态。

    到这里我们就轻松的实现了微信小程序的支付功能了。是不是很简单啊。
    如果感觉图文不是很好理解,我后面会录制视频讲解。

    视频讲解

    https://edu.csdn.net/course/detail/25701

    源码地址:

    https://github.com/qiushi123/xiaochengxu_demos

    014云开发实现小程序支付,就是我们的源码,如果你导入源码或者学习过程中有任何问题,都可以留言或者私信我。大家一起学习,一起进步。

    展开全文
  • 使用git开发功能,新需求

    千次阅读 2017-03-01 15:28:10
    使用git创建新分支开发功能一般步骤相信很多人都已经开始用git开发了,但是还是记不清一些命令,下面我归纳一下从现有git仓库创建新分支开发功能的一些命令. 第一步:从现有仓库的master分支创建一个新分支,当然...
  • 小程序后台开发的那些事

    千人学习 2017-08-15 14:55:28
    小程序“简约而不简单”,虽提供的功能及界面简约,但对后端却有着更高的要求。本课程带你了解微信小程序后台开发关键技术点,并通过真实案例,教大家掌握小程序开发中的关键环节,是开发者入门微信小程序开发的必备...
  • 使用列表系列标签完成常见网页中的列表结构; 熟练掌握表格,表单都系列标签,在项目中熟练使用; 了解哪些标签在项目中经常使用,哪些标签已被废除; 迈出HTML5开发的第一步,为后续课程打下基础;
  • 微信支付开发——公众号支付

    万人学习 2016-10-27 14:33:09
    微信已经融入到人们的生活中,很多企业也...这是一部中课程,需要有学习的开发者拥有微信开发和PHP的相关基础:微信支付在项目中的位置、微信支付类型、微信支付涉及内容、微信公众号支付功能实现、微信支付安全建议。
  • 原生Android开发实战教程,讲授如何实现在App中发送文字、语音、图片、VoIP、自定义(如红包)等消息,以及如何添加/删除好友、设置/修改头像、创建群组、讨论组、聊天室等基础IM功能
  • 大概就是首先用户使用支付宝充值到企业支付宝,app给用户生成相应金额的虚拟货币,不同用户可以使用虚拟货币相互进行交易,用户也可以通过提现功能将企业支付宝中的钱转账到用户支付宝,我仔细查看了一下支付宝各种...
  • JavaScript 前端开发技术

    千人学习 2018-03-06 12:04:08
    虽然它是作为开发Web页面的脚本语言而出名的,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格。 [1]  ...
  • 教你玩转HTML(html5)h5网页设计,网站开
  • 软件开发费用评估 功能点估算法

    千次阅读 2020-07-07 16:55:39
    定制软件开发服务费用=功能点数×软件开发生产率基准/人月折算系数×软件开发基准人月费率+直接非人力成本 其中: 1)功能点数(Function Point) 单位为个,计算公式如下: 功能点数=未调整功能点数量(UFP)×...
  • Django开发基础 

    千人学习 2017-03-03 18:37:09
    Django大而全,它出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构、以及全功能的管理后台。总之,Django是开发网站的强大工具。 本期课程主要有Bootstrap框架,Django...
  • c#实现录屏功能

    千次下载 热门讨论 2012-02-10 19:22:26
    c#实现录屏功能,使用Interop.WMEncoderLib.dll实现该录屏功能,测试正常。
  • Android意见反馈功能的代码框架

    千次下载 热门讨论 2012-07-23 22:59:19
    Android意见反馈功能的代码框架
  • C语言基础

    万人学习 2020-01-08 14:13:00
    Linux,Unix的大部分代码都是C,C在背后做了很多东西的,也许开发游戏用C++,安卓用XX更为合适,图形界面的用其他语言开发效率更高一些(因为他们封装了很多东西),但同样的原因导致略微接近底层的功能其他语言根本...
  • 课程为零基础学习开发的学员而准备,无需任何基础,无任何专业限制,通通从零开始,由浅入深学习开发,每个知识点均有对应案例作为指导,通俗易懂,简单易学,易上手。课程经过长时间的经验总结,采取合理又容易和...
  • Bootstrap开发框架视频教程

    千人学习 2017-01-01 10:10:52
    Bootstrap入门培训课程,Bootstrap是由Twitter推出的一个前台页面开发框架,在行业之中使用较为广泛。该视频教程包括Bootstrap开发入门、十二栅格布局、CSS基础样式、表单样式、CSS基础样式、表单样式、扩展组件、...
  • Java实战之Spring Boot入门到精通

    千人学习 2019-12-24 15:22:48
    包括如何基于Spring Boot2.0搭建一个企业级的多模块项目、整合Spring MVC和Mybatis实现项目中功能模块的CRUD,校验器Validator、Lombok、动态配置参数、开发环境切换、全局异常处理、定时任务、多线程、热加载、发送...
  • 2、参数化、badboy测试脚本开发以及录制方法,正则表达式之Regextester工具使用、JMETER 组件作 用域等知识点讲解。 3、ant 介绍以及作用、ant 下载及安装、ant build.xml 详解。 4、Jenkins 构建自动化平台、...
  • 与此同时,Debug还亲自撸了额外的附属模块,包括字典管理模块、商品分类模块以及考勤管理模块等等,主要是为了更好地巩固相应的技术栈以及企业应用系统业务模块的开发流程! 核心技术栈列表: 值得介绍的是,本课程...
  • 20个开发人员非常有用的Java功能代码(推荐)

    千次下载 热门讨论 2012-04-17 19:00:47
    20个开发人员非常有用的Java功能代码
  • IOS开发从入门到精通-第一章

    千人学习 2018-04-08 22:16:23
    本课程详细介绍了IOS开发环境搭建及开发工具的使用,讲解了IOS开发常用视图控件的使用 ,还讲解了一个实用的功能实例:APP启动引导页的开发

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,340,254
精华内容 1,336,101
关键字:

功能开发