回 帖 发 新 帖 刷新版面

主题:很笨的程序:自动求公务员晋升级别、档次的函数

这是乌鸦才完成的:自动求公务员晋升级别、档次的函数(处分和降级要求用户手工计算)。

这是乌鸦人事软件中的1个函数,1个字符都未修改。
乌鸦都是用笨办法,一步一步地推算,尽量使用汉字来定义内存变量,并且写入关键地说明,以便自己推算和以后地维护,不考虑别人盗取的问题。某研究所2002年“拿”了乌鸦软件的全部设计资料,花3年多仿制后捞了数千万,但此类函数它们仿不出(开始牛B烘烘说半年完成)。乌鸦的用户过万,用户是党委政府的组织人事部门、大学人事处等,给票子的不到50,去年收入900元。最典型的是光大某分支结构干活科员来电话:领导不同意购买,乌鸦答曰:可以免费使用全部功能,敢用就是对乌鸦的支持,乌鸦很高兴,若给票子乌鸦会更高兴。这就是为什么自诩为:不黑的乌鸦。

由于此类函数太复杂,若用select语句,乌鸦不知道如何去实现,所以乌鸦干脆就不学该语句的用法。各位新狐狸,当你的功力不足时,用笨办法解决工程问题就是最好的办法。


*!*******************************************************
proc gzsp_自动填写_晋档晋级_考核起年度
para js_类型
priv m_晋级手工,m_晋档手工

*  编辑界面双击时,只求级别晋升考核起始年度
js_类型=iif(type('js_类型')='C',js_类型,'')

if used('gzsp_dwmc')
 m_缓冲表_A='GZSP_DWMC'
 m_主表_A='GZSP1'
 m_缓冲表_B='GZSP_DWMC2'
 m_主表_B='GZSP1_LTXX'
else
 m_缓冲表_A='GZSP_MDMC'
 m_主表_A='GZSP'
 m_缓冲表_B='GZSP_MDMC2'
 m_主表_B='GZSP_LTXX'
endi
sele(m_缓冲表_A)  && 只在单位大表的年度考核名册
sr__标识号=bh
tmp=gz__记录号
sele(m_主表_A)
go tmp

sele ('gzsp_zk')
if .not.bh=SR__标识号
 loca for bh=SR__标识号
endi
sele ('zk1')
if .not.bh=SR__标识号
 set orde to zk1
 seek SR__标识号
endi

sele(m_缓冲表_B)  && 只在单位大表的年度考核名册
if .not.bh=sr__标识号
 loca for bh=sr__标识号
endi
m_晋级手工=jbkh_手工
m_晋档手工=dckh_手工
tmp=gz__记录号
sele(m_主表_B)
go tmp

sele(m_缓冲表_A)  && 只在单位大表的年度考核名册
g1_编制=trim(gzbzlb1_hz)
do gzsp_筛选各层次任职记录 with '考核信息'  && 结果在 ls_工资层次.dbf 中
if .not.used('ls_工资层次')
 use &user_ml.\ls_工资层次 in 0 excl
endi
sele('ls_工资层次')
*  如此索引,使晋升按执行时间做流水帐,避免计算出错
inde on gz_zxsj1+gz_pzsj1 to &user_ml.\ls_工资层次

m_大表执行年=val(left(gzsp_bt.gz_zxsj,4))
m_参加工作年=val(left(zk1.gs_hz,4))
m_今年=val(left(dtoc(date()),4))

sele(m_缓冲表_A)
m_呈报时间=left(gz_pzsj2,7)
m_执行时间=left(gz_zxsj2,7)
g1_岗位=trim(zw_gw1_hz)

do case
case m_晋级手工=1.and.val(jsjb_khnd1)>=2006
case '新录用'$zw_gw1_hz
case (val(jsjb_khnd1)<2006.or.js_类型=='只求级别'.or.js_类型=='强制修改');
  .and.(g1_编制='公务员'.or.g1_编制='参照公务员')
 sele('ls_工资层次')
 set filt to left(gz_pzsj1,7)<m_呈报时间.and.left(gz_zxsj1,7)<m_执行时间
 go bott
 g1_岗位0=trim(zw_gw1_hz)
 g1_岗位=trim(zw_gw1_hz)
 g0_岗位=trim(zw_gw1_hz)
 g_本级领导=''
 g_本级非领导=''
 g_下级领导=''
 g_下级非领导=''
 do case
 case g1_岗位0='厅长'.or.g1_岗位0='巡视员'
  if g1_岗位0='厅长'
   g_本级领导='厅长'
   g_本级非领导='巡视员'
  endi
  g1_岗位='厅长'
  g0_岗位='巡视员'
  g_下级领导='副厅长'
  g_下级非领导='副巡视员'
 case g1_岗位0='副厅'.or.g1_岗位0='副巡视员'
  if g1_岗位0='副厅长'
   g_本级领导='副厅长'
   g_本级非领导='副巡视员'
  endi
  g1_岗位='副厅长'
  g0_岗位='副巡视员'
  g_下级领导='处长'
  g_下级非领导='调研员'
 case g1_岗位0='处长'.or.g1_岗位0='调研员'
  if g1_岗位0='处长'
   g_本级领导='处长'
   g_本级非领导='调研员'
  endi
  g1_岗位='处长'
  g0_岗位='调研员'
  g_下级领导='副处长'
  g_下级非领导='副调研员'
 case g1_岗位0='副处'.or.g1_岗位0='副调研员'
  if g1_岗位0='副处长'
   g_本级领导='副处长'
   g_本级非领导='副调研员'
  endi
  g1_岗位='副处长'
  g0_岗位='副调研员'
  g_下级领导='科长'
  g_下级非领导='主任科员'
 case g1_岗位0='科长'.or.g1_岗位0='主任科员'
  if g1_岗位0='科长'
   g_本级领导='科长'
   g_本级非领导='主任科员'
  endi
  g1_岗位='科长'
  g0_岗位='主任科员'
  g_下级领导='副科长'
  g_下级非领导='副主任科员'
 case g1_岗位0='副科长'.or.g1_岗位0='副主任科员'
  if g1_岗位0='副科长'
   g_本级领导='副科长'
   g_本级非领导='副主任科员'
  endi
  g1_岗位='副科长'
  g0_岗位='副主任科员'
  g_下非级领导='科员'
 case g1_岗位0='科员'
  g_下级非领导='办事员'
 endc
 g1_级别=trim(gwyjb1_hz)
 g2_级别dm=val(gwyjb1)+1
 g_执行年=left(gz_zxsj1,4)
 g_执行年月=gz_zxsj1
 do whil .not.bof()
  n_现岗位=trim(zw_gw1_hz)
  n_现级别=trim(gwyjb1_hz)
  n_现级别dm=val(gwyjb1)
  n_执行时=trim(gz_zxsj1)
  do case
  case n_现岗位=g1_岗位.and.n_现级别dm=g2_级别dm.and..not.val(subs(gz_zxsj1,5,2))=1
   * 相同职务,但级别底一级,并且执行时间不是1月份,这是职务晋升顺序引起的混乱
   g_执行年=left(gz_zxsj1,4)
   g_执行年月=gz_zxsj1
   skip -1
  case n_现级别==g1_级别.or.n_现岗位==g_本级非领导.and.g1_岗位0==g_本级领导.and.val(gwyjb1)=g2_级别dm;
    .or.(n_现岗位==g_下级领导.or.n_现岗位==g_下级非领导).and.val(gwyjb1)=g2_级别dm
   *  非领导职务晋升同级别的领导职务,级别也晋升1级
   *  当职务晋升时发生1个级别晋升,级别考核起始年度不变
   *    岗位=下一职务层次 .and. 级别数=现级别数+1
   g_执行年=left(gz_zxsj1,4)
   g_执行年月=gz_zxsj1
   skip -1
  othe
   exit
  endc
 endd
 m_今年=left(dtoc(date()),4)
 do case
 case val(g_执行年)<2006.and.val(g_执行年)>1
  * 查到有效的工资记录, 级别=2006年7月套改的级别,取套改前的年度
  g_执行年月='2006.07'
  g_执行年='2006'
 case val(g_执行年)<=0
  *  未查到工资记录
  do case
  case m_参加工作年>1.and.m_参加工作年<=2006
   g_执行年月='2006.07'
   g_执行年='2006'
  case m_参加工作年>=val(g_执行年)-4
   g_执行年=str(m_参加工作年,4)  && 默认为参加工作的年度
  othe
   g_执行年=str(m_大表执行年-3)  && 2009年默认2006年
  endc
  if val(g_执行年)<2006
   g_执行年='2006'
  endi
 endc
 if empty(g1_岗位)
   g_执行年=''
 endi
 sele(m_主表_A)
 if js_类型=='只求级别'.and..not.trim(jsjb_khnd1)==g_执行年
  =messagebox( '从工资变动登记表自动求的晋升级别考核起始年不相同',48,"")
 endi
 repl jsjb_khnd1 with g_执行年
 sele(m_缓冲表_A)
 repl jsjb_khnd1 with g_执行年
 db_编辑字段0='JSJB_KHND1'
 do gzsp_晋升考核年度_存回gzsp_zx
endc

sele(m_缓冲表_A)
if js_类型=='只求级别'
 return
endi

回复列表 (共5个回复)

沙发

g1_岗位=trim(zw_gw1_hz)
do case
case m_晋档手工=1.and.val(jsdc_khnd1)>=2006
case '新录用'$zw_gw1_hz
case (val(jsdc_khnd1)<=1993.or.js_类型=='强制修改').and.(g1_编制='公务员'.or.g1_编制='参照公务员')
 sele('ls_工资层次')
 set filt to left(gz_pzsj1,7)<m_呈报时间.and.left(gz_zxsj1,7)<m_执行时间
 go bott
 g1_岗位=trim(zw_gw1_hz)
 g1_边远=iif(trim(jkdq_lb1)='无'.or.empty(jkdq_lb1),'无','有')
 g1_级别=trim(gwyjb1_hz)
 g1_级别dm=val(gwyjb1)
 g1_档次=trim(gwydc1_hz)
 g1_档次dm=val(gwydc1)
 g1_级别额=jbgz_e1
 g_执行年=left(gz_zxsj1,4)
 o1_级别dm=val(gwyjb1)
 o1_岗位=trim(zw_gw1_hz)
 o1_边远=iif(trim(jkdq_lb1)='无'.or.empty(jkdq_lb1),'无','有')
 m_职务晋升=''
 store '' to s1_岗位,s1_级别,s1_级别dm,s1_档次,s1_档次dm,s1_级别额,os1_级别dm
 do whil .not.bof()
  n1_级别=trim(gwyjb1_hz)
  n1_级别dm=val(gwyjb1)
  n1_档次dm=val(gwydc1)
  n1_边远=iif(trim(jkdq_lb1)='无'.or.empty(jkdq_lb1),'无','有')
  if n1_级别==g1_级别.and.trim(gwydc1_hz)==g1_档次;
   .or.(n1_级别dm-1)=g1_级别dm.and.(n1_档次dm-1)=g1_档次dm;
   .or.(n1_级别dm-1)=g1_级别dm.and.n1_档次dm=1.and.g1_档次dm=1;
   .or.n1_级别dm=g1_级别dm.and..not.n1_档次dm=g1_档次dm.and..not.n1_边远==g1_边远
   *  单独晋升级别时:(n1_级别dm-1)=g1_级别dm.and.(n1_档次dm-1)=g1_档次dm
   *  与边远地区互相调动时,级别不变、档次变化、边远地区变化:有-无
   g_执行年=left(gz_zxsj1,4)
   o1_级别dm=val(gwyjb1)
   o1_岗位=trim(zw_gw1_hz)
   o1_边远=iif(trim(jkdq_lb1)='无'.or.empty(jkdq_lb1),'',trim(jkdq_lb1))
   if (n1_级别dm-1)=g1_级别dm.and.(n1_档次dm=1.and.g1_档次dm=1.or.(n1_档次dm-1)=g1_档次dm);
     .and..not.trim(zw_gw1_hz)==g1_岗位
    *  有xx级x档 晋升级别到 xx-1级1档,然后有职务晋升,级别工资=xx-2级1档
    *    或者职务晋升引起1个级别晋升
    m_职务晋升='1档职务晋升_到上一级1档'
    s1_岗位=trim(zw_gw1_hz)
    s1_级别=trim(gwyjb1_hz)
    s1_级别dm=val(gwyjb1)
    s1_档次=trim(gwydc1_hz)
    s1_档次dm=val(gwydc1)
    s1_级别额=jbgz_e1
    os1_级别dm=val(gwyjb1)
    s1_边远=iif(trim(jkdq_lb1)='无'.or.empty(jkdq_lb1),'',trim(jkdq_lb1))
   endi
  else
   exit
  endi
  skip -1
 endd
 do case
 case m_职务晋升='1档职务晋升_到上一级1档'.and.s1_岗位=trim(zw_gw1_hz)
  *  有xx级x档 晋升级别到 xx-1级1档,然后有职务晋升,级别工资=xx-2级1档
  if (val(gwyjb1)-1)=s1_级别dm.and.(val(gwydc1)-1)=s1_档次dm
   g_执行年=left(gz_zxsj1,4)
  endi
 case (val(gwyjb1)-2)=g1_级别dm.and.g1_级别dm=o1_级别dm.and.g1_级别额>0.and.jbgz_e1>0;
   .and..not.trim(zw_gw1_hz)==g1_岗位
  *  两行之间差2个级别,本次岗位变动晋升了2个级别,
  *   检查月增加级别工资若超过下一级别的一个档差,晋升档次考核重新起算
  m_级增额=g1_级别额-jbgz_e1
  tmp_级别=val(gwyjb1)-1
  m_档差=gzsp_求公务员级别工资一个档差额(tmp_级别)
  if m_级增额>m_档差.and.val(gz_zxsj1)>2006
  else
   *  不超过一个档差,考核年度用晋升职务之前的年度
   g_执行年=left(gz_zxsj1,4)
  endi
 endc
 if val(g_执行年)<=0
  if m_参加工作年>=(m_大表执行年-2)
   g_执行年=str(m_参加工作年,4)  && 前年之后参加工作的,默认为参加工作的年度
  else
   m_偏移=iif(mod(m_大表执行年,2)=0,2,1)
   g_执行年=str(m_大表执行年-m_偏移,4)  && 默认单年度为去年,双年度为前年
  endi
 endi
 if empty(g1_岗位)
   g_执行年=''
 endi
 sele(m_主表_A)
 repl jsdc_khnd1 with g_执行年
 sele(m_缓冲表_A)
 repl jsdc_khnd1 with g_执行年
 db_编辑字段0='JSDC_KHND1'
 do gzsp_晋升考核年度_存回gzsp_zx
 
case (val(jsdc_khnd1)<=1993.or.js_类型=='强制修改').and.'机关工人'$g1_编制
 sele('ls_工资层次')
 go bott
 g1_岗位=trim(zw_gw1_hz)
 g1_档次=trim(zwdc1_hz)
 g_执行年=left(gz_zxsj1,4)
 do whil trim(zw_gw1_hz)==g1_岗位.and.trim(zwdc1_hz)==g1_档次.and..not.bof()
  g_执行年=left(gz_zxsj1,4)
  skip -1
 endd
 if val(g_执行年)<=0
  if m_参加工作年>=(m_大表执行年-2)
   g_执行年=str(m_参加工作年,4)  && 前年之后参加工作的,默认为参加工作的年度
  else
   m_偏移=iif(mod(m_大表执行年,2)=0,2,1)
   g_执行年=str(m_大表执行年-m_偏移,4)  && 默认单年度为去年,双年度为前年
  endi
 endi
 if empty(g1_岗位)
   g_执行年=''
 endi
 sele(m_主表_A)
 repl jsdc_khnd1 with g_执行年
 sele(m_缓冲表_A)
 repl jsdc_khnd1 with g_执行年
 db_编辑字段0='JSDC_KHND1'
 do gzsp_晋升考核年度_存回gzsp_zx
endc

sele('ls_工资层次')
use &user_ml.\ls_工资层次 excl
sele(m_缓冲表_A)
return

板凳

*!**********************************************************
proc gzsp_筛选各层次任职记录
para p_层次类别
priv m_岗位,m_岗位1
* 对gzsp_zx.dbf已执行工资记录进行职务层次筛选->ls_工资层次.dbf

* thisform.__筛选工资层次
* 对已执行工资进行筛选
p_层次类别=iif( type('p_层次类别')='C',p_层次类别,'' )
if used('ls_工资层次')
 sele('ls_工资层次')
 use
endi
sele ('gzsp_zk')
if .not.bh=SR__标识号
 loca for bh=SR__标识号
endi
sele ('zk1')
if .not.bh=SR__标识号
 set orde to zk1
 seek SR__标识号
endi

sele ('gzsp_zx')
set filt to
set orde to gzsp_zx0  && 批准时间+执行时间 正排序
seek str(SR__标识号)
copy to &user_ml.\ls_工资层次 whil bh=sr__标识号 for .not.empty(zw_gw1_hz)
sele 0
use &user_ml.\ls_工资层次 excl
m_最后记录=recc()
store '' to  m_岗位1,m_职务岗位1,m_薪级1,m_公务员级别1,m_公务员档次1
set dele off
go top
do whil .not.eof()
 m_呈报时=left(gz_pzsj1,7)
 m_执行时=left(gz_zxsj1,7)
 m_岗位=allt(zw_gw1_hz)
 m_编制=trim(gzbzlb1_hz)
 m_岗位代码2=left(zw_gw1,2)
 m_档次=''
 do case
 case '薪'$zwdc1_hz
  m_档次='薪级'
 case '档'$zwdc1_hz
  m_档次='档次'
 endc
 do case
 case recno()=m_最后记录
 case p_层次类别='考核'
 *case m_呈报时>='2007.12'.and.m_执行时=='2006.07'
  * 2006套改记录,保留
 case '事业'$m_编制.and.('技术一级'$m_岗位.or.'技术二级'$m_岗位.or.'技术三级'$m_岗位.or.'技术四级'$m_岗位)
  repl zw_gw1_hz with '正高职称'
  m_岗位='正高职称'
 case '事业'$m_编制.and.('技术五级'$m_岗位 .or. '技术六级'$m_岗位.or. '技术七级'$m_岗位)
  repl zw_gw1_hz with '副高职称'
  m_岗位='副高职称'
 case '事业'$m_编制.and.('技术八级'$m_岗位.or.'技术九级'$m_岗位.or.'技术十级'$m_岗位)
  repl zw_gw1_hz with '中级职称'
  m_岗位='中级职称'
 case '事业'$m_编制.and.('技术十一级'$m_岗位.or.'技术十二级'$m_岗位)
  repl zw_gw1_hz with '初级职称'
  m_岗位='初级职称'
 case '事业'$m_编制.and.'技术十三级'$m_岗位
  repl zw_gw1_hz with '员级职称'
  m_岗位='员级职称'
 case '事业技术'$m_编制.and.m_档次='档次'.and.m_岗位代码2=='21'  && '21'是事业技术岗位代码
  *  求2006套改之前的技术职称级别
  G_职称级dm=right(trim(zw_gw1),1)
  G_职称级别mc=''
  do case
  case G_职称级dm='1'
   G_职称级别mc='正高职称'
  case G_职称级dm='2'
   G_职称级别mc='副高职称'
  case G_职称级dm='3'
   G_职称级别mc='中级职称'
  case G_职称级dm='4'
   G_职称级别mc='初级职称'
  case G_职称级dm='5'.or.G_职称级dm='6'
   G_职称级别mc='员级职称'
   G_职称级dm='5'
  endc
  if .not.empty(G_职称级别mc)
   repl zw_gw1_hz with G_职称级别mc,zw_gw1 with '2100'+G_职称级dm
   m_岗位=G_职称级别mc
  endi
  
 case '事业'$m_编制.and.m_岗位=='技术工一级'
  repl zw_gw1_hz with '高级技师'
  m_岗位='高级技师'
 case '事业'$m_编制.and.m_岗位=='技术工二级'
  repl zw_gw1_hz with '技师'
  m_岗位='技师'
 case '事业'$m_编制.and.m_岗位=='技术工三级'
  repl zw_gw1_hz with '高级工'
  m_岗位='高级工'
 case '事业'$m_编制.and.m_岗位=='技术工四级'
  repl zw_gw1_hz with '中级工'
  m_岗位='中级工'
 case '事业'$m_编制.and.m_岗位=='技术工五级'
  repl zw_gw1_hz with '初级工'
  m_岗位='初级工'
 case m_岗位=='厅长'.or.m_岗位=='巡视员'
  repl zw_gw1_hz with '正厅'
  m_岗位='正厅'
 case m_岗位=='副厅长'.or.m_岗位=='副巡视员'.or.m_岗位=='助理巡视员'
  repl zw_gw1_hz with '副厅'
  m_岗位='副厅'
 case m_岗位=='处长'.or.m_岗位=='调研员'
  repl zw_gw1_hz with '正处'
  m_岗位='正处'
 case m_岗位=='副处长'.or.m_岗位=='副调研员'.or.m_岗位=='助理调研员'
  repl zw_gw1_hz with '副处'
  m_岗位='副处'
 case m_岗位=='科长'.or.m_岗位=='主任科员'
  repl zw_gw1_hz with '正科'
  m_岗位='正科'
 case m_岗位=='副科长'.or.m_岗位=='副主任科员'
  repl zw_gw1_hz with '副科'
  m_岗位='副科'
  endc
 
 do case
 case recno()=m_最后记录
  * 最后一条记录,保留
 *case m_呈报时>='2007.12'.and.m_执行时=='2006.07'
  * 2006套改记录,保留
 case p_层次类别='考核'
  *  考核时,岗位、级别、档次、薪级相同的记录去掉
  if trim(zw_gw1_hz)==m_职务岗位1.and.trim(zwdc1_hz)==m_薪级1;
    .and.trim(gwyjb1_hz)==m_公务员级别1.and.trim(gwydc1_hz)== m_公务员档次1
   dele
  endi
 case m_岗位==m_岗位1
  dele
 case (m_岗位=='正厅'.or.m_岗位=='厅长'.or.m_岗位=='巡视员');
   .and.(m_岗位1='正厅'.or.m_岗位1='厅长'.or.m_岗位1='巡视员')
  dele
 case (m_岗位=='副厅'.or.m_岗位=='副厅长'.or.m_岗位=='副巡视员'.or.m_岗位=='助理巡视员');
   .and.(m_岗位1='副厅'.or.m_岗位1=='副厅长'.or.m_岗位1='副巡视员'.or.m_岗位1='助理巡视员')
  dele
 case (m_岗位=='正处'.or.m_岗位=='处长'.or.m_岗位=='调研员');
   .and.(m_岗位1=='正处'.or.m_岗位1=='处长'.or.m_岗位1=='调研员')
  dele
 case (m_岗位1=='副处'.or.m_岗位1=='副处长'.or.m_岗位1=='副调研员'.or.m_岗位1=='助理调研员');
   .and.(m_岗位=='副处'.or.m_岗位=='副处长'.or.m_岗位=='副调研员'.or.m_岗位=='助理调研员')
  dele
 case (m_岗位1=='正科'.or.m_岗位1=='科长'.or.m_岗位1=='主任科员');
   .and.(m_岗位=='正科'.or.m_岗位=='科长'.or.m_岗位=='主任科员')
  dele
 case (m_岗位1=='副科'.or.m_岗位1=='副科长'.or.m_岗位1=='副主任科员');
   .and.(m_岗位=='副科'.or.m_岗位=='副科长'.or.m_岗位=='副主任科员')
  dele
 endc
 m_岗位1=m_岗位
 m_职务岗位1=trim(zw_gw1_hz)
 m_薪级1=trim(zwdc1_hz)
 m_公务员级别1=trim(gwyjb1_hz)
 m_公务员档次1=trim(gwydc1_hz)
 skip
endd
pack
use
return

3 楼

涌车兄增经问:自己写缓冲是什么东东?

 m_缓冲表_A='GZSP_DWMC'
 m_主表_A='GZSP1'
 m_缓冲表_B='GZSP_DWMC2'
 m_主表_B='GZSP1_LTXX'

把主表GZSP1.DBF的一些记录复制到临时表GZSP_DWMC.DBF中,延长表'GZSP1_LTXX.DBF的相关记录复制到'GZSP_DWMC2.DBF中,在GZSP_DWMC.DBF和'GZSP_DWMC2.DBF中编辑修改,并且同步存回GZSP1.DBF、'GZSP1_LTXX.DBF。这是因为乌鸦的功力不足,不知道如何使用select来处理这种复杂的存储函数。

《m_主表_B》是因为256个字段不够用,再加一个表来存放信息项目。
vf的表只有255个字段,是一个只能满足底端底应用的数据库。爱之、恨之。

4 楼

内存变量user_ml是存放用户临时文件的专用文件夹,软件是多用户的,系统根据登录的用户姓名建立。

5 楼

顶一下

我来回复

您尚未登录,请登录后再回复。点此登录或注册