每天一剂开发良药

Posted sp42a

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每天一剂开发良药相关的知识,希望对你有一定的参考价值。

主要介绍一些小技巧之类,是为备忘也。

TypeScript 导入 *.vue 报错:Cannot find module

如图

创建一个 shims.d.ts 文件,放置到 src/globalDeclare 中。

declare module '*.vue' 
  import Vue from 'vue';
  export default Vue;

typescript-eslint 自作多情提示 xxx is assigned a value but never used

eslintrc.js 加上

 "no-unused-vars": "off",
 "@typescript-eslint/no-unused-vars": ["error"],
 "@typescript-eslint/ban-ts-comment": "off",
 "@typescript-eslint/explicit-function-return-type": "off",
 "@typescript-eslint/no-explicit-any": ["off"]

ViewUI Table 单元格 文本将不换行,超出部分显示为省略号

组件写法,比较麻烦

<Table :columns="columns1" :data="list">
  <template slot-scope=" row, index " slot="action">
    <a href="javascript:void(0);" @click="handleEdit(row, index)">编辑</a> 
     <Divider type="vertical" />
    <Poptip confirm transfer title="是否要删除此行?" @on-ok="handleDelete(index)">
      <a href="javascript:void(0);" style="color:red;">删除</a>
    </Poptip>
  </template>

 <template slot-scope=" row " slot="url">
    <Ellipsis :text="row.url" :length="50" tooltip :transfer="true"></Ellipsis>
  </template>
</Table>

其实可以在列配置中声明:

  title: '链接地址', minWidth: 190, key: 'url', ellipsis:true, tooltip:true ,

另外每一列设置 width/minWidth 就可以保证不受浏览器宽度挤压

Vue 工程里面怎么引入公共的 Less 样式库?

例如 Less 的函数。

安装下面插件

  • “less”: “^3.0.4”,
  • “less-loader”: “^5.0.0”,
  • “style-resources-loader”: “^1.4.1”

打开 vue.config.js 配置文件,

module.exports = 
    pluginOptions: 
        'style-resources-loader': 
            preProcessor: 'less',
            patterns: ['C:\\\\code\\\\ajaxjs\\\\aj-js\\\\aj-ui\\\\src\\\\style\\\\common-functions.less']
        
    ,
    lintOnSave: true,
    devServer: 
        overlay: 
            warnings: true,
            error: true
        
    
;

路径写死,改相对路径

var path = require("path");

module.exports = 
    pluginOptions: 
        'style-resources-loader': 
            preProcessor: 'less',
            patterns: [path.resolve(__dirname, './src/style/common-functions.less')]
        
    ,
    lintOnSave: true,
    devServer: 
        overlay: 
            warnings: true,
            error: true
        
    
;

mysql varchar 文本包含数字的计数器

需求:如果重复值,则自增 1、2、3……
思路:先查询是否重复:

SELECT id FROM $tableName WHERE urlDir = ? AND datasourceId = ? LIMIT 1

如果是,获取最大值 MaxId,通过正则查询、排序,注意参数拼接了字符串(参数就是重复值)。

SELECT urlDir FROM $tableName WHERE urlDir REGEXP CONCAT(?, '_[0-9]+$') AND datasourceId = ? ORDER BY urlDir DESC LIMIT 1

若无则 1,有则 MaxId++

快速 SQL 转换 Java Bean/ POJO

找过好几个的,都不太符合需求,于是自己写个脚本,也很快。

<html>

<head>
    <meta charset="utf-8" />
    <title>SQL2pojo</title>
</head>

<body>
    <textarea id="sql" rows="20" cols="100"></textarea>
    <br />
    <br />
    <button onclick="sql2pojo()">SQL2pojo</button>
    <pre></pre>
</body>
<script>
    let tpl = '';
    function sql2pojo() 
        let sql = document.querySelector("#sql").value;
        let arr = sql.match(/CREATE TABLE `(?:\\w+|_)` \\(((\\s|\\S)+)(?=PRIMARY KEY)/);
        let result = arr[1].trim();

        arr = result.split(',');

        let output = [];
        arr.forEach(item => 
            if (item) 
                item = item.trim();
                console.log(item);
                let _arr = item.match(/^`(\\w+)`\\s+((?:\\w|\\(|\\))+).*COMMENT '(.*?)'/);
                let _t = _arr[2], type = 'Object';

                if (_t.indexOf('VARCHAR') != -1 || _t.indexOf('TEXT') != -1)
                    type = 'String';

                if (_t.indexOf('TINYINT(1)') != -1)
                    type = 'Boolean';
                else if (_t.indexOf('TINYINT') != -1)
                    type = 'Integer';
                else if (_t.indexOf('INT') != -1)
                    type = 'Long';

                if (_t.indexOf('DATETIME') != -1 || _t.indexOf('DATE') != -1)
                    type = 'Date';

                tpl = `
/**
 *  $_arr[3]
 */
private $type $_arr[1];`;
                // console.log(tpl);
                output.push(tpl);
            
        );

        document.querySelector('pre').innerHTML = output.join('<br />');
    
</script>

</html>

Vue+TS 工程发布 npm 组件不能携带 *.vue 问题

当前 Vue 工程既有网站,也希望发布为 npm 组件。使用 tsc 编译结果到 dist 目录,注意下面问题:

  • 配置 main 文件,不然 import 包时候会 undefined。具体就是在 package.json 配置结果目录的 index.jsindex.d.ts
  • 编译依靠不能使用 vue-cli-service build,那是编译网站的。我们目的是打包组件,使用 tsc 即可。其实就是生成 js 和 map,我的tsconfig.json 配置如下。

  "compilerOptions": 
    "target": "esnext",
    "module": "esnext",
    "strict": false,
    "jsx": "preserve",
    "importHelpers": true,
    "moduleResolution": "node",
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "sourceMap": true,
    "baseUrl": ".",
    "outDir": "./dist",
    "types": ["webpack-env"],
    "paths": 
      "@/*": ["src/*"]
    ,
    "lib": ["esnext", "dom", "dom.iterable", "scripthost"]
  ,
  "include": [
    "src/**/*.ts",
    "src/**/*.tsx",
    "src/**/*.vue",
    "tests/**/*.ts",
    "tests/**/*.tsx"
  ],

  "exclude": ["node_modules", "dist"]

其中的 include "src/**/*.vue", 其实没作用,因为 tsc 只管 js/ts/json 的编译,其他文件它不处理的。那么问题来了——打包就需要 *.vue 文件,——我搜索了很久终于找到一个比较简单的方法,就是直接复制过去。package.json 增加一个 scripts 命令:

"release": "tsc && xcopy src\\\\components dist\\\\components /s /y /d && npm publish --access public",

tsc 编译后通过 DOS 命令 xcopy 复制目录,/s 表示包含所有子目录和文件, /y 表示不确认并进行覆盖,/d 表示文件日期对比,日期较新的不覆盖。

另外,tsc 不会覆盖现有文件,所以最好先删除一下 dist 目录再 npm run release

Vue 中单页面组件中 render 函数不运行?

要用 render 函数,把 <template> 给去掉。https://segmentfault.com/q/1010000016677825

简单使得元素可拖动

/**
 * 使得面板浮动,可拖放
 */
export default function float() 
    setTimeout(() => 
        let el: HTMLElement = this.$el;
        let rect: DOMRect = el.getBoundingClientRect();

        let controls: HTMLElement = (<HTMLElement>el.querySelector('.controls'));
        let top: number = rect.top - el.offsetTop;
        let left: number = rect.left - el.offsetLeft - controls.offsetWidth - 10;
        let style: CSSStyleDeclaration = controls.style;

        style.top = top + 'px';
        style.left = left + 'px';

        makeDD(controls, <HTMLElement>controls.querySelector('.movable'));

        let btns: HTMLElement = (<HTMLElement>el.querySelector('.btns'));
        top = rect.top - el.offsetTop - btns.offsetHeight - 10;
        left = rect.left - el.offsetLeft;
        style = btns.style;

        style.top = top + 'px';
        style.left = left + 'px';

        makeDD(btns, <HTMLElement>btns.querySelector('.movable'));
    , 10);


/**
 * 拖放
 * 
 * @param box       被拖放的区域
 * @param dragBar   拖放的按钮
 */
function makeDD(box: HTMLElement, dragBar: HTMLElement): void 
    // 鼠标按下的函数
    dragBar.onmousedown = function (oEvent: MouseEvent) 
        // 求出鼠标和box的位置差值
        let x: number = oEvent.clientX - box.offsetLeft, y: number = oEvent.clientY - box.offsetTop;

        // 鼠标移动的函数
        // 把事件加在document上,解决因为鼠标移动太快时,鼠标超过box后就没有了拖拽的效果的问题
        document.onmousemove = function (oEvent: MouseEvent) 
            // 只能拖动窗口标题才能移动
            if (oEvent.target != dragBar) 
                // return;
            

            // 保证拖拽框一直保持在浏览器窗口内部,不能被拖出的浏览器窗口的范围
            let l: number = oEvent.clientX - x, t = oEvent.clientY - y;
            let doc: HTMLElement = document.documentElement;

            if (l < 0)
                l = 0;
            else if (l > doc.clientWidth - box.offsetWidth)
                l = doc.clientWidth - box.offsetWidth;


            if (t < 0)
                t = 0;
            else if (t > doc.clientHeight - box.offsetHeight)
                t = doc.clientHeight - box.offsetHeight;

            box.style.left = l + "px";
            box.style.top = t + "px";
        

        // 鼠标抬起的函数
        document.onmouseup = function () 
            document.onmousemove = document.onmouseup = null;
        

        // 火狐浏览器在拖拽空div时会出现 bug return false阻止默认事件,解决火狐的bug
        return false;
    

Spring MVC 加入 JSP 支持

/WEB-INF/jsp/ .jsp

解决烦人的 sockjs-node/info 跨域问题

打开 build/webpack.conf.js

const config = 
  resolve: 
    alias: 

    
  ,
  devServer: 
    // host: 'localhost',
    disableHostCheck: true,
    public: '0.0.0.0'
  ,
;

module.exports = config;

JSP 页面异常

JSP 需要加上下面代码,运行时才不会出现 java.lang.IllegalStateException: getOutputStream() has already been called …等异常。

/**
 *
 * @param ctx 页面上下文
 */
public static void fix(PageContext ctx) 
    HttpServletResponse response = (HttpServletResponse) ctx.getResponse();

    try 
        OutputStream out = response.getOutputStream();
        out.flush();
        out.close();
        response.flushBuffer();
        ctx.getOut().clear();
        ctx.pushBody();
        // out = pageContext.pushBody();
     catch (IOException e) 
        LOGGER.warning(e);
    

参考 JSP 内置对象 out 和 response.getWrite() 的区别

  • http://blog.sina.com.cn/s/blog_7217e4320101l8gq.html
  • http://www.2cto.com/kf/201109/103284.html

响应禁止缓存

/**
 * 新的输出,不要缓存
 *
 * @return 当前对象
 */
public MvcOutput noCache() 
	setHeader("Pragma", "No-cache");
	setHeader("Cache-Control", "no-cache");
	setDateHeader("Expires", 0);

	return this;

返回到前一页并刷新

window.location = document.referrer;

静态的错误提示页

<title>操作错误</title>
<meta charset="utf-8" />
<div style="height: 100%%; display: flex; justify-content: center; align-items: center;">
  <table>
    <tr>
      <td align="center"> <svg width="150px" viewBox="0 0 1000 1000">
          <g>
            <path fill="#ea8010" d="M500,10c-46.7,0-84.5,38-84.5,84.9v573.7c0,46.9,37.8,84.9,84.5,84.9c46.7,0,84.5-38,84.5-84.9V94.9C584.5,48,546.7,10,500,10z M500,821c-46.7,0-84.5,37.8-84.5,84.5c0,46.7,37.8,84.5,84.5,84.5c46.7,0,84.5-37.8,84.5-84.5C584.4,858.9,546.6,821,500,821z" />
          </g>
        </svg></td>
    </tr>
    <tr>
      <td align="center"><br />%s<br /><a href="javascript:history.go(-1);">返回</a></td>
    </tr>
  </table>
</div>

随时随地获取 Request/Response

为获取请求的上下文,能够在控制器中拿到最常用的对象,例如 HttpServletRequestHttpServletResponse 等的对象(甚至 Web App 的启动上下文( 在 web.xml 中配置的参数)),因此还需要设计一个 RequestHelper 类,通过 ThreadLocal 让控制器能轻易地访问到这些对象。

一个容器,向这个容器存储的对象,在当前线程范围内都可以取得出来,向 ThreadLocal 里面存东西就是向它里面的 Map 存东西的,然后 ThreadLocal 把这个 Map 挂到当前的线程底下,这样 Map 就只属于这个线程了。

private static ThreadLocal<HttpServletRequest> threadLocalRequest = new ThreadLocal<>();

private static ThreadLocal<HttpServletResponse> threadLocalResponse = new ThreadLocal<>();

/**
 * 保存一个 request 对象
 *
 * @param req 请求对象
 */
public static void setHttpServletRequest(HttpServletRequest req) 
	threadLocalRequest.set(req每天一剂开发良药

深度学习已至“瓶颈”?英特尔:数据处理是一剂良药

WebSocket 解决javascript跨域问题一剂良药

“蓝色巨人”转向,极氪会是吉利的一剂“良药”吗?

机票搭售暴露了OTA们的无奈,服务费或是一剂良药

从开源自治,到微服务云化,阿里云的这款产品给了一剂提升微服务幸福感的良药