Browse Source

添加sql执行脚本,扫码插件代码

master
chengkun 2 years ago
parent
commit
1895dce67f
  1. 74
      pages/history/History.vue
  2. 120
      pages/scan/Scan.nvue
  3. 492
      utils/database.js

74
pages/history/History.vue

@ -8,17 +8,89 @@
</template> </template>
<script> <script>
import { openSqlite,closedb,getPageList,updateSql} from "@/utils/database";
export default { export default {
data() { data() {
return { return {
title: 'Hello' title: 'History',
tableName:"scancode",
options:{
current:1, // 1
size:10,
},
list:[],
pages:0,
total:0,
} }
}, },
onLoad() { onLoad() {
},
async onShow(){
await this.openSqlite()
}, },
methods: { methods: {
//
async openSqlite(){
try{
let b = await openSqlite()
uni.showToast({
title:"open db success",
icon:"none"
})
}catch(e){
console.error("open db error",e)
}
},
//
closedb(){
try{
closedb()
}catch(e){
console.error("close db error",e)
}
},
//
async getData(){
try{
let where = {}
let res = await getPageList(this.tableName,this.options,where,"fid desc")
console.log("加载数据",res)
this.list = res.data.data.records
this.pages = res.data.data.pages
this.total = res.data.data.total
}catch(e){
uni.showToast({
title:"报错,请查看控制台",
icon:"none"
});
console.error("报错",e)
}
},
//
async changeData(){
// fid id
try{
let res = await getPageList(this.tableName,{current:1,size:1},{},"fid desc")
console.log("最后一页数据",res.data.data)
await updateSql(this.tableName,{title:"updated data"},{fid:res.data.data.records[0].fid})
uni.showToast({
title:"update ok",
icon:"none"
});
}catch(e){
uni.showToast({
title:"update error",
icon:"none"
});
console.error("修改报错",e)
}
},
} }
} }
</script> </script>

120
pages/scan/Scan.nvue

@ -17,15 +17,18 @@
<tn-button type="primary" @click="scanCode()">扫码</tn-button> <tn-button type="primary" @click="scanCode()">扫码</tn-button>
<tn-button type="primary" @click="testAdd">相加</tn-button> <tn-button type="primary" @click="testAdd">相加</tn-button>
<tn-button type="primary" @click="writeToDb()">添加数据</tn-button>
<tn-toast ref="toast"></tn-toast> <tn-toast ref="toast"></tn-toast>
</view> </view>
</template> </template>
<script> <script>
import { openSqlite,executeSql,closedb,isTable,addSql} from "@/utils/database";
export default { export default {
data() { data() {
return { return {
title: 'Scan' title: 'Scan',
tableName:"scancode",
} }
}, },
created() { created() {
@ -45,6 +48,71 @@
}) })
}) })
}, },
//写入扫描记录
async writeToDb(){
try{
let b = await addSql(this.tableName,{title:"你好,世界!",content:"世界:你好呀!",desc:"嘻嘻"})
uni.showToast({
title:"添加成功",
icon:"none"
});
}catch(e){
console.error("insert data error!",e)
}
},
// 创建表
async createTable(){
let sql = this.createTableSql_outbound()
try{
let exist = await isTable(this.tableName)
console.log("表是否存在",exist)
if(!exist){
let res = await executeSql(sql)
uni.showToast({
title:"insert table ok",
icon:"none"
})
console.log("新增表scancode",res)
}else{
uni.showToast({
title:"table exist",
icon:"none"
})
}
}catch(e){
uni.showToast({
title:"insert table error",
icon:"none"
})
console.error("新增表报错scancode",e)
}
},
// 打开数据库
async openSqlite(){
try{
let b = await openSqlite()
uni.showToast({
title:"open db success",
icon:"none"
})
}catch(e){
console.error("open db error",e)
}
},
// 关闭数据库
closedb(){
try{
closedb()
}catch(e){
console.error("close db error",e)
}
},
//根据扫码返回结果判断跳转到哪个指定页面 //根据扫码返回结果判断跳转到哪个指定页面
jumpToPage(url){ jumpToPage(url){
uni.navigateTo({ uni.navigateTo({
@ -52,37 +120,43 @@
}); });
}, },
//扫码 //阿里扫描
// scanCode() { // scanCode() {
// // 允许从相机和相册扫码 // var mpaasScanModule = uni.requireNativePlugin("Mpaas-Scan-Module")
// uni.scanCode({ // mpaasScanModule.mpaasScan({
// success: function (res) { // // 扫码识别类型,参数可多选,qrCode、barCode,不设置,默认识别所有
// console.log(JSON.stringify(res)) // // 'scanType': ['qrCode', 'barCode'],
// console.log('条码类型:' + res.scanType); // // 是否隐藏相册,默认false不隐藏
// console.log('条码内容:' + res.result); // 'hideAlbum': false,
// } // },
// (ret) => {
// console.log(JSON.stringify(ret))
// this.$refs.toast.show({
// title: '支付成功',
// content: JSON.stringify(ret),
// icon: 'success',
// duration: 2000
// }); // });
// } // console.log('24123123')
// })
// },
//mlkit扫码
scanCode(){ scanCode(){
var mpaasScanModule = uni.requireNativePlugin("Mpaas-Scan-Module") var mlscan = uni.requireNativePlugin("JY-MLScanSDK");
mpaasScanModule.mpaasScan({ mlscan.startScan(res=> {
// 扫码识别类型,参数可多选,qrCode、barCode,不设置,默认识别所有 // uni.showToast({
// 'scanType': ['qrCode', 'barCode'], // icon:'none',
// 是否隐藏相册,默认false不隐藏 // title:JSON.stringify(res)
'hideAlbum': false, // })
},
(ret) => {
console.log(JSON.stringify(ret))
this.$refs.toast.show({ this.$refs.toast.show({
title: '支付成功', title: 'scan success',
content: JSON.stringify(ret), content: JSON.stringify(res),
icon: 'success', icon: 'success',
duration: 2000 duration: 2000
}); });
console.log('24123123')
}) })
}, }
} }
} }
</script> </script>

492
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<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…
Cancel
Save