Compare commits

..

No commits in common. 'b42e546ad5302dcda846e017882bb6fce3563e1e' and '4d2a6296edfcef4cb6f884e4f21c1680f503c437' have entirely different histories.

@ -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,19 +1,21 @@
# Open Source License MIT License
ruoyi-mall is licensed under a modified version of the Apache License 2.0, with the following additional conditions: Copyright (c) 2022 Zhaochencheng
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: Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
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. in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
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. copies of the Software, and to permit persons to whom the Software is
- 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. furnished to do so, subject to the following conditions:
2. As a contributor, you should agree that: The above copyright notice and this permission notice shall be included in all
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.
b. Your contributed code may be used for commercial purposes, including but not limited to its cloud business operations. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
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. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
The interactive design of this product is protected by appearance patent. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

@ -37,6 +37,7 @@ 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,20 +85,4 @@ 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,6 +195,9 @@ 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;

@ -1,70 +0,0 @@
<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,8 +174,7 @@ 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,6 +1,5 @@
<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>
@ -34,6 +33,7 @@
<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,6 +100,7 @@
</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"
@ -108,8 +109,6 @@
@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>
@ -152,15 +151,12 @@ 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()
}, },
@ -226,12 +222,6 @@ 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,6 +130,13 @@
<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
@ -140,7 +147,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 style="float: right"> <div>
{{ scope.row.orderSn }} {{ scope.row.orderSn }}
<!-- <el-link--> <!-- <el-link-->
<!-- size="mini"--> <!-- size="mini"-->
@ -150,7 +157,6 @@
<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"
@ -172,8 +178,6 @@
: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,6 +1,5 @@
<template> <template>
<div class="app-container"> <div class="app-container" v-if="show">
<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"
@ -119,24 +118,19 @@
/> />
</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: true, show: false,
// //
loading: true, loading: true,
// //
@ -175,22 +169,17 @@ export default {
}, },
}; };
}, },
created() { async created() {
this.getList();
},
computed:{
...mapGetters(['userId']),
},
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') 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; this.show = res;
if (res) { if (res) {
this.getList(); this.getList();
} }
}
}, },
computed:{
...mapGetters(['userId']),
},
methods: {
/** 查询商品信息列表 */ /** 查询商品信息列表 */
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,6 +1,5 @@
<template> <template>
<div class="app-container"> <div class="app-container" v-if="show">
<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
@ -117,8 +116,6 @@
@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>
@ -154,11 +151,9 @@ 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,
@ -225,23 +220,16 @@ 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