• 代码测试

    • <?php
      /**
       * @link      http://www.phpGrace.com
       * @copyright Copyright (c) 2010-2015 phpWit.
       * @license   http://www.phpGrace.com/license
       * @package   phpGrace
       * @author    haijun liu mail:5213606@qq.com
       * @version   1.1.1
       */
      define('PG_FULLHOST' , 'https://www.sacrm.cn/');
      define('PG_START_MEMORY'    ,  memory_get_usage());
      define('PG_START_TIME'      ,  microtime(true));
      define('PG_INDEX_FILE_NAME' , 'index.php');
      define('PG_VERSION'         ,  '1.1.1');
      define('PG_DS'              ,  DIRECTORY_SEPARATOR);
      define('PG_IN'              ,  dirname(__FILE__).PG_DS);
      
      if(!defined('PG_VIEW_TYPE')){define('PG_VIEW_TYPE' , 'file');}
      if(!defined('PG_POST_FILTER')){define('PG_POST_FILTER' , true);}
      if(!defined('PG_DEBUG')) {define('PG_DEBUG'  , false);}
      if(!defined('PG_AUTO_DISPLAY')){define('PG_AUTO_DISPLAY' , true);}
      if(!defined('PG_ROUTE')){define('PG_ROUTE' , false);}
      if(!defined('PG_CLOSE_CACHE')){define('PG_CLOSE_CACHE' , false);}
      
      //sessions path
      if(!defined('PG_SESSION_DIR')){define('PG_SESSION_DIR' , './sessions');}
      //session type  [file, memcache, redis]
      if(!defined('PG_SESSION_TYPE')){define('PG_SESSION_TYPE' , 'file');}
      //session start
      if(!defined('PG_SESSION_START')){define('PG_SESSION_START' , false);}
      //session host [memcache 11211 redis 6379]
      if(!defined('PG_SESSION_HOST')){define('PG_SESSION_HOST' , 'tcp://127.0.0.1:11211');}
       
      //framework directory
      if(!defined('PG_PATH')){define('PG_PATH'  , './app');}
      define('PG_CONTROLLER'  , 'controllers');
      define('PG_VIEW'        , 'views');
      define('PG_MODEL'       , PG_IN.'models');
      define('PG_LANG_PACKAGE', 'lang');
      define('PG_CONF'        , 'config.php');
      define('PG_TOOLS'       , 'tools');
      
      // 页面后缀
      if(!defined('PG_SUFFIX')){define('PG_SUFFIX' , false);}
      
      //router
      function PG_Router(){
          if(isset($_GET['pathInfo'])){
              $path = $_GET['pathInfo'];
              unset($_GET['pathInfo']);
          }else{
              $path = 'index/index';
          }
          if(PG_SUFFIX){$path = str_replace(PG_SUFFIX, '', $path);}
          $router = explode('/', $path);
          if(empty($router[0])){array_shift($router);}
          if(PG_ROUTE){
              $routerArray = require(PG_PATH.'/router.php');
              if(array_key_exists($router[0], $routerArray)){
                  $newRouter    = array(); 
                  $newRouter[0] = $routerArray[$router[0]][0];
                  $newRouter[1] = $routerArray[$router[0]][1];
                  if(!empty($routerArray[$router[0]][2]) && is_array($routerArray[$router[0]][2])){
                      $newRouter = array_merge($newRouter, $routerArray[$router[0]][2]);    
                  }
                  define("PG_PAGE",  1);
                  return $newRouter;
              };
          }
          $router[0] = isset($router[0]) ?  $router[0] : 'index';
          $router[1] = isset($router[1]) ?  $router[1] : 'index';
          for($i = 2; $i < count($router); $i++){
              if(preg_match('/^page_(.*)('.PG_SUFFIX.')*$/Ui', $router[$i], $matches)){
                  define("PG_PAGE",  intval($matches[1]));
                  array_splice($router, $i, 1);
              }
          }
          if(!defined("PG_PAGE")){define("PG_PAGE",  1);}
          return $router;
      }
      
      //Exception
      class pgException extends Exception{
          public function __construct($message, $code = null, $previous = null){
              parent::__construct($message, $code, $previous);
          }
          public function showBug(){if(PG_DEBUG){include PG_IN.'templates'.PG_DS.'debug.php'; pgExit();}}
      }
      
      //common functions
      function pgExit($msg = ''){
          header('Content-Type:application/json; charset=utf-8');
          exit($msg);
      }
      function p($var, $type = false){
          if($type){var_dump($var);}else{print_r($var);}
      }
      
      //database object
      function db($tableName, $configName = 'db'){
          $conf = sc($configName);
          return phpGrace\tools\db::getInstance($conf, $tableName, $configName);
      }
      
      //model
      function model($modelName){
          $modelName = 'phpGrace\\models\\'.$modelName;
          $model = new $modelName();
          return $model;
      }
      
      //autoLoad
      function __pgAutoLoad($className){
          $fileUri = PG_IN.substr($className, 9).'.php';
          if(PG_DS == '/'){$fileUri = str_replace('\\', '/', $fileUri);}
          if(is_file($fileUri)){require $fileUri;}
      }
      spl_autoload_register('__pgAutoLoad');
      
      //工具实例化函数( 适用于不能使用命名空间的工具类 )
      function tool($args){
          static $staticTools = array();
          $arguments = func_get_args();
          $className = array_shift($arguments);
          //$className = '\\'.$className;   //导致加载文件出错,提示类文件不存在
          if(empty($staticTools[$className])){
              $fileUri = PG_IN.PG_TOOLS.PG_DS.$className.'.php';
              if(!is_file($fileUri)){throw new pgException("类文件 {$toolName} 不存在");}
              include $fileUri;
              $staticTools[$className] = 1;
          }
          switch(count($arguments)){
              case 0 :
              return new $className();
              break;
              case 1 :
              return new $className($arguments[0]);
              break;
              case 2 :
              return new $className($arguments[0], $arguments[1]);
              break;
              case 3 :
              return new $className($arguments[0], $arguments[1], $arguments[2]);
              break;
              case 4 :
              return new $className($arguments[0], $arguments[1], $arguments[2], $arguments[3]);
              break;
              case 5 :
              return new $className($arguments[0], $arguments[1], $arguments[2], $arguments[3], $arguments[4]);
              break;
          }
      }
      
      //base controller
      class grace{
          public    $gets;
          public    $tableName  = null;
          public    $tableKey   = null;
          public    $db;
          public    $order      = null;
          public    $postFilter = true;
          public    $pageInfo   = array('', '', '');
          protected $cacher;
          protected $cachePre;
          protected $cacheName;
          
          public function __construct(){}
          
          public function __init(){
              $this->templateDir = PG_PATH.'/'.PG_VIEW.'/';
              if($this->tableName != null){$this->db = db($this->tableName);}
              //过滤POST
              if(!empty($_POST)){
                  define('PG_POST', true);
                  if(PG_POST_FILTER && $this->postFilter){
                      $_POST = str_replace(array('<','>', '"', "'"),array('<','>', '"', ''), $_POST);
                  }
              }else{
                  define('PG_POST', false);
              }
              //过滤GET
              if(!empty($_GET)){$_GET = str_replace(array('<','>', '"', "'"),array('<','>', '"',''), $_GET);}
              if(!empty($this->gets)){$this->gets = str_replace(array('<','>', '"', "'"),array('<','>', '"',''), $this->gets);}
          }
          
          public function index(){}
          
          public function display($tplName = null){
              $this->autoTpl = false;
              if(PG_VIEW_TYPE == 'file'){
                  $tplUrl = is_null($tplName) ? $this->templateDir.PG_C.'_'.PG_M.'.php' : $this->templateDir.$tplName;
              }else{
                  $tplUrl = is_null($tplName) ? $this->templateDir.PG_C.'/'.PG_M.'.php' : $this->templateDir.$tplName;
              }
              if(is_file($tplUrl)){include($tplUrl);}
          }
          
          protected function setLang($langType){
              pgSetCookie('phpGraceLang', $langType);
          }
          
          protected function json($data, $type = 'ok'){
              pgExit(json_encode(array('status' => $type, 'data' => $data)));
          }
          
          protected function dataList($everyPagerNum = 20, $fields = '*'){
              if($this->order == null){$this->order = $this->tableKey.' desc';}
              $arr = $this->db->page($everyPagerNum)->order($this->order)->fetchAll($fields);
              $this->pager = $arr[1];
              return $arr[0];
          }
          
          protected function getDataById(){
              if(empty($this->gets[0])){return null;}
              return $this->db->where($this->tableKey .' = ?', array(intval($this->gets[0])))->fetch();
          }
          
          protected function getDefaultVal($exception = array()){
              if(empty($this->gets[0])){return null;}
              $data = $this->db->where($this->tableKey .' = ?', array(intval($this->gets[0])))->fetch();
              /*
              $jsonPreData = array();
              if(!empty($exception) && !is_array($exception)){$exception = explode(',', $exception);}
              foreach($data as $k => $v){
                  if(!in_array($k, $exception)){
                      $jsonPreData[$k] = $data[$k];
                  }
              }
              
              echo '<script>$(document).ready(function() {';
              echo 'var dataobject = '.json_encode($jsonPreData).';';
              if($data){
                  foreach($data as $k => $v){if(!in_array($k, $exception)){echo '$("#'.$k.'").val(dataobject.'.$k.');';}}
              }
              echo '});</script>';
              */
              return $data;
          }
          
          public function skipToIndex(){header('location:'.PG_SROOT); exit;}
          
          protected function getCacher(){
              if(!empty($this->cacher)){return null;}
              $config = sc('cache');
              if(empty($config)){throw new pgException('缓存设置错误');}
              if(!in_array($config['type'], sc('allowCacheType'))){throw new pgException('缓存类型错误');}
              $type = strtolower($config['type']);
              require PG_IN.'caches'.PG_DS.$type.'Cacher.php';
              $className = 'phpGrace\\caches\\'.$type.'Cacher';
              $this->cacher   = $className::getInstance($config);
              $this->cachePre = $config['pre'];
          }
          
          protected function cache($name, $id = null, $queryMethod, $timer = 3600, $isSuper = true){
              if(PG_CLOSE_CACHE){
                  $queryRes = $this->$queryMethod();
                  $this->$name = $queryRes;
                  return false;
              }
              $this->getCacher();
              $this->cacheName = $isSuper ? $this->cachePre.$name.$id : $this->cachePre.PG_C.PG_M.$name.$id;
              $this->cacheName = md5($this->cacheName);
              $cachedRes = $this->cacher->get($this->cacheName);
              if($cachedRes){$this->$name = $cachedRes; return true;}
              $queryRes = $this->$queryMethod();
              $this->cacher->set($this->cacheName, $queryRes, $timer);
              $this->$name = $queryRes;
          }
          
          public function clearCache(){
              $this->getCacher();
              $this->cacher->clearCache();
          }
          
          public function removeCache($name, $id = null, $isSuper = true){
              $this->getCacher();
              $name = $isSuper ? $this->cachePre.$name.$id : $this->cachePre.PG_C.PG_M.$name.$id;
              $name = md5($name);
              $this->cacher->removeCache($name);
          }
          
          protected function initVal($key, $val = ''){
              if(empty($this->gets[$key])){$this->gets[$key] = $val;}
          }
          
          protected function intVal($key, $val = 0){
              if(empty($this->gets[$key])){
                  $this->gets[$key] = 0;
              }else{
                  $this->gets[$key] = intval($this->gets[$key]);
              }
          }
          
          /*
           * curl GET 方式
           * 参数1 $url
           * 参数2 $data 格式 array('name'=>'test', 'age' => 18)
           */
          protected function curlGet($url){
              $ch = curl_init();
              curl_setopt($ch, CURLOPT_URL, $url);
              curl_setopt($ch, CURLOPT_RETURNTRANSFER , true);
              curl_setopt($ch, CURLOPT_SSL_VERIFYPEER , false);
              curl_setopt($ch, CURLOPT_SSL_VERIFYHOST , false);
              curl_setopt($ch, CURLOPT_ENCODING       , 'gzip,deflate');
              $res  = curl_exec($ch);
              curl_close($ch);
              return $res;
          }
          
          /*
           * curl POST 方式
           * 参数1 $url
           * 参数2 $data 格式 array('name'=>'test', 'age' => 18)
           */
          protected function curlPost($url, $data){
              $ch = curl_init();
              curl_setopt($ch, CURLOPT_URL, $url);
              curl_setopt($ch, CURLOPT_RETURNTRANSFER , true);
              curl_setopt($ch, CURLOPT_SSL_VERIFYPEER , false);
              curl_setopt($ch, CURLOPT_SSL_VERIFYHOST , false);
              curl_setopt($ch, CURLOPT_POST           , 1);
              curl_setopt($ch, CURLOPT_POSTFIELDS     , $data);
              curl_setopt($ch, CURLOPT_ENCODING       , 'gzip,deflate');
              $res  = curl_exec($ch);
              curl_close($ch);
              return $res;
          }
          
      
          
      }
      
      /**
       * 修正POST参数
       * @param name 键名称
       * @param value 修正后的值
       * @return value
       */
      function gracePOST($name, $value = ''){
          $_POST[$name] = empty($_POST[$name]) ? $value : $_POST[$name];
          return $_POST[$name];
      }
      
      //session 
      function startSession(){
          switch(PG_SESSION_TYPE){
              case 'file' :
                  if(!is_dir(PG_SESSION_DIR)){mkdir(PG_SESSION_DIR, 0777, true);}
                  session_save_path(PG_SESSION_DIR);
              break;
              case 'memcache' :
                  ini_set("session.save_handler", "memcache");
                  ini_set("session.save_path", PG_SESSION_HOST);
              break;
              case 'redis':
                  ini_set("session.save_handler", "redis");
                  ini_set("session.save_path", PG_SESSION_HOST);
              break;
              default:
                  if(!is_dir(PG_SESSION_DIR)){mkdir(PG_SESSION_DIR, 0777, true);}
                  session_save_path(PG_SESSION_DIR);
          }
          session_start();
          session_write_close();
      }
      
      //设置 session
      function setSession($name, $val){
          session_start();
          $_SESSION[$name] = $val;
          session_write_close();
      }
      
      //获取 session
      function getSession($name){if(isset($_SESSION[$name])){return $_SESSION[$name];} return null;}
      
      //销毁指定的session
      function removeSession($name){
          if(empty($_SESSION[$name])){return null;}
          session_start();
          unset($_SESSION[$name]);
          session_write_close();
      }
      
      // 设置 cookie
      function pgSetCookie($name, $val, $expire = 31536000){
          $expire += time();
          setcookie($name, $val, $expire, '/');
          $_COOKIE[$name] = $val;
      }
      
      //获取 session
      function pgGetCookie($name){if(isset($_COOKIE[$name])){return $_COOKIE[$name];} return null;}
      
      //删除 cookie
      function pgRemoveCookie($name){
          setcookie($name, 'null', time() - 1000, '/');
      }
      
      //获取语言
      function lang($key){
          static $Lang = null;
          if(is_null($Lang)){
              $langName = empty($_COOKIE['phpGraceLang']) ? 'zh' : $_COOKIE['phpGraceLang'];
              $langFile = PG_PATH.'/'.PG_LANG_PACKAGE.'/'.$langName.'.php';
              if(is_file($langFile)){
                  $Lang = require $langFile;
              }else{
                  throw new pgException('语言包文件不存在');
              }
          }
          if(isset($Lang[$key])){return $Lang[$key];}
          return null;
      }
      
      //路径解析
      function u($c, $m, $params = '', $page = null){
          $suffix = PG_SUFFIX ? PG_SUFFIX : '/';
          $page = $page != null ? '/page_'.$page : '';
          if(is_array($params)){
              return PG_SROOT.$c.'/'.$m.'/'.implode('/', $params).$page.$suffix;
          }else{
              if($params != ''){
                  return PG_SROOT.$c.'/'.$m.'/'.$params.$page.$suffix;
              }else{
                  return PG_SROOT.$c.'/'.$m.$page.$suffix;
              }
          }
      }
      //去除空白字符
      function trimAll($str){
          $qian=array(" "," ","\t","\n","\r");
          $hou=array("","","","","");
          return str_replace($qian,$hou,$str); 
      }
      
      //option 选中状态
      function isSelected($val1, $val2){
          if($val1 == $val2){echo ' selected="selected"';}
      }
      
      //checkbox 选中状态
      function isChecked($val1, $val2){
          if($val1 == $val2){echo ' checked';}
      }
      
      //checkbox2 选中状态
      function isPosChecked($val1, $val2){
          if(strpos($val1, $val2)>0){echo ' checked ';}
      }
      
      function dataToOption($data, $currentId = 0){
          foreach($data as $k => $v){
              if($currentId == $k){
                  echo "<option value=\"{$k}\" selected=\"selected\">{$v}</option>".PHP_EOL;
              }else{
                  echo "<option value=\"{$k}\">{$v}</option>".PHP_EOL;
              }
          }
      }
      
      /**
       * 当前分组内的自定义配置 [可按照格式进行自定义配置]
       * @param key1 配置名称1
       * @param key2 配置名称2
       * @return 对应配置值
       */
      function c($key1, $key2 = null){
          static $config = null;
          if($config == null){$config = require PG_PATH.'/config.php';}
          if(is_null($key1)){return $config;}
          if(is_null($key2)){if(isset($config[$key1])){return $config[$key1];} return null;}
          if(isset($config[$key1][$key2])){return $config[$key1][$key2];}
          return null;
      }
      
      /**
       * 全局配置 [可按照格式进行自定义配置]
       * @param $key 配置名称1
       * @param $key 配置名称2
       */
      function sc($key1 = null, $key2 = null){
          static $config = null;
          if($config == null){
              $config = require PG_IN.'config.php';
          }
          if(is_null($key1)){return $config;}
          if(is_null($key2)){if(isset($config[$key1])){return $config[$key1];} return null;}
          if(isset($config[$key1][$key2])){return $config[$key1][$key2];}
          return null;
      }
      
      /**
       * 时间、内存开销计算
       * @return array(耗时[毫秒], 消耗内存[K])
       */
      function pgCost(){
          return array(
              round((microtime(true) - PG_START_TIME) * 1000, 2),
              round((memory_get_usage() - PG_START_MEMORY) / 1024, 2)
          );
      }
      
      //token
      function setToken(){
          $token = uniqid();
          pgSetCookie('__gracetoken__', $token);
          return $token;
      }
      
      function getToken(){
          $token = pgGetCookie('__gracetoken__');
          pgRemoveCookie('__gracetoken__');
          return $token;
      }
      
      // run log
      function pgRunLog(){
          if(!PG_DEBUG){return false;}
          $cost = pgCost();
          echo '<script>console.log("phpGrace Log : 控制器 : '.PG_C.
              ', 方法 : '.PG_M.' - 运行时间 : '. $cost[0] .'毫秒, 占用内存 : ' . $cost[1] .'k");</script>';
      }
      
      
      //基础模型
      class graceModel{
          public $tableName    = null;
          public $tableKey     = null;
          public static $obj   = null;
          public static $mname = null;
          public $m            = null;
          public $error        = null;
          public function __construct(){
              if($this->tableName != null){$this->m = db($this->tableName);}
          }
          public function findById($id, $fields = '*'){
              return $this->m->where($this->tableKey.' = ?', array($id))->fetch($fields);
          }
          public function getSql(){return $this->m->getSql();}
          public function error(){
              return $this->m->error();
          }
      }
      
      // run 
      try{
          $includedFiles = get_included_files();
          if(count($includedFiles) < 2){exit;}
          header('content-type:text/html; charset=utf-8');
          if(PG_SESSION_START){echo startSession();}
          if(!is_dir(PG_PATH)){include PG_IN.'graceCreat.php'; graceCreateApp();}
          $router = PG_Router();
          $controllerName = $router[0];
          $mode = '/^([a-z]|[A-Z]|[0-9])+$/Uis';
          $res  = preg_match($mode, $controllerName);
          if(!$res){$controllerName = 'index';}
          $controllerFile = PG_PATH.'/'.PG_CONTROLLER.'/'.$controllerName.'.php';
          if(!is_file($controllerFile)){
              $controllerName = 'index';
              $controllerFile = PG_PATH.'/'.PG_CONTROLLER.'/index.php';
          }
          require $controllerFile;
          define('PG_C', $controllerName);
          $controllerName = $controllerName.'Controller';
          $controller = new $controllerName;
          if(!$controller instanceof grace){throw new pgException('[ '.$controllerName.' ] 必须继承自 grace');}
          $methodName = $router[1];
          $res  = preg_match($mode, $methodName);
          if(!$res){$methodName = 'index';}
          $graceMethods = array(
              '__init', 'display', 'json','dataList', 'getDataById', 'getDefaultVal', 
              'skipToIndex', 'getCacher', 'cache', 'clearCache', 'removeCache', 'initVal', 'intVal'
          );
          if(in_array($methodName, $graceMethods)){$methodName  = 'index';}
          if(!method_exists($controller, $methodName)){$methodName  = 'index';}
          define('PG_M', $methodName);
          define('PG_SROOT', str_replace(PG_INDEX_FILE_NAME, '', $_SERVER['PHP_SELF']));
          array_shift($router);
          array_shift($router);
          $controller->gets = $router;
          define('PG_URL', implode('/', $router));
          call_user_func(array($controller, '__init'));
          call_user_func(array($controller, $methodName));
          if(PG_AUTO_DISPLAY){call_user_func(array($controller, 'display'));}
          pgRunLog();
      }catch(pgException $e){$e->showBug();}
      
      
      //后端基础控制器
      class graceAdmin extends grace{
          public function __init(){
              parent::__init();
              $this->checkLogin();
          }
          
          protected function checkLogin($auth = null){
              if(empty(getSession('graceMangerId'))){header('location:'.PG_SROOT.'login'); pgExit();}
          }
          
          protected function checkAuth($auth = null){
              if(empty($auth)){            
                  $m        = db('menu');
                  $data       = $m->where('myController=? AND myMethod=?',array(PG_C,PG_M))
                          ->fetch();    
                  $auth = $data['myPowerGroup'].$data['myPowerID'];        
              }
              //if(is_bool(strpos(getSession('graceMangerAuth'), $auth.','))){throw new pgException('无权操作...');}
              if(is_bool(strpos(getSession('graceMangerAuth'), $auth.','))){$this->json('无操作权限Sorry, no operating authority', 'error');}
          }
          
          public function showPager($pager = null){
              if($pager == null){$pager = $this->pager;}
              echo '
                  <div class="dataTables_paginate">
                      <ul class="pagination">
                      <li class="paginate_button page-item">
                          <a href="'.$pager->firstPage.'" class="page-link">第一页</a>
                      </li>';
                      
                      foreach($pager->listPage as $k => $v){
                          if($k == $pager->currentPage){
                              echo '<li class="paginate_button page-item active"><a href="#" class="page-link">'.$k.'</a></li>';
                          }else{
                              echo '<li class="paginate_button page-item"><a href="'.$v.'" class="page-link">'.$k.'</a></li>';
                          }
                      }                
                      echo '
                      <li class="paginate_button page-item next"><a href="'.$pager->lastPage.'" class="page-link">尾页</a></li>
                      '.$pager->skipPage.'
                      <li class="paginate_button page-item next"><a class="page-link">共 '.$pager->totalRows.' 条 / 每页 '.$pager->eachPage.' 条</span></a></li>
                      </div>';
                      
          }
          
          public function showPager2($pager = null){
              if($pager == null){$pager = $this->pager;}
              echo '
                  <div class="layui-box layui-laypage" style="float:right;">
                      <span class="layui-laypage-count">共 '.$pager->totalRows.' 条 / 每页 '.$pager->eachPage.' 条</span>
                      <a href="'.$pager->firstPage.'" class="layui-laypage-prev">第一页</a>
                      <a href="'.$pager->prePage.'" class="layui-laypage-prev"><<</a>';
                      foreach($pager->listPage as $k => $v){
                          if($k == $pager->currentPage){
                              echo '<span class="layui-laypage-curr"><em class="layui-laypage-em" style="background-color:#1E9FFF;"></em><em>'.$k.'</em></span>';
                          }else{
                              echo '<a href="'.$v.'">'.$k.'</a>';
                          }
                      }
                      echo '<a href="'.$pager->nextPage.'" class="layui-laypage-next">>></a>
                      <a href="'.$pager->lastPage.'" class="layui-laypage-last">尾页</a>
                  </div>';
          }
          
          public function operateLog($content,$id){
              $data   = array();
              $data['operate_u_id']    = getSession('graceMangerId');
              $data['operate_u_name']  = getSession('graceMangerName');
              $data['operate_content'] = '控制器 : '.PG_C.' 方法 : '.PG_M.' 操作 : '.$content;
              $data['operate_time']    = time();
              $data['operate_ip']      = phpGrace\tools\ip::getIp();
              $data['operate_pgc']      = PG_C;
              $data['operate_pgm']      = PG_M;
              $data['operate_dataid']      = $id;
              $dbOperateLog = db('manager_operate_logs');
              $dbOperateLog->add($data);
          }
          
      
      }
    • 宽带认证BOSS系统v5.0

    • 轻武计费认证系统KDBOSS主要针对中小型企业,用户规模在1-100万内的小区宽带运营商,本系统可作为宽带运营支撑系统,同时该系统支持多业务受理,包括宽带业务,商业客户,语音业务,增值业务等。本系统历经15年千锤百炼,历经百万宽带用户的洗礼,一体化解决方案是一款宽带运营必不少的管理软件。

      轻武计费认证系统KDBOSS在先后在成都、重庆、北京、郑州、石家庄、深圳、大连、济南、南京、杭州、福州、厦门、贵阳、长沙、广州、太原、南昌等省会城市均成功部署运营,总承载用户超过500万户,创年收入超过15亿。我们的成功运营经验可以复制,我们曾经的辉煌也可以再现,KDBOSS助您成功!

      我们的团队拥有十年宽带运营经验,曾经支撑百万宽带用户,借鉴顶级运营商经验的同时,同时又立足于自身的发展,每一个环节都经过精雕细琢,每个流程都经历了时间的打磨,宝贵的运营经验和技术+持续创新的理念造就了我们独一无二的产品.

      KDBOSS系统基于服务器+客户端软件模式,通过ADO数据库组件访问后台数据库,开发平台为DELPHI 7.0,后台数据库采用高效可靠的MICROSOFT SQL SERVER,为企业客户资料管理提供了可靠的保证。独立研发的小区宽带RADIUS认证系统,完美适配REDBACK SE800、华为ME60、JUNIPER E320等BASE设备,支持百万用户同时在线认证,完全媲美电信级认证系统,十年运营经验打造出一套稳定、安全、可靠、方便的PPPOE宽带认证系统.

      官方网站:[http://www.kdboss.cn]()

      轻武计费认证系统介绍.docx

    • 完美主义不是更好,而是至高无上

    • 【人生悟语】以完美主义的标准去要求每天的工作,听起来是很苛刻,也很困难。但是与生命相比起来呢?你做到像对待仅有一次的生命那样严肃谨慎地去对待你的工作了吗?将至高无上的完美主义进行到底吧。

      “完美主义”是稻盛和夫在工作中一直追求的目标,他所考虑的完美主义不是更好,而是至高无上。生产一个产品,那怕付出90%的努力也是不够的,一点瑕疵,一点疏漏,一点粗心都不能原谅,只有做足100%才堪称完美。在工作中不断追求的是做到精致、精湛、精益求精,力求最品质量,把产品做成无可挑剔的完美作品,把工作做到极致,挑战极限,这才是工作的终极目标。

      稻盛和夫的一位叔叔当过海军航空队的飞机维修员,他从战场归来后曾对稻盛讲起他在航空队的经历,给稻盛很深刻的印象。

      每当轰炸机起飞的时候,维修员都要随机飞行,但几乎他们中的所有人都不乘坐自己维修过的飞机,他们似乎不约而同地选择乘坐别的同事维修的飞机,这里面有什么玄机吗?

      原来,虽然维修员在维修保养机器时竭尽全力工作,但却不敢保证自己做的万无一失,于是他们都乘同事负责的轰炸机。

      正因为对自己的工作缺乏充分的信心,又考虑到万一出现紧急情况,所以维修员们做出了这样的选择。还有很多类似的事情,许多医生的父母妻儿,或是亲戚身患重病,他们大都不愿意亲自诊断医治。亲人们需要进行手术时更是如此,这些医生往往委托自己信任的同事主刀。这样做的缘由是,在血浓于水的亲情面前,关系到亲人的安危,自己会动不了手。

      稻盛并不赞同这种观点,他认为每一天的工作都是真刀真枪干出来的,拥有这样的积累,他一定会对自己的技术有满满的自信。如果换了他做飞机维修员,他必定会选择乘坐自己负责的轰炸机;如果换了他做外科医生,当亲人需要救治时,他不会请人代劳,必定会亲手主刀。只有觉得自己的工作做得完美无缺,能自己的能力打满分时,才能有正面观对问题的决心和魄力。

      有人说,在中国,不缺少雄韬伟略的战略家,缺少的是精益求精的执行者。这话也许说得没错,国人的“差不多”思想总是引诱我们放弃对完美的追求,但是有一家企业即是在质量上精益求精、苛求完美的典范,它就是荣事达公司。

      “零缺陷管理”是荣事达借鉴国外企业“无缺点运动”经验并结合本企业实际加以独特的再创造的成果,而“无缺点运动”最早发端于美国佛罗里达州的马丁马里塔公司。1962年,该公司与美国军事部门签订了一项生产供货合同,合同规定的交货期限很紧,对质量要求很严。可是军令如山,不容耽搁,马丁公司以形势所迫,打破常规,开展了一场“无缺点运动”,这一运动包括:

      1. 打破传统的“人总要犯错误”理念,改换成“只要主观尽最大努力,就可以不犯错误”的理念,以此动员全体员工追求无缺点目标,自觉避免工作中的失误。
      2. 打破以往的生产与质检的分离格局,要求每个操作者同时也是质检者,规定上道工序不得向下道工序传送有缺陷的产品。
      3. 打破过去对错误只有事后发现和补救的常规,讲求超前防患,事先找出可能产生缺点的各种原因和条件,提前采取措施,做到防患于未然。
      4. 打破生产过程中各工序的员工各自为战、各行其是的习惯状态,要求树立全局观念,主动配合、密切合作,从总体上保证实现无缺点结果。马丁公司实行“无缺点运动”果然一举成功,合同期限一到便交出无可挑剔的百分之百合格产品。

      荣右达吸收其中的精华,形成了自己的“零缺陷生产”模式,将“用户是上帝”“下一道工序是用户”“换位思考”“100%合格”等质量意识转变为员工的自觉行动。与此相关的一系列制度纷纷出台,从而实现分散与集中,全员自控与专门控制、内在质量控制与系统信息反馈相结合的“零缺陷生产”质量管理体系。零缺陷供应是零缺陷生产的前提和保证,通过严把质量关,确保提供“零缺陷”的零配件或可辅助件。

      从此,荣事达建立了“零缺陷”的企业文化,企业进入了新的境界。

      精益求精是对结果最好的诠释。一位企业经营都说过:“如今的消费者是拿着显微镜来审视每一件产品和提供产品的企业。在残酷的市场竞争中,能够获得较宽松的生存空间的企业,不只是合格的企业,也不只是优秀的企业,而是非常优秀的企业,你要求自己的标准,必须远远高于市场对你的要求标准,才可能被市场认可。”

      美国前总统麦金莱在得州的一所学校演讲时,对学生们说:“比其他事情更重要的是,你们需要尽最大努力把一件事情做得尽可能完美。”只有不满足于平庸,才能追求最好。没有人可以做到完美无缺,但是,当你不断增强自己的力量、不断提升自己的时候,你对自己的要求会越来越高,你所取得的成就也会越来越大。

      企业只有像荣事达这样,把对质量孜孜不倦的追求上升到企业文化的高度,员工对质量的觉悟才会大大提高。

      只有提高工作标准,把产品的完美品质视同自己的生命一样珍惜!其实企业应该把完美主义奉行到像生命一样至高无上的地位。以完美主义的标准去要求 每天的工作,听起来可能很苛刻,也很困难。但是与生命相比起来呢?你做到像对待仅有一次的生命那样严肃谨慎地去对待你的工作了吗?还是将至高无上的完美主义进行到底吧。

    • 乍看是不幸,实际上是幸事

    • 人生悟语:苦难是一只驶向成功的船,当风暴来临时,别害怕,扬起帆,直面那滔天人海浪、搏击那汹涌的激流吧。

      人生不如意事十之八九。生活本是一种承受,人若学会正确对待不幸,那么你所遭受的也许正是你的福气,稻盛和夫曾说过,乍看的不幸,实际是幸事。

      看过著名油画大师凡高故居的人都知道,那里有的只是张裂开的木床和破皮鞋。凡高一生潦倒困苦,没有娶妻,但也许是生活的困窘,帮他完成了在艺术上的壮举,使他成为大师中的大师,使他的作品成为经典中的经典。

      就人生而言,不幸是个不请自来的不速之客。不幸是根弹簧,我们若向它屈服了,它反而使我们落魄潦倒,甚至在绝望和恐惧中逼迫我们一步步靠近灭亡;如果我们不臣服于它,反而会变得更坚强更勇敢。

      世界上没有完美无缺的东西,不幸便是人生完璧中的瑕疵。其实不完美才是一种美,在不断的争取中,不断地承受失败与挫折时,才能发现快乐。稻盛和夫青年时代,曾经在没有选择的情况下进入了当时一个很不景气的公司上班,拖欠工资是家常便饭,他也曾为此失落过,然而,就在那样一种环境下,稻盛倾注心血在实验研究上,取得了一个又一个可喜的成果。他对工作的态度也有了180度的大转弯,从厌恶到喜爱,这为他日后的成功打下了基础。

      风雨对于温室里的花朵而言绝对是灭顶之灾,不幸对于幸运儿而言无疑是致命的打击,毫无力量去抗拒迎击。因为幸运儿习惯了没有挫折和不幸的苦涩人生,在他们的生活中只有一帆风顺、心想事成,他们的字典里没有别有深味的“不幸”二字,而那些经常遭受不幸的人来说,他们的意志品质都是非常坚强的。他们深刻地明白,风调雨顺、风和日丽只是偶然光临,暴风骤雨、电闪雷鸣才是人生的常客。

      著名心理学家威廉汤姆斯说过,我们所谓的不幸和苦难,很大的程序上,要归结于个人对现象所持的看法。更重要的则是,一个人以什么样的心情与态度来面对和处理这些难题,最后的结果是迥然不同的。因此,我们不难发觉,即使是出于同样的环境和状态,有人认为是不幸和苦难,有人却认为这是千载难逢的良机与顺境。

      成功的人为什么能成功?因为对他们来说,每一个因素都是成功的良机,甚至包括不幸,不管身处何处,他们都会以积极、自信与乐观的态度去努力、去积淀自己,他们是奇迹的创造者。与此相反,另一些人持有消极与失败的心态,不愿意承担不幸,这样的人注定一辈子要潦倒。不同的心态,做出的不同的反应致使事情的结果截然相反。因此遇到任何挫折或打击时,千万不要呼天抢地,要微笑着告诉自己那是造化的考验。

      高尔基曾把苦难比作大学,几乎所有的成功人士都是从不幸中毕业的,不幸教给你坚强勇敢,更教会你拼博向上,这也是正如稻盛和夫指出的那样,苦难是一只驶向成功的船,当风暴来临时,别害怕,扬起帆,直面那滔天的海浪,博击那汹涌的激流吧。

    • 【通俗版】宽带网络公司是如何进行网络计费的?

    • 从最近15年国内网络发展看,从最初的赶猫上网到VDSL、ADSL,再到光纤上网,网速得到了极大的提升,我们的网络生活也更加丰富,在线视频、网络下载、游戏、在线教育、网络会议、在线办公等等,特别是在今年疫情期间,我国的网络基础环境经受住了前所未来的考验,因为有了网络,即使家里蹲我们的生活也没有受到多少影响。得益于网络基础构架的完成、智能手机的普及、互联网各行业也开始蓬勃发展。

      宽带网络公司是如何运作的呢?

      当我们需要宽带接入的时候,网络公司会拉一条线路到家里(光纤小区是通过光纤进入用户家里,再通过光猫数据转换后进行上网,广电网络是通过电视数字信息线路上网,还有一种就是通过楼道的宽带接入盒,接入一根网线到用户家里),线路接通之后,网络公司开通帐号和密码,用户通过帐号密码进行PPPOE拨号上网。

      技术解释:网络公司在BOSS里创建了用户帐号,缴费后更新用户到期时间,当用户拨号时,消息首先到达BASE设备(如果华为的ME60,SE8000等BASE设备进行PPPOE协议通讯),然后再通过AAA认证(也有叫Radius认证)检查帐号密码是否匹配,检查用户是否到期等,通过之后下发宽带属性到BASE设备(就是是下载速度、上传速度信息),验证通过后即可上网。

      BOSS系统是什么?

      BOSS系统是网络公司最重要的系统之一,主要包括BSS和OSS两大块,按通俗的语言讲主要是客户资料管理系统(CRM),认证计费(Radius系统),还有工单系统、呼叫系统、缴费系统、业务受理系统、资源管理系统等等。

      计费系统如何选择?

      大多数计费系统都是FreeRadius修改而来,像网上有不少做一体系统的,大多数是按用户许可收费,一般支持能力在1万用户以内,属于三流计费系统。

      第一梯队做计费系统的公司:如亚信、中兴软创、东软等,主要客户是中国电信、中国移动、中国联通,管理用户在1000万以上。

      第二楼队:萨莫尔等,主要客户是二级民营运营商,如长城宽带、宽度网络、艾普网络。管理用户在500万以内。

      宽带运营中,用户计费只是整体体系中最重要的一块,其实还包括了运营支撑,如用户开通、缴费、故障处理、客服系统、电销系统等。

      轻武计费认证系统如何?

      轻武计费认证系统(KDBOSS)主要针对中小型企业,用户规模在1-100万内的小区宽带运营商,本系统可作为宽带运营支撑系统,同时该系统支持多业务受理,包括宽带业务,商业客户,语音业务,增值业务等。本系统历经16年千锤百炼,历经百万宽带用户的洗礼,一体化解决方案是一款宽带运营必不少的管理软件。

      下载:轻武计费主证系统介绍

       title=

      上线城市

       title=

    • typecho文章页添加相关文章列表

    • <article class="single-post panel">
              <!--文章页面的头图-->
              <?php if (!Content::isImageCategory($this->categories)) echo Content::exportHeaderImg($this); ?>
               <!--文章内容-->
               <div id="post-content" class="wrapper-lg">
      
                      <!-- 文章顶部ggad -->
                   <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
                  <ins class="adsbygoogle"
                       style="display:block"
                       data-ad-client="ca-pub-8073927669897848"
                       data-ad-slot="4884971263"
                       data-ad-format="auto"
                       data-full-width-responsive="true"></ins>
                  <script>
                       (adsbygoogle = window.adsbygoogle || []).push({});
                  </script> 
                     <!-- end文章顶部ggad -->
      
                <div class="entry-content l-h-2x">
                <?php echo Content::postContent($this,$this->user->hasLogin());
                ?>
                </div>
                   <?php if ($this->options->adContentPost != ""): ?>
                       <!--文章页脚的广告位-->
                       <?php $this->options->adContentPost(); ?>
                   <?php endif; ?>
      
           
                   <!-- 相关文章 -->
                   <div id="relatedPosts" style="box-shadow: 4px 6px 16px 0px #ddd; padding-left: 2rem; padding-top: 0.8rem; padding-bottom: 1.25rem;">
                          <h2>相关文章</h2>
                          <ul class="tocify-header nav nav-list">
                              <?php $this->related(10)->to($relatedPosts); ?>
                              <?php if ($relatedPosts->have()): ?>
                                  <?php while ($relatedPosts->next()): ?>
                                  <li class="tocify-item">
                                      <a href="<?php $relatedPosts->permalink(); ?>" title="<?php $relatedPosts->title(); ?>"><?php $relatedPosts->title(); ?></a> 
                                  </li>
                                  <?php endwhile; ?>
                              <?php else : ?>
                              <li>无相关文章</li>
                              <?php endif; ?>
                          </ul>
                   </div>
               <!-- end 相关文章 -->
      
           
                   <!--文章的页脚部件:打赏和其他信息的输出-->
                   <?php echo Content::exportPostFooter($this->modified,$this->options->timezone - idate("Z"),$this); ?>
                   <?php if (!empty($this->options->featuresetup) && in_array('payforauthorinpost', $this->options->featuresetup)): ?>
                       <!--打赏模块-->
                       <?php echo Content::exportPayForAuthors(); ?>
                   <?php endif; ?>
                   <!--/文章的页脚部件:打赏和其他信息的输出-->
               </div>
              </article>
    • 过来人劝你35岁之后不要轻易去卖保险(三)

    • 如何看待保险代理人这个职业?

      正式名叫:保险代理人(大家俗称卖保险的),这个职业为什么能受35岁以上的人青睐?原因有以下几点,

      1. 卖保险时间相对比较自由
      2. 有高薪机会(多劳多得,绝对公平,签的越多,用户所缴的保费越多,代理人的收入就越高,按比例算佣金)
      3. 这是个计划未来的工作,有长期保持学习状态
      4. 保险公司的员工都积极向上,团队富有激情,活力十足(销售型公司都这样,房屋中介公司也是这样,因为每天有鸡血鸡汤喝)
      5. 保险行业有各种荣誉
      6. 有完整的晋升通道(一是走销售线路的,达标后上升一级,各种职级,如果几个月考核不达标会有降级;二是走管理线路的,主要是靠增员,也就是发展自己的团队,需要自己的招募人员,有增员奖,当下级签单成功后,作为主管公司会发管理津贴,前期招募人员其实也是种套路的,只要人员入职就有奖励,所谓招人就是两全,人在产生业绩有管理津贴,如果离职了,可以继承他的单,当然每个公司的规章制度不一样,也有一些区别)
      7. 每个月都比赛活动,业绩达标后会有各种旅游机会
      8. 每隔几个月都会有新的产品上市,各种培训

      当然以上都是好的方面,其实保险代理人是一个传统销售行业,卖的产品是安全帽,只有当出险之后,保险才会生效,代理人好比是银行柜台的职员,帮用户办理存取款收续,用户所缴的保费都是进公司的帐号(一般由银行代扣),次月保险公司根据业绩发佣金(不同的险种,不同的产品佣金比例不一样)。

      保险公司招的是员工吗?

      对于这个问题,对也不对,保险公司的本意是招员工,招的人越多越好,公司提供免费培训,是轻资产公司,一般都是无底薪的(或有责任底薪),即达到多少业绩公司给多少奖励,一般第一年公司有各种人才计划,因为是刚入行没有客户,没有续佣,所以一般是双倍佣金(比如佣金FYC达1000元时,公司发2000工资,佣金FYC达3000元时,公司发6000工资),每个公司定的规则不一样。

      与其说是招员工,不如说是找客户,因为作为一个新人入行,接受了保险公司的培训后,了解了保险的各种好处(不会告诉你坏处的),在公司各种奖励和竞赛方案的引诱下,90%以上的人都会先给自己买一份保险,或是给家人买一个保险。

      还有一个愿因就是,你给周围的朋友介绍保险产品的时候,或者朋友提的第一个问题就是“你自己买了吗?”,“你给你的家人买了吗?”当你自己买了之后,你朋友有可能又有各种其它问题不买,哈哈

      所以说保险招的员工,其实也是找的客户!!

      保险公司的如何培训?

      刚刚进入保险的人,都会接受公司3-7天的全天培训(中资公司),一般主要是讲保险的基础知识,然后就是保险代理人内部考试(以前是国家统一考试,现在由各保险公司自己考试了,60分及格,考过之后就可以获得保险代理人证书),公司上编(有工号)后,就可以通过手机APP进行签单。

      外资公司有1-3个月半天培训,也分不同的XXX班,培训的内容也不一样(其实目标也就是一个,想尽快的通过人脉圈签单)。

      保险和传销的区别?

      保险代理人制度有一两百年的历史了,是传销的鼻祖,所谓传销就是学到了代理制度,从事一些靠拉下线赚会费的非法事情,保险受国家法律保护,保险公司的培训其实多多少少也有洗脑的成份,传销会禁锢你的人身自由,保险不会。

      卖保险收入高吗?

      对于这个问题,要因人而异,如前所述,保险行业是按劳分配,多劳多得,签单越多,业绩越好,工资肯定高,上不封顶,因为是按业绩提佣金。

      其实所有行业都有二八定律,只有20%的人能拿高薪,其实大多数人都在80%里。

      卖保险能成为长期的职业吗?

      可以,任何一个职业,只要你坚持做,都可以作为长期的职业,需要因地制宜,并非适合所有人。

      这个职业不具备普遍性,决定的因素有很多(如人脉圈大小、沟通能力、所处的阶层),当然也跟自己勤奋也有很大关系,爱不爱学习,愿不愿意去承担各种压力,对于一个销售来说,每一天都是全新的一天,每一个月都是全新的一个月。

      你是否能忍受几个月没收入? 你是否能抗住销售压力?你是否自律?

      有很多35岁失业的精英(以前在公司混得都还不错的),从事保险销售,其实保险公司最喜欢的人群就是这类人,因为这部分人有一定人脉,也有一定的经济基础(能成为客户),身边的朋友也都差不多,这是保险重点发展的对象。

      为什么保险公司阴盛阳衰?

      这是一个普遍现象,保险公司女性比男性多,因为女性有先天性的亲和力和沟通能力,对于女性来说,卖保险时间相对比较自由,可以事业和家庭兼顾,对于家庭的压力来说,女性比男性小得多,不论是作为全职或者兼职来说,都是不二选择。

      男性在保险公司大多都是走管理路线,培训师路线为主,女性大多是销售路线。

      (待续)

    • 过来人劝你35岁之后不要轻易去卖保险(二)

    • 过来人劝你35岁之后不要轻易去卖保险
      虽然你身边的朋友都会嘲讽你
      某某去卖保险
      “卖保险”会成为一个讽刺的词语
      除非你心里特别强大
      不然身边的朋友冷嘲热讽会让你压力山大

      卖保险其实就是卖一种观念,卖的一份合同,几张纸
      卖保险是世界上最难的销售
      健康的时候不需要保险
      等需要保险的时候,却买不到
      这个世界有两样产品
      一种是趋利的产品,比如手机,买来之后就可以使用,看到他的好处
      另一种是避害的产品,如安全带,平时基本上没什么用,但在关键时刻可以起到意想不到作用

      要做好这个工作
      需要你不断地学习,要学保险基础知识
      打了好基础之后,医学、法律相关的知识也要储备
      最最重要的是
      还要学习心理学,懂人情世故、练口才、还要察言观色
      每一个客户都是单独的个体
      思想观点、关注点都不一样
      签单并非你想的那么容易

      前三个月都能签单
      因为最初的客户都是你最熟悉人
      最信任的人
      所以前期签单还是比较容易
      第一圈熟人做完
      当做二、三、四圈层的时候
      你会发现难度会逐渐提升

      保险有两条路可以走
      一是签单多,业绩好
      另一条路增员(招募人员,组建自己的团队)
      招人比签单更难
      如果节奏没有掌握好
      绝大多数人干不过半年
      因为干保险是没有底薪的
      有业绩才有工资,没业绩=工资为0
      所以大部分人,在半年后就离开了
      在保险行业,离开的人叫“脱落”
      卖保险和做生意差不多
      也叫无成本创业,内部叫做保险企业家
      虽说是无成本,要做好这份工作
      其实你要付出很多努力
      要忍受常人所不能忍

      卖保险是自由的
      上午大多在公司学习、开会
      下午是自由活动时候
      早上打卡,下班不用打卡
      也正因为这种自由
      没有完全的自律,肯定也坚持不了多久
      半年之内不开单,工资为0,绝大多数人都会离开
      重新找一份有底薪的工作

      看似进入门槛很低
      是个人就可以卖保险
      现实却是残酷的
      保险公司女性居多的原因
      是因为女性相对来说
      压力比男性小很多
      当做兼职也不错
      对于一个男人来说
      如果你没有十足的准备
      我建议你不要进入保险行业

      如果没有存款
      我建议不要进入保险行业
      如果没有被动收入
      我建议不要进入保险行业
      如果没有人脉,不要进入
      如果沟通能力差,不要进入
      如果自律能力差,不要进入

      (待续)
      下一次,给大家分享一下保险公司的套路,敬请期待

    • 关于社区运营

    • 18年针对学校场景的产品原型设计部份内容:
      1,初步设计的基本运营模式测试:线下自助销售设备作为流量场景,随时联接用户至线上带动线上客户管理⽷统建⽴,线上通过两个⼿段,即吸引学⽣ 参与配合客户的产品推⼴⽽进⾏的含有植⼊内容⼩游戏样品抽取活动以及朋友圈传播换积分活动⼜导 流回线下,如此初步建⽴线上线下相互导流⼈流物流循环⽷统,然后第三条线营销活动产⽣的信息流 再配合进来,推动⼀对多的客户管理⽷统升级到多对多的虚拟社区。再配合以通过勤工俭学学生完成的主动推广,每个学生必须完成每天规定的加关注任务,就像当年携程⽕⻋车站发⼩卡⽚,只是换成了⼆维码。

      有了你这个客户关系管理的工具之后我所做的产品原型设计里面的许多功能就能够技术实现了。

      最初学校场景下的产品原型设计。二,项目差异化价值定位即对以下问题的回答:在最有商业价值的一二线城市便利店已经充分覆盖的今天,作为消费者我为什么要与你(自动售卖机及背后的公司)建立尤其是还要保持某种关系?

      阅读剩余部分...

Powered by Typecho)))   ICP:蜀ICP备05009250号