3 changed files with 671 additions and 33 deletions
@ -0,0 +1,492 @@ |
|||
//打开数据库(创建数据库或者有该数据库就打开)
|
|||
var name = "scancode" // 数据库名称
|
|||
|
|||
// 防止数据中的 单引号 报错
|
|||
export function html2Escape(str) { |
|||
// console.log("str",str,typeof str)
|
|||
if(typeof str === "string"){ |
|||
return str.replace(/'/g, "''"); |
|||
}else if(typeof str === "object"){ |
|||
return JSON.stringify(str).replace(/'/g, "''"); |
|||
}else{ |
|||
return str |
|||
} |
|||
|
|||
} |
|||
|
|||
export async function openSqlite(){ |
|||
//创建数据库或者打开
|
|||
//这plus.sqlite只在手机上运行
|
|||
return new Promise((resolve,reject) =>{ |
|||
if(isOpen()){ |
|||
// console.log("数据库已经打开了")
|
|||
resolve("数据库已经打开"); |
|||
return true |
|||
} |
|||
// console.log("开始打开数据库")
|
|||
plus.sqlite.openDatabase({ |
|||
name, //数据库名称
|
|||
path:`_doc/${name}.db`, //数据库地址,uniapp推荐以下划线为开头,这到底存在哪里去了,我也不清楚,哈哈
|
|||
success(){ |
|||
// console.log("成功打开数据库")
|
|||
resolve(); //成功回调
|
|||
}, |
|||
fail(e){ |
|||
// console.log("失败打开数据库",e)
|
|||
reject(e); //失败回调
|
|||
} |
|||
}) |
|||
}) |
|||
} |
|||
//判断数据库是否打开
|
|||
export function isOpen(){ |
|||
//数据库打开了就返回true,否则返回false
|
|||
var open = plus.sqlite.isOpenDatabase({ |
|||
name, |
|||
path: `_doc/${name}.db` |
|||
}) |
|||
return open; |
|||
} |
|||
//关闭数据库
|
|||
export function closedb(){ |
|||
return new Promise((resolve,reject) =>{ |
|||
plus.sqlite.closeDatabase({ |
|||
name, |
|||
success(e){ |
|||
resolve(e); |
|||
}, |
|||
fail(e){ |
|||
reject(e); |
|||
} |
|||
}) |
|||
}) |
|||
} |
|||
// 执行sql语句
|
|||
export function executeSql(sql){ |
|||
return new Promise((resolve,reject) =>{ |
|||
//创建表格在executeSql方法里写
|
|||
// console.log("开始执行自定义sql",sql)
|
|||
plus.sqlite.executeSql({ |
|||
name, |
|||
//表格创建或者打开,后面为表格结构
|
|||
sql:sql, |
|||
success(e){ |
|||
resolve(e); |
|||
}, |
|||
fail(e){ |
|||
console.error("自定义sql报错",e) |
|||
reject(e); |
|||
} |
|||
}) |
|||
}) |
|||
} |
|||
// 查询所有数据表名
|
|||
export async function getTable(){ |
|||
return selectSql("select * FROM sqlite_master where type='table'") |
|||
} |
|||
// 获取表的所有字段
|
|||
export async function getAllField(tableName){ |
|||
return selectSql(`PRAGMA table_info([${tableName}])`) |
|||
} |
|||
|
|||
// 查询表数据总条数
|
|||
export const getCount = (tableName,whereObj={}) => { |
|||
let sql = `select count(*) as num from ${tableName} where 1 ` |
|||
if(Object.keys(whereObj).length>0){ |
|||
for(let i in whereObj){ |
|||
sql += ` and ${i} = '${whereObj[i]}' ` |
|||
} |
|||
} |
|||
console.log("getCount的SQL",sql) |
|||
return selectSql(sql) |
|||
} |
|||
// 查询表是否存在
|
|||
export const isTable = (tableName) => { |
|||
return new Promise((resolve, reject) => { |
|||
plus.sqlite.selectSql({ |
|||
name: name, |
|||
sql: `select count(*) as isTable FROM sqlite_master where type='table' and name='${tableName}'`, |
|||
success(e) { |
|||
resolve(e[0].isTable ? true : false); |
|||
}, |
|||
fail(e) { |
|||
console.log(e) |
|||
reject(e); |
|||
} |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
// 添加数据
|
|||
export async function addSql(tableName,obj={}) { |
|||
|
|||
if (Object.keys(obj).length>0) { |
|||
// 获取数据库的字段
|
|||
let fieldList = await getAllField(tableName) |
|||
// 取数据库有的字段
|
|||
let keys = intersection(fieldList,obj) |
|||
let keyStr = keys.toString() |
|||
let valStr = '' |
|||
keys.forEach((item, index) => { |
|||
valStr += (`'${html2Escape(obj[item])}',`) |
|||
}) |
|||
valStr = valStr.substring(0,valStr.length-1) |
|||
let sqlStr = `insert into ${tableName}(${keyStr}) values(${valStr})` |
|||
console.log("addSql",sqlStr) |
|||
return executeSql(sqlStr) |
|||
} else { |
|||
return new Promise((resolve, reject) => { |
|||
reject("错误") |
|||
}) |
|||
} |
|||
} |
|||
|
|||
|
|||
// 修改数据
|
|||
export async function updateSql(tableName, setData, whereObj={}){ |
|||
if(!Object.keys(whereObj).length){ |
|||
return new Promise((resolve, reject) => { |
|||
reject("请传whereObj") |
|||
}); |
|||
return false |
|||
} |
|||
if (setData&&JSON.stringify(setData) !== '{}') { |
|||
// 获取数据库的字段
|
|||
let fieldList = await getAllField(tableName) |
|||
let dataKeys = intersection(fieldList,setData) |
|||
let setStr = '' |
|||
// console.log("dataKeys",tableName,dataKeys)
|
|||
dataKeys.forEach((item, index) => { |
|||
// console.log(setData[item])
|
|||
setStr += ( |
|||
`${item} = '${setData[item]}',`) |
|||
}) |
|||
setStr = setStr.substring(0,setStr.length-1) |
|||
let sql = `update ${tableName} set ${setStr} where 1 ` |
|||
for(let i in whereObj){ |
|||
sql += ` and ${i} = '${whereObj[i]}' ` |
|||
} |
|||
// console.log("修改数据的sql",sql)
|
|||
return executeSql(sql) |
|||
} else { |
|||
return new Promise((resolve, reject) => { |
|||
reject("错误") |
|||
}); |
|||
} |
|||
} |
|||
|
|||
//删除数据库数据
|
|||
export async function deleteSql(tableName,whereObj={}){ |
|||
if (tableName&&JSON.stringify(whereObj) !== '{}') { |
|||
let dataKeys = Object.keys(whereObj) |
|||
let setStr = '' |
|||
dataKeys.forEach((item, index) => { |
|||
console.log(whereObj[item]) |
|||
setStr += ( |
|||
`${item}='${whereObj[item]}' ${dataKeys.length - 1 !== index ? " and " : ""}`) |
|||
}) |
|||
console.log("删除sql",`-- delete from ${tableName} where ${setStr}`) |
|||
let sql = `delete from ${tableName} where ${setStr}` |
|||
return executeSql(sql) |
|||
} else { |
|||
return new Promise((resolve, reject) => { |
|||
reject("错误") |
|||
}); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 获取分页数据库数据 |
|||
* @param tableName 表名称 |
|||
* @param pageObj 分页数据,如 {current:1,size:10} |
|||
* @param whereObj 查询 |
|||
* @param orderBy 排序 |
|||
* @returns {Promise<unknown>} |
|||
*/ |
|||
export const getPageList = async (tableName,pageObj,whereObj={},orderBy) => { |
|||
// console.log("数据库",tableName,pageObj,whereObj,orderBy)
|
|||
let current = parseInt(pageObj.current) |
|||
let size = parseInt(pageObj.size) |
|||
// console.log("数据库11")
|
|||
let pages = 0,total = 0 // pages为总页数,total为总数据条数
|
|||
let sql = '' |
|||
let numindex = 0 |
|||
await getCount(tableName,whereObj).then((resNum) => { |
|||
console.log("resNum",resNum,size) |
|||
pages = Math.ceil(resNum[0].num / size) |
|||
total = resNum[0].num |
|||
}) |
|||
if(((current - 1) * size) == 0) { |
|||
numindex = 0 |
|||
} else { |
|||
numindex = ((current - 1) * size) + 1 |
|||
} |
|||
sql = `select * from ${tableName} where 1 ` |
|||
if(Object.keys(whereObj).length>0){ |
|||
for(let i in whereObj){ |
|||
sql += ` and ${i} = '${whereObj[i]}' ` |
|||
} |
|||
} |
|||
if(orderBy) { |
|||
sql += ` order by ${orderBy} ` |
|||
} |
|||
sql += ` limit ${numindex},${size}` |
|||
console.log("分页sql,",sql) |
|||
if (pages < current - 1) { |
|||
return new Promise((resolve, reject) => { |
|||
reject("无数据") |
|||
}); |
|||
} else { |
|||
return new Promise((resolve, reject) => { |
|||
plus.sqlite.selectSql({ |
|||
name: name, |
|||
sql:sql , |
|||
success(e) { |
|||
resolve({ |
|||
code:0, |
|||
data:{ |
|||
data:{ |
|||
records:e, |
|||
pages, |
|||
total |
|||
} |
|||
}, |
|||
msg:null |
|||
}); |
|||
}, |
|||
fail(e) { |
|||
reject({data:e,code:500,msg:e}); |
|||
} |
|||
}) |
|||
}) |
|||
} |
|||
} |
|||
/** |
|||
* 自定义语句查询,数据库数据 |
|||
* @param sql sql语句 |
|||
* @returns {Promise<any>} |
|||
*/ |
|||
export const selectSql = (sql) => { |
|||
// console.log("查询的sql",sql)
|
|||
return new Promise((resolve, reject) => { |
|||
plus.sqlite.selectSql({ |
|||
name: name, |
|||
sql: sql, |
|||
success(e) { |
|||
resolve(e); |
|||
}, |
|||
fail(e) { |
|||
console.log("查询报错",e) |
|||
reject(e); |
|||
} |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
/** |
|||
* 查询数据库数据 |
|||
* @param tableName 表名 |
|||
* @param searchObj 查询的对象 |
|||
* @param orderBy 排序, 如 "id desc" |
|||
* @param selectStr |
|||
* @returns {Promise<any>} |
|||
*/ |
|||
export const selectList = (tableName,searchObj={},orderBy="") => { |
|||
let setStr = '' |
|||
let sql = '' |
|||
if (tableName) { |
|||
if (JSON.stringify(searchObj) !== '{}') { |
|||
let dataKeys = Object.keys(searchObj) |
|||
dataKeys.forEach((item, index) => { |
|||
// console.log(searchObj[item])
|
|||
setStr += ( |
|||
`${item}='${html2Escape(searchObj[item])}' ${dataKeys.length - 1 !== index ? " and " : ""}`) |
|||
}) |
|||
} |
|||
sql = `select * from ${tableName} ` |
|||
sql += setStr ? ` where ${setStr} ` : "" |
|||
|
|||
if(orderBy) { |
|||
sql += ` order by ${orderBy} ` |
|||
} |
|||
console.log("查询数据库数据",sql) |
|||
return selectSql(sql) |
|||
} else { |
|||
return new Promise((resolve, reject) => { |
|||
reject("错误") |
|||
}); |
|||
} |
|||
} |
|||
|
|||
|
|||
//将SQL语句进行拼接values(),()...然后再一次性插入,
|
|||
export async function insertAll(tableName="",data=[]){ |
|||
let sql = "" |
|||
// 获取数据库的字段
|
|||
try{ |
|||
let fieldList = await getAllField(tableName) |
|||
// console.log("fieldList",fieldList)
|
|||
if (tableName && data.length > 0) { |
|||
// 取交集的字段,才是合法的,能存进数据库的字段(注意:取的字段,是按照第一条数据的字段,进行赋值的)
|
|||
let keys = intersection(fieldList,data[0]) |
|||
let keyStr = keys.toString() |
|||
console.log("keyStr",keyStr) |
|||
|
|||
sql = `insert into ${tableName} (${keyStr}) values`; |
|||
for (let i = 0; i < data.length; i++) { |
|||
sql += "("; |
|||
for (const [k, v] of keys.entries()) { |
|||
// console.log("data[i][v]",k,v,data[i][v],data)
|
|||
sql += `'${html2Escape(data[i][v])}',` |
|||
} |
|||
sql = sql.substring(0, sql.length - 1) |
|||
sql += "),"; |
|||
} |
|||
sql = sql.substring(0, sql.length - 1) |
|||
console.log("批量插入的sql", sql) |
|||
} else { |
|||
this.$msg("表名为空或者插入数据为空") |
|||
} |
|||
}catch(e){ |
|||
console.error("批量插入报错",e) |
|||
} |
|||
return executeSql(sql) |
|||
} |
|||
|
|||
/** |
|||
* 批量修改 data数组 field关键字段 批量修改函数 传参方式 |
|||
* @param tableName 表名 |
|||
* @param data 需要修改的数据 |
|||
* @param field 表主键字段,通常是 id |
|||
* @returns {Promise<unknown>} |
|||
*/ |
|||
export async function batchUpdate(tableName='',data=[],field=''){ |
|||
|
|||
let sql = "" |
|||
let con = []; |
|||
let con_sql = []; |
|||
let fields = []; |
|||
let value |
|||
let temp |
|||
try{ |
|||
|
|||
if (!tableName || !data || !field) { |
|||
return false; |
|||
} else { |
|||
sql = 'UPDATE ' + tableName; |
|||
} |
|||
|
|||
for (let key in data) { |
|||
value = data[key] |
|||
let x = 0; |
|||
let v |
|||
// console.log("value",value)
|
|||
for (let k in value) { |
|||
v = value[k] |
|||
if (k != field && !con[x] && x == 0) { |
|||
con[x] = ` set ${k} = (CASE ${field} `; |
|||
} else if (k != field && !con[x] && x > 0) { |
|||
con[x] = ` ${k} = (CASE ${field} `; |
|||
} |
|||
if (k != field) { |
|||
temp = value[field]; |
|||
con_sql[x] = con_sql[x] ? con_sql[x] : "" |
|||
con_sql[x] += ` WHEN '${temp}' THEN '${html2Escape(v)}' `; |
|||
x++; |
|||
} |
|||
} |
|||
temp = value[field]; |
|||
// console.log("temp",fields,temp)
|
|||
if (fields.indexOf(temp)===-1) { |
|||
fields.push(temp) |
|||
} |
|||
} |
|||
let num = con.length - 1; |
|||
for (let [key, value] of con.entries()) { |
|||
for (let [k, v] of con_sql.entries()) { |
|||
if (k == key && key < num) { |
|||
sql += value + v + ' end),'; |
|||
} else if (k == key && key == num) { |
|||
sql += value + v + ' end)'; |
|||
} |
|||
} |
|||
} |
|||
let str = fields.join(","); |
|||
sql += ` where ${field} in(${str})`; |
|||
console.log("批量更新的sql", sql) |
|||
|
|||
|
|||
}catch(e){ |
|||
console.error("批量修改报错",e) |
|||
} |
|||
return executeSql(sql) |
|||
} |
|||
|
|||
|
|||
|
|||
//////////////////////////////////////////////////////////////////////
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
// 合并数据
|
|||
export const mergeSql = (name,tableName,tabs) => { |
|||
if (!tabs || tabs.length == 0) { |
|||
return new Promise((resolve, reject) => { |
|||
reject("错误") |
|||
}) |
|||
} |
|||
let itemValStr = '' |
|||
tabs.forEach((item, index) => { |
|||
let itemKey = Object.keys(item) |
|||
let itemVal = '' |
|||
itemKey.forEach((key, i) => { |
|||
if (itemKey.length - 1 == i) { |
|||
if (typeof item[key] == 'object') { |
|||
itemVal += (`'${JSON.stringify(item[key])}'`) |
|||
} else { |
|||
itemVal += (`'${item[key]}'`) |
|||
} |
|||
} else { |
|||
if (typeof item[key] == 'object') { |
|||
itemVal += (`'${JSON.stringify(item[key])}',`) |
|||
} else { |
|||
itemVal += (`'${item[key]}',`) |
|||
} |
|||
} |
|||
}) |
|||
if (tabs.length - 1 == index) { |
|||
itemValStr += ('(' + itemVal + ')') |
|||
} else { |
|||
itemValStr += ('(' + itemVal + '),') |
|||
} |
|||
}) |
|||
let keys = Object.keys(tabs[0]) |
|||
let keyStr = keys.toString() |
|||
let sql = `insert or ignore into ${tableName} (${keyStr}) values ${itemValStr}` |
|||
return executeSql(sql) |
|||
} |
|||
/** |
|||
* 过滤非数据表的字段,使其不报错 |
|||
* @param fieldList ,使用 getAllField()函数查询出来的数据 |
|||
* @param obj 数据 |
|||
* @returns [] |
|||
*/ |
|||
export function intersection(fieldList=[],obj){ |
|||
// 获取数据库的字段
|
|||
let arrField = {} |
|||
for(let i in fieldList){ |
|||
arrField[fieldList[i].name] = null |
|||
} |
|||
// 取交集的字段,才是合法的,能存进数据库的字段
|
|||
let keys = [] |
|||
for (let i in arrField) { |
|||
if (obj.hasOwnProperty(i)) { |
|||
keys.push(i) |
|||
} |
|||
} |
|||
|
|||
return keys |
|||
} |
|||
Loading…
Reference in new issue