Compare commits

...

12 Commits

Author SHA1 Message Date
zcc b42e546ad5 license: 更新许可证信息
6 months ago
zccbbg 20e3fff80d refactor: 优化项目展示
1 year ago
DataCall 9ee4f01157 替换小程序二维码
1 year ago
zccbbg f6b65aff41 docs: 公众号名称更改
1 year ago
wqy 9bdadd152e 广告接入
1 year ago
wqy 01f7e5c587 小程序码修改
1 year ago
zccbbg e19d2dbab1 订单页样式优化
1 year ago
zccbbg 0d68eb7a33 修复富文本编辑器文字重叠问题
2 years ago
zccbbg c92c94abb1 关闭tagsview
2 years ago
wqy 8093859c33 Merge remote-tracking branch 'origin/master'
2 years ago
zccbbg 451f857fac Merge remote-tracking branch 'origin/master'
2 years ago
zccbbg 003464aca3 更新readme
2 years ago

@ -5,8 +5,8 @@ VUE_APP_TITLE = 若依商城管理系统,开源免费,软件开发,微信小程
ENV = 'development' ENV = 'development'
# 若依管理系统/开发环境 # 若依管理系统/开发环境
#VUE_APP_BASE_API = 'https://mall.ichengle.top/api' VUE_APP_BASE_API = 'https://mall.ichengle.top/api'
VUE_APP_BASE_API = '/dev-api' #VUE_APP_BASE_API = '/dev-api'
# 路由懒加载 # 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true VUE_CLI_BABEL_TRANSPILE_MODULES = true

@ -1,21 +1,19 @@
MIT License # Open Source License
Copyright (c) 2022 Zhaochencheng ruoyi-mall is licensed under a modified version of the Apache License 2.0, with the following additional conditions:
Permission is hereby granted, free of charge, to any person obtaining a copy 1. ruoyi-mall may be utilized commercially, including as a backend service for other applications or as an application development platform for enterprises. Should the conditions below be met, a commercial license must be obtained from the producer:
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights a. Multi-tenant service: Unless explicitly authorized by ruoyi-mall in writing, you may not use the ruoyi-mall source code to operate a multi-tenant environment.
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is b. LOGO and copyright information: In the process of using ruoyi-mall's frontend, you may not remove or moruoyi-mall the LOGO or copyright information in the ruoyi-mall console or applications. This restriction is inapplicable to uses of ruoyi-mall that do not involve its frontend.
furnished to do so, subject to the following conditions: - Frontend Definition: For the purposes of this license, the "frontend" of ruoyi-mall includes all components located in the web/ directory when running ruoyi-mall from the raw source code, or the "web" image when running ruoyi-mall with Docker.
The above copyright notice and this permission notice shall be included in all 2. As a contributor, you should agree that:
copies or substantial portions of the Software.
a. The producer can adjust the open-source agreement to be more strict or relaxed as deemed necessary.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR b. Your contributed code may be used for commercial purposes, including but not limited to its cloud business operations.
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE Apart from the specific conditions mentioned above, all other rights and restrictions follow the Apache License 2.0. Detailed information about the Apache License 2.0 can be found at http://www.apache.org/licenses/LICENSE-2.0.
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, The interactive design of this product is protected by appearance patent.
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

@ -37,7 +37,6 @@ npm run build:prod
http://mall.ichengle.top http://mall.ichengle.top
### 小程序和h5 ### 小程序和h5
<img src="doc/小程序演示.jpg" width="200px"> <img src="doc/小程序演示.jpg" width="200px">
<img src="doc/快递小程序.jpg" width="200px">
<img src="doc/h5演示.png" width="200px"> <img src="doc/h5演示.png" width="200px">
## CSDN若依技术专栏 ## CSDN若依技术专栏

@ -85,4 +85,20 @@ export function viewStatistics(memberId){
}) })
} }
export function getMiniWechatImg(params){
return request({
url: `/ums/member/wechat/code`,
method: 'get',
params
})
}
export function judgeQrCode(params){
return request({
url: `/no-auth/verified/code`,
method: 'get',
params
})
}

@ -195,9 +195,6 @@ export default {
</script> </script>
<style> <style>
.ql-editor{
line-height: 0;
}
.editor, .ql-toolbar { .editor, .ql-toolbar {
white-space: pre-wrap !important; white-space: pre-wrap !important;
line-height: normal !important; line-height: normal !important;

@ -0,0 +1,70 @@
<template>
<el-dialog title="扫描解锁" :visible.sync="open" width="500px" append-to-body :close-on-click-modal="false">
<p>使用微信扫描下方二维码观看完广告获取验证码</p>
<p class="red f13">如果第一次扫码未弹出广告请重新扫码进入</p>
<div class="flex-center">
<el-image class="qr-code"
:src="'data:image/png;base64,'+ miniImg"
fit="fill"
></el-image>
<el-input v-model="qrCode" class="left-input"/>
<el-button @click="asyncOk" class="right-btn" type="primary" :disabled="!qrCode">提交</el-button>
</div>
</el-dialog>
</template>
<script>
import {getMiniWechatImg, judgeQrCode} from "@/api/ums/member";
import {mapGetters} from "vuex";
export default {
computed: {
...mapGetters(['roles'])
},
data() {
return {
open: false,
miniImg: null,
qrCode: null
}
},
methods: {
initMiniWechatImg() {
getMiniWechatImg({scene: 2}).then(res => {
this.miniImg = res.data
})
},
show() {
//
if (this.roles.includes("admin")) {
this.$emit("confirmOk", true)
return
}
this.initMiniWechatImg()
this.open = true
},
async asyncOk(){
const res = await judgeQrCode({code: this.qrCode}).then(res=>{
return res.data
})
if (res) {
this.open = false
} else {
this.$message.error('验证码错误')
}
this.$emit("confirmOk", res)
}
}
}
</script>
<style lang="stylus">
.qr-code
min-width 150px
height 150px
margin 20px 20px 20px 0
.left-input
.el-input__inner
border-radius 4px 0 0 4px !important
.right-btn
border-radius 0 4px 4px 0 !important
</style>

@ -5,14 +5,14 @@
<div :class="{hasTagsView:needTagsView,sidebarHide:sidebar.hide}" class="main-container"> <div :class="{hasTagsView:needTagsView,sidebarHide:sidebar.hide}" class="main-container">
<div :class="{'fixed-header':fixedHeader}"> <div :class="{'fixed-header':fixedHeader}">
<navbar /> <navbar />
<tags-view v-if="needTagsView" /> <!-- <tags-view v-if="needTagsView" />-->
</div> </div>
<app-main /> <app-main />
<right-panel> <right-panel>
<settings /> <settings />
</right-panel> </right-panel>
<div id="footer-global" :style="{left: !sidebar.opened ? '54px' : '200px'}"> <div id="footer-global" :style="{left: !sidebar.opened ? '54px' : '200px'}">
<p class="bolder-font large-tip">技术支持关注编写美好前微信公众号回复支持</p> <p class="bolder-font large-tip">技术支持关注序员诚哥微信公众号回复支持</p>
</div> </div>
</div> </div>
</div> </div>

@ -174,7 +174,8 @@ body
width 100% width 100%
.bolder-font .bolder-font
font-weight bolder font-weight bolder
.f13
font-size 13px
.large-tip .large-tip
font-size 16px font-size 16px
.dialog-form-two .dialog-form-two

@ -80,7 +80,7 @@
</el-dialog> </el-dialog>
<!-- 底部 --> <!-- 底部 -->
<div class="el-login-footer"> <div class="el-login-footer">
<span>Copyright © 2017-2023 ichengle.top 技术支持关注编写美好前微信公众号回复支持</span> <span>Copyright © 2017-2023 ichengle.top 技术支持关注序员诚哥微信公众号回复支持</span>
</div> </div>
</div> </div>
</template> </template>

@ -1,5 +1,6 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<div v-show="show">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="medium" class="ry_form"> <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="medium" class="ry_form">
<el-form-item label="申请状态" prop="status"> <el-form-item label="申请状态" prop="status">
<DictRadio v-model="queryParams.status" :radioData="dict.type.oms_aftersale_status" size="small" :show-all="'all'" @change="handleQuery"></DictRadio> <DictRadio v-model="queryParams.status" :radioData="dict.type.oms_aftersale_status" size="small" :show-all="'all'" @change="handleQuery"></DictRadio>
@ -33,7 +34,6 @@
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button> <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-table v-loading="loading" :data="omsAftersaleList" @selection-change="handleSelectionChange" border> <el-table v-loading="loading" :data="omsAftersaleList" @selection-change="handleSelectionChange" border>
<!-- <el-table-column type="selection" width="55" align="center" />--> <!-- <el-table-column type="selection" width="55" align="center" />-->
<el-table-column label="售后单号" prop="id" width="160"/> <el-table-column label="售后单号" prop="id" width="160"/>
@ -100,7 +100,6 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<InBody v-show="total>0"> <InBody v-show="total>0">
<pagination <pagination
:total="total" :total="total"
@ -109,6 +108,8 @@
@pagination="getList" @pagination="getList"
/> />
</InBody> </InBody>
</div>
<!-- <SeeAdsComponent ref="seeAdsComponentRef" v-if="!show" @confirmOk="confirmOk"/>-->
<!-- 拒绝对话框 --> <!-- 拒绝对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
@ -151,12 +152,15 @@ import {
viewLog viewLog
} from "@/api/oms/aftersale"; } from "@/api/oms/aftersale";
import dateUtil from '@/utils/DateUtil'; import dateUtil from '@/utils/DateUtil';
import SeeAdsComponent from "@/components/SeeAdsComponent.vue";
export default { export default {
name: "OmsAftersale", name: "OmsAftersale",
components: {SeeAdsComponent},
dicts: ["oms_aftersale_type", "oms_aftersale_status"], dicts: ["oms_aftersale_type", "oms_aftersale_status"],
data() { data() {
return { return {
show: true,
pickerOptions: { pickerOptions: {
shortcuts: dateUtil.getTimeShort2() shortcuts: dateUtil.getTimeShort2()
}, },
@ -222,6 +226,12 @@ export default {
this.getList(); this.getList();
}, },
methods: { methods: {
confirmOk(success) {
if (success) {
this.show = true
this.getList();
}
},
copy(data) { copy(data) {
let url = data; let url = data;
let oInput = document.createElement('input'); let oInput = document.createElement('input');

@ -130,13 +130,6 @@
<el-tag :type="getOrderStatusTag(scope.row.status)" style="margin-right: 10px"> <el-tag :type="getOrderStatusTag(scope.row.status)" style="margin-right: 10px">
{{ getOrderStatusText(scope.row.status) }} {{ getOrderStatusText(scope.row.status) }}
</el-tag> </el-tag>
<el-button
size="mini"
type="text"
@click="handleDelivery(scope.row)"
:disabled="scope.row.status !== 1 && scope.row.status !== 2 && scope.row.status !== 3"
>编辑
</el-button>
</div> </div>
<div v-if="scope.row.deliverySn">{{ scope.row.deliverySn }} <div v-if="scope.row.deliverySn">{{ scope.row.deliverySn }}
<el-link @click="copy(scope.row.deliverySn)" :underline="false"><i <el-link @click="copy(scope.row.deliverySn)" :underline="false"><i
@ -147,7 +140,7 @@
</el-table-column> </el-table-column>
<el-table-column label="订单编号/操作" class-name="small-padding fixed-width" width="220" fixed="right" > <el-table-column label="订单编号/操作" class-name="small-padding fixed-width" width="220" fixed="right" >
<template slot-scope="scope" > <template slot-scope="scope" >
<div> <div style="float: right">
{{ scope.row.orderSn }} {{ scope.row.orderSn }}
<!-- <el-link--> <!-- <el-link-->
<!-- size="mini"--> <!-- size="mini"-->
@ -157,6 +150,7 @@
<el-link @click="copy(scope.row.orderSn)" :underline="false"><i <el-link @click="copy(scope.row.orderSn)" :underline="false"><i
class="el-icon-document-copy el-icon--right"></i></el-link> class="el-icon-document-copy el-icon--right"></i></el-link>
</div> </div>
<div style="float: right">
<el-button <el-button
size="mini" size="mini"
type="text" type="text"
@ -178,6 +172,8 @@
:disabled="scope.row.status !== 1 && scope.row.status !== 2 && scope.row.status !== 3" :disabled="scope.row.status !== 1 && scope.row.status !== 2 && scope.row.status !== 3"
>发货 >发货
</el-button> </el-button>
</div>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>

@ -1,5 +1,6 @@
<template> <template>
<div class="app-container" v-if="show"> <div class="app-container">
<div v-show="show">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="medium" class="ry_form"> <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="medium" class="ry_form">
<el-form-item label="上架状态" prop="publishStatus"> <el-form-item label="上架状态" prop="publishStatus">
<DictRadio v-model="queryParams.publishStatus" @change="handleQuery" size="small" <DictRadio v-model="queryParams.publishStatus" @change="handleQuery" size="small"
@ -118,19 +119,24 @@
/> />
</InBody> </InBody>
</div> </div>
<!-- <SeeAdsComponent ref="seeAdsComponentRef" v-if="!show" @confirmOk="confirmOk"/>-->
</div>
</template> </template>
<script> <script>
import {delPmsProduct, listPmsProduct} from "@/api/pms/product"; import {delPmsProduct, listPmsProduct} from "@/api/pms/product";
import {isStarRepo} from "@/utils/is-star-plugin"; import {isStarRepo} from "@/utils/is-star-plugin";
import {mapGetters} from "vuex"; import {mapGetters} from "vuex";
import SeeAdsComponent from "@/components/SeeAdsComponent.vue";
export default { export default {
name: "PmsProduct", name: "PmsProduct",
components: {SeeAdsComponent},
dicts: ['pms_publish_status'], dicts: ['pms_publish_status'],
data() { data() {
return { return {
show: false, show: true,
// //
loading: true, loading: true,
// //
@ -169,17 +175,22 @@ export default {
}, },
}; };
}, },
async created() { created() {
const res = await isStarRepo('zccbbg', 'RuoYi-Mall', this.userId, 'https://mall.ichengle.top/pms/product', 'ruoyi-mall-商城', 'https://gitee.com/zccbbg/RuoYi-Mall')
this.show = res;
if (res) {
this.getList(); this.getList();
}
}, },
computed:{ computed:{
...mapGetters(['userId']), ...mapGetters(['userId']),
}, },
methods: { methods: {
async confirmOk(success) {
if (success) {
const res = await isStarRepo('zccbbg', 'RuoYi-Mall', this.userId, 'https://mall.ichengle.top/pms/product', 'ruoyi-mall-商城', 'https://gitee.com/zccbbg/RuoYi-Mall')
this.show = res;
if (res) {
this.getList();
}
}
},
/** 查询商品信息列表 */ /** 查询商品信息列表 */
getList() { getList() {
this.loading = true; this.loading = true;

@ -61,7 +61,7 @@
</el-form> </el-form>
<!-- 底部 --> <!-- 底部 -->
<div class="el-register-footer"> <div class="el-register-footer">
<span>Copyright © 2017-2023 ichengle.top 技术支持关注编写美好前微信公众号回复支持</span> <span>Copyright © 2017-2023 ichengle.top 技术支持关注序员诚哥微信公众号回复支持</span>
</div> </div>
</div> </div>
</template> </template>

@ -1,5 +1,6 @@
<template> <template>
<div class="app-container" v-if="show"> <div class="app-container">
<div v-show="show">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="medium" class="ry_form"> <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="medium" class="ry_form">
<el-form-item label="创建时间"> <el-form-item label="创建时间">
<el-date-picker <el-date-picker
@ -116,6 +117,8 @@
@pagination="getList" @pagination="getList"
/> />
</InBody> </InBody>
</div>
<SeeAdsComponent ref="seeAdsComponentRef" v-if="!show" @confirmOk="confirmOk"/>
<!-- 统计 --> <!-- 统计 -->
<el-dialog :title="statisticsObj.title" :visible.sync="statisticsObj.open" width="500px" append-to-body> <el-dialog :title="statisticsObj.title" :visible.sync="statisticsObj.open" width="500px" append-to-body>
<el-descriptions direction="vertical" :column="2" border> <el-descriptions direction="vertical" :column="2" border>
@ -151,9 +154,11 @@ import {
import dateUtil from '@/utils/DateUtil'; import dateUtil from '@/utils/DateUtil';
import {isStarRepo} from "@/utils/is-star-plugin"; import {isStarRepo} from "@/utils/is-star-plugin";
import {mapGetters} from "vuex"; import {mapGetters} from "vuex";
import SeeAdsComponent from "@/components/SeeAdsComponent.vue";
export default { export default {
name: "UmsMember", name: "UmsMember",
components: {SeeAdsComponent},
data() { data() {
return { return {
show: false, show: false,
@ -220,16 +225,23 @@ export default {
}; };
}, },
async created() { async created() {
this.$nextTick(()=>{
this.$refs.seeAdsComponentRef.show()
})
},
computed:{
...mapGetters(['userId']),
},
methods: {
async confirmOk(success) {
if (success) {
const res = await isStarRepo('zccbbg', 'RuoYi-Mall', this.userId, 'https://mall.ichengle.top/member/member', 'ruoyi-mall-商城', 'https://gitee.com/zccbbg/RuoYi-Mall') const res = await isStarRepo('zccbbg', 'RuoYi-Mall', this.userId, 'https://mall.ichengle.top/member/member', 'ruoyi-mall-商城', 'https://gitee.com/zccbbg/RuoYi-Mall')
this.show = res; this.show = res;
if (res) { if (res) {
this.getList(); this.getList();
} }
}
}, },
computed:{
...mapGetters(['userId']),
},
methods: {
showUpdateMark(record){ showUpdateMark(record){
this.remarkModal = { this.remarkModal = {
visible: true, visible: true,

Loading…
Cancel
Save