团购配置:团购产品

huipay-h5
游梦婷 1 year ago
parent d7f4aae565
commit a289f94297
  1. 48
      Utils/groupBuying.js
  2. 21
      pages.json
  3. 6
      subpackages/groupBuyingConfiguration/groupBuyingConfiguration.vue
  4. 112
      subpackages/groupBuyingConfiguration/groupProduct/groupProduct.vue
  5. 826
      subpackages/groupBuyingConfiguration/groupProduct/groupProductAdd.vue
  6. 7
      subpackages/groupBuyingConfiguration/storeImg/storeImgAdd.vue
  7. 6
      subpackages/groupBuyingConfiguration/storeProduct/storeProduct.vue
  8. 6
      uni.scss
  9. 36
      uni_modules/uni-collapse/changelog.md
  10. 403
      uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue
  11. 147
      uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue
  12. 89
      uni_modules/uni-collapse/package.json
  13. 12
      uni_modules/uni-collapse/readme.md
  14. 8
      uni_modules/uni-scss/changelog.md
  15. 1
      uni_modules/uni-scss/index.scss
  16. 82
      uni_modules/uni-scss/package.json
  17. 4
      uni_modules/uni-scss/readme.md
  18. 7
      uni_modules/uni-scss/styles/index.scss
  19. 3
      uni_modules/uni-scss/styles/setting/_border.scss
  20. 66
      uni_modules/uni-scss/styles/setting/_color.scss
  21. 55
      uni_modules/uni-scss/styles/setting/_radius.scss
  22. 56
      uni_modules/uni-scss/styles/setting/_space.scss
  23. 167
      uni_modules/uni-scss/styles/setting/_styles.scss
  24. 24
      uni_modules/uni-scss/styles/setting/_text.scss
  25. 146
      uni_modules/uni-scss/styles/setting/_variables.scss
  26. 19
      uni_modules/uni-scss/styles/tools/functions.scss
  27. 31
      uni_modules/uni-scss/theme.scss
  28. 62
      uni_modules/uni-scss/variables.scss

@ -43,3 +43,51 @@ export const getStoreProductByList = params => {
export const getStoreProductById = params => {
return POST('GET', `${base}/storeProduct/getStoreProductById`, params).then(res => res.data);
}
/* =======团购产品================= */
// 新增配置团购基本内容
export const insertGroupContent = params => {
return POST('POST', `${base}/storeGroup/insertGroupContent`, params).then(res => res.data);
}
// 配置团购产品详情
export const editGroupContentDetail = params => {
return POST('POST', `${base}/storeGroup/editGroupContentDetail`, params).then(res => res.data);
}
//修改配置团购基本内容
export const editGroupContent = params => {
return POST('POST', `${base}/storeGroup/editGroupContent`, params).then(res => res.data);
}
//新增团购规则内容
export const insertGroupServeRule = params => {
return POST('POST', `${base}/storeGroup/insertGroupServeRule`, params).then(res => res.data);
}
//编辑团购规则内容
export const editGroupServeRule = params => {
return POST('POST', `${base}/storeGroup/editGroupServeRule`, params).then(res => res.data);
}
//删除团购产品详情单个产品
export const deleteGroupDetail = params => {
return POST('GET', `${base}/storeGroup/deleteGroupDetail`, params).then(res => res.data);
}
//上下架团购
export const upDownGroup = params => {
return POST('GET', `${base}/storeGroup/upDownGroup`, params).then(res => res.data);
}
//根据门店id 查询门店团购内容
export const getStoreGroupList = params => {
return POST('GET', `${base}/storeGroup/getStoreGroupList`, params).then(res => res.data);
}
//根据团购id 查询门店内容详情
export const getStoreGroupDetailList = params => {
return POST('GET', `${base}/storeGroup/getStoreGroupDetailList`, params).then(res => res.data);
}
//根据团购id查询门店规则内容
export const findGroupServeRuleByGroup = params => {
return POST('GET', `${base}/storeGroup/findGroupServeRuleByGroup`, params).then(res => res.data);
}

@ -586,9 +586,30 @@
"softinputNavBar": "none"
}
}
},{
"path":"groupBuyingConfiguration/groupProduct/groupProduct",
"style": {
"navigationBarTitleText": "团购产品",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false, //
"softinputNavBar": "none"
}
}
},{
"path":"groupBuyingConfiguration/groupProduct/groupProductAdd",
"style": {
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false, //
"softinputNavBar": "none"
}
}
}
]
}],
"globalStyle": {

@ -24,7 +24,11 @@
title: '门店产品',
url: './storeProduct/storeProduct',
img: '/static/img/home4.png'
},
},{
title: '团购产品',
url:'./groupProduct/groupProduct',
img: '/static/img/home4.png'
}
],
storeId:'',

@ -0,0 +1,112 @@
<template>
<view class="all-container pd-main backcor6 font15">
<view class=" width100 mart10">
<button class="btns " @click.stop="clickToAdd()">新增</button>
</view>
<view class="mart20 backcorfff">
<view class="dis-flex height40 bor-botm1">
<view class="flex-1 fotct fontwig6 " ></view>
<view class="flex-1 fotct fontwig6">名称</view>
<view class="flex-1 fotct fontwig6">价格</view>
<!-- <view class="flex-1 fotct fontwig6">规格</view> -->
<view class="flex-1 fotct fontwig6">有效期</view>
<view class="flex-1 fotct fontwig6">操作</view>
</view>
<view class="dis-flex bor-botm1 paddtop5 paddbotm5 " v-for="(item,index) in storeGroupList" :key="index">
<view class="flex-1 fotct">
<image :src="imgUrl+item.img" @click.stop="previewImage(imgUrl+item.img)" mode="aspectFit" class="width100 height60 verc"></image>
</view>
<view class="flex-1 fotct text1">{{item.name}}</view>
<view class="flex-1 fotct text1">{{item.price}}</view>
<view class="flex-1 fotct text1">{{item.validity}}</view>
<view class="flex-1 fotct fcor41c" @click.stop="clickToEdit(item)">编辑</view>
</view>
</view>
</view>
</template>
<script>
import {
getStoreGroupList
} from '@/Utils/groupBuying.js';
const app = getApp();
export default {
data(){
return{
imgUrl: app.globalData.imgUrl, //访
storeId:'',//id
storeGroupList:[],//
}
},
onLoad(options){
if(options.storeId){
this.storeId = options.storeId;
this.getStoreGroupList()
}
},
methods:{
clickToAdd(){
let that = this;
uni.navigateTo({
url:"./groupProductAdd?status=1&storeId="+that.storeId
})
},
clickToEdit(item){
let that = this;
uni.navigateTo({
url:"./groupProductAdd?status=2&id="+item.id+"&storeId="+that.storeId
})
},
// id
getStoreGroupList(){
let params={
storeId:this.storeId
}
uni.showLoading({
title:"加载中",
mask:true
})
getStoreGroupList(params).then(res=>{
uni.hideLoading();
if (res.return_code == '000000') {
if(res.return_data.length>0){
this.storeGroupList = res.return_data
}
}else{
uni.showToast({
title: res.return_msg,
icon: 'none',
duration: 2000
})
}
})
},
//
previewImage(img){
uni.previewImage({
current: 0,
indicator: "number",
loop: "true",
urls:[img]
})
},
}
}
</script>
<style lang="scss" scoped>
.btns {
width: 21%;
height: 35px;
line-height: 35px;
background-color: #0083f5;
color: #FFFFFF;
font-weight: bold;
font-size: 12px;
padding: 0px;
margin: 0 0 0 auto;
}
</style>

@ -0,0 +1,826 @@
<template>
<view>
<!-- 进度 -->
<view class="width100 height90 backcorfff">
<evan-steps :active="merchart-1" direction="horizontal" class="paddtop10">
<evan-step title="基本信息"></evan-step>
<evan-step title="产品详情"></evan-step>
<evan-step title="规则内容"></evan-step>
</evan-steps>
</view>
<!-- 审核状态回馈 -->
<view class="width100 line10 "></view>
<view class=" font18 " style="padding-bottom: 60px;">
<!-- 基本信息 -->
<view class="form-gorup backcorfff font15" v-if="merchart==1">
<view class="dis-flex marb10 bor-botm1">
<view class="group-title marRight10 fontwig6 padleft15 paddtright10 flex-s0">团购名称:
</view>
<input type="text" name="name" v-model.trim="productData.name" placeholder-class="corf6 font15"
class=" flex-1 " placeholder="请输入团购名称">
</view>
<view class="dis-flex marb10 bor-botm1">
<view class="group-title marRight10 fontwig6 padleft15 paddtright10 flex-s0">团购价格:
</view>
<input type="digit" name="name" v-model.trim="productData.price" placeholder-class="corf6 font15"
class=" flex-1 " placeholder="请输入团购价格(保留两位小数)">
</view>
<view class="dis-flex marb10 bor-botm1">
<view class="group-title marRight10 fontwig6 padleft15 paddtright10 flex-s0">使用时间:
</view>
<input type="text" name="name" v-model.trim="productData.serviceTime"
placeholder-class="corf6 font15" class=" flex-1 " placeholder="请输入使用时间">
</view>
<view class="dis-flex marb10 bor-botm1">
<view class="group-title marRight10 fontwig6 padleft15 paddtright10 flex-s0">有效期:
</view>
<input type="text" name="name" v-model.trim="productData.validity" placeholder-class="corf6 font15"
class=" flex-1 " placeholder="有效期">
</view>
<view class="dis-flex marb10 bor-botm1">
<view class="group-title marRight10 fontwig6 padleft15 paddtright10 flex-s0 self-top">团购限制:
</view>
<textarea :cursor-spacing="50" class="border-r flex-1 backcor6 paading10 marb10" :focus="false"
:disable-default-padding="false" v-model.trim="productData.astrict" placeholder="请输入限制"
placeholder-class="font15" :maxlength="999"></textarea>
</view>
<view class="dis-flex marb10 bor-botm1">
<view class="group-title marRight10 fontwig6 padleft15 paddtright10 flex-s0 self-top">团购图片:
</view>
<view class="imageUploadContainer flex-1">
<view class="imageUploadList">
<view class="imageItem" v-for="(item,index) in imgValue" :key="index">
<image :src="imgUrl+item" mode="aspectFill" @click="previewImage(imgUrl+item)"
:data-index="index"></image>
<view v-if="isShowDel" class="imageDel" @click="deleteImage(item)">x</view>
</view>
<view v-if="isShowAdd" class="imageUpload" @click="upload">+</view>
</view>
</view>
</view>
</view>
<!-- 产品详情 -->
<view class="form-gorup backcorfff font15" v-if="merchart==2">
<view class=" width100 mart10">
<button class="btns " @click.stop="clickToAdd()">新增</button>
</view>
<uni-collapse accordion>
<uni-collapse-item v-for="(item,index) in productDetailList" :key="index" :title="item.name">
<view class="content dis-flex flex-sp" v-for="(item2,index2) in item.list" :key="index2">
<view class="text">{{item2.productName}}</view>
<view class="text">{{item2.count}}</view>
</view>
</uni-collapse-item>
</uni-collapse>
</view>
<!-- 规则内容 -->
<view class="form-gorup backcorfff font15" v-if="merchart==3">
<view class=" marb10 ">
<view class="group-title marRight10 fontwig6 paddtright10 flex-s0 self-top">规则内容:
</view>
<textarea :cursor-spacing="50" class="border-r width100 backcor6 marb10 rule" :focus="false"
:disable-default-padding="false" v-model.trim="ruleData.content" placeholder="请输入规则内容"
placeholder-class="font15" :maxlength="999"></textarea>
</view>
</view>
<!-- 底部按钮 -->
<view class="footer-btn">
<button class="backcor89 fcorfff" @click="clickToSave" v-if="merchart!=2">保存</button>
<button v-if="(status==2&&merchart<3)||merchart==2" class="backcor89 fcorfff" @click="merchart++">下一步</button>
</view>
<!-- 新增 -->
<wybPopup ref="popup" @hide="hide()" zIndex="999" type="bottom" height="550" width="500" :scrollY="true"
radius="6" :showCloseIcon="true">
<view class="pop-contain pd-main">
<view class="pop-title fontwig6"><text>添加</text></view>
</view>
<view class="dis-flex bor-botmb paddbotm10 height40 mart10 backcorfff"
style="position: sticky;top: 50px; z-index: 999;" @click.stop>
<view class="group-title marRight10 fontwig6 padleft15 paddtright10 flex-s0">类目名称:
</view>
<input type="text" name="name" v-model.trim="productDetail.name" placeholder-class="corf6 font15"
class="fcor089 flex-1 pd-main " placeholder="请输入类目名称">
</view>
<!-- 门店产品列表 -->
<view class=" " v-if="productList.length>0" style="padding-bottom: 60px;">
<view class="dis-flex height40 ">
<view class="checkFlex fotct fontwig6"></view>
<view class="flex-1 fotct fontwig6">图片</view>
<view class="flex-1 fotct fontwig6">名称</view>
<view class="flex-1 fotct fontwig6">价格</view>
<view class="flex-1 fotct fontwig6">数量</view>
</view>
<checkbox-group @change="checkClick">
<view class="dis-flex paddtop5 paddbotm5 " v-for="(item,index) in productList" :key="index">
<view class="checkFlex fotct">
<checkbox @click.stop class=" checkContainer" color="#089bf5" :value="String(item.id)"
:checked="item.checkTag" />
</view>
<view class="flex-1 fotct">
<image :src="imgUrl+item.img" @click.stop="previewImage(imgUrl+item.img)"
mode="aspectFit" class="width100 height60 verc"></image>
</view>
<view class="flex-1 fotct">{{item.name}}</view>
<view class="flex-1 fotct ">{{item.price}}</view>
<view class="flex-1 fotct border-d1 "><input type="number" v-model.trim="item.countTag">
</view>
</view>
</checkbox-group>
<view class="footer-btn">
<button class="backcor89 fcorfff" @click="saveProductDetail">保存</button>
</view>
</view>
</wybPopup>
</view>
</view>
</template>
<script>
import EvanStep from '@/components/evan-steps/evan-step.vue';
import wybPopup from '@/components/wyb-popup/wyb-popup.vue'
import {
insertGroupContent,
editGroupContent,
getStoreProductByList,
editGroupContentDetail,
getStoreGroupDetailList,
insertGroupServeRule,
editGroupServeRule,
findGroupServeRuleByGroup,
} from '@/Utils/groupBuying.js';
const app = getApp();
export default {
data() {
return {
reqUrl: app.globalData.url, //
imgUrl: app.globalData.imgUrl, //访
status: '', //1. 2.
storeId: '', //id
merchart: 1, //
productData: { //
name: '', //
price: '', //
astrict: '', //
storeId: '', //id
img: '', //
serviceTime: '', //使
validity: '', //
},
imgValue: [],
/* 产品详情 */
groupId: '', //
productDetail: { //
groupId: '', //
name: '', //
details: [], //{} //
},
productDetailList:[],//
productList: [], //
productSelectIdList: [], //id
/* 规则内容 */
ruleData:{
groupId:'',
content:'',
}
}
},
computed: {
isShowDel() {
return true
},
isShowAdd() {
/* if(this.imgValue.length>=1){
return false
}else{
return true
} */
return true
},
},
onLoad(option) {
this.storeId = option.storeId;
this.productData.storeId = option.storeId;
this.status = option.status;
if (this.status == 1) {
uni.setNavigationBarTitle({
title: "添加团购产品"
})
} else {
uni.setNavigationBarTitle({
title: "编辑团购产品"
})
this.getStoreGroupDetailList();//
this.findGroupServeRuleByGroup();//
}
if (option.id) {
this.productData.id = option.id;
this.ruleData.id = option.id;
// this.getStoreProductById()
}
console.log(option, "=======")
},
components: {
EvanStep,
wybPopup
},
methods: {
validate() {
var reg = /(^[1-9](\d+)?(\.\d{1,2})?$)|(^0$)|(^\d\.\d{1,2}$)/;
if (!reg.test(this.productData.price) || this.productData.price == 0) {
uni.showToast({
title: "请输入正确的金额格式",
icon: "none"
})
this.productData.price = "";
return false
}
if (!this.productData.name || !this.productData.price || !this.productData.astrict || !this.productData
.serviceTime || !this.productData.validity) {
uni.showToast({
title: "请填写完整哦!",
icon: "none"
})
return false
}
if (this.imgValue.length == 0) {
uni.showToast({
title: "请选择图片上传",
icon: "none"
})
return false
}
return true
},
clickToSave() {
if (this.merchart == 1) {
/* 第一步:团购基本内容*/
if (!this.validate()) return; //
this.productData.img = this.imgValue.join("");
if (this.status == 1) { //1. 2.
this.insertGroupContent();
return
}
if (this.status == 2) {
this.editGroupContent();
return
}
}
if(this.merchart == 2){}
if(this.merchart==3){/* 第三步规则内容 */
if(!this.ruleData.content){
uni.showToast({
icon:'none',
title:'请输入规则内容'
})
return
}
if (this.status == 1) { //1. 2.
this.insertGroupServeRule();
return
}
if (this.status == 2) {
this.editGroupServeRule();
return
}
}
},
/* 新增配置团购基本内容 */
insertGroupContent() {
insertGroupContent(this.productData).then(res => {
let title;
if (res.return_code == '000000') {
this.groupId = res.return_data.id;
this.productDetail.groupId = res.return_data.id;
this.ruleData.groupId = res.return_data.id;
this.merchart = 2;
} else {
uni.showToast({
title: res.return_msg,
icon: 'none',
duration: 2000
})
}
})
},
/* 修改配置团购基本内容*/
editGroupContent() {
editGroupContent(this.productData).then(res => {
let title;
if (res.return_code == '000000') {
title = res.return_data;
} else {
title = res.return_msg;
}
uni.showToast({
title: title,
icon: 'none',
duration: 2000
})
this.merchart = 2;
})
},
//
deleteImage(data) {
let arr = this.imgValue.filter((item) => item != data);
this.imgValue = arr;
},
//
previewImage(img) {
uni.previewImage({
current: 0,
indicator: "number",
loop: "true",
urls: [img]
})
},
//
upload() {
let that = this;
uni.chooseImage({
count: 1,
sizeType: ['compressed'], //
sourceType: ['camera', 'album'],
success: function(res) {
const tempFilePaths = res.tempFilePaths;
that.uploadFile(tempFilePaths[0]);
},
error: function(e) {
console.log(e);
}
});
},
//
uploadFile(imgURL) {
const that = this;
uni.showLoading({
title:"加载中...",
mask:true,
})
uni.uploadFile({
url: that.reqUrl + '/fileUpload/uploadfile',
filePath: imgURL,
header: {
"Authorization": app.globalData.token
},
name: 'files',
success: function(uploadFileRes) {
uni.hideLoading()
that.getImgSignedUrl(JSON.parse(uploadFileRes.data)
.return_data);
},
fail:function(err){
uni.hideLoading()
uni.showToast({
title:err,
icon:'none'
})
}
});
},
//
getImgSignedUrl(item1) {
this.imgValue.push(item1);
console.log(this.imgValue, "this.imgValue")
},
//
hide() {
},
/* 查询产品详情列表 */
getStoreGroupDetailList(){
let params={
groupId:this.groupId
}
uni.showLoading({
title:"加载中"
})
getStoreGroupDetailList(params).then(res=>{
uni.hideLoading();
if (res.return_code == '000000') {
if(res.return_data.length>0){
this.productDetailList = res.return_data
}
}else{
uni.showToast({
title: res.return_msg,
icon: 'none',
duration: 2000
})
}
})
},
//
clickToAdd() {
this.getStoreProductByList();
// uni.navigateTo({
// url:"./groupProductDetailAdd"
// })
},
//
getStoreProductByList() {
let params = {
storeId: this.storeId,
}
uni.showLoading({
title: "加载中",
mask: true,
})
this.productList = [];
getStoreProductByList(params).then(res => {
uni.hideLoading();
if (res.return_code == '000000') {
this.productList = res.return_data;
this.productList.forEach(item => {
item.countTag = 1;
item.checkTag = false;
})
this.$refs.popup.show();
} else {
uni.showToast({
title: res.return_msg,
icon: 'none',
duration: 2000
})
}
})
},
/* 产品列表复选款 */
checkClick(e) {
this.productSelectIdList = e.detail.value;
console.log(this.productSelectIdList, "this.productSelectIdList")
},
/* 保存产品详情 */
saveProductDetail() {
if (!this.validateProductDetail()) return
let arr = [];
this.productSelectIdList.map(item => {
this.productList.map(item2 => {
if (item2.id == item) {
arr.push(item2)
}
});
});
let flag = arr.every(item => item.countTag >= 1);
if (!flag) {
uni.showToast({
icon: 'none',
title: "勾选产品的产品数量不能小于1"
})
return false
}
this.productDetail.details = arr.map(item => {
return {
productId: item.id,
count: item.countTag
}
});
this.editGroupContentDetail(this.productDetail)
},
validateProductDetail() {
if (!this.productDetail.name) {
uni.showToast({
icon: 'none',
title: "请输入类目名称!"
})
return false
}
if (this.productSelectIdList.length == 0) {
uni.showToast({
icon: 'none',
title: "请勾选产品!"
})
return false
}
return true
},
editGroupContentDetail(params) {
uni.showLoading({
title: "保存中..."
})
editGroupContentDetail(params).then(res => {
uni.hideLoading();
if (res.return_code == '000000') {
this.$refs.popup.close();
this.getStoreGroupDetailList();
} else {
uni.showToast({
title: res.return_msg,
icon: 'none',
duration: 2000
})
}
})
},
/* 团购规则 */
/* 新增团购规则 */
insertGroupServeRule(){
insertGroupServeRule(this.ruleData).then(res=>{
let title ;
if (res.return_code == '000000') {
title = res.return_data;
setTimeout(()=>{
uni.navigateBack();
},1000)
}else{
title = res.return_msg;
}
uni.showToast({
title: title,
icon: 'none',
duration: 2000
})
})
},
//
editGroupServeRule(){
editGroupServeRule(this.ruleData).then(res=>{
let title ;
if (res.return_code == '000000') {
title = res.return_data;
setTimeout(()=>{
uni.navigateBack();
},1000)
}else{
title = res.return_msg;
}
uni.showToast({
title: title,
icon: 'none',
duration: 2000
})
})
},
//id
findGroupServeRuleByGroup(){
let params={
groupId:this.groupId
}
uni.showLoading({
title:"加载中"
})
findGroupServeRuleByGroup(params).then(res=>{
uni.hideLoading();
if (res.return_code == '000000') {
console.log(res.return_data,"res.return_data")
}else{
uni.showToast({
title: res.return_msg,
icon: 'none',
duration: 2000
})
}
})
},
}
}
</script>
<style lang="scss" scoped>
.btns {
width: 21%;
height: 35px;
line-height: 35px;
background-color: #0083f5;
color: #FFFFFF;
font-weight: bold;
font-size: 12px;
padding: 0px;
margin: 0 0 0 auto;
}
/* 表单 */
.form-gorup {
padding: 20rpx;
margin-bottom: 20rpx;
border-radius: 20rpx;
input {
height: 40px;
line-height: 40px;
border-radius: 0;
box-sizing: border-box;
}
}
.form-gorup-title {
padding: 20rpx 0;
margin-bottom: 5rpx;
font-weight: 500;
width: 74px;
white-space: nowrap;
text-align: right;
}
/* 图片 */
.imageUploadContainer {
padding: 10upx 5upx;
margin: 10upx 5upx;
}
.name {
text-align: center;
margin-top: -30upx;
}
.dragging {
transform: scale(1.2)
}
.imageUploadList {
display: flex;
flex-wrap: wrap;
}
.imageItem,
.imageUpload {
width: 200upx;
height: 200upx;
margin: 30upx 15upx 30upx;
}
.imageDel {
position: relative;
left: 180upx;
bottom: 225upx;
background-color: rgba(0, 0, 0, 0.5);
width: 36upx;
text-align: center;
line-height: 35upx;
border-radius: 17upx;
color: white;
font-size: 30upx;
padding-bottom: 2upx;
}
.imageItem image,
.moveImage {
width: 200upx;
height: 200upx;
border-radius: 8upx;
}
.imageUpload {
line-height: 200upx;
text-align: center;
font-size: 150upx;
color: #D9D9D9;
border: 1px solid #D9D9D9;
border-radius: 8upx;
}
.moveImage {
position: absolute;
}
.uni-list {
width: 260px;
}
.popup_foot {
display: flex;
border-top: 1px #F9F9F9 solid;
line-height: 40px;
height: 40px;
margin-top: 30px;
}
.build_01 {
line-height: 35px;
}
.build_01 input {
background: #ededed;
}
.popup_foot_l {
width: 50%;
text-align: center;
}
.popup_foot_r {
width: 50%;
text-align: center;
border-left: 1px #F9F9F9 solid;
color: #5095D3;
}
/* 手风琴 */
.content {
padding: 15px;
background-color: #f4f4f4;
}
.text {
font-size: 14px;
color: #666;
line-height: 20px;
}
/* 弹窗 */
.pop-contain {
text-align: center;
padding-top: 50px;
background-color: #ffffff;
.pop-title {
text-align: center;
height: 50px;
line-height: 50px;
font-size: 18px;
position: fixed;
z-index: 10;
top: 0;
left: 0;
right: 0;
background: #ffffff;
}
}
.border-d1 {
/* #089bf5 */
border: 1px solid #f4f4f4;
margin: 5px;
}
//checkbox
.checkContainer {
width: 40px;
}
.checkFlex {
flex: 0.7;
}
.bor-botmb {
border-bottom: 1px solid #089bf5;
}
/* 规则内容 */
.rule{
margin-top: 10px;
padding:10px;
min-height: 400px;
box-sizing: border-box;
}
/* 底部按钮 */
.footer-btn {
position: fixed;
bottom: 0;
left: 0;
right: 0;
display: flex;
justify-content: center;
align-items: center;
button {
margin: 0 20px;
border-radius: 25px;
flex: 1;
height: 50px;
line-height: 50px;
}
}
</style>

@ -113,6 +113,9 @@
let title ;
if (res.return_code == '000000') {
title = res.return_data;
setTimeout(()=>{
uni.navigateBack();
},1000)
}else{
title = res.return_msg;
}
@ -121,9 +124,7 @@
icon: 'none',
duration: 2000
})
setTimeout(()=>{
uni.navigateBack();
},2000)
})
},

@ -48,6 +48,10 @@
<view class=" fotct fontwig6 backcor6 titleWidth minheight40">售卖数量</view>
<view class="flex-1 fotct ">{{productDetail.saleCount}}</view>
</view>
<view class="width100 dis-flex bor-botm1">
<view class=" fotct fontwig6 backcor6 titleWidth minheight40">创建时间</view>
<view class="flex-1 fotct ">{{productDetail.createTime | timeFormat}}</view>
</view>
<view class="width100 dis-flex ">
<view class=" fotct fontwig6 backcor6 titleWidth minheight80">图片</view>
<view class="flex-1 fotct ">
@ -63,8 +67,6 @@
</template>
<script>
import {getStoreProductByList,getStoreProductById
} from '@/Utils/groupBuying.js';
import wybPopup from '@/components/wyb-popup/wyb-popup.vue'

@ -810,3 +810,9 @@ $uni-font-size-paragraph:30upx;
.flex-s0{
flex-shrink: 0;
}
.self-top{
align-self: flex-start;
}
.self-end{
align-self: flex-end;
}

@ -0,0 +1,36 @@
## 1.4.3(2022-01-25)
- 修复 初始化的时候 ,open 属性失效的bug
## 1.4.2(2022-01-21)
- 修复 微信小程序resize后组件收起的bug
## 1.4.1(2021-11-22)
- 修复 vue3中个别scss变量无法找到的问题
## 1.4.0(2021-11-19)
- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-collapse](https://uniapp.dcloud.io/component/uniui/uni-collapse)
## 1.3.3(2021-08-17)
- 优化 show-arrow 属性默认为true
## 1.3.2(2021-08-17)
- 新增 show-arrow 属性,控制是否显示右侧箭头
## 1.3.1(2021-07-30)
- 优化 vue3下小程序事件警告的问题
## 1.3.0(2021-07-30)
- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
## 1.2.2(2021-07-21)
- 修复 由1.2.0版本引起的 change 事件返回 undefined 的Bug
## 1.2.1(2021-07-21)
- 优化 组件示例
## 1.2.0(2021-07-21)
- 新增 组件折叠动画
- 新增 value\v-model 属性 ,动态修改面板折叠状态
- 新增 title 插槽 ,可定义面板标题
- 新增 border 属性 ,显示隐藏面板内容分隔线
- 新增 title-border 属性 ,显示隐藏面板标题分隔线
- 修复 resize 方法失效的Bug
- 修复 change 事件返回参数不正确的Bug
- 优化 H5、App 平台自动更具内容更新高度,无需调用 reszie() 方法
## 1.1.7(2021-05-12)
- 新增 组件示例地址
## 1.1.6(2021-02-05)
- 优化 组件引用关系,通过uni_modules引用组件
## 1.1.5(2021-02-05)
- 调整为uni_modules目录规范

@ -0,0 +1,403 @@
<template>
<view class="uni-collapse-item">
<!-- onClick(!isOpen) -->
<view @click="onClick(!isOpen)" class="uni-collapse-item__title"
:class="{'is-open':isOpen &&titleBorder === 'auto' ,'uni-collapse-item-border':titleBorder !== 'none'}">
<view class="uni-collapse-item__title-wrap">
<slot name="title">
<view class="uni-collapse-item__title-box" :class="{'is-disabled':disabled}">
<image v-if="thumb" :src="thumb" class="uni-collapse-item__title-img" />
<text class="uni-collapse-item__title-text">{{ title }}</text>
</view>
</slot>
</view>
<view v-if="showArrow"
:class="{ 'uni-collapse-item__title-arrow-active': isOpen, 'uni-collapse-item--animation': showAnimation === true }"
class="uni-collapse-item__title-arrow">
<!-- <uni-icons :color="disabled?'#ddd':'#bbb'" size="14" type="bottom" /> -->
<view class="icon xia font15"></view>
</view>
</view>
<view class="uni-collapse-item__wrap" :class="{'is--transition':showAnimation}"
:style="{height: (isOpen?height:0) +'px'}">
<view :id="elId" ref="collapse--hook" class="uni-collapse-item__wrap-content"
:class="{open:isheight,'uni-collapse-item--border':border&&isOpen}">
<slot></slot>
</view>
</view>
</view>
</template>
<script>
// #ifdef APP-NVUE
const dom = weex.requireModule('dom')
// #endif
/**
* CollapseItem 折叠面板子组件
* @description 折叠面板子组件
* @property {String} title 标题文字
* @property {String} thumb 标题左侧缩略图
* @property {String} name 唯一标志符
* @property {Boolean} open = [true|false] 是否展开组件
* @property {Boolean} titleBorder = [true|false] 是否显示标题分隔线
* @property {Boolean} border = [true|false] 是否显示分隔线
* @property {Boolean} disabled = [true|false] 是否展开面板
* @property {Boolean} showAnimation = [true|false] 开启动画
* @property {Boolean} showArrow = [true|false] 是否显示右侧箭头
*/
export default {
name: 'uniCollapseItem',
props: {
//
title: {
type: String,
default: ''
},
name: {
type: [Number, String],
default: ''
},
//
disabled: {
type: Boolean,
default: false
},
// #ifdef APP-PLUS
// ,app
showAnimation: {
type: Boolean,
default: false
},
// #endif
// #ifndef APP-PLUS
//
showAnimation: {
type: Boolean,
default: true
},
// #endif
//
open: {
type: Boolean,
default: false
},
//
thumb: {
type: String,
default: ''
},
// 线
titleBorder: {
type: String,
default: 'auto'
},
border: {
type: Boolean,
default: true
},
showArrow: {
type: Boolean,
default: true
}
},
data() {
// TODO IDbug
const elId = `Uni_${Math.ceil(Math.random() * 10e5).toString(36)}`
return {
isOpen: false,
isheight: null,
height: 0,
elId,
nameSync: 0
}
},
watch: {
open(val) {
this.isOpen = val
this.onClick(val, 'init')
}
},
updated(e) {
this.$nextTick(() => {
this.init(true)
})
},
created() {
this.collapse = this.getCollapse()
this.oldHeight = 0
this.onClick(this.open, 'init')
},
// #ifndef VUE3
// TODO vue2
destroyed() {
if (this.__isUnmounted) return
this.uninstall()
},
// #endif
// #ifdef VUE3
// TODO vue3
unmounted() {
this.__isUnmounted = true
this.uninstall()
},
// #endif
mounted() {
if (!this.collapse) return
if (this.name !== '') {
this.nameSync = this.name
} else {
this.nameSync = this.collapse.childrens.length + ''
}
if (this.collapse.names.indexOf(this.nameSync) === -1) {
this.collapse.names.push(this.nameSync)
} else {
console.warn(`name 值 ${this.nameSync} 重复`);
}
if (this.collapse.childrens.indexOf(this) === -1) {
this.collapse.childrens.push(this)
}
this.init()
},
methods: {
init(type) {
// #ifndef APP-NVUE
this.getCollapseHeight(type)
// #endif
// #ifdef APP-NVUE
this.getNvueHwight(type)
// #endif
},
uninstall() {
if (this.collapse) {
this.collapse.childrens.forEach((item, index) => {
if (item === this) {
this.collapse.childrens.splice(index, 1)
}
})
this.collapse.names.forEach((item, index) => {
if (item === this.nameSync) {
this.collapse.names.splice(index, 1)
}
})
}
},
onClick(isOpen, type) {
if (this.disabled) return
this.isOpen = isOpen
if (this.isOpen && this.collapse) {
this.collapse.setAccordion(this)
}
if (type !== 'init') {
this.collapse.onChange(isOpen, this)
}
},
getCollapseHeight(type, index = 0) {
const views = uni.createSelectorQuery().in(this)
views
.select(`#${this.elId}`)
.fields({
size: true
}, data => {
// TODO
if (index >= 10) return
if (!data) {
index++
this.getCollapseHeight(false, index)
return
}
// #ifdef APP-NVUE
this.height = data.height + 1
// #endif
// #ifndef APP-NVUE
this.height = data.height
// #endif
this.isheight = true
if (type) return
this.onClick(this.isOpen, 'init')
})
.exec()
},
getNvueHwight(type) {
const result = dom.getComponentRect(this.$refs['collapse--hook'], option => {
if (option && option.result && option.size) {
// #ifdef APP-NVUE
this.height = option.size.height + 1
// #endif
// #ifndef APP-NVUE
this.height = option.size.height
// #endif
this.isheight = true
if (type) return
this.onClick(this.open, 'init')
}
})
},
/**
* 获取父元素实例
*/
getCollapse(name = 'uniCollapse') {
let parent = this.$parent;
let parentName = parent.$options.name;
while (parentName !== name) {
parent = parent.$parent;
if (!parent) return false;
parentName = parent.$options.name;
}
return parent;
}
}
}
</script>
<style lang="scss">
.uni-collapse-item {
/* #ifndef APP-NVUE */
box-sizing: border-box;
/* #endif */
&__title {
/* #ifndef APP-NVUE */
display: flex;
width: 100%;
box-sizing: border-box;
/* #endif */
flex-direction: row;
align-items: center;
transition: border-bottom-color .3s;
// transition-property: border-bottom-color;
// transition-duration: 5s;
&-wrap {
width: 100%;
flex: 1;
}
&-box {
padding: 0 15px;
/* #ifndef APP-NVUE */
display: flex;
width: 100%;
box-sizing: border-box;
/* #endif */
flex-direction: row;
justify-content: space-between;
align-items: center;
height: 48px;
line-height: 48px;
background-color: #fff;
color: #303133;
font-size: 13px;
font-weight: 500;
/* #ifdef H5 */
cursor: pointer;
outline: none;
/* #endif */
&.is-disabled {
.uni-collapse-item__title-text {
color: #999;
}
}
}
&.uni-collapse-item-border {
border-bottom: 1px solid #ebeef5;
}
&.is-open {
border-bottom-color: transparent;
}
&-img {
height: 22px;
width: 22px;
margin-right: 10px;
}
&-text {
flex: 1;
font-size: 14px;
/* #ifndef APP-NVUE */
white-space: nowrap;
color: inherit;
/* #endif */
/* #ifdef APP-NVUE */
lines: 1;
/* #endif */
overflow: hidden;
text-overflow: ellipsis;
}
&-arrow {
/* #ifndef APP-NVUE */
display: flex;
box-sizing: border-box;
/* #endif */
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
margin-right: 10px;
transform: rotate(0deg);
&-active {
transform: rotate(-180deg);
}
}
}
&__wrap {
/* #ifndef APP-NVUE */
will-change: height;
box-sizing: border-box;
/* #endif */
background-color: #fff;
overflow: hidden;
position: relative;
height: 0;
&.is--transition {
// transition: all 0.3s;
transition-property: height, border-bottom-width;
transition-duration: 0.3s;
/* #ifndef APP-NVUE */
will-change: height;
/* #endif */
}
&-content {
position: absolute;
font-size: 13px;
color: #303133;
// transition: height 0.3s;
border-bottom-color: transparent;
border-bottom-style: solid;
border-bottom-width: 0;
&.uni-collapse-item--border {
border-bottom-width: 1px;
border-bottom-color: red;
border-bottom-color: #ebeef5;
}
&.open {
position: relative;
}
}
}
&--animation {
transition-property: transform;
transition-duration: 0.3s;
transition-timing-function: ease;
}
}
</style>

@ -0,0 +1,147 @@
<template>
<view class="uni-collapse">
<slot />
</view>
</template>
<script>
/**
* Collapse 折叠面板
* @description 展示可以折叠 / 展开的内容区域
* @tutorial https://ext.dcloud.net.cn/plugin?id=23
* @property {String|Array} value 当前激活面板改变时触发(如果是手风琴模式参数类型为string否则为array)
* @property {Boolean} accordion = [true|false] 是否开启手风琴效果是否开启手风琴效果
* @event {Function} change 切换面板时触发如果是手风琴模式返回类型为string否则为array
*/
export default {
name: 'uniCollapse',
emits:['change','activeItem','input','update:modelValue'],
props: {
value: {
type: [String, Array],
default: ''
},
modelValue: {
type: [String, Array],
default: ''
},
accordion: {
//
type: [Boolean, String],
default: false
},
},
data() {
return {}
},
computed: {
// TODO vue2 vue3
dataValue() {
let value = (typeof this.value === 'string' && this.value === '') ||
(Array.isArray(this.value) && this.value.length === 0)
let modelValue = (typeof this.modelValue === 'string' && this.modelValue === '') ||
(Array.isArray(this.modelValue) && this.modelValue.length === 0)
if (value) {
return this.modelValue
}
if (modelValue) {
return this.value
}
return this.value
}
},
watch: {
dataValue(val) {
this.setOpen(val)
}
},
created() {
this.childrens = []
this.names = []
},
mounted() {
this.$nextTick(()=>{
this.setOpen(this.dataValue)
})
},
methods: {
setOpen(val) {
let str = typeof val === 'string'
let arr = Array.isArray(val)
this.childrens.forEach((vm, index) => {
if (str) {
if (val === vm.nameSync) {
if (!this.accordion) {
console.warn('accordion 属性为 false ,v-model 类型应该为 array')
return
}
vm.isOpen = true
}
}
if (arr) {
val.forEach(v => {
if (v === vm.nameSync) {
if (this.accordion) {
console.warn('accordion 属性为 true ,v-model 类型应该为 string')
return
}
vm.isOpen = true
}
})
}
})
this.emit(val)
},
setAccordion(self) {
if (!this.accordion) return
this.childrens.forEach((vm, index) => {
if (self !== vm) {
vm.isOpen = false
}
})
},
resize() {
this.childrens.forEach((vm, index) => {
// #ifndef APP-NVUE
vm.getCollapseHeight()
// #endif
// #ifdef APP-NVUE
vm.getNvueHwight()
// #endif
})
},
onChange(isOpen, self) {
let activeItem = []
if (this.accordion) {
activeItem = isOpen ? self.nameSync : ''
} else {
this.childrens.forEach((vm, index) => {
if (vm.isOpen) {
activeItem.push(vm.nameSync)
}
})
}
this.$emit('change', activeItem)
this.emit(activeItem)
},
emit(val){
this.$emit('input', val)
this.$emit('update:modelValue', val)
}
}
}
</script>
<style lang="scss" >
.uni-collapse {
/* #ifndef APP-NVUE */
width: 100%;
display: flex;
/* #endif */
/* #ifdef APP-NVUE */
flex: 1;
/* #endif */
flex-direction: column;
background-color: #fff;
}
</style>

@ -0,0 +1,89 @@
{
"id": "uni-collapse",
"displayName": "uni-collapse 折叠面板",
"version": "1.4.3",
"description": "Collapse 组件,可以折叠 / 展开的内容区域。",
"keywords": [
"uni-ui",
"折叠",
"折叠面板",
"手风琴"
],
"repository": "https://github.com/dcloudio/uni-ui",
"engines": {
"HBuilderX": ""
},
"directories": {
"example": "../../temps/example_temps"
},
"dcloudext": {
"category": [
"前端组件",
"通用组件"
],
"sale": {
"regular": {
"price": "0.00"
},
"sourcecode": {
"price": "0.00"
}
},
"contact": {
"qq": ""
},
"declaration": {
"ads": "无",
"data": "无",
"permissions": "无"
},
"npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
},
"uni_modules": {
"dependencies": [
"uni-scss",
"uni-icons"
],
"encrypt": [],
"platforms": {
"cloud": {
"tcb": "y",
"aliyun": "y"
},
"client": {
"App": {
"app-vue": "y",
"app-nvue": "y"
},
"H5-mobile": {
"Safari": "y",
"Android Browser": "y",
"微信浏览器(Android)": "y",
"QQ浏览器(Android)": "y"
},
"H5-pc": {
"Chrome": "y",
"IE": "y",
"Edge": "y",
"Firefox": "y",
"Safari": "y"
},
"小程序": {
"微信": "y",
"阿里": "y",
"百度": "y",
"字节跳动": "y",
"QQ": "y"
},
"快应用": {
"华为": "u",
"联盟": "u"
},
"Vue": {
"vue2": "y",
"vue3": "y"
}
}
}
}
}

@ -0,0 +1,12 @@
## Collapse 折叠面板
> **组件名:uni-collapse**
> 代码块: `uCollapse`
> 关联组件:`uni-collapse-item`、`uni-icons`。
折叠面板用来折叠/显示过长的内容或者是列表。通常是在多内容分类项使用,折叠不重要的内容,显示重要内容。点击可以展开折叠部分。
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-collapse)
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839

@ -0,0 +1,8 @@
## 1.0.3(2022-01-21)
- 优化 组件示例
## 1.0.2(2021-11-22)
- 修复 / 符号在 vue 不同版本兼容问题引起的报错问题
## 1.0.1(2021-11-22)
- 修复 vue3中scss语法兼容问题
## 1.0.0(2021-11-18)
- init

@ -0,0 +1 @@
@import './styles/index.scss';

@ -0,0 +1,82 @@
{
"id": "uni-scss",
"displayName": "uni-scss 辅助样式",
"version": "1.0.3",
"description": "uni-sass是uni-ui提供的一套全局样式 ,通过一些简单的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。",
"keywords": [
"uni-scss",
"uni-ui",
"辅助样式"
],
"repository": "https://github.com/dcloudio/uni-ui",
"engines": {
"HBuilderX": "^3.1.0"
},
"dcloudext": {
"category": [
"JS SDK",
"通用 SDK"
],
"sale": {
"regular": {
"price": "0.00"
},
"sourcecode": {
"price": "0.00"
}
},
"contact": {
"qq": ""
},
"declaration": {
"ads": "无",
"data": "无",
"permissions": "无"
},
"npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
},
"uni_modules": {
"dependencies": [],
"encrypt": [],
"platforms": {
"cloud": {
"tcb": "y",
"aliyun": "y"
},
"client": {
"App": {
"app-vue": "y",
"app-nvue": "u"
},
"H5-mobile": {
"Safari": "y",
"Android Browser": "y",
"微信浏览器(Android)": "y",
"QQ浏览器(Android)": "y"
},
"H5-pc": {
"Chrome": "y",
"IE": "y",
"Edge": "y",
"Firefox": "y",
"Safari": "y"
},
"小程序": {
"微信": "y",
"阿里": "y",
"百度": "y",
"字节跳动": "y",
"QQ": "y"
},
"快应用": {
"华为": "n",
"联盟": "n"
},
"Vue": {
"vue2": "y",
"vue3": "y"
}
}
}
}
}

@ -0,0 +1,4 @@
`uni-sass``uni-ui`提供的一套全局样式 ,通过一些简单的类名和`sass`变量,实现简单的页面布局操作,比如颜色、边距、圆角等。
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass)
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839

@ -0,0 +1,7 @@
@import './setting/_variables.scss';
@import './setting/_border.scss';
@import './setting/_color.scss';
@import './setting/_space.scss';
@import './setting/_radius.scss';
@import './setting/_text.scss';
@import './setting/_styles.scss';

@ -0,0 +1,3 @@
.uni-border {
border: 1px $uni-border-1 solid;
}

@ -0,0 +1,66 @@
// TODO 暂时不需要 class 需要用户使用变量实现 如果使用类名其实并不推荐
// @mixin get-styles($k,$c) {
// @if $k == size or $k == weight{
// font-#{$k}:#{$c}
// }@else{
// #{$k}:#{$c}
// }
// }
$uni-ui-color:(
// 主色
primary: $uni-primary,
primary-disable: $uni-primary-disable,
primary-light: $uni-primary-light,
// 辅助色
success: $uni-success,
success-disable: $uni-success-disable,
success-light: $uni-success-light,
warning: $uni-warning,
warning-disable: $uni-warning-disable,
warning-light: $uni-warning-light,
error: $uni-error,
error-disable: $uni-error-disable,
error-light: $uni-error-light,
info: $uni-info,
info-disable: $uni-info-disable,
info-light: $uni-info-light,
// 中性色
main-color: $uni-main-color,
base-color: $uni-base-color,
secondary-color: $uni-secondary-color,
extra-color: $uni-extra-color,
// 背景色
bg-color: $uni-bg-color,
// 边框颜色
border-1: $uni-border-1,
border-2: $uni-border-2,
border-3: $uni-border-3,
border-4: $uni-border-4,
// 黑色
black:$uni-black,
// 白色
white:$uni-white,
// 透明
transparent:$uni-transparent
) !default;
@each $key, $child in $uni-ui-color {
.uni-#{"" + $key} {
color: $child;
}
.uni-#{"" + $key}-bg {
background-color: $child;
}
}
.uni-shadow-sm {
box-shadow: $uni-shadow-sm;
}
.uni-shadow-base {
box-shadow: $uni-shadow-base;
}
.uni-shadow-lg {
box-shadow: $uni-shadow-lg;
}
.uni-mask {
background-color:$uni-mask;
}

@ -0,0 +1,55 @@
@mixin radius($r,$d:null ,$important: false){
$radius-value:map-get($uni-radius, $r) if($important, !important, null);
// Key exists within the $uni-radius variable
@if (map-has-key($uni-radius, $r) and $d){
@if $d == t {
border-top-left-radius:$radius-value;
border-top-right-radius:$radius-value;
}@else if $d == r {
border-top-right-radius:$radius-value;
border-bottom-right-radius:$radius-value;
}@else if $d == b {
border-bottom-left-radius:$radius-value;
border-bottom-right-radius:$radius-value;
}@else if $d == l {
border-top-left-radius:$radius-value;
border-bottom-left-radius:$radius-value;
}@else if $d == tl {
border-top-left-radius:$radius-value;
}@else if $d == tr {
border-top-right-radius:$radius-value;
}@else if $d == br {
border-bottom-right-radius:$radius-value;
}@else if $d == bl {
border-bottom-left-radius:$radius-value;
}
}@else{
border-radius:$radius-value;
}
}
@each $key, $child in $uni-radius {
@if($key){
.uni-radius-#{"" + $key} {
@include radius($key)
}
}@else{
.uni-radius {
@include radius($key)
}
}
}
@each $direction in t, r, b, l,tl, tr, br, bl {
@each $key, $child in $uni-radius {
@if($key){
.uni-radius-#{"" + $direction}-#{"" + $key} {
@include radius($key,$direction,false)
}
}@else{
.uni-radius-#{$direction} {
@include radius($key,$direction,false)
}
}
}
}

@ -0,0 +1,56 @@
@mixin fn($space,$direction,$size,$n) {
@if $n {
#{$space}-#{$direction}: #{$size*$uni-space-root}px
} @else {
#{$space}-#{$direction}: #{-$size*$uni-space-root}px
}
}
@mixin get-styles($direction,$i,$space,$n){
@if $direction == t {
@include fn($space, top,$i,$n);
}
@if $direction == r {
@include fn($space, right,$i,$n);
}
@if $direction == b {
@include fn($space, bottom,$i,$n);
}
@if $direction == l {
@include fn($space, left,$i,$n);
}
@if $direction == x {
@include fn($space, left,$i,$n);
@include fn($space, right,$i,$n);
}
@if $direction == y {
@include fn($space, top,$i,$n);
@include fn($space, bottom,$i,$n);
}
@if $direction == a {
@if $n {
#{$space}:#{$i*$uni-space-root}px;
} @else {
#{$space}:#{-$i*$uni-space-root}px;
}
}
}
@each $orientation in m,p {
$space: margin;
@if $orientation == m {
$space: margin;
} @else {
$space: padding;
}
@for $i from 0 through 16 {
@each $direction in t, r, b, l, x, y, a {
.uni-#{$orientation}#{$direction}-#{$i} {
@include get-styles($direction,$i,$space,true);
}
.uni-#{$orientation}#{$direction}-n#{$i} {
@include get-styles($direction,$i,$space,false);
}
}
}
}

@ -0,0 +1,167 @@
/* #ifndef APP-NVUE */
$-color-white:#fff;
$-color-black:#000;
@mixin base-style($color) {
color: #fff;
background-color: $color;
border-color: mix($-color-black, $color, 8%);
&:not([hover-class]):active {
background: mix($-color-black, $color, 10%);
border-color: mix($-color-black, $color, 20%);
color: $-color-white;
outline: none;
}
}
@mixin is-color($color) {
@include base-style($color);
&[loading] {
@include base-style($color);
&::before {
margin-right:5px;
}
}
&[disabled] {
&,
&[loading],
&:not([hover-class]):active {
color: $-color-white;
border-color: mix(darken($color,10%), $-color-white);
background-color: mix($color, $-color-white);
}
}
}
@mixin base-plain-style($color) {
color:$color;
background-color: mix($-color-white, $color, 90%);
border-color: mix($-color-white, $color, 70%);
&:not([hover-class]):active {
background: mix($-color-white, $color, 80%);
color: $color;
outline: none;
border-color: mix($-color-white, $color, 50%);
}
}
@mixin is-plain($color){
&[plain] {
@include base-plain-style($color);
&[loading] {
@include base-plain-style($color);
&::before {
margin-right:5px;
}
}
&[disabled] {
&,
&:active {
color: mix($-color-white, $color, 40%);
background-color: mix($-color-white, $color, 90%);
border-color: mix($-color-white, $color, 80%);
}
}
}
}
.uni-btn {
margin: 5px;
color: #393939;
border:1px solid #ccc;
font-size: 16px;
font-weight: 200;
background-color: #F9F9F9;
// TODO 暂时处理边框隐藏一边的问题
overflow: visible;
&::after{
border: none;
}
&:not([type]),&[type=default] {
color: #999;
&[loading] {
background: none;
&::before {
margin-right:5px;
}
}
&[disabled]{
color: mix($-color-white, #999, 60%);
&,
&[loading],
&:active {
color: mix($-color-white, #999, 60%);
background-color: mix($-color-white,$-color-black , 98%);
border-color: mix($-color-white, #999, 85%);
}
}
&[plain] {
color: #999;
background: none;
border-color: $uni-border-1;
&:not([hover-class]):active {
background: none;
color: mix($-color-white, $-color-black, 80%);
border-color: mix($-color-white, $-color-black, 90%);
outline: none;
}
&[disabled]{
&,
&[loading],
&:active {
background: none;
color: mix($-color-white, #999, 60%);
border-color: mix($-color-white, #999, 85%);
}
}
}
}
&:not([hover-class]):active {
color: mix($-color-white, $-color-black, 50%);
}
&[size=mini] {
font-size: 16px;
font-weight: 200;
border-radius: 8px;
}
&.uni-btn-small {
font-size: 14px;
}
&.uni-btn-mini {
font-size: 12px;
}
&.uni-btn-radius {
border-radius: 999px;
}
&[type=primary] {
@include is-color($uni-primary);
@include is-plain($uni-primary)
}
&[type=success] {
@include is-color($uni-success);
@include is-plain($uni-success)
}
&[type=error] {
@include is-color($uni-error);
@include is-plain($uni-error)
}
&[type=warning] {
@include is-color($uni-warning);
@include is-plain($uni-warning)
}
&[type=info] {
@include is-color($uni-info);
@include is-plain($uni-info)
}
}
/* #endif */

@ -0,0 +1,24 @@
@mixin get-styles($k,$c) {
@if $k == size or $k == weight{
font-#{$k}:#{$c}
}@else{
#{$k}:#{$c}
}
}
@each $key, $child in $uni-headings {
/* #ifndef APP-NVUE */
.uni-#{$key} {
@each $k, $c in $child {
@include get-styles($k,$c)
}
}
/* #endif */
/* #ifdef APP-NVUE */
.container .uni-#{$key} {
@each $k, $c in $child {
@include get-styles($k,$c)
}
}
/* #endif */
}

@ -0,0 +1,146 @@
// @use "sass:math";
@import '../tools/functions.scss';
// 间距基础倍数
$uni-space-root: 2 !default;
// 边框半径默认值
$uni-radius-root:5px !default;
$uni-radius: () !default;
// 边框半径断点
$uni-radius: map-deep-merge(
(
0: 0,
// TODO 当前版本暂时不支持 sm 属性
// 'sm': math.div($uni-radius-root, 2),
null: $uni-radius-root,
'lg': $uni-radius-root * 2,
'xl': $uni-radius-root * 6,
'pill': 9999px,
'circle': 50%
),
$uni-radius
);
// 字体家族
$body-font-family: 'Roboto', sans-serif !default;
// 文本
$heading-font-family: $body-font-family !default;
$uni-headings: () !default;
$letterSpacing: -0.01562em;
$uni-headings: map-deep-merge(
(
'h1': (
size: 32px,
weight: 300,
line-height: 50px,
// letter-spacing:-0.01562em
),
'h2': (
size: 28px,
weight: 300,
line-height: 40px,
// letter-spacing: -0.00833em
),
'h3': (
size: 24px,
weight: 400,
line-height: 32px,
// letter-spacing: normal
),
'h4': (
size: 20px,
weight: 400,
line-height: 30px,
// letter-spacing: 0.00735em
),
'h5': (
size: 16px,
weight: 400,
line-height: 24px,
// letter-spacing: normal
),
'h6': (
size: 14px,
weight: 500,
line-height: 18px,
// letter-spacing: 0.0125em
),
'subtitle': (
size: 12px,
weight: 400,
line-height: 20px,
// letter-spacing: 0.00937em
),
'body': (
font-size: 14px,
font-weight: 400,
line-height: 22px,
// letter-spacing: 0.03125em
),
'caption': (
'size': 12px,
'weight': 400,
'line-height': 20px,
// 'letter-spacing': 0.03333em,
// 'text-transform': false
)
),
$uni-headings
);
// 主色
$uni-primary: #2979ff !default;
$uni-primary-disable:lighten($uni-primary,20%) !default;
$uni-primary-light: lighten($uni-primary,25%) !default;
// 辅助色
// 除了主色外的场景色需要在不同的场景中使用例如危险色表示危险的操作
$uni-success: #18bc37 !default;
$uni-success-disable:lighten($uni-success,20%) !default;
$uni-success-light: lighten($uni-success,25%) !default;
$uni-warning: #f3a73f !default;
$uni-warning-disable:lighten($uni-warning,20%) !default;
$uni-warning-light: lighten($uni-warning,25%) !default;
$uni-error: #e43d33 !default;
$uni-error-disable:lighten($uni-error,20%) !default;
$uni-error-light: lighten($uni-error,25%) !default;
$uni-info: #8f939c !default;
$uni-info-disable:lighten($uni-info,20%) !default;
$uni-info-light: lighten($uni-info,25%) !default;
// 中性色
// 中性色用于文本背景和边框颜色通过运用不同的中性色来表现层次结构
$uni-main-color: #3a3a3a !default; // 主要文字
$uni-base-color: #6a6a6a !default; // 常规文字
$uni-secondary-color: #909399 !default; // 次要文字
$uni-extra-color: #c7c7c7 !default; // 辅助说明
// 边框颜色
$uni-border-1: #F0F0F0 !default;
$uni-border-2: #EDEDED !default;
$uni-border-3: #DCDCDC !default;
$uni-border-4: #B9B9B9 !default;
// 常规色
$uni-black: #000000 !default;
$uni-white: #ffffff !default;
$uni-transparent: rgba($color: #000000, $alpha: 0) !default;
// 背景色
$uni-bg-color: #f7f7f7 !default;
/* 水平间距 */
$uni-spacing-sm: 8px !default;
$uni-spacing-base: 15px !default;
$uni-spacing-lg: 30px !default;
// 阴影
$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default;
$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default;
$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default;
// 蒙版
$uni-mask: rgba($color: #000000, $alpha: 0.4) !default;

@ -0,0 +1,19 @@
// 合并 map
@function map-deep-merge($parent-map, $child-map){
$result: $parent-map;
@each $key, $child in $child-map {
$parent-has-key: map-has-key($result, $key);
$parent-value: map-get($result, $key);
$parent-type: type-of($parent-value);
$child-type: type-of($child);
$parent-is-map: $parent-type == map;
$child-is-map: $child-type == map;
@if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){
$result: map-merge($result, ( $key: $child ));
}@else {
$result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) ));
}
}
@return $result;
};

@ -0,0 +1,31 @@
// 间距基础倍数
$uni-space-root: 2;
// 边框半径默认值
$uni-radius-root:5px;
// 主色
$uni-primary: #2979ff;
// 辅助色
$uni-success: #4cd964;
// 警告色
$uni-warning: #f0ad4e;
// 错误色
$uni-error: #dd524d;
// 描述色
$uni-info: #909399;
// 中性色
$uni-main-color: #303133;
$uni-base-color: #606266;
$uni-secondary-color: #909399;
$uni-extra-color: #C0C4CC;
// 背景色
$uni-bg-color: #f5f5f5;
// 边框颜色
$uni-border-1: #DCDFE6;
$uni-border-2: #E4E7ED;
$uni-border-3: #EBEEF5;
$uni-border-4: #F2F6FC;
// 常规色
$uni-black: #000000;
$uni-white: #ffffff;
$uni-transparent: rgba($color: #000000, $alpha: 0);

@ -0,0 +1,62 @@
@import './styles/setting/_variables.scss';
// 间距基础倍数
$uni-space-root: 2;
// 边框半径默认值
$uni-radius-root:5px;
// 主色
$uni-primary: #2979ff;
$uni-primary-disable:mix(#fff,$uni-primary,50%);
$uni-primary-light: mix(#fff,$uni-primary,80%);
// 辅助色
// 除了主色外的场景色需要在不同的场景中使用例如危险色表示危险的操作
$uni-success: #18bc37;
$uni-success-disable:mix(#fff,$uni-success,50%);
$uni-success-light: mix(#fff,$uni-success,80%);
$uni-warning: #f3a73f;
$uni-warning-disable:mix(#fff,$uni-warning,50%);
$uni-warning-light: mix(#fff,$uni-warning,80%);
$uni-error: #e43d33;
$uni-error-disable:mix(#fff,$uni-error,50%);
$uni-error-light: mix(#fff,$uni-error,80%);
$uni-info: #8f939c;
$uni-info-disable:mix(#fff,$uni-info,50%);
$uni-info-light: mix(#fff,$uni-info,80%);
// 中性色
// 中性色用于文本背景和边框颜色通过运用不同的中性色来表现层次结构
$uni-main-color: #3a3a3a; // 主要文字
$uni-base-color: #6a6a6a; // 常规文字
$uni-secondary-color: #909399; // 次要文字
$uni-extra-color: #c7c7c7; // 辅助说明
// 边框颜色
$uni-border-1: #F0F0F0;
$uni-border-2: #EDEDED;
$uni-border-3: #DCDCDC;
$uni-border-4: #B9B9B9;
// 常规色
$uni-black: #000000;
$uni-white: #ffffff;
$uni-transparent: rgba($color: #000000, $alpha: 0);
// 背景色
$uni-bg-color: #f7f7f7;
/* 水平间距 */
$uni-spacing-sm: 8px;
$uni-spacing-base: 15px;
$uni-spacing-lg: 30px;
// 阴影
$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5);
$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2);
$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5);
// 蒙版
$uni-mask: rgba($color: #000000, $alpha: 0.4);
Loading…
Cancel
Save