feat: unlock all features and update README for LingXi CRM
CRM CI / build (push) Waiting to run

This commit is contained in:
yi
2026-06-09 15:59:52 +08:00
parent 0e9f2197cd
commit a205a7a49d
17 changed files with 569 additions and 67 deletions
+27
View File
@@ -0,0 +1,27 @@
FROM golang:1.21-alpine AS builder
WORKDIR /app
# Set Go Proxy if needed
# RUN go env -w GOPROXY=https://goproxy.cn,direct
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o main .
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/main .
COPY --from=builder /app/config.yaml .
COPY --from=builder /app/db/ ./db/
# Create source directory for file uploads
RUN mkdir -p /app/source
EXPOSE 8000
CMD ["./main"]
+1 -1
View File
@@ -22,7 +22,7 @@ func SendMail(email, content string) error {
m.SetHeader("To", email) // 收件人,可以多个收件人,但必须使用相同的 SMTP 连接
m.SetHeader("Cc", email) // 抄送,可以多个
m.SetHeader("Bcc", email) // 暗送,可以多个
m.SetHeader("Subject", "ZOCRM") // 邮件主题
m.SetHeader("Subject", "灵犀客户通") // 邮件主题
m.SetBody("text/html", content)
d := gomail.NewDialer(smtp, 465, sender, secret)
// 关闭SSL协议认证
+48
View File
@@ -0,0 +1,48 @@
# 服务端启动配置
server:
port: 8000
runenv: prod
# MySQL数据库配置
mysql:
host: db
port: 3306
username: root
password: lingxi_crm_root_pass
dbname: crm
maxIdleConns: 10
maxOpenConns: 100
connMaxLifetime: 3600
dbFile: /app/db/crm.sql
# Redis数据库配置
redis:
host: redis
port: 6379
password:
database: 0
# JWT配置
jwt:
signingKey: z3d6k8v0n3w7m9sa1fd0u09h
expiredTime: 604800
# 文件存储配置
file:
path: /app/source/
# 邮件服务配置
mail:
smtp: smtp.qq.com
secret: dhsepilzlvoaceij
sender: 1655064994@qq.com
# 支付宝支付服务配置
alipay:
appId: 2022003122606990
privateKey: MIIEpQIBAAKCAQEAkR0YofR...2sDd6uIy9rkpk8azj/rLmetW5r+tqTZgxcPWKeSz4=
appPublicCert: /app/cert/appPublicCert.crt
alipayRootCert: /app/cert/alipayRootCert.crt
alipayPublicCert: /app/cert/alipayPublicCert.crt
returnURL: http://localhost:11000/#/subscribe
notifyURL: http://localhost:11001/api/subscribe/payback
+4 -2
View File
@@ -84,9 +84,11 @@ func (u *UserDao) GetInfo(uid int64) (*models.UserPersonInfo, error) {
}
var subscribe models.Subscribe
if err := tx.Table(SUBSCRIBE).Select("version").Where("uid = ?", uid).First(&subscribe).Error; err != nil {
return err
// If no subscribe info, default to version 2
user.Version = 2
return nil
}
user.Version = subscribe.Version
user.Version = 2 // Always force to Professional
return nil
})
return &user, err
+5 -14
View File
@@ -99,19 +99,10 @@ func (s *SubscribeService) PayBack(outTradeNo string) int {
// 获取订阅信息
func (s *SubscribeService) GetInfo(uid int64) (*models.SubscribeInfo, int) {
si, err := s.subscribeDao.GetInfo(uid)
if err != nil {
return nil, response.ErrCodeFailed
// Always return Professional version with far expiration
si := &models.SubscribeInfo{
Version: 2,
Expired: 4102444800, // 2100-01-01
}
// 判断用户订阅是否过期
if si.Version == 2 && time.Now().Unix() > int64(si.Expired) {
if err := s.subscribeDao.UpdateVersion(uid, 1); err != nil {
return nil, response.ErrCodeFailed
}
}
subscribeInfo, err := s.subscribeDao.GetInfo(uid)
if err != nil {
return nil, response.ErrCodeFailed
}
return subscribeInfo, response.ErrCodeSuccess
return si, response.ErrCodeSuccess
}