优化管理端商家端冗余以及配置内容。抽出公共主题颜色、站点标题等内容。分离config中api配置,修改商家发布中拖拽以及控制台出错的bug。

This commit is contained in:
lemon橪
2021-09-22 15:08:34 +08:00
parent 53cc6f46d1
commit 2037b57a5d
50 changed files with 393 additions and 861 deletions

View File

@@ -1,5 +1,5 @@
// 统一请求路径前缀在libs/axios.js中修改
import {getRequest, postRequest, putRequest, deleteRequest, importRequest, getRequestWithNoToken} from '@/libs/axios';
import {getRequest} from '@/libs/axios';
// 传给后台citycode 获取城市街道等id

View File

@@ -6,6 +6,6 @@ export const getChildRegion = (id) => {
};
// 点地图获取地址信息
export const getRegion = (parpams) => {
return getRequest(`${commonUrl}/common/region/region`, parpams);
export const getRegion = (params) => {
return getRequest(`${commonUrl}/common/region/region`, params);
};

View File

@@ -13,6 +13,14 @@ export default {
* 用来在菜单中显示文字
*/
useI18n: true,
/**
* @description 高德web端申请的api key
*/
aMapKey: "b440952723253aa9fe483e698057bf7d",
/**
* @description 官网地址
*/
website: "https://www.pickmall.cn",
/**
* @description 需要加载的插件
*/

View File

@@ -1,32 +0,0 @@
import axios from 'axios';
import { getDictData } from '@/api/index';
let dictUtil = {
};
// 获取常用的数据字典保存至vuex
dictUtil.initDictData = function (vm) {
// axios.get(getDictData + "sex").then(res => {
// if(res.success){
// vm.$store.commit("setSex", res.result);
// }
// });
// axios.get(getDictData + "message_type").then(res => {
// if(res.success){
// vm.$store.commit("setMessageType", res.result);
// }
// });
// axios.get(getDictData + "priority").then(res => {
// if(res.success){
// vm.$store.commit("setPriority", res.result);
// }
// });
// axios.get(getDictData + "leave_type").then(res => {
// if(res.success){
// vm.$store.commit("setLeaveType", res.result);
// }
// });
};
export default dictUtil;

View File

@@ -1,14 +0,0 @@
const hasPermission = {
install (Vue, options) {
Vue.directive('has', {
inserted (el, binding, vnode) {
let permTypes = vnode.context.$route.meta.permTypes;
if (permTypes&&!permTypes.includes(binding.value)) {
el.parentNode.removeChild(el);
}
}
});
}
};
export default hasPermission;

View File

@@ -1,16 +0,0 @@
import { getStore } from './storage';
const hasRole = {
install (Vue, options) {
Vue.directive('hasRole', {
inserted (el, binding) {
let roles = getStore("roles");
if (roles&&!roles.includes(binding.value)) {
el.parentNode.removeChild(el);
}
}
});
}
};
export default hasRole;

View File

@@ -1,82 +0,0 @@
// 导入表格模版数据
export const userColumns = [
{
title: "username",
key: "username"
},
{
title: "password",
key: "password"
},
{
title: "avatar",
key: "avatar"
},
{
title: "departmentId",
key: "departmentId"
},
{
title: "mobile",
key: "mobile"
},
{
title: "email",
key: "email"
},
{
title: "sex",
key: "sex"
},
{
title: "address",
key: "address"
},
{
title: "type",
key: "type"
},
{
title: "status",
key: "status"
},
{
title: "delFlag",
key: "delFlag"
},
{
title: "defaultRole",
key: "defaultRole"
}
]
export const userData = [
{
username: "【记得删除该说明行】唯一用户名不能为空",
password: "密码不能为空",
avatar: "头像图片链接",
departmentId: "部门表主键id",
email: "邮箱",
mobile: "手机",
sex: "性别 0(女) 1(男)",
address: "地址数据省市编号 请勿乱填",
type: "用户类型 0(普通用户) 1(管理员)",
status: "用户状态 0(正常) -1(禁用)",
delFlag: "删除标志 0(正常) 1(已删)",
defaultRole: "角色 0(不分配默认角色) 1(分配默认注册用户角色)"
},
{
username: "lili",
password: "123456",
avatar: "https://s1.ax1x.com/2018/05/19/CcdVQP.png",
departmentId: "40652338142121984",
email: "1012139570@qq.com",
sex: 1,
address: "[\"510000\",\"510100\",\"510104\"]",
mobile: "18782059038",
type: 0,
status: 0,
delFlag: 0,
defaultRole: 1
}
]

View File

@@ -1,100 +0,0 @@
var idTmr;
function getExplorer () {
var explorer = window.navigator.userAgent;
if (explorer.indexOf('MSIE') >= 0) {
// ie
return 'ie';
} else if (explorer.indexOf('Firefox') >= 0) {
// firefox
return 'Firefox';
} else if (explorer.indexOf('Chrome') >= 0) {
// Chrome
return 'Chrome';
} else if (explorer.indexOf('Opera') >= 0) {
// Opera
return 'Opera';
} else if (explorer.indexOf('Safari') >= 0) {
// Safari
return 'Safari';
};
};
function tranform (table, aId, name) {
let tableHead = table.$children[0].$el;
let tableBody = table.$children[1].$el;
let tableInnerHTML = '<thead><tr>';
if (table.$children.length !== 1) {
let len = tableBody.rows.length;
let i = -1;
while (i < len) {
if (i == -1) {
Array.from(tableHead.rows[0].children).forEach((td) => {
tableInnerHTML = tableInnerHTML + '<th>' + td.children[0].children[0].innerHTML + '</th>';
});
tableInnerHTML += '</tr><thead><tbody>';
} else {
tableInnerHTML += '<tr>';
Array.from(tableBody.rows[i].children).forEach((td) => {
tableInnerHTML = tableInnerHTML + '<td>' + td.children[0].children[0].innerHTML + '</td>';
});
tableInnerHTML += '</tr>';
}
i++;
}
tableInnerHTML += '</tbody>';
}
if (getExplorer() !== 'Safari' && name.substr(-1, 4) !== '.xls') {
name += '.xls';
}
if (getExplorer() == 'ie') {
var curTbl = table;
var oXL = new ActiveXObject('Excel.Application');
var oWB = oXL.Workbooks.Add();
var xlsheet = oWB.Worksheets(1);
var sel = document.body.createTextRange();
sel.moveToElementText(curTbl);
sel.select();
sel.execCommand('Copy');
xlsheet.Paste();
oXL.Visible = true;
try {
var fname = oXL.Application.GetSaveAsFilename('Excel.xls', 'Excel Spreadsheets (*.xls), *.xls');
} catch (e) {
print('Nested catch caught ' + e);
} finally {
oWB.SaveAs(fname);
// oWB.Close(savechanges = false);
oXL.Quit();
oXL = null;
idTmr = setInterval(Cleanup(), 1);
}
} else {
tableToExcel(tableInnerHTML, aId, name);
}
}
function Cleanup () {
window.clearInterval(idTmr);
// CollectGarbage();
}
let tableToExcel = (function () {
let uri = 'data:application/vnd.ms-excel;base64,';
let template = '<html><head><meta charset="UTF-8"></head><body><table>{table}</table></body></html>';
let base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))); };
let format = function (s, c) {
return s.replace(/{(\w+)}/g, function (m, p) { return c[p]; });
};
return function (table, aId, name) {
let ctx = {worksheet: name || 'Worksheet', table: table};
document.getElementById(aId).href = uri + base64(format(template, ctx));
document.getElementById(aId).download = name;
document.getElementById(aId).click();
};
})();
const table2excel = {};
table2excel.transform = tranform;
export default table2excel;

View File

@@ -19,7 +19,7 @@ import {
import { setStore, getStore, removeStore } from "@/libs/storage";
import util from "@/libs/util";
import dictUtil from "@/libs/dictUtil";
import VueLazyload from "vue-lazyload";
@@ -83,8 +83,7 @@ new Vue({
mounted() {
// 初始化菜单
util.initRouter(this);
// 初始化全局数据字典
dictUtil.initDictData(this);
this.currentPageName = this.$route.name;
// 显示打开的页面的列表
this.$store.commit("setOpenedList");

View File

@@ -125,20 +125,11 @@ li {
// 主题颜色
$success_color: #19be6b;
$warning_color: #ff9900;
$error_color: #ed3f14;
$theme_color: #ed3f14;
$border_color: #dddee1;
$title_color: #8c8c8c;
$light_title_color: #1c2438;
$light_content_color: #495060;
$light_sub_color: #80848f;
$light_background_color: #f8f8f9;
$light_white_background_color: #fff;
// 暗黑主题颜色
$dark_background_color: #141414;
$dark_sub_background_color: #1d1d1d; //稍微浅一点的
$dark_content_color: #d5d5d5;
$success_color: #68cabe;
$warning_color: #fa6419;
$error_color: #ff3c2a;
$theme_color: #FF5C58;
.theme_color {
color: $theme_color !important;
}
$bg_color: #f1f6fa;

View File

@@ -2,12 +2,6 @@
.operation {
margin-bottom: 2vh;
}
.select-count {
font-weight: 600;
color: #40a9ff;
}
.select-clear {
margin-left: 10px;
}

View File

@@ -1,7 +1,10 @@
@import "~view-design/src/styles/index.less";
// iview 自定义样式
@primary-color: #ed3f14;
@primary-color: #ff5c58;
@info-color: #fa6419;
@success-color: #68cabe;
@error-color: #ff3c2a;
@table-thead-bg: #f8f8f9;
@table-td-stripe-bg: #f8f8f9;
@table-td-hover-bg: #ededed;

View File

@@ -1,77 +1,32 @@
<template>
<div class="search">
<Card>
<Form
ref="searchForm"
:model="searchForm"
inline
:label-width="70"
class="search-form mb_10"
@keydown.enter.native="handleSearch"
>
<Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form mb_10"
@keydown.enter.native="handleSearch">
<Form-item label="商品名称" prop="goodsName">
<Input
type="text"
v-model="searchForm.goodsName"
placeholder="请输入商品名称"
clearable
style="width: 200px"
/>
<Input type="text" v-model="searchForm.goodsName" placeholder="请输入商品名称" clearable style="width: 200px" />
</Form-item>
<span v-if="drop">
<Form-item label="状态" prop="status">
<Select
v-model="searchForm.marketEnable"
placeholder="请选择"
clearable
style="width: 200px"
>
<Option value="DOWN">下架</Option>
<Option value="UPPER">上架</Option>
</Select>
</Form-item>
<Form-item label="商品编号" prop="sn">
<Input
type="text"
v-model="searchForm.sn"
placeholder="商品编号"
clearable
style="width: 200px"
/>
</Form-item>
</span>
<Form-item label="状态" prop="status">
<Select v-model="searchForm.marketEnable" placeholder="请选择" clearable style="width: 200px">
<Option value="DOWN">下架</Option>
<Option value="UPPER">上架</Option>
</Select>
</Form-item>
<Form-item label="商品编号" prop="sn">
<Input type="text" v-model="searchForm.sn" placeholder="商品编号" clearable style="width: 200px" />
</Form-item>
<Form-item style="margin-left: -35px" class="br">
<Button @click="handleSearch" type="primary" icon="ios-search"
>搜索</Button
>
<Button @click="handleReset">重置</Button>
<a class="drop-down" @click="dropDown">
{{ dropDownContent }}
<Icon :type="dropDownIcon"></Icon>
</a>
<Button @click="handleSearch" type="primary" icon="ios-search">搜索</Button>
</Form-item>
</Form>
<Table
:loading="loading"
border
:columns="columns"
:data="data"
ref="table"
class="mt_10"
></Table>
<Table :loading="loading" border :columns="columns" :data="data" ref="table" class="mt_10"></Table>
<Row type="flex" justify="end" class="mt_10">
<Page
:current="searchForm.pageNumber"
:total="total"
:page-size="searchForm.pageSize"
@on-change="changePage"
@on-page-size-change="changePageSize"
:page-size-opts="[10, 20, 50]"
size="small"
show-total
show-elevator
show-sizer
></Page>
<Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage"
@on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]" size="small" show-total show-elevator
show-sizer></Page>
</Row>
</Card>
</div>
@@ -85,22 +40,20 @@ export default {
data() {
return {
loading: true, // 表单加载状态
drop: false,
dropDownContent: "展开",
dropDownIcon: "ios-arrow-down",
searchForm: {
// 搜索框初始化对象
pageNumber: 1, // 当前页数
pageSize: 10, // 页面大小
sort: "create_time", // 默认排序字段
order: "desc", // 默认排序方式
saveType: "TEMPLATE"
saveType: "TEMPLATE",
},
columns: [ // 表头
columns: [
// 表头
{
title: "ID",
key: "id",
minWidth: 120
minWidth: 120,
},
{
title: "商品原图",
@@ -126,14 +79,17 @@ export default {
{
title: "商品名称",
key: "goodsName",
minWidth: 120
minWidth: 120,
},
{
title: "商品价格",
key: "price",
render: (h, params) => {
return h('div', this.$options.filters.unitPrice(params.row.price, '¥'))
}
return h(
"div",
this.$options.filters.unitPrice(params.row.price, "¥")
);
},
},
{
@@ -143,7 +99,7 @@ export default {
{
title: "创建时间",
key: "createTime",
minWidth: 120
minWidth: 120,
},
{
title: "操作",
@@ -187,7 +143,7 @@ export default {
},
},
"删除"
)
),
]);
},
},
@@ -197,15 +153,19 @@ export default {
};
},
methods: {
init() { // 初始化数据
init() {
// 初始化数据
this.getDataList();
},
// 编辑模板
editGoods(v) {
this.$router.push({ name: "goods-template-operation-edit", query: { draftId: v.id } })
this.$router.push({
name: "goods-template-operation-edit",
query: { draftId: v.id },
});
},
// 删除模板
removeDraft (id) {
removeDraft(id) {
let showType = "模版";
this.$Modal.confirm({
title: "确认审核",
@@ -246,17 +206,7 @@ export default {
// 重新加载数据
this.getDataList();
},
// 展开、收起搜索项
dropDown() {
if (this.drop) {
this.dropDownContent = "展开";
this.dropDownIcon = "ios-arrow-down";
} else {
this.dropDownContent = "收起";
this.dropDownIcon = "ios-arrow-up";
}
this.drop = !this.drop;
},
// 获取列表数据
getDataList() {
this.loading = true;
@@ -281,22 +231,4 @@ export default {
};
</script>
<style lang="scss" scoped>
.search {
.operation {
margin-bottom: 2vh;
}
.select-count {
font-weight: 600;
color: #40a9ff;
}
.select-clear {
margin-left: 10px;
}
.page {
margin-top: 2vh;
}
.drop-down {
margin-left: 5px;
}
}
</style>

View File

@@ -6,18 +6,20 @@
<Row style="flex-direction: column;">
<Form ref="usernameLoginForm" :model="form" :rules="rules" class="form">
<FormItem prop="username">
<Input v-model="form.username" prefix="ios-contact" size="large" clearable placeholder="请输入用户名" autocomplete="off" />
<Input v-model="form.username" prefix="ios-contact" size="large" clearable placeholder="请输入用户名"
autocomplete="off" />
</FormItem>
<FormItem prop="password">
<Input type="password" v-model="form.password" prefix="ios-lock" size="large" password placeholder="请输入密码" autocomplete="off" />
<Input type="password" v-model="form.password" prefix="ios-lock" size="large" password placeholder="请输入密码"
autocomplete="off" />
</FormItem>
</Form>
<Row>
<Button class="login-btn" type="primary" size="large" :loading="loading" @click="submitLogin" long>
<div class="login-btn" type="primary" size="large" :loading="loading" @click="submitLogin" long>
<span v-if="!loading">登录</span>
<span v-else>登录中</span>
</Button>
</div>
</Row>
</Row>
@@ -26,6 +28,8 @@
<verify ref="verify" class="verify-con" verifyType="LOGIN" @change="verifyChange"></verify>
</Col>
</Row>
</div>
</template>
@@ -152,33 +156,18 @@ export default {
};
</script>
<style lang="scss" scoped>
.row {
padding: 70px 50px;
border-radius: 0.8em;
}
.login {
height: 100%;
background: url("../assets/background.png") no-repeat;
background-size: 100%;
background-position-y: bottom;
background-color: #edf0f3;
background-color: #fff;
display: flex;
align-items: center;
justify-content: center;
.ivu-tabs-nav-container {
line-height: 2;
font-size: 17px;
box-sizing: border-box;
white-space: nowrap;
overflow: hidden;
position: relative;
zoom: 1;
}
/deep/ .ivu-row {
display: flex;
}
.verify-con {
position: absolute;
top: 126px;
@@ -187,40 +176,26 @@ export default {
}
.form {
padding-top: 1vh;
.input-verify {
width: 67%;
}
}
.forget-pass,
.other-way {
font-size: 14px;
}
.login-btn,
.other-login {
margin-top: 3vh;
}
.icons {
display: flex;
align-items: center;
}
.other-icon {
.login-btn {
background: linear-gradient(135deg, $theme_color 0%, $warning_color 100%);
height: 40px;
cursor: pointer;
margin-left: 10px;
border-radius: 4px;
display: flex;
align-items: center;
color: rgba(0, 0, 0, 0.2);
:hover {
color: #2d8cf0;
}
justify-content: center;
font-size: 16px;
color: #fff;
width: 100%;
text-align: center;
transition: 0.35s;
}
.login-btn:hover {
opacity: .9;
border-radius: 10px;
}
}
.flex {
justify-content: center;
}
</style>

View File

@@ -7,7 +7,7 @@
</Row>
<Row type="flex" justify="center" class="copyright">
Copyright © {{year}} - Present
<a :href="config.website" target="_blank" style="margin:0 5px;">{{config.title}}</a>
<a :href="config.website" class="href" target="_blank" style="margin:0 5px;">{{config.title}}</a>
</Row>
</div>
</template>
@@ -44,4 +44,5 @@ export default {
}
}
}
</style>

View File

@@ -255,20 +255,20 @@ export default {
z-index: 11000;
list-style-type: none;
border-radius: 4px;
box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, .1);
box-shadow: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04);
li {
margin: 0;
padding: 5px 15px;
cursor: pointer;
&:hover {
background: #eee;
background: rgba($color: $theme_color, $alpha: .1);
}
}
}
.ivu-tag-primary{
/deep/ .ivu-tag-dot-inner{
background: red !important;
background: $theme_color !important;
}
}

View File

@@ -31,10 +31,12 @@
<script>
import AMapLoader from "@amap/amap-jsapi-loader";
import { getRegion } from "@/api/common.js";
import config from '@/config'
export default {
name: "map",
data() {
return {
config,
showMap: false, // 地图显隐
mapSearch: "", // 地图搜索
map: null, // 初始化地图
@@ -71,7 +73,7 @@ export default {
},
init() {
AMapLoader.load({
key: "b440952723253aa9fe483e698057bf7d", // 申请好的Web端开发者Key首次调用 load 时必填
key: this.config.aMapKey, // 申请好的Web端开发者Key首次调用 load 时必填
version: "", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
plugins: [
"AMap.ToolBar",

View File

@@ -898,37 +898,9 @@ dl dt {
}
}
.flex-card {
display: flex;
height: 600px;
}
.card-item {
margin: 5px 0;
}
.flex-card-left {
flex: 4;
//background: #f8f8f8;
}
.flex-card-right {
flex: 6;
}
.search {
.operation {
margin-bottom: 2vh;
}
.select-count {
font-weight: 600;
color: #40a9ff;
}
.select-clear {
margin-left: 10px;
}
.div-item {
line-height: 35px;
@@ -944,15 +916,6 @@ dl dt {
}
}
.div-status-right {
margin-top: 20px;
margin-left: 30px;
font-size: 20px;
}
.page {
margin-top: 2vh;
}
button {
margin-left: 5px;
@@ -985,7 +948,7 @@ dl dt {
}
.flowPrice {
color: #cc0000;
color: $theme_color;
font-size: 22px;
}
}

View File

@@ -51,7 +51,7 @@
<template slot-scope="{ row }" slot="action">
<div class="row">
<Button
type="primary"
type="default"
size="small"
v-if="row.promotionStatus == 'NEW'"
@click="edit(row)"
@@ -75,7 +75,6 @@
type="error"
size="small"
v-if="row.promotionStatus != 'START'"
ghost
@click="remove(row)"
>删除</Button
>&nbsp;

View File

@@ -215,16 +215,5 @@ export default {
};
</script>
<style lang="scss" scoped>
.seckill {
.operation {
margin: 10px 0;
}
.select-count {
font-weight: 600;
color: #40a9ff;
}
.select-clear {
margin-left: 10px;
}
}
</style>

View File

@@ -127,7 +127,7 @@ export default {
form: {
// 添加或编辑表单对象初始化数据
storeAddressPath: "", // 店铺地址中文
center: "", // 经度 + 纬度
storeCenter: "", // 经度 + 纬度
longitude: "", //经度
latitude: "", //纬度
storeAddressDetail: "", //详细地址
@@ -194,7 +194,7 @@ export default {
this.form = res.result;
this.$set(this.form, "address", res.result.storeAddressPath);
this.storeName = res.result.storeName;
this.form.center = res.result.storeCenter;
this.form.storeCenter = res.result.storeCenter;
Cookies.set("userInfoSeller", JSON.stringify(res.result));
//库存预警数赋值
@@ -296,7 +296,7 @@ export default {
this.$set(this.form, "address", item.addr);
this.form.storeAddressPath = item.addr;
this.form.storeAddressIdPath = item.addrId;
this.form.center = item.position.lat + "," + item.position.lng;
this.form.storeCenter = item.position.lng + "," + item.position.lat
},
},
mounted() {