正在显示
57 个修改的文件
包含
2359 行增加
和
0 行删除
.gitignore
0 → 100644
| 1 | +# Binaries for programs and plugins | ||
| 2 | +*.exe | ||
| 3 | +*.dll | ||
| 4 | +*.so | ||
| 5 | +*.dylib | ||
| 6 | +*.vscode | ||
| 7 | + | ||
| 8 | +# Test binary, build with `go test -c` | ||
| 9 | +*.test | ||
| 10 | + | ||
| 11 | +# Output of the go coverage tool, specifically when used with LiteIDE | ||
| 12 | +*.out | ||
| 13 | + | ||
| 14 | +*.log | ||
| 15 | +*debug | ||
| 16 | +*wasm | ||
| 17 | + | ||
| 18 | +*.idea | ||
| 19 | + | ||
| 20 | +*.tmp | ||
| 21 | + | ||
| 22 | +*.sum | ||
| 23 | + | ||
| 24 | +opp | ||
| 25 | +/vendor | ||
| 26 | +/*.exe~ | ||
| 27 | +/log |
Dockerfile
0 → 100644
| 1 | +FROM golang:latest | ||
| 2 | +ENV APP_DIR $GOPATH/src/partnermg | ||
| 3 | +RUN mkdir -p $APP_DIR | ||
| 4 | +WORKDIR $APP_DIR/ | ||
| 5 | +COPY ./pkg pkg | ||
| 6 | +COPY ./conf conf | ||
| 7 | +COPY ./go.mod go.mod | ||
| 8 | +COPY ./main.go main.go | ||
| 9 | +RUN ["ln","-sf","/usr/share/zoneinfo/Asia/Shanghai","/etc/localtime"] | ||
| 10 | +ENV GO111MODULE on | ||
| 11 | +ENV GOPROXY https://goproxy.cn | ||
| 12 | +RUN ["go","mod","tidy"] | ||
| 13 | +RUN ["go","build"] | ||
| 14 | +ENTRYPOINT ["./partnermg"] |
conf/app.conf
0 → 100644
| 1 | +appname = partner | ||
| 2 | +runmode = "${RUN_MODE||dev}" | ||
| 3 | +httpport = "${HTTP_PORT||8080}" | ||
| 4 | + | ||
| 5 | +#开启监控 | ||
| 6 | +EnableAdmin = false | ||
| 7 | +#开启JSON请求 | ||
| 8 | +copyrequestbody = true | ||
| 9 | +#防止跨站请求伪造 未启用 | ||
| 10 | +enablexsrf = false | ||
| 11 | +xsrfkey = asdfioerjlasdfmFADFOEJF2323SDFF | ||
| 12 | +xsrfexpire = 3600 | ||
| 13 | +[lang] | ||
| 14 | +types = en-US|zh-CN | ||
| 15 | +names = English|简体中文 |
deploy/k8s/dev/install.sh
0 → 100644
| 1 | +#!/bin/bash | ||
| 2 | +export PATH=/root/local/bin:$PATH | ||
| 3 | +kubectl -n mmm-suplus-dev get pods | grep -q partner | ||
| 4 | +if [ "$?" == "1" ];then | ||
| 5 | + kubectl create -f /tmp/dev/partner/partner.yaml --record | ||
| 6 | + kubectl -n mmm-suplus-dev get svc | grep -q partner | ||
| 7 | + if [ "$?" == "0" ];then | ||
| 8 | + echo "partner service install success!" | ||
| 9 | + else | ||
| 10 | + echo "partner service install fail!" | ||
| 11 | + fi | ||
| 12 | + kubectl -n mmm-suplus-dev get pods | grep -q partner | ||
| 13 | + if [ "$?" == "0" ];then | ||
| 14 | + echo "partner deployment install success!" | ||
| 15 | + else | ||
| 16 | + echo "partner deployment install fail!" | ||
| 17 | + fi | ||
| 18 | +else | ||
| 19 | + kubectl delete -f /tmp/dev/partner/partner.yaml | ||
| 20 | + kubectl -n mmm-suplus-dev get svc | grep -q partner | ||
| 21 | + while [ "$?" == "0" ] | ||
| 22 | + do | ||
| 23 | + kubectl -n mmm-suplus-dev get svc | grep -q partner | ||
| 24 | + done | ||
| 25 | + kubectl -n mmm-suplus-dev get pods | grep -q partner | ||
| 26 | + while [ "$?" == "0" ] | ||
| 27 | + do | ||
| 28 | + kubectl -n mmm-suplus-dev get pods | grep -q partner | ||
| 29 | + done | ||
| 30 | + kubectl create -f /tmp/dev/partner/partner.yaml --record | ||
| 31 | + kubectl -n mmm-suplus-dev get svc | grep -q partner | ||
| 32 | + if [ "$?" == "0" ];then | ||
| 33 | + echo "partner service update success!" | ||
| 34 | + else | ||
| 35 | + echo "partner service update fail!" | ||
| 36 | + fi | ||
| 37 | + kubectl -n mmm-suplus-dev get pods | grep -q partner | ||
| 38 | + if [ "$?" == "0" ];then | ||
| 39 | + echo "partner deployment update success!" | ||
| 40 | + else | ||
| 41 | + echo "partner deployment update fail!" | ||
| 42 | + fi | ||
| 43 | +fi |
deploy/k8s/dev/partner.yaml
0 → 100644
| 1 | +apiVersion: v1 | ||
| 2 | +kind: Service | ||
| 3 | +metadata: | ||
| 4 | + name: partner | ||
| 5 | + namespace: mmm-suplus-dev | ||
| 6 | + labels: | ||
| 7 | + k8s-app: partner | ||
| 8 | +spec: | ||
| 9 | + ports: | ||
| 10 | + - name: "http" | ||
| 11 | + port: 80 | ||
| 12 | + targetPort: 8082 | ||
| 13 | + selector: | ||
| 14 | + k8s-app: partner | ||
| 15 | +--- | ||
| 16 | +apiVersion: extensions/v1beta1 | ||
| 17 | +kind: Deployment | ||
| 18 | +metadata: | ||
| 19 | + name: partner | ||
| 20 | + namespace: mmm-suplus-dev | ||
| 21 | + labels: | ||
| 22 | + k8s-app: partner | ||
| 23 | +spec: | ||
| 24 | + replicas: 1 | ||
| 25 | + template: | ||
| 26 | + metadata: | ||
| 27 | + labels: | ||
| 28 | + k8s-app: partner | ||
| 29 | + spec: | ||
| 30 | + affinity: | ||
| 31 | + nodeAffinity: | ||
| 32 | + preferredDuringSchedulingIgnoredDuringExecution: | ||
| 33 | + - preference: {} | ||
| 34 | + weight: 100 | ||
| 35 | + requiredDuringSchedulingIgnoredDuringExecution: | ||
| 36 | + nodeSelectorTerms: | ||
| 37 | + - matchExpressions: | ||
| 38 | + - key: kubernetes.io/hostname | ||
| 39 | + operator: In | ||
| 40 | + values: | ||
| 41 | + - cn-hangzhou.i-bp1djh1xn7taumbue1ze | ||
| 42 | + - cn-hangzhou.i-bp1djh1xn7taumbue1zd | ||
| 43 | + - cn-hangzhou.i-bp1euf5u1ph9kbhtndhb | ||
| 44 | + - cn-hangzhou.i-bp1hyp5oips9cdwxxgxy | ||
| 45 | + containers: | ||
| 46 | + - name: partner | ||
| 47 | + image: 192.168.0.243:5000/mmm/partner:dev | ||
| 48 | + imagePullPolicy: Always | ||
| 49 | + ports: | ||
| 50 | + - containerPort: 8082 | ||
| 51 | + volumeMounts: | ||
| 52 | + - mountPath: /opt/logs | ||
| 53 | + name: accesslogs | ||
| 54 | + env: | ||
| 55 | + - name: POSTGRESQL_DB_NAME | ||
| 56 | + value: "partner_dev" | ||
| 57 | + - name: POSTGRESQL_USER | ||
| 58 | + value: "postgres" | ||
| 59 | + - name: POSTGRESQL_PASSWORD | ||
| 60 | + value: "postgres_15432" | ||
| 61 | + - name: POSTGRESQL_HOST | ||
| 62 | + value: "101.37.68.23" | ||
| 63 | + - name: POSTGRESQL_PORT | ||
| 64 | + value: "15432" | ||
| 65 | + - name: LOG_LEVEL | ||
| 66 | + value: "debug" | ||
| 67 | + - name: ERROR_BASE_CODE | ||
| 68 | + value: "1" | ||
| 69 | + - name: ERROR_BASE_CODE_MULTIPLE | ||
| 70 | + value: "1000" | ||
| 71 | + - name: ABILITY_SERVICE_HOST | ||
| 72 | + value: "https://suplus-worth-app-gateway-dev.fjmaimaimai.com" | ||
| 73 | + - name: MMM_OPEN_API_SERVICE_HOST | ||
| 74 | + value: "http://mmm-open-api-dev.fjmaimaimai.com" | ||
| 75 | + volumes: | ||
| 76 | + - name: accesslogs | ||
| 77 | + emptyDir: {} |
deploy/k8s/prd/install.sh
0 → 100644
| 1 | +#!/bin/bash | ||
| 2 | +export PATH=/root/local/bin:$PATH | ||
| 3 | +kubectl -n mmm-suplus-prd get pods | grep -q partner | ||
| 4 | +if [ "$?" == "1" ];then | ||
| 5 | + kubectl create -f /tmp/prd/partner/partner.yaml --record | ||
| 6 | + kubectl -n mmm-suplus-prd get svc | grep -q partner | ||
| 7 | + if [ "$?" == "0" ];then | ||
| 8 | + echo "partner service install success!" | ||
| 9 | + else | ||
| 10 | + echo "partner service install fail!" | ||
| 11 | + fi | ||
| 12 | + kubectl -n mmm-suplus-prd get pods | grep -q partner | ||
| 13 | + if [ "$?" == "0" ];then | ||
| 14 | + echo "partner deployment install success!" | ||
| 15 | + else | ||
| 16 | + echo "partner deployment install fail!" | ||
| 17 | + fi | ||
| 18 | +else | ||
| 19 | + kubectl delete -f /tmp/prd/partner/partner.yaml | ||
| 20 | + kubectl -n mmm-suplus-prd get svc | grep -q partner | ||
| 21 | + while [ "$?" == "0" ] | ||
| 22 | + do | ||
| 23 | + kubectl -n mmm-suplus-prd get svc | grep -q partner | ||
| 24 | + done | ||
| 25 | + kubectl -n mmm-suplus-prd get pods | grep -q partner | ||
| 26 | + while [ "$?" == "0" ] | ||
| 27 | + do | ||
| 28 | + kubectl -n mmm-suplus-prd get pods | grep -q partner | ||
| 29 | + done | ||
| 30 | + kubectl create -f /tmp/prd/partner/partner.yaml --record | ||
| 31 | + kubectl -n mmm-suplus-prd get svc | grep -q partner | ||
| 32 | + if [ "$?" == "0" ];then | ||
| 33 | + echo "partner service update success!" | ||
| 34 | + else | ||
| 35 | + echo "partner service update fail!" | ||
| 36 | + fi | ||
| 37 | + kubectl -n mmm-suplus-prd get pods | grep -q partner | ||
| 38 | + if [ "$?" == "0" ];then | ||
| 39 | + echo "partner deployment update success!" | ||
| 40 | + else | ||
| 41 | + echo "partner deployment update fail!" | ||
| 42 | + fi | ||
| 43 | +fi |
deploy/k8s/prd/partner.yaml
0 → 100644
| 1 | +apiVersion: v1 | ||
| 2 | +kind: Service | ||
| 3 | +metadata: | ||
| 4 | + name: partner | ||
| 5 | + namespace: mmm-suplus-prd | ||
| 6 | + labels: | ||
| 7 | + k8s-app: partner | ||
| 8 | +spec: | ||
| 9 | + ports: | ||
| 10 | + - name: "http" | ||
| 11 | + port: 80 | ||
| 12 | + targetPort: 8082 | ||
| 13 | + selector: | ||
| 14 | + k8s-app: partner | ||
| 15 | +--- | ||
| 16 | +apiVersion: extensions/v1beta1 | ||
| 17 | +kind: Deployment | ||
| 18 | +metadata: | ||
| 19 | + name: partner | ||
| 20 | + namespace: mmm-suplus-prd | ||
| 21 | + labels: | ||
| 22 | + k8s-app: partner | ||
| 23 | +spec: | ||
| 24 | + replicas: 1 | ||
| 25 | + template: | ||
| 26 | + metadata: | ||
| 27 | + labels: | ||
| 28 | + k8s-app: partner | ||
| 29 | + spec: | ||
| 30 | + affinity: | ||
| 31 | + nodeAffinity: | ||
| 32 | + preferredDuringSchedulingIgnoredDuringExecution: | ||
| 33 | + - preference: {} | ||
| 34 | + weight: 100 | ||
| 35 | + requiredDuringSchedulingIgnoredDuringExecution: | ||
| 36 | + nodeSelectorTerms: | ||
| 37 | + - matchExpressions: | ||
| 38 | + - key: kubernetes.io/hostname | ||
| 39 | + operator: In | ||
| 40 | + values: | ||
| 41 | + - cn-hangzhou.i-bp1djh1xn7taumbue1ze | ||
| 42 | + - cn-hangzhou.i-bp1djh1xn7taumbue1zd | ||
| 43 | + - cn-hangzhou.i-bp1euf5u1ph9kbhtndhb | ||
| 44 | + - cn-hangzhou.i-bp1hyp5oips9cdwxxgxy | ||
| 45 | + containers: | ||
| 46 | + - name: partner | ||
| 47 | + image: 192.168.0.243:5000/mmm/partner:master | ||
| 48 | + imagePullPolicy: Always | ||
| 49 | + ports: | ||
| 50 | + - containerPort: 8082 | ||
| 51 | + volumeMounts: | ||
| 52 | + - mountPath: /opt/logs | ||
| 53 | + name: accesslogs | ||
| 54 | + env: | ||
| 55 | + - name: POSTGRESQL_DB_NAME | ||
| 56 | + value: "partner" | ||
| 57 | + - name: POSTGRESQL_USER | ||
| 58 | + value: "postgres" | ||
| 59 | + - name: POSTGRESQL_PASSWORD | ||
| 60 | + value: "postgres_55_online" | ||
| 61 | + - name: POSTGRESQL_HOST | ||
| 62 | + value: "112.124.115.55" | ||
| 63 | + - name: POSTGRESQL_PORT | ||
| 64 | + value: "15432" | ||
| 65 | + - name: LOG_LEVEL | ||
| 66 | + value: "debug" | ||
| 67 | + - name: ERROR_BASE_CODE | ||
| 68 | + value: "1" | ||
| 69 | + - name: ERROR_BASE_CODE_MULTIPLE | ||
| 70 | + value: "1000" | ||
| 71 | + - name: ABILITY_SERVICE_HOST | ||
| 72 | + value: "https://ability.fjmaimaimai.com" | ||
| 73 | + - name: MMM_OPEN_API_SERVICE_HOST | ||
| 74 | + value: "https://public-interface.fjmaimaimai.com/openapi" | ||
| 75 | + volumes: | ||
| 76 | + - name: accesslogs | ||
| 77 | + emptyDir: {} |
deploy/k8s/test/install.sh
0 → 100644
| 1 | +#!/bin/bash | ||
| 2 | +export PATH=/root/local/bin:$PATH | ||
| 3 | +kubectl -n mmm-suplus-test get pods | grep -q partner | ||
| 4 | +if [ "$?" == "1" ];then | ||
| 5 | + kubectl create -f /tmp/test/partner/partner.yaml --record | ||
| 6 | + kubectl -n mmm-suplus-test get svc | grep -q partner | ||
| 7 | + if [ "$?" == "0" ];then | ||
| 8 | + echo "partner service install success!" | ||
| 9 | + else | ||
| 10 | + echo "partner service install fail!" | ||
| 11 | + fi | ||
| 12 | + kubectl -n mmm-suplus-test get pods | grep -q partner | ||
| 13 | + if [ "$?" == "0" ];then | ||
| 14 | + echo "partner deployment install success!" | ||
| 15 | + else | ||
| 16 | + echo "partner deployment install fail!" | ||
| 17 | + fi | ||
| 18 | +else | ||
| 19 | + kubectl delete -f /tmp/test/partner/partner.yaml | ||
| 20 | + kubectl -n mmm-suplus-test get svc | grep -q partner | ||
| 21 | + while [ "$?" == "0" ] | ||
| 22 | + do | ||
| 23 | + kubectl -n mmm-suplus-test get svc | grep -q partner | ||
| 24 | + done | ||
| 25 | + kubectl -n mmm-suplus-test get pods | grep -q partner | ||
| 26 | + while [ "$?" == "0" ] | ||
| 27 | + do | ||
| 28 | + kubectl -n mmm-suplus-test get pods | grep -q partner | ||
| 29 | + done | ||
| 30 | + kubectl create -f /tmp/test/partner/partner.yaml --record | ||
| 31 | + kubectl -n mmm-suplus-test get svc | grep -q partner | ||
| 32 | + if [ "$?" == "0" ];then | ||
| 33 | + echo "partner service update success!" | ||
| 34 | + else | ||
| 35 | + echo "partner service update fail!" | ||
| 36 | + fi | ||
| 37 | + kubectl -n mmm-suplus-test get pods | grep -q partner | ||
| 38 | + if [ "$?" == "0" ];then | ||
| 39 | + echo "partner deployment update success!" | ||
| 40 | + else | ||
| 41 | + echo "partner deployment update fail!" | ||
| 42 | + fi | ||
| 43 | +fi |
deploy/k8s/test/partner.yaml
0 → 100644
| 1 | +apiVersion: v1 | ||
| 2 | +kind: Service | ||
| 3 | +metadata: | ||
| 4 | + name: partner | ||
| 5 | + namespace: mmm-suplus-test | ||
| 6 | + labels: | ||
| 7 | + k8s-app: partner | ||
| 8 | +spec: | ||
| 9 | + ports: | ||
| 10 | + - name: "http" | ||
| 11 | + port: 80 | ||
| 12 | + targetPort: 8082 | ||
| 13 | + selector: | ||
| 14 | + k8s-app: partner | ||
| 15 | +--- | ||
| 16 | +apiVersion: extensions/v1beta1 | ||
| 17 | +kind: Deployment | ||
| 18 | +metadata: | ||
| 19 | + name: partner | ||
| 20 | + namespace: mmm-suplus-test | ||
| 21 | + labels: | ||
| 22 | + k8s-app: partner | ||
| 23 | +spec: | ||
| 24 | + replicas: 1 | ||
| 25 | + template: | ||
| 26 | + metadata: | ||
| 27 | + labels: | ||
| 28 | + k8s-app: partner | ||
| 29 | + spec: | ||
| 30 | + affinity: | ||
| 31 | + nodeAffinity: | ||
| 32 | + preferredDuringSchedulingIgnoredDuringExecution: | ||
| 33 | + - preference: {} | ||
| 34 | + weight: 100 | ||
| 35 | + requiredDuringSchedulingIgnoredDuringExecution: | ||
| 36 | + nodeSelectorTerms: | ||
| 37 | + - matchExpressions: | ||
| 38 | + - key: kubernetes.io/hostname | ||
| 39 | + operator: In | ||
| 40 | + values: | ||
| 41 | + - cn-hangzhou.i-bp1djh1xn7taumbue1ze | ||
| 42 | + - cn-hangzhou.i-bp1djh1xn7taumbue1zd | ||
| 43 | + - cn-hangzhou.i-bp1euf5u1ph9kbhtndhb | ||
| 44 | + - cn-hangzhou.i-bp1hyp5oips9cdwxxgxy | ||
| 45 | + containers: | ||
| 46 | + - name: partner | ||
| 47 | + image: 192.168.0.243:5000/mmm/partner:test | ||
| 48 | + imagePullPolicy: Always | ||
| 49 | + ports: | ||
| 50 | + - containerPort: 8082 | ||
| 51 | + volumeMounts: | ||
| 52 | + - mountPath: /opt/logs | ||
| 53 | + name: accesslogs | ||
| 54 | + env: | ||
| 55 | + - name: POSTGRESQL_DB_NAME | ||
| 56 | + value: "partner_test" | ||
| 57 | + - name: POSTGRESQL_USER | ||
| 58 | + value: "postgres" | ||
| 59 | + - name: POSTGRESQL_PASSWORD | ||
| 60 | + value: "postgres_15432" | ||
| 61 | + - name: POSTGRESQL_HOST | ||
| 62 | + value: "101.37.68.23" | ||
| 63 | + - name: POSTGRESQL_PORT | ||
| 64 | + value: "15432" | ||
| 65 | + - name: LOG_LEVEL | ||
| 66 | + value: "debug" | ||
| 67 | + - name: ERROR_BASE_CODE | ||
| 68 | + value: "1" | ||
| 69 | + - name: ERROR_BASE_CODE_MULTIPLE | ||
| 70 | + value: "1000" | ||
| 71 | + - name: ABILITY_SERVICE_HOST | ||
| 72 | + value: "https://suplus-worth-app-gateway-test.fjmaimaimai.com" | ||
| 73 | + - name: MMM_OPEN_API_SERVICE_HOST | ||
| 74 | + value: "http://mmm-open-api-test.fjmaimaimai.com" | ||
| 75 | + volumes: | ||
| 76 | + - name: accesslogs | ||
| 77 | + emptyDir: {} |
go.mod
0 → 100644
| 1 | +module gitlab.fjmaimaimai.com/mmm-go/partnermg | ||
| 2 | + | ||
| 3 | +go 1.14 | ||
| 4 | + | ||
| 5 | +require ( | ||
| 6 | + github.com/ajg/form v1.5.1 // indirect | ||
| 7 | + github.com/astaxie/beego v1.12.1 | ||
| 8 | + github.com/dgrijalva/jwt-go v3.2.0+incompatible | ||
| 9 | + github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 // indirect | ||
| 10 | + github.com/fatih/structs v1.1.0 // indirect | ||
| 11 | + github.com/gavv/httpexpect v2.0.0+incompatible | ||
| 12 | + github.com/go-pg/pg/v10 v10.0.0-beta.2 | ||
| 13 | + github.com/google/go-querystring v1.0.0 // indirect | ||
| 14 | + github.com/gorilla/websocket v1.4.2 // indirect | ||
| 15 | + github.com/imkira/go-interpol v1.1.0 // indirect | ||
| 16 | + github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect | ||
| 17 | + github.com/linmadan/egglib-go v0.0.0-20191217144343-ca4539f95bf9 | ||
| 18 | + github.com/mattn/go-colorable v0.1.6 // indirect | ||
| 19 | + github.com/moul/http2curl v1.0.0 // indirect | ||
| 20 | + github.com/onsi/ginkgo v1.13.0 | ||
| 21 | + github.com/onsi/gomega v1.10.1 | ||
| 22 | + github.com/prometheus/common v0.10.0 | ||
| 23 | + github.com/sergi/go-diff v1.1.0 // indirect | ||
| 24 | + github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect | ||
| 25 | + github.com/smartystreets/goconvey v1.6.4 // indirect | ||
| 26 | + github.com/valyala/fasthttp v1.14.0 // indirect | ||
| 27 | + github.com/xeipuuv/gojsonschema v1.2.0 // indirect | ||
| 28 | + github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 // indirect | ||
| 29 | + github.com/yudai/gojsondiff v1.0.0 // indirect | ||
| 30 | + github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect | ||
| 31 | + github.com/yudai/pp v2.0.1+incompatible // indirect | ||
| 32 | +) |
main.go
0 → 100644
| 1 | +package main | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/astaxie/beego" | ||
| 5 | + "github.com/astaxie/beego/logs" | ||
| 6 | + _ "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/infrastructure/pg" | ||
| 7 | + _ "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/log" | ||
| 8 | + _ "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/port/beego" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +func main() { | ||
| 12 | + logs.Info("应用启动") | ||
| 13 | + beego.Run() | ||
| 14 | +} |
| 1 | +package service | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/linmadan/egglib-go/core/application" | ||
| 5 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/application/adminUser/query" | ||
| 6 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/domain" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +//AdminUserService 管理员相关服务 | ||
| 10 | +type AdminUserService struct { | ||
| 11 | +} | ||
| 12 | + | ||
| 13 | +func NewAdminUserService(option map[string]interface{}) *AdminUserService { | ||
| 14 | + newAdminUserService := new(AdminUserService) | ||
| 15 | + return newAdminUserService | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | +func (adminUserSrv AdminUserService) GetAdminUser(getAdminUserQuery *query.GetAdminUserQuery) (interface{}, error) { | ||
| 19 | + //实际业务 | ||
| 20 | + var err error | ||
| 21 | + if err != nil { | ||
| 22 | + return nil, application.ThrowError(application.BUSINESS_ERROR, "业务逻辑错误") | ||
| 23 | + } | ||
| 24 | + | ||
| 25 | + return domain.AdminUser{}, nil | ||
| 26 | +} |
pkg/application/factory/dao.go
0 → 100644
| 1 | +package factory | ||
| 2 | + | ||
| 3 | +//func CreateTaskDao(options map[string]interface{}) (*dao.TaskDao, error) { | ||
| 4 | +// var transactionContext *pg.TransactionContext | ||
| 5 | +// if value, ok := options["transactionContext"]; ok { | ||
| 6 | +// transactionContext = value.(*pg.TransactionContext) | ||
| 7 | +// } | ||
| 8 | +// return dao.NewTaskDao(transactionContext) | ||
| 9 | +//} |
pkg/application/factory/repository.go
0 → 100644
| 1 | +package factory | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/domain" | ||
| 5 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/infrastructure/pg/transaction" | ||
| 6 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/infrastructure/repository" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +//CreatePartnerInfoRepository 合伙人信息 | ||
| 10 | +func CreatePartnerInfoRepository(options map[string]interface{}) (domain.PartnerInfoRepository, error) { | ||
| 11 | + var transactionContext *transaction.TransactionContext | ||
| 12 | + if value, ok := options["transactionContext"]; ok { | ||
| 13 | + transactionContext = value.(*transaction.TransactionContext) | ||
| 14 | + } | ||
| 15 | + return repository.NewPartnerInfoRepository(transactionContext) | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | +//CreateAdminUserRepository 管理员信息 | ||
| 19 | +func CreateAdminUserRepository(options map[string]interface{}) (domain.AdminUserRepository, error) { | ||
| 20 | + var transactionContext *transaction.TransactionContext | ||
| 21 | + if value, ok := options["transactionContext"]; ok { | ||
| 22 | + transactionContext = value.(*transaction.TransactionContext) | ||
| 23 | + } | ||
| 24 | + return repository.NewAdminUserRepository(transactionContext) | ||
| 25 | +} |
pkg/application/factory/transaction.go
0 → 100644
| 1 | +package factory | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/linmadan/egglib-go/core/application" | ||
| 5 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/infrastructure/pg" | ||
| 6 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/infrastructure/pg/transaction" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +func CreateTransactionContext(options map[string]interface{}) (application.TransactionContext, error) { | ||
| 10 | + return &transaction.TransactionContext{ | ||
| 11 | + PgDd: pg.DB, | ||
| 12 | + }, nil | ||
| 13 | +} |
| 1 | +package command | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/domain" | ||
| 6 | + | ||
| 7 | + "github.com/astaxie/beego/validation" | ||
| 8 | +) | ||
| 9 | + | ||
| 10 | +type CreatePartnerInfoCommand struct { | ||
| 11 | + domain.PartnerInfo | ||
| 12 | +} | ||
| 13 | + | ||
| 14 | +func (c *CreatePartnerInfoCommand) ValidateCommand() error { | ||
| 15 | + valid := validation.Validation{} | ||
| 16 | + b, err := valid.Valid(c) | ||
| 17 | + if err != nil { | ||
| 18 | + return err | ||
| 19 | + } | ||
| 20 | + if !b { | ||
| 21 | + for _, validErr := range valid.Errors { | ||
| 22 | + return fmt.Errorf("%s %s", validErr.Key, validErr.Message) | ||
| 23 | + } | ||
| 24 | + } | ||
| 25 | + return nil | ||
| 26 | +} |
| 1 | +package command | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + | ||
| 6 | + "github.com/astaxie/beego/validation" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +type RemovePartnerInfoCommand struct { | ||
| 10 | + // 合伙人ID | ||
| 11 | + Id int `json:"id" valid:"Required"` | ||
| 12 | +} | ||
| 13 | + | ||
| 14 | +func (c *RemovePartnerInfoCommand) ValidateCommand() error { | ||
| 15 | + valid := validation.Validation{} | ||
| 16 | + b, err := valid.Valid(c) | ||
| 17 | + if err != nil { | ||
| 18 | + return err | ||
| 19 | + } | ||
| 20 | + if !b { | ||
| 21 | + for _, validErr := range valid.Errors { | ||
| 22 | + return fmt.Errorf("%s %s", validErr.Key, validErr.Message) | ||
| 23 | + } | ||
| 24 | + } | ||
| 25 | + return nil | ||
| 26 | +} |
| 1 | +package command | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "github.com/astaxie/beego/validation" | ||
| 6 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/domain" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +type UpdatePartnerInfoCommand struct { | ||
| 10 | + // 合伙人Id | ||
| 11 | + Id int `json:"id,omitempty"` | ||
| 12 | + | ||
| 13 | + // 合伙人姓名 | ||
| 14 | + PartnerName string `json:"partnerName,omitempty"` | ||
| 15 | + // 登录账号 | ||
| 16 | + Account string `json:"account,omitempty"` | ||
| 17 | + // 登录密码 | ||
| 18 | + Password string `json:"password,omitempty"` | ||
| 19 | + // 状态(1:启用或者0:禁用) | ||
| 20 | + Status int `json:"status"` | ||
| 21 | + // 合伙类别 (1.研发合伙人 2.业务合伙人 3.事业) | ||
| 22 | + PartnerCategory int `json:"partnerCategory,omitempty"` | ||
| 23 | + | ||
| 24 | + //关联业务员 | ||
| 25 | + Salesman []*domain.Salesman `json:"salesman,omitempty"` | ||
| 26 | +} | ||
| 27 | + | ||
| 28 | +func (c *UpdatePartnerInfoCommand) ValidateCommand() error { | ||
| 29 | + valid := validation.Validation{} | ||
| 30 | + b, err := valid.Valid(c) | ||
| 31 | + if err != nil { | ||
| 32 | + return err | ||
| 33 | + } | ||
| 34 | + if !b { | ||
| 35 | + for _, validErr := range valid.Errors { | ||
| 36 | + return fmt.Errorf("%s %s", validErr.Key, validErr.Message) | ||
| 37 | + } | ||
| 38 | + } | ||
| 39 | + return nil | ||
| 40 | +} |
| 1 | +package query | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + | ||
| 6 | + "github.com/astaxie/beego/validation" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +type GetPartnerInfoQuery struct { | ||
| 10 | + // 合伙人ID | ||
| 11 | + Id int `json:"id" valid:"Required"` | ||
| 12 | +} | ||
| 13 | + | ||
| 14 | +func (q *GetPartnerInfoQuery) ValidateQuery() error { | ||
| 15 | + valid := validation.Validation{} | ||
| 16 | + b, err := valid.Valid(q) | ||
| 17 | + if err != nil { | ||
| 18 | + return err | ||
| 19 | + } | ||
| 20 | + if !b { | ||
| 21 | + for _, validErr := range valid.Errors { | ||
| 22 | + return fmt.Errorf("%s %s", validErr.Key, validErr.Message) | ||
| 23 | + } | ||
| 24 | + } | ||
| 25 | + return nil | ||
| 26 | +} |
| 1 | +package query | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + | ||
| 6 | + "github.com/astaxie/beego/validation" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +type ListPartnerInfoQuery struct { | ||
| 10 | + //状态 | ||
| 11 | + Status int `json:"status,omitempty"` | ||
| 12 | + // 合伙人类别 | ||
| 13 | + PartnerCategory int `json:"partnerCategory,omitempty"` | ||
| 14 | + //按创建任务时间排序(ASC,DESC) | ||
| 15 | + SortByCreateTime string `json:"sortByCreateTime,omitempty"` | ||
| 16 | + //按创建任务时间排序(ASC,DESC) | ||
| 17 | + SortByUpdateTime string `json:"sortByUpdateTime,omitempty"` | ||
| 18 | + // 查询偏离量 | ||
| 19 | + Offset int `json:"offset,omitempty"` | ||
| 20 | + // 查询限制 | ||
| 21 | + Limit int `json:"limit,omitempty"` | ||
| 22 | +} | ||
| 23 | + | ||
| 24 | +func (q *ListPartnerInfoQuery) ValidateQuery() error { | ||
| 25 | + valid := validation.Validation{} | ||
| 26 | + b, err := valid.Valid(q) | ||
| 27 | + if err != nil { | ||
| 28 | + return err | ||
| 29 | + } | ||
| 30 | + if !b { | ||
| 31 | + for _, validErr := range valid.Errors { | ||
| 32 | + return fmt.Errorf("%s %s", validErr.Key, validErr.Message) | ||
| 33 | + } | ||
| 34 | + } | ||
| 35 | + return nil | ||
| 36 | +} |
| 1 | +package service | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "github.com/linmadan/egglib-go/core/application" | ||
| 6 | + "github.com/linmadan/egglib-go/utils/tool_funs" | ||
| 7 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/application/factory" | ||
| 8 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/application/partnerInfo/command" | ||
| 9 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/application/partnerInfo/query" | ||
| 10 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/domain" | ||
| 11 | + "time" | ||
| 12 | +) | ||
| 13 | + | ||
| 14 | +// 客户价值服务 | ||
| 15 | +type PartnerInfoService struct { | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | +// 创建客户价值 | ||
| 19 | +func (PartnerInfoService *PartnerInfoService) CreatePartnerInfo(command *command.CreatePartnerInfoCommand) (data interface{}, err error) { | ||
| 20 | + var ( | ||
| 21 | + count int64 | ||
| 22 | + transactionContext, _ = factory.CreateTransactionContext(nil) | ||
| 23 | + ) | ||
| 24 | + if err = command.ValidateCommand(); err != nil { | ||
| 25 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 26 | + } | ||
| 27 | + if err = transactionContext.StartTransaction(); err != nil { | ||
| 28 | + return nil, err | ||
| 29 | + } | ||
| 30 | + defer func() { | ||
| 31 | + if err != nil { | ||
| 32 | + transactionContext.RollbackTransaction() | ||
| 33 | + } | ||
| 34 | + }() | ||
| 35 | + | ||
| 36 | + newPartnerInfo := &command.PartnerInfo | ||
| 37 | + newPartnerInfo.CreateAt = time.Now() | ||
| 38 | + newPartnerInfo.UpdateAt = time.Now() | ||
| 39 | + | ||
| 40 | + var PartnerInfoRepository domain.PartnerInfoRepository | ||
| 41 | + if PartnerInfoRepository, err = factory.CreatePartnerInfoRepository(map[string]interface{}{"transactionContext": transactionContext}); err != nil { | ||
| 42 | + return nil, err | ||
| 43 | + } | ||
| 44 | + if count, _, err = PartnerInfoRepository.Find(map[string]interface{}{"account": command.Account}); err != nil { | ||
| 45 | + return nil, err | ||
| 46 | + } | ||
| 47 | + if count > 0 { | ||
| 48 | + return nil, fmt.Errorf("标签不可重复名称") | ||
| 49 | + } | ||
| 50 | + | ||
| 51 | + if data, err = PartnerInfoRepository.Save(newPartnerInfo); err != nil { | ||
| 52 | + return | ||
| 53 | + } | ||
| 54 | + err = transactionContext.CommitTransaction() | ||
| 55 | + return | ||
| 56 | +} | ||
| 57 | + | ||
| 58 | +// 返回客户价值 | ||
| 59 | +func (PartnerInfoService *PartnerInfoService) GetPartnerInfo(command *query.GetPartnerInfoQuery) (data interface{}, err error) { | ||
| 60 | + var ( | ||
| 61 | + transactionContext, _ = factory.CreateTransactionContext(nil) | ||
| 62 | + ) | ||
| 63 | + if err = command.ValidateQuery(); err != nil { | ||
| 64 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 65 | + } | ||
| 66 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 67 | + return nil, err | ||
| 68 | + } | ||
| 69 | + defer func() { | ||
| 70 | + if err != nil { | ||
| 71 | + transactionContext.RollbackTransaction() | ||
| 72 | + } | ||
| 73 | + }() | ||
| 74 | + var PartnerInfoRepository domain.PartnerInfoRepository | ||
| 75 | + if PartnerInfoRepository, err = factory.CreatePartnerInfoRepository(map[string]interface{}{"transactionContext": transactionContext}); err != nil { | ||
| 76 | + return nil, err | ||
| 77 | + } | ||
| 78 | + data, err = PartnerInfoRepository.FindOne(map[string]interface{}{"Id": command.Id}) | ||
| 79 | + if err != nil { | ||
| 80 | + return nil, err | ||
| 81 | + } | ||
| 82 | + if data == nil { | ||
| 83 | + return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(command.Id))) | ||
| 84 | + } | ||
| 85 | + err = transactionContext.CommitTransaction() | ||
| 86 | + return | ||
| 87 | +} | ||
| 88 | + | ||
| 89 | +// 更新客户价值 | ||
| 90 | +func (PartnerInfoService *PartnerInfoService) UpdatePartnerInfo(updatePartnerInfoCommand *command.UpdatePartnerInfoCommand) (data interface{}, err error) { | ||
| 91 | + var ( | ||
| 92 | + transactionContext, _ = factory.CreateTransactionContext(nil) | ||
| 93 | + PartnerInfo *domain.PartnerInfo | ||
| 94 | + ) | ||
| 95 | + if err = updatePartnerInfoCommand.ValidateCommand(); err != nil { | ||
| 96 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 97 | + } | ||
| 98 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 99 | + return nil, err | ||
| 100 | + } | ||
| 101 | + defer func() { | ||
| 102 | + if err != nil { | ||
| 103 | + transactionContext.RollbackTransaction() | ||
| 104 | + } | ||
| 105 | + }() | ||
| 106 | + var PartnerInfoRepository domain.PartnerInfoRepository | ||
| 107 | + if PartnerInfoRepository, err = factory.CreatePartnerInfoRepository(map[string]interface{}{"transactionContext": transactionContext}); err != nil { | ||
| 108 | + return nil, err | ||
| 109 | + } | ||
| 110 | + PartnerInfo, err = PartnerInfoRepository.FindOne(map[string]interface{}{"Id": updatePartnerInfoCommand.Id}) | ||
| 111 | + if err != nil { | ||
| 112 | + return nil, err | ||
| 113 | + } | ||
| 114 | + if PartnerInfo == nil { | ||
| 115 | + return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(updatePartnerInfoCommand.Id))) | ||
| 116 | + } | ||
| 117 | + //if count, PartnerInfos, err := PartnerInfoRepository.Find(map[string]interface{}{ | ||
| 118 | + // "PartnerInfoName": updatePartnerInfoCommand.PartnerInfoName, | ||
| 119 | + // "companyId": PartnerInfo.CompanyId, | ||
| 120 | + //}); err != nil { | ||
| 121 | + // return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 122 | + //} else { | ||
| 123 | + // if count > 0 && PartnerInfos[0].PartnerInfoId != PartnerInfo.PartnerInfoId { | ||
| 124 | + // return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "标签不可重复名称") | ||
| 125 | + // } | ||
| 126 | + //} | ||
| 127 | + if err := PartnerInfo.Update(tool_funs.SimpleStructToMap(updatePartnerInfoCommand)); err != nil { | ||
| 128 | + return nil, err | ||
| 129 | + } | ||
| 130 | + | ||
| 131 | + if data, err = PartnerInfoRepository.Save(PartnerInfo); err != nil { | ||
| 132 | + return nil, err | ||
| 133 | + } | ||
| 134 | + err = transactionContext.CommitTransaction() | ||
| 135 | + return | ||
| 136 | +} | ||
| 137 | + | ||
| 138 | +// 移除客户价值 | ||
| 139 | +func (PartnerInfoService *PartnerInfoService) RemovePartnerInfo(removePartnerInfoCommand *command.RemovePartnerInfoCommand) (data interface{}, err error) { | ||
| 140 | + var ( | ||
| 141 | + transactionContext, _ = factory.CreateTransactionContext(nil) | ||
| 142 | + PartnerInfo *domain.PartnerInfo | ||
| 143 | + ) | ||
| 144 | + if err = removePartnerInfoCommand.ValidateCommand(); err != nil { | ||
| 145 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 146 | + } | ||
| 147 | + if err = transactionContext.StartTransaction(); err != nil { | ||
| 148 | + return nil, err | ||
| 149 | + } | ||
| 150 | + defer func() { | ||
| 151 | + if err != nil { | ||
| 152 | + transactionContext.RollbackTransaction() | ||
| 153 | + } | ||
| 154 | + }() | ||
| 155 | + var PartnerInfoRepository domain.PartnerInfoRepository | ||
| 156 | + if PartnerInfoRepository, err = factory.CreatePartnerInfoRepository(map[string]interface{}{"transactionContext": transactionContext}); err != nil { | ||
| 157 | + return nil, err | ||
| 158 | + } | ||
| 159 | + PartnerInfo, err = PartnerInfoRepository.FindOne(map[string]interface{}{"Id": removePartnerInfoCommand.Id}) | ||
| 160 | + if err != nil { | ||
| 161 | + return nil, err | ||
| 162 | + } | ||
| 163 | + if PartnerInfo == nil { | ||
| 164 | + return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(removePartnerInfoCommand.Id))) | ||
| 165 | + } | ||
| 166 | + if data, err = PartnerInfoRepository.Remove(PartnerInfo); err != nil { | ||
| 167 | + return nil, err | ||
| 168 | + } | ||
| 169 | + err = transactionContext.CommitTransaction() | ||
| 170 | + return | ||
| 171 | +} | ||
| 172 | + | ||
| 173 | +// 返回客户价值列表 | ||
| 174 | +func (PartnerInfoService *PartnerInfoService) ListPartnerInfo(listPartnerInfoQuery *query.ListPartnerInfoQuery) (data interface{}, err error) { | ||
| 175 | + var ( | ||
| 176 | + transactionContext, _ = factory.CreateTransactionContext(nil) | ||
| 177 | + PartnerInfos []*domain.PartnerInfo | ||
| 178 | + count int64 | ||
| 179 | + ) | ||
| 180 | + if err = listPartnerInfoQuery.ValidateQuery(); err != nil { | ||
| 181 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 182 | + } | ||
| 183 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 184 | + return nil, err | ||
| 185 | + } | ||
| 186 | + defer func() { | ||
| 187 | + if err != nil { | ||
| 188 | + transactionContext.RollbackTransaction() | ||
| 189 | + } | ||
| 190 | + }() | ||
| 191 | + var PartnerInfoRepository domain.PartnerInfoRepository | ||
| 192 | + if PartnerInfoRepository, err = factory.CreatePartnerInfoRepository(map[string]interface{}{"transactionContext": transactionContext}); err != nil { | ||
| 193 | + return nil, err | ||
| 194 | + } | ||
| 195 | + if count, PartnerInfos, err = PartnerInfoRepository.Find(tool_funs.SimpleStructToMap(listPartnerInfoQuery)); err != nil { | ||
| 196 | + return nil, err | ||
| 197 | + } | ||
| 198 | + if err = transactionContext.CommitTransaction(); err != nil { | ||
| 199 | + return nil, err | ||
| 200 | + } | ||
| 201 | + return map[string]interface{}{ | ||
| 202 | + "count": count, | ||
| 203 | + "partnerInfos": PartnerInfos, | ||
| 204 | + }, nil | ||
| 205 | +} | ||
| 206 | + | ||
| 207 | +func NewPartnerInfoService(options map[string]interface{}) *PartnerInfoService { | ||
| 208 | + newPartnerInfoService := &PartnerInfoService{} | ||
| 209 | + return newPartnerInfoService | ||
| 210 | +} |
pkg/constant/common.go
0 → 100644
pkg/constant/postgresql.go
0 → 100644
| 1 | +package constant | ||
| 2 | + | ||
| 3 | +import "os" | ||
| 4 | + | ||
| 5 | +var POSTGRESQL_DB_NAME = "partner_dev" | ||
| 6 | +var POSTGRESQL_USER = "postgres" | ||
| 7 | +var POSTGRESQL_PASSWORD = "postgres_15432" | ||
| 8 | +var POSTGRESQL_HOST = "101.37.68.23" | ||
| 9 | +var POSTGRESQL_PORT = "15432" | ||
| 10 | +var DISABLE_CREATE_TABLE = true | ||
| 11 | +var DISABLE_SQL_GENERATE_PRINT = false | ||
| 12 | + | ||
| 13 | +func init() { | ||
| 14 | + if os.Getenv("POSTGRESQL_DB_NAME") != "" { | ||
| 15 | + POSTGRESQL_DB_NAME = os.Getenv("POSTGRESQL_DB_NAME") | ||
| 16 | + } | ||
| 17 | + if os.Getenv("POSTGRESQL_USER") != "" { | ||
| 18 | + POSTGRESQL_USER = os.Getenv("POSTGRESQL_USER") | ||
| 19 | + } | ||
| 20 | + if os.Getenv("POSTGRESQL_PASSWORD") != "" { | ||
| 21 | + POSTGRESQL_PASSWORD = os.Getenv("POSTGRESQL_PASSWORD") | ||
| 22 | + } | ||
| 23 | + if os.Getenv("POSTGRESQL_HOST") != "" { | ||
| 24 | + POSTGRESQL_HOST = os.Getenv("POSTGRESQL_HOST") | ||
| 25 | + } | ||
| 26 | + if os.Getenv("POSTGRESQL_PORT") != "" { | ||
| 27 | + POSTGRESQL_PORT = os.Getenv("POSTGRESQL_PORT") | ||
| 28 | + } | ||
| 29 | + if os.Getenv("DISABLE_CREATE_TABLE") != "" { | ||
| 30 | + DISABLE_CREATE_TABLE = true | ||
| 31 | + } | ||
| 32 | + if os.Getenv("DISABLE_SQL_GENERATE_PRINT") != "" { | ||
| 33 | + DISABLE_SQL_GENERATE_PRINT = true | ||
| 34 | + } | ||
| 35 | +} |
pkg/domain/admin_permission.go
0 → 100644
| 1 | +package domain | ||
| 2 | + | ||
| 3 | +//权限代码 | ||
| 4 | +const ( | ||
| 5 | + PERMINSSION_ADMIN_USER string = "ADMIN_USER" | ||
| 6 | + PERMINSSION_PARTNER string = "PARTNER" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +//权限数据 | ||
| 10 | +var ConstAdminPermissions = map[string]AdminPermission{ | ||
| 11 | + PERMINSSION_ADMIN_USER: AdminPermission{ | ||
| 12 | + Code: PERMINSSION_ADMIN_USER, | ||
| 13 | + Name: "管理员管理", | ||
| 14 | + }, | ||
| 15 | + PERMINSSION_PARTNER: AdminPermission{ | ||
| 16 | + Code: PERMINSSION_PARTNER, | ||
| 17 | + Name: "合伙人管理", | ||
| 18 | + }, | ||
| 19 | +} | ||
| 20 | + | ||
| 21 | +// 权限结构 | ||
| 22 | +type AdminPermission struct { | ||
| 23 | + Code string `json:"code"` | ||
| 24 | + Name string `json:"name"` | ||
| 25 | +} | ||
| 26 | + | ||
| 27 | +func (permission AdminPermission) GetPermissions(codes []string) []AdminPermission { | ||
| 28 | + newPermissions := []AdminPermission{} | ||
| 29 | + if len(codes) == 0 { | ||
| 30 | + return newPermissions | ||
| 31 | + } | ||
| 32 | + for i := range codes { | ||
| 33 | + code := codes[i] | ||
| 34 | + if _, ok := ConstAdminPermissions[code]; ok { | ||
| 35 | + newPermissions = append(newPermissions, ConstAdminPermissions[code]) | ||
| 36 | + } | ||
| 37 | + } | ||
| 38 | + return newPermissions | ||
| 39 | +} |
pkg/domain/admin_user.go
0 → 100644
| 1 | +package domain | ||
| 2 | + | ||
| 3 | +//AdminUser 管理员 | ||
| 4 | +type AdminUser struct { | ||
| 5 | + //id | ||
| 6 | + Id int64 `json:"id"` | ||
| 7 | + //账号 | ||
| 8 | + Account string `json:"account"` | ||
| 9 | + //密码 | ||
| 10 | + Password string `json:"password"` | ||
| 11 | + //管理员名称 | ||
| 12 | + AdminName string `json:"admin_name"` | ||
| 13 | + //是否是默认系统账号 | ||
| 14 | + IsDefault bool `json:"is_default"` | ||
| 15 | + //账号是否可用 | ||
| 16 | + IsUsable bool `json:"is_userable"` | ||
| 17 | + //创建时间 | ||
| 18 | + CreateAt string `json:"create_at"` | ||
| 19 | + //用户权限 | ||
| 20 | + Permission []AdminPermission `json:"permission"` | ||
| 21 | +} | ||
| 22 | + | ||
| 23 | +type AdminUserFindQuery struct { | ||
| 24 | + AccountLike string | ||
| 25 | + Offset int | ||
| 26 | + Limit int | ||
| 27 | +} | ||
| 28 | + | ||
| 29 | +type AdminUserFindOneQuery struct { | ||
| 30 | + AdminUserId int64 | ||
| 31 | + AccountEqual string | ||
| 32 | +} | ||
| 33 | + | ||
| 34 | +type AdminUserRepository interface { | ||
| 35 | + // Save(*AdminUser) (*AdminUser, error) | ||
| 36 | + // Remove(user *AdminUser) (*AdminUser, error) | ||
| 37 | + FindOne(qureyOptions AdminUserFindOneQuery) (*AdminUser, error) | ||
| 38 | + // Find(queryOptions AdminUserFindQuery) (int, []*AdminUser, error) | ||
| 39 | +} |
pkg/domain/partner_info.go
0 → 100644
| 1 | +package domain | ||
| 2 | + | ||
| 3 | +import "time" | ||
| 4 | + | ||
| 5 | +type PartnerInfoRepository interface { | ||
| 6 | + Save(dm *PartnerInfo) (*PartnerInfo, error) | ||
| 7 | + Remove(dm *PartnerInfo) (*PartnerInfo, error) | ||
| 8 | + FindOne(queryOptions map[string]interface{}) (*PartnerInfo, error) | ||
| 9 | + Find(queryOptions map[string]interface{}) (int64, []*PartnerInfo, error) | ||
| 10 | +} | ||
| 11 | + | ||
| 12 | +type PartnerInfo struct { | ||
| 13 | + // 合伙人ID | ||
| 14 | + Id int64 `json:"id"` | ||
| 15 | + // 合伙人姓名 | ||
| 16 | + PartnerName string `json:"partnerName"` | ||
| 17 | + // 登录账号 | ||
| 18 | + Account string `json:"account"` | ||
| 19 | + // 登录密码 | ||
| 20 | + Password string `json:"password"` | ||
| 21 | + // 状态(1:启用或者0:禁用) | ||
| 22 | + Status int `json:"status"` | ||
| 23 | + // 合伙类别 (1.研发合伙人 2.业务合伙人 3.事业) | ||
| 24 | + PartnerCategory int `json:"partnerCategory"` | ||
| 25 | + | ||
| 26 | + //创建时间 | ||
| 27 | + CreateAt time.Time `json:"createAt"` | ||
| 28 | + //更新时间 | ||
| 29 | + UpdateAt time.Time `json:"updateAt"` | ||
| 30 | + | ||
| 31 | + //关联业务员 | ||
| 32 | + Salesman []*Salesman `json:"salesman"` | ||
| 33 | +} | ||
| 34 | + | ||
| 35 | +func (m *PartnerInfo) Identify() interface{} { | ||
| 36 | + if m.Id == 0 { | ||
| 37 | + return nil | ||
| 38 | + } | ||
| 39 | + return m.Id | ||
| 40 | +} | ||
| 41 | + | ||
| 42 | +func (m *PartnerInfo) Update(data map[string]interface{}) error { | ||
| 43 | + if partnerName, ok := data["partnerName"]; ok && partnerName != "" { | ||
| 44 | + m.PartnerName = partnerName.(string) | ||
| 45 | + } | ||
| 46 | + if account, ok := data["account"]; ok && account != "" { | ||
| 47 | + m.Account = account.(string) | ||
| 48 | + } | ||
| 49 | + if password, ok := data["account"]; ok && password != "" { | ||
| 50 | + m.Password = password.(string) | ||
| 51 | + } | ||
| 52 | + if status, ok := data["status"]; ok && status != 0 { | ||
| 53 | + m.Status = status.(int) | ||
| 54 | + } | ||
| 55 | + if partnerCategory, ok := data["partnerCategory"]; ok && partnerCategory != 0 { | ||
| 56 | + m.PartnerCategory = partnerCategory.(int) | ||
| 57 | + } | ||
| 58 | + if salesman, ok := data["salesman"]; ok { | ||
| 59 | + m.Salesman = salesman.([]*Salesman) | ||
| 60 | + } | ||
| 61 | + m.UpdateAt = time.Now() | ||
| 62 | + return nil | ||
| 63 | +} |
pkg/domain/salesman.go
0 → 100644
pkg/infrastructure/dao/pg_employee_dao.go
0 → 100644
| 1 | +package dao | ||
| 2 | + | ||
| 3 | +//import ( | ||
| 4 | +// "fmt" | ||
| 5 | +// "github.com/go-pg/pg/v10" | ||
| 6 | +// pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | ||
| 7 | +// "gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/domain" | ||
| 8 | +// "gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/infrastructure/pg/models" | ||
| 9 | +// "time" | ||
| 10 | +//) | ||
| 11 | +// | ||
| 12 | +//type EmployeeDao struct { | ||
| 13 | +// transactionContext *pgTransaction.TransactionContext | ||
| 14 | +//} | ||
| 15 | +// | ||
| 16 | +//func (dao *EmployeeDao) BatchRemove(uids []int64) error { | ||
| 17 | +// tx := dao.transactionContext.PgTx | ||
| 18 | +// _, err := tx.QueryOne( | ||
| 19 | +// pg.Scan(), | ||
| 20 | +// "DELETE FROM employees WHERE uid IN (?)", | ||
| 21 | +// pg.In(uids)) | ||
| 22 | +// return err | ||
| 23 | +//} | ||
| 24 | +// | ||
| 25 | +//func (dao *EmployeeDao) BatchSetStatus(uids []int64, status int) error { | ||
| 26 | +// tx := dao.transactionContext.PgTx | ||
| 27 | +// _, err := tx.QueryOne( | ||
| 28 | +// pg.Scan(), | ||
| 29 | +// "UPDATE employees SET status=? WHERE uid IN (?)", | ||
| 30 | +// status, pg.In(uids)) | ||
| 31 | +// return err | ||
| 32 | +//} | ||
| 33 | +// | ||
| 34 | +//func (dao *EmployeeDao) ChangePrincipal(companyId int64, employeeAccount string) error { | ||
| 35 | +// tx := dao.transactionContext.PgTx | ||
| 36 | +// if _, err := tx.Query( | ||
| 37 | +// pg.Scan(), | ||
| 38 | +// "UPDATE employees SET is_principal=? WHERE company_id=?", | ||
| 39 | +// false, companyId); err != nil { | ||
| 40 | +// return err | ||
| 41 | +// } | ||
| 42 | +// if _, err := tx.QueryOne( | ||
| 43 | +// pg.Scan(), | ||
| 44 | +// "UPDATE employees SET is_principal=? WHERE company_id=? AND employee_account=?", | ||
| 45 | +// true, companyId, employeeAccount); err != nil { | ||
| 46 | +// return err | ||
| 47 | +// } | ||
| 48 | +// return nil | ||
| 49 | +//} | ||
| 50 | +// | ||
| 51 | +//func (dao *EmployeeDao) TransferSuMoney(uid int64, suMoney float64) error { | ||
| 52 | +// tx := dao.transactionContext.PgTx | ||
| 53 | +// _, err := tx.QueryOne( | ||
| 54 | +// pg.Scan(), | ||
| 55 | +// "UPDATE employees SET su_money=su_money+? WHERE uid=?", | ||
| 56 | +// suMoney, uid) | ||
| 57 | +// return err | ||
| 58 | +//} | ||
| 59 | +// | ||
| 60 | +//func (dao *EmployeeDao) CalculatePersonUnReadNotification(uid int64) (map[string]int, error) { | ||
| 61 | +// var unReadSystemNotification int | ||
| 62 | +// var unReadInteractionNotification int | ||
| 63 | +// tx := dao.transactionContext.PgTx | ||
| 64 | +// sentNotificationModel := new(models.SentNotification) | ||
| 65 | +// if count, err := tx.Model(sentNotificationModel).Relation("Notification"). | ||
| 66 | +// Where(`sent_notification.receiver @> '{"uid":?}'`, uid). | ||
| 67 | +// Where("notification.notification_type = ?", domain.NOTIFICATION_TYPE_SYSTEM). | ||
| 68 | +// Where("sent_notification.is_read = ?", false). | ||
| 69 | +// Count(); err != nil { | ||
| 70 | +// return nil, err | ||
| 71 | +// } else { | ||
| 72 | +// unReadSystemNotification = count | ||
| 73 | +// } | ||
| 74 | +// if count, err := tx.Model(sentNotificationModel).Relation("Notification"). | ||
| 75 | +// Where(`sent_notification.receiver @> '{"uid":?}'`, uid). | ||
| 76 | +// Where("notification.notification_type = ?", domain.NOTIFICATION_TYPE_INTERACTION). | ||
| 77 | +// Where("sent_notification.is_read = ?", false). | ||
| 78 | +// Count(); err != nil { | ||
| 79 | +// return nil, err | ||
| 80 | +// } else { | ||
| 81 | +// unReadInteractionNotification = count | ||
| 82 | +// } | ||
| 83 | +// return map[string]int{ | ||
| 84 | +// "unReadSystemNotification": unReadSystemNotification, | ||
| 85 | +// "unReadInteractionNotification": unReadInteractionNotification, | ||
| 86 | +// }, nil | ||
| 87 | +//} | ||
| 88 | +// | ||
| 89 | +//func (dao *EmployeeDao) CalculatePersonSuMoney(uid int64) (map[string]interface{}, error) { | ||
| 90 | +// var incomeSuMoney float64 | ||
| 91 | +// var incomeSuMoneyOfYesterday float64 | ||
| 92 | +// tx := dao.transactionContext.PgTx | ||
| 93 | +// suMoneyTransactionRecordModel := new(models.SuMoneyTransactionRecord) | ||
| 94 | +// yesterday := time.Now().AddDate(0, 0, -1) | ||
| 95 | +// if err := tx.Model(suMoneyTransactionRecordModel). | ||
| 96 | +// ColumnExpr("sum(su_money_transaction_record.su_money) AS income_su_money"). | ||
| 97 | +// Where(`su_money_transaction_record.employee @> '{"uid":?}'`, uid). | ||
| 98 | +// Where(`su_money_transaction_record.record_type = ?`, 2). | ||
| 99 | +// Where(`su_money_transaction_record.create_time > ?`, time.Date(yesterday.Year(), yesterday.Month(), yesterday.Day(), 0, 0, 0, 0, yesterday.Location())). | ||
| 100 | +// Where(`su_money_transaction_record.create_time < ?`, time.Date(yesterday.Year(), yesterday.Month(), yesterday.Day(), 23, 59, 59, 0, yesterday.Location())). | ||
| 101 | +// Select(&incomeSuMoneyOfYesterday); err != nil { | ||
| 102 | +// return nil, err | ||
| 103 | +// } | ||
| 104 | +// if err := tx.Model(suMoneyTransactionRecordModel). | ||
| 105 | +// ColumnExpr("sum(su_money_transaction_record.su_money) AS income_su_money"). | ||
| 106 | +// Where(`su_money_transaction_record.employee @> '{"uid":?}'`, uid). | ||
| 107 | +// Where(`su_money_transaction_record.record_type = ?`, 2). | ||
| 108 | +// Select(&incomeSuMoney); err != nil { | ||
| 109 | +// return nil, err | ||
| 110 | +// } | ||
| 111 | +// return map[string]interface{}{ | ||
| 112 | +// "incomeSuMoney": incomeSuMoney, | ||
| 113 | +// "incomeSuMoneyOfYesterday": incomeSuMoneyOfYesterday, | ||
| 114 | +// }, nil | ||
| 115 | +//} | ||
| 116 | +// | ||
| 117 | +//func (dao *EmployeeDao) CalculateSuMoneyTransactionRecord(uid int64, transactionStartTime time.Time, transactionEndTime time.Time) (map[string]interface{}, error) { | ||
| 118 | +// var incomeSuMoney float64 | ||
| 119 | +// var expendSuMoney float64 | ||
| 120 | +// tx := dao.transactionContext.PgTx | ||
| 121 | +// suMoneyTransactionRecordModel := new(models.SuMoneyTransactionRecord) | ||
| 122 | +// if err := tx.Model(suMoneyTransactionRecordModel). | ||
| 123 | +// ColumnExpr("sum(su_money_transaction_record.su_money) AS income_su_money"). | ||
| 124 | +// Where(`su_money_transaction_record.employee @> '{"uid":?}'`, uid). | ||
| 125 | +// Where(`su_money_transaction_record.record_type IN (?)`, pg.In([]int{2, 3})). | ||
| 126 | +// Where(`su_money_transaction_record.create_time > ?`, transactionStartTime). | ||
| 127 | +// Where(`su_money_transaction_record.create_time < ?`, transactionEndTime). | ||
| 128 | +// Select(&incomeSuMoney); err != nil { | ||
| 129 | +// return nil, err | ||
| 130 | +// } | ||
| 131 | +// if err := tx.Model(suMoneyTransactionRecordModel). | ||
| 132 | +// ColumnExpr("sum(su_money_transaction_record.su_money) AS expend_su_money"). | ||
| 133 | +// Where(`su_money_transaction_record.employee @> '{"uid":?}'`, uid). | ||
| 134 | +// Where(`su_money_transaction_record.record_type IN (?)`, pg.In([]int{1, 4})). | ||
| 135 | +// Where(`su_money_transaction_record.create_time > ?`, transactionStartTime). | ||
| 136 | +// Where(`su_money_transaction_record.create_time < ?`, transactionEndTime). | ||
| 137 | +// Select(&expendSuMoney); err != nil { | ||
| 138 | +// return nil, err | ||
| 139 | +// } | ||
| 140 | +// return map[string]interface{}{ | ||
| 141 | +// "incomeSuMoney": incomeSuMoney, | ||
| 142 | +// "expendSuMoney": expendSuMoney, | ||
| 143 | +// }, nil | ||
| 144 | +//} | ||
| 145 | +// | ||
| 146 | +//func NewEmployeeDao(transactionContext *pgTransaction.TransactionContext) (*EmployeeDao, error) { | ||
| 147 | +// if transactionContext == nil { | ||
| 148 | +// return nil, fmt.Errorf("transactionContext参数不能为nil") | ||
| 149 | +// } else { | ||
| 150 | +// return &EmployeeDao{ | ||
| 151 | +// transactionContext: transactionContext, | ||
| 152 | +// }, nil | ||
| 153 | +// } | ||
| 154 | +//} |
pkg/infrastructure/pg/init.go
0 → 100644
| 1 | +package pg | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "context" | ||
| 5 | + "fmt" | ||
| 6 | + | ||
| 7 | + "github.com/go-pg/pg/v10" | ||
| 8 | + "github.com/go-pg/pg/v10/orm" | ||
| 9 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/constant" | ||
| 10 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/infrastructure/pg/models" | ||
| 11 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/log" | ||
| 12 | +) | ||
| 13 | + | ||
| 14 | +var DB *pg.DB | ||
| 15 | + | ||
| 16 | +func init() { | ||
| 17 | + DB = pg.Connect(&pg.Options{ | ||
| 18 | + User: constant.POSTGRESQL_USER, | ||
| 19 | + Password: constant.POSTGRESQL_PASSWORD, | ||
| 20 | + Database: constant.POSTGRESQL_DB_NAME, | ||
| 21 | + Addr: fmt.Sprintf("%s:%s", constant.POSTGRESQL_HOST, constant.POSTGRESQL_PORT), | ||
| 22 | + }) | ||
| 23 | + if !constant.DISABLE_SQL_GENERATE_PRINT { | ||
| 24 | + DB.AddQueryHook(SqlGeneratePrintHook{}) | ||
| 25 | + } | ||
| 26 | + if !constant.DISABLE_CREATE_TABLE { | ||
| 27 | + for _, model := range []interface{}{ | ||
| 28 | + //(*models.Employee)(nil), | ||
| 29 | + (*models.PartnerInfo)(nil), | ||
| 30 | + } { | ||
| 31 | + err := DB.CreateTable(model, &orm.CreateTableOptions{ | ||
| 32 | + Temp: false, | ||
| 33 | + IfNotExists: true, | ||
| 34 | + FKConstraints: true, | ||
| 35 | + }) | ||
| 36 | + if err != nil { | ||
| 37 | + panic(err) | ||
| 38 | + } | ||
| 39 | + } | ||
| 40 | + } | ||
| 41 | +} | ||
| 42 | + | ||
| 43 | +type SqlGeneratePrintHook struct{} | ||
| 44 | + | ||
| 45 | +func (hook SqlGeneratePrintHook) BeforeQuery(c context.Context, q *pg.QueryEvent) (context.Context, error) { | ||
| 46 | + return c, nil | ||
| 47 | +} | ||
| 48 | + | ||
| 49 | +func (hook SqlGeneratePrintHook) AfterQuery(c context.Context, q *pg.QueryEvent) error { | ||
| 50 | + data, err := q.FormattedQuery() | ||
| 51 | + log.PrintSql(data) | ||
| 52 | + return err | ||
| 53 | +} |
pkg/infrastructure/pg/models/admin_user.go
0 → 100644
| 1 | +package models | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "context" | ||
| 5 | + "time" | ||
| 6 | + | ||
| 7 | + "github.com/go-pg/pg/v10" | ||
| 8 | +) | ||
| 9 | + | ||
| 10 | +type AdminUser struct { | ||
| 11 | + tableName struct{} `pg:"admin_user"` | ||
| 12 | + //id | ||
| 13 | + Id int64 `pg:",pk"` | ||
| 14 | + //用户账号 | ||
| 15 | + AdminAccount string `pg:",unique"` | ||
| 16 | + //用户名称 | ||
| 17 | + AdminName string | ||
| 18 | + //账号密码 | ||
| 19 | + Password string | ||
| 20 | + //是否是默认账号 | ||
| 21 | + IsDefault bool `pg:",use_zero"` | ||
| 22 | + //账号是否可用 | ||
| 23 | + IsUsable bool `json:"is_userable"` | ||
| 24 | + | ||
| 25 | + CreateAt time.Time | ||
| 26 | + UpdateAt time.Time | ||
| 27 | +} | ||
| 28 | + | ||
| 29 | +var _ pg.BeforeUpdateHook = (*AdminUser)(nil) | ||
| 30 | + | ||
| 31 | +func (user *AdminUser) BeforeUpdate(ctx context.Context) (context.Context, error) { | ||
| 32 | + user.UpdateAt = time.Now() | ||
| 33 | + return ctx, nil | ||
| 34 | +} | ||
| 35 | + | ||
| 36 | +var _ pg.BeforeInsertHook = (*AdminUser)(nil) | ||
| 37 | + | ||
| 38 | +func (user *AdminUser) BeforeInsert(ctx context.Context) (context.Context, error) { | ||
| 39 | + user.CreateAt = time.Now() | ||
| 40 | + user.UpdateAt = time.Now() | ||
| 41 | + return ctx, nil | ||
| 42 | +} |
pkg/infrastructure/pg/models/partner_info.go
0 → 100644
| 1 | +package models | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "time" | ||
| 5 | + | ||
| 6 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/domain" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +type PartnerInfo struct { | ||
| 10 | + tableName struct{} `pg:"partner_infos,alias:partner_info"` | ||
| 11 | + // 合伙人ID | ||
| 12 | + Id int64 `pg:",pk"` | ||
| 13 | + // 合伙人姓名 | ||
| 14 | + PartnerName string | ||
| 15 | + // 登录账号 | ||
| 16 | + Account string | ||
| 17 | + // 登录密码 | ||
| 18 | + Password string | ||
| 19 | + // 状态(1:启用或者0:禁用) | ||
| 20 | + Status int `pg:",notnull,default:1"` | ||
| 21 | + // 合伙类别 (1.研发合伙人 2.业务合伙人 3.事业) | ||
| 22 | + PartnerCategory int `pg:",notnull,default:1"` | ||
| 23 | + | ||
| 24 | + //创建时间 | ||
| 25 | + CreateAt time.Time | ||
| 26 | + //更新时间 | ||
| 27 | + UpdateAt time.Time | ||
| 28 | + | ||
| 29 | + //关联业务员 | ||
| 30 | + Salesman []*domain.Salesman | ||
| 31 | +} |
| 1 | +package transaction | ||
| 2 | + | ||
| 3 | +import "github.com/go-pg/pg/v10" | ||
| 4 | + | ||
| 5 | +type TransactionContext struct { | ||
| 6 | + PgDd *pg.DB | ||
| 7 | + PgTx *pg.Tx | ||
| 8 | +} | ||
| 9 | + | ||
| 10 | +func (transactionContext *TransactionContext) StartTransaction() error { | ||
| 11 | + tx, err := transactionContext.PgDd.Begin() | ||
| 12 | + if err != nil { | ||
| 13 | + return err | ||
| 14 | + } | ||
| 15 | + transactionContext.PgTx = tx | ||
| 16 | + return nil | ||
| 17 | +} | ||
| 18 | + | ||
| 19 | +func (transactionContext *TransactionContext) CommitTransaction() error { | ||
| 20 | + err := transactionContext.PgTx.Commit() | ||
| 21 | + return err | ||
| 22 | +} | ||
| 23 | + | ||
| 24 | +func (transactionContext *TransactionContext) RollbackTransaction() error { | ||
| 25 | + err := transactionContext.PgTx.Rollback() | ||
| 26 | + return err | ||
| 27 | +} | ||
| 28 | + | ||
| 29 | +func NewPGTransactionContext(pgDd *pg.DB) *TransactionContext { | ||
| 30 | + return &TransactionContext{ | ||
| 31 | + PgDd: pgDd, | ||
| 32 | + } | ||
| 33 | +} |
| 1 | +package repository | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/domain" | ||
| 5 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/infrastructure/pg/models" | ||
| 6 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/infrastructure/pg/transaction" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +type AdminUserRepository struct { | ||
| 10 | + transactionContext *transaction.TransactionContext | ||
| 11 | +} | ||
| 12 | + | ||
| 13 | +var ( | ||
| 14 | + _ domain.AdminUserRepository = (*AdminUserRepository)(nil) | ||
| 15 | +) | ||
| 16 | + | ||
| 17 | +func NewAdminUserRepository(transactionContext *transaction.TransactionContext) (*AdminUserRepository, error) { | ||
| 18 | + if transactionContext == nil { | ||
| 19 | + return nil, ERR_EMPTY_TC | ||
| 20 | + } | ||
| 21 | + return &AdminUserRepository{transactionContext: transactionContext}, nil | ||
| 22 | +} | ||
| 23 | +func (reponsitory AdminUserRepository) transformPgModelToDomainModel(adminuserModel *models.AdminUser) (domain.AdminUser, error) { | ||
| 24 | + result := domain.AdminUser{} | ||
| 25 | + return result, nil | ||
| 26 | +} | ||
| 27 | + | ||
| 28 | +func (reponsitory AdminUserRepository) FindOne(queryOption domain.AdminUserFindOneQuery) (*domain.AdminUser, error) { | ||
| 29 | + db := reponsitory.transactionContext.PgDd | ||
| 30 | + adminuserModel := new(models.AdminUser) | ||
| 31 | + query := db.Model(adminuserModel) | ||
| 32 | + | ||
| 33 | + if queryOption.AdminUserId > 0 { | ||
| 34 | + query = query.Where("id=?", queryOption.AdminUserId) | ||
| 35 | + } | ||
| 36 | + if len(queryOption.AccountEqual) > 0 { | ||
| 37 | + query = query.Where("admin_account=?", queryOption.AccountEqual) | ||
| 38 | + } | ||
| 39 | + err := query.First() | ||
| 40 | + if err != nil { | ||
| 41 | + return nil, err | ||
| 42 | + } | ||
| 43 | + adminUser, err := reponsitory.transformPgModelToDomainModel(adminuserModel) | ||
| 44 | + return &adminUser, err | ||
| 45 | +} |
| 1 | +package repository | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/domain" | ||
| 5 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/infrastructure/pg/models" | ||
| 6 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/infrastructure/pg/transaction" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +type PartnerInfoRepository struct { | ||
| 10 | + transactionContext *transaction.TransactionContext | ||
| 11 | +} | ||
| 12 | + | ||
| 13 | +func (repository *PartnerInfoRepository) Save(dm *domain.PartnerInfo) (*domain.PartnerInfo, error) { | ||
| 14 | + var ( | ||
| 15 | + err error | ||
| 16 | + m = &models.PartnerInfo{} | ||
| 17 | + tx = repository.transactionContext.PgTx | ||
| 18 | + ) | ||
| 19 | + if err = GobModelTransform(m, dm); err != nil { | ||
| 20 | + return nil, err | ||
| 21 | + } | ||
| 22 | + if dm.Identify() == nil { | ||
| 23 | + if dm.Id, err = NewSnowflakeId(); err != nil { | ||
| 24 | + return dm, err | ||
| 25 | + } | ||
| 26 | + m.Id = dm.Id | ||
| 27 | + if err = tx.Insert(m); err != nil { | ||
| 28 | + return nil, err | ||
| 29 | + } | ||
| 30 | + return dm, nil | ||
| 31 | + } | ||
| 32 | + if err = tx.Update(m); err != nil { | ||
| 33 | + return nil, err | ||
| 34 | + } | ||
| 35 | + return dm, nil | ||
| 36 | +} | ||
| 37 | + | ||
| 38 | +func (repository *PartnerInfoRepository) Remove(PartnerInfo *domain.PartnerInfo) (*domain.PartnerInfo, error) { | ||
| 39 | + var ( | ||
| 40 | + tx = repository.transactionContext.PgTx | ||
| 41 | + PartnerInfoModel = &models.PartnerInfo{Id: PartnerInfo.Identify().(int64)} | ||
| 42 | + ) | ||
| 43 | + if _, err := tx.Model(PartnerInfoModel).Where("id = ?", PartnerInfo.Id).Delete(); err != nil { | ||
| 44 | + return PartnerInfo, err | ||
| 45 | + } | ||
| 46 | + return PartnerInfo, nil | ||
| 47 | +} | ||
| 48 | + | ||
| 49 | +func (repository *PartnerInfoRepository) FindOne(queryOptions map[string]interface{}) (*domain.PartnerInfo, error) { | ||
| 50 | + tx := repository.transactionContext.PgTx | ||
| 51 | + PartnerInfoModel := new(models.PartnerInfo) | ||
| 52 | + query := NewQuery(tx.Model(PartnerInfoModel), queryOptions) | ||
| 53 | + query.SetWhere("partner_info.id = ?", "id") | ||
| 54 | + if err := query.First(); err != nil { | ||
| 55 | + return nil, query.HandleError(err, "没有此合伙人") | ||
| 56 | + } | ||
| 57 | + if PartnerInfoModel.Id == 0 { | ||
| 58 | + return nil, nil | ||
| 59 | + } | ||
| 60 | + return repository.transformPgModelToDomainModel(PartnerInfoModel) | ||
| 61 | +} | ||
| 62 | + | ||
| 63 | +func (repository *PartnerInfoRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.PartnerInfo, error) { | ||
| 64 | + tx := repository.transactionContext.PgTx | ||
| 65 | + var PartnerInfoModels []*models.PartnerInfo | ||
| 66 | + PartnerInfos := make([]*domain.PartnerInfo, 0) | ||
| 67 | + query := NewQuery(tx.Model(&PartnerInfoModels), queryOptions) | ||
| 68 | + query. | ||
| 69 | + SetWhere("partner_info.account = ?", "account"). | ||
| 70 | + SetWhere(`partner_info.status = ?`, "status"). | ||
| 71 | + SetWhere(`partner_info.partner_category = ?`, "partnerCategory"). | ||
| 72 | + SetLimit(). | ||
| 73 | + SetOrder("partner_info.create_at", "sortByCreateTime"). | ||
| 74 | + SetOrder("partner_info.update_at", "sortByUpdateTime") | ||
| 75 | + var err error | ||
| 76 | + if query.AffectRow, err = query.SelectAndCount(); err != nil { | ||
| 77 | + return 0, PartnerInfos, err | ||
| 78 | + } | ||
| 79 | + for _, PartnerInfoModel := range PartnerInfoModels { | ||
| 80 | + if PartnerInfo, err := repository.transformPgModelToDomainModel(PartnerInfoModel); err != nil { | ||
| 81 | + return 0, PartnerInfos, err | ||
| 82 | + } else { | ||
| 83 | + PartnerInfos = append(PartnerInfos, PartnerInfo) | ||
| 84 | + } | ||
| 85 | + } | ||
| 86 | + return int64(query.AffectRow), PartnerInfos, nil | ||
| 87 | +} | ||
| 88 | + | ||
| 89 | +func (repository *PartnerInfoRepository) transformPgModelToDomainModel(PartnerInfoModel *models.PartnerInfo) (*domain.PartnerInfo, error) { | ||
| 90 | + m := &domain.PartnerInfo{} | ||
| 91 | + err := GobModelTransform(m, PartnerInfoModel) | ||
| 92 | + return m, err | ||
| 93 | +} | ||
| 94 | + | ||
| 95 | +func NewPartnerInfoRepository(transactionContext *transaction.TransactionContext) (*PartnerInfoRepository, error) { | ||
| 96 | + if transactionContext == nil { | ||
| 97 | + return nil, ERR_EMPTY_TC | ||
| 98 | + } | ||
| 99 | + return &PartnerInfoRepository{transactionContext: transactionContext}, nil | ||
| 100 | +} |
pkg/infrastructure/repository/repository.go
0 → 100644
| 1 | +package repository | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "bytes" | ||
| 5 | + "encoding/gob" | ||
| 6 | + "fmt" | ||
| 7 | + "github.com/go-pg/pg/v10/orm" | ||
| 8 | + "github.com/linmadan/egglib-go/utils/snowflake" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +var ( | ||
| 12 | + ERR_EMPTY_TC = fmt.Errorf("transactionContext参数不能为nil") | ||
| 13 | +) | ||
| 14 | + | ||
| 15 | +type Query struct { | ||
| 16 | + *orm.Query | ||
| 17 | + queryOptions map[string]interface{} | ||
| 18 | + AffectRow int | ||
| 19 | +} | ||
| 20 | + | ||
| 21 | +func NewQuery(query *orm.Query, queryOptions map[string]interface{}) *Query { | ||
| 22 | + return &Query{ | ||
| 23 | + query, | ||
| 24 | + queryOptions, | ||
| 25 | + 0, | ||
| 26 | + } | ||
| 27 | +} | ||
| 28 | + | ||
| 29 | +func (query *Query) SetWhere(condition, key string) *Query { | ||
| 30 | + if v, ok := query.queryOptions[key]; ok { | ||
| 31 | + query.Where(condition, v) | ||
| 32 | + } | ||
| 33 | + return query | ||
| 34 | +} | ||
| 35 | + | ||
| 36 | +func (query *Query) SetLimit() *Query { | ||
| 37 | + if offset, ok := query.queryOptions["offset"]; ok { | ||
| 38 | + offset := offset.(int) | ||
| 39 | + if offset > -1 { | ||
| 40 | + query.Offset(offset) | ||
| 41 | + } | ||
| 42 | + } else { | ||
| 43 | + query.Offset(0) | ||
| 44 | + } | ||
| 45 | + if limit, ok := query.queryOptions["limit"]; ok { | ||
| 46 | + limit := limit.(int) | ||
| 47 | + if limit > -1 { | ||
| 48 | + query.Limit(limit) | ||
| 49 | + } else { | ||
| 50 | + query.Limit(20) | ||
| 51 | + } | ||
| 52 | + } | ||
| 53 | + return query | ||
| 54 | +} | ||
| 55 | + | ||
| 56 | +func (query *Query) SetOrder(orderColumn string, key string) *Query { | ||
| 57 | + //query.Order(condition...) | ||
| 58 | + //return query | ||
| 59 | + if v, ok := query.queryOptions[key]; ok { | ||
| 60 | + query.Order(fmt.Sprintf("%v %v", orderColumn, v)) | ||
| 61 | + } | ||
| 62 | + return query | ||
| 63 | +} | ||
| 64 | + | ||
| 65 | +func (query *Query) HandleError(err error, errMsg string) error { | ||
| 66 | + if err.Error() == "pg: no rows in result set" { | ||
| 67 | + return fmt.Errorf(errMsg) | ||
| 68 | + } else { | ||
| 69 | + return err | ||
| 70 | + } | ||
| 71 | +} | ||
| 72 | + | ||
| 73 | +func NewSnowflakeId() (int64, error) { | ||
| 74 | + IdWorker, err := snowflake.NewIdWorker(2) | ||
| 75 | + if err != nil { | ||
| 76 | + return 0, err | ||
| 77 | + } | ||
| 78 | + id, err := IdWorker.NextId() | ||
| 79 | + return id, err | ||
| 80 | +} | ||
| 81 | + | ||
| 82 | +//GobModelTransform 模型转换 | ||
| 83 | +func GobModelTransform(dst interface{}, src interface{}) error { | ||
| 84 | + var data bytes.Buffer | ||
| 85 | + enc := gob.NewEncoder(&data) | ||
| 86 | + if err := enc.Encode(src); err != nil { | ||
| 87 | + return err | ||
| 88 | + } | ||
| 89 | + dec := gob.NewDecoder(&data) | ||
| 90 | + if err := dec.Decode(dst); err != nil { | ||
| 91 | + return err | ||
| 92 | + } | ||
| 93 | + return nil | ||
| 94 | +} |
pkg/log/logger.go
0 → 100644
| 1 | +package log | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/astaxie/beego" | ||
| 5 | + "github.com/astaxie/beego/logs" | ||
| 6 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/constant" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +func init() { | ||
| 10 | + logs.SetLevel(logLevel(constant.LOG_LEVEL)) | ||
| 11 | + if beego.BConfig.RunMode == "prod" { | ||
| 12 | + logs.SetLogFuncCall(false) | ||
| 13 | + } else { | ||
| 14 | + logs.SetLogFuncCallDepth(3) | ||
| 15 | + } | ||
| 16 | + | ||
| 17 | + logs.SetLogger("file", `{"filename":"log/partnermg.log"}`) | ||
| 18 | +} | ||
| 19 | + | ||
| 20 | +//LogLevel ... | ||
| 21 | +func logLevel(s string) (i int) { | ||
| 22 | + switch s { | ||
| 23 | + case "info": | ||
| 24 | + i = logs.LevelInfo | ||
| 25 | + case "debug": | ||
| 26 | + i = logs.LevelDebug | ||
| 27 | + case "warning": | ||
| 28 | + i = logs.LevelWarning | ||
| 29 | + case "error": | ||
| 30 | + i = logs.LevelError | ||
| 31 | + default: | ||
| 32 | + i = logs.LevelDebug | ||
| 33 | + } | ||
| 34 | + return | ||
| 35 | +} | ||
| 36 | + | ||
| 37 | +func PrintSql(bt []byte) { | ||
| 38 | + logs.Debug(string(bt)) | ||
| 39 | +} |
pkg/port/beego/beego.go
0 → 100644
| 1 | +package beego | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/astaxie/beego" | ||
| 5 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/port/beego/middleware" | ||
| 6 | + _ "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/port/beego/routers" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +func init() { | ||
| 10 | + beego.InsertFilter("/*", beego.BeforeRouter, middleware.AllowCors()) | ||
| 11 | + // beego.InsertFilter("/*", beego.BeforeExec, filters.CreateRequestBodyFilter()) | ||
| 12 | + // beego.InsertFilter("/*", beego.BeforeExec, log.CreateRequstLogFilter(Logger)) | ||
| 13 | + // beego.InsertFilter("/*", beego.AfterExec, log.CreateResponseLogFilter(Logger), false) | ||
| 14 | +} |
pkg/port/beego/controllers/admin_user.go
0 → 100644
| 1 | +package controllers | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "errors" | ||
| 5 | + | ||
| 6 | + "github.com/astaxie/beego/logs" | ||
| 7 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/domain" | ||
| 8 | +) | ||
| 9 | + | ||
| 10 | +type AdminUserController struct { | ||
| 11 | + BaseController | ||
| 12 | +} | ||
| 13 | + | ||
| 14 | +////Prepare 重写 BaseController 的Prepare方法 | ||
| 15 | +func (c *AdminUserController) Prepare() { | ||
| 16 | + c.BaseController.Prepare() | ||
| 17 | + if ok := c.ValidJWTToken(); !ok { | ||
| 18 | + return | ||
| 19 | + } | ||
| 20 | + if ok := c.ValidAdminPermission(domain.PERMINSSION_ADMIN_USER); !ok { | ||
| 21 | + return | ||
| 22 | + } | ||
| 23 | +} | ||
| 24 | + | ||
| 25 | +func (c *AdminUserController) Demo() { | ||
| 26 | + //用与适配前端定义的数据结构 | ||
| 27 | + type Paramer struct { | ||
| 28 | + } | ||
| 29 | + var ( | ||
| 30 | + param Paramer | ||
| 31 | + err error | ||
| 32 | + ) | ||
| 33 | + if err = c.BindJsonData(¶m); err != nil { | ||
| 34 | + logs.Error(err) | ||
| 35 | + c.ResponseError(errors.New("json数据解析失败")) | ||
| 36 | + return | ||
| 37 | + } | ||
| 38 | + //Paramer转换为application要求的数据结构 | ||
| 39 | + //业务逻辑处理 | ||
| 40 | + | ||
| 41 | + c.ResponseData(nil) | ||
| 42 | +} |
| 1 | +package controllers | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "encoding/json" | ||
| 5 | + "errors" | ||
| 6 | + "fmt" | ||
| 7 | + "io/ioutil" | ||
| 8 | + "strconv" | ||
| 9 | + | ||
| 10 | + "github.com/astaxie/beego" | ||
| 11 | + "github.com/astaxie/beego/logs" | ||
| 12 | + "github.com/prometheus/common/log" | ||
| 13 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/port/beego/lib" | ||
| 14 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/port/beego/protocol" | ||
| 15 | +) | ||
| 16 | + | ||
| 17 | +type BaseController struct { | ||
| 18 | + beego.Controller | ||
| 19 | +} | ||
| 20 | + | ||
| 21 | +func (controller BaseController) BindJsonData(v interface{}) error { | ||
| 22 | + bodyData := controller.Ctx.Input.GetData("requestBody") | ||
| 23 | + bodyByte, ok := bodyData.([]byte) | ||
| 24 | + if !ok { | ||
| 25 | + return errors.New("requestBody is not []byte") | ||
| 26 | + } | ||
| 27 | + return json.Unmarshal(bodyByte, v) | ||
| 28 | +} | ||
| 29 | + | ||
| 30 | +func (controller BaseController) ResponseError(err error) { | ||
| 31 | + controller.Data["json"] = protocol.ResponseData{ | ||
| 32 | + Code: "-1", | ||
| 33 | + Msg: err.Error(), | ||
| 34 | + Data: struct{}{}, | ||
| 35 | + } | ||
| 36 | + controller.ServeJSON() | ||
| 37 | + logs.Error(err) | ||
| 38 | +} | ||
| 39 | + | ||
| 40 | +func (controller BaseController) ResponseData(data interface{}) { | ||
| 41 | + if data == nil { | ||
| 42 | + data = struct{}{} | ||
| 43 | + } | ||
| 44 | + controller.Data["json"] = protocol.ResponseData{ | ||
| 45 | + Code: "0", | ||
| 46 | + Msg: "ok", | ||
| 47 | + Data: data, | ||
| 48 | + } | ||
| 49 | + controller.ServeJSON() | ||
| 50 | +} | ||
| 51 | + | ||
| 52 | +//Finish 重写 beego.Controller 的Finish 方法 | ||
| 53 | +func (controller *BaseController) Finish() { | ||
| 54 | + strByte, _ := json.Marshal(controller.Data["json"]) | ||
| 55 | + length := len(strByte) | ||
| 56 | + if length > 1500 { | ||
| 57 | + logs.Info("<====Send to client: RspBodyData: %s......", string(strByte[:1500])) | ||
| 58 | + } else { | ||
| 59 | + logs.Info("<====Send to client: RspBodyData: %s......", string(strByte)) | ||
| 60 | + } | ||
| 61 | +} | ||
| 62 | + | ||
| 63 | +////Prepare 重写 beego.Controller 的Prepare方法 | ||
| 64 | +func (controller *BaseController) Prepare() { | ||
| 65 | + log.Info("====>Recv Request:%s Method:%s", controller.Ctx.Input.URI(), controller.Ctx.Input.Method()) | ||
| 66 | + if controller.Ctx.Input.IsPost() || controller.Ctx.Input.IsPut() { | ||
| 67 | + bodyByte, _ := ioutil.ReadAll(controller.Ctx.Request.Body) | ||
| 68 | + controller.Ctx.Input.SetData("requestBody", bodyByte) | ||
| 69 | + controller.Ctx.Request.Body.Close() | ||
| 70 | + if len(bodyByte) > 1000 { | ||
| 71 | + log.Info("====>Recv data from client: BodyData:\n %s ...", string(bodyByte[0:1000])) | ||
| 72 | + } else { | ||
| 73 | + log.Info("====>Recv data from client: BodyData: \n %s", string(bodyByte)) | ||
| 74 | + } | ||
| 75 | + } | ||
| 76 | + return | ||
| 77 | +} | ||
| 78 | + | ||
| 79 | +func (controller *BaseController) GetHeaderToken() string { | ||
| 80 | + return controller.Ctx.Input.Header("Authorization") | ||
| 81 | +} | ||
| 82 | + | ||
| 83 | +func (controller *BaseController) GetUserId() int { | ||
| 84 | + idV := controller.Ctx.Input.GetData("admin_user_id") | ||
| 85 | + uid, _ := strconv.Atoi(fmt.Sprint(idV)) | ||
| 86 | + return uid | ||
| 87 | +} | ||
| 88 | + | ||
| 89 | +func (controller *BaseController) setUserId(id int) { | ||
| 90 | + controller.Ctx.Input.SetData("admin_user_id", id) | ||
| 91 | +} | ||
| 92 | + | ||
| 93 | +func (controller *BaseController) ValidJWTToken() bool { | ||
| 94 | + headerToken := controller.GetHeaderToken() | ||
| 95 | + mytoken := lib.NewMyToken(0) | ||
| 96 | + err := mytoken.ValidJWTToken(headerToken) | ||
| 97 | + if err != nil { | ||
| 98 | + if mytoken.IsJwtErrorExpired(err) { | ||
| 99 | + //token超时 | ||
| 100 | + controller.Data["json"] = protocol.ResponseData{ | ||
| 101 | + Code: "2", | ||
| 102 | + Msg: "token过期,请重新登录", | ||
| 103 | + Data: struct{}{}, | ||
| 104 | + } | ||
| 105 | + controller.ServeJSON() | ||
| 106 | + } else { | ||
| 107 | + controller.Data["json"] = protocol.ResponseData{ | ||
| 108 | + Code: "-1", | ||
| 109 | + Msg: "token校验失败", | ||
| 110 | + Data: struct{}{}, | ||
| 111 | + } | ||
| 112 | + controller.ServeJSON() | ||
| 113 | + } | ||
| 114 | + return false | ||
| 115 | + } | ||
| 116 | + controller.setUserId(mytoken.UID) | ||
| 117 | + return true | ||
| 118 | +} | ||
| 119 | + | ||
| 120 | +func (controller *BaseController) ValidAdminPermission(code string, excludeURL ...string) bool { | ||
| 121 | + //排除掉的请求 | ||
| 122 | + reqUrl := controller.Ctx.Input.URL() | ||
| 123 | + for i := range excludeURL { | ||
| 124 | + if reqUrl == excludeURL[i] { | ||
| 125 | + return true | ||
| 126 | + } | ||
| 127 | + } | ||
| 128 | + //权限校验 | ||
| 129 | + // | ||
| 130 | + var err error | ||
| 131 | + if err != nil { | ||
| 132 | + controller.Data["json"] = protocol.ResponseData{ | ||
| 133 | + Code: "-1", | ||
| 134 | + Msg: "没有操作权限", | ||
| 135 | + Data: struct{}{}, | ||
| 136 | + } | ||
| 137 | + controller.ServeJSON() | ||
| 138 | + } | ||
| 139 | + return true | ||
| 140 | +} |
| 1 | +package controllers | ||
| 2 | + | ||
| 3 | +type PartnerInfoController struct { | ||
| 4 | + BaseController | ||
| 5 | +} | ||
| 6 | + | ||
| 7 | +//CreatePartnerInfo 创建合伙人 | ||
| 8 | +func (controller *PartnerInfoController) CreatePartnerInfo() { | ||
| 9 | + // var ( | ||
| 10 | + // service = service.NewPartnerInfoService(nil) | ||
| 11 | + // command = &command.CreatePartnerInfoCommand{} | ||
| 12 | + // ) | ||
| 13 | + // controller.JsonUnmarshal(command) | ||
| 14 | + // controller.HandlerResponse(service.CreatePartnerInfo(command)) | ||
| 15 | +} | ||
| 16 | + | ||
| 17 | +//UpdatePartnerInfo 更新合伙人 | ||
| 18 | +func (controller *PartnerInfoController) UpdatePartnerInfo() { | ||
| 19 | + // var ( | ||
| 20 | + // service = service.NewPartnerInfoService(nil) | ||
| 21 | + // command = &command.UpdatePartnerInfoCommand{} | ||
| 22 | + // ) | ||
| 23 | + // controller.JsonUnmarshal(command) | ||
| 24 | + // id, _ := controller.GetInt(":id") | ||
| 25 | + // command.Id = id | ||
| 26 | + // controller.HandlerResponse(service.UpdatePartnerInfo(command)) | ||
| 27 | +} | ||
| 28 | + | ||
| 29 | +//GetPartnerInfo 获取合伙人 | ||
| 30 | +func (controller *PartnerInfoController) GetPartnerInfo() { | ||
| 31 | + // var ( | ||
| 32 | + // service = service.NewPartnerInfoService(nil) | ||
| 33 | + // command = &query.GetPartnerInfoQuery{} | ||
| 34 | + // ) | ||
| 35 | + // uid, _ := controller.GetInt(":id") | ||
| 36 | + // command.Id = uid | ||
| 37 | + // controller.HandlerResponse(service.GetPartnerInfo(command)) | ||
| 38 | +} | ||
| 39 | + | ||
| 40 | +//GetPartnerInfo 移除合伙人 | ||
| 41 | +func (controller *PartnerInfoController) RemovePartnerInfo() { | ||
| 42 | + // var ( | ||
| 43 | + // service = service.NewPartnerInfoService(nil) | ||
| 44 | + // command = &command.RemovePartnerInfoCommand{} | ||
| 45 | + // ) | ||
| 46 | + // uid, _ := controller.GetInt(":id") | ||
| 47 | + // command.Id = uid | ||
| 48 | + // controller.HandlerResponse(service.RemovePartnerInfo(command)) | ||
| 49 | +} | ||
| 50 | + | ||
| 51 | +//ListPartnerInfo 合伙人列表 | ||
| 52 | +func (controller *PartnerInfoController) ListPartnerInfo() { | ||
| 53 | + // var ( | ||
| 54 | + // service = service.NewPartnerInfoService(nil) | ||
| 55 | + // command = &query.ListPartnerInfoQuery{} | ||
| 56 | + // ) | ||
| 57 | + // command.PartnerCategory, _ = controller.GetInt("partnerCategory") | ||
| 58 | + // command.Status, _ = controller.GetInt("status") | ||
| 59 | + // command.SortByCreateTime = controller.GetString("sortByCreateTime") | ||
| 60 | + // command.SortByUpdateTime = controller.GetString("sortByUpdateTime") | ||
| 61 | + // command.Offset, command.Limit = controller.GetLimitInfo() | ||
| 62 | + // controller.HandlerResponse(service.ListPartnerInfo(command)) | ||
| 63 | +} |
pkg/port/beego/lib/jwt.go
0 → 100644
| 1 | +package lib | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "time" | ||
| 6 | + | ||
| 7 | + "github.com/dgrijalva/jwt-go" | ||
| 8 | +) | ||
| 9 | + | ||
| 10 | +var ( | ||
| 11 | + key []byte = []byte("sx87sda0w7x7sd") | ||
| 12 | +) | ||
| 13 | + | ||
| 14 | +//MyToken ... | ||
| 15 | +type MyToken struct { | ||
| 16 | + jwt.StandardClaims | ||
| 17 | + UID int `json:"uid"` //管理员的id | ||
| 18 | +} | ||
| 19 | + | ||
| 20 | +func NewMyToken(id int) *MyToken { | ||
| 21 | + return &MyToken{UID: id} | ||
| 22 | +} | ||
| 23 | + | ||
| 24 | +//CreateJWTToken ... | ||
| 25 | +func (mytoken *MyToken) CreateJWTToken() (string, error) { | ||
| 26 | + nowTime := time.Now().Unix() | ||
| 27 | + mytoken.StandardClaims = jwt.StandardClaims{ | ||
| 28 | + NotBefore: nowTime, | ||
| 29 | + IssuedAt: nowTime, | ||
| 30 | + ExpiresAt: 60 * 60 * 3, | ||
| 31 | + Issuer: "mmm_partnermg", | ||
| 32 | + } | ||
| 33 | + | ||
| 34 | + token := jwt.NewWithClaims(jwt.SigningMethodHS256, mytoken) | ||
| 35 | + return token.SignedString(key) | ||
| 36 | +} | ||
| 37 | + | ||
| 38 | +//ValidJWTToken ... | ||
| 39 | +func (mytoken *MyToken) ValidJWTToken(tokenString string) error { | ||
| 40 | + token, err := jwt.ParseWithClaims( | ||
| 41 | + tokenString, | ||
| 42 | + &MyToken{}, | ||
| 43 | + func(token *jwt.Token) (interface{}, error) { | ||
| 44 | + return key, nil | ||
| 45 | + }) | ||
| 46 | + if err != nil { | ||
| 47 | + return err | ||
| 48 | + } | ||
| 49 | + mytoken, ok := token.Claims.(*MyToken) | ||
| 50 | + if ok && token.Valid { | ||
| 51 | + // 验证成功,返回信息 | ||
| 52 | + return nil | ||
| 53 | + } | ||
| 54 | + // 验证失败 | ||
| 55 | + return fmt.Errorf("token Valid fail") | ||
| 56 | +} | ||
| 57 | + | ||
| 58 | +func (mytoken *MyToken) IsJwtErrorExpired(err error) bool { | ||
| 59 | + ve, ok := err.(*jwt.ValidationError) | ||
| 60 | + if ok && ve.Errors == jwt.ValidationErrorExpired { | ||
| 61 | + return true | ||
| 62 | + } | ||
| 63 | + return false | ||
| 64 | +} |
pkg/port/beego/middleware/allow_cors.go
0 → 100644
| 1 | +package middleware | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/astaxie/beego/context" | ||
| 5 | + "github.com/astaxie/beego/plugins/cors" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +func AllowCors() func(ctx *context.Context) { | ||
| 9 | + fn := cors.Allow(&cors.Options{ | ||
| 10 | + //允许访问所有源 | ||
| 11 | + AllowAllOrigins: true, | ||
| 12 | + //可选参数"GET", "POST", "PUT", "DELETE", "OPTIONS" (*为所有) | ||
| 13 | + //其中Options跨域复杂请求预检 | ||
| 14 | + AllowMethods: []string{"*"}, | ||
| 15 | + //指的是允许的Header的种类 | ||
| 16 | + AllowHeaders: []string{"*"}, | ||
| 17 | + //公开的HTTP标头列表 | ||
| 18 | + ExposeHeaders: []string{"Content-Length"}, | ||
| 19 | + //如果设置,则允许共享身份验证凭据,例如cookie | ||
| 20 | + AllowCredentials: true, | ||
| 21 | + }) | ||
| 22 | + return fn | ||
| 23 | +} |
| 1 | +package middleware | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/astaxie/beego/context" | ||
| 5 | +) | ||
| 6 | + | ||
| 7 | +//PermissionCheck 根据权限编码检验请求是否可以执行 | ||
| 8 | +//permissionCode:权限编码 | ||
| 9 | +//excludeURL:跳过url | ||
| 10 | +func AdminPermissionCheck(permissionCode string, excludeURL ...string) func(ctx *context.Context) { | ||
| 11 | + | ||
| 12 | + return func(ctx *context.Context) { | ||
| 13 | + //根据code检查权限数据,并排除excludeUrl指定的url | ||
| 14 | + //获取user 数据 | ||
| 15 | + } | ||
| 16 | +} |
pkg/port/beego/protocol/common_response.go
0 → 100644
pkg/port/beego/routers/admin_user_router.go
0 → 100644
| 1 | +package routers | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/astaxie/beego" | ||
| 5 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/port/beego/controllers" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +func init() { | ||
| 9 | + adminRouter := beego.NewNamespace("/admin_user", | ||
| 10 | + // 其余的路由 | ||
| 11 | + beego.NSRouter("/get", &controllers.AdminUserController{}, "POST:Demo"), | ||
| 12 | + ) | ||
| 13 | + //... | ||
| 14 | + | ||
| 15 | + beego.AddNamespace(adminRouter) | ||
| 16 | +} |
| 1 | +package routers | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/astaxie/beego" | ||
| 5 | + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/port/beego/controllers" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +func init() { | ||
| 9 | + beego.Router("/partnerInfos/", &controllers.PartnerInfoController{}, "Post:CreatePartnerInfo") | ||
| 10 | + beego.Router("/partnerInfos/:id", &controllers.PartnerInfoController{}, "Put:UpdatePartnerInfo") | ||
| 11 | + beego.Router("/partnerInfos/:id", &controllers.PartnerInfoController{}, "Get:GetPartnerInfo") | ||
| 12 | + beego.Router("/partnerInfos/:id", &controllers.PartnerInfoController{}, "Delete:RemovePartnerInfo") | ||
| 13 | + beego.Router("/partnerInfos/", &controllers.PartnerInfoController{}, "Get:ListPartnerInfo") | ||
| 14 | +} |
pkg/port/beego/routers/static_router.go
0 → 100644
readerme.txt
已删除
100644 → 0
| 1 | +package partnerInfo | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/gavv/httpexpect" | ||
| 5 | + . "github.com/onsi/ginkgo" | ||
| 6 | + . "github.com/onsi/gomega" | ||
| 7 | + pG "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/infrastructure/pg" | ||
| 8 | + "net/http" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +var _ = Describe("创建新合伙人", func() { | ||
| 12 | + Describe("创建新合伙人", func() { | ||
| 13 | + Context("创建新合伙人", func() { | ||
| 14 | + It("返回合伙人数据", func() { | ||
| 15 | + httpExpect := httpexpect.New(GinkgoT(), server.URL) | ||
| 16 | + body := map[string]interface{}{ | ||
| 17 | + "partnerName": "employeeName", | ||
| 18 | + "account": "account123", | ||
| 19 | + "password": "password", | ||
| 20 | + "status": 1, | ||
| 21 | + "partnerCategory": 1, | ||
| 22 | + //"createAt":time.Now(), | ||
| 23 | + //"updateAt":time.Now(), | ||
| 24 | + "salesman": []map[string]interface{}{ | ||
| 25 | + {"name": "name", "telephone": "18860183051"}, | ||
| 26 | + {"name2": "name", "telephone": "18860183052j"}, | ||
| 27 | + }, | ||
| 28 | + } | ||
| 29 | + httpExpect.POST("/partnerInfos"). | ||
| 30 | + WithJSON(body). | ||
| 31 | + Expect(). | ||
| 32 | + Status(http.StatusOK). | ||
| 33 | + JSON(). | ||
| 34 | + Object(). | ||
| 35 | + ContainsKey("code").ValueEqual("code", 0). | ||
| 36 | + ContainsKey("msg").ValueEqual("msg", "ok"). | ||
| 37 | + ContainsKey("data").Value("data").Object(). | ||
| 38 | + ContainsKey("id").ValueNotEqual("id", BeZero()) | ||
| 39 | + }) | ||
| 40 | + }) | ||
| 41 | + }) | ||
| 42 | + AfterEach(func() { | ||
| 43 | + _, err := pG.DB.Exec("DELETE FROM partner_infos WHERE true") | ||
| 44 | + Expect(err).NotTo(HaveOccurred()) | ||
| 45 | + }) | ||
| 46 | +}) |
| 1 | +package partnerInfo | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/gavv/httpexpect" | ||
| 5 | + . "github.com/onsi/ginkgo" | ||
| 6 | + . "github.com/onsi/gomega" | ||
| 7 | + pG "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/infrastructure/pg" | ||
| 8 | + "net/http" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +var _ = Describe("删除合伙人", func() { | ||
| 12 | + BeforeEach(func() { | ||
| 13 | + _, err := pG.DB.Exec(`INSERT INTO "public"."partner_infos"("id", "partner_name", "account", "password", "status", "partner_category", "create_at", "update_at", "salesman") VALUES (2929531956394199040, 'employeeName', 'account', 'password', 1, 1, '2020-06-19 15:23:31.616934+08', '2020-06-19 15:23:31.616934+08', '[{"name": "name", "telephone": "18860183051"}, {"name": "", "telephone": "18860183052j"}]');`) | ||
| 14 | + Expect(err).NotTo(HaveOccurred()) | ||
| 15 | + }) | ||
| 16 | + Describe("删除合伙人", func() { | ||
| 17 | + Context("删除合伙人", func() { | ||
| 18 | + It("删除合伙人数据", func() { | ||
| 19 | + httpExpect := httpexpect.New(GinkgoT(), server.URL) | ||
| 20 | + body := map[string]interface{}{} | ||
| 21 | + httpExpect.DELETE("/partnerInfos/2929531956394199040"). | ||
| 22 | + WithJSON(body). | ||
| 23 | + Expect(). | ||
| 24 | + Status(http.StatusOK). | ||
| 25 | + JSON(). | ||
| 26 | + Object(). | ||
| 27 | + ContainsKey("code").ValueEqual("code", 0). | ||
| 28 | + ContainsKey("msg").ValueEqual("msg", "ok"). | ||
| 29 | + ContainsKey("data").Value("data").Object(). | ||
| 30 | + ContainsKey("id").ValueNotEqual("id", BeZero()) | ||
| 31 | + }) | ||
| 32 | + }) | ||
| 33 | + }) | ||
| 34 | + AfterEach(func() { | ||
| 35 | + _, err := pG.DB.Exec("DELETE FROM partner_infos WHERE true") | ||
| 36 | + Expect(err).NotTo(HaveOccurred()) | ||
| 37 | + }) | ||
| 38 | +}) |
| 1 | +package partnerInfo | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/gavv/httpexpect" | ||
| 5 | + . "github.com/onsi/ginkgo" | ||
| 6 | + . "github.com/onsi/gomega" | ||
| 7 | + pG "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/infrastructure/pg" | ||
| 8 | + "net/http" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +var _ = Describe("获取合伙人", func() { | ||
| 12 | + BeforeEach(func() { | ||
| 13 | + _, err := pG.DB.Exec(`INSERT INTO "public"."partner_infos"("id", "partner_name", "account", "password", "status", "partner_category", "create_at", "update_at", "salesman") VALUES (2929531956394199040, 'employeeName', 'account', 'password', 1, 1, '2020-06-19 15:23:31.616934+08', '2020-06-19 15:23:31.616934+08', '[{"name": "name", "telephone": "18860183051"}, {"name": "", "telephone": "18860183052j"}]');`) | ||
| 14 | + Expect(err).NotTo(HaveOccurred()) | ||
| 15 | + }) | ||
| 16 | + Describe("获取合伙人", func() { | ||
| 17 | + Context("获取合伙人", func() { | ||
| 18 | + It("返回合伙人数据", func() { | ||
| 19 | + httpExpect := httpexpect.New(GinkgoT(), server.URL) | ||
| 20 | + body := map[string]interface{}{} | ||
| 21 | + httpExpect.GET("/partnerInfos/2929531956394199040"). | ||
| 22 | + WithJSON(body). | ||
| 23 | + Expect(). | ||
| 24 | + Status(http.StatusOK). | ||
| 25 | + JSON(). | ||
| 26 | + Object(). | ||
| 27 | + ContainsKey("code").ValueEqual("code", 0). | ||
| 28 | + ContainsKey("msg").ValueEqual("msg", "ok"). | ||
| 29 | + ContainsKey("data").Value("data").Object(). | ||
| 30 | + ContainsKey("id").ValueNotEqual("id", BeZero()) | ||
| 31 | + }) | ||
| 32 | + }) | ||
| 33 | + }) | ||
| 34 | + AfterEach(func() { | ||
| 35 | + _, err := pG.DB.Exec("DELETE FROM partner_infos WHERE true") | ||
| 36 | + Expect(err).NotTo(HaveOccurred()) | ||
| 37 | + }) | ||
| 38 | +}) |
| 1 | +package partnerInfo | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/gavv/httpexpect" | ||
| 5 | + . "github.com/onsi/ginkgo" | ||
| 6 | + . "github.com/onsi/gomega" | ||
| 7 | + pG "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/infrastructure/pg" | ||
| 8 | + "net/http" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +var _ = Describe("获取合伙人列表", func() { | ||
| 12 | + BeforeEach(func() { | ||
| 13 | + _, err := pG.DB.Exec(`INSERT INTO "public"."partner_infos"("id", "partner_name", "account", "password", "status", "partner_category", "create_at", "update_at", "salesman") VALUES (2929531956394199040, 'employeeName', 'account', 'password', 1, 1, '2020-06-19 15:23:31.616934+08', '2020-06-19 15:23:31.616934+08', '[{"name": "name", "telephone": "18860183051"}, {"name": "", "telephone": "18860183052j"}]');`) | ||
| 14 | + Expect(err).NotTo(HaveOccurred()) | ||
| 15 | + }) | ||
| 16 | + Describe("获取合伙人列表", func() { | ||
| 17 | + Context("获取合伙人列表", func() { | ||
| 18 | + It("获取合伙人列表", func() { | ||
| 19 | + httpExpect := httpexpect.New(GinkgoT(), server.URL) | ||
| 20 | + body := map[string]interface{}{} | ||
| 21 | + httpExpect.GET("/partnerInfos"). | ||
| 22 | + WithQuery("partnerCategory", 1). | ||
| 23 | + WithQuery("status", 1). | ||
| 24 | + WithQuery("status", 1). | ||
| 25 | + WithQuery("sortByCreateTime", "DESC"). | ||
| 26 | + WithQuery("sortByUpdateTime", "DESC"). | ||
| 27 | + WithQuery("offset", 0). | ||
| 28 | + WithQuery("limit", 20). | ||
| 29 | + WithJSON(body). | ||
| 30 | + Expect(). | ||
| 31 | + Status(http.StatusOK). | ||
| 32 | + JSON(). | ||
| 33 | + Object(). | ||
| 34 | + ContainsKey("code").ValueEqual("code", 0). | ||
| 35 | + ContainsKey("msg").ValueEqual("msg", "ok"). | ||
| 36 | + ContainsKey("data").Value("data").Object().ContainsKey("partnerInfos") | ||
| 37 | + }) | ||
| 38 | + }) | ||
| 39 | + }) | ||
| 40 | + AfterEach(func() { | ||
| 41 | + _, err := pG.DB.Exec("DELETE FROM partner_infos WHERE true") | ||
| 42 | + Expect(err).NotTo(HaveOccurred()) | ||
| 43 | + }) | ||
| 44 | +}) |
| 1 | +package partnerInfo | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/astaxie/beego" | ||
| 5 | + . "github.com/onsi/ginkgo" | ||
| 6 | + . "github.com/onsi/gomega" | ||
| 7 | + "net/http" | ||
| 8 | + "net/http/httptest" | ||
| 9 | + "testing" | ||
| 10 | + | ||
| 11 | + _ "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/infrastructure/pg" | ||
| 12 | + _ "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/port/beego" | ||
| 13 | +) | ||
| 14 | + | ||
| 15 | +func TestPartnerInfo(t *testing.T) { | ||
| 16 | + RegisterFailHandler(Fail) | ||
| 17 | + RunSpecs(t, "Beego Port Employee Correlations Test Case Suite") | ||
| 18 | +} | ||
| 19 | + | ||
| 20 | +var handler http.Handler | ||
| 21 | +var server *httptest.Server | ||
| 22 | + | ||
| 23 | +var _ = BeforeSuite(func() { | ||
| 24 | + handler = beego.BeeApp.Handlers | ||
| 25 | + server = httptest.NewServer(handler) | ||
| 26 | +}) | ||
| 27 | + | ||
| 28 | +var _ = AfterSuite(func() { | ||
| 29 | + server.Close() | ||
| 30 | +}) |
| 1 | +package partnerInfo | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/gavv/httpexpect" | ||
| 5 | + . "github.com/onsi/ginkgo" | ||
| 6 | + . "github.com/onsi/gomega" | ||
| 7 | + pG "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/infrastructure/pg" | ||
| 8 | + "net/http" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +var _ = Describe("创建新合伙人", func() { | ||
| 12 | + BeforeEach(func() { | ||
| 13 | + _, err := pG.DB.Exec(`INSERT INTO "public"."partner_infos"("id", "partner_name", "account", "password", "status", "partner_category", "create_at", "update_at", "salesman") VALUES (2929531956394199040, 'employeeName', 'account', 'password', 1, 1, '2020-06-19 15:23:31.616934+08', '2020-06-19 15:23:31.616934+08', '[{"name": "name", "telephone": "18860183051"}, {"name": "", "telephone": "18860183052j"}]');`) | ||
| 14 | + Expect(err).NotTo(HaveOccurred()) | ||
| 15 | + }) | ||
| 16 | + Describe("创建新合伙人", func() { | ||
| 17 | + Context("创建新合伙人", func() { | ||
| 18 | + It("返回合伙人数据", func() { | ||
| 19 | + httpExpect := httpexpect.New(GinkgoT(), server.URL) | ||
| 20 | + body := map[string]interface{}{ | ||
| 21 | + "partnerName": "employeeName", | ||
| 22 | + "account": "account123", | ||
| 23 | + "password": "password", | ||
| 24 | + "status": 1, | ||
| 25 | + "partnerCategory": 1, | ||
| 26 | + "salesman": []map[string]interface{}{ | ||
| 27 | + {"name": "name", "telephone": "18860183051"}, | ||
| 28 | + {"name2": "name", "telephone": "18860183052j"}, | ||
| 29 | + }, | ||
| 30 | + } | ||
| 31 | + httpExpect.PUT("/partnerInfos/2929531956394199040"). | ||
| 32 | + WithJSON(body). | ||
| 33 | + Expect(). | ||
| 34 | + Status(http.StatusOK). | ||
| 35 | + JSON(). | ||
| 36 | + Object(). | ||
| 37 | + ContainsKey("code").ValueEqual("code", 0). | ||
| 38 | + ContainsKey("msg").ValueEqual("msg", "ok"). | ||
| 39 | + ContainsKey("data").Value("data").Object(). | ||
| 40 | + ContainsKey("id").ValueNotEqual("id", BeZero()) | ||
| 41 | + }) | ||
| 42 | + }) | ||
| 43 | + }) | ||
| 44 | + AfterEach(func() { | ||
| 45 | + _, err := pG.DB.Exec("DELETE FROM partner_infos WHERE true") | ||
| 46 | + Expect(err).NotTo(HaveOccurred()) | ||
| 47 | + }) | ||
| 48 | +}) |
-
请 注册 或 登录 后发表评论