国产午夜男女在线|欧美日本一道高清国产|亚洲日韩乱码中文字幕|麻豆国产97在线精品一区|日韩一区2区三区另类图片|亚洲精品国产99在线观看|亚洲国产午夜福利精品大秀在线|一级做a爰片性色毛片免费网站

您當(dāng)前的位置 :寧夏資訊網(wǎng) > 資訊 >  內(nèi)容正文
投稿

分享一個整合SSM框架的高并發(fā)和商品秒殺項目!

寧夏資訊網(wǎng) 2021-02-18 06:38:06 來源: 閱讀:-

一個整合SSM框架的高并發(fā)和商品秒殺項目,學(xué)習(xí)目前較流行的Java框架組合實現(xiàn)高并發(fā)秒殺API

項目開發(fā)流程

本項目很適合學(xué)習(xí)一些技術(shù)的基礎(chǔ),這個項目的開發(fā)分為幾個流程,很基礎(chǔ)地教你接觸到一個相對有技術(shù)含量的項目

  1. Java高并發(fā)秒殺API之業(yè)務(wù)分析與DAO層
  2. Java高并發(fā)秒殺API之web層
  3. Java高并發(fā)秒殺API之Service層
  4. Java高并發(fā)秒殺API之高并發(fā)優(yōu)化


按照上面幾個流程走下去,你要有基本的Maven認(rèn)識以及Java語法的一些概念,要不然可能不太理解

其實這幾個流程也就是開發(fā)的流程,首先從DAO層開始開發(fā),從后往前開發(fā),開始Coding吧!

項目總結(jié)可能比較長,由于公眾號文章的字?jǐn)?shù)限制今天只能先講解第一節(jié),如果這篇文章看得人多并且點(diǎn)贊數(shù)較高的話明天就繼續(xù)更新,哈哈~

項目環(huán)境的搭建

  • 操作系統(tǒng) : Ubuntu 17.04
  • IDE :IntelliJ IDEA 2016.2.5 x64 用Eclipse也一樣的,工具時靠人用的
  • JDK : JDK1.8 建議使用JDK1.7以上版本,有許多語法糖用著挺舒服的
  • Web容器 : Tomcat 8.0
  • 數(shù)據(jù)庫 :Mysql-5.6.17-WinX64 實驗性的項目用Mysql就足夠啦
  • 依賴管理工具 : Maven 管理jar包真的很方便
  • 這里列出的環(huán)境不是必須的,你喜歡用什么就用什么,這里只是給出參考,不過不同的版本可能會引起各種不同的問題就需要我們自己去發(fā)現(xiàn)以及排查,在這里使用Maven的話時方便我們管理JAR包,我們不用跑去各種開源框架的官網(wǎng)去下載一個又一個的JAR包,配置好了Maven后添加pom文件坐標(biāo)就會從中央倉庫下載JAR包,如果哪天替換版本也很方便

項目效果圖

秒殺商品列表


分享一個整合SSM框架的高并發(fā)和商品秒殺項目


秒殺結(jié)束提示界面


分享一個整合SSM框架的高并發(fā)和商品秒殺項目


開始秒殺提示界面


分享一個整合SSM框架的高并發(fā)和商品秒殺項目


重復(fù)秒殺提示界面


分享一個整合SSM框架的高并發(fā)和商品秒殺項目



秒殺成功提示界面


分享一個整合SSM框架的高并發(fā)和商品秒殺項目


項目的運(yùn)行

下載

Download Zip或者 git clone

git clone https://github.com/Sunybyjava/seckill.git

導(dǎo)入到IDE

這里因為是使用IDEA創(chuàng)建的項目,所以使用IDEA直接打開是很方便的,提前是你要配置好maven的相關(guān)配置,以及項目JDK版本,JDK版本必須在1.8以上,因為在項目中使用了Java8的LocalDateTime以及LocalDate,所以低于這個版本編譯會失敗的

  • IDEA
  • 直接在主界面選擇Open,然后找到項目所在路徑,點(diǎn)擊pom.xml打開就可以了
  • Eclipse 這個項目是基于IDEA創(chuàng)建,我這里把項目轉(zhuǎn)成了Eclipse的項目,如果你使用Eclipse的話也可以直接導(dǎo)入,只是步驟更繁瑣一點(diǎn),Eclipse導(dǎo)入步驟

(一)Java高并發(fā)秒殺APi之業(yè)務(wù)分析與DAO層代碼編寫

構(gòu)建項目的基本骨架

  • 首先我們要搭建出一個符合Maven約定的目錄來,這里大致有兩種方式,第一種:
  1. 第一種使用命令行手動構(gòu)建一個maven結(jié)構(gòu)的目錄,當(dāng)然我基本不會這樣構(gòu)建


mvn archetype:generate -DgroupId=com.suny.seckill -DartifactId=seckill -Dpackage=com.suny.seckill -Dversion=1.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-webapp


這里要注意的是使用archetype:generate進(jìn)行創(chuàng)建,在Maven老版本中是使用archetype:create,現(xiàn)在這種方法已經(jīng)被棄用了,所以使用命令行創(chuàng)建的話注意了,稍微解釋下這段語句的意思,就是構(gòu)建一個一個maven-archetype-webapp骨架的Webapp項目,然后groupId為com.suny.seckill ,artifactId為seckill,這里是Maven相關(guān)知識,可以按照自己的情況進(jìn)行修改

2.第二種直接在IDE中進(jìn)行創(chuàng)建,這里以IDEA為例

  • 點(diǎn)擊左上角File>New>Project>Maven
  • 然后在里面勾選Create from archetype,然后再往下拉找到org.apache.cocoon:cocoon-22-archetype-webapp,選中它,注意要先勾選那個選項,否則選擇不了,然后點(diǎn)擊Next繼續(xù)


分享一個整合SSM框架的高并發(fā)和商品秒殺項目



+然后就填寫你的Maven的那幾個重要的坐標(biāo)了,自己看著填吧


分享一個整合SSM框架的高并發(fā)和商品秒殺項目



+再就配置你的Maven的相關(guān)信息,默認(rèn)應(yīng)該是配置好的


分享一個整合SSM框架的高并發(fā)和商品秒殺項目



+之后就是點(diǎn)Finsh,到此不出意外的話就應(yīng)該創(chuàng)建成功了

構(gòu)建pom文件

項目基本的骨架我們就創(chuàng)建出來了,接下來我們要添加一些基本的JAR包的依賴,也就是在pom.xml中添加各種開源組件的三坐標(biāo)了

 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
com.suny.seckill
seckill
1.0-SNAPSHOT
seckill Maven Webapp
http://maven.apache.org



junit
junit
4.12
test



ch.qos.logback
logback-classic
1.1.7


org.slf4j
slf4j-api
1.7.21


org.apache.logging.log4j
log4j-core
2.6.1




mysql
mysql-connector-java
5.1.39



c3p0
c3p0
0.9.1.2



org.mybatis
mybatis
3.4.2


org.mybatis
mybatis-spring
1.3.1



taglibs
standard
1.1.2


jstl
jstl
1.2



com.fasterxml.jackson.core
jackson-databind
2.8.5


javax.servlet
javax.servlet-api
3.1.0




org.springframework
spring-core
4.3.6.RELEASE


org.springframework
spring-beans
4.3.6.RELEASE


org.springframework
spring-context
4.3.6.RELEASE


org.springframework
spring-jdbc
4.3.7.RELEASE


org.springframework
spring-tx
4.3.6.RELEASE


org.springframework
spring-web
4.3.6.RELEASE


org.springframework
spring-webmvc
4.3.7.RELEASE




org.springframework
spring-test
4.2.7.RELEASE



seckill



建立數(shù)據(jù)庫

在根目錄下有一個sql文件夾里面有一個sql數(shù)據(jù)庫腳本,如果你不想自己手寫的話就直接導(dǎo)入到你的數(shù)據(jù)庫里面去吧,不過還是建議自己手寫一遍加深印象

-- 整個項目的數(shù)據(jù)庫腳本
-- 開始創(chuàng)建一個數(shù)據(jù)庫
CREATE DATABASE seckill;
-- 使用數(shù)據(jù)庫
USE seckill;
-- 創(chuàng)建秒殺庫存表
CREATE TABLE seckill(
`seckill_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '商品庫存ID',
`name` VARCHAR(120) NOT NULL COMMENT '商品名稱',
`number` INT NOT NULL COMMENT '庫存數(shù)量',
`start_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() COMMENT '秒殺開啟的時間',
`end_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() COMMENT '秒殺結(jié)束的時間',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() COMMENT '創(chuàng)建的時間',
PRIMARY KEY (seckill_id),
KEY idx_start_time(start_time),
KEY idx_end_time(end_time),
KEY idx_create_time(create_time)
)ENGINE =InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8 COMMENT='秒殺庫存表';
-- 插入初始化數(shù)據(jù)
insert into
seckill(name,number,start_time,end_time)
values
('1000元秒殺iphone6',100,'2016-5-22 00:00:00','2016-5-23 00:00:00'),
('500元秒殺iPad2',200,'2016-5-22 00:00:00','2016-5-23 00:00:00'),
('300元秒殺小米4',300,'2016-5-22 00:00:00','2016-5-23 00:00:00'),
('200元秒殺紅米note',400,'2016-5-22 00:00:00','2016-5-23 00:00:00');
-- 秒殺成功明細(xì)表
-- 用戶登錄相關(guān)信息
create table success_killed(
`seckill_id` BIGINT NOT NULL COMMENT '秒殺商品ID',
`user_phone` BIGINT NOT NULL COMMENT '用戶手機(jī)號',
`state` TINYINT NOT NULL DEFAULT -1 COMMENT '狀態(tài)標(biāo)示:-1無效 0成功 1已付款',
`create_time` TIMESTAMP NOT NULL COMMENT '創(chuàng)建時間',
PRIMARY KEY (seckill_id,user_phone), /*聯(lián)合主鍵*/
KEY idx_create_time(create_time)
)ENGINE =InnDB DEFAULT CHARSET =utf8 COMMENT ='秒殺成功明細(xì)表'


在建立數(shù)據(jù)庫的,如果按照我這里的數(shù)據(jù)庫腳本建立的話應(yīng)該是沒問題的,但是我按照視頻里面的數(shù)據(jù)庫腳本建表的話發(fā)生了一個錯誤


分享一個整合SSM框架的高并發(fā)和商品秒殺項目



這個報錯看起來比較的詭異,我仔細(xì)檢查sql也沒有錯誤,它總提示我end_time要有一個默認(rèn)的值,可我記得我以前就不會這樣,然后視頻里面也沒有執(zhí)行錯誤,然后我感覺可能時MySQL版本的差異,我查看了下我數(shù)據(jù)庫版本,在登錄Mysql控制臺后輸入指令,在控制臺的我暫時知道的有兩種方式:

select version(); 
select @@version;


我的輸出結(jié)果如下:


分享一個整合SSM框架的高并發(fā)和商品秒殺項目



進(jìn)控制臺就已經(jīng)可以看到版本了,我的Mysql是5.7的,以前我用的時5.6的,然后去Google上搜索了下,找到了幾個答案,參考鏈接:

  • https://stackoverflow.com/questions/9192027/invalid-default-value-for-create-date-timestamp-field
  • mysql官方的解釋:https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_date
  • https://stackoverflow.com/questions/34570611/mysql-community-5-7-invalid-default-value-datetime-field-type


總結(jié)出來一句話就是:

mysql 5.7中,默認(rèn)使用的是嚴(yán)格模式,這里的日期必須要有時間,所以一定要給出默認(rèn)值,要么就修改數(shù)據(jù)庫設(shè)置

然后網(wǎng)友評論里總結(jié)出來的幾種解決辦法,未經(jīng)測試?。?/p>

  • 下次有問題一定要先看一下評論!??!create不了的同學(xué),可以這樣寫:


`start_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '秒殺開始時間',
`end_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '秒殺結(jié)束時間',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',


  • 關(guān)于timestamp的問題,需要先運(yùn)行 set explicit_defaults_for_timestamp = 1,否則會報invalid default value錯誤
  • 還需要注意的是SQL版本的問題會導(dǎo)致視頻中seckill表創(chuàng)建會出錯。只要將create_time放在start_time和end_time之前是方便的解決方法。


對比下我修改過后的跟視頻里面的sql片段:


分享一個整合SSM框架的高并發(fā)和商品秒殺項目



我們可以看到在這三個字段有一個小差別,那就是給start_time,end_time,create_time三個字段都添加一個默認(rèn)值,然后執(zhí)行數(shù)據(jù)庫語句就沒問題了


這里我們需要修改下web.xml中的servlet版本為3.0

打開WEB-INF下的web.xml,修改為以下代碼:

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">


修改的原因有以下幾點(diǎn):

  • 高版本的Servlet支持更多的特性,更方便我們的Coding,特別是支持注解這一特性
  • 在Servlet2.3中新加入了Listener接口的實現(xiàn),,我們可以使用Listener引入Spring的ContextLoaderListener

舉個栗子:

  • 在Servlet2.3以前我們這樣配置ContextLoaderListener:



context
org.springframework.context.ContextLoaderServlet
1


  • 在Servlet2.3以后可以使用Listener配置,也就是我們項目中使用的方法



org.springframework.context.ContextLoaderListener


兩種方法的效果都是一樣的,主要不要同時使用,否則會報錯的

建立實體類

  • 首先建立SuccessKilled 秒殺狀態(tài)表


package com.suny.entity;
import java.io.Serializable;
import java.time.LocalDateTime;
public class SuccessKilled implements Serializable {
private static final long serialVersionUID = 1834437127882846202L;
private long seckillId;
/* 用戶的手機(jī)號碼*/
private long userPhone;
/* 秒殺的狀態(tài)*/
private short state;
/* 創(chuàng)建時間*/
private LocalDateTime createTime;
/* 多對一,因為一件商品在庫存中肯定有許多,對應(yīng)的購買信息也有很多*/
private Seckill seckill;
public SuccessKilled() {
}
public SuccessKilled(long seckillId, long userPhone, short state, LocalDateTime createTime, Seckill seckill) {
this.seckillId = seckillId;
this.userPhone = userPhone;
this.state = state;
this.createTime = createTime;
this.seckill = seckill;
}
public long getSeckillId() {
return seckillId;
}
public void setSeckillId(long seckillId) {
this.seckillId = seckillId;
}
public long getUserPhone() {
return userPhone;
}
public void setUserPhone(long userPhone) {
this.userPhone = userPhone;
}
public short getState() {
return state;
}
public void setState(short state) {
this.state = state;
}
public LocalDateTime getCreateTime() {
return createTime;
}
public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}
public Seckill getSeckill() {
return seckill;
}
public void setSeckill(Seckill seckill) {
this.seckill = seckill;
}
@Override
public String toString() {
return "SuccessKilled{" +
"主鍵ID=" + seckillId +
", 手機(jī)號碼=" + userPhone +
", 秒殺狀態(tài)=" + state +
", 創(chuàng)建時間=" + createTime +
", 秒殺的商品=" + seckill +
'}';
}
}


  • 再建立Seckill 秒殺商品信息


package com.suny.entity;
import java.io.Serializable;
import java.time.LocalDateTime;
public class Seckill implements Serializable {
private static final long serialVersionUID = 2912164127598660137L;
/* 主鍵ID*/
private long seckillId;
/* 秒殺商品名字 */
private String name;
/* 秒殺的商品編號 */
private int number;
/* 開始秒殺的時間 */
private LocalDateTime startTime;
/* 結(jié)束秒殺的時間 */
private LocalDateTime endTime;
/* 創(chuàng)建的時間 */
private LocalDateTime createTIme;
public Seckill() {
}
public Seckill(long seckillId, String name, int number, LocalDateTime startTime, LocalDateTime endTime, LocalDateTime createTIme) {
this.seckillId = seckillId;
this.name = name;
this.number = number;
this.startTime = startTime;
this.endTime = endTime;
this.createTIme = createTIme;
}
public long getSeckillId() {
return seckillId;
}
public void setSeckillId(long seckillId) {
this.seckillId = seckillId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public LocalDateTime getStartTime() {
return startTime;
}
public void setStartTime(LocalDateTime startTime) {
this.startTime = startTime;
}
public LocalDateTime getEndTime() {
return endTime;
}
public void setEndTime(LocalDateTime endTime) {
this.endTime = endTime;
}
public LocalDateTime getCreateTIme() {
return createTIme;
}
public void setCreateTIme(LocalDateTime createTIme) {
this.createTIme = createTIme;
}
@Override
public String toString() {
return "com.suny.entity.Seckill{" +
"主鍵ID=" + seckillId +
", 秒殺商品='" + name + '\'' +
", 編號=" + number +
", 開始秒殺時間=" + startTime +
", 結(jié)束秒殺時間=" + endTime +
", 創(chuàng)建時間=" + createTIme +
'}';
}
}


對實體類創(chuàng)建對應(yīng)的mapper接口,也就是dao接口類

  • 首先創(chuàng)建SeckillMapper,在我這里位于com.suny.dao包下


package com.suny.dao;
import com.suny.entity.Seckill;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDateTime;
import java.util.List;
public interface SeckillMapper {
/**
* 根據(jù)傳過來的seckillId去減少商品的庫存.
*
* @param seckillId 秒殺商品ID
* @param killTime 秒殺的精確時間
* @return 如果秒殺成功就返回1,否則就返回0
*/
int reduceNumber(@Param("seckillId") long seckillId, @Param("killTime") LocalDateTime killTime);
/**
* 根據(jù)傳過來的seckillId去查詢秒殺商品的詳情.
*
* @param seckillId 秒殺商品ID
* @return 對應(yīng)商品ID的的數(shù)據(jù)
*/
Seckill queryById(@Param("seckillId") long seckillId);
/**
* 根據(jù)一個偏移量去查詢秒殺的商品列表.
*
* @param offset 偏移量
* @param limit 限制查詢的數(shù)據(jù)個數(shù)
* @return 符合偏移量查出來的數(shù)據(jù)個數(shù)
*/
List queryAll(@Param("offset") int offset, @Param("limit") int limit);
}


  • 再創(chuàng)建SuccessKilledMapper


package com.suny.dao;
import com.suny.entity.SuccessKilled;
import org.apache.ibatis.annotations.Param;
public interface SuccessKilledMapper {
/**
* 插入一條詳細(xì)的購買信息.
*
* @param seckillId 秒殺商品的ID
* @param userPhone 購買用戶的手機(jī)號碼
* @return 成功插入就返回1, 否則就返回0
*/
int insertSuccessKilled(@Param("seckillId") long seckillId, @Param("userPhone") long userPhone);
/**
* 根據(jù)秒殺商品的ID查詢SuccessKilled的明細(xì)信息.
*
* @param seckillId 秒殺商品的ID
* @param userPhone 購買用戶的手機(jī)號碼
* @return 秒殺商品的明細(xì)信息
*/
SuccessKilled queryByIdWithSeckill(@Param("seckillId") long seckillId, @Param("userPhone") long userPhone);
}


接下來書寫xml配置文件

建立對應(yīng)的mapper.xml

首先在src/main/resources建立com.suny.dao這個包,也就是對應(yīng)mapper接口文件包一樣的包名,這樣符合Maven的約定,就是資源放置在Resource包下,Java包下則是放置java類文件,編譯后最后還是會在同一個目錄下


分享一個整合SSM框架的高并發(fā)和商品秒殺項目


  • 首先建立SeckillMapper.xml


 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">



UPDATE seckill
SET number = number - 1
WHERE seckill_id = #{seckillId}
AND start_time
<=
]]>
#{killTime}
AND end_time >= #{killTime}
AND number > 0





  • 建立SuccessKilledMapper.xml


 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">



INSERT IGNORE INTO success_killed (seckill_id, user_phone, state)
VALUES (#{seckillId}, #{userPhone}, 0)





  • 建立Mybatis的配置文件mybatis-config.xml



"-//mybatis.org//DTD MyBatis Generator Configuration 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd" >












  • 然后建立連接數(shù)據(jù)庫的配置文件jdbc.properties,這里的屬性要根據(jù)自己的需要去進(jìn)行修改,切勿直接復(fù)制使用


jdbc.driver=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.password=root
jdbc.url=jdbc:mysql://localhost:3306/seckill?useUnicode=true&characterEncoding=utf-8


  • 建立Spring的dao的配置文件,在resources包下創(chuàng)建applicationContext-dao.xml




xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">





































  • 基礎(chǔ)的部分我們搭建完成了,然后要開始測試了 在IDEA里面有一個快速建立測試的快捷鍵Ctrl+Shift+T,在某個要測試的類里面按下這個快捷鍵就會出現(xiàn)Create new Test,然后選擇你要測試的方法跟測試的工具就可以了,這里我們使用Junit作為測試
  • 建立SeckillMapperTest文件,代碼如下


package com.suny.dao;
import com.suny.entity.Seckill;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring/applicationContext-dao.xml"})
public class SeckillMapperTest {
@Resource
private SeckillMapper seckillMapper;
@Test
public void reduceNumber() throws Exception {
long seckillId=1000;
LocalDateTime localDateTime=LocalDateTime.now();
int i = seckillMapper.reduceNumber(seckillId, localDateTime);
System.out.println(i);
}
@Test
public void queryById() throws Exception {
long seckillId = 1000;
Seckill seckill = seckillMapper.queryById(seckillId);
System.out.println(seckill.toString());
}
@Test
public void queryAll() throws Exception {
List seckills = seckillMapper.queryAll(0, 100);
for (Seckill seckill : seckills) {
System.out.println(seckill.toString());
}
}
}


測試中可能會出現(xiàn)Mybatis參數(shù)綁定失敗的錯誤,在mapper接口中的方法里面添加@Param的注解,顯示的告訴mybatis參數(shù)的名稱是什么,例如

List queryAll(@Param("offset") int offset, @Param("limit") int limit);




(正文已結(jié)束)

推薦閱讀:臨沂熱線

免責(zé)聲明及提醒:此文內(nèi)容為本網(wǎng)所轉(zhuǎn)載企業(yè)宣傳資訊,該相關(guān)信息僅為宣傳及傳遞更多信息之目的,不代表本網(wǎng)站觀點(diǎn),文章真實性請瀏覽者慎重核實!任何投資加盟均有風(fēng)險,提醒廣大民眾投資需謹(jǐn)慎!

網(wǎng)站簡介 - 聯(lián)系我們 - 營銷服務(wù) - XML地圖 - 版權(quán)聲明 - 網(wǎng)站地圖TXT
Copyright.2002-2019 寧夏資訊網(wǎng) 版權(quán)所有 本網(wǎng)拒絕一切非法行為 歡迎監(jiān)督舉報 如有錯誤信息 歡迎糾正