diff --git a/pages/history/History.vue b/pages/history/History.vue index ec0ec26..4667e98 100644 --- a/pages/history/History.vue +++ b/pages/history/History.vue @@ -8,17 +8,89 @@ diff --git a/pages/scan/Scan.nvue b/pages/scan/Scan.nvue index d65b9bb..177df92 100644 --- a/pages/scan/Scan.nvue +++ b/pages/scan/Scan.nvue @@ -17,15 +17,18 @@ 扫码 相加 + 添加数据 diff --git a/utils/database.js b/utils/database.js new file mode 100644 index 0000000..caed847 --- /dev/null +++ b/utils/database.js @@ -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} + */ +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} + */ +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} + */ +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} + */ +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 +}