12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- // 转化Sql 函数 传入 "select * from table <if test=\"id != null and id != ''\"> id = ${id} </if>" 这样的字符串
- // data 传入 {id: ''} 这样的数据, 如果 id != null && id != '' 那么就生成 select * from table
- // 如果 data 传入 {id: '123'}, 这样的数据那么就生成 select * from table where id = '123'
- function dynamicJudgment(testReg: string, data: any, dataStr: string) {
- let funcStr = `${dataStr}\nreturn ${testReg}`
- let func = new Function('data', 'testReg', funcStr)
- try {
- return func(data, testReg)
- } catch (e) {
- return false
- }
- }
- /**
- * 把 data 中的 key 变成了
- * var {id, name} = data
- * @param data 数据
- * @returns {string} 返回字符串
- */
- function getDataParam(data: any): string {
- let dataParam = ''
- for (let key in data) {
- dataParam += `${key},`
- }
- dataParam = dataParam.substring(0, dataParam.length - 1)
- // 这个是把 data 中的 key 给解析出来
- dataParam = 'var {' + dataParam + '} = ' + 'data'
- return dataParam
- }
- /**
- * 把 sql 像 mybatis 一样动态拼接
- * @param {string} sqlStr sql 字符串
- * @param {any} data 需要填充的数据
- * @returns {string} 返回sql
- */
- const convertSql = (sqlStr: string, data: any): string => {
- // 去除掉 字符串中的换行,不然 sqlStr.match(reg) 会返回 null
- sqlStr = sqlStr.replace(/[\r\n]/g, ' ')
- let reg = /<if test="(.+?)">(.+?)<\/if>/g
- let arr = sqlStr.match(reg)
- let dataParam = getDataParam(data)
- if (arr) {
- arr.forEach(item => {
- // '<if test="id != null and id != \'\'"> id = ${id} </if>
- // 获取 test =" 里面的内容
- let testReg = item.match(/test="(.+?)"/)[1]
- // 把 and 换成 && 把 or 换成 || 这样 js 才能判断
- testReg = testReg.replace(/\band\b/g, ' && ').replace(/\bor\b/g, ' || ')
- // 获取到 <if test="id != null and id != \'\'"> id = ${id} </if>
- // 被 if 包裹的元素
- if (dynamicJudgment(testReg, data, dataParam)) {
- let dataStr = item.match(/<if test="(.+?)">(.+?)<\/if>/)[2]
- sqlStr = sqlStr.replace(item, dataStr)
- } else {
- sqlStr = sqlStr.replace(item, '')
- }
- })
- }
- let 填充数据 = new Function('data', 'sqlStr', `${dataParam} \n return \`${sqlStr}\``)
- return 填充数据(data, sqlStr)
- }
- export default convertSql
|