websql操作類封裝

来源:https://www.cnblogs.com/jiekzou/archive/2019/08/16/11366121.html
-Advertisement-
Play Games

在之前,我寫了一個websql的封裝類庫,代碼如下: (function(win) { function smpWebSql(options){ options = options || {}; this.database = null; this.DateBaseName = options.Da ...


  在之前,我寫了一個websql的封裝類庫,代碼如下:

(function(win) {
    function smpWebSql(options){
        options = options || {};
        this.database = null;
        this.DateBaseName = options.DateBaseName || 'SmpDB';
        this.Version = options.Version || '1.0';
        this.Description = options.Description || 'SmpDB';
        this.DataBaseSize = options.DataBaseSize || 2 * 1024 * 1024;
        this.init();
    }
    smpWebSql.prototype = {
        init: function() {
            this.database = openDatabase(this.DateBaseName, this.Version, this.Description, this.DataBaseSize); //初始化資料庫
        },
        addBlob: function (tableName, arr,index,isFirst,callback) {//批量添加欄位
            /*
                註 : 數據裡面的第一個key存儲類型為BLOB
                @param  tableName 表名
                @param  arr 更新的數據    [{key1:value1 , key2 : value2 ...},{key1:value1 , key2 : value2 ...}]
                @param  index BLOG欄位所在的索引位置
                @param  isFirst 是否是第一次創建表
                @param  callback  回調
             */
            if (arr == null) {
                return this;
            }
            callback = this.isFunction(callback) ? callback : new Function();
            var _me = this,
                _db = this.database,
                keyC = [],
                keyI = [],
                _key = '';
            arr = arr || [];
            if (arr && arr.constructor == Array) {
                for (var i in arr[0]) {
                    keyC.push(i);
                    keyI.push(i);
                }
                _key = keyI.join(",");
                index = index == undefined ? 0 : index;
                keyC[index] = keyC[index] + ' BLOB';
                _db.transaction(function (tx, result) {
                    //var csql = 'CREATE TABLE IF NOT EXISTS ' + tableName + ' (' + keyC.join(",") + ')';
                    //console.log('csql:' + csql);
                    if (isFirst == true) {
                        tx.executeSql('CREATE TABLE IF NOT EXISTS ' + tableName + ' (' + keyC.join(",") + ')');
                    }
                    //var sql = "";
                    for (var s = 0, _len = arr.length; s < _len ; s++) {
                        var _value = _me.split(arr[s]);
                        //sql += 'INSERT INTO ' + tableName + ' (' + _key + ') VALUES (' + _value + ')';
                        //console.log("sql:" + sql);
                        tx.executeSql('INSERT INTO ' + tableName + ' (' + _key + ') VALUES (' + _value + ')',[],function (tx, result) {
                            callback(result.rowsAffected);
                            //console.log('添加成功'+result.rowsAffected);
                        },function (tx, error) {
                            console.error('添加失敗');
                            callback(false);
                        });
                    }
                    _key = keyI = keyC = null;
                    callback();
                });
            }
            return this;
        },
        add: function (tableName, arr, callback, noKey) {//批量添加欄位
            /*
                註 : 數據裡面的第一個key 為主鍵
                @param  tableName 表名
                @param  arr 更新的數據    [{key1:value1 , key2 : value2 ...},{key1:value1 , key2 : value2 ...}]
                @param  callback  回調
                @param  noKey 第一個欄位是否是主鍵(預設是)
             */
            if(arr==null){
                return this;
            }
            callback = this.isFunction(callback) ? callback : new Function();
            var _me = this,
                _db = this.database,
                keyC = [],
                keyI = [],
                _key = '';
            arr = arr || [];
            if (arr && arr.constructor == Array) {
                for(var i in arr[0]){
                    keyC.push(i);
                    keyI.push(i);
                }
                if (noKey==undefined) {
                    keyC[0] = keyC[0] + ' unique';
                }
                _key = keyI.join(",");
                _db.transaction(function (tx) {
                   ///var csql = 'CREATE TABLE IF NOT EXISTS ' + tableName + ' (' + keyC.join(",") + ')';
                    // console.log('csql:' + csql);
                     tx.executeSql('CREATE TABLE IF NOT EXISTS ' + tableName + ' (' + keyC.join(",") + ')');
                    //var sql = "";
                    for(var s = 0 , _len = arr.length; s < _len ; s++){
                        var _value = _me.split(arr[s]);
                        //sql += 'INSERT INTO ' + tableName + ' (' + _key + ') VALUES (' + _value + ')';
                        //console.log("sql:" + sql);
                        tx.executeSql('INSERT INTO '+tableName+' ('+_key+') VALUES ('+_value+')',[],function (tx, result) {
                            callback(result.rowsAffected);
                            //console.log('添加成功'+result.rowsAffected);
                        },function (tx, error) {
                            console.error('添加失敗');
                            callback(false);
                        });
                    }
                    _key = keyI = keyC = null;
                    callback();
                });
            }
            return this;
        },
        update : function(tableName,key,value,obj,callback){//更新指定數據
            /*
                @param  tableName 表名
                @param  key 查詢的鍵 
                @param  value 對應鍵的值
                @param  obj 更新的數據    {key1:value1 , key2 : value2 ...} 
                @param  callback  回調  傳遞參數為真則查詢成功 反之更新失敗
             */
            callback = this.isFunction(callback) ? callback : new Function();
            var _db = this.database,
                _value = this.splitU(obj);
            _db.transaction(function (tx) {
                //console.log('sql:' + 'UPDATE ' + tableName + ' set ' + _value + ' where ' + key + '="' + value + '"')
                tx.executeSql('UPDATE '+tableName+' set '+_value+' where '+key+'="'+value+'"',[],function (tx, result) {
                    callback(result.rowsAffected);
                },function (tx, error) {
                    console.error('更新失敗');
                    callback(false);
                });
            });
            return this;
        },
        updateWhere: function (tableName, where, obj, callback) {//更新指定數據
            /*
                @param  tableName 表名
                @param  查詢條件 
                @param  obj 更新的數據    {key1:value1 , key2 : value2 ...} 
                @param  callback  回調  傳遞參數為真則查詢成功 反之更新失敗
             */
            callback = this.isFunction(callback) ? callback : new Function();
            var _db = this.database,
                _value = this.splitU(obj);
            _db.transaction(function (tx) {
                console.log('UPDATE ' + tableName + ' set ' + _value + ' where ' + where + '"')
                tx.executeSql('UPDATE ' + tableName + ' set ' + _value + ' where ' + where + '"', [], function (tx, result) {
                    callback(result.rowsAffected);
                }, function (tx, error) {
                    console.error('更新失敗');
                    callback(false);
                });
            });
            return this;
        },
        read : function(tableName,condition,callback){ //讀取表數據
            /*
                @param  tableName 表名
                @param  condition 查詢條件   'where name="汪文君"'
                @param  callback  回調  傳遞參數為真則查詢成功 反之查詢失敗
             */
            var _condition = this.isString(condition) ? condition : '';
            var _callback = this.isFunction(condition) ? condition : this.isFunction(callback) ? callback : new Function;
            var _db = this.database,
                _me = this,
                _re = [];
                _db.transaction(function (tx) {
                    tx.executeSql('SELECT * FROM ' + tableName + ' ' + _condition + ' ', [], function (tx, results) {
                        if(results && results.rows){
                            _re =_me.toArray(results.rows);
                            _callback(_re);
                        }else{
                            _callback([]);
                        }
                    },function(tx,error){
                        _callback([]);
                        console.error('查詢失敗');
                    });
                });
                return this;
        },
        remove:function(tableName,condition,callback){//刪除數據
            /*
                @param  tableName 表名
                @param  condition 查詢條件   'where name="汪文君"'
                @param  callback  回調  傳遞參數為真則刪除成功 反之刪除失敗
             */
            var _me = this;
            var _condition = this.isString(condition) ? condition : '';
            var _callback = this.isFunction(condition) ? condition : this.isFunction(callback) ? callback : new Function;
            _me.database.transaction(function (tx) {
                tx.executeSql('DELETE FROM '+tableName+ ' '+ _condition+' ',[],function (tx, result) {
                    _callback(result.rowsAffected);
                },function (tx, error) {
                    _callback(false);
                    console.error('刪除失敗');
                });
            });
        },
        counts: function (tableName, condition, callback) { //讀取表數據
            /*
                @param  tableName 表名
                @param  condition 查詢條件   'where name="汪文君"'
                @param  callback  回調  傳遞參數為真則查詢成功 反之查詢失敗
             */
            var _condition = this.isString(condition) ? condition : '';
            var _callback = this.isFunction(condition) ? condition : this.isFunction(callback) ? callback : new Function;
            var _db = this.database,
                _me = this,
                _re = [];
            if (mui.os.ios) { //ios下麵特有的
                _db.transaction(function (tx) {
                    tx.executeSql('SELECT NO FROM ' + tableName + ' ' + _condition + ' ', [], function (tx, results) {// count (*) as num
                        if (results && results.rows) {
                            _re = _me.toArray(results.rows);
                            _callback(_re.length);
                        } else {
                            _callback(0);
                        }
                    }, function (tx, error) {
                        _callback(0);
                        console.error('查詢失敗');
                    });
                });
            } else {
                _db.transaction(function (tx) {
                    tx.executeSql('SELECT count (*) as num FROM ' + tableName + ' ' + _condition + ' ', [], function (tx, results) {// count (*) as num
                        if (results && results.rows) {
                            if (results.rows[0]) {
                                _callback(results.rows[0].num);
                            } else {
                                _callback(0);
                            }
                        } else {
                            _callback(0);
                        }
                    }, function (tx, error) {
                        _callback(0);
                        console.error('查詢失敗');
                    });
                });
            }
            return this;
        },
        delTable:function(tableName,callback){ //刪除數據表
            callback = this.isFunction(callback) ? callback : new Function();
            this.database.transaction(function(tx){
                tx.executeSql('DROP TABLE IF EXISTS '+tableName,[],function(tx,res){
                    callback();
                },function(tx,err){
                    console.error(err);
                });
            });
            return this;
        },
        splitU: function(obj){//更新字元處理
            var _arr = [];
            for(var t in obj){
                _arr.push(t+'="'+obj[t]+'"');
            }
            return _arr.join(',');
        },
        split : function(obj){//添加字元處理
            var _arr = [];
            for(var m in obj){
                _arr.push("'"+obj[m]+"'");
            }
            return _arr.join(',');
        },
        isFunction : function(callback){
            return typeof callback != 'undefined' && callback.constructor == Function ? true : false
        },
        isString : function(string){
            return typeof string == 'string' ? true : false
        },
        toArray : function(obj){
            var _arr = [],
                _len = obj.length;
                if(_len > 0){
                    for (var i = 0; i < _len; i++) {
                        _arr.push(obj.item(i));
                    };
                }
                return _arr;
        }
    }
    win.smpWebSql = smpWebSql;
}(window))
View Code

  上述代碼存在的問題非常明顯,由於websql操作都是非同步操作,當我們為了獲取到websql操作的結果之後再進行後續操作時,往往是通過回調函數來實現的,當回調一多的時候,回調地獄就出現了,為瞭解決回調地獄問題,我將通過Promise來改寫,後續調用時,可以直接通過await和async來調用,或者直接通過Promise鏈式調用也是可以的。

  現在我將通過ES6的語法重寫之前的封裝類,為了應用ES6中js面向對象的思想,我這裡用到了class,最終代碼如下:

import utils from '@/utils/utils.js';
class SmpWebSql {
  constructor(options) {
    options = options || {};
    this.database = null;
    this.DateBaseName = options.DateBaseName || 'RedDB';
    this.Version = options.Version || '1.0';
    this.Description = options.Description || '智維離線工單資料庫';
    this.DataBaseSize = options.DataBaseSize || 2 * 1024 * 1024;
    this.init();
  }
  /**
   * 初始化資料庫
   */
  init() {
    this.database = openDatabase(
      this.DateBaseName,
      this.Version,
      this.Description,
      this.DataBaseSize
    );
  }
  /**
   * 批量添加欄位
   * @param {*} tableName 表名
   * @param {*} arr 更新的數據    [{key1:value1 , key2 : value2 ...},{key1:value1 , key2 : value2 ...}]
   * @param {*} index BLOG欄位所在的索引位置
   * @param {*} isFirst 是否是第一次創建表
   */
  addBlob(tableName, arr, index, isFirst) {
    var _db = this.database;
    var _me = this;
    // eslint-disable-next-line promise/param-names
    return new Promise(function(resovle, reject) {
      if (arr == null) {
        return this;
      }
      var keyC = [];
      var keyI = [];
      var _key = '';
      arr = arr || [];
      if (arr && arr.constructor == Array) {
        for (var i in arr[0]) {
          keyC.push(i);
          keyI.push(i);
        }
        _key = keyI.join(',');
        index = index == undefined ? 0 : index;
        keyC[index] = keyC[index] + ' BLOB';
        // eslint-disable-next-line promise/param-names

        _db.transaction(function(tx, result) {
          // var csql = 'CREATE TABLE IF NOT EXISTS ' + tableName + ' (' + keyC.join(",") + ')';
          // console.log('csql:' + csql);
          if (isFirst == true) {
            tx.executeSql(
              'CREATE TABLE IF NOT EXISTS ' +
                tableName +
                ' (' +
                keyC.join(',') +
                ')'
            );
          }
          // var sql = "";
          for (var s = 0, _len = arr.length; s < _len; s++) {
            var _value = _me.split(arr[s]);
            // sql += 'INSERT INTO ' + tableName + ' (' + _key + ') VALUES (' + _value + ')';
            // console.log("sql:" + sql);
            tx.executeSql(
              'INSERT INTO ' +
                tableName +
                ' (' +
                _key +
                ') VALUES (' +
                _value +
                ')',
              [],
              function(tx, result) {
                resovle(result.rowsAffected);
                // console.log('添加成功'+result.rowsAffected);
              },
              function(tx) {
                console.error('添加失敗');
                // eslint-disable-next-line prefer-promise-reject-errors
                reject(false);
              }
            );
          }
          _key = keyI = keyC = null;
          resovle();
        });
      }
    });
  }
  /**
   * 批量添加欄位 註 : 數據裡面的第一個key 為主鍵
   * @param {*} tableName 表名
   * @param {*} arr arr 更新的數據    [{key1:value1 , key2 : value2 ...},{key1:value1 , key2 : value2 ...}]
   * @param {*} noKey noKey 第一個欄位是否是主鍵(預設是)
   */
  add(tableName, arr, noKey) {
    var _me = this;
    var _db = this.database;
    // eslint-disable-next-line promise/param-names
    return new Promise(function(resovle, reject) {
      if (arr == null) {
        return this;
      }
      var keyC = [];
      var keyI = [];
      var _key = '';
      arr = arr || [];
      if (arr && arr.constructor == Array) {
        for (var i in arr[0]) {
          keyC.push(i);
          keyI.push(i);
        }
        if (noKey == undefined) {
          keyC[0] = keyC[0] + ' unique';
        }
        _key = keyI.join(',');
        _db.transaction(function(tx) {
          // /var csql = 'CREATE TABLE IF NOT EXISTS ' + tableName + ' (' + keyC.join(",") + ')';
          // console.log('csql:' + csql);
          tx.executeSql(
            'CREATE TABLE IF NOT EXISTS ' +
              tableName +
              ' (' +
              keyC.join(',') +
              ')'
          );
          // var sql = "";
          for (var s = 0, _len = arr.length; s < _len; s++) {
            var _value = _me.split(arr[s]);
            // sql += 'INSERT INTO ' + tableName + ' (' + _key + ') VALUES (' + _value + ')';
            // console.log("sql:" + sql);
            tx.executeSql(
              'INSERT INTO ' +
                tableName +
                ' (' +
                _key +
                ') VALUES (' +
                _value +
                ')',
              [],
              function(tx, result) {
                resovle(result.rowsAffected);
                // console.log('添加成功'+result.rowsAffected);
              },
              function(tx, error) {
                console.error('添加失敗');
                // eslint-disable-next-line prefer-promise-reject-errors
                reject(false);
              }
            );
          }
          _key = keyI = keyC = null;
          // resovle();
        });
      }
    });
  }
  /**
   * 更新指定數據
   * @param {*} tableName 表名
   * @param {*} key 查詢的鍵
   * @param {*} value 對應鍵的值
   * @param {*} obj obj 更新的數據    {key1:value1 , key2 : value2 ...}
   */
  update(tableName, key, value, obj) {
    var _db = this.database;
    var _value = this.splitU(obj);
    // eslint-disable-next-line promise/param-names
    return new Promise(function(resovle, reject) {
      _db.transaction(function(tx) {
        // console.log('sql:' + 'UPDATE ' + tableName + ' set ' + _value + ' where ' + key + '="' + value + '"')
        tx.executeSql(
          'UPDATE ' +
            tableName +
            ' set ' +
            _value +
            ' where ' +
            key +
            '="' +
            value +
            '"',
          [],
          function(tx, result) {
            resovle(result.rowsAffected);
          },
          function(tx, error) {
            console.error('更新失敗');
            // eslint-disable-next-line prefer-promise-reject-errors
            reject(false);
          }
        );
      });
    });
  }
  /**
   * 更新指定數據
   * @param {*} tableName 表名
   * @param {*} where 查詢條件
   * @param {*} obj obj 更新的數據    {key1:value1 , key2 : value2 ...}
   */
  updateWhere(tableName, where, obj) {
    var _db = this.database;
    var _value = this.splitU(obj);
    // eslint-disable-next-line promise/param-names
    return new Promise(function(resovle, reject) {
      _db.transaction(function(tx) {
        console.log(
          'UPDATE ' + tableName + ' set ' + _value + ' where ' + where + '"'
        );
        tx.executeSql(
          'UPDATE ' + tableName + ' set ' + _value + ' where ' + where + '"',
          [],
          function(tx, result) {
            resovle(result.rowsAffected);
          },
          function(tx, error) {
            console.error('更新失敗');
            // eslint-disable-next-line prefer-promise-reject-errors
            reject(false);
          }
        );
      });
    });
  }
  /**
   * 讀取表數據
   * @param {*} tableName 表名
   * @param {*} condition 查詢條件   'where name="jiekzou"'
   */
  read(tableName, condition) {
    var _db = this.database;
    var _me = this;
    // eslint-disable-next-line promise/param-names
    return new Promise(function(resovle, reject) {
      var _condition = this.isString(condition) ? condition : '';
      var _re = [];
      _db.transaction(function(tx) {
        tx.executeSql(
          'SELECT * FROM ' + tableName + ' ' + _condition + ' ',
          [],
          function(tx, results) {
            if (results && results.rows) {
              _re = _me.toArray(results.rows);
              resovle(_re);
            } else {
              resovle([]);
            }
          },
          function(tx, error) {
            // eslint-disable-next-line prefer-promise-reject-errors
            reject([]);
            console.error('查詢失敗');
          }
        );
      });
    });
  }
  /**
   * 刪除數據
   * @param {*} tableName 表名
   * @param {*} condition 查詢條件   'where name="jiekzou"'
   */
  remove(tableName, condition) {
    var _me = this;
    var _condition = this.isString(condition) ? condition : '';
    // eslint-disable-next-line promise/param-names
    return new Promise(function(resovle, reject) {
      _me.database.transaction(function(tx) {
        tx.executeSql(
          'DELETE FROM ' + tableName + ' ' + _condition + ' ',
          [],
          function(tx, result) {
            resovle(result.rowsAffected);
          },
          function(tx, error) {
            // eslint-disable-next-line prefer-promise-reject-errors
            reject(false);
            console.error('刪除失敗');
          }
        );
      });
    });
  }
  /**
   * 根據查詢條件讀取表記錄數
   * @param {*} tableName 表名
   * @param {*} condition 查詢條件   'where name="jiekzou"'
   */
  counts(tableName, condition) {
    if (utils.browserVersions.android) {
      return this.androidCounts(tableName, condition);
    } else {
      return this.iosCounts(tableName, condition);
    }
  }
  // ios下麵特有的
  /**
   * 讀取表數據(ios下麵特有的)
   * @param {*} tableName 表名
   * @param {*} condition  查詢條件   'where name="jiekzou"'
   */
  iosCounts(tableName, condition) {
    var _condition = this.isString(condition) ? condition : '';
    var _db = this.database;
    var _me = this;
    // eslint-disable-next-line promise/param-names
    return new Promise(function(resovle, reject) {
      var _re = [];
      _db.transaction(function(tx) {
        tx.executeSql(
          'SELECT NO FROM ' + tableName + ' ' + _condition + ' ',
          [],
          function(tx, results) {
            // count (*) as num
            if (results && results.rows) {
              _re = _me.toArray(results.rows);
              resovle(_re.length);
            } else {
              resovle(0);
            }
          },
          function(tx, error) {
            // eslint-disable-next-line prefer-promise-reject-errors
            reject(0);
            console.error('查詢失敗');
          }
        );
      });
    });
  }
  /**
   * 讀取表數據(Android)
   * @param {*} tableName 表名
   * @param {*} condition 查詢條件   'where name="jiekzou"'
   */
  androidCounts(tableName, condition) {
    var _condition = this.isString(condition) ? condition : '';
    var _db = this.database;
    var _me = this;
    // eslint-disable-next-line promise/param-names
    return new Promise(function(resovle, reject) {
      var _re = [];
      _db.transaction(function(tx) {
        tx.executeSql(
          'SELECT count (*) as num FROM ' + tableName + ' ' + _condition + ' ',
          [],
          function(tx, results) {
            // count (*) as num
            if (results && results.rows) {
              if (results.rows[0]) {
                resovle(results.rows[0].num);
              } else {
                resovle(0);
              }
            } else {
              resovle(0);
            }
          },
          function(tx, error) {
            // eslint-disable-next-line prefer-promise-reject-errors
            reject(0);
            console.error('查詢失敗');
          }
        );
      });
    });
  }
  /**
   * 刪除數據表
   * @param {*} tableName 表名
   */
  delTable(tableName) {
    // eslint-disable-next-line promise/param-names
    return new Promise(function(resovle, reject) {
      this.database.transaction(function(tx) {
        tx.executeSql(
          'DROP TABLE IF EXISTS ' + tableName,
          [],
          function(tx, res) {
            resovle();
          },
          function(tx, err) {
            console.error(err);
            // eslint-disable-next-line prefer-promise-reject-errors
            reject(0);
          }
        );
      });
    });
  }
  // 更新字元處理
  splitU(obj) {
    var _arr = [];
    for (var t in obj) {
      _arr.push(t + '="' + obj[t] + '"');
    }
    return _arr.join(',');
  }
  // 添加字元處理
  split(obj) {
    var _arr = [];
    for (var m in obj) {
      _arr.push('\'' + obj[m] + '\'');
    }
    return _arr.join(',');
  }
  isFunction(callback) {
    return !!(
      typeof callback != 'undefined' && callback.constructor == Function
    );
  }
  isString(string) {
    return typeof string == 'string';
  }
  toArray(obj) {
    var _arr = [];
    var _len = obj.length;
    if (_len > 0) {
      for (var i = 0; i < _len; i++) {
        _arr.push(obj.item(i));
      }
    }
    return _arr;
  }
}

export default SmpWebSql;

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.首先安裝scala(找到合適版本的具體地址下載) 在/usr/local/目錄下 wget https://www.scala-lang.org/download/**** 2.安裝spark (由於我的Hadoop是2.7.6版本的,因此我所用的spark是在官網上的適用hadoop-2以上版 ...
  • Elasticsearch中的腳本(script)有什麼作用? 如何創建、搜索、使用腳本? 腳本的緩存又是什麼? 對於腳本的使用, 有哪些高效的實踐策略? 本篇博文對這些內容作個簡單的探討. ...
  • 轉載、節選於 https://dev.mysql.com/doc/refman/8.0/en/innodb-tablespace.html This section covers topics related to InnoDB tablespaces. 1.The System Tablespac ...
  • 簡單來說GPDB是一個分散式資料庫軟體,其可以管理和處理分佈在多個不同主機上的海量數據。對於GPDB來說,一個DB實例實際上是由多個獨立的PostgreSQL實例組成的,它們分佈在不同的物理主機上,協同工作,呈現給用戶的是一個DB的效果。Master是GPDB系統的訪問入口,其負責處理客戶端的連接及 ...
  • 前言 涉及到的源碼有 frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java vendor\mediatek\proprietary\packages\apps\SystemUI\src ...
  • 原文鏈接:https://blog.csdn.net/Jaden_hool/article/details/78437947 方法調用流程 調用一個方法是一個壓棧和出棧的過程,調用方法時將棧針壓入方法棧,然後執行方法體,方法結束時將棧針出棧,這個壓棧和出棧的過程會耗費資源,這個過程中傳遞形參也會耗費 ...
  • 多人開發時找回丟失的代碼 1.先保證所有分支的代碼都已經提交並拉取到最新狀態。 2.最重要的是需要找到最近一條自己代碼還存在的記錄,然後複製到最近的更早一條的提交記錄的id,比如e36e9e76da144536c196147b17335288da52c2ff;查找當前分支自己最新的一次提交記錄的id ...
  • CSS cascading(層疊) style(樣式) sheet(表) css註釋 引入方式 css選擇器 基本選擇器 元素選擇器 div{ } id選擇器 #demo 在html中(id="demo") 類選擇器 .demo 在html中(class="demo") 通用選擇器 *{ } 組合選 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...