magic 发布的文章

最近在录制一些Bmob微信小程序视频教程,没来得及更新

本教程教你如何免费发布一款自己微信小程序。

微信小程序门槛已经下降到个人了,很多不会写代码的人也想免费上线一款自己的小程序,该如何做到?

他有这些要求:

  • 无需写代码
  • 整个发布到上线最好不要超过10分钟
  • 我要保留整个小程序的源码,以防止下次上线需要。
  • 项目源码安全无后门、有详细的文档说明
  • 稳定、安全。
  • 免费、不花一分钱。

本视频10分钟上线自己微信小程序,一一解决这些问题。

视频地址:
https://zhuanlan.zhihu.com/p/33283879

最近有人问到不用VUE等前端框架,只想简单在一个html显示我的数据库数据。如何实现,这里写个例子 js 代码实现不到10行

效果

image.png

HTML代码

<html>
<head>
    <title>Bmob后端云测试</title>
    <script src="Bmob-1.4.2.min.js"></script>
    <script>
    Bmob.initialize('9b41c92db4976a1bae59d554f0c3fc4a', '7fa2bb3451025d9da1f234e700ea161a')
    const query = Bmob.Query("newslist");
    query.find().then(res => {
        console.log(res)
        for (var i = 0; i < res.length; i++) {
           document.write(`${i}:${res[i].title}-----${res[i].createdAt}<br>`)
        };
    });
    </script>
</head>
<body>

</body>
</html>

最后附上JS操作数据库文档
https://bmob.github.io/hydrogen-js-sdk/#/?id=查询所有数据

这篇分享个自己写的一个实用的脚本给大家。

最近新开发一套系统,需要建立数据库,数据表文档已经写好,需要建立数据库。看图:

image.png

这套系统大概有十几个这样的数据表,每个表的字段类型、长度、描述都需要填写,算是一个重复工作,想到可以写个小脚本,自动生成创建表结构。生成结果看下面代码

CREATE TABLE `admin_financial` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `portId` varchar(50) NOT NULL COMMENT '端口id',
  `weixinId` varchar(50) NOT NULL COMMENT '原始ID',
  `name` varchar(50) NOT NULL COMMENT '公众号名',
  `opUser` varchar(50) NOT NULL COMMENT '操作者',
  `companyName` varchar(50) NOT NULL COMMENT '企业名称',
  `sum` int(11) NOT NULL COMMENT '金额(分)',
  `type` int(11) NOT NULL COMMENT '操作类型',
  `accountType` int(11) NOT NULL COMMENT '账户类型',
  `time` timestamp NOT NULL COMMENT '时间',
  `billNo` varchar(50) NOT NULL COMMENT '账单编号',
  `status` int(11) NOT NULL COMMENT '状态',
  `dstAccountId` varchar(50) NOT NULL COMMENT '目标账户',
  `dstAccountType` int(11) NOT NULL COMMENT '目标账户类型',
  `dstAuthAccount` varchar(50) NOT NULL COMMENT '目标授权账户',
  `dstSubAccount` int(11) NOT NULL COMMENT '目标子账户',
  `srcAccountId` varchar(50) NOT NULL COMMENT '来源账户',
  `srcAccountType` int(11) NOT NULL COMMENT '来源账户类型',
  `srcAuthAccount` varchar(50) NOT NULL COMMENT '来源授权账户',
  `srcSubAccount` int(11) NOT NULL COMMENT '来源子账户',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='财务记录表';

这里我使用了unix* 系统都可以跑的shell 来写。主要用到awk 命令。

首先建立个源数据文件,用来放文档格式。我这里复制文档的格式是这样。

portId  端口id    String  spid15e226338b
weixinId    原始ID    String  gh_94415782f4da
name    公众号名    String  xxx
opUser  操作者 String  xxx
companyName 企业名称    String  信息技术有限公司
sum 金额(分)   Int 5020(50.2元)
type    操作类型    Int 1:转账;2.退款
accountType 账户类型    Int 3:赠送;4:现金;14:信用金固定
time    时间  Date    2018-06-01 00:11:22
billNo  账单编号    String  xxxx
status  状态  Int 1
dstAccountId    目标账户    String  spid15e226338b
dstAccountType  目标账户类型  Int spid15e226338b
dstAuthAccount  目标授权账户  String
dstSubAccount   目标子账户   Int 14
srcAccountId    来源账户    String  spid15e226338b
srcAccountType  来源账户类型  Int spid15e226338b
srcAuthAccount  来源授权账户  String
srcSubAccount   来源子账户   Int 14

然后写脚本

#!/bin/bash
# author:Magic
# url:www.bmob.cn
# table="default_table"

if [ -n "$1" ]; then
    table=$1
    else
    table="default_table"
fi

if [ -n "$2" ]; then
    comment=$2
else
    comment = ""
fi
cat dx.txt |awk -F " " '
BEGIN{count=0; table= "'$table'";comment="'$comment'"} {name[count] = $1;c[count] = $2;
t[count]=$3;count++;};
END{
print "CREATE TABLE `" table "` ("
print "`id` int(11) unsigned NOT NULL AUTO_INCREMENT,"
for (i = 0; i < NR; i++){

printf "`"name[i]"` "
if(t[i]=="Int"){
    printf "int("11") "
}else if(t[i]=="String"){
    printf "varchar("50") "
}else if(t[i]=="Date"){
    printf "timestamp NULL "
}else if(t[i]=="Float"){
    printf "float(10,4) "
}

printf "NOT NULL"
print " COMMENT \""c[i]"\","
}
print "PRIMARY KEY (`id`)"
print ") ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT= \""comment"\";"
}'

如何执行:

命令行执行  sh db.sh tableName 财务表
* sh 执行shell
* db.sh 脚本名称
* tableName 表名称
* 财务表 描述

效果截图
image.png

这样就可以实现复制文档表,然后就生成SQL,如果需要最后去数据库手动设置下索引,这样就完美快速的基于文档,生成Sql结构,大家有更好的方法,也可以一起交流。

篇首:俺自己很low,写的东西也很low,各位前辈已经各种总结的,so,大家轻喷啊,俺只是为了记录一下子。
刚刚不经意间查看关于php加速方面的消息,看到了一句话“lamp结构的瓶颈在于M”,感觉是真知灼见,当然这是在理想状态下的情况。对于实际情况下的生产环境来说,需要解决的问题是多种多样的,l-a-
m-
p在不同阶段需要优化的点是不同的,虽然通过努力最终的瓶颈在于M,但是期间的各种努力也是不容忽视的。下面我就意识流的总结一下,在网站生产环境遇到的各种问题。
以下是之前遇到问题的各种汇总:
1、php内的sql代码性能存在问题
这个存在于两方面,一个是sql本身优化不够,另外一个方面是随着数据量的增加,某些性能问题会逐渐暴露。

2、apache处理模式造成的内存消耗
由于apache是以进程的形式,同步阻塞式的处理http请求,so,当网页本身加载元素过多的话,会造成大量的
http进程并发,消耗服务器大量的内存,导致访问缓慢或者异常。
解决办法很是简单,主要有一下几个方面
a、动态页面转成静态页面。
b、转成lnamp的模式,图片等静态资源由nginx进行处理,减少http进程数量

3、CDN服务的使用
这个并不是性能问题,而是为了解决用户访问的页面加载速度问题,以及不同网络之间的延迟问题。
具体使用效果是非常不错的,会大大的改善各地用户的访问速度,土豪公司可以自建CDN,中小公司
选择第三方服务也是不错的选择。

4、缓存的使用
这个有两个方面的缓存,其中主要的缓存是数据也就是动态方面的缓存
使用的软件主要有redis以及memcache(开源用的爽爽哒)
这两个软件都是针对php与mysql之间的请求进行缓存,减少与mysql的直接交互,提高访问速度。

5、apache的负载均衡,mysql的读写分离
即便增加了CDN、缓存,优化了apache的页面,但是高并发的问题依然会随着用户量的增加而慢慢出现,那么这个时候
就要发大招了,扩!容!硬!件!。永远都好使的大招,用完即生效。我们现在主要使用的是nginx+apache的负载均衡方式。
而mysql的读写分离也so easy,使用主从复制即可。对于及时性要就不是太高的网页访问,问题不大。

6、奇葩问题粗现了!!!
Then,该优化的俺们都优化了,前辈的经验也是各种借鉴,最后俺们发现页面访问还是慢得想让用户注销。问题到底在哪?
又经过了艰苦卓绝的调查与研究,最后发现,上一个离职的哥们开放的一个权限系统(所有网页加载都会用),没有关闭
debug,我去!我一口老血喷在了显示器上啊!苍天啊,我曾经一度怀疑自己是不是在做无用功啊!

这里不是挑起运维与研发的阶级矛盾,而是总结经验教训,以后不在走弯路!
先到这吧!以后有了经验再补充!

Serverless实战驾校小程序【考题练习】四

由于没有数据,这次需要拿一些测试数据放到数据库。 这里想到本地采集,大家可以随意用任何后端语言,Python,PHP,Golang,Java,nodejs等等, 这里我就不用其他语言,使用接近JavaScript语法的,nodejs,采集后生成CSV文件。

主要用到三个库:

  1. 网络库
  2. 解析库
  3. 文件库

这里找到一个采集的地址:
http://www.jiakao.com/cnty/web/km1_tc_new.php?q=1

1. 选择Table 打印这效果

let  table = $('table');

         table.each(function (index, item) {
          let  x = $(this).text();   
          console.log(x)   

选择

2.提取标题

由于数据库,标题title是一个单独字段,这里先把title取出来。
let table = $('table');

      table.each(function (index, item) {
        let x = $(this).find("tr>td").eq(0).text();
        let t = x.split('\n\t');
        console.log(t)
      });

image.png

这里的数据[1]就是标题数据

3. 提取题目内容

image.png

这里不细说了,后面我会放上代码,大家自己看。 无非就是拿到A、b、c、d结果,放到一个对象里面,跟导入的格式一致就行。

4.完成导入

Bmob控制台导入CSV,导入后,效果如下。

image.png

小程序里面,我们测试下。

image.png

放代码

let http = require('http');
let fs = require('fs');
let cheerio = require('cheerio');
let request = require('request');
let iconv = require('iconv-lite');
let i = 0;
let url = "http://www.jiakao.com/cnty/web/km1_tc_new.php?q=1";
//初始url 

function fetchPage (x) {     //封装了一层函数
  startRequest(x);
}


function startRequest (x) {
  //采用http模块向服务器发起一次get请求      
  http.get(x, function (res) {
    let html = '';        //用来存储请求网页的整个html内容
    let titles = [];
    res.setEncoding('binary'); //防止中文乱码

    //监听data事件,每次取一块数据
    res.on('data', function (chunk) {

      html += chunk;
    });
    //监听end事件,如果整个网页内容的html都获取完毕,就执行回调函数
    res.on('end', function () {
      html = iconv.decode(html, 'gb2312');

      let $ = cheerio.load(html); //采用cheerio模块解析html

      let table = $('table');
      console.log('help,choseList,title,video,type,bType,bModels,bSubjects,pic')
      table.each(function (index, item) {


        let t;
        let d;

        let tArr = [];
        let choseList = [] //{""item"":""6个月""}

        $(this).find("tr>td").each(function (i, items) {
          // t = $(this).eq(0).text().split('\n\t');
          t = $(this).text().split('\n\t');
          if (i == 0) {
            tArr.push(t[1])
          }
          d = $(this).text().trim()

          if (i > 0 && i < 6) {
            if (d.indexOf('A') != -1 || d.indexOf('B') != -1 || d.indexOf('C') != -1 || d.indexOf('D') != -1) {

              let answerStr, answerArr;
              // 获取正确答案
              let okStr = $(this).parent().attr('onclick')
              if (okStr != undefined) {
                answerStr = okStr.substr(25, 3)
                answerArr = answerStr.split(',')
              }


              d = d.split('、');

              if (answerArr[0] == answerArr[1]) {
                choseList.push({ "\"isChose\"": true, "\"item\"": "\"" + d[1] + "\"" })
              } else {
                choseList.push({ "\"item\"": "\"" + d[1] + "\"" })
              }
            }

          }


        })

        console.log(`,"${JSON.stringify(choseList)}",${tArr},,1,413405afba,1,1,`)

      });
    })


  }).on('error', function (err) {
    console.log(err);
  });

}

fetchPage(url);      //主程序开始运行

总结:

Bmob数据库支持CSV导入, 我们把采集到的数据输出为一个CSV即可,然后后台点击导入,采集到数据后,进行处理,分四步。

  1. 拿到标题
  2. 拿到结果
  3. 分析出正确答案
  4. 整理数据格式导出CSV

由于这里100题只是为了做Demo,时间第一,并没有采集图片,如果正式上线,还需要采集图片并上传。时间关系,这一节就到这,有问题可以在下面评论。