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
+}