公司网站推广计划书,设计网页的快捷网站,河南省建设厅网站无事故证明,广州商城建站1.概述
讯飞星火大模型是科大讯飞最近开放的拥有跨领域的知识和语言理解能力的大模型#xff0c;能够完成问答对话和文学创作等。由于讯飞星火大模型最近可以免费试用#xff0c;开发者都可以免费申请一个QPS不超过2的账号#xff0c;用来实现对平台能力的验证。本文将利用…1.概述
讯飞星火大模型是科大讯飞最近开放的拥有跨领域的知识和语言理解能力的大模型能够完成问答对话和文学创作等。由于讯飞星火大模型最近可以免费试用开发者都可以免费申请一个QPS不超过2的账号用来实现对平台能力的验证。本文将利用Springboot框架对星火大模型进行整合使其能够提供简单的问答能力。
2.Springboot整合大模型
2.1 申请开发者账号
讯飞星火认知大模型需要在讯飞星火官网进行申请如下图所示点击免费试用按钮填写相关信息即可。 申请成功后可以在控制台查看对应的账号信息如下图所示APPID、APPKey、APPSecret都是唯一的不要轻易泄漏。 至此账号申请工作完成。由于本文主要展示的是利用JAVA语言来实现对大模型的调用因此可以在API文档中下载JAVA带上下文的调用示例如下图所示通过该文档中的代码可以快速进行一个简单的小测试。
2.2 接口文档参数分析
在讯飞星火认知大模型的对接文档中由于结果是流式返回的不是一次性返回因此案例中代码通过WebSocket长连接方式与服务器建立连接并发送请求实时接收返回结果。接口请求参数具体如下
{header: {app_id: 12345,uid: 12345},parameter: {chat: {domain: general,temperature: 0.5,max_tokens: 1024, }},payload: {message: {# 如果想获取结合上下文的回答需要开发者每次将历史问答信息一起传给服务端如下示例# 注意text里面的所有content内容加一起的tokens需要控制在8192以内开发者如有较长对话需求需要适当裁剪历史信息text: [{role: user, content: 你是谁} # 用户的历史问题{role: assistant, content: .....} # AI的历史回答结果# ....... 省略的历史对话{role: user, content: 你会做什么} # 最新的一条问题如无需上下文可只传最新一条问题]}}
}上述请求中对应的参数解释如下 在这里需要注意的是app_id就是我们申请的APPIDuid可以区分不同用户。如果想要大模型能够根据结合上下文去进行问题解答就要把历史问题和历史回答结果全部传回服务端。 针对上述请求大模型的接口响应结果如下
# 接口为流式返回此示例为最后一次返回结果开发者需要将接口多次返回的结果进行拼接展示
{header:{code:0,message:Success,sid:cht000cb087dx18793cd421fb894542,status:2},payload:{choices:{status:2,seq:0,text:[{content:我可以帮助你的吗,role:assistant,index:0}]},usage:{text:{question_tokens:4,prompt_tokens:5,completion_tokens:9,total_tokens:14}}}
}返回字段的解释如下 需要注意的是由于请求结果流式返回因此需要根据header中的状态值status来进行判断0代表首次返回结果1代表中间结果2代表最后一个结果一次请求过程中可能会出现多个status为1的结果。
2.3 设计思路
本文设计思路如下图所示 客户端通过webSocket的方式与整合大模型的Springboot进行连接建立整合大模型的Springboot在接收到客户端请求时会去创建与讯飞大模型服务端的webSocket长连接每次请求会创建一个长连接当获取到所有请求内容后会断开长连接。由于本文使用的账号为开发者账号非付费模式因此并发能力有限本文采用加锁方式来控制请求访问。 Springboot服务与客户端的交互逻辑如下图所示 Springboot服务与讯飞认知大模型的交互逻辑如下图所示
2.3 项目结构 2.4 核心代码
2.4.1 pom依赖 propertiesnetty.verson4.1.45.Final/netty.verson/propertiesdependenciesdependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependencydependencygroupIdcom.google.code.gson/groupIdartifactIdgson/artifactIdversion2.8.2/version/dependencydependencygroupIdcom.squareup.okhttp3/groupIdartifactIdokhttp/artifactIdversion4.9.0/version/dependencydependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactId/dependencydependencygroupIdio.netty/groupIdartifactIdnetty-all/artifactIdversion${netty.verson}/version/dependency/dependencies2.4.2 application.properties配置文件
server.port9903
xf.config.hostUrlhttps://spark-api.xf-yun.com/v2.1/chat
xf.config.appIdefc8c037
xf.config.apiSecretNDdkNWFiZjdlODM0YzEzNzhkZWRjYTU1
xf.config.apiKey2733d38dd4717855c7de2f2450c028c2
#最大响应时间单位秒
xf.config.maxResponseTime302.4.3 config配置文件
Data
Component
ConfigurationProperties(xf.config)
public class XFConfig {private String appId;private String apiSecret;private String apiKey;private String hostUrl;private Integer maxResponseTime;}2.4.4 listener文件
XFWebClient类主要用于发送请求至大模型服务端内部有鉴权方法。
/*** Author: ChengLiang* CreateTime: 2023-10-19 11:04* Description: TODO* Version: 1.0*/
Slf4j
Component
public class XFWebClient {Autowiredprivate XFConfig xfConfig;/*** description: 发送请求至大模型方法* author: ChengLiang* date: 2023/10/19 16:27* param: [用户id, 请求内容, 返回结果监听器listener]* return: okhttp3.WebSocket**/public WebSocket sendMsg(String uid, ListRoleContent questions, WebSocketListener listener) {// 获取鉴权urlString authUrl null;try {authUrl getAuthUrl(xfConfig.getHostUrl(), xfConfig.getApiKey(), xfConfig.getApiSecret());} catch (Exception e) {log.error(鉴权失败{}, e);return null;}// 鉴权方法生成失败直接返回 nullOkHttpClient okHttpClient new OkHttpClient.Builder().build();// 将 https/http 连接替换为 ws/wss 连接String url authUrl.replace(http://, ws://).replace(https://, wss://);Request request new Request.Builder().url(url).build();// 建立 wss 连接WebSocket webSocket okHttpClient.newWebSocket(request, listener);// 组装请求参数JSONObject requestDTO createRequestParams(uid, questions);// 发送请求webSocket.send(JSONObject.toJSONString(requestDTO));return webSocket;}/*** description: 鉴权方法* author: ChengLiang* date: 2023/10/19 16:25* param: [讯飞大模型请求地址, apiKey, apiSecret]* return: java.lang.String**/public static String getAuthUrl(String hostUrl, String apiKey, String apiSecret) throws Exception {URL url new URL(hostUrl);// 时间SimpleDateFormat format new SimpleDateFormat(EEE, dd MMM yyyy HH:mm:ss z, Locale.US);format.setTimeZone(TimeZone.getTimeZone(GMT));String date format.format(new Date());// 拼接String preStr host: url.getHost() \n date: date \n GET url.getPath() HTTP/1.1;// SHA256加密Mac mac Mac.getInstance(hmacsha256);SecretKeySpec spec new SecretKeySpec(apiSecret.getBytes(StandardCharsets.UTF_8), hmacsha256);mac.init(spec);byte[] hexDigits mac.doFinal(preStr.getBytes(StandardCharsets.UTF_8));// Base64加密String sha Base64.getEncoder().encodeToString(hexDigits);// 拼接String authorization String.format(api_key\%s\, algorithm\%s\, headers\%s\, signature\%s\, apiKey, hmac-sha256, host date request-line, sha);// 拼接地址HttpUrl httpUrl Objects.requireNonNull(HttpUrl.parse(https:// url.getHost() url.getPath())).newBuilder().//addQueryParameter(authorization, Base64.getEncoder().encodeToString(authorization.getBytes(StandardCharsets.UTF_8))).//addQueryParameter(date, date).//addQueryParameter(host, url.getHost()).//build();return httpUrl.toString();}/*** description: 请求参数组装方法* author: ChengLiang* date: 2023/10/19 16:26* param: [用户id, 请求内容]* return: com.alibaba.fastjson.JSONObject**/public JSONObject createRequestParams(String uid, ListRoleContent questions) {JSONObject requestJson new JSONObject();// header参数JSONObject header new JSONObject();header.put(app_id, xfConfig.getAppId());header.put(uid, uid);// parameter参数JSONObject parameter new JSONObject();JSONObject chat new JSONObject();chat.put(domain, generalv2);chat.put(temperature, 0.5);chat.put(max_tokens, 4096);parameter.put(chat, chat);// payload参数JSONObject payload new JSONObject();JSONObject message new JSONObject();JSONArray jsonArray new JSONArray();jsonArray.addAll(questions);message.put(text, jsonArray);payload.put(message, message);requestJson.put(header, header);requestJson.put(parameter, parameter);requestJson.put(payload, payload);return requestJson;}
}XFWebSocketListener 类主要功能是与星火认知大模型建立webSocket连接核心代码如下
/*** Author: ChengLiang* CreateTime: 2023-10-18 10:17* Description: TODO* Version: 1.0*/
Slf4j
public class XFWebSocketListener extends WebSocketListener {//断开websocket标志位private boolean wsCloseFlag false;//语句组装buffer将大模型返回结果全部接收在组装成一句话返回private StringBuilder answer new StringBuilder();public String getAnswer() {return answer.toString();}public boolean isWsCloseFlag() {return wsCloseFlag;}Overridepublic void onOpen(WebSocket webSocket, Response response) {super.onOpen(webSocket, response);log.info(大模型服务器连接成功);}Overridepublic void onMessage(WebSocket webSocket, String text) {super.onMessage(webSocket, text);JsonParse myJsonParse JSON.parseObject(text, JsonParse.class);log.info(myJsonParse:{}, JSON.toJSONString(myJsonParse));if (myJsonParse.getHeader().getCode() ! 0) {log.error(发生错误错误信息为:{}, JSON.toJSONString(myJsonParse.getHeader()));this.answer.append(大模型响应异常请联系管理员);// 关闭连接标识wsCloseFlag true;return;}ListText textList myJsonParse.getPayload().getChoices().getText();for (Text temp : textList) {log.info(返回结果信息为【{}】, JSON.toJSONString(temp));this.answer.append(temp.getContent());}log.info(result:{}, this.answer.toString());if (myJsonParse.getHeader().getStatus() 2) {wsCloseFlag true;//todo 将问答信息入库进行记录可自行实现}}Overridepublic void onFailure(WebSocket webSocket, Throwable t, Response response) {super.onFailure(webSocket, t, response);try {if (null ! response) {int code response.code();log.error(onFailure body:{}, response.body().string());if (101 ! code) {log.error(讯飞星火大模型连接异常);}}} catch (IOException e) {log.error(IO异常{}, e);}}
}2.4.5 netty文件
NettyServer主要是用来监听指定端口接收客户端的webSocket请求。
Slf4j
Component
public class NettyServer {/*** webSocket协议名*/private static final String WEBSOCKET_PROTOCOL WebSocket;/*** 端口号*/Value(${webSocket.netty.port:62632})private int port;/*** webSocket路径*/Value(${webSocket.netty.path:/webSocket})private String webSocketPath;Autowiredprivate WebSocketHandler webSocketHandler;private EventLoopGroup bossGroup;private EventLoopGroup workGroup;/*** 启动** throws InterruptedException*/private void start() throws InterruptedException {bossGroup new NioEventLoopGroup();workGroup new NioEventLoopGroup();ServerBootstrap bootstrap new ServerBootstrap();// bossGroup辅助客户端的tcp连接请求, workGroup负责与客户端之前的读写操作bootstrap.group(bossGroup, workGroup);// 设置NIO类型的channelbootstrap.channel(NioServerSocketChannel.class);// 设置监听端口bootstrap.localAddress(new InetSocketAddress(port));// 连接到达时会创建一个通道bootstrap.childHandler(new ChannelInitializerSocketChannel() {Overrideprotected void initChannel(SocketChannel ch) throws Exception {// 流水线管理通道中的处理程序Handler用来处理业务// webSocket协议本身是基于http协议的所以这边也要使用http编解码器ch.pipeline().addLast(new HttpServerCodec());ch.pipeline().addLast(new ObjectEncoder());// 以块的方式来写的处理器ch.pipeline().addLast(new ChunkedWriteHandler());/*说明1、http数据在传输过程中是分段的HttpObjectAggregator可以将多个段聚合2、这就是为什么当浏览器发送大量数据时就会发送多次http请求*/ch.pipeline().addLast(new HttpObjectAggregator(8192));/*说明1、对应webSocket它的数据是以帧frame的形式传递2、浏览器请求时 ws://localhost:58080/xxx 表示请求的uri3、核心功能是将http协议升级为ws协议保持长连接*/ch.pipeline().addLast(new WebSocketServerProtocolHandler(webSocketPath, WEBSOCKET_PROTOCOL, true, 65536 * 10));// 自定义的handler处理业务逻辑ch.pipeline().addLast(webSocketHandler);}});// 配置完成开始绑定server通过调用sync同步方法阻塞直到绑定成功ChannelFuture channelFuture bootstrap.bind().sync();log.info(Server started and listen on:{}, channelFuture.channel().localAddress());// 对关闭通道进行监听channelFuture.channel().closeFuture().sync();}/*** 释放资源** throws InterruptedException*/PreDestroypublic void destroy() throws InterruptedException {if (bossGroup ! null) {bossGroup.shutdownGracefully().sync();}if (workGroup ! null) {workGroup.shutdownGracefully().sync();}}PostConstruct()public void init() {//需要开启一个新的线程来执行netty server 服务器new Thread(() - {try {start();log.info(消息推送线程开启);} catch (InterruptedException e) {e.printStackTrace();}}).start();}}WebSocketHandler主要用于接收客户端发送的消息并返回消息。
/*** Author: ChengLiang* CreateTime: 2023-10-17 15:14* Description: TODO* Version: 1.0*/
Slf4j
Component
ChannelHandler.Sharable
public class WebSocketHandler extends SimpleChannelInboundHandlerTextWebSocketFrame {Autowiredprivate PushService pushService;Overridepublic void handlerAdded(ChannelHandlerContext ctx) throws Exception {log.info(handlerAdded被调用,{}, JSON.toJSONString(ctx));//todo 添加校验功能校验合法后添加到group中// 添加到channelGroup 通道组NettyGroup.getChannelGroup().add(ctx.channel());}Overrideprotected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {log.info(服务器收到消息{}, msg.text());// 获取用户ID,关联channelJSONObject jsonObject JSON.parseObject(msg.text());String channelId jsonObject.getString(uid);// 将用户ID作为自定义属性加入到channel中方便随时channel中获取用户IDAttributeKeyString key AttributeKey.valueOf(userId);//String channelId CharUtil.generateStr(uid);NettyGroup.getUserChannelMap().put(channelId, ctx.channel());boolean containsKey NettyGroup.getUserChannelMap().containsKey(channelId);//通道已存在请求信息返回if (containsKey) {//接收消息格式{uid:123456,text:中华人民共和国成立时间}String text jsonObject.getString(text);//请求大模型服务器获取结果ResultBean resultBean pushService.pushMessageToXFServer(channelId, text);String data (String) resultBean.getData();//推送pushService.pushToOne(channelId, JSON.toJSONString(data));} else {ctx.channel().attr(key).setIfAbsent(channelId);log.info(连接通道id:{}, channelId);// 回复消息ctx.channel().writeAndFlush(new TextWebSocketFrame(JSON.toJSONString(ResultBean.success(channelId))));}}Overridepublic void handlerRemoved(ChannelHandlerContext ctx) throws Exception {log.info(handlerRemoved被调用,{}, JSON.toJSONString(ctx));// 删除通道NettyGroup.getChannelGroup().remove(ctx.channel());removeUserId(ctx);}Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {log.info(通道异常{}, cause.getMessage());// 删除通道NettyGroup.getChannelGroup().remove(ctx.channel());removeUserId(ctx);ctx.close();}private void removeUserId(ChannelHandlerContext ctx) {AttributeKeyString key AttributeKey.valueOf(userId);String userId ctx.channel().attr(key).get();NettyGroup.getUserChannelMap().remove(userId);}
}2.4.6 service文件
PushServiceImpl 主要用于发送请求至讯飞大模型后台获取返回结果以及根据指定通道发送信息至用户。
/*** Author: ChengLiang* CreateTime: 2023-10-17 15:58* Description: TODO* Version: 1.0*/
Slf4j
Service
public class PushServiceImpl implements PushService {Autowiredprivate XFConfig xfConfig;Autowiredprivate XFWebClient xfWebClient;Overridepublic void pushToOne(String uid, String text) {if (StringUtils.isEmpty(uid) || StringUtils.isEmpty(text)) {log.error(uid或text均不能为空);throw new RuntimeException(uid或text均不能为空);}ConcurrentHashMapString, Channel userChannelMap NettyGroup.getUserChannelMap();for (String channelId : userChannelMap.keySet()) {if (channelId.equals(uid)) {Channel channel userChannelMap.get(channelId);if (channel ! null) {ResultBean success ResultBean.success(text);channel.writeAndFlush(new TextWebSocketFrame(JSON.toJSONString(success)));log.info(信息发送成功{}, JSON.toJSONString(success));} else {log.error(该id对于channelId不存在);}return;}}log.error(该用户不存在);}Overridepublic void pushToAll(String text) {String trim text.trim();ResultBean success ResultBean.success(trim);NettyGroup.getChannelGroup().writeAndFlush(new TextWebSocketFrame(JSON.toJSONString(success)));log.info(信息推送成功{}, JSON.toJSONString(success));}//测试账号只有2个并发此处只使用一个若是生产环境允许多个并发可以采用分布式锁Overridepublic synchronized ResultBean pushMessageToXFServer(String uid, String text) {RoleContent userRoleContent RoleContent.createUserRoleContent(text);ArrayListRoleContent questions new ArrayList();questions.add(userRoleContent);XFWebSocketListener xfWebSocketListener new XFWebSocketListener();WebSocket webSocket xfWebClient.sendMsg(uid, questions, xfWebSocketListener);if (webSocket null) {log.error(webSocket连接异常);ResultBean.fail(请求异常请联系管理员);}try {int count 0;//参考代码中休眠200ms若配置了maxResponseTime若指定时间内未返回则返回请求失败至前端int maxCount xfConfig.getMaxResponseTime() * 5;while (count maxCount) {Thread.sleep(200);if (xfWebSocketListener.isWsCloseFlag()) {break;}count;}if (count maxCount) {return ResultBean.fail(响应超时请联系相关人员);}return ResultBean.success(xfWebSocketListener.getAnswer());} catch (Exception e) {log.error(请求异常{}, e);} finally {webSocket.close(1000, );}return ResultBean.success();}
}所有代码可参考附录进行获取。
2.5 测试结果 3.小结 1.本文代码主要用于测试若考虑并发及性能需要在上述代码上进行优化 2.讯飞星火认知大模型对于日常简单问题的问答效率较高对诗词表达欠佳 3.在本文代码中部分代码仍可以优化后续可以将此模块单独抽象成一个springboot-starter引入即可使用。 4.参考文献 1.https://www.xfyun.cn/doc/spark/Web.html 2.https://console.xfyun.cn/services/bm2 5.附录 https://gitee.com/Marinc/nacos/tree/master/xunfei-bigModel
文章转载自: http://www.morning.yzfrh.cn.gov.cn.yzfrh.cn http://www.morning.mnsmb.cn.gov.cn.mnsmb.cn http://www.morning.yhyqg.cn.gov.cn.yhyqg.cn http://www.morning.lngyd.cn.gov.cn.lngyd.cn http://www.morning.kjawz.cn.gov.cn.kjawz.cn http://www.morning.gjmll.cn.gov.cn.gjmll.cn http://www.morning.gkmwk.cn.gov.cn.gkmwk.cn http://www.morning.ttkns.cn.gov.cn.ttkns.cn http://www.morning.qhqgk.cn.gov.cn.qhqgk.cn http://www.morning.jbblf.cn.gov.cn.jbblf.cn http://www.morning.zwfgh.cn.gov.cn.zwfgh.cn http://www.morning.xhhqd.cn.gov.cn.xhhqd.cn http://www.morning.youngbase.cn.gov.cn.youngbase.cn http://www.morning.rmrcc.cn.gov.cn.rmrcc.cn http://www.morning.beijingzy.com.cn.gov.cn.beijingzy.com.cn http://www.morning.xnpj.cn.gov.cn.xnpj.cn http://www.morning.bygyd.cn.gov.cn.bygyd.cn http://www.morning.mfnjk.cn.gov.cn.mfnjk.cn http://www.morning.ltkzb.cn.gov.cn.ltkzb.cn http://www.morning.xmtzk.cn.gov.cn.xmtzk.cn http://www.morning.syhwc.cn.gov.cn.syhwc.cn http://www.morning.cpgdy.cn.gov.cn.cpgdy.cn http://www.morning.lssfd.cn.gov.cn.lssfd.cn http://www.morning.bwmq.cn.gov.cn.bwmq.cn http://www.morning.jsdntd.com.gov.cn.jsdntd.com http://www.morning.rzrbw.cn.gov.cn.rzrbw.cn http://www.morning.ggqcg.cn.gov.cn.ggqcg.cn http://www.morning.mtqqx.cn.gov.cn.mtqqx.cn http://www.morning.kybjr.cn.gov.cn.kybjr.cn http://www.morning.pwmpn.cn.gov.cn.pwmpn.cn http://www.morning.hlwzd.cn.gov.cn.hlwzd.cn http://www.morning.xxwhz.cn.gov.cn.xxwhz.cn http://www.morning.rwfp.cn.gov.cn.rwfp.cn http://www.morning.zmpqh.cn.gov.cn.zmpqh.cn http://www.morning.jwbfj.cn.gov.cn.jwbfj.cn http://www.morning.kmlmf.cn.gov.cn.kmlmf.cn http://www.morning.sjqml.cn.gov.cn.sjqml.cn http://www.morning.ljdhj.cn.gov.cn.ljdhj.cn http://www.morning.stfdh.cn.gov.cn.stfdh.cn http://www.morning.jhqcr.cn.gov.cn.jhqcr.cn http://www.morning.qpntn.cn.gov.cn.qpntn.cn http://www.morning.nbfkk.cn.gov.cn.nbfkk.cn http://www.morning.nktgj.cn.gov.cn.nktgj.cn http://www.morning.hydkd.cn.gov.cn.hydkd.cn http://www.morning.mtsck.cn.gov.cn.mtsck.cn http://www.morning.hlfgm.cn.gov.cn.hlfgm.cn http://www.morning.tymnr.cn.gov.cn.tymnr.cn http://www.morning.cbvlus.cn.gov.cn.cbvlus.cn http://www.morning.rcjyc.cn.gov.cn.rcjyc.cn http://www.morning.jrgxx.cn.gov.cn.jrgxx.cn http://www.morning.ysllp.cn.gov.cn.ysllp.cn http://www.morning.ztcwp.cn.gov.cn.ztcwp.cn http://www.morning.rcyrm.cn.gov.cn.rcyrm.cn http://www.morning.ctsjq.cn.gov.cn.ctsjq.cn http://www.morning.wqjpl.cn.gov.cn.wqjpl.cn http://www.morning.gdpai.com.cn.gov.cn.gdpai.com.cn http://www.morning.rfrx.cn.gov.cn.rfrx.cn http://www.morning.ynlpy.cn.gov.cn.ynlpy.cn http://www.morning.yntsr.cn.gov.cn.yntsr.cn http://www.morning.xgcwm.cn.gov.cn.xgcwm.cn http://www.morning.yrddl.cn.gov.cn.yrddl.cn http://www.morning.dsgdt.cn.gov.cn.dsgdt.cn http://www.morning.sqnrz.cn.gov.cn.sqnrz.cn http://www.morning.blqsr.cn.gov.cn.blqsr.cn http://www.morning.fstdf.cn.gov.cn.fstdf.cn http://www.morning.wnjwb.cn.gov.cn.wnjwb.cn http://www.morning.hfytgp.cn.gov.cn.hfytgp.cn http://www.morning.hgkbj.cn.gov.cn.hgkbj.cn http://www.morning.qshxh.cn.gov.cn.qshxh.cn http://www.morning.frtb.cn.gov.cn.frtb.cn http://www.morning.rkfxc.cn.gov.cn.rkfxc.cn http://www.morning.djwpd.cn.gov.cn.djwpd.cn http://www.morning.gmgyt.cn.gov.cn.gmgyt.cn http://www.morning.mwjwy.cn.gov.cn.mwjwy.cn http://www.morning.ksqzd.cn.gov.cn.ksqzd.cn http://www.morning.hdpcn.cn.gov.cn.hdpcn.cn http://www.morning.wnjsp.cn.gov.cn.wnjsp.cn http://www.morning.ryxbz.cn.gov.cn.ryxbz.cn http://www.morning.qgjp.cn.gov.cn.qgjp.cn http://www.morning.gsksm.cn.gov.cn.gsksm.cn