# wuye_message **Repository Path**: tpcwre/wuye_message ## Basic Information - **Project Name**: wuye_message - **Description**: No description available - **Primary Language**: PHP - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-06-19 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README //===== 备忘 当用户退出小区或撤消管理时,清除申超数据 //===== 架构与拓展 一:整体静态页面存放在upyun 并实现CDN分布式 二:用户登陆同时向多个后台服务器请求,前请求成功的记录地址并跳转。以后所有请求都使用该后台服务器 三:用户数据存储到对应城市的数据库中,所有后台服务器共同操作数据库 //===== 关键信息获取及方法 ### 获取当前选择的城市信息 GetAndViewOpenCity(province,city,county,function(){}); 获取并展示城市列表 sessionStorage.tokenSet 后续获取城市信息 结果:["110105","朝阳区","51136888856","wuye1"] 0 当前城市 code 1 当前城市名 2 城市对应mysql库址 3 城市对应mysql库名 ### 获取当前登陆的微信用户信息 GetUserInfo(function(openid){},type) 获取 type true 只获取openid false 获取用户全信息 失败会跳转到 get_user_info.html 页 localStorage.user_info 调用,需要解析 ### 申请超管逻辑 # 点击申请: # 判断管理员列表中是否已存在该openid,没有则继续。 # 判断该openid 是否已申请,没有则继续 # 生成一个以 城市code+小区id为名的超申upyun缓存文件,内容标记为1(说明 有人申请超管) # 进入小区信息列表时,判断小区的的超申缓存文件是否存在,存在则在信息列表首位展示超管申请投票,并点击进入超申成员投票页面 # 进入超申投票页面后,向后台请求申超的人员及票数信息及展示,并提供投票按钮, # 小区人员投票时,判断该openid是否已投票过,未投则可进行投票。每次投票进行判断是否选择成功,成功则设置超管,并关闭选择反对票,删除相关数据 # 用户投票时进行判断 # 申请人数 = 1 # 总票数 > 30%,申超成功 > 1 # 总票数 > 30% 结束,票数多的人为超管 ### 超管申请投票记录表 create table super_admin_record( id int primary key auto_increment, area_id int, admin_openid varchar(50), user_openid varchar(50), index a(area_id,admin_openid), index b(area_id,user_openid) )engine=myisam default charset=utf8 comment '超管申请投票记录表'; ### 超管罢免投票记录表 create table super_admin_dis( id int primary key auto_increment, area_id int, admin_openid varchar(50), user_openid varchar(50), index a(area_id,admin_openid), index b(area_id,user_openid) )engine=myisam default charset=utf8 comment '超管罢免投票记录表'; ### 重点注意: 当前域名下的缓存记得区分各账号之间的划分,不然不同账号会共享缓存 ### 前后台在对数据库操作时,需要验证县code与对应的库址库名是否匹配,不匹配则终止 ### 小区信息助手 ### 接口安全 # 接口页面需要判断来路浏览器是否为微信浏览器,非浏览器不能调用接口。 # 每次登陆时,获取客户端ip,在获取到用户信息后,将openid与ip 做结合并加密成token保存在服务器并附带返回 访问接口时必须附带该token 并验证 # 用户登陆时,对用户和ip做记录,如果登陆错误超三次,则短时内禁止再登陆 //========================= 前台页面与功能 ### upyun 版前台服务 ### index.html 首页 # 获取并缓存开通服务器地址列表,并随机选取一个指定URL local1/local2 / upyun / after localStorage.server_list1 localStorage.server_list2 localStorage.server_list_tag upyun/server_list/server_list.html upyun/server_list/server_list_tag.html after 增删地址时标记 到 server_list_tag.html 定期(1天)请求 server_list_tag.html 有版本,则比对localStorage.server_list_tag.不一致则更新 localStorage.server_list1 无版本,则不更新 local不存在:向upyun请求 upyun存在:返回数据 upyun不存在:向after请求数据并缓存到upyun及local localStorage.server_list2 用来随机选择并删除,为空时再同步server_list1,达到每次用不同的服务器 sess缓存随机出来的服务器地址,用来做后台请求使用 "sessionStorage.after_url" # JS版获取并缓存(local) openid等用户信息 不在:获取并local缓存 存在:判断是否过期(七天),重新获取及缓存 # 获取并缓存开通城市数据 local / upyun / after localStorage.open_city localStorage.open_city_tag upyun/open_city/open_city.html upyun/open_city/open_city_tag.html after 增删时标记版本到 open_city_tag.html 定期(1天)请求 open_city_tag.html 有版本,则比对localStorage.open_city_tag.不一致则更新 localStorage.open_city 无版本,则不更新 local不存在:向upyun请求 upyun存在:返回数据 upyun不存在:向after请求数据并缓存到upyun及local # 展示开通城市选择下拉框 # 切换城市选择时local缓存省市县下标,及县code,库址,库名信息 注意切换时,省市县数据的重置 # 点击进入跳转到 area_list.html ### area_list.html 小区列表页 # 获取并缓存及显示当前城市的小区列表 (分页) local / upyun / after local 定时向 upyun 更新 # 获取 我所加入的小区数据 数据:[[code,id,name],,,] # 点击小区名 # ,并比对当前点击的小区id 是否在我所加入的小区的id列表中 有:则说明密码验证过,直接跳转到 index_areaDetail.html 无:输入小区密码,进行验证。 正确: 请求后台将id添加到我的小区列表,并缓存附带tag 请求后台将用户openid 记录到小区用户表中,记录时判断是否已存在 并跳转到 index_areaDetail.html 失败:终止跳转 # 点击 我的小区 跳转到 index_me.html ### 前台运行流程 (新) ### upyun/transfer.html # 地区选择框 # 切换时 local缓存选择地区的 省id,市id,县id 以便初始化时,选择缓存匹配的项 # 判断是否城市缓存,有缓存时,使用缓存匹配的项 # 获取服务器地址列表,并随机选取一个指定URL # 判断local是否有用户信息及过期缓存 无,则使用JS版获取用户openid及信息向后台请求,并local缓存。 有,则判断是否过期,过期则重新获取并缓存。 # 点击 '前往' 按钮时 附带 县code,县址,县库 跳转到指定服务器的 transfer.html ### transfer.html # 接收并session缓存 附带过来的 县code,县址,县库,userInfo # 缓存成功后,自动跳转到 index.html ### index.html # 获取并显示及缓存当前城市的小区列表 (分页) 数据: id,city_code,pwd localstorage -> upyun | tag -> mysql # 获取 我所加入的小区数据 数据:[[code,id,name],,,] # 点击小区名 # ,并比对当前点击的小区id 是否在我所加入的小区的id列表中 有:则说明密码验证过,直接跳转到 index_areaDetail.html 无:输入小区密码,进行验证。 正确: 请求后台将id添加到我的小区列表,并缓存附带tag 请求后台将用户openid 记录到小区用户表中,记录时判断是否已存在 并跳转到 index_areaDetail.html 失败:终止跳转 # 点击 我的小区 跳转到 index_me.html ### index_me.html # 根据 openid 获取并显示当前城市我所加入的小区列表 storage # 小区红点判断是否有新信息 逻辑:发新信息时,在upyun以 city_code + area_id 为名缓存发布版本号, 遍历小区时他们 upyun请求版本号并缓存及比对 不一致则显示红点 # 点击小区名附带 area_id 跳转 到 index_areaDetail.html # 点击创建小区 跳转 到 index_createArea.html ### index_createArea.html # 创建新小区 后台: 检测小区名在本地区是否已存在 1,未存在,创建,返回1 提示,创建成功,正在审核 2,存在,判断状态,审核中,返回 2 ;正常 返回3 提示小区已存在 ### index_areaDetail.html # 接收 area_id # 根据 area_id 获取并缓存群管理成员列表 # 比对当前用户openid 和管理成员列表中的openid 比中说明是管理,则显示 发布信息 # 点击 发布信息 跳转到 index_issue.html (管理权限才显示) # 接收拒收推送 # 点击 管理成员 跳转到 index_adminList.html # 点击 退出 后台操作当前用户退出当前小区 # 获取,显示,缓存 小区下的通知列表(分页) storage / upyun # 点击 小区名附带 msg_id 跳转到 index_msg_detail.html ### index_msg_detail.html # 接收附带的 msg_id 并获取详情 local,upyun,mysql # 显示通知信息 # 如果带投票, 获取并显示票数,及投票按钮 点击投票时向后台验证及请求 ### index_issue.html # 小区通知的发布 限制小区每天最多发布1条 # 发布时判断发布人是否状态正常 注:这里的发布只是待审状态,审核通过时才发布及推送信息 ### index_adminList.html # 申请超管 判断管理员列表中是否有超管,没有时可申请,判断当前用户状态正常时可申请 申请时创建一个置顶 投票msg 有效期为30天,赞成票超过半数成员即生效 # 每一次投票时,判断是否生效。生效后删除该msg # 转让超管 超管才显示转让,判断当前用户与超管openid是否一致 # 罢免超管 申请时创建一个置顶 投票msg 有效期为30天,赞成票超过半数成员即生效 # 每一次投票时,判断是否生效。生效后删除该msg # 撤销管理 # 注意:提权等扫码操作时注意二维码时限漏洞。 //========================= 数据表 ### 城市信息表 使用已有 ### 小区表 create table area_list( id int primary key auto_increment, city_code char(6), area_name varchar(30), stat tinyint(1) default 1 comment '状态1待审2正常3封禁', openid varchar(50) comment '创建者', pwd varchar(10) comment '小区口令', index a(city_code,stat), index b(city_code,area_name), index c(openid) )engine=myisam default charset=utf8; city_code,stat : 用于后台管理对小区状态的区分 city_code,area_name : 检测同区域小区名唯一性 openid : 检测用户创建个数时使用 ### 小区信息表 create table area_msg_list( id int primary key auto_increment, openid varchar(50) comment '发布者openid', area_id int, city_code int, info_title varchar(100), info_content varchar(5000), type enum('normal','ticket') default 'normal' comment 'a普通b投票', time char(11) comment '发布时间', stat tinyint(1) default 1 comment '状态1待审2未过3通过', index a(area_id,time), index b(city_code) )engine=myisam default charset=utf8; upyun:city_code _ id ### 小区通知投票记录表 create table area_msg_vote( id int primary key auto_increment, msg_id int comment '关联的信息id', area_id int comment '关联的小区id', openid varchar(50) comment '投票者的openid', type enum('favor','oppose') default 'favor' comment 'f赞成o反对', index a(msg_id,openid), index b(msg_id,type) )engine=myisam default charset=utf8; ### 小区用户表 create table area_users_list( id int primary key auto_increment, area_id int, openid varchar(50), level tinyint(1) default 3 comment '用户级别1超管2普管3普通', receive tinyint(1) default 1 comment '接收推送1接收2不接收', stat tinyint(1) default 1 comment '1正常2暂封3永封', stime varchar(12) comment '暂封的过期时限', index a(area_id,receive), index b(openid) )engine=myisam default charset=utf8; ### 我的小区表 create table my_area_list( openid varchar(50), area_id_list varchar(60000) comment '小区id JSON串', index a(openid) )engine=myisam default charset=utf8; ### 开通的服务器域名表 create table open_city_list( id int primary key auto_increment, domain varchar(50) comment '域名', index a(domain) )engine=myisam default charset=utf8; ### 管理成员表 create table admin_user( id int primary key auto_increment, user varchar(50), pwd varchar(50), perm varchar(6000), stat tinyint(1) default 1 comment '1正常2封禁' index a(user) )engine=myisam default charset=utf8; //========================= 后台管理页面与功能 ### after_login.html 登陆页 # 附带用户名和密码 请求后端接口验证 判断用户名是否为 admin ### after_con_index.html # 欢迎标语 # 等待选择页面 ### after_con_public.html 公共数据库设置页 (超管才显) # 线下记事本做记录 # 数据设置及获取 sessionstorage 和 upyun # 数据格式:[db_name,db_addr] sessionStorage.public_database = xxx # upyun 路径:/public_database/public.html ### after_con_server.html 开通服务器管理页 (超管才显) # 添加服务器地址,数据保存在 公共数据库, sessionStorage # 获取并显示开通服务器列表 sessionStorage,mysql # 删除服务器地址及清除缓存 更新sessionStorage # 多选删除服务器地址及清除缓存 更新sessionStorage # 数据格式:[[id,domain],[id,domain]] ### after_con_opencity.html 开通城市管理页 (超管才显) # 开通/未开通/全部 下拉框 # 获取城市全部数据,并分类展示 数据保存在 公共数据库,sessionStorage # 显示及修改指定城市的表单,修改同时清除缓存 县对应的库ip地址,库名 # 提交按钮 # 重置按钮 ### after_con_area.html 小区管理页 # 获取已开通城市数据并陈列到下拉列表,供选择 # 获取指定城市下小区列表 mysql,sess|600 # 审核小区名 # 点击小区 跳转到 after_con_msg.html # 点击成员 跳转到 after_con_user.html ### after_con_msg.html 小区信息管理页 # 获取并显示指小区下的通知列表 # 审核通知 更改状态 注:审核通过的时候才会触发模板信息的群发。 ### after_con_user.html 小区成员管理 # 获取小区管理成员 # 对成员的禁言,解禁 (禁言为一定时限) # 罢免管理 # 添加超管 ### after_con_admin.html 运维成员管理 (超管才显) # 管理员命名规则: # 多县管理:省市全拼+序号+县个数 如:x_jilin_tonghua_001 # 多市管理:省全拼+序号+市个数 如:s_jilin_001 # 多省管理:省个数+序号 如:s_002 # 数据保存到公共库 ### after_con_admin_set.html # 修改当前登陆的管理用户密码 //========================= 备忘 # 后台底部导航切换时需要清除的缓存 后台管理 sessionStorage user = "admin" //登陆管理用户 token1 = "b2741b9410a2c3fcc0e0ae481fd3174e" //用户与ip组合token public_database = '["127.0.0.2","wuye1"]'; //公共数据库 insert into area_msg_list select null,concat('omTFa02CiCTgB5FqQ4cHDcI7txXA',ceil(rand()*9)),18,110101,md5(rand()),md5(rand()),'normal',1574299556,3 from area_msg_list;