生成随机编号文件

注意,该功能已经下架。

下架原因:没有适用场景,使用量少。

实现原理:调用接口,在后台生成批量随机号码,保存到 Excel 文件中,然后下载 Excel 文件保存到手机。

技术要点:打开 Excel,保存 Excel。

wxml 文件

<!--pages/rand1/index.wxml-->
<view class="page">
  <view class="weui-form">
    <form catchsubmit="formSubmit" catchreset="formReset">
      <view class="weui-form__text-area">
        <h2 class="weui-form__title">生成编号列表</h2>
        <view class="weui-form__desc">根据用户选择的生成规则,按照规则生成编号列表并可导出为Excel文件,可以预览生成的数据,也可以将文件分享给用户进行保存。因服务资源有限,目前生成的条目最大数量为1000。可用于自定义编号,自定义随机密码等场景。</view>
      </view>
      <view class="weui-form__control-area">
        <view class="weui-cells__group weui-cells__group_form">
          <view class="weui-cells__title">表单</view>
          <view class="weui-cells">
            <view class="weui-cell weui-cell_active weui-cell_select weui-cell_select-after">
              <view class="weui-cell__hd">
                <label class="weui-label">生成规则</label>
              </view>
              <view class="weui-cell__bd">
                <picker aria-role="combobox" bindchange="bindPicker2Change" range="{{ruleArr}}">
                  <view class="weui-select">{{ruleArr[ruleValue]}}</view>
                </picker>
              </view>
            </view>
            <view class="weui-cell">{{ruleDescArr[ruleValue]}}</view>

            <block wx:if="{{ruleValue == 0 || ruleValue == 1 || ruleValue == 2}}">
              <view class="weui-cell weui-cell_active">
                <view class="weui-cell__hd"><label class="weui-label">长度</label></view>
                <view class="weui-cell__bd">
                  <input class="weui-input" placeholder="字符长度" placeholder-class="weui-input__placeholder" type= "number" name="numLength" />
                </view>
              </view>
              <view class="weui-cell weui-cell_active">
                <view class="weui-cell__hd">
                  <label class="weui-label">数量</label>
                </view>
                <view class="weui-cell__bd">
                  <input class="weui-input" placeholder="生成数量" placeholder-class="weui-input__placeholder"  type= "number" name="numSize" />
                </view>
              </view>
            </block>
            <block wx:elif="{{ruleValue == 3}}">
              <view class="weui-cell weui-cell_active">
                <view class="weui-cell__hd"><label class="weui-label">前缀</label></view>
                <view class="weui-cell__bd">
                  <input class="weui-input" placeholder="前缀内容,汉字不超5个" placeholder-class="weui-input__placeholder" name="prev"/>
                </view>
              </view>
              <view class="weui-cell weui-cell_active">
                <view class="weui-cell__hd">
                  <label class="weui-label">起始序号</label>
                </view>
                <view class="weui-cell__bd">
                  <input class="weui-input" placeholder="起始序号" placeholder-class="weui-input__placeholder" type= "number" name="startSeq"/>
                </view>
              </view>
              <view class="weui-cell weui-cell_active">
                <view class="weui-cell__hd">
                  <label class="weui-label">截止序号</label>
                </view>
                <view class="weui-cell__bd">
                  <input class="weui-input" placeholder="截止序号" placeholder-class="weui-input__placeholder" type= "number" name="endSeq" />
                </view>
              </view>
              <view class="weui-cell weui-cell_active">
                <view class="weui-cell__hd"><label class="weui-label">后缀</label></view>
                <view class="weui-cell__bd">
                  <input class="weui-input" placeholder="后缀内容,汉字不超5个" placeholder-class="weui-input__placeholder" name="suff" />
                </view>
              </view>
            </block>
            <block wx:else>
              <view class="weui-cell weui-cell_active">
                <view class="weui-cell__hd"><label class="weui-label">前缀</label></view>
                <view class="weui-cell__bd">
                  <input class="weui-input" placeholder="前缀内容,汉字不超5个" placeholder-class="weui-input__placeholder" name="prev"/>
                </view>
              </view>
              <view class="weui-cell weui-cell_active weui-cell_select weui-cell_select-after">
                <view class="weui-cell__hd">
                  <label class="weui-label">日期类型</label>
                </view>
                <view class="weui-cell__bd">
                  <picker aria-role="combobox" bindchange="bindPicker3Change" range="{{dateArr}}">
                    <view class="weui-select">{{dateArr[dateValue]}}</view>
                  </picker>
                </view>
              </view>
              <view class="weui-cell weui-cell_active">
                <view class="weui-cell__hd">
                  <label class="weui-label">起始序号</label>
                </view>
                <view class="weui-cell__bd">
                  <input class="weui-input" placeholder="起始序号" placeholder-class="weui-input__placeholder" type= "number" name="startSeq"/>
                </view>
              </view>
              <view class="weui-cell weui-cell_active">
                <view class="weui-cell__hd">
                  <label class="weui-label">截止序号</label>
                </view>
                <view class="weui-cell__bd">
                  <input class="weui-input" placeholder="截止序号" placeholder-class="weui-input__placeholder" type= "number" name="endSeq"/>
                </view>
              </view>
              <view class="weui-cell weui-cell_active">
                <view class="weui-cell__hd"><label class="weui-label">后缀</label></view>
                <view class="weui-cell__bd">
                  <input class="weui-input" placeholder="后缀内容,汉字不超5个" placeholder-class="weui-input__placeholder" name="suff"/>
                </view>
              </view>
            </block>
          </view>
        </view>
      </view>

      <view class="weui-form__tips-area">
        <view class="weui-form__tips">
          {{tips}}
        </view>
      </view>
      <view class="weui-form__opr-area">
        <button class="weui-btn weui-btn_default" aria-role="button" formType="reset">重置</button>
        <button class="weui-btn weui-btn_primary" aria-role="button" formType="submit">提交生成数据</button>
        <button class="weui-btn weui-btn_primary" aria-role="button" bindtap="previewData">预览数据</button>
        <button class="weui-btn weui-btn_primary" aria-role="button" bindtap="shareData">分享保存</button>
      </view>
    </form>
  </view>
</view>

wxss 文件

js 文件

const utils = require("../../utils/utils.js");
const ohttp = require("../../utils/ostrichHttp")
let serverFileName = ''; // 服务器上的文件路径
let localFileName = ''; // 本地临时文件路径

Page({

  /**
   * 页面的初始数据
   * 规则说明:1,随机纯字符 2,随机纯数字 3,字符加数字
   * 4,前缀+起始序号+截止序号+后缀 5,前缀+日期类型+起始序号+截止序号+后缀
   *
   * 日期类型说明:1 日期 (20130117) 2 日期时间 (20130117154433) 3 时间 (154401)
   */
  data: {
    tips: '',
    numLength: 0,
    numSize: 0,
    prev: '',
    suff: '',
    startSeq: 0,
    endSeq: 0,
    ruleDescArr: ['生成随机纯字符', '生成随机纯数字', '生成随机字符和数字', '生成格式为(前缀+起始序号+截止序号+后缀)', '生成格式为(前缀+日期+起始序号+截止序号+后缀)'],
    ruleArr: ['规则1', '规则2', '规则3', '规则4', '规则5'],
    ruleValue: 0,
    dateArr: ['日期 (20130117)', '日期时间 (20130117154433)', '时间 (154401)'],
    dateValue: 0,
    ruleType: 1,
    dateType: 1,
  },
  bindPicker2Change(e) {
    this.setData({
      ruleValue: e.detail.value,
    });
  },
  bindPicker3Change(e) {
    this.setData({
      dateValue: e.detail.value,
    });
  },

  formSubmit(e) {
    const that = this;

    let obj = e.detail.value
    let rt = Number(that.data.ruleValue) + 1;

    if (that.data.ruleValue == 0 || that.data.ruleValue == 1 || that.data.ruleValue == 2) {
      if (utils.isEmpty(obj.numLength) || utils.isEmpty(obj.numSize)) {
        that.setData({
          tips: '请填写长度或数量',
        })
        // 弹窗错误
        wx.showToast({
          title: '内容不能为空',
        })
        return
      }
      that.setData({
        numLength: obj.numLength,
        numSize: obj.numSize,
        ruleType: rt,
      })
    } else if (that.data.ruleValue == 3) {
      that.setData({
        prev: obj.prev,
        suff: obj.suff,
        startSeq: obj.startSeq,
        endSeq: obj.endSeq,
        ruleType: rt,
      })
    } else if (that.data.ruleValue == 4) {
      let dt = Number(that.data.dateValue) + 1;
      that.setData({
        prev: obj.prev,
        suff: obj.suff,
        startSeq: obj.startSeq,
        endSeq: obj.endSeq,
        dateType: dt,
        ruleType: rt,
      })
    }
    that.genData();
  },

  formReset(e) {
    this.setData({
      tips: '',
    })
  },
  sendReq: function (obj) {
    const that = this;

    ohttp
      .httpPost("/genRandomData", obj)
      .then((res) => {

        if (res.data.code === 1) {
          // 设置fileName
          that.serverFileName = res.data.data;
          ohttp.httpDownloadFile('/files', that.serverFileName).then((res) => {
            that.localFileName = res.tempFilePath;
            that.setData({
              tips: '生成成功',
            })
            wx.showToast({
              title: '生成成功',
            })
          });
          // 广告分数扣分
          // that.adFen = that.adFen - 2; // 扣分
          // wx.setStorageSync('ad', that.adFen);
        } else {
          // 生成失败
          wx.showToast({
            title: '请稍后再试',
          })
        }
      });
  },

  genData: function () {
    const that = this;
    switch (that.data.ruleType) {
      case 1: case 2: case 3:

        if (that.data.numLength > 20) {
          that.setData({
            tips: '长度最大为20',
          })
          // 弹窗错误
          wx.showToast({
            title: '长度最大为20',
          })
          return
        }

        if (that.data.numSize > 1000) {
          that.setData({
            tips: '数量最大为1000',
          })
          // 弹窗错误
          wx.showToast({
            title: '数量最大为1000',
          })
          return
        }


        let content1 = {
          length: that.data.numLength,
          size: that.data.numSize,
        }

        let data1 = JSON.stringify(content1)

        let obj1 = {
          vtype: that.data.ruleType,
          data: data1,
        }

        that.sendReq(obj1)

        break;

      case 4:
        if (that.data.prev.length > 12 || that.data.suff.length > 12) {
          that.setData({
            tips: '前后缀长度超过12',
          })
          // 弹窗错误
          wx.showToast({
            title: '前后缀长度超过12',
          })
          return
        }
        if (that.data.startSeq < 0 || that.data.startSeq > 1000) {
          that.setData({
            tips: '起始序号超过1000',
          })
          // 弹窗错误
          wx.showToast({
            title: '起始序号超过1000',
          })
          return
        }

        if (that.data.endSeq < 0 || that.data.endSeq > 1000) {
          this.setData({
            tips: '截止序号超过1000',
          })
          // 弹窗错误
          wx.showToast({
            title: '截止序号超过1000',
          })
          return
        }

        if (that.data.startSeq >= that.data.endSeq) {
          that.setData({
            tips: '起始序号大于截止序号',
          })
          // 弹窗错误
          wx.showToast({
            title: '起始序号大于截止序号',
          })
          return
        }

        let content4 = {
          prev: that.data.prev,
          suff: that.data.suff,
          startSeq: that.data.startSeq,
          endSeq: that.data.endSeq,
        }

        let data4 = JSON.stringify(content4)

        let obj4 = {
          vtype: 4,
          data: data4,
        }
        that.sendReq(obj4)
        break;
      case 5:
        if (that.data.prev.length > 12 || that.data.suff.length > 12) {
          that.setData({
            tips: '前后缀长度超过12',
          })
          // 弹窗错误
          wx.showToast({
            title: '前后缀长度超过12',
          })
          return
        }
        if (that.data.startSeq < 0 || that.data.startSeq > 1000) {
          that.setData({
            tips: '起始序号超过1000',
          })
          // 弹窗错误
          wx.showToast({
            title: '起始序号超过1000',
          })
          return
        }

        if (that.data.endSeq < 0 || that.data.endSeq > 1000) {
          that.setData({
            tips: '截止序号超过1000',
          })
          // 弹窗错误
          wx.showToast({
            title: '截止序号超过1000',
          })
          return
        }

        if (that.data.startSeq >= that.data.endSeq) {
          that.setData({
            tips: '起始序号大于截止序号',
          })
          // 弹窗错误
          wx.showToast({
            title: '起始序号大于截止序号',
          })
          return
        }

        let content5 = {
          prev: that.data.prev,
          suff: that.data.suff,
          startSeq: that.data.startSeq,
          endSeq: that.data.endSeq,
          dateType: that.data.dateType,
        }


        let data5 = JSON.stringify(content5)

        let obj5 = {
          vtype: 5,
          data: data5,
        }
        that.sendReq(obj5)
        break;


    }
  },
  // 下载数据
  downloadData: function () {
    const that = this;
    if (utils.isEmpty(this.serverFileName)) {
      this.setData({
        tips: '请先生成数据',
      })
      // 弹窗错误
      wx.showToast({
        title: '请先生成数据',
      })
      return
    }


    if (utils.isEmpty(that.serverFileName)) {
      that.setData({
        tips: '请先生成数据',
      })
      // 弹窗错误
      wx.showToast({
        title: '请先生成数据',
      })
      return
    }
    ohttp.httpDownloadFile('/files', that.serverFileName).then((res) => {
      // 广告分数扣分
      // that.adFen = that.adFen - 2; // 扣分
      // wx.setStorageSync('ad', that.adFen);
      that.localFileName = res.tempFilePath;
      that.setData({
        tips: '下载成功',
      })
      wx.showToast({
        title: '下载成功',
      })
    });
  },
  // 预览数据
  previewData: function () {
    const that = this;
    if (utils.isEmpty(that.localFileName)){
      that.setData({
        tips: '请先生成数据',
      })
      // 弹窗错误
      wx.showToast({
        title: '请先生成数据',
      })
      return
    }
    wx.openDocument({
      filePath: that.localFileName,
      fileType: 'xlsx',
      showMenu: true,
      success: function (res) {
        console.log('打开文档成功')
      }
    })
  },
  // 分享数据
  shareData: function () {
    const that = this;
    if (utils.isEmpty(that.localFileName)) {
      that.setData({
        tips: '请先生成数据',
      })
      // 弹窗错误
      wx.showToast({
        title: '请先生成数据',
      })
      return
    }
    // 分享文件
    wx.shareFileMessage({
      filePath: that.localFileName,
      fileName: that.serverFileName,
      success() {
        console.log('转发成功')
      },
      fail: console.error,
    })
  },

})