java程序員怎么創(chuàng)建自己的網(wǎng)站:第四章:做個網(wǎng)站引入廣告賺點小錢
為了節(jié)約開發(fā)時間先整一個小架構,網(wǎng)站初期訪問不會太大,這套架構可以使用一段時間,廢話不多說,開搞。
 在idea中創(chuàng)建一個maven工程作為父工程,給它的pom.xml配置一下
-  <?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.java.lzw</groupId>
 -         <artifactId>lzwmall</artifactId>
 -         <version>1.0-SNAPSHOT</version>
 -         <packaging>pom</packaging>
 -      
 -         <modules>
 -             <module>generator</module>
 -             <module>poral</module>
 -             <module>common</module>
 -         </modules>
 -      
 -         <parent>
 -             <groupId>org.springframework.boot</groupId>
 -             <artifactId>spring-boot-starter-parent</artifactId>
 -             <version>2.1.3.RELEASE</version>
 -             <relativePath/>
 -         </parent>
 -      
 -         <dependencies>
 -             <dependency>
 -                 <groupId>org.springframework.boot</groupId>
 -                 <artifactId>spring-boot-starter</artifactId>
 -             </dependency>
 -             <dependency>
 -                 <groupId>org.springframework.boot</groupId>
 -                 <artifactId>spring-boot-starter-web</artifactId>
 -             </dependency>
 -             <dependency>
 -                 <groupId>org.springframework.boot</groupId>
 -                 <artifactId>spring-boot-starter-actuator</artifactId>
 -             </dependency>
 -             <dependency>
 -                 <groupId>org.springframework.boot</groupId>
 -                 <artifactId>spring-boot-starter-aop</artifactId>
 -             </dependency>
 -             <dependency>
 -                 <groupId>org.springframework.boot</groupId>
 -                 <artifactId>spring-boot-starter-test</artifactId>
 -                 <scope>test</scope>
 -             </dependency>
 -             <!--MyBatis分頁插件-->
 -             <dependency>
 -                 <groupId>com.github.pagehelper</groupId>
 -                 <artifactId>pagehelper-spring-boot-starter</artifactId>
 -                 <version>1.2.10</version>
 -             </dependency>
 -             <!--集成druid連接池-->
 -             <dependency>
 -                 <groupId>com.alibaba</groupId>
 -                 <artifactId>druid-spring-boot-starter</artifactId>
 -                 <version>1.1.10</version>
 -             </dependency>
 -         </dependencies>
 -     </project>
 
 
創(chuàng)建一個子common工程,還是maven工程,修改pom.xml
- <?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.java.lzw</groupId>
 -         <artifactId>common</artifactId>
 -         <version>1.0-SNAPSHOT</version>
 -         <packaging>jar</packaging>
 -      
 -         <name>common</name>
 -         <description>common project for lzwmall</description>
 -      
 -         <dependencies>
 -             <!--Swagger-UI API文檔生產(chǎn)工具-->
 -             <dependency>
 -                 <groupId>io.springfox</groupId>
 -                 <artifactId>springfox-swagger2</artifactId>
 -                 <version>2.7.0</version>
 -             </dependency>
 -             <dependency>
 -                 <groupId>io.springfox</groupId>
 -                 <artifactId>springfox-swagger-ui</artifactId>
 -                 <version>2.7.0</version>
 -             </dependency>
 -             <!--分頁插件-->
 -             <dependency>
 -                 <groupId>com.github.pagehelper</groupId>
 -                 <artifactId>pagehelper</artifactId>
 -                 <version>5.1.8</version>
 -             </dependency>
 -             <!--Spring Data家族有多個模塊,所有的模塊都基于Spring Data Commoms模塊進行擴展,
 -             例如Spring Data JPA是針對JPA做擴展的一個子模塊;Spring Data Mongo是針對MongoDB的子模塊,但是共同的接口都是Spring Data。
 -             可以說Spring Data Commons是其所有子模塊的抽象,定義了一系列的操作標準及接口。-->
 -             <dependency>
 -                 <groupId>org.springframework.data</groupId>
 -                 <artifactId>spring-data-commons</artifactId>
 -                 <version>2.1.5.RELEASE</version>
 -             </dependency>
 -             <!--Hutool Java工具包-->
 -             <dependency>
 -                 <groupId>cn.hutool</groupId>
 -                 <artifactId>hutool-all</artifactId>
 -                 <version>4.5.7</version>
 -             </dependency>
 -      
 -         </dependencies>
 -      
 -     </project>
 
 
common的項目結構

CommonPage
    package com.common.api;
      
     import com.github.pagehelper.PageInfo;
     import org.springframework.data.domain.Page;
      
     import java.util.List;
      
     /**
      * 分頁數(shù)據(jù)封裝類
      * Created by macro on 2019/4/19.
      */
     public class CommonPage<T> {
         private Integer pageNum;
         private Integer pageSize;
         private Integer totalPage;
         private Long total;
         private List<T> list;
      
         /**
          * 將PageHelper分頁后的list轉為分頁信息
          */
         public static <T> CommonPage<T> restPage(List<T> list) {
             CommonPage<T> result = new CommonPage<T>();
             PageInfo<T> pageInfo = new PageInfo<T>(list);
             result.setTotalPage(pageInfo.getPages());
             result.setPageNum(pageInfo.getPageNum());
             result.setPageSize(pageInfo.getPageSize());
             result.setTotal(pageInfo.getTotal());
             result.setList(pageInfo.getList());
             return result;
         }
      
         /**
          * 將SpringData分頁后的list轉為分頁信息
          */
         public static <T> CommonPage<T> restPage(Page<T> pageInfo) {
             CommonPage<T> result = new CommonPage<T>();
             result.setTotalPage(pageInfo.getTotalPages());
             result.setPageNum(pageInfo.getNumber());
             result.setPageSize(pageInfo.getSize());
             result.setTotal(pageInfo.getTotalElements());
             result.setList(pageInfo.getContent());
             return result;
         }
      
         public Integer getPageNum() {
             return pageNum;
         }
      
         public void setPageNum(Integer pageNum) {
             this.pageNum = pageNum;
         }
      
         public Integer getPageSize() {
             return pageSize;
         }
      
         public void setPageSize(Integer pageSize) {
             this.pageSize = pageSize;
         }
      
         public Integer getTotalPage() {
             return totalPage;
         }
      
         public void setTotalPage(Integer totalPage) {
             this.totalPage = totalPage;
         }
      
         public List<T> getList() {
             return list;
         }
      
         public void setList(List<T> list) {
             this.list = list;
         }
      
         public Long getTotal() {
             return total;
         }
      
         public void setTotal(Long total) {
             this.total = total;
         }
     }
CommonResult
    package com.common.api;
      
     /**
      * 通用返回對象
      * Created by macro on 2019/4/19.
      */
     public class CommonResult<T> {
         private long code;
         private String message;
         private T data;
      
         protected CommonResult() {
         }
      
         protected CommonResult(long code, String message, T data) {
             this.code = code;
             this.message = message;
             this.data = data;
         }
      
         /**
          * 成功返回結果
          *
          * @param data 獲取的數(shù)據(jù)
          */
         public static <T> CommonResult<T> success(T data) {
             return new CommonResult<T>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data);
         }
      
         /**
          * 成功返回結果
          *
          * @param data 獲取的數(shù)據(jù)
          * @param  message 提示信息
          */
         public static <T> CommonResult<T> success(T data, String message) {
             return new CommonResult<T>(ResultCode.SUCCESS.getCode(), message, data);
         }
      
         /**
          * 失敗返回結果
          * @param errorCode 錯誤碼
          */
         public static <T> CommonResult<T> failed(IErrorCode errorCode) {
             return new CommonResult<T>(errorCode.getCode(), errorCode.getMessage(), null);
         }
      
         /**
          * 失敗返回結果
          * @param message 提示信息
          */
         public static <T> CommonResult<T> failed(String message) {
             return new CommonResult<T>(ResultCode.FAILED.getCode(), message, null);
         }
      
         /**
          * 失敗返回結果
          */
         public static <T> CommonResult<T> failed() {
             return failed(ResultCode.FAILED);
         }
      
         /**
          * 參數(shù)驗證失敗返回結果
          */
         public static <T> CommonResult<T> validateFailed() {
             return failed(ResultCode.VALIDATE_FAILED);
         }
      
         /**
          * 參數(shù)驗證失敗返回結果
          * @param message 提示信息
          */
         public static <T> CommonResult<T> validateFailed(String message) {
             return new CommonResult<T>(ResultCode.VALIDATE_FAILED.getCode(), message, null);
         }
      
         /**
          * 未登錄返回結果
          */
         public static <T> CommonResult<T> unauthorized(T data) {
             return new CommonResult<T>(ResultCode.UNAUTHORIZED.getCode(), ResultCode.UNAUTHORIZED.getMessage(), data);
         }
      
         /**
          * 未授權返回結果
          */
         public static <T> CommonResult<T> forbidden(T data) {
             return new CommonResult<T>(ResultCode.FORBIDDEN.getCode(), ResultCode.FORBIDDEN.getMessage(), data);
         }
      
         public long getCode() {
             return code;
         }
      
         public void setCode(long code) {
             this.code = code;
         }
      
         public String getMessage() {
             return message;
         }
      
         public void setMessage(String message) {
             this.message = message;
         }
      
         public T getData() {
             return data;
         }
      
         public void setData(T data) {
             this.data = data;
         }
     }
IErrorCode
    package com.common.api;
      
     /**
      * 封裝API的錯誤碼
      * Created by macro on 2019/4/19.
      */
     public interface IErrorCode {
         long getCode();
      
         String getMessage();
     }
ResultCode
    package com.common.api;
      
     /**
      * 枚舉了一些常用API操作碼
      * Created by macro on 2019/4/19.
      */
     public enum ResultCode implements IErrorCode {
         SUCCESS(200, "操作成功"),
         FAILED(500, "操作失敗"),
         VALIDATE_FAILED(404, "參數(shù)檢驗失敗"),
         UNAUTHORIZED(401, "暫未登錄或token已經(jīng)過期"),
         FORBIDDEN(403, "沒有相關權限");
         private long code;
         private String message;
      
         private ResultCode(long code, String message) {
             this.code = code;
             this.message = message;
         }
      
         public long getCode() {
             return code;
         }
      
         public String getMessage() {
             return message;
         }
     }
創(chuàng)建子工程,maven工程,作為數(shù)據(jù)層項目
-  <?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.java.lzw</groupId>
 -         <artifactId>generator</artifactId>
 -         <version>1.0-SNAPSHOT</version>
 -         <packaging>jar</packaging>
 -      
 -         <name>generator</name>
 -         <description>generator project for lzwmall</description>
 -      
 -         <dependencies>
 -             <dependency>
 -                 <groupId>com.java.lzw</groupId>
 -                 <artifactId>common</artifactId>
 -                 <version>1.0-SNAPSHOT</version>
 -             </dependency>
 -             <!-- MyBatis 生成器 -->
 -             <dependency>
 -                 <groupId>org.mybatis.generator</groupId>
 -                 <artifactId>mybatis-generator-core</artifactId>
 -                 <version>1.3.3</version>
 -             </dependency>
 -             <!-- MyBatis-->
 -             <dependency>
 -                 <groupId>org.mybatis</groupId>
 -                 <artifactId>mybatis</artifactId>
 -                 <version>3.4.6</version>
 -             </dependency>
 -             <!--Mysql數(shù)據(jù)庫驅動-->
 -             <dependency>
 -                 <groupId>mysql</groupId>
 -                 <artifactId>mysql-connector-java</artifactId>
 -                 <version>8.0.15</version>
 -             </dependency>
 -      
 -         </dependencies>
 -     </project>
 
 
generator的項目架構

CommentGenerator
    package com.generator;
      
     import org.mybatis.generator.api.IntrospectedColumn;
     import org.mybatis.generator.api.IntrospectedTable;
     import org.mybatis.generator.api.dom.java.CompilationUnit;
     import org.mybatis.generator.api.dom.java.Field;
     import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
     import org.mybatis.generator.internal.DefaultCommentGenerator;
     import org.mybatis.generator.internal.util.StringUtility;
      
     import java.util.Properties;
      
     /**
      * 自定義注釋生成器
      * Created by macro on 2018/4/26.
      */
     public class CommentGenerator extends DefaultCommentGenerator {
         private boolean addRemarkComments = false;
         private static final String EXAMPLE_SUFFIX="Example";
         private static final String API_MODEL_PROPERTY_FULL_CLASS_NAME="io.swagger.annotations.ApiModelProperty";
      
         /**
          * 設置用戶配置的參數(shù)
          */
         @Override
         public void addConfigurationProperties(Properties properties) {
             super.addConfigurationProperties(properties);
             this.addRemarkComments = StringUtility.isTrue(properties.getProperty("addRemarkComments"));
         }
      
         /**
          * 給字段添加注釋
          */
         @Override
         public void addFieldComment(Field field, IntrospectedTable introspectedTable,
                                     IntrospectedColumn introspectedColumn) {
             String remarks = introspectedColumn.getRemarks();
             //根據(jù)參數(shù)和備注信息判斷是否添加備注信息
             if(addRemarkComments&&StringUtility.stringHasValue(remarks)){
     //            addFieldJavaDoc(field, remarks);
                 //數(shù)據(jù)庫中特殊字符需要轉義
                 if(remarks.contains("\"")){
                     remarks = remarks.replace("\"","'");
                 }
                 //給model的字段添加swagger注解
                 field.addJavaDocLine("@ApiModelProperty(value = \""+remarks+"\")");
             }
         }
      
         /**
          * 給model的字段添加注釋
          */
         private void addFieldJavaDoc(Field field, String remarks) {
             //文檔注釋開始
             field.addJavaDocLine("/**");
             //獲取數(shù)據(jù)庫字段的備注信息
             String[] remarkLines = remarks.split(System.getProperty("line.separator"));
             for(String remarkLine:remarkLines){
                 field.addJavaDocLine(" * "+remarkLine);
             }
             addJavadocTag(field, false);
             field.addJavaDocLine(" */");
         }
      
         @Override
         public void addJavaFileComment(CompilationUnit compilationUnit) {
             super.addJavaFileComment(compilationUnit);
             //只在model中添加swagger注解類的導入
             
if(!compilationUnit.isJavaInterface()&&!compilationUnit.getType().getFullyQualifiedName().contains(EXAMPLE_SUFFIX)){
                 compilationUnit.addImportedType(new FullyQualifiedJavaType(API_MODEL_PROPERTY_FULL_CLASS_NAME));
             }
         }
     }
Generator
    package com.generator;
      
     import org.mybatis.generator.api.MyBatisGenerator;
     import org.mybatis.generator.config.Configuration;
     import org.mybatis.generator.config.xml.ConfigurationParser;
     import org.mybatis.generator.internal.DefaultShellCallback;
      
     import java.io.InputStream;
     import java.util.ArrayList;
     import java.util.List;
      
     /**
      * 用于生產(chǎn)MBG的代碼
      * Created by macro on 2018/4/26.
      */
     public class Generator {
         public static void main(String[] args) throws Exception {
             //MBG 執(zhí)行過程中的警告信息
             List<String> warnings = new ArrayList<String>();
             //當生成的代碼重復時,覆蓋原代碼
             boolean overwrite = true;
             //讀取我們的 MBG 配置文件
             InputStream is = Generator.class.getResourceAsStream("/generatorConfig.xml");
             ConfigurationParser cp = new ConfigurationParser(warnings);
             Configuration config = cp.parseConfiguration(is);
             is.close();
      
             DefaultShellCallback callback = new DefaultShellCallback(overwrite);
             //創(chuàng)建 MBG
             MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
             //執(zhí)行生成代碼
             myBatisGenerator.generate(null);
             //輸出警告信息
             for (String warning : warnings) {
                 System.out.println(warning);
             }
         }
     }
generator.properties
    jdbc.driverClass=com.mysql.jdbc.Driver
     
jdbc.connectionURL=jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
     jdbc.userId=root
     jdbc.password=123456
generatorConfig.xml
- <?xml version="1.0" encoding="UTF-8"?>
 -     <!DOCTYPE generatorConfiguration
 -             PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
 -             "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
 -      
 -     <generatorConfiguration>
 -         <properties resource="generator.properties"/>
 -         <context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat">
 -             <property name="beginningDelimiter" value="`"/>
 -             <property name="endingDelimiter" value="`"/>
 -             <property name="javaFileEncoding" value="UTF-8"/>
 -             <!-- 為模型生成序列化方法-->
 -             <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
 -             <!-- 為生成的Java模型創(chuàng)建一個toString方法 -->
 -             <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
 -             <commentGenerator type="com.generator.CommentGenerator">
 -                 <!-- 是否去除自動生成的注釋 true:是 : false:否 -->
 -                 <property name="suppressAllComments" value="true"/>
 -                 <property name="suppressDate" value="true"/>
 -                 <property name="addRemarkComments" value="true"/>
 -             </commentGenerator>
 -      
 -             <jdbcConnection driverClass="${jdbc.driverClass}"
 -                             connectionURL="${jdbc.connectionURL}"
 -                             userId="${jdbc.userId}"
 -                             password="${jdbc.password}">
 -                 <!--解決mysql驅動升級到8.0后不生成指定數(shù)據(jù)庫代碼的問題-->
 -                 <property name="nullCatalogMeansCurrent" value="true" />
 -             </jdbcConnection>
 -      
 -             <javaModelGenerator targetPackage="com.generator.model" targetProject="generator\src\main\java"/>
 -      
 -             <sqlMapGenerator targetPackage="mapper" targetProject="generator\src\main\resources"/>
 -      
 -             <javaClientGenerator type="XMLMAPPER" targetPackage="com.generator.mapper"
 -                                  targetProject="generator\src\main\java"/>
 -             <!--生成全部表tableName設為%-->
 -             <table tableName="%">
 -                 <generatedKey column="id" sqlStatement="MySql" identity="true"/>
 -             </table>
 -         </context>
 -     </generatorConfiguration>
 
 
如果你不想連接我的數(shù)據(jù)庫,可以將generator.properties中的數(shù)據(jù)連接改為你自己的,到時運行Generator中的main方法,生成你自己的數(shù)據(jù)文件
 創(chuàng)建一個Springboot子工程,作為門戶,網(wǎng)站前臺給用戶看的,修改pom.xml
- <?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.java.lzw</groupId>
 -         <artifactId>poral</artifactId>
 -         <version>1.0-SNAPSHOT</version>
 -         <packaging>jar</packaging>
 -      
 -         <name>poral</name>
 -         <description>poral project for lzwmall</description>
 -      
 -         <properties>
 -             <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 -             <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 -             <java.version>1.8</java.version>
 -             <skipTests>true</skipTests>
 -         </properties>
 -      
 -         <parent>
 -             <groupId>com.java.lzw</groupId>
 -             <artifactId>lzwmall</artifactId>
 -             <version>1.0-SNAPSHOT</version>
 -             <relativePath>../</relativePath>
 -         </parent>
 -      
 -         <dependencies>
 -             <!--依賴數(shù)據(jù)層-->
 -             <dependency>
 -                 <groupId>com.java.lzw</groupId>
 -                 <artifactId>generator</artifactId>
 -                 <version>1.0-SNAPSHOT</version>
 -             </dependency>
 -             <!--集成logstash,logstash就是一根具備實時數(shù)據(jù)傳輸能力的管道,負責將數(shù)據(jù)信息從管道的輸入端傳輸?shù)焦艿赖妮敵龆耍?/span>
 -             與此同時這根管道還可以讓你根據(jù)自己的需求在中間加上濾網(wǎng),Logstash提供里很多功能強大的濾網(wǎng)以滿足你的各種應用場景。
 -             Logstash常用于日志關系系統(tǒng)中做日志采集設備-->
 -             <dependency>
 -                 <groupId>net.logstash.logback</groupId>
 -                 <artifactId>logstash-logback-encoder</artifactId>
 -                 <version>4.8</version>
 -             </dependency>
 -         </dependencies>
 -      
 -         <build>
 -             <plugins>
 -                 <plugin>
 -                     <groupId>org.springframework.boot</groupId>
 -                     <artifactId>spring-boot-maven-plugin</artifactId>
 -                 </plugin>
 -             </plugins>
 -         </build>
 -      
 -     </project>
 
 
poral的項目架構

config中的MyBatisConfig
    package com.java.lzw.poral.config;
      
     import org.mybatis.spring.annotation.MapperScan;
     import org.springframework.context.annotation.Configuration;
     import org.springframework.transaction.annotation.EnableTransactionManagement;
      
     /**
      * MyBatis配置類
      * Created by macro on 2019/4/8.
      */
     @Configuration
     @EnableTransactionManagement
     @MapperScan({"com.generator.mapper","com.java.lzw.poral.dao"})//第一個參數(shù)對應generator項目的mapper接口,第二個參數(shù)對應本項目自定義的dao(mapper)層接口
     public class MyBatisConfig {
      
     }
config中的SwaggerConfig
    package com.java.lzw.poral.config;
      
     import io.swagger.annotations.ApiOperation;
     import org.springframework.context.annotation.Bean;
     import org.springframework.context.annotation.Configuration;
     import springfox.documentation.builders.ApiInfoBuilder;
     import springfox.documentation.builders.PathSelectors;
     import springfox.documentation.builders.RequestHandlerSelectors;
     import springfox.documentation.service.ApiInfo;
     import springfox.documentation.spi.DocumentationType;
     import springfox.documentation.spring.web.plugins.Docket;
     import springfox.documentation.swagger2.annotations.EnableSwagger2;
      
     @Configuration
     @EnableSwagger2
     public class SwaggerConfig {
      
         @Bean
         public Docket createRestApi(){
             return new Docket(DocumentationType.SWAGGER_2)
                     .apiInfo(apiInfo())
                     .select()
                     .apis(RequestHandlerSelectors.basePackage("com.java.lzw.poral.controller"))
                     .paths(PathSelectors.any())
                     .build();
         }
      
         private ApiInfo apiInfo() {
             return new ApiInfoBuilder()
                     .title("商城前臺系統(tǒng)")
                     .description("商城前臺系統(tǒng)")
                     .contact("lzw")
                     .version("1.0")
                     .build();
         }
      
     }
controller中的DemoController
    package com.java.lzw.poral.controller;
      
     import com.generator.model.OmsOrder;
     import com.java.lzw.poral.service.OmsOrderService;
     import io.swagger.annotations.Api;
     import io.swagger.annotations.ApiOperation;
     import org.springframework.beans.factory.annotation.Autowired;
     import org.springframework.stereotype.Controller;
     import org.springframework.web.bind.annotation.RequestMapping;
     import org.springframework.web.bind.annotation.RequestMethod;
     import org.springframework.web.bind.annotation.ResponseBody;
      
     import java.util.List;
      
     @Api(description = "測試接口")
     @Controller
     @RequestMapping("/demoController")
     public class DemoController {
      
      
         @Autowired
         private OmsOrderService omsOrderService;
      
         @ApiOperation("測試")
         @RequestMapping(value = "/mail", method = RequestMethod.GET)
         @ResponseBody
         public List<OmsOrder> sendMail() {
             List<OmsOrder> orderList = omsOrderService.getOrderInfo();
             return orderList;
         }
      
      
     }
dao層是你自定義的mapper接口,我這邊只是做一個測試先沒有寫
service層的OmsOrderService
    package com.java.lzw.poral.service;
      
     import com.generator.model.OmsOrder;
      
     import java.util.List;
      
     public interface OmsOrderService {
      
         List<OmsOrder> getOrderInfo();
      
     }
service.impl層的
    package com.java.lzw.poral.service.impl;
      
     import com.generator.mapper.OmsOrderMapper;
     import com.generator.model.OmsOrder;
     import com.generator.model.OmsOrderExample;
     import com.java.lzw.poral.service.OmsOrderService;
     import org.springframework.beans.factory.annotation.Autowired;
     import org.springframework.stereotype.Service;
     import java.util.List;
      
     @Service
     public class OmsOrderServiceImpl implements OmsOrderService {
      
         @Autowired
         private OmsOrderMapper orderMapper;
      
         @Override
         public List<OmsOrder> getOrderInfo() {
             OmsOrderExample omsOrderExample = new OmsOrderExample();
             OmsOrderExample.Criteria criteria = omsOrderExample.createCriteria();
             return orderMapper.selectByExample(omsOrderExample);
         }
     }
啟動類PoralApplication
-     package com.java.lzw.poral;
 -      
 -     import org.springframework.boot.SpringApplication;
 -     import org.springframework.boot.autoconfigure.SpringBootApplication;
 -      
 -     @SpringBootApplication
 -     public class PoralApplication {
 -      
 -         public static void main(String[] args) {
 -             SpringApplication.run(PoralApplication.class, args);
 -         }
 -      
 -     }
 
 
resoures下的application.properties沒有寫
resoures下的application.yml
-   spring:
 -       profiles:
 -         active: dev #默認為開發(fā)環(huán)境
 -      
 -     mybatis:
 -       mapper-locations:
 -         - classpath*:mapper/*.xml
 -      
 -      
 -     logging:
 -       level:
 -         root: info #日志配置DEBUG,INFO,WARN,ERROR
 -         com.macro.mall: debug
 -     #  file: demo_log.log #配置日志生成路徑
 -     #  path: /var/logs #配置日志文件名稱
 
 
resoures下的application-dev.yml
-  spring:
 -       datasource:
 -         url: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
 -         username: root
 -         password: 123456
 -         druid:
 -           initial-size: 5 #連接池初始化大小
 -           min-idle: 10 #最小空閑連接數(shù)
 -           max-active: 20 #最大連接數(shù)
 -           web-stat-filter:
 -             exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" #不統(tǒng)計這些請求數(shù)據(jù)
 -           stat-view-servlet: #訪問監(jiān)控網(wǎng)頁的登錄用戶名和密碼
 -             login-username: druid
 -             login-password: druid
 
 
新加resoures下的logback-spring.xml
-     <?xml version="1.0" encoding="UTF-8"?>
 -     <!DOCTYPE configuration>
 -     <configuration>
 -         <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
 -         <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
 -         <!--應用名稱-->
 -         <property name="APP_NAME" value="mall-admin"/>
 -         <!--日志文件保存路徑-->
 -         <property name="LOG_FILE_PATH" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/logs}"/>
 -         <contextName>${APP_NAME}</contextName>
 -         <!--每天記錄日志到文件appender-->
 -         <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
 -             <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
 -                 <fileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log</fileNamePattern>
 -                 <maxHistory>30</maxHistory>
 -             </rollingPolicy>
 -             <encoder>
 -                 <pattern>${FILE_LOG_PATTERN}</pattern>
 -             </encoder>
 -         </appender>
 -         <!--輸出到logstash的appender-->
 -         <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
 -             <destination>localhost:4560</destination>
 -             <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
 -         </appender>
 -         <root level="INFO">
 -             <appender-ref ref="CONSOLE"/>
 -             <appender-ref ref="FILE"/>
 -             <appender-ref ref="LOGSTASH"/>
 -         </root>
 -     </configuration>
 
 
這個時候后端架構基本搭好了,小架構:springboot+mybatis+MyBatisGenerator+Swagger-UI+PageHelper
現(xiàn)在有二種方式,一個是在poral項目中寫頁面,一種是新建一個項目前后端分離
我現(xiàn)在一個開發(fā)就不分離了,直接寫到poral項目中
poral的架構

把你的靜態(tài)資源搞進 static包里
把你的頁面搞到templates里面去
修改一下application.properties文件
- server.port=8084
 -     #這里使用thymeleaf模板引擎代替jsp頁面
 -     spring.thymeleaf.mode=LEGACYHTML5
 -     spring.thymeleaf.cache=false
 
 
使用thymeleaf需要導入依賴到poral項目中
- <dependency>
 -         <groupId>org.thymeleaf</groupId>
 -         <artifactId>thymeleaf</artifactId>
 -         <version>2.1.4</version>
 -     </dependency>
 
 
頁面也要加頭文件
- <!DOCTYPE html>
 -     <html xmlns="http://www.w3.org/1999/xhtml"
 -           xmlns:th="http://www.thymeleaf.org">
 
 
如果不會使用thymeleaf我之前的博客中給上鏈接https://blog.csdn.net/java_wxid/article/details/86498332
當然如果你是新手用jsp寫也沒有事。
如果是前后端分離:啟動后端項目在瀏覽器中輸入:http://localhost:8084/swagger-ui.html#/
可以查看你的接口文檔

不過你需要部署你的接口到服務器,前端人員才可進行開發(fā)。
剩下的就屬于你的開發(fā)時間了,網(wǎng)站做成什么樣就看你的開發(fā)水平了,這里我就不寫了。
當然我還知道有很多東西沒有配置,像什么alipay,短信驗證碼,權限,緩存,信息隊列之類的,但初期第一版也就先這樣吧。
這里給上簡單的項目鏈接可以下載:
鏈接:https://pan.baidu.com/s/1coEfS73tsP9wmSJ-ewb45g
 提取碼:fy5n
  
如果寫好你的項目運行不報錯之后就該部署項目到網(wǎng)上去,讓用戶可以通過域名訪問你的網(wǎng)站了,部署也有二種情況,一種用自己的機器部署,一種用云服務器,而這二種可以分為普通部署和使用docker部署,這里我給上之前有部署過的項目部署流程的博客地址https://blog.csdn.net/java_wxid/article/details/89785556。
這種情況是用我的筆記本部署,用云數(shù)據(jù)庫連接。當然如果你習慣了linux系統(tǒng)部署,而且像快速部署到云服務器上建議你購買所需的環(huán)境鏡像并重裝該鏡像即可,這樣可以少了很多配置。
重裝系統(tǒng)操作文檔鏈接:https://cloud.tencent.com/document/product/213/4933
需要有搭建tomcat的集成環(huán)境即可,這邊為您推薦與之相關的環(huán)境供您參考。
Java運行環(huán)境(nginx+mysql+tomcat) :https://market.cloud.tencent.com/products/6483

現(xiàn)在是激動人心的時刻了,引入廣告聯(lián)盟,賺錢的時候了。
麒麟廣告聯(lián)盟(www.70e.com),支持點擊和彈窗。一千點擊100元。一千彈窗50元。周付,50元起付,支持網(wǎng)銀,最好的是支持支付寶。比較好的公司運營聯(lián)盟除開百度跟谷歌外,再就是酷奇廣告聯(lián)盟,他們那邊不扣量,不扣稅,不扣手續(xù)費。
這里就介紹二家,具體流程我也不好寫,畢竟每家的不同,要求也不同,弄好這些雜七雜八的東西,把你的廣告引入的項目中就ok了。到時直接根據(jù)訪問量拿錢,所以你需要對你的網(wǎng)站弄一個吸引人的點,這里方式多種,我就不介紹了。


                   
 個人中心
 退出


 
  分類導航