做的ASP网站手机,怎么给网站做 360快照,Wordpress+仿站+工具,找人做方案的网站持续学习持续更新中… 
守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【17】认证服务01 环境搭建验证码倒计时短信服务邮件服务验证码短信形式#xff1a;邮件形式#xff1a; 异常机制MD5参考 环境搭建 
C:\Windows\System32\drivers\etc\hosts 
192.168.… 
持续学习持续更新中… 
守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【17】认证服务01 环境搭建验证码倒计时短信服务邮件服务验证码短信形式邮件形式 异常机制MD5参考 环境搭建 
C:\Windows\System32\drivers\etc\hosts 
192.168.56.10 gulimall.com
192.168.56.10 search.gulimall.com
192.168.56.10 item.gulimall.com
192.168.56.10 auth.gulimall.comNginx配置记得使用Nginx动静分离 # ...http {# ...upstream gulimall {server 192.168.193.107:88;}include /etc/nginx/conf.d/*.conf;
}网关 - id: gulimall_auth_routeuri: lb://gulimall-authpredicates:- Hostauth.gulimall.comgulimall-auth 
Controller
public class LoginController {GetMapping(/login.html)public String loginPage() {return login;}GetMapping(/reg.html)public String regPage() {return reg;}
}或者 
Configuration
public class GulimallWebConfig implements WebMvcConfigurer {/*** 视图映射*/Overridepublic void addViewControllers(ViewControllerRegistry registry) {/***     GetMapping(/login.html)*     public String loginPage(){*          //空方法*         return login;*     }*///只是get请求能映射registry.addViewController(/login.html).setViewName(login);registry.addViewController(/reg.html).setViewName(reg);}
}验证码倒计时 
前端 $(function () {$(#sendCode).click(function () {//2、倒计时if ($(this).hasClass(disabled)) {//正在倒计时。} else {//1、给指定手机号发送验证码// $.get(/sms/sendEmail?email  $(#phoneNum).val(), function (data) {$.get(/sms/sendcode?phone  $(#phoneNum).val(), function (data) {if (data.code ! 0) {alert(data.msg);}});timeoutChangeStyle();}});})var num  60;function timeoutChangeStyle() {$(#sendCode).attr(class, disabled);if (num  0) {$(#sendCode).text(发送验证码);num  60;$(#sendCode).attr(class, );} else {var str  num  s 后再次发送;$(#sendCode).text(str);setTimeout(timeoutChangeStyle(), 1000);}num--;}短信服务 
购买短信套餐后扫码激活然后绑定测试手机号码 然后点击调用API发送短信 按钮 使用【专用】测试签名/模板 然后 发起调用 复制相关信息即可 增加权限授予RAM子账号SMS和MPush的权限。 dependencygroupIdcom.aliyun/groupIdartifactIdalibabacloud-dysmsapi20170525/artifactIdversion3.0.0/version/dependency// This file is auto-generated, dont edit it. Thanks.
package com.atguigu.gulimall.auth.sms;import com.aliyun.auth.credentials.Credential;
import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
import com.aliyun.sdk.service.dysmsapi20170525.AsyncClient;
import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsResponse;
import com.google.gson.Gson;
import darabonba.core.client.ClientOverrideConfiguration;import java.util.concurrent.CompletableFuture;public class SendSms {public static void main(String[] args) throws Exception {// HttpClient Configuration/*HttpClient httpClient  new ApacheAsyncHttpClientBuilder().connectionTimeout(Duration.ofSeconds(10)) // Set the connection timeout time, the default is 10 seconds.responseTimeout(Duration.ofSeconds(10)) // Set the response timeout time, the default is 20 seconds.maxConnections(128) // Set the connection pool size.maxIdleTimeOut(Duration.ofSeconds(50)) // Set the connection pool timeout, the default is 30 seconds// Configure the proxy.proxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress(your-proxy-hostname, 9001)).setCredentials(your-proxy-username, your-proxy-password))// If it is an https connection, you need to configure the certificate, or ignore the certificate(.ignoreSSL(true)).x509TrustManagers(new X509TrustManager[]{}).keyManagers(new KeyManager[]{}).ignoreSSL(false).build();*/// Configure Credentials authentication information, including ak, secret, tokenStaticCredentialProvider provider  StaticCredentialProvider.create(Credential.builder()// Please ensure that the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set..accessKeyId(xxxx).accessKeySecret(xxxx)//.securityToken(System.getenv(ALIBABA_CLOUD_SECURITY_TOKEN)) // use STS token.build());// Configure the ClientAsyncClient client  AsyncClient.builder().region(cn-shanghai) // Region ID//.httpClient(httpClient) // Use the configured HttpClient, otherwise use the default HttpClient (Apache HttpClient).credentialsProvider(provider)//.serviceConfiguration(Configuration.create()) // Service-level configuration// Client-level configuration rewrite, can set Endpoint, Http request parameters, etc..overrideConfiguration(ClientOverrideConfiguration.create()// Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi.setEndpointOverride(dysmsapi.aliyuncs.com)//.setConnectTimeout(Duration.ofSeconds(30))).build();// Parameter settings for API requestSendSmsRequest sendSmsRequest  SendSmsRequest.builder().signName(阿里云短信测试).templateCode(xxxx).phoneNumbers(xxxx).templateParam({\code\:\1111\})// Request-level configuration rewrite, can set Http request parameters, etc.// .requestConfiguration(RequestConfiguration.create().setHttpHeaders(new HttpHeaders())).build();// Asynchronously get the return value of the API requestCompletableFutureSendSmsResponse response  client.sendSms(sendSmsRequest);// Synchronously get the return value of the API requestSendSmsResponse resp  response.get();System.out.println(new Gson().toJson(resp));// Asynchronous processing of return values/*response.thenAccept(resp - {System.out.println(new Gson().toJson(resp));}).exceptionally(throwable - { // Handling exceptionsSystem.out.println(throwable.getMessage());return null;});*/// Finally, close the clientclient.close();}}简单把这些代码整改一下 
Configuration
public class SMSConfig {Value(${spring.cloud.alicloud.access-key})private String accessId;Value(${spring.cloud.alicloud.secret-key})private String secretKey;Beanpublic StaticCredentialProvider provider() {return StaticCredentialProvider.create(Credential.builder().accessKeyId(accessId).accessKeySecret(secretKey).build());}}RestController
public class SendSmsController {Autowiredprivate StaticCredentialProvider provider;/*** 提供接口供别的服务调用** param phone* param code* return body: {* bizId: 774515119736291045^0,* code: OK,* message: OK,* requestId: D6BD5A90-8755-5C82-B631-0F40AB7B41B0* }*/GetMapping(/sms/send)public R sendSms(RequestParam(phone) String phone, RequestParam(code) String code) throws ExecutionException, InterruptedException {AsyncClient client  AsyncClient.builder().region(cn-shanghai) // Region ID.credentialsProvider(provider).overrideConfiguration(ClientOverrideConfiguration.create().setEndpointOverride(dysmsapi.aliyuncs.com)).build();SendSmsRequest sendSmsRequest  SendSmsRequest.builder().signName(阿里云短信测试).templateCode(SMS_154950909).phoneNumbers(phone).templateParam({\code\:\  code  \}).build();CompletableFutureSendSmsResponse response  client.sendSms(sendSmsRequest);SendSmsResponse resp  response.get();/*{headers: {Keep-Alive: timeout\u003d25 ......},statusCode: 200,body: {bizId: 774515119736291045^0,code: OK,message: OK,requestId: D6BD5A90-8755-5C82-B631-0F40AB7B41B0}}*/client.close();if (resp.getBody().getMessage().equalsIgnoreCase(OK)) return R.ok();return R.error(BizCodeEnume.SMS_SEND_EXCEPTION);}}邮件服务 
dependencygroupIdjavax.mail/groupIdartifactIdmail/artifactIdversion1.4.1/version
/dependencyData
public class EmailVo {private String receiveMail;private String subject;private String content;
} 
Configuration
public class EmailConfig {// 我在Nacos配置中心配的user和passwordValue(${mail.user})private String mailUser;Value(${mail.password})private String mailPassword;Beanpublic Properties props() {// 创建Properties 类用于记录邮箱的一些属性Properties props  new Properties();// 表示SMTP发送邮件必须进行身份验证props.put(mail.smtp.auth, true);//此处填写SMTP服务器props.put(mail.smtp.host, smtp.qq.com);//端口号QQ邮箱端口587props.put(mail.smtp.port, 587);// 此处填写写信人的账号props.put(mail.user, mailUser);// 此处填写16位STMP口令props.put(mail.password, mailPassword);return props;}Beanpublic Authenticator authenticator(Properties props) {// 构建授权信息用于进行SMTP进行身份验证return new Authenticator() {protected PasswordAuthentication getPasswordAuthentication() {// 用户名、密码String userName  props.getProperty(mail.user);String password  props.getProperty(mail.password);return new PasswordAuthentication(userName, password);}};}
}RestController
public class SendEmailController {Autowiredprivate Properties props;Autowiredprivate Authenticator authenticator;PostMapping(/email/send)public R sendEmail(RequestBody EmailTo emailTo) throws MessagingException {// 使用环境属性和授权信息创建邮件会话Session mailSession  Session.getInstance(props, authenticator);// 创建邮件消息MimeMessage message  new MimeMessage(mailSession);// 设置发件人InternetAddress form  new InternetAddress(props.getProperty(mail.user));message.setFrom(form);// 设置收件人的邮箱InternetAddress to  new InternetAddress(emailTo.getReceiveMail());message.setRecipient(Message.RecipientType.TO, to);// 设置邮件标题message.setSubject(emailTo.getSubject());// 设置邮件的内容体message.setContent(emailTo.getContent(), text/html;charsetUTF-8);// 最后当然就是发送邮件啦Transport.send(message);return R.ok();}}验证码 
短信形式 GetMapping(/sms/sendcode)public R sendCode(RequestParam(phone) String phone) {
//        Redis缓存验证码存起来方便下次校验 以及 可以给验证码设置有效期String code  getRandomCode().toString();//        防止同一个手机号在60s内再次发送验证码String key  AuthServerConstant.SMS_CODE_CACHE_PREFIX  phone;String oldCode  stringRedisTemplate.opsForValue().get(key);if (!StringUtils.isEmpty(oldCode)) {long l  Long.parseLong(oldCode.split(_)[1]);if (System.currentTimeMillis() - l  60000) { // 如果时间间隔小于60sreturn R.error(BizCodeEnume.SMS_MULTI_EXCEPTION);}}//        R r  thirdPartyFeignService.sendSms(phone, code);
//        if (r.getCode()  BizCodeEnume.SUCCESS.getCode()) {
//            code  code  _  System.currentTimeMillis();
//            stringRedisTemplate.opsForValue().set(key, code, 5, TimeUnit.MINUTES); //过期时间5分钟
//        }
//        return r;CompletableFuture.runAsync(() - thirdPartyFeignService.sendSms(phone, code), threadPool);CompletableFuture.runAsync(() - {stringRedisTemplate.opsForValue().set(key, codeResolve(code), 5, TimeUnit.MINUTES); //过期时间5分钟}, threadPool);return R.ok();}生成验证码随机四位数 private Integer getRandomCode() {//4位数字验证码想要[1000,9999]也就是[1000,10000)// Math.random() - [0, 1)  // (int) Math.random()永远为0// Math.random() * (end - begin) - [0, end - begin)// begin  Math.random() * (end - begin) - [begin, end)int code  (int) (1000  Math.random() * (10000 - 1000));return code;}邮件形式 GetMapping(/sms/sendEmail)public R sendEmailCode(RequestParam(email) String email) throws MessagingException {String code  UUID.randomUUID().toString().substring(0, 5);String key  AuthServerConstant.EMAIL_CODE_CACHE_PREFIX  email;String oldCode  stringRedisTemplate.opsForValue().get(key);if (!StringUtils.isEmpty(oldCode)) { // 说明5分钟内已经给该邮箱发送过验证码了long l  Long.parseLong(oldCode.split(_)[1]);if (System.currentTimeMillis() - l  60000) { // 如果时间间隔小于60sreturn R.error(BizCodeEnume.SMS_MULTI_EXCEPTION);}}CompletableFuture.runAsync(() - {// 给Redis放置验证码String realSaveCode  code  _  System.currentTimeMillis();stringRedisTemplate.opsForValue().set(key, realSaveCode, 5, TimeUnit.MINUTES); //过期时间5分钟}, threadPool);CompletableFuture.runAsync(() - {// 发送邮件try {EmailTo emailTo  new EmailTo();emailTo.setReceiveMail(email);emailTo.setContent(验证码  code  ——有效期5分钟);emailTo.setSubject(欢迎注册);thirdPartyFeignService.sendEmail(emailTo);} catch (MessagingException e) {e.printStackTrace();}}, threadPool);return R.ok();}异常机制 PostMapping(/regist)public R regist(RequestBody MemberRegistVo vo){try{memberService.regist(vo);}catch (PhoneExistException e){return R.error(BizCodeEnume.PHONE_EXIST_EXCEPTION);}catch (UsernameExistException e){return R.error(BizCodeEnume.USER_EXIST_EXCEPTION);}return R.ok();}Overridepublic void regist(MemberRegistVo vo) {//检查用户名和手机号是否唯一。为了让controller能感知异常异常机制String phone  vo.getPhone(); checkPhoneUnique(phone);String userName  vo.getUserName(); checkUsernameUnique(userName);MemberEntity entity  new MemberEntity();entity.setMobile(phone);entity.setUsername(userName);entity.setNickname(userName);//设置默认等级MemberLevelEntity levelEntity  memberLevelDao.getDefaultLevel();entity.setLevelId(levelEntity.getId());//密码要进行加密存储。//当然也可以在前端就加密发过来BCryptPasswordEncoder passwordEncoder  new BCryptPasswordEncoder();String encode  passwordEncoder.encode(vo.getPassword());entity.setPassword(encode);//其他的默认信息//保存this.baseMapper.insert(entity);}Overridepublic void checkPhoneUnique(String phone) throws PhoneExistException {Integer mobile  this.baseMapper.selectCount(new QueryWrapperMemberEntity().eq(mobile, phone));if (mobile  0) {throw new PhoneExistException();}}Overridepublic void checkUsernameUnique(String username) throws UsernameExistException {Integer count  this.baseMapper.selectCount(new QueryWrapperMemberEntity().eq(username, username));if (count  0) {throw new UsernameExistException();}}public class UsernameExistException extends RuntimeException {public UsernameExistException() {super(用户名存在);}
}R 
public class R extends HashMapString, Object {public static final String CODE  code;public static final String MSG  msg;public static final String DATA  data;//利用fastjson进行逆转public T T getData(String key, TypeReferenceT typeReference) {Object data  get(key);// 默认是mapString s  JSON.toJSONString(data); // 得转为JSON字符串T t  JSON.parseObject(s, typeReference);return t;}//利用fastjson进行逆转public T T getData(TypeReferenceT typeReference) {return getData(DATA, typeReference);}public R setData(Object data) {put(DATA, data);return this;}public R() {put(CODE, BizCodeEnume.SUCCESS.getCode());put(MSG, BizCodeEnume.SUCCESS.getMsg());}public static R error() {return error(服务器未知异常请联系管理员);}public static R error(String msg) {
//        500return error(org.apache.http.HttpStatus.SC_INTERNAL_SERVER_ERROR, msg);}public static R error(int code, String msg) {R r  new R();r.put(CODE, code);r.put(MSG, msg);return r;}public static R error(BizCodeEnume bizCodeEnume) {R r  new R();r.put(CODE, bizCodeEnume.getCode());r.put(MSG, bizCodeEnume.getMsg());return r;}public static R ok(String msg) {R r  new R();r.put(MSG, msg);return r;}public static R ok(MapString, Object map) {R r  new R();r.putAll(map);return r;}public static R ok() {return new R();}public R put(String key, Object value) {super.put(key, value);return this;}public Integer getCode() {return (Integer) this.get(CODE);}public String getMsg() {return (String) this.get(MSG);}
}/**** TODO 写博客* 错误码和错误信息定义类* 1. 错误码定义规则为5位数字* 2. 前两位表示业务场景最后三位表示错误码。例如100001。*      10:通用             000:系统未知异常* 3. 维护错误码后需要维护错误描述将他们定义为枚举形式* 错误码列表*  10: 通用*      001参数格式校验*  11: 商品*  12: 订单*  13: 购物车*  14: 物流*/
public enum BizCodeEnume {SUCCESS(0, OK),HTTP_SUCCESS(200, OK),UNKNOW_EXCEPTION(10000,系统未知异常),VAILD_EXCEPTION(10001,参数格式校验失败),TOO_MANY_REQUEST(10002,请求流量过大),SMS_MULTI_EXCEPTION(10003,验证码获取频率太高请1分钟后再试),SMS_SEND_EXCEPTION(10004,验证码发送失败),SMS_CODE_EXCEPTION(10005,验证码错误),REG_ERROR_EXCEPTION(10006,用户名或手机已存在注册失败),PRODUCT_UP_EXCEPTION(11000,商品上架异常),USER_EXIST_EXCEPTION(15001,用户存在),PHONE_EXIST_EXCEPTION(15002,手机号存在),NO_STOCK_EXCEPTION(21000,商品库存不足),LOGINACCT_PASSWORD_INVAILD_EXCEPTION(15003,账号密码错误);private final int code;private final String msg;BizCodeEnume(int code,String msg){this.code  code;this.msg  msg;}public int getCode() {return code;}public String getMsg() {return msg;}
}MD5 
MD5Message Digest algorithm 5信息摘要算法 
压缩性任意长度的数据算出的MD5值长度都是固定的。容易计算从原数据计算出MD5值很容易。抗修改性对原数据进行任何改动哪怕只修改1个字节所得到的MD5值都有很大区别。强抗碰撞想找到两个不同的数据使它们具有相同的MD5值是非常困难的。不可逆即使知道加密算法也不能反推出明文密码: MD5是一种信息摘要算法会损 失元数据所以不可逆出原数据是什么 
但是由于MD5的抗修改性和强抗碰撞一个字符串的MD5值永远是那个值发明了彩虹表暴力 破解。所以MD5不能直接进行密码的加密存储 
加盐 
通过生成随机数与MD5生成字符串进行组合数据库同时存储MD5值与salt值。验证正确性时使用salt进行MD5即可 
百度网盘的秒传在上传文件之前计算出该文件的MD5值看有没有人之前上传过也就是去匹配百度网盘的数据库中有没有相同的 MD5 值 如果有一样的就不用传了 RunWith(SpringRunner.class)
SpringBootTest
public class GulimallAuthApplicationTests {Testpublic void contextLoads() {//MD5是不可逆的但是利用它的抗修改性一个字符串的MD5值永远是那个值发明了彩虹表暴力破解。//所以MD5不能直接进行密码的加密存储;
//        String s  DigestUtils.md5Hex(123456);//盐值加密随机值 加盐 $1$  8位字符
//        只要是同一个材料做出来的饭是一样的如果给饭里随机撒点“盐”那么饭的口味就不一样了//123456System.currentTimeMillis();//想要再次验证密码咋办 将密码再进行盐值去数据库查当时保存的随机盐加密一次然后再去匹配密码是否正确
//        String s1  Md5Crypt.md5Crypt(123456.getBytes()); //随机盐
//        String s1  Md5Crypt.md5Crypt(123456.getBytes(),$1$qqqqqqqq); //指定盐
//        System.out.println(s1);//        给数据库加字段有点麻烦Spring有好用的工具BCryptPasswordEncoder passwordEncoder  new BCryptPasswordEncoder();
//        String encode  passwordEncoder.encode(123456);
//        $2a$10$coLmFyeppkTPTfD0RJgqL.nx33s0wvUmj.shqEM/6hvwOO4TWiGmy
//        $2a$10$4IP4F/2iFO2gbSvQKyJzGuI3RhU5Qdtr519KsyoXGAy.b7WT4P1RW
//        $2a$10$0hEI3vMkTbTqK76990MGu.s9QKrkjDSpgyhfzR4zsy07oKB9Jw.PS//        System.out.println(encode);
//        boolean matches  passwordEncoder.matches(123456, $2a$10$0hEI3vMkTbTqK76990MGu.s9QKrkjDSpgyhfzR4zsy07oKB9Jw.PS);boolean matches  passwordEncoder.matches(lpruoyu123, $2a$10$m7TmOQAin5Tj6QzV1TT0ceW6iLypdN8LHkYP16DUEngJUfYNgWVEm);System.out.println(matches);}
}参考 
雷丰阳: Java项目《谷粒商城》Java架构师 | 微服务 | 大型电商项目. 本文完感谢您的关注支持 
 文章转载自: http://www.morning.tkrpt.cn.gov.cn.tkrpt.cn http://www.morning.pndw.cn.gov.cn.pndw.cn http://www.morning.gqcd.cn.gov.cn.gqcd.cn http://www.morning.jsxrm.cn.gov.cn.jsxrm.cn http://www.morning.tbjtm.cn.gov.cn.tbjtm.cn http://www.morning.tlnkz.cn.gov.cn.tlnkz.cn http://www.morning.kqlrl.cn.gov.cn.kqlrl.cn http://www.morning.mmkrd.cn.gov.cn.mmkrd.cn http://www.morning.rbjf.cn.gov.cn.rbjf.cn http://www.morning.nxbkw.cn.gov.cn.nxbkw.cn http://www.morning.litao7.cn.gov.cn.litao7.cn http://www.morning.bpmdz.cn.gov.cn.bpmdz.cn http://www.morning.lmjtp.cn.gov.cn.lmjtp.cn http://www.morning.zwsgl.cn.gov.cn.zwsgl.cn http://www.morning.xkpjl.cn.gov.cn.xkpjl.cn http://www.morning.hsrpr.cn.gov.cn.hsrpr.cn http://www.morning.djxnn.cn.gov.cn.djxnn.cn http://www.morning.rtbx.cn.gov.cn.rtbx.cn http://www.morning.qfzjn.cn.gov.cn.qfzjn.cn http://www.morning.mtrrf.cn.gov.cn.mtrrf.cn http://www.morning.lhgqc.cn.gov.cn.lhgqc.cn http://www.morning.mm27.cn.gov.cn.mm27.cn http://www.morning.yxkyl.cn.gov.cn.yxkyl.cn http://www.morning.xtgzp.cn.gov.cn.xtgzp.cn http://www.morning.fslrx.cn.gov.cn.fslrx.cn http://www.morning.xkyfq.cn.gov.cn.xkyfq.cn http://www.morning.cfjyr.cn.gov.cn.cfjyr.cn http://www.morning.wcjk.cn.gov.cn.wcjk.cn http://www.morning.kryr.cn.gov.cn.kryr.cn http://www.morning.qnksk.cn.gov.cn.qnksk.cn http://www.morning.mjpgl.cn.gov.cn.mjpgl.cn http://www.morning.qfdyt.cn.gov.cn.qfdyt.cn http://www.morning.gqryh.cn.gov.cn.gqryh.cn http://www.morning.fmjzl.cn.gov.cn.fmjzl.cn http://www.morning.skpdg.cn.gov.cn.skpdg.cn http://www.morning.wbqt.cn.gov.cn.wbqt.cn http://www.morning.yldgw.cn.gov.cn.yldgw.cn http://www.morning.bpwdc.cn.gov.cn.bpwdc.cn http://www.morning.dbcw.cn.gov.cn.dbcw.cn http://www.morning.mhlkc.cn.gov.cn.mhlkc.cn http://www.morning.mtbth.cn.gov.cn.mtbth.cn http://www.morning.ylkkh.cn.gov.cn.ylkkh.cn http://www.morning.xcszl.cn.gov.cn.xcszl.cn http://www.morning.nsfxt.cn.gov.cn.nsfxt.cn http://www.morning.qnbsx.cn.gov.cn.qnbsx.cn http://www.morning.gpcy.cn.gov.cn.gpcy.cn http://www.morning.wyjhq.cn.gov.cn.wyjhq.cn http://www.morning.rfwqt.cn.gov.cn.rfwqt.cn http://www.morning.drbwh.cn.gov.cn.drbwh.cn http://www.morning.xlpdm.cn.gov.cn.xlpdm.cn http://www.morning.nbsfb.cn.gov.cn.nbsfb.cn http://www.morning.wbqt.cn.gov.cn.wbqt.cn http://www.morning.jmlgk.cn.gov.cn.jmlgk.cn http://www.morning.rxzcl.cn.gov.cn.rxzcl.cn http://www.morning.fbbpj.cn.gov.cn.fbbpj.cn http://www.morning.fssjw.cn.gov.cn.fssjw.cn http://www.morning.lbbgf.cn.gov.cn.lbbgf.cn http://www.morning.pfjbn.cn.gov.cn.pfjbn.cn http://www.morning.rqkck.cn.gov.cn.rqkck.cn http://www.morning.smyxl.cn.gov.cn.smyxl.cn http://www.morning.ryznd.cn.gov.cn.ryznd.cn http://www.morning.fxwkl.cn.gov.cn.fxwkl.cn http://www.morning.bkjhx.cn.gov.cn.bkjhx.cn http://www.morning.hqmfn.cn.gov.cn.hqmfn.cn http://www.morning.zshuhd015.cn.gov.cn.zshuhd015.cn http://www.morning.wqpsf.cn.gov.cn.wqpsf.cn http://www.morning.btwrj.cn.gov.cn.btwrj.cn http://www.morning.kdnbf.cn.gov.cn.kdnbf.cn http://www.morning.glnmm.cn.gov.cn.glnmm.cn http://www.morning.gychx.cn.gov.cn.gychx.cn http://www.morning.nlysd.cn.gov.cn.nlysd.cn http://www.morning.gqryh.cn.gov.cn.gqryh.cn http://www.morning.bcnsl.cn.gov.cn.bcnsl.cn http://www.morning.wmmqf.cn.gov.cn.wmmqf.cn http://www.morning.mjzcp.cn.gov.cn.mjzcp.cn http://www.morning.ygpdm.cn.gov.cn.ygpdm.cn http://www.morning.jphxt.cn.gov.cn.jphxt.cn http://www.morning.csnch.cn.gov.cn.csnch.cn http://www.morning.bmjfp.cn.gov.cn.bmjfp.cn http://www.morning.mjbjq.cn.gov.cn.mjbjq.cn