From 4f00b1bd824508a2eed620788998149db49e246e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=BC=A0=E5=B8=85?=
<6581896+oncream@user.noreply.gitee.com>
Date: Thu, 3 Apr 2025 17:54:37 +0800
Subject: [PATCH] =?UTF-8?q?feat(1.0.2):=E4=BF=AE=E5=A4=8D=E9=A1=B5?=
=?UTF-8?q?=E9=9D=A2=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98=EF=BC=9B=E4=BF=AE?=
=?UTF-8?q?=E5=A4=8D=E7=82=B9=E5=87=BB=E9=94=99=E4=B9=B1=EF=BC=9B=E5=A2=9E?=
=?UTF-8?q?=E5=8A=A0=E7=A6=81=E6=AD=A2=E7=99=BB=E5=BD=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
internal/application/article/service.go | 57 ++++++++++--------
internal/application/auth/captcha_service.go | 12 ++++
internal/application/column/service.go | 18 ------
internal/application/user/service.go | 32 +++++++++-
internal/domain/user/repository.go | 2 +-
.../persistence/auth/auth_repo.go | 7 +++
.../persistence/user/user_repo.go | 8 +--
internal/interfaces/auth/auth_handler.go | 57 ------------------
internal/interfaces/user/user_handler.go | 2 +-
ui/src/app/app.component.ts | 2 +-
.../app/home/article-buy/article-buy.page.ts | 14 +++--
.../article-detail/article-detail.page.html | 14 ++++-
.../article-detail/article-detail.page.scss | 13 ++++
.../article-detail/article-detail.page.ts | 38 +++++++++++-
.../article-content.component.html | 18 +++---
.../article-content.component.ts | 57 ++++++++++++------
.../home-icons/home-icons.component.html | 6 +-
ui/src/app/mine/mine.page.html | 6 ++
ui/src/app/mine/mine.page.scss | 32 ++++++++--
ui/src/app/mine/mine.page.ts | 1 -
ui/src/assets/ewm.png | Bin 18827 -> 11563 bytes
21 files changed, 244 insertions(+), 152 deletions(-)
diff --git a/internal/application/article/service.go b/internal/application/article/service.go
index 34199b6..6d71535 100644
--- a/internal/application/article/service.go
+++ b/internal/application/article/service.go
@@ -84,35 +84,37 @@ func (a *ArticleService) Find(ePhone string, page *page.Page, searchParams map[s
if err != nil {
a.log.Error(err)
}
- columnData, err := a.purchaseRepo.FindColumnsByUserId(user.Id)
- columnMap := make(map[uint64]struct{})
- if len(columnData) != 0 {
- for _, v := range columnData {
- columnMap[v.ContentId] = struct{}{}
+ if user != nil {
+ columnData, err := a.purchaseRepo.FindColumnsByUserId(user.Id)
+ columnMap := make(map[uint64]struct{})
+ if len(columnData) != 0 {
+ for _, v := range columnData {
+ columnMap[v.ContentId] = struct{}{}
+ }
}
- }
- articleIds := make([]uint64, 0, len(articles))
- for _, v := range articles {
- _, has := columnMap[v.Type]
- if has {
- purchaseId[v.Id] = struct{}{}
- } else {
- articleIds = append(articleIds, v.Id)
+ articleIds := make([]uint64, 0, len(articles))
+ for _, v := range articles {
+ _, has := columnMap[v.Type]
+ if has {
+ purchaseId[v.Id] = struct{}{}
+ } else {
+ articleIds = append(articleIds, v.Id)
+ }
}
- }
- purchaseData, err := a.purchaseRepo.FindArticleById(user.Id, articleIds...)
- articleIds = nil
- if err != nil {
- a.log.Error(err.Error())
- }
- if purchaseData != nil {
- for _, v := range purchaseData {
- purchaseId[v.ContentId] = struct{}{}
+ purchaseData, err := a.purchaseRepo.FindArticleById(user.Id, articleIds...)
+ articleIds = nil
+ if err != nil {
+ a.log.Error(err.Error())
+ }
+ if purchaseData != nil {
+ for _, v := range purchaseData {
+ purchaseId[v.ContentId] = struct{}{}
+ }
}
- }
- articleIds = nil
+ articleIds = nil
+ }
}
@@ -152,6 +154,9 @@ func (a *ArticleService) FindUnLock(ePhone string, page *page.Page, searchParams
a.log.Error(err)
return err
}
+ if user == nil {
+ return errors.New("未找到用户")
+ }
conds := make([]builder.Cond, 0)
class := searchParams["search_eq_class"]
if class != "" {
@@ -251,6 +256,10 @@ func (a *ArticleService) Detail(userPhone string, id uint64) (*ArticleDto, error
return nil, err
}
+ if user == nil {
+ return nil, errors.New("未找到用户")
+ }
+
p, err := a.purchaseRepo.FindByUserIdAndContent(user.Id, id, purchase.ContentTypeArticle)
if err != nil {
a.log.Error(err)
diff --git a/internal/application/auth/captcha_service.go b/internal/application/auth/captcha_service.go
index 59d3446..addadda 100644
--- a/internal/application/auth/captcha_service.go
+++ b/internal/application/auth/captcha_service.go
@@ -234,6 +234,18 @@ func (c *CaptchaService) GenerateSmsCaptcha(username string, phone string) (*Sms
return nil, errors.New("手机号不能为空")
}
+ user, err := c.userService.GetUserInfoByPhone(phone)
+ if err != nil {
+ c.log.Error(err)
+ return nil, err
+ }
+
+ if user != nil {
+ if user.Status == 0 {
+ return nil, errors.New("您当前暂时不能登录,请联系管理员!")
+ }
+ }
+
// 1. 验证手机号格式
if err := c.VerifyPhoneValid(phone); err != nil {
return nil, err
diff --git a/internal/application/column/service.go b/internal/application/column/service.go
index 1ed63d7..9ec8897 100644
--- a/internal/application/column/service.go
+++ b/internal/application/column/service.go
@@ -80,24 +80,6 @@ func (s *Service) GetColumn(ePhone string, name string) (*ColumnDto, error) {
Unlock: unlock,
CreatedAt: time.Time{},
}
- if ePhone == "" {
- return columnDto, nil
- }
- userData, err := s.userRepo.FindByPhone(ePhone)
- if err != nil {
- s.log.Error(err.Error())
- return columnDto, nil
- }
- purchaseData, err := s.purchaseRepo.FindColumnById(userData.Id, col.ID)
- if err != nil {
- s.log.Error(err)
- return columnDto, nil
- }
- if len(purchaseData) != 0 {
- if purchaseData[0].ContentId == col.ID {
- columnDto.Unlock = true
- }
- }
return columnDto, nil
}
diff --git a/internal/application/user/service.go b/internal/application/user/service.go
index a7f9612..685e01a 100644
--- a/internal/application/user/service.go
+++ b/internal/application/user/service.go
@@ -102,16 +102,46 @@ func (u *UserService) FindLoginUser(username string) (*UserDto, error) {
}, nil
}
-func (u *UserService) GetUserProfileByPhone(ePhone string) (*UserDto, error) {
+func (u *UserService) GetUserProfileByePhone(ePhone string) (*UserDto, error) {
user, err := u.repo.FindByPhone(ePhone)
if err != nil {
u.log.Error(err)
return nil, err
}
+ if user == nil {
+ return nil, errors.New("未找到用户")
+ }
p, err := u.phoneEncryption.StringPhone(user.Phone)
if err != nil {
u.log.Error(err)
+ return nil, err
+ }
+ return &UserDto{
+ Uid: user.Id,
+ Username: user.Username,
+ Phone: p,
+ Password: user.Password != "",
+ Status: user.Status,
+ GiftCount: user.GiftCount,
+ }, nil
+}
+
+func (u *UserService) GetUserInfoByPhone(phone string) (*UserDto, error) {
+ ePhone, err := u.phoneEncryption.Encrypt(phone)
+ if err != nil {
+ u.log.Error(err)
+ return nil, err
+ }
+ p, _ := u.phoneEncryption.StringPhone(ePhone)
+ user, err := u.repo.FindByPhone(ePhone)
+ if err != nil {
+ u.log.Error(err)
+ return nil, err
+ }
+ if user == nil {
+ return nil, nil
}
+
return &UserDto{
Uid: user.Id,
Username: user.Username,
diff --git a/internal/domain/user/repository.go b/internal/domain/user/repository.go
index 9de983f..d57097f 100644
--- a/internal/domain/user/repository.go
+++ b/internal/domain/user/repository.go
@@ -26,7 +26,7 @@ type UserRepository interface {
FindByID(id uint64) (*User, error)
// FindByPhone 根据手机号查找用户
- FindByPhone(phone string) (*User, error)
+ FindByPhone(ePhone string) (*User, error)
// FindAll 查询用户列表
FindAll(page *page.Page, conds []builder.Cond) error
diff --git a/internal/infrastructure/persistence/auth/auth_repo.go b/internal/infrastructure/persistence/auth/auth_repo.go
index 4861acc..7ed8b71 100644
--- a/internal/infrastructure/persistence/auth/auth_repo.go
+++ b/internal/infrastructure/persistence/auth/auth_repo.go
@@ -7,6 +7,7 @@ import (
"cls/pkg/logger"
"cls/pkg/xorm_engine"
"errors"
+ "fmt"
"xorm.io/builder"
)
@@ -63,11 +64,17 @@ func (a AuthRepositoryORM) LoginByCaptcha(phone string) (string, error) {
//注册用户
u.Phone = phone
u.GiftCount = 2
+ u.Status = 1
_, err = a.engine.Insert(u)
if err != nil {
a.log.Error(err)
}
}
+
+ if u.Status == 0 {
+ return "", errors.New(fmt.Sprintf("用户【%d】禁止登录", u.Id))
+ }
+
token, err := a.auth.GenerateUserToken(phone)
if err != nil {
a.log.Error(err)
diff --git a/internal/infrastructure/persistence/user/user_repo.go b/internal/infrastructure/persistence/user/user_repo.go
index 8893458..e396231 100644
--- a/internal/infrastructure/persistence/user/user_repo.go
+++ b/internal/infrastructure/persistence/user/user_repo.go
@@ -10,7 +10,7 @@ import (
"xorm.io/builder"
)
-//UserRepositoryORM ORM 实现UserRepository 持久化数据
+// UserRepositoryORM ORM 实现UserRepository 持久化数据
type UserRepositoryORM struct {
engine *xorm_engine.Engine
log logger.Logger
@@ -68,14 +68,14 @@ func (u *UserRepositoryORM) FindByID(id uint64) (*domainUser.User, error) {
return user, nil
}
-func (u *UserRepositoryORM) FindByPhone(phone string) (*domainUser.User, error) {
+func (u *UserRepositoryORM) FindByPhone(ePhone string) (*domainUser.User, error) {
user := &domainUser.User{}
- exist, err := u.engine.Where(builder.Eq{"phone": phone}).Get(user)
+ exist, err := u.engine.Where(builder.Eq{"phone": ePhone}).Get(user)
if err != nil {
return nil, err
}
if !exist {
- return nil, errors.New("用户不存在")
+ return nil, nil
}
return user, nil
diff --git a/internal/interfaces/auth/auth_handler.go b/internal/interfaces/auth/auth_handler.go
index 0861e0e..a6ae788 100644
--- a/internal/interfaces/auth/auth_handler.go
+++ b/internal/interfaces/auth/auth_handler.go
@@ -9,8 +9,6 @@ import (
jwt "github.com/appleboy/gin-jwt/v2"
"github.com/gin-gonic/gin"
"net/http"
-
- auth_middleware "cls/internal/infrastructure/middleware/auth"
)
type AuthHandler struct {
@@ -97,32 +95,6 @@ func (h *AuthHandler) GetImageCaptcha(c *gin.Context) {
c.JSON(http.StatusOK, captcha)
}
-// VerifySmsCaptcha 验证短信验证码
-func (h *AuthHandler) VerifySmsCaptcha(c *gin.Context) {
- c.JSON(http.StatusOK, gin.H{"message": "验证成功"})
-}
-
-func (h *AuthHandler) VerifyImageCaptcha(c *gin.Context) {
- var req struct {
- Token string `json:"token" binding:"required"`
- X int `json:"x" binding:"required"`
- }
-
- if err := c.ShouldBindJSON(&req); err != nil {
- c.JSON(http.StatusBadRequest, gin.H{"error": "参数不完整"})
- return
- }
-
- // 1. 先验证图片验证码
- if b, err := h.captchaService.VerifySlide(req.Token, req.X); err != nil {
- c.JSON(http.StatusBadRequest, gin.H{"error": "图片验证码错误"})
- return
- } else {
- c.JSON(http.StatusOK, b)
- }
-
-}
-
func (h *AuthHandler) LoginCaptcha(c *gin.Context) {
var req struct {
Phone string `json:"phone" binding:"required"`
@@ -194,34 +166,5 @@ func (h *AuthHandler) RegisterRouters(app gin.IRouter) {
auth.POST("/login-password", h.LoginPassword)
auth.POST("/image-captcha", h.GetImageCaptcha)
auth.POST("/sms-captcha", h.GetSmsCaptcha)
- auth.POST("/verify-image", h.VerifyImageCaptcha)
- auth.POST("/verify-sms", h.VerifySmsCaptcha)
- auth.POST("/decode-token", h.DecodeToken)
}
}
-
-// DecodeToken 解析 token 并返回原始的加密手机号
-func (h *AuthHandler) DecodeToken(c *gin.Context) {
- var req struct {
- Token string `json:"token" binding:"required"`
- }
-
- if err := c.ShouldBindJSON(&req); err != nil {
- c.JSON(http.StatusBadRequest, gin.H{"error": "参数不完整"})
- return
- }
-
- // 通过 auth 模块获取密钥
- secretKey := h.service.GetJWTSecretKey()
-
- // 调用 DecodeTokenStatic 方法解析 token
- encryptedPhone, err := auth_middleware.DecodeTokenStatic(req.Token, []byte(secretKey))
- if err != nil {
- c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
- return
- }
-
- c.JSON(http.StatusOK, gin.H{
- "encryptedPhone": encryptedPhone,
- })
-}
diff --git a/internal/interfaces/user/user_handler.go b/internal/interfaces/user/user_handler.go
index c20937f..17fa93e 100644
--- a/internal/interfaces/user/user_handler.go
+++ b/internal/interfaces/user/user_handler.go
@@ -105,7 +105,7 @@ func (u *UserHandler) getProfile(c *gin.Context) {
c.AbortWithStatus(http.StatusInternalServerError)
return
}
- userInfo, err := u.service.GetUserProfileByPhone(ePhone)
+ userInfo, err := u.service.GetUserProfileByePhone(ePhone)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
diff --git a/ui/src/app/app.component.ts b/ui/src/app/app.component.ts
index 816fcfb..622bea3 100644
--- a/ui/src/app/app.component.ts
+++ b/ui/src/app/app.component.ts
@@ -23,6 +23,6 @@ export class AppComponent implements OnInit {
private shouldShowTabs(url: string): boolean {
// 在首页和我的页面显示底部导航栏
- return url === '/home' || url === '/mine' || url === '/mine/login';
+ return url=== '/' || url === '/home' || url === '/mine' || url === '/mine/login';
}
}
diff --git a/ui/src/app/home/article-buy/article-buy.page.ts b/ui/src/app/home/article-buy/article-buy.page.ts
index 187bd5c..aab97a1 100644
--- a/ui/src/app/home/article-buy/article-buy.page.ts
+++ b/ui/src/app/home/article-buy/article-buy.page.ts
@@ -45,12 +45,14 @@ export class ArticleBuyPage implements OnInit {
}
loadCoupons(){
this.homeService.getCouponList().subscribe(res=>{
- res.forEach(res=>{
- if(this.getDiscountPrice(this.price.amount,this.price.discount) > res.minAmount){
- res.canUse = true
- }
- })
- this.coupons = res;
+ if(res) {
+ res.forEach(res=>{
+ if(this.getDiscountPrice(this.price.amount,this.price.discount) > res.minAmount){
+ res.canUse = true
+ }
+ })
+ this.coupons = res;
+ }
})
}
getDiscountPrice(originalPrice: number,discount:number): number {
diff --git a/ui/src/app/home/article-detail/article-detail.page.html b/ui/src/app/home/article-detail/article-detail.page.html
index 0dc85b2..3d30e26 100644
--- a/ui/src/app/home/article-detail/article-detail.page.html
+++ b/ui/src/app/home/article-detail/article-detail.page.html
@@ -29,7 +29,19 @@
相关个股:
- {{ article?.stocks != '' ? article?.stocks : '暂无' }}
+
+
+
+ {{stock.trim()}}
+
+ {{formatChange(stockChanges[stock.trim()])}}
+
+ ,
+
+
+ 暂无
+
路诚声明:
diff --git a/ui/src/app/home/article-detail/article-detail.page.scss b/ui/src/app/home/article-detail/article-detail.page.scss
index 0cc7e49..3d897b8 100644
--- a/ui/src/app/home/article-detail/article-detail.page.scss
+++ b/ui/src/app/home/article-detail/article-detail.page.scss
@@ -76,6 +76,19 @@ ion-back-button {
font-size: 12px;
color: #1D1E22;
font-weight: 500;
+
+ .change {
+ margin-left: 4px;
+ font-weight: 500;
+
+ &.up {
+ color: #F93034;
+ }
+
+ &.down {
+ color: #07A50B;
+ }
+ }
}
}
diff --git a/ui/src/app/home/article-detail/article-detail.page.ts b/ui/src/app/home/article-detail/article-detail.page.ts
index efef111..e0cb48b 100644
--- a/ui/src/app/home/article-detail/article-detail.page.ts
+++ b/ui/src/app/home/article-detail/article-detail.page.ts
@@ -4,7 +4,7 @@ import { Router } from '@angular/router';
import { ModalController } from '@ionic/angular';
import { Article } from "../../shared/model/article";
import {ImagePreviewComponent} from "./image-preview/image-preview.component";
-
+import { HttpClient } from '@angular/common/http';
@Component({
selector: 'app-article-detail',
@@ -15,11 +15,13 @@ import {ImagePreviewComponent} from "./image-preview/image-preview.component";
export class ArticleDetailPage implements OnInit, AfterViewInit {
article?: Article;
weekday = "";
+ stockChanges: { [key: string]: number } = {};
constructor(
private navCtrl: NavController,
private router: Router,
- private modalCtrl: ModalController
+ private modalCtrl: ModalController,
+ private http: HttpClient
) {
// 获取导航传递的数据
const navigation = this.router.getCurrentNavigation();
@@ -27,6 +29,7 @@ export class ArticleDetailPage implements OnInit, AfterViewInit {
if (article) {
this.article = article;
this.addWeekday();
+ this.getStockChanges();
}
}
@@ -85,4 +88,35 @@ export class ArticleDetailPage implements OnInit, AfterViewInit {
modal.present();
});
}
+
+ private getStockChanges() {
+ if (!this.article?.stocks) return;
+
+ const stockCodes = this.article.stocks.split(',').map(code => code.trim());
+
+ stockCodes.forEach(code => {
+ if (code) {
+ // 调用接口时使用纯数字代码
+ const numericCode = code.replace(/^(sz|sh)/, '');
+ this.http.get(`http://api.mairui.club/hsrl/ssjy/${numericCode}/13988152-0AB6-41A9-B2CC-DC9B50250113`)
+ .subscribe((data: any) => {
+ if (data && data.pc) {
+ this.stockChanges[code] = data.pc;
+ }
+ });
+ }
+ });
+ }
+
+ getStockChangeClass(code: string): string {
+ const change = this.stockChanges[code];
+ if (change > 0) return 'up';
+ if (change < 0) return 'down';
+ return '';
+ }
+
+ formatChange(change: number): string {
+ if (change > 0) return `+${change}%`;
+ return `${change}%`;
+ }
}
diff --git a/ui/src/app/home/component/article-content/article-content.component.html b/ui/src/app/home/component/article-content/article-content.component.html
index db1fb49..7668a8d 100644
--- a/ui/src/app/home/component/article-content/article-content.component.html
+++ b/ui/src/app/home/component/article-content/article-content.component.html
@@ -1,12 +1,12 @@
-
+
最新
-
- 已解锁
+
+ 已解锁
-
- 免费试读
+
+ 免费试读
@@ -22,9 +22,13 @@
请登录后查看
-
-
+
+
+
diff --git a/ui/src/app/home/component/article-content/article-content.component.ts b/ui/src/app/home/component/article-content/article-content.component.ts
index 540bd10..706e7a5 100644
--- a/ui/src/app/home/component/article-content/article-content.component.ts
+++ b/ui/src/app/home/component/article-content/article-content.component.ts
@@ -5,6 +5,7 @@ import {HomeService} from "../../home.service";
import {getGiftCount, getUser} from "../../../mine/mine.service";
import {Subject, Subscription} from "rxjs";
import {NavigationEnd, Router} from "@angular/router";
+import {takeUntil} from "rxjs/operators";
@Component({
selector: 'app-article-content',
@@ -18,11 +19,13 @@ export class ArticleContentComponent implements OnInit {
size: 10,
search_eq_class:""
};
- hasMore: boolean = true;
+ hasMore: boolean = false;
@Input() className:string = ""
username:string = ""
data:Article[] = []
currentSelect = "new"
+ selectBtn:string = "new"
+ private destroy$ = new Subject
();
constructor(private homeService:HomeService,
private cdr:ChangeDetectorRef) { }
@@ -32,13 +35,21 @@ export class ArticleContentComponent implements OnInit {
this.getUsername();
}
ionChange(e:any){
+ }
+ select(v:string) {
+ if(v==this.selectBtn){
+ return
+ }
+ this.hasMore = false;
+ this.selectBtn = v
this.searchParams['page'] = 0
this.data = []
- this.currentSelect = e.detail.value
+ this.destroy$.next()
this.getData()
}
getData() {
+
switch (this.currentSelect){
case "new":
return this.getNewData()
@@ -60,12 +71,14 @@ export class ArticleContentComponent implements OnInit {
}
getNewData() {
- this.homeService.list(this.searchParams).subscribe(res=>{
- if(res.items.length > 0) {
- this.data = this.data.concat(res.items)
- this.searchParams['page'] = this.searchParams['page']+1;
- this.hasMore = res.items.length === this.searchParams['size'];
- this.cdr.detectChanges();
+ this.homeService.list(this.searchParams).pipe(takeUntil(this.destroy$)).subscribe(res=>{
+ if(res.items){
+ if(res.items.length > 0) {
+ this.data = this.data.concat(res.items)
+ this.searchParams['page'] = this.searchParams['page']+1;
+ this.hasMore = res.items.length === this.searchParams['size'];
+ this.cdr.detectChanges();
+ }
}
})
}
@@ -75,24 +88,28 @@ export class ArticleContentComponent implements OnInit {
if(this.className != "") {
this.searchParams['search_eq_class'] = this.className
}
- this.homeService.unlockList(this.searchParams).subscribe(res=>{
- if(res.items.length > 0) {
- this.data = this.data.concat(res.items)
- this.searchParams['page'] = this.searchParams['page']+1;
- this.hasMore = res.items.length === this.searchParams['size'];
- this.cdr.detectChanges();
+ this.homeService.unlockList(this.searchParams).pipe(takeUntil(this.destroy$)).subscribe(res=>{
+ if(res.items) {
+ if(res.items.length > 0) {
+ this.data = this.data.concat(res.items)
+ this.searchParams['page'] = this.searchParams['page']+1;
+ this.hasMore = res.items.length === this.searchParams['size'];
+ this.cdr.detectChanges();
+ }
}
})
}
}
getFreeData() {
- this.homeService.freeList(this.searchParams).subscribe(res=>{
- if(res.items.length > 0) {
- this.data = this.data.concat(res.items)
- this.searchParams['page'] = this.searchParams['page']+1;
- this.hasMore = res.items.length === this.searchParams['size'];
- this.cdr.detectChanges();
+ this.homeService.freeList(this.searchParams).pipe(takeUntil(this.destroy$)).subscribe(res=>{
+ if(res.items) {
+ if(res.items.length > 0) {
+ this.data = this.data.concat(res.items)
+ this.searchParams['page'] = this.searchParams['page']+1;
+ this.hasMore = res.items.length === this.searchParams['size'];
+ this.cdr.detectChanges();
+ }
}
})
}
diff --git a/ui/src/app/home/component/home-icons/home-icons.component.html b/ui/src/app/home/component/home-icons/home-icons.component.html
index 9162816..d29fc25 100644
--- a/ui/src/app/home/component/home-icons/home-icons.component.html
+++ b/ui/src/app/home/component/home-icons/home-icons.component.html
@@ -4,13 +4,13 @@
-
+
-
{{icon.name}}
+
{{icon.name}}
diff --git a/ui/src/app/mine/mine.page.html b/ui/src/app/mine/mine.page.html
index 4b2d89f..6b66e70 100644
--- a/ui/src/app/mine/mine.page.html
+++ b/ui/src/app/mine/mine.page.html
@@ -17,6 +17,12 @@
我的优惠券
+
+
+
diff --git a/ui/src/app/mine/mine.page.scss b/ui/src/app/mine/mine.page.scss
index 6429eef..fc21237 100644
--- a/ui/src/app/mine/mine.page.scss
+++ b/ui/src/app/mine/mine.page.scss
@@ -111,7 +111,7 @@ ion-segment {
--padding-start: 16px;
--inner-padding-end: 16px;
--background: transparent;
-
+
ion-label {
h2 {
font-size: 16px;
@@ -192,7 +192,7 @@ ion-item.image-captcha-item {
color: #ff4d4f;
display: flex;
align-items: baseline;
-
+
.symbol {
font-size: 14px;
}
@@ -241,14 +241,36 @@ ion-footer {
--padding-bottom: 8px;
--border-top:none;
// --background: #fff;
-
+
}
-
+
.logout-button {
padding: 0 16px;
-
+
ion-button {
margin: 0;
}
}
}
+
+
+.empty-state {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: 40px 20px;
+ text-align: center;
+
+ ion-icon {
+ font-size: 48px;
+ color: #999;
+ margin-bottom: 16px;
+ }
+
+ p {
+ color: #999;
+ font-size: 14px;
+ margin: 0;
+ }
+}
diff --git a/ui/src/app/mine/mine.page.ts b/ui/src/app/mine/mine.page.ts
index c3bbe2f..a0682be 100644
--- a/ui/src/app/mine/mine.page.ts
+++ b/ui/src/app/mine/mine.page.ts
@@ -60,7 +60,6 @@ export class MinePage implements OnInit, OnDestroy {
checkLoginStatus() {
getUser().subscribe(res=>{
- console.log(res)
if(res.username == "") {
this.isLoggedIn = false;
this.navCtrl.navigateForward("/mine/login")
diff --git a/ui/src/assets/ewm.png b/ui/src/assets/ewm.png
index c193e932e2d45c8003fe74068017c4a1090e0637..39c8e870033e2eb2fc5e3763fdefc184bfdb2fce 100644
GIT binary patch
literal 11563
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
Hu0mjfZ^8VV