分类 其他 下的文章

<!DOCTYPE html>
<html lang="utf8">
<head>
    <meta charset="UTF-8">
    <title>md转换为html</title>
</head>
<body>
<script src="https://cdn.bootcss.com/marked/0.8.0/marked.js"></script>
<link href="http://cdn.bootcss.com/highlight.js/8.0/styles/monokai_sublime.min.css" rel="stylesheet">
<script src="http://cdn.bootcss.com/highlight.js/8.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
<script type="text/javascript">
    var rendererMD = new marked.Renderer();
    marked.setOptions({
        renderer: rendererMD,
        gfm: true,
        tables: true,
        breaks: false,
        pedantic: false,
        sanitize: false,
        smartLists: true,
        smartypants: false
    });
    marked.setOptions({
        highlight: function (code) {
            return hljs.highlightAuto(code).value;
        }
    });

    function insertText(obj, str) {
        if (document.selection) {
            var sel = document.selection.createRange();
            sel.text = str;
        } else if (typeof obj.selectionStart === 'number' && typeof obj.selectionEnd === 'number') {
            var startPos = obj.selectionStart,
                endPos = obj.selectionEnd,
                cursorPos = startPos,
                tmpStr = obj.value;
            obj.value = tmpStr.substring(0, startPos) + str + tmpStr.substring(endPos, tmpStr.length);
            cursorPos += str.length;
            obj.selectionStart = obj.selectionEnd = cursorPos;
        } else {
            obj.value += str;
        }
    }

    function moveEnd(obj) {
        obj.focus();
        var len = obj.value.length;
        if (document.selection) {
            var sel = obj.createTextRange();
            sel.moveStart('character', len);
            sel.collapse();
            sel.select();
        } else if (typeof obj.selectionStart == 'number' && typeof obj.selectionEnd == 'number') {
            obj.selectionStart = obj.selectionEnd = len;
        }
    }

    //ctrl 是dom节点
    function getCursortPosition(ctrl) {
        //获取光标位置函数
        var CaretPos = 0;
        // IE Support
        if (document.selection) {
            ctrl.focus(); // 获取焦点
            var Sel = document.selection.createRange(); // 创建选定区域
            Sel.moveStart('character', -ctrl.value.length); // 移动开始点到最左边位置
            CaretPos = Sel.text.length;                      // 获取当前选定区的文本内容长度
        }
        // Firefox support (非ie)
        else if (ctrl.selectionStart || ctrl.selectionStart == '0') {
            CaretPos = ctrl.selectionStart; // 获取选定区的开始点
        }
        return CaretPos;
    }

    //ctrl 是dom节点,pos 是要定位到的位置
    function setCaretPosition(ctrl, pos) {
        //设置光标位置函数
        if (ctrl.setSelectionRange)   //非ie
        {
            ctrl.focus();  // 获取焦点
            ctrl.setSelectionRange(pos, pos);  // 设置选定区的开始和结束点
        } else if (ctrl.createTextRange) {
            var range = ctrl.createTextRange();  // 创建选定区
            range.collapse(true);                // 设置为折叠,即光标起点和结束点重叠在一起
            range.moveEnd('character', pos);     // 移动结束点
            range.moveStart('character', pos);   // 移动开始点
            range.select();                      // 选定当前区域
        }
    }
</script>
<div style="font-size: 20px;height: 30px; text-align: center;color: #009689; font-weight: bold;">md转换为html</div>
<style type="text/css">
    #area > table {
        width: 100%;
        table-layout: fixed;
    }

    #area table tr td {
        margin: 0;
        padding: 6px;
        border: 0;
    }

    #md-area {
        width: 100%;
        height: 600px;
        font-size: 18px;
        overflow: hidden;
        font-weight: bold;
        outline: none;
    }

    #show-area {
        height: 600px;
        background-color: #FCF6E5;
    }

    .clearfix:before {
        content: "";
        display: table;
    }
</style>
<script>
    function mdSwitch() {
        var mdValue = document.getElementById("md-area").value;
        var html = marked(mdValue);
        document.getElementById("show-area").innerHTML = html;
    }

    function TextAreaTab(obj) {
        if (9 == event.keyCode) {
            //do stm...
            //alert(event.keyCode);
            var oldPos = getCursortPosition(obj);
            insertText(obj, "    ");
            setCaretPosition(obj, oldPos + 4);
            window.setTimeout(function () {
                //document.getElementById("bt0").click();
                obj.focus();
            }, 2);
        }
    }
</script>
<div id="area">
    <table>
        <tr>
            <td><textarea name="" id="md-area" onkeyup="mdSwitch()" onkeydown="TextAreaTab(this)"
                          autofocus="autofocus"></textarea></td>
            <td>
                <div id="show-area" class="clearfix"></div>
            </td>
        </tr>
    </table>
</div>
<button id="bt0">提交</button>
</body>
</html>

微信发送模板消息时, 如果里面包含带小数点的数值, 必须转换为字符串, 否则微信默认转换为6位小数处理, 没有0的补0

如果价格为9.9元, 如果你不给单位, 直接传递9.9, 微信会在用户那边转换为9.900000
如果99元就没事

执行composer install, composer update, php artisan tinker, php artisan cache:clear 等等等 . . .
都抛出下面的错误

  • 通过各种排查, 文件为下面这个路径的该文件
\vendor\laravel\framework\src\Illuminate\Container\Container.php
  • 最后问题还是解决了
在laravel的composer引入的公共文件中, 发现了使用request类的发放, 导致命令行无法正常的执行下去

  • 环境安装
yum install npm -y
npm install apidoc -g
apidoc -v
  • 在有文档的目录创建apidoc.json
{
  "name": "API名称",
  "version": "API主版本号,仅支持3位数字版本号,如:0.0.1",
  "description": "API描述信息",
  "title": "浏览器标题",
  "url": "可选,接口地址,如:http://wuloves.com/xxx",
  "sampleUrl": "可选,接口调用示例地址,如增加此项,则页面会增加可发送请求示例的操作项",
  "header": {
    "title": "可选,头部标题",
    "filename": "可选,头部文件路径,只支持.md文件"
  },
  "footer": {
    "title": "可选,底部描述",
    "filename": "可选,底部文件路径,只支持.md文件"
  },
  "template": {
    "withCompare": true, //是否允许版本之间进行比较
    "withGenerator": true//是否允许生成多个版本
  }
}
  • apidoc 使用说明
@api {get} /users/:user_id Request User Information
最主要的参数,”{get}”定义了HTTP请求是GET,API地址是”/users/:user_id”,文档中API的名称是”Request User Information”。
@apiVersion 0.1.0
API的版本号,默认显示在API名称的右方。该参数可用来在不同的版本之间做比较,后面会介绍。
@apiName GetUser
API名称,不影响文档。
@apiGroup User
API分组名,文档内容中和菜单栏中同一组的API会在一同显示,方便阅读。
@apiPermission admin
API的访问权限,文档中默认会API地址下面显示。没有权限要求的话,此项可以省略。
@apiDescription API to get the user information.
API的详细描述,默认显示在API名称的下方。
@apiExample Example usage:
API调用示例,该参数的下一行就是示例的内容,直到有空行结束。可以定义多个@apiExample,默认在文档中会以标签形式列出,标签名就是”Example usage:”。
@apiParam {Number} user_id The user’s unique ID.
API参数字段介绍,”{Number}”定义了字段类型,”user_id”是字段名称,后面则是字段描述。可以定义多个@apiParam字段。
@apiSuccess {String} name Name of the User.
API成功后返回的字段,如同@apiParam,”{String}”定义了字段类型,”name”是返回字段名称,后面则是字段描述。可以定义多个@apiSuccess字段。
@apiSuccessExample {json} Success-Response:
显示一个API成功返回后Response响应的示例,”{json}”代表响应体是JSON类型。该参数的下行就是响应体内容,直到有空行结束。可以定义多个@apiSuccessExample,默认在文档中会以标签形式列出,标签名就是”Success-Response:”。
@apiError UserNotFound User was not found.
API发生错误后的返回,”UserNotFound”是错误名称,后面则是错误描述。可以定义多个错误返回。
@apiErrorExample {json} Error-Response:
显示一个API错误返回后Response响应的示例,”{json}”代表响应体是JSON类型。该参数的下行就是响应体内容,直到有空行结束。可以定义多个@apiErrorExample,默认在文档中会以标签形式列出,标签名就是”Error-Response:”。
@apiSampleRequest http://localhost:5000/users/:user_id
文档提供的API Sample测试的地址。其实在”apidoc.json”中配过”sampleUrl”项后,此参数即可省去,除非这个API的测试URL比较特殊,需特别指定。