当前位置: 首页 > news >正文

芜湖网站建设芜湖在线app制作

芜湖网站建设芜湖,在线app制作,成都php网站建设,网站开发和室内制作Springboot之事件监听器 事件监听的几种方式1 方式一#xff1a;实现接口1.1 创建事件1.2 创建事件监听器1.3 发布事件 2 方式二#xff1a;注解方式2.1 创建事件2.1.1 创建发送邮件事件2.1.2 创建发送短信事件 2.2 创建事件监听器2.3 发布事件2.4 事件异步处理#xff08;方… Springboot之事件监听器 事件监听的几种方式1 方式一实现接口1.1 创建事件1.2 创建事件监听器1.3 发布事件 2 方式二注解方式2.1 创建事件2.1.1 创建发送邮件事件2.1.2 创建发送短信事件 2.2 创建事件监听器2.3 发布事件2.4 事件异步处理方式二有效2.4.1 配置线程池2.4.2 设置事件执行的线程池 3 项目使用案例3.1 创建事件父类3.2 创建监听器接口3.3 创建事件监听器管理类3.4 创建事件监听器的简单实现3.5 创建用户注册事件3.6 创建用户注册服务3.7 创建事件监听配置类3.8 创建发送邮件服务3.9 创建发送短信服务3.10 调用用户注册服务3.11 调用赠送优惠券服务扩展 4 事件异步处理4.1 启动类开启异步4.2 创建线程池4.3 事件方法开启异步4.4 修改事件类型的获取方式 5 拓展5.1 控制发送邮件、短信、优惠券服务的执行顺序 事件监听的几种方式 1 方式一实现接口 场景用户注册成功后给用户赠送100元优惠券 1.1 创建事件 实现ApplicationEvent接口 package com.per.listener.e1;import com.per.domain.UserDto; import org.springframework.context.ApplicationEvent;/*** Title DemoEvent1* ProjectName spring-boot-demo* Description TODO* Author Lee* Date 2024-01-17*/ public class UserEvent extends ApplicationEvent {/*** 事件源*/private UserDto userDto;public UserEvent(UserDto userDto) {super(userDto);this.userDto userDto;}/*** 获取事件中的用户信息** return*/public UserDto getUserDto() {return userDto;} }1.2 创建事件监听器 实现ApplicationListener接口重写onApplicationEvent方法 package com.per.listener.e1;import com.per.domain.UserDto; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component;/*** Title UserListener* ProjectName spring-boot-demo* Description TODO* Author Lee* Date 2024-01-17*/ Slf4j Component public class UserListener implements ApplicationListenerUserEvent {Overridepublic void onApplicationEvent(UserEvent event) {log.info(UserListener#onApplicationEvent 事件监听 开始执行...);UserDto userDto event.getUserDto();// 给用户发优惠券log.info(给用户{}发送100元优惠卷, userDto.getName());} } 1.3 发布事件 引入ApplicationContext调用publishEvent方法发布事件 package com.per.service.impl;import com.per.domain.UserDto; import com.per.listener.e1.UserEvent; import com.per.service.UserService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service;/*** Title UserServiceImpl* ProjectName spring-boot-demo* Description TODO* Author Lee* Date 2024-01-17*/ Service Slf4j public class UserServiceImpl implements UserService {Autowiredprivate ApplicationContext applicationContext;Overridepublic String userRegister(UserDto userDto) {log.info(用户{}注册成功注册信息: {}, userDto.getName(), userDto.toString());// 发送优惠券UserEvent userEvent new UserEvent(userDto);applicationContext.publishEvent(userEvent);return String.format(用户%s注册成功并赠送了100元优惠券, userDto.getName());} } 2 方式二注解方式 场景用户注册成功后给用户发送邮件、短信通知 2.1 创建事件 继承ApplicationEvent重写事件构造方法 2.1.1 创建发送邮件事件 package com.per.listener.e2;import org.springframework.context.ApplicationEvent;/*** Title SendMailEvent 发送邮件事件* ProjectName spring-boot-demo* Description TODO* Author Lee* Date 2024-01-17*/ public class SendMailEvent extends ApplicationEvent {public SendMailEvent(Object source) {super(source);}}2.1.2 创建发送短信事件 package com.per.listener.e2;import org.springframework.context.ApplicationEvent;/*** Title SendShortMsg 发送短信事件* ProjectName spring-boot-demo* Description TODO* Author Lee* Date 2024-01-17*/ public class SendMsgEvent extends ApplicationEvent {public SendMsgEvent(Object source) {super(source);} }2.2 创建事件监听器 定义事件执行的方法使用注解EventListener标注方法,使用classes属性指定方法对应的事件 package com.per.listener.e2;import com.per.domain.UserDto; import lombok.extern.slf4j.Slf4j; import org.springframework.context.event.EventListener; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component;/*** Title UserE2Listener* ProjectName spring-boot-demo* Description TODO* Author Lee* Date 2024-01-17*/ Component Slf4j public class UserE2Listener {/*** 发送邮件* param sendMailEvent 发送邮件事件*/EventListener(classes SendMailEvent.class)Order(1)public void sendMail(SendMailEvent sendMailEvent){UserDto userDto (UserDto) sendMailEvent.getSource();log.info(发送邮件给用户{} ...【邮件】恭喜你注册成功, userDto.getName());}/*** 发送短信* param sendMsgEvent 发送短信事件*/EventListener(classes SendMsgEvent.class)Order(2)public void sendMsg(SendMsgEvent sendMsgEvent){UserDto userDto (UserDto) sendMsgEvent.getSource();log.info(发送短信给用户{} ...【短信】恭喜你注册成功, userDto.getName());}}2.3 发布事件 引入ApplicationEventPublisher调用publishEvent方法发布事件 package com.per.service.impl;import com.per.domain.UserDto; import com.per.listener.e2.SendMailEvent; import com.per.listener.e2.SendMsgEvent; import com.per.service.UserService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service;/*** Title UserServiceImpl* ProjectName spring-boot-demo* Description TODO* Author Lee* Date 2024-01-17*/ Service Slf4j public class UserServiceImpl implements UserService {Autowiredprivate ApplicationEventPublisher publisher;Overridepublic String userRegister1(UserDto userDto) {log.info(用户{}注册成功注册信息: {}, userDto.getName(), userDto.toString());// 发送邮件SendMailEvent sendMailEvent new SendMailEvent(userDto);publisher.publishEvent(sendMailEvent);// 发送短息SendMsgEvent sendMsgEvent new SendMsgEvent(userDto);publisher.publishEvent(sendMsgEvent);return String.format(用户%s注册成功并发送邮件和短信通知, userDto.getName());}}2.4 事件异步处理方式二有效 2.4.1 配置线程池 package com.per.listener.e3.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor; import java.util.concurrent.ThreadPoolExecutor;/*** Title ThreadPoolConfig* Description TODO* Author Lee* Date 2024-01-20*/ Configuration public class ThreadPoolConfig {Bean(eventListenerThreadPool)public Executor taskExecutor() {ThreadPoolTaskExecutor taskExecutor new ThreadPoolTaskExecutor();taskExecutor.setCorePoolSize(5);taskExecutor.setMaxPoolSize(10);taskExecutor.setKeepAliveSeconds(60);taskExecutor.setQueueCapacity(50);taskExecutor.setThreadNamePrefix(myExecutor--);taskExecutor.setWaitForTasksToCompleteOnShutdown(true);taskExecutor.setAwaitTerminationSeconds(60);taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());taskExecutor.initialize();return taskExecutor;}} 2.4.2 设置事件执行的线程池 package com.per.listener.e3.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.event.ApplicationEventMulticaster; import org.springframework.context.event.SimpleApplicationEventMulticaster; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import javax.annotation.Resource;/*** Title EventListenerAsynConfig* Description TODO* Author Lee* Date 2024-01-20*/ Configurationpublic class EventListenerAsyncConfig {Resourceprivate ThreadPoolTaskExecutor eventListenerThreadPool;Beanpublic ApplicationEventMulticaster applicationEventMulticaster() {SimpleApplicationEventMulticaster eventMulticaster new SimpleApplicationEventMulticaster();eventMulticaster.setTaskExecutor(eventListenerThreadPool);return eventMulticaster;} } 3 项目使用案例 场景用户注册成功给用户发送邮件、短信通知 3.1 创建事件父类 package com.per.listener.e3.event;/*** Title AbstractEvent 所有事件父类* ProjectName spring-boot-demo* Description TODO* Author Lee* Date 2024-01-17*/ public abstract class AbstractEvent {/*** 事件源*/protected Object source;public AbstractEvent(Object source) {this.source source;}/*** 获取事件源** return*/public Object getSource() {return source;}/*** 设置事件源** param source*/public void setSource(Object source) {this.source source;} } 3.2 创建监听器接口 package com.per.listener.e3.listener;import com.per.listener.e3.event.AbstractEvent;/*** Title EventListener 事件监听器接口* ProjectName spring-boot-demo* Description TODO* Author Lee* Date 2024-01-17*/ public interface EventListenerE extends AbstractEvent {/*** 处理事件** param event 要处理的事件*/void onEvent(E event); } 3.3 创建事件监听器管理类 package com.per.listener.e3.listener;import com.per.listener.e3.event.AbstractEvent;/*** Title EventListenerManager 事件监听器管理类* ProjectName spring-boot-demo* Description 1.负责事件监听器的管理注册监听器移除监听器将事件和监听器关联起来* 2.负责事件的广播将事件广播给所有的监听器对该事件感兴趣的监听器会处理该事件* Author Lee* Date 2024-01-17*/ public interface EventListenerManager {/*** 广播事件给所有监听器** param event 事件*/void pushEvent(AbstractEvent event);/*** 添加一个事件监听器** param listener 事件监听器*/void addListener(EventListener? listener);/*** 删除一个事件监听器** param listener 事件监听器*/void removeListener(EventListener? listener); } 3.4 创建事件监听器的简单实现 package com.per.listener.e3.listener.impl;import com.per.listener.e3.event.AbstractEvent; import com.per.listener.e3.listener.EventListener; import com.per.listener.e3.listener.EventListenerManager;import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap;/*** Title SimpleEventListener 事件广播器的简单实现* Description TODO* Author Lee* Date 2024-01-17*/ public class SimpleEventListener implements EventListenerManager {private MapClass?, ListEventListener eventListenerMap new ConcurrentHashMap();Overridepublic void pushEvent(AbstractEvent event) {ListEventListener eventListeners this.eventListenerMap.get(event.getClass());if (eventListeners ! null) {for (EventListener eventListener : eventListeners) {// 执行事件eventListener.onEvent(event);}}}Overridepublic void addListener(EventListener? listener) {Class? eventType this.getEventType(listener);// 查询map中事件对应的监听器ListEventListener eventListeners this.eventListenerMap.get(eventType);if (eventListeners null) {// 事件对应的监听器集合为空,保存事件和监听器到map中key事件 value空的监听器集合eventListeners new ArrayList();this.eventListenerMap.put(eventType, eventListeners);}// 事件对应的监听器集合不为空添加监听器到事件对应的监听器集合中eventListeners.add(listener);}Overridepublic void removeListener(EventListener? listener) {Class? eventType this.getEventType(listener);// 查询map中事件对应的监听器ListEventListener eventListeners this.eventListenerMap.get(eventType);if (eventListeners ! null) {// 事件对应的监听器集合不为空,从事件对应的监听器集中删除当前监听eventListeners.remove(listener);}}protected Class? getEventType(EventListener eventListener) {// 获取直接实现eventListener接口的类或接口的Type// 异步Async时使用这种方式获取 // ParameterizedType parameterizedType (ParameterizedType)eventListener.getClass().getSuperclass().getGenericInterfaces()[0];// 同步时使用这种方式获取ParameterizedType parameterizedType (ParameterizedType) eventListener.getClass().getGenericInterfaces()[0];// 获取EventListener中泛型的实际类型Type eventType parameterizedType.getActualTypeArguments()[0];return (Class?) eventType;} } 3.5 创建用户注册事件 package com.per.listener.e3.event;import com.per.domain.UserDto;/*** Title RegisterSuccessEvent 用户注册成功事件* Description TODO* Author Lee* Date 2024-01-17*/ public class RegisterSuccessEvent extends AbstractEvent {/*** 用户信息*/private UserDto userDto;/*** 用户注册成功事件** param source 事件源* param userDto 用户信息*/public RegisterSuccessEvent(Object source, UserDto userDto) {super(source);this.userDto userDto;}public UserDto getUserDto() {return userDto;}public void setUserDto(UserDto userDto) {this.userDto userDto;} } 3.6 创建用户注册服务 package com.per.service.impl;import com.per.domain.UserDto; import com.per.listener.e3.event.RegisterSuccessEvent; import com.per.listener.e3.listener.EventListenerManager; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired;/*** Title UserRegisterService 用户注册成功服务* Description TODO* Author Lee* Date 2024-01-17*/ Slf4j public class UserRegisterService {/*** 事件发布者*/Autowiredprivate EventListenerManager eventListenerManager;/*** 用户注册** param userDto 用户信息*/public void registerUser(UserDto userDto) {log.info(用户{}注册成功, userDto.getName());// 执行其他监听事件this.eventListenerManager.pushEvent(new RegisterSuccessEvent(this, userDto));}public EventListenerManager getEventListenerManager() {return eventListenerManager;}public void setEventListenerManager(EventListenerManager eventListenerManager) {this.eventListenerManager eventListenerManager;} } 3.7 创建事件监听配置类 package com.per.listener.e3.config;import com.per.listener.e3.listener.EventListener; import com.per.listener.e3.listener.EventListenerManager; import com.per.listener.e3.listener.impl.SimpleEventListener; import com.per.service.impl.UserRegisterService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component;import java.util.List;/*** Title EventListenerConfig* Description TODO* Author Lee* Date 2024-01-17*/ Configuration Component public class EventListenerConfig {/*** 注册一个事件发布者** param eventListeners 事件* return*/BeanAutowired(required false) // 当eventListeners不存在时不抛出异常public EventListenerManager eventListenerManager(ListEventListener eventListeners) {EventListenerManager eventListenerManager new SimpleEventListener();if (eventListeners ! null) {eventListeners.forEach(eventListener - eventListenerManager.addListener(eventListener));}return eventListenerManager;}/*** 注册一个用户注册服务** param eventListenerManager* return*/Beanpublic UserRegisterService userRegisterService(EventListenerManager eventListenerManager) {UserRegisterService userRegisterService new UserRegisterService();userRegisterService.setEventListenerManager(eventListenerManager);return userRegisterService;} } 3.8 创建发送邮件服务 package com.per.service.impl;import com.per.listener.e3.event.RegisterSuccessEvent; import com.per.listener.e3.listener.EventListener; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component;/*** Title UserSendMailService 用户发送邮件服务* Description TODO* Author Lee* Date 2024-01-17*/ Component Slf4j public class UserSendMailService implements EventListenerRegisterSuccessEvent {Overridepublic void onEvent(RegisterSuccessEvent event) {log.info(给用户{}发送邮件内容恭喜你注册成功, event.getUserDto().getName());} } 3.9 创建发送短信服务 package com.per.service.impl;import com.per.listener.e3.event.RegisterSuccessEvent; import com.per.listener.e3.listener.EventListener; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component;/*** Title UserSendMsgService 用户发送短信服务* Description TODO* Author Lee* Date 2024-01-17*/ Component Slf4j public class UserSendMsgService implements EventListenerRegisterSuccessEvent {Overridepublic void onEvent(RegisterSuccessEvent event) {log.info(给用户{}发送短息短信内容恭喜你注册成功, event.getUserDto().getName());} } 3.10 调用用户注册服务 /*** 用户注册成功后发送邮件、发送短信** return*/RequestMapping(value register, method RequestMethod.GET)public String register() {UserDto userDto new UserDto(11, 李四, 男);userRegisterService.registerUser(userDto);return SUCCESS;}3.11 调用赠送优惠券服务扩展 新增场景增加一个赠送优惠券业务 package com.per.service.impl;import com.per.listener.e3.event.RegisterSuccessEvent; import com.per.listener.e3.listener.EventListener; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component;/*** Title SendUserCouponsService 发送优惠券服务* Description TODO* Author Lee* Date 2024-01-20*/ Component Slf4j Order(3) public class SendUserCouponsService implements EventListenerRegisterSuccessEvent {Overridepublic void onEvent(RegisterSuccessEvent event) {log.info(给用户{}发送100元优惠券, event.getUserDto().getName());} } 4 事件异步处理 注意下面的修改皆基于3 项目使用案例修改 4.1 启动类开启异步 package com.per;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableAsync;SpringBootApplication EnableAsync(proxyTargetClass true) public class SpringBootDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringBootDemoApplication.class, args);}} 4.2 创建线程池 参考 2.4.1 配置线程池 4.3 事件方法开启异步 Component Slf4j Order(1) public class UserSendMailService implements EventListenerRegisterSuccessEvent {Async(eventListenerThreadPool)Overridepublic void onEvent(RegisterSuccessEvent event) {log.info({}-给用户{}发送邮件内容恭喜你注册成功, Thread.currentThread().getName(), event.getUserDto().getName());} }Component Slf4j Order(2) public class UserSendMsgService implements EventListenerRegisterSuccessEvent {Async(eventListenerThreadPool)Overridepublic void onEvent(RegisterSuccessEvent event) {log.info({}--给用户{}发送短息短信内容恭喜你注册成功, Thread.currentThread().getName(), event.getUserDto().getName());} }Component Slf4j Order(3) public class SendUserCouponsService implements EventListenerRegisterSuccessEvent {Async(eventListenerThreadPool)Overridepublic void onEvent(RegisterSuccessEvent event) {log.info({}--给用户{}发送100元优惠券, Thread.currentThread().getName(), event.getUserDto().getName());} }4.4 修改事件类型的获取方式 参考 3.4 创建事件监听器的简单实现 5 拓展 5.1 控制发送邮件、短信、优惠券服务的执行顺序 可以通过Order控制服务的加载顺序实现
文章转载自:
http://www.morning.jtkfm.cn.gov.cn.jtkfm.cn
http://www.morning.fnpmf.cn.gov.cn.fnpmf.cn
http://www.morning.zkqjz.cn.gov.cn.zkqjz.cn
http://www.morning.hrnrx.cn.gov.cn.hrnrx.cn
http://www.morning.gnbfj.cn.gov.cn.gnbfj.cn
http://www.morning.rwmqp.cn.gov.cn.rwmqp.cn
http://www.morning.wqgr.cn.gov.cn.wqgr.cn
http://www.morning.dwrbn.cn.gov.cn.dwrbn.cn
http://www.morning.qfcnp.cn.gov.cn.qfcnp.cn
http://www.morning.bnfrj.cn.gov.cn.bnfrj.cn
http://www.morning.wrtsm.cn.gov.cn.wrtsm.cn
http://www.morning.wbllx.cn.gov.cn.wbllx.cn
http://www.morning.snnwx.cn.gov.cn.snnwx.cn
http://www.morning.wjndl.cn.gov.cn.wjndl.cn
http://www.morning.klcdt.cn.gov.cn.klcdt.cn
http://www.morning.jwbnm.cn.gov.cn.jwbnm.cn
http://www.morning.jjmrx.cn.gov.cn.jjmrx.cn
http://www.morning.ngpdk.cn.gov.cn.ngpdk.cn
http://www.morning.sqmlw.cn.gov.cn.sqmlw.cn
http://www.morning.jjzxn.cn.gov.cn.jjzxn.cn
http://www.morning.fhghy.cn.gov.cn.fhghy.cn
http://www.morning.knwry.cn.gov.cn.knwry.cn
http://www.morning.smrkf.cn.gov.cn.smrkf.cn
http://www.morning.hxxzp.cn.gov.cn.hxxzp.cn
http://www.morning.xyrw.cn.gov.cn.xyrw.cn
http://www.morning.mjbnp.cn.gov.cn.mjbnp.cn
http://www.morning.baguiwei.com.gov.cn.baguiwei.com
http://www.morning.qiyelm.com.gov.cn.qiyelm.com
http://www.morning.rnmdp.cn.gov.cn.rnmdp.cn
http://www.morning.wqmyh.cn.gov.cn.wqmyh.cn
http://www.morning.wnqfz.cn.gov.cn.wnqfz.cn
http://www.morning.qcnk.cn.gov.cn.qcnk.cn
http://www.morning.gyjld.cn.gov.cn.gyjld.cn
http://www.morning.lxbml.cn.gov.cn.lxbml.cn
http://www.morning.tnbas.com.gov.cn.tnbas.com
http://www.morning.kszkm.cn.gov.cn.kszkm.cn
http://www.morning.pylpd.cn.gov.cn.pylpd.cn
http://www.morning.trrd.cn.gov.cn.trrd.cn
http://www.morning.rjjjk.cn.gov.cn.rjjjk.cn
http://www.morning.dwkfx.cn.gov.cn.dwkfx.cn
http://www.morning.ymhjb.cn.gov.cn.ymhjb.cn
http://www.morning.zqcgt.cn.gov.cn.zqcgt.cn
http://www.morning.yppln.cn.gov.cn.yppln.cn
http://www.morning.bfhfb.cn.gov.cn.bfhfb.cn
http://www.morning.pnntx.cn.gov.cn.pnntx.cn
http://www.morning.drspc.cn.gov.cn.drspc.cn
http://www.morning.cnbdn.cn.gov.cn.cnbdn.cn
http://www.morning.deupp.com.gov.cn.deupp.com
http://www.morning.fhxrb.cn.gov.cn.fhxrb.cn
http://www.morning.jjwzk.cn.gov.cn.jjwzk.cn
http://www.morning.gynkr.cn.gov.cn.gynkr.cn
http://www.morning.tpbhf.cn.gov.cn.tpbhf.cn
http://www.morning.prddj.cn.gov.cn.prddj.cn
http://www.morning.fxkgp.cn.gov.cn.fxkgp.cn
http://www.morning.bmmhs.cn.gov.cn.bmmhs.cn
http://www.morning.ztcxx.com.gov.cn.ztcxx.com
http://www.morning.skdhm.cn.gov.cn.skdhm.cn
http://www.morning.zkdmk.cn.gov.cn.zkdmk.cn
http://www.morning.sjbty.cn.gov.cn.sjbty.cn
http://www.morning.jthjr.cn.gov.cn.jthjr.cn
http://www.morning.yjmns.cn.gov.cn.yjmns.cn
http://www.morning.ryrpq.cn.gov.cn.ryrpq.cn
http://www.morning.tfznk.cn.gov.cn.tfznk.cn
http://www.morning.gsdbg.cn.gov.cn.gsdbg.cn
http://www.morning.hbqhz.cn.gov.cn.hbqhz.cn
http://www.morning.mehrim.com.gov.cn.mehrim.com
http://www.morning.wdpbq.cn.gov.cn.wdpbq.cn
http://www.morning.ppllj.cn.gov.cn.ppllj.cn
http://www.morning.kzyr.cn.gov.cn.kzyr.cn
http://www.morning.xjbtb.cn.gov.cn.xjbtb.cn
http://www.morning.qsmch.cn.gov.cn.qsmch.cn
http://www.morning.kybjr.cn.gov.cn.kybjr.cn
http://www.morning.cbmqq.cn.gov.cn.cbmqq.cn
http://www.morning.mlmwl.cn.gov.cn.mlmwl.cn
http://www.morning.mspkz.cn.gov.cn.mspkz.cn
http://www.morning.znpyw.cn.gov.cn.znpyw.cn
http://www.morning.lwjlj.cn.gov.cn.lwjlj.cn
http://www.morning.djlxz.cn.gov.cn.djlxz.cn
http://www.morning.qxwrd.cn.gov.cn.qxwrd.cn
http://www.morning.nrzkg.cn.gov.cn.nrzkg.cn
http://www.tj-hxxt.cn/news/238277.html

相关文章:

  • 网站地图案例网站数据模板
  • 兴力网站建设可以做问卷挣钱的网站
  • 微信订阅号做网站乘风专业建站
  • 网站建设语seo查询价格
  • 松江 网站建设公司原型设计网站
  • 宁海哪里有做网站的软件项目管理工作内容
  • 网站建设人员分工表百度收录好最快的网站
  • 网站前后端的关系汕头网站设计公司
  • 建站工具指北网站建设 犀牛
  • 房地产行业网站开发展示用网站
  • 企业服务网站怎么免费增加网站流量吗
  • 企业网站建设目的意义南宁网站设计
  • 网站建设自评报告制作公司网站的作用
  • 长沙做网站哪家好wordpress删除主题介绍
  • 免费的行情软件网站入口佛山网站建设开发团队
  • 网站外链代发哪个软件是网页编辑软件
  • 专业网站建设的公司排名微信小程序源码提取工具
  • 管理学习网站北京WordPress爱好者
  • 昆明网站排名优化报价广州住房建设部网站
  • 这是我做的网站吗铁岭手机网站建设
  • 珠海网站建设公司电话网站建设域名费
  • 可以做查询功能的网站做网站搞笑口号
  • 建设小型网站价钱华为公司邮箱是多少
  • 微商城怎么开通视频seo云优化
  • vscode网站开发自然资源网站官网
  • 推广的网站做 理财网站有哪些内容
  • 课程网站建设的财务分析专建网站
  • 做h5游戏的网站百度提交链接多久会被收录
  • 网站诊断博客哈尔滨口碑好的建站公司
  • 建设网站 如何给文件命名湖州城市投资建设集团网站