初始项目

This commit is contained in:
liupopo
2023-02-11 12:55:02 +08:00
parent 1748bda84a
commit 0b89e36064
3363 changed files with 506201 additions and 1 deletions

View File

@@ -0,0 +1,3 @@
Manifest-Version: 1.0
Main-Class: com.zscat.mallplus.MallAdminApplication

View File

@@ -0,0 +1,58 @@
#===redis start===
# Redis\u6570\u636E\u5E93\u7D22\u5F15\uFF08\u9ED8\u8BA4\u4E3A0\uFF09
spring.redis.database=4
# Redis\u670D\u52A1\u5668\u5730\u5740
spring.redis.host=127.0.0.1
# Redis\u670D\u52A1\u5668\u8FDE\u63A5\u7AEF\u53E3
spring.redis.port=6379
# Redis\u670D\u52A1\u5668\u8FDE\u63A5\u5BC6\u7801\uFF08\u9ED8\u8BA4\u4E3A\u7A7A\uFF09
spring.redis.password=
# \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
spring.redis.pool.max-active=8
# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
spring.redis.pool.max-wait=-1
# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5927\u7A7A\u95F2\u8FDE\u63A5
spring.redis.pool.max-idle=8
# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5
spring.redis.pool.min-idle=0
# \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09
spring.redis.timeout=0
#===redis end===
spring.datasource.url=jdbc:mysql://localhost:3306/mallplus1?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.initialSize=5
spring.datasource.druid.minIdle=5
spring.datasource.druid.maxActive=10
spring.datasource.druid.maxWait=60000
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.validationQuery=SELECT 1
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=false
spring.datasource.druid.testOnReturn=false
spring.datasource.druid.removeAbandoned=true
spring.datasource.druid.remove-abandoned-timeout=180
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.stat-view-servlet.reset-enable=true
spring.datasource.druid.stat-view-servlet.login-username=druid
spring.datasource.druid.stat-view-servlet.login-password=druid
mybatis-plus.mapper-locations=classpath:/mapper/*/*.xml
mybatis-plus.typeAliasesPackage=com.zscat.mallplus.*.entity
#mybatis-plus.typeEnumsPackage=com.zscat.mallplus.sys.entity.enums
mybatis-plus.global-config.db-config.id-type=id_worker
mybatis-plus.global-config.db-config.field-strategy=not_empty
mybatis-plus.global-config.db-config.column-underline=true
mybatis-plus.global-config.db-config.logic-delete-value=0
mybatis-plus.global-config.db-config.logic-not-delete-value=1
mybatis-plus.global-config.db-config.db-type=mysql
mybatis-plus.global-config.refresh=true
mybatis-plus.configuration.map-underscore-to-camel-case=true
mybatis-plus.configuration.cache-enabled=false

View File

@@ -0,0 +1,64 @@
#===redis start===
# Redis\u6570\u636E\u5E93\u7D22\u5F15\uFF08\u9ED8\u8BA4\u4E3A0\uFF09
spring.redis.database=2
# Redis\u670D\u52A1\u5668\u5730\u5740
spring.redis.host=127.0.0.1
# Redis\u670D\u52A1\u5668\u8FDE\u63A5\u7AEF\u53E3
spring.redis.port=6379
# Redis\u670D\u52A1\u5668\u8FDE\u63A5\u5BC6\u7801\uFF08\u9ED8\u8BA4\u4E3A\u7A7A\uFF09
spring.redis.password=
# \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
spring.redis.pool.max-active=8
# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
spring.redis.pool.max-wait=-1
# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5927\u7A7A\u95F2\u8FDE\u63A5
spring.redis.pool.max-idle=8
# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5
spring.redis.pool.min-idle=0
# \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09
spring.redis.timeout=0
#===redis end===
spring.datasource.url=jdbc:mysql://localhost:3306/mallplus1?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=yxt_3316_admin
# 生成的公钥
#public-key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJA52y0MfenXef1fa16LOdIy5aHKPaQCGrjDH/GlHEOwvaDqFn5teHZjrZPUeXBYouL74SXLOwIBMKqihzkmB0sCAwEAAQ==
# 配置 connection-properties启用加密配置公钥。
#spring.datasource.druid.connection-properties=config.decrypt=true;config.decrypt.key=${public-key}
# 启用ConfigFilter
spring.datasource.druid.filter.config.enabled=true
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.initialSize=5
spring.datasource.druid.minIdle=5
spring.datasource.druid.maxActive=10
spring.datasource.druid.maxWait=60000
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.validationQuery=SELECT 1
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=false
spring.datasource.druid.testOnReturn=false
spring.datasource.druid.removeAbandoned=true
spring.datasource.druid.remove-abandoned-timeout=180
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.stat-view-servlet.reset-enable=true
spring.datasource.druid.stat-view-servlet.login-username=druid
spring.datasource.druid.stat-view-servlet.login-password=druid
mybatis-plus.mapper-locations=classpath:/mapper/*/*.xml
mybatis-plus.typeAliasesPackage=com.zscat.mallplus.*.entity
#mybatis-plus.typeEnumsPackage=com.zscat.mallplus.sys.entity.enums
mybatis-plus.global-config.db-config.id-type=id_worker
mybatis-plus.global-config.db-config.field-strategy=not_empty
mybatis-plus.global-config.db-config.column-underline=true
mybatis-plus.global-config.db-config.logic-delete-value=0
mybatis-plus.global-config.db-config.logic-not-delete-value=1
mybatis-plus.global-config.db-config.db-type=mysql
mybatis-plus.global-config.refresh=true
mybatis-plus.configuration.map-underscore-to-camel-case=true
mybatis-plus.configuration.cache-enabled=false

View File

@@ -0,0 +1,74 @@
spring.datasource.url=jdbc:mysql://localhost:3306/mallplus1?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&useTimezone=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=1LAiGz$t1*Iw
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.initialSize=5
spring.datasource.druid.minIdle=5
spring.datasource.druid.maxActive=10
spring.datasource.druid.maxWait=60000
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.validationQuery=SELECT 1
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=false
spring.datasource.druid.testOnReturn=false
spring.datasource.druid.removeAbandoned=true
spring.datasource.druid.remove-abandoned-timeout=180
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.stat-view-servlet.reset-enable=true
spring.datasource.druid.stat-view-servlet.login-username=druid
spring.datasource.druid.stat-view-servlet.login-password=druid
mybatis-plus.mapper-locations=classpath:/mapper/*/*.xml
mybatis-plus.typeAliasesPackage=com.zscat.mallplus.*.entity
#mybatis-plus.typeEnumsPackage=com.zscat.mallplus.sys.entity.enums
mybatis-plus.global-config.db-config.id-type=id_worker
mybatis-plus.global-config.db-config.field-strategy=not_empty
mybatis-plus.global-config.db-config.column-underline=true
mybatis-plus.global-config.db-config.logic-delete-value=0
mybatis-plus.global-config.db-config.logic-not-delete-value=1
mybatis-plus.global-config.db-config.db-type=mysql
mybatis-plus.global-config.refresh=true
mybatis-plus.configuration.map-underscore-to-camel-case=true
mybatis-plus.configuration.cache-enabled=false
#===mongodb end===
#===redis start===
# Redis\u6570\u636E\u5E93\u7D22\u5F15\uFF08\u9ED8\u8BA4\u4E3A0\uFF09
spring.redis.database=0
# Redis\u670D\u52A1\u5668\u5730\u5740
spring.redis.host=127.0.0.1
# Redis\u670D\u52A1\u5668\u8FDE\u63A5\u7AEF\u53E3
spring.redis.port=6379
# Redis\u670D\u52A1\u5668\u8FDE\u63A5\u5BC6\u7801\uFF08\u9ED8\u8BA4\u4E3A\u7A7A\uFF09
spring.redis.password=123456
# \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
spring.redis.pool.max-active=8
# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
spring.redis.pool.max-wait=-1
# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5927\u7A7A\u95F2\u8FDE\u63A5
spring.redis.pool.max-idle=8
# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5
spring.redis.pool.min-idle=0
# \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09
spring.redis.timeout=0
#===redis end===
# \u5C0F\u7A0B\u5E8F
wx.secret=12c7a7ae75571beaf4eb379d30962681
wx.appId=wx15ade215f1447bda
wx.mchId=1388211202
wx.paySignKey=QMRHz2NpJpNIJqhHHJQSNuNmHPnH2v9z
wx.certName=/cert/apiclient_cert.p12
wx.getCode=https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=STAT#wechat_redirect
wx.notifyUrl=http://localhost:8085/api/pay/notify
wx.orderquery=https://api.mch.weixin.qq.com/pay/orderquery
wx.refundUrl=https://api.mch.weixin.qq.com/secapi/pay/refund
wx.refundqueryUrl=https://api.mch.weixin.qq.com/pay/refundquery
wx.tradeType=JSAPI
wx.uniformorder=https://api.mch.weixin.qq.com/pay/unifiedorder
wx.userMessage=https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN
wx.webAccessTokenhttps=https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code
wx.templateId=nAt_DYLLwYXkIhtDb5nyEm0ynrt98OK3Z3MmeUooPz4

View File

@@ -0,0 +1,87 @@
#\u9ED8\u8BA4\u4E3A\u5F00\u53D1\u73AF\u5883
#spring.profiles.active=dev
spring.profiles.active=test
server.port=8085
spring.jackson.time-zone=GMT+8
#===OSS start \uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u01B6\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD
aliyun.sms.accessKeyId=LTAI4G8mEVaYgHYEVsJ19y9M
aliyun.sms.accessKeySecret=s4IC8jIlrVvU3CWqeOxqqbOxMCwdui
aliyun.sms.sign.name=\u4EAC\u6021\u541B\u5546\u8D38
aliyun.sms.template.code=SMS_164240312
aliyun.sms.expire-minute=2
aliyun.sms.day-count=45
#===OSS start \u01F0\uFFFD\uFFFDoss\uFFFD\uFFFD\u04AA\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD===
aliyun.oss.endpoint=oss-cn-huhehaote.aliyuncs.com
aliyun.oss.accessKeyId=LTAI4G8mEVaYgHYEVsJ19y9M
aliyun.oss.accessKeySecret=s4IC8jIlrVvU3CWqeOxqqbOxMCwdui
aliyun.oss.bucketName=yxt-sc
aliyun.oss.policy.expire=300
aliyun.oss.maxSize=10
#aliyun.oss.callback=http://39.104.100.138:8085/aliyun/oss/callback
aliyun.oss.dir.prefix=
#===OSS end===
#===OSS start oss\uFFFD\uFFFD\u04AA\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD \uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u04BB\uFFFD\uFFFD\uFFFD\uFFFD\u04B2\uFFFD\uFFFD\uFFFD\uFFFD\u05BB\uFFFD\uFFFDdefalut\uFFFD\u013C\uFFFD\u00BC===
oss.type=1
oss.aliyun.first.accessKeyId=LTAI4G8mEVaYgHYEVsJ19y9M
oss.aliyun.first.accessKeySecret=s4IC8jIlrVvU3CWqeOxqqbOxMCwdui
oss.aliyun.first.bucketName=yxt-sc
oss.aliyun.first.endPoint=oss-cn-huhehaote.aliyuncs.com
oss.aliyun.first.styleName=
oss.aliyun.first.prefix=web
oss.aliyun.second.accessKeyId=\u02A1\uFFFD\uFFFD...
oss.aliyun.second.accessKeySecret=\u02A1\uFFFD\uFFFD...
oss.aliyun.second.bucketName=peterjava
oss.aliyun.second.endPoint=oss-cn-huhehaote.aliyuncs.com
oss.aliyun.second.styleName=
oss.aliyun.second.prefix=user
oss.aliyun.domain=http://yxt-sc.oss-cn-beijing.aliyuncs.com/
oss.aliyun.defalut.accessKeyId=LTAI4G8mEVaYgHYEVsJ19y9M
oss.aliyun.defalut.accessKeySecret=s4IC8jIlrVvU3CWqeOxqqbOxMCwdui
oss.aliyun.defalut.bucketName=yxt-sc
oss.aliyun.defalut.endPoint=oss-cn-huhehaote.aliyuncs.com
oss.aliyun.defalut.styleName=
oss.aliyun.defalut.prefix=web
#===mybatis start===
redis.key.prefix.authCode=admin:authCode:
redis.key.prefix.orderId=admin:orderId:
authCode.expire.seconds=90
#===mybatis end===
#===log start===
#\u65E5\u5FD7\u914D\u7F6EDEBUG,INFO,WARN,ERROR
logging.level.root=info
#\u5355\u72EC\u914D\u7F6E\u65E5\u5FD7\u7EA7\u522B
logging.level.com.zscat.mallplus=debug
logging.level.com.zscat.mallplus.mapper=debug
logging.level.com.zscat.mallplus.sms.mapper=debug
logging.level.com.zscat.mallplus.oms.mapper=debug
logging.level.com.zscat.mallplus.pms.mapper=debug
logging.level.com.zscat.mallplus.sys.mapper=debug
logging.level.com.zscat.mallplus.cms.mapper=debug
logging.level.com.zscat.mallplus.ums.mapper=debug
#\u914D\u7F6E\u65E5\u5FD7\u751F\u6210\u8DEF\u5F84
#logging.path=/var/logs
#\u914D\u7F6E\u65E5\u5FD7\u6587\u4EF6\u540D\u79F0
#logging.file=demo_log.log
#===log end===
#===thymeleaf start===
#\u5F00\u53D1\u65F6\u5173\u95ED\u7F13\u5B58,\u4E0D\u7136\u6CA1\u6CD5\u770B\u5230\u5B9E\u65F6\u9875\u9762
spring.thymeleaf.cache=false
#===thymeleaf end==
#===JWT start===
#JWT\u5B58\u50A8\u7684\u8BF7\u6C42\u5934
jwt.tokenHeader=Authorization
#JWT\u52A0\u89E3\u5BC6\u4F7F\u7528\u7684\u5BC6\u94A5
jwt.secret=mySecret
#JWT\u7684\u8D85\u671F\u9650\u65F6\u95F4(60*60*24)
jwt.expiration=604800
#JWT\u8D1F\u8F7D\u4E2D\u62FF\u5230\u5F00\u5934
jwt.tokenHead=Bearer
#===JWT end===

View File

@@ -0,0 +1,33 @@
#\u4EE3\u7801\u751F\u6210\u5668\uFF0C\u914D\u7F6E\u4FE1\u606F
#\u5305\u540D
package=com.zscat
module=cms
labeltext=\u54C1\u724C
#\u4F5C\u8005
author=zscat
#Email
email=951449465@qq.com
#\u81EA\u52A8\u53BB\u9664\u8868\u524D\u7F00\uFF0C\u9ED8\u8BA4\u662F true
autoRemovePre=true
#\u8868\u524D\u7F00(\u7C7B\u540D\u4E0D\u4F1A\u5305\u542B\u8868\u524D\u7F00)
tablePrefix=cms_
#\u7C7B\u578B\u8F6C\u6362\uFF0C\u914D\u7F6E\u4FE1\u606F
tinyint=Integer
smallint=Integer
mediumint=Integer
int=Integer
integer=Integer
bigint=Long
float=Float
double=Double
decimal=BigDecimal
bit=Boolean
char=String
varchar=String
tinytext=String
text=String
mediumtext=String
longtext=String
date=Date
datetime=Date
timestamp=Date

View File

@@ -0,0 +1,31 @@
<?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="mallplus-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>

View File

@@ -0,0 +1,57 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<style>
@page {
margin: 0;
}
</style>
</head>
<body style="margin: 0px;
padding: 0px;
font: 100% SimSun, Microsoft YaHei, Times New Roman, Verdana, Arial, Helvetica, sans-serif;
color: #000;">
<div style="height: auto;
width: 820px;
min-width: 820px;
margin: 0 auto;
margin-top: 20px;
border: 1px solid #eee;">
<div style="padding: 10px;padding-bottom: 0px;">
<p style="margin-bottom: 10px;padding-bottom: 0px;">尊敬的用户,您好:</p>
<p style="text-indent: 2em; margin-bottom: 10px;">您正在申请邮箱验证,您的验证码为:</p>
<p style="text-align: center;
font-family: Times New Roman;
font-size: 22px;
color: #C60024;
padding: 20px 0px;
margin-bottom: 10px;
font-weight: bold;
background: #ebebeb;">${code}</p>
<div style="list-style: none;
margin-top: 22px;
maigin-bottom: 10px;
font-size: 14px;
color: #555;">
<p style="line-height: 12px;">Github<a hover="color: #DA251D;" style="color: #999;"
href="https://github.com/elunez/eladmin" target="_blank">https://github.com/elunez/eladmin</a>
</p>
</div>
<div class="foot-hr hr" style="margin: 0 auto;
z-index: 111;
width: 800px;
margin-top: 30px;
border-top: 1px solid #DA251D;">
</div>
<div style="text-align: center;
font-size: 12px;
padding: 20px 0px;
font-family: Microsoft YaHei;">
Copyright &copy;${.now?string("yyyy")} EL-ADMIN 后台管理系统 All Rights Reserved.
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,156 @@
package ${package}.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zscat.mallplus.annotation.SysLog;
import ${package}.entity.${className};
import ${package}.service.I${className}Service;
import com.zscat.mallplus.util.EasyPoiUtils;
import com.zscat.mallplus.utils.CommonResult;
import com.zscat.mallplus.utils.ValidatorUtils;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Date;
/**
* @author ${author}
* @date ${date}
* ${prefix}
*/
@Slf4j
@RestController
@RequestMapping("/${moduleName}/${changeClassName}")
public class ${className}Controller {
@Resource
private I${className}Service I${className}Service;
@SysLog(MODULE = "${moduleName}", REMARK = "根据条件查询所有${prefix}列表")
@ApiOperation("根据条件查询所有${prefix}列表")
@GetMapping(value = "/list")
@PreAuthorize("hasAuthority('${moduleName}:${changeClassName}:read')")
public Object get${className}ByPage(${className} entity,
@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize
) {
try {
return new CommonResult().success(I${className}Service.page(new Page<${className}>(pageNum, pageSize), new QueryWrapper<>(entity)));
} catch (Exception e) {
log.error("根据条件查询所有${prefix}列表:%s", e.getMessage(), e);
}
return new CommonResult().failed();
}
@SysLog(MODULE = "${moduleName}", REMARK = "保存${prefix}")
@ApiOperation("保存${prefix}")
@PostMapping(value = "/create")
@PreAuthorize("hasAuthority('${moduleName}:${changeClassName}:create')")
public Object save${className}(@RequestBody ${className} entity) {
try {
entity.setCreateTime(new Date());
if (I${className}Service.save(entity)) {
return new CommonResult().success();
}
} catch (Exception e) {
log.error("保存${prefix}%s", e.getMessage(), e);
return new CommonResult().failed(e.getMessage());
}
return new CommonResult().failed();
}
@SysLog(MODULE = "${moduleName}", REMARK = "更新${prefix}")
@ApiOperation("更新${prefix}")
@PostMapping(value = "/update/{id}")
@PreAuthorize("hasAuthority('${moduleName}:${changeClassName}:update')")
public Object update${className}(@RequestBody ${className} entity) {
try {
if (I${className}Service.updateById(entity)) {
return new CommonResult().success();
}
} catch (Exception e) {
log.error("更新${prefix}%s", e.getMessage(), e);
return new CommonResult().failed(e.getMessage());
}
return new CommonResult().failed();
}
@SysLog(MODULE = "${moduleName}", REMARK = "删除${prefix}")
@ApiOperation("删除${prefix}")
@GetMapping(value = "/delete/{id}")
@PreAuthorize("hasAuthority('${moduleName}:${changeClassName}:delete')")
public Object delete${className}(@ApiParam("${prefix}id") @PathVariable Long id) {
try {
if (ValidatorUtils.empty(id)) {
return new CommonResult().paramFailed("${prefix}id");
}
if (I${className}Service.removeById(id)) {
return new CommonResult().success();
}
} catch (Exception e) {
log.error("删除${prefix}%s", e.getMessage(), e);
return new CommonResult().failed(e.getMessage());
}
return new CommonResult().failed();
}
@SysLog(MODULE = "${moduleName}", REMARK = "给${prefix}分配${prefix}")
@ApiOperation("查询${prefix}明细")
@GetMapping(value = "/{id}")
@PreAuthorize("hasAuthority('${moduleName}:${changeClassName}:read')")
public Object get${className}ById(@ApiParam("${prefix}id") @PathVariable Long id) {
try {
if (ValidatorUtils.empty(id)) {
return new CommonResult().paramFailed("${prefix}id");
}
${className} coupon = I${className}Service.getById(id);
return new CommonResult().success(coupon);
} catch (Exception e) {
log.error("查询${prefix}明细:%s", e.getMessage(), e);
return new CommonResult().failed();
}
}
@ApiOperation(value = "批量删除${prefix}")
@RequestMapping(value = "/delete/batch", method = RequestMethod.GET)
@SysLog(MODULE = "${moduleName}", REMARK = "批量删除${prefix}")
@PreAuthorize("hasAuthority('${moduleName}:${changeClassName}:delete')")
public Object deleteBatch(@RequestParam("ids") List
<Long> ids) {
boolean count = I${className}Service.removeByIds(ids);
if (count) {
return new CommonResult().success(count);
} else {
return new CommonResult().failed();
}
}
@SysLog(MODULE = "${moduleName}", REMARK = "导出社区数据")
@GetMapping("/exportExcel")
public void export(HttpServletResponse response, ${className} entity) {
// 模拟从数据库获取需要导出的数据
List<${className}> personList = I${className}Service.list(new QueryWrapper<>(entity));
// 导出操作
EasyPoiUtils.exportExcel(personList, "导出社区数据", "社区数据", ${className}.class, "导出社区数据.xls", response);
}
@SysLog(MODULE = "${moduleName}", REMARK = "导入社区数据")
@PostMapping("/importExcel")
public void importUsers(@RequestParam MultipartFile file) {
List<${className}> personList = EasyPoiUtils.importExcel(file, ${className}.class);
I${className}Service.saveBatch(personList);
}
}

View File

@@ -0,0 +1,48 @@
package ${package}.entity;
import lombok.Data;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.zscat.mallplus.utils.BaseEntity;
import java.util.Date;
import lombok.Getter;
import lombok.Setter;
<#if hasTimestamp>
import java.sql.Timestamp;
</#if>
<#if hasBigDecimal>
import java.math.BigDecimal;
</#if>
import java.io.Serializable;
/**
* @author ${author}
* @date ${date}
${prefix}
*/
@Data
@TableName("${tableName}")
public class ${className} extends BaseEntity implements Serializable {
<#if columns??>
<#list columns as column>
<#if column.changeColumnName = 'id'>
@TableId(value = "id", type = IdType.AUTO)
</#if>
<#if column.changeColumnName != 'id'>
/**
${column.columnComment}
**/
@TableField( "${column.columnName}")
</#if>
private ${column.columnType} ${column.changeColumnName};
</#list>
</#if>
}

View File

@@ -0,0 +1,12 @@
package ${package}.mapper;
import ${package}.entity.${className};
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author ${author}
* @date ${date}
*/
public interface ${className}Mapper extends BaseMapper<${className}> {
}

View File

@@ -0,0 +1,13 @@
package ${package}.service;
import ${package}.entity.${className};
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author ${author}
* @date ${date}
*/
public interface I${className}Service extends IService<${className}> {
}

View File

@@ -0,0 +1,21 @@
package ${package}.service.impl;
import ${package}.entity.${className};
import ${package}.mapper.${className}Mapper;
import ${package}.service.I${className}Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* @author ${author}
* @date ${date}
*/
@Service
public class ${className}ServiceImpl extends ServiceImpl
<${className}Mapper, ${className}> implements I${className}Service {
@Resource
private ${className}Mapper ${changeClassName}Mapper;
}

View File

@@ -0,0 +1,33 @@
-- 菜单对应按钮SQL
insert into `sys_permission` ( `name`, `pid`, `status`, `sort`, `value`, `type`, `create_time`, `uri`, `icon`) values
( '${prefix}列表', '47', '1', '0', '${moduleName}:${changeClassName}:read', '1', '2018-09-29 16:18:51', '${changeClassName}', 'fwb');
insert into `sys_permission` ( `name`, `pid`, `status`, `sort`, `value`, `type`, `create_time`, `uri`, `icon`) values
( '添加${prefix}', '47', '1', '0', '${moduleName}:${changeClassName}:create', '2', '2018-09-29 16:18:51', 'add${className}', 'fwb');
insert into `sys_permission` ( `name`, `pid`, `status`, `sort`, `value`, `type`, `create_time`, `uri`, `icon`) values
( '修改${prefix}', '47', '1', '0', '${moduleName}:${changeClassName}:update', '2', '2018-09-29 16:18:51', 'update${className}', null);
insert into `sys_permission` ( `name`, `pid`, `status`, `sort`, `value`, `type`, `create_time`, `uri`, `icon`) values
( '删除${prefix}', '47', '1', '0', '${moduleName}:${changeClassName}:delete', '2', '2018-09-29 16:18:51', 'delete${className}', null);
{
path: '${changeClassName}',
name: '${changeClassName}',
component: () => import('@/views/${moduleName}/${changeClassName}/index'),
meta: {title: '${prefix}列表', icon: 'product-list'}
},
{
path: 'add${className}',
name: 'add${className}',
component: () => import('@/views/${moduleName}/${changeClassName}/add'),
meta: {title: '添加${prefix}'},
hidden: true
},
{
path: 'update${className}',
name: 'update${className}',
component: () => import('@/views/${moduleName}/${changeClassName}/update'),
meta: {title: '编辑${prefix}'},
hidden: true
},

View File

@@ -0,0 +1,16 @@
<template> 
<${changeClassName}-detail :is-edit='false'>
</${changeClassName}-detail>
</template>
<script>
import ${className}Detail from './components/detail'
export default {
name: 'add${className}',
components: {${className}Detail}
}
</script>
<style>
</style>

View File

@@ -0,0 +1,38 @@
import request from '@/utils/request'
export function fetchList(params) {
return request({
url: '/${moduleName}/${changeClassName}/list',
method: 'get',
params: params
})
}
export function create${className}(data) {
return request({
url: '/${moduleName}/${changeClassName}/create',
method: 'post',
data: data
})
}
export function delete${className}(id) {
return request({
url: '/${moduleName}/${changeClassName}/delete/' + id,
method: 'get',
})
}
export function get${className}(id) {
return request({
url: '/${moduleName}/${changeClassName}/' + id,
method: 'get',
})
}
export function update${className}(id, data) {
return request({
url: '/${moduleName}/${changeClassName}/update/' + id,
method: 'post',
data: data
})
}

View File

@@ -0,0 +1,166 @@
<template> 
<el-card class="form-container" shadow="never">
<el-form :model="${changeClassName}" :rules="rules" ref="${className}From" label-width="150px">
<#if columns??>
<#list columns as column>
<el-form-item
label="<#if column.columnComment != ''>${column.columnComment}<#else>${column.changeColumnName}</#if>"
prop="${column.changeColumnName}">
<el-input v-model="${changeClassName}.${column.changeColumnName}" style="width: 370px;"/>
</el-form-item>
</#list>
</#if>
<el-form-item>
<el-button type="primary" @click="onSubmit('${className}From')">提交</el-button>
<el-button v-if="!isEdit" @click="resetForm('${className}From')">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</template>
<script>
import {create${className}, get${className}, update${className}} from '@/api/${moduleName}/${changeClassName}'
import SingleUpload from '@/components/Upload/singleUpload'
const default${className} = {
name: ''
};
export default {
name: '${className}Detail',
components: {SingleUpload},
props: {
isEdit: {
type: Boolean,
default: false
}
},
data() {
return {
${changeClassName}:
Object.assign({},
default${className}),
rules: {
name: [
{required: true, message: '请输入品牌名称', trigger: 'blur'},
{min: 2, max: 140, message: '长度在 2 到 140 个字符', trigger: 'blur'}
],
logo
:
[
{required: true, message: '请输入品牌logo', trigger: 'blur'}
],
sort
:
[
{type: 'number', message: '排序必须为数字'}
],
}
}
},
created() {
if (this.isEdit) {
get${className}(this.$route.query.id).then(response => {
this.${changeClassName} = response.data;
})
;
} else {
this.${changeClassName} = Object.assign({},
default${className})
;
}
},
methods: {
onSubmit(formName) {
this.$refs[formName].validate((valid) => {
if(valid) {
this.$confirm('是否提交数据', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
if(this.isEdit
)
{
update${className}(this.$route.query.id, this.${changeClassName}).then(response => {
if(response.code == 200
)
{
this.$refs[formName].resetFields();
this.$message({
message: '修改成功',
type: 'success',
duration: 1000
});
this.$router.back();
}
else
{
this.$message({
message: response.msg,
type: 'error',
duration: 1000
});
}
})
;
}
else
{
create${className}(this.${changeClassName}).then(response => {
if(response.code == 200
)
{
this.$refs[formName].resetFields();
this.${changeClassName} = Object.assign({},
default${className})
;
this.$message({
message: '提交成功',
type: 'success',
duration: 1000
});
this.$router.back();
}
else
{
this.$message({
message: response.msg,
type: 'error',
duration: 1000
});
}
})
;
}
})
;
} else {
this.$message({
message: '验证失败',
type: 'error',
duration: 1000
});
return false;
}
})
;
},
resetForm(formName) {
this.$refs[formName].resetFields();
this.${changeClassName} = Object.assign({},
default${className})
;
}
}
}
</script>
<style>
</style>

View File

@@ -0,0 +1,242 @@
<template> 
<div class="app-container">
<el-card class="filter-container" shadow="never">
<div>
<i class="el-icon-search"></i>
<span>筛选搜索</span>
<el-button
style="float: right"
@click="search${className}List()"
type="primary"
size="small">
查询结果
</el-button>
</div>
<div style="margin-top: 15px">
<el-form :inline="true" :model="listQuery" size="small" label-width="140px">
<el-form-item label="输入搜索:">
<el-input style="width: 203px" v-model="listQuery.keyword" placeholder="类型名称/关键字"></el-input>
</el-form-item>
</el-form>
</div>
</el-card>
<el-card class="operate-container" shadow="never">
<i class="el-icon-tickets"></i>
<span>数据列表</span>
<el-button
class="btn-add"
@click="add${className}()"
size="mini">
添加
</el-button>
</el-card>
<div class="table-container">
<el-table ref="${changeClassName}Table"
:data="list"
style="width: 100%"
@selection-change="handleSelectionChange"
v-loading="listLoading"
border>
<el-table-column type="selection" width="60" align="center"></el-table-column>
<#if columns??>
<#list columns as column>
<#if column.columnShow = 'true'>
<el-table-column prop="${column.changeColumnName}"
label="<#if column.columnComment != ''>${column.columnComment}<#else>${column.changeColumnName}</#if>">
<template slot-scope="scope">
{{scope.row.${column.changeColumnName} }}
</template>
</el-table-column>
</#if>
</#list>
</#if>
<el-table-column label="操作" width="200" align="center">
<template slot-scope="scope">
<el-button
size="mini"
@click="handleUpdate(scope.$index, scope.row)">编辑
</el-button>
<el-button
size="mini"
type="danger"
@click="handleDelete(scope.$index, scope.row)">删除
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="batch-operate-container">
</div>
<div class="pagination-container">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
layout="total, sizes,prev, pager, next,jumper"
:page-size="listQuery.pageSize"
:page-sizes="[5,10,15]"
:current-page.sync="listQuery.pageNum"
:total="total">
</el-pagination>
</div>
</div>
</template>
<script>
//将$都替换为$
import {fetchList, delete${className}} from '@/api/${moduleName}/${changeClassName}'
import {formatDate} from '@/utils/date';
export default {
name: '${changeClassName}List',
data() {
return {
operates: [],
operateType: null,
listQuery: {
keyword: null,
pageNum: 1,
pageSize: 10
},
list: null,
total: null,
listLoading: true,
multipleSelection: []
}
},
created() {
this.getList();
},
filters: {
formatCreateTime(time) {
let date = new Date(time);
return formatDate(date, 'yyyy-MM-dd hh:mm:ss')
},
formatStatus(value) {
if (value === 1) {
return '未开始';
} else if (value === 2) {
return '活动中';
} else if (value === 3) {
return '已结束';
} else if (value === 4) {
return '已失效';
}
},
},
methods: {
getList() {
this.listLoading = true;
fetchList(this.listQuery).then(response => {
this.listLoading = false;
this.list = response.data.records;
this.total = response.data.total;
this.totalPage = response.data.pages;
this.pageSize = response.data.size;
})
;
},
handleSelectionChange(val) {
this.multipleSelection = val;
},
handleUpdate(index, row) {
this.$router.push(
{path: '/${moduleName}/update${className}', query: {id: row.id}})
},
handleDelete(index, row) {
this.$confirm('是否要删除该类型', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
delete${className}(row.id
).
then(response => {
this.$message({
message: '删除成功',
type: 'success',
duration: 1000
});
this.getList();
})
;
})
;
},
handleSizeChange(val) {
this.listQuery.pageNum = 1;
this.listQuery.pageSize = val;
this.getList();
},
handleCurrentChange(val) {
this.listQuery.pageNum = val;
this.getList();
},
search${className}List() {
this.listQuery.pageNum = 1;
this.getList();
},
handleBatchOperate() {
console.log(this.multipleSelection);
if (this.multipleSelection < 1) {
this.$message({
message: '请选择一条记录',
type: 'warning',
duration: 1000
});
return;
}
let showStatus = 0;
if (this.operateType === 'show${className}') {
showStatus = 1;
} else if (this.operateType === 'hide${className}') {
showStatus = 0;
} else {
this.$message({
message: '请选择批量操作类型',
type: 'warning',
duration: 1000
});
return;
}
let ids = [];
for (let i = 0; i < this.multipleSelection.length; i++) {
ids.push(this.multipleSelection[i].id);
}
let data = new URLSearchParams();
data.append("ids", ids);
data.append("showStatus", showStatus);
updateShowStatus(data).then(response => {
this.getList();
this.$message({
message: '修改成功',
type: 'success',
duration: 1000
});
})
;
},
add${className}() {
//手动将router,改成$router
this.$router.push({path: '/${moduleName}/add${className}'})
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
</style>

View File

@@ -0,0 +1,41 @@
小程序、H5及安卓App
注册登录:获取昵称、头像,授权手机号注册登录;
业主认证:与后台业务手机号匹配则自动通过认证;
家庭成员或者租户绑定:注册绑定手机号后,选择房租户门号,提出申请,由业主审核通过后,通过认证;
首页:轮播图、导航(社区公告、在线报修、物业缴费、联系物业)、热门商品列表
社区公告:首次提示进入业主绑定,绑定后默认展示本社区的公告列表;
在线报修:首次提示进入业主绑定,绑定后默认进入填写报修的流程;
物业缴费:首次提示进入业主绑定,绑定后默认进入物业费缴纳界面;
联系物业:点击拨打物业客服电话
商品分类:商品分类展示,商品列表
购物车:加入购物车、删除购物车商品、商品结算
个人中心:个人信息、家庭成员(业主有此权限,对家庭成员及租户的账户进行添加绑定、审核、取消绑定等操作)、报修记录、缴费记录、我的订单(包括团购订单)、收货地址、客服电话
商品详情页:展示轮播图、基本信息、商品规格、商品详情等
商品购买:
支持立即购买、加入购物车,
支持优惠券(包括:满减、满赠等)
支持社群团购(按社区为单位的团购,单个社区购买人数达标即可成团,不成团自动退款)
订单结算:支持微信支付、银联云闪付、支持积分+现金的形式支付
后台管理
小区管理:对小区、楼/幢号、单元的管理,并可以设置小区所属的物业公司;
房屋导入:按照设置的小区、楼/幢号、单元、户号的Excel列表导入导出
业主管理对业主信息的管理并关联到房屋的户号支持Excel导入导出
报修管理:对业主报修的信息列表的查询,以及处理状态的管理;
缴费项目管理:对缴费项目的管理,支持自定义缴费项目,比如物业费、停车费、公共维修金等;
缴费优惠配置:对缴费赠送商城积分等的优惠设置;
缴费单导入按照Excel模板导入缴费单支持按照房屋面积自动计算费用生成缴费单
缴费记录管理:对住户的缴费记录的查询;
商品管理:商品的添加、编辑、上架、下架管理;
商品分类管理:商品分类的管理;
品牌管理:品牌信息的管理;
优惠券管理:对商城的优惠券的发布下发消费等的管理;
社群团购管理:对社群团购的发布,查看,统计等;
订单管理:订单管理,包括全部、代付款、代发货、待收货、已完成、已取消订单状态;
团购订单:对社群团购订单的管理;
售后管理:对退换货流程的审批及管理;
用户管理:对商城用户的管理;
角色管理:对系统角色的管理,可以给角色分配功能权限及数据权限;
菜单管理:对系统后台菜单的管理;
日志管理:对系统的操作日志,交易日志的管理;
物业公司管理:对物业公司基础信息进行管理,并可以设置物业公司所管辖的小区列表;
数据权限分级:数据权限按 超级管理员、物业公司管理员、小区管理员三个角色级别,小区管理员只能查看本小区的数据,包括本小区业主的订单;物业公司管理员可以看到所管辖小区的数据;超级管理员可以查看所有数据。物业公司可以开通小区的账户,并对小区进行整体的管理。

View File

@@ -0,0 +1,16 @@
<template> 
<${changeClassName}-detail :is-edit='true'>
</${changeClassName}-detail>
</template>
<script>
import ${className}Detail from './components/detail'
export default {
name: 'update${className}',
components: {${className}Detail}
}
</script>
<style>
</style>

View File

@@ -0,0 +1,36 @@
SELECT * FROM build_repair ;
SELECT * FROM build_type_price;
SELECT * FROM build_wuye_price;
SELECT * FROM build_wuye_company;
SELECT * FROM build_adv;
SELECT * FROM build_apply_room;
SELECT * FROM build_notice;
SELECT * FROM build_group;
SELECT * FROM build_group_member;
SELECT * FROM building_community;
SELECT * FROM building_floor;
SELECT * FROM building_unit;
SELECT * FROM building_room;
SELECT * FROM building_owner;
DELETE FROM build_repair ;
DELETE FROM build_type_price;
DELETE FROM build_wuye_price;
DELETE FROM build_wuye_company;
DELETE FROM build_adv;
DELETE FROM build_apply_room;
DELETE FROM build_notice;
DELETE FROM build_group;
DELETE FROM build_group_member;
DELETE FROM building_community;
DELETE FROM building_floor;
DELETE FROM building_unit;
DELETE FROM building_room;
DELETE FROM building_owner;
SELECT id,`name`,`status` from sys_store ;
update pms_product set store_id=6,store_name='北京耳机专卖' where store_name is null