Compare commits

..

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

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

@ -1,19 +1,21 @@
# Open Source License
ruoyi-mall is licensed under a modified version of the Apache License 2.0, with the following additional conditions:
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:
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.
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.
- 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.
2. As a contributor, you should agree that:
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.
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.
The interactive design of this product is protected by appearance patent.
MIT License
Copyright (c) 2022 Zhaochencheng
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
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
### 小程序和h5
<img src="doc/小程序演示.jpg" width="200px">
<img src="doc/快递小程序.jpg" width="200px">
<img src="doc/h5演示.png" width="200px">
## 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>
<style>
.ql-editor{
line-height: 0;
}
.editor, .ql-toolbar {
white-space: pre-wrap !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="{'fixed-header':fixedHeader}">
<navbar />
<!-- <tags-view v-if="needTagsView" />-->
<tags-view v-if="needTagsView" />
</div>
<app-main />
<right-panel>
<settings />
</right-panel>
<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>

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

@ -148,7 +148,7 @@
<script>
import {str2Date} from '@/utils/date';
import PanelGroup from '@/views/components/PanelGroup'
import {mapGetters} from 'vuex'
import { mapGetters } from 'vuex'
import OrderLineChart from "@/views/dashboard/OrderLineChart.vue";
import TopProduct from "@/views/components/IndexOrderPanelGroup/TopProduct.vue";
import {memberAndCartStatistics, orderAndAftersaleStatistics} from "@/api/statistics";
@ -247,15 +247,15 @@ export default {
this.getData()
},
methods: {
handleDateChange() {
handleDateChange(){
this.getData();
},
initOrderCountDate() {
initOrderCountDate(){
let start = new Date();
start.setFullYear(2018, 10, 1);
const end = new Date();
end.setTime(start.getTime() + 1000 * 60 * 60 * 24 * 7);
this.orderCountDate = [start, end];
this.orderCountDate=[start,end];
},
getData(){
setTimeout(() => {

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

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

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

@ -1,6 +1,5 @@
<template>
<div class="app-container">
<div v-show="show">
<div class="app-container" v-if="show">
<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">
<DictRadio v-model="queryParams.publishStatus" @change="handleQuery" size="small"
@ -119,24 +118,19 @@
/>
</InBody>
</div>
<!-- <SeeAdsComponent ref="seeAdsComponentRef" v-if="!show" @confirmOk="confirmOk"/>-->
</div>
</template>
<script>
import {delPmsProduct, listPmsProduct} from "@/api/pms/product";
import {isStarRepo} from "@/utils/is-star-plugin";
import {mapGetters} from "vuex";
import SeeAdsComponent from "@/components/SeeAdsComponent.vue";
export default {
name: "PmsProduct",
components: {SeeAdsComponent},
dicts: ['pms_publish_status'],
data() {
return {
show: true,
show: false,
//
loading: true,
//
@ -175,22 +169,17 @@ export default {
},
};
},
created() {
this.getList();
},
computed:{
...mapGetters(['userId']),
},
methods: {
async confirmOk(success) {
if (success) {
async 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();
}
}
},
computed:{
...mapGetters(['userId']),
},
methods: {
/** 查询商品信息列表 */
getList() {
this.loading = true;

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

@ -1,6 +1,5 @@
<template>
<div class="app-container">
<div v-show="show">
<div class="app-container" v-if="show">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="medium" class="ry_form">
<el-form-item label="创建时间">
<el-date-picker
@ -16,14 +15,14 @@
end-placeholder="结束日期"
></el-date-picker>
</el-form-item>
<!-- <el-form-item label="账号启用状态">-->
<!-- <el-select v-model="queryParams.status" placeholder="请选择" :clearable="true" size="small">-->
<!-- <el-option label="禁用" value="0">-->
<!-- </el-option>-->
<!-- <el-option label="启用" value="1">-->
<!-- </el-option>-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="账号启用状态">-->
<!-- <el-select v-model="queryParams.status" placeholder="请选择" :clearable="true" size="small">-->
<!-- <el-option label="禁用" value="0">-->
<!-- </el-option>-->
<!-- <el-option label="启用" value="1">-->
<!-- </el-option>-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item label="昵称" prop="nickname">
<el-input
v-model.trim="queryParams.nickname"
@ -117,8 +116,6 @@
@pagination="getList"
/>
</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-descriptions direction="vertical" :column="2" border>
@ -154,11 +151,9 @@ import {
import dateUtil from '@/utils/DateUtil';
import {isStarRepo} from "@/utils/is-star-plugin";
import {mapGetters} from "vuex";
import SeeAdsComponent from "@/components/SeeAdsComponent.vue";
export default {
name: "UmsMember",
components: {SeeAdsComponent},
data() {
return {
show: false,
@ -225,23 +220,16 @@ export default {
};
},
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')
this.show = res;
if (res) {
this.getList();
}
}
},
computed:{
...mapGetters(['userId']),
},
methods: {
showUpdateMark(record){
this.remarkModal = {
visible: true,

Loading…
Cancel
Save