diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index e6c6712314..a6192aad82 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -61,6 +61,52 @@ ruoyi-generator + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-security + + + + io.springboot.sms + aliyun-sms-spring-boot-starter + 2.0.2 + + + com.aliyun + aliyun-java-sdk-core + 4.6.2 + + + + com.aliyun + aliyun-java-sdk-dysmsapi + 2.2.1 + + + + com.baomidou + mybatis-plus-extension + 3.5.3.1 + + + + com.baomidou + mybatis-plus-boot-starter + 3.5.3.1 + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.5.2 + + diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml index bcfad3eae4..a8b82f79ee 100644 --- a/ruoyi-admin/src/main/resources/application-druid.yml +++ b/ruoyi-admin/src/main/resources/application-druid.yml @@ -6,9 +6,9 @@ spring: druid: # 主库数据源 master: - url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://localhost:3306/learn_center?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root - password: password + password: root # 从库数据源 slave: # 从数据源开关/默认关闭 diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 38326a1faf..4d702de318 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -16,7 +16,6 @@ - org.springframework @@ -125,6 +124,10 @@ javax.servlet javax.servlet-api + + org.projectlombok + lombok + diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java index c89692c299..6b42d1ff8c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java @@ -41,4 +41,24 @@ public class CacheConstants * 登录账户密码错误次数 redis key */ public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; + + //=============================================补充======================================================= + + /** + * 验证码前缀 + */ + public static final String DEFAULT_CODE_KEY = "DEFAULT_CODE_KEY:"; + + /** + * 验证码长度 + */ + public static final String CODE_SIZE = "4"; + /** + * 刷新 + */ + public static final String REFRESH_TOKEN = "refresh_token"; + /** + * 验证码有效期 + */ + public static final int CODE_TIME = 60; } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index bdb7199fe9..b614601b03 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -111,7 +111,8 @@ protected void configure(HttpSecurity httpSecurity) throws Exception // 过滤请求 .authorizeRequests() // 对于登录login 注册register 验证码captchaImage 允许匿名访问 - .antMatchers("/login", "/register", "/captchaImage").permitAll() + .antMatchers("/login", "/register", "/captchaImage","/api/mobile/{mobile}").permitAll() +// .antMatchers("/login", "/register", "/captchaImage").permitAll() // 静态资源,可匿名访问 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() diff --git a/ruoyi-ui/src/api/app/app.js b/ruoyi-ui/src/api/app/app.js new file mode 100644 index 0000000000..77519cc839 --- /dev/null +++ b/ruoyi-ui/src/api/app/app.js @@ -0,0 +1,61 @@ +/** + * app管理调用后台接口api + */ +// import request from "@/utils/request"; +import request from "@/utils/request-mock"; +import { parseStrEmpty } from "@/utils/ruoyi"; + +// 查询app列表 +export function listApp() { + return request({ + url: "/https/github.com/app/list", + method: "get", + }); +} + +// 查询app详细 +export function getApp(appId) { + return request({ + url: "/https/github.com/app/" + parseStrEmpty(appId), + method: "get", + }); +} + +// 新增app +export function addApp(data) { + return request({ + url: "/https/github.com/app", + method: "post", + data: data, + }); +} + +// 修改app +export function updateApp(data) { + return request({ + url: "/https/github.com/app", + method: "put", + data: data, + }); +} + +// 删除app +export function delApp(appId) { + return request({ + url: "/https/github.com/app/" + appId, + method: "delete", + }); +} + +// app状态修改 +export function changeAppStatus(appId, status) { + const data = { + appId, + status, + }; + return request({ + url: "/https/github.com/app/changeStatus", + method: "put", + data: data, + }); +} diff --git a/ruoyi-ui/src/api/app/product/category.js b/ruoyi-ui/src/api/app/product/category.js new file mode 100644 index 0000000000..0b1621a591 --- /dev/null +++ b/ruoyi-ui/src/api/app/product/category.js @@ -0,0 +1,49 @@ +/** + * 商品管理-分类管理 调用后台接口api + */ +// import request from "@/utils/request"; +import request from "@/utils/request-mock"; +import { parseStrEmpty } from "@/utils/ruoyi"; + +// 查询分类列表 +export function listCategory(query) { + return request({ + url: "/https/github.com/product/category/list", + method: "get", + params: query, + }); +} + +// 查询分类详细 +export function getCategory(id) { + return request({ + url: "/https/github.com/product/category/" + parseStrEmpty(id), + method: "get", + }); +} + +// 新增分类 +export function addCategory(data) { + return request({ + url: "/https/github.com/product/category", + method: "post", + data: data, + }); +} + +// 修改分类 +export function updateCategory(data) { + return request({ + url: "/https/github.com/product/category", + method: "put", + data: data, + }); +} + +// 删除分类 +export function delCategory(id) { + return request({ + url: "/https/github.com/product/category/" + id, + method: "delete", + }); +} diff --git a/ruoyi-ui/src/api/app/product/list.js b/ruoyi-ui/src/api/app/product/list.js new file mode 100644 index 0000000000..9dc7913af0 --- /dev/null +++ b/ruoyi-ui/src/api/app/product/list.js @@ -0,0 +1,49 @@ +/** + * 商品管理-商品列表 调用后台接口api + */ +// import request from "@/utils/request"; +import request from "@/utils/request-mock"; +import { parseStrEmpty } from "@/utils/ruoyi"; + +// 查询商品列表 +export function listProduct(query) { + return request({ + url: "/https/github.com/product/list", + method: "get", + params: query, + }); +} + +// 查询商品详细 +export function getProduct(id) { + return request({ + url: "/https/github.com/product/" + parseStrEmpty(id), + method: "get", + }); +} + +// 新增商品 +export function addProduct(data) { + return request({ + url: "/https/github.com/product", + method: "post", + data: data, + }); +} + +// 修改商品 +export function updateProduct(data) { + return request({ + url: "/https/github.com/product", + method: "put", + data: data, + }); +} + +// 删除商品 +export function delProduct(id) { + return request({ + url: "/https/github.com/product/" + id, + method: "delete", + }); +} diff --git a/ruoyi-ui/src/api/app/user.js b/ruoyi-ui/src/api/app/user.js new file mode 100644 index 0000000000..ea9621971a --- /dev/null +++ b/ruoyi-ui/src/api/app/user.js @@ -0,0 +1,70 @@ +/** + * app用户管理 调用后台接口api + */ +// import request from "@/utils/request"; +import request from "@/utils/request-mock"; +import { parseStrEmpty } from "@/utils/ruoyi"; + +// 查询用户列表 +export function listUser(query) { + return request({ + url: "/https/github.com/app/user/list", + method: "get", + params: query, + }); +} + +// 查询用户详细 +export function getUser(id) { + return request({ + url: "/https/github.com/app/user/" + parseStrEmpty(id), + method: "get", + }); +} + +// 新增用户 +export function addUser(data) { + return request({ + url: "/https/github.com/app/user", + method: "post", + data: data, + }); +} + +// 修改用户 +export function updateUser(data) { + return request({ + url: "/https/github.com/app/user", + method: "put", + data: data, + }); +} + +// 删除用户 +export function delUser(ids) { + return request({ + url: "/https/github.com/app/user/" + ids, + method: "delete", + }); +} + +// 重置密码 +export function resetUserPwd(ids) { + return request({ + url: "/https/github.com/app/user/resetPwd/" + ids, + method: "put", + }); +} + +// 用户状态修改 +export function changeUserStatus(id, status) { + const data = { + id, + status, + }; + return request({ + url: "/https/github.com/app/user/changeStatus", + method: "put", + data: data, + }); +} diff --git a/ruoyi-ui/src/assets/styles/custom.scss b/ruoyi-ui/src/assets/styles/custom.scss new file mode 100644 index 0000000000..a96e53a5c9 --- /dev/null +++ b/ruoyi-ui/src/assets/styles/custom.scss @@ -0,0 +1,65 @@ +/** 自定义样式 */ +body { + font-family: "Source Han Sans"; +} +.app-main { + background: #f9f9f9; +} + +.el-input { + width: 180px; +} + +.el-select .el-input { + width: 122px; +} + +.el-range-editor.el-input__inner { + width: 278px; +} + +.search-container, +.table-container { + background: #ffffff; + padding: 20px; + border-radius: 4px; +} + +.search-container { + margin-bottom: 20px; + padding-bottom: 2px; +} + +.table-container .toolbar { + margin-bottom: 10px; + display: flex; +} + +.table-container .toolbar .top-right-btn { + flex: 1; + text-align: right; + align-self: center; +} + +.table-container .el-table tbody tr { + height: 80px; +} + +.table-container .el-table { + border: 1px solid #c9c9c9; + border-radius: 4px; +} + +.table-container .danger-button { + color: #d20a0a; +} + +.el-dialog .el-form { + padding-left: 30px; + padding-right: 30px; +} + +.el-dialog .el-form .el-input, +.el-dialog .el-form .el-select { + width: 100%; +} diff --git a/ruoyi-ui/src/assets/styles/element-ui.scss b/ruoyi-ui/src/assets/styles/element-ui.scss index 363092a63e..feb26c6ed6 100644 --- a/ruoyi-ui/src/assets/styles/element-ui.scss +++ b/ruoyi-ui/src/assets/styles/element-ui.scss @@ -69,7 +69,7 @@ // dropdown .el-dropdown-menu { a { - display: block + display: block; } } @@ -89,4 +89,4 @@ > .el-submenu__title .el-submenu__icon-arrow { display: none; -} \ No newline at end of file +} diff --git a/ruoyi-ui/src/assets/styles/element-variables.scss b/ruoyi-ui/src/assets/styles/element-variables.scss index 5bf2fbb10c..952022978a 100644 --- a/ruoyi-ui/src/assets/styles/element-variables.scss +++ b/ruoyi-ui/src/assets/styles/element-variables.scss @@ -4,11 +4,16 @@ **/ /* theme color */ -$--color-primary: #1890ff; +$--color-primary: #3670f8; $--color-success: #13ce66; $--color-warning: #ffba00; $--color-danger: #ff4949; // $--color-info: #1E1E1E; +$--color-text-placeholder: #c6c6c6; + +// border +$--border-color-base: #979797; +$--border-color-hover: #696969; $--button-font-weight: 400; @@ -20,7 +25,7 @@ $--border-color-lighter: #e6ebf5; $--table-border: 1px solid #dfe6ec; /* icon font path, required */ -$--font-path: '~element-ui/lib/theme-chalk/fonts'; +$--font-path: "~element-ui/lib/theme-chalk/fonts"; @import "~element-ui/packages/theme-chalk/src/index"; diff --git a/ruoyi-ui/src/main.js b/ruoyi-ui/src/main.js index ebd94b9d8e..8cb912382a 100644 --- a/ruoyi-ui/src/main.js +++ b/ruoyi-ui/src/main.js @@ -1,67 +1,76 @@ -import Vue from 'vue' +import Vue from "vue"; -import Cookies from 'js-cookie' +import Cookies from "js-cookie"; -import Element from 'element-ui' -import './assets/styles/element-variables.scss' +import Element from "element-ui"; +import "./assets/styles/element-variables.scss"; -import '@/assets/styles/index.scss' // global css -import '@/assets/styles/ruoyi.scss' // ruoyi css -import App from './App' -import store from './store' -import router from './router' -import directive from './directive' // directive -import plugins from './plugins' // plugins -import { download } from '@/utils/request' +import "@/assets/styles/index.scss"; // global css +import "@/assets/styles/ruoyi.scss"; // ruoyi css +import "@/assets/styles/custom.scss"; // 自定义 css -import './assets/icons' // icon -import './permission' // permission control +import App from "./App"; +import store from "./store"; +import router from "./router"; +import directive from "./directive"; // directive +import plugins from "./plugins"; // plugins +import { download } from "@/utils/request"; + +import "./assets/icons"; // icon +import "./permission"; // permission control import { getDicts } from "@/api/system/dict/data"; import { getConfigKey } from "@/api/system/config"; -import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, handleTree } from "@/utils/ruoyi"; +import { + parseTime, + resetForm, + addDateRange, + selectDictLabel, + selectDictLabels, + handleTree, +} from "@/utils/ruoyi"; // 分页组件 import Pagination from "@/components/Pagination"; // 自定义表格工具组件 -import RightToolbar from "@/components/RightToolbar" +import RightToolbar from "@/components/RightToolbar"; // 富文本组件 -import Editor from "@/components/Editor" +import Editor from "@/components/Editor"; // 文件上传组件 -import FileUpload from "@/components/FileUpload" +import FileUpload from "@/components/FileUpload"; // 图片上传组件 -import ImageUpload from "@/components/ImageUpload" +import ImageUpload from "@/components/ImageUpload"; // 图片预览组件 -import ImagePreview from "@/components/ImagePreview" +import ImagePreview from "@/components/ImagePreview"; // 字典标签组件 -import DictTag from '@/components/DictTag' +import DictTag from "@/components/DictTag"; // 头部标签组件 -import VueMeta from 'vue-meta' +import VueMeta from "vue-meta"; // 字典数据组件 -import DictData from '@/components/DictData' +import DictData from "@/components/DictData"; // 全局方法挂载 -Vue.prototype.getDicts = getDicts -Vue.prototype.getConfigKey = getConfigKey -Vue.prototype.parseTime = parseTime -Vue.prototype.resetForm = resetForm -Vue.prototype.addDateRange = addDateRange -Vue.prototype.selectDictLabel = selectDictLabel -Vue.prototype.selectDictLabels = selectDictLabels -Vue.prototype.download = download -Vue.prototype.handleTree = handleTree +Vue.prototype.getDicts = getDicts; +Vue.prototype.getConfigKey = getConfigKey; +Vue.prototype.parseTime = parseTime; +Vue.prototype.resetForm = resetForm; +Vue.prototype.addDateRange = addDateRange; +Vue.prototype.selectDictLabel = selectDictLabel; +Vue.prototype.selectDictLabels = selectDictLabels; +Vue.prototype.download = download; +Vue.prototype.handleTree = handleTree; // 全局组件挂载 -Vue.component('DictTag', DictTag) -Vue.component('Pagination', Pagination) -Vue.component('RightToolbar', RightToolbar) -Vue.component('Editor', Editor) -Vue.component('FileUpload', FileUpload) -Vue.component('ImageUpload', ImageUpload) -Vue.component('ImagePreview', ImagePreview) +Vue.component("DictTag", DictTag); +Vue.component("Pagination", Pagination); +Vue.component("RightToolbar", RightToolbar); +Vue.component("Editor", Editor); +Vue.component("FileUpload", FileUpload); +Vue.component("ImageUpload", ImageUpload); +Vue.component("ImagePreview", ImagePreview); -Vue.use(directive) -Vue.use(plugins) -Vue.use(VueMeta) -DictData.install() +Vue.use(directive); +Vue.use(plugins); +Vue.use(VueMeta); +DictData.install(); /** * If you don't want to use mock-server @@ -73,14 +82,14 @@ DictData.install() */ Vue.use(Element, { - size: Cookies.get('size') || 'medium' // set element-ui default size -}) + size: Cookies.get("size") || "medium", // set element-ui default size +}); -Vue.config.productionTip = false +Vue.config.productionTip = false; new Vue({ - el: '#app', + el: "#app", router, store, - render: h => h(App) -}) + render: (h) => h(App), +}); diff --git a/ruoyi-ui/src/utils/request-mock.js b/ruoyi-ui/src/utils/request-mock.js new file mode 100644 index 0000000000..8e6e4054c5 --- /dev/null +++ b/ruoyi-ui/src/utils/request-mock.js @@ -0,0 +1,12 @@ +// 该js只作为mock使用,实际使用request.js +import axios from "axios"; + +const service = axios.create({ + baseURL: "https://yeahai.usemock.com", + timeout: 10000, +}); + +service.interceptors.response.use((res) => { + return res.data; +}); +export default service; diff --git a/ruoyi-ui/src/views/app/app/index.vue b/ruoyi-ui/src/views/app/app/index.vue new file mode 100644 index 0000000000..9772d063f3 --- /dev/null +++ b/ruoyi-ui/src/views/app/app/index.vue @@ -0,0 +1,241 @@ + + + + + + diff --git a/ruoyi-ui/src/views/app/product/category.vue b/ruoyi-ui/src/views/app/product/category.vue new file mode 100644 index 0000000000..850f3be1a4 --- /dev/null +++ b/ruoyi-ui/src/views/app/product/category.vue @@ -0,0 +1,317 @@ + + + + + + diff --git a/ruoyi-ui/src/views/app/product/list.vue b/ruoyi-ui/src/views/app/product/list.vue new file mode 100644 index 0000000000..de14acd408 --- /dev/null +++ b/ruoyi-ui/src/views/app/product/list.vue @@ -0,0 +1,437 @@ + + + + + + diff --git a/ruoyi-ui/src/views/app/user/index.vue b/ruoyi-ui/src/views/app/user/index.vue new file mode 100644 index 0000000000..0a1831ee90 --- /dev/null +++ b/ruoyi-ui/src/views/app/user/index.vue @@ -0,0 +1,462 @@ + + + + + + diff --git a/ruoyi-ui/src/views/app/user/userEdit.vue b/ruoyi-ui/src/views/app/user/userEdit.vue new file mode 100644 index 0000000000..b1f3eb4f99 --- /dev/null +++ b/ruoyi-ui/src/views/app/user/userEdit.vue @@ -0,0 +1,170 @@ + + + + + + diff --git a/ruoyi-ui/src/views/index.vue b/ruoyi-ui/src/views/index.vue index cb8ee7d36b..30f943aea3 100644 --- a/ruoyi-ui/src/views/index.vue +++ b/ruoyi-ui/src/views/index.vue @@ -1,109 +1,15 @@