SpringBoot整合MybatisPlus+BootStrap實戰(zhàn)

這篇文章的主要內(nèi)容如下:

  • SpringBoot整合Mybatis(使用Mybatis-Puls)
  • 使用Mybatis-Plus自動生成代碼
  • 引入Bootstrapmuban實現(xiàn)簡單登錄功能

下列文件供參考:

1.初始化項目->引入依賴

  • Thymeleaf
  • Mysql
  • JDBC
  • Spring Web
  • MybatisPlus(注意:不要引入Mybatis相關(guān)依賴豹悬,MybatisPlus會幫我們管理
  • BootStrap
  • Jquery

完整Pom文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.captainxero</groupId>
    <artifactId>mybatisplus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>mybatisplus</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <!-- 注意: -->
    <dependencies>
        <!-- SpringBoot 核心依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!-- Thymeleaf 模板引擎依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <!-- SpringBoot Web 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Mysql 依賴 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!-- SpringBoot Test 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- Mybatis_Plus 依賴 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>2.3</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatisplus-spring-boot-starter</artifactId>
            <version>1.0.5</version>
        </dependency>

        <!-- velocity 代碼生成使用模板 -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity</artifactId>
            <version>1.7</version>
        </dependency>

        <!-- Driud 阿里數(shù)據(jù)庫連接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.28</version>
        </dependency>

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>4.1.0</version>
        </dependency>

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>3.3.1-1</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <!-- Maven 插件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

2.配置文件


server:
  # 默認服務(wù)端口
  port: 80
  tomcat:
    uri-encoding: utf-8

# Spring配置
spring:
  thymeleaf:
    mode: LEGACYHTML5
    cache: false

  # 配置數(shù)據(jù)源
  datasource:
      type: com.alibaba.druid.pool.DruidDataSource
      driverClassName: com.mysql.jdbc.Driver
      # Mysql
      url: jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
      username: root
      password: 1qaz2wsx
      initialSize: 1
      minIdle: 3
      maxActive: 20
      maxWait: 60000
      timeBetweenEvictionRunsMillis: 60000
      minEvictableIdleTimeMillis: 30000
      validationQuery: select 'x'
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 20
      filters: stat,wall,slf4j
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

3.自動生成代碼

  • 編寫MysqlGenerator類,用來控制MybatisPlus的自動生成代碼功能辜膝。
public class MysqlGenerator {
    private static String packageName="src/main";                //初始文件路徑
    private static String customPath="project.system.user";      //自定義路徑
    private static String authorName="Captainxero";              //作者
    private static String table="sys_user";                      //table名字
    private static String prefix="sys_";                         //table前綴
    private static File file = new File(packageName);
    private static String path = file.getAbsolutePath();

    public static void main(String[] args) {
        System.out.println("絕對路徑" + path);
        // 自定義需要填充的字段
        List<TableFill> tableFillList = new ArrayList<>();
        tableFillList.add(new TableFill("ASDD_SS", FieldFill.INSERT_UPDATE));
        // 代碼生成器
        AutoGenerator mpg = new AutoGenerator().setGlobalConfig(
                // 全局配置
                new GlobalConfig()
                        .setOutputDir(path+"/java")//輸出目錄
                        .setFileOverride(true)// 是否覆蓋文件
                        .setActiveRecord(true)// 開啟 activeRecord 模式
                        .setEnableCache(false)// XML 二級緩存
                        .setBaseResultMap(true)// XML ResultMap
                        .setBaseColumnList(true)// XML columList
                        .setOpen(false)//生成后打開文件夾
                        .setAuthor(authorName)
                        // 自定義文件命名,注意 %s 會自動填充表實體屬性淑玫!
                        .setMapperName("%sMapper")
                        .setXmlName("%sMapper")
                        .setServiceName("%sService")
                        .setServiceImplName("%sServiceImpl")
                        .setControllerName("%sController")
        ).setDataSource(
                // 數(shù)據(jù)源配置
                new DataSourceConfig()
                        .setDbType(DbType.MYSQL)// 數(shù)據(jù)庫類型
                        .setTypeConvert(new MySqlTypeConvert() {
                            // 自定義數(shù)據(jù)庫表字段類型轉(zhuǎn)換【可選】
                            @Override
                            public DbColumnType processTypeConvert(String fieldType) {
                                System.out.println("轉(zhuǎn)換類型:" + fieldType);
                                // if ( fieldType.toLowerCase().contains( "tinyint" ) ) {
                                //    return DbColumnType.BOOLEAN;
                                // }
                                return super.processTypeConvert(fieldType);
                            }
                        })
                        .setDriverName("com.mysql.jdbc.Driver")
                        .setUsername("root")
                        .setPassword("1qaz2wsx")
                        .setUrl("jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull")
        ).setStrategy(
                // 策略配置
                new StrategyConfig()
                        // .setCapitalMode(true)// 全局大寫命名
                        //.setDbColumnUnderline(true)//全局下劃線命名
                        .setTablePrefix(new String[]{prefix})// 此處可以修改為您的表前綴
                        .setNaming(NamingStrategy.underline_to_camel)// 表名生成策略
                        .setInclude(new String[] { table }) // 需要生成的表
                        .setRestControllerStyle(true)
                        //.setExclude(new String[]{"test"}) // 排除生成的表
                        // 自定義實體父類
                        // .setSuperEntityClass("com.baomidou.demo.TestEntity")
                        // 自定義實體杖小,公共字段
                        //.setSuperEntityColumns(new String[]{"test_id"})
                        .setTableFillList(tableFillList)
                        // 自定義 mapper 父類
                        // .setSuperMapperClass("com.baomidou.demo.TestMapper")
                        // 自定義 service 父類
                        // .setSuperServiceClass("com.baomidou.demo.TestService")
                        // 自定義 service 實現(xiàn)類父類
                        // .setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl")
                        // 自定義 controller 父類
                        //.setSuperControllerClass("com.captainxero"+packageName+".controller.AbstractController")
                // 【實體】是否生成字段常量(默認 false)
                // public static final String ID = "test_id";
                // .setEntityColumnConstant(true)
                // 【實體】是否為構(gòu)建者模型(默認 false)
                // public User setName(String name) {this.name = name; return this;}
                // .setEntityBuilderModel(true)
                // 【實體】是否為lombok模型(默認 false)<a >document</a>
                // .setEntityLombokModel(true)
                // Boolean類型字段是否移除is前綴處理
                // .setEntityBooleanColumnRemoveIsPrefix(true)
                // .setRestControllerStyle(true)
                // .setControllerMappingHyphenStyle(true)
        ).setPackageInfo(
                // 包配置
                new PackageConfig()
                        //.setModuleName("User")
                        .setParent("com.captainxero." + customPath)// 自定義包路徑
                        .setController("controller")// 這里是控制器包名,默認 web
                        .setEntity("entity")
                        .setMapper("dao")
                        .setService("service")
                        .setServiceImpl("service.impl")
                //.setXml("mapper")
        ).setCfg(
                // 注入自定義配置烛愧,可以在 VM 中使用 cfg.abc 設(shè)置的值
                new InjectionConfig() {
                    @Override
                    public void initMap() {
                        Map<String, Object> map = new HashMap<>();
                        map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
                        this.setMap(map);
                    }
                }.setFileOutConfigList(Collections.<FileOutConfig>singletonList(new FileOutConfig("/templates/mapper.xml.vm") {
                    // 自定義輸出文件目錄
                    @Override
                    public String outputFile(TableInfo tableInfo) {
                        return path+"/resources/mapper/" + tableInfo.getEntityName() + "Mapper.xml";
                    }
                }))
        ).setTemplate(
                // 關(guān)閉默認 xml 生成酪惭,調(diào)整生成 至 根目錄
                new TemplateConfig().setXml(null)
                // 自定義模板配置希痴,模板可以參考源碼 /mybatis-plus/src/main/resources/template 使用 copy
                // 至您項目 src/main/resources/template 目錄下,模板名稱也可自定義如下配置:
                // .setController("...");
                // .setEntity("...");
                // .setMapper("...");
                // .setXml("...");
                // .setService("...");
                // .setServiceImpl("...");
        );

        // 執(zhí)行生成
        mpg.execute();

        // 打印注入設(shè)置春感,這里演示模板里面怎么獲取注入內(nèi)容【可無】
        System.err.println(mpg.getCfg().getMap().get("abc"));
    }

}
  • 項目結(jié)構(gòu)如下圖所示润梯,為了后續(xù)開發(fā)方便些,我將目錄進行了較為細的劃分甥厦。其中生成的代碼將會寫入project路徑下的user目錄以及resource目錄下的mapper目錄纺铭。


    項目結(jié)構(gòu)

    執(zhí)行代碼生成控制類,生成代碼后的項目結(jié)構(gòu)如圖;


    代碼生成后的項目結(jié)構(gòu)
  • UserController:主要負責(zé)User相關(guān)邏輯控制和前臺交互
  • Usermapper:用戶信息表 Mapper 接口
  • User:用戶信息表刀疙,對應(yīng)數(shù)據(jù)庫中的用戶表
  • UserService:用戶信息表的服務(wù)類接口
  • UserServiceImpl:用戶服務(wù)類
    根據(jù)MybatisPlus的官方文檔舶赔,此時生成的看似空白的代碼其實已經(jīng)具備了基礎(chǔ)的功能,MybatisPlus在其中封裝了常用的CRUD方法谦秧。為了后續(xù)登錄驗證竟纳,我們在UserMapper中以注解的形式添加如下方法(完整代碼文末給出)
@Select("select * from sys_user where login_name = #{loginName}")
    User selectUserByName(String loginName);

4.編寫控制類

  • 在userConller中編寫如下代碼:
@Controller
public class UserController {

    @Autowired
    private UserMapper userMapper;

    @GetMapping("/login")
    public String login()
    {
        return "login";
    }

//    簡單登錄驗證
    @PostMapping("/check")
    public String checkLogin(@RequestParam("username") String username, @RequestParam("password") String password, Map<String,Object> map){
//        User exampleUser = userMapper.selectById(username);
        User loginUser = userMapper.selectUserByName(username);
        String userPassword = loginUser.getPassword();
        System.out.println(userPassword);
//        String userPassword = exampleUser.getPassword();
        if(userPassword.equals(password)){
            return "index";
        }else {
            map.put("msg","用戶名密碼錯誤");
            return "login";
        }
    }

    @GetMapping("/select")
    @ResponseBody
    public User selectUser(){
        // 查詢 User
        User exampleUser = userMapper.selectById(1);
        return exampleUser;
    }
}

UserConller控制器中,我們攔截login請求疚鲤,返回登錄界面锥累。接著攔截Post方式的登錄請求“check”,拿到用戶輸入的用戶名和密碼后去數(shù)據(jù)庫查詢并進行簡單驗證集歇,如果登錄成功則跳轉(zhuǎn)主界面桶略,登錄失敗進行提示并返回登錄界面。

5. 引入Bootstrap模板

  • 我們將現(xiàn)成的Bootstrap模板導(dǎo)入項目中诲宇,這里注意css等資源應(yīng)放在static目錄下际歼,html文件放在templates目錄下。否則無法享受Thymeleaf強大的功能姑蓝。
  • 將樣式文件和頁面復(fù)制進項目后鹅心,我們需要修改html中對資源文件的引用路徑


    修改資源路徑

    如上圖,添加“../static/”纺荧,并引入thymeleaf標簽旭愧。

6.運行項目

  • 運行MybatisplusApplication啟動項目颅筋,訪問http://localhost/login,看到登錄界面如下:
    登錄界面
  • 輸入錯誤的賬號密碼:


    登錄失敗
  • 輸入正確賬號密碼输枯,跳轉(zhuǎn)主頁:


    登錄進主頁

7.附錄

  • Sql文件
/*
Navicat MySQL Data Transfer

Source Server         : localhost
Source Server Version : 50720
Source Host           : localhost:3306
Source Database       : mybatis_plus

Target Server Type    : MYSQL
Target Server Version : 50720
File Encoding         : 65001

Date: 2018-06-05 20:52:19
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶ID',
  `dept_id` int(20) DEFAULT NULL COMMENT '部門ID',
  `login_name` varchar(30) DEFAULT '' COMMENT '登錄賬號',
  `user_name` varchar(30) DEFAULT '' COMMENT '用戶昵稱',
  `email` varchar(100) DEFAULT '' COMMENT '用戶郵箱',
  `phonenumber` varchar(20) DEFAULT '' COMMENT '手機號碼',
  `sex` char(20) DEFAULT '0' COMMENT '用戶性別:0男,1女',
  `avatar` varchar(100) DEFAULT '' COMMENT '頭像路徑',
  `password` varchar(100) DEFAULT '' COMMENT '密碼',
  `salt` varchar(100) DEFAULT '' COMMENT '鹽加密',
  `user_type` char(1) DEFAULT 'N' COMMENT '類型:Y默認用戶,N非默認用戶',
  `status` int(1) DEFAULT '0' COMMENT '帳號狀態(tài):0正常,1禁用',
  `refuse_des` varchar(500) DEFAULT '' COMMENT '拒絕登錄描述',
  `create_by` varchar(64) DEFAULT '' COMMENT '創(chuàng)建者',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新時間',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COMMENT='用戶信息表';

-- ----------------------------
-- Records of sys_user
-- ----------------------------
INSERT INTO `sys_user` VALUES ('1', '101', 'admin', '管理員', 'test@163.com', '15888888888', '1', '', 'admin', '111111', 'Y', '0', '正常', 'admin', '2018-06-04 16:58:19', 'admin', '2018-06-04 11:33:00');
INSERT INTO `sys_user` VALUES ('2', '102', 'ls', '李四', 'test@163.com', '15888888888', '1', '', '123456', '222222', 'N', '0', '正常', 'admin', '2018-06-04 16:58:21', 'admin', '2018-06-04 11:33:00');
INSERT INTO `sys_user` VALUES ('3', '103', 'ly', '劉一', 'test@163.com', '15888888888', '0', '', '123456', '123456', 'N', '0', '正常', 'admin', '2018-06-04 16:58:23', 'admin', '2018-06-04 11:33:00');
INSERT INTO `sys_user` VALUES ('5', '104', 'zs', '張三', 'test@163.com', '15888888888', '0', '', '123456', '123456', 'N', '0', '正常', 'admin', '2018-06-04 16:58:26', 'admin', '2018-06-04 11:33:00');
INSERT INTO `sys_user` VALUES ('6', '105', 'ls', '李四', 'test@163.com', '15888888888', '0', '', '123456', '123456', 'N', '0', '正常', 'admin', '2018-06-05 09:07:58', 'admin', '2018-06-04 11:33:00');
INSERT INTO `sys_user` VALUES ('7', '106', 'ww', '王五', 'test@163.com', '15888888888', '0', '', '123456', '123456', 'N', '0', '正常', 'admin', '2018-06-04 16:57:47', 'admin', '2018-06-04 11:33:00');
INSERT INTO `sys_user` VALUES ('8', '106', 'zl', '趙六', 'test@163.com', '15888888888', '0', '', '123456', '123456', 'N', '0', '正常', 'admin', '2018-06-04 16:57:47', 'admin', '2018-06-04 11:33:00');
INSERT INTO `sys_user` VALUES ('9', '106', 'sq', '孫七', 'test@163.com', '15888888888', '0', '', '123456', '123456', 'N', '0', '正常', 'admin', '2018-06-04 16:57:48', 'admin', '2018-06-04 11:33:00');
INSERT INTO `sys_user` VALUES ('10', '106', 'zb', '周八', 'test@163.com', '15888888888', '0', '', '123456', '123456', 'N', '0', '正常', 'admin', '2018-06-04 16:57:49', 'admin', '2018-06-04 11:33:00');
INSERT INTO `sys_user` VALUES ('11', '106', 'wj', '吳九', 'test@163.com', '15888888888', '0', '', '123456', '123456', 'N', '0', '正常', 'admin', '2018-06-04 16:57:49', 'admin', '2018-06-04 11:33:00');
INSERT INTO `sys_user` VALUES ('12', '106', 'ys', '陽十', 'test@163.com', '15888888888', '0', '', '123456', '123456', 'N', '0', '正常', 'admin', '2018-06-04 16:58:06', 'admin', '2018-06-04 11:33:00');
SET FOREIGN_KEY_CHECKS=1;

結(jié)束語

登錄驗證后續(xù)會學(xué)習(xí)并整合安全框架Shiro并進行相關(guān)鑒權(quán)與攔截议泵,主界面目前僅僅是靜態(tài)頁面,后續(xù)逐步完善相關(guān)功能用押。
項目下載(百度網(wǎng)盤):https://pan.baidu.com/s/1-GxZInjAsd_XrDPgvt8r2g 密碼:6nb5

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肢簿,一起剝皮案震驚了整個濱河市靶剑,隨后出現(xiàn)的幾起案子蜻拨,更是在濱河造成了極大的恐慌,老刑警劉巖桩引,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缎讼,死亡現(xiàn)場離奇詭異,居然都是意外死亡坑匠,警方通過查閱死者的電腦和手機血崭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厘灼,“玉大人夹纫,你說我怎么就攤上這事∩璋迹” “怎么了舰讹?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長闪朱。 經(jīng)常有香客問我月匣,道長,這世上最難降的妖魔是什么奋姿? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任锄开,我火速辦了婚禮,結(jié)果婚禮上称诗,老公的妹妹穿的比我還像新娘萍悴。我一直安慰自己,他們只是感情好寓免,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布退腥。 她就那樣靜靜地躺著,像睡著了一般再榄。 火紅的嫁衣襯著肌膚如雪狡刘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天困鸥,我揣著相機與錄音嗅蔬,去河邊找鬼剑按。 笑死,一個胖子當著我的面吹牛澜术,可吹牛的內(nèi)容都是我干的艺蝴。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼鸟废,長吁一口氣:“原來是場噩夢啊……” “哼猜敢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盒延,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤缩擂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后添寺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胯盯,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年计露,在試婚紗的時候發(fā)現(xiàn)自己被綠了博脑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡票罐,死狀恐怖叉趣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情该押,我是刑警寧澤疗杉,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站沈善,受9級特大地震影響乡数,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜闻牡,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一净赴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧罩润,春花似錦玖翅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至严沥,卻和暖如春猜极,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背消玄。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工跟伏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留丢胚,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓受扳,卻偏偏與公主長得像携龟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子勘高,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容