Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

database.js 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497
  1. //打开数据库(创建数据库或者有该数据库就打开)
  2. var name = "unupload" // 数据库名称
  3. // 防止数据中的 单引号 报错
  4. export function html2Escape(str) {
  5. // console.log("str",str,typeof str)
  6. if(typeof str === "string"){
  7. return str.replace(/'/g, "''");
  8. }else if(typeof str === "object"){
  9. return JSON.stringify(str).replace(/'/g, "''");
  10. }else{
  11. return str
  12. }
  13. }
  14. export async function openSqlite(){
  15. //创建数据库或者打开
  16. //这plus.sqlite只在手机上运行
  17. return new Promise((resolve,reject) =>{
  18. if(isOpen()){
  19. // console.log("数据库已经打开了")
  20. resolve("数据库已经打开");
  21. return true
  22. }
  23. // console.log("开始打开数据库")
  24. plus.sqlite.openDatabase({
  25. name, //数据库名称
  26. path:`_documents/${name}.db`, //数据库地址,uniapp推荐以下划线为开头,这到底存在哪里去了,我也不清楚,哈哈
  27. success(){
  28. // console.log("成功打开数据库")
  29. resolve(); //成功回调
  30. },
  31. fail(e){
  32. // console.log("失败打开数据库",e)
  33. reject(e); //失败回调
  34. }
  35. })
  36. })
  37. }
  38. //判断数据库是否打开
  39. export function isOpen(){
  40. //数据库打开了就返回true,否则返回false
  41. var open = plus.sqlite.isOpenDatabase({
  42. name,
  43. path: `_documents/${name}.db`
  44. })
  45. return open;
  46. }
  47. //关闭数据库
  48. export function closedb(){
  49. return new Promise((resolve,reject) =>{
  50. plus.sqlite.closeDatabase({
  51. name,
  52. success(e){
  53. resolve(e);
  54. },
  55. fail(e){
  56. reject(e);
  57. }
  58. })
  59. })
  60. }
  61. // 执行sql语句
  62. export function executeSql(sql){
  63. return new Promise((resolve,reject) =>{
  64. //创建表格在executeSql方法里写
  65. //console.log("开始执行自定义sql",sql)
  66. plus.sqlite.executeSql({
  67. name,
  68. //表格创建或者打开,后面为表格结构
  69. sql:sql,
  70. success(e){
  71. resolve(e);
  72. },
  73. fail(e){
  74. console.error("自定义sql报错",sql)
  75. console.error("自定义sql报错",e)
  76. reject(e);
  77. }
  78. })
  79. })
  80. }
  81. // 查询所有数据表名
  82. export async function getTable(){
  83. return selectSql("select * FROM sqlite_master where type='table'")
  84. }
  85. // 获取表的所有字段
  86. export async function getAllField(tableName){
  87. return selectSql(`PRAGMA table_info([${tableName}])`)
  88. }
  89. // 查询表数据总条数
  90. export const getCount = (tableName,whereObj={}) => {
  91. let sql = `select count(*) as num from ${tableName} where 1 `
  92. if(Object.keys(whereObj).length>0){
  93. for(let i in whereObj){
  94. sql += ` and ${i} = '${whereObj[i]}' `
  95. }
  96. }
  97. console.log("getCount的SQL",sql)
  98. return selectSql(sql)
  99. }
  100. // 查询表是否存在
  101. export const isTable = (tableName) => {
  102. return new Promise((resolve, reject) => {
  103. plus.sqlite.selectSql({
  104. name: name,
  105. sql: `select count(*) as isTable FROM sqlite_master where type='table' and name='${tableName}'`,
  106. success(e) {
  107. resolve(e[0].isTable ? true : false);
  108. },
  109. fail(e) {
  110. console.log(e)
  111. reject(e);
  112. }
  113. })
  114. })
  115. }
  116. // 添加数据
  117. export async function addSql(tableName,obj={}) {
  118. if (Object.keys(obj).length>0) {
  119. // 获取数据库的字段
  120. let fieldList = await getAllField(tableName)
  121. // 取数据库有的字段
  122. let keys = intersection(fieldList,obj)
  123. let keyStr = keys.toString()
  124. let valStr = ''
  125. keys.forEach((item, index) => {
  126. valStr += (`'${html2Escape(obj[item])}',`)
  127. })
  128. valStr = valStr.substring(0,valStr.length-1)
  129. let sqlStr = `insert into ${tableName}(${keyStr}) values(${valStr})`
  130. //console.log("addSql",sqlStr)
  131. return executeSql(sqlStr)
  132. } else {
  133. return new Promise((resolve, reject) => {
  134. reject("错误")
  135. })
  136. }
  137. }
  138. // 修改数据
  139. export async function updateSql(tableName, setData, whereObj={}){
  140. if(!Object.keys(whereObj).length){
  141. return new Promise((resolve, reject) => {
  142. reject("请传whereObj")
  143. });
  144. return false
  145. }
  146. if (setData&&JSON.stringify(setData) !== '{}') {
  147. // 获取数据库的字段
  148. let fieldList = await getAllField(tableName)
  149. let dataKeys = intersection(fieldList,setData)
  150. let setStr = ''
  151. // console.log("dataKeys",tableName,dataKeys)
  152. dataKeys.forEach((item, index) => {
  153. // console.log(setData[item])
  154. setStr += (
  155. `${item} = '${setData[item]}',`)
  156. })
  157. setStr = setStr.substring(0,setStr.length-1)
  158. let sql = `update ${tableName} set ${setStr} where 1 `
  159. for(let i in whereObj){
  160. sql += ` and ${i} = '${whereObj[i]}' `
  161. }
  162. // console.log("修改数据的sql",sql)
  163. return executeSql(sql)
  164. } else {
  165. return new Promise((resolve, reject) => {
  166. reject("错误")
  167. });
  168. }
  169. }
  170. //删除数据库数据
  171. export async function deleteSql(tableName,whereObj={}){
  172. if (tableName&&JSON.stringify(whereObj) !== '{}') {
  173. let dataKeys = Object.keys(whereObj)
  174. let setStr = ''
  175. dataKeys.forEach((item, index) => {
  176. console.log(whereObj[item])
  177. setStr += (
  178. `${item}='${whereObj[item]}' ${dataKeys.length - 1 !== index ? " and " : ""}`)
  179. })
  180. console.log("删除sql",`-- delete from ${tableName} where ${setStr}`)
  181. let sql = `delete from ${tableName} where ${setStr}`
  182. return executeSql(sql)
  183. } else {
  184. return new Promise((resolve, reject) => {
  185. reject("错误")
  186. });
  187. }
  188. }
  189. /**
  190. * 获取分页数据库数据
  191. * @param tableName 表名称
  192. * @param pageObj 分页数据,如 {current:1,size:10}
  193. * @param whereObj 查询
  194. * @param orderBy 排序
  195. * @returns {Promise<unknown>}
  196. */
  197. export const getPageList = async (tableName,pageObj,whereObj={},orderBy) => {
  198. // console.log("数据库",tableName,pageObj,whereObj,orderBy)
  199. let current = parseInt(pageObj.current)
  200. let size = parseInt(pageObj.size)
  201. // console.log("数据库11")
  202. let pages = 0,total = 0 // pages为总页数,total为总数据条数
  203. let sql = ''
  204. let numindex = 0
  205. await getCount(tableName,whereObj).then((resNum) => {
  206. console.log("resNum",resNum,size)
  207. pages = Math.ceil(resNum[0].num / size)
  208. total = resNum[0].num
  209. })
  210. if(((current - 1) * size) == 0) {
  211. numindex = 0
  212. } else {
  213. numindex = ((current - 1) * size) + 1
  214. }
  215. sql = `select * from ${tableName} where 1 `
  216. if(Object.keys(whereObj).length>0){
  217. for(let i in whereObj){
  218. sql += ` and ${i} = '${whereObj[i]}' `
  219. }
  220. }
  221. if(orderBy) {
  222. sql += ` order by ${orderBy} `
  223. }
  224. sql += ` limit ${numindex},${size}`
  225. console.log("分页sql,",sql)
  226. if (pages < current - 1) {
  227. return new Promise((resolve, reject) => {
  228. reject("无数据")
  229. });
  230. } else {
  231. return new Promise((resolve, reject) => {
  232. plus.sqlite.selectSql({
  233. name: name,
  234. sql:sql ,
  235. success(e) {
  236. resolve({
  237. code:0,
  238. data:{
  239. data:{
  240. records:e,
  241. pages,
  242. total
  243. }
  244. },
  245. msg:null
  246. });
  247. },
  248. fail(e) {
  249. reject({data:e,code:500,msg:e});
  250. }
  251. })
  252. })
  253. }
  254. }
  255. /**
  256. * 自定义语句查询,数据库数据
  257. * @param sql sql语句
  258. * @returns {Promise<any>}
  259. */
  260. // #ifndef H5
  261. export const selectSql = (sql) => {
  262. // console.log("查询的sql",sql)
  263. return new Promise((resolve, reject) => {
  264. plus.sqlite.selectSql({
  265. name: name,
  266. sql: sql,
  267. success(e) {
  268. resolve(e);
  269. },
  270. fail(e) {
  271. console.log("查询报错",e)
  272. console.log("查询报错",sql)
  273. reject(e);
  274. }
  275. })
  276. })
  277. }
  278. // #endif
  279. /**
  280. * 查询数据库数据
  281. * @param tableName 表名
  282. * @param searchObj 查询的对象
  283. * @param orderBy 排序, 如 "id desc"
  284. * @param selectStr
  285. * @returns {Promise<any>}
  286. */
  287. export const selectList = (tableName,searchObj={},orderBy="") => {
  288. let setStr = ''
  289. let sql = ''
  290. if (tableName) {
  291. if (JSON.stringify(searchObj) !== '{}') {
  292. let dataKeys = Object.keys(searchObj)
  293. dataKeys.forEach((item, index) => {
  294. // console.log(searchObj[item])
  295. setStr += (
  296. `${item}='${html2Escape(searchObj[item])}' ${dataKeys.length - 1 !== index ? " and " : ""}`)
  297. })
  298. }
  299. sql = `select * from ${tableName} `
  300. sql += setStr ? ` where ${setStr} ` : ""
  301. if(orderBy) {
  302. sql += ` order by ${orderBy} `
  303. }
  304. console.log("查询数据库数据",sql)
  305. return selectSql(sql)
  306. } else {
  307. return new Promise((resolve, reject) => {
  308. reject("错误")
  309. });
  310. }
  311. }
  312. //将SQL语句进行拼接values(),()...然后再一次性插入,
  313. export async function insertAll(tableName="",data=[]){
  314. let sql = ""
  315. // 获取数据库的字段
  316. try{
  317. let fieldList = await getAllField(tableName)
  318. // console.log("fieldList",fieldList)
  319. if (tableName && data.length > 0) {
  320. // 取交集的字段,才是合法的,能存进数据库的字段(注意:取的字段,是按照第一条数据的字段,进行赋值的)
  321. let keys = intersection(fieldList,data[0])
  322. let keyStr = keys.toString()
  323. //console.log("keyStr",keyStr)
  324. sql = `insert into ${tableName} (${keyStr}) values`;
  325. for (let i = 0; i < data.length; i++) {
  326. sql += "(";
  327. for (const [k, v] of keys.entries()) {
  328. // console.log("data[i][v]",k,v,data[i][v],data)
  329. sql += `'${html2Escape(data[i][v])}',`
  330. }
  331. sql = sql.substring(0, sql.length - 1)
  332. sql += "),";
  333. }
  334. sql = sql.substring(0, sql.length - 1)
  335. console.log("批量插入的sql", sql)
  336. } else {
  337. this.$msg("表名为空或者插入数据为空")
  338. }
  339. }catch(e){
  340. console.error("批量插入报错",e)
  341. }
  342. return executeSql(sql)
  343. }
  344. /**
  345. * 批量修改 data数组 field关键字段 批量修改函数 传参方式
  346. * @param tableName 表名
  347. * @param data 需要修改的数据
  348. * @param field 表主键字段,通常是 id
  349. * @returns {Promise<unknown>}
  350. */
  351. export async function batchUpdate(tableName='',data=[],field=''){
  352. let sql = ""
  353. let con = [];
  354. let con_sql = [];
  355. let fields = [];
  356. let value
  357. let temp
  358. try{
  359. if (!tableName || !data || !field) {
  360. return false;
  361. } else {
  362. sql = 'UPDATE ' + tableName;
  363. }
  364. for (let key in data) {
  365. value = data[key]
  366. let x = 0;
  367. let v
  368. // console.log("value",value)
  369. for (let k in value) {
  370. v = value[k]
  371. if (k != field && !con[x] && x == 0) {
  372. con[x] = ` set ${k} = (CASE ${field} `;
  373. } else if (k != field && !con[x] && x > 0) {
  374. con[x] = ` ${k} = (CASE ${field} `;
  375. }
  376. if (k != field) {
  377. temp = value[field];
  378. con_sql[x] = con_sql[x] ? con_sql[x] : ""
  379. con_sql[x] += ` WHEN '${temp}' THEN '${html2Escape(v)}' `;
  380. x++;
  381. }
  382. }
  383. temp = value[field];
  384. // console.log("temp",fields,temp)
  385. if (fields.indexOf(temp)===-1) {
  386. fields.push(temp)
  387. }
  388. }
  389. let num = con.length - 1;
  390. for (let [key, value] of con.entries()) {
  391. for (let [k, v] of con_sql.entries()) {
  392. if (k == key && key < num) {
  393. sql += value + v + ' end),';
  394. } else if (k == key && key == num) {
  395. sql += value + v + ' end)';
  396. }
  397. }
  398. }
  399. let str = fields.join(",");
  400. sql += ` where ${field} in(${str})`;
  401. console.log("批量更新的sql", sql)
  402. }catch(e){
  403. console.error("批量修改报错",e)
  404. }
  405. return executeSql(sql)
  406. }
  407. //////////////////////////////////////////////////////////////////////
  408. // 合并数据
  409. export const mergeSql = (name,tableName,tabs) => {
  410. if (!tabs || tabs.length == 0) {
  411. return new Promise((resolve, reject) => {
  412. reject("错误")
  413. })
  414. }
  415. let itemValStr = ''
  416. tabs.forEach((item, index) => {
  417. let itemKey = Object.keys(item)
  418. let itemVal = ''
  419. itemKey.forEach((key, i) => {
  420. if (itemKey.length - 1 == i) {
  421. if (typeof item[key] == 'object') {
  422. itemVal += (`'${JSON.stringify(item[key])}'`)
  423. } else {
  424. itemVal += (`'${item[key]}'`)
  425. }
  426. } else {
  427. if (typeof item[key] == 'object') {
  428. itemVal += (`'${JSON.stringify(item[key])}',`)
  429. } else {
  430. itemVal += (`'${item[key]}',`)
  431. }
  432. }
  433. })
  434. if (tabs.length - 1 == index) {
  435. itemValStr += ('(' + itemVal + ')')
  436. } else {
  437. itemValStr += ('(' + itemVal + '),')
  438. }
  439. })
  440. let keys = Object.keys(tabs[0])
  441. let keyStr = keys.toString()
  442. let sql = `insert or ignore into ${tableName} (${keyStr}) values ${itemValStr}`
  443. return executeSql(sql)
  444. }
  445. /**
  446. * 过滤非数据表的字段,使其不报错
  447. * @param fieldList ,使用 getAllField()函数查询出来的数据
  448. * @param obj 数据
  449. * @returns []
  450. */
  451. export function intersection(fieldList=[],obj){
  452. // 获取数据库的字段
  453. let arrField = {}
  454. for(let i in fieldList){
  455. arrField[fieldList[i].name] = null
  456. }
  457. // 取交集的字段,才是合法的,能存进数据库的字段
  458. let keys = []
  459. for (let i in arrField) {
  460. if (obj.hasOwnProperty(i)) {
  461. keys.push(i)
  462. }
  463. }
  464. return keys
  465. }