java程序員怎么創(chuàng)建自己的網(wǎng)站:第四章:做個網(wǎng)站引入廣告賺點小錢
為了節(jié)約開發(fā)時間先整一個小架構(gòu),網(wǎng)站初期訪問不會太大,這套架構(gòu)可以使用一段時間,廢話不多說,開搞。
在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模塊進(jìn)行擴展,
- 例如Spring Data JPA是針對JPA做擴展的一個子模塊;Spring Data Mongo是針對MongoDB的子模塊,但是共同的接口都是Spring Data。
- 可以說Spring Data Commons是其所有子模塊的抽象,定義了一系列的操作標(biāo)準(zhǔn)及接口。-->
- <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的項目結(jié)構(gòu)
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轉(zhuǎn)為分頁信息
*/
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轉(zhuǎn)為分頁信息
*/
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;
}
/**
* 成功返回結(jié)果
*
* @param data 獲取的數(shù)據(jù)
*/
public static <T> CommonResult<T> success(T data) {
return new CommonResult<T>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data);
}
/**
* 成功返回結(jié)果
*
* @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);
}
/**
* 失敗返回結(jié)果
* @param errorCode 錯誤碼
*/
public static <T> CommonResult<T> failed(IErrorCode errorCode) {
return new CommonResult<T>(errorCode.getCode(), errorCode.getMessage(), null);
}
/**
* 失敗返回結(jié)果
* @param message 提示信息
*/
public static <T> CommonResult<T> failed(String message) {
return new CommonResult<T>(ResultCode.FAILED.getCode(), message, null);
}
/**
* 失敗返回結(jié)果
*/
public static <T> CommonResult<T> failed() {
return failed(ResultCode.FAILED);
}
/**
* 參數(shù)驗證失敗返回結(jié)果
*/
public static <T> CommonResult<T> validateFailed() {
return failed(ResultCode.VALIDATE_FAILED);
}
/**
* 參數(shù)驗證失敗返回結(jié)果
* @param message 提示信息
*/
public static <T> CommonResult<T> validateFailed(String message) {
return new CommonResult<T>(ResultCode.VALIDATE_FAILED.getCode(), message, null);
}
/**
* 未登錄返回結(jié)果
*/
public static <T> CommonResult<T> unauthorized(T data) {
return new CommonResult<T>(ResultCode.UNAUTHORIZED.getCode(), ResultCode.UNAUTHORIZED.getMessage(), data);
}
/**
* 未授權(quán)返回結(jié)果
*/
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, "沒有相關(guān)權(quán)限");
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ù)庫驅(qū)動-->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>8.0.15</version>
- </dependency>
-
- </dependencies>
- </project>
generator的項目架構(gòu)
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è)置用戶配置的參數(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ù)庫中特殊字符需要轉(zhuǎn)義
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注解類的導(dǎo)入
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>();
//當(dāng)生成的代碼重復(fù)時,覆蓋原代碼
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驅(qū)動升級到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設(shè)為%-->
- <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ù)傳輸能力的管道,負(fù)責(zé)將數(shù)據(jù)信息從管道的輸入端傳輸?shù)焦艿赖妮敵龆耍?/span>
- 與此同時這根管道還可以讓你根據(jù)自己的需求在中間加上濾網(wǎng),Logstash提供里很多功能強大的濾網(wǎng)以滿足你的各種應(yīng)用場景。
- Logstash常用于日志關(guān)系系統(tǒng)中做日志采集設(shè)備-->
- <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的項目架構(gòu)
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ù)對應(yīng)generator項目的mapper接口,第二個參數(shù)對應(yīng)本項目自定義的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 #默認(rèn)為開發(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"/>
- <!--應(yīng)用名稱-->
- <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>
這個時候后端架構(gòu)基本搭好了,小架構(gòu):springboot+mybatis+MyBatisGenerator+Swagger-UI+PageHelper
現(xiàn)在有二種方式,一個是在poral項目中寫頁面,一種是新建一個項目前后端分離
我現(xiàn)在一個開發(fā)就不分離了,直接寫到poral項目中
poral的架構(gòu)
把你的靜態(tài)資源搞進(jìn) static包里
把你的頁面搞到templates里面去
修改一下application.properties文件
- server.port=8084
- #這里使用thymeleaf模板引擎代替jsp頁面
- spring.thymeleaf.mode=LEGACYHTML5
- spring.thymeleaf.cache=false
使用thymeleaf需要導(dǎo)入依賴到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
當(dāng)然如果你是新手用jsp寫也沒有事。
如果是前后端分離:啟動后端項目在瀏覽器中輸入:http://localhost:8084/swagger-ui.html#/
可以查看你的接口文檔
不過你需要部署你的接口到服務(wù)器,前端人員才可進(jìn)行開發(fā)。
剩下的就屬于你的開發(fā)時間了,網(wǎng)站做成什么樣就看你的開發(fā)水平了,這里我就不寫了。
當(dāng)然我還知道有很多東西沒有配置,像什么alipay,短信驗證碼,權(quán)限,緩存,信息隊列之類的,但初期第一版也就先這樣吧。
這里給上簡單的項目鏈接可以下載:
鏈接:https://pan.baidu.com/s/1coEfS73tsP9wmSJ-ewb45g
提取碼:fy5n
如果寫好你的項目運行不報錯之后就該部署項目到網(wǎng)上去,讓用戶可以通過域名訪問你的網(wǎng)站了,部署也有二種情況,一種用自己的機器部署,一種用云服務(wù)器,而這二種可以分為普通部署和使用docker部署,這里我給上之前有部署過的項目部署流程的博客地址https://blog.csdn.net/java_wxid/article/details/89785556。
這種情況是用我的筆記本部署,用云數(shù)據(jù)庫連接。當(dāng)然如果你習(xí)慣了linux系統(tǒng)部署,而且像快速部署到云服務(wù)器上建議你購買所需的環(huán)境鏡像并重裝該鏡像即可,這樣可以少了很多配置。
重裝系統(tǒng)操作文檔鏈接:https://cloud.tencent.com/document/product/213/4933
需要有搭建tomcat的集成環(huán)境即可,這邊為您推薦與之相關(guā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)站弄一個吸引人的點,這里方式多種,我就不介紹了。