中文字幕人妻中文_99精品欧美一区二区三区综合在线_精品久久久久一区二区_色月丁香_免费福利在线视频_欧美大片免费观看网址_国产伦精品一区二区三区在线播放_污污污污污污www网站免费_久久月本道色综合久久_色69激情爱久久_尹人香蕉久久99天天拍_国产美女www_亚洲国产精品无码7777一线_五月婷婷六月激情_看免费一级片_精品久久久久久成人av_在线色亚洲_女人另类性混交zo_国产精品青青在线观看爽香蕉_人人澡人人添人人爽一区二区

主頁 > 知識庫 > 基于Redis位圖實現系統用戶登錄統計

基于Redis位圖實現系統用戶登錄統計

熱門標簽:十堰營銷電銷機器人哪家便宜 日本中國地圖標注 山東外呼銷售系統招商 北京400電話辦理收費標準 宿遷便宜外呼系統平臺 超呼電話機器人 貴州電銷卡外呼系統 魔獸2青云地圖標注 鄭州人工智能電銷機器人系統

項目需求,試著寫了一個簡單登錄統計,基本功能都實現了,日志數據量小。具體性能沒有進行測試~ 記錄下開發過程與代碼,留著以后改進!

1. 需求 

         實現記錄用戶哪天進行了登錄,每天只記錄是否登錄過,重復登錄狀態算已登錄。不需要記錄用戶的操作行為,不需要記錄用戶上次登錄時間和IP地址(這部分以后需要可以單獨拿出來存儲) 區分用戶類型 查詢數據需要精確到天

2. 分析

  考慮到只是簡單的記錄用戶是否登錄,記錄數據比較單一,查詢需要精確到天。以百萬用戶量為前提,前期考慮了幾個方案

2.1 使用文件

  使用單文件存儲:文件占用空間增長速度快,海量數據檢索不方便,Map/Reduce操作也麻煩

  使用多文件存儲:按日期對文件進行分割。每天記錄當天日志,文件量過大

2.2 使用數據庫

不太認同直接使用數據庫寫入/讀取

  • 頻繁請求數據庫做一些日志記錄浪費服務器開銷。 
  • 隨著時間推移數據急劇增大 
  • 海量數據檢索效率也不高,同時使用索引,易產生碎片,每次插入數據還要維護索引,影響性能

  所以只考慮使用數據庫做數據備份。

2.3 使用Redis位圖(BitMap)

  這也是在網上看到的方法,比較實用。也是我最終考慮使用的方法,

  首先優點:

  數據量小:一個bit位來表示某個元素對應的值或者狀態,其中的key就是對應元素本身。我們知道8個bit可以組成一個Byte,所以bitmap本身會極大的節省儲存空間。1億人每天的登陸情況,用1億bit,約1200WByte,約10M 的字符就能表示。

  計算方便:實用Redis bit 相關命令可以極大的簡化一些統計操作。常用命令 SETBIT、GETBIT、BITCOUNT、BITOP

  再說弊端:

  存儲單一:這也算不上什么缺點,位圖上存儲只是0/1,所以需要存儲其他信息就要別的地方單獨記錄,對于需要存儲信息多的記錄就需要使用別的方法了

3. 設計3.1 Redis BitMap

  Key結構:前綴_年Y-月m_用戶類型_用戶ID

標準Key: KEYS loginLog_2017-10_client_1001
檢索全部: KEYS loginLog_*
檢索某年某月全部: KEYS loginLog_2017-10_*
檢索單個用戶全部: KEYS loginLog_*_client_1001
檢索單個類型全部: KEYS loginLog_*_office_*
...  

  每條BitMap記錄單個用戶一個月的登錄情況,一個bit位表示一天登錄情況。

設置用戶1001,217-10-25登錄: SETBIT loginLog_2017-10_client_1001 25 1
獲取用戶1001,217-10-25是否登錄:GETBIT loginLog_2017-10_client_1001 25
獲取用戶1001,217-10月是否登錄: GETCOUNT loginLog_2017-10_client_1001
獲取用戶1001,217-10/9/7月是否登錄:BITOP OR stat loginLog_2017-10_client_1001 loginLog_2017-09_client_1001 loginLog_2017-07_client_1001
...

  關于獲取登錄信息,就得獲取BitMap然后拆開,循環進行判斷。特別涉及時間范圍,需要注意時間邊界的問題,不要查詢出多余的數據

  獲取數據Redis優先級高于數據庫,Redis有的記錄不要去數據庫獲取

  Redis數據過期:在數據同步中進行判斷,過期時間自己定義(我定義的過期時間單位為“天”,必須大于31)。

  在不能保證同步與過期一致性的問題,不要給Key設置過期時間,會造成數據丟失。

上一次更新時間: 2107-10-02
下一次更新時間: 2017-10-09
Redis BitMap 過期時間: 2017-10-05

這樣會造成:2017-10-09同步的時候,3/4/5/6/7/8/9 數據丟失 

 所以我把Redis過期數據放到同步時進行判斷  

  我自己想的同步策略(定時每周一凌晨同步):

一、驗證是否需要進行同步:

1. 當前日期 >= 8號,對本月所有記錄進行同步,不對本月之前的記錄進行同步

2. 當前日期 8號,對本月所有記錄進行同步,對本月前一個月的記錄進行同步,對本月前一個月之前的所有記錄不進行同步

二、驗證過期,如果過期,記錄日志后刪除[/code]3.2 數據庫,表結構

  每周同步一次數據到數據庫,表中一條數據對應一個BitMap,記錄一個月數據。每次更新已存在的、插入沒有的

3.3 暫定接口 

  •  設置用戶登錄
  •  查詢單個用戶某天是否登錄過
  • 查詢單個用戶某月是否登錄過
  •  查詢單個用戶某個時間段是否登錄過
  •  查詢單個用戶某個時間段登錄信息
  •  指定用戶類型:獲取某個時間段內有效登錄的用戶
  •  全部用戶:獲取某個時間段內有效登錄的用戶

4. Code

  TP3中實現的代碼,在接口服務器內部庫中,Application\Lib\

  ├─LoginLog

  │├─Logs 日志目錄,Redis中過期的記錄刪除寫入日志進行備份

  │├─LoginLog.class.php 對外接口

  │├─LoginLogCommon.class.php 公共工具類

  │├─LoginLogDBHandle.class.php 數據庫操作類

  │├─LoginLogRedisHandle.class.php Redis操作類

4.1 LoginLog.class.php

?php

namespace Lib\LoginLog;
use Lib\CLogFileHandler;
use Lib\HObject;
use Lib\Log;
use Lib\Tools;

/**
* 登錄日志操作類
* User: dbn
* Date: 2017/10/11
* Time: 12:01
* ------------------------
* 日志最小粒度為:天
*/

class LoginLog extends HObject
{
private $_redisHandle; // Redis登錄日志處理
private $_dbHandle;  // 數據庫登錄日志處理

public function __construct()
{
$this->_redisHandle = new LoginLogRedisHandle($this);
$this->_dbHandle  = new LoginLogDBHandle($this);

// 初始化日志
$logHandler = new CLogFileHandler(__DIR__ . '/Logs/del.log');
Log::Init($logHandler, 15);
}

/**
* 記錄登錄:每天只記錄一次登錄,只允許設置當月內登錄記錄
* @param string $type 用戶類型
* @param int  $uid 唯一標識(用戶ID)
* @param int  $time 時間戳
* @return boolean
*/
public function setLogging($type, $uid, $time)
{
$key = $this->_redisHandle->getLoginLogKey($type, $uid, $time);
if ($this->_redisHandle->checkLoginLogKey($key)) {
return $this->_redisHandle->setLogging($key, $time);
}
return false;
}

/**
* 查詢用戶某一天是否登錄過
* @param string $type 用戶類型
* @param int  $uid 唯一標識(用戶ID)
* @param int  $time 時間戳
* @return boolean 參數錯誤或未登錄過返回false,登錄過返回true
*/
public function getDateWhetherLogin($type, $uid, $time)
{
$key = $this->_redisHandle->getLoginLogKey($type, $uid, $time);
if ($this->_redisHandle->checkLoginLogKey($key)) {

// 判斷Redis中是否存在記錄
$isRedisExists = $this->_redisHandle->checkRedisLogExists($key);
if ($isRedisExists) {

// 從Redis中進行判斷
return $this->_redisHandle->dateWhetherLogin($key, $time);
} else {

// 從數據庫中進行判斷
return $this->_dbHandle->dateWhetherLogin($type, $uid, $time);
}
}
return false;
}

/**
* 查詢用戶某月是否登錄過
* @param string $type 用戶類型
* @param int  $uid 唯一標識(用戶ID)
* @param int  $time 時間戳
* @return boolean 參數錯誤或未登錄過返回false,登錄過返回true
*/
public function getDateMonthWhetherLogin($type, $uid, $time)
{
$key = $this->_redisHandle->getLoginLogKey($type, $uid, $time);
if ($this->_redisHandle->checkLoginLogKey($key)) {

// 判斷Redis中是否存在記錄
$isRedisExists = $this->_redisHandle->checkRedisLogExists($key);
if ($isRedisExists) {

// 從Redis中進行判斷
return $this->_redisHandle->dateMonthWhetherLogin($key);
} else {

// 從數據庫中進行判斷
return $this->_dbHandle->dateMonthWhetherLogin($type, $uid, $time);
}
}
return false;
}

/**
* 查詢用戶在某個時間段是否登錄過
* @param string $type 用戶類型
* @param int  $uid 唯一標識(用戶ID)
* @param int  $startTime 開始時間戳
* @param int  $endTime  結束時間戳
* @return boolean 參數錯誤或未登錄過返回false,登錄過返回true
*/
public function getTimeRangeWhetherLogin($type, $uid, $startTime, $endTime){
$result = $this->getUserTimeRangeLogin($type, $uid, $startTime, $endTime);
if ($result['hasLog']['count'] > 0) {
return true;
}
return false;
}

/**
* 獲取用戶某時間段內登錄信息
* @param string $type   用戶類型
* @param int  $uid    唯一標識(用戶ID)
* @param int  $startTime 開始時間戳
* @param int  $endTime  結束時間戳
* @return array 參數錯誤或未查詢到返回array()
* -------------------------------------------------
* 查詢到結果:
* array(
*   'hasLog' => array(
*     'count' => n,                 // 有效登錄次數,每天重復登錄算一次
*     'list' => array('2017-10-1', '2017-10-15' ...) // 有效登錄日期
*   ),
*   'notLog' => array(
*     'count' => n,                 // 未登錄次數
*     'list' => array('2017-10-1', '2017-10-15' ...) // 未登錄日期
*   )
* )
*/
public function getUserTimeRangeLogin($type, $uid, $startTime, $endTime)
{
$hasCount  = 0;    // 有效登錄次數
$notCount  = 0;    // 未登錄次數
$hasList  = array(); // 有效登錄日期
$notList  = array(); // 未登錄日期
$successFlg = false;  // 查詢到數據標識

if ($this->checkTimeRange($startTime, $endTime)) {

// 獲取需要查詢的Key
$keyList = $this->_redisHandle->getTimeRangeRedisKey($type, $uid, $startTime, $endTime);

if (!empty($keyList)) {
foreach ($keyList as $key => $val) {

// 判斷Redis中是否存在記錄
$isRedisExists = $this->_redisHandle->checkRedisLogExists($val['key']);
if ($isRedisExists) {

// 存在,直接從Redis中獲取
$logInfo = $this->_redisHandle->getUserTimeRangeLogin($val['key'], $startTime, $endTime);
} else {

// 不存在,嘗試從數據庫中讀取
$logInfo = $this->_dbHandle->getUserTimeRangeLogin($type, $uid, $val['time'], $startTime, $endTime);
}

if (is_array($logInfo)) {
$hasCount += $logInfo['hasLog']['count'];
$hasList = array_merge($hasList, $logInfo['hasLog']['list']);
$notCount += $logInfo['notLog']['count'];
$notList = array_merge($notList, $logInfo['notLog']['list']);
$successFlg = true;
}
}
}
}

if ($successFlg) {
return array(
'hasLog' => array(
'count' => $hasCount,
'list' => $hasList
),
'notLog' => array(
'count' => $notCount,
'list' => $notList
)
);
}

return array();
}

/**
* 獲取某段時間內有效登錄過的用戶 統一接口
* @param int  $startTime 開始時間戳
* @param int  $endTime  結束時間戳
* @param array $typeArr  用戶類型,為空時獲取全部類型
* @return array 參數錯誤或未查詢到返回array()
* -------------------------------------------------
* 查詢到結果:指定用戶類型
* array(
*   'type1' => array(
*     'count' => n,           // type1 有效登錄總用戶數
*     'list' => array('111', '222' ...) // type1 有效登錄用戶
*   ),
*   'type2' => array(
*     'count' => n,           // type2 有效登錄總用戶數
*     'list' => array('333', '444' ...) // type2 有效登錄用戶
*   )
* )
* -------------------------------------------------
* 查詢到結果:未指定用戶類型,全部用戶,固定鍵 'all'
* array(
*   'all' => array(
*     'count' => n,           // 有效登錄總用戶數
*     'list' => array('111', '222' ...) // 有效登錄用戶
*   )
* )
*/
public function getOrientedTimeRangeLogin($startTime, $endTime, $typeArr = array())
{
if ($this->checkTimeRange($startTime, $endTime)) {

// 判斷是否指定類型
if (is_array($typeArr)  !empty($typeArr)) {

// 指定類型,驗證類型合法性
if ($this->checkTypeArr($typeArr)) {

// 依據類型獲取
return $this->getSpecifyTypeTimeRangeLogin($startTime, $endTime, $typeArr);
}
} else {

// 未指定類型,統一獲取
return $this->getSpecifyAllTimeRangeLogin($startTime, $endTime);
}
}
return array();
}

/**
* 指定類型:獲取某段時間內登錄過的用戶
* @param int  $startTime 開始時間戳
* @param int  $endTime  結束時間戳
* @param array $typeArr  用戶類型
* @return array
*/
private function getSpecifyTypeTimeRangeLogin($startTime, $endTime, $typeArr)
{
$data = array();
$successFlg = false; // 查詢到數據標識

// 指定類型,根據類型單獨獲取,進行整合
foreach ($typeArr as $typeArrVal) {

// 獲取需要查詢的Key
$keyList = $this->_redisHandle->getSpecifyTypeTimeRangeRedisKey($typeArrVal, $startTime, $endTime);
if (!empty($keyList)) {

$data[$typeArrVal]['count'] = 0;    // 該類型下有效登錄用戶數
$data[$typeArrVal]['list'] = array(); // 該類型下有效登錄用戶

foreach ($keyList as $keyListVal) {

// 查詢Kye,驗證Redis中是否存在:此處為單個類型,所以直接看Redis中是否存在該類型Key即可判斷是否存在
// 存在的數據不需要去數據庫中去查看
$standardKeyList = $this->_redisHandle->getKeys($keyListVal['key']);
if (is_array($standardKeyList)  count($standardKeyList) > 0) {

// Redis存在
foreach ($standardKeyList as $standardKeyListVal) {

// 驗證該用戶在此時間段是否登錄過
$redisCheckLogin = $this->_redisHandle->getUserTimeRangeLogin($standardKeyListVal, $startTime, $endTime);
if ($redisCheckLogin['hasLog']['count'] > 0) {

// 同一個用戶只需記錄一次
$uid = $this->_redisHandle->getLoginLogKeyInfo($standardKeyListVal, 'uid');
if (!in_array($uid, $data[$typeArrVal]['list'])) {
$data[$typeArrVal]['count']++;
$data[$typeArrVal]['list'][] = $uid;
}
$successFlg = true;
}
}

} else {

// 不存在,嘗試從數據庫中獲取
$dbResult = $this->_dbHandle->getTimeRangeLoginSuccessUser($keyListVal['time'], $startTime, $endTime, $typeArrVal);
if (!empty($dbResult)) {
foreach ($dbResult as $dbResultVal) {
if (!in_array($dbResultVal, $data[$typeArrVal]['list'])) {
$data[$typeArrVal]['count']++;
$data[$typeArrVal]['list'][] = $dbResultVal;
}
}
$successFlg = true;
}
}
}
}
}

if ($successFlg) { return $data; }
return array();
}

/**
* 全部類型:獲取某段時間內登錄過的用戶
* @param int  $startTime 開始時間戳
* @param int  $endTime  結束時間戳
* @return array
*/
private function getSpecifyAllTimeRangeLogin($startTime, $endTime)
{
$count   = 0;    // 有效登錄用戶數
$list    = array(); // 有效登錄用戶
$successFlg = false;  // 查詢到數據標識

// 未指定類型,直接對所有數據進行檢索
// 獲取需要查詢的Key
$keyList = $this->_redisHandle->getSpecifyAllTimeRangeRedisKey($startTime, $endTime);

if (!empty($keyList)) {
foreach ($keyList as $keyListVal) {

// 查詢Kye
$standardKeyList = $this->_redisHandle->getKeys($keyListVal['key']);

if (is_array($standardKeyList)  count($standardKeyList) > 0) {

// 查詢到Key,直接讀取數據,記錄類型
foreach ($standardKeyList as $standardKeyListVal) {

// 驗證該用戶在此時間段是否登錄過
$redisCheckLogin = $this->_redisHandle->getUserTimeRangeLogin($standardKeyListVal, $startTime, $endTime);
if ($redisCheckLogin['hasLog']['count'] > 0) {

// 同一個用戶只需記錄一次
$uid = $this->_redisHandle->getLoginLogKeyInfo($standardKeyListVal, 'uid');
if (!in_array($uid, $list)) {
$count++;
$list[] = $uid;
}
$successFlg = true;
}
}
}

// 無論Redis中存在不存在都要嘗試從數據庫中獲取一遍數據,來補充Redis獲取的數據,保證檢索數據完整(Redis類型缺失可能導致)
$dbResult = $this->_dbHandle->getTimeRangeLoginSuccessUser($keyListVal['time'], $startTime, $endTime);
if (!empty($dbResult)) {
foreach ($dbResult as $dbResultVal) {
if (!in_array($dbResultVal, $list)) {
$count++;
$list[] = $dbResultVal;
}
}
$successFlg = true;
}
}
}

if ($successFlg) {
return array(
'all' => array(
'count' => $count,
'list' => $list
)
);
}
return array();
}

/**
* 驗證開始結束時間
* @param string $startTime 開始時間
* @param string $endTime  結束時間
* @return boolean
*/
private function checkTimeRange($startTime, $endTime)
{
return $this->_redisHandle->checkTimeRange($startTime, $endTime);
}

/**
* 批量驗證用戶類型
* @param array $typeArr 用戶類型數組
* @return boolean
*/
private function checkTypeArr($typeArr)
{
$flg = false;
if (is_array($typeArr)  !empty($typeArr)) {
foreach ($typeArr as $val) {
if ($this->_redisHandle->checkType($val)) {
$flg = true;
} else {
$flg = false; break;
}
}
}
return $flg;
}

/**
* 定時任務每周調用一次:從Redis同步登錄日志到數據庫
* @param int  $existsDay 一條記錄在Redis中過期時間,單位:天,必須大于31
* @return string
* 'null':  Redis中無數據
* 'fail':  同步失敗
* 'success':同步成功
*/
public function cronWeeklySync($existsDay)
{

// 驗證生存時間
if ($this->_redisHandle->checkExistsDay($existsDay)) {
$likeKey = 'loginLog_*';
$keyList = $this->_redisHandle->getKeys($likeKey);

if (!empty($keyList)) {
foreach ($keyList as $keyVal) {

if ($this->_redisHandle->checkLoginLogKey($keyVal)) {
$keyTime     = $this->_redisHandle->getLoginLogKeyInfo($keyVal, 'time');
$thisMonth    = date('Y-m');
$beforeMonth   = date('Y-m', strtotime('-1 month'));

// 驗證是否需要進行同步:
// 1. 當前日期 >= 8號,對本月所有記錄進行同步,不對本月之前的記錄進行同步
// 2. 當前日期  8號,對本月所有記錄進行同步,對本月前一個月的記錄進行同步,對本月前一個月之前的所有記錄不進行同步
if (date('j') >= 8) {

// 只同步本月數據
if ($thisMonth == $keyTime) {
$this->redis2db($keyVal);
}
} else {

// 同步本月或本月前一個月數據
if ($thisMonth == $keyTime || $beforeMonth == $keyTime) {
$this->redis2db($keyVal);
}
}

// 驗證是否過期
$existsSecond = $existsDay * 24 * 60 * 60;
if (strtotime($keyTime) + $existsSecond  time()) {

// 過期刪除
$bitMap = $this->_redisHandle->getLoginLogBitMap($keyVal);
Log::INFO('刪除過期數據[' . $keyVal . ']:' . $bitMap);
$this->_redisHandle->delLoginLog($keyVal);
}
}
}
return 'success';
}
return 'null';
}
return 'fail';
}

/**
* 將記錄同步到數據庫
* @param string $key 記錄Key
* @return boolean
*/
private function redis2db($key)
{
if ($this->_redisHandle->checkLoginLogKey($key)  $this->_redisHandle->checkRedisLogExists($key)) {
$time = $this->_redisHandle->getLoginLogKeyInfo($key, 'time');
$data['id']   = Tools::generateId();
$data['user_id'] = $this->_redisHandle->getLoginLogKeyInfo($key, 'uid');
$data['type']  = $this->_redisHandle->getLoginLogKeyInfo($key, 'type');
$data['year']  = date('Y', strtotime($time));
$data['month']  = date('n', strtotime($time));
$data['bit_log'] = $this->_redisHandle->getLoginLogBitMap($key);
return $this->_dbHandle->redis2db($data);
}
return false;
}
}

4.2 LoginLogCommon.class.php

?php

namespace Lib\LoginLog;

use Lib\RedisData;
use Lib\Status;

/**
* 公共方法
* User: dbn
* Date: 2017/10/11
* Time: 13:11
*/
class LoginLogCommon
{
protected $_loginLog;
protected $_redis;

public function __construct(LoginLog $loginLog)
{
$this->_loginLog = $loginLog;
$this->_redis  = RedisData::getRedis();
}

/**
* 驗證用戶類型
* @param string $type 用戶類型
* @return boolean
*/
protected function checkType($type)
{
if (in_array($type, array(
Status::LOGIN_LOG_TYPE_ADMIN,
Status::LOGIN_LOG_TYPE_CARRIER,
Status::LOGIN_LOG_TYPE_DRIVER,
Status::LOGIN_LOG_TYPE_OFFICE,
Status::LOGIN_LOG_TYPE_CLIENT,
))) {
return true;
}
$this->_loginLog->setError('未定義的日志類型:' . $type);
return false;
}

/**
* 驗證唯一標識
* @param string $uid
* @return boolean
*/
protected function checkUid($uid)
{
if (is_numeric($uid)  $uid > 0) {
return true;
}
$this->_loginLog->setError('唯一標識非法:' . $uid);
return false;
}

/**
* 驗證時間戳
* @param string $time
* @return boolean
*/
protected function checkTime($time)
{
if (is_numeric($time)  $time > 0) {
return true;
}
$this->_loginLog->setError('時間戳非法:' . $time);
return false;
}

/**
* 驗證時間是否在當月中
* @param string $time
* @return boolean
*/
protected function checkTimeWhetherThisMonth($time)
{
if ($this->checkTime($time)  $time > strtotime(date('Y-m'))  $time  strtotime(date('Y-m') . '-' . date('t'))) {
return true;
}
$this->_loginLog->setError('時間未在當前月份中:' . $time);
return false;
}

/**
* 驗證時間是否超過當前時間
* @param string $time
* @return boolean
*/
protected function checkTimeWhetherFutureTime($time)
{
if ($this->checkTime($time)  $time = time()) {
return true;
}
return false;
}

/**
* 驗證開始/結束時間
* @param string $startTime 開始時間
* @param string $endTime  結束時間
* @return boolean
*/
protected function checkTimeRange($startTime, $endTime)
{
if ($this->checkTime($startTime) 
$this->checkTime($endTime) 
$startTime  $endTime 
$startTime  time()
) {
return true;
}
$this->_loginLog->setError('時間范圍非法:' . $startTime . '-' . $endTime);
return false;
}

/**
* 驗證時間是否在指定范圍內
* @param string $time   需要檢查的時間
* @param string $startTime 開始時間
* @param string $endTime  結束時間
* @return boolean
*/
protected function checkTimeWithinTimeRange($time, $startTime, $endTime)
{
if ($this->checkTime($time) 
$this->checkTimeRange($startTime, $endTime) 
$startTime = $time 
$time = $endTime
) {
return true;
}
$this->_loginLog->setError('請求時間未在時間范圍內:' . $time . '-' . $startTime . '-' . $endTime);
return false;
}

/**
* 驗證Redis日志記錄標準Key
* @param string $key
* @return boolean
*/
protected function checkLoginLogKey($key)
{
$pattern = '/^loginLog_\d{4}-\d{1,2}_\S+_\d+$/';
$result = preg_match($pattern, $key, $match);
if ($result > 0) {
return true;
}
$this->_loginLog->setError('RedisKey非法:' . $key);
return false;
}

/**
* 獲取月份中有多少天
* @param int $time 時間戳
* @return int
*/
protected function getDaysInMonth($time)
{
return date('t', $time);
}

/**
* 對沒有前導零的月份或日設置前導零
* @param int $num 月份或日
* @return string
*/
protected function setDateLeadingZero($num)
{
if (is_numeric($num)  strlen($num) = 2) {
$num = (strlen($num) > 1 ? $num : '0' . $num);
}
return $num;
}

/**
* 驗證過期時間
* @param int   $existsDay 一條記錄在Redis中過期時間,單位:天,必須大于31
* @return boolean
*/
protected function checkExistsDay($existsDay)
{
if (is_numeric($existsDay)  ctype_digit(strval($existsDay))  $existsDay > 31) {
return true;
}
$this->_loginLog->setError('過期時間非法:' . $existsDay);
return false;
}

/**
* 獲取開始日期邊界
* @param int $time   需要判斷的時間戳
* @param int $startTime 起始時間
* @return int
*/
protected function getStartTimeBorder($time, $startTime)
{
$initDay = 1;
if ($this->checkTime($time)  $this->checkTime($startTime) 
date('Y-m', $time) === date('Y-m', $startTime)  false !== date('Y-m', $time)) {
$initDay = date('j', $startTime);
}
return $initDay;
}

/**
* 獲取結束日期邊界
* @param int $time   需要判斷的時間戳
* @param int $endTime  結束時間
* @return int
*/
protected function getEndTimeBorder($time, $endTime)
{
$border = $this->getDaysInMonth($time);
if ($this->checkTime($time)  $this->checkTime($endTime) 
date('Y-m', $time) === date('Y-m', $endTime)  false !== date('Y-m', $time)) {
$border = date('j', $endTime);
}
return $border;
}
}

4.3 LoginLogDBHandle.class.php

?php

namespace Lib\LoginLog;
use Think\Model;

/**
* 數據庫登錄日志處理類
* User: dbn
* Date: 2017/10/11
* Time: 13:12
*/
class LoginLogDBHandle extends LoginLogCommon
{

/**
* 從數據庫中獲取用戶某月記錄在指定時間范圍內的用戶信息
* @param string $type   用戶類型
* @param int   $uid    唯一標識(用戶ID)
* @param int   $time   需要查詢月份時間戳
* @param int   $startTime 開始時間戳
* @param int   $endTime  結束時間戳
* @return array
* array(
*   'hasLog' => array(
*     'count' => n,                 // 有效登錄次數,每天重復登錄算一次
*     'list' => array('2017-10-1', '2017-10-15' ...) // 有效登錄日期
*   ),
*   'notLog' => array(
*     'count' => n,                 // 未登錄次數
*     'list' => array('2017-10-1', '2017-10-15' ...) // 未登錄日期
*   )
* )
*/
public function getUserTimeRangeLogin($type, $uid, $time, $startTime, $endTime)
{
$hasCount = 0;    // 有效登錄次數
$notCount = 0;    // 未登錄次數
$hasList = array(); // 有效登錄日期
$notList = array(); // 未登錄日期

if ($this->checkType($type)  $this->checkUid($uid)  $this->checkTimeWithinTimeRange($time, $startTime, $endTime)) {

$timeYM = date('Y-m', $time);

// 設置開始時間
$initDay = $this->getStartTimeBorder($time, $startTime);

// 設置結束時間
$border = $this->getEndTimeBorder($time, $endTime);

$bitMap = $this->getBitMapFind($type, $uid, date('Y', $time), date('n', $time));
for ($i = $initDay; $i = $border; $i++) {

if (!empty($bitMap)) {
if ($bitMap[$i-1] == '1') {
$hasCount++;
$hasList[] = $timeYM . '-' . $this->setDateLeadingZero($i);
} else {
$notCount++;
$notList[] = $timeYM . '-' . $this->setDateLeadingZero($i);
}
} else {
$notCount++;
$notList[] = $timeYM . '-' . $this->setDateLeadingZero($i);
}
}
}

return array(
'hasLog' => array(
'count' => $hasCount,
'list' => $hasList
),
'notLog' => array(
'count' => $notCount,
'list' => $notList
)
);
}

/**
* 從數據庫獲取用戶某月日志位圖
* @param string $type 用戶類型
* @param int   $uid  唯一標識(用戶ID)
* @param int   $year 年Y
* @param int   $month 月n
* @return string
*/
private function getBitMapFind($type, $uid, $year, $month)
{
$model = D('Home/StatLoginLog');
$map['type']  = array('EQ', $type);
$map['user_id'] = array('EQ', $uid);
$map['year']  = array('EQ', $year);
$map['month']  = array('EQ', $month);

$result = $model->field('bit_log')->where($map)->find();
if (false !== $result  isset($result['bit_log'])  !empty($result['bit_log'])) {
return $result['bit_log'];
}
return '';
}

/**
* 從數據庫中判斷用戶在某一天是否登錄過
* @param string $type 用戶類型
* @param int   $uid  唯一標識(用戶ID)
* @param int   $time 時間戳
* @return boolean 參數錯誤或未登錄過返回false,登錄過返回true
*/
public function dateWhetherLogin($type, $uid, $time)
{
if ($this->checkType($type)  $this->checkUid($uid)  $this->checkTime($time)) {

$timeInfo = getdate($time);
$bitMap = $this->getBitMapFind($type, $uid, $timeInfo['year'], $timeInfo['mon']);
if (!empty($bitMap)) {
if ($bitMap[$timeInfo['mday']-1] == '1') {
return true;
}
}
}
return false;
}

/**
* 從數據庫中判斷用戶在某月是否登錄過
* @param string $type 用戶類型
* @param int   $uid  唯一標識(用戶ID)
* @param int   $time 時間戳
* @return boolean 參數錯誤或未登錄過返回false,登錄過返回true
*/
public function dateMonthWhetherLogin($type, $uid, $time)
{
if ($this->checkType($type)  $this->checkUid($uid)  $this->checkTime($time)) {

$timeInfo = getdate($time);
$userArr = $this->getMonthLoginSuccessUser($timeInfo['year'], $timeInfo['mon'], $type);
if (!empty($userArr)) {
if (in_array($uid, $userArr)) {
return true;
}
}
}
return false;
}

/**
* 獲取某月所有有效登錄過的用戶ID
* @param int   $year 年Y
* @param int   $month 月n
* @param string $type 用戶類型,為空時獲取全部類型
* @return array
*/
public function getMonthLoginSuccessUser($year, $month, $type = '')
{
$data = array();
if (is_numeric($year)  is_numeric($month)) {
$model = D('Home/StatLoginLog');
$map['year']  = array('EQ', $year);
$map['month']  = array('EQ', $month);
$map['bit_log'] = array('LIKE', '%1%');
if ($type != ''  $this->checkType($type)) {
$map['type']  = array('EQ', $type);
}
$result = $model->field('user_id')->where($map)->select();
if (false !== $result  count($result) > 0) {
foreach ($result as $val) {
if (isset($val['user_id'])) {
$data[] = $val['user_id'];
}
}
}
}
return $data;
}

/**
* 從數據庫中獲取某月所有記錄在指定時間范圍內的用戶ID
* @param int   $time   查詢的時間戳
* @param int   $startTime 開始時間戳
* @param int   $endTime  結束時間戳
* @param string $type 用戶類型,為空時獲取全部類型
* @return array
*/
public function getTimeRangeLoginSuccessUser($time, $startTime, $endTime, $type = '')
{
$data = array();
if ($this->checkTimeWithinTimeRange($time, $startTime, $endTime)) {

$timeInfo = getdate($time);

// 獲取滿足時間條件的記錄
$model = D('Home/StatLoginLog');
$map['year']  = array('EQ', $timeInfo['year']);
$map['month']  = array('EQ', $timeInfo['mon']);
if ($type != ''  $this->checkType($type)) {
$map['type']  = array('EQ', $type);
}

$result = $model->where($map)->select();
if (false !== $result  count($result) > 0) {

// 設置開始時間
$initDay = $this->getStartTimeBorder($time, $startTime);

// 設置結束時間
$border = $this->getEndTimeBorder($time, $endTime);

foreach ($result as $val) {

$bitMap = $val['bit_log'];
for ($i = $initDay; $i = $border; $i++) {

if ($bitMap[$i-1] == '1'  !in_array($val['user_id'], $data)) {
$data[] = $val['user_id'];
}
}
}
}
}
return $data;
}

/**
* 將數據更新到數據庫
* @param array $data 單條記錄的數據
* @return boolean
*/
public function redis2db($data)
{
$model = D('Home/StatLoginLog');

// 驗證記錄是否存在
$map['user_id'] = array('EQ', $data['user_id']);
$map['type']  = array('EQ', $data['type']);
$map['year']  = array('EQ', $data['year']);
$map['month']  = array('EQ', $data['month']);

$count = $model->where($map)->count();
if (false !== $count  $count > 0) {

// 存在記錄進行更新
$saveData['bit_log'] = $data['bit_log'];

if (!$model->create($saveData, Model::MODEL_UPDATE)) {

$this->_loginLog->setError('同步登錄日志-更新記錄,創建數據對象失敗:' . $model->getError());
logger()->error('同步登錄日志-更新記錄,創建數據對象失敗:' . $model->getError());
return false;
} else {

$result = $model->where($map)->save();

if (false !== $result) {
return true;
} else {
$this->_loginLog->setError('同步登錄日志-更新記錄,更新數據失敗:' . json_encode($data));
logger()->error('同步登錄日志-更新記錄,更新數據失敗:' . json_encode($data));
return false;
}
}
} else {

// 不存在記錄插入一條新的記錄
if (!$model->create($data, Model::MODEL_INSERT)) {

$this->_loginLog->setError('同步登錄日志-插入記錄,創建數據對象失敗:' . $model->getError());
logger()->error('同步登錄日志-插入記錄,創建數據對象失敗:' . $model->getError());
return false;
} else {

$result = $model->add();

if (false !== $result) {
return true;
} else {
$this->_loginLog->setError('同步登錄日志-插入記錄,插入數據失敗:' . json_encode($data));
logger()->error('同步登錄日志-插入記錄,插入數據失敗:' . json_encode($data));
return false;
}
}
}
}
}

4.4 LoginLogRedisHandle.class.php

?php

namespace Lib\LoginLog;

/**
* Redis登錄日志處理類
* User: dbn
* Date: 2017/10/11
* Time: 15:53
*/
class LoginLogRedisHandle extends LoginLogCommon
{
/**
* 記錄登錄:每天只記錄一次登錄,只允許設置當月內登錄記錄
* @param string $key 日志記錄Key
* @param int  $time 時間戳
* @return boolean
*/
public function setLogging($key, $time)
{
if ($this->checkLoginLogKey($key)  $this->checkTimeWhetherThisMonth($time)) {

// 判斷用戶當天是否已經登錄過
$whetherLoginResult = $this->dateWhetherLogin($key, $time);
if (!$whetherLoginResult) {

// 當天未登錄,記錄登錄
$this->_redis->setBit($key, date('d', $time), 1);
}
return true;
}
return false;
}

/**
* 從Redis中判斷用戶在某一天是否登錄過
* @param string $key 日志記錄Key
* @param int  $time 時間戳
* @return boolean 參數錯誤或未登錄過返回false,登錄過返回true
*/
public function dateWhetherLogin($key, $time)
{
if ($this->checkLoginLogKey($key)  $this->checkTime($time)) {
$result = $this->_redis->getBit($key, date('d', $time));
if ($result === 1) {
return true;
}
}
return false;
}

/**
* 從Redis中判斷用戶在某月是否登錄過
* @param string $key 日志記錄Key
* @return boolean 參數錯誤或未登錄過返回false,登錄過返回true
*/
public function dateMonthWhetherLogin($key)
{
if ($this->checkLoginLogKey($key)) {
$result = $this->_redis->bitCount($key);
if ($result > 0) {
return true;
}
}
return false;
}

/**
* 判斷某月登錄記錄在Redis中是否存在
* @param string $key 日志記錄Key
* @return boolean
*/
public function checkRedisLogExists($key)
{
if ($this->checkLoginLogKey($key)) {
if ($this->_redis->exists($key)) {
return true;
}
}
return false;
}

/**
* 從Redis中獲取用戶某月記錄在指定時間范圍內的用戶信息
* @param string $key    日志記錄Key
* @param int   $startTime 開始時間戳
* @param int   $endTime  結束時間戳
* @return array
* array(
*   'hasLog' => array(
*     'count' => n,                 // 有效登錄次數,每天重復登錄算一次
*     'list' => array('2017-10-1', '2017-10-15' ...) // 有效登錄日期
*   ),
*   'notLog' => array(
*     'count' => n,                 // 未登錄次數
*     'list' => array('2017-10-1', '2017-10-15' ...) // 未登錄日期
*   )
* )
*/
public function getUserTimeRangeLogin($key, $startTime, $endTime)
{
$hasCount = 0;    // 有效登錄次數
$notCount = 0;    // 未登錄次數
$hasList = array(); // 有效登錄日期
$notList = array(); // 未登錄日期

if ($this->checkLoginLogKey($key)  $this->checkTimeRange($startTime, $endTime)  $this->checkRedisLogExists($key)) {

$keyTime = $this->getLoginLogKeyInfo($key, 'time');
$keyTime = strtotime($keyTime);
$timeYM = date('Y-m', $keyTime);

// 設置開始時間
$initDay = $this->getStartTimeBorder($keyTime, $startTime);

// 設置結束時間
$border = $this->getEndTimeBorder($keyTime, $endTime);

for ($i = $initDay; $i = $border; $i++) {
$result = $this->_redis->getBit($key, $i);
if ($result === 1) {
$hasCount++;
$hasList[] = $timeYM . '-' . $this->setDateLeadingZero($i);
} else {
$notCount++;
$notList[] = $timeYM . '-' . $this->setDateLeadingZero($i);
}
}
}

return array(
'hasLog' => array(
'count' => $hasCount,
'list' => $hasList
),
'notLog' => array(
'count' => $notCount,
'list' => $notList
)
);
}

/**
* 面向用戶:獲取時間范圍內可能需要的Key
* @param string $type   用戶類型
* @param int  $uid    唯一標識(用戶ID)
* @param string $startTime 開始時間
* @param string $endTime  結束時間
* @return array
*/
public function getTimeRangeRedisKey($type, $uid, $startTime, $endTime)
{
$list = array();

if ($this->checkType($type)  $this->checkUid($uid)  $this->checkTimeRange($startTime, $endTime)) {

$data = $this->getSpecifyUserKeyHandle($type, $uid, $startTime);
if (!empty($data)) { $list[] = $data; }

$temYM = strtotime('+1 month', strtotime(date('Y-m', $startTime)));

while ($temYM = $endTime) {
$data = $this->getSpecifyUserKeyHandle($type, $uid, $temYM);
if (!empty($data)) { $list[] = $data; }

$temYM = strtotime('+1 month', $temYM);
}
}
return $list;
}
private function getSpecifyUserKeyHandle($type, $uid, $time)
{
$data = array();
$key = $this->getLoginLogKey($type, $uid, $time);
if ($this->checkLoginLogKey($key)) {
$data = array(
'key' => $key,
'time' => $time
);
}
return $data;
}

/**
* 面向類型:獲取時間范圍內可能需要的Key
* @param string $type   用戶類型
* @param string $startTime 開始時間
* @param string $endTime  結束時間
* @return array
*/
public function getSpecifyTypeTimeRangeRedisKey($type, $startTime, $endTime)
{
$list = array();

if ($this->checkType($type)  $this->checkTimeRange($startTime, $endTime)) {

$data = $this->getSpecifyTypeKeyHandle($type, $startTime);
if (!empty($data)) { $list[] = $data; }

$temYM = strtotime('+1 month', strtotime(date('Y-m', $startTime)));

while ($temYM = $endTime) {
$data = $this->getSpecifyTypeKeyHandle($type, $temYM);
if (!empty($data)) { $list[] = $data; }

$temYM = strtotime('+1 month', $temYM);
}
}
return $list;
}
private function getSpecifyTypeKeyHandle($type, $time)
{
$data = array();
$temUid = '11111111';

$key = $this->getLoginLogKey($type, $temUid, $time);
if ($this->checkLoginLogKey($key)) {
$arr = explode('_', $key);
$arr[count($arr)-1] = '*';
$key = implode('_', $arr);
$data = array(
'key' => $key,
'time' => $time
);
}
return $data;
}

/**
* 面向全部:獲取時間范圍內可能需要的Key
* @param string $startTime 開始時間
* @param string $endTime  結束時間
* @return array
*/
public function getSpecifyAllTimeRangeRedisKey($startTime, $endTime)
{
$list = array();

if ($this->checkTimeRange($startTime, $endTime)) {

$data = $this->getSpecifyAllKeyHandle($startTime);
if (!empty($data)) { $list[] = $data; }

$temYM = strtotime('+1 month', strtotime(date('Y-m', $startTime)));

while ($temYM = $endTime) {
$data = $this->getSpecifyAllKeyHandle($temYM);
if (!empty($data)) { $list[] = $data; }

$temYM = strtotime('+1 month', $temYM);
}
}
return $list;
}
private function getSpecifyAllKeyHandle($time)
{
$data = array();
$temUid = '11111111';
$temType = 'office';

$key = $this->getLoginLogKey($temType, $temUid, $time);
if ($this->checkLoginLogKey($key)) {
$arr = explode('_', $key);
array_pop($arr);
$arr[count($arr)-1] = '*';
$key = implode('_', $arr);
$data = array(
'key' => $key,
'time' => $time
);
}
return $data;
}

/**
* 從Redis中查詢滿足條件的Key
* @param string $key 查詢的Key
* @return array
*/
public function getKeys($key)
{
return $this->_redis->keys($key);
}

/**
* 從Redis中刪除記錄
* @param string $key 記錄的Key
* @return boolean
*/
public function delLoginLog($key)
{
return $this->_redis->del($key);
}

/**
* 獲取日志標準Key:前綴_年-月_用戶類型_唯一標識
* @param string $type 用戶類型
* @param int  $uid 唯一標識(用戶ID)
* @param int  $time 時間戳
* @return string
*/
public function getLoginLogKey($type, $uid, $time)
{
if ($this->checkType($type)  $this->checkUid($uid)  $this->checkTime($time)) {
return 'loginLog_' . date('Y-m', $time) . '_' . $type . '_' . $uid;
}
return '';
}

/**
* 獲取日志標準Key上信息
* @param string $key  key
* @param string $field 需要的參數 time,type,uid
* @return mixed 返回對應的值,沒有返回null
*/
public function getLoginLogKeyInfo($key, $field)
{
$param = array();
if ($this->checkLoginLogKey($key)) {
$arr = explode('_', $key);
$param['time'] = $arr[1];
$param['type'] = $arr[2];
$param['uid'] = $arr[3];
}
return $param[$field];
}

/**
* 獲取Key記錄的登錄位圖
* @param string $key key
* @return string
*/
public function getLoginLogBitMap($key)
{
$bitMap = '';
if ($this->checkLoginLogKey($key)) {
$time = $this->getLoginLogKeyInfo($key, 'time');
$maxDay = $this->getDaysInMonth(strtotime($time));
for ($i = 1; $i = $maxDay; $i++) {
$bitMap .= $this->_redis->getBit($key, $i);
}
}
return $bitMap;
}

/**
* 驗證日志標準Key
* @param string $key
* @return boolean
*/
public function checkLoginLogKey($key)
{
return parent::checkLoginLogKey($key);
}

/**
* 驗證開始/結束時間
* @param string $startTime 開始時間
* @param string $endTime  結束時間
* @return boolean
*/
public function checkTimeRange($startTime, $endTime)
{
return parent::checkTimeRange($startTime, $endTime);
}

/**
* 驗證用戶類型
* @param string $type
* @return boolean
*/
public function checkType($type)
{
return parent::checkType($type);
}

/**
* 驗證過期時間
* @param int $existsDay 一條記錄在Redis中過期時間,單位:天,必須大于31
* @return boolean
*/
public function checkExistsDay($existsDay)
{
return parent::checkExistsDay($existsDay);
}
}

5. 參考資料

  https://segmentfault.com/a/1190000008188655

  http://blog.csdn.net/rdhj5566/article/details/54313840

  http://www.redis.net.cn/tutorial/3508.html

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • PHP使用redis位圖bitMap 實現簽到功能
  • Redis精確去重計數方法(咆哮位圖)
  • redis通過位圖法記錄在線用戶的狀態詳解
  • java redis 實現簡單的用戶簽到功能
  • 基于Redis位圖實現用戶簽到功能

標簽:北京 果洛 吉安 大慶 楊凌 朝陽 江蘇 臺州

巨人網絡通訊聲明:本文標題《基于Redis位圖實現系統用戶登錄統計》,本文關鍵詞  基于,Redis,位圖,實現,系統,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《基于Redis位圖實現系統用戶登錄統計》相關的同類信息!
  • 本頁收集關于基于Redis位圖實現系統用戶登錄統計的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 杭州力泰起重机械有限公司| 福建泉成机械有限公司| 山东锦鹏机械有限公司| 苏州 机械有限公司| 江阴伟江机械有限公司| 装饰工程有限公司起名| 福建联丰机械有限公司| 上海机械设备有限公司| 温州韦盛机械有限公司| 上海汉享食品机械有限公司| 宁波工业机械有限公司| 成都 机械有限公司| 台一精工机械有限公司| 苏州市机械制造有限公司| 抚顺机械制造有限公司| 佛山钢铁贸易有限公司| 南京 机械制造有限公司| 佛山市炬盈包装机械有限公司| 山东环保机械有限公司| 东莞志成机械有限公司| 玉环 机械有限公司| 杭州海陆重工有限公司| 浙江大鹏机械有限公司| 苏州柯瑞机械有限公司| 湖北川谷机械有限公司| 临沂盛德机械有限公司| 宁波德霖机械有限公司| 珠海 机械 有限公司| 浙江威泰机械有限公司| 河南卫华重型机械有限公司| 河南力博矿山机械有限公司| 浙江包装机械有限公司| 上海泓阳机械有限公司| 新兴重工天津国际贸易有限公司 | 大连鸿升机械有限公司| 江苏柯恒石化电力机械有限公司 | 烟台东恒机械有限公司| 淄博宙灿机械有限公司| 中山市机械有限公司| 郑州包装机械有限公司| 杭州誉球机械有限公司| 南方动力机械有限公司| 成都杰瑞达工程机械有限公司 | 广州伟基机械有限公司| 四川川宏机械有限公司| 曲阜艾特机械有限公司| 江苏双箭输送机械有限公司| 广州市力净洗涤机械有限公司| 盾建重工制造有限公司| 河南甲庚机械设备有限公司 | 青州市远航机械设备有限公司| 青岛诺恩包装机械有限公司| 邦贝液压机械有限公司| 河南省起重机械有限公司| 苏州辽鞍机械有限公司| 上海达和荣艺包装机械有限公司| 江苏申特钢铁有限公司| 河南卫华重型机械有限公司| 新乡市东源机械有限公司| 新乡市先锋振动机械有限公司| 东莞市业佳精密机械有限公司| 山东永锋钢铁有限公司| 烟台莫深机械设备有限公司| 余姚 机械 有限公司| 贝力特机械有限公司| 成都万欣邦达机械制造有限公司| 宁波信泰机械有限公司| 常州腾睿机械有限公司| 新乡矿山起重机有限公司| 华电重工装备有限公司| 山西亚新钢铁有限公司| 瑞安 机械有限公司| 杭州天扬机械有限公司| 杭州西恒机械有限公司| 福建鼎盛钢铁有限公司| 章丘市宇龙机械有限公司| 赛柏精密机械有限公司| 浙江正信机械有限公司| 万兹莱压缩机械(上海)有限公司 | 广州恒星冷冻机械制造有限公司 | 无锡锡科机械制造有限公司| 林州市振晨重工装备制造有限公司 | 广东先达数控机械有限公司| 骁马机械上海有限公司| 东莞精密机械有限公司| 江苏舜天机械进出口有限公司| 江阴宏达机械有限公司| 昆明机械设备有限公司| 萍乡萍钢安源钢铁有限公司| 山东莱工机械制造有限公司 | 青州市三联重工设备制造有限公司 | 信息工程有限公司起名| 甘肃机械化建设工程有限公司 | 浙江机械设备制造有限公司| 九龙机械制造有限公司| 东莞数控机械有限公司| 沈阳高新机械有限公司| 天津达亿钢铁有限公司| 布勒常州机械有限公司| 山东达普机械制造有限公司| 湘潭 机械制造有限公司| 浙江超力机械有限公司| 广意永雄机械有限公司| 浙江豪盛印刷机械有限公司| 广东省建筑工程机械施工有限公司| 鑫宏机械制造有限公司| 江苏利淮钢铁有限公司| 天津钢铁贸易有限公司| 陕西至信机械制造有限公司怎么样 | 浙江盛维机械有限公司| 东莞名震机械制造有限公司| 深圳龙润彩印机械设备有限公司| 闽源钢铁有限公司停产| 烟台微特机械有限公司| 天津华信机械有限公司| 深圳 机械设备有限公司| 天津伟业钢铁贸易有限公司| 无锡旭英机械有限公司| 山东万力起重机械有限公司| 卓郎纺织机械有限公司| 吉林鑫达钢铁有限公司| 恒丰机械配件有限公司| 大连铸鸿机械有限公司| 江 诚机械有限公司| 云南科玛机械设备有限公司| 德龙钢铁有限公司招聘| 众旭食品机械有限公司| 山东泰安机械有限公司| 许昌 机械有限公司| 常州万裕机械有限公司| 浙江上易机械有限公司| 温州光明印刷机械有限公司| 设备机械制造有限公司| 三一众力机械有限公司| 启东丰顺重工有限公司| 中航国际钢铁贸易有限公司| 江苏国天锻压机械有限公司| 济南齐力升降机械有限公司| 上海敏杰机械有限公司| 常州好迪机械有限公司| 郑州天龙机械有限公司| 山东 机械制造有限公司| 温州佳诚机械有限公司| 山东鲁丽钢铁有限公司| 德州锦冠钢铁有限公司| 昆山精工机械有限公司| 常州柳工机械有限公司| 沈阳斗山工程机械有限公司 | 上海三都机械有限公司| 南京东部精密机械有限公司| 深圳市安格斯机械有限公司| 常州杭钢卓信机械装备有限公司 | 国浩机械制造有限公司| 重庆海松机械有限公司| 常州杭钢卓信机械装备有限公司 | 扬州恒润海洋重工有限公司| 华东油压机械制造有限公司 | 青岛新大成塑料机械有限公司| 上海隆麦机械有限公司| 邢台正佳机械制造有限公司| 合肥华运机械制造有限公司| 松源机械制造有限公司| 科倍隆南京机械有限公司| 合肥 机械有限公司| 卡麦龙机械有限公司| 东莞市 机械有限公司| 诸城市日通机械有限公司| 重庆精密机械有限公司| 格林策巴赫机械有限公司| 佛山市浩铭达机械制造有限公司| 广州西力机械有限公司| 巩义市瑞赛克机械设备有限公司 | 郑州鼎盛机械有限公司| 承德盛丰钢铁有限公司| 长沙远洋机械制造有限公司| 建筑装饰有限公司起名| 安徽永成电子机械技术有限公司| 扬州伏尔坎机械制造有限公司| 首钢长治钢铁有限公司| 溧阳金纬机械有限公司| 河北小松工程机械贸易有限公司 | 青岛橡胶机械有限公司| 徐州天立机械有限公司| 宁波海伯精密机械制造有限公司| 唐山港陆钢铁有限公司| 广东达诚机械有限公司| 上海长江服装机械有限公司| 青岛德维机械制造有限公司| 国浩机械制造有限公司| 威海远兴机械有限公司| 力迈机械设备有限公司| 苏州五金机械有限公司| 无锡市巨神起重机有限公司| 沈阳三洋建筑机械有限公司| 青州汇众机械有限公司| 深圳龙润彩印机械设备有限公司 | 南通庞源机械工程有限公司| 大连 机械有限公司| 宏兴钢铁有限公司官网| 上海精密机械制造有限公司| 泉州金鹰机械有限公司| 南平 机械 有限公司| 射阳 机械有限公司| 佛山市包装机械有限公司| 郑州宇机械有限公司| 江门 机械 有限公司| 山西 机械有限公司| 塑料机械 有限公司| 佛山顺德木工机械有限公司| 东莞市包装机械有限公司| 河南重工机械有限公司| 湖南天拓重工有限公司| 苏州苏安起重吊装有限公司| 湖北川谷机械有限公司| 启益电器机械有限公司| 深圳电子机械有限公司| 合心机械制造有限公司| 全氏食品机械(上海)有限公司 | 江苏中贵重工有限公司| 徐州机械制造有限公司| 浙江歌德起重机有限公司| 同向兴业机械有限公司| 德州机械制造有限公司| 许昌机械制造有限公司| 大连典石精密机械有限公司| 湖北襄玉机械有限公司| 江苏金韦尔机械有限公司| 纸箱机械 有限公司| 宿迁百通机械有限公司| 岳阳神冈起重电磁铁有限公司 | 江西凯奥机械有限公司| 江苏江河机械制造有限公司| 鑫宏机械制造有限公司| 南安市机械有限公司| 上海应晓食品机械有限公司| 青岛美克精密机械有限公司| 河南卫华起重机有限公司| 浙江德孚机械有限公司| 诸城市日通机械有限公司| 鸿江机械制造有限公司| 杭州驰林机械有限公司| 安徽机械制造有限公司| 龙口旭鑫机械有限公司| 河北联港废钢铁回收有限公司| 鸿源机械制造有限公司| 杭州金鸥机械有限公司| 河北天择重型机械有限公司| 上海钢铁交易中心有限公司| 新劲力机械有限公司| 吉林鑫达钢铁有限公司地址| 湖南鼎峰机械有限公司| 河南省邦恩机械制造有限公司 | 广东粤东机械实业有限公司| 成都瑞迪机械实业有限公司| 湖州汇大机械有限公司| 无锡橡塑机械有限公司| 海宁美惠机械有限公司| 顺兴机械制造有限公司| 洛阳路通重工机械有限公司| 常熟通江机械有限公司| 靖江市机械制造有限公司| 厦门厦工重工有限公司| 厦门工业机械有限公司| 泉州金鹰机械有限公司| 嵊州市龙威机械制造有限公司| 广州萱裕机械有限公司| 广东 机械设备有限公司| 涞源奥宇钢铁有限公司| 潍坊 机械 有限公司| 广东新船重工有限公司| 南京三友机械有限公司| 江阴铸造机械有限公司| 江苏宏光钢铁有限公司| 上海福源机械有限公司| 潍坊 重工 有限公司| 湖南鼎峰机械有限公司| 物理农林机械有限公司| 曲阜市机械有限公司| 湖南机械制造有限公司| 青岛同三塑料机械有限公司| 食品有限公司起名大全| 泊头市环保机械有限公司| 潍坊沃富机械有限公司| 上海丰泽机械有限公司| 武汉钢铁有限公司疫情| 青岛中鸿重型机械有限公司| 宁波凯特机械有限公司| 扬州凯勒机械有限公司| 苏州华致鑫精密机械有限公司| 浙江胜祥机械有限公司| 扬州中孚机械有限公司| 广州冠浩机械设备有限公司| 机械设备工程有限公司| 山东讴神机械制造有限公司| 安宁永昌钢铁有限公司| 山东九环石油机械有限公司| 浙江康机械有限公司| 固达机械制造有限公司| 招远华丰机械设备有限公司| 青岛美光机械有限公司| 宁波永博机械制造有限公司 | 大连军峰机械有限公司| 青岛兰石重型机械设备有限公司| 东莞市今塑精密机械有限公司| 德州德工机械有限公司| 丹阳市华泰制药机械有限公司| 昆山市贝纳特机械设备有限公司 | 吉林鑫达钢铁有限公司| 中意合资 威尼托机械有限公司| 江阴中立机械工业有限公司| 浙江恒机械有限公司| 山推重工机械有限公司| 阜新恒泰机械有限公司| 唐山港陆钢铁有限公司| 潍坊精诺机械有限公司| 东营石油机械有限公司| 东莞利瀚机械有限公司| 起帆电缆有限公司上市| 江阴中南重工有限公司| 海益机械配件有限公司| 杭州诺迈机械有限公司| 盐城市机械有限公司| 山推重工机械有限公司| 德清恒丰机械有限公司| 昆山北钜机械有限公司| 东莞市金峥机械有限公司 | 卫华起重机有限公司| 临汾志强钢铁有限公司| 江阴市液压机械有限公司| 浙江勇力机械有限公司| 威海威力起重有限公司| 比力特机械有限公司| 徐州徐工基础工程机械有限公司| 浙江荣德机械有限公司| 上海轩世机械有限公司| 河南铁山起重设备有限公司| 深圳市美鹏机械设备有限公司| 浙江欧迈特减速机械有限公司| 上海塑帝机械有限公司| 东莞市实诚机械有限公司| 诸城市铭威食品机械有限公司| 山东平安工程机械有限公司| 贵州凯星液力传动机械有限公司| 上海精密机械有限公司| 河南双象机械有限公司| 苏州雁达机械有限公司| 机械有限公司起名大全| 成都鑫泽机械有限公司| 青岛昊宇重工有限公司| 重型机械制造有限公司| 洛阳中收机械装备有限公司招聘| 东莞市台立数控机械有限公司| 成都机械设备有限公司| 无锡建筑机械有限公司| 三一工程机械有限公司| 重庆比德机械有限公司| 苏州 机械 有限公司| 长沙机械与制造有限公司| 北京速深机械有限公司| 绍兴越发机械有限公司| 大洋机械制造有限公司| 巨荣机械制造有限公司| 渭南金狮机械有限公司| 苏州市丰科精密机械有限公司| 诸城市中天机械有限公司| 深圳新劲力机械有限公司| 杭州 机械设备有限公司| 苏州精创机械有限公司| 宣城市 机械 有限公司| 青岛新东机械有限公司| 输送机械设备有限公司| 广州市科展机械设备有限公司 | 宁波 机械 有限公司| 天津蓝科机械有限公司| 南阳市 机械有限公司| 中山自动化机械有限公司| 智能机械设备有限公司| 威海新元化工机械有限公司| 广东力源液压机械有限公司| 杭州机械设备制造有限公司| 无锡全盛安仁机械有限公司| 机械设备制造有限公司| 东营海河机械有限公司| 上海宝日机械制造有限公司| 广州德机械有限公司| 起重机制造有限公司| 宁波机械制造有限公司| 南京高立工程机械有限公司| 蚌埠液力机械有限公司| 临海机械有限公司招聘| 海瑞克隧道机械有限公司| 山西美锦钢铁有限公司| 上海华襄机械有限公司| 杭州通绿机械有限公司| 银锐玻璃机械有限公司| 中船华南船舶机械有限公司| 常州纺织机械有限公司| 东莞市恩必信塑胶机械有限公司| 新疆起亚铝业有限公司招聘| 唐山津西钢铁有限公司| 南京竣业过程机械设备有限公司| 湖南宇泰重工有限公司| 安徽佳乐建设机械有限公司| 机械有限公司 招聘| 温州力冠机械有限公司| 合肥精密机械有限公司| 浙江海荣机械有限公司| 蚌埠行星机械有限公司| 常州迈腾机械有限公司| 温州华珍机械有限公司| 河南千里机械有限公司| 扬州华粮机械有限公司| 常林道依茨法尔机械有限公司| 泰州市海锋机械制造有限公司 | 济南博威液压机械有限公司 | 浙江制药机械有限公司| 建湖液压机械有限公司| 九江%机械有限公司| 南通市通州区三槐机械制造有限公司| 广西金达机械有限公司| 浙江珠峰机械有限公司| 重庆春仁机械有限公司| 工程机械制造有限公司| 台州农业机械有限公司| 济宁鑫宏工矿机械设备有限公司| 上海众和包装机械有限公司| 杭州九钻机械有限公司| 邢台钢铁有限公司官网| 上海石油机械有限公司| 济南 液压机械有限公司| 杭州双金机械有限公司| 沧州瑞创机械制造有限公司| 鼎业机械设备有限公司| 唐山佳鑫机械配件有限公司| 山东天路重工有限公司| 上海依澳包装机械有限公司| 安阳钢铁贸易有限公司| 上海五金机械有限公司| 广东佳明重工有限公司| 无锡鹰贝机械有限公司| 上海集美食品机械有限公司| 常州倍安特动力机械有限公司| 凯岛起重机械有限公司| 好烤克食品机械有限公司| 上海佳成服装机械有限公司| 三明机械制造有限公司| 东莞市康机械有限公司| 唐山泰钢钢铁有限公司| 深圳包装机械有限公司| 重庆庆泰机械有限公司| 荆州华力机械有限公司| 昆山富邦机械有限公司| 温州韦盛机械有限公司| 常州恒力机械有限公司| 宏远机械制造有限公司| 威海精密机械有限公司| 宁波星峰机械有限公司| 嘉兴市宏丰机械有限公司| 苏州洁宝机械有限公司| 玉环方博机械有限公司| 山东金奥机械有限公司| 纽科伦起重机有限公司| 无锡市浦尚精密机械有限公司| 邯郸包装机械有限公司| 无锡 钢铁贸易有限公司| 苏州恒威海绵机械有限公司| 台湾正河源机械配件有限公司| 济宁通佳机械有限公司| 温州市兴业机械设备有限公司 | 苏州柯瑞机械有限公司| 云南机械设备有限公司| 佛山钢铁贸易有限公司| 上海奕晟矿山机械有限公司| 江阴韩一钢铁有限公司| 新乡市先锋振动机械有限公司| 厦门市机械有限公司| 宿迁百通机械有限公司| 山东大丰机械有限公司| 上海利昆机械有限公司| 江苏威鹰机械有限公司| 哈尔滨 机械 有限公司| 安徽远鸿机械自动化有限公司| 青岛北船重工有限公司| 杭州恒机械有限公司| 上海东泷重型机械有限公司| 重庆巨泰机械有限公司| 青岛华华机械有限公司| 福宁船舶重工有限公司| 江阴市祥达机械制造有限公司 | 宁波华表机械制造有限公司| 申光洗涤机械有限公司| 济南北斗星机械设备有限公司| 四川宏华友信石油机械有限公司 | 常州儒邦机械有限公司| 西子重工机械有限公司| 广州金本机械设备有限公司 | 立信染整机械深圳有限公司| 宁波瑞铭机械有限公司| 夹江水工机械有限公司| 捷泰克机械有限公司| 安来动力机械有限公司| 广东马氏机械有限公司| 江苏三麦食品机械有限公司 | 青岛大牧人机械有限公司| 青岛新型建设机械有限公司| 西安华欧精密机械有限公司| 佛山建邦机械有限公司| 上海中机械有限公司| 上海昱庄机械有限公司| 创达机械制造有限公司| 台州工交机械有限公司| 永康市机械有限公司| 江苏永康机械有限公司| 佛山慧谷机械有限公司| 宜昌 机械有限公司| 昆山联德精密机械有限公司| 徐州七星机械有限公司| 江苏金梧机械有限公司| 济南市恒宇机械有限公司| 常州市瑞州机械有限公司| 泸州益鑫钢铁有限公司| 新乡市欧霖佳机械有限公司| 江苏瑞德机械有限公司| 宣化华泰矿冶机械有限公司| 苏州苏安起重吊装有限公司| 莱钢永锋钢铁有限公司| 开封元创机械有限公司| 重庆宝汇跨搏机械制造有限公司 | 苏州一工机械有限公司| 浙江名博机械有限公司| 沧州怡和机械有限公司| 温岭联星机械有限公司| 青岛华磊塑料机械有限公司| 甘肃机械化建设工程有限公司 | 北京中车重工机械有限公司| 南京腾阳机械有限公司| 盐城机械设备有限公司| 浙江康明斯机械有限公司| 嘉泰数控机械有限公司| 安宁永昌钢铁有限公司| 杭州起重吊装有限公司| 浙江科尔博机械有限公司| 郑州鼎盛机械有限公司| 广州泽比机械设备有限公司 | 约翰迪尔佳木斯农业机械有限公司| 江阴派格机械设备有限公司| 浙江印刷机械有限公司| 山东威力重工机床有限公司| 上海 钢铁物资有限公司| 江阴市江顺机械有限公司| 江苏正合重工有限公司| 东莞名震机械制造有限公司| 南通市通州区三槐机械制造有限公司 | 国浩机械制造有限公司| 安徽普源分离机械制造有限公司| 东莞太星机械有限公司| 杭州岛文机械有限公司| 江阴万恒机械制造有限公司| 江苏科力机械有限公司| 南京阿特拉斯机械设备有限公司| 山东翔工机械有限公司| 株洲机械制造有限公司| 唐山九江钢铁有限公司| 东莞市康机械有限公司| 保定机械制造有限公司| 江门振达机械有限公司| 易百通机械有限公司| 湖南中一惠龙机械设备有限公司| 济南市恒宇机械有限公司| 新乡市欧霖佳机械有限公司| 济南鼎业机械制造有限公司| 江苏科圣化工机械有限公司| 恩德特机械(苏州)有限公司| 西安北村精密机械有限公司| 山西中升钢铁有限公司| 机械化施工有限公司| 东莞市鼎祥通用机械设备有限公司| 上海胜松机械制造有限公司| 湘元三一机械有限公司| 大连孚德机械有限公司| 山西建龙钢铁有限公司地址| 安徽华邦机械有限公司| 南海区机械设备有限公司| 上海派协包装机械有限公司| 阿尔法起重机有限公司| 汕头市包装机械有限公司| 上海铮潼起重机电设备有限公司 | 江阴万恒机械制造有限公司| 新劲力机械有限公司| 浙江常至机械有限公司| 河南省平原矿山机械有限公司| 佛山市液压机械有限公司| 鞍山宝得钢铁有限公司招聘岗位| 有限公司发起人协议| 宝鸡石油机械有限公司| 无锡速波精密机械有限公司| 广西中源机械有限公司| 西安星火包装机械有限公司| 河南康迪机械有限公司| 诸城市恒顺机械有限公司| 牛力机械制造有限公司| 江苏佳力起重机械制造有限公司| 徐州东亚钢铁有限公司| 宁波市凯博数控机械有限公司 | 宝鸡至信机械有限公司| 江苏飞耀机械制造有限公司 | 浙江晨雕机械有限公司| 温州奋起皮业有限公司| 随州盛星机械有限公司| 河南起重机械有限公司| 杭州通绿机械有限公司| 山东威海机械有限公司| 西安机械设备有限公司| 东莞市通盛机械有限公司| 上海宝丰机械制造有限公司 | 浙江天盛机械有限公司| 秦皇岛国阳钢铁有限公司| 济南天助升降机械有限公司| 广州市 工程机械有限公司| 旭东机械昆山有限公司| 慈溪 机械 有限公司| 河南长城机械有限公司| 山东华伟重工机械有限公司| 五矿钢铁上海有限公司| 慈溪市机械有限公司| 诸城市华邦机械有限公司| 中交西安筑路机械有限公司| 高博起重设备有限公司| 溧阳三元钢铁有限公司| 深圳固尔琦包装机械有限公司| 昆山优能机械有限公司| 安徽中晨机械有限公司| 常州华德机械有限公司| 河南奥创机械设备有限公司| 广州伟基机械有限公司| 新乡市矿山起重机械有限公司| 德清泰德机械有限公司| 无锡威马机械有限公司| 成机械设备有限公司| 河北燕兴机械有限公司| 常州杰和机械有限公司| 河南乾坤工程机械有限公司| 陕西金奇机械电器制造有限公司| 无锡市川中五金机械有限公司| 上海机械刀片有限公司| 岳阳神冈起重电磁铁有限公司| 雷肯农业机械有限公司| 重庆江峰机械有限公司| 临海市机械有限公司| 邢台德龙钢铁有限公司| 浙江方邦机械有限公司| 东元精密机械有限公司| 博兴县钢铁有限公司| 青岛三益塑料机械有限公司| 上海陵城机械有限公司| 江苏海特尔机械有限公司| 禹城通裕新能源机械铸造有限公司| 东莞市科机械有限公司| 青岛德利机械有限公司| 成都 机械有限公司| 浙江南山传动机械有限公司| 大丰 机械有限公司| 山东业机械有限公司| 机械有限公司起名大全| 星包装机械有限公司| 郑州中联收获机械有限公司| 固耐重工苏州有限公司| 大连 橡塑机械有限公司| 广州新浪爱拓化工机械有限公司| 迁安荣信钢铁有限公司| 广东金凯锐机械技术有限公司| 浙江春江茶叶机械有限公司| 山东锦鹏机械有限公司| 德州联合石油机械有限公司| 山东博杰重型工程机械有限公司 | 江门携成机械有限公司怎样| 江西机械制造有限公司| 肇庆市机械有限公司| 珠海市中鑫隆机械化建设工程有限公司| 泰州机械 有限公司| 河南天成矿山起重机有限公司| 山东正丰钢铁有限公司| 沈阳小松工程机械有限公司| 冷水江钢铁有限公司| 天津宏大纺织机械有限公司| 山东动力机械有限公司| 青州市远航机械设备有限公司| 河北犀牛民用机械有限公司| 南通科邦机械有限公司| 峰峰合信钢铁有限公司| 温州润新机械制造有限公司| 北京大森包装机械有限公司| 珠海市机械设备有限公司| 深圳市机械有限公司| 浙江东星纺织机械有限公司| 河南朝阳钢铁有限公司| 珠海华亚机械有限公司| 山东明威起重设备有限公司| 宁波恒阳机械有限公司| 河南机械设备制造有限公司| 上海化工机械厂有限公司| 源田床具机械有限公司| 濮阳市名利石化机械设备制造有限公司 | 常州创机械有限公司| 腾飞机械有限公司地址| 新乡市特昌振动机械有限公司| 北京洛克机械有限公司| 杭州海的机械有限公司| 三一起重机械有限公司| 上海久协机械设备有限公司| 昆山胜代机械有限公司| 昆山市机械有限公司| 杭州容瑞机械技术有限公司| 济南精美机械设备有限公司| 江苏三麦食品机械有限公司| 广州市 包装机械有限公司| 上海 食品机械有限公司| 无锡机械电器有限公司| 常州小松工程机械有限公司招聘| 上海精元机械有限公司| 东莞大兴发机械有限公司| 西安中大机械有限公司| 扬州液压机械有限公司| 江苏东禾机械有限公司| 浙江永达输送机械设备有限公司| 沈阳斗山工程机械有限公司 | 河南万杰食品机械有限公司| 威海环宇化工机械有限公司| 桂林平钢钢铁有限公司| 上海佳成服装机械有限公司| 上海春日机械工业有限公司| 江阴惠尔信机械有限公司| 大连液力机械有限公司| 苏州仁成包装机械有限公司| 昌乐 机械 有限公司| 保东农业机械有限公司| 上海又高机械有限公司| 浩博机械制造有限公司| 济南盛润机械有限公司| 郑州昌利机械制造有限公司| 苏州金德纬机械有限公司 | 青岛九合重工机械有限公司 | 潍坊竣通机械配套有限公司| 苏州昶智精密机械有限公司| 凯岛起重机械有限公司| 桂林平钢钢铁有限公司| 东莞高盟机械有限公司| 中山 机械有限公司| 众立机械制造有限公司| 河南康迪机械有限公司| 化工有限公司起名大全| 河南省时代起重机械有限公司| 杭州杭重机械有限公司| 上海盛普机械制造有限公司| 无锡科创机械设计制造有限公司| 大连科信机械有限公司| 济南赛信机械有限公司| 佛山丰堡精密机械有限公司| 上海天驰制药机械有限公司| 成都 机械 有限公司| 河北金维重工有限公司| 上海德采包装机械有限公司| 上海 精密机械制造有限公司| 河南森源重工有限公司| 济南速雕数控机械有限公司| 高密永和精密机械有限公司招聘网| 抚顺机械制造有限公司| 台州市机械有限公司| 湘潭 机械制造有限公司| 河南矿山机械有限公司| 保定东利机械制造有限公司| 阜阳 机械 有限公司| 浙江豪盛印刷机械有限公司| 山东英胜机械有限公司| 兄弟机械西安有限公司| 法麦凯尼柯机械有限公司| 南京拓源钢铁有限公司| 广西利维重工有限公司| 常州迈腾机械有限公司| 苏州澳克机械有限公司| 市瑞港机械有限公司| 上海戈扬包装机械有限公司 | 青岛义龙包装机械有限公司| 北京复盛机械有限公司| 常州光明包装机械有限公司| 山东和晟机械设备有限公司| 邯郸纺织机械有限公司| 浙江精密机械有限公司| 安徽精密机械有限公司| 无锡通用机械有限公司| 浙江园林机械有限公司| 江西机械制造有限公司| 鞍山机械制造有限公司| 东莞宏品智能机械有限公司| 吉林鑫达钢铁有限公司地址| 浙江兄弟包装机械有限公司| 杰西博工程机械有限公司| 大连 工程机械有限公司| 郑州水工机械有限公司| 建湖县液压机械有限公司| 杭州精工机械有限公司| 江苏贝尔机械有限公司| 上海西马特制药机械有限公司| 杭州鸿立机械有限公司| 广东明华机械有限公司| 石家庄 钢铁有限公司| 三星重工业宁波有限公司招聘| 东芝机械上海有限公司| 新乡市东振机械制造有限公司| 鹤壁市通用机械电气有限公司| 徐州东岳工程机械有限公司| 大连 橡塑机械有限公司| 合浦惠利机械有限公司| 中核机械天津有限公司| 合心机械制造有限公司| 徐州东南钢铁工业有限公司| 山西中德科工机械制造有限公司 | 大丰联鑫钢铁有限公司| 宁波盛技机械有限公司| 溧阳机械制造有限公司| 天津市华天世纪机械有限公司| 阿特拉斯工程机械有限公司| 山东峻峰起重机械有限公司| 成都 机械 有限公司| 青岛永强木工机械有限公司| 重庆中容石化机械制造有限公司 | 苏州荣业机械有限公司| 云南机械设备有限公司| 无锡市阳通机械设备有限公司| 东风悦达起亚有限公司| 新乡市佳盛振动机械有限公司 | 沂南中天机械有限公司| 宁波市凯博数控机械有限公司| 湖南金塔机械制造有限公司 | 温州力冠机械有限公司| 广东重工建设监理有限公司| 湖南中一惠龙机械设备有限公司| 无锡博雅德精密机械有限公司| 洛阳机械制造有限公司| 亨沃机械设备有限公司| 华电重工机械有限公司| 江阴凯澄起重机械有限公司| 深圳市铭利达精密机械有限公司| 柳州中源机械有限公司| 台一精工机械有限公司| 锦辉五金机械有限公司| 珠海三麦机械有限公司| 成都兴业邦达重工机械有限公司| 山东省机械施工有限公司| 宁波瑞铭机械有限公司| 郑州市同鼎机械设备有限公司| 柳州市机械有限公司| 甘肃机械化建设工程有限公司| 昆明群泰机械有限公司| 富阳液压机械有限公司| 五洋纺织机械有限公司| 江苏八达重工机械有限公司| 广东海天机械有限公司| 佛山隆机械有限公司| 浙江先锋机械有限公司| 南通苏诺特包装机械有限公司| 上海百劲机械有限公司| 东营海河机械有限公司| 中船重工海空智能装备有限公司| 北京机械设备租赁有限公司| 苏州联佳精密机械有限公司 | 常州市菲德机械部件有限公司| 温岭市大众精密机械有限公司| 徐州东岳工程机械有限公司| 合肥包装机械有限公司| 湖南长河机械有限公司| 普惠环保机械有限公司| 上海久协机械设备有限公司| 昆山施耐特机械有限公司| 高邮和益机械有限公司| 新乡市东振机械制造有限公司| 浙江自力机械有限公司| 无锡通灵机械有限公司| 石嘴山钢铁有限公司| 无锡博雅德精密机械有限公司| 上海捷如重工机电设备有限公司| 连云港市机械有限公司| 杭州海的机械有限公司| 盐城石油机械有限公司| 河北普阳钢铁有限公司| 安徽建筑机械有限公司| 惠州德钢机械有限公司| 涞源奥宇钢铁有限公司| 江苏宇达机械有限公司| 安徽威萨重工机械有限公司| 东莞市台克机械有限公司| 慈溪科傲机械有限公司| 郑州兆明机械有限公司| 大连亨益机械有限公司| 烟台金元矿业机械有限公司| 广东正力精密机械有限公司| 杭州 机械 有限公司| 惟其信石油机械(天津)有限公司 | 新湾机械有限公司招聘| 河南森源重工有限公司| 东莞市得士威机械工业有限公司 | 新疆机械设备有限公司| 莱州 机械有限公司| 建湖华祥机械有限公司| 湘潭丰弘机械制造有限公司| 广州市力进食品机械有限公司| 苏州纺织机械有限公司| 宁波裕民机械工业有限公司| 青州矿砂机械有限公司| 宁夏天地奔牛银起设备有限公司| 如皋市通达机械制造有限公司| 山东战尔机械有限公司| 永达机械制造有限公司| 永 机械 有限公司| 瑞安市天晟包装机械有限公司 | 安微博达重工有限公司| 温州市日力轻工机械有限公司| 上海枫信传动机械有限公司| 四川腾中重工机械有限公司| 东莞市台立数控机械有限公司 | 日发纺织机械有限公司| 唐山盛财钢铁有限公司| 重工机械制造有限公司| 大连地拓重工有限公司怎么样| 临沂盖氏机械有限公司| 沃德精密机械有限公司| 唐山文丰钢铁有限公司| 上海保成机械有限公司| 嘉兴赛诺机械有限公司| 宁波工业机械有限公司| 广州华运机械有限公司| 永达机械制造有限公司| 苏州精创机械有限公司| 碎得机械北京有限公司| 山东港中钢铁有限公司| 厦门宇龙机械有限公司| 烟台金鹏矿业机械有限公司| 广东重工建设监理有限公司怎么样| 荆州祥达机械制造有限公司| 河南机械设备制造有限公司| 江苏华夏重工有限公司| 上海齐耀螺杆机械有限公司| 东莞市自动化机械有限公司| 上海申虎包装机械设备有限公司 | 大连橡胶塑料机械有限公司| 碎得机械北京有限公司| 上海松井机械有限公司| 昆山博通机械设备有限公司| 山矿机械设备有限公司| 上海亚华印刷机械有限公司| 长沙机械与制造有限公司| 佛宇重工实业有限公司| 苏州拓博机械设备有限公司| 苏州恒迈精密机械有限公司| 徐州东亚钢铁有限公司| 亿煤机械装备制造有限公司| 岳阳神冈起重电磁铁有限公司 | 江苏雨花钢铁有限公司| 陕西通运机械有限公司| 佛山市宝索机械制造有限公司| 温州正钻机械有限公司| 沈阳带锯机械有限公司| 唐山隆鑫机械有限公司| 天津机械设备有限公司| 重庆海松机械有限公司| 兄弟机械西安有限公司| 东莞市金联吹塑机械有限公司| 宁波海雄塑料机械有限公司 | 镇田机械平湖有限公司| 广西玉柴动力机械有限公司 | 南京创力传动机械有限公司| 张家港市港丰机械有限公司| 常州奥恒机械有限公司| 环保设备机械有限公司| 东莞巨冈机械有限公司| 杭州萧山鼎立机械有限公司| 河南广泰机械有限公司| 浙江海工机械有限公司| 江苏宇达机械有限公司| 佳木斯佳联收获机械有限公司| 嘉兴市机械有限公司| 山东川普机械有限公司| 诸城市铭威食品机械有限公司| 上海宏铭纺织机械有限公司| 上海泽泽机械有限公司| 汕头机械厂有限公司| 五洋纺织机械有限公司| 济南机械制造有限公司| 科雄精密机械有限公司| 上海福源机械有限公司| 新乡振动机械有限公司| 昆明呈钢钢铁有限公司| 上海洗涤机械有限公司| 济宁机械制造有限公司| 上海铁美机械有限公司| 福建晋工机械有限公司| 山东正阳机械有限公司| 西安鸿运机械有限公司| 大连机械制造有限公司|