From 8b4b4cc49fc22b472193e73a9f6122b0d1f9d730 Mon Sep 17 00:00:00 2001 From: wangbiao Date: Fri, 17 Apr 2026 11:07:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9C=AC=E5=9C=B0=E6=96=B0=E5=BB=BA?= =?UTF-8?q?=E8=AE=A2=E5=8D=95--=E6=94=B6=E8=B4=A7=E4=BA=BA=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E6=95=B0=E6=8D=AE=E5=8A=A0=E5=AF=86=E5=92=8C=E8=A7=A3?= =?UTF-8?q?=E5=AF=86(#20260417)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/ome/model/member/address.php | 136 ++++++++++++++++++++++++++++--- app/ome/model/members.php | 12 ++- 2 files changed, 133 insertions(+), 15 deletions(-) diff --git a/app/ome/model/member/address.php b/app/ome/model/member/address.php index e00bb18c..2b226fcc 100644 --- a/app/ome/model/member/address.php +++ b/app/ome/model/member/address.php @@ -17,25 +17,135 @@ class ome_mdl_member_address extends dbeav_model{ + /** + * 须加密字段(本地加密,支持透明读写) + * + * @var array + */ + private $__encrypt_cols = array( + 'ship_name' => 'simple', + 'ship_addr' => 'simple', + 'ship_mobile' => 'phone', + 'ship_tel' => 'phone', + ); + + /** + * 加密数据(写入前) + * + * @param array $data + * @return void + */ + protected function _encryptData(&$data) + { + $security = kernel::single('ome_security_factory'); + foreach ($this->__encrypt_cols as $field => $type) { + if (!isset($data[$field])) { + continue; + } + // 避免重复加密(本地密文) + if ($security->isLocalEncryptData($data[$field], $type)) { + continue; + } + $data[$field] = (string)$security->encryptPublic($data[$field], $type); + } + } + + /** + * 解密数据(读出后) + * + * @param array $data + * @return void + */ + protected function _decryptData(&$data) + { + $security = kernel::single('ome_security_factory'); + foreach ($this->__encrypt_cols as $field => $type) { + if (isset($data[$field])) { + $data[$field] = (string)$security->decryptPublic($data[$field], $type); + } + } + } + + public function insert(&$data) + { + $this->_encryptData($data); + return parent::insert($data); + } + + public function update($data, $filter = array(), $mustUpdate = null) + { + $this->_encryptData($data); + return parent::update($data, $filter, $mustUpdate); + } + + public function getList($cols='*', $filter=array(), $offset=0, $limit=-1, $orderType=null) + { + $rows = parent::getList($cols, $filter, $offset, $limit, $orderType); + foreach ((array)$rows as $k => $row) { + $this->_decryptData($row); + $rows[$k] = $row; + } + return $rows; + } + + public function finder_getList($cols='*', $filter=array(), $offset=0, $limit=-1, $orderType=null) + { + $rows = parent::finder_getList($cols, $filter, $offset, $limit, $orderType); + foreach ((array)$rows as $k => $row) { + $this->_decryptData($row); + $rows[$k] = $row; + } + return $rows; + } + + public function dump($filter, $cols='*', $subSdf=false) + { + $row = parent::dump($filter, $cols, $subSdf); + if ($row) { + $this->_decryptData($row); + } + return $row; + } + /** * 创建_address * @param mixed $data 数据 * @return mixed 返回值 */ public function create_address($data){ - $member_id = $data['member_id']; - if($member_id){ - $address_hash = sprintf('%u',crc32($data['ship_name'].'-'.$data['ship_area'].$data['ship_addr'].'-'.$data['ship_mobile'].'-'.$data['ship_tel'].'-'.$data['ship_zip'].'-'.$data['ship_email'])); - $data['address_hash'] = $address_hash; - $address_detail = $this->dump(array('address_hash'=>$address_hash,'member_id'=>$member_id),'address_id'); - if(!$address_detail['address_id']){ - $result = $this->save($data); - } - - if($data['is_default'] == '1' && $data['address_id']){ - $this->db->exec("UPDATE sdb_ome_member_address SET is_default='0' WHERE member_id=".$data['member_id']." AND address_id!=".$data['address_id']); - $this->db->exec("UPDATE sdb_ome_members SET area='".$data['ship_area']."',addr='".$data['ship_addr']."',mobile='".$data['ship_mobile']."',tel='".$data['ship_tel']."',email='".$data['ship_email']."', zip='".$data['ship_zip']."' WHERE member_id=".$data['member_id']); - } + $member_id = (int)$data['member_id']; + if (!$member_id) { + return; + } + + // 使用明文计算 address_hash,避免被透明加密影响去重逻辑 + $plain = $data; + $address_hash = sprintf('%u', crc32( + (string)($plain['ship_name'] ?? '') . '-' . (string)($plain['ship_area'] ?? '') . (string)($plain['ship_addr'] ?? '') + . '-' . (string)($plain['ship_mobile'] ?? '') . '-' . (string)($plain['ship_tel'] ?? '') + . '-' . (string)($plain['ship_zip'] ?? '') . '-' . (string)($plain['ship_email'] ?? '') + )); + + $data['address_hash'] = $address_hash; + $address_detail = $this->dump(array('address_hash'=>$address_hash,'member_id'=>$member_id),'address_id'); + if(!$address_detail['address_id']){ + $this->save($data); + } + + $address_id = (int)($data['address_id'] ? $data['address_id'] : $address_detail['address_id']); + if($data['is_default'] == '1' && $address_id){ + $this->db->exec("UPDATE sdb_ome_member_address SET is_default='0' WHERE member_id=".$member_id." AND address_id!=".$address_id); + + // 同步更新会员默认联系方式,交由 members 模型做透明加密 + $membersObj = app::get('ome')->model('members'); + $membersObj->update(array( + 'area' => $plain['ship_area'] ?? '', + 'addr' => $plain['ship_addr'] ?? '', + 'mobile' => $plain['ship_mobile'] ?? '', + 'tel' => $plain['ship_tel'] ?? '', + 'email' => $plain['ship_email'] ?? '', + 'zip' => $plain['ship_zip'] ?? '', + ), array('member_id' => $member_id)); } } diff --git a/app/ome/model/members.php b/app/ome/model/members.php index b555ae7a..68a2c671 100644 --- a/app/ome/model/members.php +++ b/app/ome/model/members.php @@ -28,6 +28,8 @@ class ome_mdl_members extends dbeav_model{ 'tel' => 'simple', 'name' => 'simple', 'email' => 'simple', + 'addr' => 'simple', + 'zip' => 'simple', ); /** @@ -85,9 +87,12 @@ class ome_mdl_members extends dbeav_model{ */ public function insert(&$data) { + $security = kernel::single('ome_security_factory'); foreach ($this->__encrypt_cols as $field => $type) { if (isset($data[$field])) { - $data[$field] = (string) kernel::single('ome_security_factory')->encryptPublic($data[$field],$type); + if (!$security->isLocalEncryptData($data[$field], $type)) { + $data[$field] = (string) $security->encryptPublic($data[$field],$type); + } } } @@ -96,9 +101,12 @@ class ome_mdl_members extends dbeav_model{ public function update($data,$filter=array(),$mustUpdate = null) { + $security = kernel::single('ome_security_factory'); foreach ($this->__encrypt_cols as $field => $type) { if (isset($data[$field])) { - $data[$field] = (string) kernel::single('ome_security_factory')->encryptPublic($data[$field],$type); + if (!$security->isLocalEncryptData($data[$field], $type)) { + $data[$field] = (string) $security->encryptPublic($data[$field],$type); + } } }